网页脚本 bilibili005:视频下载

  • 这个油猴脚本(https://greasyfork.org/zh-CN/scripts/452420-bilibili-bgm-video-download)发布于
    2022年10月3日,用于下载B站的视频,但是音频和视频是分开下载的。
  • 当页面加载时,脚本首先会在控制台输出提示信息。
  • 然后通过 loadData 函数获取音频和视频的Blob对象,并通过 desktop 函数将下载链接显示在页面上。
  • 通过 eventInit 函数为页面上的 .clickitem 元素添加点击事件,点击后获取视频信息并更新下载链接。
    注:window.__INITIAL_STATE__.aidwindow.__INITIAL_STATE__.bvid两个变量存着av和bv号,window.__INITIAL_STATE__.videoData.pages[index].cid为视频的page数
// ==UserScript==
// @name         bilibili-bgm-video-download
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  bilibili bgm video downloader
// @author       newbieking
// @match        https://www.bilibili.com/video/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bilibili.com
// @grant        none
// @license MIT
// @downloadURL https://update.greasyfork.org/scripts/452420/bilibili-bgm-video-download.user.js
// @updateURL https://update.greasyfork.org/scripts/452420/bilibili-bgm-video-download.meta.js
// ==/UserScript==



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='';

// 接收音频和视频的URL,并将它们分别转换为Blob对象。
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(()=>{
        // 获取页面中所有类名为'clickitem'的元素
        items = document.querySelectorAll('.clickitem');
        // 如果获取到的元素长度不为0
        if(items.length != 0){
            // 停止执行setInterval,clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。
            clearInterval(interval);
            // 遍历每个元素
            items.forEach((item, index)=>{
                // 为每个元素添加点击事件监听器
                item.addEventListener('click', (e)=>{
                    // 构建请求的 URL
                    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)=>{
                        // 移除页面中所有类名为'download'的元素
                        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);
}

// 接受两个参数,一个是 `<a>` 元素,另一个是样式。创建一个 `<li>` 元素,将其中的 `<a>` 元素作为子元素添加,用于在页面上显示下载链接。
function desktop(aElement, style){
let liElement = document.createElement('li')
liElement.classList.add("download");
liElement.appendChild(aElement);
    liElement.style = style;;
    document.body.appendChild(liElement);
}


// 将Blob对象添加到 `<a>` 元素的href属性中,以创建一个可下载的链接。
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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值