Skip to content

给自己的Launcher做了个显示余额的界面:

除了提供常规的electron partition访问网页进行DOM识别(类似playwright),还支持大量逆向api的功能,仅需auth token就可以较为快速地获取信息。

因此我又对逆向提起了那么一点点兴趣,加上最近几天想着增强AI的功能,之前试了试 MediaCrawler,说实话,步骤有点麻烦,同时获取速度也有点慢,虽然平台支持还挺多的。同时 MediaCrawler依赖 playwright ,我都用electron了还需要playwright?加上有些平台不需要模拟浏览直接获取token后走api就行。

B站就是这样的,Nemo2011/bilibili-api 这个项目边提供了B站的api并封装为了Python接口(btw,这个项目目前被archive + force push了,但是通过vLEveCRsJ08TctiQq/kGVBikH3/394/tzIgs9q9oKtlfQmrisQGHut0V+ZMyT73HG5X8FbYNAL0/R0+7+6n48mL9hfE8yqyQlDdC你还是可以在项目里下载到源码的)。因此我便下载了,让AI转成了node,然后突发奇想做了MCP。有部分API没有提供,比如主页“最近观看”,这个我就手动打开开发者菜单查看Networks然后扒api去了。

Node我优化了一下调用方式,自认为很优雅:

ts
import { BiliContext } from "bilibili-api-node";

// 1. 初始化 Context(传入凭据,或不传参数以游客身份初始化)
const context = new BiliContext({
  sessdata: "你的SESSDATA",
  bili_jct: "你的bili_jct",
  buvid3: "你的buvid3",
  dedeuserid: "你的DedeUserID"
});

async function main() {
  // 2. 视频信息
  const video = context.getVideo("BV1C8MR6SEx5");
  const info = await video.getInfo();
  console.log(`标题: ${info.title}, UP主: ${info.owner.name}`);

  // 3. 弹幕获取与解析
  const danmakus = await video.getDanmakus();
  console.log(`获取到 ${danmakus.length} 条弹幕`);

  // 4. 流式异步翻页拉取评论(自动防风控、自动处理游标)
  let count = 0;
  for await (const comment of video.iterateComments({ limit: 1000, delayMs: 300 })) {
    console.log(`[${++count}] ${comment.member.uname}: ${comment.content.message}`);
  }

  // 5. 用户空间与投稿
  const user = context.getUser(546195);
  const userInfo = await user.getInfo();
  console.log(`昵称: ${userInfo.name}, 签名: ${userInfo.sign}`);

  // 6. 全站搜索
  const searchRes = await context.search.searchByType("Node.js");
  console.log(`搜索结果条数: ${searchRes.result.length}`);

  // 7. 动态调用任意底层接口
  const hotVideos = await context.callApi("rank", "info.hot", { params: { pn: 1, ps: 10 } });
  console.log(`当前热门第 1 名: ${hotVideos.list[0].title}`);
}

main();

MCP的一个案例长这样,我觉得挺好玩的哈哈:

我还发现这个玩意有个好处就是可以光速查成分,也算是一个奇妙的使用方式了。

不过为了防止被警告,因此项目我没有开放,大家看我这个过程有能力的应该已经知道怎么做了,因此大家就个凭本事吧哈哈。

Cheers!
2026/08/26