bobocup commited on
Commit
61b0d6b
·
verified ·
1 Parent(s): fb3eefa

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +71 -134
index.js CHANGED
@@ -18,8 +18,7 @@ const CONFIG = {
18
  BASE_URL: process.env.DENO_URL || "https://partyrock.aws/stream/getCompletion",//如果需要多号循环,需要设置你自己的denourl
19
  API_KEY: process.env.API_KEY || "sk-123456",//自定义你自己的认证密钥,记得修改
20
  RedisUrl: process.env.RedisUrl,
21
- RedisToken: process.env.RedisToken,
22
- CAPSOLVER_KEY: process.env.CAPSOLVER_KEY // 完全从环境变量读取
23
  },
24
  SERVER: {
25
  PORT: process.env.PORT || 3000,
@@ -101,34 +100,21 @@ 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
- 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,12 +126,11 @@ class TokenManager {
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
 
@@ -164,44 +149,8 @@ class Utils {
164
  return type[Math.floor(Math.random() * type.length)]
165
  }
166
  }
167
- static async solveAwsWaf(images, questionType = 'aws:grid') {
168
- try {
169
- console.log(`开始Capsolver验证 (类型: ${questionType}), 图片数量: ${images.length}`);
170
-
171
- const response = await fetch('https://api.capsolver.com/createTask', {
172
- method: 'POST',
173
- headers: {
174
- 'Content-Type': 'application/json',
175
- },
176
- body: JSON.stringify({
177
- clientKey: CONFIG.API.CAPSOLVER_KEY,
178
- task: {
179
- type: 'AwsWafClassification',
180
- websiteURL: Tokens[currentIndex].refreshUrl,
181
- images: images,
182
- question: questionType
183
- }
184
- })
185
- });
186
-
187
- const data = await response.json();
188
- if (data.errorId === 0) {
189
- if (data.status === 'ready') {
190
- console.log(`✅ Capsolver验证成功 | 任务ID: ${data.taskId} | 使用图片: ${images.length}张`);
191
- return data.solution;
192
- }
193
- console.log(`⏳ Capsolver处理中 | 任务ID: ${data.taskId} | 状态: ${data.status}`);
194
- } else {
195
- console.error(`❌ Capsolver错误 | 代码: ${data.errorCode} | 描述: ${data.errorDescription}`);
196
- }
197
- return null;
198
- } catch (error) {
199
- console.error('Capsolver请求失败:', error);
200
- return null;
201
- }
202
- }
203
  static async extractWaf() {
204
- puppeteer.use(StealthPlugin());
205
  const browser = await puppeteer.launch({
206
  headless: true,
207
  args: [
@@ -212,62 +161,40 @@ class Utils {
212
  ],
213
  executablePath: CONFIG.CHROME_PATH
214
  });
215
-
216
  try {
217
  const page = await browser.newPage();
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();
239
- });
240
- }, solution.objects);
241
- }
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}字符`);
 
263
  } else {
264
- console.error('❌ 获取aws-waf-token失败');
 
265
  }
266
 
267
- await browser.close();
268
- return awsWafToken;
269
  } catch (error) {
270
- console.error('获取aws-waf-token出错:', error);
271
  await browser.close();
272
  return null;
273
  }
@@ -595,45 +522,55 @@ app.post('/hf/v1/chat/completions', async (req, res) => {
595
  if (authToken !== CONFIG.API.API_KEY) {
596
  return res.status(401).json({ error: "Unauthorized" });
597
  }
598
- // 每次请求前确保请求头更新为最新的token信息
599
  await tokenManager.updateCacheTokens();
600
  const apiClient = new ApiClient(req.body.model);
601
  const requestPayload = await apiClient.transformMessages(req.body);
602
-
603
- console.log("开始请求");
604
- let response = await fetch(`${CONFIG.API.BASE_URL}`, {
605
- method: "POST",
606
- headers: { ...CONFIG.DEFAULT_HEADERS },
607
- body: JSON.stringify(requestPayload)
608
- });
609
- reqStatus = response.status;
610
-
611
- // 当出现请求受限或人机验证时,先更新token,再重试一次
612
- if ([202, 405].includes(reqStatus)) {
613
- console.log("请求受限或人机验证,正在更新token并重试请求");
614
- await tokenManager.updateTokens(response, true);
615
- // 延时1秒,等待新token生效
616
- await new Promise(resolve => setTimeout(resolve, 1000));
617
- response = await fetch(`${CONFIG.API.BASE_URL}`, {
618
  method: "POST",
619
- headers: { ...CONFIG.DEFAULT_HEADERS },
 
 
620
  body: JSON.stringify(requestPayload)
621
  });
622
  reqStatus = response.status;
623
- }
624
-
625
- if (reqStatus === 200) {
626
- console.log("请求成功");
627
- // 异步更新token(注意此处可不用 await 以保证响应速度)
628
- tokenManager.updateTokens(response);
629
- if (req.body.stream) {
630
- await ResponseHandler.handleStreamResponse(response, req.body.model, res);
631
- } else {
632
- await ResponseHandler.handleNormalResponse(response, req.body.model, res);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
633
  }
634
- return;
635
- } else {
636
- throw new Error(`请求失败! status: ${response.statusText}`);
637
  }
638
  } catch (error) {
639
  res.status(parseInt(reqStatus)).json({
 
18
  BASE_URL: process.env.DENO_URL || "https://partyrock.aws/stream/getCompletion",//如果需要多号循环,需要设置你自己的denourl
19
  API_KEY: process.env.API_KEY || "sk-123456",//自定义你自己的认证密钥,记得修改
20
  RedisUrl: process.env.RedisUrl,
21
+ RedisToken: process.env.RedisToken
 
22
  },
23
  SERVER: {
24
  PORT: process.env.PORT || 3000,
 
100
  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}`;
