@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.
- package/.env.example +38 -0
- package/CLAUDE.md +170 -0
- package/README.md +564 -0
- package/bun.lock +1484 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/analyzer/AISummarizer.d.ts +41 -0
- package/dist/modules/analyzer/AISummarizer.d.ts.map +1 -0
- package/dist/modules/analyzer/AISummarizer.js +186 -0
- package/dist/modules/analyzer/AISummarizer.js.map +1 -0
- package/dist/modules/analyzer/CodeAnalyzer.d.ts +28 -0
- package/dist/modules/analyzer/CodeAnalyzer.d.ts.map +1 -0
- package/dist/modules/analyzer/CodeAnalyzer.js +1287 -0
- package/dist/modules/analyzer/CodeAnalyzer.js.map +1 -0
- package/dist/modules/analyzer/IntelligentAnalyzer.d.ts +114 -0
- package/dist/modules/analyzer/IntelligentAnalyzer.d.ts.map +1 -0
- package/dist/modules/analyzer/IntelligentAnalyzer.js +1176 -0
- package/dist/modules/analyzer/IntelligentAnalyzer.js.map +1 -0
- package/dist/modules/browser/BrowserModeManager.d.ts +31 -0
- package/dist/modules/browser/BrowserModeManager.d.ts.map +1 -0
- package/dist/modules/browser/BrowserModeManager.js +241 -0
- package/dist/modules/browser/BrowserModeManager.js.map +1 -0
- package/dist/modules/captcha/AICaptchaDetector.d.ts +32 -0
- package/dist/modules/captcha/AICaptchaDetector.d.ts.map +1 -0
- package/dist/modules/captcha/AICaptchaDetector.js +387 -0
- package/dist/modules/captcha/AICaptchaDetector.js.map +1 -0
- package/dist/modules/captcha/CaptchaDetector.d.ts +28 -0
- package/dist/modules/captcha/CaptchaDetector.d.ts.map +1 -0
- package/dist/modules/captcha/CaptchaDetector.js +513 -0
- package/dist/modules/captcha/CaptchaDetector.js.map +1 -0
- package/dist/modules/collector/CodeCache.d.ts +37 -0
- package/dist/modules/collector/CodeCache.d.ts.map +1 -0
- package/dist/modules/collector/CodeCache.js +188 -0
- package/dist/modules/collector/CodeCache.js.map +1 -0
- package/dist/modules/collector/CodeCollector.d.ts +107 -0
- package/dist/modules/collector/CodeCollector.d.ts.map +1 -0
- package/dist/modules/collector/CodeCollector.js +796 -0
- package/dist/modules/collector/CodeCollector.js.map +1 -0
- package/dist/modules/collector/CodeCompressor.d.ts +65 -0
- package/dist/modules/collector/CodeCompressor.d.ts.map +1 -0
- package/dist/modules/collector/CodeCompressor.js +245 -0
- package/dist/modules/collector/CodeCompressor.js.map +1 -0
- package/dist/modules/collector/DOMInspector.d.ts +51 -0
- package/dist/modules/collector/DOMInspector.d.ts.map +1 -0
- package/dist/modules/collector/DOMInspector.js +437 -0
- package/dist/modules/collector/DOMInspector.js.map +1 -0
- package/dist/modules/collector/PageController.d.ts +79 -0
- package/dist/modules/collector/PageController.d.ts.map +1 -0
- package/dist/modules/collector/PageController.js +287 -0
- package/dist/modules/collector/PageController.js.map +1 -0
- package/dist/modules/collector/SmartCodeCollector.d.ts +38 -0
- package/dist/modules/collector/SmartCodeCollector.d.ts.map +1 -0
- package/dist/modules/collector/SmartCodeCollector.js +208 -0
- package/dist/modules/collector/SmartCodeCollector.js.map +1 -0
- package/dist/modules/collector/StreamingCollector.d.ts +46 -0
- package/dist/modules/collector/StreamingCollector.d.ts.map +1 -0
- package/dist/modules/collector/StreamingCollector.js +127 -0
- package/dist/modules/collector/StreamingCollector.js.map +1 -0
- package/dist/modules/crypto/CryptoDetector.d.ts +22 -0
- package/dist/modules/crypto/CryptoDetector.d.ts.map +1 -0
- package/dist/modules/crypto/CryptoDetector.js +168 -0
- package/dist/modules/crypto/CryptoDetector.js.map +1 -0
- package/dist/modules/crypto/CryptoDetectorEnhanced.d.ts +31 -0
- package/dist/modules/crypto/CryptoDetectorEnhanced.d.ts.map +1 -0
- package/dist/modules/crypto/CryptoDetectorEnhanced.js +269 -0
- package/dist/modules/crypto/CryptoDetectorEnhanced.js.map +1 -0
- package/dist/modules/crypto/CryptoRules.d.ts +59 -0
- package/dist/modules/crypto/CryptoRules.d.ts.map +1 -0
- package/dist/modules/crypto/CryptoRules.js +234 -0
- package/dist/modules/crypto/CryptoRules.js.map +1 -0
- package/dist/modules/debugger/BlackboxManager.d.ts +14 -0
- package/dist/modules/debugger/BlackboxManager.d.ts.map +1 -0
- package/dist/modules/debugger/BlackboxManager.js +98 -0
- package/dist/modules/debugger/BlackboxManager.js.map +1 -0
- package/dist/modules/debugger/DebuggerManager.d.ts +138 -0
- package/dist/modules/debugger/DebuggerManager.d.ts.map +1 -0
- package/dist/modules/debugger/DebuggerManager.js +777 -0
- package/dist/modules/debugger/DebuggerManager.js.map +1 -0
- package/dist/modules/debugger/EventBreakpointManager.d.ts +30 -0
- package/dist/modules/debugger/EventBreakpointManager.d.ts.map +1 -0
- package/dist/modules/debugger/EventBreakpointManager.js +125 -0
- package/dist/modules/debugger/EventBreakpointManager.js.map +1 -0
- package/dist/modules/debugger/RuntimeInspector.d.ts +54 -0
- package/dist/modules/debugger/RuntimeInspector.d.ts.map +1 -0
- package/dist/modules/debugger/RuntimeInspector.js +277 -0
- package/dist/modules/debugger/RuntimeInspector.js.map +1 -0
- package/dist/modules/debugger/ScriptManager.d.ts +94 -0
- package/dist/modules/debugger/ScriptManager.d.ts.map +1 -0
- package/dist/modules/debugger/ScriptManager.js +433 -0
- package/dist/modules/debugger/ScriptManager.js.map +1 -0
- package/dist/modules/debugger/WatchExpressionManager.d.ts +52 -0
- package/dist/modules/debugger/WatchExpressionManager.d.ts.map +1 -0
- package/dist/modules/debugger/WatchExpressionManager.js +136 -0
- package/dist/modules/debugger/WatchExpressionManager.js.map +1 -0
- package/dist/modules/debugger/XHRBreakpointManager.d.ts +21 -0
- package/dist/modules/debugger/XHRBreakpointManager.d.ts.map +1 -0
- package/dist/modules/debugger/XHRBreakpointManager.js +81 -0
- package/dist/modules/debugger/XHRBreakpointManager.js.map +1 -0
- package/dist/modules/deobfuscator/ASTOptimizer.d.ts +12 -0
- package/dist/modules/deobfuscator/ASTOptimizer.d.ts.map +1 -0
- package/dist/modules/deobfuscator/ASTOptimizer.js +234 -0
- package/dist/modules/deobfuscator/ASTOptimizer.js.map +1 -0
- package/dist/modules/deobfuscator/AdvancedDeobfuscator.d.ts +52 -0
- package/dist/modules/deobfuscator/AdvancedDeobfuscator.d.ts.map +1 -0
- package/dist/modules/deobfuscator/AdvancedDeobfuscator.js +985 -0
- package/dist/modules/deobfuscator/AdvancedDeobfuscator.js.map +1 -0
- package/dist/modules/deobfuscator/Deobfuscator.d.ts +23 -0
- package/dist/modules/deobfuscator/Deobfuscator.d.ts.map +1 -0
- package/dist/modules/deobfuscator/Deobfuscator.js +487 -0
- package/dist/modules/deobfuscator/Deobfuscator.js.map +1 -0
- package/dist/modules/deobfuscator/JSVMPDeobfuscator.d.ts +19 -0
- package/dist/modules/deobfuscator/JSVMPDeobfuscator.d.ts.map +1 -0
- package/dist/modules/deobfuscator/JSVMPDeobfuscator.js +594 -0
- package/dist/modules/deobfuscator/JSVMPDeobfuscator.js.map +1 -0
- package/dist/modules/deobfuscator/JScramberDeobfuscator.d.ts +28 -0
- package/dist/modules/deobfuscator/JScramberDeobfuscator.d.ts.map +1 -0
- package/dist/modules/deobfuscator/JScramberDeobfuscator.js +239 -0
- package/dist/modules/deobfuscator/JScramberDeobfuscator.js.map +1 -0
- package/dist/modules/deobfuscator/PackerDeobfuscator.d.ts +38 -0
- package/dist/modules/deobfuscator/PackerDeobfuscator.d.ts.map +1 -0
- package/dist/modules/deobfuscator/PackerDeobfuscator.js +191 -0
- package/dist/modules/deobfuscator/PackerDeobfuscator.js.map +1 -0
- package/dist/modules/detector/ObfuscationDetector.d.ts +35 -0
- package/dist/modules/detector/ObfuscationDetector.d.ts.map +1 -0
- package/dist/modules/detector/ObfuscationDetector.js +278 -0
- package/dist/modules/detector/ObfuscationDetector.js.map +1 -0
- package/dist/modules/emulator/AIEnvironmentAnalyzer.d.ts +32 -0
- package/dist/modules/emulator/AIEnvironmentAnalyzer.d.ts.map +1 -0
- package/dist/modules/emulator/AIEnvironmentAnalyzer.js +548 -0
- package/dist/modules/emulator/AIEnvironmentAnalyzer.js.map +1 -0
- package/dist/modules/emulator/BrowserAPIDatabase.d.ts +34 -0
- package/dist/modules/emulator/BrowserAPIDatabase.d.ts.map +1 -0
- package/dist/modules/emulator/BrowserAPIDatabase.js +326 -0
- package/dist/modules/emulator/BrowserAPIDatabase.js.map +1 -0
- package/dist/modules/emulator/BrowserEnvironmentRules.d.ts +47 -0
- package/dist/modules/emulator/BrowserEnvironmentRules.d.ts.map +1 -0
- package/dist/modules/emulator/BrowserEnvironmentRules.js +493 -0
- package/dist/modules/emulator/BrowserEnvironmentRules.js.map +1 -0
- package/dist/modules/emulator/EnvironmentEmulator.d.ts +27 -0
- package/dist/modules/emulator/EnvironmentEmulator.d.ts.map +1 -0
- package/dist/modules/emulator/EnvironmentEmulator.js +1113 -0
- package/dist/modules/emulator/EnvironmentEmulator.js.map +1 -0
- package/dist/modules/emulator/EnvironmentEmulatorEnhanced.d.ts +26 -0
- package/dist/modules/emulator/EnvironmentEmulatorEnhanced.d.ts.map +1 -0
- package/dist/modules/emulator/EnvironmentEmulatorEnhanced.js +493 -0
- package/dist/modules/emulator/EnvironmentEmulatorEnhanced.js.map +1 -0
- package/dist/modules/emulator/templates/chrome-env.d.ts +260 -0
- package/dist/modules/emulator/templates/chrome-env.d.ts.map +1 -0
- package/dist/modules/emulator/templates/chrome-env.js +253 -0
- package/dist/modules/emulator/templates/chrome-env.js.map +1 -0
- package/dist/modules/hook/AIHookGenerator.d.ts +53 -0
- package/dist/modules/hook/AIHookGenerator.d.ts.map +1 -0
- package/dist/modules/hook/AIHookGenerator.js +353 -0
- package/dist/modules/hook/AIHookGenerator.js.map +1 -0
- package/dist/modules/hook/HookManager.d.ts +67 -0
- package/dist/modules/hook/HookManager.d.ts.map +1 -0
- package/dist/modules/hook/HookManager.js +1225 -0
- package/dist/modules/hook/HookManager.js.map +1 -0
- package/dist/modules/monitor/ConsoleMonitor.d.ts +140 -0
- package/dist/modules/monitor/ConsoleMonitor.d.ts.map +1 -0
- package/dist/modules/monitor/ConsoleMonitor.js +834 -0
- package/dist/modules/monitor/ConsoleMonitor.js.map +1 -0
- package/dist/modules/monitor/PerformanceMonitor.d.ts +65 -0
- package/dist/modules/monitor/PerformanceMonitor.d.ts.map +1 -0
- package/dist/modules/monitor/PerformanceMonitor.js +175 -0
- package/dist/modules/monitor/PerformanceMonitor.js.map +1 -0
- package/dist/modules/stealth/StealthScripts2025.d.ts +17 -0
- package/dist/modules/stealth/StealthScripts2025.d.ts.map +1 -0
- package/dist/modules/stealth/StealthScripts2025.js +274 -0
- package/dist/modules/stealth/StealthScripts2025.js.map +1 -0
- package/dist/modules/symbolic/JSVMPSymbolicExecutor.d.ts +69 -0
- package/dist/modules/symbolic/JSVMPSymbolicExecutor.d.ts.map +1 -0
- package/dist/modules/symbolic/JSVMPSymbolicExecutor.js +232 -0
- package/dist/modules/symbolic/JSVMPSymbolicExecutor.js.map +1 -0
- package/dist/modules/symbolic/SymbolicExecutor.d.ts +69 -0
- package/dist/modules/symbolic/SymbolicExecutor.d.ts.map +1 -0
- package/dist/modules/symbolic/SymbolicExecutor.js +346 -0
- package/dist/modules/symbolic/SymbolicExecutor.js.map +1 -0
- package/dist/server/AIHookToolDefinitions.d.ts +3 -0
- package/dist/server/AIHookToolDefinitions.d.ts.map +1 -0
- package/dist/server/AIHookToolDefinitions.js +284 -0
- package/dist/server/AIHookToolDefinitions.js.map +1 -0
- package/dist/server/AIHookToolHandlers.d.ts +50 -0
- package/dist/server/AIHookToolHandlers.d.ts.map +1 -0
- package/dist/server/AIHookToolHandlers.js +311 -0
- package/dist/server/AIHookToolHandlers.js.map +1 -0
- package/dist/server/AdvancedToolDefinitions.d.ts +3 -0
- package/dist/server/AdvancedToolDefinitions.d.ts.map +1 -0
- package/dist/server/AdvancedToolDefinitions.js +218 -0
- package/dist/server/AdvancedToolDefinitions.js.map +1 -0
- package/dist/server/AdvancedToolHandlers.d.ts +85 -0
- package/dist/server/AdvancedToolHandlers.d.ts.map +1 -0
- package/dist/server/AdvancedToolHandlers.js +431 -0
- package/dist/server/AdvancedToolHandlers.js.map +1 -0
- package/dist/server/BrowserToolDefinitions.d.ts +3 -0
- package/dist/server/BrowserToolDefinitions.d.ts.map +1 -0
- package/dist/server/BrowserToolDefinitions.js +841 -0
- package/dist/server/BrowserToolDefinitions.js.map +1 -0
- package/dist/server/BrowserToolHandlers.d.ts +290 -0
- package/dist/server/BrowserToolHandlers.d.ts.map +1 -0
- package/dist/server/BrowserToolHandlers.js +784 -0
- package/dist/server/BrowserToolHandlers.js.map +1 -0
- package/dist/server/CacheToolDefinitions.d.ts +3 -0
- package/dist/server/CacheToolDefinitions.d.ts.map +1 -0
- package/dist/server/CacheToolDefinitions.js +166 -0
- package/dist/server/CacheToolDefinitions.js.map +1 -0
- package/dist/server/DebuggerToolDefinitions.d.ts +3 -0
- package/dist/server/DebuggerToolDefinitions.d.ts.map +1 -0
- package/dist/server/DebuggerToolDefinitions.js +600 -0
- package/dist/server/DebuggerToolDefinitions.js.map +1 -0
- package/dist/server/DebuggerToolHandlers.d.ts +230 -0
- package/dist/server/DebuggerToolHandlers.d.ts.map +1 -0
- package/dist/server/DebuggerToolHandlers.js +935 -0
- package/dist/server/DebuggerToolHandlers.js.map +1 -0
- package/dist/server/MCPServer.d.ts +55 -0
- package/dist/server/MCPServer.d.ts.map +1 -0
- package/dist/server/MCPServer.js +1344 -0
- package/dist/server/MCPServer.js.map +1 -0
- package/dist/server/TokenBudgetToolDefinitions.d.ts +3 -0
- package/dist/server/TokenBudgetToolDefinitions.d.ts.map +1 -0
- package/dist/server/TokenBudgetToolDefinitions.js +114 -0
- package/dist/server/TokenBudgetToolDefinitions.js.map +1 -0
- package/dist/services/LLMService.d.ts +41 -0
- package/dist/services/LLMService.d.ts.map +1 -0
- package/dist/services/LLMService.js +792 -0
- package/dist/services/LLMService.js.map +1 -0
- package/dist/types/index.d.ts +527 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/AdaptiveDataSerializer.d.ts +27 -0
- package/dist/utils/AdaptiveDataSerializer.d.ts.map +1 -0
- package/dist/utils/AdaptiveDataSerializer.js +215 -0
- package/dist/utils/AdaptiveDataSerializer.js.map +1 -0
- package/dist/utils/CacheAdapters.d.ts +30 -0
- package/dist/utils/CacheAdapters.d.ts.map +1 -0
- package/dist/utils/CacheAdapters.js +83 -0
- package/dist/utils/CacheAdapters.js.map +1 -0
- package/dist/utils/TokenBudgetManager.d.ts +52 -0
- package/dist/utils/TokenBudgetManager.d.ts.map +1 -0
- package/dist/utils/TokenBudgetManager.js +190 -0
- package/dist/utils/TokenBudgetManager.js.map +1 -0
- package/dist/utils/UnifiedCacheManager.d.ts +55 -0
- package/dist/utils/UnifiedCacheManager.d.ts.map +1 -0
- package/dist/utils/UnifiedCacheManager.js +207 -0
- package/dist/utils/UnifiedCacheManager.js.map +1 -0
- package/dist/utils/cache.d.ts +13 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +92 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +7 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +93 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/detailedDataManager.d.ts +60 -0
- package/dist/utils/detailedDataManager.d.ts.map +1 -0
- package/dist/utils/detailedDataManager.js +204 -0
- package/dist/utils/detailedDataManager.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/parallel.d.ts +40 -0
- package/dist/utils/parallel.d.ts.map +1 -0
- package/dist/utils/parallel.js +148 -0
- package/dist/utils/parallel.js.map +1 -0
- package/package.json +94 -0
- package/server.json +39 -0
- 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"}
|