Website screenshot service powered by Node.js, SlimerJS and PhantomJS
npm install manet> There is only one true thing: instantly paint what you see. When you've got it, you've got it. When you haven't, you begin again. All the rest is humbug.

Manet is a REST API server which allows capturing screenshots of websites using various parameters. It is a good way to make sure that your websites are responsive or to make thumbnails.
Manet could use different engines to work: SlimerJS or PhantomJs.
* SlimerJS runs on top of Gecko (the browser engine of Mozilla Firefox) and SpiderMonkey (the JavaScript engine of Firefox).
* PhantomJS runs on top of WebKit and JavaScriptCore.
Project was named in honor of Édouard Manet, French painter (1832-1883). He was one of the first 19th-century artists to paint modern life, and a pivotal figure in the transition from Realism to Impressionism.
#### SlimerJS:
* You can download SlimerJS from the official site and install manually.
* or you can use the power of NPM:
``bash`
npm install -g slimerjs
Gecko, the rendering engine of Firefox, cannot render web content without a graphical window, but you can launch SlimerJS with xvfb if you are under linux or MacOSx, to have a headless SlimerJS, so it is also necessary to install Xvfb (X virtual framebuffer) for *nix or OS X systems.
For example, you can use apt-get to install xvfb on Ubuntu:
`bash`
sudo apt-get install xvfb
#### PhantomJS
* You can download PhantomJS from the official site and install manually.
* or you can also use NPM:
`bash`
npm install -g phantomjs`
or (to use second version):bash`
npm install -g phantomjs2
IMPORTANT: PhantomJS is used by default (see default.yaml file).
After preliminaries operations you can install Manet using NPM:
`bash`
npm install -g manet
That is all, now you can start and use Manet server. As you can see, it is unnecessary to clone Git repository or something else.
Server launching is a simple as possible:
`bash`
manet
If everything is OK, you should see the following message:
``
info: Manet server started on port 8891
Manet server uses hierarchical configurations to cover differnet usage use-cases:
* Command-line parameters
* Environment variables
Built-in configuration YAML file ("config/default.yaml")*
Rules of overriding:
* Each configuration level could be overridden by another level.
The most-priority parameters are command-line parameters*.
The less-priority parameters are stored in build-in configuration file*.
Built-in configuration could be found in manet directory. For example, on Ubuntu it is located here: "/usr/local/lib/node_modules/manet/".
Default configuration file ("default.yaml"):
`yaml
host: 0.0.0.0
port: 8891
cors: false
ui: true
silent: false
level: info
engine: phantomjs
timeout: 60000
compress: false
cache: 3600
cleanupStartup: false
cleanupRuntime: false
commands:
slimerjs:
linux: "xvfb-run -a slimerjs"
freebsd: "xvfb-run -a slimerjs"
sunos: "xvfb-run -a slimerjs"
darwin: "slimerjs"
win32: "slimerjs.bat"
phantomjs:
linux: "phantomjs --ignore-ssl-errors=true --web-security=false"
freebsd: "phantomjs --ignore-ssl-errors=true --web-security=false"
sunos: "phantomjs --ignore-ssl-errors=true --web-security=false"
darwin: "phantomjs --ignore-ssl-errors=true --web-security=false"
win32: "phantomjs --ignore-ssl-errors=true --web-security=false"
whitelist:
- "*"
security:
basic:
REST API
REST API is available on "/" using:
* GET method
* POST method with
Content-Type:
application/json*
or application/x-www-form-urlencoded*Few rules:
* The
"url" parameter must be specified.
* It is possible to send data using query parameters or HTTP Message Body.
* Query parameters will be used in priority and override others.
$3
- url
- Website address (URL). This is the only required parameter for the HTTP request. It is unnecessary for the most cases to configure scheme. Example: "github.com".
- width
- This property allows to change the width of the viewport, e.g., the size of the window where the webpage is displayed (default:
1024)
height
This property allows to change the height of the viewport. If width is defined and height is not defined, than full page will be captured.
paperFormat
Paper format for PDF export (default is letter). Possible values: letter, A2, A3, A4, A5.
paperOrientation
Paper orientation for PDF export (default is portrait). Possible values: portrait, landscape.
clipRect
This property defines the rectangular area of the web page to be rasterized. Format: "top,left,width,height", example: "20,20,640,480".
zoom
Zoom factor of the webpage display. Setting a value to this property decreases or increases the size of the web page rendering. A value between 0 and 1 decreases the size of the page, and a value higher than 1 increases its size. 1 means no zoom (normal size). (default: 1).
quality
The compression quality. A number between 0 and 1 (default value: 1). Quality parameter doesn't work for PNG file format.
delay
Do a pause during the given amount of time (in milliseconds) after page opening (default: 100).
format
Indicate the file format for output image (default is "png"). Possible values: jpg, jpeg, png, bmp, pdf, ppm, ico.
Format
PhantomJS
SlimerJS
JPG
+
+
PNG
+
+
HTML
+
+
BMP
+
-
PDF
+
-
PPM
+
-
ICO
+
-
agent
String to define the "User-Agent" in HTTP requests. By default, it is something like:
- PhantomJS: Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.0 (development) Safari/534.34
- SlimerJS: Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 SlimerJS/0.7
headers
This property specifies additional HTTP request headers that will be sent to the server for every request issued (for pages and resources). Format: "key1=value1;key2=value2;..." Headers names and values get encoded in US-ASCII before being sent. Please note that setting the 'User-Agent' will overwrite the value set via "agent" parameter.
user
User name to give to HTTP Basic authentication.
password
Password to give to HTTP Basic authentication.
js
false to deactivate javascript in web pages (default is true).
images
false to deactivate the loading of images (default is true).
force
Use the force reloading of web page without using cache (default is false).
selector
Wait for the DOM element, that matches the CSS selector, to be available before taking the screenshot.
selectorCrop
Crop page by offset coordinates of selected(by CSS selector) element. (default is false).
Leave height option empty, for this is working correctly.
selectorCropPadding
Add padding to 'selectorCrop'. You can use negative values. (default is 0).
callback
Return an empty response immediately (HTTP 200 OK), then send a POST request to the callback URL when the screenshot is ready (with image in the body).
engine
Override default engine parameter. Possible values: phantomjs, slimerjs.
cookies
Configure cookies that will be contained in request. HTTP message body is the easiest way for sending cookies to Manet (ex: using JSON format).
$3
For a quick test with the command line (using
curl), type:`bash
curl http://localhost:8891/?url=github.com > github.png
curl -H "Content-Type: application/json" -d '{"url":"github.com"}' http://localhost:8891/ > github.png
curl -H "Content-Type: application/x-www-form-urlencoded" -d 'url=github.com' http://localhost:8891/ > github.png
`or (using
wget)`bash
wget http://localhost:8891/?url=github.com -O github.png
`Here are some query examples that could be executed by any REST API client:
`
Take a screenshot of the github.com.
GET /?url=github.comCustom viewport size. Return a 800x600 PNG screenshot of the github.com homepage.
GET /?url=github.com&width=800&height=600Clipping Rectangle. Return a screenshot clipped at [top=20, left=30, width=90, height=80]
GET /?url=github.com&clipRect=20%2C30%2C90%2C80Zoom rendered page in 2 times.
GET /?url=github.com&zoom=2Specify image output format.
GET /?url=github.com&format=jpegDisable JavaScript. Return a screenshot with no JavaScript executed.
GET /?url=github.com&js=falseDisable images. Return a screenshot without images.
GET /?url=github.com&images=falseCustom User Agent.
GET /?url=github.com&agent=Mozilla%2F5.0+(X11%3B+Linux+x86_64)+AppleWebKit%2F537.36+(KHTML%2C+like+Gecko)+Chrome%2F34.0.1847.132+Safari%2F537.36HTTP Basic Authentication. Return a screenshot of a website requiring basic authentication.
GET /?url=mysite.com&user=john&password=smithScreenshot delay. Return a screenshot of the github.com homepage 1 second after it's loaded.
GET /?url=github.com&delay=1000Force page reloading. Return a screenshot without using file cache.
GET /?url=github.com&force=trueWait for a div element with a class name "header" to be available.
GET /?url=github.com&selector=div.headerSpecify custom HTTP headers.
GET /?url=google.com&headers=User-Agent=Firefox;Accept-Charset=utf-8Asynchronous call.
GET /?url=github.com&callback=http://localhost:8891
`
Sandbox UI
Sandbox UI is available on "/" by direct GET request without
"url" query parameter.
It is a simple playground to build HTTP requests and try them.Demo instance is available on Heroku: https://manet.herokuapp.com
You can also use "Deploy to Heroku" button to create your own Manet instance on Heroku without leaving the web browser, and with little configuration.

