magpie-marvis 0.1.5 → 0.1.7

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 CHANGED
@@ -3,23 +3,19 @@
3
3
  > 每个版本一节,**一条一行**,说用户能感知的变化。
4
4
  > 格式与规矩见 [UPDATING.md](./UPDATING.md)。
5
5
 
6
- ## 0.1.5 — 2026-11-06
6
+ ## 0.1.7 — 2026-11-06
7
7
 
8
8
  **修复**
9
9
 
10
- - **浏览器登录失效(`-109 RC_PARAMS_INVALID`)**:换 token 时往 query 里多加了一个 `guid`,
11
- 而 QQ 校验 `redirect_uri` 逐字一致 —— 多一个参数就判无效。现在只发 `login_type` + `code`
12
- - **改成直接读回调页**:授权后浏览器跳到 `marvis_oauth` 时,服务端响应体**就是** token JSON。
13
- 原来又发一次请求去换 = 用第二个 code,必然 `-109`。现在只读页面正文,不重发
14
- - **本机导入弹 OS 对话框**:method 少了 `opened: true` + `method: "auto"`,
15
- magpie 会去打开 `about:blank`;补上后整个登录就是「点一下 → 读内存 → 成功」
16
- - **本机导入 PowerShell 语法错误**(`MissingEndParenthesisInMethodCall`):C# 代码经
17
- `-Command` 参数传递时引号被命令行解析吃掉。改成落临时 `.cs` + `.ps1`,走 `-File`
18
-
19
- **新增**
20
-
21
- - **隔离浏览器登录**:自己起一次性 Chromium(不复用日常浏览器 profile),
22
- 带 `--disable-blink-features=AutomationControlled` / `--exclude-switches=enable-automation` /
23
- 正常 Chrome UA + 补齐 `sec-ch-ua` client hints —— 去自动化痕迹、补指纹,防风控拦截
24
- - 浏览器探测结果进程内缓存(注册表查询同步阻塞,否则 `authorize()` 会慢到 1 秒以上)
10
+ - **浏览器登录「授权码已被使用过」(`-109`)**:根因是 **QQ 会把 `redirect_uri` 的查询串整个丢掉** ——
11
+ 落地页收到的是 `?code=...&state=...`,**没有 `login_type`**,服务端因此判参数无效。
12
+ 改成用 CDP `Fetch.requestPaused` 在**跳转前**拦下回调,自己从 URL 取 `code` 再带 `login_type` 换。
13
+ 页面同时显示「授权完成」,用户不用对着 `-109` 的 JSON 发愣
14
+ - **换 token 带了鉴权头**:`marvis_oauth` 是**免鉴权**端点,带 `Ual-Access-*` 签名头会直接 400 空响应
15
+ - **`deviceGuid()` 永远取不到注册表**:JS 里 `\S` `\T` 是无效转义,反斜杠被吃掉,
16
+ `reg` 收到 `HKCUSOFTWARETencentMarvisEnv` → 「无效参数」。改用 `String.raw`
17
+ - **本机导入的 guid 与 token 不同源**:服务端按 `(openid, guid, token)` 三元组校验,
18
+ 现在优先从**同一段内存**里取 `guid=`
19
+ - 去掉 `--disable-blink-features=AutomationControlled`(Edge 会弹「不受支持的命令行标记」警告条),
20
+ 改用 CDP `Page.addScriptToEvaluateOnNewDocument` 抹掉 `navigator.webdriver`
25
21
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magpie-marvis",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
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",
@@ -45,7 +45,7 @@
45
45
  "node": "^22.19.0 || >=24.0.0"
46
46
  },
