bobocup commited on
Commit
0ac1fc9
·
verified ·
1 Parent(s): d4736e2

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +73 -74
index.js CHANGED
@@ -101,24 +101,34 @@ class TokenManager {
101
  CONFIG.DEFAULT_HEADERS.Cookie = `idToken=${Tokens[currentIndex].idToken}; pr_refresh_token=${Tokens[currentIndex].pr_refresh_token};aws-waf-token=${Tokens[currentIndex].aws_waf_token};cwr_s=${Tokens[currentIndex].cwr_s};cwr_u=${sessionId}`;
102
  CONFIG.DEFAULT_HEADERS.referer = Tokens[currentIndex].refreshUrl;
103
  CONFIG.DEFAULT_HEADERS["request-id"] = `request-id-${Utils.uuidv4()}`;
 
104
  }
105
 
106
  async updateTokens(response, isWaf = false) {
107
  if (isWaf) {
108
- var wafToken = await Utils.extractWaf();
 
 
 
 
 
 
 
 
 
109
  if (wafToken) {
110
- // 更当前tokenaws_waf_token
111
- Tokens[currentIndex].aws_waf_token = wafToken;
112
- // 立即更新缓存headers
 
 
 
 
 
113
  await this.updateCacheTokens();
114
- // 更新Redis存储
115
  await this.updateRedisTokens();
116
- console.log("✅ 成功更新aws-waf-token到缓存");
117
- currentIndex = (currentIndex + 1) % Tokens.length;
118
  } else {
119
- console.log("❌ 提取aws-waf-token失败,切换账号");
120
- currentIndex = (currentIndex + 1) % Tokens.length;
121
- await this.updateCacheTokens();
122
  }
123
  } else {
124
  const newCsrfToken = response.headers.get('anti-csrftoken-a2z');
@@ -130,11 +140,12 @@ class TokenManager {
130
  if (idTokenMatch && idTokenMatch[1]) {
131
  Tokens[currentIndex].idToken = idTokenMatch[1];
132
  }
133
- this.updateRedisTokens();//最后更新redis数据库缓存,异步
134
  console.log("更新缓存完毕");
135
  }
136
- currentIndex = (currentIndex + 1) % Tokens.length;
137
  }
 
 
138
  }
139
  }
140
 
@@ -190,10 +201,15 @@ class Utils {
190
  }
191
  }
192
  static async extractWaf() {
193
- puppeteer.use(StealthPlugin())
194
  const browser = await puppeteer.launch({
195
  headless: true,
196
- args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu'],
 
 
 
 
 
197
  executablePath: CONFIG.CHROME_PATH
198
  });
199
 
@@ -202,28 +218,21 @@ class Utils {
202
  await page.setExtraHTTPHeaders({
203
  cookie: `pr_refresh_token=${Tokens[currentIndex].pr_refresh_token};idToken=${Tokens[currentIndex].idToken};aws-waf-token=${Tokens[currentIndex].aws_waf_token};cwr_s=${Tokens[currentIndex].cwr_s};cwr_u=${Utils.uuidv4()}`
204
  });
205
- await page.setUserAgent(
206
- CONFIG.DEFAULT_HEADERS["User-Agent"]
207
- )
208
 
209
- // 监听验证挑战
210
  page.on('response', async (response) => {
211
  if (response.url().includes('aws-waf-challenge')) {
212
  const screenshots = [];
213
-
214
- // 截取验证图片
215
  const challengeElements = await page.$$('.aws-waf-challenge');
216
  for (const element of challengeElements) {
217
  const screenshot = await element.screenshot({ encoding: 'base64' });
218
  screenshots.push(`data:image/png;base64,${screenshot}`);
219
  }
220
 
221
- // 调用Capsolver
222
  const solution = await this.solveAwsWaf(screenshots, 'aws:grid');
223
-
224
  if (solution?.objects) {
225
  console.log(`🎯 验证答案位置: ${solution.objects.join(', ')}`);
226
- // 自动点击验证答案
227
  await page.evaluate((objects) => {
228
  document.querySelectorAll('.grid-item').forEach((el, index) => {
229
  if (objects.includes(index)) el.click();
@@ -233,19 +242,21 @@ class Utils {
233
  }
234
  });
235
 
 
236
  await page.goto(Tokens[currentIndex].refreshUrl, {
237
  waitUntil: 'networkidle2',
238
  timeout: 30000
239
  });
240
 
241
- // 新增:等待验证完成
242
- await page.waitForTimeout(1000); // 等待1秒确保验证完成
243
- await page.waitForSelector('.aws-waf-challenge', { hidden: true, timeout: 15000 });
244
 
245
- // 获取最终token
246
- const awsWafToken = (await page.cookies()).find(
 
247
  cookie => cookie.name.toLowerCase() === 'aws-waf-token'
248
- )?.value;
 
249
 
250
  if (awsWafToken) {
251
  console.log(`🔑 成功获取aws-waf-token | 长度: ${awsWafToken.length}字符`);
@@ -255,7 +266,6 @@ class Utils {
255
 
256
  await browser.close();
257
  return awsWafToken;
258
-
259
  } catch (error) {
260
  console.error('获取aws-waf-token出错:', error);
261
  await browser.close();
@@ -308,10 +318,8 @@ async function initializeService() {
308
  let index = 0;
309
  while (true) {
310
  console.log(index, '开始检测是否有缓存');
311
- // 使用 JSON.parse 确保正确解析
312
  var checkRedis = await redisClient.get(`tokens_${index}`);
313
  if (checkRedis) {
314
- // 尝试解析 JSON 字符串
315
  try {
316
  const parsedRedis = typeof checkRedis === 'string'
317
  ? JSON.parse(checkRedis)
@@ -333,6 +341,7 @@ async function initializeService() {
333
  const refreshUrl = process.env[`AUTH_TOKENS_${index}_REFRESH_URL`];
334
  const anti_csrftoken_a2z = process.env[`AUTH_TOKENS_${index}_ANTI_CSRF_TOKEN`];
335
  const cookie = process.env[`AUTH_TOKENS_${index}_COOKIE`];
 
336
 
337
  if (!refreshUrl && !anti_csrftoken_a2z && !cookie) {
338
  break;
@@ -344,7 +353,7 @@ async function initializeService() {
344
  refreshUrl,
345
  anti_csrftoken_a2z,
346
  pr_refresh_token: cookies["pr_refresh_token"],
347
- aws_waf_token: cookies["aws-waf-token"],
348
  idToken: cookies["idToken"],
349
  cwr_s: cookies["cwr_s"]
350
  });
@@ -585,55 +594,45 @@ app.post('/hf/v1/chat/completions', async (req, res) => {
585
  if (authToken !== CONFIG.API.API_KEY) {
586
  return res.status(401).json({ error: "Unauthorized" });
587
  }
 
588
  await tokenManager.updateCacheTokens();
589
  const apiClient = new ApiClient(req.body.model);
590
  const requestPayload = await apiClient.transformMessages(req.body);
591
-
592
- try {
593
- console.log("开始请求");
594
- //发送请求
595
- var response = await fetch(`${CONFIG.API.BASE_URL}`, {
 
 
 
 
 
 
 
 
 
 
 
596
  method: "POST",
597
- headers: {
598
- ...CONFIG.DEFAULT_HEADERS
599
- },
600
  body: JSON.stringify(requestPayload)
601
  });
602
  reqStatus = response.status;
603
- switch (reqStatus) {
604
- case 200:
605
- console.log("请求成功");
606
- // 异步更新token
607
- tokenManager.updateTokens(response)
608
- // 处理响应
609
- if (req.body.stream) {
610
- await ResponseHandler.handleStreamResponse(response, req.body.model, res);
611
- } else {
612
- await ResponseHandler.handleNormalResponse(response, req.body.model, res);
613
- }
614
- return;
615
- case 202:
616
- console.log("请求受限,更新WAF");
617
- await tokenManager.updateTokens(response, true);
618
- throw new Error(`请求失败! status: ${response.statusText},已刷新验证信息,请重新请求`);
619
- case 405:
620
- console.log("人机验证");
621
- await tokenManager.updateTokens(response, true);//尝试获取waf,然后返回错误提示。
622
- throw new Error(`请求失败! status: ${response.statusText},人机验证,请重新请求,如果多次失败,请重新更换token`);
623
- case 400:
624
- console.log("信息过期,请求失败");
625
- await tokenManager.updateTokens(response);
626
- throw new Error(`请求失败! status: ${response.statusText},已刷新验证信息,请重新请求`);
627
- case 403:
628
- console.log("请求被阻止");
629
- await tokenManager.updateTokens(response, true);//尝试获取waf,然后返回错误提示。
630
- CONFIG.DEFAULT_HEADERS["User-Agent"] = await Utils.getRandomUserAgent();
631
- throw new Error(`请求失败! status: ${response.statusText},请重新请求,如果多次失败,请重新更换token`);
632
- default:
633
- throw new Error(`请求失败! status: ${response.status}`);
634
  }
635
- } catch (error) {
636
- throw new Error(`请求失败! status: ${response.status}`);
 
637
  }
638
  } catch (error) {
639
  res.status(parseInt(reqStatus)).json({
 
101
  CONFIG.DEFAULT_HEADERS.Cookie = `idToken=${Tokens[currentIndex].idToken}; pr_refresh_token=${Tokens[currentIndex].pr_refresh_token};aws-waf-token=${Tokens[currentIndex].aws_waf_token};cwr_s=${Tokens[currentIndex].cwr_s};cwr_u=${sessionId}`;
102
  CONFIG.DEFAULT_HEADERS.referer = Tokens[currentIndex].refreshUrl;
103
  CONFIG.DEFAULT_HEADERS["request-id"] = `request-id-${Utils.uuidv4()}`;
104
+ CONFIG.DEFAULT_HEADERS["User-Agent"] = await Utils.getRandomUserAgent();
105
  }
106
 
107
  async updateTokens(response, isWaf = false) {
108
  if (isWaf) {
109
+ let wafToken = await Utils.extractWaf();
110
+ console.log("原aws-waf-token:", Tokens[currentIndex].aws_waf_token);
111
+
112
+ // 如果新 token 与旧 token 相同,等待后重试一次
113
+ if (wafToken === Tokens[currentIndex].aws_waf_token) {
114
+ console.log("⚠️ 更新后的aws-waf-token与现有token一致,等待后重试一次");
115
+ await new Promise(resolve => setTimeout(resolve, 1000));
116
+ wafToken = await Utils.extractWaf();
117
+ }
118
+
119
  if (wafToken) {
120
+ console.log("获取aws-waf-token:", wafToken);
121
+ if (wafToken !== Tokens[currentIndex].aws_waf_token) {
122
+ console.log("✅ 成功更新aws-waf-token | 新token长度:", wafToken.length);
123
+ Tokens[currentIndex].aws_waf_token = wafToken;
124
+ } else {
125
+ console.log("⚠️ 重试后aws-waf-token依旧与现有token一致");
126
+ }
127
+ // 更新内存缓存和Redis持久化
128
  await this.updateCacheTokens();
 
129
  await this.updateRedisTokens();
 
 
130
  } else {
131
+ console.log("❌ 提取aws-waf-token失败");
 
 
132
  }
133
  } else {
134
  const newCsrfToken = response.headers.get('anti-csrftoken-a2z');
 
140
  if (idTokenMatch && idTokenMatch[1]) {
141
  Tokens[currentIndex].idToken = idTokenMatch[1];
142
  }
143
+ await this.updateRedisTokens();
144
  console.log("更新缓存完毕");
145
  }
 
146
  }
147
+ // 单账号场景下轮换仍然无副作用
148
+ currentIndex = (currentIndex + 1) % Tokens.length;
149
  }
150
  }
151
 
 
201
  }
202
  }
203
  static async extractWaf() {
204
+ puppeteer.use(StealthPlugin());
205
  const browser = await puppeteer.launch({
206
  headless: true,
207
+ args: [
208
+ '--no-sandbox',
209
+ '--disable-setuid-sandbox',
210
+ '--disable-dev-shm-usage',
211
+ '--disable-gpu'
212
+ ],
213
  executablePath: CONFIG.CHROME_PATH
214
  });
215
 
 
218
  await page.setExtraHTTPHeaders({
219
  cookie: `pr_refresh_token=${Tokens[currentIndex].pr_refresh_token};idToken=${Tokens[currentIndex].idToken};aws-waf-token=${Tokens[currentIndex].aws_waf_token};cwr_s=${Tokens[currentIndex].cwr_s};cwr_u=${Utils.uuidv4()}`
220
  });
221
+ await page.setUserAgent(CONFIG.DEFAULT_HEADERS["User-Agent"]);
 
 
222
 
223
+ // 监听验证挑战事件,自动截屏并解决挑战
224
  page.on('response', async (response) => {
225
  if (response.url().includes('aws-waf-challenge')) {
226
  const screenshots = [];
 
 
227
  const challengeElements = await page.$$('.aws-waf-challenge');
228
  for (const element of challengeElements) {
229
  const screenshot = await element.screenshot({ encoding: 'base64' });
230
  screenshots.push(`data:image/png;base64,${screenshot}`);
231
  }
232
 
 
233
  const solution = await this.solveAwsWaf(screenshots, 'aws:grid');
 
234
  if (solution?.objects) {
235
  console.log(`🎯 验证答案位置: ${solution.objects.join(', ')}`);
 
236
  await page.evaluate((objects) => {
237
  document.querySelectorAll('.grid-item').forEach((el, index) => {
238
  if (objects.includes(index)) el.click();
 
242
  }
243
  });
244
 
245
+ // 进入验证页
246
  await page.goto(Tokens[currentIndex].refreshUrl, {
247
  waitUntil: 'networkidle2',
248
  timeout: 30000
249
  });
250
 
251
+ // 延长等待时间让挑战完成(根据实际情况可调整)
252
+ await page.waitForTimeout(5000);
 
253
 
254
+ // 再次等待,确保所有动态变动已结束
255
+ const cookies = await page.cookies();
256
+ const awsWafCookie = cookies.find(
257
  cookie => cookie.name.toLowerCase() === 'aws-waf-token'
258
+ );
259
+ const awsWafToken = awsWafCookie ? awsWafCookie.value : null;
260
 
261
  if (awsWafToken) {
262
  console.log(`🔑 成功获取aws-waf-token | 长度: ${awsWafToken.length}字符`);
 
266
 
267
  await browser.close();
268
  return awsWafToken;
 
269
  } catch (error) {
270
  console.error('获取aws-waf-token出错:', error);
271
  await browser.close();
 
318
  let index = 0;
319
  while (true) {
320
  console.log(index, '开始检测是否有缓存');
 
321
  var checkRedis = await redisClient.get(`tokens_${index}`);
322
  if (checkRedis) {
 
323
  try {
324
  const parsedRedis = typeof checkRedis === 'string'
325
  ? JSON.parse(checkRedis)
 
341
  const refreshUrl = process.env[`AUTH_TOKENS_${index}_REFRESH_URL`];
342
  const anti_csrftoken_a2z = process.env[`AUTH_TOKENS_${index}_ANTI_CSRF_TOKEN`];
343
  const cookie = process.env[`AUTH_TOKENS_${index}_COOKIE`];
344
+ const wafToken = process.env[`AUTH_TOKENS_${index}_WAF_TOKEN`];
345
 
346
  if (!refreshUrl && !anti_csrftoken_a2z && !cookie) {
347
  break;
 
353
  refreshUrl,
354
  anti_csrftoken_a2z,
355
  pr_refresh_token: cookies["pr_refresh_token"],
356
+ aws_waf_token: wafToken || cookies["aws-waf-token"], // 优先使用独立的WAF token
357
  idToken: cookies["idToken"],
358
  cwr_s: cookies["cwr_s"]
359
  });
 
594
  if (authToken !== CONFIG.API.API_KEY) {
595
  return res.status(401).json({ error: "Unauthorized" });
596
  }
597
+ // 每次请求前确保请求头更新为最新的token信息
598
  await tokenManager.updateCacheTokens();
599
  const apiClient = new ApiClient(req.body.model);
600
  const requestPayload = await apiClient.transformMessages(req.body);
601
+
602
+ console.log("开始请求");
603
+ let response = await fetch(`${CONFIG.API.BASE_URL}`, {
604
+ method: "POST",
605
+ headers: { ...CONFIG.DEFAULT_HEADERS },
606
+ body: JSON.stringify(requestPayload)
607
+ });
608
+ reqStatus = response.status;
609
+
610
+ // 当出现请求受限或人机验证时,先更新token,再重试一次
611
+ if ([202, 405].includes(reqStatus)) {
612
+ console.log("请求受限或人机验证,正在更新token并重试请求");
613
+ await tokenManager.updateTokens(response, true);
614
+ // 延时1秒,等待新token生效
615
+ await new Promise(resolve => setTimeout(resolve, 1000));
616
+ response = await fetch(`${CONFIG.API.BASE_URL}`, {
617
  method: "POST",
618
+ headers: { ...CONFIG.DEFAULT_HEADERS },
 
 
619
  body: JSON.stringify(requestPayload)
620
  });
621
  reqStatus = response.status;
622
+ }
623
+
624
+ if (reqStatus === 200) {
625
+ console.log("请求成功");
626
+ // 异步更新token(注意此处可不用 await 以保证响应速度)
627
+ tokenManager.updateTokens(response);
628
+ if (req.body.stream) {
629
+ await ResponseHandler.handleStreamResponse(response, req.body.model, res);
630
+ } else {
631
+ await ResponseHandler.handleNormalResponse(response, req.body.model, res);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
632
  }
633
+ return;
634
+ } else {
635
+ throw new Error(`请求失败! status: ${response.statusText}`);
636
  }
637
  } catch (error) {
638
  res.status(parseInt(reqStatus)).json({