Проблема со скриптом парсера погоды в xml

Pashka Korchagin

Постоялец
Регистрация
23 Дек 2009
Сообщения
113
Реакции
8
Проблема со скриптом парсера погоды в xml файл с Яндекса.

Скрипт работает по крону, запрос подается так:
PHP:
<?php
class onPogodaCronPogw extends cmsAction {
public function run(){
$options = $this->loadOptions($this->name);
$sources_list = $options['cod_sity'];   
$controller = cmsCore::getController('pogoda');
$city_id = $sources_list; // id города
$url = 'http://export.yandex.ru/weather-ng/forecasts/'.$city_id.'.xml';
$userAgent = 'Googlebot/2.1 (+http://www.google.com/bot.html)';
$xml = $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'/cache/weather_'.$city_id.'.xml';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
$output = curl_exec($ch);
$fh = fopen($xml, 'w');
fwrite($fh, $output);
fclose($fh);
return true;
}
}
Полученные данные сохраняются в файле weather_ххххх.xml, с которого забираются в виджет.
Скрипт рабочий, но в данном конкретном случае что-то не срабатывает, получаем 404 и неверную кодировку:
HTML:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "[URL]http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/URL]">
<html xmlns="[URL]http://www.w3.org/1999/xhtml[/URL]" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>
Первая строка должна быть такой: <?xml version="1.0" encoding="utf-8"?>

Не программист и это хреново, автор скрипта пропал.

404- документ не найден, хотя запрос вроде бы верный, и самое главное: Откуда берется кодировка iso-8859-1 вместо utf-8??? Пересмотрел кодировку всех файлов скрипта - utf8 без bom, базу - все верно.

Понимаю что вводных данных маловато, но может посоветуете куда копать. Повторюсь, скрипт рабочий, видел живой пример в настоящем времени, без доработок и изменений в коде.
 
Последнее редактирование модератором:
404 яндекс вернёт если неверный $city_id
 
404 яндекс вернёт если неверный $city_id
Это я в первую очередь проверил, использовал id крупнейших городов России.

И запрос так пробовал:
Код:
$city_id = 27612; // id Москвы
$url = 'http://export.yandex.ru/weather-ng/forecasts/'.$city_id.'.xml';
$userAgent = 'Googlebot/2.1 (+http://www.google.com/bot.html)';

Покопался с аналогичным скриптом, та же проблема, не работает запрос: Для просмотра ссылки Войди или Зарегистрируйся

Код:
Warning: simplexml_load_file(http://export.yandex.ru/weather-ng/forecasts/27502.xml): failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found in /home/virtwww/w_***-com_640e1a71/http/templates/default/widgets/pogoda/pogoda.tpl.php on line 4 Warning: simplexml_load_file(): I/O warning : failed to load external entity "http://export.yandex.ru/weather-ng/forecasts/27502.xml" in /home/virtwww/w_***-com_640e1a71/http/templates/default/widgets/pogoda/pogoda.tpl.php on line 4

Айпи менял, у других запрос работает, что не так может быть в настройках сервера?
 
Последнее редактирование модератором:
Покопался с аналогичным скриптом, та же проблема, не работает запрос: Для просмотра ссылки Войди или Зарегистрируйся

Код:
Warning: simplexml_load_file(http://export.yandex.ru/weather-ng/forecasts/27502.xml): failed to open stream: HTTP request failed! HTTP/1.0 404 Not Found in /home/virtwww/w_***-com_640e1a71/http/templates/default/widgets/pogoda/pogoda.tpl.php on line 4 Warning: simplexml_load_file(): I/O warning : failed to load external entity "http://export.yandex.ru/weather-ng/forecasts/27502.xml" in /home/virtwww/w_***-com_640e1a71/http/templates/default/widgets/pogoda/pogoda.tpl.php on line 4

Айпи менял, у других запрос работает, что не так может быть в настройках сервера?
как ты ip менял? по прокси курл подключал?
 
Хостинг 1gb, у них два датацентра. Версия PHP 5.5 на прежнем сервере была 5.4, PHP simplexml включено. Засада. :conf:
Что то я не понял, ты пробовал через прокси подключится?
curl_setopt($ch, CURLOPT_PROXY,'66.96.200.39:80');
 
Что то я не понял, ты пробовал через прокси подключится?
curl_setopt($ch, CURLOPT_PROXY,'66.96.200.39:80');
Пришлось поизучать мануалы, хоть это и не мое. Вопрос решил так:
PHP:
$options = $this->loadOptions($this->name);
$sources_list = $options['cod_sity'];  
$controller = cmsCore::getController('pogoda');
$city_id = $sources_list; // id города
$url = 'http://export.yandex.ru/weather-ng/forecasts/'.$city_id.'.xml';
$userAgent = 'Googlebot/2.1 (+http://www.google.com/bot.html)';
$xml = $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'/cache/weather_'.$city_id.'.xml';
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_INTERFACE,$_SERVER["SERVER_ADDR"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
$output = curl_exec($ch);
$fh = fopen($xml, 'w');
fwrite($fh, $output);
fclose($fh);

Добавлена строка:
Код:
curl_setopt($ch,CURLOPT_INTERFACE,$_SERVER["SERVER_ADDR"]);
SERVER_ADDR айпишник моего виртуального хоста.

Прошу кого-нибудь объяснить суть, почему на данном хостинге скрипт не работал без подстановки айпишника???
 
Пришлось поизучать мануалы, хоть это и не мое. Вопрос решил так:
PHP:
$options = $this->loadOptions($this->name);
$sources_list = $options['cod_sity']; 
$controller = cmsCore::getController('pogoda');
$city_id = $sources_list; // id города
$url = 'http://export.yandex.ru/weather-ng/forecasts/'.$city_id.'.xml';
$userAgent = 'Googlebot/2.1 (+http://www.google.com/bot.html)';
$xml = $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'/cache/weather_'.$city_id.'.xml';
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_INTERFACE,$_SERVER["SERVER_ADDR"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
$output = curl_exec($ch);
$fh = fopen($xml, 'w');
fwrite($fh, $output);
fclose($fh);

Добавлена строка:
Код:
curl_setopt($ch,CURLOPT_INTERFACE,$_SERVER["SERVER_ADDR"]);
SERVER_ADDR айпишник моего виртуального хоста.

Прошу кого-нибудь объяснить суть, почему на данном хостинге скрипт не работал без подстановки айпишника???
Неверный адрес туда подставлялся, видимо. Например, который не имеет выхода в сеть.
 
CURLOPT_INTERFACE испoльзуется для задaния исхoдящего сeтeвого интeрфейса. Т.e. этo oпция укaзывается в тoм случае, eсли у вaс на кoмпьютере нeсколько сeтeвых кaрт, например, и вы хотите сообщить cURL'у через какую именно необходимо устанавливать соединение. Может указав адрес соединение через другой ip произошло, не тот что по умолчанию.
 
Сейчас у яндекса Для просмотра ссылки Войди или Зарегистрируйся выдает 404 ошибку, они перенесли в другое место данные экспорта?
 
Назад
Сверху