47
47
  "magpie": {
48
- "icon": "data:image/png;base64,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",
48
+ "icon": "data:image/png;base64,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Jnjb294mTz755AxF2B+LMEhUFRH553/+5z41vbQ2//Iv/3JYsw/m0/xv2rSpr+mLVQmWLVsmX/ziF6XRaMy4v6Io+i6ixA/Kn51zMwTabrflz//8z/uLYdDSHFUWoOTllyYvhCDvec97Fo0L2J0SAHLKKafI5z73Odm0adM+z0ez2ZR/+qd/kle96lUzUs5Bq/jDH/7wsCqAkiOEre6OUPnss89y2mmn0Wq1FiXxotw+Xpabq9Uqr3vd6/iVX/kVzjrrLF760pcyNjZGFEV0Oh22bdvGY489xp133sl3v/tdnnjiiRmw8yAdrVqtsnHjRlasWHH4NqAeqZUvIjIxMSEf/vCH5ZxzzpF3vvOd8p3vdNnoX/nKVxatFRgEjHYHW9dqNRkZGenD27OtyGzQq5yHc845Z/HjAKXZL4pCzjvvvF0m4PWvf7184xvfkJe//OUz8PfF+ir9dxnM7c517OnzUpH+4i/+4rDDzxwppO9jH/uYABLHsWitd9H8Wq22qAW/N6XY10BXKdW3Jg8//PBhL0NzJNK96667breVvSOF+5erbjDK3ldiyXwgju94xzuOyA7kwxYEhhBQSvHss89y5plnMjk52ad4HVH2Y48ruKfz7utmkSMVUJbcx9NPP/2w70ewhzPq11pz0UUXMTExgTHmiBMqBiPr8847jwsuuIBXv/rVpGnKE088werVq7nmmmv6EfZ8Ez6stRRFwV//9V+zatWqPhl20RFCSrP11a9+dd5IHWUkffLJJ8vNN9+822tds2ZNn284nwFoFEUCyG/91m/15/BIlIU5XESG5557TsbGxg6KmHmwwn/Tm94kW7dunROdc8718fd7771XhoaG5q0gVc7PeeedJ81m84gyjzhcq//d7373vKz+UvjnnnuuNJvNGcWauSY1y7qk6Msvv3xesIhygVx88cXinDvkFcYjqgCl8O+88855ncxly5b16+h5ns+IpGdH1SVG32w2+65gf6xAmdIeaDZTXvNHPvIRee6553Z7nYtCAUrzf+65586LApTnu/rqq2esbhGRVqslnU5nj1jFhz70oX22Wru7twNxeaXCLVu2TL70pS/1XdORsAYcLnbPfAn/ta997QxyxZYtW+Tiiy+WE088UU466ST59Kc/3V/1pUsoXcS+XPtsQOfMM8+UCy64QN7+9rf3uQ0HElAOnvPss8+W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",
49
49
  "maxConcurrency": 2,
50
50
  "name": "腾讯 Marvis TENCENT"
51
51
  },
package/src/context.mjs CHANGED
@@ -50,7 +50,7 @@ export const BROWSER_UA =
50
50
 
51
51
  /** 图标 —— 两处必须一致:这里 + package.json 的 magpie.icon */
52
52
  export const ICON =
