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