[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Определение страны посетителя
pavluxa09
Здравствуйте. Подскажите как можно определить страну посетителя не используя соединение с сервисами. То-есть работая автономно. Заранее спасибо



Спустя 2 часа, 3 минуты, 43 секунды (19.07.2009 - 09:35) Nikitian написал(а):
Качаете например отсюда базы и определяете по ним локально. Можно узнать даже город и примерные координаты этого города.

Спустя 24 минуты, 6 секунд (19.07.2009 - 09:59) pavluxa09 написал(а):
А как с этой базой работать то?

Спустя 3 часа, 38 минут, 49 секунд (19.07.2009 - 13:37) Nikitian написал(а):
Сперва данный csv необходимо забить в базу, а потом делаете запрос вида
SQL
select c.latitude, c.longitude from tbl_map_networks as n left join tbl_map_cities as c on (c.id=n.id) where n.from_ip<=INET_ATON($ip) and n.to_ip>=INET_ATON($ip) and n.len>0 order by n.len limit 1
где $ip - IP клиента, а n.len - разница межды from_ip и to_ip, которую вычисляете при загрузке базы.
Скрипт обновления сетей:
PHP
<pre><?php
/*
Добавление сетей в базу
*/
include_once(dirname(__FILE__).'/start.php');//Скрипт подключения к базе и инициализации всякой нечисти.
$file=dirname(__FILE__).'/../_uploads/networks'.date('YmdHis').'.txt';
echo
"Downloading...\n";
file_put_contents($file,download('http://www.ip2city.ru/index.php?action=get_all_networks'));
echo
"Downloaded ".filesize($file)." bytes\n";
$handle fopen($file"r");
$c=0;
$ok=0;
while((
$data=fgetcsv($handle,1000,','))!==FALSE)
    {
    if(!isset(
$data[4]))die('Error');
    
$c++;
    echo 
$c.') '.$data[1].':';
    if(
abs($data[3]-$data[2])<100000000)
        {
        
$r=mysql_query('replace into '.('tbl_map_networks').' set 
            id='
.intval($data[1]).',
            from_ip='
.intval($data[2]).',
            to_ip='
.intval($data[3]).',
            len='
.intval(abs($data[3]-$data[2])).',
            country_code="'
.mysql_escape_string($data[0]).'",
            description="'
.mysql_escape_string(iconv('cp1251','utf-8',$data[4])).'"');
        echo(
$r?'OK':mysql_error())."\n";
        if(
$r)$ok++;
        }
    else
        {
        echo
"So more length [".abs($data[3]-$data[2])."]\n";
        }
    
flush();
    }
fclose($handle);
mysql_query('optimize table '.('tbl_map_networks'));
echo
"All: ".$c." and good ".$ok." ips\n";
echo 
"\n".date('H:i:s d.m.Y')."\n";

Скрипт обновления базы городов
PHP
<pre><?php
/*
Добавление сетей в базу
*/
include_once(dirname(__FILE__).'/start.php');//Скрипт подключения к базе и инициализации всякой нечисти.
$file=dirname(__FILE__).'/../_uploads/cities'.date('YmdHis').'.txt';
echo
"Downloading...\n";
file_put_contents($file,download('http://www.ip2city.ru/index.php?action=get_all_cities'));
echo
"Downloaded ".filesize($file)." bytes\n";
$handle fopen($file"r");
$c=0;
$ok=0;
while((
$data=fgetcsv($handle,1000,','))!==FALSE)
    {
    
$c++;
    if(
$c==1)continue;
    if(!isset(
$data[10]))die('Error');
    echo 
$c.') '.iconv('cp1251','utf-8',$data[1]).':';
    
$result=mysql_query('select latitude,longitude from '.('tbl_map_cities').' where id='.intval($data[0]).' limit 1');
    if(
$result && mysql_num_rows($result)==1)
        {
        
$res=mysql_fetch_assoc($result);
        if(
$res['latitude']==&& $res['longitude']==0)$go=true;
        else 
$go=false;
        }
    else
        
$go=true;
    if(
$go)
        {
        
$r=mysql_query('replace into '.('tbl_map_cities').' set 
            id="'
.mysql_escape_string($data[0]).'",
            name="'
.mysql_escape_string(iconv('cp1251','utf-8',$data[1])).'",
            nameen="'
.mysql_escape_string($data[2]).'",
            region="'
.mysql_escape_string(iconv('cp1251','utf-8',$data[3])).'",
            regionen="'
.mysql_escape_string($data[4]).'",
            latitude="'
.mysql_escape_string($data[5]).'",
            longitude="'
.mysql_escape_string($data[6]).'",
            countryid="'
.mysql_escape_string($data[7]).'",
            countrycode="'
.mysql_escape_string($data[8]).'",
            country="'
.mysql_escape_string(iconv('cp1251','utf-8',$data[9])).'",
            countryen="'
.mysql_escape_string($data[10]).'"');
        echo(
$r?'OK':mysql_error());
        if(
$r)$ok++;
        }
    echo
"\n";
    
flush();
    }
fclose($handle);
echo
"All cities: ".$c."\nAdding cities: ".$ok."\n";
mysql_query('optimize table '.('tbl_map_cities'));
echo 
"\n".date('H:i:s d.m.Y')."\n";

Там используются где-то мои функции, но переписать их думаю не составит труда.
Вот таблички:
SQL
CREATE TABLE `tbl_map_cities` (
`id` int(11) unsigned NOT NULL,
`name` varchar(55) collate utf8_unicode_ci NOT NULL,
`nameen` varchar(55) collate utf8_unicode_ci NOT NULL,
`region` varchar(55) collate utf8_unicode_ci NOT NULL,
`regionen` varchar(55) collate utf8_unicode_ci NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
`countryid` int(11) unsigned NOT NULL,
`countrycode` char(2) collate utf8_unicode_ci NOT NULL,
`country` varchar(55) collate utf8_unicode_ci NOT NULL,
`countryen` varchar(55) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`,`nameen`,`latitude`,`longitude`,`countryid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


CREATE TABLE `map_networks` (
`id` int(11) unsigned NOT NULL,
`from_ip` bigint(20) unsigned NOT NULL,
`to_ip` bigint(20) unsigned NOT NULL,
`len` bigint(20) unsigned NOT NULL,
`country_code` char(2) collate utf8_unicode_ci NOT NULL,
`description` varchar(255) collate utf8_unicode_ci NOT NULL,
UNIQUE KEY `from_ip` (`from_ip`,`to_ip`,`len`),
KEY `id` (`id`),
KEY `country_code` (`country_code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Спустя 9 месяцев, 1 день, 21 час, 28 минут, 26 секунд (21.04.2010 - 11:06) Никита написал(а):
Я так полагаю
file_put_contents($file,download('http://www.ip2city.ru/index.php?action=get_all_cities'));

download - это какаято функция? потому что он не хочет качать файл

Спустя 1 час, 44 минуты, 41 секунда (21.04.2010 - 12:51) antonov_sa написал(а):
http://ipgeo-base.ru/
простой апи, есть написанные функции для работы, очень удобно, и не нужно будет ковыряться с гигантской базой, которую нужно постоянно обновлять

Спустя 1 час, 55 минут, 56 секунд (21.04.2010 - 14:47) Никита написал(а):
на сколько я понял там уклон на русские ИПы, а иностранные не все
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.