diff --git a/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/bldm.kt b/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/bldm.kt index d4e958b..bc9c537 100644 --- a/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/bldm.kt +++ b/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/bldm.kt @@ -7,16 +7,15 @@ package cn.rtast.bldm.client import cn.rtast.bldm.client.util.fromJson +import cn.rtast.bldm.client.util.parseBuvidAndUid import cn.rtast.bldm.client.util.sendPacket import cn.rtast.bldm.codec.event.DanmuEventDispatcher import cn.rtast.bldm.codec.protocol.codec.PacketDecoder import cn.rtast.bldm.codec.protocol.codec.PacketEncoder -import cn.rtast.bldm.codec.util.parseBuvidAndUid import cn.rtast.bldm.codec.util.signWbi -import cn.rtast.bldm.dto.BldmConstant -import cn.rtast.bldm.dto.DMServerConf -import cn.rtast.bldm.dto.RealRoomId -import cn.rtast.bldm.dto.UserNavData +import cn.rtast.bldm.dto.* +import io.ktor.client.* +import io.ktor.client.plugins.* import io.ktor.client.plugins.websocket.* import io.ktor.client.request.* import io.ktor.client.statement.* @@ -31,6 +30,16 @@ public class BldmClient internal constructor( ) : DanmuEventDispatcher(), AutoCloseable { private companion object { private val HEARTBEAT_INTERVAL = 30.seconds + private const val USER_AGENT = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36" + } + + private val httpClient = HttpClient { + install(WebSockets) + + defaultRequest { + header(HttpHeaders.UserAgent, USER_AGENT) + } } private val packetEncoder = PacketEncoder() @@ -39,8 +48,12 @@ public class BldmClient internal constructor( private var connectionJob: Job? = null private var session: DefaultClientWebSocketSession? = null + private suspend fun getBuvidFromApi(): String = + httpClient.get(BldmConstant.BUVID_URL) + .bodyAsText().fromJson() + .data.buvid + private suspend fun internalConnect() { - val parsedCookie = parseBuvidAndUid(cookie ?: "") val realRoomId = httpClient.get(BldmConstant.REAL_ROOM_ID_URL + "?id=$roomId") .bodyAsText().fromJson() val navData = httpClient.get(BldmConstant.USER_NAV_URL) @@ -49,14 +62,13 @@ public class BldmClient internal constructor( val serverConf = httpClient.get(BldmConstant.DM_SERVER_CONF_URL + "?$wbi") { cookie?.let { header(HttpHeaders.Cookie, it) } }.bodyAsText().fromJson().data - + val parsedCookie = parseBuvidAndUid(cookie ?: "") + val buvid = if (cookie == null) getBuvidFromApi() else parsedCookie.first!! + val uid = if (cookie == null) 0 else parsedCookie.second!! httpClient.webSocket(serverConf.hostList.first().tlsWsAddress) { session = this val authPacket = packetEncoder.authPacket( - parsedCookie.second ?: 0, - realRoomId.data.roomId, - parsedCookie.first ?: "", - serverConf.token + uid, realRoomId.data.roomId, buvid, serverConf.token ) sendPacket(authPacket) val heartbeatJob = launch { diff --git a/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/constant.kt b/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/constant.kt deleted file mode 100644 index 0dd02ea..0000000 --- a/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/constant.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright © 2026 RTAkland - * Author: RTAkland - * Date: 2026/8/30 - */ - - -package cn.rtast.bldm.client - -import io.ktor.client.* -import io.ktor.client.plugins.defaultRequest -import io.ktor.client.plugins.websocket.* -import io.ktor.client.request.header -import io.ktor.http.HttpHeaders - -internal val httpClient = HttpClient { - install(WebSockets) - - defaultRequest { - header(HttpHeaders.UserAgent, USER_AGENT) - } -} - -internal const val USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36" \ No newline at end of file diff --git a/bl-codec/src/commonMain/kotlin/cn/rtast/bldm/codec/util/_cookie_parser.kt b/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/util/_cookie_parser.kt similarity index 95% rename from bl-codec/src/commonMain/kotlin/cn/rtast/bldm/codec/util/_cookie_parser.kt rename to bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/util/_cookie_parser.kt index fe02e10..3f651a2 100644 --- a/bl-codec/src/commonMain/kotlin/cn/rtast/bldm/codec/util/_cookie_parser.kt +++ b/bl-client/src/commonMain/kotlin/cn/rtast/bldm/client/util/_cookie_parser.kt @@ -5,7 +5,7 @@ */ -package cn.rtast.bldm.codec.util +package cn.rtast.bldm.client.util /** * get buvid and uid from a cookie diff --git a/bl-client/src/commonTest/kotlin/test/TestClient.kt b/bl-client/src/commonTest/kotlin/test/TestClient.kt index bf9fcf4..07aff06 100644 --- a/bl-client/src/commonTest/kotlin/test/TestClient.kt +++ b/bl-client/src/commonTest/kotlin/test/TestClient.kt @@ -9,14 +9,12 @@ package test import cn.rtast.bldm.client.BLDMClient import cn.rtast.bldm.codec.event.DanmuEvent -import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest import kotlinx.io.buffered import kotlinx.io.files.Path import kotlinx.io.files.SystemFileSystem import kotlinx.io.readString import kotlin.test.Test -import kotlin.time.Duration.Companion.seconds class TestClient { @@ -25,7 +23,7 @@ class TestClient { @Test fun `test bldm client`() = runTest { - val client = BLDMClient(7777, cookie) + val client = BLDMClient(55, null) client.on { println("Heartbeat") } client.on { println("AuthReply") } client.on { println(it.content) } diff --git a/bl-model/src/commonMain/kotlin/cn/rtast/bldm/dto/BldmConstant.kt b/bl-model/src/commonMain/kotlin/cn/rtast/bldm/dto/BldmConstant.kt index b770222..7a7735f 100644 --- a/bl-model/src/commonMain/kotlin/cn/rtast/bldm/dto/BldmConstant.kt +++ b/bl-model/src/commonMain/kotlin/cn/rtast/bldm/dto/BldmConstant.kt @@ -10,6 +10,7 @@ package cn.rtast.bldm.dto public object BldmConstant { public const val REAL_ROOM_ID_URL: String = "https://api.live.bilibili.com/room/v1/Room/room_init" public const val USER_NAV_URL: String = "https://api.bilibili.com/x/web-interface/nav" + public const val BUVID_URL: String = "https://api.bilibili.com/x/web-frontend/getbuvid" public const val DM_SERVER_CONF_URL: String = "https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo" } \ No newline at end of file diff --git a/bl-model/src/commonMain/kotlin/cn/rtast/bldm/dto/Buvid.kt b/bl-model/src/commonMain/kotlin/cn/rtast/bldm/dto/Buvid.kt new file mode 100644 index 0000000..c4dccb2 --- /dev/null +++ b/bl-model/src/commonMain/kotlin/cn/rtast/bldm/dto/Buvid.kt @@ -0,0 +1,16 @@ +/* + * Copyright © 2026 RTAkland + * Author: RTAkland + * Date: 2026/8/31 + */ + + +package cn.rtast.bldm.dto + +import kotlinx.serialization.Serializable + +@Serializable +public data class Buvid(val data: BuvidData) { + @Serializable + public data class BuvidData(val buvid: String) +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index f4ebe39..9f0eba5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,12 +20,24 @@ subprojects { publishing { repositories { - maven("https://repo.maven.rtast.cn/snapshots") { + maven("https://repo.maven.rtast.cn/releases") { + name = "RTAST-PKG" credentials { username = "RTAkland" password = System.getenv("PUBLISH_TOKEN") } } + maven("https://repo.rtast.cn/packages") { + name = "RTAST-GIT" + credentials(HttpHeaderCredentials::class) { + name = "Authorization" + value = "Bearer ${System.getenv("PUBLISH_TOKEN")}" + } + + authentication { + create("header") + } + } } } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index bf25ecc..6d0810c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,4 @@ kotlin.code.style=official org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError kotlin.native.ignoreDisabledTargets=true -libVersion=0.1.0 \ No newline at end of file +libVersion=0.1.1 \ No newline at end of file