百度云函数解锁 B 站区域限制

这不好吧?

一个朴素的要求,看柯南番剧的时候可以有弹幕交流……

这就得解锁 B 站的区域限制,最便宜的方案就是使用解除B站区域限制这个插件脚本。插件安装、使用自不必说,最关键的是代理服务器的设置,下面就来一遍吧~

对于仅限大陆访问的视频,需要的只是用具有大陆 IP 地址的服务器获取 https://api.bilibili.com/pgc/player/web/playurl (网页版,我一般也只用网页看剧~) 这一接口的内容1,这使用百度云函数即可办到。相比于腾讯、阿里这些,百度云除了有 100 万次的免费调用量,还有 1GB 的免费流量,良心良心 👍️

下面在百度云里新建一个云函数(百度叫函数计算 CFC)。

从函数列表里选择创建函数,选择空白模版:

选择模版

填入基本信息。百度云支持非常多的运行时环境,我这里选的是 Node.js;事件模式选择 event;选个最小的内存即够用了:

基本信息

然后配置触发器。这里用到的是 HTTP 触发;URL 路径为了方便就用 B 站一样的路径吧;HTTP 方法可以全选,其实只需要 GET 方法即可:

配置触发器

创建完成后即可编辑代码了,这里用 TS 简单示意一下:

/*
 * CFC HTTP 触发器 + Express 示例
 *
 * 要运行本示例,在保存函数代码后,需要给函数新增 HTTP 触发器,配置为:
 *   URL 路径:/pgc/player/web/playurl
 *   HTTP 方法:全部
 *   身份验证:不验证
 * 然后根据触发器页面给出的域名,访问 https://[域名]/pgc/player/web/playurl
 *
 * 关于 HTTP 触发器的详细文档,请参考 https://cloud.baidu.com/doc/CFC/s/kjzmgugty
 */

import cfcExpress from "aws-serverless-express";
import express, { Request, Response } from "express";
import axios from "axios";

// 创建 Express app
const app = express();
const router = express.Router();

// 建立路由, 有效路径为 '/pgc/player/web/playurl'
router.get("/", async (req: Request, res: Response) => {
  const url = 'https://api.bilibili.com' + req.originalUrl;
  const resp = await axios.get(url);
  res.header({
    'access-control-allow-origin': 'https://www.bilibili.com',
    'access-control-allow-credentials': 'true'
  });
  return res.status(200).json(resp.data);
});

// 这里将路由注册到 '/pgc/player/web/playurl' 前缀下,如果修改此值,则需要同步修改 HTTP 触发器的对应 URL 路径配置
const prefix = process.env.EXPRESS_PREFIX ? process.env.EXPRESS_PREFIX : "/pgc/player/web/playurl";
app.use(prefix, router);

// CFC 下,不需要使用 app.listen 启动,在下面的函数处理代码(handler)中,将这里创建的 server 和 event context 同时传入
const server = cfcExpress.createServer(app);

exports.handler = (event: any, context: any) => {
  cfcExpress.proxy(server, event, context);
};

大概意思如上,转译成 JS 即可。

由于用到了第三方的 Express 和 Axios,百度云里需要把 node_modules 一起打包上传才能工作~

不嫌弃的话,可以使用我这份转译打包好的压缩文件:bilibili.zip.

不知是什么原因,我选择本地上传 ZIP 包的时候总不成功。这时候选择先上传到对象存储 BOS 里(相当于别家的 S3 或 COS 吧)再部署代码,瞬间完成~

然后回到该云函数的触发器那里,就可以查看到百度给你分配的域名,只需要将此域名填入上面提到的插件里,不需要后面 /pgc/.... 的路径部分。

这个方法非常灵活,axios 可以配置 req 使用代理2进行请求:

proxy: {
  protocol: 'https',
  host: '127.0.0.1',
  port: 9000
},

网上有很多不同区域的免费 HTTP(S) 代理,可以即时爬取一个代理地址使用(可能速度慢点~)。这样可以解锁各种区域,也可以不依赖于国内的云服务商,触类旁通……

Ads by Google

林宏

Frank Lin, PhD

Hey, there! This is Frank Lin (@flinhong), one of the 1.41 billion . This 'inDev. Journal' site holds the exploration of my quirky thoughts and random adventures through life. Hope you enjoy reading and perusing my posts.

YOU MAY ALSO LIKE

Understanding Nginx location directive

Tools

2020.09.12

Understanding Nginx location directive

Location directives are essential when working with Nginx. They can be located within server blocks or other location blocks. Understanding how location directives are used to process the URI of client request can help make the request handling less unpredictable.

Ads by Google