101
  CONFIG.DEFAULT_HEADERS.referer = Tokens[currentIndex].refreshUrl;
102
  CONFIG.DEFAULT_HEADERS["request-id"] = `request-id-${Utils.uuidv4()}`;
 
103
  }
104
 
105
  async updateTokens(response, isWaf = false) {
106
  if (isWaf) {
107
+ var wafToken = await Utils.extractWaf();
 
 
 
 
 
 
 
 
 
108
  if (wafToken) {
109
+ Tokens[currentIndex].aws_waf_token = wafToken;
 
 
 
 
 
 
 
110
  await this.updateCacheTokens();
111
+ this.updateRedisTokens();
112
+ currentIndex = (currentIndex + 1) % Tokens.length;
113
+ console.log("成功提取 aws-waf-token");
114
  } else {
115
+ currentIndex = (currentIndex + 1) % Tokens.length;
116
+ await this.updateCacheTokens();
117
+ console.log("提取aws-waf-token失败");
118
  }
119
  } else {
120
  const newCsrfToken = response.headers.get('anti-csrftoken-a2z');
 
126
  if (idTokenMatch && idTokenMatch[1]) {
127
  Tokens[currentIndex].idToken = idTokenMatch[1];
128
  }
129
+ this.updateRedisTokens();//最后更新redis数据库缓存,异步
130
  console.log("更新缓存完毕");
131
  }
132
+ currentIndex = (currentIndex + 1) % Tokens.length;
133
  }
 
 
134
  }
135
  }
136
 
 
149
  return type[Math.floor(Math.random() * type.length)]
150
  }
