部署 zai2api 到 HF Space
Browse files- captcha-provider/server.js +66 -36
captcha-provider/server.js
CHANGED
|
@@ -150,8 +150,16 @@ async function acquireToken() {
|
|
| 150 |
Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN', 'zh', 'en-US', 'en'] });
|
| 151 |
window.chrome = { runtime: {}, loadTimes: () => ({}) };
|
| 152 |
});
|
| 153 |
-
const freshPage = await localCtx.newPage();
|
| 154 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
await freshPage.waitForTimeout(3000);
|
| 156 |
|
| 157 |
// 注入阿里云 captcha SDK
|
|
@@ -169,42 +177,64 @@ async function acquireToken() {
|
|
| 169 |
await freshPage.waitForTimeout(1000);
|
| 170 |
|
| 171 |
const token = await freshPage.evaluate(async (sceneId) => {
|
| 172 |
-
if (typeof window.initAliyunCaptcha !== 'function') {
|
| 173 |
-
throw new Error('initAliyunCaptcha not available after injection');
|
| 174 |
-
}
|
| 175 |
-
const id = '
|
| 176 |
-
const triggerId = '
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
container
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
trigger
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 188 |
const timeout = setTimeout(() => reject(new Error('captcha timeout')), 60000);
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 195 |
timeout: 30000,
|
| 196 |
-
delayBeforeSuccess: false,
|
| 197 |
-
success: (token) => { clearTimeout(timeout); resolve(token); },
|
| 198 |
-
fail: () => {
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 208 |
|
| 209 |
return token;
|
| 210 |
} finally {
|
|
|
|
| 150 |
Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN', 'zh', 'en-US', 'en'] });
|
| 151 |
window.chrome = { runtime: {}, loadTimes: () => ({}) };
|
| 152 |
});
|
| 153 |
+
const freshPage = await localCtx.newPage();
|
| 154 |
+
freshPage.on('console', (msg) => {
|
| 155 |
+
if (msg.type() === 'warning' || msg.type() === 'error') {
|
| 156 |
+
console.log(`[provider:page:${msg.type()}] ${msg.text()}`);
|
| 157 |
+
}
|
| 158 |
+
});
|
| 159 |
+
freshPage.on('pageerror', (err) => {
|
| 160 |
+
console.error(`[provider:page:error] ${err.message}`);
|
| 161 |
+
});
|
| 162 |
+
await freshPage.goto(ZAI_URL, { waitUntil: 'domcontentloaded', timeout: 30000 });
|
| 163 |
await freshPage.waitForTimeout(3000);
|
| 164 |
|
| 165 |
// 注入阿里云 captcha SDK
|
|
|
|
| 177 |
await freshPage.waitForTimeout(1000);
|
| 178 |
|
| 179 |
const token = await freshPage.evaluate(async (sceneId) => {
|
| 180 |
+
if (typeof window.initAliyunCaptcha !== 'function') {
|
| 181 |
+
throw new Error('initAliyunCaptcha not available after injection');
|
| 182 |
+
}
|
| 183 |
+
const id = 'chat-captcha-element';
|
| 184 |
+
const triggerId = 'chat-captcha-trigger';
|
| 185 |
+
document.getElementById(id)?.remove();
|
| 186 |
+
document.getElementById(triggerId)?.remove();
|
| 187 |
+
const container = document.createElement('div');
|
| 188 |
+
container.id = id;
|
| 189 |
+
container.style.cssText = 'position:absolute;left:-99999px;top:-99999px;width:0;height:0;overflow:hidden;pointer-events:none;';
|
| 190 |
+
document.body.appendChild(container);
|
| 191 |
+
const trigger = document.createElement('button');
|
| 192 |
+
trigger.id = triggerId;
|
| 193 |
+
trigger.type = 'button';
|
| 194 |
+
trigger.setAttribute('aria-hidden', 'true');
|
| 195 |
+
trigger.tabIndex = -1;
|
| 196 |
+
trigger.style.cssText = 'position:absolute;left:-99999px;top:-99999px;width:1px;height:1px;opacity:0;';
|
| 197 |
+
document.body.appendChild(trigger);
|
| 198 |
+
|
| 199 |
+
try {
|
| 200 |
+
return await new Promise((resolve, reject) => {
|
| 201 |
const timeout = setTimeout(() => reject(new Error('captcha timeout')), 60000);
|
| 202 |
+
let clickCount = 0;
|
| 203 |
+
const clickTrigger = () => {
|
| 204 |
+
if (clickCount >= 3) return;
|
| 205 |
+
clickCount++;
|
| 206 |
+
setTimeout(() => trigger.click(), 500);
|
| 207 |
+
};
|
| 208 |
+
window.initAliyunCaptcha({
|
| 209 |
+
SceneId: sceneId,
|
| 210 |
+
mode: 'popup',
|
| 211 |
+
element: `#${id}`,
|
| 212 |
+
button: `#${triggerId}`,
|
| 213 |
+
captchaLogoImg: 'https://z-cdn.chatglm.cn/z-ai/static/logo.svg',
|
| 214 |
+
language: 'cn',
|
| 215 |
timeout: 30000,
|
| 216 |
+
delayBeforeSuccess: false,
|
| 217 |
+
success: (token) => { clearTimeout(timeout); resolve(token); },
|
| 218 |
+
fail: (err) => {
|
| 219 |
+
console.warn('chat captcha fail', err);
|
| 220 |
+
if (clickCount < 3) {
|
| 221 |
+
clickTrigger();
|
| 222 |
+
} else {
|
| 223 |
+
clearTimeout(timeout);
|
| 224 |
+
reject(new Error('captcha fail: ' + JSON.stringify(err)));
|
| 225 |
+
}
|
| 226 |
+
},
|
| 227 |
+
onError: (err) => { clearTimeout(timeout); reject(new Error('captcha error: ' + JSON.stringify(err))); },
|
| 228 |
+
onClose: () => { clearTimeout(timeout); reject(new Error('captcha closed')); },
|
| 229 |
+
getInstance: () => { clickTrigger(); },
|
| 230 |
+
});
|
| 231 |
+
setTimeout(clickTrigger, 1500);
|
| 232 |
+
});
|
| 233 |
+
} finally {
|
| 234 |
+
try { container.remove(); } catch {}
|
| 235 |
+
try { trigger.remove(); } catch {}
|
| 236 |
+
}
|
| 237 |
+
}, SCENE_ID);
|
| 238 |
|
| 239 |
return token;
|
| 240 |
} finally {
|