города — Блог Валерия Леонтьева https://valera.ws Место публикации личных заметок. Технологии, управление, бизнес, жизнь Tue, 16 Dec 2008 07:38:39 +0000 ru-RU hourly 1 https://wordpress.org/?v=5.6.2 https://valera.ws/wp-content/uploads/2020/02/favicon.png города — Блог Валерия Леонтьева https://valera.ws 32 32 GeoLite City против CNGeoip https://valera.ws/2008.04.02~cngeoip/ Wed, 02 Apr 2008 10:02:32 +0000 http://valera.ws/2008.04.02~cngeoip/ Читать далее GeoLite City против CNGeoip ]]> Вчера я протестировал базу GeoLite City от Max Ming. Это бесплатная версия базы, почти ничем не отличающаяся от платной версии. После изучения содержимого базы пришел к неутешительным выводам.

В базе немало ошибок в написаниях городов, часто попадаются разные варианты написания (например, Chelyabinsk и Cheliabinsk), вместо городов иногда пишут области, а иногда улицы. Но самая большая проблема, что названия всех городов написаны только в английском/местном варианте латиницей. Для использования на русскоязычных ресурсах такая база практически непригодна. Составить соответствие английских названий русским в автоматическом режиме практически нереальная задача по причинам, описанным выше. А использовать труд операторов для обработки порядка 180 000 локаций в базе могут позволить себе только довольно крупные компании. Ругательство базы GeoLite City можно найти еще на этом форуме.

[Интересно, а какие базы используют Google, Яндекс?]

Других хороших полноценных баз городов (не стран) по IP я не нашел, ни платных, ни бесплатных, кроме одной — это CNGeoip — модуль определения города и страны по IP-адресу. Сразу скажу, что база платная. Стоимость базы на один сайт составляет 99 WMZ (при оплате по WebMoney, на 02.04.2008).

Теперь о возможностях. Я тестировал базу на сайте производителя. Для этого есть демо-версия. Все тестовые запросы дали результат не хуже, чем GeoLite City. Скорость работы нареканий не вызывает.

Но главное преимущество CNGeoip перед GeoLite City — все названия городов и стран доступны и на английском, и на русском языках! То есть применять базу легко можно на сервисах, ориентированных на Рунет.

Разработчики CNGeoip в своем блоге пишут:

«Задача определения города пользователя по IP адресу возникает не так редко как кажется, это и анализ статистики, таргетинг баннеров, автоматическая настройка профайлов пользователей и т.д.

Базу географии найти не то чтобы сложно — накладно.

Реальное качество есть у базы от MaxMinda (это та которую все юзают, но не платят (GeoIPCity :) ). Цена этой базы внушает, за тысячу баксов в год переваливает.

Но вот Россия и СНГ покрыты там с погрешностями, порой смешными. Типа город — ул. Ленина и т.д. Ну в общем все это и так знают.

Давно стали думать чтобы сделать свое решение. Поняли почему берут деньги Максмайндовцы. :)»

На самом деле качество базы CNGeoip по территории бывшего СССР намного превышает качество GeoLite City. [По моим скромным тестам. Если у вас есть контраргументы, добро пожаловать в комменты!]

Тестирование на практике. Во-первых, как я уже писал, протестировать базу всегда можно на демо-странице, там слева пишется ваш определившийся IP и местоположение. Есть и форма для ввода любого IP. Но мне этого конечно было мало. Хотелось бы протестировать базу в реальных условиях. Однако выложенной базы в Сети в открытом виде я не нашел. Пока раздумываю о покупке.

Вывод. Если вы собираетесь создавать коммерческий сервис в Рунете на русском языке, который требует определения страны и города по IP (например, автоподстановка значений в соответствующие поля при регистрации, или вывод информера погоды по городам), однозначно надо смотреть в сторону CNGeoip. Качественных альтернатив нет. 200 долларов за базу плюс год обновлений — копеечная цена.

]]>
Использование базы IP по городам от MaxMind https://valera.ws/2008.04.01~ip-to-city/ Tue, 01 Apr 2008 18:02:04 +0000 http://valera.ws/2008.04.01~ip-to-city/ Читать далее Использование базы IP по городам от MaxMind ]]> Используем базу IP по городам GeoLite City от MaxMind. Зона покрытия этой базы описана здесь. Лицензия проста как кактус: пользуйтесь на здоровье, даже в коммерческих целях, но все рекламные материалы и документация к продукту должны содержать фразу: «This product includes GeoLite data created by MaxMind, available from http://maxmind.com/». Ну и как обычно — никаких гарантий. От платной версии free-базу отличает чуть-чуть худшее покрытие. Но нам это не мешает.

Данная библиотека существует в виде PECL-расширения, которое не идет в стандартном наборе с PHP. Если модуль у вас на сервере установлен, пользуйтесь им, если нет — используйте библиотеку отдельно. Кстати, API базы есть для разных языков.

В репозитории PEAR находится библиотека для доступа к файлу базы. А сам файл базы необходимо скачать с сервера и ежемесячно обновлять. Скачали базу, скачали API. Распаковали базу (файл GeoLiteCity.dat и каталог GeoIP). Каталог GeoIP нужно положить в каталог Net (последний создать), или изменить строку 663 строку в файле GeoIP.php.

База готова к эксплуатации. Посмотрите, как работает пример отпределения IP посетителя сайта по базе. Вот код примера (index.php):