Development
* To install project dependencies:
`bash
npm install
`
* To run jshint checks:
`bash
npm run lint
`
* To run Mocha unit tests:
`bash
using NPM:
npm test
using mocha and watcher:
mocha --watch -R spec
`
* To run Manet server:
`bash
./bin/manet
`
Alternative clients
Ruby:
* manet_client is a simple Ruby client library for Manet.
Deployment options
$3
Docker is an open platform to build, ship, and run distributed applications, whether on laptops, data center VMs, or the cloud.
Manet has some already known
Dockerfile`s:* Pietro Delsante provides the first manet-dockerfile to run Manet inside a Docker container.
* Kris Carle provides fork of previous project with WebGL support for SlimerJS.
* Walter Franchetti provides docker-Manet with PhantomJS and libfreetype6.
* Olivier Balais provides docker-manet with extended charactersets such as Japanese and Chinese.
First of all read https://devcenter.heroku.com/articles/deploying-nodejs (section "Deploy your application to Heroku").
You need to create Heroku instance with as described in this documentation.
Procfile file for PhantomJS is already existed in root of the project. This file describes Heroku how to start Manet.
SlimerJS does not work on Heroku, because it has not got a headless mode and it is quite complicated to install xvfb on this platform (but you can try your luck).
* SlimerJS author Laurent Jouanneau and SlimerJS community.
* PhantomJS author Ariya Hidayat and PhantomJS community.
* Pietro Delsante, Kris Carle, Walter Franchetti, and Olivier Balais for running project inside a Docker container.
* Felipe JAPM for Ruby client.
* All contributors for their help and pull requests.
One picture more than a thousand words:

The MIT License (MIT)
Copyright (c) 2014 Vladislav Bauer (see LICENSE).