抖音开放平台Logo
开发者文档
“/”唤起搜索
控制台

互动工具开发者指南(仅直播伴侣)

收藏
我的收藏

更新日志

日期
更新内容
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
    •更新 C++ SDK,解决部分场景下消息收不到的问题
    •更新 C++ SDK,更新 SetLogMessageCallback 接口定义

总流程

​
​
​
​

客户端交互时序图

​
​
​
启动说明:
伴侣启动第三方插件的时候会加上启动参数,样例如下:
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 接入

伴侣调试包下载

​

C++ 接入

SDK 下载地址(二选一):

    •纯 pipeSDK 产物:
pure_PipeSDK.zip
​
    •包含 FFmpeg 开源库的产物(方便 demo 集成):
PipeSDK_FFmpeg.zip
​

接口说明

接口
参数
返回值
​
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 快速接入

源码下载地址

ConsoleApplication_source.zip
源码运行前置环境要求:
    •Windows 7+,建议 Windows 10 系统
    •Visual Studio 2019+
    •使用 C++ 作为开发语言,支持 C++ 17 版本
​

步骤

    1.下载 demo 源码,解压后用 Visual Studio 打开,修改代码中的视频文件路径为本地存在的 mp4 文件路径,重新生成解决方案,得到构建产物 ConsoleApplication1.exe
​
​
​
​
    2.下载调试版的伴侣包,打开直播伴侣,在点击顶部的 "互动插件调试面板",弹出互动插件调试工具的弹窗
    3.APP ID 输入 "MAIN"(跟代码的OPEN 入参数对应上),随机生成一个 AppID,然后启动文件路径选择步骤一在 Visual Studio 生成的产物 ConsoleApplication1.exe 的路径。然后点击 "启动插件" 的按钮
    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
是
素材具体信息
{ "sourceIds": [{ "name": "素材名字", "id": 0, // 素材 ID }] }
​
​

删除素材

    •Method 名: removeMediaSources
    •API 说明:插件向直播伴侣申请删除自身上屏的素材
    •请求传参:
字段
数据类型
必填
说明
sourceIds
array
​
是
需要删除的素材ids
[0, 1] // 素材 ID1", "素材 ID2"
    •返回值:
字段
数据类型
必填
说明
code
int
是
1 代表成功,非 1 代表失败
message
string
是
失败时的具体说明
data
struct
​
是
{}
​
​

获取所有素材

    •Method 名: getCurrentMediaSources
    •API 说明:插件向直播伴侣申请获取所有与当前插件相关的素材
    •请求传参:
字段
数据类型
必填
说明
无
无
​
无
无
    •返回值:
字段
数据类型
必填
说明
code
int
是
1 代表成功,非 1 代表失败
message
string
是
失败时的具体说明
data
struct
​
是
{ "sourceIds": [ { "name": "调试插件", "id": 0 }, { "name": "调试插件1", "id": 1 } ] }
​
​

删除所有素材

    •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
​
是
{ "gift_pool": [ { // 礼物图标 "gift_icon": "http://p3-webcast.douyinpic.com/img/webcast/53bb24f0a76dba26f5376db40186dd22.png~tplv-obj.png", // 礼物名字 "gift_name": "仙女棒", // 礼物价值 "gift_value": 10, // 加密的礼物id "sec_gift_id": "n1/Dg1905sj1FyoBlQBvmbaDZFBNaKuKZH6zxHkv8Lg5x2cRfrKUTb8gzMs=" } ] }
​
​

查询直播间开放数据

    •版本要求:伴侣版本 >= 8.0.0
    •Method 名: getOpenRoomData
    •API 说明:插件主动向 直播伴侣 查询直播开放数据(根据开放平台申请的能力返回)
    •请求传参:
字段
数据类型
必填
说明
无
无
​
无
无
    •返回值:
字段
数据类型
必填
说明
code
int
是
1 代表成功,非 1 代表失败
message
string
是
失败时的具体说明
data
struct
​
是
{ // 直播间总点赞数 "room_like_count": 12345 }
​
​

事件接收说明 (订阅-发布模型)

整体结构

​
// 通过 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 // 粉丝团等级 }
目前仅支持以下 8 款礼物的送礼消息推送(伴侣大于等于 8.0.0 版本礼物池会增加,改从伴侣获取支持的礼物列表)。
礼物名
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. 平台已经针对单个用户的点赞做了幂等设计,保证一条点赞数据,至少且最多发送一条。
​