<?php 
    print "Search Started<br \>\r\n";    

    require('GeoIP.php'); 
    $geoip = Net_GeoIP::getInstance('GeoLiteCity.dat', Net_GeoIP::STANDARD); 
    $data = $geoip->lookupLocation( 
        isset($_SERVER['HTTP_REMOTE_ADDR']) ? $_SERVER['HTTP_REMOTE_ADDR'] : $_SERVER['REMOTE_ADDR'] //nginx? 
    );   

    if ( is_null($data) ) 
        print "Region wasn't found!<br \>\r\n"; 
    else 
        print "Found! You are from {$data->city}, {$data->countryName}<br \>\r\n";   

    print "© 2008, <a href=\"https://valera.ws/\">feedbee</a><br />\r\n";   

    print "This product includes GeoLite data created by MaxMind, available from <a href=\"http://www.maxmind.com/\">http://www.maxmind.com/</a>.";   

?>

Обратите внимание, что если не найден IP в базе, будет возвращен NULL. Но вомзможен случай, когда не будет найден только город, а страна найдется. В этом случае $data->city вернет NULL.

]]>
Коды городов Яндекс.Погоды https://valera.ws/2008.03.31~ya-weather/ Mon, 31 Mar 2008 19:21:45 +0000 http://valera.ws/2008.03.31~ya-weather/ Читать далее Коды городов Яндекс.Погоды ]]> На сайте Яндекс.Погода существует сервис информеров. При установке к себе на сайт информера, необходимо выбрать город, который будет на информере отображаться. А как показать на информере не выбранный город, а город, в котором находится посетитель?

Прогноз на сервисе от Яндекса довольно точный. Я пользуюсь им постоянно. Потому и выбрал информер на свои сайты именно от этого сервиса. Он красивый, информативный, стабильный (Яндекс падает крайне-…-крайне редко).

Однако, при установке к себе на сайт информера, необходимо выбрать город, погода в котором будет на информере отображаться. Хорошо, если вся тусовка на сайте — посетители из одного города. А что если нет (наверное 98% случаев)? Например, аудитория блогов обычно абсолютно разбита по разным странам, не говоря уже о городах. Тогда такой информер не очень практичен, ведь мало кому интересна погода в вашем регионе.

Выхода из ситуации три. Первый проще, но решает только половину проблемы. При регистрации пользователя в системе, заставляйте его вводить город. И если город совпадет со списком Яндекса, который я подготовил в текстовом виде, то выводите ему соответствующий информер. Можно тот же список использовать и в качестве автоподстановки в поле ввода города при регистрации. Половину проблемы решает, потому что работает только после регистрации.

Второй выход — использование базы городов по IP-адресам. Но следуюет учитывать, что базы такие платные, их надо постоянно обновлять и данные в них точны лишь с какой-то степенью (например, 90%). Ну и не стоит забывать, что некоторые используют анонимные прокси. Базы: MaxMind GeoIP® City DatabaseCNGeoipIP2City.

Третий выход самый простой, но у него есть большой недостаток. Собственно, по порядку. Вы вешаете информер с каким-то городом по умолчанию. Под ним (или над ним) делает ссылку «Настроить регион». Или даже вместо самого информера по умолчанию можно разместить эту ссылку. Человек на нее кликает, ему выдается список городов от Яндекса. Посетитель выбирает свой город, информация сохраняется в cookie пользователю. А при следующей загрузке страницы сайта информация из куков подставляется в информер, и посетитель видит погоду с родном городе. Большой минус этого способа в том, что он применим только на сайте с постоянной аудиторией. Т.к. посетители тех же блогов обычно быстро уходят с сайта и редко к нему возвращаются, поэтому давать им настройку информера просто нет смысла. (Поэтому я в своем блоге не стал это делать.)

01.04.08: Рализация для 2+3 варианта уже написана. Предсталена страница с работающим кодом на JS, который сохраняет настройки в cookies. Вы можете использовать страницу на своих сайтах (открывайте HTML-код и внедряйте его себе).

Пример кода информера (красным выделен код города — подставляется в 2 места):

<a href=»http://www.yandex.ru/redir?dtype=stred&pid=7&cid=1228&url=http://weather.yandex.ru/index.xml?city=7737«><img src=»http://info.weather.yandex.net/informer/175×114/7737.png» border=»0″ alt=»Яндекс.Погода»/><img width=»1″ height=»1″ src=»http://www.yandex.ru/redir?dtype=stred&pid=7&cid=1227&url=http://img.yandex.ru/i/pix.gif» mce_src=»http://www.yandex.ru/redir?dtype=stred&pid=7&cid=1227&url=http://img.yandex.ru/i/pix.gif» alt=»» border=»0″/></a>

Список городов брал с сайта Яндекс.Погоды. Выловилось почему-то только 1676 из 1681 заявленого на сайте. Перевод сделан через Переводчик Google. Файл состонит из 3 столбцов: 1) код города по Яндексу, 2) название города по Яндексу (на русском), 3) перепод по Гуглу на английский. В переводе есть спец-символы в UTF, вместо которых в csv-версии символы вопроса. Сохранен в 4-х вариантах: 1) файл Excel, 2) текст с разделителем табуляция (UTF-16), 3) текст с разделителем табуляция (UTF-8), 4) CSV в cp1251. Только не спрашивайте, почему сделал так, просто выберите себе подходящий формат и конвертируйте его как угодно.

По наличию времени я реализую несколько способов, описанных выше и выложу в блог код. Но пока решил выложить список городов и рассказать идеи, на случай, если кто-то еще подхватит написание кода и добьется успеха в реализации, а потом поделится кодом со всеми ;) Да и сам-то код можно написать на разных языках программирования.

]]>