python逆向_哔哩哔哩弹幕ProtoBuf
什么是 Protobuf?
Google Protocol Buffers(Protobuf)是一种轻便、高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或RPC数据交换格式。 它可用于通信协议、数据存储等领域的语言无关、平台无关扩展的序列化结构数据格式。
需要的环境
下载 Protoc 编译器
地址
下载之后不用安装,解压到一个文件夹就行了,
然后再点系统高级设置 —> 点击系统变量 -> 点开path -> 添加Protoc安装位置到bin目录
验证是否安装成功输入命令;
若如下图所示:
安装protoc - python
这个上面的地址一样的,去找一个python的.zip即可,随便你安装到那,最好是英文目录的吧
执行指令
1 2 3 4
| python setup.py clean python setup.py build python setup.py install python setup.py test
|
注意上面这些指令需要再python这个文件夹下面执行这些指令
弹幕的 proto 定义并编译
可以看看某站是什么样子的哈:
dm.proto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| syntax = "proto3"; package dm; message DmSegMobileReply{ repeated DanmakuElem elems = 1; } message DanmakuElem{ int64 id = 1; int32 progress = 2; int32 mode = 3; int32 fontsize = 4; uint32 color = 5; string midHash = 6; string content = 7; int64 ctime = 8; int32 weight = 9; string action = 10; int32 pool = 11; string idStr = 12; }
|
把这个文件放到python文件夹目录下面就行
随后编译执行:
1
| protoc --python_out=. dm.proto
|
执行完成后会生成 dm_pb2.py,代码中引入这个 python 文件
dm_pj.py 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
import json import requests from dm_pb2 import DmSegMobileReply from google.protobuf.json_format import MessageToJson, Parse b_web_cookie = 'SESSDATA=fd25e2e6%2C1660373048%2C287c9%2A21;' def get_date_list(): url = "https://api.bilibili.com/x/v2/dm/history/index?type=1&oid=168855206&month=2022-02" headers = { 'cookie': b_web_cookie } response = requests.get(url, headers=headers) print(json.dumps(response.json(), ensure_ascii=False, indent=4)) def dm_real_time(): url_real_time = 'https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=168855206&pid=98919207&segment_index=1' resp = requests.get(url_real_time) DM = DmSegMobileReply() DM.ParseFromString(resp.content) data_dict = json.loads(MessageToJson(DM)) list(map(lambda x=None: print(x['content']), data_dict.get('elems', []))) def dm_history(): url_history = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=168855206&date=2022-02-23' headers = { 'cookie': b_web_cookie } resp = requests.get(url_history, headers=headers) DM = DmSegMobileReply() DM.ParseFromString(resp.content) data_dict = json.loads(MessageToJson(DM)) list(map(lambda x=None: print(x['content']), data_dict.get('elems', []))) if __name__ == '__main__': get_date_list() pass
|
执行结果