[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: yandex не открываетс curlом и fsockopen?
olgatcpip
здравствуйте.

У меня контент страницы яндекса не открывается ни через curl, ни через fsockopen
привеожу код
function get_content($url, $headers = false, $method='GET', $params='', $wait = true)
{
$response = '';

if(function_exists('curl_init'))
{ echo 'curl_init';
$ch = @curl_init();
if($ch)
{
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
if($wait)
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
else
curl_setopt($ch, CURLOPT_TIMEOUT, -1);
curl_setopt($ch, CURLOPT_LOW_SPEED_LIMIT, 2000);
curl_setopt($ch, CURLOPT_LOW_SPEED_TIME, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)');
curl_setopt($ch, CURLOPT_HEADER, $headers);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);

if ($method == 'POST')
{
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
}

if($method == 'HEAD')
curl_setopt($ch, CURLOPT_NOBODY, 1);

$response = curl_exec($ch);

@curl_close($ch);
}
else
echo('Не удалось открыть cURL с '.$url);
}

if(function_exists('fsockopen') && strlen($response) == 0)
{
echo '<br>fsockopen';
$pUrl = parse_url($url);

$fp = @fsockopen($pUrl['host'], 80, $errno, $errstr, 10);
$response = '';
if ($fp)
{
if($method == 'GET')
{
@fputs($fp, "GET ".$pUrl['path'].'?'.$pUrl['query']." HTTP/1.1\r\n");
@fputs($fp, "Host: {$pUrl['host']}\r\n");
@fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r\n");
@fputs($fp, "Referer: {$url}\r\n");
@fputs($fp, "Accept-Language: ru\r\n");
@fputs($fp, "Connection: Keep-Alive\r\n");
@fputs($fp, "\r\n");
}
elseif($method == 'POST')
{
@fputs($fp, "POST ".$pUrl['path'].'?'.$pUrl['query']." HTTP/1.1\r\n");
@fputs($fp, "Host: {$pUrl['host']}\r\n");
@fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
@fputs($fp, "Content-Length: ".strlen($params)."\r\n");
@fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r\n");
@fputs($fp, "Referer: {$url}\r\n");
@fputs($fp, "Accept-Language: ru\r\n");
@fputs($fp, "Connection: Close\r\n");
@fputs($fp, "\r\n");
@fputs($fp, $params);
}
elseif ($method == 'HEAD')
{
@fputs($fp, "HEAD ".$pUrl['path'].'?'.$pUrl['query']." HTTP/1.1\r\n");
@fputs($fp, "Host: {$pUrl['host']}\r\n");
@fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; InfoPath.2; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r\n");
@fputs($fp, "Referer: {$url}\r\n");
@fputs($fp, "Accept-Language: ru\r\n");
@fputs($fp, "Connection: Close\r\n");
@fputs($fp, "\r\n");
}

if($wait)
{
while (!@feof($fp))
$response .= @fgets($fp, 128);
}

@fclose($fp);

if (strlen($response) != 0)
{
if(!$headers)
$response = substr($response, strpos($response, "\r\n\r\n"));
}
}

else
echo '<br>--<br>'.('Не удалось открыть сокет с '.$url);
}

if($wait && strlen($response) == 0)
echo '<br>--<br>'.('Не удалось получить контент страницы.'.$url);


return $response;
}
Скрытый текст

В чем может быть дело?



Спустя 3 часа, 28 минут, 11 секунд (6.12.2009 - 11:40) Alex VoDevil написал(а):
С курлом обычно помогает постепенное усложнение smile.gif Попробуйте простой код:

$user_agent = "Mozilla/4.0+(compatible;+MSIE+5.5;+Windows+98)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://ya.ru');
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
echo $result;

А может быть у вас вообще сервер за проксей стоит?

Спустя 4 часа, 41 минута, 2 секунды (6.12.2009 - 16:21) olgatcpip написал(а):
Дело в яндексе.

'http://ya.ru' - открывает, НО
http://yandex.ru - не открывает!
http://www.yandex.ru - открывает
http://www.yandex.ru/yandsearch?pag=u&surl...ru&text=debt.ru - не открывает

Чудеса! можно ли такое обойти?

Спустя 24 минуты, 46 секунд (6.12.2009 - 16:46) Alex VoDevil написал(а):
Переадресация какая-то наверное...
Если удастся решить проблему до утра - отпишите, ок? wink.gif
Если не удастся - я утром тоже поэксперементирую и может что-то вам и подскажу.

