const puppeteer = require('puppeteer');
const { KnownDevices } = require('puppeteer');
const fs = require('fs');
const path = require('path');
const { PDFDocument } = require('pdf-lib');
const { readFile } = require('fs/promises');
function delay(time) {
return new Promise(function(resolve) {
setTimeout(resolve, time)
});
}
async function takeScreenshots(url) {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
// Устанавливаем мобильный User-Agent и разрешение экрана для iPhone 15 Pro
const iPhone = KnownDevices['iPhone 15 Pro'];
await page.emulate(iPhone);
await page.goto(url);
await delay(5000); // Ждем 5 секунд, чтобы страница полностью загрузилась
// Получаем общее количество страниц
const numPages = await page.evaluate(() => window.originTotalPageCount);
console.log(`Total pages: ${numPages}`);
// Создаем папку для сохранения скриншотов, если ее нет
const imagesDir = 'images';
if (!fs.existsSync(imagesDir)) {
fs.mkdirSync(imagesDir);
}
for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
// Делаем скриншот всей страницы
const screenshotPath = path.join(imagesDir, `page_${pageNumber}.png`);
await page.screenshot({ path: screenshotPath, fullPage: true });
console.log(`Screenshot saved to ${screenshotPath}`);
// Свайп влево для перехода на следующую страницу
if (pageNumber < numPages) {
const { width, height } = await page.evaluate(() => ({
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
}));
const startX = width - 10;
const endX = 10;
const swipeY = height / 2;
// Имитация свайпа
await page.touchscreen.touchStart(startX, swipeY);
await delay(100);
await page.touchscreen.touchMove(endX, swipeY);
await delay(100);
await page.touchscreen.touchEnd();
await delay(1000); // Ждем 1 секунду, чтобы страница переключилась
}
}
await browser.close();
// Создаем папку для сохранения PDF, если ее нет
const outputDir = 'output';
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir);
}
// Создаем PDF из изображений
const pdfDoc = await PDFDocument.create();
const imageFiles = fs.readdirSync(imagesDir).sort((a, b) => {
const numA = parseInt(a.match(/\d+/)[0]);
const numB = parseInt(b.match(/\d+/)[0]);
return numA - numB;
});
for (const imageFile of imageFiles) {
const imagePath = path.join(imagesDir, imageFile);
const imageBytes = await readFile(imagePath);
const image = await pdfDoc.embedPng(imageBytes);
const page = pdfDoc.addPage([image.width, image.height]);
page.drawImage(image, {
x: 0,
y: 0,
width: image.width,
height: image.height,
});
}
const pdfBytes = await pdfDoc.save();
const pdfPath = path.join(outputDir, `book.pdf`);
fs.writeFileSync(pdfPath, pdfBytes);
console.log(`PDF saved to ${pdfPath}`);
}
const url = process.argv[2] || 'https://www.yunzhan365.com/book/12345.html'; // Replace with your URL
takeScreenshots(url);
Ставим зависимости
Запускаем так
node screenshot.js https://book.yunzhan365.com/klqn/xobm/mobile/index.html