Получение местоположения с IP-адреса - PullRequest
183 голосов
/ 04 января 2009

Я хочу получить информацию о городе, штате и стране посетителя с его IP-адреса, чтобы я мог настроить свою веб-страницу в соответствии с их местоположением. Есть ли хороший и надежный способ сделать это в PHP? Я использую JavaScript для сценариев на стороне клиента, PHP для сценариев на стороне сервера и MySQL для базы данных.

Ответы [ 24 ]

0 голосов
/ 02 октября 2018

Старый пост, но все же, я попробовал почти все услуги, предлагаемые здесь, и наиболее точный и быстрый, который я использую для производства: https://ip2location -api.com

У них есть решения на стороне сервера и клиента, форматы JSON / XML / CSV / PHP, обратный вызов функций json ajax или javascript, ознакомьтесь с документацией здесь

{"as":"AS15169 Google LLC","city":"Newark","country":"United States","countryCode":"US","isp":"Google Cloud","lat":40.7357,"lon":-74.1724,"org":"Google Cloud","query":"35.188.125.133","region":"NJ","regionName":"New Jersey","status":"success","timezone":"America/New_York","zip":"07175"}
0 голосов
/ 23 августа 2012

Я написал эту статью несколько месяцев назад и может быть полезен для вас. В статье рассказывается об использовании базы данных с открытым исходным кодом страны ip 2, а также рассказывается о классе php, который я написал, чтобы эта база данных с открытым исходным кодом работала. Вот ссылка
http://www.samundra.com.np/find-visitors-country-using-his-ip-address/1018

Если вам нужна помощь, пожалуйста, напишите мне комментарий на сайте.

Надеюсь, это поможет вам.

0 голосов
/ 09 июня 2015

Если вы ищете обновленную / точную базу данных, я рекомендую использовать эту здесь , потому что она показывала мое точное местоположение, которое не было включено во многие другие службы, когда я тестировал.
(Мой город был Rasht, а моя страна была Iran с этим IP-адресом: 2.187.21.235, когда я проводил тестирование.)

Я рекомендую использовать базу данных, а не методы API, потому что она будет обрабатываться намного быстрее локально.

0 голосов
/ 15 декабря 2015

Хорошо, ребята, спасибо за ваши предложения; Несмотря на то, что у меня 6k + IP-адресов, некоторые сервисы не выполняли мои запросы из-за некоторых ограничений; Таким образом, вы можете использовать их все в резервном режиме;

Если у нас есть исходный файл в следующем формате:

user_id_1  ip_1
user_id_2  ip_2
user_id_3  ip_1

, чем вы можете использовать эту простую команду примера (PoC) для Yii:

class GeoIPCommand extends CConsoleCommand
{

public function actionIndex($filename = null)
{
    //http://freegeoip.net/json/{$ip} //10k requests per hour
    //http://ipinfo.io/{$ip}/json //1k per day
    //http://ip-api.com/json/{$ip}?fields=country,city,regionName,status //150 per minute

    echo "start".PHP_EOL;

    $handle      = fopen($filename, "r");
    $destination = './good_locations.txt';
    $bad         = './failed_locations.txt';
    $badIP       = [];
    $goodIP      = [];

    $destHandle = fopen($destination, 'a+');
    $badHandle  = fopen($bad, 'a+');

    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $result = preg_match('#(\d+)\s+(\d+\.\d+\.\d+\.\d+)#', $line, $id_ip);
            if(!$result) continue;

            $id = $id_ip[1];
            $ip = $id_ip[2];
            $ok = false;

            if(isset($badIP[$ip])) 
            {
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                continue;
            }

            if(isset($goodIP[$ip]))
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $goodIP[$ip]);
                continue;
            }

            $query = @json_decode(file_get_contents('http://freegeoip.net/json/'.$ip));
            $city = property_exists($query, 'region_name')? $query->region_name : '';
            $city .= property_exists($query, 'city') && $query->city && ($query->city != $city) ? ', ' . $query->city : '';

            if($city)
            {
                fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                $ok = true;
            }

            if(!$ok)
            {
                $query = @json_decode(file_get_contents('http://ip-api.com/json/'. $ip.'?fields=country,city,regionName,status'));
                if($query && $query->status == 'success')
                {
                    $city = property_exists($query, 'regionName')? $query->regionName : '';
                    $city .= property_exists($query, 'city') && $query->city ? ',' . $query->city : '';

                    if($city)
                    {
                        fputs($destHandle, sprintf('"id":"%u","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city));
                        echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, $city);
                        $ok = true;
                    }
                }
            }

            if(!$ok)
            {
                $badIP[$ip] = false;
                fputs($badHandle, sprintf('%u %s'. PHP_EOL, $id, $ip));
                echo sprintf('"id":"%s","ip":"%s","from":"%s";'. PHP_EOL, $id, $ip, 'Unknown');
            }

            if($ok)
            {
                $goodIP[$ip] = $city;
            }
        }

        fclose($handle);
        fclose($badHandle);
        fclose($destHandle);
    }else{
        echo 'Can\'t open file' . PHP_EOL; 
        return;
    }

    return;
}

}

Это какой-то дерьмовый код, но он работает. Использование:

./yiic geoip index --filename="./source_id_ip_list.txt"

Не стесняйтесь использовать, модифицировать и делать это лучше)

...