Перестал работать парсер погоды с Яндекса

парсер заработал, файл кэш создается и из него подгружает данные - спасибо огромное за помощь! теперь вопросик такой: парсер дергает данные из informer, но там три температуры сегодня, ночью и завтра, скрипт дергает первую (today), а мне нужно вторую (night) ... как это можно сделать? заранее благодарен
Код:
<?php
$xml = 'http://export.yandex.ru/weather-ng/forecasts/29838.xml';  //адрес

$tomorrow = simplexml_load_file($xml); //пыдыщ


foreach ($tomorrow->informer as $informer)
{
      $temp = $informer->temperature; //выводим температуру

      echo 'ночью: <span class="color_black"><span style="font-size:14px;">';
      echo $temp;
      echo '</span>°</span>';
}
?>

<temperature color="F9EBB9" type="today">26</temperature>
<temperature color="F6F3D6" type="night">16</temperature>
<temperature color="F9E8B1" type="tomorrow">27</temperature>
 
PHP:
foreach ($informer->temperature as $t){
if ($t['type'] == 'night')
$temp = $t;
}
 
может кто подскажет, толи у меня у одного сайт не парсит погоду, толи проблема у яндекса, страница с xml данными не открывается, либо открывается через несколько раз ...

Скрытое содержимое доступно для зарегистрированных пользователей!


вроде стабильно работает, по-крайней мере у меня...

адрес Для просмотра ссылки Войди или Зарегистрируйся - открывается каждый раз и без проблем?

п.с. пробую открыть через другие сайты, тоже не открывается
Снимок.PNG

адрес Для просмотра ссылки Войди или Зарегистрируйся - открывается каждый раз и без проблем?

п.с. пробую открыть через другие сайты, тоже не открывается
Снимок.PNG
нет, наврал, страница закэширована была, действительно работает через раз..
иногда выдает Сайт export.yandex.ru не отправил данных
 
Последнее редактирование модератором:
Проверил сейчас - всё открылось.

На случай недоступности имеет смысл сохранять предыдущий прогноз (если файл прогноза не пустой!), например, в файл
Код:
$cache_file. '.old';
и обращаться к нему, если файл прогноза не скачался.. и при этом в кэше пусто.
 
Проверил сейчас - всё открылось.
он то открывается, то нет ... и поэтому прогноз то есть, то нет ...
На случай недоступности имеет смысл сохранять предыдущий прогноз (если файл прогноза не пустой!), например, в файл и обращаться к нему, если файл прогноза не скачался.. и при этом в кэше пусто.
а как это реализовать кодом? не силен в этом
 
PHP:
<?php


class Rates
{
    public  $list     = array();
   
