Uvod u GeoIP

Verovatno ste već bili u prilici da koristite Google Analytics alat, gde između ostalog možete na mapi sveta videti odakle tačno dolaze posetioci vašeg sajta, ili ste tu i tamo posetili sajt koji bi Vam između ostalog izbacio podatke o Vašoj trenutnoj lokaciji. Naravno, nije u pitanju nikakva magija, tačna lokacija posetioca definisana je na osnovu njegove IP adrese, a tehnologija koja se koristi prilikom "lociranja" korisnika opšte je poznata pod nazivom GeoIP.

Autor: Dragan Dinić

Tehnopolis

Izvor: B92

Ponedeljak, 27.11.2006.

15:07

Default images

Danas ćemo pričati o tome kako "locirati" posetioca pomoću PHP-a i Max Mind-ove GeoIP baze. U primerima koji slede koristićemo besplatne(lite) verzije GeoIP baza, obzirom da se za pune verzije plaća $50USD + $12USD za update (GeoIP Country baza) i $370USD + $90USD za update (GeoIP City baza). Mana lite verzija je što nisu uvek 100% ažurne, ali će odlično poslužiti za naš tutorijal, a iz ličnog iskustva tvrdim da su upotrebljive i u većini live projekata.

MaxMind obezbeđuje API za nekoliko popularnih programskih jezika, (kompletna lista dostupna je na http://www.maxmind.com/app/api), a detalji o PHP API-u dostupni su ovde. Pored takozvanog "Pure PHP API-a" koji ćemo ovde koristiti, postoje i PECL ektstenzija kao i apache modul(mod_geoip), koji pružaju bolje perfomanse ali i komplikovaniji setup.

Za početak neophodno je da skinete sve fajlove koji se nalaze na http://www.maxmind.com/download/geoip/api/php/ i snimite ih negde unutar vašeg Web stabla(recimo /htdocs/geoip). Za korišćenje GeoIP Country treba skinuti lite bazu sa http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz , a za city GeoLiteCity bazu http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz. Radi jednostavnosti korišćenja, obe baze ćemo takođe raspakovati u isti direktorijum gde smo i snimili fajlove iz PHP API-a (/htdocs/geoip).

GeoIP Country

Idemo sa primerom detekcije zemlje posetioca:

<?php
/**
* Primer Koriscenja GeoIP Country Baze
*
* @version $Id$
* @package geoip
* @copyright &copy; 2006 Lampix.net
* @author Dragan Dinic <dinke@lampix.net>
*/

require_once("geoip.inc");

$gi = geoip_open("GeoIP.dat", GEOIP_STANDARD);

$ip = $_SERVER['REMOTE_ADDR'];
//ako testirate u lokalu koristite ovaj ip radi testa
//posto ce $_SERVER['SERVER_ADDR'] biti 127.0.0.1
//$ip = "89.216.226.174";

$country_name = geoip_country_name_by_addr($gi, $ip);
$country_code = geoip_country_code_by_addr($gi, $ip);
if($country_name)
{

echo "Zemlja iz koje nas posecujete je: $country_name <br />";

echo "Skracena Oznaka: $country_code <br />";

}
else
{

echo "Nazalost, nismo bili u mogucnosti da vas lociramo.";

}

geoip_close($gi);

?>

Dakle, na početku uključujemo geoip.inc koji sadrži sve f-je potrebne za korišćenje GeoIP County baze, zatim kreiramo novu instancu GeoIP klase pomoću geoip_open f-je, i na kraju pozivamo odgovarajuće f-je (geoip_country_name_by_addr i geoip_country_code_by_addr) da bi smo dobili ime/kod zemlje u kojoj se nalazi ip adresa posetioca(u slučaju da testirate u lokalu nemojte koristiti $_SERVER['REMOTE_ADDR']).

Kao izlaz skripta, trebalo bi da dobijemo nešto poput:

Zemlja iz koje nas posecujete je: Serbia and Montenegro
Skracena Oznaka: CS

F-je koje smo koristili da bi dobili podatke o zemlji posetioca, samo su neke od f-ja koje su dostupne u API-u. Ostatak možete i sami pronaći jednostavnom analizom PHP sourca geoip.inc fajla.

GeoIP City

A sada da proširimo podatke o zemlji sa tačnom lokacijom (grad, poštanski kod itd).

<?php
/**
* Primer Koriscenja GeoIP City Baze
*
* @version $Id$
* @package geoip
* @copyright &copy; 2006 Lampix.net
* @author Dragan Dinic <dinke@lampix.net>
*/

require_once("geoipcity.inc");

$gi = geoip_open("GeoLiteCity.dat", GEOIP_STANDARD);

$ip = $_SERVER['REMOTE_ADDR'];

//ako testirate u lokalu koristite ovaj ip radi testa
//posto ce $_SERVER['SERVER_ADDR'] biti 127.0.0.1
//$ip = "89.216.226.174";

$record = geoip_record_by_addr($gi, $ip);

if(!$record)

{

echo "Nazalost, nismo bili u mogucnosti da vas lociramo.";

}

else

{

echo "Zemlja: " .$record->country_name . "<br />";
echo "Skracena Oznaka: " . $record->country_code . "<br />";
echo "Skracena Oznaka2: " . $record->country_code3 . "<br />";
echo "Region: " .$record->region . "<br />";
echo "Grad: " .$record->city . "<br />";
echo "Postanski Kod: " .$record->postal_code . "<br />";
echo "Geog. Sirina: " .$record->latitude . "<br />";
echo "Geog. Duzina: " .$record->longitude . "<br />";

}

geoip_close($gi);

?>

Kao što vidite, PHP kod je sličan kodu za detekciju zemlje, s tim što smo koristili geoipcity.inc kao i GeoLiteCity.dat bazu. F-ja geoip_record_by_addr($gi, $ip) vraća instancu klase 'geoiprecord' koja sadrži kao promenljive(osobine) podatke o lokaciji koje koristimo u gornjem kodu. Nakon pokretanja skripta trebalo bi da dobijemo nešto poput:

Zemlja: Serbia and Montenegro
Skracena Oznaka: CS
Skracena Oznaka2: SCG
Region: 02
Grad: Beograd
Postanski Kod:
Geog. Sirina: 44.8186
Geog. Duzina: 20.4681

Napominjem da je GeoIP baza najažurnija kada su u pitanju gradovi sa severnoameričkog dela planete, dok je njena preciznost znatno manja kada se dođe do "egzotike" u koju nažalost spada i Srbija.

CaseStudy - Redirekcija na osnovu IP adrese

--------------------------------------------

Za kraj znanje stečeno ovde iskoristićemo u jednom pravom projektu. Naime cilj je da se na dvojezičnom sajtu(blogu) korisnici koji dolaze iz Srbije usmere na srpsku verziju sajta, dok će se svi ostali usmeriti na englesku verziju. Evo kako to izgleda:

<?php

/**
* Case Study - Redirekcija na osnovu lokacije
*
* @version $Id$
* @package geoip
* @copyright &copy; 2006 Lampix.net
* @author Dragan Dinic <dinke@lampix.net>
*/

require_once("geoip/geoip.inc");

$gi = geoip_open("geoip/GeoIP.dat",GEOIP_STANDARD);
$country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);

