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

Тема в разделе "Как сделать...", создана пользователем Pashka Korchagin, 21 дек 2015.

  1. Pashka Korchagin

    Pashka Korchagin Постоялец

    Регистр.:
    23 дек 2009
    Сообщения:
    110
    Симпатии:
    7
    Проблема со скриптом парсера погоды в 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($chCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($chCURLOPT_BINARYTRANSFERtrue);
    curl_setopt($chCURLOPT_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, базу - все верно.

    Понимаю что вводных данных маловато, но может посоветуете куда копать. Повторюсь, скрипт рабочий, видел живой пример в настоящем времени, без доработок и изменений в коде.
     
    Последнее редактирование модератором: 21 дек 2015
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.547
    Симпатии:
    1.419
    404 яндекс вернёт если неверный $city_id
     
  3. Pashka Korchagin

    Pashka Korchagin Постоялец

    Регистр.:
    23 дек 2009
    Сообщения:
    110
    Симпатии:
    7
    Это я в первую очередь проверил, использовал 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)';
    Покопался с аналогичным скриптом, та же проблема, не работает запрос: http://export.yandex.ru/weather-ng/forecasts/27502.xml

    Код:
    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 
    Айпи менял, у других запрос работает, что не так может быть в настройках сервера?
     
    Последнее редактирование модератором: 22 дек 2015
  4. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    526
    Симпатии:
    248
    как ты ip менял? по прокси курл подключал?
     
  5. Pashka Korchagin

    Pashka Korchagin Постоялец

    Регистр.:
    23 дек 2009
    Сообщения:
    110
    Симпатии:
    7
    Хостинг 1gb, у них два датацентра. Версия PHP 5.5 на прежнем сервере была 5.4, PHP simplexml включено. Засада. :conf:
     
  6. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    526
    Симпатии:
    248
    Что то я не понял, ты пробовал через прокси подключится?
    curl_setopt($ch, CURLOPT_PROXY,'66.96.200.39:80');
     
    Pashka Korchagin нравится это.
  7. Pashka Korchagin

    Pashka Korchagin Постоялец

    Регистр.:
    23 дек 2009
    Сообщения:
    110
    Симпатии:
    7
    Пришлось поизучать мануалы, хоть это и не мое. Вопрос решил так:
    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($chCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($chCURLOPT_BINARYTRANSFERtrue);
    curl_setopt($chCURLOPT_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 айпишник моего виртуального хоста.

    Прошу кого-нибудь объяснить суть, почему на данном хостинге скрипт не работал без подстановки айпишника???
     
  8. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    250
    Симпатии:
    145
    Неверный адрес туда подставлялся, видимо. Например, который не имеет выхода в сеть.
     
    Pashka Korchagin нравится это.
  9. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    526
    Симпатии:
    248
    CURLOPT_INTERFACE испoльзуется для задaния исхoдящего сeтeвого интeрфейса. Т.e. этo oпция укaзывается в тoм случае, eсли у вaс на кoмпьютере нeсколько сeтeвых кaрт, например, и вы хотите сообщить cURL'у через какую именно необходимо устанавливать соединение. Может указав адрес соединение через другой ip произошло, не тот что по умолчанию.
     
    Pashka Korchagin нравится это.
  10. anadikt

    anadikt

    Регистр.:
    29 янв 2010
    Сообщения:
    408
    Симпатии:
    63