75 lines
1.8 KiB
JavaScript
75 lines
1.8 KiB
JavaScript
"use strict";
|
|
|
|
const puppeteer = require('puppeteer');
|
|
|
|
var config = require('config');
|
|
require('../../models/db');
|
|
var fs = require('fs');
|
|
var md5 = require('md5');
|
|
|
|
var express = require('express');
|
|
var router = express.Router();
|
|
|
|
function website_to_png(url,on_success,on_error) {
|
|
var hash = md5(url);
|
|
var export_path = "/tmp/webgrabber-"+hash+".png";
|
|
|
|
var timeout = 2000;
|
|
|
|
console.log("[webgrabber] url: "+url);
|
|
console.log("[webgrabber] export_path: "+export_path);
|
|
|
|
fs.stat(export_path, function(err, stat) {
|
|
if (!err) {
|
|
// file exists
|
|
console.log("[webgrabber] serving cached snapshot of url: "+url);
|
|
on_success(export_path);
|
|
} else {
|
|
(async () => {
|
|
let browser;
|
|
let page;
|
|
try {
|
|
browser = await puppeteer.launch(
|
|
{
|
|
headless: true,
|
|
args: ['--disable-dev-shm-usage', '--no-sandbox']
|
|
}
|
|
);
|
|
page = await browser.newPage();
|
|
|
|
page.setDefaultTimeout(timeout);
|
|
await page.setJavaScriptEnabled(false);
|
|
|
|
console.log("page created, opening ",url);
|
|
await page.goto(url, {waitUntil: 'networkidle0'});
|
|
await page.screenshot({path: export_path});
|
|
|
|
await browser.close();
|
|
on_success(export_path);
|
|
} catch (error) {
|
|
console.error(error);
|
|
console.log("[puppeteer-webgrabber] abnormal exit for url "+url);
|
|
on_error();
|
|
}
|
|
|
|
})();
|
|
}
|
|
});
|
|
}
|
|
|
|
router.get('/:id', function (req, res) {
|
|
var uri = new Buffer(req.params.id, "base64")+"";
|
|
var on_success_called = false;
|
|
|
|
website_to_png(uri, (image_path) => {
|
|
on_success_called = true;
|
|
res.sendFile(image_path);
|
|
}, () => {
|
|
if (!on_success_called) {
|
|
res.status(500).send("[webgrabber] Error fetching website.");
|
|
}
|
|
});
|
|
});
|
|
|
|
module.exports = router;
|