|
import puppeteer from "puppeteer";
|
|
|
|
let browser: puppeteer.Browser;
|
|
|
|
const initBrowser = async () => {
|
|
browser = await puppeteer.launch({
|
|
headless: true,
|
|
args: [
|
|
"--no-sandbox",
|
|
"--disable-setuid-sandbox"
|
|
],
|
|
executablePath: '/app/chrome/chrome-linux64/chrome'
|
|
});
|
|
};
|
|
|
|
initBrowser();
|
|
|
|
Deno.serve({ port: 7860 }, async (req: Request) => {
|
|
const url = new URL(req.url);
|
|
const pathname = url.pathname;
|
|
const searchParams = url.searchParams;
|
|
|
|
if (pathname === "/screenshot" && req.method === "GET") {
|
|
const targetUrl = searchParams.get("url");
|
|
if (!targetUrl) {
|
|
return new Response("Missing url parameter", { status: 400 });
|
|
}
|
|
|
|
let page;
|
|
try {
|
|
if (!browser) {
|
|
await initBrowser();
|
|
}
|
|
|
|
page = await browser.newPage();
|
|
await page.setViewport({ width: 1920, height: 1080 });
|
|
|
|
await page.goto(targetUrl, {
|
|
waitUntil: 'networkidle0',
|
|
timeout: 30000
|
|
});
|
|
|
|
const screenshotBuffer = await page.screenshot();
|
|
|
|
if (page) {
|
|
await page.close();
|
|
}
|
|
|
|
return new Response(screenshotBuffer, {
|
|
headers: { "Content-Type": "image/png" },
|
|
status: 200,
|
|
});
|
|
} catch (error) {
|
|
console.error("Error taking screenshot:", error);
|
|
if (page) {
|
|
try {
|
|
await page.close();
|
|
} catch (e) {
|
|
|
|
}
|
|
}
|
|
return new Response("Error taking screenshot", { status: 500 });
|
|
}
|
|
} else if (pathname === "/") {
|
|
const htmlFilePath = "/app/index.html";
|
|
const htmlContent = await Deno.readTextFile(htmlFilePath);
|
|
return new Response(htmlContent, {
|
|
headers: { "Content-Type": "text/html" },
|
|
status: 200,
|
|
});
|
|
} else {
|
|
return new Response("Not Found", { status: 404 });
|
|
}
|
|
}); |