определить страну по IP-адресу
Товарищи, реально-ли определить страну по IP-адресу машины, с которой осуществляется загрузка моего сайта?
ну и куча сервисов основанных на ней например: http://ipw.panarmenian.net/ip_whois/
Определить реально!
Вот тут вот лежат и периодически обновляются IP-адреса. Расписаны по странам. Примерно год назад я тут уже выкладывал класс для работы со всей этой бедой.
Код:
class IP
{
private $DB;
private $countryArray;
const FILES_DIR = "http://www.completewhois.com/statistics/data/ips-bycountry/rirstats/";
const COUNTRYS_FILE = "1ST-READ-THIS.txt";
const SUFFIX_FILE = "-netrange.txt";
public function __construct(&$db){
$this->DB = $db;
$this->createTables();
}
public function readAllFiles(){
foreach($this->getCountryCodes() as $row){
$ipf = file(IP::FILES_DIR.$row.IP::SUFFIX_FILE);
foreach($ipf as $str){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+(\d+\.\d+\.\d+\.\d+)/", $str, $arr, PREG_SET_ORDER);
if(sizeof($arr)){
$this->replaceIPAddresses(ip2long($arr[0][1]), ip2long($arr[0][2]), $row);
}
}
}
}
private function getCountryCodes(){
return $this->DB->getCol("SELECT cc FROM ip_countrys", "cc");
}
private function replaceIPAddresses($addressFirst, $addressLast, $countryCode){
$query = "REPLACE ip_addresses
SET
ip_first = '$addressFirst',
ip_last = '$addressLast',
cc = '$countryCode'";
$this->DB->Query($query);
}
public function readFirst($file){
$arr = file($file);
foreach($arr as $row){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+([A-Za-z]+)\s+\-\s+(\w+)/", $row, $pstr, PREG_SET_ORDER);
if(sizeof($pstr)){
$this->replaceCountryCode($pstr[0]);
}
}
}
private function replaceCountryCode($arr){
$query = "REPLACE ip_countrys
SET
cc = '{$arr[2]}',
name = '{$arr[3]}',
a_dns = '{$arr[1]}'
";
$this->DB->Query($query);
}
private function createTables(){
$sql = "
CREATE TABLE IF NOT EXISTS `ip_addresses` (
`ip_first` bigint(20) NOT NULL default '0',
`ip_last` bigint(20) NOT NULL default '0',
`cc` char(2) NOT NULL default '',
KEY `ip_last` (`ip_last`),
KEY `cc` (`cc`),
KEY `ip_first` (`ip_first`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ";
$this->DB->Query($query);
$sql ="
CREATE TABLE IF NOT EXISTS `ip_countrys` (
`cc` char(2) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`a_dns` varchar(15) NOT NULL default '',
PRIMARY KEY (`cc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
";
$this->DB->Query($query);
}
}
$DBC = new DBUV();
$DBC->Connect();
$ip = new IP($DBC);
$ip->readFirst(FIRST_FILE);
$ip->readAllFiles();
foreach($DBC->Get_assoc_array("SELECT * FROM ip_addresses WHERE cc='BH' ORDER BY ip_first, ip_last") as $row){
echo long2ip($row['ip_first'])." - ".long2ip($row['ip_last'])."<br>";
}
{
private $DB;
private $countryArray;
const FILES_DIR = "http://www.completewhois.com/statistics/data/ips-bycountry/rirstats/";
const COUNTRYS_FILE = "1ST-READ-THIS.txt";
const SUFFIX_FILE = "-netrange.txt";
public function __construct(&$db){
$this->DB = $db;
$this->createTables();
}
public function readAllFiles(){
foreach($this->getCountryCodes() as $row){
$ipf = file(IP::FILES_DIR.$row.IP::SUFFIX_FILE);
foreach($ipf as $str){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+(\d+\.\d+\.\d+\.\d+)/", $str, $arr, PREG_SET_ORDER);
if(sizeof($arr)){
$this->replaceIPAddresses(ip2long($arr[0][1]), ip2long($arr[0][2]), $row);
}
}
}
}
private function getCountryCodes(){
return $this->DB->getCol("SELECT cc FROM ip_countrys", "cc");
}
private function replaceIPAddresses($addressFirst, $addressLast, $countryCode){
$query = "REPLACE ip_addresses
SET
ip_first = '$addressFirst',
ip_last = '$addressLast',
cc = '$countryCode'";
$this->DB->Query($query);
}
public function readFirst($file){
$arr = file($file);
foreach($arr as $row){
preg_match_all("/(\d+\.\d+\.\d+\.\d+)\s+\-\s+([A-Za-z]+)\s+\-\s+(\w+)/", $row, $pstr, PREG_SET_ORDER);
if(sizeof($pstr)){
$this->replaceCountryCode($pstr[0]);
}
}
}
private function replaceCountryCode($arr){
$query = "REPLACE ip_countrys
SET
cc = '{$arr[2]}',
name = '{$arr[3]}',
a_dns = '{$arr[1]}'
";
$this->DB->Query($query);
}
private function createTables(){
$sql = "
CREATE TABLE IF NOT EXISTS `ip_addresses` (
`ip_first` bigint(20) NOT NULL default '0',
`ip_last` bigint(20) NOT NULL default '0',
`cc` char(2) NOT NULL default '',
KEY `ip_last` (`ip_last`),
KEY `cc` (`cc`),
KEY `ip_first` (`ip_first`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ";
$this->DB->Query($query);
$sql ="
CREATE TABLE IF NOT EXISTS `ip_countrys` (
`cc` char(2) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`a_dns` varchar(15) NOT NULL default '',
PRIMARY KEY (`cc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
";
$this->DB->Query($query);
}
}
$DBC = new DBUV();
$DBC->Connect();
$ip = new IP($DBC);
$ip->readFirst(FIRST_FILE);
$ip->readAllFiles();
foreach($DBC->Get_assoc_array("SELECT * FROM ip_addresses WHERE cc='BH' ORDER BY ip_first, ip_last") as $row){
echo long2ip($row['ip_first'])." - ".long2ip($row['ip_last'])."<br>";
}
$DBC - класс, которым я пользуюсь для работы с MySQL. Названия его методов интеллектуально понятны, поэтому переделать труда не составит.
Ну а уж что со всем этим делать дальше - думаю объяснять не надо...
А что это за база?
MySQL
Я имею ввиду базу IP-шников. Что это за ресурс? Он надежный?
Сколько себя помню - существует и постоянно обновляется. Да и просто посмотри на адрес и на время файлов...