背景需求

公司最近需要做一个直播尝试,需要获取抖音弹幕的信息,没想到抖音的直播开放平台没有相关的接口开放出来,感觉这个绝对是有问题的,作为开发者,获取自己直播间的相关信息,是个很正常的需求。

然后诉诸网络,有人做了付费的服务来获取弹幕,比较贵,不过感觉挺厉害的,好像就是破解了算法,接口信息很详细,不过抖音也会换算法,这个接口估计也得跟着改,所以人家这个付费好像也能够理解。

实现思路

所以公司考虑自己做,然后我就上场了 .第一步github找思路,发现都是广告,没有可利用的,不过在大量的信息中还是能够了解到只鳞片爪的,大家的思路基本是硬钢算法。

.分析抖音的网页直播间的请求,发现弹幕信息是个定时请求,返回数据是protobuf形式的,没有加密,只要protobuf序列化即可。

然后请求的关键在于请求中需要计算signature,还有什么x-xx啥的字段,然后结合github,发现还是么法找出前端的加密算法。

不过找到了protobuf的定义获取方式,这个还是比较关键的,有所了解的同学会方向,定义的proto 中的顺序是要相同的,也就是需要做到前后端的proto一致,才能拿到对应的数据,否则会偏差。

Protobuf 定义

1
2
3
4
5
6
7
8
9
10
syntax = "proto3";
package DouyinPack;

message WebcastChatMessage {
Common common = 1;
User user = 2;
string content = 3;
}

// ... (其他 message 定义)

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import {
transformBuffer,
processMessage
} from "../utils/commonFunction";

import {
cronFactory
} from "../utils/cron";

// ... (其他代码)

class OnlineApiController {
async start(ctx, next) {
// ... (实现细节)
}

async getMessage(ctx, next) {
// ... (实现细节)
}
}

export default new OnlineApiController();

优缺点分析

优点:

  • 避免了签名困扰
  • 实现简单直接
  • 可扩展性强

缺点:

  • 可能遗漏信息
  • 不如算法破解准确
  • 需要维护浏览器实例

总结

这个思路的优点就是避免的了签名困扰。其实这个完善下去,基本你想获取啥都可以。缺点就是可能遗漏一些信息,不如算法破解来的准确。

用了微软的playwright,还是蛮好用的,这个接口挺丰富。