Получение кода ошибки 28 с помощью cURL - PullRequest
3 голосов
/ 13 июля 2011

ЭТО БЫЛО РЕШЕНО - СМОТРИТЕ ОТВЕТ НА КОНЦЕ ЭТОГО ПОЧТЫ

Я пытаюсь получить данные с удаленного сервера, используя PHP / cURL

Если явставьте следующий URL в браузер, данные вернутся правильно.

http://realm103.c7.castle.wonderhill.com/api/map.json?user%5Fid=5245274&x=375&y=375&timestamp=1310554325&%5Fsession%5Fid=5b2070a46a083a33e053d60dbc2d062e&dragon%5Fheart=098d2deb0a37f18c97428d636c456572f9bade24&version=3

Однако, когда я пытаюсь получить доступ, если с помощью PHP / cURL он просто отключается (код ошибки 28).

$json = curl($jsonurl, $realm['intRealmID'], $realm['strRealmServer']);

function curl($url, $realm, $realmServer){
$header = array();
$header[] = 'Host: realm'.strval($realm).'.'.$realmServer.'.castle.wonderhill.com';
$header[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$header[] = 'Accept-Language: en-us,en;q=0.5';
$header[] = 'Accept-Encoding: gzip,deflate';
$header[] = 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7';
$header[] = 'Connection: keep-alive';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0');
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
return curl_exec($ch);
curl_close($ch);

}

У кого-нибудь есть идеи, почему он работает из браузера, а не через cURL?Спасибо

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ, хотя cURL не работает для указанного выше URL.Для URL ниже это работает просто отлично.Единственное отличие - сервер, с которого запрашиваются данные.Сами данные и POST идентичны.

http://realm4.c5.castle.wonderhill.com/api/map.json?user%5Fid=1053774&x=375&y=375&timestamp=1310616808&%5Fsession%5Fid=5b2070a46a083a33e053d60dbc2d062e&dragon%5Fheart=f35f476facab91f0e901eaf2209a0c8a9b9bedcc&version=3

ОТВЕТ

Наконец вернемся к этому и обнаружим, что проблема была в реферере.Сервер ожидал, что в заголовке запроса не будет реферера.Когда это было сделано, запрос был заблокирован.Такое поведение, вероятно, не было согласованным на всех серверах в то время, но сейчас оно есть.Удаление реферера из заголовка запроса и оставление всего остального теперь работает.

Ответы [ 2 ]

1 голос
/ 13 июля 2011

попробуйте это

function get_data($url)
 {
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
 }

 $returned_content = get_data('your url');

В качестве альтернативы, вы можете использовать функцию file_get_contents удаленно, но многие хосты не допускают этого

$userAgent = ‘Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0’;
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);

Некоторые другие опции, которые я использую:

curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

попробуйте это:

 $ctx = stream_context_create( array(
                 'socket' => array(
                             'bindto' => '192.168.0.107:0',
    )
   ));

   $c= file_get_contents('http://php.net', 0, $ctx);
1 голос
/ 13 июля 2011

Самое большое различие между вашей функцией cURL и непосредственным запросом информации - это свойство CURLOPT_HEADER, я сначала попытался бы удалить это из кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...