Artigos / Tekever.eu

Artigos de desenvolvimento e opinião em tecnologia.

Secções:

Linux | Windows | .NET / ASP | LAMP | Java | Só Conversa |

 


Web Service PHP para saber País de origem de um IP

  2006-09-14




Muitas vezes existe a necessidade de se saber a origem de um IP, é possível com programação obter o IP dos acessos ao nosso website. Mas olhar para um IP pouco ou nada nos diz a não ser a gama em que o mesmo se encontra. Apesar de se poder usar os IPs para controlar acessos por exemplo, é possível saber-se a origem, país, do mesmo com este Web Service.

Este artigo vai demonstrar como pode aceder ao Web Service Tekever que devolve o local geográfico de origem de um dado IP. e para tal basta enviar-se o IP como argumento para uma única função que este Web Service disponibiliza.

O Web Service está localizado no URL http://webservices.tekever.eu/ip2pais/?wsdl, e pode verificar a estrutura do mesmo olhando para o respectivo XML.

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
  3. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  6. xmlns:tns="http://webservices.tekever.eu/ip2pais"
  7. xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  8. xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  9. xmlns="http://schemas.xmlsoap.org/wsdl/"
  10. targetNamespace="http://webservices.tekever.eu/ip2pais">
  11. <types><xsd:schema targetNamespace="http://webservices.tekever.eu/ip2pais"
  12. >
  13. <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
  14. <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
  15. <xsd:complexType name="paisdados">
  16. <xsd:all>
  17. <xsd:element name="isocode" type="xsd:string"/>
  18. <xsd:element name="pais" type="xsd:string"/>
  19. <xsd:element name="regiao" type="xsd:string"/>
  20.  
  21. <xsd:element name="capital" type="xsd:string"/>
  22. <xsd:element name="moeda" type="xsd:string"/>
  23. </xsd:all>
  24. </xsd:complexType>
  25. </xsd:schema>
  26. </types>
  27. <message name="IP2PaisRequest"><part name="ip" type="xsd:string" /></message>
  28. <message name="IP2PaisResponse"><part name="retorna" type="tns:paisdados"
  29. /></message>
  30. <portType name="Conversão de IP para PaísPortType"><operation
  31. name="IP2Pais"><documentation>Indicar IP que pretenda ser convertido em dados
  32. sobre o país de origem. Este webservice não controla se o acesso é de
  33. robots.</documentation><input message="tns:IP2PaisRequest"/><output
  34. message="tns:IP2PaisResponse"/></operation></portType>
  35. <binding name="Conversão de IP para PaísBinding" type="tns:Conversão de IP para
  36. PaísPortType"><soap:binding style="rpc"
  37. transport="http://schemas.xmlsoap.org/soap/http"/><operation
  38. name="IP2Pais"><soap:operation
  39. soapAction="http://webservices.tekever.eu/ip2pais#IP2Pais"
  40. style="rpc"/><input><soap:body use="encoded"
  41. namespace="http://webservices.tekever.eu/ip2pais"
  42. encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></input><output><soap
  43. :body use="encoded" namespace="http://webservices.tekever.eu/ip2pais"
  44. encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/></output></operation>
  45. </binding>
  46. <service name="Conversão de IP para País"><port name="Conversão de IP para
  47. PaísPort" binding="tns:Conversão de IP para PaísBinding"><soap:address
  48. location="http://webservices.tekever.eu/ip2pais/index.php"/></port></service>
  49. </definitions>


Através deste XML, é possível verificar as funções e propriedades disponíveis, apesar de ser necessário algum trabalho a visualizar o XML. No entanto alguns Web Services, e consoante a tecnologia em que foram feitos, permitem-nos ver fácilmente as funções disponíveis.
O Web Service da Tekever foi feito em NuSOAP, e tal como os Web Services feitos em .NET, este permite-nos visualizar as funções disponíveis e a sua constituição de forma mais fácil, para tal basta tirar o ?wsdl do final do URL, prove seguindo o link http://webservices.tekever.eu/ip2pais/.

As funções disponíveis são:
IP2Pais - recebe um argumento, o IP de onde se pretende saber a origem.

Agora vamos criar um Web Service para sabermos a origem de um IP.

