Начинаем создавать набор сервисов easyAPI

Вячеслав Гринин, October 9, 2009

Создавая статьи на темы, интересующие посетителей, отвечая на их комментарии, и даже выполняя платные заказы на эти темы я все больше понимал, что пора создавать некий набор сервисов и библиотек, реализующих насущные потребности пользователей веб-сайтов.

Собственно, этой статьей я начинаю публикацию на нашем ресурсе сервисов под общим названием easyAPI.

Что это будет?

EasyAPI это по большей части JavaScript-библиотеки, реализующие ту или иную функциональность, я пока до конца не знаю, какие именно сервисы я буду предоставлять и в каком виде. Но точно знаю, что эти сервисы помогут, например, владельцу сайта, поднятого на бесплатном хостинге, отобразить погодный информер, настроенный полностью под требования веб-мастера. Или, например, позволят определить географию посетителей определенного сайта и отобразить ее на карте страны. Или, например, отобразить посетителю сайта погодный информер именно его города. И все это, повторюсь, чаще всего будет возможно даже на хостинге без поддержки PHP.

Короче говоря, от слов к делу!

И сегодня на сайте easy-4-web.ru появляется первый такой сервис – GeoIP, позволяющий по адресу посетителя определить его приблизительное местоположение.

Он живет здесь http://easy-4-web.ru/api/geoip/get.php

Поддерживаемые параметры:
p – формат отдаваемых данных:

  • p=j – результат – JSON
  • p=a – результат – массив вида cc2=RU;cc3=RUS;cty=Moskow
  • p=x – результат – XML
  • p=ax – результат – массив обернутый в XML, вида <easy>cc2=RU;cc3=RUS;cty=Moskow</easy>
  • p=jx – результат – JSON обернутый в XML, вида <easy>cc2=RU;cc3=RUS;cty=Moskow</easy>

f – длина имен полей:

  • f=f – длинные имена, вида country_code
  • f=s – короткие имена, вида cc2

ip – IP-адрес, если он не задан, то в качестве адреса берутся координаты сервера, с которого пришел запрос REMOTE_ADDR.

s – кодировка(charset) отдаваемых данных.
Например s=koi8-r или s=utf-8, по умолчанию считается s=windows-1251.

Если я желаю получить информацию по собственному местоположению в формате JSON с длинными именами полей, я вызову URL http://easy-4-web.ru/api/geoip/get.php?p=j&f=f

В следующей статье на эту тему я расскажу о том, как можно применить данный сервис при вызове его из PHP-программы, и из JavaScript на удаленном сервере. Пока сервис easy.GeoIP находится в стадии тестирования, возможны некоторые изменения в его работе, о которых я буду предупреждать на сайте.

Сервис переехал на другой адрес. Теперь он живет здесь http://easyapi.ru/geoip/get.php

Добавился новый параметр c-коллбэк. Применяется только в режиме p=j/. Таким образом, вызвав http://easyapi.ru/geoip/get.php?p=j&c=onGet, мы получим пакет вида:

onGet('{"country_code":"RU","country_code3":"RUS","country_name":
"Russian Federation","region":48,"city":"Moscow",
"latitude":55.7522,"longitude":37.6156}');

Добавил поля error, country_name_ru, city_ru (их краткие эквиваленты: err, cnr, ctr). Возвращают описание ошибки, название страны на русском языке, название города на русском языке. также добавил возврат заголовка charset=utf-8, и указал заголовок кодировки и версии xml. Результат выложен по адресу: http://easyapi.ru/geoip/get1.php, после тестирования он перейдет в официальную версию. Особенно интересно, чтобы его протестировали те, кто уже пользуется этим сервисом без улучшений.

Исправил проблему с кодировками. Добавил во входные параметры требуемую кодировку, она теперь задается параметром s, например s=utf-8. По умолчанию считается charset=windows-1251. Ликвидировал тестовый хэндлер get1.php, все изменения внес в get.php после собственного тестирования. Скоро будет статья на тему того, как все это использовать в PHP и JavaScript.

Определение географического положения по IP-адресу

Вячеслав Гринин, March 10, 2009

Задался я недавно вопросом, как определить страну, город и координаты юзера по его IP-адресу, погуглил немного и вот хочу поделиться результатами моих научных изысканий.

Первым мне на глаза попался сайт http://ipgeobase.ru/ . Скачал я их скрипт и БД. Протестировал и обнаружил:

  1. Скрипт http://ipgeobase.ru/files/soft/search_cgi.tar.gz при поиске по базе для начала загружает всю базу в память а потом уже производит по ней поиск, что очень плохо по вполне очевидной причине большого и неразумного потребления ресурсов памяти. На моем хостинге этот скрипт вообще отваливался, так и не дорабатывая до конца загрузку базы в память.
  2. Сама база данных создана совершенно нерациональным образом, обладая неразумной избыточностью. Вы и сами можете оценить этот факт, скачав базу по адресу http://ipgeobase.ru/files/db/Main/db_files.tar.gz

Так что лучше вообще не обращать внимания на предлагаемые алгоритм и базу, а сразу перейти к более корректным методам.

Вот здесь http://www.maxmind.com/ я обнаружил действительно быстрый и эффективный алгоритм определения географического положения пользователя по его IP-адресу.

Причем, эта компания предоставляет как платные, так и бесплатные версии ПО. Платная версия стоит $370, плюс по $90 в месяц за обновления. Бесплатная версия покрывает 99.5% территории, а платная – 99.8%  на уровне стран, и 79% и 83% соответственно на уровне городов. Как видим, разница в точности несущественная и для наших скромных некоммерческих целей подойдет и бесплатная версия ПО. Обновления баз для обеих версий производятся раз в месяц, поэтому надо периодически скачивать новую версию базы данных.

Использовать ПО достаточно просто.

  1. Качаем здесь саму библиотеку.
  2. Качаем здесь последнюю версию базы данных. В распакованном виде база занимает около 28 мегабайт.
  3. Заливаем на хостинг файлы GeoLiteCity.dat, geoipcity.inc, geoip.inc, geoipregionvars.php. Пусть они лежат в одной директории на сервере.
  4. В той же директории создаете файл whereami.php имеющий следующее содержимое:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Где я?</title>
</head>
<body>
<?php
include "geoipcity.inc";
$gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD);
$res = GeoIP_record_by_addr($gi,$_SERVER['REMOTE_ADDR']);
geoip_close($gi);
foreach ($res as $key => $val)
{
    print "$key = $val<br>\n";
}
?>
</body>
</html>

Как можно видеть, в строке 8 подключается сама библиотека, в строке 9 создается объект GeoIP, которому в качестве параметра передается имя файла, содержащего базу данных, в строке 10 происходит сам поиск по базе данных. Функции GeoIP_record_by_addr в качестве параметров передаются объект GeoIP и IP-адрес (в данном случае это адрес хоста, вызвавшего страницу, то есть адрес пользователя, открывшего в бразуере вашу страницу). В строке 11 происходит корректное освобождение ресурсов, занятых под объект GeoIP. Следующий цикл foreach выводит на экран все поля объекта, который вернула функция GeoIP_record_by_addr.

Структура результата имеет вид:

country_code = RU
country_code3 = RUS
country_name = Russian Federation
region = 48
city = Moscow
postal_code =
latitude = 55.7522
longitude = 37.6156
area_code =
dma_code =

Вот и все. Не боги горшки обжигают.

Поиск по блогу:
Подписаться:
Популярные:
Облако тегов:
Разное:
Счетчик: