互动工具开发者指南(仅直播伴侣)
收藏
我的收藏更新日志
日期 | 更新内容 |
2024.03.08 | 首次发布接入流程以及整体交互流程,提供 C++ SDK 和最简单的 C++ 上屏 Demo |
2024.03.15 | 更新 C++ SDK 和 Demo,修复上屏偶现不成功的问题。Demo 新增添加两路音视频数据的样例。 |
2024.03.20 | 添加备注"单个素材通道的视频数据分辨率不能超过 1920*1080";明确插件接收到管道消息 EVENT_DISCONNECTED 后,需要执行退出进程的操作。 |
2024.03.26 | 修复已知上屏稳定性问题; 插件客户端退出不主动删除所有相关素材,可等待插件客户端重连; 调试面板新增"关闭插件"的入口; C++ Demo 添加从命令行启动参数读取 pipeName 和 maxChannels 的逻辑; C++ Demo 添加写日志的逻辑; 文档新增启动和退出说明; 文档更新 C++ SDK 和 Demo; |
2024.04.01 | 调整直播间开放数据推送事件的数据结构; 调试面板新增 "模拟互动消息" 的按钮; 新增素材删除事件; 新增删除所有素材的 API; 新增获取所有素材的 API; 修复调用删除素材 API 不生效的问题; 修复偶现pipe建立失败问题; |
2024.04.09 | 更新 C++ SDK( PipeSDK.dll 加上签名) |
2024.04.11 | 更新 C++ SDK,修复不连续发送数据时可能会导致数据帧会错位读写的问题; 更新用于调试的伴侣版本 |
2024.05.23 | 更新伴侣调试包 从伴侣 7.7.0 版本开始,新增启动参数 --mateVersion,指代当前伴侣版本 从伴侣 7.7.0 版本开始,上屏内容大小不做强约束,只做建议 |
2024.06.03 | 更新伴侣调试包 从伴侣 7.8.0 版本开始,支持横屏开播模式下使用互动工具(7.8.0之前仅支持竖屏) 从伴侣 7.8.0 版本开始,新增启动参数 --layoutMode,指代开播的布局模式 |
2024.06.28 | 从伴侣 8.0.0 版本开始,送礼数据的礼物种类从 8 款提升至 40+ 款 从伴侣 8.0.0 版本开始,新增两个 API 调用
从伴侣 8.0.0 版本开始,直播间开放数据推送事件新增两类消息
从伴侣 8.0.0 版本开始,直播间开放数据推送事件新增三个维度的观众属性
|
2024.07.23 |
|
总流程
客户端交互时序图
启动说明:
伴侣启动第三方插件的时候会加上启动参数,样例如下:
plugin.exe --pipeName=784612345 --maxChannels=6 --mateVersion=7.7.0 --layoutMode=0
参数详细说明:
启动参数 | 说明 | 生效版本 |
pipeName | 用于 SDK 的初始化 | 全部 |
maxChannels | 用于 SDK 的初始化 | 全部 |
mateVersion | 区分伴侣版本。 | >= 7.7.0 |
layoutMode | 开播的布局模式。 0 代表竖屏,1 代表横屏。竖屏以宽度 1080 作为上屏画布的基准,横屏按照宽度 1920 作为上屏画布的基准 | >= 7.8.0 |
退出说明:
如果是 伴侣侧主动退出,插件进程会收到 EVENT_DISCONNECTED 事件,此时预期是插件进程自行执行退出进程的操作。
如果是 插件进程被动退出,伴侣侧会保持等待插件重连的状态,除非主播将素材区相关的素材全都删除,伴侣侧才会结束等待重连的状态。(在等待重连状态下,如果在调试面板用相同的 AppID 点击“启动插件”,将不会启动进程,因为这里预期是插件自身启动重连,此时可以点击调试面板 的 “关闭插件” 触发伴侣侧的主动退出 )。
名词解释
- •插件:业务概念,对主播来说,是指一系列 直播伴侣 上提供的互动玩法。
- •包体:业务概念,是指某个插件的程序压缩包,是开发者需要厂商平台上传提审的文件
- •素材:业务概念,是指在伴侣在画布上展示的最小单元,可以有位置、大小等属性,一个插件可以产生多个素材。
- •管道:技术概念,是指插件跟伴侣的通信通道,可以传输 音视频数据 和 指令数据。
- •素材通道:技术概念,一个管道可以传输多个素材通道的音视频数据,插件给伴侣推送的音视频数据需要带上指定的素材通道 ID。一个素材通道对应伴侣画布上的一个素材。
SDK 接入
伴侣调试包下载
SDK 接入是否成功,可以用以下的 直播伴侣 包进行验证,注意以下包仅能用于调试,非正式包:
C++ 接入
SDK 下载地址(二选一):
- •纯 pipeSDK 产物:
- •包含 FFmpeg 开源库的产物(方便 demo 集成):
接口说明
接口 | 参数 | 返回值 | |
CreatePipeClient | IPipeClient | 返回值=TRUE成功,FALSE失败,同时返回pipe客户端实例 | |
ChannelLayoutToChannels | IPC_CHANNEL_LAYOUT | 根据Layout获得声道数 | |
AudioFormatToBits | IPC_AUDIO_FORMAT | 根据音频格式获得位宽 | |
GetTimeNS | | 获得当前系统时间单位纳秒 | |
QueryVersion | | 获得当前SDK版本号 | |
名词解释
名称 | 描述 | 说明 | | |
IPC_EVENT_TYPE | 事件类型 | | | |
IPC_PACKET | 音视频数据包 | | | |
| struct Video { BOOL bFlipH;//是否水平镜像 BOOL bFlipV;//是否垂直镜像 UINT32 cx;//视频宽度 UINT32 cy;//视频高度 INT32 angle;//旋转角度 IPC_RATIONAL frameRate;//视频帧率默认(1/30) IPC_VIDEO_PIXEL_FORMAT format;//视频格式默认使用RGBA带透明通道 IPC_COLOR_SPACE cs;//颜色空间 IPC_COLOR_TRANSFER ct;//颜色范围 IPC_VIDEO_RANGE range;//视频范围 }; struct Audio { IPC_AUDIO_FORMAT format;//音频格式 IPC_CHANNEL_LAYOUT layout;//声道布局 UINT32 sampleRate;//采样率 UINT32 count;//采样格式 UINT32 planes;//plane数 UINT32 blocksize;//对齐位宽 }; union { Audio audio; Video video; }; UINT8* data[MAX_AV_PLANES]; //视频YUV多Plane和音频多Plane格式,具体设置参考demo. UINT32 linesize[MAX_AV_PLANES];//视频YUV各分量单行大小,音频数据大小,具体设置参考demo UINT32 size;//音视频数据大小,具体设置参考demo INT64 timestamp; //数据包时间戳用于同步,具体设置参考demo | 视频宽高最大1920*1080 音频数据大小=audio.count * audio.blocksize | | |
| | | | |
IPC_VIDEO_PIXEL_FORMAT | 视频格式 | | | |
IPC_COLOR_SPACE | 颜色空间 | | | |
IPC_COLOR_TRANSFER | 颜色转换函数(光电转换) | | | |
IPC_VIDEO_RANGE | 视频范围 | | | |
IPC_AUDIO_FORMAT | 音频格式 | | | |
IPC_CHANNEL_LAYOUT | 音频声道布局 | | | |
LogSeverity | 日志等级 | | | |
PIPE_CALLBACK | Pipe事件回调 | | | |
LOG_MESSAGE_CALLBACK | 日志回调 typedef BOOL (*LOG_MESSAGE_CALLBACK)(LogSeverity level, LPCSTR file, INT32 line, LPCSTR text); | 日志回调,主要用于导出SDK内部日志 LogSeverity level: 日志级别 LPCSTR file: 日志所在文件 INT32 line: 日志所在文件中的行数 LPCSTR text: 日志具体内容 | | |
IPipeClient | SendMessage(UINT32 msgid, const CHAR* data, UINT32 size) | 发送消息, 主要用于 API 调用。 Msgid: 消息ID。 主要用来对齐消息是否有收到 Data: 消息体,JSON 字符串 | | |
| WritePacket(const IPC_PACKET* apk,UINT32timeoutms) | 发送数据包同步模式可以设置超时时间(毫秒) | | |
| WritePacketAsync(const IPC_PACKET* apk) | 发送数据包异步模式服务端最快速度上屏和播放不会同步 | | |
| QueryVersion | 当前的版本号 | | |
| SetCallback([](IPC_EVENT_TYPE type, UINT32 msg, const CHAR* data, UINT32 size, void* args) | 接收消息回调 | | |
Demo 快速接入
源码下载地址
源码运行前置环境要求:
- •Windows 7+,建议 Windows 10 系统
- •Visual Studio 2019+
- •使用 C++ 作为开发语言,支持 C++ 17 版本
步骤
- 1.下载 demo 源码,解压后用 Visual Studio 打开,修改代码中的视频文件路径为本地存在的 mp4 文件路径,重新生成解决方案,得到构建产物 ConsoleApplication1.exe
- 2.下载调试版的伴侣包,打开直播伴侣,在点击顶部的 "互动插件调试面板",弹出互动插件调试工具的弹窗
- 3.
- 4.启动后可以伴侣素材区会出现一个新的素材,然后画布上会出现推送的视频,demo 运行成功!
- 5.点击 "添加素材",会出现第二个互动插件的素材,对应 demo 代码中第二个 channel 对应的音视频数据
- 6.点击调试面板的 "关闭插件",会触发伴侣侧的主动关闭,素材区的相关素材会被删除。注意,如果不触发伴侣侧的主动关闭,再用相同的 APP ID 去点击 "启动插件"后也不会启动对应插件的 exe 文件。
Electron 接入方案
待补充。
互动插件与直播伴侣的通信模型
音视频数据推送
音视频数据推送的流程是: 创建素材通道 -> 返回素材通道 ID -> 推送音视频数据。
- 1.其中首次建立连接后,默认会创建一个素材通道,插件进程可以直接往这个素材通道发送音视频数据。也就是说假如 A 插件在整个生命周期过程中,只需要上屏一个素材,那么在管道建立后,可以直接往 素材通道 0 直接推送音视频数据,无需向直播伴侣客户端发起 “创建素材通道” 的 API。最终在伴侣上的表现是,素材区会新增一个素材,素材内容由 素材通道 0 接收到的音视频数据决定。
- 2.假如 B 插件在整个生命周期过程中,需要上屏两个素材,那么在管道建立后,可以往 素材通道 0 直接推送音视频数据,完成 第一个素材的画面上屏。然后向直播伴侣客户端发起 “创建素材” 的 API 调用,然后伴侣会向插件进程返回第二个素材通道的 ID (一般第二个素材的通道 ID 是 1),然后插件 B 可以往 素材通道 1 推送音视频数据,最终在伴侣上的表现是,素材区会新增两个素材,素材内容分别对应 素材通道 0 和 素材通道 1 接收到的音视频数据。
备注:一个插件最多创建 6 个素材通道,单个素材通道的视频数据分辨率不能超过 1920*1080(横屏或者竖屏)。
具体数据结构看 SDK 的方法。
请求-响应 模型
// 请求传参 { "type": "request", "reqId": "45678956", "method": "", "params": {}, // 方法传参 }
// 响应传参 { "type": "request", "reqId": "45678956", "code": 1, // 1 代表成功,非 1 代表失败 "data": {}, // 响应 "message": "" }
订阅-发布 模型
// 订阅事件 { "type": "request", "reqId": "45678956", "method": "x.subscribeEvent", "params": { "eventName": "event_name" }, }
// 取消订阅事件 { "type": "request", "reqId": "45678956", "method": "x.unsubscribeEvent", "params": { "eventName": "event_name" }, }
// 发布事件 { "type": "request", "reqId": "45678956", "method": "x.publishEvent", "params": { "eventName": "event_name", "params": {} }, }
// 接收事件 { "type": "event", "eventName": "event_name", "params": {} }
音视频数据推送说明
推送视频数据
推送音频数据
API 调用说明(请求-响应模型)
整体结构
// 通过 SDK 的 SendMessage 方法发起 // 请求传参,通过管道发送给客户端 { "type": "request", // 固定 "reqId": "45678956", // 需要生成一个 uuid,最后需要跟响应配对 "method": "", // 方法名 "params": {}, // 方法传参,每个方法对应的参数可查看下面各个方法的 "请求传参" 部分 } // 通过 SDK 的 SetCallback 接收,type 等于 PipeSDK::EVENT_MESSAGE // 响应传参,通过管道接收 { "type": "request", // 固定 "reqId": "45678956", "code": 1, // 1 代表成功,非 1 代表失败 "data": {}, // 响应 "message": "" }
创建素材
- •Method 名: createMediaSources
- •API 说明:插件向直播伴侣申请创建上屏的素材,直播伴侣会返回上屏素材的 ID 和 名字
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
count | int | 是 | 创建素材的个数 |
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 | 素材具体信息
|
删除素材
- •Method 名: removeMediaSources
- •API 说明:插件向直播伴侣申请删除自身上屏的素材
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
sourceIds | array | 是 | 需要删除的素材ids
|
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
获取所有素材
- •Method 名: getCurrentMediaSources
- •API 说明:插件向直播伴侣申请获取所有与当前插件相关的素材
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
无 | 无 | 无 | 无 |
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
删除所有素材
- •Method 名: removeAllMediaSources
- •API 说明:插件向直播伴侣 请求删除所有与当前插件相关的素材。
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
无 | 无 | 无 | 无 |
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
订阅事件
- •Method 名: x.subscribeEvent
- •API 说明:插件向直播伴侣订阅需要接收的事件
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
eventName | string | 是 | 需要订阅的事件名 |
timestamp | int | 是 | 当前时间戳,毫秒级 |
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
取消订阅事件
- •Method 名: x.unsubscribeEvent
- •API 说明:插件向直播伴侣取消订阅事件
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
eventName | string | 是 | 需要取消订阅的事件名 |
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
发布事件
- •Method 名: x.publishEvent
- •API 说明:插件向 直播伴侣 发布事件
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
eventName | string | 是 | 需要发布的事件名 |
params | struct | 是 | 由插件定义
|
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
获取礼物列表
- •版本要求:伴侣版本 >= 8.0.0
- •Method 名: getOpenGiftPools
- •API 说明:插件从 直播伴侣 获取支持配置的礼物池
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
无 | 无 | 无 | 无 |
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
查询直播间开放数据
- •版本要求:伴侣版本 >= 8.0.0
- •Method 名: getOpenRoomData
- •API 说明:插件主动向 直播伴侣 查询直播开放数据(根据开放平台申请的能力返回)
- •请求传参:
字段 | 数据类型 | 必填 | 说明 |
无 | 无 | 无 | 无 |
- •返回值:
字段 | 数据类型 | 必填 | 说明 |
code | int | 是 | 1 代表成功,非 1 代表失败 |
message | string | 是 | 失败时的具体说明 |
data | struct | 是 |
|
事件接收说明 (订阅-发布模型)
整体结构
// 通过 SDK 的 SetCallback 接收,type 等于 PipeSDK::EVENT_MESSAGE { "type": "event", "eventName": "event_name", // 事件名 "params": {} // 事件参数 }
注意,需要先订阅才能接收。
直播间开放数据推送事件
- •事件名: OPEN_LIVE_DATA
- •事件说明:直播伴侣向插件推送直播间互动数据(评论、礼物、点赞等)
- •事件参数:
字段 | 数据类型 | 必填 | 说明 |
payload | array | 是 | 由 评论、礼物 、点赞 等消息混合组成的数组。其中 评论、礼物 、点赞 各自的数据结构如下 |
// 整体结构如下 { "payload": [ { "msg_id": "7351263914183087148", "timestamp": 1711939193044, "msg_type": 1, "msg_type_str": "live_like", "sec_open_id": "2e441624-b99f-5f05-a632-d3f7c92df768", "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", "nickname": "bor432", "like_num": 1, "user_privilege_level": 1, "is_follow_anchor": true, "fansclub_level": 1 }, { "msg_id": "7352602227091444780", "timestamp": 1711939362000, "msg_type": 2, "msg_type_str": "live_comment", "sec_open_id": "2e441624-b99f-5f05-a632-d3f7c92df768", "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", "nickname": "bor432", "content": "主播厉害", "user_privilege_level": 1, "is_follow_anchor": true, "fansclub_level": 1 }, { "msg_id": "7352721006988055596", "timestamp": 1711939405000, "msg_type": 3, "msg_type_str": "live_gift", "sec_open_id": "2e441624-b99f-5f05-a632-d3f7c92df768", "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", "nickname": "bor432", "sec_gift_id": "VQCVfwVeQCJZDCr/srE99db/NA3vgkBlaxG2dPyetE8NLgDRQ5ktGcwXm8M=", "gift_num": 1, "user_privilege_level": 1, "is_follow_anchor": true, "fansclub_level": 1 } ] }
评论数据 payload:
{ "msg_id": "7352602227091444780", // string类型 id "timestamp": 1711939362000, // 评论毫秒级时间戳 "msg_type": 2, // 互动数据类型,1-点赞、2-评论、3-礼物 "msg_type_str": "live_comment", // 互动数据类型,评论-live_comment、礼物-live_gift、点赞-live_like "sec_open_id": "2e441624-b99f-5f05-a632-d3f7c92df768", // 评论用户的加密openid "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", // 评论用户头像 "nickname": "bor432", // 评论用户昵称(不加密) "content": "主播厉害", // 评论内容 "user_privilege_level": 1, // 用户荣誉等级 "is_follow_anchor": true, // 用户是否关注主播 要获取相应的权限才会有值 "fansclub_level": 1 // 粉丝团等级 }
点赞数据 payload:
{ "msg_id": "7351263914183087148", // string类型id "timestamp": 1711939193044, // 点赞毫秒级时间戳 "msg_type": 1, // 互动数据类型,1-点赞、2-评论、3-礼物 "msg_type_str": "live_like", // 互动数据类型,评论-live_comment、礼物-live_gift、点赞-live_like "sec_open_id": "2e441624-b99f-5f05-a632-d3f7c92df768", // 点赞用户的加密 openid "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", "nickname": "bor432", // 点赞用户昵称 "like_num": 1, // 点赞数量 "user_privilege_level": 1, // 用户荣誉等级 "is_follow_anchor": true, // 用户是否关注主播 要获取相应的权限才会有值 "fansclub_level": 1 // 粉丝团等级 }
礼物数据 payload:
{ "msg_id": "7352721006988055596", // string 类型 id "timestamp": 1711939405000, // 礼物毫秒级时间戳 "msg_type": 3, // 互动数据类型,1-点赞、2-评论、3-礼物 "msg_type_str": "live_gift", // 互动数据类型,评论-live_comment、礼物-live_gift、点赞-live_like "sec_open_id": "2e441624-b99f-5f05-a632-d3f7c92df768", // 用户的加密openid "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", // 用户头像 "nickname": "bor432", // 用户昵称 "sec_gift_id": "VQCVfwVeQCJZDCr/srE99db/NA3vgkBlaxG2dPyetE8NLgDRQ5ktGcwXm8M=", // 加密的礼物id "gift_num": 1, // 送出的礼物数量 "user_privilege_level": 1, // 用户荣誉等级 "is_follow_anchor": true, // 用户是否关注主播 要获取相应的权限才会有值 "fansclub_level": 1 // 粉丝团等级 }
礼物名 | sec_gift_id | 单价 | Icon | 链接 |
小心心 | VQCVfwVeQCJZDCr/srE99db/NA3vgkBlaxG2dPyetE8NLgDRQ5ktGcwXm8M= | 1 | ||
抖音音符 | 4R89bzhTU5UMh+fbM087VVM47+n8O6kV5mfoDZABs/qktwZSG9TOsEyX8qc= | 1 | ||
人气票 | ScShUKZLl04ky+mv/rvpfY/KR79abl/xF82G6WoP/lpN34gTBhWbl7Ag6jI= | 1 | ||
玫瑰 | pXPMpuOKRnPKYBISe95O0gISMwPdCi4L5BqnezAmRsaZnP3WLKRtsoKk0Cg= | 1 | ||
大啤酒 | f2STGmVCVFRZUmPKXD/dKUdO3bRJlFKnnyK19C0KoRbE/MOx+yBMqbArtlU= | 2 | ||
你真好看 | peF61t4DgAzDtYJohdRKi7xgW1ZTHtOsfWVAmFk5GcZ7FzshBI+qObDgOos= | 2 | ||
Thuglife | RBNKbYDuBwDIIrHalV8qCPbvt2Jr3p2iVFHvKOM2fWfCZm3mY6Ut9HONRqs= | 99 | ||
亲吻 | v0WMOIdAoC4r17IR24HWYueiXMPlDDA/qi7G1nFl2IrGg+jah93zKLpfljg= | 99 |
粉丝团变更消息 payload (伴侣版本 >= 8.0.0 才支持):
{ "msg_id": "7352721006988055596", // string 类型 id "timestamp": 1711939405000, // 礼物毫秒级时间戳 "msg_type": 4, // 互动数据类型,1-点赞、2-评论、3-礼物、4-粉丝团变更 "msg_type_str": "live_fansclub", // 互动数据类型,评论-live_comment、礼物-live_gift、点赞-live_like、粉丝团-live_fansclub "sec_open_id": "_000WomhJcg__iECuDtakkckSAhwX5tCHabM", // 用户的加密openid "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", // 用户头像 "nickname": "bor432", // 用户昵称 "fansclub_reason_type": 1, // 粉丝团变更原因 1-升级、2-加团、16-退团 "user_privilege_level": 1, // 用户荣誉等级 "is_follow_anchor": true, // 用户是否关注主播 要获取相应的权限才会有值 "fansclub_level": 1 // 粉丝团等级 }
关注变更消息 payload (伴侣版本 >= 8.0.0 才支持):
{ "msg_id": "7352721006988055596", // string 类型 id "timestamp": 1711939405000, // 礼物毫秒级时间戳 "msg_type": 5, // 互动数据类型,1-点赞、2-评论、3-礼物、4-粉丝团变更、5-关注变更 "msg_type_str": "live_follow", // 互动数据类型,评论-live_comment、礼物-live_gift、点赞-live_like、粉丝团-live_fansclub、关注变更-live_follow "sec_open_id": "_000WomhJcg__iECuDtakkckSAhwX5tCHabM", // 用户的加密openid "avatar_url": "https://p3.douyinpic.com/aweme/100x100/aweme-avatar/mosaic-legacy_3796_2975850990.jpeg?from=3067671334", // 用户头像 "nickname": "bor432", // 用户昵称 "user_follow_action": 1, // 用户关注变更数据 1 关注 2 取关 "user_privilege_level": 1, // 用户荣誉等级 "is_follow_anchor": true, // 用户是否关注主播 要获取相应的权限才会有值 "fansclub_level": 1 // 粉丝团等级 }
素材删除事件
- •事件名: OPEN_MEDIA_SOURCE_DELETED
- •事件说明:当前插件相关的素材被删除时触发
- •事件参数:
字段 | 数据类型 | 必填 | 说明 |
id | number | 是 | 被删除素材的 id |
控制面板弹出事件
- •事件名: OPEN_WIN_FOCUS
- •事件说明:主播在直播伴侣点击插件入口,预期插件控制面板窗口能置顶
- •事件参数:
字段 | 数据类型 | 必填 | 说明 |
无 | 无 | 无 | 无 |
退出插件事件
- •事件名: OPEN_WIN_CLOSE
- •事件说明:主播在直播伴侣关闭插件,预期插件退出所有进程
- •事件参数:
字段 | 数据类型 | 必填 | 说明 |
无 | 无 | 无 | 无 |
FAQ
请问个点赞数据的问题:a. 这个是用户手动点赞时触发,逻辑是什么,比如是多少秒合并给出某个观众这段时间的点赞数量?是否会过滤某些点赞数据 ?b 直播间的总点赞能否将单个点赞直接累加,这样计算的结果会不会偏差比较大?。
回答:a. 单用户 2 秒内聚合一次推送 ,一般不会进行过滤。有几种场景会触发过滤:1. 用户已到达点赞上限 2. 用户账号异常。 b. 平台已经针对单个用户的点赞做了幂等设计,保证一条点赞数据,至少且最多发送一条。