magpie-marvis 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -1
- package/package.json +1 -1
- package/src/marvis/browser.mjs +11 -4
- package/src/marvis/desktop.mjs +1 -1
- package/src/marvis/login.mjs +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,7 +3,21 @@
|
|
|
3
3
|
> 每个版本一节,**一条一行**,说用户能感知的变化。
|
|
4
4
|
> 格式与规矩见 [UPDATING.md](./UPDATING.md)。
|
|
5
5
|
|
|
6
|
-
## 0.2.
|
|
6
|
+
## 0.2.6 — 2026-11-06
|
|
7
|
+
|
|
8
|
+
**修复**
|
|
9
|
+
|
|
10
|
+
- **UA 换回客户端自己的 Electron UA**(`Marvis/1.60.3300.408 ... Electron/44.7.0`)。
|
|
11
|
+
之前为了「伪装成普通浏览器」用的是纯 Chrome UA —— 服务端很可能就是按这个区分调用方
|
|
12
|
+
- **去掉 `--disable-blink-features=AutomationControlled`**:它会在地址栏下面挂一条
|
|
13
|
+
「你使用的是不受支持的命令行标记」黄色警告条。`navigator.webdriver` 改用 CDP 抹掉
|
|
14
|
+
|
|
15
|
+
**修复**
|
|
16
|
+
|
|
17
|
+
- **`state` 格式与客户端不一致**:app 是 `state=${Math.random()*100}`(**小数**,如 `31.1177412`),
|
|
18
|
+
我写成了 `Math.floor(Math.random()*1e9)`(整数)。抓包确认服务端收到的是 `845583851` 这种
|
|
19
|
+
- **`loginType` 映射错了**:渲染层 `yct={QC:"1",WX:"2",WXAPP:"2"}`,
|
|
20
|
+
`Ual-Access-Login-Type` 应该是 `1`/`2`,我写的是 `6`/`5`
|
|
7
21
|
|
|
8
22
|
**修复(`-109` 的最终根因)**
|
|
9
23
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "magpie-marvis",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "magpie / OpenCode provider plugin for Tencent Marvis: its DeepSeek V4 Pro, Kimi K2.5, Claude Opus/Sonnet 4.6, GPT-5.4 and Hunyuan models through the Marvis model gateway — no API key to paste, sign in with QQ or WeChat.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.mjs",
|
package/src/marvis/browser.mjs
CHANGED
|
@@ -45,10 +45,16 @@ const WIN_EXES = [
|
|
|
45
45
|
"msedge.exe",
|
|
46
46
|
]
|
|
47
47
|
|
|
48
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* 浏览器 UA —— **必须是 Marvis 客户端自己的 Electron UA**。
|
|
50
|
+
*
|
|
51
|
+
* 一开始我用普通 Chrome UA「伪装身份」,结果服务端一律 `-109 RC_PARAMS_INVALID`。
|
|
52
|
+
* 客户端 BrowserWindow 的真实 UA 是带 `Marvis/<version>` 和 `Electron/<ver>` 的 ——
|
|
53
|
+
* 服务端按它识别调用方,缺了就判参数无效。
|
|
54
|
+
*/
|
|
49
55
|
const CHROME_UA =
|
|
50
56
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " +
|
|
51
|
-
"Chrome/152.0.
|
|
57
|
+
"Marvis/1.60.3300.408 Chrome/152.0.7977.130 Electron/44.7.0 Safari/537.36"
|
|
52
58
|
|
|
53
59
|
/** Windows 注册表 App Paths 查浏览器;查不到返回空串。 */
|
|
54
60
|
export function registryAppPath(exe) {
|
|
@@ -219,8 +225,9 @@ export async function openIsolatedLogin({ browser, url, match, extraHeaders, tim
|
|
|
219
225
|
"--disable-extensions",
|
|
220
226
|
"--disable-background-networking",
|
|
221
227
|
"--disable-sync",
|
|
222
|
-
//
|
|
223
|
-
|
|
228
|
+
// 去掉自动化痕迹。⚠ 不用 `--disable-blink-features=AutomationControlled` ——
|
|
229
|
+
// 它会在地址栏下面挂一条「你使用的是不受支持的命令行标记」警告条,很扎眼。
|
|
230
|
+
// `navigator.webdriver` 改用 CDP 的 `Page.addScriptToEvaluateOnNewDocument` 抹掉。
|
|
224
231
|
"--exclude-switches=enable-automation",
|
|
225
232
|
`--user-agent=${CHROME_UA}`,
|
|
226
233
|
"--lang=zh-CN",
|
package/src/marvis/desktop.mjs
CHANGED
|
@@ -226,7 +226,7 @@ export function parseLoginState(text) {
|
|
|
226
226
|
openid: m[1],
|
|
227
227
|
accessToken: m[2],
|
|
228
228
|
refreshToken: m[3] || undefined,
|
|
229
|
-
loginType: /^WX
|
|
229
|
+
loginType: /^WX/i.test(m[4] ?? "") ? "2" : "1",
|
|
230
230
|
guid: memGuid ? memGuid[1].toLowerCase() : guid,
|
|
231
231
|
expiresAt: expire ? Number(expire[1]) * 1000 : Date.now() + 30 * 24 * 3600_000,
|
|
232
232
|
}
|
package/src/marvis/login.mjs
CHANGED
|
@@ -56,7 +56,9 @@ export function authorizeUrl(loginType, guid) {
|
|
|
56
56
|
client_id: QQ_APP_ID,
|
|
57
57
|
// ⚠ 必须带 ?login_type=QC,见 REDIRECT 上方说明
|
|
58
58
|
redirect_uri: `${REDIRECT}?login_type=${loginType}`,
|
|
59
|
-
state
|
|
59
|
+
// ⚠ 必须与 Marvis 渲染层逐字一致:`state=${Math.random()*100}`
|
|
60
|
+
// 是**小数**(如 31.1177412),不是整数。服务端会拿它做校验,格式不符会被判参数无效。
|
|
61
|
+
state: String(Math.random() * 100),
|
|
60
62
|
})
|
|
61
63
|
return `https://graph.qq.com/oauth2.0/authorize?${p}`
|
|
62
64
|
}
|
|
@@ -228,7 +230,9 @@ function normalize(info, accessToken, openid) {
|
|
|
228
230
|
refreshToken: info?.refresh_token ? String(info.refresh_token) : undefined,
|
|
229
231
|
nickname: info?.nick_name ? safeDecode(info.nick_name) : undefined,
|
|
230
232
|
avatar: info?.head_img_url ?? undefined,
|
|
231
|
-
|
|
233
|
+
// ⚠ `Ual-Access-Login-Type` 的真实取值:QC→"1"、WX/WXAPP→"2"
|
|
234
|
+
// (渲染层 `yct={QC:"1",WX:"2",WXAPP:"2"}`)。不是 6。
|
|
235
|
+
loginType: info?.login_type === "WX" || info?.login_type === "WXAPP" ? "2" : "1",
|
|
232
236
|
expiresAt: expire > 1e9 ? expire * 1000 : Date.now() + 30 * 24 * 3600_000,
|
|
233
237
|
}
|
|
234
238
|
}
|