PHPit - PHP

"Agora, pois, permanecem a fé, a esperança, o amor, estes três; mas o maior destes é o amor." (I Coríntios 13:13)

API is.gd: Encurtando URLs com o PHP

Sobre o site


O site is.gd é um encurtador de URLs. O serviço básico deles é pegar uma URL grande e transformá-la em pequena.
Decidi começar com esse site porque é a API mais simples que eu encontrei.

Sobre a API


Documentação: http://is.gd/api_info.php
Necessita registro: Não
Limite de uso: Encurtamento de 1000 URLs/dia por IP
Termos de uso: http://is.gd/terms.php

Utilizando a API


O uso do is.gd é muito simples: você envia uma URL e recebe outra. A única limitação é quanto a URLs com mais de 2000 caracteres, o que não deve ser um problema já que é muito raro de se ver isso.

Para a nossa experiência, decidi fazer uma classe para trabalhar com o encurtamento de URLs. Para fins didáticos, não irei trabalhar com métodos e propriedades privados (só um :P) e muito menos com padrões de projeto.

A classe vai funcionar da seguinte maneira: instanciamos o objeto, solicitamos o encurtamento da URL e depois trabalhamos com os dados recebidos.

As propriedades que o nosso objeto deve ter serão as seguintes:
url_original: URL original que foi passada para ser encurtada.
url_curta: URL curta retornada pelo servidor.
erro: true ou false, indicando se houve erro durante a tentativa de encurtar a URL.
erro_msg: no caso de 'erro' ser true, aqui fica a mensagem de erro, caso contrário fica como NULL.

E os métodos que utilizaremos:
encurtar: obviamente serve para encurtar a URL. :P
desencurtar: método "brinde" para desencurtar a URL, por que na real a própria API não desencurta as URLs.

Mão na massa


O primeiro passo é montar o corpo da nossa classe. Optei por utilizar um método de encurtar a URL para que o mesmo objeto possa ser utilizado para encurtar várias URLs e também te dá a possibilidade de instanciar o objeto apenas para desencurtar URLs.

Vou dar uma breve explicação do que há no código pois todo ele está comentado. :)

Para fazer o encurtamento precisamos enviar a URL para a API através do método GET.
Por exemplo: http://is.gd/api.php?longurl=phpit.com.br

Desta requisição podem retornar duas coisas: o status 200 (OK) com a URL encurtada ou o status 500 (Internal Server Error) com a mensagem de erro.

O método encurtar preenche as propriedades da classe com os dados pertinentes e retorna true para o caso de ter ocorrido tudo bem e false para o caso de ter dado problema.
Já o método desencurtar apenas retorna a URL desencurtada, sem mexer nas propriedades da classe. Pode também retornar false para o caso de a URL ser inválida.

A seguir você tem a classe na versão comentada e na versão não comentários.

