页面2-解析视频内容
Github代码链接 【写好的代码,可直接下载使用/也可以用Docker一键部署】
编写JS文件
- 引入必要的库:引入
express
和axios
库,用于创建Web服务器和发送HTTP请求。
const express = require('express'); // 引入Express库,用于创建Web服务器
const axios = require('axios'); // 引入Axios库,用于发送HTTP请求
- 应用实例和端口设置:创建一个Express应用实例,并设置服务器监听的端口号(
port
)暂定为23233
。
const app = express(); // 创建一个Express应用实例
const port = 23233; // 定义服务器监听的端口号
// 从环境变量中获取Cookies并存储在数组中
const cookies = [
process.env.COOKIE1,
process.env.COOKIE2,
process.env.COOKIE3,
process.env.COOKIE4,
process.env.COOKIE5,
process.env.COOKIE6
];
- 中间件配置:配置Express中间件来解析URL编码的数据和JSON格式的数据。
// 解析URL中的查询参数
app.use(express.urlencoded({ extended: true })); // 中间件:解析URL编码的数据
app.use(express.json()); // 中间件:解析JSON格式的数据
提取辅助函数:定义一个辅助函数extractBVandP
来从URL中提取BV号和P值。
// 提取BV号和P值的辅助函数
function extractBVandP(url) {
let BV = url.match(/(?=BV).*?(?=\?|\/)/); // 使用正则表达式从URL中提取BV号
let P = url.match(/(?<=p=).*?(?=&vd)/); // 使用正则表达式从URL中提取P值
if (!BV) {
BV = url.match(/(?<=bvid=).*?(?=&)/); // 如果BV号为空,则尝试另一种方式提取
}
if (!P) {
P = 1; // 如果P值为空,默认设置为1
}
return { BV: BV ? BV[0] : null, P: parseInt(P, 10) }; // 返回提取的BV号和P值
}
// 过滤出非空的cookie
const nonEmptyCookies = cookies.filter(cookie => cookie && cookie.trim() !== ''); // 去除空的cookie
// 随机选择一个非空cookie,如果没有可用的非空cookie,使用备用逻辑或默认值
const randomNonEmptyCookie = nonEmptyCookies[Math.floor(Math.random() * nonEmptyCookies.length)] || 'default_cookie'; // 随机选择一个非空的cookie
获取视频链接的路由处理函数:定义一个异步函数getVideoLink
来处理获取视频链接的逻辑,包括发送HTTP请求获取cid和视频链接,将视频链接重定向到客户端。
// 获取视频链接的路由处理函数
async function getVideoLink(req, res) {
try {
const { BV, P } = extractBVandP(req.query.url); // 从请求的URL中提取BV号和P值
// 获取cid
const cidResponse = await axios.get(`https://api.bilibili.com/x/player/pagelist?bvid=${BV}`, {
headers: {
'Cookie': randomNonEmptyCookie // 在请求头中添加cookie
}
});
const cid = cidResponse.data.data[P - 1].cid; // 从响应中获取cid
// 获取视频链接
const videoLinkResponse = await axios.get(`https://api.bilibili.com/x/player/playurl?bvid=${BV}&cid=${cid}&qn=116&type=&otype=json&platform=html5&high_quality=1`, {
headers: {
'Cookie': randomNonEmptyCookie // 在请求头中添加cookie
},
withCredentials: true, // 允许带上cookie请求
});
const videoUrl = videoLinkResponse.data.data.durl[0].url; // 从响应中获取视频链接
//res.send(videoUrl); // 将视频链接作为响应返回,此处隐藏若有需要自行调整
console.log(`[${new Date().toISOString()}] 跳转后的链接: ${videoUrl}`); // 打印跳转后的链接到控制台
res.redirect(302, videoUrl); // 通过302重定向跳转至视频链接
} catch (error) {
console.error(error); // 打印错误信息到控制台
res.status(500).send('Internal Server Error'); // 返回500状态码和错误信息
}
}
设置路由:设置一个GET路由,当请求路径为/biliapi
时,调用getVideoLink
函数。
// 设置路由
app.get('/biliapi', getVideoLink); // 当请求路径为/biliapi时,调用getVideoLink函数
启动服务器:启动Express服务器,并打印服务器启动信息到控制台。
// 启动服务器
app.listen(port, () => {
console.log(`API is listening on port ${port}`); // 打印服务器启动信息到控制台
});
通过以上步骤,您可以在本地搭建一个视频解析服务器,处理B站视频的解析请求,并将解析结果返回给客户端。
No Comments