Compare commits
5 Commits
contributo
...
contributo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a78fc70bc7 | ||
|
|
20d08290af | ||
|
|
90883843e6 | ||
|
|
eb63741e04 | ||
|
|
bbf519e110 |
60
.github/README.md
vendored
60
.github/README.md
vendored
@@ -1014,6 +1014,13 @@ Credit to the following users for contributing to Web-Check
|
|||||||
<sub><b>Ulises Gascón</b></sub>
|
<sub><b>Ulises Gascón</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
<td align="center">
|
||||||
|
<a href="https://github.com/CrazyWolf13">
|
||||||
|
<img src="https://avatars.githubusercontent.com/u/96661824?v=4" width="80;" alt="CrazyWolf13"/>
|
||||||
|
<br />
|
||||||
|
<sub><b>Tobias</b></sub>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/PhiRequiem">
|
<a href="https://github.com/PhiRequiem">
|
||||||
<img src="https://avatars.githubusercontent.com/u/1323576?v=4" width="80;" alt="PhiRequiem"/>
|
<img src="https://avatars.githubusercontent.com/u/1323576?v=4" width="80;" alt="PhiRequiem"/>
|
||||||
@@ -1022,12 +1029,14 @@ Credit to the following users for contributing to Web-Check
|
|||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/34bits">
|
<a href="https://github.com/ntaiko">
|
||||||
<img src="https://avatars.githubusercontent.com/u/108784453?v=4" width="80;" alt="34bits"/>
|
<img src="https://avatars.githubusercontent.com/u/108784453?v=4" width="80;" alt="ntaiko"/>
|
||||||
<br />
|
<br />
|
||||||
<sub><b>Nikolaos G. Ntaiko</b></sub>
|
<sub><b>Nikolaos G. Ntaiko</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/Myzel394">
|
<a href="https://github.com/Myzel394">
|
||||||
<img src="https://avatars.githubusercontent.com/u/50424412?v=4" width="80;" alt="Myzel394"/>
|
<img src="https://avatars.githubusercontent.com/u/50424412?v=4" width="80;" alt="Myzel394"/>
|
||||||
@@ -1035,8 +1044,6 @@ Credit to the following users for contributing to Web-Check
|
|||||||
<sub><b>Myzel394</b></sub>
|
<sub><b>Myzel394</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/murrple-1">
|
<a href="https://github.com/murrple-1">
|
||||||
<img src="https://avatars.githubusercontent.com/u/5559656?v=4" width="80;" alt="murrple-1"/>
|
<img src="https://avatars.githubusercontent.com/u/5559656?v=4" width="80;" alt="murrple-1"/>
|
||||||
@@ -1072,6 +1079,8 @@ Credit to the following users for contributing to Web-Check
|
|||||||
<sub><b>Gertje823</b></sub>
|
<sub><b>Gertje823</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/epreston">
|
<a href="https://github.com/epreston">
|
||||||
<img src="https://avatars.githubusercontent.com/u/347224?v=4" width="80;" alt="epreston"/>
|
<img src="https://avatars.githubusercontent.com/u/347224?v=4" width="80;" alt="epreston"/>
|
||||||
@@ -1079,8 +1088,6 @@ Credit to the following users for contributing to Web-Check
|
|||||||
<sub><b>Ed Preston</b></sub>
|
<sub><b>Ed Preston</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/dimitri-kandassamy">
|
<a href="https://github.com/dimitri-kandassamy">
|
||||||
<img src="https://avatars.githubusercontent.com/u/21193806?v=4" width="80;" alt="dimitri-kandassamy"/>
|
<img src="https://avatars.githubusercontent.com/u/21193806?v=4" width="80;" alt="dimitri-kandassamy"/>
|
||||||
@@ -1110,7 +1117,7 @@ Huge thanks to these wonderful people, who sponsor me on GitHub, their support h
|
|||||||
<tr>
|
<tr>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/vincentkoc">
|
<a href="https://github.com/vincentkoc">
|
||||||
<img src="https://avatars.githubusercontent.com/u/25068?v=4" width="80;" alt="vincentkoc"/>
|
<img src="https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4" width="80;" alt="vincentkoc"/>
|
||||||
<br />
|
<br />
|
||||||
<sub><b>Vincent Koc</b></sub>
|
<sub><b>Vincent Koc</b></sub>
|
||||||
</a>
|
</a>
|
||||||
@@ -1173,6 +1180,13 @@ Huge thanks to these wonderful people, who sponsor me on GitHub, their support h
|
|||||||
<sub><b>Brian McGonagill</b></sub>
|
<sub><b>Brian McGonagill</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
<td align="center">
|
||||||
|
<a href="https://github.com/arcestia">
|
||||||
|
<img src="https://avatars.githubusercontent.com/u/7936962?u=41e34bb816ad09323e1650f3efc0bec4fb2bc5dd&v=4" width="80;" alt="arcestia"/>
|
||||||
|
<br />
|
||||||
|
<sub><b>Laurensius Jeffrey</b></sub>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/vlad-tim">
|
<a href="https://github.com/vlad-tim">
|
||||||
<img src="https://avatars.githubusercontent.com/u/11474041?u=eee43705b54d2ec9f51fc4fcce5ad18dd17c87e4&v=4" width="80;" alt="vlad-tim"/>
|
<img src="https://avatars.githubusercontent.com/u/11474041?u=eee43705b54d2ec9f51fc4fcce5ad18dd17c87e4&v=4" width="80;" alt="vlad-tim"/>
|
||||||
@@ -1186,23 +1200,9 @@ Huge thanks to these wonderful people, who sponsor me on GitHub, their support h
|
|||||||
<br />
|
<br />
|
||||||
<sub><b>HeliXZz</b></sub>
|
<sub><b>HeliXZz</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/patvdv">
|
|
||||||
<img src="https://avatars.githubusercontent.com/u/12430107?u=e8911c2fb91af4d30432f76da8c40927b2830bd7&v=4" width="80;" alt="patvdv"/>
|
|
||||||
<br />
|
|
||||||
<sub><b>Patrick Van Der Veken</b></sub>
|
|
||||||
</a>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/MioOgbeni">
|
|
||||||
<img src="https://avatars.githubusercontent.com/u/24291977?v=4" width="80;" alt="MioOgbeni"/>
|
|
||||||
<br />
|
|
||||||
<sub><b>Tomáš Novák</b></sub>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/mryesiller">
|
<a href="https://github.com/mryesiller">
|
||||||
<img src="https://avatars.githubusercontent.com/u/24632172?u=0d20f2d615158f87cd60a3398d3efb026c32f291&v=4" width="80;" alt="mryesiller"/>
|
<img src="https://avatars.githubusercontent.com/u/24632172?u=0d20f2d615158f87cd60a3398d3efb026c32f291&v=4" width="80;" alt="mryesiller"/>
|
||||||
@@ -1217,13 +1217,6 @@ Huge thanks to these wonderful people, who sponsor me on GitHub, their support h
|
|||||||
<sub><b>Shiverme Timbers</b></sub>
|
<sub><b>Shiverme Timbers</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/forwardemail">
|
|
||||||
<img src="https://avatars.githubusercontent.com/u/32481436?v=4" width="80;" alt="forwardemail"/>
|
|
||||||
<br />
|
|
||||||
<sub><b>Forward Email - Open-source & Privacy-focused Email Service (2023)</b></sub>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/getumbrel">
|
<a href="https://github.com/getumbrel">
|
||||||
<img src="https://avatars.githubusercontent.com/u/59408891?v=4" width="80;" alt="getumbrel"/>
|
<img src="https://avatars.githubusercontent.com/u/59408891?v=4" width="80;" alt="getumbrel"/>
|
||||||
@@ -1238,8 +1231,6 @@ Huge thanks to these wonderful people, who sponsor me on GitHub, their support h
|
|||||||
<sub><b>HamburgerJung</b></sub>
|
<sub><b>HamburgerJung</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/frankdez93">
|
<a href="https://github.com/frankdez93">
|
||||||
<img src="https://avatars.githubusercontent.com/u/87549420?v=4" width="80;" alt="frankdez93"/>
|
<img src="https://avatars.githubusercontent.com/u/87549420?v=4" width="80;" alt="frankdez93"/>
|
||||||
@@ -1254,6 +1245,8 @@ Huge thanks to these wonderful people, who sponsor me on GitHub, their support h
|
|||||||
<sub><b>Terminal Trove</b></sub>
|
<sub><b>Terminal Trove</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/st617">
|
<a href="https://github.com/st617">
|
||||||
<img src="https://avatars.githubusercontent.com/u/128325650?v=4" width="80;" alt="st617"/>
|
<img src="https://avatars.githubusercontent.com/u/128325650?v=4" width="80;" alt="st617"/>
|
||||||
@@ -1261,13 +1254,6 @@ Huge thanks to these wonderful people, who sponsor me on GitHub, their support h
|
|||||||
<sub><b>st617</b></sub>
|
<sub><b>st617</b></sub>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td align="center">
|
|
||||||
<a href="https://github.com/nrvo">
|
|
||||||
<img src="https://avatars.githubusercontent.com/u/151435968?u=e1dcb307fd0efdc45cddbe9490a7b956e4da6835&v=4" width="80;" alt="nrvo"/>
|
|
||||||
<br />
|
|
||||||
<sub><b>Nrvo</b></sub>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a href="https://github.com/hudsonrock-partnerships">
|
<a href="https://github.com/hudsonrock-partnerships">
|
||||||
<img src="https://avatars.githubusercontent.com/u/163282900?u=5f2667f7fe5d284ac7a2da6b0800ea8970b0fcbf&v=4" width="80;" alt="hudsonrock-partnerships"/>
|
<img src="https://avatars.githubusercontent.com/u/163282900?u=5f2667f7fe5d284ac7a2da6b0800ea8970b0fcbf&v=4" width="80;" alt="hudsonrock-partnerships"/>
|
||||||
|
|||||||
@@ -1,40 +1,111 @@
|
|||||||
import puppeteer from 'puppeteer-core';
|
import puppeteer from 'puppeteer-core';
|
||||||
import chromium from 'chrome-aws-lambda';
|
import chromium from 'chrome-aws-lambda';
|
||||||
import middleware from './_common/middleware.js';
|
import middleware from './_common/middleware.js';
|
||||||
|
import { exec } from 'child_process';
|
||||||
|
import { promises as fs } from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
import pkg from 'uuid';
|
||||||
|
const { v4: uuidv4 } = pkg;
|
||||||
|
|
||||||
|
// Helper function for direct chromium screenshot as fallback
|
||||||
|
const directChromiumScreenshot = async (url) => {
|
||||||
|
console.log(`[DIRECT-SCREENSHOT] Starting direct screenshot process for URL: ${url}`);
|
||||||
|
|
||||||
|
// Create a tmp filename
|
||||||
|
const tmpDir = '/tmp';
|
||||||
|
const uuid = uuidv4();
|
||||||
|
const screenshotPath = path.join(tmpDir, `screenshot-${uuid}.png`);
|
||||||
|
|
||||||
|
console.log(`[DIRECT-SCREENSHOT] Will save screenshot to: ${screenshotPath}`);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const chromePath = process.env.CHROME_PATH || '/usr/bin/chromium';
|
||||||
|
const command = `${chromePath} --headless --disable-gpu --no-sandbox --screenshot=${screenshotPath} "${url}"`;
|
||||||
|
|
||||||
|
console.log(`[DIRECT-SCREENSHOT] Executing command: ${command}`);
|
||||||
|
|
||||||
|
exec(command, async (error, stdout, stderr) => {
|
||||||
|
if (error) {
|
||||||
|
console.error(`[DIRECT-SCREENSHOT] Error executing Chromium: ${error.message}`);
|
||||||
|
return reject(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Read screenshot
|
||||||
|
const screenshotData = await fs.readFile(screenshotPath);
|
||||||
|
console.log(`[DIRECT-SCREENSHOT] Read ${screenshotData.length} bytes from screenshot file`);
|
||||||
|
|
||||||
|
// Convert base64
|
||||||
|
const base64Data = screenshotData.toString('base64');
|
||||||
|
|
||||||
|
// Clean
|
||||||
|
await fs.unlink(screenshotPath).catch(err =>
|
||||||
|
console.warn(`[DIRECT-SCREENSHOT] Failed to delete temp file: ${err.message}`)
|
||||||
|
);
|
||||||
|
|
||||||
|
resolve(base64Data);
|
||||||
|
} catch (readError) {
|
||||||
|
console.error(`[DIRECT-SCREENSHOT] Error reading screenshot: ${readError.message}`);
|
||||||
|
reject(readError);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const screenshotHandler = async (targetUrl) => {
|
const screenshotHandler = async (targetUrl) => {
|
||||||
|
console.log(`[SCREENSHOT] Request received for URL: ${targetUrl}`);
|
||||||
|
|
||||||
if (!targetUrl) {
|
if (!targetUrl) {
|
||||||
|
console.error('[SCREENSHOT] URL is missing from queryStringParameters');
|
||||||
throw new Error('URL is missing from queryStringParameters');
|
throw new Error('URL is missing from queryStringParameters');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {
|
if (!targetUrl.startsWith('http://') && !targetUrl.startsWith('https://')) {
|
||||||
targetUrl = 'http://' + targetUrl;
|
targetUrl = 'http://' + targetUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
new URL(targetUrl);
|
new URL(targetUrl);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
console.error(`[SCREENSHOT] URL provided is invalid: ${targetUrl}`);
|
||||||
throw new Error('URL provided is invalid');
|
throw new Error('URL provided is invalid');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// First try direct Chromium
|
||||||
|
try {
|
||||||
|
console.log(`[SCREENSHOT] Using direct Chromium method for URL: ${targetUrl}`);
|
||||||
|
const base64Screenshot = await directChromiumScreenshot(targetUrl);
|
||||||
|
console.log(`[SCREENSHOT] Direct screenshot successful`);
|
||||||
|
return { image: base64Screenshot };
|
||||||
|
} catch (directError) {
|
||||||
|
console.error(`[SCREENSHOT] Direct screenshot method failed: ${directError.message}`);
|
||||||
|
console.log(`[SCREENSHOT] Falling back to puppeteer method...`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// fall back puppeteer
|
||||||
let browser = null;
|
let browser = null;
|
||||||
try {
|
try {
|
||||||
browser = await puppeteer.launch({
|
console.log(`[SCREENSHOT] Launching puppeteer browser`);
|
||||||
|
browser = await puppeteer.launch({
|
||||||
args: [...chromium.args, '--no-sandbox'], // Add --no-sandbox flag
|
args: [...chromium.args, '--no-sandbox'], // Add --no-sandbox flag
|
||||||
defaultViewport: { width: 800, height: 600 },
|
defaultViewport: { width: 800, height: 600 },
|
||||||
executablePath: process.env.CHROME_PATH || await chromium.executablePath,
|
executablePath: process.env.CHROME_PATH || '/usr/bin/chromium',
|
||||||
headless: chromium.headless,
|
headless: true,
|
||||||
ignoreHTTPSErrors: true,
|
ignoreHTTPSErrors: true,
|
||||||
ignoreDefaultArgs: ['--disable-extensions'],
|
ignoreDefaultArgs: ['--disable-extensions'],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log(`[SCREENSHOT] Creating new page`);
|
||||||
let page = await browser.newPage();
|
let page = await browser.newPage();
|
||||||
|
|
||||||
|
console.log(`[SCREENSHOT] Setting page preferences`);
|
||||||
await page.emulateMediaFeatures([{ name: 'prefers-color-scheme', value: 'dark' }]);
|
await page.emulateMediaFeatures([{ name: 'prefers-color-scheme', value: 'dark' }]);
|
||||||
page.setDefaultNavigationTimeout(8000);
|
page.setDefaultNavigationTimeout(8000);
|
||||||
|
|
||||||
|
console.log(`[SCREENSHOT] Navigating to URL: ${targetUrl}`);
|
||||||
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
|
await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
|
||||||
|
|
||||||
|
console.log(`[SCREENSHOT] Checking if body element exists`);
|
||||||
await page.evaluate(() => {
|
await page.evaluate(() => {
|
||||||
const selector = 'body';
|
const selector = 'body';
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@@ -45,14 +116,21 @@ const screenshotHandler = async (targetUrl) => {
|
|||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log(`[SCREENSHOT] Taking screenshot`);
|
||||||
const screenshotBuffer = await page.screenshot();
|
const screenshotBuffer = await page.screenshot();
|
||||||
|
|
||||||
|
console.log(`[SCREENSHOT] Converting screenshot to base64`);
|
||||||
const base64Screenshot = screenshotBuffer.toString('base64');
|
const base64Screenshot = screenshotBuffer.toString('base64');
|
||||||
|
|
||||||
|
console.log(`[SCREENSHOT] Screenshot complete, returning image`);
|
||||||
return { image: base64Screenshot };
|
return { image: base64Screenshot };
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`[SCREENSHOT] Puppeteer screenshot failed: ${error.message}`);
|
||||||
|
throw error;
|
||||||
} finally {
|
} finally {
|
||||||
if (browser !== null) {
|
if (browser !== null) {
|
||||||
|
console.log(`[SCREENSHOT] Closing browser`);
|
||||||
await browser.close();
|
await browser.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user