Доброго времени суток. Пишу парсер для lockerz.com, тупо не могу авторизоваться. Код: PHP: use IO::Socket; $handle = '[email protected]'; $password = 'coolPass'; $sock = IO::Socket::INET->new(PeerAddr => 'lockerz.com', PeerPort => 80, PeerProto => 'tcp', TimeOut => 10); print $sock "GET / HTTP/1.0\r\n". "Host: lockerz.com\r\n". "Accept-encoding: */*\r\n". "Accept: text/html\r\n". "User-Agent: Mozilla/9.0\r\n". "Connection: keep-alive\r\n\r\n"; sysread($sock ,$data, 1024576); $cookies = getCookies($data); open(P, '>data.html'); print P $data; close(P); $content = 'handle='.$handle.'&password='.$password; print $sock join("\r\n" => "POST /auth/login HTTP/1.1", "Host: lockerz.com", "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1", "Content-type: application/x-www-form-urlencoded", "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8", "Accept-Encoding: gzip, deflate", "Referer: http://lockerz.com/", "Cookie: $cookies", "Connection: Keep-Alive", "Content-length: ".length($content), "", $content); sysread($sock, $data1, 999999); open(P, '>data1.html'); print P $data1; close(P); sub getCookies { my $ans = @_[0]; @answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?\r\n/g); for $cookie(@answer) { $cookies .= $cookie."; "; } return $cookies; } Запросы прописал прям как в сниффере (только второй, т.к. первый работает норм). Должно возвращать 302, не возвращает абсолютно ничего. В чем может быть ошибка? если изменить код так (закрыть и пересоздать сокет): PHP: use IO::Socket; $handle = '[email protected]'; $password = 'coolPass'; $sock = IO::Socket::INET->new(PeerAddr => 'lockerz.com', PeerPort => 80, PeerProto => 'tcp', TimeOut => 10); print $sock "GET / HTTP/1.0\r\n". "Host: lockerz.com\r\n". "Accept-encoding: */*\r\n". "Accept: text/html\r\n". "User-Agent: Mozilla/9.0\r\n". "Connection: keep-alive\r\n\r\n"; sysread($sock ,$data, 1024576); $cookies = getCookies($data); open(P, '>data.html'); print P $data; close(P); close($sock); $sock = IO::Socket::INET->new(PeerAddr => 'lockerz.com', PeerPort => 80, PeerProto => 'tcp', TimeOut => 10); $content = 'handle='.$handle.'&password='.$password; print $sock join("\r\n" => "POST /auth/login HTTP/1.1", "Host: lockerz.com", "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1", "Content-type: application/x-www-form-urlencoded", "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8", "Accept-Encoding: gzip, deflate", "Referer: http://lockerz.com/", "Cookie: $cookies", "Connection: Keep-Alive", "Content-length: ".length($content), "", $content); sysread($sock, $data1, 999999); open(P, '>data1.html'); print P $data1; close(P); sub getCookies { my $ans = @_[0]; @answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?\r\n/g); for $cookie(@answer) { $cookies .= $cookie."; "; } return $cookies; } то возвращает Code: HTTP/1.1 200 OK Server: nginx Date: Sun, 24 Jul 2011 17:53:46 GMT Content-Type: text/html Transfer-Encoding: chunked Connection: keep-alive Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Encoding: gzip 202 ‹ увидел Content-encoding: gzip и сделал Compress::Zlib::memGunzip($data1);, но там пусто как в первом варианте. снова там же, откуда и начал В User-Agent я что только не писал, ему фиолетово
Из файербага в теле поста: PHP: handle=abc%40mail.com&password=123123 у тебя отправляется запрос без url encode для мыла в handle. При неверных параметрах, либо неудачной авторизации он и возвращает пустой ответ - тоже из фаербага UPD: про твою "проверенную" функцию, копи-пейст as is: PHP: #!/usr/bin/perl sub getCookies { my $ans = @_[0]; @answer = ( $ans =~ m/Set-Cookie: ([^;]+?);.+?rn/g); for $cookie(@answer) { $cookies .= $cookie."; "; } return $cookies; } my $coo = "Set-Cookie: handle=abc%40mail.com; path=/; domain=.lockerz.com;"; print getCookies($coo); Вывод - пустой. Регексп m/Set-Cookie: ([^;]+?);.+?rn/g либо криво скопи-пейсчен, либо просто не работает (и не должен). ЗЫ код без strict - прошлый век.
конечно там задумывалось \r\n, но в любом случае неправильно потому что если дальше указана прошедшая дата куку надо удалять а не запоминать Code: my $ans = @_[0]; сигла неправильная Code: GET / HTTP/1.0\r\n". "Host: lockerz.com\r\n". В rfc 1945 для протокола HTTP 1.0 заголовок Host не предусмотрен
red_joker я отправляю url-encode данные, просто для первого раза вписывал сразу encode. Функция не копи паст, просто в \r\n форум удалил "\" dpe_x Я сначала на LWP и делал,но он дал тот же результат emmy Да, действительно, спасибо. но проблема осталась
SHiNiGaMi В первом скрипте: 1) исправить HTTP/1.0 на HTTP/1.1 2) во второй запрос добавить тот же юзер-агент, что и в первом 3) Keep-Alive пишется в нижнем регистре После этого заработает: пункт 1 - позволит получить куки из запроса, пункт 2 - позволит авторизоваться, пункт 3 - просто правильное использование протокола.