Appearance
给自己的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