Яндекс визначення міста по ip. Визначення місця розташування користувача

Яндекс визначення міста по ip. Визначення місця розташування користувача

Визначення місця розташування користувача - вкрай корисна річ для інтернет-магазинів і для Лендінзі. Але і для простих сайтів буде також цікаво зробити, наприклад, автоматичне заповнення поля місто, країни і т.д. Власне, різного роду автозаповнення дозволять прискорити реєстрацію та оформлення замовлення.

установка

Підключаємо бібліотеку Яндекса:

Парс дані про розташування:

У тому, місці, де потрібно вивести місто, регіон та країну вставляємо:

Ви можете просто скопіювати всі три фрагменти і вставити в одному місці на сайті. Дивно, але Я перевіряв скрипт на демо-сайті та він не виводив ніяких даних. Вставивши на Урааа, скрипт видав всі дані по місту, регіону і країні. Причину чому на демо-сайті скрипт не працював поки не зрозумів.

Якщо ви хочете зробити автоматичне заповнення міста де або на сайті (наприклад, у формі замовлення), то дізнайтеся ID поля і замініть його вміст таким чином:

jQuery ( "# user-city"). val (ymaps.geolocation.city);

В якій згадувався мій «велосипед» відрізняється високою швидкістю роботи. Одним з популярних питань стала можливість визначення міста по IP.

І ось кілька місяців по тому, проект починався, як «for fun» переріс в самостійний проект.
Відкрито окремий сайт присвячений проекту Sypex Geo, на якому можна скачати свіжі версії API і баз даних, а також ознайомитися з документацією.

Для бажаючих скоріше протестувати правильність визначення міста по IP - ось посилання на демо-сторінку. А під хабракатом, я опишу деякі технічні подробиці і приведу результати невеликого тестування.

Формат Sypex Geo 2.1

З моменту публікації останньої статті, формат Sypex Geo (скорочено SxGeo) був оптимізований, а також додана можливість включення в БД двох довідників - міст і регіонів.

При створенні нового формату, ставилися наступні пріоритети:

  • висока швидкість
  • низьке споживання ресурсів
  • відкритість (специфікації формату бінарного файлу БД і API відкриті)
  • універсальність (можливість створення баз даних з будь-якими наборами даних)
Формат дозволяє зберігати дані в різній кодуванні. Після виходу з бети, будуть опубліковані скрипти для конвертації бази даних з MySQL в бінарний файл БД.

В БД зберігається наступна інформація:

  • ID країни
  • Код країни ISO 3166-1 (однорядкове резюме)
  • Код регіону FIPS 10-4 (однорядкове резюме)
  • Назва регіону (опціонально)
  • Місто
  • широта
  • довгота
  • Timezone (опціонально)
Цей список може бути змінений і / або розширений за необхідності. Більш детальну інформацію про формат SxGeo 2.1 можна знайти на сайті.

Власна база даних

Після дуже близького знайомства з популярною системою геолокації GeoLite City від MaxMind, було прийнято рішення про створення власної бази даних. Проблема полягає в тому, що в GeoLite City дуже багато неточностей, сміття, міст дублікатів, зайвого дроблення діапазонів, а також проблем з містами колишнього СРСР (наприклад, замість міст взяті назви фірм або імена відповідальних з Whois).

В даний момент база заснована на GeoLite City, але вже містить повністю перероблене покриття Росії, України і Білорусі. Поступово будуть уточнюватися інші країни, в першу чергу СНД і Європа. База даних Sypex Geo City містить назви міст і регіонів російською мовою в UTF-8 (зустрічаються ще не перекладені назви), а також timezone.

Крім того на сайті доступні інші бази даних перетворені в формат SxGeo 2.1.

Використання

Використання Sypex Geo API максимально спрощено.
1. Скопіювати SxGeo.php і SxGeoCity.dat (або інші бази) на сервер 2. Підключити файл SxGeo.php в свій скрипт, додавши рядок include ( "SxGeo.php"); 3. Створити об'єкт SxGeo // $ SxGeo \u003d new SxGeo (); // Режим за замовчуванням, файл бд SxGeo.dat $ SxGeo \u003d new SxGeo ( "SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Найшвидший режим 4. Визначаємо місто (SxGeo City, GeoLite City, IpGeoBase) $ SxGeo-\u003e get ($ ip); (Повертає інформацію про місто, без назви регіону і часового поясу) // $ SxGeo-\u003e getCityFull ($ ip); (Повертає повну інформацію про місто і регіон)

тестування продуктивності