Спустя 1 минута, 28 секунд (6.12.2009 - 16:48) Alex VoDevil написал(а):
Забыл, версию курла, если можно, - в студию! wink.gif
Посмотреть ее в phpinfo(); можно..

Спустя 28 минут, 1 секунда (6.12.2009 - 17:16) olgatcpip написал(а):
Хорошо. но я у меня уже варианты кончились

cURL support enabled
cURL Information libcurl/7.16.0 OpenSSL/0.9.8g zlib/1.2.3

Спустя 18 часов, 59 минут, 12 секунд (7.12.2009 - 12:15) Alex VoDevil написал(а):
Добрался наконец до машины на которой с курлом поэксперементировать можно.
Смотрите какая штука: То что вы говорите "не открывает" - оно просто возвращает код ответа 302 (Moved Permanently), но до этого пытается переадресовать на правильный url. Почему сервер (а точнее кластер наверняка) у яндекса так настроен - мне не ведомо, но для вас решение очень простое - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); . Эта опция говорит курлу что он должен следовать за любой переадресацией.
Т.е. вот такой код - работает:

<?php
$user_agent = "Mozilla/4.0+(compatible;+MSIE+5.5;+Windows+98)";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yandex.ru/yandsearch?pag=u&surl=debt.ru&text=debt.ru&lr=225');
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec($ch);
echo $result;
?>


Отпишите об успехах, ок?

p.s. Аватарка ваша радует wink.gif

Спустя 5 часов, 29 минут, 6 секунд (7.12.2009 - 17:44) olgatcpip написал(а):
Alex VoDevil
Спасибо большое, очень помогло! Прям расцелосать хочется rolleyes.gif

Спустя 4 часа, 10 минут, 23 секунды (7.12.2009 - 21:54) olgatcpip написал(а):
ну воооот. у меня на компе все работает, а перенесла код на др сервер,
контент такой
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>
302 Found</title>
</head><body>
<h1>
Found</h1>
<p>
The document has moved <a href="/yandsearch?text=http%3A%2F%2Fdebt.ru%2F&lr=10174">here</a>.</p>
</body></html>

только обрадовалась......

и опять пришлось вернуться к $response=file_get_contents($query); sad.gif

Спустя 15 часов, 39 минут, 16 секунд (8.12.2009 - 13:34) Alex VoDevil написал(а):
Не может быть, проверьте тот ли код перенесли на сервер. Если тот - сравните версии курла, если серверная ниже - обновите, хуже не будет.

Но вообще мне думается что вы перенесли на сервер по ошибке не тот код smile.gif

Спустя 4 часа, 44 минуты, 55 секунд (8.12.2009 - 18:18) olgatcpip написал(а):
Там обновить не могу.
у меня
libcurl/7.16.0 OpenSSL/0.9.8g zlib/1.2.3

а а посмотреть там могу
libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5


- это значительная разница?

Спустя 1 день, 20 часов, 35 минут, 59 секунд (10.12.2009 - 14:54) Alex VoDevil написал(а):
Едва ли... Проверьте всетаки тот ли код перенесли.
Еще можно поэксперементировать вот с чем: Попробуйте функции cult_setopt() местами попереставлять. У меня был случай когда установка одной диррективы затирала другую, это было признано багом и мои американские коллеги долго колдовали чтоб поправить курл на своем сервере. В итоге я просто поменял конфликтующие функции cult_setopt() местами, и помогло.

Спустя 1 час, 18 минут, 26 секунд (10.12.2009 - 16:13) olgatcpip написал(а):
Спасибо за советы smile.gif

Спустя 32 минуты, 45 секунд (10.12.2009 - 16:46) Alex VoDevil написал(а):
Ну об успехах то отпишитесь, ок?

Спустя 1 месяц, 16 дней, 5 часов, 18 минут, 23 секунды (26.01.2010 - 22:04) bazzjr написал(а):
Добрый день.

Скажите пожалуйста, а возможно ли посредством fsockopen() сделать тоже самое:
" CURLOPT_FOLLOWLOCATION, 1); . Эта опция говорит курлу что он должен следовать за любой переадресацией. " ???

Или только CURL ???


_____________
Ласковое слово и кошке приятно... Плюсик в карму сойдет wink.gif
*smarty дока - новая любовь
Моё рукотворение ругайте, хвалите smile.gif
Веду маленький блог
в этом блоге публикую новые работы
WMR217126627282 wink.gif

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.