O NuSOAP, ferramenta escolhida para acedermos a Web Services, especialmente concebida para PHP 4.x, pode ser obtida no seguinte link http://sourceforge.net/projects/nusoap, descarregue o ficheiro, descomprima-o, e lendo as instruções grave-o num local do directório da sua aplicação.

Para este exemplo, temos um directorio /home/tekever/public_html/, onde vai estar além do ficheiro de acesso ao Web Service criado mais à frente, o directório obtido do NuSOAP, esse directório NuSOAP vai-se chamar nusoap/ e como tal ficará localizado em /home/tekever/public_html/nusoap/. Dentro deste directório irá constar logo na sua raíz o ficheiro nusoap.php, nusoapmime.php, e outros do tipo class.soap_*.php.

A primeira coisa a fazer é incluir a classe do nusoap no código:
require_once("nusoap/nusoap.php");

Depois atribui-se a uma variável o link de acesso ao Web Service:
$wsdl = "http://webservices.tekever.eu/ip2pais/?wsdl";

Nete caso está a ser forçado o envio da encomenda para a Zona 5, com o peso de 1001 Gramas:
$str_ip = "81.193.4.92";

Vai-se instanciar a classe soapclient(), que recebe o link do Web Service, e a indicação do tipo de processamento a ser feito, neste caso sendo Web Service será wsdl:
$cliente = new soapclient($wsdl, 'wsdl');

Existem pelo menos duas formas de se aceder às funções dos Web Services através de NuSOAP, uma delas e bem prática é primeiro instanciar o método getProxy(), para depois se aceder directamente às funções como se de métodos da classe se tratassem (o PHP 5 já permite fazer isto por omissão):
$proxy = $cliente->getProxy();

O primeiro exemplo será aceder ao custo da encomenda caso fosse enviada para um destino Internacional da zona definida 5, com peso de 1001 Gramas:
$vem = $proxy->IP2Pais($str_ip);

Escreve-se no écran o resultado, como é Array, para se aceder ao país por exemplo faz-se da seguinte forma:
print "<br/>País: " . $vem["pais"];


Quando não se tem a certeza da constituição de um Array, resultado de um Web Service, poder-se-á escrever o resultado com var_dump(), neste caso fazia-se:


O código do ficheiro, do código explicado é o que se apresenta a seguir:

ficheiro: ws-ip2pais.php
  1. <?php
  2. require_once("nusoap/nusoap.php");
  3.  
  4. $wsdl = "http://webservices.tekever.eu/ip2pais/?wsdl";
  5.  
  6. $str_ip = "81.193.4.92";
  7.  
  8. $cliente = new soapclient($wsdl, 'wsdl');
  9.  
  10. $proxy = $cliente->getProxy();
  11.  
  12. print "<p>Conversão do IP <b>" .$str_ip . "</b>:";
  13. $vem = $proxy->IP2Pais($str_ip);
  14. print "<br/>Código ISO: " . $vem["isocode"];
  15. print "<br/>País: " . $vem["pais"];
  16. print "<br/>Região: " . $vem["regiao"];
  17. print "<br/>Capital: " . $vem["capital"];
  18. print "<br/>Moeda: " . $vem["moeda"];
  19. print "</p>";
  20. ?>


Depois de se executar o código acima descrito, teria-se o seguinte resultado:
Conversão do IP 81.193.4.92:
Código ISO: PT
País: Portugal
Região: Europe
Capital: Lisbon
Moeda: Euro


PHP 5:
Em PHP 5, existe já um objecto para acesso aos Web Services, e como tal não seria necesário usar o NuSOAP. O exercício acima descrito usando PHP 5, e sem recurso a NuSOAP, seria o seguinte:
  1. <?php
  2.  
  3. $wsdl = "http://webservices.tekever.eu/ip2pais/?wsdl";
  4.  
  5. $str_ip = "81.193.4.92";
  6.  
  7. $cliente = new SoapClient($wsdl);
  8.  
  9. print "<p>Conversão do IP <b>" .$str_ip . "</b>:";
  10. $vem = $cliente->IP2Pais($str_ip);
  11. print "<br/>Código ISO: " . $cliente["isocode"];
  12. print "<br/>País: " . $cliente["pais"];
  13.  
  14. print "<br/>Região: " . $cliente["regiao"];
  15. print "<br/>Capital: " . $cliente["capital"];
  16. print "<br/>Moeda: " . $cliente["moeda"];
  17. print "</p>";
  18.  
  19. ?>


A grande diferença foi no uso da classe de SOAP, o PHP5 tem já implementada uma classe SoapClient, que automáticamente sem necessidade de mais nenhum método permite aceder às funções disponibilizadas pelo Web Service em questão.

  1. $cliente = new SoapClient($wsdl);


O resultado, no browser, deste script seria exactaemnte o mesmo do anterior.

Este serviço(Web Service) é gratuito, e as informações são actualizadas uma vez em cada 3 meses.





Escrito por João Vieira
Website do autor: http://www.joaovieira.com
Dados do autor: Programador multi-plataforma com ênfase em ambiente Linux.

Comentários

Comentários a este artigo

Enviado em 2010-07-22 por Marcelo Silva
Ao tentar executar recebo a resposta:
Catchable fatal error: Object of class stdClass could not be converted to string in /home/storage/0/02/a4/listasa/public_html/teste.php on line 37

Enviado em 2010-03-23 por Yeddo
Não consegui consumi esse web service.

Dá a seguinte mensagem:
Falha na solicitação com status HTTP 406: Not Acceptable.

Esse web service continua a funcionar ?

Att

Enviado em 2010-01-11 por José Rogado
Olá,

Não consigo utilizar este Web Service. Utilizando o SoapUI, a interface WSDL aparece correctamente, mas quando invoco o método enviando uma string com um IP recebo o erro "406 Not Acceptable". Alguma ideia?

Enviado em 2009-06-23 por Rafael
Olá

Ao executar o código, o seguinte erro aparece:

Fatal error: Uncaught SoapFault exception: [HTTP] Not Acceptable in /home/egovlivre/www/fortes/ip2pais/ws-ip2pais.php:15 Stack trace: #0 [internal function]: SoapClient->__doRequest(\'__call(\'IP2Pais\', Array) #2 /home/egovlivre/www/fortes/ip2pais/ws-ip2pais.php(15): SoapClient->IP2Pais(\'81.193.4.92\') #3 {main} thrown in /home/egovlivre/www/fortes/ip2pais/ws-ip2pais.php on line 15

Alguma idéia?

Att,
Rafael

Enviado em 2009-03-09 por Yann Carlos Tinoco
João.. não consegui fazer funcionar... me é retornado uma série de erros:

Warning: SoapClient::__construct() expects parameter 2 to be array, string given in C:\\xampplite\\htdocs\\nusoap.php on line 5

Fatal error: Uncaught SoapFault exception: [Client] SoapClient::__construct() [function.--construct]: Invalid parameters in C:\\xampplite\\htdocs\\nusoap.php:5 Stack trace: #0 C:\\xampplite\\htdocs\\nusoap.php(5): SoapClient->__construct(\'http://webservi...\', \'$wsdl\') #1 {main} thrown in C:\\xampplite\\htdocs\\nusoap.php on line 5

se puder, ajude-me por favor

Enviado em 2007-07-02 por Marcus Cavalcanti
Existe uma maneira de usar o metodo getProxy() e ao inves dele me retornar um array, el eme retorne um xml?

Pois o padrao do protocolo e trocar as respostas atraves de xml, acredito que o metodo getProxy() tenha um parse de xml to array .. mas eu preciso mesmo é do xml .. existe como?

Obrigado,

Faça um comentário

Comentário

Nome
E-mail

Este comentário só ficará válido depois de fazer clique no link que lhe será enviado já a seguir para o e-mail indicado. Como tal garanta que o seu e-mail está válido e operacional, se não receber o nosso e-mail verifique os seus filtros de SPAM, ou a caixa de Lixo/Trash do seu cliente de e-mail.

 

Avaliar artigo

Avalie este artigo

 



Nome
E-mail

Este voto só ficará contabilizado depois de fazer clique no link que lhe será enviado já a seguir para o e-mail indicado. Como tal garanta que o seu e-mail está válido e operacional, se não receber o nosso e-mail verifique os seus filtros de SPAM, ou a caixa de Lixo/Trash do seu cliente de e-mail.

 

 

 

 

Recomendar este artigo a alguém

Envie a alguém conhecido

De:  
Nome E-mail
 
Para:  
Nome E-mail
Será enviado um link da página deste artigo para o e-mail que indicar como destino.