@ai-jshook/mcp 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/.env.example +38 -0
  2. package/CLAUDE.md +170 -0
  3. package/README.md +564 -0
  4. package/bun.lock +1484 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +57 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/modules/analyzer/AISummarizer.d.ts +41 -0
  10. package/dist/modules/analyzer/AISummarizer.d.ts.map +1 -0
  11. package/dist/modules/analyzer/AISummarizer.js +186 -0
  12. package/dist/modules/analyzer/AISummarizer.js.map +1 -0
  13. package/dist/modules/analyzer/CodeAnalyzer.d.ts +28 -0
  14. package/dist/modules/analyzer/CodeAnalyzer.d.ts.map +1 -0
  15. package/dist/modules/analyzer/CodeAnalyzer.js +1287 -0
  16. package/dist/modules/analyzer/CodeAnalyzer.js.map +1 -0
  17. package/dist/modules/analyzer/IntelligentAnalyzer.d.ts +114 -0
  18. package/dist/modules/analyzer/IntelligentAnalyzer.d.ts.map +1 -0
  19. package/dist/modules/analyzer/IntelligentAnalyzer.js +1176 -0
  20. package/dist/modules/analyzer/IntelligentAnalyzer.js.map +1 -0
  21. package/dist/modules/browser/BrowserModeManager.d.ts +31 -0
  22. package/dist/modules/browser/BrowserModeManager.d.ts.map +1 -0
  23. package/dist/modules/browser/BrowserModeManager.js +241 -0
  24. package/dist/modules/browser/BrowserModeManager.js.map +1 -0
  25. package/dist/modules/captcha/AICaptchaDetector.d.ts +32 -0
  26. package/dist/modules/captcha/AICaptchaDetector.d.ts.map +1 -0
  27. package/dist/modules/captcha/AICaptchaDetector.js +387 -0
  28. package/dist/modules/captcha/AICaptchaDetector.js.map +1 -0
  29. package/dist/modules/captcha/CaptchaDetector.d.ts +28 -0
  30. package/dist/modules/captcha/CaptchaDetector.d.ts.map +1 -0
  31. package/dist/modules/captcha/CaptchaDetector.js +513 -0
  32. package/dist/modules/captcha/CaptchaDetector.js.map +1 -0
  33. package/dist/modules/collector/CodeCache.d.ts +37 -0
  34. package/dist/modules/collector/CodeCache.d.ts.map +1 -0
  35. package/dist/modules/collector/CodeCache.js +188 -0
  36. package/dist/modules/collector/CodeCache.js.map +1 -0
  37. package/dist/modules/collector/CodeCollector.d.ts +107 -0
  38. package/dist/modules/collector/CodeCollector.d.ts.map +1 -0
  39. package/dist/modules/collector/CodeCollector.js +796 -0
  40. package/dist/modules/collector/CodeCollector.js.map +1 -0
  41. package/dist/modules/collector/CodeCompressor.d.ts +65 -0
  42. package/dist/modules/collector/CodeCompressor.d.ts.map +1 -0
  43. package/dist/modules/collector/CodeCompressor.js +245 -0
  44. package/dist/modules/collector/CodeCompressor.js.map +1 -0
  45. package/dist/modules/collector/DOMInspector.d.ts +51 -0
  46. package/dist/modules/collector/DOMInspector.d.ts.map +1 -0
  47. package/dist/modules/collector/DOMInspector.js +437 -0
  48. package/dist/modules/collector/DOMInspector.js.map +1 -0
  49. package/dist/modules/collector/PageController.d.ts +79 -0
  50. package/dist/modules/collector/PageController.d.ts.map +1 -0
  51. package/dist/modules/collector/PageController.js +287 -0
  52. package/dist/modules/collector/PageController.js.map +1 -0
  53. package/dist/modules/collector/SmartCodeCollector.d.ts +38 -0
  54. package/dist/modules/collector/SmartCodeCollector.d.ts.map +1 -0
  55. package/dist/modules/collector/SmartCodeCollector.js +208 -0
  56. package/dist/modules/collector/SmartCodeCollector.js.map +1 -0
  57. package/dist/modules/collector/StreamingCollector.d.ts +46 -0
  58. package/dist/modules/collector/StreamingCollector.d.ts.map +1 -0
  59. package/dist/modules/collector/StreamingCollector.js +127 -0
  60. package/dist/modules/collector/StreamingCollector.js.map +1 -0
  61. package/dist/modules/crypto/CryptoDetector.d.ts +22 -0
  62. package/dist/modules/crypto/CryptoDetector.d.ts.map +1 -0
  63. package/dist/modules/crypto/CryptoDetector.js +168 -0
  64. package/dist/modules/crypto/CryptoDetector.js.map +1 -0
  65. package/dist/modules/crypto/CryptoDetectorEnhanced.d.ts +31 -0
  66. package/dist/modules/crypto/CryptoDetectorEnhanced.d.ts.map +1 -0
  67. package/dist/modules/crypto/CryptoDetectorEnhanced.js +269 -0
  68. package/dist/modules/crypto/CryptoDetectorEnhanced.js.map +1 -0
  69. package/dist/modules/crypto/CryptoRules.d.ts +59 -0
  70. package/dist/modules/crypto/CryptoRules.d.ts.map +1 -0
  71. package/dist/modules/crypto/CryptoRules.js +234 -0
  72. package/dist/modules/crypto/CryptoRules.js.map +1 -0
  73. package/dist/modules/debugger/BlackboxManager.d.ts +14 -0
  74. package/dist/modules/debugger/BlackboxManager.d.ts.map +1 -0
  75. package/dist/modules/debugger/BlackboxManager.js +98 -0
  76. package/dist/modules/debugger/BlackboxManager.js.map +1 -0
  77. package/dist/modules/debugger/DebuggerManager.d.ts +138 -0
  78. package/dist/modules/debugger/DebuggerManager.d.ts.map +1 -0
  79. package/dist/modules/debugger/DebuggerManager.js +777 -0
  80. package/dist/modules/debugger/DebuggerManager.js.map +1 -0
  81. package/dist/modules/debugger/EventBreakpointManager.d.ts +30 -0
  82. package/dist/modules/debugger/EventBreakpointManager.d.ts.map +1 -0
  83. package/dist/modules/debugger/EventBreakpointManager.js +125 -0
  84. package/dist/modules/debugger/EventBreakpointManager.js.map +1 -0
  85. package/dist/modules/debugger/RuntimeInspector.d.ts +54 -0
  86. package/dist/modules/debugger/RuntimeInspector.d.ts.map +1 -0
  87. package/dist/modules/debugger/RuntimeInspector.js +277 -0
  88. package/dist/modules/debugger/RuntimeInspector.js.map +1 -0
  89. package/dist/modules/debugger/ScriptManager.d.ts +94 -0
  90. package/dist/modules/debugger/ScriptManager.d.ts.map +1 -0
  91. package/dist/modules/debugger/ScriptManager.js +433 -0
  92. package/dist/modules/debugger/ScriptManager.js.map +1 -0
  93. package/dist/modules/debugger/WatchExpressionManager.d.ts +52 -0
  94. package/dist/modules/debugger/WatchExpressionManager.d.ts.map +1 -0
  95. package/dist/modules/debugger/WatchExpressionManager.js +136 -0
  96. package/dist/modules/debugger/WatchExpressionManager.js.map +1 -0
  97. package/dist/modules/debugger/XHRBreakpointManager.d.ts +21 -0
  98. package/dist/modules/debugger/XHRBreakpointManager.d.ts.map +1 -0
  99. package/dist/modules/debugger/XHRBreakpointManager.js +81 -0
  100. package/dist/modules/debugger/XHRBreakpointManager.js.map +1 -0
  101. package/dist/modules/deobfuscator/ASTOptimizer.d.ts +12 -0
  102. package/dist/modules/deobfuscator/ASTOptimizer.d.ts.map +1 -0
  103. package/dist/modules/deobfuscator/ASTOptimizer.js +234 -0
  104. package/dist/modules/deobfuscator/ASTOptimizer.js.map +1 -0
  105. package/dist/modules/deobfuscator/AdvancedDeobfuscator.d.ts +52 -0
  106. package/dist/modules/deobfuscator/AdvancedDeobfuscator.d.ts.map +1 -0
  107. package/dist/modules/deobfuscator/AdvancedDeobfuscator.js +985 -0
  108. package/dist/modules/deobfuscator/AdvancedDeobfuscator.js.map +1 -0
  109. package/dist/modules/deobfuscator/Deobfuscator.d.ts +23 -0
  110. package/dist/modules/deobfuscator/Deobfuscator.d.ts.map +1 -0
  111. package/dist/modules/deobfuscator/Deobfuscator.js +487 -0
  112. package/dist/modules/deobfuscator/Deobfuscator.js.map +1 -0
  113. package/dist/modules/deobfuscator/JSVMPDeobfuscator.d.ts +19 -0
  114. package/dist/modules/deobfuscator/JSVMPDeobfuscator.d.ts.map +1 -0
  115. package/dist/modules/deobfuscator/JSVMPDeobfuscator.js +594 -0
  116. package/dist/modules/deobfuscator/JSVMPDeobfuscator.js.map +1 -0
  117. package/dist/modules/deobfuscator/JScramberDeobfuscator.d.ts +28 -0
  118. package/dist/modules/deobfuscator/JScramberDeobfuscator.d.ts.map +1 -0
  119. package/dist/modules/deobfuscator/JScramberDeobfuscator.js +239 -0
  120. package/dist/modules/deobfuscator/JScramberDeobfuscator.js.map +1 -0
  121. package/dist/modules/deobfuscator/PackerDeobfuscator.d.ts +38 -0
  122. package/dist/modules/deobfuscator/PackerDeobfuscator.d.ts.map +1 -0
  123. package/dist/modules/deobfuscator/PackerDeobfuscator.js +191 -0
  124. package/dist/modules/deobfuscator/PackerDeobfuscator.js.map +1 -0
  125. package/dist/modules/detector/ObfuscationDetector.d.ts +35 -0
  126. package/dist/modules/detector/ObfuscationDetector.d.ts.map +1 -0
  127. package/dist/modules/detector/ObfuscationDetector.js +278 -0
  128. package/dist/modules/detector/ObfuscationDetector.js.map +1 -0
  129. package/dist/modules/emulator/AIEnvironmentAnalyzer.d.ts +32 -0
  130. package/dist/modules/emulator/AIEnvironmentAnalyzer.d.ts.map +1 -0
  131. package/dist/modules/emulator/AIEnvironmentAnalyzer.js +548 -0
  132. package/dist/modules/emulator/AIEnvironmentAnalyzer.js.map +1 -0
  133. package/dist/modules/emulator/BrowserAPIDatabase.d.ts +34 -0
  134. package/dist/modules/emulator/BrowserAPIDatabase.d.ts.map +1 -0
  135. package/dist/modules/emulator/BrowserAPIDatabase.js +326 -0
  136. package/dist/modules/emulator/BrowserAPIDatabase.js.map +1 -0
  137. package/dist/modules/emulator/BrowserEnvironmentRules.d.ts +47 -0
  138. package/dist/modules/emulator/BrowserEnvironmentRules.d.ts.map +1 -0
  139. package/dist/modules/emulator/BrowserEnvironmentRules.js +493 -0
  140. package/dist/modules/emulator/BrowserEnvironmentRules.js.map +1 -0
  141. package/dist/modules/emulator/EnvironmentEmulator.d.ts +27 -0
  142. package/dist/modules/emulator/EnvironmentEmulator.d.ts.map +1 -0
  143. package/dist/modules/emulator/EnvironmentEmulator.js +1113 -0
  144. package/dist/modules/emulator/EnvironmentEmulator.js.map +1 -0
  145. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.d.ts +26 -0
  146. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.d.ts.map +1 -0
  147. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.js +493 -0
  148. package/dist/modules/emulator/EnvironmentEmulatorEnhanced.js.map +1 -0
  149. package/dist/modules/emulator/templates/chrome-env.d.ts +260 -0
  150. package/dist/modules/emulator/templates/chrome-env.d.ts.map +1 -0
  151. package/dist/modules/emulator/templates/chrome-env.js +253 -0
  152. package/dist/modules/emulator/templates/chrome-env.js.map +1 -0
  153. package/dist/modules/hook/AIHookGenerator.d.ts +53 -0
  154. package/dist/modules/hook/AIHookGenerator.d.ts.map +1 -0
  155. package/dist/modules/hook/AIHookGenerator.js +353 -0
  156. package/dist/modules/hook/AIHookGenerator.js.map +1 -0
  157. package/dist/modules/hook/HookManager.d.ts +67 -0
  158. package/dist/modules/hook/HookManager.d.ts.map +1 -0
  159. package/dist/modules/hook/HookManager.js +1225 -0
  160. package/dist/modules/hook/HookManager.js.map +1 -0
  161. package/dist/modules/monitor/ConsoleMonitor.d.ts +140 -0
  162. package/dist/modules/monitor/ConsoleMonitor.d.ts.map +1 -0
  163. package/dist/modules/monitor/ConsoleMonitor.js +834 -0
  164. package/dist/modules/monitor/ConsoleMonitor.js.map +1 -0
  165. package/dist/modules/monitor/PerformanceMonitor.d.ts +65 -0
  166. package/dist/modules/monitor/PerformanceMonitor.d.ts.map +1 -0
  167. package/dist/modules/monitor/PerformanceMonitor.js +175 -0
  168. package/dist/modules/monitor/PerformanceMonitor.js.map +1 -0
  169. package/dist/modules/stealth/StealthScripts2025.d.ts +17 -0
  170. package/dist/modules/stealth/StealthScripts2025.d.ts.map +1 -0
  171. package/dist/modules/stealth/StealthScripts2025.js +274 -0
  172. package/dist/modules/stealth/StealthScripts2025.js.map +1 -0
  173. package/dist/modules/symbolic/JSVMPSymbolicExecutor.d.ts +69 -0
  174. package/dist/modules/symbolic/JSVMPSymbolicExecutor.d.ts.map +1 -0
  175. package/dist/modules/symbolic/JSVMPSymbolicExecutor.js +232 -0
  176. package/dist/modules/symbolic/JSVMPSymbolicExecutor.js.map +1 -0
  177. package/dist/modules/symbolic/SymbolicExecutor.d.ts +69 -0
  178. package/dist/modules/symbolic/SymbolicExecutor.d.ts.map +1 -0
  179. package/dist/modules/symbolic/SymbolicExecutor.js +346 -0
  180. package/dist/modules/symbolic/SymbolicExecutor.js.map +1 -0
  181. package/dist/server/AIHookToolDefinitions.d.ts +3 -0
  182. package/dist/server/AIHookToolDefinitions.d.ts.map +1 -0
  183. package/dist/server/AIHookToolDefinitions.js +284 -0
  184. package/dist/server/AIHookToolDefinitions.js.map +1 -0
  185. package/dist/server/AIHookToolHandlers.d.ts +50 -0
  186. package/dist/server/AIHookToolHandlers.d.ts.map +1 -0
  187. package/dist/server/AIHookToolHandlers.js +311 -0
  188. package/dist/server/AIHookToolHandlers.js.map +1 -0
  189. package/dist/server/AdvancedToolDefinitions.d.ts +3 -0
  190. package/dist/server/AdvancedToolDefinitions.d.ts.map +1 -0
  191. package/dist/server/AdvancedToolDefinitions.js +218 -0
  192. package/dist/server/AdvancedToolDefinitions.js.map +1 -0
  193. package/dist/server/AdvancedToolHandlers.d.ts +85 -0
  194. package/dist/server/AdvancedToolHandlers.d.ts.map +1 -0
  195. package/dist/server/AdvancedToolHandlers.js +431 -0
  196. package/dist/server/AdvancedToolHandlers.js.map +1 -0
  197. package/dist/server/BrowserToolDefinitions.d.ts +3 -0
  198. package/dist/server/BrowserToolDefinitions.d.ts.map +1 -0
  199. package/dist/server/BrowserToolDefinitions.js +841 -0
  200. package/dist/server/BrowserToolDefinitions.js.map +1 -0
  201. package/dist/server/BrowserToolHandlers.d.ts +290 -0
  202. package/dist/server/BrowserToolHandlers.d.ts.map +1 -0
  203. package/dist/server/BrowserToolHandlers.js +784 -0
  204. package/dist/server/BrowserToolHandlers.js.map +1 -0
  205. package/dist/server/CacheToolDefinitions.d.ts +3 -0
  206. package/dist/server/CacheToolDefinitions.d.ts.map +1 -0
  207. package/dist/server/CacheToolDefinitions.js +166 -0
  208. package/dist/server/CacheToolDefinitions.js.map +1 -0
  209. package/dist/server/DebuggerToolDefinitions.d.ts +3 -0
  210. package/dist/server/DebuggerToolDefinitions.d.ts.map +1 -0
  211. package/dist/server/DebuggerToolDefinitions.js +600 -0
  212. package/dist/server/DebuggerToolDefinitions.js.map +1 -0
  213. package/dist/server/DebuggerToolHandlers.d.ts +230 -0
  214. package/dist/server/DebuggerToolHandlers.d.ts.map +1 -0
  215. package/dist/server/DebuggerToolHandlers.js +935 -0
  216. package/dist/server/DebuggerToolHandlers.js.map +1 -0
  217. package/dist/server/MCPServer.d.ts +55 -0
  218. package/dist/server/MCPServer.d.ts.map +1 -0
  219. package/dist/server/MCPServer.js +1344 -0
  220. package/dist/server/MCPServer.js.map +1 -0
  221. package/dist/server/TokenBudgetToolDefinitions.d.ts +3 -0
  222. package/dist/server/TokenBudgetToolDefinitions.d.ts.map +1 -0
  223. package/dist/server/TokenBudgetToolDefinitions.js +114 -0
  224. package/dist/server/TokenBudgetToolDefinitions.js.map +1 -0
  225. package/dist/services/LLMService.d.ts +41 -0
  226. package/dist/services/LLMService.d.ts.map +1 -0
  227. package/dist/services/LLMService.js +792 -0
  228. package/dist/services/LLMService.js.map +1 -0
  229. package/dist/types/index.d.ts +527 -0
  230. package/dist/types/index.d.ts.map +1 -0
  231. package/dist/types/index.js +2 -0
  232. package/dist/types/index.js.map +1 -0
  233. package/dist/utils/AdaptiveDataSerializer.d.ts +27 -0
  234. package/dist/utils/AdaptiveDataSerializer.d.ts.map +1 -0
  235. package/dist/utils/AdaptiveDataSerializer.js +215 -0
  236. package/dist/utils/AdaptiveDataSerializer.js.map +1 -0
  237. package/dist/utils/CacheAdapters.d.ts +30 -0
  238. package/dist/utils/CacheAdapters.d.ts.map +1 -0
  239. package/dist/utils/CacheAdapters.js +83 -0
  240. package/dist/utils/CacheAdapters.js.map +1 -0
  241. package/dist/utils/TokenBudgetManager.d.ts +52 -0
  242. package/dist/utils/TokenBudgetManager.d.ts.map +1 -0
  243. package/dist/utils/TokenBudgetManager.js +190 -0
  244. package/dist/utils/TokenBudgetManager.js.map +1 -0
  245. package/dist/utils/UnifiedCacheManager.d.ts +55 -0
  246. package/dist/utils/UnifiedCacheManager.d.ts.map +1 -0
  247. package/dist/utils/UnifiedCacheManager.js +207 -0
  248. package/dist/utils/UnifiedCacheManager.js.map +1 -0
  249. package/dist/utils/cache.d.ts +13 -0
  250. package/dist/utils/cache.d.ts.map +1 -0
  251. package/dist/utils/cache.js +92 -0
  252. package/dist/utils/cache.js.map +1 -0
  253. package/dist/utils/config.d.ts +7 -0
  254. package/dist/utils/config.d.ts.map +1 -0
  255. package/dist/utils/config.js +93 -0
  256. package/dist/utils/config.js.map +1 -0
  257. package/dist/utils/detailedDataManager.d.ts +60 -0
  258. package/dist/utils/detailedDataManager.d.ts.map +1 -0
  259. package/dist/utils/detailedDataManager.js +204 -0
  260. package/dist/utils/detailedDataManager.js.map +1 -0
  261. package/dist/utils/logger.d.ts +16 -0
  262. package/dist/utils/logger.d.ts.map +1 -0
  263. package/dist/utils/logger.js +47 -0
  264. package/dist/utils/logger.js.map +1 -0
  265. package/dist/utils/parallel.d.ts +40 -0
  266. package/dist/utils/parallel.d.ts.map +1 -0
  267. package/dist/utils/parallel.js +148 -0
  268. package/dist/utils/parallel.js.map +1 -0
  269. package/package.json +94 -0
  270. package/server.json +39 -0
  271. package/tsconfig.dev.json +14 -0
