From a537850560011d96547e05513e9356a75aab8688 Mon Sep 17 00:00:00 2001 From: RTAkland Date: Thu, 12 Sep 2024 13:06:13 +0800 Subject: [PATCH] feat: support card share bili video parse --- src/main/kotlin/cn/rtast/fancybot/FancyBot.kt | 21 ++++++++-------- .../fancybot/cmd/GenerateDefaultConfig.kt | 2 +- .../rtast/fancybot/commands/MCPingCommand.kt | 2 +- .../fancybot/commands/misc/BVParseCommand.kt | 12 +++++++++ .../rtast/fancybot/entity/bili/CardShare.kt | 25 +++++++++++++++++++ .../kotlin/cn/rtast/fancybot/util/Http.kt | 1 + .../cn/rtast/fancybot/util/JsonFileHandler.kt | 2 ++ .../cn/rtast/fancybot/util/{ => str}/Json.kt | 2 +- 8 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 src/main/kotlin/cn/rtast/fancybot/entity/bili/CardShare.kt rename src/main/kotlin/cn/rtast/fancybot/util/{ => str}/Json.kt (92%) diff --git a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt index d67be62..828d179 100644 --- a/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt +++ b/src/main/kotlin/cn/rtast/fancybot/FancyBot.kt @@ -11,6 +11,7 @@ import cn.rtast.fancybot.commands.* import cn.rtast.fancybot.commands.misc.BVParseCommand import cn.rtast.fancybot.commands.misc.ImageURLCommand import cn.rtast.fancybot.commands.misc.ReverseGIFCommand +import cn.rtast.fancybot.entity.bili.CardShare import cn.rtast.fancybot.entity.enums.WSType import cn.rtast.fancybot.items.BaisiItem import cn.rtast.fancybot.items.HeisiItem @@ -20,6 +21,7 @@ import cn.rtast.fancybot.util.file.NiuziManager import cn.rtast.fancybot.util.file.SignManager import cn.rtast.fancybot.util.initDatabase import cn.rtast.fancybot.util.item.ItemManager +import cn.rtast.fancybot.util.str.fromJson import cn.rtast.rob.ROneBotFactory import cn.rtast.rob.entity.GetMessage import cn.rtast.rob.entity.GroupMessage @@ -27,13 +29,9 @@ import cn.rtast.rob.entity.GroupRevokeMessage import cn.rtast.rob.enums.ArrayMessageType import cn.rtast.rob.util.ob.MessageChain import cn.rtast.rob.util.ob.OBMessage -import okhttp3.OkHttpClient -import okhttp3.Request class FancyBot : OBMessage { - private val tempOkHttpClient = OkHttpClient() - override suspend fun onGroupMessage(message: GroupMessage, json: String) { val sender = message.sender.nickname val senderId = message.sender.userId @@ -42,18 +40,21 @@ class FancyBot : OBMessage { println("$sender($senderId: $groupId): $msg") if (message.rawMessage.startsWith("BV") || message.rawMessage.startsWith("https://www.bilibili.com") || - message.rawMessage.contains("https://b23.tv/") + message.rawMessage.contains("https://b23.tv/") || + message.message.find { it.type == ArrayMessageType.json } != null ) { // parse bilibili video with a link, bvid or b23.tv link val bvid = if (message.rawMessage.startsWith("BV")) { message.rawMessage } else if (message.rawMessage.contains("https://b23.tv/")) { val shortUrl = message.rawMessage.split(" ").last() - val request = Request.Builder().url(shortUrl).build() - val redirectedUrl = tempOkHttpClient.newCall(request).execute() - redirectedUrl.use { - it.request.url.toString().split("/")[4].split("?").first() - } + BVParseCommand.getShortUrlBVID(shortUrl) + } else if (message.message.find { it.type == ArrayMessageType.json } != null) { + val card = message.message.find { it.type == ArrayMessageType.json }!! + .data.data!!.toString().fromJson() + if (!card.meta.detail.title.contains("哔哩哔哩")) return + val shortUrl = card.meta.detail.qqDocUrl + BVParseCommand.getShortUrlBVID(shortUrl) } else { message.rawMessage.split("/")[4] } diff --git a/src/main/kotlin/cn/rtast/fancybot/cmd/GenerateDefaultConfig.kt b/src/main/kotlin/cn/rtast/fancybot/cmd/GenerateDefaultConfig.kt index 369d24e..33f512b 100644 --- a/src/main/kotlin/cn/rtast/fancybot/cmd/GenerateDefaultConfig.kt +++ b/src/main/kotlin/cn/rtast/fancybot/cmd/GenerateDefaultConfig.kt @@ -8,7 +8,7 @@ package cn.rtast.fancybot.cmd import cn.rtast.fancybot.DEFAULT_CONFIG -import cn.rtast.fancybot.util.toJson +import cn.rtast.fancybot.util.str.toJson import java.io.File fun main() { diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt index 4171d72..e1f3fd5 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/MCPingCommand.kt @@ -8,7 +8,7 @@ package cn.rtast.fancybot.commands import cn.rtast.fancybot.entity.MCPing -import cn.rtast.fancybot.util.fromJson +import cn.rtast.fancybot.util.str.fromJson import cn.rtast.motdpinger.MotdPinger import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.util.BaseCommand diff --git a/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt b/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt index 30a1d02..6dcab14 100644 --- a/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt +++ b/src/main/kotlin/cn/rtast/fancybot/commands/misc/BVParseCommand.kt @@ -14,6 +14,8 @@ import cn.rtast.fancybot.util.str.encodeToBase64 import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.util.ob.MessageChain import cn.rtast.rob.util.ob.OBMessage +import okhttp3.OkHttpClient +import okhttp3.Request import java.awt.Color import java.awt.Font import java.awt.Graphics2D @@ -38,6 +40,16 @@ object BVParseCommand { private val favoriteIcon = ImageIO.read(Resources.loadFromResources("bili/favorite.png")) private val replyIcon = ImageIO.read(Resources.loadFromResources("bili/reply.png")) + private val tempOkHttpClient = OkHttpClient() + + fun getShortUrlBVID(shortUrl: String): String { + val request = Request.Builder().url(shortUrl.split(" ").last()).build() + val redirectedUrl = tempOkHttpClient.newCall(request).execute() + redirectedUrl.use { + return it.request.url.toString().split("/")[4].split("?").first() + } + } + private fun Int.formatNumber(): String { return if (this >= 10000) { val result = this / 10000.0 diff --git a/src/main/kotlin/cn/rtast/fancybot/entity/bili/CardShare.kt b/src/main/kotlin/cn/rtast/fancybot/entity/bili/CardShare.kt new file mode 100644 index 0000000..e91575d --- /dev/null +++ b/src/main/kotlin/cn/rtast/fancybot/entity/bili/CardShare.kt @@ -0,0 +1,25 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/9/12 + */ + + +package cn.rtast.fancybot.entity.bili + +import com.google.gson.annotations.SerializedName + +data class CardShare( + val meta: Meta, +) { + data class Meta( + @SerializedName("detail_1") + val detail: Detail + ) + + data class Detail( + val title: String, + @SerializedName("qqdocurl") + val qqDocUrl: String, + ) +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/fancybot/util/Http.kt b/src/main/kotlin/cn/rtast/fancybot/util/Http.kt index 296e52c..376a84d 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/Http.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/Http.kt @@ -7,6 +7,7 @@ package cn.rtast.fancybot.util +import cn.rtast.fancybot.util.str.fromJson import okhttp3.Call import okhttp3.Callback import okhttp3.FormBody diff --git a/src/main/kotlin/cn/rtast/fancybot/util/JsonFileHandler.kt b/src/main/kotlin/cn/rtast/fancybot/util/JsonFileHandler.kt index d542f3d..941775a 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/JsonFileHandler.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/JsonFileHandler.kt @@ -9,6 +9,8 @@ package cn.rtast.fancybot.util import cn.rtast.fancybot.ROOT_PATH import cn.rtast.fancybot.gson +import cn.rtast.fancybot.util.str.fromArrayJson +import cn.rtast.fancybot.util.str.fromJson import java.io.File abstract class JsonFileHandler { diff --git a/src/main/kotlin/cn/rtast/fancybot/util/Json.kt b/src/main/kotlin/cn/rtast/fancybot/util/str/Json.kt similarity index 92% rename from src/main/kotlin/cn/rtast/fancybot/util/Json.kt rename to src/main/kotlin/cn/rtast/fancybot/util/str/Json.kt index 36b9775..ffdca53 100644 --- a/src/main/kotlin/cn/rtast/fancybot/util/Json.kt +++ b/src/main/kotlin/cn/rtast/fancybot/util/str/Json.kt @@ -5,7 +5,7 @@ */ -package cn.rtast.fancybot.util +package cn.rtast.fancybot.util.str import cn.rtast.fancybot.gson import com.google.gson.reflect.TypeToken