docker / main.js
jljiu's picture
Update main.js
d24869c verified
const http = require('http');
const puppeteer = require('puppeteer');
const urlModule = require('url');
// 用于存储浏览器实例,避免每次请求都重新启动浏览器
let browser;
const initBrowser = async () => {
browser = await puppeteer.launch({
headless: true,
args: ["--no-sandbox"],
executablePath: '/app/chrome/chrome-linux64/chrome'
});
};
initBrowser();
let number = 0
const server = http.createServer(async (req, res) => {
const parsedUrl = urlModule.parse(req.url, true); // 第二个参数为true表示解析查询参数
const pathname = parsedUrl.pathname;
console.log(pathname)
const query = parsedUrl.query;
console.log(query)
if (pathname === '/screenshot' && req.method.toUpperCase() === 'GET') {
console.log(number)
const targetUrl = query.url;
console.log(targetUrl)
if (!targetUrl) {
res.statusCode = 400;
res.end('Missing url parameter');
return;
}
try {
if (!browser) {
await initBrowser();
}
try {
const page = await browser.newPage();
// 这里确保传入完整协议的网址,比如 http:// 或 https:// 开头的
await page.goto(targetUrl);
const screenshotBuffer = await page.screenshot();
await page.close();
res.statusCode = 200;
number++
res.setHeader('Content-Type', 'image/png');
res.end(screenshotBuffer);
} catch (pageError) {
console.error('Error accessing page:', pageError);
await browser.close();
res.statusCode = 500;
res.end('Error accessing page');
}
} catch (launchError) {
console.error('Error launching browser:', launchError);
res.statusCode = 500;
res.end('Error launching browser');
}
} else {
res.statusCode = 404;
res.end('Not Found');
}
});
const port = process.env.PORT || 7860;
server.listen(port, () => {
console.log(`Server running on port ${port}`);
});