İçeriğe geç

PHP ile IP Lokasyon Bulma

Kullanıcıların lokasyon bilgilerini bulmak çok önemli bir detaydır. Bu veriyi herhangi bir işlemde kullanabilirsiniz. Örneğin; bir e-ticaret veya bir ilan siteniz vardır. Üyelerinize bölgelerindeki fırsatları göstermek isteyebilirsiniz. Letgo da böyle yapmıyor mu? Ya da bir haber veya duyuru siteniz vardır. Üyelerinize bölgelerindeki en son gelişmeleri göstermek isteyebilirsiniz. 

Bir kullanıcının IP adresinden lokasyon bilgisine ulaşmanız oldukça muhtemeldir. Muhtemeldir diyorum, çünkü IP adresinden bir kişinin lokasyon bilgisine nokta atışı ulaşmanız; çokta mümkün değil. Lakin kullanıcının bulunduğu çevreyi çok rahat bir şekilde tespit edebilirsiniz.

PHP ile herhangi bir IP adresinin veya bir URL’in lokasyonuna ulaşabilirsiniz. Bunu pek tabii dış kaynakları kullanarak yapmanız gerekmektedir. Bu konuda hizmet veren çeşitli dış kaynaklar daha doğrusu oluşturulmuş olan veri kaynakları var. Bunlardan bir kaçı aşağıdaki gibidir.

Yukarıdaki bazı kaynakların veri tabanları indirilebilir durumdadır. Bu kaynakları indirip detaylı inceleyebilir veya kullanabilirsiniz.

Dahası; yukarıda belirtmiş olduğum bazı kaynakların kendi API’leri de bulunmaktadır. Bu API dosyalarını indirip kendi projenize dahil edebilirsiniz. Bunun yanı sıra; bu kaynakların web servislerini de kullanabilirsiniz.

Benim yıllardır kullandığım uzak kaynağım; geoPlugin. Tam bir lokasyon elde edemesem de kullanıcının bulunduğu bölge hakkında bilgi edinebiliyordum. Lakin son zamanlarda işimi fazla görememeye başladı. Çünkü; Ülke / Şehir bazında çok iyi fakat kullanıcının bulunduğu semt konusunda yetersiz. Ya doğru bir sonuç vermiyor ya da yanlış bir sonuç veriyor. Bunun yerine son zamanlarda; ipinfo.io servisini kullanmaya başladım. Bu servis diğerine göre çok mu iyi? Hayır çok iyi değil fakat en azından doğruya yakın bir sonuç elde etmemi sağlıyor. Bu servisin de kötü yanı ücretli olması. Ücretsiz kullanımda ise; Gün / 1000 isteğe kadar karşılıyor. Ondan sonrasında ise; sistem yanıt vermiyor. Bu sistemin en önemli tarafı ise; çok hızlı olması. İsteklerinizi çok kısa bir sürede yanıtlıyor. Şayet; gün içerisinde istek sayınız az ise (req < 1000) bu servisi kullanabilirsiniz. İstek sayınız fazla ise (req > 1000) ücretli servisini kullanmanız gerekiyor ya da başka ücretsiz bir servisi tercih etmelisiniz.

Bu servisi kullanarak bir kullanarak bir IP adresinden yer tespiti yapmaya çalışalım.

PHP ortamında bir kullanıcının IP adresi aşağıdaki gibi alınabilir.

$_SERVER['REMOTE_ADDR']

Yukarıdaki satır ile kullanıcının IP adresi alınabilir. Fakat kullanıcı veya kurum IP adresini maskeleme yapmış olabilir. Bu durumda yukarıdaki kod satırı işimizi görmeyecektir. Ama sonuçta size bir IP adresi verebilir. Bu konuda herhangi bir sıkıntı yoktur. Bir kullanıcının IP adresini daha doğru bir yoldan elde etmek için buradaki yazımı incelemenizi tavsiye ederim.

IP değerine de ulaştığımıza göre geriye tek bir şey kalıyor; IP adresinden lokasyon bilgisine ulaşmak. Bunun için de yapmamız gereken şey; servise istekte bulunmak yani;

https://ipinfo.io/ip-address

Şayet kendi lokasyonunuzu almak isterseniz de;

https://ipinfo.io/json

Şeklinde istek yapmanız yeterlidir. 

Şayet; tüm veriler yerine bazı verileri almak isteyebilirsiniz. Bu konuda da hizmette herhangi bir sınır yok.

Kullanıcının şehir (city) bilgisine ulaşmak için (aslında semt bilgisini verir):

