Есть сайт на Джумле.Там форма с логином и паролем.Если зайти на главную страницу при помощи такого заголовка Code: "GET / HTTP/1.1 Host:localhost Connection:Close " Вылезает заголовок Set-Cookie,я сохранил куку для дальнейших действий.Заголовок авторизации получился таким Code: "POST /component/comprofiler/login.html HTTP/1.1 Host:localhost Cookie:e5a81fd897e2d1568bb859654f3d0504=s114vmn29bvfik2hjt4dqdegb4;path=/; Content-type:application/x-www-form-urlencoded Content-length:28 Connection:Close username=admin&passwd=111111 " На выходе получил Сессия истекла или в Вашем браузере отключены куки. Пожалуйста, обновите страницу, перед ее заполнением.Подскажите пож-та чем мои действия отличаются от пользовательских,на что Джумла ругается?Вот php класс Code: <?php class htmlweb { private $pweb; public $Cookie; public $Headers; public $Data; public $Hostname; public $Path; private function getData(){ $line='';$counter=0;$oldsize=0; while(!feof($this->pweb,1024)){ $oldsize=strlen($line); $line.=fread($this->pweb,1024); if($oldsize==strlen($line)){$counter++;}else{$counter=0;}; if($counter>10)break; }; return $line; } public function GetMethod($path='/'){ $hostname=$this->Hostname; $this->pweb=fsockopen($hostname,80); $headers="GET $path HTTP/1.1\r\n"; $headers.="Host:$hostname\r\n"; if(sizeof($this->Cookie)>0){ $headers.="Cookie:"; foreach($this->Cookie as $k=>$v){ $headers.=$k."=".$v.";";}; $headers.="\r\n"; }; $headers.="Connection:Close\r\n\r\n"; fwrite($this->pweb,$headers); $line=$this->getData(); fclose($pweb); $rheaders=substr($line,0,strpos($line,"\r\n\r\n")); if((substr_count($rheaders,"text/html")>0)){ $this->Data=substr($line,strpos($line,"<",strpos($line,"\r\n\r\n")));}else{ $this->Data=substr($line,strpos($line,"\r\n\r\n")+4); } $this->Headers=explode("\r\n",$rheaders); $cookie=""; for($i=0;$i<sizeof($this->Headers);$i++){ if(substr_count($this->Headers[$i], "Set-Cookie")>0){ $coo=trim(substr($this->Headers[$i],strpos($this->Headers[$i],":")+1)); if((!empty($cookie))&&($cookie[strlen($cookie)-1]!=';')){$coo=";".$coo;}; $cookie.=$coo; }; };$coo1=array(); if(!empty($cookie)){ $cookie=explode(";",$cookie); $coo=''; for($i=0;$i<sizeOf($cookie);$i++){ $coo= explode("=", $cookie[$i]);$coo[0]=trim($coo[0]);$coo[1]=trim($coo[1]); if($coo[0]!="expires"){ $coo1[$coo[0]]=$coo[1]; }; } }; foreach($coo1 as $k=>$v){ $this->Cookie[$k]=$v; }; } public function PostMethod($path="/",$param,$isfileload=false){ $hostname=$this->Hostname; $this->pweb=fsockopen($hostname,80); $params=''; foreach($param as $k=>$v){ $params.="&$k=$v"; }; $params=substr($params,1); $plength=strlen($params); $headers="POST $path HTTP/1.1\r\n"; $headers.="Host:$hostname\r\n"; if(sizeof($this->Cookie)>0){ $headers.="Cookie:"; foreach($this->Cookie as $k=>$v){ $headers.=$k."=".$v.";";}; $headers.="\r\n"; }; $headers.="Content-type:application/x-www-form-urlencoded\r\n"; $headers.="Content-length:$plength\r\n"; $headers.="Connection:Close\r\n\r\n"; $headers.="$params\r\n\r\n"; fwrite($this->pweb,$headers); $line=$this->getData(); fclose($this->pweb); $rheaders=substr($line,0,strpos($line,"\r\n\r\n")); if((substr_count($rheaders,"text/html")>0)){ $data=substr($line,strpos($line,"<",strpos($line,"\r\n\r\n")));}else{ $data=substr($line,strpos($line,"\r\n\r\n")+4); }; $rheaders=substr($line,0,strpos($line,"\r\n\r\n")); if((substr_count($rheaders,"text/html")>0)){ $this->Data=substr($line,strpos($line,"<",strpos($line,"\r\n\r\n")));}else{ $this->Data=substr($line,strpos($line,"\r\n\r\n")+4); } $this->Headers=explode("\r\n",$rheaders); $cookie=""; for($i=0;$i<sizeof($this->Headers);$i++){ if(substr_count($this->Headers[$i], "Set-Cookie")>0){ $coo=trim(substr($this->Headers[$i],strpos($this->Headers[$i],":")+1)); if((!empty($cookie))&&($cookie[strlen($cookie)-1]!=';')){$coo=";".$coo;}; $cookie.=$coo; }; };$coo1=array(); if(!empty($cookie)){ $cookie=explode(";",$cookie); $coo=''; for($i=0;$i<sizeOf($cookie);$i++){ $coo= explode("=", $cookie[$i]);$coo[0]=trim($coo[0]);$coo[1]=trim($coo[1]); if($coo[0]!="expires"){ $coo1[$coo[0]]=$coo[1]; }; } }; foreach($coo1 as $k=>$v){ $this->Cookie[$k]=$v; }; } public function __construct($hostname,$path="/"){ $this->Hostname=$hostname; $this->Path=$path; $this->Cookie=array(); } } ?>
Таблица Sessions Джумлу включает Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2";s: Мб сессия привязана к Юзер-Агент? -------------------------------- Скопировал Юзер Агент из фаербага-то же самое!
Попробуй использовать класс Snoopy.class.php очень облегчает задачу, работает на сокетах, если нет curl'а на сервере.
geograph Где скачать?Он нормально эмитирует действия пользователя,просматривающего сайт? ------- Скачал,пробую.Как запомнить кукисы после вызова метода fetch сайта? --------- Сессия истекла или в Вашем браузере отключены куки. Пожалуйста, обновите страницу, перед ее заполнением. Снупи класс тожк самое выдаёт.WTF?Кукисы вроде как он сохраняет!
PHP: <?php $Headers = "POST /component/comprofiler/login.html HTTP/1.1\r\nHost: catalogioriflame.ru\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23\r\nConnection: close\r\nReferer: http://catalogioriflame.ru/index.php\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 316\r\n\r\nusername=Guest&passwd=1234567&op2=login&lang=russian&force_session=1&return=B%3AaHR0cDovL2NhdGFsb2dpb3JpZmxhbWUucnUvY29tcG9uZW50L2NvbXByb2ZpbGVyL3VzZXJwcm9maWxlLmh0bWw%3D&message=0&cbsecuritym3=cbm_55559103_1fb254b4_111020bfd0702a465a655bf4d9d40aaa&jd5760d1a5175535f2e0b189a049b83c3=1&Submit=%D0%92%D1%85%D0%BE%D0%B4"; $Fp = fsockopen('catalogioriflame.ru', 80); fwrite($Fp, $Headers); $Result = fread($Fp, 2096); fclose($Fp); preg_match_all('#Set-Cookie:([^;]+);#', $Result, $Cookies); $Headers = "GET /component/comprofiler/userprofile.html HTTP/1.1\r\nHost: catalogioriflame.ru\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23\r\nCookie: _ym_visorc=w; ".$Cookies['1']['1']."\r\nConnection: close\r\n\r\n"; $Fp = fsockopen('catalogioriflame.ru', 80); fwrite($Fp, $Headers); while(!feof($Fp)) echo fread($Fp, 256); fclose($Fp); Там отправляется несколько Set-Cookie, нужна последняя
Chaak Откуда 2я Кука берётся?При вызове методом GET главной страницы в заголовках содержится только одна купа вида md5(x)=md5(y);path="/" Хешей откуда столько? username=Guest&passwd=1234567&op2=login&lang=russian&force_session=1&return=B%3AaHR0cDovL2NhdGFsb2dpb3JpZmxhbWUucnUvY29 tcG9uZW50L2NvbXByb2ZpbGVyL3VzZXJwcm9maWxlLmh0bWw%3 D&message=0&cbsecuritym3=cbm_55559103_1fb254b4_111020bfd0702a4 65a655bf4d9d40aaa&jd5760d1a5175535f2e0b189a049b83c3=1&Submit=%D0%92%D1%85%D0%BE%D0%B4"; Где скачать программу мониторинга http запросов. На 7ке Naviscope не идёт,есть аналог?
Я пользуюсь Http-Headers/Tamper data для фаерфокса. Видать для авторизации надо указать скрытое поле cbsecuritym3. В итоге получился следующий запрос: Code: http://catalogioriflame.ru/component/comprofiler/login.html POST /component/comprofiler/login.html HTTP/1.1 Host: catalogioriflame.ru User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.23) Gecko/20110920 Firefox/3.6.23 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 Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Referer: http://catalogioriflame.ru/ Cookie: e5a81fd897e2d1568bb859654f3d0504=ulqkhkag54tb9g9u24hk4ftho3; _ym_visorc=w Content-Type: application/x-www-form-urlencoded Content-Length: 316 username=Guest&passwd=1234567&op2=login&lang=russian&force_session=1&return=B%3AaHR0cDovL2NhdGFsb2dpb3JpZmxhbWUucnUvY29tcG9uZW50L2NvbXByb2ZpbGVyL3VzZXJwcm9maWxlLmh0bWw%3D&message=0&cbsecuritym3=cbm_5ada1728_18a3e7f6_2e7fb16326d21b8b2afc2b08782ff3a6&jd5760d1a5175535f2e0b189a049b83c3=1&Submit=%D0%92%D1%85%D0%BE%D0%B4 HTTP/1.1 303 See other Date: Thu, 08 Mar 2012 14:40:24 GMT Server: Apache P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" Set-Cookie: e5a81fd897e2d1568bb859654f3d0504=5c372110c8fdf6fec73c76a4f1c762c1; path=/ Location: http://catalogioriflame.ru/component/comprofiler/userprofile.html Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 20 Connection: close Content-Type: text/html; charset=utf-8 Вот этим куком дальше пользуемся:
С использованием снупи как-то так: PHP: <?php include "Snoopy.class.php"; $snoopy = new Snoopy; $snoopy->agent = 'Opera/9.80 (Windows NT 6.1; U; MRA 5.7 (build 03797); YB/3.5.1; ru) Presto/2.9.168 Version/11.50'; if(!$snoopy->fetch("http://catalogioriflame.ru")) { die ('Cannot connect'); } preg_match("!name=\"cbsecuritym3\"\s+value=\"([^\"]+)\"!si", $snoopy->results, $match); $submit_vars["username"] = "Guest"; $submit_vars["passwd"] = "1234567"; $submit_vars["op2"] = "login"; $submit_vars["lang"] = "russian"; $submit_vars["force_session"] = "1"; $submit_vars["message"] = "0"; $submit_vars["cbsecuritym3"] = $match[1]; $submit_vars["jd5760d1a5175535f2e0b189a049b83c3"] = "1"; $submit_vars["remember"] = "yes"; $submit_vars["Submit"] = "1"; if($snoopy->submit("http://catalogioriflame.ru/component/comprofiler/login.html", $submit_vars)) { echo $snoopy->results; } ?> Я пользуюсь снифером HTTPAnalyzer
Спс,всё разобрался! geograph Хороша библиотека Snoopy.Поддерживает прокси,много фич. Не в курсе как в snoopy классе методом submit прикрепить файл?
Просто надо включить multipart и третьим параметром в submit указать массив с путем до файла. Что-то типа такого: PHP: $files["uploadfile"] = '/home/tmp/picture.png'; $snoopy->set_submit_multipart(); $snoopy->submit($url, $vars, $files);
geograph То есть он отсылает только имя файла в массиве.А контент файла получает из той директории?Открывает,получает содержимое fread($file,100) и отсылает POST с контентом файла?
ну да, т.е. post-запрос будет примерно таким: Code: Content-Type: multipart/form-data; boundary=----------zOX8lm35BiUMDAxCQ7DuGE ------------zOX8lm35BiUMDAxCQ7DuGE Content-Disposition: form-data; name="uploadfile"; filename="picture.png" ‰PNG.... дальше файл
Вот пример авторизации на cURL, может кому пригодиться. PHP: <?php //Author mr.Penguin $user = "admin"; $password = "111111"; $url = 'http://localhost'; // Куда зайти $urlTo = 'http://localhost/component/comprofiler/login.html'; // Куда данные послать $post = "username=".$user."&passwd=".$password; // POST данные $ch = curl_init(); // Инициализация сеанса curl_setopt($ch, CURLOPT_URL, $url); // Заходим на сайт curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Приказываем вернуть страницу в переменную $html = curl_exec($ch); // Забираем страницу curl_setopt($ch, CURLOPT_URL, $urlTo); // Куда шлем POST данные curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); // Записываем cookie curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // Читаем cookies curl_setopt($ch, CURLOPT_POST, true); // Указываем метод отправки curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // POST данные curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Говорим скрипту, чтобы он следовал за редиректами которые происходят во время авторизации $html = curl_exec($ch); // Забираем страницу curl_close($ch); // Завершаем сеанс echo $html; // Отображаем результат ?>
Да все нашел http://www.php.ru/forum/viewtopic.php?f=2&t=38734&p=315441 Есть какой нибудь класс интересный php?Набираю библиотеку ООП