From d5a152ef1eba72603b293e871493358e16f4e728 Mon Sep 17 00:00:00 2001 From: Liuxinyu176 <1041316040@qq.com> Date: Fri, 9 Oct 2026 16:41:35 +0800 Subject: [PATCH] =?UTF-8?q?fix(wb):=20=E6=8C=89=E5=AE=98=E6=96=B9=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E8=A1=A5=E9=BD=90=E7=99=BB=E5=BD=95=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=A4=B4=E5=B9=B6=E5=BB=B6=E9=95=BF=20INTL=20?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WorkBuddy auth/state 改用 VSCode(国内)/workbuddy-ai(INTL) platform,与官方客户端一致 - 补齐 Origin/Referer/X-Client-ID/X-Client-Version/X-Product/X-No-Authorization - INTL 浏览器登录等待时间从 120s 延长到 15 分钟,普通用户邮箱/验证码流程不会再中途超时 --- app/build.gradle.kts | 4 +- .../token/ui/webview/WebViewLoginViewModel.kt | 40 ++++++++++++++++--- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f9df029..fbbd5d3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,8 +16,8 @@ android { applicationId = "com.rainy.token" minSdk = 31 targetSdk = 35 - versionCode = 31 - versionName = "1.7.11" + versionCode = 32 + versionName = "1.7.12" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt b/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt index c946738..c7d13bf 100644 --- a/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt +++ b/app/src/main/java/com/rainy/token/ui/webview/WebViewLoginViewModel.kt @@ -59,6 +59,12 @@ class WebViewLoginViewModel @Inject constructor( private var workBuddyPollingJob: Job? = null /** WorkBuddy 当前基址(决定 auth state/token 用 CN 还是 INTL)。 */ private var workBuddyBase = "https://copilot.tencent.com" + /** WorkBuddy 伪装头:Origin/Referer/Platform/UA 必须与官方客户端一致。 */ + private var workBuddyOrigin = "https://www.codebuddy.cn" + private var workBuddyPlatform = "VSCode" + private var workBuddyUserAgent = "CLI/2.143.1 CodeBuddy/2.143.1" + /** WorkBuddy 授权等待超时:国内 5 分钟(扫码),INTL 15 分钟(邮箱/验证码/SSO)。 */ + private var workBuddyPollTimeoutMs = 300_000L /** 目标账号(多账号服务);null = 新建账号。 */ private var accountId: String? = null @@ -250,10 +256,26 @@ class WebViewLoginViewModel @Inject constructor( private fun bindWorkBuddy() { viewModelScope.launch { try { - workBuddyBase = if (region == "INTL") "https://www.workbuddy.ai" else "https://copilot.tencent.com" + if (region == "INTL") { + workBuddyBase = "https://www.workbuddy.ai" + workBuddyOrigin = "https://www.workbuddy.ai" + workBuddyPlatform = "workbuddy-ai" + workBuddyPollTimeoutMs = 900_000L + } else { + workBuddyBase = "https://copilot.tencent.com" + workBuddyOrigin = "https://www.codebuddy.cn" + workBuddyPlatform = "VSCode" + workBuddyPollTimeoutMs = 300_000L + } + workBuddyUserAgent = "CLI/2.143.1 CodeBuddy/2.143.1" val request = Request.Builder() - .url(workBuddyBase + "/v2/plugin/auth/state?platform=CLI") - .addHeader("User-Agent", "CLI/2.63.2 CodeBuddy/2.63.2") + .url(workBuddyBase + "/v2/plugin/auth/state?platform=" + workBuddyPlatform) + .addHeader("User-Agent", workBuddyUserAgent) + .addHeader("Origin", workBuddyOrigin) + .addHeader("Referer", workBuddyOrigin + "/") + .addHeader("X-Client-ID", "codebuddy-cli") + .addHeader("X-Client-Version", "2.143.1") + .addHeader("X-Product", "SaaS") .addHeader("Content-Type", "application/json") .post("{}".toRequestBody("application/json".toMediaTypeOrNull())) .build() @@ -290,16 +312,22 @@ class WebViewLoginViewModel @Inject constructor( } } - /** 每 2 秒轮询一次 token 接口,120 秒超时。 */ + /** 每 2 秒轮询一次 token 接口,超时按站点 Profile(CN 5 分钟 / INTL 15 分钟)。 */ private suspend fun pollWorkBuddyToken(state: String) { - val timeoutMs = 120_000L + val timeoutMs = workBuddyPollTimeoutMs val startTime = System.currentTimeMillis() while (System.currentTimeMillis() - startTime < timeoutMs) { if (_uiState.value.loginSucceeded) return try { val request = Request.Builder() .url(workBuddyBase + "/v2/plugin/auth/token?state=$state") - .addHeader("User-Agent", "CLI/2.63.2 CodeBuddy/2.63.2") + .addHeader("User-Agent", workBuddyUserAgent) + .addHeader("Origin", workBuddyOrigin) + .addHeader("Referer", workBuddyOrigin + "/") + .addHeader("X-Client-ID", "codebuddy-cli") + .addHeader("X-Client-Version", "2.143.1") + .addHeader("X-Product", "SaaS") + .addHeader("X-No-Authorization", "1") .get() .build() val body = withContext(Dispatchers.IO) {