Господа гуру! Возникла одна проблема, помогите с решением. Есть веб-морда принтера. На ней ведется статистика печати. Задача стоит слать эту статистику по времени на почту. При входе на веб-интерфейс необходимо авторизоваться. протокол https. Пробовал авторизацию через форму Код (Text): <form id="form" method="post" target="websas" action="https://192.168.110.193/websas/nccs.php?menuitem=6&menu=ServicesMenu&header=Accounting+system" name="login" > <input name="password" type="hidden" value="пароль"/> <input type="hidden" value="GB" name="language"> </form> так проходит. Но дальше встал вопрос как спарсить содержимое страницы. Думал в сторону POST-запрос с паролем через cURL и потом попробовать сграбить страницу, что-то не получилось. Вообще это возможно сделать? За ранее спасибо. UPD. Вот так лихо хотел спарсить, но форму авторизации не проходит. И парсит ее. Код (Text): include_once('simplehtmldom\simple_html_dom.php'); $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, "https://192.168.110.193/websas/login/login.php"); //куда шлем curl_setopt($ch, CURLOPT_POSTFIELDS, "password=пароль&language=GB"); //что шлем curl_setopt($ch, CURLOPT_REFERER, "https://192.168.110.193/"); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; .NET CLR 1.1.4322)"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_NOBODY, 0); // не проверять SSL сертификат curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // не проверять Host SSL сертификата curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); if(curl_exec($ch) === false) { echo 'Ошибка curl: ' . curl_error($ch); } else { echo 'Операция завершена без каких-либо ошибок'; } $html = file_get_html('https://192.168.110.193/websas/nccs.php?menuitem=6&menu=ServicesMenu&header=Accounting+system'); echo $html; curl_close ($ch);
пост в curl не так формируется Код (PHP): $p=array(); $p['login']=$UTM_USER; $p['password']=$UTM_PASS; curl_setopt($ch, CURLOPT_POSTFIELDS, $p);
CURLOPT_POSTFIELDS Все данные, передаваемые в HTTP POST-запросе. Для передачи файла, укажите перед именем файла @, а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ';type=mimetype', следующим за именем файла. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1¶2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data. Начиная с версии PHP 5.2.0, при передаче файлов с префиксом @, value должен быть массивом.
Ну вообще лучше сразу спарсить ее в файл а потом уже отсылать по почте. Просто не совсем понятно прохожу я авторизацию или нет. После отправки пароля, этот код Код (Text): $html = file_get_html('https://192.168.110.193/websas/nccs.php?menuitem=6&menu=ServicesMenu&header=Accounting+system'); echo $html; выдает всю туже страницу авторизации. Я може чего-то не догоняю просто.
значит не проходите. сделайте возврат страницы в curl-процедуре авторизации и будет вам видно с каким успехом вы прошли авторизацию. приведенный мною выше код - часть скрипта получения статистики у провайдера. для соблюдения всех требований биллинговой системы я сначала получаю стартовую страницу, потом авторизуюсь, потом перехожу к странице статистики. все делается через curl с разбором ответов. относительно вашей задачи - попробуйте получать нужную страницу то же через curl - возможно file_get_html не знает о том что вы прошли авторизацию через curl
оооо! ваша задача идентична моей. спасибо за совет. с cURL начал только работать, буду благодарен если подскажите как получать страницу через curl
старая версия - биллинг не по секурному соединению (секурное не сложнее, но вот скрипт я куда-то потерял) Код (PHP): <?php // стартовая $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/aaa"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $start=curl_exec($ch); curl_close($ch); // авторизация $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/aaa"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $p=array(); $p['login']=$UTM_USER; $p['password']=$UTM_PASS; $p['cmd']='user_verify'; curl_setopt($ch, CURLOPT_POSTFIELDS, $p); $login=curl_exec($ch); curl_close($ch); $dataArr=preg_match('/sid=(.{28})"/', $login,$pat); $MySID = $pat[1]; // репорт $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/utm_stat?cmd=user_report&sid=".$MySID); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $stat=curl_exec($ch); curl_close($ch); // парсинг репорта // *** // // выход $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/utm_stat?cmd=user_bye&sid=".$MySID); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $stat=curl_exec($ch); curl_close($ch); ?>
Что-то не получается. вот заголовок передаваемый когда коннектишься через форму и авторизацию проходит: Код (Text): POST /websas/login/login.php HTTP/1.1 Host: 192.168.110.193 User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Referer: http://localhost/test.html Cookie: PHPSESSID=96b7ea6fdbbc541ad19a2963235f0798 Content-Type: application/x-www-form-urlencoded Content-Length: 26 password=логин&language=GB а вот с помощью cURL Код (Text): HTTP/1.1 100 Continue HTTP/1.1 200 OK Date: Wed, 29 Feb 2012 10:08:46 GMT Server: Apache Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 19 Nov 1981 08:52:00 GMT X-Powered-By: PHP/4.3.9 Pragma: no-cache Set-Cookie: PHPSESSID=797b23fb6bc73b67e2d0cc21203cc950; path=/ Transfer-Encoding: chunked Content-Type: text/html; Charset=UTF-8 Может в этом дело быть?
Так ну более менее разобрался. Если подставлять куку Код (Text): curl_setopt($ch, CURLOPT_COOKIE, "PHPSESSID=1e7101a3fed3a09f78abcb0cd69a74c5"); то начинает все работать, но проблема в том, что работает только на определенном браузере. нашел как брать куки с заголовка: Код (Text): curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); preg_match('/^Cookie: (.*?);/m', curl_exec($ch), $m); но при каждом обращении к url куки разные, и при подстановке в PHPSESSID авторизоваться не получается ((. Если в ручную копировать из кук браузера PHPSESSID и вставлять в скрипт все ок. Не получается универсальности.