# 直播间弹幕 | BAC Document
社区开源的第三方哔哩哔哩 API 文档

# 直播间弹幕

## 获取当前用户对应直播间可发弹幕配置

> https://api.live.bilibili.com/xlive/web-room/v1/dM/GetDMConfigByGroup

请求方式: GET

认证方式: Cookie (SESSDATA)

未登录也可以获取，但颜色只有白色可用，模式只有滚动。

url参数：

参数名 | 类型 | 内容 | 必要性 | 备注
--- | --- | --- | --- | ---
room_id | num | 直播间id | 必要 |
web_location | str | (?) | 非必要 | 作用尚不明确
w_rid | str | wbi签名 | 非必要 | 不强制需要
wts | num | 秒时间戳 | 非必要 | 不强制需要

json回复：

根对象：

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
code | num | 返回值 | 0: 成功 -400: 参数错误
data | obj | 信息本体 |
message | str | 错误信息 |
msg | str | 信息 | 成功时存在，为`""`(空字符串)
ttl | num | `1` | 成功时不存在

`data` 对象:

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
group | arr | 弹幕颜色组 |
mode | arr | 弹幕显示模式 |

`data.group` 数组中对象:

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
name | str | 显示名称 |
sort | num | 用于排序 |
color | arr | 该组颜色列表 |

`data.group[i].color` 数组中对象:

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
name | str | 颜色名 |
color | str | 十进制颜色值 | 发送弹幕用
color_hex | str | 十六进制颜色值 | 发送弹幕用
status | num | 可用状态 | 0: 不可用 1: 可用
weight | num | (?) | 作用尚不明确
color_id | num | 颜色id? |
origin | num | (?) |

`data.mode` 数组中对象:

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
name | str | 模式名称 |
mode | num | 模式值 | 发送弹幕用
type | str | 模式类型 |
status | num | 可用状态 | 0: 不可用 1: 可用

示例：

获取未登录用户在直播间 `1` 的弹幕配置可用情况

    curl 'https://api.live.bilibili.com/xlive/web-room/v1/dM/GetDMConfigByGroup?room_id=1'

查看响应示例：

    {
      "code": 0,
      "data": {
        "group": [
          {
            "name": "普",
            "sort": 0,
            "color": [
              {
                "name": "白色",
                "color": "16777215",
                "color_hex": "ffffff",
                "status": 1,
                "weight": -9999,
                "color_id": -9999,
                "origin": 0
              }
            ]
          },
          {
            "name": "航",
            "sort": 100,
            "color": [
              {
                "name": "紫色",
                "color": "14893055",
                "color_hex": "e33fff",
                "status": 0,
                "weight": 0,
                "color_id": 6,
                "origin": 1
              }
            ]
          },
          {
            "name": "粉",
            "sort": 200,
            "color": [
              {
                "name": "松石绿",
                "color": "5566168",
                "color_hex": "54eed8",
                "status": 0,
                "weight": 99,
                "color_id": 66,
                "origin": 2
              },
              {
                "name": "雨后蓝",
                "color": "5816798",
                "color_hex": "58c1de",
                "status": 0,
                "weight": 98,
                "color_id": 67,
                "origin": 2
              },
              {
                "name": "星空蓝",
                "color": "4546550",
                "color_hex": "455ff6",
                "status": 0,
                "weight": 97,
                "color_id": 68,
                "origin": 2
              },
              {
                "name": "紫罗兰",
                "color": "9920249",
                "color_hex": "975ef9",
                "status": 0,
                "weight": 96,
                "color_id": 69,
                "origin": 2
              },
              {
                "name": "梦境红",
                "color": "12802438",
                "color_hex": "c35986",
                "status": 0,
                "weight": 95,
                "color_id": 70,
                "origin": 2
              },
              {
                "name": "热力橙",
                "color": "16747553",
                "color_hex": "ff8c21",
                "status": 0,
                "weight": 94,
                "color_id": 71,
                "origin": 2
              },
              {
                "name": "香槟金",
                "color": "16774434",
                "color_hex": "fff522",
                "status": 0,
                "weight": 93,
                "color_id": 72,
                "origin": 2
              }
            ]
          },
          {
            "name": "爷",
            "sort": 300,
            "color": [
              {
                "name": "红色",
                "color": "16738408",
                "color_hex": "ff6868",
                "status": 0,
                "weight": 0,
                "color_id": 8,
                "origin": 3
              },
              {
                "name": "蓝色",
                "color": "6737151",
                "color_hex": "66ccff",
                "status": 0,
                "weight": 0,
                "color_id": 7,
                "origin": 3
              }
            ]
          },
          {
            "name": "活",
            "sort": 400,
            "color": [
              {
                "name": "盛典金",
                "color": "16766720",
                "color_hex": "ffd700",
                "status": 0,
                "weight": 100,
                "color_id": 44,
                "origin": 4
              },
              {
                "name": "升腾蓝",
                "color": "4286945",
                "color_hex": "4169e1",
                "status": 0,
                "weight": 100,
                "color_id": 43,
                "origin": 4
              },
              {
                "name": "青色",
                "color": "65532",
                "color_hex": "fffc",
                "status": 0,
                "weight": 0,
                "color_id": 5,
                "origin": 4
              },
              {
                "name": "绿色",
                "color": "8322816",
                "color_hex": "7eff00",
                "status": 0,
                "weight": 0,
                "color_id": 4,
                "origin": 4
              },
              {
                "name": "黄色弹幕",
                "color": "16772431",
                "color_hex": "ffed4f",
                "status": 0,
                "weight": 0,
                "color_id": 3,
                "origin": 4
              },
              {
                "name": "橙色",
                "color": "16750592",
                "color_hex": "ff9800",
                "status": 0,
                "weight": 0,
                "color_id": 2,
                "origin": 4
              },
              {
                "name": "粉色",
                "color": "16741274",
                "color_hex": "ff739a",
                "status": 0,
                "weight": 0,
                "color_id": 1,
                "origin": 4
              }
            ]
          }
        ],
        "mode": [
          {
            "name": "滚动",
            "mode": 1,
            "type": "scroll",
            "status": 1
          },
          {
            "name": "底部",
            "mode": 4,
            "type": "bottom",
            "status": 0
          },
          {
            "name": "顶部",
            "mode": 5,
            "type": "top",
            "status": 0
          }
        ]
      },
      "message": "",
      "msg": ""
    }

