CuRL не захватывает содержимое этого URL-адреса XML? - PullRequest
0 голосов
/ 07 января 2010
<?
$request_url = 'http://www.betjamaica.com/livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME';
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
print "<textarea rows='10' cols='80'>";
print htmlentities($data);
print "</textarea>";
exit();
?>

Это не дает результатов в текстовой области, но должно быть. Другие каналы работают нормально.

Ответы [ 2 ]

3 голосов
/ 07 января 2010

У вас есть опечатка там. Попробуйте

print htmlentities($data);

вместо

print htmlentities($date);

Кроме того, было бы целесообразно повернуть error_reporting до такого уровня, который сообщит вам, если вы попытаетесь использовать переменные, которые не существуют. Вы можете сделать это, используя:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

E_NOTICE уровень сообщений об ошибках выдаст предупреждение об использовании неинициализированных переменных.

0 голосов
/ 08 января 2010

Вот пошаговое руководство по устранению проблем с очисткой страниц при помощи cURL:

  1. Попробуйте URL-адрес в браузере (с LiveHTTPHeaders) и в cURL с включенной CURLOPT_VERBOSE.Это служит двум целям: выявление заголовков HTTP в игре и простая проверка самого URL.
  2. Если он работает в браузере, но не в cURL, работайте с cURL, пока заголовки HTTP не cURLemits соответствуют браузеру.

Давайте попробуем это с вашим примером.

URL, который вы указали, работает в браузере, однако ...

При включении CURLOPT_VERBOSE выдаетсяследующее:

* About to connect() to www.betjamaica.com port 80
*   Trying 72.52.5.34... * connected
* Connected to www.betjamaica.com (72.52.5.34) port 80
> GET /livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME HTTP/1.1
Host: www.betjamaica.com
Accept: */*

* Empty reply from server
* Connection #0 to host www.betjamaica.com left intact
* Closing connection #0

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

Здесь я просто скопировал и вставил заголовки моего запроса Firefox в PHP:

$request_url =
'http://www.betjamaica.com/livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME';
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-us,en;q=0.5',
'Accept-Encoding: gzip,deflate',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Keep-Alive: 300',
'Connection: keep-alive',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec($ch);
curl_close($ch);
var_dump($data);

И это работает.Немного больше экспериментов показывает, что все заголовки, кроме User-Agent, могут быть удалены:

$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16)',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

И вот вы, очевидно: этот сервер IIS отказывается обслуживать любые запросы без User-Agent.Добавьте один, и все готово.

...