Определение местоположения посетителя по IP-адресу в PHP

Несколько способов определить примерное местоположение пользователя по IP-адресу.

Sypex Geo – продукт для определение местоположения посетителя по IP-адресу, распространяется по лицензии BSD, т. е. является абсолютно бесплатным. Получив IP-адрес, Sypex Geo выдает информацию о местоположении посетителя – страну, регион, город, географические координаты из локальной базы данных, которая периодически обновляется.

Пример использования:

<?php
include_once __DIR__ . '/SxGeo/SxGeo.php';
$SxGeo = new SxGeo(__DIR__ . '/SxGeo/SxGeoCity.dat', SXGEO_BATCH | SXGEO_MEMORY); 			
$res = $SxGeo->getCityFull($_SERVER['REMOTE_ADDR']); 		
print_r($res);
PHP

Результат:

Array
(
    [city] => Array
        (
            [id] => 5391811
            [lat] => 3271533
            [lon] => -11715726
            [name_ru] => Сан-Диего
            [name_en] => San Diego
        )

    [region] => Array
        (
            [id] => 5332921
            [name_ru] => Калифорния
            [name_en] => California
            [iso] => US-CA
        )

    [country] => Array
        (
            [id] => 225
            [iso] => US
            [lat] => 3976
            [lon] => -9850
            [name_ru] => США
            [name_en] => United States
        )

)

IP Geolocation API – бесплатен для некоммерческого использования, ключ к API не требуется. Сервис возвращает данные в формате JSON, XML, CSV, Newline, PHP (serialize) по GET-запросу.

Ограничения

45 запросов в минуту с одного IP-адреса, при превышении лимита будет отдаваться 429-я ошибка до тех пор, пока не будет сброшено ограничение. Если вы постоянно превышаете лимит, ваш IP-адрес будет заблокирован на 1 час.

Пример использования:

<?php
$ch = curl_init('http://ip-api.com/json/' . $_SERVER['REMOTE_ADDR'] . '?lang=ru');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
 
$res = json_decode($res, true);
print_r($res);
PHP

Результат:

Array
(
    [status] => success
    [country] => США
    [countryCode] => US
    [region] => VA
    [regionName] => Виргиния
    [city] => Ашберн
    [zip] => 20149
    [lat] => 39,0438
    [lon] => -77,4874
    [timezone] => America/New_York
    [isp] => Amazon.com
    [org] => AWS EC2 (us-east-1)
    [as] => AS14618 Amazon.com, Inc.
    [query] => 44.192.114.32
)

Среди разделов сайта «DaData.ru» есть сервис «Город по IP-адресу», после регистрации по ключу можно получить детальную информацию о городе, в том числе почтовый индекс.

Бесплатен до 10 000 запросов в сутки, максимум 20 запросов в секунду.

<?php
$ch = curl_init('https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address?ip=' . $_SERVER['REMOTE_ADDR']);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);
 
$res = json_decode($res, true);
print_r($res);
PHP

Результат:

Array
(
    [location] => 
)
25.09.2020, обновлено 04.12.2021
17278

Комментарии

, чтобы добавить комментарий.

Другие публикации

Фильтрация IP-адресов
Примеры как запретить доступ к сайту по IP-адресам в PHP и htaccess.
9449
+1
Получить DNS записи домена в PHP
Функция dns_get_record($domain) поучает все записи домена, подробнее на php.net.
3140
0
Whois, как получить данные IP-адреса и домена в PHP
Несколько примеров как в PHP получить информацию о домене и IP-адресе.
11956
+4
Массив $_SERVER
Описание значений глобального массива $_SERVER с примерами.
27633
+2
Синхронизация файлов между сайтами
Такой вопрос возникает когда у сайта есть копия, например региональный сайт или сайт на другом языке, но при этом база...
2711
+1
Вход на сайт через Вконтакте
Многие соцсети позволяют создавать приложения и через API получать данные пользователей, поэтому их использует для быстрой регистрации и авторизации на сайтах.
29978
+10