53
- "data:image/png;base64,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"
53
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAArWklEQVR42u29eZilVX3v+1nDO+yhpu4GupugTAqNSg6CGM1RSfLcqMTEcIwkJpo4MahxiHnukyd5jMF4Tm7UoLnneO7JUbhKSIQgHGgUcYBwm3jEJrbMNNBNA83U9FDVVXvX3vt937XW7/6x97vdVV09D1XVsp7ez66uvesd1u+3fsP3912/V7GfQ0QUYACvlJKB3y8BVgGvBF4FnAqsAJYBQ0ACxLw49mVkQA40gR3As8Am4CHgPuBhpdT4wNxrQAFhUCb7MtR+Ct8opfzA/08H3gr8GvDqnsBfHId/PAfcC/wAuFUp9ejuZHRIFKCnYSilgohEwDuAi4A39azB4AiADBxbHYiyvTiQ3bzPnm8HrAH+J3BDT0aqKy4VDloBBjVKRN4J/GXPxA9egAL0i0I+ospRLjQ78Pt1wOeVUtftqzVQexG+VUo5ETkJ+G/Ab/Q+Kg/6otAXjjIMWoebgY8rpZ4sZbjfCjAg/LcBX+sFc35gtb84Ft4orYIBtgMfUErdvCcl0HsR/geBb/WE73oHflH4C3fonoxcT2arReQDPVnafbIAA8L/AHDFgHn5uRa8yK7ZlVJqoVuDUm4XKaWumMsSqLkCvp7Z/1bP5P/c+fkQAiGEvpC11nMKO4SA1noxxAcGOF8pdevswFDNSvUEOL4HNoz1/q9/noRu7ZyWEuccWZYRQsAYQ6VSWegWYNASKGACOAt4ejBFVHOs/luA83t+xP48mPZSqOV47LHH+PGPf8w999zDxo0bef7559m5cyftdhvvPZVKhSRJ+I3f+A0uv/zyxWAJfM8KfE8p9ZZBK2BnCf8//TwJ33uPMQZjDJs3b+baa6/lm9/8Jvfddx9FUez17y+88MLdxgcLbJSB4ZtF5AKl1I0zXIGIKBExInK/iAQRcXKUD+e6t7h161b55Cc/KSMjI9JzeQKIMUastWKMEWOMaK3FWiuArFy5Ur73ve+JiIj3frHcsu/J9hERiXsyV5TpgYj8p3JujmbBhxD6wl+9erWccMIJfaFba0VrLb2CyoyX1loAOfXUU2XDhg0zlGgx6X3v/cIy4+vj/CLy/x3tq39Q+J/97GdnCH4uoc8W/gknnCBPPPGEiIgURbEoDV9PxncM1ngQkVNFpOh9eNQKvxTaJz7xib6ZL4W7u5dSSowxkiSJrF27djELvz8VPVmfOhgJf6L3YXG0KkAptD/7sz8TQKIo2uOqH4wFAPmbv/kbERHJ83zRT0Xv/RODCvCdo9n/l2b/61//+n4Jv7QOL3vZyyTLMnHOSQiL3kiWMr4FQIvIaA8gOCrh3jJHf/zxx/nIRz6C1hrn3D6lbmVu/7GPfYw4jhGRxQL+7K1eAHC2iIxpurX945hJ4jiqhlKKj3/840xPT6OU2ifhK6VwzlGtVrngggtmKMRin47e+7HAKyzwi71f+jnYJosGyRMRtNZ94Rpj+kDPHXfcwS233NL/3b4qjYhw2mmncfzxx/ePf7RgYD1Zv9ICZyx27H4Qxh1E+Upl+MIXvrD/dlJrQgi8/OUv759vrvMs8vEqC5yy2AQvIhhj0FrT6XT40Y9+xPe+9z3uu+8+li9fzvvf/37e+MY3ArBhwwZuv/12lFL9Ct/+jBUrViwWuPdAxqkWWLkYAsDZRZv169dz1VVXcf311/P444/P+O5VV13FxRdfzBe+8AVuu+028jzHWotzbr/PG8fx0UocAVhhgaWLqWhz77338nd/93dcf/31ZFnWN9el/1dK4b3nK1/5CnfccQdRFPWPcSBjenr6aK6HLbVAfSGv+tLcb9myhc9+9rN89atf7VfqrLX9WGC2eTfGsGHDhj0yevaFAfTUU08tBvbPgY4hRCRbyOBNCeCsWLFiBjq3r0DO3qDevYFAp556ah9FPApAoNkjYyHDttu3b5ff+73f2+eizaF+lXWAhx56aLGVfvd5LLjAzzmHtZa1a9fyute9jmuvvRZrbR+YOZLReIkb3HTTTf0MhKOQErXgVv4111wjlUqlv+qP1IrfWy3Ae3/UuQEWmvD//u//fpdK3Hy+ymu44oorjmgp2Ht/RFwOC0n4n//85/e5Tn8krYBSSlasWCHj4+NHRDBH0sqwUIT/pS99aV4Cvf2xAhdeeGGfE3C4hFQed/PmzbJu3brDrhAshFTvG9/4xoIV/mAGAshnP/vZw6YEJWvJey9nnXWWALJ58+bDmoHMmwKUN7R27VpJkmS3ZMyF8lJK9ZXgi1/8Yl+BD6VgSrbRpz/96f5577jjjsNKQGW++HkhBGm1WnL66acvmIBvX3EBQD71qU/NcGMHYw1CCH3hX3PNNTNYSzfddNPRpwDlzdx99939iV3owp8rJnjb294mTz755AxF2B+LMEhUFRH553/+5z41vbQ2//Iv/3JYsw/m0/xv2rSpr+mLVQmWLVsmX/ziF6XRaMy4v6Io+i6ixA/Kn51zMwTabrflz//8z/uLYdDSHFUWoOTllyYvhCDvec97Fo0L2J0SAHLKKafI5z73Odm0adM+z0ez2ZR/+qd/kle96lUzUs5Bq/jDH/7wsCqAkiOEre6OUPnss89y2mmn0Wq1FiXxotw+Xpabq9Uqr3vd6/iVX/kVzjrrLF760pcyNjZGFEV0Oh22bdvGY489xp133sl3v/tdnnjiiRmw8yAdrVqtsnHjRlasWHH4NqAeqZUvIjIxMSEf/vCH5ZxzzpF3vvOd8p3vdNnoX/nKVxatFRgEjHYHW9dqNRkZGenD27OtyGzQq5yHc845Z/HjAKXZL4pCzjvvvF0m4PWvf7184xvfkJe//OUz8PfF+ir9dxnM7c517OnzUpH+4i/+4rDDzxwppO9jH/uYABLHsWitd9H8Wq22qAW/N6XY10BXKdW3Jg8//PBhL0NzJNK96667breVvSOF+5erbjDK3ldiyXwgju94xzuOyA7kwxYEhhBQSvHss89y5plnMjk52ad4HVH2Y48ruKfz7utmkSMVUJbcx9NPP/2w70ewhzPq11pz0UUXMTExgTHmiBMqBiPr8847jwsuuIBXv/rVpGnKE088werVq7nmmmv6EfZ8Ez6stRRFwV//9V+zatWqPhl20RFCSrP11a9+dd5IHWUkffLJJ8vNN9+822tds2ZNn284nwFoFEUCyG/91m/15/BIlIU5XESG5557TsbGxg6KmHmwwn/Tm94kW7dunROdc8718fd7771XhoaG5q0gVc7PeeedJ81m84gyjzhcq//d7373vKz+UvjnnnuuNJvNGcWauSY1y7qk6Msvv3xesIhygVx88cXinDvkFcYjqgCl8O+88855ncxly5b16+h5ns+IpGdH1SVG32w2+65gf6xAmdIeaDZTXvNHPvIRee6553Z7nYtCAUrzf+65586LApTnu/rqq2esbhGRVqslnU5nj1jFhz70oX22Wru7twNxeaXCLVu2TL70pS/1XdORsAYcLnbPfAn/ta997QxyxZYtW+Tiiy+WE088UU466ST59Kc/3V/1pUsoXcS+XPtsQOfMM8+UCy64QN7+9rf3uQ0HElAOnvPss8+W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"
54
54
 
55
55
  /** Token 30 天有效;提前 1 天提示重登 */
56
56
  export const REFRESH_LEAD_MS = 24 * 60 * 60_000
@@ -1,138 +1,139 @@
1
- // ② auth.methods —— 两条登录路
2
- //
3
- // A. QQ / 微信 授权(默认):自己起一个**隔离浏览器**(一次性 profile、伪装正常 Chrome、
4
- // 去掉自动化痕迹),用户在窗口里授权,插件从 CDP 抓回调 URL 里的 `code`。
5
- // → `{ url, opened: true, method: "auto", callback }`
6
- // `opened: true` 让 magpie **不要**再开系统默认浏览器(否则弹两个窗口)。
7
- //
8
- // B. 从本机 Marvis 导入:装了客户端且登录过的人,直接读进程内存里的登录态。
9
- // → 同样 `opened: true` + `method: "auto"`,整个登录就是「点一下 → 读内存 → 成功」。
10
- //
11
- // ⚠ `authorize()` 必须**立刻**返回 —— 真正等用户的是 `callback()`。
12
- // 在这里 await 登录会和 magpie 双向死锁(HOOKS §四·陷阱1)。
13
- //
14
- // ⚠ 为什么不能像别的插件那样起本地 loopback 收回调:redirect_uri 是 QQ 互联里
15
- // 预注册死的,改不了(详见 src/marvis/login.mjs 顶部)。所以只能「跳过去 → 读地址栏」。
16
-
17
- import { PROVIDER, LOGIN_TYPE } from "../context.mjs"
18
- import { authorizeUrl, parseCallback, deviceGuid } from "../marvis/login.mjs"
19
- import { openIsolatedLogin, findBrowser } from "../marvis/browser.mjs"
20
- import { resolveAccount } from "../account-name.mjs"
21
- import { importFromDesktop, desktopAvailable } from "../marvis/desktop.mjs"
22
-
23
- /** 回调地址判据:跳到 marvis_oauth 且带 code= */
24
- const CALLBACK = /marvis_client_login\/marvis_oauth\?[^#]*\bcode=/i
25
-
26
- /**
27
- * 登录成功时给宿主的字段。
28
- * `accountId` 是**名字**(卡片上显示),`uid` 是身份(HOOKS §八)。
29
- * ⚠ `refresh` 必须有 —— 缺了它 magpie 不会把账号写进 plugin-auth.json,
30
- * 表现是「登录显示成功,但界面说无法列出账号」。
31
- */
32
- export function authOf(acct) {
33
- const { accountId, uid } = resolveAccount({
34
- name: acct.nickname ?? "",
35
- phone: "",
36
- urn: acct.openid,
37
- })
38
- return {
39
- type: "success",
40
- access: acct.accessToken,
41
- // token 30 天有效,refresh 会成对轮换 —— 这里存自己,refresh 钩子负责换新
42
- refresh: acct.refreshToken ?? acct.accessToken,
43
- expires: acct.expiresAt ?? 0,
44
- ...(accountId ? { accountId } : {}),
45
- ...(uid ? { uid } : {}),
46
- // 落盘的额外字段:模型请求随时要用
47
- metadata: {
48
- openid: acct.openid,
49
- guid: acct.guid ?? deviceGuid(),
50
- loginType: acct.loginType ?? "6",
51
- nickname: acct.nickname ?? "",
52
- },
53
- }
54
- }
55
-
56
- /** 授权页登录(QQ / 微信),走隔离浏览器 */
57
- function oauthLogin(loginType, label, instructions) {
58
- return {
59
- type: "oauth",
60
- label,
61
- async authorize() {
62
- const guid = deviceGuid()
63
- const browser = findBrowser()
64
- const url = authorizeUrl(loginType, guid)
65
-
66
- return {
67
- url,
68
- // 我们自己开隔离浏览器,magpie 不要再开系统默认浏览器
69
- opened: true,
70
- method: "auto",
71
- instructions,
72
- async callback(_url, _input, signal) {
73
- if (!browser) {
74
- throw new Error(
75
- "没有找到可用的 Chromium 内核浏览器(Chrome / Edge / 360 / QQ 浏览器都行)。" +
76
- "请装一个,或改用「从本机 Marvis 导入」。",
77
- )
78
- }
79
- // 起隔离浏览器 → 等它跳到回调地址
80
- // ⚠ 回调页**本身就是换 token 的响应**(服务端直接吐 JSON),
81
- // 所以这里读页面正文,**不要再发一次请求** —— 再发就是第二个 code,必然 -109。
82
- const { url: callbackUrl, body } = await openIsolatedLogin({
83
- browser,
84
- url,
85
- match: CALLBACK,
86
- timeoutMs: 5 * 60_000,
87
- signal,
88
- })
89
-
90
- const acct = parseCallback(callbackUrl, body)
91
- return authOf({ ...acct, guid, loginType: acct.loginType ?? LOGIN_TYPE[loginType] ?? "6" })
92
- },
93
- }
94
- },
95
- }
96
- }
97
-
98
- export function methods() {
99
- return [
100
- oauthLogin(
101
- "QC",
102
- "QQ 登录",
103
- "1) 会打开一个**独立的**浏览器窗口(不碰你日常浏览器)\n" +
104
- "2) 用你的 QQ 登录并确认授权\n" +
105
- "3) 授权完成后窗口会自己关掉,回到 magpie 即可",
106
- ),
107
- oauthLogin(
108
- "WX",
109
- "微信登录",
110
- "1) 会打开一个**独立的**浏览器窗口(不碰你日常浏览器)\n" +
111
- "2) 用微信扫码并确认\n" +
112
- "3) 授权完成后窗口会自己关掉,回到 magpie 即可",
113
- ),
114
- {
115
- type: "oauth",
116
- label: "从本机 Marvis 导入(需已安装并登录)",
117
- async authorize() {
118
- const ok = await desktopAvailable()
119
- return {
120
- // ⚠ 必须 opened: true + method: "auto",否则 magpie 会去开这个 url
121
- // (之前给 about:blank 弹了一次「没有可打开此链接的应用」)
122
- url: "",
123
- opened: true,
124
- method: "auto",
125
- instructions: ok
126
- ? "已检测到本机 Marvis 客户端,正在读取登录态…"
127
- : "本机没找到运行中的 Marvis 客户端。请先打开 Marvis 并登录,或改用 QQ / 微信 登录。",
128
- async callback() {
129
- const acct = await importFromDesktop()
130
- return authOf(acct)
131
- },
132
- }
133
- },
134
- },
135
- ]
136
- }
137
-
138
- export { PROVIDER, CALLBACK }
1
+ // ② auth.methods —— 两条登录路
2
+ //
3
+ // A. QQ / 微信 授权(默认):自己起一个**隔离浏览器**(一次性 profile、伪装正常 Chrome、
4
+ // 去掉自动化痕迹),用户在窗口里授权,插件从 CDP 抓回调 URL 里的 `code`。
5
+ // → `{ url, opened: true, method: "auto", callback }`
6
+ // `opened: true` 让 magpie **不要**再开系统默认浏览器(否则弹两个窗口)。
7
+ //
8
+ // B. 从本机 Marvis 导入:装了客户端且登录过的人,直接读进程内存里的登录态。
9
+ // → 同样 `opened: true` + `method: "auto"`,整个登录就是「点一下 → 读内存 → 成功」。
10
+ //
11
+ // ⚠ `authorize()` 必须**立刻**返回 —— 真正等用户的是 `callback()`。
12
+ // 在这里 await 登录会和 magpie 双向死锁(HOOKS §四·陷阱1)。
13
+ //
14
+ // ⚠ 为什么不能像别的插件那样起本地 loopback 收回调:redirect_uri 是 QQ 互联里
15
+ // 预注册死的,改不了(详见 src/marvis/login.mjs 顶部)。所以只能「跳过去 → 读地址栏」。
16
+
17
+ import { PROVIDER, LOGIN_TYPE } from "../context.mjs"
18
+ import { authorizeUrl, parseCallback, deviceGuid } from "../marvis/login.mjs"
19
+ import { openIsolatedLogin, findBrowser } from "../marvis/browser.mjs"
20
+ import { resolveAccount } from "../account-name.mjs"
21
+ import { importFromDesktop, desktopAvailable } from "../marvis/desktop.mjs"
22
+
23
+ /** 回调地址判据:跳到 marvis_oauth 且带 code= */
24
+ const CALLBACK = /marvis_client_login\/marvis_oauth\?[^#]*\bcode=/i
25
+
26
+ /**
27
+ * 登录成功时给宿主的字段。
28
+ * `accountId` 是**名字**(卡片上显示),`uid` 是身份(HOOKS §八)。
29
+ * ⚠ `refresh` 必须有 —— 缺了它 magpie 不会把账号写进 plugin-auth.json,
30
+ * 表现是「登录显示成功,但界面说无法列出账号」。
31
+ */
32
+ export function authOf(acct) {
33
+ const { accountId, uid } = resolveAccount({
34
+ name: acct.nickname ?? "",
35
+ phone: "",
36
+ urn: acct.openid,
37
+ })
38
+ return {
39
+ type: "success",
40
+ access: acct.accessToken,
41
+ // token 30 天有效,refresh 会成对轮换 —— 这里存自己,refresh 钩子负责换新
42
+ refresh: acct.refreshToken ?? acct.accessToken,
43
+ expires: acct.expiresAt ?? 0,
44
+ ...(accountId ? { accountId } : {}),
45
+ ...(uid ? { uid } : {}),
46
+ // 落盘的额外字段:模型请求随时要用
47
+ metadata: {
48
+ openid: acct.openid,
49
+ guid: acct.guid ?? deviceGuid(),
50
+ loginType: acct.loginType ?? "6",
51
+ nickname: acct.nickname ?? "",
52
+ },
53
+ }
54
+ }
55
+
56
+ /** 授权页登录(QQ / 微信),走隔离浏览器 */
57
+ function oauthLogin(loginType, label, instructions) {
58
+ return {
59
+ type: "oauth",
60
+ label,
61
+ async authorize() {
62
+ const guid = deviceGuid()
63
+ const browser = findBrowser()
64
+ const url = authorizeUrl(loginType, guid)
65
+
66
+ return {
67
+ url,
68
+ // 我们自己开隔离浏览器,magpie 不要再开系统默认浏览器
69
+ opened: true,
70
+ method: "auto",
71
+ instructions,
72
+ async callback(_url, _input, signal) {
73
+ if (!browser) {
74
+ throw new Error(
75
+ "没有找到可用的 Chromium 内核浏览器(Chrome / Edge / 360 / QQ 浏览器都行)。" +
76
+ "请装一个,或改用「从本机 Marvis 导入」。",
77
+ )
78
+ }
79
+ // 起隔离浏览器 → 等它跳到回调地址
80
+ // ⚠ 回调页**本身就是换 token 的响应**(服务端直接吐 JSON),
81
+ // 所以这里读页面正文,**不要再发一次请求** —— 再发就是第二个 code,必然 -109。
82
+ const { url: callbackUrl, body } = await openIsolatedLogin({
83
+ browser,
84
+ url,
85
+ match: CALLBACK,
86
+ timeoutMs: 5 * 60_000,
87
+ signal,
88
+ })
89
+
90
+ // 拦截时 body 为空 -> parseCallback 自己拿 code + login_type 去换
91
+ const acct = await parseCallback(callbackUrl, body, { loginType })
92
+ return authOf({ ...acct, guid, loginType: acct.loginType ?? LOGIN_TYPE[loginType] ?? "6" })
93
+ },
94
+ }
95
+ },
96
+ }
97
+ }
98
+
99
+ export function methods() {
100
+ return [
101
+ oauthLogin(
102
+ "QC",
103
+ "QQ 登录",
104
+ "1) 会打开一个**独立的**浏览器窗口(不碰你日常浏览器)\n" +
105
+ "2) 用你的 QQ 登录并确认授权\n" +
106
+ "3) 授权完成后窗口会自己关掉,回到 magpie 即可",
107
+ ),
108
+ oauthLogin(
109
+ "WX",
110
+ "微信登录",
111
+ "1) 会打开一个**独立的**浏览器窗口(不碰你日常浏览器)\n" +
112
+ "2) 用微信扫码并确认\n" +
113
+ "3) 授权完成后窗口会自己关掉,回到 magpie 即可",
114
+ ),
115
+ {
116
+ type: "oauth",
117
+ label: "从本机 Marvis 导入(需已安装并登录)",
118
+ async authorize() {
119
+ const ok = await desktopAvailable()
120
+ return {
121
+ // ⚠ 必须 opened: true + method: "auto",否则 magpie 会去开这个 url
122
+ // (之前给 about:blank 弹了一次「没有可打开此链接的应用」)
123
+ url: "",
124
+ opened: true,
125
+ method: "auto",
126
+ instructions: ok
127
+ ? "已检测到本机 Marvis 客户端,正在读取登录态…"
128
+ : "本机没找到运行中的 Marvis 客户端。请先打开 Marvis 并登录,或改用 QQ / 微信 登录。",
129
+ async callback() {
130
+ const acct = await importFromDesktop()
131
+ return authOf(acct)
132
+ },
133
+ }
134
+ },
135
+ },
136
+ ]
137
+ }
138
+
139
+ export { PROVIDER, CALLBACK }
@@ -295,42 +295,57 @@ export async function openIsolatedLogin({ browser, url, match, timeoutMs = 5 * 6
295
295
  acceptLanguage: "zh-CN,zh;q=0.9",
296
296
  platform: "Win32",
297
297
  }).catch(() => {})
298
+ // 顺手抹掉 navigator.webdriver(比 --disable-blink-features 更干净,不带警告条)
299
+ await send(3, "Page.addScriptToEvaluateOnNewDocument", {
300
+ source: "Object.defineProperty(navigator,'webdriver',{get:()=>undefined})",
301
+ }).catch(() => {})
302
+
303
+ // ⚠ 核心:**在跳转发生前**把回调请求拦下来。
304
+ // 实测 QQ 会把 redirect_uri 的查询串整个丢掉 —— 落地页收到的
305
+ // `?code=...&state=...` 里**没有 login_type**,服务端直接 `-109 RC_PARAMS_INVALID`。
306
+ // 所以不能靠那个页面的响应,只能自己从 URL 里取 code,再带上 login_type 换一次。
307
+ await send(4, "Fetch.enable", {
308
+ patterns: [{ urlPattern: "*marvis_client_login/marvis_oauth*", requestStage: "Request" }],
309
+ }).catch(() => {})
298
310
 
299
311
  let nextId = 10
300
- while (Date.now() < deadline) {
301
- if (signal?.aborted) throw new Error("登录已取消")
302
- let href = ""
312
+ /** @type {{url:string} | null} */
313
+ let hit = null
314
+
315
+ ws.addEventListener("message", (event) => {
316
+ let msg
303
317
  try {
304
- const r = await send(nextId++, "Runtime.evaluate", {
305
- expression: "location.href",
306
- returnByValue: true,
307
- })
308
- href = String(r?.result?.value ?? "")
318
+ msg = JSON.parse(String(event.data))
309
319
  } catch {
310
- /* 页面正在跳转,下一轮再看 */
320
+ return
311
321
  }
312
- if (href && match.test(href)) {
313
- // ⚠ 关键:回调页**本身就是换 token 的响应**(服务端直接吐 JSON)。
314
- // 再发一次请求 = 用第二个 code,必然 -109。所以这里只读页面内容,不重发。
315
- // 页面可能还在渲染,多读几次直到拿到非空正文。
316
- let body = ""
317
- for (let i = 0; i < 15; i++) {
318
- try {
319
- const r = await send(nextId++, "Runtime.evaluate", {
320
- expression: "document.body ? document.body.innerText : ''",
321
- returnByValue: true,
322
- })
323
- body = String(r?.result?.value ?? "")
324
- if (body.trim()) break
325
- } catch {
326
- /* 页面还在导航 */
327
- }
328
- await new Promise((r) => setTimeout(r, 400))
322
+ if (msg.method === "Fetch.requestPaused" && !hit) {
323
+ const { requestId, request } = msg.params ?? {}
324
+ const u = String(request?.url ?? "")
325
+ if (u && match.test(u)) {
326
+ hit = { url: u }
327
+ // 让页面显示一句「授权完成」,避免用户对着 -109 的 JSON 发愣
328
+ send(nextId++, "Fetch.fulfillRequest", {
329
+ requestId,
330
+ responseCode: 200,
331
+ responseHeaders: [{ name: "content-type", value: "text/html; charset=utf-8" }],
332
+ body: Buffer.from(
333
+ "<!doctype html><meta charset=utf-8><title>Marvis 授权完成</title>" +
334
+ "<body style=\"font:16px/1.6 system-ui;padding:48px;color:#111\">" +
335
+ "<h2>授权完成</h2><p>回到 magpie 即可,窗口会自动关闭。</p></body>",
336
+ "utf8",
337
+ ).toString("base64"),
338
+ }).catch(() => {})
329
339
  }
330
- return { url: href, body, browser: browser.name }
331
340
  }
332
- await new Promise((r) => setTimeout(r, 800))
341
+ })
342
+
343
+ while (Date.now() < deadline) {
344
+ if (signal?.aborted) throw new Error("登录已取消")
345
+ if (hit) return { url: hit.url, body: "", browser: browser.name }
346
+ await new Promise((r) => setTimeout(r, 400))
333
347
  }
348
+
334
349
  throw new Error("登录超时:没有等到授权回调。请在打开的窗口里完成 QQ / 微信 授权。")
335
350
  } finally {
336
351
  try {