https://ipinfo.io/ip-address/city

Kullanıcının bulunduğu bölge bilgisine ulaşmak için (aslında şehir bilgisini verir):

https://ipinfo.io/ip-address/region

Kullanıcının ülke bilgisine ulaşmak için:

https://ipinfo.io/ip-address/country

Diğer alanlara da ulaşmak çok kolay. Aşağıdaki ekran çıktımızdaki alanları son parametre olarak belirtirseniz; sadece istediğiniz verilere ulaşabilirsiniz.

Yukarıdaki herhangi bir parametreyi kullanıp istek yapıldıktan sonra dönen değer ise; JSON formatında olacaktır. Dolayısıyla alınan JSON verisini işlememiz gereklidir.

Biz bu yazıda; JSON şeklinde değer alacağız. Dolayısıyla kodlarımızı bu doğrultuda yazacağız.

Servise isteği; file_get_contents () veya cURL şeklinde yapabiliriz. Daha önce ki yazılarımda da hep bahsettiğim gibi cURL, file_get_contents () metodundan daha hızlı çalışmaktadır. Fakat bu servis üzerinde herhangi bir etkisi olmadığını gördüm. O halde biz de kodlarımızı; file_get_contents () metodunu kullanarak yazalım.

Kodlarımız aşağıdaki gibi olacaktır.

$ipAddress       = '127.0.0.1';
const IP_SERVICE = 'https://ipinfo.io/';

$data     = file_get_contents(IP_SERVICE . $ipAddress);
$location = json_decode($data, true);

Aslında yukarıdaki kodlarımızı çok fazla açıklamaya gerek yok. Sadece belirtilen adrese; belirtilen IP adres ile istekte bulunduk ve dönen JSON değerini decode (çözmek) ettik. Burada tek dikkat edeceğimiz nokta; IP adresini doğru bir şekilde göndermek. Kısacası; her şey bu kadar basit.

Ekran çıktımız da aşağıdaki gibi olacaktır.

Array
(
    [ip] => xx.xxx.xx.xxx
    [hostname] => xx.xxx.xx.xxx.dynamic.ttnet.com.tr
    [city] => Balkiraz
    [region] => Ankara
    [country] => TR
    [loc] => 39.9330,32.8873
    [org] => AS9121 Turk Telekomunikasyon Anonim Sirketi
)

Yukarıdaki ekran çıktımızdan da anlayabileceğimiz gibi; lokasyon bilgisine ulaştık. Bu ulaşılan değer benim kendi lokasyon adresim. Fakat daha öncede dediğim gibi bu bilgi kesin bir bilgi değil. Bunun nedeni ise; benim, [city] olarak belirtilen alandaki; Balkiraz mahallesinde şuan bulunmamam. Şuan ben bu satırları evimde yani Gülveren Mahallesi‘nden yazıyorum.

Haritadan bakacak olursak;

Yukarıdaki harita Balkiraz’a ait. Aşağıdaki haritada Gülveren’e ait.

Görüldüğü gibi aldığımız değerlerden city değeri yanlış. Fakat bu değer şu açıdan önemli; Balkiraz ve Gülveren de Mamak‘a bağlı. Yani benim bulunduğum ilçe bilgisi doğru. Dolayısıyla; bu servis bize doğruya çok yakın bir bilgi veriyor, diyebiliriz.

Bir URL adresinin de lokasyon bilgisine ulaşabilirsiniz. Bunun için yapmanız gereken şey ise; bu URL adresinin IP değerine ulaşmak. Bu konudan detaylı olarak bahsetmeyeceğim. Çünkü yazımız oldukça uzun oldu (aslında bu kadar uzun olacağını tahmin etmemiştim). Fakat PHP ortamında bir URL adresinin IP adresi aşağıdaki gibi bulunabilir.

gethostbyname(parse_url($url)['host'])

Yukarıdaki satırda; $url yerine istediğiniz herhangi bir URL adresini yazıp, bu URL’e ait olan IP değerine ulaşabilirsiniz. Daha sonrasında ise; yukarıdaki gibi bu IP değerini servise göndermeniz yeterli.

IP veya URL adresine göre lokasyon bulmak için hazırlamış olduğum kodları buradaki Github adresinden indirebilirsiniz.

Saygı ve muhabbetle!..

Bu içeriği paylaşmak ister misiniz?

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Buradaki içeriklerin tümü kamu malıdır. Kullanılması ve paylaşılması özgürdür.