Nickolay.info. PHP. Статьи. Делаем погодный сервис для сайта за 5 минут

Благодаря сервисам Google, эта задача действительно отнимет всего несколько минут. По сути дела, всё, что нам нужно - сформировать URL-адрес по правилам Google API, передать ему название своего населённого пункта, тоже полученное по гугловским правилам (кстати, не так уж легко найти где-то список этих городов в правильной транскрипции, вот доки, можно ещё и вот так), затем сделать запрос к гугловскому сервису и проанализировать полученный ответ.

Ниже приведён класс-обёртка на PHP, написанный для погодного сервиса, по умолчанию в нём ставится русский язык и кодировка Юникод (UTF-8):

<?php
 class Weather {  
  public $xml;    
  function __construct ($city, $lang='ru', $charset='utf-8') {
   $base = 'http://www.google.com/ig/api';
   $params = 'weather=' . trim($city);
   $params .= '&hl=' . trim($lang);
   $params .= '&oe=' . trim($charset);
   $url = $base . '?' . $params;
   $this->xml = simplexml_load_file($url);
  }    
  function getInfo() {
   if (!$this->xml) return false;       
   $information = $this->xml->xpath("/xml_api_reply/weather/forecast_information");
   return $information[0];  
  }   
  function getCurrentWeather() {
   if (!$this->xml) return false;
   $current = $this->xml->xpath("/xml_api_reply/weather/current_conditions");       
   return $current[0];  
  }   
  function getForecast() {
   if (!$this->xml) return array();   
   $forecast_list = $this->xml->xpath("/xml_api_reply/weather/forecast_conditions");   
   return $forecast_list;  
  }   
 } 
?>

Предполагается, что код сохранён в файле с именем Weather.php и находится в той же папке сервера, что основной скрипт.

А это - небольшой скрипт, использующий класс Weather. Он позволяет выдать прогноз погоды в Новосибирске на 4 дня (сегодняшний день - информация получается методом getCurrentWeather плюс стандартный прогноз на 3 дня - метод getForecast)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>

<head>
 <meta content="text/html; charset=utf-8" http-equiv="content-type">
 <title>Google Weather</title>
</head>
<style type=text/css>

.weather img {
 margin: 2px;
 vertical-align: middle;
}
.condition {
 font-family: Verdana, Arial, Helvetica, sans-serif;
 font-size : 10px; 
}
</style>
<body>

<?php 
 $city='Novosibirsk';
 if (isset($_GET['city'])) $city=htmlspecialchars(trim($_GET['city']));
 include("Weather.php"); 
 $gw = new Weather($city);
 $gw_info = $gw->getInfo();    
 $gw_today = $gw->getCurrentWeather();
 $gw_forecast = $gw->getForecast(); 
 echo 
  $gw_info->city['data'].', '.$gw_info->forecast_date['data'].
  //Закомментарить строку выше, если не нужны город и дата
  '<div class="weather"><img src="http://www.google.com'. 
  $gw_today->icon['data'].'"><span class="condition">'.
  $gw_today->temp_c['data'].' C, '.$gw_today->condition['data'].', '.
  $gw_today->humidity['data'].', '.
  $gw_today->wind_condition['data'].'</span></div>';
 foreach ($gw_forecast as $forecast) { 
  echo 
   '<div class="weather"><img src="http://www.google.com'. 
   $forecast->icon['data'].'"><span class="condition"> '.
   $forecast->day_of_week['data'].': '. 
   $forecast->high['data'].' C | '.$forecast->low['data'].' C, '.
   $forecast->condition['data'].'</span></div>';
 }
 echo '<div class="weather"><span class="condition"><a href="index.php?city='.$city.'">Reload</a></span></div>';
?>

</body>
</html>

Результат работы нашего скрипта может быть таким (здесь скрипт вызван из тега <iframe>):

 Сервис в работе (код со временем может измениться)

Для вывода прогноза по другому городу просто вызовите скрипт с параметром URL-адреса city, равным названию нужного города, например, для Москвы получится так: http://scripts.kislenko.net/googleweather/?city=Moscow

Разумеется, можно поменять оформление выдачи, стили, кодировку и т.п. Необязательно также возвращать целый документ, можно писать выдачу файла index.php в некую строку и потом выводить эту строку командой echo.

Альтернативный путь - установка какого-нибудь информера от GISMeteo или другой службы, конечно, ещё проще, но, сами понимаете, вид выдачи там не перепрограммируешь... а я лично поставил себе страницу погодного сервиса стартовой в коммуникаторе, она заменила мне жрущий кучу траффика погодный виджет.

P.S. В конце августа 2012 г. скрипт внезапно перестал работать. Google выдаёт сервису ошибку 503, а если обратиться напрямую, пишет

We're sorry...
... but your computer or network may be sending automated queries. To protect our users, we can't process your request right now.
See Google Help for more information.

что, думаю, не соответствует действительности, так как с другого соединения или на другом хосте результаты те же. Есть версия, что проблема связана с будущим закрытием сервиса iGoogle, для которого, похоже, предназначался погодный API. Планирую сделать сервис на Yahoo! Weather RSS Feed, тогда поставлю сюда ссылку, вот он.

Рейтинг@Mail.ru

вверх гостевая; E-mail