    private $_cache   = 'system/kurs.dat';
    private $_hour    = 0; # Время обновление данных на сайте
    private $_imgUp   = 'images/up.png';
    private $_imgDown = 'images/down.png';                       
    private $_getLink = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=';
    private $_codes   = array('840' => 'dollar',
                  '978' => 'euro',
                  '398' => 'kzt',
                  '980' => 'uah');
    private $_loaded  = false;
   
   
    function __construct()
    {
        if ( !$this->_checkServer() )
        {
            return;
        }
       
        $this->_update();
       
        $this->_parse();

        # Если проблемы с сервером, пробуем ещё раз
        if ( !$this->_loaded && empty($this->list) )
        {
            $this->_load();
            $this->_parse();
        }
       
        $this->show();
    }
   
   
    private function _checkServer()
    {
        $ret = true;
        if ( !function_exists('simplexml_load_string') )
        {
            echo 'Ошибка XML. ';
            $ret = false;
        }
       
        if ( !ini_get('allow_url_fopen') )
        {
            echo 'Ошибка URL. ';
            $ret = false;
        }
       
        if ( file_exists($this->_cache) )
        {
            if ( !is_writable($this->_cache) )
            {
                echo 'Ошибка записи файла. ';
                $ret = false;
            }
        }
        elseif ( !is_writable( dirname($this->_cache) ) )
        {
            echo 'Ошибка записи директории. ';
            $ret = false;
        }
       
        return $ret;
    }
   
   
    private function _update()
    {
        $update = true;
        if ( file_exists($this->_cache) )
        {
            $new  = mktime($this->_hour, 0, 0, date('m'), date('d'), date('Y'));
            $last = filemtime($this->_cache);
            # Обновление было сегодня
            if ($last > $new)
            {
                $update = false;
            }
            # Вчерашние данные ещё актуальны
            elseif ($last > $new - 24 * 3600 && time() < $new)
            {
                $update = false;
            }
        }
       
        if ($update)
        {
            $this->_load();
        }
    }
   
   
    private function _load()
    {
        $data = array();
       
        # Вчера
        $link                    = $this->_getLink . date('d/m/Y', time() - 24 * 3600);
        $data['yesterday']     = file_get_contents($link);
       
        # Сегодня
        $link                    = $this->_getLink . date('d/m/Y');
        $data['today']         = file_get_contents($link);
       
        file_put_contents($this->_cache, serialize($data));
       
        $this->_loaded = true;
    }
   
   
    private function _parse()
    {
        $data = file_get_contents($this->_cache);
        $data = unserialize($data);
       
        $day         = 'yesterday';
        $data[$day] = simplexml_load_string($data[$day]);
        foreach($data[$day]->Valute as $item)
        {
            $val = str_replace(',', '.', (string)$item->Value);
            $key = (string)$item->NumCode;
            if ( isset($this->_codes[$key]) )
            {
                $key = $this->_codes[$key];
                $this->list[$key][$day] = $val;
            }
        }
       
        $day         = 'today';
        $data[$day] = simplexml_load_string($data[$day]);
        foreach($data[$day]->Valute as $item)
        {
            $val = str_replace(',', '.', (string)$item->Value);
            $key = (string)$item->NumCode;
            if ( isset($this->_codes[$key]) )
            {
                $key = $this->_codes[$key];
                $this->list[$key][$day] = $val;
               
                $val -= $this->list[$key]['yesterday'];
                if ($val > 0)
                {
                    $val = '+' . $val;
                }
               
                $this->list[$key]['diff'] = $val;
            }
        }
    }
   
   
    public function showOne($key)
    {

        global $def_mainlocation;

        echo '<strong>' . $this->list[$key]['today'] . '</strong> ';
        $diff = $this->list[$key]['diff'];
        if ($diff != 0)
        {
            $img = ($diff > 0) ? $this->_imgUp : $this->_imgDown;
            echo '<img src="'.$def_mainlocation.'/' . $img . '" alt="" align="absmiddle" ' .
                     'title="Курс вчера ' . $this->list[$key]['yesterday'] . ', ' .
                         $diff . '" />';
        }
    }
   
   
    public function show()
    {
        if ( empty($this->list) )
        {
            echo 'Cервер недоступен';
           
            return;
        }
       
        ?>
        <table width="100%" border="0" cellspacing="5" cellpadding="0">
          <tr>
            <td height="3" colspan="2"></td>
          </tr>
          <tr>
            <td width="55%" align="right">Доллар США</td>
            <td width="35%"><?php echo $this->showOne('dollar'); ?></td>
          </tr>
          <tr>
            <td width="55%" align="right">Евро</td>
            <td width="35%"><?php echo $this->showOne('euro'); ?></td>
          </tr>
          <tr>
            <td width="55%" align="right">100 Казахстанских Тенге</td>
            <td width="35%"><?php echo $this->showOne('kzt'); ?></td>
          </tr>
          <tr>
            <td width="55%" align="right">10 Украинских гривен</td>
            <td width="35%"><?php echo $this->showOne('uah'); ?></td>
          </tr>
        </table>
        <?php
    }
}


?>

нарыл на подобе что тебе нужно код ну только курса салюты с хранением данных в файле .dat
берет из файла курс периодически обновляет его если курс не был загружен выводит предыдущий!
по аналогии можно переделать для погоды!

или по средствам api вытягивать погоду напиши в гугле что нить подобное: php скрипт погоды api и я думаю найдешь решение!
 
если раньше хоть раз черещз раз открывался xml с погодой яндекса, то сейчас перестал вообще? может они меняют адрес?
 
если раньше хоть раз черещз раз открывался xml с погодой яндекса, то сейчас перестал вообще? может они меняют адрес?

я думаю просто ограничение по запросам xml у них! дабы не превышать лимит подключений, делай обновление раз в сутки и записывай в файл! выше дал пример курса валют, по аналогии пропиши данные для погоды!
 
я думаю просто ограничение по запросам xml у них! дабы не превышать лимит подключений, делай обновление раз в сутки и записывай в файл! выше дал пример курса валют, по аналогии пропиши данные для погоды!
теперь вообще выдает ошибку 404 .... может кто знает куда они перенесли данные xml?
 
Назад
Сверху