|
const express = require('express') |
|
const request = require('request') |
|
const puppeteer = require('puppeteer') |
|
const schedule = require('node-schedule') |
|
const rimraf = require('rimraf') |
|
const crypto = require('crypto') |
|
const path = require('path') |
|
const fs = require('fs') |
|
const app = express() |
|
|
|
// Proxy request |
|
const r = request.defaults({'proxy':'http://127.0.0.1:8123'}) |
|
|
|
// Global settings |
|
app.set('maintenence', false) |
|
|
|
// Static files |
|
app.use(express.static('public')) |
|
|
|
//Routes |
|
app.get('/', function (req, res) { |
|
res.sendFile(path.join(__dirname + '/public/index.html')) |
|
}) |
|
|
|
app.get('/proxy', (req, res) => { |
|
const url = req.query.url |
|
|
|
if (!url) return res.status(404).send('Missing URL!') |
|
r(url, (err, response, body) => { |
|
if (!err && response.statusCode === 200) { |
|
return res.send(body) |
|
} |
|
res.status(404).send() |
|
}) |
|
}) |
|
|
|
app.get('/capture', async (req, res) => { |
|
const url = req.query.url |
|
|
|
if (!url) return res.status(404).send('Missing URL param!') |
|
|
|
if (app.enabled('maintenence')) return res.status(500).send('Try again in few seconds. Sorry!') |
|
|
|
const name = crypto.createHash('md5').update(url).digest('hex') |
|
const generatedPath = `/captures/${name}.png` |
|
|
|
if (fs.existsSync(`./${generatedPath}`)) { |
|
console.log(`Cached version served for ${url} as ${generatedPath}`) |
|
return res.sendFile(generatedPath, { root: __dirname }) |
|
} |
|
|
|
console.log(`Generating capture for ${url} as ${generatedPath}`) |
|
const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox', '--proxy-server=127.0.0.1:8123'] }) |
|
const page = await browser.newPage() |
|
await page.goto(url) |
|
await page.setViewport({ |
|
width: 1280, |
|
height: 1000, |
|
deviceScaleFactor: 1 |
|
}); |
|
await page.screenshot({ path: `.${generatedPath}`, fullPage: true }) |
|
await browser.close() |
|
res.sendFile(generatedPath, { root: __dirname }) |
|
}) |
|
|
|
// Cron Cache control (“At minute 0 past every hour”) |
|
schedule.scheduleJob(`* */1 * * *`, function () { |
|
console.log('Cache clean up time!') |
|
app.set('maintenence', true) |
|
rimraf('./captures/*', () => { |
|
console.log('Cache clean finished!') |
|
app.set('maintenence', false) |
|
}) |
|
}) |
|
|
|
app.listen(process.env.PORT || 3000) |