Консультация № 181776
07.01.2011, 14:37
65.73 руб.
0 9 2
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Необходим скрипт удаленной авторизации и в последствии выпрямления ссылок на http://turbobit.net и http://depositfiles.com через fsockets
Прилагаю код моего скрипта и лог перехвата HTTP заголовков в приложении к данному вопросу.

Проблема в том что из перехваченных HTTP заголовков видно, что тип соединения везде идет Connection: Keep-Alive, TE то есть держать соединение при установленном подключении к серверу, а у меня почему то выскакивает ошибка Fatal error: Maximum execution time of 30 seconds exceeded при первом запросе. Когда выставляю на отправку тип соединения Connection: Close уходит первый заголовок и возвращает страницу, но следующая отправка POST заголовка на авторизацию не возвращает никакого результата. Получается что дело в типе соединения которое я не могу установить в режим Keep-Alive, я пробовал указывать таймаут для Keep-Alive:300 ничего не происходит результат тот же Fatal error: Maximum execution time of 30 seconds exceeded

Прошу помочь мне в данном вопросе так как знаю что, эмуляция браузера а конкретнее - удаленная авторизация на эти файло-обменники существует, вопрос правильном алгоритме и времени, ответ на мой вопрос в виде готового решения есть тут на turbobit.net и тут на Depositfiles.com мне необходимо сделать тоже самое.

Приложение:
При авторизации через браузер перехватом http заголовков был выявлен следующий принцип:
1) отправка заголовка на сервер:

GET / HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.7.62 Version/11.00
Host: turbobit.net
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru,en;q=0.9,ru-RU;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://turbobit.net/
Cache-Control: no-cache
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers

2) в ответе от сервера приходит заголовок содержащий cookie:

HTTP/1.1 200 OK
Date: Thu, 06 Jan 2011 16:34:53 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: Apache/2.2.17 (FreeBSD)
X-Powered-By: PHP/5.2.14
Set-Cookie: kohanasession=d16c772b0926afd04a85670629dae3e6; expires=Thu, 06-Jan-2011 18:34:52 GMT; path=/
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
Set-Cookie: kohanasession=90bbb2d52293a13a913072d4f094b069f62fb7bb%7Ed16c772b0926afd04a85670629dae3e6; expires=Thu, 06-Jan-2011 18:34:52 GMT; path=/
Set-Cookie: compid=bebabc553195346efb17889e123617d3f47dced5%7E0C3027455A6243D06C391D20EB2B7D04; expires=Fri, 06-Jan-2012 16:34:52 GMT; path=/
Content-Encoding: gzip

3) при заполнении формы авторизации и нажатии кнопки "Войти" на сервер отправляется заголовок с cookie полученными в ответе на первый заголовок:

POST /user/login HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.7.62 Version/11.00
Host: turbobit.net
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru,en;q=0.9,ru-RU;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Referer: http://turbobit.net/
Cookie: kohanasession=90bbb2d52293a13a913072d4f094b069f62fb7bb%7Ed16c772b0926afd04a85670629dae3e6; compid=bebabc553195346efb17889e123617d3f47dced5%7E0C3027455A6243D06C391D20EB2B7D04; __utmz=1.1294331720.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=1.557309744.1294331720.1294331720.1294331720.1; __utmc=1; __utmb=1.1.10.1294331720
Cookie2: $Version=1
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers
Content-Length: 103
Content-Type: application/x-www-form-urlencoded

user%5Blogin%5D=amd12%40mail.ru&user%5Bpass%5D=zyvurara&user%5Bsubmit%5D=%D0%92%D0%BE%D0%B9%D1%82%D0%B8

4) в ответ приходит заголовок с установленным sid=5c350a3d16beab23825fa60dcd61b7b0625f6280%7E025af2fbf26393b493de4c1566b56a4d

Date: Fri, 07 Jan 2011 11:09:20 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Server: Apache/2.2.16 (FreeBSD)
X-Powered-By: PHP/5.2.14
Set-Cookie: kohanasession=8e03f82cff3de9516caf9fb8a7634025; expires=Fri, 07-Jan-2011 13:09:20 GMT; path=/
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
Set-Cookie: kohanasession=966a8dd1d780909c84e6df7c3c69fb38645dda7c%7E8e03f82cff3de9516caf9fb8a7634025; expires=Fri, 07-Jan-2011 13:09:20 GMT; path=/
Set-Cookie: sid=5c350a3d16beab23825fa60dcd61b7b0625f6280%7E025af2fbf26393b493de4c1566b56a4d; expires=Sat, 08-Jan-2011 11:11:00 GMT; path=/
location: http://turbobit.net/
Content-Length: 0