Versão comentada:

Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2. class isgd {
  3.  
  4. // Declara as propriedades que serão utilizadas
  5. public $url_original, $url_curta, $erro, $erro_msg = NULL;
  6.  
  7. // Este será nosso objeto cURL, o que utilizaremos para acessar a API
  8. private $curl;
  9.  
  10. // Nosso método construtor, que será executado quando a classe for instanciada
  11. public function __construct() {
  12. // Cria nosso objeto cURL
  13. $this->curl = curl_init();
  14.  
  15. // Configura o objeto para retornar os dados ao invés de imprimir na tela
  16. curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
  17. /* Configura o objeto para responder a redirecionamentos
  18.   É utilizado no método de desencurtar URLs, pois precisamos seguir até a URL final */
  19. curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, 1);
  20. }
  21.  
  22. // Método para encurtar a URL
  23. public function encurtar($url) {
  24. // Utilizamos esta função para codificar os caracteres especiais da URL
  25. $urlCodificada = rawurlencode($url);
  26.  
  27. // Esta é a URL que utilizaremos para acessar a API
  28. $urlApi = 'http://is.gd/api.php?longurl='.$urlCodificada;
  29.  
  30. // Configuramos a URL no cURL
  31. curl_setopt($this->curl, CURLOPT_URL, $urlApi);
  32.  
  33. // Executamos a requisição
  34. $retorno = curl_exec($this->curl);
  35.  
  36. // Recebemos os dados da execução
  37. $dados = curl_getinfo($this->curl);
  38.  
  39. // O http_code pode ser 200 (OK) e 500 (Internal Server Error)
  40. /* Junto com a verificação, é bom olhar também se a URL
  41.   possui menos de 20 caracteres, já que o is.gd trabalha
  42.   com no máximo 18. Isto ajuda a evitar error arbitrários. */
  43. if ($dados['http_code'] == 200 && strlen($retorno) < 20) {
  44. // Caso tenha ocorrido tudo bem, resetamos estas propriedades
  45. $this->erro = false;
  46. $this->erro_msg = NULL;
  47. $this->url_curta = $retorno;
  48. } else {
  49. // Caso tenha dado algum problema, colocamos os dados aqui
  50. $this->erro = true;
  51. $this->erro_msg = $retorno;
  52. $this->url_curta = NULL;
  53. }
  54.  
  55. // Colocamos a URL original no seu lugar
  56. $this->url_original = $url;
  57.  
  58. /* Por fim, para tornar mais fácil ainda, o retorno da função será
  59.   true ou false dependendo do resultado que obtivemos no processo */
  60. return $this->erro;
  61. }
  62.  
  63. // Método para desencurtar a URL
  64. public function desencurtar($url) {
  65. // Primeiro verificamos se a URL é realmente is.gd
  66. if (substr($url, 0, 13) == 'http://is.gd/' || substr($url, 0, 6) == 'is.gd/') {
  67. // Configuramos a URL no cURL
  68. curl_setopt($this->curl, CURLOPT_URL, $url);
  69.  
  70. // Executamos a requisição
  71. curl_exec($this->curl);
  72.  
  73. // Recebemos os dados da execução
  74. $dados = curl_getinfo($this->curl);
  75.  
  76. // Testamos se o status é 200 e se a URL retornada é diferente da desencurtada
  77. if ($dados['http_code'] == 200 && $url != $dados['url']) {
  78. // Retornamos a URL desencurtada
  79. return $dados['url'];
  80. }
  81. }
  82. // Caso tenha dado algum problema no meio do caminho, retornamos false
  83. return false;
  84. }
  85.  
  86. }
  87. ?>
<?php
    
class isgd {
        
        
// Declara as propriedades que serão utilizadas
        
public $url_original$url_curta$erro$erro_msg NULL;
        
        
// Este será nosso objeto cURL, o que utilizaremos para acessar a API
        
private $curl;
        
        
// Nosso método construtor, que será executado quando a classe for instanciada
        
public function __construct() {
            
// Cria nosso objeto cURL
            
$this->curl curl_init();
            
            
// Configura o objeto para retornar os dados ao invés de imprimir na tela
            
curl_setopt($this->curlCURLOPT_RETURNTRANSFER1);
            
/* Configura o objeto para responder a redirecionamentos
               É utilizado no método de desencurtar URLs, pois precisamos seguir até a URL final */
            
curl_setopt($this->curlCURLOPT_FOLLOWLOCATION1);
        }
        
        
// Método para encurtar a URL
        
public function encurtar($url) {
            
// Utilizamos esta função para codificar os caracteres especiais da URL
            
$urlCodificada rawurlencode($url);
            
            
// Esta é a URL que utilizaremos para acessar a API
            
$urlApi 'http://is.gd/api.php?longurl='.$urlCodificada;
            
            
// Configuramos a URL no cURL
            
curl_setopt($this->curlCURLOPT_URL$urlApi);
            
            
// Executamos a requisição
            
$retorno curl_exec($this->curl);
            
            
// Recebemos os dados da execução
            
$dados curl_getinfo($this->curl);
            
            
// O http_code pode ser 200 (OK) e 500 (Internal Server Error)
            /* Junto com a verificação, é bom olhar também se a URL
               possui menos de 20 caracteres, já que o is.gd trabalha
               com no máximo 18. Isto ajuda a evitar error arbitrários. */
            
if ($dados['http_code'] == 200 && strlen($retorno) < 20) {
                
// Caso tenha ocorrido tudo bem, resetamos estas propriedades
                
$this->erro false;
                
$this->erro_msg NULL;
                
$this->url_curta $retorno;
            } else {
                
// Caso tenha dado algum problema, colocamos os dados aqui
                
$this->erro true;
                
$this->erro_msg $retorno;
                
$this->url_curta NULL;
            }
            
            
// Colocamos a URL original no seu lugar
            
$this->url_original $url;
            
            
/* Por fim, para tornar mais fácil ainda, o retorno da função será
               true ou false dependendo do resultado que obtivemos no processo */
            
return $this->erro;
        }
        
        
// Método para desencurtar a URL
        
public function desencurtar($url) {
            
// Primeiro verificamos se a URL é realmente is.gd
            
if (substr($url013) == 'http://is.gd/' || substr($url06) == 'is.gd/') {
                
// Configuramos a URL no cURL
                
curl_setopt($this->curlCURLOPT_URL$url);
                
                
// Executamos a requisição
                
curl_exec($this->curl);
                
                
// Recebemos os dados da execução
                
$dados curl_getinfo($this->curl);
                
                
// Testamos se o status é 200 e se a URL retornada é diferente da desencurtada
                
if ($dados['http_code'] == 200 && $url != $dados['url']) {
                    
// Retornamos a URL desencurtada
                    
return $dados['url'];
                }
            }
            
// Caso tenha dado algum problema no meio do caminho, retornamos false
            
return false;
        }
        
    }
