+1

Hướng dẫn chi tiết thiết lập API chụp ảnh màn hình Puppeteer trên Ubuntu

Hướng dẫn này bao gồm thiết lập ứng dụng Node.js bằng Puppeteer, ứng dụng này sẽ hoạt động như một API để chụp ảnh màn hình. Hãy cùng theo dõi nhé:

1. Cập nhật và nâng cấp hệ thống

Đầu tiên, hãy cập nhật và nâng cấp hệ thống của bạn để đảm bảo tất cả các gói đều được cập nhật.

sudo apt update && sudo apt upgrade -y

2. Cài đặt Node.js và NPM

Bạn sẽ cần Node.js và npm để chạy Puppeteer. Cài đặt chúng bằng kho lưu trữ Node.js chính thức.

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

Xác minh cài đặt:

node -v
npm -v

3. Tạo một thư mục dự án

Tạo thư mục cho dự án Puppeteer của bạn.

mkdir puppeteer-screenshot-api
cd puppeteer-screenshot-api

4. Khởi tạo một dự án Node.js

Khởi tạo một dự án Node.js mới.

npm init -y

Thao tác này sẽ tạo một tệp package.json có các giá trị mặc định.

5. Cài đặt các phụ thuộc cần thiết

Cài đặt các phần phụ thuộc cần thiết cho Puppeteer và Express để thiết lập API.

npm install express puppeteer

6. Viết API Ảnh chụp màn hình Puppeteer

Tạo một tệp có tên index.js trong thư mục dự án của bạn và thêm đoạn mã sau:

const express = require('express');
const puppeteer = require('puppeteer');
const app = express();
const port = 3000;

// Screenshot endpoint
app.get('/screenshot', async (req, res) => {
    const { url } = req.query;

    if (!url) {
        return res.status(400).send('Please provide a URL');
    }

    try {
        const browser = await puppeteer.launch({
            args: ['--no-sandbox', '--disable-setuid-sandbox']  // Necessary for running Puppeteer on Ubuntu
        });
        const page = await browser.newPage();
        await page.goto(url, { waitUntil: 'networkidle2' });
        const screenshot = await page.screenshot({ fullPage: true });

        await browser.close();

        // Set content type and send screenshot
        res.setHeader('Content-Type', 'image/png');
        res.send(screenshot);
    } catch (error) {
        console.error(error);
        res.status(500).send('Error capturing screenshot');
    }
});

app.listen(port, () => {
    console.log(`Puppeteer Screenshot API is running on http://localhost:${port}`);
});

7. Chạy Puppeteer API

Chạy máy chủ bằng Node.js:

node index.js

Máy chủ hiện đang chạy trên http://localhost:3000. Bạn có thể kiểm tra bằng cách truy cập URL sau trong trình duyệt của bạn:

http://localhost:3000/screenshot?url=https://example.com

Nó sẽ trả về ảnh chụp màn hình PNG của URL được cung cấp.

8. Cài đặt các phụ thuộc của Puppeteer

Đôi khi Puppeteer yêu cầu các phụ thuộc bổ sung cho Ubuntu. Cài đặt chúng bằng cách chạy:

sudo apt install -y libxshmfence1 libasound2 libgbm-dev libgtk-3-0 libnss3 libxss1 libxtst6 xdg-utils

9. Chạy Puppeteer như một dịch vụ nền

Nếu bạn muốn API Puppeteer chạy ở chế độ nền và tự động khởi động sau khi khởi động lại, bạn có thể thiết lập nó như một dịch vụ systemd.

Đầu tiên, hãy tạo tệp dịch vụ cho API Puppeteer của bạn.

   sudo nano /etc/systemd/system/puppeteer-screenshot.service

Tiếp theo, thêm nội dung này vào tệp:

[Unit]
   Description=Puppeteer Screenshot API
   After=network.target

   [Service]
   ExecStart=/usr/bin/node /path/to/your/puppeteer-screenshot-api/index.js
   Restart=on-failure
   User=your-username
   Environment=NODE_ENV=production

   [Install]
   WantedBy=multi-user.target

Thay thế /path/to/your/puppeteer-screenshot-api/index.js bằng đường dẫn thực tế của dự án của bạn.

Kế đến, hãy kích hoạt và khởi động dịch vụ:

sudo systemctl enable puppeteer-screenshot
   sudo systemctl start puppeteer-screenshot

Cuối cùng, hãy kiểm tra lại trạng thái:

   sudo systemctl status puppeteer-screenshot

10. Kiểm tra API

Bây giờ bạn có thể gửi yêu cầu đến máy chủ của mình để chụp ảnh màn hình.

curl "http://localhost:3000/screenshot?url=https://example.com" --output example.png

Thao tác này sẽ lưu ảnh chụp màn hình dưới dạng example.png.

Hy vọng các bạn thấy mẹo vặt trong bài viết này hữu ích.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.