5) далее запрос корневой страницы сайта и ответ страницы с успешной авторизацией:

GET / HTTP/1.1
Host: turbobit.net
Connection: keep-alive
Referer: http://turbobit.net/
Cache-Control: max-age=0
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Cookie: compid=8387d32d982eac6c4172d3c1bf193d829d708271%7E6BACB6EFF75E009DA02D12C21908ADD8; __utmz=1.1294398300.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=1.2107817033.1294398300.1294398300.1294398300.1; __utmc=1; __utmb=1.1.10.1294398300; kohanasession=966a8dd1d780909c84e6df7c3c69fb38645dda7c%7E8e03f82cff3de9516caf9fb8a7634025; sid=5c350a3d16beab23825fa60dcd61b7b0625f6280%7E025af2fbf26393b493de4c1566b56a4d

HTTP/1.1 200 OK
Date: Fri, 07 Jan 2011 11:09:20 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: Apache/2.2.16 (FreeBSD)
X-Powered-By: PHP/5.2.14
Set-Cookie: kohanasession=8e03f82cff3de9516caf9fb8a7634025; expires=Fri, 07-Jan-2011 13:09:20 GMT; path=/
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
Set-Cookie: kohanasession=966a8dd1d780909c84e6df7c3c69fb38645dda7c%7E8e03f82cff3de9516caf9fb8a7634025; expires=Fri, 07-Jan-2011 13:09:20 GMT; path=/
Content-Encoding: gzip
<html>
... (тело документа)
</html>

мой код:
<?php
$socket = fsockopen('www.turbobit.net', 80, $errno, $errstr, 30);

