Рассказ о разработке очень простого, но очень неглупого погодного информера, определяющий геолокацию посетителя сайта и автоматически публикующего прогноз погоды для данной местности - уже имел место на страницах этого блога; использованы были Free API сервиса worldweatheronline.com и база данных Sypex Geo. Сегодня - усложним, или, вернее, чуть видоизменим задачу... попробуем, для разнообразия, обратиться за координатами геотаргетинга к Maxmind. Кстати, у нас появится возможность сравнить работу Sypex Geo и Maxmind… что, хотелось бы надеяться, поспособствует возникновению некоей здоровой конкуренции между двумя группами разработчиков... ладно, там видно будет. Поехали. Погоду по-прежнему будем получать из World Weather Online. Да, разработчики очень дружественного API данного сервиса просят вас указывать ссылку на источник; не забудьте.
Powered by World Weather Online
Внимание, информация устарела. В конце 2013 года я получил от Maxmind уведомление о том, что в бесплатном варианте сервис более не предоставляется; после этого скрипт отработал на сайте еще год, до ноября 2014. Остается лишь предположить некую корреляцию между этими двумя событиями... используйте Sypex Geo - все очень просто, быстро и надежно. Впрочем, GeoLite2-City.mmdb и maxmind/geoip-api-php по-прежнему доступны для свободной загрузки и использования, информация на форуме.
Покажи нам для начала что-нибудь простенькое, дорогой Фагот... а то публика скучать начинает. Ок, мы c вами без малейших проблем сумеем подсунуть пользователю ссылку, нажав на которую - он будет перенаправлен на World Weather Online, где мгновенно получит погоду уже для своего города (вернее - для своих географических координат). Для этого нам достаточно всего лишь следующих строчек кода:
<script language="JavaScript" src="http://j.maxmind.com/app/geoip.js"></script>
<script language="JavaScript">document.write(geoip_latitude());</script>
<script language="JavaScript">document.write(geoip_longitude());</script>
<?php
if (isset($_GET['lat']) AND isset($_GET['lon'])) {
}
else {
?>
<script language='javascript'>
location.href="http://www.worldweatheronline.com/v2/weather.aspx?lat=" + geoip_latitude() + "&lon=" + geoip_longitude();
</script>
<?
}
Первая строчка, как видите, javascript - это запрос к Maxmind, (вторая и третья строки необязательны, это всего лишь вывод на web-страничку географических координат), далее - пых и снова js. Просто? - да, все несложно. Но мы ведь c вами хотели информер на сайт, а не вновь открытую, пусть даже и c подставленными координатами, web-страничку погодного сервиса!
Что же, двигаемся дальше. Кнопку "Получить погоду" мы c вами создадим опять-таки очень несложно. Внимание, теперь нам понадобятся уже два файла, а не один:
index.html
<script language="JavaScript" src="http://j.maxmind.com/app/geoip.js"></script>
<script language="javascript"><!--
document.write('<form name="form1" action="script.php" method="get">');
document.write('<input type="hidden" name="lat" value="' + geoip_latitude() + ' ">');
document.write('<input type="hidden" name="lon" value="' + geoip_longitude() + ' ">');
document.write('<input type="submit" value="Получить погоду"></form>');
//--></script>
и обработчик, обзовем его script.php (именно так он поименован в только что показанном HTML):
<?php
if (isset($_GET['lat']) AND isset($_GET['lon'])) {
echo $_GET['lat'];
echo $_GET['lon'];
}
echo "<br>";
$loc_array = array($_GET['lat'],$_GET['lon']);
$api_key="xkq544hkar4m69qujdgujn7w";
$num_of_days=1;
$loc_safe = array();
foreach($loc_array as $loc){
$loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$basicurl = sprintf('http://api.worldweatheronline.com/free/v1/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));
$xml_response = file_get_contents($basicurl);
$xml = simplexml_load_string($xml_response);
$ss = array();
foreach ($xml[0] as $name => $val) {
foreach ($val as $name1 => $val1)
{
$ss[$name1] = $val1;
}
}
echo '<img src="' . $xml->weather->weatherIconUrl . '"/>';
echo "<br>";
echo "<br>";
echo $ss["date"];
echo "<br>";
echo "Координаты {$ss["query"]}";
echo "<br>";
echo "Температура {$ss["temp_C"]} С";
echo "<br>";
echo "Мин. температура сегодня {$ss["tempMinC"]} С*";
echo "<br>";
echo "Макс. температура сегодня {$ss["tempMaxC"]} С*";
echo "<br>";
echo "Скорость ветра {$ss["windspeedKmph"]} м/сек";
echo "<br>";
echo "Направление ветра {$ss["winddirection"]}";
echo "<br>";
echo "Пасмурно {$ss["cloudcover"]}%";
echo "<br>";
echo "Давление {$ss["pressure"]} mb";
echo "<br>";
echo "Влажность {$ss["humidity"]}%";
echo "<br>";
echo "Видимость {$ss["visibility"]} км";
echo "<br>";
echo $ss["weatherDesc"];
?>
Таким образом, размещенный на web-страничке HTML-код теперь радует глаз кнопочкой, нажав на которую (попробуйте!) - мы c вами получаем редирект уже не на World Weather Online, а на наш собственный обработчик script.php, которому (action="script.php" method="get") переданы полученные от Maxmind координаты... обратите особое внимание на этот момент. Здесь следует еще раз отметить, что js выполняется на вашем ПК, а php - на вашем сервере.
Работает? - работает. Но дальше - больше, и аппетит всегда приходит во время езды. Как бы нам c вами избавиться теперь уже и от кнопки? Давайте попробуем так: едва пользователь открыл страничку сайта - тут же ему прогноз погоды для его местности, без лишних разговоров и телодвижений... сказано - сделано. Поюзаем ajax, это сейчас модно и круто... внимание, у нас c вами снова два файла; а финал работы вы видите в верхней части странички слева.
index.php
<?php
if (isset($_GET['geoip_latitude']) AND isset($_GET['geoip_longitude'])) {
}
else{
?>
<html>
<head>
<title>Ajax base example</title>
<script language="JavaScript" src="http://j.maxmind.com/app/geoip.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
</head>
<body>
<script language="JavaScript">document.write(geoip_country_name());</script>
<br>
<script language="JavaScript">document.write(geoip_city());</script>
<br>Lat:
<script language="JavaScript">document.write(geoip_latitude());</script>
<br>Lon:
<script language="JavaScript">document.write(geoip_longitude());</script>
<div id="results"></div>
<script language='JavaScript'>
$.ajax({
type: "GET",
url: "script.php",
data: {
geoip_latitude: geoip_latitude(),
geoip_longitude: geoip_longitude()
},
success: function(html){
$("#results").append(html);
}
});
</script>
</body>
</html>
<?php
}
?>
script.php (ни малейшей принципиальной разницы c предыдущим вариантом этого же файла):
<?php
if (isset($_GET['geoip_latitude']) AND isset($_GET['geoip_longitude'])) {
}
echo "<br>";
$loc_array = array($_GET['geoip_latitude'],$_GET['geoip_longitude']);
$api_key="xkq544hkar4m69qujdgujn7w";
$num_of_days=1;
$loc_safe = array();
foreach($loc_array as $loc){
$loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$basicurl = sprintf('http://api.worldweatheronline.com/free/v1/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));
$xml_response = file_get_contents($basicurl);
$xml = simplexml_load_string($xml_response);
$ss = array();
foreach ($xml[0] as $name => $val) {
foreach ($val as $name1 => $val1)
{
$ss[$name1] = $val1;
}
}
echo '<img src="' . $xml->weather->weatherIconUrl . '"/>';
echo "<br>";
echo "<br>";
echo $ss["date"];
echo "<br>";
echo "Температура {$ss["temp_C"]} С";
echo "<br>";
echo "Мин. температура сегодня {$ss["tempMinC"]} С*";
echo "<br>";
echo "Макс. температура сегодня {$ss["tempMaxC"]} С*";
echo "<br>";
echo "Скорость ветра {$ss["windspeedKmph"]} м/сек";
echo "<br>";
echo "Направление ветра {$ss["winddirection"]}";
echo "<br>";
echo "Пасмурно {$ss["cloudcover"]}%";
echo "<br>";
echo "Давление {$ss["pressure"]} mb";
echo "<br>";
echo "Влажность {$ss["humidity"]}%";
echo "<br>";
echo "Видимость {$ss["visibility"]} км";
echo "<br>";
echo $ss["weatherDesc"];
?>
Вот и все. Да, в принципе, это все на сегодня. Наслаждайтесь. Попробуйте все три примера, попробуйте на их основе привнести и наваять что-то свое... только не забудьте получить на World Weather Online бесплатный api key, без него не заработает. Помните, в двух представленных выше примерах использован demo-код, его необходимо заменить:
$api_key="vash_api_key";
Удачи!