V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
MonoLogueChi
V2EX  ›  分享创造

bv 号来了,我的程序也该升级了

  •  
  •   MonoLogueChi ·
    MonoLogueChi · 2020-03-24 15:29:26 +08:00 · 3028 次点击
    这是一个创建于 1738 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说一下 bv 号的影响

    简单说一下弹幕解析的流程,不论是 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 弹幕解析的程序里面,我的更新速度应该在第一梯队吧。

    3 条回复    2020-03-24 19:02:47 +08:00
    docx
        1
    docx  
       2020-03-24 18:27:39 +08:00 via iPhone
    新出来的视频依然有 av 号,也能正常访问,所以也不是很明白这个意义
    webshe11
        2
    webshe11  
       2020-03-24 18:57:31 +08:00
    我的油猴脚本也 gg 了,连夜改正则表达式
    MonoLogueChi
        3
    MonoLogueChi  
    OP
       2020-03-24 19:02:47 +08:00 via Android
    @dzyou2007 不太清楚,也许以后会有变化吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3492 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:49 · PVG 08:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.