弹幕获取 Link to heading

首先通过视频aid获取cid Link to heading

视频的aid又称av号,是视频url中av后面的一串数字 https://www.bilibili.com/av67289687 67289687就是这个视频的aid

使用aid去请求这个api https://api.bilibili.com/x/web-interface/view?aid=${aid} 即可得到cid

通过cid获取视频弹幕信息 Link to heading

拿到cid以后请求这个api可以得到弹幕信息,xml格式。 https://api.bilibili.com/x/v1/dm/list.so?oid=${cid}

文件转码 Link to heading

应为返回的xml弹幕文件的content-encoding为deflate,需要用到zlib来解压。

解码用户id Link to heading

b站弹幕是这样的形式

<d p="53.87100,1,25,16777215,1562172618,0,13ba9291,18366041035898882">艾欧尼亚</d>

d标签值是弹幕内容,属性p里面依次是弹幕的出现时间,模式,字体大小,颜色,发送时间戳,弹幕池,用户Hash,数据库ID

其中要用的是用户Hash。用户Hash只是简单的把数字ID用ITU I.363.5算法进行了Hash。

有两种方法把用户Hash转成uid

  1. 使用第三方接口
https://biliquery.typcn.com/api/user/hash/用户Hash
  1. 自给自足

我这里有一个例子,借鉴了bilibili-helper

const Crc32Engine = require('./crc32');
const crcEngine = new Crc32Engine();

const hashToUid = hash => {
  let extracted = /^b(\d+)$/.exec(hash);
  let uids = [];
  if (extracted && extracted[1]) {
    uids = [extracted[1]];
  } else {
    uids = crcEngine.crack(hash);
  }
  return uids[uids.length-1];
};

module.exports = {
  hashToUid
};

// crc32: https://github.com/blogwy/BilibiliVideoDownload/blob/master/utils/danmu/crc32.js

访问用户主页 Link to heading

https://space.bilibili.com/uid