Skip to content

Instantly share code, notes, and snippets.

@elw00d
Last active February 4, 2020 15:50
Show Gist options
  • Save elw00d/0784764b403900d8b4f9e20ed11ac7da to your computer and use it in GitHub Desktop.
Save elw00d/0784764b403900d8b4f9e20ed11ac7da to your computer and use it in GitHub Desktop.
Скрипт ходит по страницам и делает скриншоты div'а
// Скрипт ходит по страницам и делает скриншоты div'а
// Установка: `npm install puppeteer`
// Запуск: `nodejs screenshot.js`
//
// После работы в директории будет набор файлов 001.png 002.png ... итд
// Чтобы их сконвертировать в pdf, можно воспользоваться imagemagick
//
// # Установить imagemagick
// sudo apt-get install imagemagick
//
// # Этот шаг возможно будет падать из-за лимитов и прав в /etc/ImageMagick-6/policy.xml
// # В этом случае нужно пойти и подредактировать дефолты
// # Например поставить <policy domain="coder" rights="read|write" pattern="PDF" />
// # И поднять лимит по ресурсам
// convert 001.png 002.png 003.png output.pdf
//
// # Взять все png по возрастанию modification time
// convert $(ls -trl *.png | awk '{print $9}' | xargs echo) output.pdf
const puppeteer = require('puppeteer')
function delay(time) {
return new Promise(function(resolve) {
setTimeout(resolve, time)
});
}
function leftpad (str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0) ch = ' ';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}
;(async () => {
const browser = await puppeteer.launch({
headless:false, // Это можно поставить в true
defaultViewport:null,
devtools: false,
args: ['--window-size=1920,1170','--window-position=0,0'],
// Здесь указать директорию, где браузер будет хранить данные пользователя
userDataDir: '/home/elwood/all/nodejs-test/user-data-dir'
})
const page = (await browser.pages())[0]
// Ссылка на учебник для чтения
const open = await page.goto ( 'https://reader.lecta.rosuchebnik.ru/read/8234-64' )
// Кол-во страниц
for (var page_num = 1; page_num <= 405; page_num++) {
await delay(3000);
var item = await page.evaluate(() => {
var iframes = document.getElementsByTagName('iframe');
var iframe = undefined;
for (var i = 0; i < iframes.length; i++) {
if (iframes[i].id.startsWith('epubjs-')) {
iframe = iframes[i];
}
}
var divs = iframe.contentWindow.document.getElementsByTagName('div');
for (var i = 0; i < divs.length; i++) {
if (divs[i].getAttribute('data-page-no') != null) {
return divs[i].id;
}
}
}
);
const frame = page.frames().find(frame => {
console.log('Processing frame ' + frame.name());
return frame.name().startsWith('epubjs-');
});
console.log(frame);
var div = await frame.$$('div[id="' + item + '"]');
console.log('DIV:');
console.log(div);
await div[0].screenshot({path: './' + leftpad(page_num, 3, '0') + '.png'});
console.log('taken screenshot');
await page.click('a[class="_icon forward"]');
}
console.log('Finished OK');
})()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment