写在前面:

下文全部使用**代替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 格式解析 - 知乎

b站弹幕 so文件解析/逆序列化相关推荐

  1. B站弹幕文件protobuf协议的逆向和还原

    目标是B站弹幕的数据还原,随便打开一个视频,直接三连 能看到真实文本,但也有一些乱码,看一下 content-type content-type: application/octet-stream 参 ...

  2. b站 实时弹幕和历史弹幕 Protobuf 格式解析

    参考: https://zhuanlan.zhihu.com/p/392931611 https://gitee.com/nbody1996/bilibili-API-collect/blob/mas ...

  3. Android -- 创建XML文件对象及其序列化, pull解析XML文件

    1. 创建XML文件对象及其序列化 示例代码:(模拟以xml格式备份短信到SD卡) SmsInfo.java, bean对象 /*** 短信的业务bean* @author Administrator ...

  4. java获取b站动态列表地址,java获取B站弹幕文件的两种方案

    (一)实现思路 1,定位弹幕文件 一般用json或xml格式来保存弹幕,所以我们只要找到视频网页里面的xml文件或json文件,就能定位到弹幕文件. 2,解析弹幕文件 然后通过jsoup解析文件,提取 ...

  5. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下: http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这 ...

  6. 【第4篇】Python爬虫实战-抓取B站弹幕视频

    目录 1.获取视频cid参数 2.程序源代码 3.程序运行结果 4.总结 1.获取视频cid参数 首先我们打开一个有弹幕的B站视频,比如:<我好像在哪见过你>人们把难言的爱都埋入土壤里_哔 ...

  7. 爬虫6_周杰伦新歌《Mojito》B站弹幕分析

    6.12周杰伦发布新歌<Mojito>,赶紧蹭个热点来看一下大家弹幕都会说点什么. 爬取链接[官方MV]Mojito - 周杰伦 本项目源码,提取码duq8 目前弹幕只能抓取1000条,再 ...

  8. python按日期爬取b站弹幕 2.0版

    上次的b站爬取需要手动输入日期等信息,这次直接在程序内根据时间差进行爬取,直接放上完整代码. 代码 上次的分析链接在此:b站弹幕爬取分析 直接附上完整代码: import requests from ...

  9. JS逆向加密——B 站弹幕 protobuf 分析

    B 站弹幕 protobuf 分析 首先了解 Protobuf 是什么 ? 参考1 网站调试分析 首先 打开 网址的开发者工具,找到所发起的请求 怎么区分 是不是protobuf 格式呢,可以看看请求 ...

最新文章

  1. 每日一皮:如何把程序员骗到手!
  2. bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash
  3. 零基础开始学 Web 前端开发,有什么建议吗?--知
  4. TFS修改工作区映射区
  5. Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法](转)
  6. 《赛博朋克 2077》与《对马岛之魂》的「不自由感」究竟从何而来?
  7. [Redux/Mobx] Redux怎么添加新的中间件?
  8. Kylin3.1.3连接Hbase报错找不到 hbase-common lib not found的解决办法
  9. 1.4编程基础之逻辑表达式与条件分支 07 收集瓶盖赢大奖
  10. 计算机改计数器的方法,第五章定时器计数器(修改)-计算机原理及应用资源共享课.ppt...
  11. 中nextint函数_Kotlin中的作用域方法(Scope Function)
  12. u盘在磁盘管理可以显示 但是电脑中找不到_U盘无法识别怎么办?试试这种方法,没准还有救!...
  13. Android系统(97)---开源项目分类整理
  14. Java面试11|Maven与Git
  15. SQL笔试之盘古开天
  16. 【w3cschool】C语言复习
  17. 关于Ext checkboxfiled 获取值为 on的解决办法
  18. 作为程序员,常用的工具软件之搜索引擎
  19. RNA-seq那些事儿
  20. 用计算机语言说一局情话,计算机中的情话

热门文章

  1. Python+Selenium自动化测试——126邮箱自动登录脚本(登录首页是二维码,切入账号密码输入框)
  2. 苹果手机被偷,从北京到三亚,我用79天找回了它
  3. Andriod studio 学习 之打包
  4. 【关于2022年卡塔尔世界杯】
  5. 基于深度神经网络的高光谱影响分类方法研究---MNF+自动编码器+Softmax (准确率比较低,17年的论文)
  6. 内网端口映射详解(花生壳)
  7. 拉钩网前端项目实战04
  8. 送H-1B 及其他I-129 申请别忘用新表
  9. The server time zone value 'xxx' is unrecognized or represents more than one time zone 问题的解决方法
  10. sql文件反向生成物理概念模型