01
Июн

Иногда на практике возникает задачка автоматизированного создания снимков сайтов. В ручном режиме это делается просто (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 оконный менеджер — необходимость его сомнительна, а присутствие, скорее, будет мешать, нежели помогать.

Ну и напоследок — пример снимка данного сайта, изготовленного по второй версии рецепта:

Комментирование недоступно.
Максим Крентовский
системный архитектор
E-mail / GTalk: mkrentovskiy@gmail.com
Skype: mkrentovskiy