Автоматическое создание снимков сайтов
Иногда на практике возникает задачка автоматизированного создания снимков сайтов. В ручном режиме это делается просто (PrtSc с последующей обтравкой в Photoshop или GIMP), а вот в автоматическом… И если для Windows полно мелких программок, позволяющих реализовать подобное (еще бы — выдернуть посредством COM объект браузера, заслать его на нужный сайт и результат отрисовки сохранить), то в Linux-е можно обойтись штатными средствами, без использования дополнительного кода.
Отдельно отмечу вариант, когда на машине, где наше решение будет работать, не установлен XOrg или что-то подобное. Обычно это справедливо для серверов, которым графическая оболочка ни к чему.
В этом случае нам необходимо поставить два основных пакета — vncserver и xvfb. Первый реализует удаленный доступ к виртуальному экрану и потребуется нам исключительно для отладки (после выхода на режим — можно удалить). Второй представляет собой традиционный экранный сервер, который отрисовывает картинку не на физическом устройстве, а в память. Что мы и будем использовать для для создания снимков. В качестве браузера будем использовать Firefox, хотя ниже будет приведен вариант, позволяющий использовать любой браузер.
Итак, запускаем VNC-сервер. Проверяем, что браузер работоспособен, шрифтов необходимо и достаточно, все отображается адекватно. Далее, есть два варианта развития событий.
- используем командную строку.
Данный метод более универсален, поскольку позволяет использовать не только Firefox, но и любой другой браузер.1
2
3
4
5
6#!/bin/bash
export DISPLAY=":0"
/usr/bin/opera -display :0 -geometry 1024x768+0+0 -nomail -nosession "$1" > /dev/null 2> /dev/null &
sleep 25
/usr/bin/import -window root -display :0 -crop 1024x768+7+50 "$2"
/usr/bin/killall operaЗдесь принцип простой — создаем окно браузера, делаем задержку, затем делаем снимок заданной области с применением утилиты import (входит в состав ImageMagic), которая по расширению имени файла поймет, в какой формат сохранять и, напоследок, закрывает браузер (причем не очень правильно — Firefox после такого обращения будет ругаться на некорректно завершенную сессию). Вызов вышеуказанного скрипта будет осуществляться как ./siteshot.sh «http://www.relabs.ru/» relabs.png
- использовать расширение Firefox. Это наиболее простой метод.
Устанавливаем расширение Pearl Crescent Page Saver. Нам достаточно бесплатной версии. Далее, в командной строке говорим /opt/firefox/firefox -display :1 -saveimage http://relabs.ru/, где параметр display отвечает за номер виртуального экрана. Результат будет находится в файле «заголовок_сайта.png». Это не совсем удобно (особенно для автоматизации), поэтому, зайдя в конфигуратор через «about:config», меняем параметр pagesaver.file.name с %u на %5 — теперь название файла будет представлять собой md5-хеш от запрашиваемого адреса. В качестве дополнительных параметров можно использовать -width и -height для задания ширины и высоты снимка.
В обоих случаях браузеру нужно запретить задавать глупые вопросы (например, нужно ли восстанавливать сессию или проверять, является ли браузер используемым по умолчанию, нужно ли обновлятся и т.п.). Для Firefox это делается в меню и при помощи about:config (в частности, восстановление сессии отключается изменением параметра browser.sessionstore.resume_from_crash). Помимо браузерных проверок лучше отключить в /etc/X11/xinit/xinitrc оконный менеджер — необходимость его сомнительна, а присутствие, скорее, будет мешать, нежели помогать.
Ну и напоследок — пример снимка данного сайта, изготовленного по второй версии рецепта:


