Update index.js
Browse files
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
if (wafToken) {
|
| 110 |
-
|
| 111 |
-
Tokens[currentIndex].aws_waf_token
|
| 112 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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();
|
| 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: [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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(
|
| 243 |
-
await page.waitForSelector('.aws-waf-challenge', { hidden: true, timeout: 15000 });
|
| 244 |
|
| 245 |
-
//
|
| 246 |
-
const
|
|
|
|
| 247 |
cookie => cookie.name.toLowerCase() === 'aws-waf-token'
|
| 248 |
-
)
|
|
|
|
| 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 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 596 |
method: "POST",
|
| 597 |
-
headers: {
|
| 598 |
-
...CONFIG.DEFAULT_HEADERS
|
| 599 |
-
},
|
| 600 |
body: JSON.stringify(requestPayload)
|
| 601 |
});
|
| 602 |
reqStatus = response.status;
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
| 607 |
-
|
| 608 |
-
|
| 609 |
-
|
| 610 |
-
|
| 611 |
-
|
| 612 |
-
|
| 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 |
-
|
| 636 |
-
|
|
|
|
| 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({
|