czp3009 / bilibili-api

Bilibili API library for Kotlin
GNU General Public License v3.0
513 stars 50 forks source link

查看小电视 #11

Closed youth1996 closed 6 years ago

youth1996 commented 6 years ago
 * 查看可用的小电视抽奖
 *
 * @param roomId 房间号
 * @return 当目标房间没有可用的小电视抽奖时返回 -400
 */
@GET("AppSmallTV/index")
Call<AppSmallTVEntity> getAppSmallTV(@Query("roomid") long roomId);

我使用python访问这个api获取的信息是这样的,不知道怎么看具体的小电视编号 {'code': 0, 'msg': 'OK', 'message': 'OK', 'data': {'lastid': 0, 'join': [], 'unjoin': []}}

youth1996 commented 6 years ago

弹幕里面获取的{'cmd': 'SYS_MSG', 'msg': '七煌玉简九歌:?送给:?韩jojo是你们的99:?一个小电视飞船,点击前往TA的房间去抽奖吧', 'msg_text': '七煌玉简九歌:?送给:?韩jojo是你们的99:?一个小电视飞船,点击前往TA的房间去抽奖吧', 'rep': 1, 'styleType': 2, 'url': 'http://live.bilibili.com/8138050', 'roomid': 8138050, 'real_roomid': 8138050, 'rnd': 1789676350, 'tv_id': 0} tv_id 为0 ?

czp3009 commented 6 years ago

对于小电视查看, 如果目标房间很长一段时间没有任何小电视抽奖, 返回值是这样的

{
    "code": -400,
    "message": "no",
    "data": {
        "status": -1
    }
}

如果近期内(我不知道他的刷新时间是多久)存在小电视, 则返回的 message 为 OK,并且 data 存在本体.

data 本体中, lastid 为上一个小电视的 id, 如果近期的上一期时间段内(不知道是多久)没有小电视(可能是上一个小电视太过久远), 那么 lastid 就会是 0. join 和 unjoin 的内容结构是一致的, 大约如下

"join":[{"id":39674,"dtime":32}]

如果没有参加当前的这个, join 将为 空. 如果当前期的小电视以过期, unjoin 也会为空.

我推荐对一些比较火的直播间持续记录一些数据, 然后就可以找出他的含义和规律.

对于 SYS_MSG, 这个数据包中, 分为三种情况, 第一种是简单的通知, 甚至可能是B站自己的广告, 这种通知不会有 tv_id, 第二种是普通抽奖, 也就是非小电视的抽奖, tv_id 会是 0. 第三种是小电视抽奖, 此时 tv_id 存在且不是 0. 所以只有判断 tv_id 存在且不为 0, 才能认为这是一个小电视抽奖的通知.

小电视飞船我不知道是什么东西, 但是既然他的 tv_id 是 0, 就说明是一种普通礼物.

上次B站更新之后, 增加了 摩天大楼, 该礼物的送出效果与小电视相同, 即 SYS_MSG 中会有 tv_id 且不为 0, 而直到查看目标房间的小电视时才能知道到底是摩天大楼还是小电视. 摩天大楼我还没有研究过, 具体情况你可以问一下隔壁 https://github.com/lkeme/BiliHelper