需求
最近刷到过很多游戏角色说的话,以及从知乎上扒下来的话,想搬到自己博客上,如果一个个文字手敲会累死,所以写个脚本帮自己扒,同时也提供几个方法供参考。
没node环境 不会写代码
B站打开视频,f12打开控制台,点击network,左上角有一个放大镜,鼠标移上去的弹窗是search/查找这个,点击它,并输入字幕的第一句话,按回车,便可找到对应的文件,里面全是字幕,直接复制粘贴就可以了。
有node环境
默认你懂一点开发,需要你修改初始化参数里面的bv号,以及cookie(第43行)
关于cookie的获取,直接在B站控制台发请求里面能直接找到;它也会过期,需要注意时间
const axios = require('axios');
const crypto = require('crypto');
// 初始化参数
const BV = 'BV1F2Ahe9ESf';
const WBI_KEY = '6537f4a15e6e3e38651b3e792d2cbcaf'; // 固定值(B站加密密钥)
// 工具函数:生成 WBI 签名
function generateWbiSign(params) {
const mixinKey = WBI_KEY;
const sortedParams = Object.keys(params).sort().reduce((acc, key) => {
acc[key] = params[key];
return acc;
}, {});
const query = new URLSearchParams(sortedParams).toString();
return crypto.createHash('md5').update(query + mixinKey).digest('hex');
}
// 主流程
async function getBiliSubtitle(BV) {
try {
// Step 1: 获取视频基础信息
const infoRes = await axios.get(`https://api.bilibili.com/x/web-interface/view?bvid=${BV}`);
const { cid, aid } = infoRes.data.data;
// Step 2: 生成 WBI 签名参数
const params = {
aid: aid,
cid: cid,
platform: 'web',
web_location: 1550101
};
const w_rid = generateWbiSign(params);
// Step 3: 调用字幕接口
const subRes = await axios.get('https://api.bilibili.com/x/player/wbi/v2', {
params: {
...params,
w_rid,
wts: Math.floor(Date.now() / 1000)
},
headers: {
Cookie: ``,
}
});
let subtitleObj = null
const list = subRes.data.data.subtitle.subtitles
if (list.length) {
for (let i = 0; i < list.length; i++) {
const obj = list[i]
if (obj.lan === 'ai-zh') {
subtitleObj = await axios.get('https:' + list[i].subtitle_url)
break
}
}
}
const arr = []
const subtitleBodyArr = subtitleObj.data.body
subtitleBodyArr.forEach(item => {
arr.push(item.content)
})
return arr.join(',')
} catch (error) {
console.error('处理失败:', error.message);
return null;
}
}
// 执行示例
getBiliSubtitle(BV).then(console.log)