我最近一直在研究西瓜弹幕提取的方案,之前的方案是利用网页版西瓜直播提取的弹幕。
不能提取礼物,和关注等信息。后来慢慢接触知道了如何使用协议。
首先我安装了一个西瓜视频app,通过fiddler抓包工具抓取了https的代码。
需要注册的是要抓取手机的app https的包,必须在官网下载一个工具,重新生成一个证书cer,不这样做的话手机app是没有网络的。
一切搞定之后,我尝试抓取西瓜直播弹幕的包。
url = "https://webcast3-normal-c-lf.ixigua.com/webcast/room/" + str(rommid) + "/_fetch_message_polling/?webcast_sdk_version=1780&webcast_language=zh&webcast_locale=zh_CN_%23Hans&webcast_gps_access=1¤t_network_quality_info=%7B%7D&iid=527406001831240&device_id=" + self.device_id + \
"&ac=wifi&mac_address="+self.mac_address+\
"&channel=zhibo_wap&aid=32&app_name=video_article&version_code=924&version_name=9.2.4&device_platform=android&ab_version=668852%2C668853%2C668858%2C668851%2C668859%2C668856%2C2161636%2C668855%2C2229375%2C1477979%2C994679%2C668854%2C2220175&ssmix=a"+\
"&device_type="+self.device_type+\
"&device_brand="+self.device_brand+\
"&language=zh&os_api=25&os_version=7.1.2&openudid="+self.uuid_str+\
"&manifest_version_code=524&resolution=590*720&dpi=160&update_version_code=92409&_rticket="+self._rticket+\
"&cdid_ts="+self.cdid_ts+\
"&tma_jssdk_version=1830001&rom_version=android_x86_64-userdebug+7.1.2+N2G48H+eng.lh.20191021.112421+test-keys&cdid="+self.cdid
网址大约如上所示。
上传的数据位
post_data = "internal_ext=fetch_time%3A1606966469869%7Cstart_time%3A0%7Cfetch_id%3A6901868425828645213%7Cflag%3A0%7Cseq%3A16%7Cnext_cursor%3A1606966469869_6901868430123612514_1_1&live_id=3&parse_cnt=2&recv_cnt=2&cursor=1606966469869_6901868430123612514_1_1&last_rtt=59&identity=audience&resp_content_type=protobuf&user_id=0"
其中有一个很关键的代码resp_content_type=protobuf
这是什么意思呢?意思就是你接收的代码是通过protobuf 这个工具来解包的。不然你看到的就是一群乱码。根本不了解是什么意思。
然后我通过百度学习protobuf的使用方法,方法很多,关于py的就比较少了。
不过这些都不重要。重要的是,我后来在github发现了一个免费的西瓜直播弹幕开源项目
https://github.com/q792602257/XiguaLiveDanmakuHelper
当然你还是要知道protobuf 是如何工作的。
直接通过protobuf 解包,之后的代码大概是这样子的。
经过和大神沟通,他告诉我,要解2次包,第一次解包之后,在项目下面,还需要解包第二次。
大神有写号的项目,我就直接拿来用了。并没有仔细去分析,如何解包。或者他的数据结构。
因为这是protobuf 的特点。只要你知道了protobuf的数据结构,生成了一个文件XiguaUser.proto。那么你可以直接拿来用了。除非协议变了,你需要重新解包,维护这个文件XiguaUser.proto。
我写了一部分注释,大家可以稍微理解一下。
syntax = "proto2";//协议版本,现在出了3
message UserPack {
required User user = 1;//必要字段,user
}
// 头衔
message Badge {
message FanClubText {//信息名称
required string text = 1;必要字段
optional string color = 2;//可选字段,有可能没有
required int32 level = 3;
}
repeated string url = 1;
// optional string localUrl = 2;
optional int32 height = 3;
optional int32 width = 4;
// 3 房管
// 6 贵族
// 7 粉丝团
optional int32 type = 6;
optional string clickTo = 7;
optional FanClubText fanClubText = 8;
}
message FansClubPack {
message FansClub {
required string title = 1 [default = ''];
required int32 level = 2 [default = 0];
optional int32 someEnum = 3;
}
required FansClub fansClub = 1;
}
// 用户信息
message User {
// 头像
message Avatar {
required string url = 1;
optional string id = 2;
}
// 粉丝和粉
message Follow {
optional int32 following = 1 [default = 0];
optional int32 follower = 2 [default = 0];
}
// 花钱等级
message PayGrade {
required int32 current = 1;
required int32 level = 6;
optional int32 currentLevelNeed = 10;
optional int32 nextLevelNeed = 11;
optional string content = 13;
required Badge badge = 19;
optional int32 toNextLevelNeed = 21;
}
// 荣誉等级
message HonorLevel {
required Badge badge = 19;
}
// 贵族
message Noble {
message NobleBoarder {
repeated string urlList = 1;
required string uri = 2;
optional int32 height = 3;
optional int32 width = 4;
}
required string content = 4;
optional NobleBoarder boarder = 8;
}
required int64 id = 1;
required string nickname = 3;
required int32 gender = 4;
// 这个顺序可能有点迷,不是很清楚
required Avatar avatarThumb = 9;
optional Avatar avatarMedium = 10;
optional Avatar avatarLarge = 11;
repeated Badge badge = 21;
optional Follow follow = 22;
required PayGrade payGrade = 23;
required FansClubPack fansClub = 24;
required int32 totalPaid = 34;
}
我需要的字段内容不是很多,能够知道礼物信息,弹幕和关注就行了。
如有需要可以自己分析一下。
总之我根据大神提供的部分代码,帮他维护了一下github,现在程序能够执行播报弹幕和礼物了。
也给大家想学习协议的朋友们提供一个思路。(大神的代码,我好多看不懂,我是用我自己理解的方案写的程序。)
https://github.com/shuishen49/xiguadanmu
因为大神公布了源代码,我就不公布我自己的源代码了。我编译好了,可以直接下载执行。是免费使用的。
需要注意的是填入的房间号码必须是真实的房间号码,不是缩写。
比如像是这样。
https://live.ixigua.com/room/6905678071718742791/
20位数字的房间号码,你可以通过西瓜视频直播,搜索自己的名字得到。
如果有不懂的同学可以在下面留言或者加入讨论组。