- 这个油猴脚本(https://greasyfork.org/zh-CN/scripts/452420-bilibili-bgm-video-download)发布于
2022年10月3日,用于下载B站的视频,但是音频和视频是分开下载的。 - 当页面加载时,脚本首先会在控制台输出提示信息。
- 然后通过
loadData
函数获取音频和视频的Blob对象,并通过 desktop
函数将下载链接显示在页面上。 - 通过
eventInit
函数为页面上的 .clickitem
元素添加点击事件,点击后获取视频信息并更新下载链接。
注:window.__INITIAL_STATE__.aid
和window.__INITIAL_STATE__.bvid
两个变量存着av和bv号,window.__INITIAL_STATE__.videoData.pages[index].cid
为视频的page数
console.log("For learning and communication only, commercial use is strictly prohibited, please delete within 24 hours\n\tCreated by newbieking.");
loadData( __playinfo__.data.dash.audio[0].base_url, __playinfo__.data.dash.video[0].base_url);
eventInit();
var items='';
async function loadData(audio_url, video_url){
const audio_blob = await getBlob(audio_url);
const video_blob = await getBlob(video_url);
let a = getA(audio_blob, '下载BGM', 'mp3');
let v = getA(video_blob, '下载视频', 'mp4');
desktop(a, 'font-size: 26px; position: fixed; top: 200px; left: 0; z-index: 9999; list-style: none; border: 1px red solid; border-radius: 10px;background-color: #EDDBFF; text-decoration: none; padding:5px');
desktop(v, 'font-size: 26px; position: fixed; top: 400px; left: 0; z-index: 9999; list-style: none; border: 1px red solid; border-radius: 10px;background-color: #EDDBFF; text-decoration: none; padding:5px');
}
async function getBlob(url) {
return await fetch(url, {
method: "GET",
responseType: "blob"
}).then((res)=>{
return res.blob();
}).then((blob)=>{
return blob;
}).catch((err)=>{
console.log(err);
});
}
function eventInit(){
let interval = setInterval(()=>{
items = document.querySelectorAll('.clickitem');
if(items.length != 0){
clearInterval(interval);
items.forEach((item, index)=>{
item.addEventListener('click', (e)=>{
let url = `https://api.bilibili.com/x/player/playurl?avid=${__INITIAL_STATE__.aid}&bvid=${__INITIAL_STATE__.bvid}&cid=${__INITIAL_STATE__.videoData.pages[index].cid}&fnval=4048`;
fetch(url, {
method: "GET",
responseType: "application/json"
}).then((res)=>{
return res.json();
}).then((j)=>{
document.querySelectorAll('.download').forEach((e)=>{e.remove()})
loadData(j.data.dash.audio[0].base_url, j.data.dash.video[0].base_url);
}).catch((err)=>{
console.log(err);
})
})
})
}
}, 300);
}
function desktop(aElement, style){
let liElement = document.createElement('li')
liElement.classList.add("download");
liElement.appendChild(aElement);
liElement.style = style;;
document.body.appendChild(liElement);
}
function getA(blob, content, ext){
let bl = new Blob([blob], {type: "audio/mp3"})
const a = document.createElement('a');
a.href = URL.createObjectURL(bl);
document.body.appendChild(a);
if(document.querySelector('.tag-txt') == null){
a.download = Date.now()+'.'+ext;
}else{
a.download = document.querySelector('.tag-txt').textContent+'.'+ext;
}
a.target = "_blank";
a.textContent = content;
return a;
}
CG