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":"" +} +``` + +