Snoopy — сетевой клиент PHP версии 2.0.0
Тут передо мной стала задача воспользоваться веб интерфейсом одного сервиса, подсунув на его страницу управляющий JS для автоматизации процесса. И в процессе размышлений на тему как это сделать, нашел вот такой простой класс-эмулятор браузера. https://sourceforge.net/projects/snoopy/files/ Буду на нем делать прокладку между браузером и сервисом, если лень не обуяет. ;-))) А поскольку не люблю читать английские мануалы, то перевел ихний README, что тут и выкладываю.
ИМЯ:
Snoopy — сетевой клиент PHP версии 2.0.0
КРАТКИЙ ОБЗОР:
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy->fetchtext("http://www.php.net/"); print $snoopy->results; $snoopy->fetchlinks("http://www.phpbuilder.com/"); print $snoopy->results; $submit_url = "http://lnk.ispi.net/texis/scripts/msearch/netsearch.html"; $submit_vars["q"] = "amiga"; $submit_vars["submit"] = "Search!"; $submit_vars["searchhost"] = "Altavista"; $snoopy->submit($submit_url,$submit_vars); print $snoopy->results; $snoopy->maxframes=5; $snoopy->fetch("http://www.ispi.net/"); echo "<PRE>\n"; echo htmlentities($snoopy->results[0]); echo htmlentities($snoopy->results[1]); echo htmlentities($snoopy->results[2]); echo "</PRE>\n"; $snoopy->fetchform("http://www.altavista.com"); print $snoopy->results;
ОПИСАНИЕ:
Что такое Snoopy?
Snoopy - это класс PHP, который имитирует веб-браузер. Например, он автоматизирует задачу извлечения содержимого веб-страницы и размещения форм.
Некоторые особенности Snoopy:
- легко извлекать содержимое веб-страницы
- простое извлечение текста с веб-страницы (удаление html-тегов)
- простое извлечение ссылок с веб-страницы
- поддерживает прокси-хосты
- поддерживает базовую аутентификацию user/pass
- поддерживает настройку user_agent, referer, cookies и содержимого заголовка
- поддерживает переадресацию браузера и контролируемую глубину переадресаций
- расширяет выбранные ссылки до полных URL-адресов (по умолчанию)
- легко отправляет данные формы и извлекает результаты
- поддерживает следующие html-фреймы (добавлена версия 0.92)
- поддерживает передачу файлов cookie при перенаправлениях (добавлена версия 0.92)
ТРЕБОВАНИЯ:
Snoopy требует PHP с PCRE (Регулярные выражения, совместимые с Perl), и расширение OpenSSL для получения запросов HTTPS.
МЕТОДЫ КЛАССА:
fetch($URI)
Это метод, используемый для извлечения содержимого веб-страницы.
$URI - это полный URL-адрес страницы для извлечения.
Результаты выборки сохраняются в $this->results.
Если вы извлекаете фреймы, то $this->results содержит массив, каждый извлеченный фрейм, в воём элементе.
fetchtext($URI)
Ведет себя точно так же, как функция fetch(), за исключением того, что она возвращает только текст со страницы, удаляя html-теги и другие нерелевантные данные.
fetchform($URI)
Ведет себя точно так же, как функция fetch(), за исключением того, что она возвращает только элементы формы со страницы, удаляя html-теги и другие нерелевантные данные.
fetchlinks($URI)
Ведет себя точно так же, как функция fetch(), за исключением того, что она возвращает только ссылки со страницы. По умолчанию относительные ссылки преобразуются в их полную форму URL-адреса.
submit($URI,$formvars)
Отправляет форму на указанный $URI. $formvars - это массив передаваемых переменных формы.
submittext($URI,$formvars)
Ведет себя точно так же, как submit(), за исключением того, что возвращает только текст со страницы, удаляя html-теги и другие нерелевантные данные.
submitlinks($URI)
Ведет себя точно так же, как submit(), за исключением того, что возвращает только ссылки со страницы. По умолчанию относительные ссылки преобразуются в их полную форму URL-адреса.
ПЕРЕМЕННЫЕ КЛАССА: (значение по умолчанию в скобках)
- $host хост, к которому нужно подключиться
- $port порт, к которому нужно подключиться
$proxy_host используемый прокси-хост, если таковой имеется - $proxy_port используемый прокси-порт, если таковой имеется
прокси-сервер можно использовать только для http-URL-адресов, но не для https - $agent пользовательский агент для маскировки под (Snoopy v0.1)
- $referer информация о реферере для передачи, если таковая имеется
- $cookies файлы cookie для передачи, если таковые имеются
- $rawheaders другая информация заголовка для передачи, если таковая имеется
- $maxredirs максимальное количество разрешенных перенаправлений. 0=не допускается. (5)
- $offsiteok следует ли разрешать перенаправление за пределы сайта. (true)
- $expandlinks следует ли расширять ссылки на полные URL-адреса (true)
- $user имя пользователя для аутентификации, если таковое имеется
- $pass пароль для аутентификации, если таковой имеется
- $accept типы приёма НТТР (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
- $error куда отправляются ошибки, если таковые имеются
- $response_code код ответа, возвращенный с сервера
- $headers заголовки, возвращаемые с сервера
- $maxlength максимальная длина возвращаемых данных
- $read_timeout тайм-аут при операциях чтения (требуется PHP 4 Beta 4+)
установите значение 0, чтобы запретить тайм-ауты - $timed_out true, если время ожидания операции чтения истекло (требуется PHP 4 Beta 4+)
- $maxframes количество фреймов, за которыми мы будем следить
- $status http-статус выборки
- $temp_dir временный каталог, в который веб-сервер может записывать данные. (/tmp)
- $curl_path системный путь к двоичному файлу cURL, установлен в значение false, если нет
(эта переменная игнорируется начиная с версии Snoopy v1.2.6) - $cafile имя файла с сертификатом(ами) CA
- $capath имя правильно хешированного каталога с сертификатом(ами) CA
если установлено значение $cafile или $capath, проверка SSL-сертификата включена.
ПРИМЕРЫ:
Получить веб-страницу и отобразить возвращаемые заголовки и содержимое страницы (с экранированием html):
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy->user = "joe"; $snoopy->pass = "bloe"; if($snoopy->fetch("http://www.slashdot.org/")) { echo "response code: ".$snoopy->response_code."<br>\n"; while(list($key,$val) = each($snoopy->headers)) echo $key.": ".$val."<br>\n"; echo "<p>\n"; echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n"; } else echo "error fetching document: ".$snoopy->error."\n";
Отправить форму и распечатать заголовки результатов и страницу с html-экранированием:
include "Snoopy.class.php"; $snoopy = new Snoopy; $submit_url = "http://lnk.ispi.net/texis/scripts/msearch/netsearch.html"; $submit_vars["q"] = "amiga"; $submit_vars["submit"] = "Search!"; $submit_vars["searchhost"] = "Altavista"; if($snoopy->submit($submit_url,$submit_vars)) { while(list($key,$val) = each($snoopy->headers)) echo $key.": ".$val."<br>\n"; echo "<p>\n"; echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n"; } else echo "error fetching document: ".$snoopy->error."\n";
Отображение функциональности всех переменных:
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy->proxy_host = "my.proxy.host"; $snoopy->proxy_port = "8080"; $snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)"; $snoopy->referer = "http://www.microsnot.com/"; $snoopy->cookies["SessionID"] = 238472834723489l; $snoopy->cookies["favoriteColor"] = "RED"; $snoopy->rawheaders["Pragma"] = "no-cache"; $snoopy->maxredirs = 2; $snoopy->offsiteok = false; $snoopy->expandlinks = false; $snoopy->user = "joe"; $snoopy->pass = "bloe"; if($snoopy->fetchtext("http://www.phpbuilder.com")) { while(list($key,$val) = each($snoopy->headers)) echo $key.": ".$val."<br>\n"; echo "<p>\n"; echo "<PRE>".htmlspecialchars($snoopy->results)."</PRE>\n"; } else echo "error fetching document: ".$snoopy->error."\n";
Извлечение содержимого во фреймах и отображение результатов:
include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy->maxframes = 5; if($snoopy->fetch("http://www.ispi.net/")) { echo "<PRE>".htmlspecialchars($snoopy->results[0])."</PRE>\n"; echo "<PRE>".htmlspecialchars($snoopy->results[1])."</PRE>\n"; echo "<PRE>".htmlspecialchars($snoopy->results[2])."</PRE>\n"; } else echo "error fetching document: ".$snoopy->error."\n";
АВТОРСКИЕ ПРАВА:
Copyright(c) 1999,2000 испи. Все права защищены.
Это программное обеспечение выпущено под Стандартной общественной лицензией GNU.
Пожалуйста, прочитайте отказ от ответственности в верхней части файла Snoopy.class.php.
БЛАГОДАРНОСТЬ:
Отдельное спасибо:
Peter Sorger <sorgo@cool.sk> помогите исправить ошибку перенаправления
Андрей Змиевский <andrei@ispi.net> реализует функцию тайм-аута
Патрик Санделин, <patric@kajen.com>, помогите с отладкой fetchform
Carmelo <carmelo@meltingsoft.com> различные исправления ошибок с фреймами