虎牙开放平台文档

开放API 协议说明

一、协议说明

1.command命令请求json格式

{ "command":"subscribeNotice", "data":["getMessageNotice","getVipEnterBannerNotice","getSendItemNotice", "getOnTVAwardNotice", "getOpenNobleNotice", "getOpenGuardianNotice"], "reqId":"请求端的某一次请求的唯一标识", "extUuid":"小程序uuid", //新版本追加的参数;订阅高级事件时,该值是必填的。 }
1.1目前支持两种命令:
**注:** - **开放API相关的能力,目前只对企业认证的开发者开放。** - **如开发者需要使用开放API相关功能,请提供企业名称、盖章版的企业营业执照、授权书、联系人信息、数据用途和订阅的数据,然后邮件联系平台(hy-ext@huya.com)提交权限申请审核,审核通过后才能成功订阅开放数据。** - **订阅高级事件时,主播必须安装了该extUuid的小程序,才能订阅成功,否则提示订阅失败。** - **订阅事件中同时含有普通事件和高级事件,如果不符合高级事件订阅条件,则所有的订阅事件均订阅失败。**
  • (1)subscribeNotice: 订阅消息命令;
  • (2)unsubscribeNotice: 取消订阅消息命令;
  • (3)各个字段介绍:
    • command:即上面的两种命令中的一种;
    • data:命令的参数,目前支持以下几种消息
      • 普通事件
        • getMessageNotice: 弹幕消息
        • getVipEnterBannerNotice: 高级用户进场消息
        • getSendItemNotice: 送礼消息
        • getOnTVAwardNotice: 上电视中奖
        • getOpenNobleNotice: 开通续费贵族
        • getOpenGuardianNotice: 开通续费守护
        • getUserMutedNotice: 房管禁言
        • getShareLiveNotice: 分享直播间
          • getExpressionEmoticonNotice: 大表情/发送梗相关通用消息
          • getUserDoButtonLikeNotice: 用户点赞事件消息
        • 高级事件
          • getVipBarNotice:用户进入贵宾席前100
          • getConferVFansNotice:授予钻粉
          • getOpenSuperFansNotice:开通续费超粉
          • getFansBadgeNotice:首次获得粉丝徽章
    • reqId:在发送命令是客户端生成的唯一id,只是用于对应命令与命令对应的rsp;
    • extUuid:小程序uuid,订阅高级事件时,该值是必填的
  • (4)可以在同一个websocket连接中通过发送命令,来同时订阅多个事件,也可以取消订阅,更加灵活

2.通用回包结构,包括命令回包(订阅/取消订阅),以及所有的订阅通知消息通用返回json数据格式

{ "notice:"xxxxxxxxx"; //对应通知类型,command:表示命令回包;getMessageNotice:弹幕事件;getSendItemNotice:送礼事件;getVipEnterBannerNotice:进场事件 "data":{}, //data对应的数据根据notice来解析,不同的notice对应不同的结构 "statusCode":xxx, //返回码,成功200 "statusMsg":"xxxxxxx" //其他错误返回的描述信息 }

3.命令回包对应data字段,对应notice:command

{ "command":"subscribeNotice", //对应的命令(订阅/取消订阅),subscribeNotice:订阅; unsubscribeNotice:取消订阅 "data":["getMessageNotice","getVipEnterBannerNotice","getSendItemNotice"], //command执行操作的对应的开放平台开放的接口数组 "failedList":[""], //当ret等于1 部分失败时对应data中的失败列表 "reqId":"请求端的某一次请求的唯一标识", //客户端command请求的唯一标识,客户端生成的,服务器回填,用于标识某一次comman请求与对应的请求rsp "ret":xxx, //错误码,命令执行的返回码,全部成功为0,部分成功为1,全部失败为-1; "msg":"xxxxx" //对应ret的msg信息 }

4.弹幕事件对应通用回包结构data字段,对应notice:getMessageNotice

{ "badgeName":"小九", //粉丝徽章名称 "content":"测试弹幕", //弹幕内容 "fansLevel":7, //粉丝等级 "msgType":0, //弹幕类型,0-常规弹幕,1-功能性弹幕(诸如部分投票/战队支持等相关弹幕),2-上电视弹幕 "nobleLevel":4, //贵族等级 "unionId":"xxxxxx", //unionId为用户唯一Id "roomId":10004859, //房间号 "sendNick":"我是一颗小虎牙", //发送弹幕的用户昵称 "senderAvatarUrl":"", //发送弹幕的用户头像 "senderGender":1, //发送弹幕的用户性别,0-女,1-男,其他未知 "senderLevel":10 //用户等级 }

5.送礼事件对应通用回包结构data字段,对应notice:getSendItemNotice

{ "badgeName":"小九", "fansLevel":5, "itemId":20206, "itemName":"荧光棒", "nobleLevel":2, "presenterNick":"009一个字啊", "roomId":10004859, "sendItemComboHits":4, //送礼连击数 "sendItemCount":1, "sendNick":"我是一颗小虎牙", "senderAvatarurl":"http://huyaimg.msstatic.com/avatar/1025/06/fc11540e8d823369d21988b7b52996_180_135.jpg", "senderLevel":10, //用户等级 "totalPay":10, //此次送礼支付总额(单位:分) "unionId":"xxxxxx" }

6.高级用户进场事件对应通用回包结构data字段,对应notice:getVipEnterBannerNotice

{ "badgeName":"小九", "fansLevel":5, "nobleLevel":6, "nobleName":"帝皇", "unionId":"xxxxxx", "roomId":10004859, "userAvatarUrl":"http://test.huyaimg.msstatic.com/avatar/1060/b5/f3cccacf0a4efdcb0dacfaf6ed32b3_180_135.jpg?1510058616", "userNick":"仙剑其夏装", "userLevel":10 //用户等级 }

7.上电视中奖事件,对应notice:getOnTVAwardNotice

{ "roomId":1234567, //房间号 "title":"上电视主题", //房间主播设置的上电视主播 "awardName":"奖品名称", //房间主播设置的奖品名称 "awardNum":1, //房间主播设置的上电视最大中奖数量 "endTime":1545466778, //结束时间 "awardUserList":[{"unionId":"xxxxxxxxxx", "userNick":"xxxxxx", "userLevel":10, "awardName":"xxxxx", "content":"xxxxx", }] //中奖列表 }

8.开通续费贵族事件,对应notice:getOpenNobleNotice

{ "startTime":1561910400, //贵族生效unix时间戳 "endTime":1569686399, //贵族失效unix时间戳 "openFlag":1, //1代表首次(非贵族开通任一贵族,或者低等级贵族更换高等级的贵族操作,都并入到首开),2代表续费 "months":1, //开通月数 "nobleLevel":6, "nobleName":"帝皇", "presenterNick":"‘九九\"啊哈哈", "roomId":10004859, "unionId":"unKbNwiZUXelTGihqCaRum3ky5QbomoGog", "userAvatarUrl":"", "userLevel":14, //用户等级 "userNick":"xxxxxxxx" }

9.开通续费守护事件,对应notice:getOpenGuardianNotice

{ "startTime":1561910400, //守护生效unix时间戳 "endTime":1569686399, //守护失效unix时间戳 "guardianType":0, //守护类型,0-守护,1-铁铁,其它待拓展 "openDays":60, //开通或者续费天数 "lastGuardianLevel":1, //开通或者续费之前的守护等级 "openGuardianLevel":3, //开通或续费后守护等级 "presenterNick":"‘九九\"啊哈哈", "roomId":10004859, "unionId":"unKbNwiZUXelTGihqCaRum3ky5QbomoGog", "userAvatarUrl":"", "userLevel":14, //用户等级 "userNick":"xxxxxxxx" }

10.房管禁言事件,对应notice:getUserMutedNotice

{ "auditorNick":"xxxxxxxxx", //房管昵称 "auditorRole":2, //房管身份标识,1超管,2普通房管或公会管理 "auditorUnionId":"unJPqBTOU3FEM/Ti3ckv6zB4EjTmbJE2Ij", //房管unionId "mutedTime":604800, //封禁时长,单位秒s "autoUnmutedTime":1563528843, //自动解禁时间,unix时间戳 "mutedAction":0, //封禁操作(0-禁言,1-封入黑名单) "mutedReasonType":0, //理由类型(0-默认理由,1-恶意刷屏,2-谩骂,3-刷广告,4-其他理由) "mutedReasonDetail":"", //理由详情(有可能为空) "mutedUserNick":"xxxxxxxx", //被封禁用户昵称 "mutedUserText":"xxxxxxxxxxxxxxxxx", //公屏区的封禁内容,或者表示封禁入口途径(比如从榜单封禁) "mutedUserUnionId":"und91n4GT9DHuG/IkTIJV7gV7S2IB3C5Q8", //被封禁用户的unionId "roomId":12214 }

11.分享直播间事件,对应notice:getShareLiveNotice

{ "actionUrl":"xxxxxxxxxxxxxx", //直播间跳转链接 "content":"", //分享内容 "imageUrl":"", //分享图片的url "presenterUnionId":"xxxxxxxxxxxxxxx", "roomId":16780937, "shareType":0, //分享类型,默认0 "sharerNick":"会飞的小小菠萝呀", "sharerUnionId":"xxxxxxxxxxxxxxxx", "subtitle":"", //直播间副标题 "title":"房间号16780937 -【星秀】大家好~欢迎大家来到小天儿的直播间" //直播间标题 }

12.用户进入贵宾席前100事件,对应notice:getVipBarNotice

{ "badgeName": "xxxx", //主播的徽章名 "fansLevel": 1, //徽章等级 "nobleLevel": 0, //贵族等级 "nobleName": "", //贵族名称 "presenterNick": "xxxx", //主播昵称 "rank": 2, //贵宾席排名(瞬时) "roomId": 16780937, //主播房间号 "unionId": "unJPqBTOU3FEM/Ti3ckv6zB4EjTmbJE2Ij", //贵宾用户unionId "userAvatarUrl": "xxxxxxxxxxxxxxxxxxxx", //贵宾用户头像 "userLevel": 9, //贵宾用户等级 "userLogoDecoUrl": "xxxxx", //贵宾用户头像装饰url "userNick": "xxxxx" //主播昵称 }

13.授予钻粉事件,对应notice:getConferVFansNotice

{ "badgeName": "xxxx", //主播的徽章名 "expiredTime": 1605422613, //钻粉失效的时间戳: -1表示永久有效 "fansLevel": 1, //徽章等级 "openTime": 1602830597, //开通时间 "presenterNick": "xxxx", //主播昵称 "rank": 22, //用户徽章排名 "roomId": 16780937, //主播房间号 "score": 20, //用户该徽章的亲密度 "unionId": "unJPqBTOU3FEM/Ti3ckv6zB4EjTmbJE2Ij", //用户unionId "userAvatarUrl": "xxxxxxxxxxxxxxxxxxxx", //用户头像 "userLevel": 9, //用户等级 "userNick": "xxxxx", //用户昵称 "vlogo": "xxxxxxxxxxxxxxxxxxxx" //钻粉logo }

14.开通续费超粉事件,对应notice:getOpenSuperFansNotice

{ "expiredTime": 1602863598, //用户超粉到期时间戳 "freeMonth": 3, //赠送月数 "openType": 2, //操作类型:1开通、2续费 "payMonth": 12, //开通月数 "presenterNick": "xxxx", //主播昵称 "roomId": 16780937, //主播房间号 "unionId": "unJPqBTOU3FEM/Ti3ckv6zB4EjTmbJE2Ij", //用户unionId "userAvatarUrl": "xxxxxxxxxxxxxxxxxxxx", //用户头像 "userLevel": 9, //用户等级 "userNick": "xxxxx", //用户昵称 "yearFlag": 1 //本次是否续费或开通年超粉标志类型:1为年超粉,0为普通 }

15.首次获得粉丝徽章事件,对应notice:getFansBadgeNotice

{ "badgeName": "xxxx", //主播的徽章名 "fansLevel": 1, //徽章等级 "openTime": 1602830597, //开通时间 "presenterNick": "xxxx", //主播昵称 "rank": 99, //用户徽章排名 "roomId": 16780937, //主播房间号 "score": 10, //用户该徽章的亲密度 "unionId": "unJPqBTOU3FEM/Ti3ckv6zB4EjTmbJE2Ij", //用户unionId "userAvatarUrl": "xxxxxxxxxxxxxxxxxxxx", //用户头像 "userLevel": 9, //用户等级 "userNick": "xxxx" //用户昵称 }

16.大表情/发送梗相关通用消息,对应notice:getExpressionEmoticonNotice

{ "msgType":1, // 消息类型,1-序列帧(诸如直播间发送大表情); 2-自定义图(诸如直播间发送梗) "roomId":668, "unionId":"xxxxxxxxxxx", "sendNick":"xxxxx", "senderAvatarUrl":"xxxxx", "senderGender":1, "senderLevel":16, "badgeName":"xxxxx", "nobleLevel":2, "fansLevel":3, "detail": // 详细信息,根据msgType字段不同进行解析 { "emoticon":[{"content":"[骰子]"}] } } 根据msgType字段类型不同,detail字段json格式也不同。 1-序列帧,诸如直播间发送大表情,json格式如下: (1) emoticon-对象数组,数组中每个对象定义大表情信息 (2) 具体对象数组中字段定义: content-大表情 "detail": { "emoticon":[{"content":"[骰子]"}] } 2-自定义图,诸如直播间发送梗,json格式如下: (1) emoticon-对象数组,数组中每个对象定义梗信息 (2) 具体对象数组中字段定义: content-梗 "detail": { "emoticon":[{"content":"[老板大气]"}] }

17.点赞事件对应通用回包结构data字段,对应notice:getUserDoButtonLikeNotice

{ likeCombos: 6, //点赞连击 likeCounts: 1, //点赞数 roomId: 556612, //主播房间号 unionId: 'xxxxx', //用户unionId userAvatarUrl: 'xxxxx', //用户头像 userNick: 'xxxxx' //用户昵称 }

二、返回json数据例子:

1.发送命令的rsp:

{ "data": { "command":"subscribeNotice", "data":["getMessageNotice","getVipEnterBannerNotice","getSendItemNotice"], "failedList":[""], "msg":"sucess", "reqId":"123456789", "ret":0 }, "notice":"command", "statusCode":200, "statusMsg":"" }

2.高级用户进场消息

{ "data": { "nobleLevel":4, "nobleName":"公爵", "roomId":10007263, "unionId":"opQ0/FU7vxxRFnbSNoIaCyBXjKhkZ70mYy", "userAvatarUrl":"", "userNick":"xxxxxxx", "userLevel":10 }, "notice":"getVipEnterBannerNotice", "statusCode":200, "statusMsg":"" }

3.弹幕消息

{ "data": { "badgeName":"小九", "content":"哈哈哈哈哈哈", "fansLevel":9, "nobleLevel":4, "roomId":10007263, "sendNick":"xxxxxxx", "senderAvatarUrl":"", "senderGender":1, "senderLevel":10, "showMode":0, "unionId":"opQ0/FU7vxxRFnbSNoIaCyBXjKhkZ70mYy" }, "notice":"getMessageNotice", "statusCode":200, "statusMsg":"" }

4.送礼消息

{ "data": { "fansLevel":3, "badgeName":"小九", "nobleLevel":2, "itemName":"血瓶", "presenterNick":"xxxxxxx", "roomId":10007263, "sendItemComboHits":1, "sendItemCount":1, "sendNick":"xxxxxxx", "senderAvatarurl":"", "senderLevel":10, "unionId":"opQ0/FU7vxxRFnbSNoIaCyBXjKhkZ70mYy" }, "notice":"getSendItemNotice", "statusCode":200, "statusMsg":"" }

5.上电视中奖消息

{ "data": { "awardName":"1111", "awardNum":2, "awardUserList":[{"awardName":"1111","content":"看我独占电视","unionId":"unAa+8o5UV3yIM/I1fqsH2/SfgyIs0YLQS","userNick":"虎牙直播-xxxxx", "userLevel":10}], "endTime":1556260699, "roomId":10006965, "title":"" }, "notice":"getOnTVAwardNotice", "statusCode":200, "statusMsg":"" }

6.大表情/发送梗相关通用消息

(1) 大表情 { "notice:"getExpressionEmoticonNotice"; "data": { "msgType":1, "roomId":668, "unionId":"xxxxxxxxxxx", "sendNick":"xxxxx", "senderAvatarUrl":"xxxxx", "senderGender":1, "senderLevel":16, "badgeName":"xxxxx", "nobleLevel":2, "fansLevel":3, "detail": { "emoticon":[{"content":"[骰子]"}] } }, "statusCode":200, "statusMsg":"" } (2) 直播间发送的梗 { "notice:"getExpressionEmoticonNotice"; "data": { "msgType":2, "roomId":668, "unionId":"xxxxxxxxxxx", "sendNick":"xxxxx", "senderAvatarUrl":"xxxxx", "senderGender":1, "senderLevel":16, "badgeName":"xxxxx", "nobleLevel":2, "fansLevel":3, "detail": { "emoticon":[{"content":"[老板大气]"}] } }, "statusCode":200, "statusMsg":"" }