fix: fix bili card share bug and improve bv parser

This commit is contained in:
2024-09-13 16:19:54 +08:00
parent cd9fec51b6
commit a6d82190b6
6 files changed
+52 -18

No files matched your search

@@ -58,9 +58,7 @@ class FancyBot : OBMessage {
if (message.rawMessage.startsWith("https://github.com/") || if (message.rawMessage.startsWith("https://github.com/") ||
message.rawMessage.startsWith("git@github.com:") || message.rawMessage.startsWith("git@github.com:") ||
(message.rawMessage.split("/").size == 2 && message.rawMessage.split("/").first().isNotEmpty()) (message.rawMessage.split("/").size == 2 && message.rawMessage.split("/").first().isNotEmpty())
) { ) GitHubParseCommand.parse(this, message)
GitHubParseCommand.parse(this, message)
}
if (message.rawMessage.startsWith("BV") || if (message.rawMessage.startsWith("BV") ||
message.rawMessage.startsWith("https://www.bilibili.com") || message.rawMessage.startsWith("https://www.bilibili.com") ||
@@ -70,14 +68,19 @@ class FancyBot : OBMessage {
// parse bilibili video with a link, bvid or b23.tv link // parse bilibili video with a link, bvid or b23.tv link
val bvid = if (message.rawMessage.startsWith("BV")) { val bvid = if (message.rawMessage.startsWith("BV")) {
message.rawMessage message.rawMessage
} else if (message.rawMessage.contains("https://b23.tv/")) { } else if (message.rawMessage.split(" ").last().startsWith("https://b23.tv/")) {
val shortUrl = message.rawMessage.split(" ").last() val shortUrl = message.rawMessage.split(" ").last()
BVParseCommand.getShortUrlBVID(shortUrl) BVParseCommand.getShortUrlBVID(shortUrl)
} else if (message.message.find { it.type == ArrayMessageType.json } != null) { } else if (message.message.find { it.type == ArrayMessageType.json } != null) {
val card = message.message.find { it.type == ArrayMessageType.json }!! val card = message.message.find { it.type == ArrayMessageType.json }!!
.data.data!!.toString().fromJson<CardShare>() .data.data!!.toString().fromJson<CardShare>()
val shortUrl = if (card.meta.detail == null) {
if (!card.meta.news?.tag!!.contains("哔哩哔哩")) return
card.meta.news.jumpUrl
} else {
if (!card.meta.detail.title.contains("哔哩哔哩")) return if (!card.meta.detail.title.contains("哔哩哔哩")) return
val shortUrl = card.meta.detail.qqDocUrl card.meta.detail.qqDocUrl
}
BVParseCommand.getShortUrlBVID(shortUrl) BVParseCommand.getShortUrlBVID(shortUrl)
} else { } else {
message.rawMessage.split("/")[4] message.rawMessage.split("/")[4]
@@ -8,10 +8,12 @@
package cn.rtast.fancybot.commands.parse package cn.rtast.fancybot.commands.parse
import cn.rtast.fancybot.entity.bili.BVID import cn.rtast.fancybot.entity.bili.BVID
import cn.rtast.fancybot.entity.bili.UserStat
import cn.rtast.fancybot.util.Http import cn.rtast.fancybot.util.Http
import cn.rtast.fancybot.util.Resources import cn.rtast.fancybot.util.Resources
import cn.rtast.fancybot.util.drawCustomImage import cn.rtast.fancybot.util.drawCustomImage
import cn.rtast.fancybot.util.str.encodeToBase64 import cn.rtast.fancybot.util.str.encodeToBase64
import cn.rtast.fancybot.util.str.formatNumber
import cn.rtast.fancybot.util.str.setTruncat import cn.rtast.fancybot.util.str.setTruncat
import cn.rtast.rob.entity.GroupMessage import cn.rtast.rob.entity.GroupMessage
import cn.rtast.rob.util.ob.MessageChain import cn.rtast.rob.util.ob.MessageChain
@@ -29,6 +31,7 @@ import javax.imageio.ImageIO
object BVParseCommand { object BVParseCommand {
private const val CID_URL = "https://api.bilibili.com/x/web-interface/view" private const val CID_URL = "https://api.bilibili.com/x/web-interface/view"
private const val USER_STAT_URL = "https://api.bilibili.com/x/relation/stat"
private const val CANVAS_WIDTH = 1000 private const val CANVAS_WIDTH = 1000
private const val CANVAS_HEIGHT = 600 private const val CANVAS_HEIGHT = 600
private val titleFont = Font("Serif", Font.ITALIC, 40).deriveFont(Font.ITALIC) private val titleFont = Font("Serif", Font.ITALIC, 40).deriveFont(Font.ITALIC)
@@ -51,15 +54,6 @@ object BVParseCommand {
} }
} }
private fun Int.formatNumber(): String {
return if (this >= 10000) {
val result = this / 10000.0
String.format("%.1f万", result)
} else {
this.toString()
}
}
private fun createResponseImage( private fun createResponseImage(
title: String, title: String,
author: String, author: String,
@@ -70,7 +64,8 @@ object BVParseCommand {
coin: String, coin: String,
share: String, share: String,
like: String, like: String,
favorite: String favorite: String,
fans: Int,
): String { ): String {
val coverImage = ImageIO.read(URI(picUrl).toURL()) val coverImage = ImageIO.read(URI(picUrl).toURL())
val faceImage = ImageIO.read(URI(authorFace).toURL()) val faceImage = ImageIO.read(URI(authorFace).toURL())
@@ -106,6 +101,9 @@ object BVParseCommand {
g2d.drawCustomImage(likeIcon, 40, 160, 50.0, 50.0, false) g2d.drawCustomImage(likeIcon, 40, 160, 50.0, 50.0, false)
// draw 22 logo // draw 22 logo
g2d.drawCustomImage(twoTwoLogo, 800, 450, 90.0, 160.0, false) g2d.drawCustomImage(twoTwoLogo, 800, 450, 90.0, 160.0, false)
// draw fans count
g2d.font = numberFont
g2d.drawString(fans.formatNumber() + "粉丝", 120, 520)
// draw author face // draw author face
g2d.drawCustomImage(faceImage, 40, 480, 60.0, 60.0, true) g2d.drawCustomImage(faceImage, 40, 480, 60.0, 60.0, true)
// draw cover image // draw cover image
@@ -119,6 +117,7 @@ object BVParseCommand {
suspend fun parse(listener: OBMessage, bvid: String, message: GroupMessage) { suspend fun parse(listener: OBMessage, bvid: String, message: GroupMessage) {
val videoInfo = Http.get<BVID>(CID_URL, mapOf("bvid" to bvid)) val videoInfo = Http.get<BVID>(CID_URL, mapOf("bvid" to bvid))
val fans = Http.get<UserStat>(USER_STAT_URL, mapOf("vmid" to videoInfo.data.owner.mid)).data.follower
val authorFace = videoInfo.data.owner.face val authorFace = videoInfo.data.owner.face
val title = videoInfo.data.title val title = videoInfo.data.title
val author = videoInfo.data.owner.name val author = videoInfo.data.owner.name
@@ -132,7 +131,7 @@ object BVParseCommand {
val image = this.createResponseImage( val image = this.createResponseImage(
title, author, authorFace, title, author, authorFace,
coverPicUrl, reply, view, coin, coverPicUrl, reply, view, coin,
share, like, favorite share, like, favorite, fans
) )
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
.addReply(message.messageId) .addReply(message.messageId)
@@ -19,6 +19,7 @@ data class BVID(
) )
data class Owner( data class Owner(
val mid: Long,
val name: String, val name: String,
val face: String, val face: String,
) )
@@ -14,7 +14,8 @@ data class CardShare(
) { ) {
data class Meta( data class Meta(
@SerializedName("detail_1") @SerializedName("detail_1")
val detail: Detail val detail: Detail?,
val news: News?
) )
data class Detail( data class Detail(
@@ -22,4 +23,9 @@ data class CardShare(
@SerializedName("qqdocurl") @SerializedName("qqdocurl")
val qqDocUrl: String, val qqDocUrl: String,
) )
data class News(
val tag: String,
val jumpUrl: String
)
} }
@@ -0,0 +1,16 @@
/*
* Copyright © 2024 RTAkland
* Author: RTAkland
* Date: 2024/9/13
*/
package cn.rtast.fancybot.entity.bili
data class UserStat(
val data: Data
) {
data class Data(
val follower: Int
)
}
@@ -22,3 +22,12 @@ fun setTruncat(origin: String, g2d: Graphics2D, maxWidth: Int = 500): String {
origin.substring(0, endIndex) + "..." origin.substring(0, endIndex) + "..."
} else origin } else origin
} }
fun Int.formatNumber(): String {
return if (this >= 10000) {
val result = this / 10000.0
String.format("%.1f万", result)
} else {
this.toString()
}
}