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值。

  1. // 提取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,则使用默认值。

  2. // 过滤出非空的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和视频链接,将视频链接重定向到客户端。

  3. // 获取视频链接的路由处理函数
    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函数。

  4. // 设置路由
    app.get('/biliapi', getVideoLink); // 当请求路径为/biliapi时,调用getVideoLink函数
    

    启动服务器:启动Express服务器,并打印服务器启动信息到控制台。

// 启动服务器
app.listen(port, () => {
  console.log(`API is listening on port ${port}`); // 打印服务器启动信息到控制台
});

通过以上步骤,您可以在本地搭建一个视频解析服务器,处理B站视频的解析请求,并将解析结果返回给客户端。