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 }); } });