python逆向_哔哩哔哩弹幕ProtoBuf

什么是 Protobuf?

Google Protocol Buffers(Protobuf)是一种轻便、高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或RPC数据交换格式。 它可用于通信协议、数据存储等领域的语言无关、平台无关扩展的序列化结构数据格式。

需要的环境

下载 Protoc 编译器

地址

下载之后不用安装,解压到一个文件夹就行了,

然后再点系统高级设置 —> 点击系统变量 -> 点开path -> 添加Protoc安装位置到bin目录

验证是否安装成功输入命令;

1
proto --version

若如下图所示:

image-20221013164907041.png

安装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
# -*- coding: utf-8 -*-
# @Author :
# @Date :
# @File : dm_pj.py
# @description : XXX


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))
# print(data_dict)
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))
# print(data_dict)
list(map(lambda x=None: print(x['content']), data_dict.get('elems', [])))


if __name__ == '__main__':
# dm_real_time()
get_date_list()
# dm_history()
pass

执行结果

image-20221013201418891.png