Gelen bir soru üzerine böyle bir makale yazmak istedim. Konunun başlığından anlaşılacağı üzere bir IP adresinden hareket ederek kişiye ait lokasyon bilgilerine ulaşacağız. Bunun kullanım amacı ise genellikle formlarda ülke ve şehir seçimini kolaylaştırmaktır.
Başlarken...
GeoIP Nedir?
GeoIP, aslında buradaki linkten ulaşabileceğiniz bir web sitesi. Sitenin amacı girilen IP adresine göre bulunulan konumu belirtmek. Yani aslında bizim yapmamız gereken tek şey bu siteye özel bir bot yazmak ve ziyaretçilerimize kendi lokasyonlarını görme şansı vermek.
Nerelerde Kullanabilirim?
Bir form doldururken kişinin ülke ve il seçimlerinde tekrar uğraşmasını engellemek amacıyla oluşturacağınız bir buton veya otomatik olarak seçim yapmasını sağlayacağınız bir alanda kullanabilirsiniz. Burada önemli olan ise mutlaka sitenizde kişinin IP bilgisini kullanarak bu verileri kişiye gösterdiğinizi vurgulamanız.
Nasıl Yapacağız?
BİRİNCİ ADIM
İlk olarak aşağıdaki fonksiyonumuzu sayfamıza dahil edelim. Bu fonksiyon aracılığı ile kişini IP adresini PHP yardımıyla alabiliyoruz.
function ip()
{
$client = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote = $_SERVER['REMOTE_ADDR'];
if(filter_var($client, FILTER_VALIDATE_IP)){$ip = $client;}
elseif(filter_var($forward, FILTER_VALIDATE_IP)){$ip = $forward;}
else{$ip = $remote;}
return $client;
}
Artık biz ip() fonksiyonunu her çağırdığımızda ziyaretçimizin ip adresine ulaşmışız demektir. Artık ikinci kısma geçebiliriz.
İKİNCİ ADIM
Web sitemizin link yapısına göz atalım;
https://geoiptool.com/en/?ip=IPADRESI
Eğer biz bu linkte IPADRESI olarak belirtilen yere bir ip adresi yazarsak bizi o ip adresinin lokasyon bilgisine ulaştıracaktır. O zaman bu bilgiyi siteden nasıl çekeceğimize göz atalım.
ÜÇÜNCÜ ADIM
Öncelikle yukarıdaki ip() fonksiyonumuzu kullanarak ve akabinde file_get_contents ve preg_match_all fonksiyonlarının yardımı ile aşağıdaki duruma gelelim.
$ip = getUserIP();
$kaynak = file_get_contents("https://geoiptool.com/en/?ip=".$ip);
preg_match_all('@<div class="data-item">(.*?)</div>@si',$kaynak,$sonuc);
Yukarıdaki olayda preg_match_all ile aslında web siteye eriştikten sonra hangi aralıkları istediğimizi belirtiyoruz. Bizim verilerimizin hepsi sidebar'da ve sidebar alanına kaynaktan bakarsak şöyle bir sonuca ulaşacağız;
Yani;
<div class="data-item">(.*?)</div>
bu alan ile aslında data-item classına sahip içeriği farklı tüm alanları çekmiş oluyoruz. Ardından da hepsini bir dizi içerisinde sonuc değişkenine gönderiyoruz. Eğer sonuç değişkenimizi ekrana yazdırırsak;
Bu ve devam eden bir yapı bizleri karşılayacaktır fakat bu kadarı bizim için yeterli olacaktır. Yukarıda hostname, IP Address, Latitude ve Longitude alanlarını ben temizledim. Sizde kişiye ait bilgiler görüntülenecektir. Bu işlemden hemen sonra aşağıdaki kod yardımı ile hepsini ekrana çıktı verdirebiliriz;
for ($i=0; $i < count($sonuc[0]); $i++) {
$islem = $sonuc[0][$i];
$ayir = explode(":", $islem);
echo trim(strip_tags($ayir[0]))." = ".trim(strip_tags($ayir[1]))."<br/>";
}
Ve çıktımızda şöyle olacaktır;
Doğrudan hangi bilgiye erişmek istiyorsak son kodumuzu şöyle de kullanabiliriz;
for ($i=0; $i < count($sonuc[0]); $i++) {
$islem = $sonuc[0][$i];
$ayir = explode(":", $islem);
if(trim(strip_tags($ayir[0])) == "City") {
echo "Bulunduğunuz Şehir: ".$ayir[1];
break;
}
}
Burada "City" ibaresini değiştirerek istediğiniz bilgileri kullanıcınıza gösterebilirsiniz.
İyi Çalışmalar :)