diff --git a/docs/live/message_stream.md b/docs/live/message_stream.md index 9533d83..7d106df 100644 --- a/docs/live/message_stream.md +++ b/docs/live/message_stream.md @@ -6,6 +6,10 @@ *请求方法: GET* +认证方式: Cookie(SESSDATA) + +可以选择进行认证,若未认证视作未登录,将会受到限制,详见后续内容。 + **URL参数:** | 参数名 | 类型 | 内容 | 必要性 | 备注 | @@ -100,7 +104,7 @@ curl -G 'https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo' \ **注: 特别的**, WS 与 WSS 连接地址带有路径 `/sub`, 如 `wss://broadcastlv.chat.bilibili.com:443/sub`. -**再注:** B 站更新了隐私政策, 连接建立 5 分钟左右, 若该连接认证时传入信息来自未登录用户, 会提示 `为保护用户隐私,未注册登陆用户将无法查看他人昵称`, 随后所有发送弹幕的用户 mid 都为 `0`, 用户名部分也使用 `*` 保护, 参见 [#732](https://github.com/SocialSisterYi/bilibili-API-collect/issues/732) +**再注:** B 站更新了隐私政策, 连接建立后, 若该连接认证时传入信息来自未登录用户, 会提示 `为保护用户隐私,未注册登陆用户将无法查看他人昵称`, 随后部分数据包(如“弹幕”、“进场或关注消息”)的用户 mid 都为 `0`, 用户名部分也使用 `*` 保护, 部分房间受到豁免, 参见 [#732](https://github.com/SocialSisterYi/bilibili-API-collect/issues/732) 操作流程 (伪代码): @@ -150,6 +154,8 @@ while (!s.isclosed()) { 注: 连接成功后 5 秒内发送, 否则强制断开连接 +再注: 若`uid`字段填写的是用户mid,则通过`获取信息流认证密钥`接口使用的认证信息所属用户mid必须与`uid`字段相同,并正确传递认证密钥,否则强制断开连接。 + **JSON正文:** 根对象: @@ -370,7 +376,7 @@ while (!s.isclosed()) { | show_player_type | num | 0? | | | user | obj | 用户相关信息 | | -`info[0[[15].extra` 表示的对象: +`info[0][15].extra` 表示的对象: 见下方 JSONC @@ -681,7 +687,7 @@ while (!s.isclosed()) { -#### 连续弹幕消息 (DM_INTERACTION) +#### 交互信息合并 (DM_INTERACTION) 注: 连续多条相同弹幕时触发 @@ -696,14 +702,21 @@ while (!s.isclosed()) { `data` 对象: -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---- | -| id | num | 事件 ID | | -| status | num | 状态 | | -| type | num | 事件类型 | | -| data | str | 事件数据 | | +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | -------- | ---- | +| id | num | 事件 ID | | +| status | num | 状态 | | +| type | num | 事件类型 | 102:弹幕
103:
104:送礼
105:分享
106:点赞 | +| data | str | 事件数据 | 一个JSON字符串 | +| dmsource | num | | | -`data.data` 对象: +`data.data` 字符串对象: + +内容格式取决于`data.type`的类型,下面将按照`data.data(类型)`进行区分标记。 + +温馨提示: 要记得先解析`data.data`内的JSON字符串,不要直接使用哦。 + +`data.data(102)` 对象: (弹幕) | 字段 | 类型 | 内容 | 备注 | | -------------------- | ----- | -------------------- | ---- | @@ -712,7 +725,7 @@ while (!s.isclosed()) { | card_appear_interval | num | 弹窗出现时间间隔 | | | send_interval | num | 发送时间间隔 | | -`data.data.combo[n]` 对象: +`data.data(102).combo[n]` 对象: | 字段 | 类型 | 内容 | 备注 | | ------------- | ---- | -------------- | ------------- | @@ -724,11 +737,48 @@ while (!s.isclosed()) { | left_duration | num | 左移时长 | | | fade_duration | num | 淡化时长 | | +`data.data(104)` 对象: (送礼) + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| fade\_duration | num | | | +| cnt | num | 投喂计数 | | +| card_appear_interval | num | | | +| suffix\_text | str | 提示文本 | `人在投喂` | +| reset\_cnt | num | | | +| display\_flag | num | | | +| gift\_id | num | 礼物 ID | | +| gift_alert_message | str | | | + +`data.data(105)` 对象: (分享) + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| fade\_duration | num | | | +| cnt | num | 分享计数 | | +| card_appear_interval | num | | | +| suffix\_text | str | 提示文本 | `人分享了直播间` | +| reset\_cnt | num | | | +| display\_flag | num | | | + +`data.data(106)` 对象: (点赞) + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| fade\_duration | num | | | +| cnt | num | 点赞计数 | | +| card_appear_interval | num | | | +| suffix\_text | str | 提示文本 | `人正在点赞` | +| reset\_cnt | num | | | +| display\_flag | num | | | + **示例:**
查看正文示例: +type===102 + ```json { "cmd": "DM_INTERACTION", @@ -756,6 +806,51 @@ while (!s.isclosed()) { } ``` +type===104 + +```json +{ + "cmd": "DM_INTERACTION", + "data": { + "data": "{\"fade_duration\":10000,\"cnt\":5,\"card_appear_interval\":0,\"suffix_text\":\"人在投喂\",\"reset_cnt\":0,\"display_flag\":1,\"gift_id\":33988,\"gift_alert_message\":\"投喂一个%s支持主播\"}", + "dmscore": 36, + "id": 85744481752576, + "status": 5, + "type": 104 + } +} +``` + +type===105 + +```json +{ + "cmd": "DM_INTERACTION", + "data": { + "data": "{\"fade_duration\":10000,\"cnt\":1,\"card_appear_interval\":0,\"suffix_text\":\"人分享了直播间\",\"reset_cnt\":0,\"display_flag\":1}", + "dmscore": 36, + "id": 85743053669888, + "status": 4, + "type": 105 + } +} +``` + +type===106 + +```json +{ + "cmd": "DM_INTERACTION", + "data": { + "data": "{\"fade_duration\":10000,\"cnt\":11,\"card_appear_interval\":0,\"suffix_text\":\"人正在点赞\",\"reset_cnt\":1,\"display_flag\":1}", + "dmscore": 36, + "id": 66159395305984, + "status": 5, + "type": 106 + } +} +``` +
#### 进场或关注消息 (INTERACT_WORD) @@ -780,7 +875,7 @@ while (!s.isclosed()) { | fans_medal | obj | 粉丝勋章 | | | identities | num | 待调查 | | | is_spread | num | 待调查 | | -| msg_type | num | 1为进场,2为关注 | | +| msg_type | num | 1为进场,2为关注,3为分享 | | | roomid | num | 房间号 | | | is_spread | num | 待调查 | | | is_spread | num | 待调查 | | @@ -1245,6 +1340,8 @@ while (!s.isclosed()) { } ``` + + #### 送礼 (SEND_GIFT) **JSON消息:** @@ -1673,7 +1770,7 @@ while (!s.isclosed()) { | ---- | ---- | ------ | --------- | | cmd | str | `NOTICE_MSG` | | | id | num | 待调查 | | -| name | str | 通知名 | | +| name | str | 通知名 | | | full | obj | 完整显示信息? | | | half | obj | 半部显示信息? | | | | side | obj | 边缘显示信息? | | @@ -1803,19 +1900,42 @@ while (!s.isclosed()) { | 字段 | 类型 | 内容 | 备注 | | ---- | ---- | ------ | --------- | | cmd | str | `PREPARING` | | -| round | num | 轮播状态:
1正在轮播
0未轮播 | | -| roomid | num | 直播间ID | 未知是真实ID还是短号 | | +| round | num | 轮播状态:
1正在轮播
0未轮播 | 开启轮播时存在 | +| roomid | str | 直播间ID | 未知是真实ID还是短号 | 类型似乎从num改为str | +| msg\_id | str | 信息id? | | +| p\_is\_ack | bool | | 未知 | +| p\_msg\_type | num | `1` | 未知 | +| send\_time | num | 发送时间 | UNIX 毫秒时间戳 | **示例:**
查看消息示例: - + +有启用轮播: + ```json { "cmd": "PREPARING", + "msg_id": "26964930181741056:1000:1000", + "p_is_ack": true, + "p_msg_type": 1, + "roomid": "1899237171", "round": 1, - "roomid": "8618057" + "send_time": 1739985402716 +} +``` + +未启用轮播: + +```json +{ + "cmd": "PREPARING", + "msg_id": "27040425357932032:1000:1000", + "p_is_ack": true, + "p_msg_type": 1, + "roomid": "1017", + "send_time": 1740129398337 } ``` @@ -1823,6 +1943,8 @@ while (!s.isclosed()) { #### 直播开始 (LIVE) +注:请求了开始直播接口、开始向服务器推流时下发。 + **JSON消息:** 根对象: @@ -1830,19 +1952,19 @@ while (!s.isclosed()) { | 字段 | 类型 | 内容 | 备注 | | --- | --- | --- | --- | | cmd | str | `LIVE` | | -| live_key | str | ? | | +| live_key | str | 标记直播场次的key | 与开始直播接口获得的live_key相同 | | voice_background | str | ? | | | sub_session_key | str | ? | | -| live_platform | str | 开播平台? | | +| live_platform | str | 开播平台? | 推测由开播接口决定 | | live_model | num | ? | | -| live_time | num | 开播时间 | UNIX 秒级时间戳 | +| live_time | num | 开播时间 | UNIX 秒级时间戳,只有请求了开始直播后立刻下发的那个数据包里存在 | | roomid | num | 直播间号 | | **示例:**
查看消息示例: - + ```json { "cmd": "LIVE", @@ -1856,6 +1978,8 @@ while (!s.isclosed()) { } ``` +
+ #### 主播信息更新 (ROOM_REAL_TIME_MESSAGE_UPDATE) **JSON消息:** @@ -2001,6 +2125,45 @@ while (!s.isclosed()) {
+#### 未登录通知 (LOG_IN_NOTICE) + +注:未使用认证信息进行登录将会下发此数据包,通常于认证包回复后下发,在后续时间里也有可能会下发;部分受到豁免的直播间不会下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `LOG_IN_NOTICE` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| notice\_msg | str | 通知内容 | | +| image\_web | str | 在网页端使用的通知图片 | | +| image\_app | str | 在app端使用的图片 | (未确认) | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "LOG_IN_NOTICE", + "data": { + "notice_msg": "为保护用户隐私,未登录无法查看他人昵称", + "image_web": "http://i0.hdslb.com/bfs/dm/75e7c16b99208df259fe0a93354fd3440cbab412.png", + "image_app": "http://i0.hdslb.com/bfs/dm/b632f7dcd3acf47deffb5f9ccc9546ae97a3415b.png" + } +} +``` + +
+ #### 用户到达直播间高能榜前三名的消息 (ONLINE_RANK_TOP3) **JSON消息:** @@ -3002,18 +3165,20 @@ while (!s.isclosed()) { | 字段 | 类型 | 内容 | 备注 | | ---------- | --- | ------ | --------- | | title | str | 直播间标题 | | -| area_id | num | 当前直播间所属分区的ID | | -| parent_area_id | num | 待调查 | | -| area_name | str | 当前直播间所属分区的名称 | | -| parent_area_name | str | 待调查 | | -| live_key | str | 待调查 | | -| sub_session_key | str | 待调查 | | +| area_id | num | 当前直播间所属二级分区的ID | | +| parent_area_id | num | 当前直播间所属一级分区的ID | | +| area_name | str | 当前直播间所属二级分区的名称 | | +| parent_area_name | str | 当前直播间所属一级分区名称 | | +| live_key | str | 标记直播场次的key | 未开播更新直播间信息时为`"0"` | +| sub_session_key | str | 待调查 | 未开播更新直播间信息时为`""`(空字符串) | **示例:**
查看消息示例: +已开播: + ```json { "cmd": "ROOM_CHANGE", @@ -3029,6 +3194,68 @@ while (!s.isclosed()) { } ``` +未开播: + +```json +{ + "cmd": "ROOM_CHANGE", + "data": { + "title": "随缘", + "area_id": 216, + "parent_area_id": 6, + "area_name": "我的世界", + "parent_area_name": "单机游戏", + "live_key": "0", + "sub_session_key": "" + } +} +``` + +
+ +#### 直播间内容审核报告 (ROOM_CONTENT_AUDIT_REPORT) + +注:这个数据包需要更新直播间标题且使用主播的登录信息才会下发,更新直播间标题后一般不会立刻下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ROOM_CONTENT_AUDIT_REPORT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| audit_content_type | num | 审核内容类型? | | +| room\_id | num | 直播间ID | 未知是真实ID还是短号 | +| anchor\_uid | num | 主播的用户mid | | +| audit\_status | num | 审核状态? | | +| audit\_title | str | 被审核的直播间标题 | | +| audit\_reason | str | 审核结果 | | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "ROOM_CONTENT_AUDIT_REPORT", + "data": { + "audit_content_type": 1, + "room_id": 1899237171, + "anchor_uid": 438160221, + "audit_status": 2, + "audit_title": "崩坏学园2", + "audit_reason": "一审通过" + } +} +``` +
#### 醒目留言按钮 (SUPER_CHAT_ENTRANCE) @@ -3379,6 +3606,320 @@ while (!s.isclosed()) { +#### 切断V2 (CUT_OFF_V2) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `CUT_OFF_V2` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cut_off_scene | num | | | +| timestamp | num | 操作时间戳 | UNIX 秒时间戳 | +| cut_off_version | num | 切断提示信息版本? | | +| cut_off_data | obj | 切断提示信息 | | + +`data.cut_off_data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cut_off_title | str | 对话框窗口标题 | | +| cut\_off\_message\_list | array | 对话框正文列表 | | +| cut\_off\_tip\_list | array | 对话框提示信息列表 | | +| cut\_off\_button\_list | array | 对话框按钮列表 | | + +`data.cut_off_data.cut_off_message_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 首个正文信息 | | +| … | obj | 单个正文信息 | | +| i | obj | 最后正文信息 | | + +`data.cut_off_data.cut_off_message_list[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| type | num | 显示类别 | `1`:一个“`label`:`content`”格式的信息 | +| label | str | 标签 | | +| content | str | 内容 | | + +`data.cut_off_data.cut_off_tip_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 首个提示行信息 | | +| … | obj | 单个提示行信息 | | +| i | obj | 最后提示行信息 | | + +`data.cut_off_data.cut_off_tip_list[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| show\_platform | array | 要在哪个客户端显示的指代 | | +| message_list | array | 提示信息列表 | | + +`data.cut_off_data.cut_off_tip_list[i].message_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +|:---:| --- | --- | --- | +| 0 | obj | 首个提示组件信息 | | +| … | obj | 单个提示组件信息 | | +| i1 | obj | 最后提示组件信息 | | + +`data.cut_off_data.cut_off_tip_list[i].message_list[i1]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| type | num | 显示类型 | `1`:纯文本
`2`:链接 | +| content | str | 显示文本 | | +| link_url | str | 链接 | type为2时有内容 | + +`data.cut_off_data.cut_off_button_list` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 首个按钮信息 | | +| … | obj | 单个按钮信息 | | +| i | obj | 最后按钮信息 | | + +`data.cut_off_data.cut_off_button_list[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| show_platform | array | 要在那个客户端显示的指代 | `1`和`2`可能是手机直播姬
`3`和`4`可能是pc直播姬或网页直播姬 | +| button\_text | str | 按钮文本 | | +| button\_action | num | 按钮操作 | `1`:关闭窗口?
`2`:跳转到链接? | +| button_link_url | str | 跳转链接 | | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "CUT_OFF_V2", + "data": { + "cut_off_scene": 1, + "timestamp": 1731590280, + "cut_off_version": 1, + "cut_off_data": { + "cut_off_title": "违规提示", + "cut_off_message_list": [ + { + "type": 1, + "label": "处罚结果", + "content": "切断本场直播" + }, + { + "type": 1, + "label": "违规原因", + "content": "您本场直播存在挂机、录播等消极直播行为,因此直播被切断,请您及时整改" + }, + { + "type": 1, + "label": "处罚时间", + "content": "2024年11月14日21时17分" + } + ], + "cut_off_tip_list": [ + { + "show_platform": [ + 3, + 4 + ], + "message_list": [ + { + "type": 1, + "content": "请在", + "link_url": "" + }, + { + "type": 2, + "content": "【处罚中心】", + "link_url": "https://link.bilibili.com/p/center/index?my-room/violation-records#/my-room/violation-records" + }, + { + "type": 1, + "content": "查看你的违规记录", + "link_url": "" + } + ] + } + ], + "cut_off_button_list": [ + { + "show_platform": [ + 1, + 2 + ], + "button_text": "了解详情", + "button_action": 2, + "button_link_url": "https://live.bilibili.com/p/html/live-anchor-galaxy/violation_records/mobile.html?-Abrowser=live&is_live_webview=1" + }, + { + "show_platform": [ + 3, + 4 + ], + "button_text": "我知道了", + "button_action": 1, + "button_link_url": "" + } + ] + } + } +} +``` + +
+ +#### 直播对话框 (ANCHOR_ECOLOGY_LIVING_DIALOG) + +注:推测在自动检测到画面不怎么变化且没人聊天时警告下发,见[#1139(issue正文)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1139#issue-2657488653)。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_ECOLOGY_LIVING_DIALOG` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| dialog\_scene | num | | | +| timestamp | num | 触发时间戳 | UNIX 秒时间戳 | +| valid_timestamp | num | | | +| dialog\_top\_vertical\_img | str | | | +| dialog\_top\_landscape_img | str | | | +| dialog\_title | str | 对话框标题 | | +| dialog_message_list | array | 对话框正文列表 | 参见`CUT_OFF_V2` | +| dialog_tip_list | array | 对话框提示信息列表 | 参见`CUT_OFF_V2` | +| dialog_button_list | array | 对话框按钮列表 | 参见`CUT_OFF_V2` | + +`data.dialog_message_list` 数组: + +同`CUT_OFF_V2`的`data.cut_off_data.cut_off_message_list`数组。 + +`data.dialog_tip_list` 数组: + +同`CUT_OFF_V2`的`data.cut_off_data.cut_off_tip_list`数组。 + +`data.dialog_button_list` 数组: + +同`CUT_OFF_V2`的`data.cut_off_data.cut_off_button_list`数组。 + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "ANCHOR_ECOLOGY_LIVING_DIALOG", + "data": { + "dialog_scene": 1, + "timestamp": 1731504845, + "valid_timestamp": 0, + "dialog_top_vertical_img": "https://i0.hdslb.com/bfs/live/ee359d3e89bb044914f72a557a4ac2d3b5ba4004.png", + "dialog_top_landscape_img": "https://i0.hdslb.com/bfs/live/ee359d3e89bb044914f72a557a4ac2d3b5ba4004.png", + "dialog_title": "直播间违规", + "dialog_message_list": [ + { + "type": 1, + "label": "处罚结果", + "content": "警告" + }, + { + "type": 1, + "label": "违规原因", + "content": "您本场直播存在挂机、录播等消极直播行为,请及时整改" + }, + { + "type": 1, + "label": "处罚时间", + "content": "2024年11月13日21时34分" + } + ], + "dialog_tip_list": [ + { + "show_platform": [ + 1, + 2 + ], + "message_list": [ + { + "type": 1, + "content": "请在", + "link_url": "" + }, + { + "type": 2, + "content": "【处罚中心】", + "link_url": "https://live.bilibili.com/p/html/live-anchor-galaxy/violation_records/mobile.html?is_live_half_webview=1u0026hybrid_rotate_d=1u0026is_cling_player=1u0026hybrid_half_ui=1,3,100p,70p,0,1,30,100;2,2,375,100p,0,1,30,100;3,3,100p,70p,0,1,30,100;4,2,375,100p,0,1,30,100;5,3,100p,70p,0,1,30,100;6,3,100p,70p,0,1,30,100;7,3,100p,70p,0,1,30,100;8,3,100p,70p,0,1,30,100#/" + }, + { + "type": 1, + "content": "查看你的违规记录", + "link_url": "" + } + ] + }, + { + "show_platform": [ + 3, + 4 + ], + "message_list": [ + { + "type": 1, + "content": "请在", + "link_url": "" + }, + { + "type": 2, + "content": "【处罚中心】", + "link_url": "https://link.bilibili.com/#/my-room/violation-records?jump_type=browser&app_common=open" + }, + { + "type": 1, + "content": "查看你的违规记录", + "link_url": "" + } + ] + } + ], + "dialog_button_list": [ + { + "show_platform": [ + 1, + 2, + 3, + 4 + ], + "button_text": "我知道了", + "button_action": 1, + "button_link_url": "" + } + ] + } +} +``` + +
+ #### 直播间背景图片修改 (CHANGE_ROOM_INFO) **JSON消息:** @@ -3798,6 +4339,55 @@ while (!s.isclosed()) { +#### 天选时刻通知 (ANCHOR_LOT_NOTICE) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_LOT_NOTICE` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| notice\_type | num | 通知卡片类型? | | +| lottery\_card | obj | 通知卡片内容 | | + +`data.lottery_card` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| show\_time | num | 显示时间? | | +| button\_text | str | 按钮文本? | | +| icon | str | 图标 | | +| title | str | 标题? | | + +**示例:** + +
+查看消息示例: + +```json +{ + "data": { + "notice_type": 1, + "lottery_card": { + "show_time": 30, + "button_text": "去发奖", + "icon": "https://i0.hdslb.com/bfs/live/95970204111233f181fc28622502aaf1a9359b9a.png", + "title": "发天选有助于人气累积" + } + }, + "cmd": "ANCHOR_LOT_NOTICE" +} +``` + +
+ #### 邀请视频连线 (VIDEO_CONNECTION_JOIN_START) **示例:** @@ -3935,3 +4525,268 @@ while (!s.isclosed()) { ``` + +#### 直播小助手? (ANCHOR_BROADCAST) + +第一次达到了某种条件下发。 + +已知当在一个分区(中途不能切换)开播时长达到150、180、200、300分钟可能下发,直播间初次被分享1~2次时下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_BROADCAST` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| sender | str | 标题? | `直播小助手` | +| msg | str | 提示消息 | | +| platform | num | 平台标识? | `0` | +| button\_info | obj | 按钮信息? | | +| milestone\_type | str | 里程碑类型? | `session_livetime`,`first_share`,`session_share` | +| milestone\_value | num | 里程值? | | +| milestone\_index | num | 里程碑类型的索引? | `1`,`5`,`6`,`7` | + +`data.button_info` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| button\_name | str | | | +| blink_button_type | str | | | +| blink_button_target | str | | | +| blink_button_extra | str | | | +| blink_button_label | num | | | +| hime_button_type | str | | | +| hime_button_target | str | | | +| hime_button_extra | str | | | +| hime\_button\_h5\_type | str | | | +| hime_button_label | num | | | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "ANCHOR_BROADCAST", + "data": { + "sender": "直播小助手", + "msg": "恭喜你,开播时长达到180分钟!", + "platform": 0, + "button_info": { + "button_name": "", + "blink_button_type": "", + "blink_button_target": "", + "blink_button_extra": "", + "blink_button_label": 0, + "hime_button_type": "", + "hime_button_target": "", + "hime_button_extra": "", + "hime_button_h5_type": "", + "hime_button_label": 0 + }, + "milestone_type": "session_livetime", + "milestone_value": 10800, + "milestone_index": 6 + } +} +``` + +
+ +#### 直播小助手? (ANCHOR_HELPER_DANMU) + +几乎与`ANCHOR_BROADCAST`一同下发。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `ANCHOR_HELPER_DANMU` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| sender | str | 标题? | `直播小助手` | +| msg | str | 提示消息 | | +| platform | num | 平台标识? | | +| button\_platform | num | | | +| button\_name | str | | | +| button\_target | str | | | +| button\_label | num | | | +| report\_type | str | 上报类型? | | +| report | str | | | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "ANCHOR_HELPER_DANMU", + "data": { + "sender": "直播小助手", + "msg": "恭喜你,开播时长达到150分钟!", + "platform": 3, + "button_platform": 0, + "button_name": "", + "button_target": "", + "button_label": 0, + "report_type": "milestone", + "report": "session_livetime:5:9000" + } +} +``` + +
+ +#### 直播进度条节点标签 (PLAY_TAG) + +注: 在特定直播间的特定情况下发。 + +例如: 在[直播间6](https://live.bilibili.com/6)内,有人打出了某种操作。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `PLAY_TAG` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| tag\_id | num | 标签 ID | | +| pic | str | 标签图标 | 通常显示于进度条之上 | +| timestamp | num | UNIX 秒时间戳 | | +| type | str | 操作类型 | `ADD`:添加 | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "PLAY_TAG", + "data": { + "tag_id": 367751, + "pic": "https://i0.hdslb.com/bfs/live/0e04525fee9ea6ea6973e8bd1116d9f1f6501d37.png", + "timestamp": 1740319807, + "type": "ADD" + } +} +``` + +
+ +#### ??? (RECALL_DANMU_MSG) + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `RECALL_DANMU_MSG` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| recall_type | num | 类型? | `2` | +| target_id | num | | | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "RECALL_DANMU_MSG", + "data": { + "recall_type": 2, + "target_id": 525503743 + } +} +``` + +
+ +#### 直播剪辑 (OTHER_SLICE_LOADING_RESULT) + +注: 点击剪辑按钮后的几秒内下发,目前只有网页端有这个按钮,且部分直播间可用(2025-02-20记录)。 + +**JSON消息:** + +根对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| cmd | str | `OTHER_SLICE_LOADING_RESULT` | | +| data | obj | 信息本体 | | + +`data` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| data | array | 剪辑片段数据 | | +| live_key | str | 标记直播场次的key | 未验证真实性 | + +`data.data` 数组: + +| 索引 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| 0 | obj | 单个片段数据 | | + +`data.data[i]` 对象: + +| 字段 | 类型 | 内容 | 备注 | +| --- | --- | --- | --- | +| start\_time | num | 片段开始时间时间戳 | UNIX 秒时间戳 | +| end\_time | num | 片段结束时间时间戳 | UNIX 秒时间戳 | +| stream | str | 从开始时间到结束时间内的直播视频片段 | 需要使用浏览器用户代理字符串,特别是m3u文件内的视频链接 | +| type | num | 类型? | | +| ban\_ec | bool | ? | | + +**示例:** + +
+查看消息示例: + +```json +{ + "cmd": "OTHER_SLICE_LOADING_RESULT", + "data": { + "data": [ + { + "start_time": 1740037738, + "end_time": 1740038916, + "stream": "https://jssz-boss.hdslb.com/live2arc_anchor_video/vod_579433011406177273.m3u?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250220%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20250220T080858Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=52be315e8e7def8e11f86d3c6d4952362725c3c087a433780926bc0e8c88c2e1", + "type": 0, + "ban_ec": false + } + ], + "live_key": "579433011406177273" + } +} +``` + +