[ANASAYFA] [LINUX] [AVUÇİÇİ] [WINDOWS] [WEB] [INTERNET] [BİLGİSAYAR] [ANTİK BİLGİ] [ARAMA]
POPÜLERLER
htmlders
sayisal loto sans topu
elmekyonlen
TDGTW-WarXing
eposta yazim kurallari
BearShare Morpheus ve iMeshi Hizlandirma Yolu
proxy-hiz
komutlar
linux ile windowslari uyutmak
squidle2kat
yedekleme
PDA ve cep telefonu icin www sayfasi yapimi
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.
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