From 9dd36cff2e7b4f2693f624b3dae574e8ec26358e Mon Sep 17 00:00:00 2001 From: czp3009 Date: Wed, 27 Feb 2019 00:05:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=95=B0=E6=8D=AE=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B,=20=E6=B7=BB=E5=8A=A0=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 ++++++++++- .../com/hiczp/bilibili/api/app/model/Mine.kt | 2 +- .../hiczp/bilibili/api/app/model/MyInfo.kt | 2 +- .../com/hiczp/bilibili/api/app/model/View.kt | 6 +- .../bilibili/api/main/model/BangumiPage.kt | 3 +- .../hiczp/bilibili/api/main/model/ChatList.kt | 13 ++-- .../bilibili/api/main/model/ChildReply.kt | 22 +++--- .../bilibili/api/main/model/MyBangumiNews.kt | 3 +- .../hiczp/bilibili/api/main/model/Reply.kt | 74 ++++++++++--------- .../hiczp/bilibili/api/test/FetchReplyTest.kt | 47 ++++++++++++ 10 files changed, 158 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 96310ed..8442fff 100644 --- a/README.md +++ b/README.md @@ -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() + val childReplies = HashMap>() + 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") +} +``` + ## 获得一个视频的弹幕 看评论自然不够刺激, 我们想看到弹幕! diff --git a/src/main/kotlin/com/hiczp/bilibili/api/app/model/Mine.kt b/src/main/kotlin/com/hiczp/bilibili/api/app/model/Mine.kt index 3e7bcf7..5d9f34e 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/app/model/Mine.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/app/model/Mine.kt @@ -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") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/app/model/MyInfo.kt b/src/main/kotlin/com/hiczp/bilibili/api/app/model/MyInfo.kt index 949b1ca..361470a 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/app/model/MyInfo.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/app/model/MyInfo.kt @@ -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") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/app/model/View.kt b/src/main/kotlin/com/hiczp/bilibili/api/app/model/View.kt index bcc3814..1e348db 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/app/model/View.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/app/model/View.kt @@ -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 ) diff --git a/src/main/kotlin/com/hiczp/bilibili/api/main/model/BangumiPage.kt b/src/main/kotlin/com/hiczp/bilibili/api/main/model/BangumiPage.kt index 8cae155..3b0c30e 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/main/model/BangumiPage.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/main/model/BangumiPage.kt @@ -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, + var headers: List, @SerializedName("items") var items: List, @SerializedName("module_id") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChatList.kt b/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChatList.kt index e21d06d..28ee362 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChatList.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChatList.kt @@ -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, + var members: List, @SerializedName("message") var message: String, // 回复 @***全副武装 :耶酥是佛教徒 @SerializedName("plat") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChildReply.kt b/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChildReply.kt index 2a5b11f..286bd63 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChildReply.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/main/model/ChildReply.kt @@ -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, @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, + var replies: List, // [] @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") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/main/model/MyBangumiNews.kt b/src/main/kotlin/com/hiczp/bilibili/api/main/model/MyBangumiNews.kt index 41e6de8..c6ce957 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/main/model/MyBangumiNews.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/main/model/MyBangumiNews.kt @@ -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, + var delay: List, @SerializedName("follow") var follow: Int, // 34 @SerializedName("follows") diff --git a/src/main/kotlin/com/hiczp/bilibili/api/main/model/Reply.kt b/src/main/kotlin/com/hiczp/bilibili/api/main/model/Reply.kt index cba5d1a..59e3e74 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/main/model/Reply.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/main/model/Reply.kt @@ -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, + var replies: List?, @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, @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, @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, @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, @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, @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") diff --git a/src/test/kotlin/com/hiczp/bilibili/api/test/FetchReplyTest.kt b/src/test/kotlin/com/hiczp/bilibili/api/test/FetchReplyTest.kt index 1c21e58..b2c7d16 100644 --- a/src/test/kotlin/com/hiczp/bilibili/api/test/FetchReplyTest.kt +++ b/src/test/kotlin/com/hiczp/bilibili/api/test/FetchReplyTest.kt @@ -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() + val childReplies = HashMap>() + 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") + } }