IP Adresinden Ülke ve Şehir Saptama
IP adresinden nasıl ülke ve şehir tespiti, coğrafi konum tespiti
yapabilir ve bu GPS koordinatlarını web sitemizde nasıl kullanabiliriz.
İnternette geoIP denilen IP ve coğrafi konum veritabanları bulunuyor.
Bunlardan http://maxmind.com/ adresindeki ticari iken
http://hostip.info/ adresindeki veritabanı ücretsiz olarak indirilebiliyor.
HostIP'nin sürekli güncellenen IP-Yer veritabanını rsync ile çekebiliyoruz.
Rsync'in yararlı yönü yalnızca değişen bölümleri güncelleyerek,
veri indirme işini çok çabuk tamamlayabilmesi... HostIP'nin GeoIP
veritabanları üç ayrı biçimde tutuluyor: Virgülle ayrılmış düz yazı
dosyası (CSV), Berkeley DB, ve Mysql Dump.
Bu veritabanlarından kullanımı en kolay ve hızlı olanı Berkeley DB
olduğundan bunu kullanacağız. Rsync ile bu geoIP database'i çekmek için
şu komutu UNIX işletim sistemimizde komut satırına (CLI) giriyoruz:
rsync -avz --progress db.hostip.info::hostip/berkelydb/ berkelydb/
Bu işlem sonunda berkelydb/ alt-klasörüne şu üç veritabanı dosyası
indirilmiş olacaktır:
hip_countries.db
hip_ip4_city_lat_lng.db
hip_ip4_country.db
Bunlardan hip_countries.db ülke kodu ile ülke adı bilgisini içeriyor,
hip_ip4_country.db ise IP'den ülke kodu bilgisini barındırıyor.
Aşağıdaki örnekte kullanacağımız hip_ip4_city_lat_lng.db
Berkeley veritabanı dosyası ise IP'den şehir ve şehir enlem-boylam
koordinatları bilgilerini içeriyor.
İlk örnek, komut satırından kullanım için bir python programı:
#!/usr/bin/python
import bsddb
import sys
db = bsddb.btopen("berkelydb/hip_ip4_city_lat_lng.db","r")
ip=sys.argv[1]
ip=ip.strip()
sip=ip.split(".")
iip=int(sip[0])*256*256*256+int(sip[1])*256*256+int(sip[2])*256
anahtar=str(iip)
deger=""
if db.has_key(anahtar):
deger=db[anahtar]
# print anahtar
deger=deger.replace(" ","\t")
deger=deger.replace("%20"," ")
deger=deger.replace("%2C",",")
print ip+"\t",
print deger
Bu örnek programda önce veritabanı dosyasını okumak üzere açıyoruz,
ardından komut satırında komutu çağırırken parametre olarak girdiğimiz
string verisi biçimindeki IP'mizin sağında solunda olabilecek
alt satır / boşluk gibi karakterleri .strip() ile siliyoruz. Sonra
.split(".") ile IP'yi basamaklarına ayırıyoruz. Veritabanında, IP'lerin
ilk üç basamağı tek bir tamsayı biçiminde tutuluyor. Bu sayıya
ulaşmak için ilk basamağı 256'ın 3. kuvvetiyle, ikinci basamağı 256'nın
2. kuvvetiyle, ve üçüncü basamağı da 256'nın birinci kuvvetiyle çarpıp
bu çarpımları topluyoruz. Eğer veritabanı dört basamağı da tutuyor olsa,
bu çarpıma IP'nin son basamağını ekleyecektik (yani 256'nın 0. kuvveti
olan 1 ile çarpımını), ama bu veritabanında eklemiyoruz.
Bu çarpım sonucu bulduğumuz tamsayı, veritabanında anahtar
olarak kullanılıyor. Bu anahtarın bulunup bulunmadığını
db.has_key(anahtar) ile yokluyoruz. Eğer varsa karşılık gelen
değeri, yani şehir ve coğrafi konum bilgisini db[anahtar] ile alıyoruz.
Ardından bu değerdeki boşluk ve virgül karakterlerini düzeltip basıyoruz.
Hepsi bu.
Programı calıştırılabilir yapmak için mesela bu kodu geoip.py
adıyla kaydetmişsek önce chmod 755 geoip.py komutuyla çalıştırılabilir
yapıyoruz. Ardından şu şekilde çağırabiliriz:
./geoip.py 144.122.144.137
Şöyle bir çıktı verecektir:
144.122.144.137 Ankara 39.9167 32.9167
Az önceki IP ODTÜ'nün web sitesinin IP adresiydi.
Benzer biçimde, başka bir IP için mesela Boğaziçi Üniversitesi'nin
web sitesinin bulunduğu IP için denersek:
# ./geoip.py 193.140.192.15
193.140.192.15 Istanbul 41.02 28.97
Sağdaki iki adet ondalıklı sayı ise o şehrin enlem ve boylamı.
Bunları openstreetmap gibi bir haritaya parametre olarak vererek
o şehrin haritasını da alabiliriz. Örneğin bu 41.02 ile 28.97'yi
openstreetmap.org'a girersek:
http://www.openstreetmap.org/?mlat=41.02&mlon=28.97&zoom=11
... o koordinatın haritasını açabiliriz.
IP'den Coğrafi Bilgi Veritabanını Web Sitelerimizde Nasıl Kullanırız
Yukarıdaki Python programını basit bir PHP işlevi biçiminde de yazabiliriz.
Örneğin aşağıdaki kodu bir PHP sayfanıza ekleyin:
<?php
function f_geoip($ip) {
$db = dba_open("berkelydb/hip_ip4_city_lat_lng.db","r","db4");
$sonuc=array();
$ip=trim($ip);
$sip=explode(".",$ip);
$iip=$sip[0]*256*256*256+$sip[1]*256*256+$sip[2]*256;
$anahtar=$iip;
$deger="";
if ( dba_exists($anahtar,$db) ) {
$deger=dba_fetch($anahtar,$db);
$deger=str_replace(" ","\t",$deger);
$deger=str_replace("%20"," ",$deger);
$deger=str_replace("%2C",",",$deger);
$veri=explode("\t",$deger);
$sonuc[0]=$ip;
$sonuc[1]=$veri[0]; // Kent
$sonuc[2]=$veri[1]; // Enlem
$sonuc[3]=$veri[2]; // Boylam
}
dba_close($db);
return $sonuc;
} // func
?>
Ardından bunu PHP web sayfanızda ilgili bir yerde kullanıcının
IP'sini alarak, uygulamanızda gerek duyduğunuz biçimde değerlendirebilirsiniz.
Yukarıda yazdığımız f_geoip fonksiyonu tek bir dizi içinde 4 değer
döndürüyor: IP, Şehir, Enlem ve Boylam:
<?php
$ip="193.140.28.7"; // Samsun 19 Mayıs Üniversitesi
$cikti=f_geoip($ip);
print_r ($cikti);
?>
Array
(
[0] => 193.140.28.7
[1] => SAMSUN
[2] => 41.05
[3] => 39.45
)
Bunları nasıl kullanacağınız ise artık sizin hayalgücünüze kalıyor.
İlker Fıçıcılar 26 Ekim 2011
İlgili Benzer Yazılar:
Arama önerileri:
GeoIP,
GPS,
Coğrafi Bilgi Sistemi,
CBS,
IP,
Kaynak gösterecekler için referans:
"IP Adresinden Ülke ve Şehir Saptama",
İlker Fıçıcılar,
http://www.KlavyeMonitor.com/ip_adresi_ile_ulke_sehir_bulma.html
, Ekim 2011
|