?>


Versão não comentada:

Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2.  
  3. class isgd {
  4.  
  5. public $url_original, $url_curta, $erro, $erro_msg = NULL;
  6. private $curl;
  7.  
  8. public function __construct() {
  9. $this->curl = curl_init();
  10.  
  11. curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
  12. curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, 1);
  13. }
  14.  
  15. public function encurtar($url) {
  16. $urlCodificada = rawurlencode($url);
  17. $urlApi = 'http://is.gd/api.php?longurl='.$urlCodificada;
  18. curl_setopt($this->curl, CURLOPT_URL, $urlApi);
  19. $retorno = curl_exec($this->curl);
  20. $dados = curl_getinfo($this->curl);
  21.  
  22. if ($dados['http_code'] == 200 && strlen($retorno) < 20) {
  23. $this->erro = false;
  24. $this->erro_msg = NULL;
  25. $this->url_curta = $retorno;
  26. } else {
  27. $this->erro = true;
  28. $this->erro_msg = $retorno;
  29. $this->url_curta = NULL;
  30. }
  31.  
  32. $this->url_original = $url;
  33.  
  34. return $this->erro;
  35. }
  36.  
  37. public function desencurtar($url) {
  38. if (substr($url, 0, 13) == 'http://is.gd/' || substr($url, 0, 6) == 'is.gd/') {
  39. curl_setopt($this->curl, CURLOPT_URL, $url);
  40. curl_exec($this->curl);
  41. $dados = curl_getinfo($this->curl);
  42. if ($dados['http_code'] == 200 && $url != $dados['url']) {
  43. return $dados['url'];
  44. }
  45. }
  46. return false;
  47. }
  48.  
  49. }
  50.  
  51. ?>
<?php

    
class isgd {
        
        public 
$url_original$url_curta$erro$erro_msg NULL;
        private 
$curl;

        public function 
__construct() {
            
$this->curl curl_init();
            
            
curl_setopt($this->curlCURLOPT_RETURNTRANSFER1);
            
curl_setopt($this->curlCURLOPT_FOLLOWLOCATION1);
        }

        public function 
encurtar($url) {
            
$urlCodificada rawurlencode($url);
            
$urlApi 'http://is.gd/api.php?longurl='.$urlCodificada;
            
curl_setopt($this->curlCURLOPT_URL$urlApi);
            
$retorno curl_exec($this->curl);            
            
$dados curl_getinfo($this->curl);
            
            if (
$dados['http_code'] == 200 && strlen($retorno) < 20) {
                
$this->erro false;
                
$this->erro_msg NULL;
                
$this->url_curta $retorno;
            } else {
                
$this->erro true;
                
$this->erro_msg $retorno;
                
$this->url_curta NULL;
            }

            
$this->url_original $url;

            return 
$this->erro;
        }
        
        public function 
desencurtar($url) {
            if (
substr($url013) == 'http://is.gd/' || substr($url06) == 'is.gd/') {
                
curl_setopt($this->curlCURLOPT_URL$url);
                
curl_exec($this->curl);
                
$dados curl_getinfo($this->curl);
                if (
$dados['http_code'] == 200 && $url != $dados['url']) {
                    return 
$dados['url'];
                }
            }
            return 
false;
        }
        
    }

?>


Utilização


Para utilizar a classe é muito simples.

Encurtando uma URL
Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2.  
  3. $isgd = new isgd();
  4.  
  5. if ($isgd->encurtar('http://phpit.com.br')) {
  6. echo 'URL encurtada: ';
  7. echo $isgd->url_curta;
  8. } else {
  9. echo $isgd->erro_msg;
  10. }
  11.  
  12. ?>
<?php

    $isgd 
= new isgd();
    
    if (
$isgd->encurtar('http://phpit.com.br')) {
        echo 
'URL encurtada: ';
        echo 
$isgd->url_curta;
    } else {
        echo 
$isgd->erro_msg;
    }