## 设置弹幕样式

> https://api.live.bilibili.com/xlive/web-room/v1/dM/AjaxSetConfig

请求方式: POST

认证方式: Cookie (SESSDATA)

鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同

正文参数 (application/x-www-form-urlencoded)：

参数名 | 类型 | 内容 | 必要性 | 备注
--- | --- | --- | --- | ---
csrf | str | CSRF Token（位于cookie） | 必要 |
csrf_token | str | 同csrf | 非必要 |
room_id | num | 直播间id | 必要 |
color | str | 颜色值 | 必要（可选） | color和mode任选一个
mode | num | 弹幕模式 | 必要（可选） | color和mode任选一个

注1: 抓取到的color格式是`"0x"+六位十六进制小写颜色值`，实际不需要`0x`，且不区分大小写。

注2: 若color和mode同时存在将只处理color，mode将被忽略。（见#1236(comment)）

json回复：

根对象：

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
code | num | 返回值 | 0: 成功 -101: 账号未登录 -500: 未达到使用条件 10064002: 参数错误 10065107: 颜色不存在
message | str | 错误信息 |
ttl | num | `1` |
data | obj | 信息本体 | 部分情况不存在，10064002时为`null`

`data` 对象：

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
status | num | 同code |
msg | str | 提示信息 | 成功时有内容
roomid | num | 直播间id |

示例：

更改直播间 `1017` 的弹幕颜色为白色

    curl 'https://api.live.bilibili.com/xlive/web-room/v1/dM/AjaxSetConfig' \
      --data-urlencode 'room_id=1017' \
      --data-urlencode 'color=0xffffff' \
      --data-urlencode 'csrf=xxx' \
      -b 'SESSDATA=xxx;bili_jct=xxx'

查看响应示例：

    {
      "code":0,
      "message":"0",
      "ttl":1,
      "data":{
        "status":0,
        "msg":"设置成功~",
        "roomid":1017
      }
    }

## 发送直播弹幕

> https://api.live.bilibili.com/msg/send

请求方式: POST

认证方式: Cookie (SESSDATA)

鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同

url参数：

参数名 | 类型 | 内容 | 必要性 | 备注
--- | --- | --- | --- | ---
w_rid | str | wbi签名 | 非必要 | 不强制需要
wts | num | Unix 秒时间戳 | 非必要 | 不强制需要

正文参数 (`application/x-www-form-urlencoded`或`multipart/form-data`)：

