Skip to content

Commit 876e214

Browse files
修复 request was banned 请求错误 (#276)
* 修复 request was banned 请求错误 * 修复 pgc 接口请求错误 * 根据设备信息生成 UserAgent --------- Co-authored-by: aaa1115910 <aaa1115910@gmail.com>
1 parent 16f3ddb commit 876e214

File tree

12 files changed

+119
-25
lines changed

12 files changed

+119
-25
lines changed

app/shared/src/main/kotlin/dev/aaa1115910/bv/BVApp.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@ package dev.aaa1115910.bv
33
import android.annotation.SuppressLint
44
import android.app.Application
55
import android.content.Context
6+
import android.os.Build
67
import android.util.Log
78
import androidx.datastore.core.DataStore
89
import androidx.datastore.preferences.core.Preferences
910
import androidx.datastore.preferences.preferencesDataStore
11+
import androidx.webkit.WebViewCompat
1012
import de.schnettler.datastore.manager.DataStoreManager
1113
import dev.aaa1115910.biliapi.http.BiliHttpProxyApi
14+
import dev.aaa1115910.biliapi.http.util.BiliAppConf
15+
import dev.aaa1115910.biliapi.http.util.BiliWebConf
1216
import dev.aaa1115910.biliapi.repositories.AuthRepository
1317
import dev.aaa1115910.biliapi.repositories.BiliApiModule
1418
import dev.aaa1115910.biliapi.repositories.ChannelRepository
@@ -62,6 +66,7 @@ class BVApp : Application() {
6266
}
6367
initFirebase()
6468
LogCatcherUtil.installLogCatcher()
69+
initApiConfig()
6570
initRepository()
6671
initProxy()
6772
instance = this
@@ -78,6 +83,15 @@ class BVApp : Application() {
7883
}
7984
}
8085

