# 历史弹幕
**注:历史弹幕的xml接口已经失效,现已改为protobuf接口**
## 查询历史弹幕日期
> https://api.bilibili.com/x/v2/dm/history/index
*请求方式:GET*
认证方式:Cookie(SESSDATA)
**注:查询历史弹幕需要登录**
**url参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ------------ | ------ | ------- |
| type | num | 1 | 必要 | |
| oid | num | 视频cid | 必要 | |
| month | str | 查询目标年月 | 必要 | YYYY-MM |
**json回复:**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ------------------------------- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有弹幕:array
无弹幕:null | 日期列表 | |
`data`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------------- | ---------- |
| 0 | str | 存在弹幕的日期1 | YYYY-MM-DD |
| n | str | 存在弹幕的日期(n+1) | YYYY-MM-DD |
| …… | str | …… | …… |
**示例:**
查询了cid为144541892的视频位于2020年1月中有历史弹幕记录的日期
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
--data-urlencode 'month=2020-01' \
-b 'SESSDATA=xxx'
```
查看响应示例:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": [
"2020-01-21",
"2020-01-22",
"2020-01-23",
"2020-01-24",
"2020-01-25",
"2020-01-26",
"2020-01-27",
"2020-01-28",
"2020-01-29",
"2020-01-30",
"2020-01-31"
]
}
```
返回结果的 `data` 项说明这些日期有弹幕发送。若查询的月份中视频无弹幕,则 `data` 项为 `null`
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
--data-urlencode 'month=2019-12' \
-b 'SESSDATA=xxx'
```
查看响应示例:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": null
}
```
## 获取历史弹幕protobuf接口
> https://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](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/grpc_api/bilibili/community/service/dm/v1/dm.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 = 'https://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接口
查看折叠内容:
> https://api.bilibili.com/x/v2/dm/history
*请求方式:GET*
认证方式:Cookie(SESSDATA)
**注:查询历史弹幕需要登录**
结果为[标准xml格式弹幕](danmaku_xml.md#弹幕格式)
**使用deflate压缩,注意解码**
**url参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | -------- | ------ | ---------- |
| type | num | 1 | 必要 | |
| oid | num | 视频cid | 必要 | |
| date | str | 弹幕日期 | 必要 | YYYY-MM-DD |
**示例:**
获取视频`av84271171(cid=144541892)`2020-01-21的历史弹幕
```shell
curl -G 'https://api.bilibili.com/x/v2/dm/history' \
--data-urlencode 'type=1' \
--data-urlencode 'oid=144541892' \
--data-urlencode 'date=2020-01-21' \
-b 'SESSDATA=xxx' \
--compressed -o 'danmaku.xml'
```
查看响应示例:
```xml
chat.bilibili.com
144541892
0
1500
0
0
敬礼
悄默声的更新啊怎么
久等了
不都是乱纪元才浸泡
已阅,狗屁不通。大字报在地上搞搞就行,别弄到天上去
CSSC。。。
看到了个寂寞
有耳朵了!
雪天不用浸泡吧
未来史学派
浸泡!!!!!!!
章召忠
mi24av
泪奔
组建太空军
是未来史学派?
刘培强还行
…………
```