Делаем скриншот сайта с использованием PHP
Сегодня, заглянув на один из форумов, наткнулся на вопрос о том, как сделать при помощи PHP скриншот сайта. Задачка показалось интересной, и через несколько минуть поиска наткнулся на такую вещь, как CutyCapt. Впрочем, для работы этой утилиты нужен X-server. Но т.к. иксы и виртуальный сервер под хостинг - вещи не вполне совместимые (ну зачем графическая оболочка веб-серверу?), то решено было поставить xvfb.
Подготовка
Итак, для начала подготовимся и установим себе на сервер (сойдет любой Lunix-овый VPS/VDS, в примерах использован Debian) все необходимое. Для начала нам понадобится CutyCapt и виртуальные X-ы. Начнем с последних - сгодится Fake Xserver, он же xvfb. Ставим:
apt-get update
apt-get install xvfb
Теперь собираем CutyCapt. Для этого понадобится svn:
apt-get install subversion libqt4-webkit libqt4-dev g++
Subversion установлен, создаем какой-либо каталог для CutyCapt и скачиваем в него исходники:
md /usr/ccapt
cd /usr/ccapt
svn co https://cutycapt.svn.sourceforge.net/svnroot/cutycap
Теперь перейдем в каталог и соберем CutyCapt:
cd cutycapt/CutyCapt
qmake
make
Вот и готово. Проверяем работу:
xvfb-run --server-args="-screen 0, 1024x768x24" /usr/ccapt/cutycapt/CutyCapt/CutyCapt --url=http://www.snkey.net --out=/var/snkeynet.jpg
В каталоге var должен появиться файлик snkeynet.jpg со скриншотом главной страницы сайта SNK Software.
Практическое использование
Перейдем к использованию того, что имеем. Например, далее файл можно обработать, скажем, пропорционально уменьшить при помощи SNK GSCP (конкретно - нужен класс TIMGH из файла img.php). Переключаемся на PHP и пишем следующий код:
include("img.php");
$screen = new TIMGH("/var/snkeynet.png");
$screen->resize(400,300,"/var/www/site/screenshots/snkeynets.jpg");
Получаем файл snkeynets.jpg размером не более 400 на 300 пикселей:
Осталось довести до ума все это дело. Так что напоследок напишем скрипт, который будет делать скриншот сайта и выводить его непосредственно в окно браузера. Назовем его show.php, вот его полный исходный код:
<?php
include("img.php");
$url = $_GET["url"];
if (substr($url,0,4) != "http") $url = "http://".$url;
exec('xvfb-run --server-args="-screen 0, 1024x768x24" /usr/ccapt/cutycapt/CutyCapt/CutyCapt --url='.$url.' --out=/var/www/site/screenshots/tmp.jpg');
$screen = new TIMGH("/var/www/site/screenshots/tmp.jpg");
header("Content-type: image/jpeg");
$screen->resize(400,300,NULL);
?>
Теперь для того, чтобы увидеть скриншот сайта www.snkey.net, достаточно в адресной строке браузера написать site.name/show.php?url=www.snkey.net. Разумеется, вместо site.name следует написать имя вашего сайта, равно как и заменить указанные пути на ваши в коде скрипта.
2011-04-11