151
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  static async extractWaf() {
153
+ puppeteer.use(StealthPlugin())
154
  const browser = await puppeteer.launch({
155
  headless: true,
156
  args: [
 
161
  ],
162
  executablePath: CONFIG.CHROME_PATH
163
  });
 
164
  try {
165
  const page = await browser.newPage();
166
  await page.setExtraHTTPHeaders({
167
  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()}`
168
  });
169
+ await page.setUserAgent(
170
+ CONFIG.DEFAULT_HEADERS["User-Agent"]
171
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
  await page.goto(Tokens[currentIndex].refreshUrl, {
173
  waitUntil: 'networkidle2',
174
  timeout: 30000
175
  });
176
+ await page.evaluate(() => {
177
+ // 随机滚动
178
+ window.scrollBy(0, Math.random() * 500)
179
+ })
180
+ await page.evaluate(() => {
181
+ return new Promise(resolve => setTimeout(resolve, 2000))
182
+ })
183
+ // 直接从页面 cookies 中提取 aws-waf-token
184
+ const awsWafToken = (await page.cookies()).find(
185
  cookie => cookie.name.toLowerCase() === 'aws-waf-token'
186
+ )?.value;
 
187
 
188
  if (awsWafToken) {
189
+ await browser.close();
190
+ return awsWafToken;
191
  } else {
192
+ await browser.close();
193
+ return null;
194
  }
195
 
 
 
196
  } catch (error) {
197
+ console.error('获取 aws-waf-token 出错:', error);
198
  await browser.close();
199
  return null;
200
  }
 
522
  if (authToken !== CONFIG.API.API_KEY) {
523
  return res.status(401).json({ error: "Unauthorized" });
524
  }
 
525
  await tokenManager.updateCacheTokens();
526
  const apiClient = new ApiClient(req.body.model);
527
  const requestPayload = await apiClient.transformMessages(req.body);
528
+
529
+ try {
530
+ console.log("开始请求");
531
+ //发送请求
532
+ var response = await fetch(`${CONFIG.API.BASE_URL}`, {
 
 
 
 
 
 
 
 
 
 
 
533
  method: "POST",
534
+ headers: {
535
+ ...CONFIG.DEFAULT_HEADERS
536
+ },
537
  body: JSON.stringify(requestPayload)
538
  });
539
  reqStatus = response.status;
540
+ switch (reqStatus) {
541
+ case 200:
542
+ console.log("请求成功");
543
+ // 异步更新token
544
+ tokenManager.updateTokens(response)
545
+ // 处理响应
546
+ if (req.body.stream) {
547
+ await ResponseHandler.handleStreamResponse(response, req.body.model, res);
548
+ } else {
549
+ await ResponseHandler.handleNormalResponse(response, req.body.model, res);
550
+ }
551
+ return;
552
+ case 202:
553
+ console.log("请求受限,更新WAF");
554
+ await tokenManager.updateTokens(response, true);
555
+ throw new Error(`请求失败! status: ${response.statusText},已刷新验证信息,请重新请求`);
556
+ case 405:
557
+ console.log("人机验证");
558
+ await tokenManager.updateTokens(response, true);//尝试获取waf,然后返回错误提示。
559
+ throw new Error(`请求失败! status: ${response.statusText},人机验证,请重新请求,如果多次失败,请重新更换token`);
560
+ case 400:
561
+ console.log("信息过期,请求失败");
562
+ await tokenManager.updateTokens(response);
563
+ throw new Error(`请求失败! status: ${response.statusText},已刷新验证信息,请重新请求`);
564
+ case 403:
565
+ console.log("请求被阻止");
566
+ await tokenManager.updateTokens(response, true);//尝试获取waf,然后返回错误提示。
567
+ CONFIG.DEFAULT_HEADERS["User-Agent"] = await Utils.getRandomUserAgent();
568
+ throw new Error(`请求失败! status: ${response.statusText},请重新请求,如果多次失败,请重新更换token`);
569
+ default:
570
+ throw new Error(`请求失败! status: ${response.status}`);
571
  }
572
+ } catch (error) {
573
+ throw new Error(`请求失败! status: ${response.status}`);
 
574
  }
575
  } catch (error) {
576
  res.status(parseInt(reqStatus)).json({