@@ -0,0 +1,387 @@
1
+ import { writeFile, mkdir } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import { logger } from '../../utils/logger.js';
4
+ export class AICaptchaDetector {
5
+ llm;
6
+ screenshotDir;
7
+ constructor(llm, screenshotDir = './screenshots') {
8
+ this.llm = llm;
9
+ this.screenshotDir = screenshotDir;
10
+ }
11
+ async saveScreenshot(screenshotBase64) {
12
+ try {
13
+ await mkdir(this.screenshotDir, { recursive: true });
14
+ const timestamp = Date.now();
15
+ const filename = `captcha-${timestamp}.png`;
16
+ const filepath = join(this.screenshotDir, filename);
17
+ const buffer = Buffer.from(screenshotBase64, 'base64');
18
+ await writeFile(filepath, buffer);
19
+ logger.info(`📸 截图已保存: ${filepath}`);
20
+ return filepath;
21
+ }
22
+ catch (error) {
23
+ logger.error('保存截图失败', error);
24
+ throw error;
25
+ }
26
+ }
27
+ async detect(page) {
28
+ try {
29
+ logger.info('🤖 使用AI检测验证码...');
30
+ const screenshot = await page.screenshot({
31
+ encoding: 'base64',
32
+ fullPage: false,
33
+ });
34
+ const pageInfo = await this.getPageInfo(page);
35
+ const analysis = await this.analyzeWithAI(screenshot, pageInfo);
36
+ logger.info(`AI检测结果: ${analysis.detected ? '检测到验证码' : '未检测到验证码'} (置信度: ${analysis.confidence}%)`);
37
+ return analysis;
38
+ }
39
+ catch (error) {
40
+ logger.error('AI验证码检测失败', error);
41
+ return {
42
+ detected: false,
43
+ confidence: 0,
44
+ reasoning: `检测失败: ${error instanceof Error ? error.message : String(error)}`,
45
+ };
46
+ }
47
+ }
48
+ async getPageInfo(page) {
49
+ const url = page.url();
50
+ const title = await page.title();
51
+ const info = await page.evaluate(() => {
52
+ const bodyText = document.body.innerText.substring(0, 1000);
53
+ const hasIframes = document.querySelectorAll('iframe').length > 0;
54
+ const suspiciousElements = [];
55
+ const captchaSelectors = [
56
+ '[class*="captcha"]',
57
+ '[id*="captcha"]',
58
+ '[class*="verify"]',
59
+ '[id*="verify"]',
60
+ '[class*="challenge"]',
61
+ 'iframe[src*="recaptcha"]',
62
+ 'iframe[src*="hcaptcha"]',
63
+ '.geetest_holder',
64
+ '#nc_1_wrapper',
65
+ ];
66
+ for (const selector of captchaSelectors) {
67
+ const elements = document.querySelectorAll(selector);
68
+ if (elements.length > 0) {
69
+ suspiciousElements.push(`${selector} (${elements.length}个)`);
70
+ }
71
+ }
72
+ return {
73
+ bodyText,
74
+ hasIframes,
75
+ suspiciousElements,
76
+ };
77
+ });
78
+ return {
79
+ url,
80
+ title,
81
+ ...info,
82
+ };
83
+ }
84
+ async analyzeWithAI(screenshot, pageInfo) {
85
+ const prompt = this.buildAnalysisPrompt(pageInfo);
86
+ try {
87
+ logger.info('🤖 开始AI验证码检测...');
88
+ const response = await this.llm.analyzeImage(screenshot, prompt);
89
+ logger.info('✅ AI分析完成,正在解析结果...');
90
+ return this.parseAIResponse(response, '');
91
+ }
92
+ catch (error) {
93
+ const errorMessage = error instanceof Error ? error.message : String(error);
94
+ logger.error('❌ MCP内部AI分析失败:', errorMessage);
95
+ if (errorMessage.includes('does not support image analysis')) {
96
+ logger.warn('⚠️ 当前LLM模型不支持图片分析');
97
+ logger.info('🎯 策略: 保存截图文件,让外部AI智能体分析');
98
+ const screenshotPath = await this.saveScreenshot(screenshot);
99
+ return {
100
+ detected: false,
101
+ type: 'none',
102
+ confidence: 0,
103
+ reasoning: '⚠️ MCP内部LLM不支持图片分析,需要外部AI智能体协助。\n\n' +
104
+ '📸 截图已保存到文件(见screenshotPath字段)\n' +
105
+ '📝 已提供分析提示词\n\n' +
106
+ '请使用支持Vision的AI模型(如GPT-4o、Claude 3)分析截图文件,判断是否包含验证码。\n\n' +
107
+ '---\n\n' +
108
+ `${prompt}\n\n` +
109
+ '---\n\n' +
110
+ '💡 提示: 请查看screenshotPath字段中的图片文件,并根据上述提示词进行分析。',
111
+ screenshotPath,
112
+ vendor: 'external-ai-required',
113
+ suggestions: [
114
+ `请使用支持Vision的AI模型分析截图文件: ${screenshotPath}`,
115
+ '参考reasoning字段中的分析提示词',
116
+ '分析完成后,手动判断是否需要处理验证码',
117
+ '或配置MCP使用支持Vision的模型: gpt-4o, claude-3-opus等'
118
+ ]
119
+ };
120
+ }
121
+ logger.info('🔄 使用降级方案: 基于规则的验证码检测');
122
+ return this.fallbackTextAnalysis(pageInfo);
123
+ }
124
+ }
125
+ buildAnalysisPrompt(pageInfo) {
126
+ return `# 验证码检测专家系统
127
+
128
+ ## 任务目标
129
+ 分析网页截图,精确判断是否包含人机验证码(CAPTCHA),避免误报。
130
+
131
+ ## 输入数据
132
+ \`\`\`json
133
+ {
134
+ "url": "${pageInfo.url}",
135
+ "title": "${pageInfo.title}",
136
+ "hasIframes": ${pageInfo.hasIframes},
137
+ "suspiciousElements": ${JSON.stringify(pageInfo.suspiciousElements)},
138
+ "bodyTextPreview": "${pageInfo.bodyText.substring(0, 200).replace(/"/g, '\\"')}..."
139
+ }
140
+ \`\`\`
141
+
142
+ ## 验证码分类体系
143
+
144
+ ### 1. 交互式验证码(Interactive CAPTCHA)
145
+ **1.1 滑块验证码(Slider CAPTCHA)**
146
+ - **特征**: 拖动滑块完成拼图、滑动到指定位置
147
+ - **厂商**: 极验(Geetest)、阿里云、腾讯、网易易盾
148
+ - **视觉标识**: 滑块轨道、拼图缺口、"向右滑动"提示
149
+ - **DOM特征**: \`.geetest_slider\`, \`.nc_1_wrapper\`, \`.tcaptcha-transform\`
150
+
151
+ **1.2 图形验证码(Image CAPTCHA)**
152
+ - **特征**: 点击图片中的特定对象(如"点击所有红绿灯")
153
+ - **厂商**: reCAPTCHA v2、hCaptcha
154
+ - **视觉标识**: 3x3或4x4图片网格、选择提示文字
155
+ - **DOM特征**: \`iframe[src*="recaptcha"]\`, \`.h-captcha\`
156
+
157
+ **1.3 文本验证码(Text CAPTCHA)**
158
+ - **特征**: 输入图片中显示的字符/数字
159
+ - **视觉标识**: 扭曲的文字图片、输入框
160
+ - **注意**: 区分于"短信验证码输入框"
161
+
162
+ ### 2. 自动验证码(Automatic CAPTCHA)
163
+ **2.1 reCAPTCHA v3**
164
+ - **特征**: 无用户交互,右下角显示reCAPTCHA徽章
165
+ - **视觉标识**: "Protected by reCAPTCHA" 徽章
166
+
167
+ **2.2 Cloudflare Turnstile**
168
+ - **特征**: "正在检查您的浏览器" / "Checking your browser"
169
+ - **视觉标识**: Cloudflare logo、进度条、Ray ID
170
+
171
+ ### 3. 非验证码(False Positives - 常见误报)
172
+ **3.1 普通表单元素**
173
+ - ❌ 登录表单、搜索框、输入框
174
+ - ❌ "请输入验证码"文字(这是短信验证码输入提示)
175
+ - ❌ "获取验证码"按钮(发送短信验证码)
176
+
177
+ **3.2 媒体控件**
178
+ - ❌ 视频播放器进度条、音量滑块
179
+ - ❌ 图片轮播图、画廊滑动
180
+ - ❌ 页面滚动条
181
+
182
+ **3.3 UI组件**
183
+ - ❌ Range slider、Progress bar
184
+ - ❌ Carousel、Swiper
185
+ - ❌ 普通按钮、链接
186
+
187
+ ## 分析流程
188
+
189
+ ### Step 1: 视觉特征识别
190
+ 1. 扫描截图中是否有以下视觉元素:
191
+ - 滑块轨道 + 拼图缺口
192
+ - 图片网格 + 选择提示
193
+ - "我不是机器人"复选框
194
+ - "正在检查您的浏览器"文字
195
+ - Cloudflare/reCAPTCHA logo
196
+
197
+ ### Step 2: 上下文分析
198
+ 1. 检查页面URL是否包含验证码特征:
199
+ - \`/captcha\`, \`/challenge\`, \`/verify\`
200
+ - \`cdn-cgi/challenge\` (Cloudflare)
201
+ - \`recaptcha.net\`, \`hcaptcha.com\`
202
+
203
+ 2. 检查页面标题是否包含验证码关键词:
204
+ - "验证"、"安全检查"、"人机验证"
205
+ - "Verify", "Challenge", "Security Check"
206
+
207
+ 3. 检查可疑元素:
208
+ - 如果suspiciousElements为空 → 大概率不是验证码
209
+ - 如果包含明确的验证码选择器 → 需要视觉确认
210
+
211
+ ### Step 3: 排除误报
212
+ 1. 检查是否为短信验证码输入场景:
213
+ - 文字包含"请输入验证码"、"获取验证码"
214
+ - 只有输入框,无交互式验证组件
215
+ - → 判定为 \`detected: false\`
216
+
217
+ 2. 检查是否为媒体/UI组件:
218
+ - 视频播放器、轮播图、滚动条
219
+ - → 判定为 \`detected: false\`
220
+
221
+ ### Step 4: 置信度评估
222
+ - **90-100%**: 明确的验证码视觉特征 + DOM特征匹配
223
+ - **70-89%**: 视觉特征明显,但DOM特征不完全匹配
224
+ - **50-69%**: 有可疑元素,但视觉不明确
225
+ - **0-49%**: 无明显验证码特征
226
+
227
+ ## 输出格式
228
+
229
+ **严格按照以下JSON Schema输出**:
230
+
231
+ \`\`\`json
232
+ {
233
+ "detected": boolean,
234
+ "type": "slider" | "image" | "recaptcha" | "hcaptcha" | "cloudflare" | "text_input" | "none",
235
+ "confidence": number,
236
+ "reasoning": string,
237
+ "location": {
238
+ "x": number,
239
+ "y": number,
240
+ "width": number,
241
+ "height": number
242
+ } | null,
243
+ "vendor": "geetest" | "tencent" | "aliyun" | "recaptcha" | "hcaptcha" | "cloudflare" | "unknown",
244
+ "suggestions": string[]
245
+ }
246
+ \`\`\`
247
+
248
+ ### 字段说明
249
+ - **detected**: 是否检测到验证码(布尔值)
250
+ - **type**: 验证码类型(枚举值)
251
+ - **confidence**: 置信度(0-100整数)
252
+ - **reasoning**: 推理过程(200字以内,说明判断依据)
253
+ - **location**: 验证码在截图中的位置(像素坐标,如果无法确定则为null)
254
+ - **vendor**: 验证码厂商(如果无法识别则为"unknown")
255
+ - **suggestions**: 处理建议(字符串数组,2-3条)
256
+
257
+ ### 示例输出
258
+
259
+ **示例1: 检测到滑块验证码**
260
+ \`\`\`json
261
+ {
262
+ "detected": true,
263
+ "type": "slider",
264
+ "confidence": 95,
265
+ "reasoning": "截图中央有明显的滑块验证码组件:1) 左侧有拼图缺口的背景图;2) 底部有滑块轨道和'向右滑动完成验证'提示;3) DOM中包含.geetest_slider选择器。综合判断为极验滑块验证码。",
266
+ "location": {
267
+ "x": 450,
268
+ "y": 300,
269
+ "width": 320,
270
+ "height": 180
271
+ },
272
+ "vendor": "geetest",
273
+ "suggestions": [
274
+ "等待用户手动完成滑块验证",
275
+ "使用captcha_wait工具等待验证完成",
276
+ "如果是自动化场景,建议使用验证码识别服务"
277
+ ]
278
+ }
279
+ \`\`\`
280
+
281
+ **示例2: 误报 - 短信验证码输入框**
282
+ \`\`\`json
283
+ {
284
+ "detected": false,
285
+ "type": "none",
286
+ "confidence": 95,
287
+ "reasoning": "页面包含'请输入验证码'和'获取验证码'按钮,但这是短信验证码输入场景,不是人机验证码。截图中只有普通输入框和按钮,无交互式验证组件。",
288
+ "location": null,
289
+ "vendor": "unknown",
290
+ "suggestions": [
291
+ "这是普通的短信验证码输入页面,无需特殊处理",
292
+ "可以正常填写表单并提交"
293
+ ]
294
+ }
295
+ \`\`\`
296
+
297
+ **示例3: 普通页面**
298
+ \`\`\`json
299
+ {
300
+ "detected": false,
301
+ "type": "none",
302
+ "confidence": 98,
303
+ "reasoning": "截图显示的是正常的网页内容,包含导航栏、内容区域和页脚。无任何验证码视觉特征,suspiciousElements为空,URL和标题也无验证码关键词。",
304
+ "location": null,
305
+ "vendor": "unknown",
306
+ "suggestions": [
307
+ "页面正常,无需处理",
308
+ "可以继续执行后续操作"
309
+ ]
310
+ }
311
+ \`\`\`
312
+
313
+ ## 关键原则
314
+
315
+ 1. **保守判断**: 不确定时倾向于 \`detected: false\`,避免误报
316
+ 2. **视觉优先**: 截图证据 > DOM特征 > 文本关键词
317
+ 3. **上下文结合**: 综合URL、标题、DOM、视觉特征判断
318
+ 4. **明确推理**: reasoning必须说明具体的判断依据
319
+ 5. **实用建议**: suggestions要提供可操作的处理方案
320
+
321
+ 现在,请分析提供的截图并输出JSON结果。`;
322
+ }
323
+ parseAIResponse(response, screenshotPath) {
324
+ try {
325
+ const jsonMatch = response.match(/```json\s*([\s\S]*?)\s*```/) ||
326
+ response.match(/\{[\s\S]*\}/);
327
+ if (!jsonMatch) {
328
+ throw new Error('无法从AI响应中提取JSON');
329
+ }
330
+ const jsonStr = jsonMatch[1] || jsonMatch[0];
331
+ const result = JSON.parse(jsonStr);
332
+ return {
333
+ detected: result.detected || false,
334
+ type: result.type || 'none',
335
+ confidence: result.confidence || 0,
336
+ reasoning: result.reasoning || '无推理信息',
337
+ location: result.location,
338
+ vendor: result.vendor,
339
+ suggestions: result.suggestions || [],
340
+ screenshotPath: screenshotPath || undefined,
341
+ };
342
+ }
343
+ catch (error) {
344
+ logger.error('解析AI响应失败', error);
345
+ const detected = response.toLowerCase().includes('detected') &&
346
+ response.toLowerCase().includes('true');
347
+ return {
348
+ detected,
349
+ confidence: detected ? 50 : 80,
350
+ reasoning: `AI响应解析失败,基于文本判断: ${response.substring(0, 200)}`,
351
+ screenshotPath: screenshotPath || undefined,
352
+ };
353
+ }
354
+ }
355
+ fallbackTextAnalysis(pageInfo) {
356
+ logger.warn('降级到基于文本的分析');
357
+ const hasCaptchaElements = pageInfo.suspiciousElements.length > 0;
358
+ const hasCaptchaKeywords = pageInfo.title.toLowerCase().includes('captcha') ||
359
+ pageInfo.title.toLowerCase().includes('verify') ||
360
+ pageInfo.bodyText.toLowerCase().includes('滑动验证') ||
361
+ pageInfo.bodyText.toLowerCase().includes('人机验证');
362
+ const detected = hasCaptchaElements && hasCaptchaKeywords;
363
+ return {
364
+ detected,
365
+ confidence: detected ? 60 : 90,
366
+ reasoning: `降级分析: ${detected ? '检测到可疑元素和关键词' : '未检测到明显验证码特征'}`,
367
+ suggestions: detected
368
+ ? ['建议人工确认', '可能需要手动处理']
369
+ : ['页面正常,无需处理'],
370
+ };
371
+ }
372
+ async waitForCompletion(page, timeout = 300000) {
373
+ logger.info('⏳ 等待用户完成验证码...');
374
+ const startTime = Date.now();
375
+ while (Date.now() - startTime < timeout) {
376
+ const result = await this.detect(page);
377
+ if (!result.detected || result.confidence < 50) {
378
+ logger.info('✅ 验证码已完成或不存在');
379
+ return true;
380
+ }
381
+ await new Promise(resolve => setTimeout(resolve, 3000));
382
+ }
383
+ logger.error('❌ 验证码完成超时');
384
+ return false;
385
+ }
386
+ }
387
+ //# sourceMappingURL=AICaptchaDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AICaptchaDetector.js","sourceRoot":"","sources":["../../../src/modules/captcha/AICaptchaDetector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { Page } from 'puppeteer';
2
+ export interface CaptchaDetectionResult {
3
+ detected: boolean;
4
+ type?: 'slider' | 'image' | 'recaptcha' | 'hcaptcha' | 'cloudflare' | 'page_redirect' | 'url_redirect' | 'unknown';
5
+ selector?: string;
6
+ title?: string;
7
+ url?: string;
8
+ confidence: number;
9
+ vendor?: 'geetest' | 'tencent' | 'aliyun' | 'cloudflare' | 'akamai' | 'datadome' | 'perimeter-x' | 'recaptcha' | 'hcaptcha' | 'unknown';
10
+ details?: any;
11
+ falsePositiveReason?: string;
12
+ }
13
+ export declare class CaptchaDetector {
14
+ private static readonly EXCLUDE_SELECTORS;
15
+ private static readonly CAPTCHA_SELECTORS;
16
+ private static readonly CAPTCHA_KEYWORDS;
17
+ private static readonly EXCLUDE_KEYWORDS;
18
+ detect(page: Page): Promise<CaptchaDetectionResult>;
19
+ private checkUrl;
20
+ private checkTitle;
21
+ private checkDOMElements;
22
+ private checkPageText;
23
+ private checkVendorSpecific;
24
+ waitForCompletion(page: Page, timeout?: number): Promise<boolean>;
25
+ private verifyByDOM;
26
+ private verifySliderElement;
27
+ }
28
+ //# sourceMappingURL=CaptchaDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptchaDetector.d.ts","sourceRoot":"","sources":["../../../src/modules/captcha/CaptchaDetector.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,cAAc,GAAG,SAAS,CAAC;IACnH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACxI,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAsBvC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAyEvC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAsCtC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CA8BtC;IAKI,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,sBAAsB,CAAC;YA6C3C,QAAQ;YAgER,UAAU;YAqCV,gBAAgB;YAoFhB,aAAa;YAoCb,mBAAmB;IAqC3B,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,MAAe,GAAG,OAAO,CAAC,OAAO,CAAC;YAyBjE,WAAW;YAuCX,mBAAmB;CAiIlC"}