|
|
|
| Здравствуйте.
В общем делаю небольшой парсер яндекса на сокетах.
Вот функция которую я наваял:
function sok_get_url( $url, $source_ip, $referer = '', $cookies = '' )
{
$parse_url = parse_url( $url );
$hostname = $parse_url['host'];
$path = $parse_url['path'];
$query = $parse_url['query'];
$request = iconv( "windows-1251", "utf-8", $path . '?' . $query );
$destination_ip = gethostbyname( $hostname );
$headers .= "GET {$request} HTTP/1.0\r\n";
$headers .= "Host: {$hostname}\r\n";
$headers .= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n";
$headers .= "Accept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n";
$headers .= "Accept-Encoding: deflate\r\n";
$headers .= "Accept-Language: ru,en;q=0.9\r\n";
$headers .= "Referer: {$referer}\r\n";
$headers .= "User-Agent: Opera/9.23 (Windows NT 5.1; U; ru)\r\n";
$headers .= "Cookie: {$cookies}\r\n";
$headers .= "Connection: Close\r\n\r\n";
if ( !$sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP ) ) die( socket_strerror( socket_last_error() ) );
if ( !socket_bind( $sock, $source_ip ) ) die( socket_strerror( socket_last_error() ) );
if ( !socket_connect( $sock, $destination_ip, 80 ) ) die( socket_strerror( socket_last_error() ) );
if ( !socket_write( $sock, $headers ) ) die( socket_strerror( socket_last_error() ) );
while( $row = socket_read( $sock, 2048 ) )
{
$out .= $row;
}
socket_close( $sock );
// Обрабатываем заголовки
preg_match( "/^(.*)\r\n\r\n/isU", $out, $match );
$head = explode( "\r\n", $match[1] );
for($i=0; $i<count($head); $i++)
{
// Получаем куки
if( strtolower( substr( $head[$i], 0, 12 ) ) == 'set-cookie: ' )
$result['cookies'] .= substr( $head[$i], 12, strpos( $head[$i], ";" )-12 ) . ";";
// Обрабатываем редирект
if( strtolower( substr( $head[$i], 0, 10 ) ) == 'location: ' )
return sok_get_url( substr( $head[$i], 10 ), $source_ip, $url, $result['cookies'] );
}
$result['content'] = preg_replace( "/^(.*\r\n\r\n)/isU", "", $out );
return $result;
}
|
Фишка в том что на сервере несколько IP, и сокеты позволяют делать запросы с разных IP в то время как cURL и все остальное обращается всегда с одного, главного IP сервера.
Что я делаю, сначала стучусь просто на морду яндекса как обычный юзер в браузере и получаю куки.
$ip = 'IP адрес моего сервера для исходящего запроса';
// стучимся за куками
$get1 = sok_get_url( 'http://yandex.ru/', $ip );
|
Далее я стучусь уже в поиск яндекса, и сую ему полученные куки с предыдущего запроса, а также реферер
$request = "http://yandex.ru/yandsearch?text={$text}&clid=1917061&lr=0";
$get2 = sok_get_url( $request, $ip, 'http://yandex.ru/', $get1['cookies'] );
|
В ответ на это я сразу получаю страницу с капчей и надписью о том что в вашем браузере отключены куки!?!
Но почему отключены? Ведь я принял куки и отправил их ему обратно. Что я делаю не так?
Помогите, уже моск сломал ((( | |
|
|
|
|
|
|
|
для: kodges
(24.02.2013 в 09:20)
| | Вдогонку...
Сейчас проверил куки в браузере и с удивлением обнаружил что браузер получает и отправляет гораздо больше кукисов чем скрипт. Отсюда вопрос, почему скрипт не получает всех кукисов? Причем пробовал и на cURL, аналогично, cURL сохраняет в файл далеко не все кукисы по сравнению с браузером при точно таком же запросе.
Возможно ли что яндекс часть кукисов ставит каким то другим способом? Яваскриптами например? Хотя с другой стороны каким бы способом их не ставили, все они должны присутствовать в заголовках ответа сервера, разве нет?
Есть у кого мысли по данному вопросу? | |
|
|
|
|
|
|
|
для: kodges
(24.02.2013 в 10:21)
| | каким бы способом их не ставили, все они должны присутствовать в заголовках ответа сервера, разве нет?
не уверен, но думаю что нет | |
|
|
|
|
|
|
|
для: Valick
(24.02.2013 в 10:56)
| | Да вы абсолютно правы!
Провел ряд тестов и убедился что куки установленные яваскриптом не присутствуют в загловках ответа сервера. А также убедился что если взять все нужные куки из браузера и отправить в запросе, то никакой капчи, никаких пролем...
Теперь весь вопрос сводится к одному. Как средствами PHP получить все кукисы, чем бы они не были установлены, яваскриптом перлом и т.д... | |
|
|
|
|
|
|
|
для: kodges
(24.02.2013 в 11:13)
| | получить их не проблема, проблема их установить, честно скажу никогда не занимался в данном направлении, но подозреваю, что это один из способов защиты от скриптов подобных вашему
хотя скорее всего есть полная эмуляция работы браузера средствами серверных языков, в конце концов компьютер это единица и ноль :) | |
|
|
|
|
|
|
|
для: Valick
(24.02.2013 в 12:11)
| | Как раз установить то их не проблема. Я руками взял скопировал куки из браузера, прописал в скрипт и передал, и яндекс даже не пикнул ничего против.
Если вы знаете как получить на php куки отправленные через JS, скажите пожалуйста. Я вот уже пол интернета прогуглил но ничего не нашел. И честно говоря не представляю как это можно сделать. | |
|
|
|
|
|
|
|
для: kodges
(24.02.2013 в 12:25)
| | Я руками взял скопировал куки из браузера
вот именно вы их типа установили руками
по запросу эмуляция браузера на php гуглили? | |
|
|
|
|
|
|
|
для: kodges
(24.02.2013 в 12:25)
| | Если вы знаете как получить на php куки отправленные через JS
их надо искать в теле документа а не в заголовках | |
|
|
|
|
|
|
|
для: Valick
(24.02.2013 в 12:42)
| | Нету их в теле документа. Просто потому что там яваскрипт который подгружает что-то еще с сервера, то в свою очередь подгружает что-то еще и т.д... и где то там глубоко в ж*пе выполняется установка кукисов. Браузер то это дело обрабатывает нормально. Загрузил все, построил дом поставил кукисы... А вот как быть в этом случае с PHP пока не знаю...
На ум приходит только одна мысль, найти какой то консольный линуксовый клиент понимающий JS, и через exec скидывать ему урл страницы и получать в ответ заголовки со всеми куками.
Но exec и ему подобные это лишняя дырка в безопасности сервера ((( | |
|
|
|
|
|
|
|
для: kodges
(24.02.2013 в 09:20)
| | По сути вот решение моего вопроса http://anosov.org.ru/2012/01/htmlunit-for-indexing-javascript/
Вот только приведенный по ссылке пример возвращает голый исходник страницы без заголовков.
Есть тут кто может помочь допилить этот вариант чтобы в ответ возвращались все установленные куки? К сожалению я сам мало что понимаю в программировании на Java и Eclipse о которых пишется в статье. | |
|
|
|