Spaces:
Runtime error
Runtime error
import { Puppeteer } from "https://deno.land/x/[email protected]/mod.ts"; | |
let browser: any; | |
const initBrowser = async () => { | |
const puppeteer = new Puppeteer({ | |
browserPath: '/app/chrome/chrome-linux64/chrome', | |
}); | |
browser = await puppeteer.launch({ | |
headless: true, | |
args: [ | |
"--no-sandbox", | |
"--disable-setuid-sandbox" | |
] | |
}); | |
}; | |
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 }); | |
} | |
}); |