页面2-解析视频内容
Github代码链接 【写好的代码,可直接下载使用/也可以用Docker一键部署】
- 引入必要的库:引入
express
和axios
库,用于创建Web服务器和发送HTTP请求。 - 应用实例和端口设置:创建一个Express应用实例,并设置服务器监听的端口号(
port
)暂定为23233
。 - 中间件配置:配置Express中间件来解析URL编码的数据和JSON格式的数据。
// 提取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服务器,并打印服务器启动信息到控制台。
编写JS文件
const express = require('express'); // 引入Express库,用于创建Web服务器
const axios = require('axios'); // 引入Axios库,用于发送HTTP请求
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
];
// 解析URL中的查询参数
app.use(express.urlencoded({ extended: true })); // 中间件:解析URL编码的数据
app.use(express.json()); // 中间件:解析JSON格式的数据
提取辅助函数:定义一个辅助函数extractBVandP
来从URL中提取BV号和P值。
// 启动服务器
app.listen(port, () => {
console.log(`API is listening on port ${port}`); // 打印服务器启动信息到控制台
});
通过以上步骤,您可以在本地搭建一个视频解析服务器,处理B站视频的解析请求,并将解析结果返回给客户端。