简单说一下弹幕解析的流程,不论是 aid 还是 bvid,都不是直接用来解析弹幕的,真正用的是 cid,cid 才是和视频一一对应的。
对于各种视频下载和弹幕解析工具来说,就是再多增加一个通过 bvid 查询 cid 的接口,完全不是啥麻烦事。以前解析 aid 使用的两个接口,第一个现在不能用于解析 bvid,第二个直接把参数 aid 换成 bvid 即可。
https://www.bilibili.com/widget/getPageList?aid={aid}
https://api.bilibili.com/x/player/pagelist?aid={aid}
因为以前没关注,我是在昨天晚上十点半才知道消息的,然后赶紧打开电脑,随便打开一个视频页简单分析了一下,发现这个改动对我的程序影响真不大。
分析过程也比较简单,先打开一个页面,F12,看请求,找到了这样的一个请求
https://api.bilibili.com/x/player/pagelist?bvid=BV18b411j72u&jsonp=jsonp
然后开了一个隐身窗口再测试一下,确定在不登录的情况下可以用,同时发现,这就是以前使用 aid 查询 cid 的接口,有了这个接口就好办了,只要思路有了,代码都不是事,只需要改 Controller 接收的参数,查询到 cid 之后的代码都不需要改动。
昨天晚上升级完之后就直接睡了,今天就想着再加一个使用 bvid 查询 aid 的接口,最开始的想法是解析通过 bv 号获取页面内容,然后截取字符串获取 aid,主要代码大概是这样的:
var key = "window.__INITIAL_STATE__={\"aid\":";
var html = await GetBiliBiliHtmlAsync ($"https://www.bilibili.com/video/BV{bvid}?p=1");
var a = html.IndexOf (key, StringComparison.Ordinal);
if (a > 0) {
var b = html.Substring (a + key.Length, 11);
var c = b.IndexOf (",", StringComparison.Ordinal);
var d = b.Substring (0, c);
return int.TryParse (d, out var e) ? e : 0;
}
虽然很蠢,但是使用数据库缓存结果,效率应该不用担心,至于为什么不用知乎是那位大佬给出的转换代码,我是这样想的,那段代码现在只能在有限的数据内验证正确性,而我直接在 html 中截取字符串,虽然过程很蠢,但是结果一定是正确的。
当我满心欢喜,准备发布新版本的时候,突然发现有一个接口可以直接查询。
https://api.bilibili.com/x/web-interface/archive/stat?aid={aid}
https://api.bilibili.com/x/web-interface/archive/stat?bvid={bvid}
在感慨网友力量强大的同时,赶紧改自己的程序,去掉那又蠢又笨的算法,写了一个简单的查询 api,示例:
https://danmu.u2sb.top/api/other/bilibili/queryaid/?bvid=18b411j72u
https://danmu.u2sb.top/api/other/bilibili/queryaid/?aid=49511508
我的弹幕服务器已经支持使用 bv 号查询弹幕了,详细 api 可以看
API 文档:https://dandoc.u2sb.top/danmu/api.html
开源地址:https://github.com/MonoLogueChi/Danmu.Server
在所有 BiliBili 弹幕解析的程序里面,我的更新速度应该在第一梯队吧。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.