API

Информер погоды на сайт. Кто заменит Google Weather API?

Не так давно приказал долго жить и без того недокументированный API Google Weather, о котором я когда-то писал. Но жизнь на этом не останавливается, и многим из нас все так же необходимо отдавать пользователям своих сайтов прогнозы погоды.

В сегодняшней заметке речь пойдет об альтернативе Google Weather API — WorldWeatherOnline.

Информер погода на сайт
Такой прогноз погоды понравится многим =)

Итак, хоть сервис WWO и бесплатен, но он требует API-ключа. Поэтому сразу же регистрируемся. На почту прийдет confirm вместе с ключом. Теперь можно начать работу.

Сервис умеет возвращать данные в форматах XML, CSV и JSON. Приведу пример для формата XML. Для JSON и CSV необходимо всего лишь поменять один GET параметр в запросе.

Нас интересует погода в конкретном городе. Система умеет возвращать прогнозы по имени города, по имени города и страны, по широте и долготе конкретного города, по почтовому коду и по ZIP-коду. Лично мне ближе и проще видится вариант с широтой и долготой, в силу своей универсальности. Можно, конечно, запросить сразу город и страну, однако это скучно и не показывает всех плюшек системы. Так что мы пойдем длинным путем — пусть мы не знаем широту и долготу города. WWO умеет возвращать и эти данные! Для этого необходимо будет сделать дополнительный запрос.

Но перейдем от теории к практике. Поставим задачу — получить прогноз погоды в Москве (Россия) на 15 сентября 2012 года.

Начинаем строить запрос. Обращение идет к адресу http://www.worldweatheronline.com/feed/search.ashx. Далее будем передавать необходимые и известные нам параметры. Во-первых, это ключ API: ?key=XXXXXXXXXXXXXXXXXXXXX. Затем передадим запрос на город: &query=Moscow. Не секрет, что Москва в мире не одна с таким именем, поэтому ограничим результат XML-выдачи: &num_of_results=3. После этого урежем его параметром popular: &popular=yes. Но нам все равно возвращается «примесь» в виде Москвы американской. Однако, для каждого города в присылаемом XML есть параметр country, по которому худо-бедно можно фильтровать информацию. И в конце нам нужно указать формат принимаемой информации &format=xml. Вот тут при желании можно указать json или csv, если кому-то до чёртиков не нравится XML =)

Запрос будет вот таким:

http://www.worldweatheronline.com/feed/search.ashx?key=XXXXXXXXXXXXXXXXXXXXXXX&query=Moscow&num_of_results=3&format=xml&popular=yes

А вот, что он нам вернет:

<search_api>
    <result>
        <areaName>Moscow</areaName>
        <country>Russia</country>
        <region>Moscow City</region>
        <latitude>55.752</latitude>
        <longitude>37.616</longitude>
        <population>10381288</population>
        <weatherUrl>http://www.worldweatheronline.com/Moscow-weather/Moscow-City/RU.aspx</weatherUrl>
    </result>
    <result>
        <areaName>Moscow</areaName>
        <country>United States Of America</country>
        <region>Idaho</region>
        <latitude>46.733</latitude>
        <longitude>-116.999</longitude>
        <population>21865</population>
        <weatherUrl>http://www.worldweatheronline.com/Moscow-weather/Idaho/US.aspx</weatherUrl>
    </result>
</search_api>

Итак, в ответе нам должны вернуться два заветных параметра: latitude и longitude. Теперь у нас есть уникальный город, по которому точно можно получить прогноз. Это значит, что мы можем смело посылать второй запрос — уже непосредственно на погоду в городе. Адрес будет другой: http://free.worldweatheronline.com/feed/weather.ashx? , т.к. меня задушила жаба и я решил пользоваться бесплатным сервисом отдачи информации. Благо, он вполне удовлетворяет моим потребностям! Отличие платной версии в большем ассортименте возвращаемых форматов и расширенном поиске городов. Но это лирическое отступление. Продолжаем решать задачу.

Точно также передаем API-ключ в GET-параметре key, добавляем широту и долготу в странном ненативном параметре q=55.752,37.616 (это значения для Москвы), параметр cc (yes или no) возвращает или не возвращает текущие погодные условия помимо прогноза, date указывает конкретную дату, а уже знакомый нам параметр format — формат ответа (спасибо, Кэп!). В итоге наш запрос будет выглядеть следующим образом:

http://free.worldweatheronline.com/feed/weather.ashx?key=XXXXXXXXXXXXXXXXXXXX&q=Moscow&cc=no&date=2012-09-13&format=xml

Результат будет выглядеть примерно вот так:

<data>
    <request>
        <type>City</type>
        <query>Moscow, Russia</query>
    </request>
    <weather>
        <date>2012-09-13</date>
        <tempMaxC>23</tempMaxC>
        <tempMaxF>73</tempMaxF>
        <tempMinC>10</tempMinC>
        <tempMinF>49</tempMinF>
        <windspeedMiles>9</windspeedMiles>
        <windspeedKmph>15</windspeedKmph>
        <winddirection>WSW</winddirection>
        <winddir16Point>WSW</winddir16Point>
        <winddirDegree>241</winddirDegree>
        <weatherCode>113</weatherCode>
        <weatherIconUrl>http://www.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0001_sunny.png</weatherIconUrl>
        <weatherDesc>Sunny</weatherDesc>
        <precipMM>0.0</precipMM>
    </weather>
</data>

Как видите, все довольно нативно и просто: нам возвращается имя города, дата, температура в градусах имени товарищей Цельсия и Фаренгейта, скорость ветра в милях и километрах в час, направление ветра, иконка погоды и описание погоды. Дальше все можно разбирать парсером и выгружать на сайт. Наша задача решена!

Опишу все параметры, которые можно передать в запросе на погоду (http://free.worldweatheronline.com/feed/weather.ashx):

q — непосредственно запрос на точку. Может выглядеть как:

Имя города:
Имя Города
Имя Города, Штат (только для США)
Имя Города, Штат, Страна
Имя Города, Страна
К примеру: q=New+York или q=New+york,ny или q=London,united+kingdom

IP адрес
К примеру: q=101.25.32.325

Британский или канадский почтовый код или Zipcode США
К примеру: q=SW1 или q=90201

Широта и Долгота (в десятичных величинах, а не в градусах)
К примеру: q=48.834,2.394

Обязательно проверяйте запрашиваемую информацию на возможность подстановки её в URL! Иначе просто не получите нужного ответа.

extra (опционально) — позволяет запрашивать дополнительную информацию от сервера
localObsTime — возвращает текущее время в UTC, а также местное время в точке наблюдения.
isDayTime — возвращает «yes», если время дневное, и «no», если ночное. (Доступно только для Premium API с 3-х, 6-ти и 12-ти часовым интервалом запросов)
utcDateTime — если пользователь хочет увидеть время в формате UTC, а не местное время (Доступно только для Premium API)

num_of_days — продолжительность прогноза в днях

date (опционально) — прогноз и данные на точную дату. Можно указать значения today(сегодня), tomorrow(завтра) или же дату в формате yyyy-MM-dd.

fx (опционально) — триггер нормированного вывода погоды (yes или no).

cc (опционально) — выводит текущие погодные условия в точке (yes или no).

includeLocation (опционально) — возвращает ближайшую точку для заданного запроса q (yes или no). По дефолту — no.

format — формат вывода. xml, csv или json.

show_comments (опционально) — отключает CSV/TAB-комментарии из вывода (yes или no). По дефолту — yes.

callback (опционально) — используется только для функции json-callback

key — Ваш уникальный API-ключ.

Также система умеет генерировать прогноз по температурам воды и прогноз для серферов. Запрос для него можно автоматически сгенерировать здесь.

А теперь о бюрократии — об условиях использования бесплатной версии:
1. Ограничение в 500 запросов в час (но с поддержкой кэширования данных). Таким образом, свежая информация будет поступать каждые 15 минут. Как говорят разработчики, они используют гибкую политику ограничений, так что можно им написать письмо с просьбой увеличения лимита запросов в час за n-цать долларов в день.

2. Можно использовать сервис на мобильных и невёб платформах. Но линкбэк обязателен.

3. Использование на сайте и в блоге также требует использования линкбэка, который можно найти тут.

За сим всё! Безошибочного Вам кода!

No votes yet.
Please wait...

Информер погоды на сайт. Кто заменит Google Weather API?: 6 комментариев

  1. Спасибо за статью и совет! Решил использовать это для себя.
    Вот перевел коды состояний погоды worldweatheronline.

    Кому надо берите тут: Коды состояний погоды worldweatheronline

    No votes yet.
    Please wait...
  2. Супер, спасибо! А то самому лень всё апи вычитывать. Тем более с языком не особо дружу 🙂 А у вас всё как надо 🙂

    No votes yet.
    Please wait...
    1. Спасибо! =)

      No votes yet.
      Please wait...
  3. Почему когда ставлю формат JSON.
    http://free.worldweatheronline.com/feed/weather.ashx?q=Gorod,Strana&date=2013-04-23&format=json&key=111111»

    То он мне возвращает текущею дату города, а не по date=2013-04-23

    No votes yet.
    Please wait...
    1. Вероятно потому, что дата задана слишком далеко. На месяц прогноз погоды мало кто делает, если делает вообще.

      No votes yet.
      Please wait...
  4. Стал платным, зараза

    Rating: 5.0/5. From 1 vote.
    Please wait...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *