url2img
url2img is HTTP server with API for capturing screenshots of websites.
Example (command line):
$ curl -s http://localhost:55888/?url=google.com > google.jpg
Example (web browser):
http://localhost:55888/?url=google.com&output=html
API
Name | Type | Default | Description |
---|---|---|---|
url | string | Target URL (required), http(s):// prefix is optional | |
output | string | raw | Output format (raw, base64, html) |
format | string | jpg | Image format (jpg, png) |
ua | string | User-Agent string | |
quality | int | 85 | Image quality |
delay | int | 0 | Delay screenshot after page is loaded (milliseconds) |
width | int | 1600 | Viewport width |
height | int | 1200 | Viewport height |
zoom | float | 1.0 | Zoom factor |
full | bool | false | Capture full page height |
Usage
Usage of url2img:
-bind-addr string
Bind address (default ":55888")
-cache-dir string
Path to cache directory, if empty caching is disabled
-htpasswd-file string
Path to htpasswd file, if empty auth is disabled
-log-file string
Path to log file, if empty logs to stdout
-max-age int
Cache maximum age (seconds) (default 86400)
-read-timeout int
Read timeout (seconds) (default 5)
-write-timeout int
Write timeout (seconds) (default 15)
Auth
If server is started with -htpasswd-file it will be protected with HTTP Basic Auth. Supports MD5, SHA1 and BCrypt (https://github.com/abbot/go-http-auth).
Examples:
$ htpasswd -c .htpasswd username
$ url2img -htpasswd-file .htpasswd
$ curl -I 'http://localhost:55888/?url=google.com'
HTTP/1.1 401 Unauthorized
Content-Type: text/plain; charset=utf-8
Www-Authenticate: Basic realm="url2img/1.0"
X-Content-Type-Options: nosniff
Date: Wed, 09 Nov 2016 17:50:33 GMT
Content-Length: 17
$ curl -u username:password -s http://localhost:55888/?url=google.com > google.jpg
$ curl -s http://username:password@localhost:55888/?url=google.com > google.jpg
$ curl --netrc-file my-password-file http://localhost:55888/?url=google.com > google.jpg
Cache
If server is started with -cache-dir it will cache HTTP responses to disk according to RFC7234 (https://github.com/lox/httpcache). You can use -max-age to control maximum age of cache file, default is 86400 seconds (1 day).
Example:
$ curl -I 'http://localhost:55888/?url=https://reddit.com'
HTTP/1.1 200 OK
Accept-Ranges: bytes
Age: 21
Cache-Control: public,max-age=86400
Content-Length: 21107
Content-Type: image/jpeg
Last-Modified: Wed, 09 Nov 2016 18:25:26 GMT
Proxy-Date: Wed, 09 Nov 2016 17:25:26 GMT
Server: url2img/1.0
Via: 1.1 httpcache
X-Cache: HIT
Date: Wed, 09 Nov 2016 17:25:47 GMT
If you want uncached response you can request it via Cache-Control header:
$ curl -H 'Cache-Control: no-cache' 'http://localhost:55888/?url=https://reddit.com'
Or you can send POST request with json body, POST requests are never cached:
$ curl -X POST -d '{"url": "https://reddit.com", "format": "png"}' http://localhost:55888
Reload
To reload server (e.g. when .htpasswd is changed or log file is rotated) send SIGHUP signal to process. If you use one of the provided init scripts just do a reload.
Download
Binary is compiled fully static with musl toolchain. It should work on all systems without any additional dependencies. Systemd and OpenRC init scripts are included in dist/.
Alternative: run in Docker container
An alternative is to run everything in a container. Change to the dist/docker
directory and:
# Build container: `docker build -t url2img .`
# Then run container: `docker run -p 55888:55888 url2img`
Output should be like this:
$ docker run -p 55888:55888 url2img
running server on port 55888
Compile
Install Qt bindings (https://github.com/therecipe/qt) with WebKit (see https://github.com/therecipe/qt/wiki/Installing-QtWebKit-Module).
Install url2img to $GOPATH/bin:
$ go get -d github.com/gen2brain/url2img
$ go generate github.com/gen2brain/url2img/url2img
$ qtminimal linux $GOPATH/src/github.com/gen2brain/url2img/url2img
$ go install -tags minimal github.com/gen2brain/url2img/cmd/url2img
License
url2img is free/libre software released under the terms of the GNU GPL license, see the 'COPYING' file for details.