KlavyeMonitor.com    


MENÜ

. ANASAYFA

. KABLOSUZ & TELSİZ

. AVUÇİÇİ & CEP

. LINUX

. WINDOWS

. WEB

. INTERNET

. BİLGİSAYAR

. ANTİK BİLGİ

. ARAMA

. BAĞLANTILAR
. Spam Gönderenler

POPÜLERLER

QR Code Üretici

htmlders

linux kitapları

proxy adresleri kablo

sayisal loto sans topu

elmekyonlen

TDGTW-WarXing

eposta yazim kurallari

BearShare Morpheus ve iMeshi Hizlandirma Yolu

proxy-hiz

komutlar

web hosting hizmetleri

inet-hiz

linux ile windowslari uyutmak

squidle2kat

yedekleme

internet hizi

database oracle mysql sql komutlari

windows mydoom virus

PDA ve cep telefonu icin www sayfasi yapimi


= = =

Favorilere ekle
Google




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


 
 
 
   
Bu sayfaları Linux'ta oluşturan programı yazan: İlker Fıçıcılar