B站获取视频/动态评论神器

4,517 阅读2分钟

B站视频评论转图片下载

供 Bilibili UP 主与观众互动,将 Bilibili 视频评论区的评论转换成 PNG,应用场景如:呈现观众评论、评论互动、频道 Q&A,将会陆续完善其他功能,敬请期待!

目前功能特色:

  1. 无限滚动获取评论
  2. 瀑布流展示评论内容
  3. 自由选择需要下载的评论
  4. 支持视频、文字/图片动态评论
  5. ZIP 压缩包打包下载

功能演示

戳这里 demo 链接

  1. 视频评论

image.png 2. 动态评论

image.png 3. 打包下载

image.png

实现思路

1.视频评论数据获取

BiliBili于2020年3月将av号转化成为bv号,打开任一视频,可以看到url的格式如下:

https://www.bilibili.com/video/BV1NY411j7uP?spm_id_from=333.851.b_7265636f6d6d656e64.2

其中 BV1NY411j7uP 就是视频的bv号,但只有bv号还不能直接获取视频的评论数据,来看b站的评论接口:

https://api.bilibili.com/x/v2/reply?&type=&pn=&sort=&oid=
参数名参数类型参数说明
pn字符串0和1都表示第一页,2表示第二页
ps字符串默认每页获取20条数据
sort字符串排序方式
0:按时间排序
2:按热度排序
oid字符串视频的av号
type字符串评论类型

oid是后续获取评论数据的关键,oid其实就是原来的视频av号。
方法一: oid可以通过调用B站的视频信息接口获取:

https://api.bilibili.com/x/web-interface/view?bvid=视频BV号  

接口返回的数据如下:

image.png

方法二: 也可以将bv号转为av号,相关的转换方法如下:

const table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
const tr = {};
for (let i = 0; i < 58; i++) {
    tr[table[i]] = i;
}
const s = [11, 10, 3, 8, 4, 6];
const xor = 177451812,
    add = 8728348608;


function bv2av(x) {
  let r = 0
  for (let i = 0; i < 6; i++) {
    r += tr[x[s[i]]] * Math.pow(58, i)
  }
  return (r - add) ^ xor
}

// 获取视频的aid
export function getAid(bvid) {
  if (bvid.includes('BV')) {
    return bv2av(bvid)
  } else {
    return bvid
  }
}

评论接口返回数据示例:

image.png

2.动态评论数据获取

动态评论接口:

https://api.bilibili.com/x/v2/reply?&type=&pn=&sort=&oid=

b站的动态分为以下四种类型: 转发的动态、带图片、纯文字、其他站内分享。
动态类型查询接口:

https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=动态id

image.png

动态类型接口返回示例: image.png

不同评论类型对应的type值:

type值说明
1有转发内容
2带图片动态
4纯文字动态
2048其他站内分享

根据动态类型查询接口返回type,动态评论接口请求参数中的type和oid也需要对应变化:

动态接口type值评论接口参数
2type的值为11,oid的值为动态类型接口返回示例图中的 rid
1、4、2048type的值为17, oid的值和动态id一致,即dynamic_id

项目地址

b站评论转图片神器