1const { Actor } = require('apify');
2const puppeteer = require('puppeteer');
3const express = require('express');
4const bodyParser = require('body-parser');
5
6Actor.main(async () => {
7 const {
8 ACTOR_WEB_SERVER_PORT,
9 ACTOR_WEB_SERVER_URL,
10 ACTOR_DEFAULT_KEY_VALUE_STORE_ID,
11 } = process.env;
12
13 const app = express();
14 app.use(bodyParser.json());
15 app.use(bodyParser.urlencoded({ extended: true }));
16
17 const processedUrls = [];
18
19 app.get('/', (req, res) => {
20 const listItems = processedUrls.map((url, index) => {
21 const imageUrl = `https://api.apify.com/v2/key-value-stores/${ACTOR_DEFAULT_KEY_VALUE_STORE_ID}/records/${index}.jpg`;
22 return `<li><a href="${imageUrl}" target="_blank"><img src="${imageUrl}" width="300px" /><br />${url}</a></li>`;
23 }).join('');
24
25 res.send(`
26<html>
27 <head><title>Web Server Example</title></head>
28 <body>
29 <form method="POST" action="${ACTOR_WEB_SERVER_URL}/add-url">
30 URL: <input type="text" name="url" placeholder="https://example.com" />
31 <input type="submit" value="Screenshot" />
32 </form>
33 <ul>${listItems}</ul>
34 </body>
35</html>`);
36 });
37
38 app.post('/add-url', async (req, res) => {
39 const { url } = req.body;
40 console.log(`Taking screenshot of: ${url}`);
41
42 const browser = await puppeteer.launch({
43 executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/google-chrome-stable',
44 args: ['--no-sandbox', '--disable-dev-shm-usage'],
45 });
46 const page = await browser.newPage();
47 await page.goto(url);
48 const screenshot = await page.screenshot({ type: 'jpeg' });
49 await browser.close();
50
51 await Actor.setValue(`${processedUrls.length}.jpg`, screenshot, { contentType: 'image/jpeg' });
52 processedUrls.push(url);
53
54 res.redirect('/');
55 });
56
57 await new Promise((resolve) => {
58 app.listen(ACTOR_WEB_SERVER_PORT, () => {
59 console.log(`Server running at ${ACTOR_WEB_SERVER_URL}`);
60 resolve();
61 });
62 });
63
64
65 await new Promise(() => {});
66});