b站弹幕 so文件解析/逆序列化

本文介绍了如何对b站protobuf序列化的so文件进行逆序列化,包括protobuf的基本概念,如何使用protoc编译proto文件,以及如何处理中文字符。通过指定网站提供的资源和在线编译工具,生成Python反序列化代码,解析弹幕数据。
部署运行你感兴趣的模型镜像

写在前面:

下文全部使用**代替b 站,由于csdn现在版权的问题,本文只介绍对so文件的逆序列化(反正怎么获取文件网上很多文章)

如图,抓包得到的是乱码,实际上这不是加密,是使用protobuf序列化后的文件

本人找了很多网站,只在知乎看到一个逆序列化的回答,其他的都是从乱码中匹配内容

https://zhuanlan.zhihu.com/p/392931611

但是这个回答比较简洁,对于不了解protobuf的人可能摸不着风,本人也没接触过protobuf,但是通过一段时间的查找资料了解了一二,故写下这一篇相对详细一点的博客方便其他不懂protobuf的人学习**

1.什么是protobuf?

protobuf (protocol buffer) 是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

python(pip)可通过以下命令直接安装

pip install protobuf

在使用时这样导包

import google.protobuf 

具体的就不说了,想详细了解的可以直接搜,网上有很多相关教程

2.怎么进行逆序列化

你需要知道**弹幕的proto定义,再使用protoc进行编译,获得一个.py文件,接下来就可以使用文件里面的方法反序列化了

关于大概的方法,下面这个网站有介绍,下文是详细步骤bilibili-API-collect · GitHubhttps://github.com/SocialSisterYi/bilibili-API-collect/blob/bb437d2012e6291b38c78d42755db9d836d4975f/danmaku/danmaku_proto.md

关于**的弹幕定义,这里推荐一个项目(跟上面那个是一个项目)

GitHub - SocialSisterYi/bilibili-API-collect: 哔哩哔哩-API收集整理【不断更新中....】https://github.com/SocialSisterYi/bilibili-API-collect

这个项目收集了**的大部分api ,并且还有人维护,简直小白福音啊

**的弹幕proto定义在这里:https://github.com/SocialSisterYi/bilibili-API-collect/blob/bb437d2012e6291b38c78d42755db9d836d4975f/grpc_api/bilibili/community/service/dm/v1/dm.protohttps://github.com/SocialSisterYi/bilibili-API-collect/blob/bb437d2012e6291b38c78d42755db9d836d4975f/grpc_api/bilibili/community/service/dm/v1/dm.proto

 接下来推荐一个在线proto编译网站

Protobuf Code Generator and Parser | protobufnet | Marc Gravellhttps://protogen.marcgravell.com/#

**的proto定义复制到该网站,选择语言为Python,点击Generate后右边得到的就是我们想要的

 

直接复制右边的代码,在自己的项目里面创建一个py文件,粘贴即可

注意:你创建的文件名必须以_pb2.py结尾!!!!(这里我叫做bili_pb2.py)

接下来就是在你需要进行逆序列化的文件里面这么写

import bili_pb2
from google.protobuf import text_format
# 肯定是先导包,下面这个不是必需的,作用在后文会介绍

my_seg = bili_pb2.DmSegMobileReply()
my_seg.ParseFromString(DATA)
# DATA是二进制数据
# 比如你可以这么写
# DATA = resp.content
# 或者这么写
# with open('./test.so','rb') as f:
#     DATA = f.read()


# 理论上此时文件已经被逆序列化了,你可以通过 print(my_seg.elems)来得到逆序列化后的数据

注意:此时my_seg.elems是一个列表,包含各个弹幕的信息

这是一个示例数据:

 对于里面的各参数的作用这个网站有解答:

bilibili-API-collect/danmaku_proto.md at bb437d2012e6291b38c78d42755db9d836d4975f · SocialSisterYi/bilibili-API-collect · GitHubhttps://github.com/SocialSisterYi/bilibili-API-collect/blob/bb437d2012e6291b38c78d42755db9d836d4975f/danmaku/danmaku_proto.md

很重要的问题!!!

上述代码理论上已经能让你得到数据了,但是有个问题,就是如果弹幕内容是中文时,返回的数据是编码后的,下图我的字幕内容是 “中文测试” ,但是图中并不是汉字

 此时,我们可以使用以下代码来实现自动转化为中文:

import bili_pb2
from google.protobuf import text_format
# 肯定是先导包,下面这个不是必需的,作用在后文会介绍

my_seg = bili_pb2.DmSegMobileReply()
my_seg.ParseFromString(DATA)
# DATA是二进制数据
# 比如你可以这么写
# DATA = resp.content
# 或者这么写
# with open('./test.so','rb') as f:
#     DATA = f.read()


# 理论上此时文件已经被逆序列化了,你可以通过 print(my_seg.elems)来得到逆序列化后的数据

###############################上次的代码##########################

# 新的代码
for j in my_seg.elems:
    parse_data = text_format.MessageToString(j, as_utf8=True)

# 此时的parse_data可以直接print了
# text_format.MessageToString只能处理一个数据,而my_seg.elems返回的是数据列表

这样就能得到我们想要的数据了:

写在最后:

关于弹幕数据的一些坑:不是每个弹幕返回的数据都有progress这个参数,在使用正则匹配的时候注意点,容易被坑

还要再次感谢知乎的那篇文章,逆序列化的代码参考了他的代码

b站弹幕 Protobuf 格式解析 - 知乎

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值