if(!$socket)die("$errstr($errno)");
fwrite($socket, "GET / HTTP/1.1\r\n");
fwrite($socket, "Host: turbobit.net\r\n");
fwrite($socket, "Connection: keep-alive\r\n");
fwrite($socket, "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
fwrite($socket, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10\r\n");
fwrite($socket, "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n");
fwrite($socket, "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n\r\n");

//теперь читаем и выводим ответ
$answer = '';
while(!feof($socket)){
$answer.= fgets($socket, 4096);
}
$answer = mb_convert_encoding($answer, "windows-1251", "UTF-8");
//fclose($socket);
preg_match_all("|Set-Cookie:(.*?)=(.*?)\;|si",$answer,$cookie);
echo '<pre style="text-align:left;">';
echo 'массив куки документа

';
print_r($cookie);
print_r($_COOKIE);
echo $answer;
echo '</pre>';
fwrite($socket, "POST /user/login HTTP/1.1\r\n");
fwrite($socket, "Host: turbobit.net\r\n");
fwrite($socket, "Connection: Keep-Alive\r\n");
fwrite($socket, "Referer: http://turbobit.net/\r\n");
fwrite($socket, "Content-Length: 103\r\n");
fwrite($socket, "Cache-Control: max-age=0\r\n");
fwrite($socket, "Origin: http://turbobit.net\r\n");
fwrite($socket, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($socket, "Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
fwrite($socket, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10\r\n");
fwrite($socket, "Accept-Encoding: gzip,deflate,sdch\r\n");
fwrite($socket, "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n");
fwrite($socket, "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n");
fwrite($socket, "Cookie: kohanasession=".$cookie[2][1]."; compid=".$cookie[2][2]."; __utmz=".$_COOKIE['__utmz']."; __utma=".$_COOKIE['__utma']."; __utmc=".$_COOKIE['__utmc']."; __utmb=".$_COOKIE['__utmb']."\r\n");
fwrite($socket, "user%5Blogin%5D=amd12%40mail.ru&user%5Bpass%5D=zyvurara&user%5Bsubmit%5D=%D0%92%D0%BE%D0%B9%D1%82%D0%B8\r\n\r\n");
$answer = '';
while(!feof($socket)){
$answer.= fgets($socket, 4096);
}
//$answer = mb_convert_encoding($answer, "windows-1251", "UTF-8");
echo '---------------------------------------------------

';
echo $answer;
fwrite($socket,"GET / HTTP/1.1\r\n");
fwrite($socket,"Host: turbobit.net\r\n");
fwrite($socket,"Connection: keep-alive\r\n");
fwrite($socket,"Referer: http://turbobit.net/\r\n");
fwrite($socket,"Cache-Control: max-age=0\r\n");
fwrite($socket,"Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
fwrite($socket,"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10\r\n");
fwrite($socket,"Accept-Encoding: gzip,deflate,sdch\r\n");
fwrite($socket,"Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n");
fwrite($socket,"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n");
fwrite($socket,"Cookie: compid=".$cookie[2][2]."; __utmz=1.1294398300.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=1.2107817033.1294398300.1294398300.1294398300.1; __utmc=1; __utmb=1.1.10.1294398300; kohanasession=".$cookie[2][1].";\r\n\r\n");
$answer = '';
while(!feof($socket)){
$answer.= fgets($socket, 4096);
}
//$answer = mb_convert_encoding($answer, "windows-1251", "UTF-8");
echo '---------------------------------------------------

';
echo $answer;
fclose($socket);
?>

Обсуждение

Неизвестный
07.01.2011, 20:12
общий
это ответ
Здравствуйте, Черных Максим Владимирович!
Ошибка Fatal error: Maximum execution time of 30 seconds exceeded проявляется тогда когда php-скрипт выполняется больше, чем ему разрешено в конфигурации php. За это в файле php.ini отвечает параметр max_execution_time.
Параметр указывает максимальную продолжительность выполнения сценария (в секундах). По истечении указанного срока сценарий автоматически завершается, что помогает бороться с чрезмерными затратами процессорного времени на выполнение пользовательских сценариев. По умолчанию параметр равен 30 секундам.

Для увеличения максимального времени исполнения скрипта есть несколько способов:
1) Если у вас есть доступ к php.ini, то в нем измените параметр max_execution_time на нужное вам время.
2) В самом начале вашего скрипта добавьте строки
Код:
<?php ini_set("max_execution_time", "60"); ?>

или

<?php set_time_limit (60); ?>

3) Создайте в корне вашего сайта файл .htaccess с таким содержимым:
Код:
php_value max_execution_time 60

4) Если ничего не помогает, то обратитесь к администратору хостинга и попросите увеличить время выполнения PHP-скриптов.
Удачи!!!
Неизвестный
07.01.2011, 21:36
общий
Ну дак увеличивая время скрипта проблема не решается, соединение все равно не проходит хоть через 30 хоть через 120 секунд, тут ведь понимаете дело в том что с Coonection: Close сервер отвечает, а с Connection: Keep-Alive зависает и все тут...
Проблема в том что не удается мне с эмулировать работу браузера через сокеты на php для turbobit'a
давно
Студент
15716
139
07.01.2011, 22:51
общий
это ответ
Здравствуйте, Черных Максим Владимирович!

эта ошибка связанна с максимальным временем выполнения php скрипта подробнее
Неизвестный
08.01.2011, 04:08
общий
а какая вообще поставлена задача?
сделать автоматическую качалку с файлообменников?
Неизвестный
08.01.2011, 11:12
общий
Задача ясно изложена вторым предложением моего поста:
Необходим скрипт удаленной авторизации и в последствии выпрямления ссылок на http://turbobit.net и http://depositfiles.com через fsockets
Неизвестный
08.01.2011, 13:19
общий
fsockopen() по умолчанию создает сокет в блокирующем режиме
вот из за этого блокирования и превышается макс. время выполнения при вызове fgets()
здесь в примере fgets() запрашивает данные блоками по 4Кб
попробуйте перевести сокет в non-blocking mode
или уменьшить размер блока
Неизвестный
08.01.2011, 15:13
общий

Размер блока уменьшил до 128 байт, результат такой же, в режим блокирования сокетов перевести не могу, почему то ругается на вызов не объявленной функции:
Call to undefined function socket_set_nonblock()
Неизвестный
08.01.2011, 15:50
общий
возможно, админ отключил эту функцию
попробуйте stream_set_blocking()
Неизвестный
08.01.2011, 18:39
общий
Уважаемый у меня вообще такие мысли по этому поводу, раз обычным клиентом, в моем случае chrome время на авторизацию на сайте ограничивается только скоростью моего соединения с интернетом, ТО значит и правильно отправляя заголовки на уровне сокетов можно тоже добиться мгновенной авторизации? А вообще отправляя таким образом заголовки закрывать соединение после первой отправки нужно или нет?
я делаю так:
$fs = fsockopen() // открыл соединение
fwrite($fs, 'GET / HTTP/1.1\r\n'); // отправляю первый заголовок
fwrite($fs, 'host: сервер') // и так далее в общем заполняю заголовок
// потом получаю ответ
while(!feof($socket)){
$answer.= fgets($socket, 128);
}

// вытаскиваю куки и тд...
fclose() закрываю сокет,
// открываю новый сокет для второго пакета:
$fs = fsockopen() // и дальше все как в первом пакете....
Так делают или сокет не закрывают?
Форма ответа