From 0d6d975f4967364c4863944cf1f286e695c99f52 Mon Sep 17 00:00:00 2001
From: pskdje <77605497+pskdje@users.noreply.github.com>
Date: Sun, 4 May 2025 16:43:35 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E7=9B=B4=E6=92=AD=E5=BC=B9?=
=?UTF-8?q?=E5=B9=95=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
将以下2个issue编写为文档:
https://github.com/SocialSisterYi/bilibili-API-collect/issues/1236
https://github.com/SocialSisterYi/bilibili-API-collect/issues/1263
---
docs/live/danmaku.md | 507 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 507 insertions(+)
create mode 100644 docs/live/danmaku.md
diff --git a/docs/live/danmaku.md b/docs/live/danmaku.md
new file mode 100644
index 0000000..765389e
--- /dev/null
+++ b/docs/live/danmaku.md
@@ -0,0 +1,507 @@
+# 直播间弹幕
+
+## 获取当前用户对应直播间可发弹幕配置
+
+> 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` 的弹幕配置可用情况
+
+```shell
+curl https://api.live.bilibili.com/xlive/web-room/v1/dM/GetDMConfigByGroup?room_id=1
+```
+
+
+查看响应示例:
+
+```json
+{
+ "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)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1236#issuecomment-2849019923))
+
+**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` 的弹幕颜色为白色
+
+```shell
+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'
+```
+
+
+查看响应示例:
+
+```json
+{
+ "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 | (?) | 非必要 | `0` |
+| reply\_attr | num | (?) | 非必要 | `0` |
+| reply\_uname | str | (?) | 非必要 | `""` |
+| replay\_dmid | str | (?) | 非必要 | `""` |
+| 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)](message_stream.md#弹幕-danmu_msg)的`info[0][15]`对象。
+
+**示例:**
+
+给直播间 `1899237171` 发送内容为 `QwQ` 的弹幕
+
+```shell
+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'
+```
+
+
+查看响应示例:
+
+```json
+{
+ "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":""
+}
+```
+
+