Skip to main content

页面2-解析视频内容

Github代码链接 【写好的代码,可直接下载使用/也可以用Docker一键部署】

编写JS文件

  • 引入必要的库:引入expressaxios库,用于创建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:从环境变量中获取Cookies并存储在数组中。
// 从环境变量中获取Cookies并存储在数组中
const cookies = [
    process.env.COOKIE1,
    process.env.COOKIE2,
    process.env.COOKIE3,
    process.env.COOKIE4,
    process.env.COOKIE5,
    process.env.COOKIE6
];

为获取高画质,需设置Cookie环境变量。

  • 中间件配置:配置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值
}

过滤Cookies:过滤出非空的Cookies,并随机选择一个非空的Cookie,如果没有可用的非空Cookie,则使用默认值。

// 过滤出非空的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站视频的解析请求,并将解析结果返回给客户端。