|
最近短视频平台出现了一个现象级的弹幕玩法,叫“弹幕互动游戏”。大家看一个视频就清楚这是个啥玩意儿。同时感谢 https://github.com/xgxkxaxl/x-ladon-x-argus-x-gorgon-x-khronos作者的算法测试提供。
弹幕互动游戏
作为一名技术,其背后的商业逻辑我们不做过多的探究(毕竟市场已经证实了该玩法的市场效应是很不错的),我们研究下其技术实现原理
因为抖爸爸对DY两个字异常敏感,咱们这次就用tiktok手机端来看下整个技术实现方案。
一、寻找直播入口
1、打开tiktok,点击左上角live
二、抓包
发现“webcast16-ws-useast5.us.tiktokv.com/webcast/im/push/”开头的wss推流链接
这个就是直播间的用于跟用户建立通信的websockes长链接,先看下请求参数:
live_region: US
app_language: en
app_type: normal
channel: googleplay
device_type: pixel
language: en
rid: 7167623950695271194
resolution: 1080*2180
update_version_code: 202270101
cdid: b0a5c09c-061e-4fc8-aed1-00359b33d9e4
sys_region: US
uoo: 1
timezone_name: Canada/Eastern
residence: US
ac: wifi
effect_sdk_version: 12.3.0
current_network_quality_info: {"tcp_rtt":15,"quic_rtt":15,"http_rtt":258,"downstream_throughput_kbps":2214,"quic_send_loss_rate":-1,"quic_receive_loss_rate":-1,"net_effective_connection_type":4,"video_download_speed":1411}
device_id: 7164618779888174635
compress: gzip
mcc_mnc: 310680
version_code: 270101
ab_version: 27.1.1
live_id: 12
device_platform: android
region: US
aid: 1233
room_id: 7167623950695271194
cursor: 1668844203887_7167631274004190978_7167631274004185088_1
manifest_version_code: 202270101
_rticket: 1668846676392
current_region: US
iid: 7164619543654025001
host_abi: arm64-v8a
locale: en
openudid: 775a74e09dd2402a
sid: f9532b5505890b3346904344a935e625
ac2: wifi5g
os_api: 28
identity: audience
webcast_locale: en_US
dpi: 480
carrier_region: US
os_version: 9
timezone_offset: -18000
carrier_region_v2: 310
webcast_sdk_version: 2500
imprp: u4qrACnHc7yQG
app_name: musical_ly
version_name: 27.1.1
device_brand: pixel
op_region: US
webcast_language: en
build_number: 27.1.1
ts: 1668844203
aid: 1233
device_id: 7164618779888174638
access_key: c810b464bad1c8b5114fc55bf0bafa35
fpid: 9
sdk_version: 3
iid: 7164619543654025001
pl: 0
ne: 1
version_code: 270101
ttnet_ignore_offline: 1
经测试,其中几个参数是必备的:
rid, room_id, iid, device_id, imprp, cursor,这几个参数但凡少一个都是无法建立连接的
ok,那我们就以上参数进行逐一生成
三、生成参数
1、rid和room_id
有两种方案
(1)一种是通过手机端user/接口获取room_id
该方法请求数据量非常小,且用户下播后room_id字段为0。而且数据反馈及时,但是需要device算法和xaxl算法
(2)通过pc端请求
该方法不需要device和xaxl,但是该room_id永远存在,用户下播也存在,无法获取该直播间是否关闭。
其实本人更建议用第一种方法,稳定及时。第二种为下下策
2、device_id和iid
用大佬的设备生成算法生成
https://github.com/xgxkxaxl/x-ladon-x-argus-x-gorgon-x-khronos
3、imprp, cursor
这俩参数是一眼找不出来的,我们往上看,发现
“webcast16-normal-useast5.us.tiktokv.com/webcast/im/fetch/”开头的请求结果下有该关键字,于是我们模拟请求该链接,该链接需要几个核心加密参数:
-gorgon
x-khronos
x-argus
x-ladon
以及device信息,继续使用大佬提供的算法
然后获取到的数据是protobuf转义过的数据,咱们还得对着apk的定义写一份proto文件。转成pb2的py文件
protoc tiktok.proto --python_out ./
然后解析该内容,发现如下数据(取部分):
这样,这个完整的wss链接就出来了
三、构造请求直播间链接
ok,重新捋一捋
1、获取device数据
2、构造“webcast16-normal-useast5.us.tiktokv.com/webcast/im/fetch/ ”请求
3、获取加密参数,请求url
4、解析protobuf数据,获取imprp, cursor
5、构造wss链接
6、建立wss长链接,并解析protobuf数据(手机端不好同步录制代码,以pc为例)
弹幕protobuf解析
四、弹幕与游戏的交互
————————————————
版权声明:本文为CSDN博主「qq517348412」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:直播弹幕互动游戏探索_qq517348412的博客-CSDN博客_弹幕互动游戏 |
|