І на десерт, невелике порівняльне тестування продуктивності. Як опоненти виступають GeoLite API і Geobaza API. Всі учасники тестування використовують бінарну базу даних власного формату, і використовують API на PHP. Тестування проходить під Win 7 (на Linux пропорції зберігаються), PHP 5.2.17.

Результати після 10 прогонів для кожного API в двох режимах (звичайному і з кешуванням в пам'яті) усереднення і округлення до десятків. Для кожного прогону створюється масив з 50 000 випадкових IP адрес, і в циклі здійснюється пошук кожним алгоритмом.

Пропозиція і побажання вітаються. Також шукаються бажаючі допомогти з портированием API на інші мови, і створенням модулів для Apache і nginx.

Оновлено 05.02.2016

В даний момент API Карт, що підключається в панелі управління uCoz повертає тільки країну і координати відвідувача.

Про замітці

Позиціонування покупця - одна з найважливіших завдань в електронній комерції.

У замітці будемо розглядати спосіб визначення країни, регіону і міста відвідувача для сайту. Вся інформація отримана з пісочниці API Яндекс.Карт, ми просто її підготуємо для магазину uCoz.

Підключення сервісу Яндекс.Карти

В першу чергу необхідно підключити сервіс карт в панелі управління сайтом. Для цього переходимо в настройки інтернет магазину.

В налаштуваннях перегортаємо вниз сторінки і вибираємо в пункті "Використовувати сервіс карт:" - Yandex Maps.

Тепер необхідно отримати API ключ для інтернет магазину, нам запропоновано перейти по посиланню "Отримати ключ для обраного API". Зробимо це.

На сторінці, заповнюємо дані і натискаємо "Отримати API ключ".

На сторінці, копіюємо отриманий API ключ і копіюємо його в панель управління сайтом.

позиціонування

В першу чергу необхідно в head сторінки (наприклад, оформлення замовлення) помістити код:

Тепер розміщуємо сам скрипт визначення місця розташування.

Чекаємо завантаження API і готовності DOM.

Ymaps.ready (init);

Записуємо розташування:

Function init () (// Дані про місцезнаходження, певному по IP var geolocation \u003d ymaps.geolocation; // Результат дивимося в консолі console.log (geolocation.country, geolocation.city, geolocation.region);)

Після того, як ми отримали дані про місцезнаходження, ми можемо робити з ними все, що захочемо: заповнити за користувача форму замовлення, відобразити особливі умови доставки, приховати непотрібні способи оплати, показати вартість доставки на сторінці товару.

Мінливаопис
geolocation.countryКраїна
geolocation.regionрегіон
geolocation.cityМісто

Заповнити форму адреси доставки

Розширимо наш скрипт, щоб полегшити користувачам оформлення замовлення, внесемо отримані дані про місцезнаходження в поле форми "Адреса доставки".

Для цього нам потрібно знати id поля з адресою доставки, для цього заходимо в Панель управління сайтом - Інтернет магазин - Управління полями замовлення. Дивимося останню перед символом "$" цифру в "Код поля для шаблону":

У прикладі це цифра 2, а id \u003d "order-fld-2". Тепер ми можемо взаємодіяти з цим полем. Якщо у вас підключений jQuery, то просто запишемо розташування в це поле.

If (geolocation) ($ ( "# order-fld-2"). Html (geolocation.country + "," + geolocation.region + "," + geolocation.city);) else (console.log ( "Не вдалося встановити місце розташування ");)

Ось що вийшло:

Разом

Об'єднаймо все разом і отримаємо:

Ymaps.ready (init); function init () (var geolocation \u003d ymaps.geolocation; if (geolocation) ($ ( "# order-fld-2"). html (geolocation.country + "," + geolocation.region + "," + geolocation.city );) else (console.log ( "Не вдалося встановити місце розташування");))

І не забудьте замінити id поля на свій і підключитив head сторінки. Успіхів!

Всім привіт!

Не скажу, що часто, але час від часу у розробників з'являється необхідність визначення міста по IP в PHP скрипт.

Наприклад, ви вирішили полегшити роботу користувачеві по введенню контактної інформації при оформленні замовлення в Інтернет магазині. Або хочете встановлювати мову інтерфейсу сайту в залежності від країни, з якої до вас на сайт зайшов відвідувач.

Ну, а найчастіше визначення міста по IP в PHP за допомогою GeoIP, напевно, потрібно розробникам різних рекламних мереж, щоб пропонувати користувачам таргетовану рекламу в залежності від географічного розташування.

Самому мені дізнатися країну по IP в PHP скрипт знадобилося всього один-єдиний раз, коли я вирішив завантажувати на сайт віджети різних соцмереж для користувачів з різних країн. Детальніше про те, навіщо чи не це знадобилося і що в підсумку вийшло, я напишу в наступній статті.

А поки поговоримо про те, скільки способів визначення міста та країни по IP в PHP існує і які варіанти їх реалізацій існують.

PHP GeoIP - стандартний функціонал стороннього виробництва

Я спеціально так назвав опис першого способу. Справа в тому, що в самому PHP визначити місто і країну по IP адресою можна - язик не має для цього необхідними інструментами.
Зате в офіційній документації є підказка, як це зробити.

PHP GeoIP - це стороння бібліотека, яку необхідно підключати додатково, незважаючи на те, що опис функцій, що входять в неї, є частиною офіційної документації PHP - http://php.net/manual/ru/ref.geoip.php

В принципі, мотиви розробників PHP цілком зрозумілі.

По-перше, включення даного модуля в комплект самої мови вимагає великої кількості серверних ресурсів.

По-друге, GeoIP PHP працює на базі переліку IP адрес, що відповідають певним країнам та містам. Тому GeoIP PHP вимагає постійної підтримки і розширення / модернізації існуючої бази, що було б зайвою головним болем розробників PHP.

Ну, і по-третє, визначення міста по IP в PHP - можливість досить рідко використовувана на практиці.

У підсумку, з огляду на ці факти PHP GeoIP є стороннім розширенням, підтримкою якого і створенням API для інтеграції на існуючих сайтах займається компанія MaxMind, посилання на яку є в описі даної бібліотеки.

Я не буду займатися описом процесу її установки на сервер, тому що я сам на практиці цим не займався, і в Інтернеті на даний момент повно мінлива по установці PHP GeoIP як на Linux, так і на Windows сервера.

Можу тільки сказати, що у даного способу визначення міста, країни та іншої гео інформації по IP в PHP є два істотні мінуси:

  1. Доступ до бази повної інформації по IP адресами, що надається компанією MaxMind, платний. Причому, сума в доларах, як не дивно 🙂 Безкоштовно доступні лише істотно урізані варіанти - http://dev.maxmind.com/geoip/geoip2/geolite2/
  2. З огляду на, що PHP GeoIP - стороннє розширення, його необхідно буде окремо встановлювати на сервер, що за умови використання shared хостингу може стати важким заходом. Можна звичайно, звернутися в техпідтримку, але не факт, що вам допоможуть. Мені, наприклад, при проханні встановити Sphinx відмовили.

Визначення міста по IP в PHP за допомогою альтернативних бібліотек

Ще один спосіб дізнатися місто за IP в PHP скрипт - це використання альтернативних серверних бібліотек і баз інформації для IP адрес, відмінних від MaxMind.

Але вони мають ті ж мінусами, що і попередній варіант, тому що є всього лише конкурентами MaxMind. Доступи до баз і можливість використання їх API також платна. Безкоштовно можна отримати тільки список країн і міст по IP, в той час як при платному тариф можна отримувати більш широкий перелік даних.

Єдина перевага над PHP GeoIP полягає в тому, що дані бібліотеки інтегруються в PHP коді, а не на рівні сервера, тобто їх можна використовувати навіть на shared хостингах.

Прикладом такої бібліотеки є надана сервісом db-ip.com.

До речі, зазначений мною сервіс надає не тільки свою PHP бібліотеку для отримання гео даних по IP клієнтів, але і доступ до баз інформації за адресами. Так що, в принципі, ніхто вам не заважає використовувати їх в PHP GeoIP, щоб використовувати його API, але інформацію брати з інших джерел.

Ну, і вже точно ніхто вам не заважає написати власний парсер файлів баз IP адрес для отримання з них інформації самостійно, без будь-яких сторонніх дозволів.

Як визначити місто за IP в PHP online

Ну, і ось я підійшов до фінального способу як дізнатися країну по IP в PHP та іншу гео інформацію, який використовував сам на практиці.

Він полягає у використанні API онлайн сервісів, які дозволяють отримувати дані по IP адресою в режимі онлайн.

Визначати місто по IP в PHP я вирішив саме таким способом, тому що він позбавлений головного недоліку попередніх. А саме, він найпростіший в реалізації - не потрібно нічого встановлювати і налаштовувати на сервері, а, тим більше, просити про це техпідтримку shared хостингів.

Для того, щоб отримати необхідну інформацію по IP, достатньо всього лише відправити запит на певний URL і обробити відповідь.

Що стосується вартості їх використання - в більшості своїй вони так само платні, тому що працюють, як правило, на основі існуючих комерційних баз IP. Але є і безкоштовні сервіси, які надають, можливо, на таку повну інформацію, як комерційні, але зате її можна отримувати в необмеженій обсязі.

Правда, вони дуже швидко припиняють своє існування, як не дивно, тому що вижити наданням подібних послуг дуже складно. Це показав мій аналіз безкоштовних online сервісів визначення міст і країн по IP, який я проводив в особистих цілях. Вони миготіли на багатьох сайтах, але при спробі скористатися ними було зрозуміло, що вони припинили своє існування.

У підсумку, я відшукав те, що мені було необхідно, ніж та хочу з вами визначитися - http://www.geoplugin.com/

Даний сервіс дозволяє як визначати місто і іншу інформацію по IP на сайті сервісу, так і виробляти це з коду. Далі я приведу приклад визначення країни по IP в PHP скрипт за допомогою geoplugin.com. коді здійснюється за допомогою коду, описаного в статті за посиланням.

"", "City" \u003d\u003e ""); if (filter_var ($ client, FILTER_VALIDATE_IP)) $ ip \u003d $ client; elseif (filter_var ($ forward, FILTER_VALIDATE_IP)) $ ip \u003d $ forward; else $ ip \u003d $ remote; $ Ip_data \u003d @json_decode (file_get_contents ( "http://www.geoplugin.net/json.gp?ip\u003d". $ Ip)); if ($ ip_data && $ ip_data-\u003e geoplugin_countryName! \u003d null) ($ result \u003d $ ip_data-\u003e geoplugin_countryCode;) echo $ result; ?\u003e

Як бачите, суть наведеного коду полягає у визначенні IP адреси клієнта, причому враховується можливість його підключення через проксі, і відправці запиту по API GeoPlugin з подальшим декодуванням і аналізом результатів.

У моєму прикладі, як я вже і говорив, результатом роботи даного скрипта буде код країни клієнта сайту. Взагалі, повний список повертаються параметрів виглядає так (для прикладу вирішив взяти IP Новосибірської області РФ):

( "Geoplugin_request": "195.208.128.3", "geoplugin_status": 200, "geoplugin_credit": "Some of the returned data includes GeoLite data created by MaxMind, available from http: \\ / \\ / www.maxmind.com<\/a>. "," Geoplugin_city ":" Novosibirsk "," geoplugin_region ":" Novosibirsk "," geoplugin_areaCode ":" 0 "," geoplugin_dmaCode ":" 0 "," geoplugin_countryCode ":" RU "," geoplugin_countryName ":" Russian Federation "," geoplugin_continentCode ":" EU "," geoplugin_latitude ":" 55.09 "," geoplugin_longitude ":" 82.6519 "," geoplugin_regionCode ":" 53 "," geoplugin_regionName ":" Novosibirsk "," geoplugin_currencyCode ":" RUB ", "geoplugin_currencySymbol": "руб", "geoplugin_currencySymbol_UTF8": "\\ u0440 \\ u0443 \\ u0431", "geoplugin_currencyConverter": 58.9289)

Як бачите, цей сервіс використовує згадуваний раніше MaxMind (параметр geoplugin_credit), але платну інформацію чи ні - складно припустити. З одного боку, посилання на джерело говорить про те, що використовується безкоштовний доступ до БД IP, але, з іншого, ми бачимо не тільки країну і місто, але і ще багато всякої інформації, включно з містом, географічні координати координати (langitude, latitude) , поточну валюту і навіть її курс.

Так що даний сервіс можна назвати PHP GeoIP онлайн. Єдина його відмінність від серверного аналога - то, що він отримує інформацію по IP трохи повільніше за рахунок відсутності серверного кешування. Але це ще не означає, що його немає на самому сервері GeoPlugin 😉 Так що недолік цей, скоріше, символічний.

У будь-якому випадку, розробники GeoPlugin заслуговують на оплески, а, особливо, ще й за те, що вони навіть не захарастили своє сайт контекстною рекламою. Тобто як вони взагалі виживають - незрозуміло. Єдиний спосіб сказати їм «спасибі» - це пожертвування на PayPal рахунок.

До речі, наведений мною PHP код для визначення міста по IP є універсальним. Можете його використовувати для отримання гео даних і за допомогою інших сервісів. Єдине, що вам потрібно буде в ньому змінити - це URL API сервісу та ім'я необхідних параметрів, які вам потрібно буде отримати.

На цьому у мене все. Пишіть ваші відгуки про статтю в коментарях нижче і не забувайте ділитися записом зі своїми друзями в соціальних мережах.

P.S.: Якщо вам потрібен сайт або необхідно внести правки на існуючий, але для цього немає часу і бажання, можу запропонувати свої послуги.

Більше 5 років досвіду професійної розробки сайтів. Робота з PHP, OpenCart, WordPress, Laravel, Yii, MySQL, PostgreSQL, JavaScript, React, Angular і іншими технологіями web-розробки.

Досвід розробки проектів різного рівня: лендінзі, корпоративні сайти, Інтернет магазини, CRM, портали. У тому числі підтримка і розробка HighLoad проектів. Надсилайте ваші заявки на email [Email protected] .

В якій згадувався мій «велосипед» відрізняється високою швидкістю роботи. Одним з популярних питань стала можливість визначення міста по IP.

І ось кілька місяців по тому, проект починався, як «for fun» переріс в самостійний проект.
Відкрито окремий сайт присвячений проекту Sypex Geo, на якому можна скачати свіжі версії API і баз даних, а також ознайомитися з документацією.

Для бажаючих скоріше протестувати правильність визначення міста по IP - ось посилання на демо-сторінку. А під хабракатом, я опишу деякі технічні подробиці і приведу результати невеликого тестування.

Формат Sypex Geo 2.1

З моменту публікації останньої статті, формат Sypex Geo (скорочено SxGeo) був оптимізований, а також додана можливість включення в БД двох довідників - міст і регіонів.

При створенні нового формату, ставилися наступні пріоритети:

  • висока швидкість
  • низьке споживання ресурсів
  • відкритість (специфікації формату бінарного файлу БД і API відкриті)
  • універсальність (можливість створення баз даних з будь-якими наборами даних)
Формат дозволяє зберігати дані в різній кодуванні. Після виходу з бети, будуть опубліковані скрипти для конвертації бази даних з MySQL в бінарний файл БД.

В БД зберігається наступна інформація:

  • ID країни
  • Код країни ISO 3166-1 (однорядкове резюме)
  • Код регіону FIPS 10-4 (однорядкове резюме)
  • Назва регіону (опціонально)
  • Місто
  • широта
  • довгота
  • Timezone (опціонально)
Цей список може бути змінений і / або розширений за необхідності. Більш детальну інформацію про формат SxGeo 2.1 можна знайти на сайті.

Власна база даних

Після дуже близького знайомства з популярною системою геолокації GeoLite City від MaxMind, було прийнято рішення про створення власної бази даних. Проблема полягає в тому, що в GeoLite City дуже багато неточностей, сміття, міст дублікатів, зайвого дроблення діапазонів, а також проблем з містами колишнього СРСР (наприклад, замість міст взяті назви фірм або імена відповідальних з Whois).

В даний момент база заснована на GeoLite City, але вже містить повністю перероблене покриття Росії, України і Білорусі. Поступово будуть уточнюватися інші країни, в першу чергу СНД і Європа. База даних Sypex Geo City містить назви міст і регіонів російською мовою в UTF-8 (зустрічаються ще не перекладені назви), а також timezone.

Крім того на сайті доступні інші бази даних перетворені в формат SxGeo 2.1.

Використання

Використання Sypex Geo API максимально спрощено.
1. Скопіювати SxGeo.php і SxGeoCity.dat (або інші бази) на сервер 2. Підключити файл SxGeo.php в свій скрипт, додавши рядок include ( "SxGeo.php"); 3. Створити об'єкт SxGeo // $ SxGeo \u003d new SxGeo (); // Режим за замовчуванням, файл бд SxGeo.dat $ SxGeo \u003d new SxGeo ( "SxGeoCity.dat", SXGEO_BATCH | SXGEO_MEMORY); // Найшвидший режим 4. Визначаємо місто (SxGeo City, GeoLite City, IpGeoBase) $ SxGeo-\u003e get ($ ip); (Повертає інформацію про місто, без назви регіону і часового поясу) // $ SxGeo-\u003e getCityFull ($ ip); (Повертає повну інформацію про місто і регіон)

тестування продуктивності

І на десерт, невелике порівняльне тестування продуктивності. Як опоненти виступають GeoLite API і Geobaza API. Всі учасники тестування використовують бінарну базу даних власного формату, і використовують API на PHP. Тестування проходить під Win 7 (на Linux пропорції зберігаються), PHP 5.2.17.

Результати після 10 прогонів для кожного API в двох режимах (звичайному і з кешуванням в пам'яті) усереднення і округлення до десятків. Для кожного прогону створюється масив з 50 000 випадкових IP адрес, і в циклі здійснюється пошук кожним алгоритмом.

Пропозиція і побажання вітаються. Також шукаються бажаючі допомогти з портированием API на інші мови, і створенням модулів для Apache і nginx.

 

 

Це цікаво: