10 Fevereiro 2009
![]()
GeoTargeting pode ser utilizado para mostrar anúncios, programas de afiliados, pedaços de conteúdo, ou outra coisa qualquer que lhe passe pela cabeça, só a utilizadores de determinado Pais, Região ou até mesmo cidade.
Realizar GeoTargeting no seu website, pode ser extremamente útil na sua campanha de Internet marketing, no entanto a maioria das pessoas não perde tempo a configurar um script para realizar GeoTargeting.
Imagine-se servir determinado anuncio para uma pessoa que esteja a aceder via Brasil, e outro anuncio para quem esteja a aceder a partir de Portugal. Imagine um programa de afiliados que só funciona com utilizadores do Brasil, para que mostrá-lo a pessoas do resto do mundo? Aproveite todo o seu tráfego da melhor maneira possível.
O maior requisito para aplicar um sistema de GeoTargeting é possuir uma base de dados que associe um ip a uma localização geográfica. Existem alguns métodos para conseguir isto. Uns mais simples, outros mais complicados, uns mais eficientes, outros menos eficientes. No final deste artigo a escolha só dependerá de si e das suas necessidades.
Este pode ser o melhor como o pior método, para realizar GeoTargeting. Neste método não tem que se preocupar acerca da base de dados ir offline. Infelizmente esta é a solução que mais recursos necessitará do seu servidor. Imagine por cada visitante que chega ao seu site ele ter que percorrer uma Base de Dados de Ip's... isto para um numero considerável de visitantes (dependendo do servidor) pode colocar o seu servidor de Joelhos!
Tendo dito isto passar à implementação. Aqui vou fornecer dois métodos de implementação. Um mais eficaz e mais difícil de implementar e um outro mais fácil de implementar mas menos eficaz em termos de computação.
Vamos utilizar a Base de Dados Gratuita Fornecida pela MaxMind, esta versão possui um grau de fiabilidade até 97%. Aceda à página deles e faça o download do GeoLite Country no formato binário.
Depois necessita de realizar o download da GEO PHP api, php pure module.
Utilize o seguinte código PHP:
function getCodPais()
{
if (isset($_COOKIE["geoip"])) {
$country = $_COOKIE['geoip'];
}
else
{
include("geoip.inc"); //defina o seu caminho para o ficheiro geoip.inc
$gi = geoip_open("GeoIP.dat",GEOIP_STANDARD); //defina o seu caminho para o ficheiro geoip.dat
$ip=IPReal();
$country = geoip_country_code_by_addr($gi, $ip);
geoip_close($gi);
setcookie("geoip", $country, time()+2592000, "/", ".seusite.com", 0); //Ajusta o Cookie para expirar num mês
}//fim els
return $country;
}//fim getCodPais()
function IPReal()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];}
else{
$ip=$_SERVER['REMOTE_ADDR'];}
return $ip;
}
Na página de download da Database fornecida pela MaxMind, realize o download desta no formato CVS.

| *COUNTRY_CODE2 | |
| *COUNTRY_NAME |
| Setting | Value |
| Fields terminated by | , (uma virgula) |
| Fields enclosed by | " (aspas) |
| Lines terminated by | \n (barra N) |
De seguida segue-se o Código PHP:
function getCodPais()
{
if (isset($_COOKIE["geoip"])) {
$country = $_COOKIE['geoip'];
}
else
{
$DatabaseServer = "localhost";
$Username = "USER_NAME da Base de Dados";
$Password = "PASSWORD da Base de Dados";
$DatabaseName = "IPPaises";
$link = mysql_connect($DatabaseServer, $Username, $Password) or die('Could not connect: ' . mysql_error());
mysql_select_db($DatabaseName) or die('Could not select database');
$IP = IPReal();
$res = mysql_query("SELECT country_code2,country_name FROM IPCountries WHERE IP_FROM<=inet_aton('$IP') AND IP_TO>=inet_aton('$IP')");
$Codes = mysql_fetch_array($res);
$CountryCode = $Codes['country_code2']; //PT
$CountryName = $Codes['country_name']; //PORTUGAL
$country=$CountryCode;
mysql_close($link); //limpa
setcookie("geoip", $country, time()+2592000, "/", ".seusite.com", 0); //Ajusta o Cookie para expirar num mês
}
return $country;
}//fim getCodPais()
function IPReal()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];}
else{
$ip=$_SERVER['REMOTE_ADDR'];}
return $ip;
}
O problema do método anterior é que obrigar o seu servidor a pesquisar por ip's entre 60.000 entradas, que pode ser catastrófico para a performance deste. Mesmo com a técnica de atribuir um cookie ao browser para que este só "pesquise" na base de dados a origem do Computador do utilizador, uma vez por mês. Se possuir muitas visitas novas todos os dias, a solução anterior pode ser uma pedra no sapato.
Para isso vamos aceder a uma base de dados externa, através da API do site hostip.info. O problema desta base de dados é que só é viável para pesquisar por pais. A Base de dados da MaxMind com as devidas alterações ao script até por Cidade e Região pesquisa de forma bastante precisa.
Esta é a solução que costumo utilizar, para mim e para a maioria dos leitores deverá ser suficiente.
Código PHP:
function getCodPais()
{
if (isset($_COOKIE["geoip"])) {
$country = $_COOKIE['geoip'];
}
else
{
$ip=IPReal();
$IPDetail=getCodPais2($ip);
$country= $IPDetail['country_code'];
setcookie("geoip", $country, time()+2592000, "/", ".seusite.com", 0); //Ajusta o Cookie para expirar num mês
}
return $country;
}
function getCodPais2($ipAddr)
{
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : "";
$ipDetail=array();
$loc="http://api.hostip.info/?ip=".$ipAddr;
$tryCurl = 0;
if(ini_get('allow_url_fopen') != 1) {
@ini_set('allow_url_fopen', '1');
}
if(ini_get('allow_url_fopen') != 1) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$loc);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$xml = curl_exec($ch);
curl_close($ch);
} else {
$xml = file_get_contents($loc);
}
preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match);
$ipDetail['city']=$match[2]; //COIMBRA
preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches);
$ipDetail['country']=$matches[1]; //PORTUGAL
preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match);
$ipDetail['country_code']=$cc_match[1]; //PT
return $ipDetail;
}
function IPReal()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];}
else{
$ip=$_SERVER['REMOTE_ADDR'];}
return $ip;
}
Fevereiro 25, 2009