83 lines
2.3 KiB
JavaScript
83 lines
2.3 KiB
JavaScript
const puppeteer = require('puppeteer');
|
|
const path = require('path');
|
|
const fs = require('fs/promises');
|
|
const config = require('../config');
|
|
|
|
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:3000';
|
|
const SCREENSHOT_DIR = process.env.SCREENSHOT_DIR || '/tmp/screenshots';
|
|
fs.mkdir(SCREENSHOT_DIR, { recursive: true }).catch(console.error);
|
|
|
|
async function takeScreenshot(url, filename = `screenshot-${Date.now()}.png`, fullPage = true) {
|
|
let browser;
|
|
|
|
const response = await axios.post(
|
|
`${BACKEND_URL}/api/auth/signin/local`,
|
|
{ email: config.admin_email, password: config.admin_pass },
|
|
{
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
}
|
|
);
|
|
|
|
const token = response.data;
|
|
|
|
const outputPath = path.join(SCREENSHOT_DIR, filename);
|
|
|
|
try {
|
|
browser = await puppeteer.launch({
|
|
headless: true,
|
|
args: [
|
|
'--no-sandbox',
|
|
'--disable-setuid-sandbox',
|
|
'--disable-dev-shm-usage',
|
|
'--disable-accelerated-2d-canvas',
|
|
'--disable-gpu',
|
|
'window-size=1920,1080'
|
|
]
|
|
});
|
|
const page = await browser.newPage();
|
|
|
|
await page.setViewport({ width: 1920, height: 1080 });
|
|
|
|
if (token) {
|
|
await page.setRequestInterception(true);
|
|
|
|
page.on('request', interceptedRequest => {
|
|
if (interceptedRequest.isInterceptResolutionHandled()) {
|
|
return;
|
|
}
|
|
|
|
const headers = interceptedRequest.headers();
|
|
if (!headers['authorization'] && !headers['Authorization']) {
|
|
headers['Authorization'] = `Bearer ${token}`;
|
|
}
|
|
|
|
interceptedRequest.continue({ headers });
|
|
});
|
|
|
|
page.on('requestfailed', request => {
|
|
console.error(`[ScreenshotService]: Request failed: ${request.url()} - ${request.failure().errorText}`);
|
|
});
|
|
}
|
|
|
|
await page.goto(url, { waitUntil: 'load', timeout: 60000 });
|
|
|
|
await page.screenshot({
|
|
path: outputPath,
|
|
fullPage: true,
|
|
});
|
|
|
|
console.log(`[ScreenshotService]: Screenshot saved to ${outputPath}`);
|
|
return outputPath;
|
|
} catch (error) {
|
|
console.error(`[ScreenshotService]: Error taking screenshot: ${error.message}`);
|
|
throw error;
|
|
} finally {
|
|
if (browser) {
|
|
await browser.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = { takeScreenshot }; |