参数名 | 类型 | 内容 | 必要性 | 备注
--- | --- | --- | --- | ---
csrf | str | CSRF Token（位于cookie） | 必要 |
roomid | num | 直播间id | 必要 |
msg | str | 弹幕内容 | 必要 |
rnd | num | 当前 Unix 秒时间戳 | 必要 |
fontsize | num | 字体大小 | 必要 | 默认为`25`
color | num | 十进制颜色值 | 必要 | 实际无效果
mode | num | 展示模式 | 非必要 | 默认为`1`
bubble | num | (?) | 非必要 | 值为`0`
room_type | num | (?) | 非必要 | `0`
jumpfrom | num | (?) | 非必要 | `0`
reply_mid | num | 要“@”的用户mid | 非必要 | 默认为`0`
reply_attr | num | (?) | 非必要 | `0`
reply_uname | str | 要“@”的用户名称 | 非必要 | 默认为`""`，提供reply_mid时不需要提供
replay_dmid | str | 要回复的弹幕id | 非必要 | 默认为`""`
statistics | str | (?) | 非必要 | `{"appId":100,"platform":5}`
csrf_token | str | 同csrf | 非必要 |

json回复：

根对象：

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
code | num | 返回值 | `-101`:账号未登录 `-111`:csrf 校验失败 `-400`:请求错误，带有必须参数的信息 `1003212`:超出限制长度 `10031`:发送频率过快
message | str | 错误信息 |
msg | str | 同`message` |
data | obj | 信息本体 |
ttl | num | `1` | 在小于0的code中存在

`data` 对象:

字段 | 类型 | 内容 | 备注
--- | --- | --- | ---
mode_info | obj | 弹幕信息 |
dm_v2 | null | v2弹幕 |

`data.mode_info` 对象:

基本上与直播间信息流#弹幕 (DANMU_MSG)的`info[0][15]`对象相同。

示例：

给直播间 `1899237171` 发送内容为 `QwQ` 的弹幕

    curl 'https://api.live.bilibili.com/msg/send' \
      --data-urlencode 'roomid=1899237171' \
      --data-urlencode 'msg=QwQ' \
      --data-urlencode 'rnd=1744956003' \
      --data-urlencode 'fontsize=25'
      --data-urlencode 'color=16777215'
      --data-urlencode 'csrf=xxx' \
      -b 'SESSDATA=xxx;bili_jct=xxx'

查看响应示例：

    {
      "code":0,
      "data":{
        "mode_info":{
          "mode":0,
          "show_player_type":0,
          "extra":"{\"send_from_me\":true,\"master_player_hidden\":false,\"mode\":0,\"color\":16777215,\"dm_type\":0,\"font_size\":25,\"player_mode\":1,\"show_player_type\":0,\"content\":\"QwQ\",\"user_hash\":\"2402762465\",\"emoticon_unique\":\"\",\"bulge_display\":0,\"recommend_score\":7,\"main_state_dm_color\":\"\",\"objective_state_dm_color\":\"\",\"direction\":0,\"pk_direction\":0,\"quartet_direction\":0,\"anniversary_crowd\":0,\"yeah_space_type\":\"\",\"yeah_space_url\":\"\",\"jump_to_url\":\"\",\"space_type\":\"\",\"space_url\":\"\",\"animation\":{},\"emots\":null,\"is_audited\":false,\"id_str\":\"4e3ed8ede9409b234b5e1d64c06801ea3119\",\"icon\":null,\"show_reply\":true,\"reply_mid\":0,\"reply_uname\":\"\",\"reply_uname_color\":\"\",\"reply_is_mystery\":false,\"reply_type_enum\":0,\"hit_combo\":0,\"esports_jump_url\":\"\"}",
          "user":{
            "uid":438160221,
            "base":{
              "name":"weatfe",
              "face":"https://i0.hdslb.com/bfs/face/member/noface.jpg",
              "name_color":0,
              "is_mystery":false,
              "risk_ctrl_info":null,
              "origin_info":{
                "name":"weatfe",
                "face":"https://i0.hdslb.com/bfs/face/member/noface.jpg"
              },
              "official_info":{
                "role":0,
                "title":"",
                "desc":"",
                "type":-1
              },
              "name_color_str":""
            },
            "medal":null,
            "wealth":null,
            "title":{
              "old_title_css_id":"",
              "title_css_id":""
            },
            "guard":null,
            "uhead_frame":null,
            "guard_leader":{
              "is_guard_leader":false
            }
          }
        },
        "dm_v2":null
      },
      "message":"",
      "msg":""
    }