0412Xu commited on
Commit
89a92e3
·
verified ·
1 Parent(s): c90e761

Upload 2 files

Browse files
src/utils/cookieRefresher.js CHANGED
@@ -480,15 +480,66 @@ async function extractCookiesFromCsvFile(csvFilePath) {
480
  console.log(`尝试从CSV文件提取cookies (尝试 ${attempt}/${maxExtractAttempts})...`);
481
 
482
  try {
483
- // 使用新的提取模块
484
- const cookies = await extractCookiesFromCsv(csvFilePath);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
485
 
486
- if (cookies && cookies.length > 0) {
487
- console.log(`成功从CSV文件提取到 ${cookies.length} 个cookies`);
 
 
 
 
 
 
 
 
488
  return cookies;
489
- } else {
490
- console.warn(`未能从CSV文件提取到cookies (尝试 ${attempt}/${maxExtractAttempts})`);
491
  }
 
 
492
  } catch (error) {
493
  console.error(`从CSV文件提取cookies时出错 (尝试 ${attempt}/${maxExtractAttempts}):`, error);
494
  }
@@ -543,14 +594,24 @@ function addNewCookiesToSystem(apiKey, newCookies) {
543
 
544
  // 验证cookie是否完整
545
  const validatedCookies = newValidCookies.filter(cookie => {
546
- // 检查cookie是否包含JWT的三个部分
547
- if (cookie.includes('%3A%3A')) {
 
 
 
 
 
 
 
 
 
 
548
  const parts = cookie.split('%3A%3A');
549
  if (parts.length === 2) {
550
  const jwt = parts[1];
551
  // 检查JWT是否包含点(表示JWT的三个部分)
552
  if (!jwt.includes('.') || jwt.split('.').length !== 3) {
553
- console.warn(`跳过不完整的cookie: ${cookie}`);
554
  return false;
555
  }
556
  }
@@ -704,6 +765,12 @@ async function autoRefreshCookies(apiKey, minCookieCount = config.refresh.minCoo
704
  };
705
  }
706
 
 
 
 
 
 
 
707
  // 根据配置决定是否将现有cookie标记为无效
708
  const refreshMode = process.env.COOKIE_REFRESH_MODE || 'append';
709
 
@@ -723,7 +790,7 @@ async function autoRefreshCookies(apiKey, minCookieCount = config.refresh.minCoo
723
 
724
  return {
725
  success: true,
726
- message: `成功添加 ${addedCount} 个新 Cookie`,
727
  refreshed: addedCount
728
  };
729
  } catch (error) {
 
480
  console.log(`尝试从CSV文件提取cookies (尝试 ${attempt}/${maxExtractAttempts})...`);
481
 
482
  try {
483
+ // 读取文件内容
484
+ if (!fs.existsSync(csvFilePath)) {
485
+ console.error(`CSV文件不存在: ${csvFilePath}`);
486
+ return [];
487
+ }
488
+
489
+ // 读取文件内容并处理可能的换行符
490
+ let fileContent = fs.readFileSync(csvFilePath, 'utf8');
491
+ fileContent = fileContent.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
492
+
493
+ // 首先尝试直接从文件内容中提取所有可能的cookie
494
+ const cookies = [];
495
+
496
+ // 1. 检查是否有JWT格式的token (新格式)
497
+ const jwtRegex = /ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g;
498
+ const jwtMatches = fileContent.match(jwtRegex);
499
+
500
+ if (jwtMatches && jwtMatches.length > 0) {
501
+ console.log(`直接从文件内容中提取到 ${jwtMatches.length} 个JWT token格式的Cookie`);
502
+ jwtMatches.forEach(match => {
503
+ if (!cookies.includes(match)) {
504
+ cookies.push(match);
505
+ }
506
+ });
507
+ }
508
+
509
+ // 2. 检查是否有旧格式的cookie
510
+ if (fileContent.includes('user_')) {
511
+ console.log('文件包含旧格式cookie标识"user_"');
512
+
513
+ // 使用旧的提取函数尝试提取
514
+ try {
515
+ const oldFormatCookies = await extractCookiesFromCsv(csvFilePath);
516
+ if (oldFormatCookies && oldFormatCookies.length > 0) {
517
+ console.log(`通过提取模块获取到 ${oldFormatCookies.length} 个cookie`);
518
+ oldFormatCookies.forEach(cookie => {
519
+ if (!cookies.includes(cookie)) {
520
+ cookies.push(cookie);
521
+ }
522
+ });
523
+ }
524
+ } catch (e) {
525
+ console.warn('通过提取模块获取cookie失败:', e.message);
526
+ }
527
+ }
528
 
529
+ // 3. 如果找到了cookie,返回结果
530
+ if (cookies.length > 0) {
531
+ const newFormatCount = cookies.filter(c => c.startsWith('ey')).length;
532
+ const oldFormatCount = cookies.filter(c => c.includes('%3A%3A')).length;
533
+
534
+ console.log(`总共找到 ${cookies.length} 个cookie`);
535
+ console.log(`新格式cookie(ey开头): ${newFormatCount}个`);
536
+ console.log(`旧格式cookie(包含%3A%3A): ${oldFormatCount}个`);
537
+ console.log(`其他格式cookie: ${cookies.length - newFormatCount - oldFormatCount}个`);
538
+
539
  return cookies;
 
 
540
  }
541
+
542
+ console.warn(`未能从文件中提取到任何cookie (尝试 ${attempt}/${maxExtractAttempts})`);
543
  } catch (error) {
544
  console.error(`从CSV文件提取cookies时出错 (尝试 ${attempt}/${maxExtractAttempts}):`, error);
545
  }
 
594
 
595
  // 验证cookie是否完整
596
  const validatedCookies = newValidCookies.filter(cookie => {
597
+ // 检查是否是新格式的JWT token (ey开头)
598
+ if (cookie.startsWith('ey') && cookie.includes('.')) {
599
+ const parts = cookie.split('.');
600
+ // 检查JWT是否包含三个部分
601
+ if (parts.length !== 3) {
602
+ console.warn(`跳过不完整的JWT cookie (新格式): ${cookie}`);
603
+ return false;
604
+ }
605
+ return true;
606
+ }
607
+ // 检查旧格式cookie是否包含JWT的三个部分
608
+ else if (cookie.includes('%3A%3A')) {
609
  const parts = cookie.split('%3A%3A');
610
  if (parts.length === 2) {
611
  const jwt = parts[1];
612
  // 检查JWT是否包含点(表示JWT的三个部分)
613
  if (!jwt.includes('.') || jwt.split('.').length !== 3) {
614
+ console.warn(`跳过不完整的cookie (旧格式): ${cookie}`);
615
  return false;
616
  }
617
  }
 
765
  };
766
  }
767
 
768
+ // 分析提取到的cookie格式
769
+ const newFormatCookies = cookies.filter(cookie => cookie.startsWith('ey'));
770
+ const oldFormatCookies = cookies.filter(cookie => cookie.includes('%3A%3A'));
771
+ console.log(`提取到 ${newFormatCookies.length} 个新格式cookie(ey开头)`);
772
+ console.log(`提取到 ${oldFormatCookies.length} 个旧格式cookie(包含%3A%3A)`);
773
+
774
  // 根据配置决定是否将现有cookie标记为无效
775
  const refreshMode = process.env.COOKIE_REFRESH_MODE || 'append';
776
 
 
790
 
791
  return {
792
  success: true,
793
+ message: `成功添加 ${addedCount} 个新 Cookie (新格式: ${newFormatCookies.length}, 旧格式: ${oldFormatCookies.length})`,
794
  refreshed: addedCount
795
  };
796
  } catch (error) {
src/utils/extractCookieFromCsv.js CHANGED
@@ -26,42 +26,91 @@ async function extractCookiesFromCsv(csvFilePath) {
26
  return resolve([]);
27
  }
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  // 检查文件内容是否包含关键字
30
  const hasTokenKeyword = fileContent.includes('token');
31
  const hasUserPrefix = fileContent.includes('user_');
32
  console.log(`文件包含"token"关键字: ${hasTokenKeyword}`);
33
  console.log(`文件包含"user_"前缀: ${hasUserPrefix}`);
34
 
35
- // 如果文件包含user_前缀,尝试直接从内容中提取cookie
36
  if (hasUserPrefix) {
37
- const cookies = extractCookiesFromText(fileContent);
38
- if (cookies.length > 0) {
39
- console.log(`直接从文件内容中提取到 ${cookies.length} Cookie`);
40
- return resolve(cookies);
 
 
 
 
41
  }
42
  }
43
 
 
 
 
 
 
 
44
  // 使用csv-parser解析CSV文件
45
- const cookies = [];
46
- const possibleTokenFields = ['token', 'cookie', 'value', 'Token', 'Cookie', 'Value'];
47
 
48
  fs.createReadStream(csvFilePath)
49
  .pipe(csv())
50
  .on('data', (row) => {
51
  // 检查所有可能的字段名
52
  for (const field of possibleTokenFields) {
53
- if (row[field] && row[field].includes('user_')) {
54
- cookies.push(row[field]);
55
- break;
 
 
 
 
 
 
 
 
 
 
 
 
56
  }
57
  }
58
 
59
  // 如果没有找到预定义的字段,遍历所有字段
60
  if (cookies.length === 0) {
61
  for (const field in row) {
62
- if (row[field] && typeof row[field] === 'string' && row[field].includes('user_')) {
63
- cookies.push(row[field]);
64
- break;
 
 
 
 
 
 
 
 
 
 
 
 
65
  }
66
  }
67
  }
@@ -74,6 +123,19 @@ async function extractCookiesFromCsv(csvFilePath) {
74
  console.log('尝试按行读取文件...');
75
  const lines = fileContent.split('\n');
76
  for (const line of lines) {
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  if (line.includes('user_')) {
78
  const extractedCookies = extractCookiesFromText(line);
79
  extractedCookies.forEach(cookie => {
@@ -86,18 +148,6 @@ async function extractCookiesFromCsv(csvFilePath) {
86
  console.log(`按行读取后提取到 ${cookies.length} 个Cookie`);
87
  }
88
 
89
- // 如果仍然没有找到cookie,尝试从整个文件内容中提取
90
- if (cookies.length === 0) {
91
- console.log('尝试从整个文件内容中提取Cookie...');
92
- const extractedCookies = extractCookiesFromText(fileContent);
93
- extractedCookies.forEach(cookie => {
94
- if (!cookies.includes(cookie)) {
95
- cookies.push(cookie);
96
- }
97
- });
98
- console.log(`从整个文件内容中提取到 ${cookies.length} 个Cookie`);
99
- }
100
-
101
  // 验证提取的cookie是否完整
102
  const validatedCookies = validateCookies(cookies);
103
 
@@ -105,10 +155,36 @@ async function extractCookiesFromCsv(csvFilePath) {
105
  })
106
  .on('error', (error) => {
107
  console.error('解析CSV文件时出错:', error);
108
- // 如果解析出错,尝试从整个文件内容中提取
109
- const extractedCookies = extractCookiesFromText(fileContent);
110
- console.log(`解析出错后从文件内容中提取到 ${extractedCookies.length} 个Cookie`);
111
- resolve(validateCookies(extractedCookies));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  });
113
  } catch (error) {
114
  console.error('提取Cookie时出错:', error);
@@ -125,12 +201,24 @@ async function extractCookiesFromCsv(csvFilePath) {
125
  function extractCookiesFromText(text) {
126
  const cookies = [];
127
 
128
- // 使用正则表达式匹配user_开头的cookie
129
- const regex = /user_[a-zA-Z0-9%]+%3A%3A[a-zA-Z0-9%\.\_\-]+/g;
130
- const matches = text.match(regex);
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
- if (matches) {
133
- matches.forEach(match => {
134
  if (!cookies.includes(match)) {
135
  cookies.push(match);
136
  }
@@ -146,23 +234,33 @@ function extractCookiesFromText(text) {
146
  * @returns {string[]} - 验证后的cookie数组
147
  */
148
  function validateCookies(cookies) {
149
- return cookies.map(cookie => {
150
- // 检查cookie是否包含JWT的三个部分(header.payload.signature)
151
- if (cookie.includes('%3A%3A')) {
 
 
 
 
 
 
 
 
 
 
 
152
  const parts = cookie.split('%3A%3A');
153
  if (parts.length === 2) {
154
  const jwt = parts[1];
155
  // 检查JWT是否包含两个点(表示三个部分)
156
  if (jwt.includes('.') && jwt.split('.').length === 3) {
157
- return cookie; // cookie完整
158
  } else {
159
- console.warn(`检测到不完整的JWT: ${cookie}`);
160
- // 尝试修复不完整的JWT(如果可能)
161
- return cookie;
162
  }
163
  }
164
  }
165
- return cookie;
166
  });
167
  }
168
 
 
26
  return resolve([]);
27
  }
28
 
29
+ // 首先尝试直接从文件内容中提取所有可能的cookie
30
+ const cookies = [];
31
+
32
+ // 检查是否有JWT格式的token (新格式)
33
+ const jwtRegex = /ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g;
34
+ const jwtMatches = fileContent.match(jwtRegex);
35
+
36
+ if (jwtMatches && jwtMatches.length > 0) {
37
+ console.log(`直接从文件内容中提取到 ${jwtMatches.length} 个JWT token格式的Cookie`);
38
+ jwtMatches.forEach(match => {
39
+ if (!cookies.includes(match)) {
40
+ cookies.push(match);
41
+ }
42
+ });
43
+ }
44
+
45
  // 检查文件内容是否包含关键字
46
  const hasTokenKeyword = fileContent.includes('token');
47
  const hasUserPrefix = fileContent.includes('user_');
48
  console.log(`文件包含"token"关键字: ${hasTokenKeyword}`);
49
  console.log(`文件包含"user_"前缀: ${hasUserPrefix}`);
50
 
51
+ // 如果文件包含user_前缀,尝试提取旧格式cookie
52
  if (hasUserPrefix) {
53
+ const oldFormatCookies = extractCookiesFromText(fileContent);
54
+ if (oldFormatCookies.length > 0) {
55
+ console.log(`从文件内容中提取到 ${oldFormatCookies.length} 个旧格式Cookie`);
56
+ oldFormatCookies.forEach(cookie => {
57
+ if (!cookies.includes(cookie)) {
58
+ cookies.push(cookie);
59
+ }
60
+ });
61
  }
62
  }
63
 
64
+ // 如果已经找到cookie,返回结果
65
+ if (cookies.length > 0) {
66
+ console.log(`总共提取到 ${cookies.length} 个Cookie`);
67
+ return resolve(validateCookies(cookies));
68
+ }
69
+
70
  // 使用csv-parser解析CSV文件
71
+ const possibleTokenFields = ['token', 'cookie', 'value', 'Token', 'Cookie', 'Value', 'jwt', 'JWT'];
 
72
 
73
  fs.createReadStream(csvFilePath)
74
  .pipe(csv())
75
  .on('data', (row) => {
76
  // 检查所有可能的字段名
77
  for (const field of possibleTokenFields) {
78
+ if (row[field]) {
79
+ // 检查是否是JWT格式
80
+ if (row[field].startsWith('ey') && row[field].includes('.')) {
81
+ if (!cookies.includes(row[field])) {
82
+ cookies.push(row[field]);
83
+ }
84
+ break;
85
+ }
86
+ // 检查是否是旧格式
87
+ else if (row[field].includes('user_')) {
88
+ if (!cookies.includes(row[field])) {
89
+ cookies.push(row[field]);
90
+ }
91
+ break;
92
+ }
93
  }
94
  }
95
 
96
  // 如果没有找到预定义的字段,遍历所有字段
97
  if (cookies.length === 0) {
98
  for (const field in row) {
99
+ if (row[field] && typeof row[field] === 'string') {
100
+ // 检查是否是JWT格式
101
+ if (row[field].startsWith('ey') && row[field].includes('.')) {
102
+ if (!cookies.includes(row[field])) {
103
+ cookies.push(row[field]);
104
+ }
105
+ break;
106
+ }
107
+ // 检查是否是旧格式
108
+ else if (row[field].includes('user_')) {
109
+ if (!cookies.includes(row[field])) {
110
+ cookies.push(row[field]);
111
+ }
112
+ break;
113
+ }
114
  }
115
  }
116
  }
 
123
  console.log('尝试按行读取文件...');
124
  const lines = fileContent.split('\n');
125
  for (const line of lines) {
126
+ // 检查是否有JWT格式token
127
+ if (line.includes('ey')) {
128
+ const jwtMatches = line.match(jwtRegex);
129
+ if (jwtMatches) {
130
+ jwtMatches.forEach(match => {
131
+ if (!cookies.includes(match)) {
132
+ cookies.push(match);
133
+ }
134
+ });
135
+ }
136
+ }
137
+
138
+ // 检查是否有旧格式cookie
139
  if (line.includes('user_')) {
140
  const extractedCookies = extractCookiesFromText(line);
141
  extractedCookies.forEach(cookie => {
 
148
  console.log(`按行读取后提取到 ${cookies.length} 个Cookie`);
149
  }
150
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  // 验证提取的cookie是否完整
152
  const validatedCookies = validateCookies(cookies);
153
 
 
155
  })
156
  .on('error', (error) => {
157
  console.error('解析CSV文件时出错:', error);
158
+
159
+ // 如果已经提取到cookie,直接返回
160
+ if (cookies.length > 0) {
161
+ console.log(`解析出错但已提取到 ${cookies.length} 个Cookie,进行验证后返回`);
162
+ resolve(validateCookies(cookies));
163
+ } else {
164
+ // 否则尝试其他方法提取
165
+ console.log('尝试其他方法提取Cookie...');
166
+
167
+ // 尝试提取JWT格式token
168
+ const jwtMatches = fileContent.match(jwtRegex);
169
+ if (jwtMatches) {
170
+ jwtMatches.forEach(match => {
171
+ if (!cookies.includes(match)) {
172
+ cookies.push(match);
173
+ }
174
+ });
175
+ }
176
+
177
+ // 尝试提取旧格式cookie
178
+ const oldFormatCookies = extractCookiesFromText(fileContent);
179
+ oldFormatCookies.forEach(cookie => {
180
+ if (!cookies.includes(cookie)) {
181
+ cookies.push(cookie);
182
+ }
183
+ });
184
+
185
+ console.log(`通过其他方法提取到 ${cookies.length} 个Cookie`);
186
+ resolve(validateCookies(cookies));
187
+ }
188
  });
189
  } catch (error) {
190
  console.error('提取Cookie时出错:', error);
 
201
  function extractCookiesFromText(text) {
202
  const cookies = [];
203
 
204
+ // 使用正则表达式匹配user_开头的cookie(旧格式)
205
+ const oldFormatRegex = /user_[a-zA-Z0-9%]+%3A%3A[a-zA-Z0-9%\.\_\-]+/g;
206
+ const oldFormatMatches = text.match(oldFormatRegex);
207
+
208
+ if (oldFormatMatches) {
209
+ oldFormatMatches.forEach(match => {
210
+ if (!cookies.includes(match)) {
211
+ cookies.push(match);
212
+ }
213
+ });
214
+ }
215
+
216
+ // 使用正则表达式匹配以ey开头的JWT格式cookie(新格式)
217
+ const jwtRegex = /ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g;
218
+ const jwtMatches = text.match(jwtRegex);
219
 
220
+ if (jwtMatches) {
221
+ jwtMatches.forEach(match => {
222
  if (!cookies.includes(match)) {
223
  cookies.push(match);
224
  }
 
234
  * @returns {string[]} - 验证后的cookie数组
235
  */
236
  function validateCookies(cookies) {
237
+ return cookies.filter(cookie => {
238
+ // 检查是否是新格式的JWT token (ey开头)
239
+ if (cookie.startsWith('ey') && cookie.includes('.')) {
240
+ const parts = cookie.split('.');
241
+ // 检查JWT是否包含三个部分
242
+ if (parts.length === 3) {
243
+ return true; // cookie有效
244
+ } else {
245
+ console.warn(`检测到不完整的JWT(新格式): ${cookie}`);
246
+ return false;
247
+ }
248
+ }
249
+ // 检查旧格式cookie是否完整
250
+ else if (cookie.includes('%3A%3A')) {
251
  const parts = cookie.split('%3A%3A');
252
  if (parts.length === 2) {
253
  const jwt = parts[1];
254
  // 检查JWT是否包含两个点(表示三个部分)
255
  if (jwt.includes('.') && jwt.split('.').length === 3) {
256
+ return true; // cookie完整
257
  } else {
258
+ console.warn(`检测到不完整的JWT(旧格式): ${cookie}`);
259
+ return false;
 
260
  }
261
  }
262
  }
263
+ return true; // 对于无法识别的格式,默认保留
264
  });
265
  }
266