86+
private fun initApiConfig() {
87+
BiliAppConf.osVersion = Build.VERSION.RELEASE
88+
BiliAppConf.model = Build.MODEL
89+
BiliWebConf.webViewVersion = runCatching {
90+
WebViewCompat.getCurrentLoadedWebViewPackage()!!.versionName!!
91+
.substringBefore(".").toInt()
92+
}.getOrDefault(144)
93+
}
94+
8195
fun initRepository() {
8296
val channelRepository by koinApplication.koin.inject<ChannelRepository>()
8397
channelRepository.initDefaultChannel(Prefs.accessToken, Prefs.buvid)

bili-api/src/main/kotlin/dev/aaa1115910/biliapi/http/BiliHttpApi.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ import dev.aaa1115910.biliapi.http.entity.video.VideoInfo
6868
import dev.aaa1115910.biliapi.http.entity.video.VideoMoreInfo
6969
import dev.aaa1115910.biliapi.http.entity.video.VideoShot
7070
import dev.aaa1115910.biliapi.http.entity.web.NavResponseData
71+
import dev.aaa1115910.biliapi.http.plugins.BiliUserAgent
7172
import dev.aaa1115910.biliapi.http.util.BiliAppConf
7273
import dev.aaa1115910.biliapi.http.util.encApiSign
7374
import io.ktor.client.HttpClient
7475
import io.ktor.client.call.body
7576
import io.ktor.client.engine.okhttp.OkHttp
76-
import io.ktor.client.plugins.BrowserUserAgent
7777
import io.ktor.client.plugins.HttpRequestRetry
7878
import io.ktor.client.plugins.compression.ContentEncoding
7979
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
@@ -125,7 +125,7 @@ object BiliHttpApi {
125125

126126
private fun createClient() {
127127
client = HttpClient(OkHttp) {
128-
BrowserUserAgent()
128+
BiliUserAgent()
129129
install(ContentNegotiation) {
130130
json(json)
131131
}
@@ -202,7 +202,8 @@ object BiliHttpApi {
202202
otype: String = "json",
203203
type: String = "",
204204
platform: String = "oc",
205-
sessData: String? = null
205+
sessData: String? = null,
206+
dedeUserID: Long? = null
206207
): BiliResponse<PlayUrlData> = client.get("/x/player/playurl") {
207208
require(av != null || bv != null) { "av and bv cannot be null at the same time" }
208209
parameter("avid", av)
@@ -216,7 +217,7 @@ object BiliHttpApi {
216217
parameter("otype", otype)
217218
parameter("type", type)
218219
parameter("platform", platform)
219-
sessData?.let { header("Cookie", "SESSDATA=$sessData;") }
220+
sessData?.let { header("Cookie", "SESSDATA=$sessData;DedeUserID=$dedeUserID") }
220221
}.body()
221222

222223
/**
@@ -235,7 +236,8 @@ object BiliHttpApi {
235236
supportMultiAudio: Boolean? = null,
236237
drmTechType: Int? = null,
237238
fromClient: String? = null,
238-
sessData: String? = null
239+
sessData: String? = null,
240+
dedeUserID: Long? = null
239241
): BiliResponse<PlayUrlData> = client.get("/pgc/player/web/playurl") {
240242
require(av != null || bv != null) { "av and bv cannot be null at the same time" }
241243
require(epid != null || cid != null) { "epid and cid cannot be null at the same time" }
@@ -251,7 +253,7 @@ object BiliHttpApi {
251253
supportMultiAudio?.let { parameter("support_multi_audio", it) }
252254
drmTechType?.let { parameter("drm_tech_type", it) }
253255
fromClient?.let { parameter("from_client", it) }
254-
sessData?.let { header("Cookie", "SESSDATA=$sessData;") }
256+
sessData?.let { header("Cookie", "SESSDATA=$sessData;DedeUserID=$dedeUserID") }
255257
//必须得加上 referer 才能通过账号身份验证
256258
header("referer", "https://www.bilibili.com")
257259
}.body()

bili-api/src/main/kotlin/dev/aaa1115910/biliapi/http/BiliHttpProxyApi.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package dev.aaa1115910.biliapi.http
33
import dev.aaa1115910.biliapi.http.entity.BiliResponse
44
import dev.aaa1115910.biliapi.http.entity.search.SearchResultData
55
import dev.aaa1115910.biliapi.http.entity.video.PlayUrlData
6+
import dev.aaa1115910.biliapi.http.plugins.BiliUserAgent
67
import dev.aaa1115910.biliapi.http.util.encApiSign
78
import io.ktor.client.HttpClient
89
import io.ktor.client.call.body
910
import io.ktor.client.engine.okhttp.OkHttp
10-
import io.ktor.client.plugins.BrowserUserAgent
1111
import io.ktor.client.plugins.HttpRequestRetry
1212
import io.ktor.client.plugins.compression.ContentEncoding
1313
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
@@ -30,7 +30,7 @@ object BiliHttpProxyApi {
3030

3131
fun createClient(proxyServer: String) {
3232
client = HttpClient(OkHttp) {
33-
BrowserUserAgent()
33+
BiliUserAgent()
3434
install(ContentNegotiation) {
3535
json(json)
3636
}
@@ -77,7 +77,8 @@ object BiliHttpProxyApi {
7777
supportMultiAudio: Boolean? = null,
7878
drmTechType: Int? = null,
7979
fromClient: String? = null,
80-
sessData: String? = null
80+
sessData: String? = null,
81+
dedeUserID: Long? = null
8182
): BiliResponse<PlayUrlData> = client?.get("/pgc/player/web/playurl") {
8283
require(av != null || bv != null) { "av and bv cannot be null at the same time" }
8384
require(epid != null || cid != null) { "epid and cid cannot be null at the same time" }
@@ -93,7 +94,7 @@ object BiliHttpProxyApi {
9394
supportMultiAudio?.let { parameter("support_multi_audio", it) }
9495
drmTechType?.let { parameter("drm_tech_type", it) }
9596
fromClient?.let { parameter("from_client", it) }
96-
sessData?.let { header("Cookie", "SESSDATA=$sessData;") }
97+
sessData?.let { header("Cookie", "SESSDATA=$sessData;DedeUserID=$dedeUserID") }
9798
//必须得加上 referer 才能通过账号身份验证
9899
header("referer", "https://www.bilibili.com")
99100
}?.body() ?: throw IllegalStateException("no proxy server")

bili-api/src/main/kotlin/dev/aaa1115910/biliapi/http/BiliLiveHttpApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import dev.aaa1115910.biliapi.http.entity.BiliResponse
44
import dev.aaa1115910.biliapi.http.entity.live.DanmuInfoData
55
import dev.aaa1115910.biliapi.http.entity.live.HistoryDanmaku
66
import dev.aaa1115910.biliapi.http.entity.live.RoomPlayInfoData
7+
import dev.aaa1115910.biliapi.http.plugins.BiliUserAgent
78
import io.github.oshai.kotlinlogging.KotlinLogging
89
import io.ktor.client.HttpClient
910
import io.ktor.client.call.body
1011
import io.ktor.client.engine.okhttp.OkHttp
11-
import io.ktor.client.plugins.BrowserUserAgent
1212
import io.ktor.client.plugins.compression.ContentEncoding
1313
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
1414
import io.ktor.client.plugins.defaultRequest
@@ -29,7 +29,7 @@ object BiliLiveHttpApi {
2929

3030
private fun createClient() {
3131
client = HttpClient(OkHttp) {
32-
BrowserUserAgent()
32+
BiliUserAgent()
3333
install(ContentNegotiation) {
3434
json(Json {
3535
coerceInputValues = true

bili-api/src/main/kotlin/dev/aaa1115910/biliapi/http/BiliPassportHttpApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import dev.aaa1115910.biliapi.http.entity.login.qr.RequestWebQRData
88
import dev.aaa1115910.biliapi.http.entity.login.qr.WebQRLoginData
99
import dev.aaa1115910.biliapi.http.entity.login.sms.SendSmsResponse
1010
import dev.aaa1115910.biliapi.http.entity.login.sms.SmsLoginResponse
11+
import dev.aaa1115910.biliapi.http.plugins.BiliUserAgent
1112
import dev.aaa1115910.biliapi.http.util.encApiSign
1213
import io.ktor.client.HttpClient
1314
import io.ktor.client.call.body
1415
import io.ktor.client.engine.okhttp.OkHttp
15-
import io.ktor.client.plugins.BrowserUserAgent
1616
import io.ktor.client.plugins.compression.ContentEncoding
1717
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
1818
import io.ktor.client.plugins.defaultRequest
@@ -37,7 +37,7 @@ object BiliPassportHttpApi {
3737

3838
private fun createClient() {
3939
client = HttpClient(OkHttp) {
40-
BrowserUserAgent()
40+
BiliUserAgent()
4141
install(ContentNegotiation) {
4242
json(Json {
4343
coerceInputValues = true

bili-api/src/main/kotlin/dev/aaa1115910/biliapi/http/BiliPlusHttpApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package dev.aaa1115910.biliapi.http
22

33
import dev.aaa1115910.biliapi.http.entity.BiliResponse
44
import dev.aaa1115910.biliapi.http.entity.biliplus.View
5+
import dev.aaa1115910.biliapi.http.plugins.BiliUserAgent
56
import io.ktor.client.HttpClient
67
import io.ktor.client.engine.okhttp.OkHttp
7-
import io.ktor.client.plugins.BrowserUserAgent
88
import io.ktor.client.plugins.HttpRequestRetry
99
import io.ktor.client.plugins.compression.ContentEncoding
1010
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
@@ -36,7 +36,7 @@ object BiliPlusHttpApi {
3636

3737
private fun createClient() {
3838
client = HttpClient(OkHttp) {
39-
BrowserUserAgent()
39+
BiliUserAgent()
4040
install(ContentNegotiation) {
4141
json(json)
4242
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dev.aaa1115910.biliapi.http.plugins
2+
3+
import dev.aaa1115910.biliapi.http.util.BiliAppConf
4+
import dev.aaa1115910.biliapi.http.util.BiliWebConf
5+
import io.ktor.client.HttpClientConfig
6+
import io.ktor.client.plugins.api.ClientPlugin
7+
import io.ktor.client.plugins.api.createClientPlugin
8+
import io.ktor.client.request.header
9+
import io.ktor.client.request.host
10+
import io.ktor.http.HttpHeaders
11+
import io.ktor.util.logging.KtorSimpleLogger
12+
import io.ktor.utils.io.KtorDsl
13+
14+
private val LOGGER = KtorSimpleLogger("dev.aaa1115910.biliapi.http.plugins.BiliUserAgent")
15+
16+
@KtorDsl
17+
class BiliUserAgentConfig(
18+
var version: String = BiliAppConf.APP_VERSION_NAME,
19+
var buildCode: Int = BiliAppConf.APP_BUILD_CODE,
20+
var channel: String = BiliAppConf.CHANNEL,
21+
var platform: String = BiliAppConf.PLATFORM,
22+
var mobiApp: String = BiliAppConf.MOBI_APP,
23+
var model: String = BiliAppConf.model,
24+
var osVersion: String = BiliAppConf.osVersion,
25+
var network: Int = BiliAppConf.NETWORK,
26+
var webViewVersion: Int = BiliWebConf.webViewVersion
27+
) {
28+
var appUserAgent = ""
29+
private set
30+
var webUserAgent = ""
31+
private set
32+
33+
fun buildUserAgents() {
34+
appUserAgent =
35+
"Mozilla/5.0 BiliDroid/$version (bbcallen@gmail.com) os/$platform model/$model mobi_app/$mobiApp build/$buildCode channel/$channel innerVer/$buildCode osVer/$osVersion network/$network"
36+
webUserAgent =
37+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/$webViewVersion.0.0.0 Safari/537.36"
38+
}
39+
}
40+
41+
val BiliUserAgent: ClientPlugin<BiliUserAgentConfig> =
42+
createClientPlugin("BiliUserAgent", ::BiliUserAgentConfig) {
43+
pluginConfig.buildUserAgents()
44+
val appUserAgent = pluginConfig.appUserAgent
45+
val webUserAgent = pluginConfig.webUserAgent
46+
onRequest { request, _ ->
47+
val userAgent =
48+
if (request.host == "app.bilibili.com" || request.host == "passport.bilibili.com") {
49+
appUserAgent
50+
} else {
51+
webUserAgent
52+
}
53+
LOGGER.trace("Adding User-Agent header: agent \"${userAgent}\" for ${request.url}")
54+
request.header(HttpHeaders.UserAgent, userAgent)
55+
}
56+
}
57+
58+
@Suppress("FunctionName")
59+
fun HttpClientConfig<*>.BiliUserAgent() {
60+
install(BiliUserAgent) {
61+
62+
}
63+
}

bili-api/src/main/kotlin/dev/aaa1115910/biliapi/http/util/BiliAppConf.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@ object BiliAppConf {
44
const val GRPC_HOST = "grpc.biliapi.net"
55
const val GRPC_PORT = 443
66
const val APP_ID = 5
7-
const val APP_BUILD_CODE = 6830300
8-
const val CHANNEL = "bili"
7+
const val APP_BUILD_CODE = 2020100
8+
const val APP_VERSION_NAME = "2.2.0"
9+
const val CHANNEL = "yingyongbao"
910
const val MOBI_APP = "android_hd"
1011
const val DEVICE = ""
1112
const val PLATFORM = "android"
1213
const val TIMEZONE = "Asia/Shanghai"
14+
const val NETWORK = 2
15+
var osVersion = "15"
16+
var model = "2505DRP06G"
1317
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dev.aaa1115910.biliapi.http.util
2+
3+
object BiliWebConf {
4+
var webViewVersion = 144
5+
}

bili-api/src/main/kotlin/dev/aaa1115910/biliapi/repositories/VideoPlayRepository.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ class VideoPlayRepository(
6363
qn = 127,
6464
fnver = 0,
6565
fourk = 1,
66-
sessData = authRepository.sessionData
66+
sessData = authRepository.sessionData,
67+
dedeUserID = authRepository.mid
6768
).getResponseData()
6869
PlayData.fromPlayUrlData(playUrlData)
6970
}
@@ -132,7 +133,8 @@ class VideoPlayRepository(
132133
qn = 127,
133134
fnver = 0,
134135
fourk = 1,
135-
sessData = authRepository.sessionData
136+
sessData = authRepository.sessionData,
137+
dedeUserID = authRepository.mid
136138
)
137139
} else {
138140
BiliHttpApi.getPgcVideoPlayUrl(
@@ -142,7 +144,8 @@ class VideoPlayRepository(
142144
qn = 127,
143145
fnver = 0,
144146
fourk = 1,
145-
sessData = authRepository.sessionData
147+
sessData = authRepository.sessionData,
148+
dedeUserID = authRepository.mid
146149
)
147150
}.getResponseData()
148151

0 commit comments

Comments
 (0)