iyougame commited on
Commit
2996e2f
·
verified ·
1 Parent(s): c3844d9

Update worker.js

Browse files
Files changed (1) hide show
  1. worker.js +239 -64
worker.js CHANGED
@@ -31,7 +31,8 @@ async function initBrowser() {
31
  console.log('🚀 启动浏览器...');
32
  browser = await puppeteer.launch({
33
  headless: true,
34
- args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu']
 
35
  });
36
  console.log('✅ 浏览器已启动');
37
  }
@@ -40,17 +41,43 @@ async function initBrowser() {
40
 
41
  async function performAjaxRequest(page, prompt, model, sessionId = null) {
42
  console.log('🚀 尝试直接AJAX请求到API...');
 
 
 
 
43
 
44
  const response = await page.evaluate(async (promptText, modelText, sessId) => {
 
 
 
 
 
45
  try {
46
  // 构造请求数据
47
  const formData = new FormData();
48
  formData.append('text', promptText);
49
  formData.append('model', modelText || 'gemini-2.5-flash');
 
50
  if (sessId) {
51
  formData.append('session_id', sessId);
 
 
 
 
 
 
 
 
 
 
 
52
  }
53
 
 
 
 
 
 
54
  // 构造标准headers
55
  const headers = {
56
  'Accept': '*/*',
@@ -67,30 +94,48 @@ async function performAjaxRequest(page, prompt, model, sessionId = null) {
67
  'Sec-Fetch-Site': 'same-site'
68
  };
69
 
 
 
70
  // 发送请求到 writing.php
71
  const response = await fetch('https://data.toolbaz.com/writing.php', {
72
  method: 'POST',
73
  headers: headers,
74
- body: new URLSearchParams(formData).toString()
75
  });
76
 
77
- console.log('AJAX响应状态:', response.status);
 
 
 
 
 
 
 
 
 
78
 
79
  if (!response.ok) {
80
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
 
 
81
  }
82
 
83
  const text = await response.text();
84
- console.log('AJAX响应长度:', text.length);
 
85
 
86
  return { success: true, data: text };
87
 
88
  } catch (error) {
89
- console.error('AJAX请求失败:', error);
90
- return { success: false, error: error.message };
 
91
  }
92
  }, prompt, model, sessionId);
93
 
 
 
 
94
  return response;
95
  }
96
 
@@ -142,74 +187,195 @@ async function chatWithBrowser(prompt, model) {
142
  console.log(`🧹 已过滤前缀: ${prompt.substring(0, 50)}... -> ${cleanedPrompt.substring(0, 50)}...`);
143
  }
144
 
145
- // 首先访问页面获取必要的会话信息
146
  console.log('🌐 访问页面获取会话信息...');
147
  await page.goto('https://toolbaz.com/writer/ai-writer', { waitUntil: 'networkidle2', timeout: 30000 });
148
 
149
- // 设置请求拦截,移除前缀文本
150
- await page.setRequestInterception(true);
151
- page.on('request', request => {
152
- if (request.url().includes('writing.php')) {
153
- const postData = request.postData();
154
- if (postData) {
155
- try {
156
- // 解析POST数据
157
- const params = new URLSearchParams(postData);
158
- const text = params.get('text');
159
-
160
- if (text && text.includes('Generate an original and engaging piece of writing on the following topic')) {
161
- // 移除前缀,只保留实际内容
162
- const cleanText = text.replace(/^Generate an original and engaging piece of writing on the following topic\s*:\s*/, '');
163
- params.set('text', cleanText);
164
-
165
- console.log('🔧 拦截请求并移除前缀');
166
- console.log(`📤 原始文本: ${text.substring(0, 100)}...`);
167
- console.log(`📤 清理后: ${cleanText.substring(0, 100)}...`);
168
-
169
- // 继续发送修改后的请求
170
- request.continue({
171
- method: 'POST',
172
- postData: params.toString(),
173
- headers: request.headers()
174
- });
175
- return;
176
- }
177
- } catch (error) {
178
- console.log('⚠️ 请求拦截处理失败:', error.message);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  }
180
  }
181
  }
182
 
183
- // 其他请求正常处理
184
- request.continue();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
  });
186
 
187
- // 等待页面完全加载并获取session ID
188
- await page.waitForSelector('#input', { timeout: 10000 });
189
-
190
- // 获取页面生成的session ID
191
- const sessionId = await page.evaluate(() => {
192
- // 检查各种可能的session存储位置
193
- const sessionInput = document.querySelector('input[name="session_id"]');
194
- const hiddenSession = document.querySelector('#session_id');
195
- const sessionStorage = window.sessionStorage.getItem('session_id');
196
- const windowSession = window.session_id;
197
-
198
- return sessionInput?.value ||
199
- hiddenSession?.value ||
200
- sessionStorage ||
201
- windowSession ||
202
- null;
203
- });
204
 
205
- if (sessionId) {
206
- console.log('✅ 找到session ID:', sessionId.substring(0, 20) + '...');
 
 
 
 
 
 
207
  } else {
208
- console.log('⚠️ 未找到session ID,将使用无session请求');
 
209
  }
210
 
211
- // 尝试直接AJAX请求
212
- console.log('📡 尝试直接AJAX请求(绕过前端JS)...');
 
 
213
  const ajaxResponse = await performAjaxRequest(page, cleanedPrompt, model, sessionId);
214
 
215
  if (ajaxResponse.success) {
@@ -219,14 +385,22 @@ async function chatWithBrowser(prompt, model) {
219
  // 验证响应是否有效
220
  if (cleanedResponse.length > 0 &&
221
  !cleanedResponse.includes('Session ID is invalid') &&
222
- !cleanedResponse.includes('Session expired')) {
 
 
223
  console.log(`✅ AJAX响应成功: ${cleanedResponse.substring(0, 100)}...`);
 
224
  return cleanedResponse;
225
  } else {
226
- console.log('⚠️ AJAX响应无效,回退到UI方法');
 
 
227
  }
228
  } else {
229
  console.log('❌ AJAX请求失败:', ajaxResponse.error);
 
 
 
230
  console.log('🔄 回退到UI方法...');
231
  }
232
 
@@ -248,6 +422,7 @@ async function chatWithBrowser(prompt, model) {
248
 
249
  } catch (error) {
250
  console.error(`❌ 聊天失败: ${error.message}`);
 
251
  throw error;
252
  } finally {
253
  await page.close();
 
31
  console.log('🚀 启动浏览器...');
32
  browser = await puppeteer.launch({
33
  headless: true,
34
+ args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu'],
35
+ protocolTimeout: 60000 // 增加协议超时时间
36
  });
37
  console.log('✅ 浏览器已启动');
38
  }
 
41
 
42
  async function performAjaxRequest(page, prompt, model, sessionId = null) {
43
  console.log('🚀 尝试直接AJAX请求到API...');
44
+ console.log('📋 调试信息:');
45
+ console.log(` - prompt: "${prompt.substring(0, 100)}${prompt.length > 100 ? '...' : ''}"`);
46
+ console.log(` - model: ${model}`);
47
+ console.log(` - sessionId: ${sessionId ? `"${sessionId.substring(0, 20)}..."` : 'null'}`);
48
 
49
  const response = await page.evaluate(async (promptText, modelText, sessId) => {
50
+ console.log('🔍 浏览器端调试开始');
51
+ console.log(' promptText:', promptText);
52
+ console.log(' modelText:', modelText);
53
+ console.log(' sessId:', sessId);
54
+
55
  try {
56
  // 构造请求数据
57
  const formData = new FormData();
58
  formData.append('text', promptText);
59
  formData.append('model', modelText || 'gemini-2.5-flash');
60
+
61
  if (sessId) {
62
  formData.append('session_id', sessId);
63
+ console.log('✅ 添加了session_id:', sessId);
64
+ } else {
65
+ console.log('⚠️ 没有session_id,将发送无session请求');
66
+ }
67
+
68
+ // 转换为URLSearchParams以确保正确的编码
69
+ const urlParams = new URLSearchParams();
70
+ urlParams.append('text', promptText);
71
+ urlParams.append('model', modelText || 'gemini-2.5-flash');
72
+ if (sessId) {
73
+ urlParams.append('session_id', sessId);
74
  }
75
 
76
+ console.log('📤 最终发送的URL参数:');
77
+ console.log(' - text:', promptText);
78
+ console.log(' - model:', modelText || 'gemini-2.5-flash');
79
+ console.log(' - session_id:', sessId || 'undefined');
80
+
81
  // 构造标准headers
82
  const headers = {
83
  'Accept': '*/*',
 
94
  'Sec-Fetch-Site': 'same-site'
95
  };
96
 
97
+ console.log('🌐 发送fetch请求到 https://data.toolbaz.com/writing.php');
98
+
99
  // 发送请求到 writing.php
100
  const response = await fetch('https://data.toolbaz.com/writing.php', {
101
  method: 'POST',
102
  headers: headers,
103
+ body: urlParams.toString()
104
  });
105
 
106
+ console.log('📡 AJAX响应状态:', response.status);
107
+ console.log('📡 AJAX响应类型:', response.type);
108
+ console.log('📡 AJAX响应URL:', response.url);
109
+
110
+ // 检查响应头
111
+ const responseHeaders = {};
112
+ for (const [key, value] of response.headers.entries()) {
113
+ responseHeaders[key] = value;
114
+ }
115
+ console.log('📡 AJAX响应头:', responseHeaders);
116
 
117
  if (!response.ok) {
118
+ const errorText = await response.text();
119
+ console.error('❌ HTTP错误响应内容:', errorText);
120
+ throw new Error(`HTTP ${response.status}: ${response.statusText} - ${errorText}`);
121
  }
122
 
123
  const text = await response.text();
124
+ console.log('📡 AJAX响应长度:', text.length);
125
+ console.log('📡 AJAX响应前200字符:', text.substring(0, 200));
126
 
127
  return { success: true, data: text };
128
 
129
  } catch (error) {
130
+ console.error('AJAX请求失败:', error);
131
+ console.error('❌ 错误堆栈:', error.stack);
132
+ return { success: false, error: error.message, stack: error.stack };
133
  }
134
  }, prompt, model, sessionId);
135
 
136
+ console.log('🏁 浏览器端调试结束');
137
+ console.log('📋 Node.js收到的响应:', response);
138
+
139
  return response;
140
  }
141
 
 
187
  console.log(`🧹 已过滤前缀: ${prompt.substring(0, 50)}... -> ${cleanedPrompt.substring(0, 50)}...`);
188
  }
189
 
190
+ // 访问页面获取必要的会话信息,但不设置请求拦截以避免超时
191
  console.log('🌐 访问页面获取会话信息...');
192
  await page.goto('https://toolbaz.com/writer/ai-writer', { waitUntil: 'networkidle2', timeout: 30000 });
193
 
194
+ // 等待页面完全加载
195
+ await page.waitForSelector('#input', { timeout: 10000 });
196
+
197
+ console.log('🔍 开始搜索session ID...');
198
+
199
+ // 详细搜索session ID
200
+ const sessionInfo = await page.evaluate(() => {
201
+ console.log('🔍 浏览器端session ID搜索开始');
202
+
203
+ const results = {
204
+ found: [],
205
+ allInputs: [],
206
+ allHiddens: [],
207
+ sessionStorageData: {},
208
+ cookies: document.cookie,
209
+ localStorage: {},
210
+ finalSessionId: null
211
+ };
212
+
213
+ // 搜索所有包含session的元素
214
+ const allElements = document.querySelectorAll('*');
215
+ const sessionElements = [];
216
+ for (const elem of allElements) {
217
+ if (elem.id && elem.id.toLowerCase().includes('session')) {
218
+ sessionElements.push({
219
+ tag: elem.tagName,
220
+ id: elem.id,
221
+ name: elem.name,
222
+ value: elem.value,
223
+ type: elem.type
224
+ });
225
+ }
226
+ if (elem.name && elem.name.toLowerCase().includes('session')) {
227
+ sessionElements.push({
228
+ tag: elem.tagName,
229
+ id: elem.id,
230
+ name: elem.name,
231
+ value: elem.value,
232
+ type: elem.type
233
+ });
234
+ }
235
+ }
236
+ results.found = sessionElements;
237
+
238
+ // 检查所有input元素
239
+ const inputs = document.querySelectorAll('input');
240
+ inputs.forEach(input => {
241
+ results.allInputs.push({
242
+ id: input.id,
243
+ name: input.name,
244
+ type: input.type,
245
+ value: input.value
246
+ });
247
+ });
248
+
249
+ // 检查所有hidden input
250
+ const hiddens = document.querySelectorAll('input[type="hidden"]');
251
+ hiddens.forEach(hidden => {
252
+ results.allHiddens.push({
253
+ id: hidden.id,
254
+ name: hidden.name,
255
+ value: hidden.value
256
+ });
257
+ });
258
+
259
+ // 检查sessionStorage
260
+ for (let i = 0; i < sessionStorage.length; i++) {
261
+ const key = sessionStorage.key(i);
262
+ results.sessionStorageData[key] = sessionStorage.getItem(key);
263
+ }
264
+
265
+ // 检查localStorage
266
+ for (let i = 0; i < localStorage.length; i++) {
267
+ const key = localStorage.key(i);
268
+ results.localStorage[key] = localStorage.getItem(key);
269
+ }
270
+
271
+ // 尝试各种方法获取session ID
272
+ let sessionId = null;
273
+
274
+ // 方法1: 直接查找session_id输入框
275
+ const sessionInput = document.querySelector('input[name="session_id"]');
276
+ if (sessionInput && sessionInput.value) {
277
+ sessionId = sessionInput.value;
278
+ console.log('✅ 方法1成功: input[name="session_id"]', sessionId);
279
+ }
280
+
281
+ // 方法2: 查找id为session_id的元素
282
+ if (!sessionId) {
283
+ const hiddenSession = document.querySelector('#session_id');
284
+ if (hiddenSession && hiddenSession.value) {
285
+ sessionId = hiddenSession.value;
286
+ console.log('✅ 方法2成功: #session_id', sessionId);
287
+ }
288
+ }
289
+
290
+ // 方法3: 检查sessionStorage
291
+ if (!sessionId) {
292
+ const sessionStorageSess = sessionStorage.getItem('session_id');
293
+ if (sessionStorageSess) {
294
+ sessionId = sessionStorageSess;
295
+ console.log('✅ 方法3成功: sessionStorage session_id', sessionId);
296
+ }
297
+ }
298
+
299
+ // 方法4: 检查全局变量
300
+ if (!sessionId && typeof window.session_id !== 'undefined') {
301
+ sessionId = window.session_id;
302
+ console.log('✅ 方法4成功: window.session_id', sessionId);
303
+ }
304
+
305
+ // 方法5: 从cookie中提取(如果有的话)
306
+ if (!sessionId) {
307
+ const cookies = document.cookie.split(';');
308
+ for (const cookie of cookies) {
309
+ const [name, value] = cookie.trim().split('=');
310
+ if (name === 'session_id' || name === 'PHPSESSID') {
311
+ sessionId = value;
312
+ console.log('✅ 方法5成功: cookie', name, sessionId);
313
+ break;
314
  }
315
  }
316
  }
317
 
318
+ // 方法6: 尝试从URL参数获取
319
+ if (!sessionId) {
320
+ const urlParams = new URLSearchParams(window.location.search);
321
+ const urlSession = urlParams.get('session_id');
322
+ if (urlSession) {
323
+ sessionId = urlSession;
324
+ console.log('✅ 方法6成功: URL参数', sessionId);
325
+ }
326
+ }
327
+
328
+ // 方法7: 检查是否有隐藏的包含session信息的meta标签
329
+ if (!sessionId) {
330
+ const metaSession = document.querySelector('meta[name="session_id"]');
331
+ if (metaSession && metaSession.content) {
332
+ sessionId = metaSession.content;
333
+ console.log('✅ 方法7成功: meta标签', sessionId);
334
+ }
335
+ }
336
+
337
+ results.finalSessionId = sessionId;
338
+ results.searchMethods = [
339
+ 'input[name="session_id"]',
340
+ '#session_id',
341
+ 'sessionStorage["session_id"]',
342
+ 'window.session_id',
343
+ 'cookies',
344
+ 'URL参数',
345
+ 'meta标签'
346
+ ];
347
+
348
+ console.log('🔍 最终session ID结果:', sessionId);
349
+ console.log('🔍 搜索完成,返回详细结果');
350
+
351
+ return results;
352
  });
353
 
354
+ console.log('📋 Session搜索结果:');
355
+ console.log(' - 找到的session相关元素:', sessionInfo.found.length);
356
+ console.log(' - 所有input元素:', sessionInfo.allInputs.length);
357
+ console.log(' - 隐藏input元素:', sessionInfo.allHiddens.length);
358
+ console.log(' - sessionStorage数据:', Object.keys(sessionInfo.sessionStorageData).length);
359
+ console.log(' - localStorage数据:', Object.keys(sessionInfo.localStorage).length);
360
+ console.log(' - cookies:', sessionInfo.cookies);
 
 
 
 
 
 
 
 
 
 
361
 
362
+ if (sessionInfo.finalSessionId) {
363
+ console.log('✅ 找到session ID:', `"${sessionInfo.finalSessionId}"`);
364
+ console.log('✅ session ID长度:', sessionInfo.finalSessionId.length);
365
+
366
+ // 详细显示找到的session ID
367
+ if (sessionInfo.finalSessionId.length > 20) {
368
+ console.log('✅ session ID完整值:', sessionInfo.finalSessionId);
369
+ }
370
  } else {
371
+ console.log(' 未找到session ID');
372
+ console.log('📋 详细搜索结果:', JSON.stringify(sessionInfo, null, 2));
373
  }
374
 
375
+ const sessionId = sessionInfo.finalSessionId;
376
+
377
+ // 尝试直接AJAX请求(现在使用详细的调试信息)
378
+ console.log('📡 尝试直接AJAX请求(纯AJAX模式)...');
379
  const ajaxResponse = await performAjaxRequest(page, cleanedPrompt, model, sessionId);
380
 
381
  if (ajaxResponse.success) {
 
385
  // 验证响应是否有效
386
  if (cleanedResponse.length > 0 &&
387
  !cleanedResponse.includes('Session ID is invalid') &&
388
+ !cleanedResponse.includes('Session expired') &&
389
+ !cleanedResponse.includes('Error:') &&
390
+ !cleanedResponse.includes('Invalid session')) {
391
  console.log(`✅ AJAX响应成功: ${cleanedResponse.substring(0, 100)}...`);
392
+ console.log(`✅ 响应长度: ${cleanedResponse.length}`);
393
  return cleanedResponse;
394
  } else {
395
+ console.log('⚠️ AJAX响应内容无效或包含错误:');
396
+ console.log(' 响应内容:', cleanedResponse.substring(0, 200));
397
+ console.log('🔄 回退到UI方法...');
398
  }
399
  } else {
400
  console.log('❌ AJAX请求失败:', ajaxResponse.error);
401
+ if (ajaxResponse.stack) {
402
+ console.log('❌ 错误堆栈:', ajaxResponse.stack);
403
+ }
404
  console.log('🔄 回退到UI方法...');
405
  }
406
 
 
422
 
423
  } catch (error) {
424
  console.error(`❌ 聊天失败: ${error.message}`);
425
+ console.error(`❌ 错误堆栈:`, error.stack);
426
  throw error;
427
  } finally {
428
  await page.close();