修正数据类型, 添加示例

This commit is contained in:
czp3009 2019-02-27 00:05:58 +08:00
parent f8f280e24d
commit 9dd36cff2e
10 changed files with 158 additions and 59 deletions

View File

@ -272,7 +272,7 @@ val childReply = bilibiliClient.mainAPI.childReply(oid = 16622855, root = 140560
假如一个人在一个评论的子评论里发布了一个评论并且 at 了其他人发的评论, 那么其 `parentId` 是他所 at 的评论, 其 `rootId` 为所在的根评论.
如果不满足对应的层级逻辑关系(例如本身为根评论), `parentId` `rootId` 可能为 0.
如果不满足对应的层级逻辑关系(例如本身为根评论), `parentId` `rootId` 可能为 0.
用额外的 `minId` 参数来指定返回的起始子楼层.
@ -290,6 +290,49 @@ val chatList = bilibiliClient.mainAPI.chatList(oid = 34175504, root = 1136310360
番剧下面的评论用一样的方式获取.
以下给出一个获取一个视频下的全部评论(包括子评论)的示例
```kotlin
fun printAllReplies() {
val aid = 44651998L
val start = System.currentTimeMillis()
val bilibiliClient = BilibiliClient()
runBlocking {
val rootReplies = LinkedList<Reply.Data.Reply>()
val childReplies = HashMap<Long, Deferred<ChildReply>>()
var next: Long? = null
while (true) {
val reply = bilibiliClient.mainAPI.reply(oid = aid, next = next).await()
reply.data.replies.also {
rootReplies.addAll(it)
}.asSequence().filterNot {
it.rcount == 0 //去除没有子评论的根评论
}.forEach {
childReplies[it.rpid] = bilibiliClient.mainAPI.childReply(oid = aid, root = it.rpid, size = Int.MAX_VALUE)
}
//如果已经是最后一页
if (reply.data.cursor.isEnd) break
next = reply.data.cursor.next
}
//输出
rootReplies.forEach { rootReply ->
println(rootReply.content.message)
val childReply = childReplies[rootReply.rpid]
childReply?.await()?.data?.root?.replies?.forEach {
println("└──${it.content.message}")
}
}
}
val end = System.currentTimeMillis()
println("Done in ${end - start} ms")
}
```
## 获得一个视频的弹幕
看评论自然不够刺激, 我们想看到弹幕!

View File

@ -30,7 +30,7 @@ data class Mine(
@SerializedName("level")
var level: Int, // 5
@SerializedName("mid")
var mid: Int, // 2866663
var mid: Long, // 2866663
@SerializedName("name")
var name: String, // hyx5020
@SerializedName("new_followers")

View File

@ -26,7 +26,7 @@ data class MyInfo(
@SerializedName("level")
var level: Int, // 4
@SerializedName("mid")
var mid: Int, // 20293030
var mid: Long, // 20293030
@SerializedName("name")
var name: String, // czp3009
@SerializedName("official")

View File

@ -96,7 +96,7 @@ data class View(
@SerializedName("face")
var face: String, // http://i1.hdslb.com/bfs/face/9a586d1ef659b322af150c925976a134ad046a74.jpg
@SerializedName("mid")
var mid: Int, // 393484294
var mid: Long, // 393484294
@SerializedName("name")
var name: String // 娱乐酱鸭
)
@ -234,7 +234,7 @@ data class View(
@SerializedName("face")
var face: String, // http://i1.hdslb.com/bfs/face/9a586d1ef659b322af150c925976a134ad046a74.jpg
@SerializedName("mid")
var mid: Int, // 393484294
var mid: Long, // 393484294
@SerializedName("name")
var name: String, // 娱乐酱鸭
@SerializedName("official_verify")
@ -314,7 +314,7 @@ data class View(
@SerializedName("face")
var face: String, // http://static.hdslb.com/images/member/noface.gif
@SerializedName("mid")
var mid: Int, // 334512441
var mid: Long, // 334512441
@SerializedName("name")
var name: String // 达岸电影2018
)

View File

@ -1,5 +1,6 @@
package com.hiczp.bilibili.api.main.model
import com.google.gson.JsonElement
import com.google.gson.annotations.SerializedName
data class BangumiPage(
@ -20,7 +21,7 @@ data class BangumiPage(
@SerializedName("attr")
var attr: Attr,
@SerializedName("headers")
var headers: List<Any>,
var headers: List<JsonElement>,
@SerializedName("items")
var items: List<Item>,
@SerializedName("module_id")

View File

@ -1,5 +1,6 @@
package com.hiczp.bilibili.api.main.model
import com.google.gson.JsonElement
import com.google.gson.annotations.SerializedName
data class ChatList(
@ -50,9 +51,9 @@ data class ChatList(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 161745277
var mid: Long, // 161745277
@SerializedName("oid")
var oid: Int, // 34175504
var oid: Long, // 34175504
@SerializedName("parent")
var parent: Int, // 1136656601
@SerializedName("parent_str")
@ -60,7 +61,7 @@ data class ChatList(
@SerializedName("rcount")
var rcount: Int, // 0
@SerializedName("replies")
var replies: Any?, // null
var replies: JsonElement?, // null
@SerializedName("root")
var root: Int, // 1136310360
@SerializedName("root_str")
@ -89,7 +90,7 @@ data class ChatList(
@SerializedName("avatar")
var avatar: String, // http://static.hdslb.com/images/member/noface.gif
@SerializedName("fans_detail")
var fansDetail: Any?, // null
var fansDetail: JsonElement?, // null
@SerializedName("following")
var following: Int, // 0
@SerializedName("level_info")
@ -115,7 +116,7 @@ data class ChatList(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 0
var expire: Long, // 0
@SerializedName("image")
var image: String,
@SerializedName("name")
@ -177,7 +178,7 @@ data class ChatList(
@SerializedName("device")
var device: String, // phone
@SerializedName("members")
var members: List<Any>,
var members: List<JsonElement>,
@SerializedName("message")
var message: String, // 回复 @***全副武装 :耶酥是佛教徒
@SerializedName("plat")

View File

@ -84,11 +84,11 @@ data class ChildReply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 14363383
var mid: Long, // 14363383
@SerializedName("oid")
var oid: Int, // 16622855
var oid: Long, // 16622855
@SerializedName("parent")
var parent: Int, // 0
var parent: Long, // 0
@SerializedName("parent_str")
var parentStr: String, // 0
@SerializedName("rcount")
@ -96,7 +96,7 @@ data class ChildReply(
@SerializedName("replies")
var replies: List<Reply>,
@SerializedName("root")
var root: Int, // 0
var root: Long, // 0
@SerializedName("root_str")
var rootStr: String, // 0
@SerializedName("rpid")
@ -147,19 +147,19 @@ data class ChildReply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 14363383
var mid: Long, // 14363383
@SerializedName("oid")
var oid: Int, // 16622855
var oid: Long, // 16622855
@SerializedName("parent")
var parent: Int, // 1405602348
var parent: Long, // 1405602348
@SerializedName("parent_str")
var parentStr: String, // 1405602348
@SerializedName("rcount")
var rcount: Int, // 0
@SerializedName("replies")
var replies: List<JsonElement>,
var replies: List<JsonElement>, // []
@SerializedName("root")
var root: Int, // 1405602348
var root: Long, // 1405602348
@SerializedName("root_str")
var rootStr: String, // 1405602348
@SerializedName("rpid")
@ -223,7 +223,7 @@ data class ChildReply(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 0
var expire: Long, // 0
@SerializedName("image")
var image: String,
@SerializedName("name")
@ -341,7 +341,7 @@ data class ChildReply(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 0
var expire: Long, // 0
@SerializedName("image")
var image: String,
@SerializedName("name")

View File

@ -1,5 +1,6 @@
package com.hiczp.bilibili.api.main.model
import com.google.gson.JsonElement
import com.google.gson.annotations.SerializedName
data class MyBangumiNews(
@ -12,7 +13,7 @@ data class MyBangumiNews(
) {
data class Result(
@SerializedName("delay")
var delay: List<Any>,
var delay: List<JsonElement>,
@SerializedName("follow")
var follow: Int, // 34
@SerializedName("follows")

View File

@ -74,19 +74,25 @@ data class Reply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 14028833
var mid: Long, // 14028833
@SerializedName("oid")
var oid: Int, // 44012857
var oid: Long, // 44012857
@SerializedName("parent")
var parent: Int, // 0
var parent: Long, // 0
@SerializedName("parent_str")
var parentStr: String, // 0
/**
* 评论数量
*/
@SerializedName("rcount")
var rcount: Int, // 1
/**
* 如果 replies null 说明没有评论
*/
@SerializedName("replies")
var replies: List<Reply>,
var replies: List<Reply>?,
@SerializedName("root")
var root: Int, // 0
var root: Long, // 0
@SerializedName("root_str")
var rootStr: String, // 0
@SerializedName("rpid")
@ -155,11 +161,11 @@ data class Reply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 14674816
var mid: Long, // 14674816
@SerializedName("oid")
var oid: Int, // 44012857
var oid: Long, // 44012857
@SerializedName("parent")
var parent: Int, // 1405424731
var parent: Long, // 1405424731
@SerializedName("parent_str")
var parentStr: String, // 1405424731
@SerializedName("rcount")
@ -167,7 +173,7 @@ data class Reply(
@SerializedName("replies")
var replies: List<JsonElement>,
@SerializedName("root")
var root: Int, // 1405424731
var root: Long, // 1405424731
@SerializedName("root_str")
var rootStr: String, // 1405424731
@SerializedName("rpid")
@ -240,7 +246,7 @@ data class Reply(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 0
var expire: Long, // 0
@SerializedName("image")
var image: String,
@SerializedName("name")
@ -331,7 +337,7 @@ data class Reply(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 0
var expire: Long, // 0
@SerializedName("image")
var image: String,
@SerializedName("name")
@ -392,7 +398,7 @@ data class Reply(
data class Upper(
@SerializedName("mid")
var mid: Int // 11248627
var mid: Long // 11248627
)
data class Config(
@ -418,7 +424,7 @@ data class Reply(
@SerializedName("mode")
var mode: Int, // 1
@SerializedName("next")
var next: Int, // 295
var next: Long, // 295
@SerializedName("prev")
var prev: Int, // 314
@SerializedName("support_mode")
@ -453,11 +459,11 @@ data class Reply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 7937795
var mid: Long, // 7937795
@SerializedName("oid")
var oid: Int, // 44012857
var oid: Long, // 44012857
@SerializedName("parent")
var parent: Int, // 0
var parent: Long, // 0
@SerializedName("parent_str")
var parentStr: String, // 0
@SerializedName("rcount")
@ -465,7 +471,7 @@ data class Reply(
@SerializedName("replies")
var replies: List<Reply>,
@SerializedName("root")
var root: Int, // 0
var root: Long, // 0
@SerializedName("root_str")
var rootStr: String, // 0
@SerializedName("rpid")
@ -531,7 +537,7 @@ data class Reply(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 1565150481
var expire: Long, // 1565150481
@SerializedName("image")
var image: String, // http://i2.hdslb.com/bfs/face/5ac24fa22208f48126bfacb42901e932946f6aa3.png
@SerializedName("name")
@ -643,11 +649,11 @@ data class Reply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 27407505
var mid: Long, // 27407505
@SerializedName("oid")
var oid: Int, // 44012857
var oid: Long, // 44012857
@SerializedName("parent")
var parent: Int, // 1400028639
var parent: Long, // 1400028639
@SerializedName("parent_str")
var parentStr: String, // 1400028639
@SerializedName("rcount")
@ -655,7 +661,7 @@ data class Reply(
@SerializedName("replies")
var replies: List<JsonElement>,
@SerializedName("root")
var root: Int, // 1400028639
var root: Long, // 1400028639
@SerializedName("root_str")
var rootStr: String, // 1400028639
@SerializedName("rpid")
@ -738,7 +744,7 @@ data class Reply(
data class Pendant(
@SerializedName("expire")
var expire: Int, // 1551514981
var expire: Long, // 1551514981
@SerializedName("image")
var image: String, // http://i0.hdslb.com/bfs/face/ec152705d82f96381f1150058d55e057396f0576.png
@SerializedName("name")
@ -824,11 +830,11 @@ data class Reply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 11248627
var mid: Long, // 11248627
@SerializedName("oid")
var oid: Int, // 44012857
var oid: Long, // 44012857
@SerializedName("parent")
var parent: Int, // 0
var parent: Long, // 0
@SerializedName("parent_str")
var parentStr: String, // 0
@SerializedName("rcount")
@ -836,7 +842,7 @@ data class Reply(
@SerializedName("replies")
var replies: List<Reply>,
@SerializedName("root")
var root: Int, // 0
var root: Long, // 0
@SerializedName("root_str")
var rootStr: String, // 0
@SerializedName("rpid")
@ -887,11 +893,11 @@ data class Reply(
@SerializedName("member")
var member: Member,
@SerializedName("mid")
var mid: Int, // 85049857
var mid: Long, // 85049857
@SerializedName("oid")
var oid: Int, // 44012857
var oid: Long, // 44012857
@SerializedName("parent")
var parent: Int, // 1401606362
var parent: Long, // 1401606362
@SerializedName("parent_str")
var parentStr: String, // 1401606362
@SerializedName("rcount")
@ -899,7 +905,7 @@ data class Reply(
@SerializedName("replies")
var replies: List<JsonElement>,
@SerializedName("root")
var root: Int, // 1401074923
var root: Long, // 1401074923
@SerializedName("root_str")
var rootStr: String, // 1401074923
@SerializedName("rpid")
@ -945,7 +951,7 @@ data class Reply(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 0
var expire: Long, // 0
@SerializedName("image")
var image: String,
@SerializedName("name")
@ -1048,7 +1054,7 @@ data class Reply(
) {
data class Pendant(
@SerializedName("expire")
var expire: Int, // 0
var expire: Long, // 0
@SerializedName("image")
var image: String,
@SerializedName("name")
@ -1200,7 +1206,7 @@ data class Reply(
data class Pendant(
@SerializedName("expire")
var expire: Int, // 1570032000
var expire: Long, // 1570032000
@SerializedName("image")
var image: String, // http://i1.hdslb.com/bfs/face/14738b92760b90675d4bf35dd059b0a666113bae.png
@SerializedName("name")

View File

@ -1,7 +1,13 @@
package com.hiczp.bilibili.api.test
import com.hiczp.bilibili.api.BilibiliClient
import com.hiczp.bilibili.api.main.model.ChildReply
import com.hiczp.bilibili.api.main.model.Reply
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.runBlocking
import org.junit.jupiter.api.Test
import java.util.*
import kotlin.collections.HashMap
class FetchReplyTest {
@Test
@ -17,4 +23,45 @@ class FetchReplyTest {
noLoginBilibiliClient.mainAPI.childReply(oid = 16622855, root = 1405602348).await()
}
}
//打印一个视频下全部的评论
@Test
fun printAllReplies() {
val aid = 44651998L
val start = System.currentTimeMillis()
val bilibiliClient = BilibiliClient()
runBlocking {
val rootReplies = LinkedList<Reply.Data.Reply>()
val childReplies = HashMap<Long, Deferred<ChildReply>>()
var next: Long? = null
while (true) {
val reply = bilibiliClient.mainAPI.reply(oid = aid, next = next).await()
reply.data.replies.also {
rootReplies.addAll(it)
}.asSequence().filterNot {
it.rcount == 0 //去除没有子评论的根评论
}.forEach {
childReplies[it.rpid] = bilibiliClient.mainAPI.childReply(oid = aid, root = it.rpid, size = Int.MAX_VALUE)
}
//如果已经是最后一页
if (reply.data.cursor.isEnd) break
next = reply.data.cursor.next
}
//输出
rootReplies.forEach { rootReply ->
println(rootReply.content.message)
val childReply = childReplies[rootReply.rpid]
childReply?.await()?.data?.root?.replies?.forEach {
println("└──${it.content.message}")
}
}
}
val end = System.currentTimeMillis()
println("Done in ${end - start} ms")
}
}