This is a simple screenshot server running over http. You append a url (a urlencoded url) to the server and it returns a PNG image of the screenshot. It’s a simple implementation and not very scalable because of threading limits in phantomjs. But it could be modified to be much more robust and is a great starting point if you’re interested in improving.
Here are some example urls how it works.
http://yourserver:8001/http%3A%2F%2Fphantomjs.org%2Fapi%2Fwebpage%2Fproperty%2Fclip-rect.html
http://yourserver:8001/https%3A%2F%2Fbitbook.io%2F
First step is to install
Install NodeJS and PhantomJS on Ubuntu
apt-get install npm nodejs-legacy nodejs npm -g install phantomjs-prebuilt npm -g update phantomjs-prebuilt
Save the code out to a file named server.js, then you can run it with
phantomjs server.js 8001
The Code
"use strict";
var port,
server,
service,
system = require('system'),
page,
address,
output,
width;
if (system.args.length !== 2) {
console.log('Usage: server.js <portnumber>');
phantom.exit(1);
} else {
port = system.args[1];
server = require('webserver').create();
service = server.listen(port, function (request, response) {
// logging, comment out if you dont want any
console.log('Request at ' + new Date());
console.log(JSON.stringify(request, null, 4));
//url request comes in like this - url encoded url after the 8001/
//curl http://127.0.0.1:8001/URL_ENCODED_URL_HERE;
//curl http://127.0.0.1:8001/http%3A%2F%2Fbitbook.io/;
//remove 1st slash on url
var url = request.url.substring(1, request.url.length);
page = require('webpage').create();
page.viewportSize = {width: 1200, height: 900};//max ever canvas
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';
page.open(url, function (status) {
if (status !== 'success') {
page.close();
response.statusCode = 500;
response.write('error: url no load');
response.close();
console.log('Unable to load the address');
} else {
// removed timeout
// window.setTimeout(function () {
// phantomjs doesnt set a background if page has none, so force it if none
page.evaluate(function() {
var style = document.createElement('style'),
text = document.createTextNode('body { background: #fff }');
style.setAttribute('type', 'text/css');
style.appendChild(text);
document.head.insertBefore(style, document.head.firstChild);
});
var base64 = page.renderBase64('PNG');
response.statusCode = 200;
response.setHeader("Content-Type", "image/png");
response.setEncoding('binary');
response.write(atob(base64));
response.close();
// }, 21500);
}
});
});
if (service) {
console.log('Web server running on port ' + port);
} else {
console.log('Error: Could not create web server listening on port ' + port);
phantom.exit();
}
}