magpie-marvis 0.1.5 → 0.1.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 +10 -16
- package/package.json +2 -2
- package/src/context.mjs +1 -1
- package/src/marvis/browser.mjs +39 -28
- package/src/marvis/desktop.mjs +247 -219
package/CHANGELOG.md
CHANGED
|
@@ -3,23 +3,17 @@
|
|
|
3
3
|
> 每个版本一节,**一条一行**,说用户能感知的变化。
|
|
4
4
|
> 格式与规矩见 [UPDATING.md](./UPDATING.md)。
|
|
5
5
|
|
|
6
|
-
## 0.1.
|
|
6
|
+
## 0.1.6 — 2026-11-06
|
|
7
7
|
|
|
8
8
|
**修复**
|
|
9
9
|
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
|
|
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
|
+
- **图标顶不满边框**:官方 `icon.png` 四周有 10% 透明留白(内容只占 81.2%)。
|
|
11
|
+
按 alpha 包围盒裁切后再补成方形,现在铺满 128×128
|
|
12
|
+
- **本机导入还是失败**(`AmbiguousParameterSet`):`Add-Type -Path` 与 `-Language`
|
|
13
|
+
属于不同参数集,同时给必然报错 —— 去掉 `-Language`,`-Path` 自己按扩展名推断
|
|
14
|
+
- **本机导入扫错进程**:只扫了 `MarvisAgent.exe`,但 Chromium 的 `accesstoken=`
|
|
15
|
+
cookie 在 **`Marvis.exe`** 里(本机有 3 个实例)。现在两个进程都扫
|
|
16
|
+
- **浏览器登录报「授权码已被使用过」**:轮询 `document.body` 会读到回调页**第二次**
|
|
17
|
+
加载的响应 —— 那时 code 已被第一次消耗。改成监听 `Network.responseReceived`
|
|
18
|
+
取**第一个**响应体(`Network.getResponseBody`)
|
|
25
19
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "magpie-marvis",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.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",
|
|
@@ -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,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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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"
|
|
54
54
|
|
|
55
55
|
/** Token 30 天有效;提前 1 天提示重登 */
|
|
56
56
|
export const REFRESH_LEAD_MS = 24 * 60 * 60_000
|
package/src/marvis/browser.mjs
CHANGED
|
@@ -297,40 +297,51 @@ export async function openIsolatedLogin({ browser, url, match, timeoutMs = 5 * 6
|
|
|
297
297
|
}).catch(() => {})
|
|
298
298
|
|
|
299
299
|
let nextId = 10
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
300
|
+
|
|
301
|
+
// ⚠ 监听 Network.responseReceived 而不是轮询 document.body:
|
|
302
|
+
// 回调页可能被 JS 自动刷新,轮询会读到**第二次**请求的响应 —— 那时 code 已被
|
|
303
|
+
// 第一次消耗掉,服务端回 `-109 RC_PARAMS_INVALID`(「授权码已被使用过」)。
|
|
304
|
+
// 所以只认**第一次**跳到回调地址的那个响应体。
|
|
305
|
+
/** @type {Map<string,string>} requestId -> url */
|
|
306
|
+
const pending = new Map()
|
|
307
|
+
/** @type {{url:string, body:string} | null} */
|
|
308
|
+
let hit = null
|
|
309
|
+
|
|
310
|
+
ws.addEventListener("message", (event) => {
|
|
311
|
+
let msg
|
|
303
312
|
try {
|
|
304
|
-
|
|
305
|
-
expression: "location.href",
|
|
306
|
-
returnByValue: true,
|
|
307
|
-
})
|
|
308
|
-
href = String(r?.result?.value ?? "")
|
|
313
|
+
msg = JSON.parse(String(event.data))
|
|
309
314
|
} catch {
|
|
310
|
-
|
|
315
|
+
return
|
|
311
316
|
}
|
|
312
|
-
if (
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
}
|
|
328
|
-
|
|
317
|
+
if (msg.method === "Network.responseReceived") {
|
|
318
|
+
const { requestId, response } = msg.params ?? {}
|
|
319
|
+
const u = String(response?.url ?? "")
|
|
320
|
+
if (u && match.test(u)) pending.set(requestId, u)
|
|
321
|
+
}
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
while (Date.now() < deadline) {
|
|
325
|
+
if (signal?.aborted) throw new Error("登录已取消")
|
|
326
|
+
|
|
327
|
+
// 有新命中就去取 body(只取一次)
|
|
328
|
+
if (pending.size > 0 && !hit) {
|
|
329
|
+
const [requestId, u] = [...pending.entries()][0]
|
|
330
|
+
pending.delete(requestId)
|
|
331
|
+
try {
|
|
332
|
+
const r = await send(nextId++, "Network.getResponseBody", { requestId })
|
|
333
|
+
const body = String(r?.body ?? "")
|
|
334
|
+
const decoded = r?.base64Encoded ? Buffer.from(body, "base64").toString("utf8") : body
|
|
335
|
+
hit = { url: u, body: decoded }
|
|
336
|
+
break
|
|
337
|
+
} catch {
|
|
338
|
+
/* body 还没就绪,下一轮再取 */
|
|
329
339
|
}
|
|
330
|
-
return { url: href, body, browser: browser.name }
|
|
331
340
|
}
|
|
332
|
-
await new Promise((r) => setTimeout(r,
|
|
341
|
+
await new Promise((r) => setTimeout(r, 500))
|
|
333
342
|
}
|
|
343
|
+
|
|
344
|
+
if (hit) return { url: hit.url, body: hit.body, browser: browser.name }
|
|
334
345
|
throw new Error("登录超时:没有等到授权回调。请在打开的窗口里完成 QQ / 微信 授权。")
|
|
335
346
|
} finally {
|
|
336
347
|
try {
|
package/src/marvis/desktop.mjs
CHANGED
|
@@ -1,219 +1,247 @@
|
|
|
1
|
-
// 从本机 Marvis 客户端导入登录态
|
|
2
|
-
//
|
|
3
|
-
// 为什么需要它:Marvis 的 token 落在 `marvis-login-state.json` 里,是
|
|
4
|
-
// **AES-256-CBC + 运行期派生密钥**(conf v15 的 `IV[0:16] + ':' + CT`),
|
|
5
|
-
// 密钥攻不出来。但客户端跑着的时候,明文就在进程内存里 —— 直接读。
|
|
6
|
-
//
|
|
7
|
-
// ⚠ 只读,不写、不注入、不 hook。用 `ReadProcessMemory` 扫可读区段。
|
|
8
|
-
// ⚠ 只在 Windows 上有;其它平台抛「不可用」,让用户走浏览器登录。
|
|
9
|
-
// ⚠ **不需要管理员权限**(同用户进程即可);跨用户会失败并给出明确错误。
|
|
10
|
-
//
|
|
11
|
-
// ⚠⚠
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
1
|
+
// 从本机 Marvis 客户端导入登录态
|
|
2
|
+
//
|
|
3
|
+
// 为什么需要它:Marvis 的 token 落在 `marvis-login-state.json` 里,是
|
|
4
|
+
// **AES-256-CBC + 运行期派生密钥**(conf v15 的 `IV[0:16] + ':' + CT`),
|
|
5
|
+
// 密钥攻不出来。但客户端跑着的时候,明文就在进程内存里 —— 直接读。
|
|
6
|
+
//
|
|
7
|
+
// ⚠ 只读,不写、不注入、不 hook。用 `ReadProcessMemory` 扫可读区段。
|
|
8
|
+
// ⚠ 只在 Windows 上有;其它平台抛「不可用」,让用户走浏览器登录。
|
|
9
|
+
// ⚠ **不需要管理员权限**(同用户进程即可);跨用户会失败并给出明确错误。
|
|
10
|
+
//
|
|
11
|
+
// ⚠⚠ 四个已经踩过的坑,改这里之前先读:
|
|
12
|
+
// 1. C# 不能经 `powershell -Command <长脚本>` 传 —— 引号会被 Windows 命令行
|
|
13
|
+
// 参数解析吃掉(`return "";` 必然炸成 MissingEndParenthesisInMethodCall)。
|
|
14
|
+
// → 落成临时 .cs + .ps1,走 `-File`。
|
|
15
|
+
// 2. `Add-Type -Path` **不能**再给 `-Language` —— 两者属于不同参数集,
|
|
16
|
+
// 同时给报 `AmbiguousParameterSet`。`-Path` 自己会按扩展名推断。
|
|
17
|
+
// 3. .ps1 里**不要写中文** —— PowerShell 5.1 按 ANSI 读脚本,UTF-8 中文会变乱码,
|
|
18
|
+
// 还可能把后面的语法带崩。注释一律英文。
|
|
19
|
+
// 4. 输出走 **base64** —— 内存里什么字节都有,直接 `Write-Output` 会被编码/换行搞坏。
|
|
20
|
+
|
|
21
|
+
import { execFileSync } from "node:child_process"
|
|
22
|
+
import { mkdtempSync, writeFileSync, rmSync } from "node:fs"
|
|
23
|
+
import { tmpdir } from "node:os"
|
|
24
|
+
import { join } from "node:path"
|
|
25
|
+
import { deviceGuid } from "./login.mjs"
|
|
26
|
+
|
|
27
|
+
/** 探查本机是否有 Marvis 客户端在跑 */
|
|
28
|
+
export async function desktopAvailable() {
|
|
29
|
+
try {
|
|
30
|
+
return findPids().length > 0
|
|
31
|
+
} catch {
|
|
32
|
+
return false
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 列出所有可能持有登录态的进程 PID。
|
|
38
|
+
*
|
|
39
|
+
* ⚠ 两个进程都要扫:
|
|
40
|
+
* · `Marvis.exe`(Electron 主进程)持有 **Chromium cookie**(`accesstoken=` 那串)
|
|
41
|
+
* · `MarvisAgent.exe`(Python agent)持有 `Ual-Access-Access-Token` 请求头
|
|
42
|
+
* 只扫一个会漏 —— 实测 `Marvis.exe` 有 3 个实例,cookie 只在其中一个里。
|
|
43
|
+
*/
|
|
44
|
+
function findPids() {
|
|
45
|
+
const pids = []
|
|
46
|
+
for (const name of ["Marvis.exe", "MarvisAgent.exe"]) {
|
|
47
|
+
try {
|
|
48
|
+
const out = execFileSync("tasklist", ["/FI", `IMAGENAME eq ${name}`, "/FO", "CSV", "/NH"], {
|
|
49
|
+
encoding: "utf8",
|
|
50
|
+
windowsHide: true,
|
|
51
|
+
timeout: 10_000,
|
|
52
|
+
})
|
|
53
|
+
for (const m of out.matchAll(/"[^"]+","(\d+)"/g)) pids.push(Number(m[1]))
|
|
54
|
+
} catch {
|
|
55
|
+
/* 没装 / 没跑 */
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return pids
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** C# 扫描器 —— 写成独立 .cs,由 Add-Type -Path 编译。**全 ASCII**。 */
|
|
62
|
+
const CS = `
|
|
63
|
+
using System;
|
|
64
|
+
using System.Text;
|
|
65
|
+
using System.Runtime.InteropServices;
|
|
66
|
+
|
|
67
|
+
public class MarvisMemScan
|
|
68
|
+
{
|
|
69
|
+
[DllImport("kernel32.dll", SetLastError = true)]
|
|
70
|
+
public static extern IntPtr OpenProcess(int access, bool inherit, int pid);
|
|
71
|
+
|
|
72
|
+
[DllImport("kernel32.dll", SetLastError = true)]
|
|
73
|
+
public static extern bool ReadProcessMemory(IntPtr h, IntPtr addr, byte[] buf, int size, out IntPtr read);
|
|
74
|
+
|
|
75
|
+
[DllImport("kernel32.dll", SetLastError = true)]
|
|
76
|
+
public static extern int VirtualQueryEx(IntPtr h, IntPtr addr, ref MBI mbi, int size);
|
|
77
|
+
|
|
78
|
+
[DllImport("kernel32.dll", SetLastError = true)]
|
|
79
|
+
public static extern bool CloseHandle(IntPtr h);
|
|
80
|
+
|
|
81
|
+
[StructLayout(LayoutKind.Sequential)]
|
|
82
|
+
public struct MBI
|
|
83
|
+
{
|
|
84
|
+
public IntPtr BaseAddress;
|
|
85
|
+
public IntPtr AllocationBase;
|
|
86
|
+
public uint AllocationProtect;
|
|
87
|
+
public uint Pad1;
|
|
88
|
+
public IntPtr RegionSize;
|
|
89
|
+
public uint State;
|
|
90
|
+
public uint Protect;
|
|
91
|
+
public uint Type;
|
|
92
|
+
public uint Pad2;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private static bool Readable(uint p)
|
|
96
|
+
{
|
|
97
|
+
switch (p)
|
|
98
|
+
{
|
|
99
|
+
case 0x02: case 0x04: case 0x06: case 0x08:
|
|
100
|
+
case 0x20: case 0x40: case 0x80:
|
|
101
|
+
case 0x42: case 0x44: case 0x60: case 0x62: case 0x64:
|
|
102
|
+
return true;
|
|
103
|
+
default:
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Scan committed readable regions for needle, append every hit region.
|
|
109
|
+
public static string Scan(int pid, string needle)
|
|
110
|
+
{
|
|
111
|
+
IntPtr h = OpenProcess(0x0410, false, pid);
|
|
112
|
+
if (h == IntPtr.Zero) return string.Empty;
|
|
113
|
+
|
|
114
|
+
StringBuilder sb = new StringBuilder();
|
|
115
|
+
long addr = 0;
|
|
116
|
+
MBI mbi = new MBI();
|
|
117
|
+
const long MAX_REGION = 64L * 1024 * 1024;
|
|
118
|
+
|
|
119
|
+
while (VirtualQueryEx(h, new IntPtr(addr), ref mbi, Marshal.SizeOf(typeof(MBI))) != 0)
|
|
120
|
+
{
|
|
121
|
+
long size = (long)mbi.RegionSize;
|
|
122
|
+
if (mbi.State == 0x1000 && size > 0 && size < MAX_REGION && Readable(mbi.Protect))
|
|
123
|
+
{
|
|
124
|
+
byte[] buf = new byte[size];
|
|
125
|
+
IntPtr read;
|
|
126
|
+
if (ReadProcessMemory(h, new IntPtr(addr), buf, (int)size, out read))
|
|
127
|
+
{
|
|
128
|
+
string s = Encoding.UTF8.GetString(buf, 0, (int)read);
|
|
129
|
+
if (s.IndexOf(needle, StringComparison.Ordinal) >= 0) sb.Append(s);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
addr += size;
|
|
133
|
+
if (addr > 0x7FFFFFFFFFFFL) break;
|
|
134
|
+
}
|
|
135
|
+
CloseHandle(h);
|
|
136
|
+
return sb.ToString();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
`
|
|
140
|
+
|
|
141
|
+
/** run.ps1 的内容 —— **全 ASCII**,见文件头第 3 条 */
|
|
142
|
+
function ps1(pid) {
|
|
143
|
+
return [
|
|
144
|
+
"$ErrorActionPreference = 'Stop'",
|
|
145
|
+
// -Path implies the language from the extension; do NOT also pass -Language
|
|
146
|
+
// (different parameter sets -> AmbiguousParameterSet).
|
|
147
|
+
"Add-Type -Path (Join-Path $PSScriptRoot 'Scan.cs')",
|
|
148
|
+
`$text = [MarvisMemScan]::Scan(${pid}, 'accesstoken=')`,
|
|
149
|
+
`if ([string]::IsNullOrEmpty($text)) { $text = [MarvisMemScan]::Scan(${pid}, 'accessToken') }`,
|
|
150
|
+
"$b = [System.Text.Encoding]::UTF8.GetBytes($text)",
|
|
151
|
+
"[Console]::Out.Write([Convert]::ToBase64String($b))",
|
|
152
|
+
"",
|
|
153
|
+
].join("\r\n")
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 从进程内存里读出登录态。
|
|
158
|
+
*
|
|
159
|
+
* 内存里有两处:
|
|
160
|
+
* 1. `openid=...; accesstoken=...; refreshtoken=...; logintype=QC; ...`(cookie 形态)
|
|
161
|
+
* 2. 结构化对象 `{"openid":"...","accessToken":"..."}`
|
|
162
|
+
* 优先用 1(字段最全,带 logintype 和到期时刻)。
|
|
163
|
+
*/
|
|
164
|
+
export async function importFromDesktop() {
|
|
165
|
+
if (process.platform !== "win32") {
|
|
166
|
+
throw new Error("「从本机导入」只支持 Windows。请改用 QQ / 微信 登录。")
|
|
167
|
+
}
|
|
168
|
+
const pids = findPids()
|
|
169
|
+
if (!pids.length) {
|
|
170
|
+
throw new Error("没找到运行中的 Marvis 客户端。请先打开 Marvis 并登录,或改用 QQ / 微信 登录。")
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const dir = mkdtempSync(join(tmpdir(), "magpie-marvis-scan-"))
|
|
174
|
+
try {
|
|
175
|
+
writeFileSync(join(dir, "Scan.cs"), CS, "utf8")
|
|
176
|
+
|
|
177
|
+
let lastErr = ""
|
|
178
|
+
for (const pid of pids) {
|
|
179
|
+
writeFileSync(join(dir, "run.ps1"), ps1(pid), "utf8")
|
|
180
|
+
let b64 = ""
|
|
181
|
+
try {
|
|
182
|
+
b64 = execFileSync(
|
|
183
|
+
"powershell",
|
|
184
|
+
["-NoProfile", "-NonInteractive", "-ExecutionPolicy", "Bypass", "-File", join(dir, "run.ps1")],
|
|
185
|
+
{ encoding: "utf8", windowsHide: true, timeout: 180_000, maxBuffer: 128 * 1024 * 1024 },
|
|
186
|
+
).trim()
|
|
187
|
+
} catch (err) {
|
|
188
|
+
lastErr = String(err?.stderr ?? "").trim() || String(err?.message ?? err)
|
|
189
|
+
continue
|
|
190
|
+
}
|
|
191
|
+
const text = b64 ? Buffer.from(b64, "base64").toString("utf8") : ""
|
|
192
|
+
const acct = parseLoginState(text)
|
|
193
|
+
if (acct) return acct
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
throw new Error(
|
|
197
|
+
"读到了 Marvis 进程,但里面没有登录态。请在 Marvis 客户端里登录一次再试,或改用 QQ / 微信 登录。" +
|
|
198
|
+
(lastErr ? `(最后一次错误:${lastErr.slice(0, 200)})` : ""),
|
|
199
|
+
)
|
|
200
|
+
} finally {
|
|
201
|
+
try {
|
|
202
|
+
rmSync(dir, { recursive: true, force: true })
|
|
203
|
+
} catch {
|
|
204
|
+
/* 临时目录删不掉不影响主流程 */
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 从内存文本里抠登录态。
|
|
211
|
+
* @param {string} text
|
|
212
|
+
*/
|
|
213
|
+
export function parseLoginState(text) {
|
|
214
|
+
if (!text) return null
|
|
215
|
+
const guid = deviceGuid()
|
|
216
|
+
|
|
217
|
+
// 形态 1:cookie 串
|
|
218
|
+
const cookie = /openid=([0-9A-Fa-f]{16,64});\s*accesstoken=([^;\s]+);\s*(?:refreshtoken=([^;\s]+);\s*)?(?:logintype=([A-Za-z]+))?/
|
|
219
|
+
let m = cookie.exec(text)
|
|
220
|
+
if (m) {
|
|
221
|
+
const expire = /access_token_expire_time=(\d{10})/.exec(text)
|
|
222
|
+
return {
|
|
223
|
+
openid: m[1],
|
|
224
|
+
accessToken: m[2],
|
|
225
|
+
refreshToken: m[3] || undefined,
|
|
226
|
+
loginType: /^WX$/i.test(m[4] ?? "") ? "5" : "6",
|
|
227
|
+
guid,
|
|
228
|
+
expiresAt: expire ? Number(expire[1]) * 1000 : Date.now() + 30 * 24 * 3600_000,
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// 形态 2:`"openid":"...","accessToken":"..."` 结构化串
|
|
233
|
+
const json = /"openid"\s*:\s*"([0-9A-Fa-f]{16,64})"[\s\S]{0,600}?"accessToken"\s*:\s*"([^"]+)"/
|
|
234
|
+
m = json.exec(text)
|
|
235
|
+
if (m) {
|
|
236
|
+
const rt = /"refreshToken"\s*:\s*"([^"]+)"/.exec(text)
|
|
237
|
+
return {
|
|
238
|
+
openid: m[1],
|
|
239
|
+
accessToken: m[2],
|
|
240
|
+
refreshToken: rt?.[1],
|
|
241
|
+
loginType: "6",
|
|
242
|
+
guid,
|
|
243
|
+
expiresAt: Date.now() + 30 * 24 * 3600_000,
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return null
|
|
247
|
+
}
|