yxmiler commited on
Commit
db08733
·
verified ·
1 Parent(s): 71b614e

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +165 -32
index.js CHANGED
@@ -2,16 +2,20 @@ import fetch from 'node-fetch';
2
  import express from 'express';
3
  import cors from 'cors';
4
  import dotenv from 'dotenv';
 
5
 
6
  dotenv.config();
7
 
8
- const Tokens =[];
9
  let tokenManager;
 
10
  let currentIndex = 0;
11
  const CONFIG = {
12
  API: {
13
  BASE_URL: "https://partyrock.aws",
14
- API_KEY: process.env.API_KEY || "sk-123456"//自定义你自己的认证密钥,记得修改
 
 
15
  },
16
  RETRY: {
17
  MAX_ATTEMPTS: 1,
@@ -49,33 +53,127 @@ const CONFIG = {
49
  "Cookie": "",
50
  "accept-language": "zh-CN,zh;q=0.9",
51
  "priority": "u=1, i"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  }
53
  };
54
-
55
  class TokenManager {
 
 
 
 
 
 
 
 
56
  async updateCacheTokens() {
57
  CONFIG.DEFAULT_HEADERS["anti-csrftoken-a2z"] = Tokens[currentIndex]["anti_csrftoken_a2z"];
58
  CONFIG.DEFAULT_HEADERS.Cookie = `idToken=${Tokens[currentIndex]["idToken"]}; pr_refresh_token=${Tokens[currentIndex]["pr_refresh_token"]};aws-waf-token=${Tokens[currentIndex]["aws_waf_token"]}`;
59
  CONFIG.DEFAULT_HEADERS.referer = Tokens[currentIndex]["refreshUrl"];
60
  }
61
 
62
- async updateTokens(response) {
63
- const newCsrfToken = response.headers.get('anti-csrftoken-a2z');
64
- if (newCsrfToken) {
65
- Tokens[currentIndex]["anti_csrftoken_a2z"] = newCsrfToken;
 
 
 
 
 
 
66
  }
67
-
68
  const cookies = response.headers.get('set-cookie');
69
- if (cookies) {
 
 
70
  const idTokenMatch = cookies.match(/idToken=([^;]+)/);
71
  if (idTokenMatch && idTokenMatch[1]) {
72
  Tokens[currentIndex]["idToken"] = idTokenMatch[1];
73
  }
 
 
74
  }
75
  currentIndex = (currentIndex + 1) % Tokens.length;
76
  }
77
  }
 
 
78
  class Utils {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  static async extractTokens(cookieString) {
80
  const tokens = {};
81
  const cookiePairs = cookieString.split(';').map(pair => pair.trim());
@@ -116,30 +214,55 @@ class Utils {
116
  }
117
  async function initializeService() {
118
  console.log('服务初始化中...');
119
- // 遍历所有可能的 token
 
 
120
  let index = 0;
121
  while (true) {
122
- const refreshUrl = process.env[`AUTH_TOKENS_${index}_REFRESH_URL`];
123
- const anti_csrftoken_a2z = process.env[`AUTH_TOKENS_${index}_ANTI_CSRF_TOKEN`];
124
- const cookie = process.env[`AUTH_TOKENS_${index}_COOKIE`];
125
- if (!refreshUrl && !anti_csrftoken_a2z && !cookie) {
126
- break;
127
- }
128
- const cookies = await Utils.extractTokens(cookie);
129
- // 只有当所有属性都存在时才添加 token
130
- if (refreshUrl && anti_csrftoken_a2z && cookie) {
131
- Tokens.push({
132
- refreshUrl,
133
- anti_csrftoken_a2z,
134
- pr_refresh_token: cookies["pr_refresh_token"],
135
- aws_waf_token: cookies["aws-waf-token"],
136
- idToken: cookies["idToken"]
137
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
  }
139
  index++;
140
  }
141
-
142
- tokenManager = new TokenManager();
143
  }
144
 
145
  await initializeService();
@@ -285,6 +408,10 @@ class ResponseHandler {
285
  if (trimmedLine && trimmedLine.startsWith('data: ')) {
286
  const data = trimmedLine.substring(6);
287
  if (!data) continue;
 
 
 
 
288
  try {
289
  const json = JSON.parse(data);
290
  if (json?.text) {
@@ -366,6 +493,7 @@ app.get('/hf/v1/models', (req, res) => {
366
  });
367
 
368
  app.post('/hf/v1/chat/completions', async (req, res) => {
 
369
  try {
370
  const authToken = req.headers.authorization?.replace('Bearer ', '');
371
  if (authToken !== CONFIG.API.API_KEY) {
@@ -389,16 +517,20 @@ app.post('/hf/v1/chat/completions', async (req, res) => {
389
  },
390
  body: JSON.stringify(requestPayload)
391
  });
392
- await tokenManager.updateTokens(response);
393
  if (response.status == 200) {
394
  console.log("请求成功");
395
  break; // 如果请求成功,跳出重试循环
396
  }
397
  if (response.status != 200) {
398
- console.error(JSON.stringify(await response.text(), null, 2));
 
 
 
 
399
  }
400
  retryCount++;
401
  if (retryCount >= CONFIG.RETRY.MAX_ATTEMPTS) {
 
402
  throw new Error(`上游服务请求失败! status: ${response.status}`);
403
  }
404
  // 等待一段时间后重试
@@ -418,9 +550,10 @@ app.post('/hf/v1/chat/completions', async (req, res) => {
418
  } else {
419
  await ResponseHandler.handleNormalResponse(response, req.body.model, res);
420
  }
421
-
 
422
  } catch (error) {
423
- res.status(500).json({
424
  error: {
425
  message: error.message,
426
  type: 'server_error',
 
2
  import express from 'express';
3
  import cors from 'cors';
4
  import dotenv from 'dotenv';
5
+ import puppeteer from 'puppeteer';
6
 
7
  dotenv.config();
8
 
9
+ const Tokens = [];
10
  let tokenManager;
11
+ let redisClient;
12
  let currentIndex = 0;
13
  const CONFIG = {
14
  API: {
15
  BASE_URL: "https://partyrock.aws",
16
+ API_KEY: process.env.API_KEY || "sk-123456",//自定义你自己的认证密钥,记得修改
17
+ RedisUrl: process.env.RedisUrl,
18
+ RedisToken: process.env.RedisToken
19
  },
20
  RETRY: {
21
  MAX_ATTEMPTS: 1,
 
53
  "Cookie": "",
54
  "accept-language": "zh-CN,zh;q=0.9",
55
  "priority": "u=1, i"
56
+ },
57
+ CHROME_PATH: process.env.CHROME_PATH || "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
58
+ };
59
+ var RedisClient = class {
60
+ constructor() {
61
+ this.url = CONFIG.API.RedisUrl;
62
+ this.token = CONFIG.API.RedisToken;
63
+ console.log(this.url, this.token);
64
+ }
65
+ async get(key) {
66
+ const response = await fetch(`${this.url}/get/${key}`, {
67
+ headers: {
68
+ Authorization: `Bearer ${this.token}`
69
+ }
70
+ });
71
+ if (!response.ok) {
72
+ console.log("redis获取内容失败", response.status);
73
+ }
74
+ const data = await response.json();
75
+ return data.result;
76
+ }
77
+ async set(key, value) {
78
+ const url = `${this.url}/set/${key}`;
79
+ const response = await fetch(url, {
80
+ method: "POST",
81
+ headers: {
82
+ Authorization: `Bearer ${this.token}`
83
+ },
84
+ body: `${value}`
85
+ });
86
+ if (!response.ok) {
87
+ console.log("redis设置内容失败", response.status);
88
+ }
89
  }
90
  };
 
91
  class TokenManager {
92
+ async updateRedisTokens() {
93
+ await redisClient.set(`tokens_${currentIndex}`, JSON.stringify(Tokens[currentIndex]));
94
+ }
95
+ async getRedisTokens() {
96
+ var checkRedis = JSON.parse(await redisClient.get(`tokens_${currentIndex}`));
97
+ return checkRedis;
98
+ }
99
+
100
  async updateCacheTokens() {
101
  CONFIG.DEFAULT_HEADERS["anti-csrftoken-a2z"] = Tokens[currentIndex]["anti_csrftoken_a2z"];
102
  CONFIG.DEFAULT_HEADERS.Cookie = `idToken=${Tokens[currentIndex]["idToken"]}; pr_refresh_token=${Tokens[currentIndex]["pr_refresh_token"]};aws-waf-token=${Tokens[currentIndex]["aws_waf_token"]}`;
103
  CONFIG.DEFAULT_HEADERS.referer = Tokens[currentIndex]["refreshUrl"];
104
  }
105
 
106
+ async updateTokens(response, isWaf = false) {
107
+ if (isWaf) {
108
+ console.log("更新waf");
109
+ if (await Utils.extractWaf()) {
110
+ Tokens[currentIndex]["aws_waf_token"] = await Utils.extractWaf();
111
+ return;
112
+ } else {
113
+ console.log("提取aws-waf-token失败");
114
+ currentIndex = (currentIndex + 1) % Tokens.length;
115
+ }
116
  }
117
+ const newCsrfToken = response.headers.get('anti-csrftoken-a2z');
118
  const cookies = response.headers.get('set-cookie');
119
+ if (newCsrfToken && cookies) {
120
+ console.log("更新缓存");
121
+ Tokens[currentIndex]["anti_csrftoken_a2z"] = newCsrfToken;
122
  const idTokenMatch = cookies.match(/idToken=([^;]+)/);
123
  if (idTokenMatch && idTokenMatch[1]) {
124
  Tokens[currentIndex]["idToken"] = idTokenMatch[1];
125
  }
126
+ await this.updateRedisTokens();//最后更新redis数据库缓存
127
+ console.log("更新缓存完毕");
128
  }
129
  currentIndex = (currentIndex + 1) % Tokens.length;
130
  }
131
  }
132
+
133
+
134
  class Utils {
135
+ static async extractWaf() {
136
+ const browser = await puppeteer.launch({
137
+ headless: true,
138
+ args: [
139
+ '--no-sandbox',
140
+ '--disable-setuid-sandbox',
141
+ '--disable-dev-shm-usage',
142
+ '--disable-gpu'
143
+ ],
144
+ executablePath: CONFIG.CHROME_PATH
145
+ });
146
+ try {
147
+ const page = await browser.newPage();
148
+ await page.setExtraHTTPHeaders({
149
+ cookie: `pr_refresh_token=${Tokens[currentIndex]["pr_refresh_token"]};aws-waf-token=${Tokens[currentIndex]["aws_waf_token"]};idToken=${Tokens[currentIndex]["idToken"]}`
150
+ });
151
+
152
+ await page.goto(Tokens[currentIndex]["refreshUrl"], { waitUntil: 'networkidle0' });
153
+
154
+ // 直接从页面 cookies 中提取 aws-waf-token
155
+ const awsWafToken = (await page.cookies()).find(
156
+ cookie => cookie.name.toLowerCase() === 'aws-waf-token'
157
+ )?.value;
158
+
159
+ if (awsWafToken) {
160
+ Tokens[currentIndex]["aws_waf_token"] = awsWafToken;
161
+ console.log("成功提取 aws-waf-token");
162
+ await browser.close();
163
+ return awsWafToken;
164
+ } else {
165
+ console.log("提取aws-waf-token失败");
166
+ await browser.close();
167
+ return null;
168
+ }
169
+
170
+ } catch (error) {
171
+ console.error('获取 aws-waf-token 出错:', error);
172
+ await browser.close();
173
+ return null;
174
+ }
175
+ }
176
+
177
  static async extractTokens(cookieString) {
178
  const tokens = {};
179
  const cookiePairs = cookieString.split(';').map(pair => pair.trim());
 
214
  }
215
  async function initializeService() {
216
  console.log('服务初始化中...');
217
+ tokenManager = new TokenManager();
218
+ redisClient = new RedisClient();
219
+
220
  let index = 0;
221
  while (true) {
222
+ console.log(index, '开始检测是否有缓存');
223
+ // 使用 JSON.parse 确保正确解析
224
+ var checkRedis = await redisClient.get(`tokens_${index}`);
225
+ if (checkRedis) {
226
+ // 尝试解析 JSON 字符串
227
+ try {
228
+ const parsedRedis = typeof checkRedis === 'string'
229
+ ? JSON.parse(checkRedis)
230
+ : checkRedis;
231
+ Tokens.push({
232
+ refreshUrl: parsedRedis.refreshUrl,
233
+ anti_csrftoken_a2z: parsedRedis.anti_csrftoken_a2z,
234
+ pr_refresh_token: parsedRedis.pr_refresh_token,
235
+ aws_waf_token: parsedRedis.aws_waf_token,
236
+ idToken: parsedRedis.idToken
237
+ });
238
+ console.log(`成功添加第 ${index} 组 Token`);
239
+ } catch (error) {
240
+ console.error(`解析第 ${index} 组 Token 时出错:`, error);
241
+ }
242
+ } else {
243
+ console.log(index, '没有缓存,开始提取环境变量');
244
+ const refreshUrl = process.env[`AUTH_TOKENS_${index}_REFRESH_URL`];
245
+ const anti_csrftoken_a2z = process.env[`AUTH_TOKENS_${index}_ANTI_CSRF_TOKEN`];
246
+ const cookie = process.env[`AUTH_TOKENS_${index}_COOKIE`];
247
+
248
+ if (!refreshUrl && !anti_csrftoken_a2z && !cookie) {
249
+ break;
250
+ }
251
+ const cookies = await Utils.extractTokens(cookie);
252
+
253
+ if (refreshUrl && anti_csrftoken_a2z && cookie) {
254
+ Tokens.push({
255
+ refreshUrl,
256
+ anti_csrftoken_a2z,
257
+ pr_refresh_token: cookies["pr_refresh_token"],
258
+ aws_waf_token: cookies["aws-waf-token"],
259
+ idToken: cookies["idToken"]
260
+ });
261
+ }
262
  }
263
  index++;
264
  }
265
+ console.log('服务初始化完毕');
 
266
  }
267
 
268
  await initializeService();
 
408
  if (trimmedLine && trimmedLine.startsWith('data: ')) {
409
  const data = trimmedLine.substring(6);
410
  if (!data) continue;
411
+ if (data == "[DONE]") {
412
+ res.write('data: [DONE]\n\n');
413
+ return res.end();
414
+ }
415
  try {
416
  const json = JSON.parse(data);
417
  if (json?.text) {
 
493
  });
494
 
495
  app.post('/hf/v1/chat/completions', async (req, res) => {
496
+ var reqStatus = 500;
497
  try {
498
  const authToken = req.headers.authorization?.replace('Bearer ', '');
499
  if (authToken !== CONFIG.API.API_KEY) {
 
517
  },
518
  body: JSON.stringify(requestPayload)
519
  });
 
520
  if (response.status == 200) {
521
  console.log("请求成功");
522
  break; // 如果请求成功,跳出重试循环
523
  }
524
  if (response.status != 200) {
525
+ reqStatus = response.status;
526
+ if (response.status == 202) {
527
+ console.log("请求失败,已达到速率,重新获取waf然后更新token库");
528
+ await tokenManager.updateTokens(response, true);
529
+ }
530
  }
531
  retryCount++;
532
  if (retryCount >= CONFIG.RETRY.MAX_ATTEMPTS) {
533
+ reqStatus = response.status;
534
  throw new Error(`上游服务请求失败! status: ${response.status}`);
535
  }
536
  // 等待一段时间后重试
 
550
  } else {
551
  await ResponseHandler.handleNormalResponse(response, req.body.model, res);
552
  }
553
+ //请求完毕后再尝试更新redis数据库缓存,避免阻塞
554
+ await tokenManager.updateTokens(response);
555
  } catch (error) {
556
+ res.status(reqStatus).json({
557
  error: {
558
  message: error.message,
559
  type: 'server_error',