2019-07-22 11:12:53 +08:00
2019-06-26 15:54:29 +08:00
2019-06-26 15:54:29 +08:00
2019-07-11 18:58:42 +08:00
2019-07-08 18:41:14 +08:00
2019-06-26 15:54:29 +08:00
2019-07-11 18:58:42 +08:00
2018-05-09 17:01:46 +08:00
2019-07-22 11:12:53 +08:00
2019-07-22 11:12:53 +08:00
2019-06-26 15:54:29 +08:00

Bilibili API library for Kotlin

本项目封装一些 Bilibili API 以方便在 Kotlin 中使用(也可用于其他 JVM 语言).

协议来自对 Bilibili Android APP 的逆向工程以及截包分析.

引入依赖

RestFul API

compile group: 'com.hiczp', name: 'bilibili-api-rest', version: '0.2.0'

Websocket(用于获取直播间实时弹幕)

compile group: 'com.hiczp', name: 'bilibili-api-websocket', version: '0.2.0'

RestFul API

大部分 API 都是 RestFul API.

BilibiliClient 是一个模拟的客户端, 内含登陆状态. 应持有其引用, 并在合适时执行 close().

登陆

val bilibiliClient = BilibiliClient()
runBlocking {
    bilibiliClient.login(username, password)
}

BilibiliClient.login 会返回一个 Credential 实例. 将其序列化后保存. 下次可以直接使用这一凭证来恢复登陆状态

val bilibiliClient = BilibiliClient(credential)

多次错误的登陆将导致下一次登陆需要验证码(极验).

登陆失败将抛出 LoginException 异常, 其中包含服务器原始返回内容 LoginResponse.

登出

runBlocking {
    bilibiliClient.revoke()
}

BilibiliClient.revoke 返回已被注销的凭证, 或返回 null 当此 BilibiliClient 实例没有包含凭证时.

如果凭证是错误的, 将抛出 RevokeException.

获取直播间实时弹幕

直播间实时弹幕是一个 Websocket.

LiveClient 是一个模拟的 Websocket 客户端, 内含回调函数, 可以重复调用 connect() 函数.

举个例子

val liveClient = LiveClient(roomId = 23058) {
    resolvedPackets.consumeEach {
        when (it) {
            is CommandPacket -> {
                val command = it.content
                println("[${command.cmd}] $command")
            }
            is PopularityPacket -> {
                println("Popularity: ${it.content}")
            }
        }
    }
}
runBlocking {
    liveClient.connect()
}

resolvedPackets 是一个输送解析后的数据包的 Channel, 解析后的数据包有 CommandPacket 以及 PopularityPacket 两种类型.

CommandPacket 的本体是一段 JSON, 由于其内容经常发生改变, 所以不提供 POJO.

Command.cmd 是一个快捷方式, 可以快速取得其中的 cmd 字段从而判断其类别.

作为样本的 JSON 数据在本项目 /record 文件夹下.

大部分 JSON 都有光怪陆离的数据结构. 其中 DANMU_MSG 尤为恶劣, 通篇都是数组. 为了方便对其解析, 故提供内联类 DanmakuMessage.

使用方法如下

val command = commandPacket.content
if (command.cmd == "DANMU_MSG") {
    with(command.asDanmakuMessage()) {
        println("$nickname: $message")
    }
}

PopularityPacket 的本体是一个 Int 数字, 表示当前房间的人气值. 该数据包每 30秒 收到一次.

如果要为读取操作设定超时, 可以设定为 40秒.

注意: 如果使用短房间号来连接弹幕推送服务器, 可能会得不到正确的人气值信息(一直为 0 或者一直为 1). 因此在连接弹幕推送服务器前应当首先获取直播间基本信息. 同时, 弹幕服务器不是唯一的, 在构造 LiveClient 时可以传入其他服务器地址.

License

Apache License 2.0

Description
Bilibili API library for Kotlin
Readme 1.1 MiB
Languages
Kotlin 98.3%
Java 1.7%