geoip_close($gi);

if($country_code == 'CS')

{

header("HTTP/1.1 301 Moved Permanently");
header('Location: http://www.dinke.net/blog/sr/');

}

else

{

header("HTTP/1.1 301 Moved Permanently");
header('Location: http://www.dinke.net/blog/en/');

}

?>

Primer koji vidite gore koristi se na blogu autora ovog teksta, kako bi sve korisnike koji ne dolaze iz Srbije automatski preusmerio na englesku verziju bloga. Slanje custom 301 redirection headera je važno kako bi botovi (Google i sl.) indeksirali strane na odgovarajući način.

Dragan Dinić je 32-godišnji Web programer sa preko 5 godina iskustva u razvoju LAMP based aplikacija. U slobodno vreme Dragan vodi svoj blog ili diskutuje o Internet tehnologijama na raznim Web forumima.

Ovo je arhivirana verzija originalne stranice. Izvinjavamo se ukoliko, usled tehničkih ograničenja, stranica i njen sadržaj ne odgovaraju originalnoj verziji.

Komentari 3

Pogledaj komentare

3 Komentari

Možda vas zanima

Svet

Ukrajinci saopštili: Obustavljamo

Ukrajinske vlasti saopštile su večeras da su obustavile svoje konzularne usluge u inostranstvu za muškarce starosti od 18 do 60 godina, pošto je ukrajinska diplomatija najavila mere za vraćanje u zemlju onih koji mogu da idu na front.

21:57

23.4.2024.

1 d

Podeli: