From f97772d8b198f9b340e627fefef86717ffe5b86b Mon Sep 17 00:00:00 2001
From: SocialSisterYi <45892418+SocialSisterYi@users.noreply.github.com>
Date: Tue, 16 Feb 2021 00:56:54 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E3=80=90protobuf=E5=AE=9E?=
=?UTF-8?q?=E6=97=B6=E5=BC=B9=E5=B9=95=E3=80=91=E6=8E=A5=E5=8F=A3=20?=
=?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E3=80=90protobuf=E5=8E=86=E5=8F=B2?=
=?UTF-8?q?=E5=BC=B9=E5=B9=95=E3=80=91=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
danmaku/danmaku_proto.md | 103 +++++++++++----------------------------
danmaku/history.md | 90 ++++++++++++++++++++++++++++++++--
2 files changed, 113 insertions(+), 80 deletions(-)
diff --git a/danmaku/danmaku_proto.md b/danmaku/danmaku_proto.md
index 5b970aa..5d5fa46 100644
--- a/danmaku/danmaku_proto.md
+++ b/danmaku/danmaku_proto.md
@@ -5,7 +5,6 @@
新的api是以6分钟为一个单位加载,即每次加载6分钟内的弹幕
- [获取实时弹幕](#获取实时弹幕)
-- [实例](#实例)
---
@@ -38,6 +37,8 @@
**proto回复:**
+porto定义见:[bilibili.community.service.dm.v1.DmSegMobileReply](..\grpc_api\bilibili\community\service\dm\v1.proto)
+
消息`DmSegMobileReply`:
| 名称 | 类型 | 含义 | 备注 |
@@ -61,94 +62,46 @@
| pool | int32 | 弹幕池 | 0:普通池
1:字幕池
2:特殊池(代码/BAS弹幕) |
| idStr | string | 弹幕dmID | 字串形式
唯一 可用于操作参数 |
-protobuf结构体:
-
-**bilidm.proto**
-
-```protobuf
-syntax = "proto3";
-
-message DanmakuElem {
- int64 id = 1; //弹幕dmID
- int32 progress = 2; //出现时间
- int32 mode = 3; //弹幕类型
- int32 fontsize = 4; //文字大小
- uint32 color = 5; //弹幕颜色
- string midHash = 6; //发送者UID的HASH
- string content = 7; //弹幕内容
- int64 ctime = 8; //发送时间
- int32 weight = 9; //权重
- string action = 10; //动作?
- int32 pool = 11; //弹幕池
- string idStr = 12; //弹幕dmID(字串形式)
-}
-
-message DmSegMobileReply {
- repeated DanmakuElem elems = 1; //弹幕条目
-}
-```
-
**示例:**
-获取视频`av810872(CID=1176840)`的实时弹幕分包1
+获取视频`av810872(CID=1176840)`(炮姐)的实时弹幕分包1
-```shell
-curl -G 'http://api.bilibili.com/x/v2/dm/web/seg.so' \
---data-urlencode 'type=1' \
---data-urlencode 'oid=1176840' \
---data-urlencode 'pid=810872' \
---data-urlencode 'segment_index=1' \
--o 'danmaku.bin'
-```
-
-响应正文为protubuf二进制数据
-
-## 实例
-
-获取炮姐弹幕第1包,[BV1Js411o76u](https://www.bilibili.com/video/BV1Js411o76u)
-
-编译proto结构文件
-
-```shell
-protoc --python_out=. bilidm.proto
-```
-
-生成bilidm_pb2.py
-
----
-
-以下为python测试代码,输出第一包的第一条弹幕
+**注:proto定义需要编译**
```python
-import bilidm_pb2
import requests
+import google.protobuf.text_format as text_format
+import bilibili.community.service.dm.v1_pb2 as Danmaku
-AVID = 810872
-CID = 1176840
-SEG = 1
-url = f'http://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid={CID}&pid={AVID}&segment_index={SEG}'
+url = 'http://api.bilibili.com/x/v2/dm/web/seg.so'
+params = {
+ 'type':1, #弹幕类型
+ 'oid':1176840, #cid
+ 'pid':810872, #avid
+ 'segment_index':1 #弹幕分段
+}
+resp = requests.get(url,params)
+data = resp.content
-data = requests.get(url)
-target = bilidm_pb2.DmSegMobileReply()
-target.ParseFromString(data.content)
+danmaku_seg = Danmaku.DmSegMobileReply()
+danmaku_seg.ParseFromString(data)
-print(target.elems[0])
-print(target.elems[0].content)
+print(text_format.MessageToString(danmaku_seg.elems[0],as_utf8=True))
```
输出:
```
-id: 682225690
-progress: 44125
+id: 711923911
+progress: 47880
mode: 1
-fontsize: 25
-color: 16777215
-midHash: "af4aa003"
-content: "\346\210\221\347\202\256\350\277\230\350\203\275\345\206\215\346\210\230500\345\271\264\357\274\201\357\274\201\357\274\201\346\210\221\347\202\256\350\277\230\350\203\275\345\206\215\346\210\230500\345\271\264\357\274\201\357\274\201\357\274\201\346\210\221\347\202\256\350\277\230\350\203\275\345\206\215\346\210\230500\345\271\264\357\274\201\357\274\201\357\274\201\346\210\221\347\202\256\350\277\230\350\203\275\345\206\215\346\210\230500\345\271\264"
-ctime: 1416323487
+fontsize: 18
+color: 10092288
+midHash: "59417e95"
+content: "世界第一电击公主殿下,遇到你是我一生最美好的风景!吾炮赛高,永生不离!唯我超电磁炮永世长存! "
+ctime: 1418799826
weight: 6
-idStr: "682225690"
-
-我炮还能再战500年!!!我炮还能再战500年!!!我炮还能再战500年!!!我炮还能再战500年
+idStr: "711923911"
+attr: 1
```
+
diff --git a/danmaku/history.md b/danmaku/history.md
index 9839024..679d6b8 100644
--- a/danmaku/history.md
+++ b/danmaku/history.md
@@ -1,7 +1,10 @@
# 历史弹幕
+**注:历史弹幕的xml接口已经失效,现已改为protobuf接口**
+
- [查询历史弹幕日期](#查询历史弹幕日期)
-- [获取历史弹幕](#获取历史弹幕)
+- [获取历史弹幕protobuf接口](#获取历史弹幕protobuf接口)
+- [~~获取历史弹幕xml接口~~](#获取历史弹幕xml接口)
---
@@ -13,6 +16,8 @@
认证方式:Cookie(SESSDATA)
+**注:查询历史弹幕需要登录**
+
**url参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
@@ -48,7 +53,8 @@
curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
---data-urlencode 'month=2020-01'
+--data-urlencode 'month=2020-01' \
+-b 'SESSDATA=xxx'
```
@@ -83,7 +89,8 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \
curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
---data-urlencode 'month=2019-12'
+--data-urlencode 'month=2019-12' \
+-b 'SESSDATA=xxx'
```
@@ -100,7 +107,73 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \
-## 获取历史弹幕
+## 获取历史弹幕protobuf接口
+
+> http://api.bilibili.com/x/v2/dm/web/history/seg.so
+
+*请求方式:GET*
+
+认证方式:Cookie(SESSDATA)
+
+**url参数:**
+
+| 参数名 | 类型 | 内容 | 必要性 | 备注 |
+| ------ | ---- | -------- | ------ | ----------- |
+| type | num | 弹幕类 | 必要 | 1:视频弹幕 |
+| oid | num | 视频CID | 必要 | |
+| date | str | 弹幕日期 | 必要 | YYYY-MM-DD |
+
+**proto回复:**
+
+porto定义见:[bilibili.community.service.dm.v1.DmSegMobileReply](..\grpc_api\bilibili\community\service\dm\v1.proto)
+
+详细说明见[protobuf弹幕](danmaku_proto.md)
+
+获取视频`av84271171(CID=144541892)`2020-01-21的历史弹幕
+
+**注:proto定义需要编译**
+
+```python
+import requests
+import google.protobuf.text_format as text_format
+import bilibili.community.service.dm.v1_pb2 as Danmaku
+
+url = 'http://api.bilibili.com/x/v2/dm/web/history/seg.so'
+params = {
+ 'type':1, #弹幕类型
+ 'oid':144541892, #cid
+ 'date':'2020-01-21' #弹幕日期
+}
+cookies = {
+ 'SESSDATA':'xxx'
+}
+resp = requests.get(url,params,cookies=cookies)
+data = resp.content
+
+danmaku_seg = Danmaku.DmSegMobileReply()
+danmaku_seg.ParseFromString(data)
+
+print(text_format.MessageToString(danmaku_seg.elems[0],as_utf8=True))
+```
+
+输出:
+
+```
+id: 27532611677585408
+progress: 300507
+mode: 1
+fontsize: 25
+color: 16777215
+midHash: "2a28d4a6"
+content: "章北海的老爹"
+ctime: 1579621359
+idStr: "27532611677585408"
+```
+
+## 获取历史弹幕xml接口
+
+
+查看折叠内容:
> http://api.bilibili.com/x/v2/dm/history
@@ -108,6 +181,8 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \
认证方式:Cookie(SESSDATA)
+**注:查询历史弹幕需要登录**
+
结果为[标准xml格式弹幕](danmaku_xml.md#弹幕格式)
**使用deflate压缩,注意解码**
@@ -122,12 +197,15 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history/index' \
**示例:**
+获取视频`av84271171(CID=144541892)`2020-01-21的历史弹幕
+
```shell
curl -G 'http://api.bilibili.com/x/v2/dm/history' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
--data-urlencode 'date=2020-01-21' \
---compressed -o 'danmaku.xml'
+-b 'SESSDATA=xxx' \
+--compressed -o 'danmaku.xml'
```
@@ -163,4 +241,6 @@ curl -G 'http://api.bilibili.com/x/v2/dm/history' \
```
+
+
\ No newline at end of file