Яндекс визначення міста по ip. Визначення місця розташування користувача
Визначення місця розташування користувача - вкрай корисна річ для інтернет-магазинів і для Лендінзі. Але і для простих сайтів буде також цікаво зробити, наприклад, автоматичне заповнення поля місто, країни і т.д. Власне, різного роду автозаповнення дозволять прискорити реєстрацію та оформлення замовлення.
установка
Підключаємо бібліотеку Яндекса:
Парс дані про розташування:
У тому, місці, де потрібно вивести місто, регіон та країну вставляємо:
Ви можете просто скопіювати всі три фрагменти і вставити в одному місці на сайті. Дивно, але Я перевіряв скрипт на демо-сайті та він не виводив ніяких даних. Вставивши на Урааа, скрипт видав всі дані по місту, регіону і країні. Причину чому на демо-сайті скрипт не працював поки не зрозумів.
Якщо ви хочете зробити автоматичне заповнення міста де або на сайті (наприклад, у формі замовлення), то дізнайтеся ID поля і замініть його вміст таким чином:
jQuery ( "# user-city"). val (ymaps.geolocation.city);
В якій згадувався мій «велосипед» відрізняється високою швидкістю роботи. Одним з популярних питань стала можливість визначення міста по IP.
І ось кілька місяців по тому, проект починався, як «for fun» переріс в самостійний проект.
Відкрито окремий сайт присвячений проекту Sypex Geo, на якому можна скачати свіжі версії API і баз даних, а також ознайомитися з документацією.
Для бажаючих скоріше протестувати правильність визначення міста по IP - ось посилання на демо-сторінку. А під хабракатом, я опишу деякі технічні подробиці і приведу результати невеликого тестування.
Формат Sypex Geo 2.1
З моменту публікації останньої статті, формат Sypex Geo (скорочено SxGeo) був оптимізований, а також додана можливість включення в БД двох довідників - міст і регіонів.При створенні нового формату, ставилися наступні пріоритети:
- висока швидкість
- низьке споживання ресурсів
- відкритість (специфікації формату бінарного файлу БД і API відкриті)
- універсальність (можливість створення баз даних з будь-якими наборами даних)
В БД зберігається наступна інформація:
- ID країни
- Код країни ISO 3166-1 (однорядкове резюме)
- Код регіону FIPS 10-4 (однорядкове резюме)
- Назва регіону (опціонально)
- Місто
- широта
- довгота
- Timezone (опціонально)
Власна база даних
Після дуже близького знайомства з популярною системою геолокації 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 є два істотні мінуси:
- Доступ до бази повної інформації по IP адресами, що надається компанією MaxMind, платний. Причому, сума в доларах, як не дивно 🙂 Безкоштовно доступні лише істотно урізані варіанти - http://dev.maxmind.com/geoip/geoip2/geolite2/
- З огляду на, що 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 відкриті)
- універсальність (можливість створення баз даних з будь-якими наборами даних)
В БД зберігається наступна інформація:
- ID країни
- Код країни ISO 3166-1 (однорядкове резюме)
- Код регіону FIPS 10-4 (однорядкове резюме)
- Назва регіону (опціонально)
- Місто
- широта
- довгота
- Timezone (опціонально)
Власна база даних
Після дуже близького знайомства з популярною системою геолокації 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.