HomeArtigosGeoTargeting com PHP - Não perca dinheiro

10

Fev

GeoTargeting com PHP - Não perca dinheiro

Escrito por Gonçalo Martins   

geotargeting com PHP
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.

 

Como implementar o seu próprio sistema de GeoTargeting?

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.

 

Método 1. Alojar a Própria Base de Dados de Ip's

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.

 

1.1 Alojar a Própria BD - Forma menos eficaz


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:

Mostrar/Esconder código

php
  1. if(getCodPais()=="PT"){
  2. //código para mostrar em Portugal
  3. }
  4. elseif (getCodPais()=="BR")
  5. {
  6. // codigo para mostrar no Brasil
  7. } 
  8. else{
  9. // código para o resto do mundo
  10. } function getCodPais()
  11. {
  12.    if (isset($_COOKIE["geoip"])) {
  13.    $country = $_COOKIE['geoip'];
  14.  
  15.    }
  16.    else
  17.    {
  18.    include("geoip.inc");
  19. //defina o seu caminho para o ficheiro geoip.inc
  20.    $gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
  21. //defina o seu caminho para o ficheiro geoip.dat
  22.    $ip=IPReal();
  23.  
  24.    $country = geoip_country_code_by_addr($gi, $ip);
  25.  
  26.    geoip_close($gi);
  27.  
  28.    setcookie("geoip", $country, time()+2592000, "/", ".seusite.com", 0);
  29. //Ajusta o Cookie para expirar num mês
  30. }//fim els
  31. return $country;
  32. }//fim getCodPais()function IPReal()
  33. {
  34.     if (!empty($_SERVER['HTTP_CLIENT_IP'])){
  35.       $ip=$_SERVER['HTTP_CLIENT_IP'];
  36. }
  37.     elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
  38.       $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
  39. }
  40.     else{
  41.       $ip=$_SERVER['REMOTE_ADDR'];
  42. }
  43.     return $ip;
  44.  
  45. }

 

1.2 Alojar a Própria BD - Forma mais eficaz


Na página de download da Database fornecida pela MaxMind, realize o download desta no formato CVS.

  • Abra o PHPMyAdmin e crie uma Base de Dados chamada 'IPPaises';
  • Na tabela IPPaises crie seis novos campos, com as seguintes características:

    *COUNTRY_CODE2  
    *COUNTRY_NAME

     

  • Importe o ficheiro CVS do qual fez download anteriormente.
    'Insert data from a text file into the table' e verifique-se que possui as seguintes opções:


    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:

Mostrar/Esconder código

php
  1. if(getCodPais()=="PT"){
  2. //código para mostrar em Portugal
  3. }
  4. elseif (getCodPais()=="BR")
  5. {
  6. // codigo para mostrar no Brasil
  7. } 
  8. else{
  9. // código para o resto do mundo
  10. } function getCodPais()
  11. {
  12.    if (isset($_COOKIE["geoip"])) {
  13.    $country = $_COOKIE['geoip'];
  14.  
  15.    }
  16.    else
  17.    {       $DatabaseServer = "localhost";
  18.  
  19.       $Username = "USER_NAME da Base de Dados";
  20.  
  21.       $Password = "PASSWORD da Base de Dados";
  22.  
  23.       $DatabaseName = "IPPaises";
  24.  
  25.  
  26.       $link = mysql_connect($DatabaseServer, $Username, $Password) or die('Could not connect: ' . mysql_error());
  27.  
  28.       mysql_select_db($DatabaseName) or die('Could not select database');
  29.  
  30.       $IP = IPReal();
  31.  
  32.       $res = mysql_query("SELECT country_code2,country_name FROM IPCountries WHERE IP_FROM<=inet_aton('$IP') AND IP_TO>=inet_aton('$IP')");
  33.  
  34.      $Codes = mysql_fetch_array($res);
  35.  
  36.      $CountryCode = $Codes['country_code2'];
  37. //PT
  38.      $CountryName = $Codes['country_name'];
  39. //PORTUGAL     $country=$CountryCode;
  40.  
  41.      mysql_close($link);
  42. //limpa     setcookie("geoip", $country, time()+2592000, "/", ".seusite.com", 0);
  43. //Ajusta o Cookie para expirar num mês
  44.    }
  45.  return $country;
  46.  
  47. }//fim getCodPais()function IPReal()
  48. {
  49.     if (!empty($_SERVER['HTTP_CLIENT_IP'])){
  50.       $ip=$_SERVER['HTTP_CLIENT_IP'];
  51. }
  52.     elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
  53.       $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
  54. }
  55.     else{
  56.       $ip=$_SERVER['REMOTE_ADDR'];
  57. }
  58.     return $ip;
  59.  
  60. }

 

Método 2. Aceder a uma Base de Dados externa

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:

Mostrar/Esconder código

php
  1. if(getCodPais()=="PT")
  2. {
  3. //código para mostrar em Portugal
  4. }
  5. elseif (getCodPais()=="BR")
  6. {
  7. // código para mostrar no Brasil
  8. } 
  9. else{
  10. // código para o resto do mundo
  11. }  function getCodPais()
  12. {
  13.   if (isset($_COOKIE["geoip"])) {
  14.     $country = $_COOKIE['geoip'];
  15.  
  16.   }
  17. else
  18.   {
  19.      $ip=IPReal();
  20.  
  21.      $IPDetail=getCodPais2($ip);
  22.  
  23.      $country= $IPDetail['country_code'];
  24.  
  25.      setcookie("geoip", $country, time()+2592000, "/", ".seusite.com", 0);
  26. //Ajusta o Cookie para expirar num mês
  27.    }
  28.    return $country;
  29.  
  30. }
  31.  
  32. function getCodPais2($ipAddr)
  33. { 
  34.   ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : "";
  35.  
  36.   $ipDetail=array();
  37.  
  38.  
  39.   $loc="http://api.hostip.info/?ip=".$ipAddr;
  40.  
  41.     $tryCurl = 0;
  42.  
  43.     if(ini_get('allow_url_fopen') != 1) {
  44.         @ini_set('allow_url_fopen', '1');
  45.  
  46.     }
  47.   if(ini_get('allow_url_fopen') != 1) {
  48.     $ch = curl_init();
  49.  
  50.     curl_setopt($ch, CURLOPT_URL,$loc);
  51.  
  52.     curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  53.  
  54.     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  55.  
  56.     curl_setopt($ch, CURLOPT_TIMEOUT, 3);
  57.  
  58.     $xml = curl_exec($ch);
  59.  
  60.     curl_close($ch);
  61.  
  62.   } else {
  63.     $xml = file_get_contents($loc);
  64.  
  65.   }  
  66.  
  67.   preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match);
  68.  
  69.   $ipDetail['city']=$match[2];
  70. //COIMBRA
  71.   preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches);
  72.  
  73.   $ipDetail['country']=$matches[1];
  74. //PORTUGAL
  75.   preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match);
  76.  
  77.   $ipDetail['country_code']=$cc_match[1];
  78. //PT
  79.   return $ipDetail;
  80.  
  81. }
  82. function IPReal()
  83. {
  84.     if (!empty($_SERVER['HTTP_CLIENT_IP'])){
  85.       $ip=$_SERVER['HTTP_CLIENT_IP'];
  86. }
  87.     elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
  88.       $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
  89. }
  90.     else{
  91.       $ip=$_SERVER['REMOTE_ADDR'];
  92. }
  93.     return $ip;
  94.  
  95. }

 



Gostou deste Artigo?
Subscreva o feed RSS ou reguiste-se na Newsletter do WebLouca, agora!
Categoria:
Se preferir, pode ainda deixar um comentário

PATROCINADORES


cometarios
Trackback(0)
Mario
Fevereiro 25, 2009

Excelente artigo! Um dos melhores que já colocou no weblouca. Extremamente útil, principalmente para campanhas que só dão para determinados países e para sites que recebem visitas de variados continentes!

obrigado!

Pedro
Abril 03, 2009

Fantástico, andava mesmo à procura de uma solução para geotraget, você deu-me 3


Escreva o seu Comentario
 
  pequeno | maior
 

busy
 

Patrocinadores do Site

Subscrever Feed



Artigos

Ultimos artigos
jsimageNeste artigo vou-lhe demonstrar como rodar imagens e qualquer elemento desde div a span co...
phpthumbAtualmente praticamente todos os websites possuem a necessidade de listar os seus artigos...
benchmarksA pouco mais de um ano falei sobre uma ferramenta para otimizar imagens (Artigos/optimize...
phpimageredRedimensionar uma imagem com php pode ser um processo complicado. Quando por exemplo um wo...
linksafiliadosNo inicio do ano escrevi um artigo onde dáva a conhecer uma forma de criar links de afili...