?>


Vale ressaltar que quando ocorrer tudo certo, teremos o objeto desta forma:

isgd Object
(
[url_original] => phpit.com.br
[url_curta] => http://is.gd/9Q9kP
[erro] =>
[erro_msg] =>
[curl:private] => Resource id #2
)


E quando houver erro teremos algo parecido com isso:

isgd Object
(
[url_original] => [...] uma url muito longa aqui :) [...]
[url_curta] =>
[erro] => 1
[erro_msg] => Error: The URL entered was too long.
[curl:private] => Resource id #2
)


Desencurtando uma URL
Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2.  
  3. $isgd = new isgd();
  4.  
  5. $url = $isgd->desencurtar('http://is.gd/9Q9kP');
  6.  
  7. if ($url) {
  8. echo 'URL encurtada: ';
  9. echo $url;
  10. } else {
  11. echo 'Nao foi possivel desencurtar a URL.';
  12. }
  13.  
  14. ?>
<?php

    $isgd 
= new isgd();
    
    
$url $isgd->desencurtar('http://is.gd/9Q9kP');
    
    if (
$url) {
        echo 
'URL encurtada: ';
        echo 
$url;
    } else {
        echo 
'Nao foi possivel desencurtar a URL.';
    }

?>


Conclusão


Bom... Acho que pra primeira API explorada tivemos um trabalho bastante interessante.
Espero que você possa aproveitar (e entender, principalmente) esta classe. Se você fizer melhorias nela, por favor, me mande pois eu gostaria muito de ver!

Aguardo sugestões para as próximas APIs exploradas e quem quiser contribuir com experiências, elas são sempre bem vindas.

Um abraço a todos e fiquem com Deus!

Dim dim

 

Comentaí! (05)

Muito bom cara! Valeu pela aula ;D Rodrigo Waltenberg em 07/03/2010 às 06:39 utilizando o Opera Opera 9.80 no Windows Windows NT
Esse seu post vai ajudar o pessoal não só com API mas também com o CURL, coisa muito útil quando se está lidando com RESTFull.

Acho que a galera vai gostar! anselmo battisti em 07/03/2010 às 10:41 utilizando o Mozilla Firefox Mozilla Firefox 3.5.8 no Ubuntu Linux Ubuntu Linux
Falando em encurtadores, não sei pq o dito migre.me é considerado tão "revolucionário", já que existiam inumeros serviços encurtadores de url na internet, bem antes dele. Robin em 21/03/2010 às 14:55 utilizando o Mozilla Firefox Mozilla Firefox 3.6.2 no Windows Windows NT
Opa, tudo bem?

Você pode me ajudar a entender como utilizar a API deste encurtador brasileiro? http://clipe.me

Tenho um pequeno site em joomla e queria usar para publicar no twitter minhas atualizações.

Obrigado pela ajuda.

PR Paulo Roberto em 12/07/2010 às 11:59 utilizando o Internet Explorer Internet Explorer 8.0 no Windows Windows NT
Olá,

estou usando um componente para Joomla que tem no rodapé do site para baixar esta rodando perfeitamente.

Ele publica instantaneamente os novos artigos e as atualizações via Joomla no Twitter e no Facebook.

Olhem a página de estatística da url curta que legal:

[IMG]http://www.clipdiario.com.br/estatistica.jpg[/IMG]

Abraços :)

Padunic Paulo Roberto em 28/07/2010 às 09:26 utilizando o Mozilla Firefox Mozilla Firefox 3.6.8 no Windows Windows NT
 

Comenta logo, pô!

* Todos os links inseridos nos comentários possuem rel="nofollow" para impedir com que crawlers considerem os mesmos como relevantes.
* Os e-mails não são divulgados.

Dados pessoais

Você é realmente um humano?

Finalmente, digite seu comentário :)

Caixinha de Sugestões

O que é isso? Aqui você pode simplesmente digitar uma sugestão (artigos, resenhas, melhorias, etc) sem precisar preencher longos formulários. Digite o que quiser na caixinha abaixo e eu lerei com o maior prazer! Se quiser se identificar, fique a vontade!

O PHPit é redigido e mantido por Rafael Jaques - Política de Privacidade.

XHTML/CSS desenvolvido por André Gazola.

PHPit 2007 - 2009 - Alguns direitos reservados.

Feeds ;)

Creative Commons License

PHPit por Rafael Jaques é licensiado sob a Creative Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil License.