bilibili-API-collect/docs/message/private_msg.md
2025-04-14 23:46:02 +08:00

1503 lines
68 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 私信
## 对象说明
### 会话对象
| 字段 | 类型 | 内容 | 备注 |
| -------------------- | ---- | -------------------------------- | --------------------------------------------------- |
| talker_id | num | 聊天对象的id | `session_type``1` 时表示用户 mid`2` 时表示粉丝团 id |
| session_type | num | 聊天对象的类型 | 1用户<br />2粉丝团 |
| at_seqno | num | 最近一次未读at自己的消息的序列号 | 在粉丝团会话中有效,若没有未读的 at 自己的消息则为 `0` |
| top_ts | num | 置顶该会话的时间 | 微秒级时间戳;若未置顶该会话则为 `0`;用于判断是否置顶了会话 |
| group_name | str | 粉丝团名称 | 在粉丝团会话中有效,其他会话中为空字符串 |
| group_cover | str | 粉丝团头像 | 在粉丝团会话中有效,其他会话中为空字符串 |
| is_follow | num | 是否关注了对方 | 在用户会话中有效,系统会话中为 `1`, 其他会话中为 `0` |
| is_dnd | num | 是否对会话设置了免打扰 | |
| ack_seqno | num | 最近一次已读的消息序列号 | 用于快速跳转到首条未读的消息 |
| ack_ts | num | 最近一次已读时间 | 微秒级时间戳 |
| session_ts | num | 会话时间 | 微秒级时间戳 |
| unread_count | num | 未读消息数 | |
| last_msg | 有效时obj<br />无效时null | 最近的一条消息 | 详见[私信主体对象](#私信主体对象) |
| group_type | num | 粉丝团类型 | 在粉丝团时有效<br />0应援团<br />2官方群ID 为 10 的粉丝团) |
| can_fold | num | 会话是否可被折叠入未关注人消息 | 在用户会话中有效 |
| status | num | 会话状态 | 详细信息有待补充 |
| max_seqno | num | 最近一条消息的序列号 | |
| new_push_msg | num | 是否有新推送的消息 | |
| setting | num | 推送设置 | 0接收推送<br />1不接收推送<br />2 |
| is_guardian | num | 自己是否为对方的骑士(?) | 在用户会话中有效<br />0<br />2 |
| is_intercept | num | 会话是否被拦截 | |
| is_trust | num | 是否信任此会话 | 若为 `1`,则表示此会话之前被拦截过,但用户选择信任本会话 |
| system_msg_type | num | 系统会话类型 | 0非系统会话<br />1主播小助手<br />5系统通知<br />7UP主小助手<br />8客服消息<br />9支付小助手 |
| account_info | obj | 会话信息 | 仅在系统会话中出现 |
| live_status | num | 用户是否正在直播 | 在用户会话中有效,其他会话中为 `0` |
| biz_msg_unread_count | num | 未读通知消息数 | |
| user_label | null | | **作用尚不明确** |
`account_info`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ---- |
| name | str | 会话名称 | |
| pic_url | str | 会话头像 | |
### 私信主体对象
注:私信主体对象≠[私信内容对象](private_msg_content.md)
| 字段 | 类型 | 内容 | 备注 |
| ---------------- | ---- | -------------- | -------------------------------------------------------------- |
| sender_uid | num | 发送者mid | |
| receiver_type | num | 接收者类型 | 1用户<br />2粉丝团 |
| receiver_id | num | 接收者id | `receiver_type``1` 时表示用户 mid`2` 时表示粉丝团 id |
| msg_type | num | 消息类型 | 详见[私信消息类型、内容说明](private_msg_content.md) |
| content | str | 消息内容 | [私信内容对象](private_msg_content.md)**经过 JSON 序列化后的文本** |
| msg_seqno | num | 消息序列号 | 按照时间顺序从小到大 |
| timestamp | num | 消息发送时间 | 秒级时间戳 |
| at_uids | 有效时array<br />无效时null | at的成员mid | 在粉丝团时有效;此项为 `null``[0]` 均表示没有 at 成员 |
| msg_key | num | 消息唯一id | 部分库在解析JSON对象中的大数时存在数值的精度丢失问题因此在处理私信时可能会出现问题建议使用修复了这一问题的库如将大数转换成文本 |
| msg_status | num | 消息状态 | 0正常<br />1被撤回接口仍能返回被撤回的私信内容<br />2被系统撤回消息被举报私信将不会显示在前端B站接口也不会返回被系统撤回的私信的信息<br />50图片已失效私信内容为一张提示“图片出现问题”的图片 |
| sys_cancel | bool | 是否为系统撤回 | 仅当 `msg_type``5` 且此项值为 `true` 时有此项;若此项值为 `true`,表示目标消息是被系统撤回的,此时前端将不显示该私信且没有提示 |
| notify_code | str | 通知代码 | 发送通知时使用,以下划线 `_` 分割,第 1 项表示主业务 id第 2 项表示子业务 id若这条私信非通知则为空文本详细信息有待补充 |
| new_face_version | num | 表情包版本 | 为 `0` 或无此项表示旧版表情包,此时 B 站会自动转换成新版表情包,例如 `[doge]` -> `[tv_doge]``1` 为新版 |
| msg_source | num | 消息来源 | 见[消息来源列表](#消息来源列表) |
`私信主体对象`中的`at_uids`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ------- |
| 0 | num | 用户1 | 成员mid |
| n | num | 用户(n+1) | |
| …… | num | …… | …… |
### 消息来源列表
| 代码 | 含义 | 备注 |
| ---- | ------------------------- | ----------------------------------- |
| 0 | 未知来源 | 在以前发送的部分私信的来源代码 |
| 1 | iOS | |
| 2 | Android | |
| 3 | H5 | |
| 4 | PC客户端 | |
| 5 | 官方推送消息 | 包括官方向大多数用户自动发送的私信UP主小助手的推广等 |
| 6 | 推送/通知消息 | 包括特别关注时稿件的自动推送、因成为契约者而自动发送的私信、包月充电回馈私信、官方发送的特定于自己的消息UP主小助手的稿件审核状态通知等 |
| 7 | Web | |
| 8 | 自动回复 - 被关注回复 | B站前端会显示“此条消息为自动回复” |
| 9 | 自动回复 - 收到消息回复 | B站前端会显示“此条消息为自动回复” |
| 10 | 自动回复 - 关键词回复 | B站前端会显示“此条消息为自动回复” |
| 11 | 自动回复 - 大航海上船回复 | B站前端会显示“此条消息为自动回复” |
| 12 | 自动推送 - UP 主赠言 | 在以前稿件的自动推送与其附带的 UP 主赠言是 2 条不同的私信(其中 UP 主赠言的消息来源代码为 12现在 UP 主赠言已被合并成为稿件自动推送消息的一部分(`attach_msg` |
| 13 | 粉丝团系统提示 | 如粉丝团中的提示信息“欢迎xxx入群” |
| 16 | 系统 | 目前仅在 `msg_type``51` 时使用该代码 |
| 17 | 互相关注 | 互相关注时自动发送的私信“我们已互相关注,开始聊天吧~” |
| 18 | 系统提示 | 目前仅在 `msg_type``18` 时使用该代码“对方主动回复或关注你前最多发送1条消息” |
| 19 | AI | 如:给[搜索AI助手测试版](https://space.bilibili.com/1400565964/)发送私信时对方的自动回复 |
## 获取未读私信数
> https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread
*请求方式GET*
认证方式CookieSESSDATA
注: 该接口默认每 2 分钟请求一次
**URL参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------------ | ---- | -------------------------- | ------ | -------------------------------------------------------------------------- |
| unread_type | num | 未读类型 | 非必要 | 0所有<br />1仅已关注<br />2仅未关注<br />3仅被拦截 (须同时设置参数 `show_dustbin=1`)<br />默认为 `0` |
| show_unfollow_list | num | 是否返回未关注人推送消息数 | 非必要 | 0<br />1是 |
| show_dustbin | num | 是否返回被拦截私信数 | 非必要 | 0<br />1是 |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ----------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------------- | ---- | ------------------------ | ---------------- |
| unfollow_unread | num | 未读未关注用户私信数 | |
| follow_unread | num | 未读已关注用户私信数 | |
| unfollow_push_msg | num | 未读未关注用户推送消息数 | |
| dustbin_push_msg | num | 未读被拦截的推送消息数 | |
| dustbin_unread | num | 未读被拦截的私信数 | |
| biz_msg_unfollow_unread | num | 未读未关注用户通知数 | |
| biz_msg_follow_unread | num | 未读已关注用户通知数 | |
| custom_unread | num | 未读客服消息数 | |
**示例:**
以下信息代表未读未关注用户私信数为 `1` 条,未读已关注用户私信数为 `6`
```shell
curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread' \
--data-urlencode 'unread_type=0' \
--data-urlencode 'show_unfollow_list=1' \
--data-urlencode 'show_dustbin=1' \
--data-urlencode 'build=0' \
--data-urlencode 'mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"unfollow_unread": 1,
"follow_unread": 6,
"unfollow_push_msg": 0,
"dustbin_push_msg": 0,
"dustbin_unread": 0,
"biz_msg_unfollow_unread": 0,
"biz_msg_follow_unread": 0,
"custom_unread": 0
}
}
```
</details>
## 获取指定类型会话列表
> https://api.vc.bilibili.com/session_svr/v1/session_svr/get_sessions
*请求方式GET*
认证方式CookieSESSDATA
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------- | ---- | -------------------- | ------ | ------------------------- |
| session_type | num | 会话类型 | 必要 | 1未被折叠<br />2未关注人<br />3粉丝团<br />4所有<br />5被拦截<br />7系统消息 |
| group_fold | num | 是否折叠粉丝团消息 | 非必要 | 0<br />1是 |
| unfollow_fold | num | 是否折叠未关注人消息 | 非必要 | 0<br />1是 |
| sort_rule | num | 排序方式 | 非必要 | 1、2按会话时间逆向排序<br />3按已读时间逆向排序<br />其他:用户按会话时间逆向排序,粉丝团按加群时间正向排序(?) |
| begin_ts | num | 起始时间 | 非必要 | 微秒级时间戳 |
| end_ts | num | 终止时间 | 非必要 | 微秒级时间戳 |
| size | num | 返回的会话数 | 非必要 | 默认为 `20`,最大为 `100` |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------------- | ---- | ---------------------------- | ------------------------ |
| session_list | 有会话时array<br />无会话时null | 会话列表 | |
| has_more | num | 是否有更多会话 | |
| anti_distrub_cleaning | bool | 是否开启了“一键防骚扰”功能 | |
| is_address_list_empty | num | 0 | **作用尚不明确** |
| system_msg | obj | 系统会话列表 | 仅当存在系统会话时有此项 |
| show_level | bool | 是否在会话列表中显示用户等级 | 目前恒为 `true` |
`data`对象中的`session_list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ------------------------- |
| 0 | obj | 会话1 | 详见[会话对象](#会话对象) |
| n | obj | 会话(n+1) | |
| …… | obj | …… | …… |
`data`对象中的`system_msg`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------------ | ---- | ---------- | ---------------------------------------------------------- |
| {系统会话类型代码} | num | 系统会话id | 详见[会话对象](#会话对象)中对 `system_msg_type` 字段的说明 |
**示例:**
获取会话列表:
```shell
curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/get_sessions' \
--data-urlencode 'session_type=1' \
--data-urlencode 'group_fold=0' \
--data-urlencode 'unfollow_fold=0' \
--data-urlencode 'sort_rule=2' \
--data-urlencode 'size=3' \
--data-urlencode 'build=0' \
--data-urlencode 'mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"session_list": [
{
"talker_id": 844424930131966,
"session_type": 1,
"at_seqno": 0,
"top_ts": 0,
"group_name": "",
"group_cover": "",
"is_follow": 1,
"is_dnd": 0,
"ack_seqno": 1238729956474887,
"ack_ts": 1709536924979884,
"session_ts": 1712305278098351,
"unread_count": 4,
"last_msg": {
"sender_uid": 844424930131966,
"receiver_type": 1,
"receiver_id": 425503913,
"msg_type": 10,
"content": "{\"title\":\"流量奖励到账通知\",\"text\":\"恭喜您已获得2000流量曝光奖励快来投稿使用吧。\",\"jump_text\":\"\",\"jump_uri\":\"\",\"modules\":null,\"jump_text_2\":\"\",\"jump_uri_2\":\"\",\"jump_text_3\":\"\",\"jump_uri_3\":\"\",\"notifier\":null,\"jump_uri_config\":{\"all_uri\":\"https://member.bilibili.com/york/flow-reward?navhide=1\\u0026from=msgrecall\",\"text\":\"\"},\"jump_uri_2_config\":{\"text\":\"\"},\"jump_uri_3_config\":{\"text\":\"\"},\"biz_content\":null}",
"msg_seqno": 1285290404823041,
"timestamp": 1712305278,
"at_uids": null,
"msg_key": 7354295169819585966,
"msg_status": 0,
"notify_code": "2091_253",
"new_face_version": 1,
"msg_source": 6
},
"group_type": 0,
"can_fold": 0,
"status": 0,
"max_seqno": 1285290404823041,
"new_push_msg": 1,
"setting": 0,
"is_guardian": 0,
"is_intercept": 0,
"is_trust": 0,
"system_msg_type": 7,
"account_info": {
"name": "UP主小助手",
"pic_url": "https://message.biliimg.com/bfs/im/489a63efadfb202366c2f88853d2217b5ddc7a13.png"
},
"live_status": 0,
"biz_msg_unread_count": 0,
"user_label": null
},
{
"talker_id": 293793435,
"session_type": 1,
"at_seqno": 0,
"top_ts": 0,
"group_name": "",
"group_cover": "",
"is_follow": 1,
"is_dnd": 0,
"ack_seqno": 1236306587877408,
"ack_ts": 1709536984481314,
"session_ts": 1709385615744065,
"unread_count": 0,
"last_msg": {
"sender_uid": 293793435,
"receiver_type": 1,
"receiver_id": 425503913,
"msg_type": 11,
"content": "{\"title\":\"OHHHHHH家人们我分数终于破w了紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们我分数终于破w了紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}",
"msg_seqno": 1236306587877408,
"timestamp": 1709385615,
"at_uids": null,
"msg_key": 7341755312943193481,
"msg_status": 0,
"notify_code": "",
"new_face_version": 1,
"msg_source": 6
},
"group_type": 0,
"can_fold": 0,
"status": 0,
"max_seqno": 1236306587877408,
"new_push_msg": 0,
"setting": 0,
"is_guardian": 0,
"is_intercept": 0,
"is_trust": 0,
"system_msg_type": 0,
"live_status": 0,
"biz_msg_unread_count": 0,
"user_label": null
},
{
"talker_id": 221082140,
"session_type": 2,
"at_seqno": 0,
"top_ts": 0,
"group_name": "社会易姐QwQ的应援团",
"group_cover": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg",
"is_follow": 0,
"is_dnd": 0,
"ack_seqno": 20,
"ack_ts": 1695011620552332,
"session_ts": 1693626568439784,
"unread_count": 0,
"last_msg": {
"sender_uid": 0,
"receiver_type": 2,
"receiver_id": 221082140,
"msg_type": 306,
"content": "{\"group_id\":221082140,\"content\":\"欢迎罗板栗入群\"}",
"msg_seqno": 20,
"timestamp": 1693626568,
"at_uids": null,
"msg_key": 7274070721607234847,
"msg_status": 0,
"notify_code": "",
"msg_source": 13
},
"group_type": 0,
"can_fold": 0,
"status": 0,
"max_seqno": 20,
"new_push_msg": 0,
"setting": 0,
"is_guardian": 0,
"is_intercept": 0,
"is_trust": 0,
"system_msg_type": 0,
"live_status": 0,
"biz_msg_unread_count": 0,
"user_label": null
}
],
"has_more": 1,
"anti_disturb_cleaning": false,
"is_address_list_empty": 0,
"system_msg": {
"1": 844424930131967,
"7": 844424930131966,
"9": 844424930131965
},
"show_level": true
}
}
```
</details>
## 获取新会话列表
> https://api.vc.bilibili.com/session_svr/v1/session_svr/new_sessions
*请求方式GET*
认证方式CookieSESSDATA
获取指定时间之后的新会话列表
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | ---------------- | ------ | ------------------------- |
| begin_ts | num | 起始时间 | 非必要 | 微秒级时间戳 |
| size | num | 返回的会话数 | 非必要 | 默认为 `20`,最大为 `100` |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------------------- | ---- | ---------------------------- | ---------------------- |
| session_list | 有会话时array<br />无会话时null | 会话列表 | 按发送时间顺序逆向排序 |
| has_more | num | 是否有更多会话 | |
| anti_distrub_cleaning | bool | 是否开启了“一键防骚扰”功能 | |
| is_address_list_empty | num | 0 | **作用尚不明确** |
| show_level | bool | 是否在会话列表中显示用户等级 | 目前恒为 `false` |
`data`对象中的`session_list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ------------------------- |
| 0 | obj | 会话1 | 详见[会话对象](#会话对象) |
| n | obj | 会话(n+1) | |
| …… | obj | …… | …… |
**示例:**
获取`begin_ts=1712420213519391`之后的新会话列表:
```shell
curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/new_sessions' \
--data-urlencode 'begin_ts=1712420213519391' \
--data-urlencode 'size=3' \
--data-urlencode 'build=0' \
--data-urlencode 'mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"session_list": [
{
"talker_id": 844424930131966,
"session_type": 1,
"at_seqno": 0,
"top_ts": 0,
"group_name": "",
"group_cover": "",
"is_follow": 1,
"is_dnd": 0,
"ack_seqno": 1238729956474887,
"ack_ts": 1709536924979884,
"session_ts": 1712305278098351,
"unread_count": 4,
"last_msg": {
"sender_uid": 844424930131966,
"receiver_type": 1,
"receiver_id": 425503913,
"msg_type": 10,
"content": "{\"title\":\"流量奖励到账通知\",\"text\":\"恭喜您已获得2000流量曝光奖励快来投稿使用吧。\",\"jump_text\":\"\",\"jump_uri\":\"\",\"modules\":null,\"jump_text_2\":\"\",\"jump_uri_2\":\"\",\"jump_text_3\":\"\",\"jump_uri_3\":\"\",\"notifier\":null,\"jump_uri_config\":{\"all_uri\":\"https://member.bilibili.com/york/flow-reward?navhide=1\\u0026from=msgrecall\",\"text\":\"\"},\"jump_uri_2_config\":{\"text\":\"\"},\"jump_uri_3_config\":{\"text\":\"\"},\"biz_content\":null}",
"msg_seqno": 1285290404823041,
"timestamp": 1712305278,
"at_uids": null,
"msg_key": 7354295169819585966,
"msg_status": 0,
"notify_code": "2091_253",
"new_face_version": 1,
"msg_source": 6
},
"group_type": 0,
"can_fold": 0,
"status": 0,
"max_seqno": 1285290404823041,
"new_push_msg": 1,
"setting": 0,
"is_guardian": 0,
"is_intercept": 0,
"is_trust": 0,
"system_msg_type": 7,
"account_info": {
"name": "UP主小助手",
"pic_url": "https://message.biliimg.com/bfs/im/489a63efadfb202366c2f88853d2217b5ddc7a13.png"
},
"live_status": 0,
"biz_msg_unread_count": 0,
"user_label": null
},
{
"talker_id": 293793435,
"session_type": 1,
"at_seqno": 0,
"top_ts": 0,
"group_name": "",
"group_cover": "",
"is_follow": 1,
"is_dnd": 0,
"ack_seqno": 1236306587877408,
"ack_ts": 1709536984481314,
"session_ts": 1709385615744065,
"unread_count": 0,
"last_msg": {
"sender_uid": 293793435,
"receiver_type": 1,
"receiver_id": 425503913,
"msg_type": 11,
"content": "{\"title\":\"OHHHHHH家人们我分数终于破w了紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们我分数终于破w了紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}",
"msg_seqno": 1236306587877408,
"timestamp": 1709385615,
"at_uids": null,
"msg_key": 7341755312943193481,
"msg_status": 0,
"notify_code": "",
"new_face_version": 1,
"msg_source": 6
},
"group_type": 0,
"can_fold": 0,
"status": 0,
"max_seqno": 1236306587877408,
"new_push_msg": 0,
"setting": 0,
"is_guardian": 0,
"is_intercept": 0,
"is_trust": 0,
"system_msg_type": 0,
"live_status": 0,
"biz_msg_unread_count": 0,
"user_label": null
},
{
"talker_id": 221082140,
"session_type": 2,
"at_seqno": 0,
"top_ts": 0,
"group_name": "社会易姐QwQ的应援团",
"group_cover": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg",
"is_follow": 0,
"is_dnd": 0,
"ack_seqno": 20,
"ack_ts": 1695011620552332,
"session_ts": 1693626568439784,
"unread_count": 0,
"last_msg": {
"sender_uid": 0,
"receiver_type": 2,
"receiver_id": 221082140,
"msg_type": 306,
"content": "{\"group_id\":221082140,\"content\":\"欢迎罗板栗入群\"}",
"msg_seqno": 20,
"timestamp": 1693626568,
"at_uids": null,
"msg_key": 7274070721607234847,
"msg_status": 0,
"notify_code": "",
"msg_source": 13
},
"group_type": 0,
"can_fold": 0,
"status": 0,
"max_seqno": 20,
"new_push_msg": 0,
"setting": 0,
"is_guardian": 0,
"is_intercept": 0,
"is_trust": 0,
"system_msg_type": 0,
"live_status": 0,
"biz_msg_unread_count": 0,
"user_label": null
}
],
"has_more": 0,
"anti_disturb_cleaning": false,
"is_address_list_empty": 0,
"show_level": false
}
}
```
</details>
## 获取会话详细信息
> https://api.vc.bilibili.com/session_svr/v1/session_svr/session_detail
*请求方式GET*
认证方式CookieSESSDATA
若从未与该会话聊过天,则返回 1000004 `入口节点已存在` 错误
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ---- | ---------------- | ------ | ------------------------------------------------------ |
| talker_id | num | 聊天对象的id | 必要 | `session_type``1` 时表示用户 mid`2` 时表示粉丝团 id |
| session_type | num | 聊天对象的类型 | 必要 | 1用户<br />2粉丝团 |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误<br />1000004入口节点已存在 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | 有效时obj<br />无效时null | 数据本体 | 详见[会话对象](#会话对象) |
**示例:**
获取会话`talker_id=293793435&session_type=1`的详细信息:
```shell
curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/session_detail' \
--data-urlencode 'talker_id=293793435' \
--data-urlencode 'session_type=1' \
--data-urlencode 'build=0' \
--data-urlencode 'mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"talker_id": 293793435,
"session_type": 1,
"at_seqno": 0,
"top_ts": 0,
"group_name": "",
"group_cover": "",
"is_follow": 1,
"is_dnd": 0,
"ack_seqno": 1236306587877408,
"ack_ts": 1709536984481314,
"session_ts": 1709385615744065,
"unread_count": 0,
"last_msg": {
"sender_uid": 293793435,
"receiver_type": 1,
"receiver_id": 425503913,
"msg_type": 11,
"content": "{\"title\":\"OHHHHHH家人们我分数终于破w了紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们我分数终于破w了紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}",
"msg_seqno": 1236306587877408,
"timestamp": 1709385615,
"at_uids": null,
"msg_key": 7341755312943193481,
"msg_status": 0,
"notify_code": "",
"new_face_version": 1,
"msg_source": 6
},
"group_type": 0,
"can_fold": 0,
"status": 0,
"max_seqno": 1236306587877408,
"new_push_msg": 0,
"setting": 0,
"is_guardian": 0,
"is_intercept": 0,
"is_trust": 0,
"system_msg_type": 0,
"live_status": 0,
"biz_msg_unread_count": 0,
"user_label": null
}
}
```
</details>
## 查询私信消息记录
> https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs
*请求方式GET*
认证方式CookieSESSDATA
仅调用该接口不会设置私信为已读,详见[设置私信为已读](#设置私信为已读)
此接口有设计缺陷,可以获取已经撤回(`msg_status` 为 `1`)的私信内容
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------------- | ---- | ---------------- | ------ | ------------------------------------------------------ |
| talker_id | num | 聊天对象的id | 必要 | `session_type``1` 时表示用户 mid`2` 时表示粉丝团 id |
| session_type | num | 聊天对象的类型 | 必要 | 1用户<br />2粉丝团 |
| size | num | 返回消息数量 | 非必要 | 默认为 0最大为 200 <br />本参数不存在时,只返回系统提示 |
| begin_seqno | num | 开始的序列号 | 非必要 | 提供本参数时返回以本序列号开始(不包括本序列号)的消息 |
| end_seqno | num | 结束的序列号 | 非必要 | 提供本参数时返回以本序列号结束(不包括本序列号)的消息 |
| sender_device_id | num | 发送者设备 | 非必要 | 默认为 `1` |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等;**若本参数值为 `web`,则返回新版表情包** |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />2非法参数<br />-101账号未登录<br />-400请求错误<br />700013已解散QAQ无法执行此操作<br />700014你已不在此同萌中QAQ无法执行此操作 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ------------------------------ | ----------------------------------- |
| messages | 有私信时array<br />无私信时null | 私信列表 | 按发送时间顺序逆向排序 |
| has_more | num | 是否有更多私信 | |
| min_seqno | num | 所有消息中最小的序列号(最早) | 若无私信则为 `18446744073709551615` |
| max_seqno | num | 所有消息中最大的序列号(最晚) | 若无私信则为 `0` |
| e_infos | array | 聊天表情列表 | 若私信列表中无表情则无此项 |
`data`对象中的`messages`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | --------------------------------- |
| 0 | obj | 私信1 | 详见[私信主体对象](#私信主体对象) |
| n | obj | 私信(n+1) | |
| …… | obj | …… | …… |
`data`对象中的`e_infos`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | obj | 表情1 | |
| n | obj | 表情(n+1) | |
| …… | obj | …… | …… |
`data`对象中的`e_infos`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ----------- | ----------------------------------- |
| text | str | 表情名称 | 包括左右两侧的中括号,如`[tv_doge]` |
| uri | str | 表情链接 | |
| size | num | 表情尺寸 | 1<br />2大 |
| gif_url | str | 表情GIF链接 | 仅部分表情存在此项 |
**示例:**
获取与目标用户`mid=123`的私信记录:
```shell
curl -G 'https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs' \
--data-urlencode 'talker_id=123' \
--data-urlencode 'session_type=1' \
--data-urlencode 'size=20' \
--data-urlencode 'sender_device_id=1' \
--data-urlencode 'build=0' \
--data-urlencode 'mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"messages": [
{
"sender_uid": 2239814,
"receiver_type": 1,
"receiver_id": 123,
"msg_type": 1,
"content": "{\"content\":\"[口罩]\"}",
"msg_seqno": 309675413389322,
"timestamp": 1654154093,
"at_uids": [
0
],
"msg_key": 7104537732714964358,
"msg_status": 0,
"notify_code": "",
"new_face_version": 1,
"msg_source": 2
},
{
"sender_uid": 2239814,
"receiver_type": 1,
"receiver_id": 123,
"msg_type": 5,
"content": "{\"content\":\"1\"}",
"msg_seqno": 308302399586307,
"timestamp": 1654072255,
"at_uids": [
0
],
"msg_key": 7104186240789226795,
"msg_status": 0,
"notify_code": "",
"msg_source": 7
},
],
"has_more": 0,
"min_seqno": 308188515844097,
"max_seqno": 309675413389322,
"e_infos": [
{
"text": "[口罩]",
"url": "http://i0.hdslb.com/bfs/emote/3ad2f66b151496d2a5fb0a8ea75f32265d778dd3.png",
"size": 1
}
]
}
}
```
</details>
## 获取会话限制状态
> https://api.vc.bilibili.com/link_setting/v1/link_setting/is_limit
*请求方式GET*
认证方式CookieSESSDATA
仅对用户会话调用本接口
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ----------- | ------ | ---- |
| uid | num | 聊天对象mid | 必要 | |
| type | num | 1 | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />2非法参数<br />-101账号未登录<br />-400请求错误 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------ | ---- | ------------------------ | ---------------------------- |
| is_limit | num | 用户是否被封禁 | |
| report_limit | num | 自己是否被限制举报该会话 | 常见于自己被封禁时出现该情况 |
**示例:**
获取`uid=123`的限制状态:
```shell
curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/is_limit' \
--data-urlencode 'uid=123' \
--data-urlencode 'type=1' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"is_limit": 0,
"report_limit": 0
}
}
```
</details>
## 获取会话推送设置
> https://api.vc.bilibili.com/link_setting/v1/link_setting/get_session_ss
*请求方式GET*
认证方式CookieSESSDATA
仅对用户会话调用本接口
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ---------- | ---- | ---------------- | ------ | ------------- |
| talker_uid | num | 聊天对象mid | 必要 | |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />2非法参数<br />-101账号未登录<br />-400请求错误 |
| msg | str | 错误信息 | 默认为0 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------------- | ---- | ---------------------- | ----------------------------------- |
| follow_status | num | 对方对于自己的关注属性 | 0未关注<br />~~1悄悄关注现已下线~~<br />2已关注<br />6已互粉<br />128已拉黑 |
| special | num | 自己是否特别关注了对方 | |
| push_setting | num | 推送设置 | 0接收推送<br />1不接收推送 |
| show_push_setting | num | 是否显示推送设置 | |
**示例:**
获取`talker_uid=123`的推送设置:
```shell
curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get_session_ss' \
--data-urlencode 'talker_uid=123' \
--data-urlencode 'build=0' \
--data-urlencode 'mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {
"follow_status": 6,
"special": 1,
"push_setting": 0,
"show_push_setting": 1
}
}
```
</details>
## 获取多个视频、番剧、专栏的信息
> https://api.vc.bilibili.com/x/im/feed/infoweb
*请求方式GET*
认证方式CookieSESSDATA
可用于获取私信中分享或推送的多个视频、番剧、专栏的信息
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----------- | ---- | ---------------- | ----------- | --------------------------------------------------------------------------------------------- |
| aids | nums | 视频AV号列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,最多 50 个成员 |
| ep_ids | nums | 番剧epid列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,最多 50 个成员 |
| article_ids | nums | 专栏CV号列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,无成员限制 |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 必要 | 可为 `web` 等 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | |
| data | obj | 数据本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ----- | ------------ | --------------------------------------- |
| archive | array | 视频信息列表 | 仅在指定了 `aids` 参数时存在此项 |
| article | array | 专栏信息列表 | 仅在指定了 `article_ids` 参数时存在此项 |
| pgc | array | 番剧信息列表 | 仅在指定了 `ep_ids` 参数时存在此项 |
`archive`、`article`、`pgc`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | obj | 信息1 | |
| n | obj | 信息(n+1) | |
| …… | obj | …… | …… |
`archive`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------------ | ------------------------------ |
| bvid | str | 视频BV号 | |
| aid | num | 视频AV号 | |
| title | str | 视频标题 | 若视频失效则为 `内容已失效` |
| pic | str | 视频封面 | 若视频失效则为空文本 |
| param | str | 提供的参数 | 即 AV 号的文本形式 |
| uri | str | 跳转url | `bilibili://video/{视频AV号}` |
| goto | str | `av` | |
| duration | num | 视频时长 | 以秒为单位,若视频失效则为 `0` |
| up_name | str | 视频UP主昵称 | |
| view | num | 视频播放量 | |
| danmaku | num | 视频弹幕数 | |
| status | num | 视频状态 | 0正常<br />-1已失效 |
| is_started | num | 1 | **作用尚不明确** |
`article`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ----- | ------------ | --------------------------- |
| id | num | 专栏CV号 | |
| title | str | 专栏标题 | 若专栏失效则为 `内容已失效` |
| summary | str | 专栏内容概要 | 若专栏失效则为空文本 |
| template_id | num | | **作用尚不明确** |
| up_name | str | 专栏UP主昵称 | 若专栏失效则为空文本 |
| image_urls | array | 专栏封面列表 | 若专栏失效则为空数组 |
| view_num | num | 专栏观看数 | 若专栏失效则为 `0` |
| like_num | num | 专栏点赞数 | 若专栏失效则为 `0` |
| reply_num | num | 专栏评论数 | 若专栏失效则为 `0` |
| status | num | 专栏状态 | 0正常<br />-1已失效 |
`image_urls`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | str | 封面1 | |
| n | str | 封面(n+1) | |
| …… | str | …… | …… |
`pgc`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ---- | ------------ | --------------------------- |
| ep_id | num | 番剧epid | |
| cover | str | 番剧封面url | |
| title | str | 番剧分享标题 | 如 `《{番剧名}》 第{n}话 {单集标题}`、`《{番剧名}》 {备注}` 等 |
| duration | num | 番剧时长 | 以秒为单位 |
| view | num | 番剧播放量 | |
| danmaku | num | 番剧弹幕数 | |
| url | str | 跳转url | `https://www.bilibili.com/bangumi/play/ep{番剧epid}` |
**示例:**
获取`aids=170001&ep_ids=780019&article_ids=1`的信息
```shell
curl -G 'https://api.vc.bilibili.com/x/im/feed/infoweb' \
--data-urlencode 'aids=170001' \
--data-urlencode 'ep_ids=780019' \
--data-urlencode 'article_ids=1' \
--data-urlencode 'build=0' \
--data-urlencode 'mobi_app=web' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"archive": [
{
"bvid": "BV17x411w7KC",
"aid": 170001,
"title": "【MV】保加利亚妖王AZIS视频合辑",
"pic": "http://i2.hdslb.com/bfs/archive/1ada8c32a9d168e4b2ee3e010f24789ba3353785.jpg",
"param": "170001",
"uri": "bilibili://video/170001?player_height=288&player_rotate=0&player_width=512",
"goto": "av",
"duration": 2412,
"up_name": "冰封.虾子",
"view": 44809333,
"danmaku": 913266,
"status": 0,
"is_started": 1
}
],
"article": [
{
"id": 1,
"title": "未知的光",
"summary": "天空像是倾倒出的墨水,黑得静谧而深邃。黎明还远,光亮全无。夜不能寐。披衣,起床。茶香的弥漫,一盏灯的相伴。夜,你是我久别重逢的朋友,那一刹那的相见,带给了我久违的安思。如果不是梦魇的皮闹,我本不该投入",
"template_id": 4,
"up_name": "健行见远渐忘",
"image_urls": [
"https://i0.hdslb.com/bfs/article/d2eedf1fd338bceca10099e2f7b33fa9017c859b.jpg"
],
"view_num": 1608818,
"like_num": 32247,
"reply_num": 14143,
"status": 0
}
],
"pgc": [
{
"ep_id": 780019,
"cover": "http://i0.hdslb.com/bfs/archive/ee28c04d15fb133a9c70c502fabfbdc7e5051ffe.png",
"title": "《铃芽之旅》 新海诚集大成之作",
"duration": 7283,
"view": 22088209,
"danmaku": 93069,
"url": "https://www.bilibili.com/bangumi/play/ep780019"
}
]
}
}
```
</details>
## 设置私信为已读
> https://api.vc.bilibili.com/session_svr/v1/session_svr/update_ack
*请求方式POST*
认证方式CookieSESSDATA
将指定会话中的指定消息及以前的消息设置为已读
**正文参数application/x-www-form-urlencoded**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------ | ---- | ------------------------ | ------ | ---------------------------------------------------- |
| talker_id | num | 聊天对象的id | 必要 | `session_type``1` 时表示用户 mid`2` 时表示粉丝团 id |
| session_type | num | 聊天对象的类型 | 必要 | 1用户<br />2粉丝团 |
| ack_seqno | num | 设置为已读的消息序列号 | 必要 | |
| csrf_token | str | CSRF Token位于cookie | 必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-400请求错误 |
| msg | str | 错误信息 | 成功时为0 |
| message | str | 错误信息 | 成功时为0 |
| ttl | num | | 默认为1 |
| data | 有效时obj<br />无效时:不存在该项 | 信息本体 | |
`data`对象:
一个不含任何项目的对象,即 `{}`
**示例:**
将`talker_id=293793435`、`session_type=1`的`ack_seqno=1236306587877408`消息及之前的消息设置为已读
```shell
curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/update_ack' \
--data-urlencode 'talker_id=293793435' \
--data-urlencode 'session_type=1' \
--data-urlencode 'ack_seqno=1236306587877408' \
--data-urlencode 'csrf=xxx' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"msg": "0",
"message": "0",
"ttl": 1,
"data": {}
}
```
</details>
## 发送私信web端
> https://api.vc.bilibili.com/web_im/v1/web_im/send_msg
*请求方式POST*
认证方式CookieSESSDATA
**仅支持发送 `msg[msg_type]` 为 `1`、`2` 或 `5` 的私信**
调用该接口同时会将该会话设置为已读
**正文参数application/x-www-form-urlencoded**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| --------------------- | ---- | ------------------------ | ------ | ---------------------------------------------------- |
| msg[sender_uid] | num | 发送者mid | 必要 | 必须为自己的 mid |
| msg[receiver_id] | num | 接收者id | 必要 | `msg[receiver_type]``1` 时表示用户 mid`2` 时表示粉丝团 id |
| msg[receiver_type] | num | 接收者类型 | 必要 | 1用户<br />2粉丝团 |
| msg[msg_type] | num | 消息类型 | 必要 | 详见[私信消息类型、内容说明](private_msg_content.md)<br />**此接口仅支持传入 `1`、`2` 或 `5`** |
| msg[msg_status] | num | 消息状态 | 非必要 | 恒为 `0` |
| msg[dev_id] | str | 设备id | 必要 | 实质上即 UUID版本 4**生成方式见下** |
| msg[timestamp] | num | 当前时间戳(秒) | 必要 | |
| msg[new_face_version] | num | 表情包版本 | 非必要 | 提供 `0` 或者未提供本参数表示旧版表情包,此时 B 站会自动转换成新版表情包,例如 `[doge]` -> `[tv_doge]``1` 为新版 |
| msg[content] | str | 消息内容 | 必要 | 详见[私信消息类型、内容说明](private_msg_content.md) |
| csrf_token | str | CSRF Token位于cookie | 必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` |
| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 |
---
**dev_id 的生成:**
dev_id 实质上就是 UUID版本 4
<details>
<summary>查看生成 UUID 的代码</summary>
### Python
```python
import uuid
dev_id = str(uuid.uuid4())
```
### JavaScript
以下代码适用于较新版的 JS 引擎Chrome≥92Firefox≥95Safari≥15.4Node.js≥19.0.0
```js
const dev_id = crypto.randomUUID();
```
以下为通用代码(来自 [andywang425/BLTH](https://github.com/andywang425/BLTH/blob/45fe93e31754ca8bf07059d46266398e787dbf45/B%E7%AB%99%E7%9B%B4%E6%92%AD%E9%97%B4%E6%8C%82%E6%9C%BA%E5%8A%A9%E6%89%8B.js#L6618)
```js
const dev_id = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function (name) {
const randomInt = 16 * Math.random() | 0;
return ("x" === name ? randomInt : 3 & randomInt | 8).toString(16).toUpperCase();
}));
```
### Java
```java
import java.util.UUID;
public class Main {
private String getDevId() {
UUID uuid = UUID.randomUUID();
return uuid.toString();
}
}
```
</details>
---
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | ------------------------------------------------- |
| code | num | 返回值 | 0成功<br />-3系统错误<br />-101账号未登录<br />-400请求错误<br />10005msgkey不存在<br />21007消息过长无法发送<br />21020你发送消息频率过快请稍后再发~<br />21026不能给自己发送消息哦~<br />21028由于系统升级暂无法发送敬请谅解<br />21035该类消息暂时无法发送<br />21037图片格式不合法不要调戏接口啦<br />21041消息已超期不能撤回了哦<br />21042消息已经撤回了哦<br />21046你发消息的频率太高了请在24小时后再发吧~<br />21047对方主动回复或关注你前最多发送1条消息~<br />25003因对方隐私设置暂无法给他发送聊天消息<br />25005你已拉黑了对方请先将对方移出黑名单后才能聊天<br />700013已解散QAQ无法执行此操作<br />700014你已不在此同萌中QAQ无法执行此操作 |
| message | str | 错误信息 | 成功时为0 |
| ttl | num | | 默认为1 |
| data | 有效时obj<br />无效时null | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ----- | ---------- | --------------------------------------------------------------------- |
| msg_key | num | 消息唯一id | |
| e_infos | array | 表情列表 | 仅当请求参数 `msg[msg_type]``1`,且私信内容中有表情时有此项 |
| msg_content | str | 发送的私信内容 | 一般同请求参数 `msg[content]` 的值,仅当请求参数 `msg[msg_type]``1` 时有此项 |
| key_hit_infos | obj | 触发的提示 | 仅当请求参数 `msg[msg_type]``1``msg[receiver_type]``1` 时有此项 |
`e_infos`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | --------- | ---- |
| 0 | obj | 表情1 | |
| n | obj | 表情(n+1) | |
| …… | obj | …… | …… |
`e_infos`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ----------- | ----------------------------------- |
| text | str | 表情名称 | 包括左右两侧的中括号,如 `[tv_doge]` |
| uri | str | 表情链接 | |
| size | num | 表情尺寸 | 1<br />2大 |
| gif_url | str | 表情GIF链接 | 仅部分表情存在此项,如小电视表情 |
`key_hit_infos`对象:
| 字段 | 类型 | 内容 | 备注 |
| --------- | ----- | ------------ | -------------------------------------- |
| toast | str | 提示信息文字 | 当触发了提示时有此项 |
| rule_id | num | 触发的规则id | 当触发了提示时有此项,详细信息有待补充 |
| high_text | array | 高亮的文本 | 当触发了提示时有此项 |
`high_text`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---------------- |
| 0 | obj | 高亮文本1 | 详细信息有待补充 |
| n | obj | 高亮文本(n+1) | |
| …… | obj | …… | …… |
**示例:**
给目标用户`mid=1`发一条文字私信:
> up主你好<br />催更[doge]
```shell
curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \
--data-urlencode 'msg[sender_uid]=293793435' \
--data-urlencode 'msg[receiver_id]=1' \
--data-urlencode 'msg[receiver_type]=1' \
--data-urlencode 'msg[msg_type]=1' \
--data-urlencode 'msg[msg_status]=0' \
--data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \
--data-urlencode 'msg[timestamp]=1626181379' \
--data-urlencode 'msg[new_face_version]=1' \
--data-urlencode 'msg[content]={"content":"up主你好\n催更[doge]"}' \
--data-urlencode 'csrf=xxx' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"msg_key": 6984393491767669026,
"e_infos": [
{
"text": "[doge]",
"url": "https://i0.hdslb.com/bfs/emote/3087d273a78ccaff4bb1e9972e2ba2a7583c9f11.png",
"size": 1
}
],
"msg_content": "{\"content\":\"up主你好\\n催更[doge]\"}",
"key_hit_infos": {}
}
}
```
</details>
给目标用户`mid=1`发一条图片私信:
> <img src="https://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" style="zoom: 50%;">
```shell
curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \
--data-urlencode 'msg[sender_uid]=293793435' \
--data-urlencode 'msg[receiver_id]=1' \
--data-urlencode 'msg[receiver_type]=1' \
--data-urlencode 'msg[msg_type]=2' \
--data-urlencode 'msg[msg_status]=0' \
--data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \
--data-urlencode 'msg[timestamp]=1626181379' \
--data-urlencode 'msg[content]={"url":"https://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg","height":300,"width":300,"imageType":"jpeg","original":1,"size":54.144}' \
--data-urlencode 'csrf=xxx' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"data": {
"msg_key": 6852570013146024354
}
}
```
</details>
给目标用户`mid=1`发送会触发提示的私信:
> 支付宝
```shell
curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \
--data-urlencode 'msg[sender_uid]=293793435' \
--data-urlencode 'msg[receiver_id]=1' \
--data-urlencode 'msg[receiver_type]=1' \
--data-urlencode 'msg[msg_type]=1' \
--data-urlencode 'msg[msg_status]=0' \
--data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \
--data-urlencode 'msg[timestamp]=1626181379' \
--data-urlencode 'msg[content]={"content":"支付宝"}' \
--data-urlencode 'csrf=xxx' \
--data-urlencode 'csrf_token=xxx' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"msg_key": 6984393491767669026,
"msg_content": "{\"content\":\"支付宝\"}",
"key_hit_infos": {
"toast": "【温馨提示】为保障消费者权益,根据平台规则,如创作者在与消费者沟通中进行发布要求非法转账、欺诈转账等违规行为,平台有权对此进行处罚,感谢您的理解。",
"rule_id": 2,
"high_text": [{}]
}
}
}
```
</details>