bg5 commited on
Commit
f7d94b4
·
verified ·
1 Parent(s): 75baee6

部署 zai2api 到 HF Space

Browse files
Files changed (1) hide show
  1. 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
- await freshPage.goto(ZAI_URL, { waitUntil: 'domcontentloaded', timeout: 30000 });
 
 
 
 
 
 
 
 
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 = 'c-' + Date.now() + '-' + Math.random().toString(36).slice(2, 6);
176
- const triggerId = 't-' + id;
177
- const container = document.createElement('div');
178
- container.id = id;
179
- container.style.cssText = 'position:fixed;top:-9999px;left:-9999px;width:1px;height:1px;overflow:hidden;';
180
- document.body.appendChild(container);
181
- const trigger = document.createElement('button');
182
- trigger.id = triggerId;
183
- trigger.style.cssText = 'display:none;';
184
- container.appendChild(trigger);
185
-
186
- try {
187
- return await new Promise((resolve, reject) => {
 
 
 
 
 
188
  const timeout = setTimeout(() => reject(new Error('captcha timeout')), 60000);
189
- window.initAliyunCaptcha({
190
- SceneId: sceneId,
191
- mode: 'popup',
192
- element: `#${id}`,
193
- button: `#${triggerId}`,
194
- language: 'cn',
 
 
 
 
 
 
 
195
  timeout: 30000,
196
- delayBeforeSuccess: false,
197
- success: (token) => { clearTimeout(timeout); resolve(token); },
198
- fail: () => {},
199
- onError: (err) => { clearTimeout(timeout); reject(new Error('captcha error: ' + JSON.stringify(err))); },
200
- onClose: () => {},
201
- });
202
- setTimeout(() => trigger.click(), 500);
203
- });
204
- } finally {
205
- try { container.remove(); } catch {}
206
- }
207
- }, SCENE_ID);
 
 
 
 
 
 
 
 
 
 
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 {