参考:

  • https://zhuanlan.zhihu.com/p/392931611
  • https://gitee.com/nbody1996/bilibili-API-collect/blob/master/danmaku/danmaku_proto.md
  • Bilibili 历史弹幕:https://www.cnblogs.com/mollnn/p/14964905.html

b站弹幕传输的格式由原来的 xml 改为了 protobuf,这个格式为二进制编码传输,其传输销量远高于原来的 xml,因此在移动端可以减小网络的压力具有一定的优势。但带来的一个问题就是,这个格式的弹幕解析起来变得十分困难,通常从 api 获得的数据直接看是一通乱码,需要特定的方式才能看到真正的内容,让人比较头疼。

B站没有使用 protobuf 协议前的弹幕接口

  • :https://comment.bilibili.com/4934490.xml
  • :https://api.bilibili.com/x/v1/dm/list.so?oid=4934490

1、什么是 Protobuf

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.

上面这段话来自谷歌 Protobuf 官网的介绍,简单来讲就是一种传输的协议,比 xml 更小、更快、更简单,更多信息可以见:https://developers.google.com/protocol-buffers/

2、如何解析 Protobuf 的弹幕

2.1 下载 Protoc 编译器

Protoc 是用于将 .proto 文件编译成各种编程语言(如 Python、Golang 等)的编译器,是进行 Protobuf 解析的必要条件,可在下面的链接中下载:https://github.com/protocolbuffers/protobuf

下载完成后解压出来是 exe 文件,不需要安装,但是需要手动添加到 Path 中。

通过在终端中运行如下代码来确定是否安装成功:protoc --version

2.2 下载 Protobuf-Python 以便在 Python 中解析 Protobuf

下载地址:https://github.com/protocolbuffers/protobuf

下载完成后解压,然后进入 python 进入目录,

执行以下命令行代码:

python setup.py clean
python setup.py build
python setup.py install
python setup.py test

2.3 弹幕的 proto 定义并编译

弹幕格式,protobuf 结构体:

dm.proto

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;
}
名称 含义 类型 备注
id 弹幕dmID int64 唯一 可用于操作参数
progress 视频内弹幕出现时间 int32 毫秒
mode 弹幕类型 int32 1 2 3:普通弹幕
4:底部弹幕
5:顶部弹幕
6:逆向弹幕
7:高级弹幕
8:代码弹幕
9:BAS弹幕
fontsize 弹幕字号 int32 18:小
25:标准
36:大
color 弹幕颜色 uint32 十进制RGB888值
midHash 发送者UID的HASH string 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户ID
content 弹幕内容 string utf-8编码
ctime 弹幕发送时间 int64 时间戳
weight 权重 int32 用于智能屏蔽级别
action 动作 string 未知
pool 弹幕池 int32 0:普通池
1:字幕池
2:特殊池(代码/BAS弹幕)
idStr 弹幕dmID的字符串类型 string 唯一 可用于操作参数

2.4 解析 seg.so 格式的弹幕数据

示例视频:https://www.bilibili.com/video/av98919207

解析之前需要先安装 python 的 probuf 包: pip install protobuf

编译 proto 结构文件,

protoc --python_out=. dm.proto

执行完成后会生成 dm_pb2.py,代码中引入这个 python 文件,

dm_pj.py 代码如下:

注意:

  • 实时弹幕 不需要 cookie,直接请求即可得到 seg.so
  • 历史弹幕 需要 cookie 才能得到 seg.so
# -*- coding: utf-8 -*-
# @Author  :
# @Date    :
# @File    : dm_pj.py
# @description : XXXimport json
import requests
from dm_pb2 import DmSegMobileReply
from google.protobuf.json_format import MessageToJson, Parseb_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

执行结果截图:

弹幕对比:

b站 实时弹幕和历史弹幕 Protobuf 格式解析相关推荐

  1. python3爬取B站视频历史弹幕

    python爬取B站视频历史弹幕 演示 演示 1.运行程序,输入Bvid和爬取日期. 2.程序运行完成后会在当前文件夹下生成一个csv格式文件. 百度网盘链接: https://pan.baidu.c ...

  2. pythongui界面实现爬取b站弹幕_Python爬虫自动化爬取b站实时弹幕实例方法

    免费资源网,https://freexyz.cn/ 最近央视新闻记者王冰冰以清除可爱和专业的新闻业务水平深受众多网友喜爱,b站也有很多up主剪辑了关于王冰冰的视频.我们都是知道b站是一个弹幕网站,那你 ...

  3. python爬取B站视频历史弹幕,并去除同标签的重复弹幕,暴力拿下所有弹幕。

    嘻嘻嘻,今天我们来爬小B站的弹幕. 文章目录 前言 一.爬取历史弹幕的思路讲解 1.如何找到弹幕的爬取位置 2.如何找到历史弹幕的位置 二.代码讲解部分 1.引入库 2.编写自己的headers 3. ...

  4. python接收弹幕_Python爬虫自动化爬取b站实时弹幕实例方法

    最近央视新闻记者王冰冰以清除可爱和专业的新闻业务水平深受众多网友喜爱,b站也有很多up主剪辑了关于王冰冰的视频.我们都是知道b站是一个弹幕网站,那你知道如何爬取b站实时弹幕吗?本文以王冰冰视频弹幕为例 ...

  5. 关于《后浪》的B站弹幕分析总结(一)——爬取B站视频的上万条弹幕的方法

    目录 一.先尝试爬取1000条 1 .1 查找弹幕所在地址 1.2 代码实现 二.1000条不够我想要更多怎么办? 三.B站弹幕文件里的其他信息有用吗? 注意:这是一篇技术类文章 前几天我做了B站&l ...

  6. 借用 potplayer 播放器,在本地播放 b 站视频也能看弹幕了

    苏生不惑第164 篇原创文章,将本公众号设为星标,第一时间看最新文章. 关于b站之前已经写过了下列文章,有兴趣可以点击阅读: 那些我关注的 b 站 up 主 bilibili(b站)升级到BV号了,还 ...

  7. 【吐槽脑洞】关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考

    [吐槽&开脑洞]关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考 预警:本贴没有什么技术含量,也没有什么严谨的资料调查,仅仅是自己的一次游戏体验引起的一些思考和个人观点,以及作为 ...

  8. B站2020跨年晚会,被弹幕刷屏的节目是哪个,发弹幕最多的人又是谁?

    作者 | CDA数据分析师 本以为薛之谦粉丝会觉得不妥给C君留言指正,没想到却是被数据分析爱好者从内容上提出了严厉的批评. 垃圾标题党...我以为收集的数据是与春晚观看人数,成本之类的对比,结果搞了个 ...

  9. python爬斗鱼直播_Python爬虫:利用API实时爬取斗鱼弹幕

    原标题:Python爬虫:利用API实时爬取斗鱼弹幕 这些天一直想做一个斗鱼爬取弹幕,但是一直考试时间不够,而且这个斗鱼的api接口虽然开放了但是我在github上没有找到可以完美实现连接.我看了好多 ...

最新文章

  1. Spring Boot第四篇:SpringBoot 整合JPA
  2. 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
  3. python发明者叫什么-python发明人
  4. 一文秒懂!Python字符串格式化之format方法详解
  5. 深入理解 Angular 变化检测(change detection)
  6. eclipse配置maven + 创建maven项目
  7. 面试又栽在JVM上了!
  8. bool查询原理 es_es6.2.4,使用bool查询查出的结果,SearchResponse的Hits[]总是比t..._慕课猿问...
  9. Sybase ASE15.7静默安装
  10. PDMS Pipeline Tool 教程(四):目录树顺序检查
  11. 反恐精英代码_知名网游源代码泄漏 ,外挂潮将来?
  12. 云MAS中CMPP3.0协议封装与移动短信状态报告状态码说明
  13. golang读取pdf
  14. 在mac上使用vscode创建第一个Python项目
  15. 如何防止QT程序未响应
  16. 自考计算机专业就业率,自考计算机专业就业前景和就业选择
  17. 什么是微信商城?如何微商城?
  18. 什么是BFC以及BFC的作用
  19. 元宇宙:未来or骗局?
  20. AIX 下lsnrctl start 错误

热门文章

  1. 史上最全Spring面试71题与答案
  2. 论文浅尝 - ACL2020 | 用于关系三元组抽取的级联二进制标记框架
  3. 2020国内互联网公司的开源项目及Github地址部分汇总
  4. Android官方开发文档Training系列课程中文版:数据存储之数据库存储
  5. 美商务部再禁6项新兴技术,包括光刻软件和5nm生产技术
  6. 搭建分布式环境:Dubbo+Zookeeper
  7. 转 关于window10安装jdk,配置环境变量,javac不是内部或外部命令,也不是可运行的程序 或批处理文件的细节问题。...
  8. LUOGU P4016 负载平衡问题
  9. 团队博客 一 需求分析
  10. 基于visual Studio2013解决面试题之0608找出两个只出现一次的数