2020西瓜直播弹幕协议版弹幕提取思路与实现py

我最近一直在研究西瓜弹幕提取的方案,之前的方案是利用网页版西瓜直播提取的弹幕。

不能提取礼物,和关注等信息。后来慢慢接触知道了如何使用协议。

首先我安装了一个西瓜视频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 解包,之后的代码大概是这样子的。

2020西瓜直播弹幕协议版弹幕提取思路与实现py_第1张图片

经过和大神沟通,他告诉我,要解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位数字的房间号码,你可以通过西瓜视频直播,搜索自己的名字得到。

如果有不懂的同学可以在下面留言或者加入讨论组。

你可能感兴趣的:(python,python,app抓包,西瓜直播,弹幕)