-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrecon.js
More file actions
93 lines (75 loc) · 3.05 KB
/
recon.js
File metadata and controls
93 lines (75 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
const { chromium } = require('playwright');
const readline = require('readline');
const ProjectManager = require('./lib/ProjectManager');
const NetworkAnalyzer = require('./lib/NetworkAnalyzer');
const DOMRecorder = require('./lib/DOMRecorder');
const JSAnalyzer = require('./lib/JSAnalyzer');
const StorageCapture = require('./lib/StorageCapture');
const ConsoleMonitor = require('./lib/ConsoleMonitor');
const ScreenshotManager = require('./lib/ScreenshotManager');
const ReplayGenerator = require('./lib/ReplayGenerator');
const FlowGraphGenerator = require('./lib/FlowGraphGenerator');
const ReportGenerator = require('./lib/ReportGenerator');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const question = (query) => new Promise(resolve => rl.question(query, resolve));
async function run() {
console.log('--- Web Recon Automation Toolkit ---');
const projectName = await question('Enter project folder name: ');
if (!projectName) {
console.error('Project name is required.');
process.exit(1);
}
const pm = new ProjectManager(projectName);
await pm.init();
console.log('Launching browser (Headful mode)...');
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({
recordHar: { path: pm.getPath('har/network.har') }
});
const page = await context.newPage();
// Initialize Analyzers
const net = new NetworkAnalyzer(pm);
const dom = new DOMRecorder(pm);
const js = new JSAnalyzer(pm);
const storage = new StorageCapture(pm);
const consoleMon = new ConsoleMonitor(pm);
const screens = new ScreenshotManager(pm);
await net.setup(page);
await dom.setup(page);
await js.setup(page);
await storage.setup(page, context);
await consoleMon.setup(page);
await screens.setup(page);
console.log('\n--- RECORDING STARTED ---');
console.log('1. Manually navigate and interact with the site.');
console.log('2. Close the browser or press Ctrl+C in terminal when finished.\n');
const gracefulShutdown = async () => {
console.log('\n--- FINALIZING ANALYSIS ---');
// Final capture
await storage.capture();
screens.stop();
// Generate Reports
console.log('Generating replay scripts...');
const replay = new ReplayGenerator(pm);
await replay.generate();
console.log('Building flow graphs...');
const flow = new FlowGraphGenerator(pm);
const mermaid = await flow.generate();
console.log('Creating automation blueprint...');
const report = new ReportGenerator(pm);
await report.generate(mermaid);
await browser.close();
console.log(`\nAnalysis Complete! Files saved in: projects/${projectName}/\n`);
process.exit(0);
};
// Listen for browser close or terminal exit
page.on('close', gracefulShutdown);
process.on('SIGINT', gracefulShutdown);
}
run().catch(err => {
console.error('Fatal Error:', err);
process.exit(1);
});