bilibili通过弹幕查询用户

弹幕获取

首先通过视频aid获取cid

视频的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获取视频弹幕信息

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

文件转码

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

解码用户id

b站弹幕是这样的形式

1
<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. 使用第三方接口
1
https://biliquery.typcn.com/api/user/hash/用户Hash
  1. 自给自足

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

访问用户主页

1
https://space.bilibili.com/uid