@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,784 @@
|
|
|
1
|
+
import { AICaptchaDetector } from '../modules/captcha/AICaptchaDetector.js';
|
|
2
|
+
import { StealthScripts2025 } from '../modules/stealth/StealthScripts2025.js';
|
|
3
|
+
import { DetailedDataManager } from '../utils/detailedDataManager.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
export class BrowserToolHandlers {
|
|
6
|
+
collector;
|
|
7
|
+
pageController;
|
|
8
|
+
domInspector;
|
|
9
|
+
scriptManager;
|
|
10
|
+
consoleMonitor;
|
|
11
|
+
captchaDetector;
|
|
12
|
+
autoDetectCaptcha = true;
|
|
13
|
+
autoSwitchHeadless = true;
|
|
14
|
+
captchaTimeout = 300000;
|
|
15
|
+
detailedDataManager;
|
|
16
|
+
constructor(collector, pageController, domInspector, scriptManager, consoleMonitor, llmService) {
|
|
17
|
+
this.collector = collector;
|
|
18
|
+
this.pageController = pageController;
|
|
19
|
+
this.domInspector = domInspector;
|
|
20
|
+
this.scriptManager = scriptManager;
|
|
21
|
+
this.consoleMonitor = consoleMonitor;
|
|
22
|
+
const screenshotDir = process.env.CAPTCHA_SCREENSHOT_DIR || './screenshots';
|
|
23
|
+
this.captchaDetector = new AICaptchaDetector(llmService, screenshotDir);
|
|
24
|
+
this.detailedDataManager = DetailedDataManager.getInstance();
|
|
25
|
+
}
|
|
26
|
+
async handleGetDetailedData(args) {
|
|
27
|
+
try {
|
|
28
|
+
const detailId = args.detailId;
|
|
29
|
+
const path = args.path;
|
|
30
|
+
const data = this.detailedDataManager.retrieve(detailId, path);
|
|
31
|
+
return {
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: JSON.stringify({
|
|
36
|
+
success: true,
|
|
37
|
+
detailId,
|
|
38
|
+
path: path || 'full',
|
|
39
|
+
data,
|
|
40
|
+
}, null, 2),
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger.error('Failed to get detailed data:', error);
|
|
47
|
+
return {
|
|
48
|
+
content: [
|
|
49
|
+
{
|
|
50
|
+
type: 'text',
|
|
51
|
+
text: JSON.stringify({
|
|
52
|
+
success: false,
|
|
53
|
+
error: error instanceof Error ? error.message : String(error),
|
|
54
|
+
hint: 'DetailId may have expired (TTL: 10 minutes) or is invalid',
|
|
55
|
+
}, null, 2),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async handleBrowserLaunch(_args) {
|
|
62
|
+
await this.collector.init();
|
|
63
|
+
const status = await this.collector.getStatus();
|
|
64
|
+
return {
|
|
65
|
+
content: [{
|
|
66
|
+
type: 'text',
|
|
67
|
+
text: JSON.stringify({
|
|
68
|
+
success: true,
|
|
69
|
+
message: 'Browser launched successfully',
|
|
70
|
+
status,
|
|
71
|
+
}, null, 2),
|
|
72
|
+
}],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async handleBrowserClose(_args) {
|
|
76
|
+
await this.collector.close();
|
|
77
|
+
return {
|
|
78
|
+
content: [{
|
|
79
|
+
type: 'text',
|
|
80
|
+
text: JSON.stringify({
|
|
81
|
+
success: true,
|
|
82
|
+
message: 'Browser closed successfully',
|
|
83
|
+
}, null, 2),
|
|
84
|
+
}],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async handleBrowserStatus(_args) {
|
|
88
|
+
const status = await this.collector.getStatus();
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: 'text',
|
|
92
|
+
text: JSON.stringify(status, null, 2),
|
|
93
|
+
}],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
async handlePageNavigate(args) {
|
|
97
|
+
const url = args.url;
|
|
98
|
+
const waitUntil = args.waitUntil;
|
|
99
|
+
const timeout = args.timeout;
|
|
100
|
+
const enableNetworkMonitoring = args.enableNetworkMonitoring;
|
|
101
|
+
let networkMonitoringEnabled = false;
|
|
102
|
+
if (enableNetworkMonitoring) {
|
|
103
|
+
if (!this.consoleMonitor.isNetworkEnabled()) {
|
|
104
|
+
try {
|
|
105
|
+
await this.consoleMonitor.enable({
|
|
106
|
+
enableNetwork: true,
|
|
107
|
+
enableExceptions: true,
|
|
108
|
+
});
|
|
109
|
+
networkMonitoringEnabled = true;
|
|
110
|
+
logger.info('✅ Network monitoring auto-enabled before navigation');
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger.warn('Failed to auto-enable network monitoring:', error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
networkMonitoringEnabled = true;
|
|
118
|
+
logger.info('✅ Network monitoring already enabled');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
await this.pageController.navigate(url, { waitUntil, timeout });
|
|
122
|
+
if (this.autoDetectCaptcha) {
|
|
123
|
+
const page = await this.pageController.getPage();
|
|
124
|
+
if (page) {
|
|
125
|
+
const captchaResult = await this.captchaDetector.detect(page);
|
|
126
|
+
if (captchaResult.detected) {
|
|
127
|
+
logger.warn(`⚠️ 检测到验证码 (类型: ${captchaResult.type}, 置信度: ${captchaResult.confidence}%)`);
|
|
128
|
+
return {
|
|
129
|
+
content: [{
|
|
130
|
+
type: 'text',
|
|
131
|
+
text: JSON.stringify({
|
|
132
|
+
success: true,
|
|
133
|
+
captcha_detected: true,
|
|
134
|
+
captcha_info: captchaResult,
|
|
135
|
+
url: await this.pageController.getURL(),
|
|
136
|
+
title: await this.pageController.getTitle(),
|
|
137
|
+
message: '检测到验证码,请使用 captcha_handle 工具处理或手动完成验证',
|
|
138
|
+
network_monitoring_enabled: networkMonitoringEnabled,
|
|
139
|
+
}, null, 2),
|
|
140
|
+
}],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const currentUrl = await this.pageController.getURL();
|
|
146
|
+
const title = await this.pageController.getTitle();
|
|
147
|
+
const result = {
|
|
148
|
+
success: true,
|
|
149
|
+
captcha_detected: false,
|
|
150
|
+
url: currentUrl,
|
|
151
|
+
title,
|
|
152
|
+
};
|
|
153
|
+
if (networkMonitoringEnabled) {
|
|
154
|
+
const networkStatus = this.consoleMonitor.getNetworkStatus();
|
|
155
|
+
result.network_monitoring = {
|
|
156
|
+
enabled: true,
|
|
157
|
+
auto_enabled: true,
|
|
158
|
+
message: '✅ Network monitoring is active. Use network_get_requests to retrieve captured requests.',
|
|
159
|
+
requestCount: networkStatus.requestCount,
|
|
160
|
+
responseCount: networkStatus.responseCount,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
content: [{
|
|
165
|
+
type: 'text',
|
|
166
|
+
text: JSON.stringify(result, null, 2),
|
|
167
|
+
}],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
async handlePageReload(_args) {
|
|
171
|
+
await this.pageController.reload();
|
|
172
|
+
return {
|
|
173
|
+
content: [{
|
|
174
|
+
type: 'text',
|
|
175
|
+
text: JSON.stringify({
|
|
176
|
+
success: true,
|
|
177
|
+
message: 'Page reloaded',
|
|
178
|
+
}, null, 2),
|
|
179
|
+
}],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
async handlePageBack(_args) {
|
|
183
|
+
await this.pageController.goBack();
|
|
184
|
+
const url = await this.pageController.getURL();
|
|
185
|
+
return {
|
|
186
|
+
content: [{
|
|
187
|
+
type: 'text',
|
|
188
|
+
text: JSON.stringify({
|
|
189
|
+
success: true,
|
|
190
|
+
url,
|
|
191
|
+
}, null, 2),
|
|
192
|
+
}],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
async handlePageForward(_args) {
|
|
196
|
+
await this.pageController.goForward();
|
|
197
|
+
const url = await this.pageController.getURL();
|
|
198
|
+
return {
|
|
199
|
+
content: [{
|
|
200
|
+
type: 'text',
|
|
201
|
+
text: JSON.stringify({
|
|
202
|
+
success: true,
|
|
203
|
+
url,
|
|
204
|
+
}, null, 2),
|
|
205
|
+
}],
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
async handleDOMQuerySelector(args) {
|
|
209
|
+
const selector = args.selector;
|
|
210
|
+
const getAttributes = args.getAttributes ?? true;
|
|
211
|
+
const element = await this.domInspector.querySelector(selector, getAttributes);
|
|
212
|
+
return {
|
|
213
|
+
content: [{
|
|
214
|
+
type: 'text',
|
|
215
|
+
text: JSON.stringify(element, null, 2),
|
|
216
|
+
}],
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
async handleDOMQueryAll(args) {
|
|
220
|
+
const selector = args.selector;
|
|
221
|
+
const limit = args.limit ?? 100;
|
|
222
|
+
const elements = await this.domInspector.querySelectorAll(selector, limit);
|
|
223
|
+
return {
|
|
224
|
+
content: [{
|
|
225
|
+
type: 'text',
|
|
226
|
+
text: JSON.stringify({
|
|
227
|
+
count: elements.length,
|
|
228
|
+
elements,
|
|
229
|
+
}, null, 2),
|
|
230
|
+
}],
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
async handleDOMGetStructure(args) {
|
|
234
|
+
const maxDepth = args.maxDepth ?? 3;
|
|
235
|
+
const includeText = args.includeText ?? true;
|
|
236
|
+
const structure = await this.domInspector.getStructure(maxDepth, includeText);
|
|
237
|
+
const processedStructure = this.detailedDataManager.smartHandle(structure, 51200);
|
|
238
|
+
return {
|
|
239
|
+
content: [
|
|
240
|
+
{
|
|
241
|
+
type: 'text',
|
|
242
|
+
text: JSON.stringify(processedStructure, null, 2),
|
|
243
|
+
},
|
|
244
|
+
],
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
async handleDOMFindClickable(args) {
|
|
248
|
+
const filterText = args.filterText;
|
|
249
|
+
const clickable = await this.domInspector.findClickable(filterText);
|
|
250
|
+
return {
|
|
251
|
+
content: [{
|
|
252
|
+
type: 'text',
|
|
253
|
+
text: JSON.stringify({
|
|
254
|
+
count: clickable.length,
|
|
255
|
+
elements: clickable,
|
|
256
|
+
}, null, 2),
|
|
257
|
+
}],
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
async handlePageClick(args) {
|
|
261
|
+
const selector = args.selector;
|
|
262
|
+
const button = args.button;
|
|
263
|
+
const clickCount = args.clickCount;
|
|
264
|
+
const delay = args.delay;
|
|
265
|
+
await this.pageController.click(selector, { button, clickCount, delay });
|
|
266
|
+
return {
|
|
267
|
+
content: [{
|
|
268
|
+
type: 'text',
|
|
269
|
+
text: JSON.stringify({
|
|
270
|
+
success: true,
|
|
271
|
+
message: `Clicked: ${selector}`,
|
|
272
|
+
}, null, 2),
|
|
273
|
+
}],
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
async handlePageType(args) {
|
|
277
|
+
const selector = args.selector;
|
|
278
|
+
const text = args.text;
|
|
279
|
+
const delay = args.delay;
|
|
280
|
+
await this.pageController.type(selector, text, { delay });
|
|
281
|
+
return {
|
|
282
|
+
content: [{
|
|
283
|
+
type: 'text',
|
|
284
|
+
text: JSON.stringify({
|
|
285
|
+
success: true,
|
|
286
|
+
message: `Typed into ${selector}`,
|
|
287
|
+
}, null, 2),
|
|
288
|
+
}],
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
async handlePageSelect(args) {
|
|
292
|
+
const selector = args.selector;
|
|
293
|
+
const values = args.values;
|
|
294
|
+
await this.pageController.select(selector, ...values);
|
|
295
|
+
return {
|
|
296
|
+
content: [{
|
|
297
|
+
type: 'text',
|
|
298
|
+
text: JSON.stringify({
|
|
299
|
+
success: true,
|
|
300
|
+
message: `Selected in ${selector}: ${values.join(', ')}`,
|
|
301
|
+
}, null, 2),
|
|
302
|
+
}],
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
async handlePageHover(args) {
|
|
306
|
+
const selector = args.selector;
|
|
307
|
+
await this.pageController.hover(selector);
|
|
308
|
+
return {
|
|
309
|
+
content: [{
|
|
310
|
+
type: 'text',
|
|
311
|
+
text: JSON.stringify({
|
|
312
|
+
success: true,
|
|
313
|
+
message: `Hovered: ${selector}`,
|
|
314
|
+
}, null, 2),
|
|
315
|
+
}],
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
async handlePageScroll(args) {
|
|
319
|
+
const x = args.x;
|
|
320
|
+
const y = args.y;
|
|
321
|
+
await this.pageController.scroll({ x, y });
|
|
322
|
+
return {
|
|
323
|
+
content: [{
|
|
324
|
+
type: 'text',
|
|
325
|
+
text: JSON.stringify({
|
|
326
|
+
success: true,
|
|
327
|
+
message: `Scrolled to: x=${x || 0}, y=${y || 0}`,
|
|
328
|
+
}, null, 2),
|
|
329
|
+
}],
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
async handlePageWaitForSelector(args) {
|
|
333
|
+
const selector = args.selector;
|
|
334
|
+
const timeout = args.timeout;
|
|
335
|
+
const result = await this.pageController.waitForSelector(selector, timeout);
|
|
336
|
+
return {
|
|
337
|
+
content: [{
|
|
338
|
+
type: 'text',
|
|
339
|
+
text: JSON.stringify(result, null, 2),
|
|
340
|
+
}],
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
async handlePageEvaluate(args) {
|
|
344
|
+
const code = args.code;
|
|
345
|
+
const autoSummarize = args.autoSummarize ?? true;
|
|
346
|
+
const maxSize = args.maxSize ?? 51200;
|
|
347
|
+
const result = await this.pageController.evaluate(code);
|
|
348
|
+
const processedResult = autoSummarize
|
|
349
|
+
? this.detailedDataManager.smartHandle(result, maxSize)
|
|
350
|
+
: result;
|
|
351
|
+
return {
|
|
352
|
+
content: [
|
|
353
|
+
{
|
|
354
|
+
type: 'text',
|
|
355
|
+
text: JSON.stringify({
|
|
356
|
+
success: true,
|
|
357
|
+
result: processedResult,
|
|
358
|
+
}, null, 2),
|
|
359
|
+
},
|
|
360
|
+
],
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
async handlePageScreenshot(args) {
|
|
364
|
+
const path = args.path;
|
|
365
|
+
const type = args.type;
|
|
366
|
+
const quality = args.quality;
|
|
367
|
+
const fullPage = args.fullPage;
|
|
368
|
+
const buffer = await this.pageController.screenshot({ path, type, quality, fullPage });
|
|
369
|
+
return {
|
|
370
|
+
content: [{
|
|
371
|
+
type: 'text',
|
|
372
|
+
text: JSON.stringify({
|
|
373
|
+
success: true,
|
|
374
|
+
message: `Screenshot taken${path ? `: ${path}` : ''}`,
|
|
375
|
+
size: buffer.length,
|
|
376
|
+
}, null, 2),
|
|
377
|
+
}],
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
async handleGetAllScripts(args) {
|
|
381
|
+
const includeSource = args.includeSource ?? false;
|
|
382
|
+
const scripts = await this.scriptManager.getAllScripts(includeSource);
|
|
383
|
+
return {
|
|
384
|
+
content: [{
|
|
385
|
+
type: 'text',
|
|
386
|
+
text: JSON.stringify({
|
|
387
|
+
count: scripts.length,
|
|
388
|
+
scripts,
|
|
389
|
+
}, null, 2),
|
|
390
|
+
}],
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
async handleGetScriptSource(args) {
|
|
394
|
+
const scriptId = args.scriptId;
|
|
395
|
+
const url = args.url;
|
|
396
|
+
const preview = args.preview ?? false;
|
|
397
|
+
const maxLines = args.maxLines ?? 100;
|
|
398
|
+
const startLine = args.startLine;
|
|
399
|
+
const endLine = args.endLine;
|
|
400
|
+
const script = await this.scriptManager.getScriptSource(scriptId, url);
|
|
401
|
+
if (!script) {
|
|
402
|
+
return {
|
|
403
|
+
content: [
|
|
404
|
+
{
|
|
405
|
+
type: 'text',
|
|
406
|
+
text: JSON.stringify({
|
|
407
|
+
success: false,
|
|
408
|
+
message: 'Script not found',
|
|
409
|
+
}, null, 2),
|
|
410
|
+
},
|
|
411
|
+
],
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
if (preview || startLine !== undefined || endLine !== undefined) {
|
|
415
|
+
const source = script.source || '';
|
|
416
|
+
const lines = source.split('\n');
|
|
417
|
+
const totalLines = lines.length;
|
|
418
|
+
const size = source.length;
|
|
419
|
+
let previewContent;
|
|
420
|
+
let actualStartLine;
|
|
421
|
+
let actualEndLine;
|
|
422
|
+
if (startLine !== undefined && endLine !== undefined) {
|
|
423
|
+
actualStartLine = Math.max(1, startLine);
|
|
424
|
+
actualEndLine = Math.min(totalLines, endLine);
|
|
425
|
+
previewContent = lines.slice(actualStartLine - 1, actualEndLine).join('\n');
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
actualStartLine = 1;
|
|
429
|
+
actualEndLine = Math.min(maxLines, totalLines);
|
|
430
|
+
previewContent = lines.slice(0, maxLines).join('\n');
|
|
431
|
+
}
|
|
432
|
+
const result = {
|
|
433
|
+
success: true,
|
|
434
|
+
scriptId: script.scriptId,
|
|
435
|
+
url: script.url,
|
|
436
|
+
preview: true,
|
|
437
|
+
totalLines,
|
|
438
|
+
size,
|
|
439
|
+
sizeKB: (size / 1024).toFixed(1) + 'KB',
|
|
440
|
+
showingLines: `${actualStartLine}-${actualEndLine}`,
|
|
441
|
+
content: previewContent,
|
|
442
|
+
hint: size > 51200
|
|
443
|
+
? `⚠️ Script is large (${(size / 1024).toFixed(1)}KB). Use startLine/endLine to get specific sections, or set preview=false to get full source (will return detailId).`
|
|
444
|
+
: 'Set preview=false to get full source',
|
|
445
|
+
};
|
|
446
|
+
return {
|
|
447
|
+
content: [
|
|
448
|
+
{
|
|
449
|
+
type: 'text',
|
|
450
|
+
text: JSON.stringify(result, null, 2),
|
|
451
|
+
},
|
|
452
|
+
],
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
const processedScript = this.detailedDataManager.smartHandle(script, 51200);
|
|
456
|
+
return {
|
|
457
|
+
content: [
|
|
458
|
+
{
|
|
459
|
+
type: 'text',
|
|
460
|
+
text: JSON.stringify(processedScript, null, 2),
|
|
461
|
+
},
|
|
462
|
+
],
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
async handleConsoleEnable(_args) {
|
|
466
|
+
await this.consoleMonitor.enable();
|
|
467
|
+
return {
|
|
468
|
+
content: [{
|
|
469
|
+
type: 'text',
|
|
470
|
+
text: JSON.stringify({
|
|
471
|
+
success: true,
|
|
472
|
+
message: 'Console monitoring enabled',
|
|
473
|
+
}, null, 2),
|
|
474
|
+
}],
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
async handleConsoleGetLogs(args) {
|
|
478
|
+
const type = args.type;
|
|
479
|
+
const limit = args.limit;
|
|
480
|
+
const since = args.since;
|
|
481
|
+
const logs = this.consoleMonitor.getLogs({ type, limit, since });
|
|
482
|
+
const result = {
|
|
483
|
+
count: logs.length,
|
|
484
|
+
logs,
|
|
485
|
+
};
|
|
486
|
+
const processedResult = this.detailedDataManager.smartHandle(result, 51200);
|
|
487
|
+
return {
|
|
488
|
+
content: [
|
|
489
|
+
{
|
|
490
|
+
type: 'text',
|
|
491
|
+
text: JSON.stringify(processedResult, null, 2),
|
|
492
|
+
},
|
|
493
|
+
],
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
async handleConsoleExecute(args) {
|
|
497
|
+
const expression = args.expression;
|
|
498
|
+
const result = await this.consoleMonitor.execute(expression);
|
|
499
|
+
return {
|
|
500
|
+
content: [{
|
|
501
|
+
type: 'text',
|
|
502
|
+
text: JSON.stringify({
|
|
503
|
+
success: true,
|
|
504
|
+
result,
|
|
505
|
+
}, null, 2),
|
|
506
|
+
}],
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
async handleDOMGetComputedStyle(args) {
|
|
510
|
+
const selector = args.selector;
|
|
511
|
+
const styles = await this.domInspector.getComputedStyle(selector);
|
|
512
|
+
return {
|
|
513
|
+
content: [{
|
|
514
|
+
type: 'text',
|
|
515
|
+
text: JSON.stringify({
|
|
516
|
+
selector,
|
|
517
|
+
styles,
|
|
518
|
+
}, null, 2),
|
|
519
|
+
}],
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
async handleDOMFindByText(args) {
|
|
523
|
+
const text = args.text;
|
|
524
|
+
const tag = args.tag;
|
|
525
|
+
const elements = await this.domInspector.findByText(text, tag);
|
|
526
|
+
return {
|
|
527
|
+
content: [{
|
|
528
|
+
type: 'text',
|
|
529
|
+
text: JSON.stringify({
|
|
530
|
+
count: elements.length,
|
|
531
|
+
elements,
|
|
532
|
+
}, null, 2),
|
|
533
|
+
}],
|
|
534
|
+
};
|
|
535
|
+
}
|
|
536
|
+
async handleDOMGetXPath(args) {
|
|
537
|
+
const selector = args.selector;
|
|
538
|
+
const xpath = await this.domInspector.getXPath(selector);
|
|
539
|
+
return {
|
|
540
|
+
content: [{
|
|
541
|
+
type: 'text',
|
|
542
|
+
text: JSON.stringify({
|
|
543
|
+
selector,
|
|
544
|
+
xpath,
|
|
545
|
+
}, null, 2),
|
|
546
|
+
}],
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
async handleDOMIsInViewport(args) {
|
|
550
|
+
const selector = args.selector;
|
|
551
|
+
const inViewport = await this.domInspector.isInViewport(selector);
|
|
552
|
+
return {
|
|
553
|
+
content: [{
|
|
554
|
+
type: 'text',
|
|
555
|
+
text: JSON.stringify({
|
|
556
|
+
selector,
|
|
557
|
+
inViewport,
|
|
558
|
+
}, null, 2),
|
|
559
|
+
}],
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
async handlePageGetPerformance(_args) {
|
|
563
|
+
const metrics = await this.pageController.getPerformanceMetrics();
|
|
564
|
+
return {
|
|
565
|
+
content: [{
|
|
566
|
+
type: 'text',
|
|
567
|
+
text: JSON.stringify({
|
|
568
|
+
success: true,
|
|
569
|
+
metrics,
|
|
570
|
+
}, null, 2),
|
|
571
|
+
}],
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
async handlePageInjectScript(args) {
|
|
575
|
+
const script = args.script;
|
|
576
|
+
await this.pageController.injectScript(script);
|
|
577
|
+
return {
|
|
578
|
+
content: [{
|
|
579
|
+
type: 'text',
|
|
580
|
+
text: JSON.stringify({
|
|
581
|
+
success: true,
|
|
582
|
+
message: 'Script injected',
|
|
583
|
+
}, null, 2),
|
|
584
|
+
}],
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
async handlePageSetCookies(args) {
|
|
588
|
+
const cookies = args.cookies;
|
|
589
|
+
await this.pageController.setCookies(cookies);
|
|
590
|
+
return {
|
|
591
|
+
content: [{
|
|
592
|
+
type: 'text',
|
|
593
|
+
text: JSON.stringify({
|
|
594
|
+
success: true,
|
|
595
|
+
message: `Set ${cookies.length} cookies`,
|
|
596
|
+
}, null, 2),
|
|
597
|
+
}],
|
|
598
|
+
};
|
|
599
|
+
}
|
|
600
|
+
async handlePageGetCookies(_args) {
|
|
601
|
+
const cookies = await this.pageController.getCookies();
|
|
602
|
+
return {
|
|
603
|
+
content: [{
|
|
604
|
+
type: 'text',
|
|
605
|
+
text: JSON.stringify({
|
|
606
|
+
count: cookies.length,
|
|
607
|
+
cookies,
|
|
608
|
+
}, null, 2),
|
|
609
|
+
}],
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
async handlePageClearCookies(_args) {
|
|
613
|
+
await this.pageController.clearCookies();
|
|
614
|
+
return {
|
|
615
|
+
content: [{
|
|
616
|
+
type: 'text',
|
|
617
|
+
text: JSON.stringify({
|
|
618
|
+
success: true,
|
|
619
|
+
message: 'Cookies cleared',
|
|
620
|
+
}, null, 2),
|
|
621
|
+
}],
|
|
622
|
+
};
|
|
623
|
+
}
|
|
624
|
+
async handlePageSetViewport(args) {
|
|
625
|
+
const width = args.width;
|
|
626
|
+
const height = args.height;
|
|
627
|
+
await this.pageController.setViewport(width, height);
|
|
628
|
+
return {
|
|
629
|
+
content: [{
|
|
630
|
+
type: 'text',
|
|
631
|
+
text: JSON.stringify({
|
|
632
|
+
success: true,
|
|
633
|
+
viewport: { width, height },
|
|
634
|
+
}, null, 2),
|
|
635
|
+
}],
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
async handlePageEmulateDevice(args) {
|
|
639
|
+
const device = args.device;
|
|
640
|
+
await this.pageController.emulateDevice(device);
|
|
641
|
+
return {
|
|
642
|
+
content: [{
|
|
643
|
+
type: 'text',
|
|
644
|
+
text: JSON.stringify({
|
|
645
|
+
success: true,
|
|
646
|
+
device,
|
|
647
|
+
}, null, 2),
|
|
648
|
+
}],
|
|
649
|
+
};
|
|
650
|
+
}
|
|
651
|
+
async handlePageGetLocalStorage(_args) {
|
|
652
|
+
const storage = await this.pageController.getLocalStorage();
|
|
653
|
+
return {
|
|
654
|
+
content: [{
|
|
655
|
+
type: 'text',
|
|
656
|
+
text: JSON.stringify({
|
|
657
|
+
count: Object.keys(storage).length,
|
|
658
|
+
storage,
|
|
659
|
+
}, null, 2),
|
|
660
|
+
}],
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
async handlePageSetLocalStorage(args) {
|
|
664
|
+
const key = args.key;
|
|
665
|
+
const value = args.value;
|
|
666
|
+
await this.pageController.setLocalStorage(key, value);
|
|
667
|
+
return {
|
|
668
|
+
content: [{
|
|
669
|
+
type: 'text',
|
|
670
|
+
text: JSON.stringify({
|
|
671
|
+
success: true,
|
|
672
|
+
key,
|
|
673
|
+
}, null, 2),
|
|
674
|
+
}],
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
async handlePagePressKey(args) {
|
|
678
|
+
const key = args.key;
|
|
679
|
+
await this.pageController.pressKey(key);
|
|
680
|
+
return {
|
|
681
|
+
content: [{
|
|
682
|
+
type: 'text',
|
|
683
|
+
text: JSON.stringify({
|
|
684
|
+
success: true,
|
|
685
|
+
key,
|
|
686
|
+
}, null, 2),
|
|
687
|
+
}],
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
async handlePageGetAllLinks(_args) {
|
|
691
|
+
const links = await this.pageController.getAllLinks();
|
|
692
|
+
return {
|
|
693
|
+
content: [{
|
|
694
|
+
type: 'text',
|
|
695
|
+
text: JSON.stringify({
|
|
696
|
+
count: links.length,
|
|
697
|
+
links,
|
|
698
|
+
}, null, 2),
|
|
699
|
+
}],
|
|
700
|
+
};
|
|
701
|
+
}
|
|
702
|
+
async handleCaptchaDetect(_args) {
|
|
703
|
+
const page = await this.pageController.getPage();
|
|
704
|
+
const result = await this.captchaDetector.detect(page);
|
|
705
|
+
return {
|
|
706
|
+
content: [{
|
|
707
|
+
type: 'text',
|
|
708
|
+
text: JSON.stringify({
|
|
709
|
+
success: true,
|
|
710
|
+
captcha_detected: result.detected,
|
|
711
|
+
captcha_info: result,
|
|
712
|
+
}, null, 2),
|
|
713
|
+
}],
|
|
714
|
+
};
|
|
715
|
+
}
|
|
716
|
+
async handleCaptchaWait(args) {
|
|
717
|
+
const timeout = args.timeout || this.captchaTimeout;
|
|
718
|
+
const page = await this.pageController.getPage();
|
|
719
|
+
logger.info('⏳ 等待用户完成验证码...');
|
|
720
|
+
const completed = await this.captchaDetector.waitForCompletion(page, timeout);
|
|
721
|
+
return {
|
|
722
|
+
content: [{
|
|
723
|
+
type: 'text',
|
|
724
|
+
text: JSON.stringify({
|
|
725
|
+
success: completed,
|
|
726
|
+
message: completed ? '✅ 验证码已完成' : '❌ 验证码完成超时',
|
|
727
|
+
}, null, 2),
|
|
728
|
+
}],
|
|
729
|
+
};
|
|
730
|
+
}
|
|
731
|
+
async handleCaptchaConfig(args) {
|
|
732
|
+
if (args.autoDetectCaptcha !== undefined) {
|
|
733
|
+
this.autoDetectCaptcha = args.autoDetectCaptcha;
|
|
734
|
+
}
|
|
735
|
+
if (args.autoSwitchHeadless !== undefined) {
|
|
736
|
+
this.autoSwitchHeadless = args.autoSwitchHeadless;
|
|
737
|
+
}
|
|
738
|
+
if (args.captchaTimeout !== undefined) {
|
|
739
|
+
this.captchaTimeout = args.captchaTimeout;
|
|
740
|
+
}
|
|
741
|
+
return {
|
|
742
|
+
content: [{
|
|
743
|
+
type: 'text',
|
|
744
|
+
text: JSON.stringify({
|
|
745
|
+
success: true,
|
|
746
|
+
config: {
|
|
747
|
+
autoDetectCaptcha: this.autoDetectCaptcha,
|
|
748
|
+
autoSwitchHeadless: this.autoSwitchHeadless,
|
|
749
|
+
captchaTimeout: this.captchaTimeout,
|
|
750
|
+
},
|
|
751
|
+
}, null, 2),
|
|
752
|
+
}],
|
|
753
|
+
};
|
|
754
|
+
}
|
|
755
|
+
async handleStealthInject(_args) {
|
|
756
|
+
const page = await this.pageController.getPage();
|
|
757
|
+
await StealthScripts2025.injectAll(page);
|
|
758
|
+
return {
|
|
759
|
+
content: [{
|
|
760
|
+
type: 'text',
|
|
761
|
+
text: JSON.stringify({
|
|
762
|
+
success: true,
|
|
763
|
+
message: '🛡️ 反检测脚本已注入',
|
|
764
|
+
}, null, 2),
|
|
765
|
+
}],
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
async handleStealthSetUserAgent(args) {
|
|
769
|
+
const platform = args.platform || 'windows';
|
|
770
|
+
const page = await this.pageController.getPage();
|
|
771
|
+
await StealthScripts2025.setRealisticUserAgent(page, platform);
|
|
772
|
+
return {
|
|
773
|
+
content: [{
|
|
774
|
+
type: 'text',
|
|
775
|
+
text: JSON.stringify({
|
|
776
|
+
success: true,
|
|
777
|
+
platform,
|
|
778
|
+
message: `User-Agent已设置为${platform}平台`,
|
|
779
|
+
}, null, 2),
|
|
780
|
+
}],
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
//# sourceMappingURL=BrowserToolHandlers.js.map
|