Thursday, 30 August 2012

Criar TinyURL com PHP

TinyURL (tinyurl.com) é um serviço que permite você encurtar suas urls.

Para usar o serviço com o php é bem fácil. Coloque o código abaixo no seu site script php.

//pega os dados do serviço TinyURL
function get_tinyurl($url)  {  
  $ch = curl_init();  
  $timeout = 5;  
  curl_setopt($ch,CURLOPT_URL,'http://tinyurl.com/api-create.php?url='.$url);  
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);  
  $data = curl_exec($ch);  
  curl_close($ch);  
  return $data;  
}

//agora é só usar!
$tinyurl = get_tinyurl('http://mayk.brito.net.br');

//retorna http://tinyurl.com/96vla39

echo $tinyurl

Use a função get_tinyurl() e divirta-se.

Sunday, 25 March 2012

PHP cURL e Captcha. Como eu entendi e aprendi a trabalhar com isso

Algo que eu queria estudar há algum tempo era o tal do cURL e fazer serviços em php que agregam conteúdos de sites. Eu já tinha feito coisas assim, mas fiquei sabendo que com a biblioteca libcurl o negócio é mais fera ainda, pois além de buscar conteúdo, eu posso interagir com outro servidor a ponto de enviar coisas para o FTP ou fazer login em sites. O legal disso é que meus serviços poderiam ser cada vez mais interessantes, como o que vou falar aqui neste artigo.

Eu queria um exemplo da vida real, algo que eu pudesse usar em meus sistemas. Lembrei de um cliente que reclamou que era muito chato ter que ficar entrando nos sites do governo e preenchendo formulário para buscar coisas simples, como o CNPJ de uma empresa. Eu disse para ele que aquilo tinha que ser feito, mas falei que seria possível que o sistema que desenvolvi para ele, trouxesse só o necessário e ele poderia ver todo o conteúdo, dentro do próprio sistema. Ele (com lágrimas nos olhos, sério!) me disse que se eu fizesse isso ele seria um homem muito mais feliz. Pois decidi fazer então!

Chega de papo!

 

COMECE A LER DAQUI SE QUISER IR DIRETO AO PONTO!

Indo atrás de artigos e livros sobre o cURL, para a solução descrita acima, achei esse post que ensina o que vou falar aqui. Só que o post estava meio antigo e vi que tinha muita gente reclamando que o código não funcionava direito (inclusive eu não consegui rodar também).

Leia o post se quiser mais info, pois é um excelente começo (até antes de continuar lendo este aqui pois lá, o Bryan, trata bem do mesmo assunto).

cURL

Não e minha intenção ensinar o cURL do php aqui, porém vou te falar alguns passos básicos para você começar

  1. Inicie o cURL
  2. Coloque as opções desejadas
  3. Execute-o
  4. Feche-o para liberar recursos do sistema

Esses quatro passos, em código ficam assim:

$ch = curl_init();
curl_setopt($ch, CURLOPT_NOMEDAOPCAO, 'valor');
$dadosqueocurlpegou = curl_exec($ch);
curl_close($ch);

Isso é o básico do básico para você começar a fazer os seus próprios scripts/serviços em php!

Consulta de CNPJ na Receita Federal

Então o que iremos analisar rapidamente é um script que busca um CNPJ e retorna os dados da pessoa jurídica. Isso seria muito simples se, no formulário, você digitasse somente o CNPJ. Porém temos o famoso CAPTCHA que é um tipo de validação pra saber, justamente, se não é um robô que está fazendo a consulta. Este serviço em php que estamos aprendendo não é robô que vai bagunçar com o site da Receita. Ao contrário, é uma ajuda ao usuário que sempre desfruta dos serviços da Receita Federal, a ter mais comodidade na lida diária com os sistemas deles. Além da garantia do serviço de qualidade, que é o site da Receita.

Nós não iremos burlar o captcha. Ahhh que chato. Se era isso que você estava procurando, nem precisa continuar lendo 🙂

Nós iremos digitar ele dentro do nosso sistema, pois o nosso script irá trazer os dados da receita para o sistema do cliente, sem este precisar abrir o site da receita para fazer suas consultas (basta, por exemplo, ele clicar no número do CNPJ e digitar o captcha que aparece ao lado do número).

Neste exemplo eu farei duas páginas. A primeira para mostrar o captcha e o campo para ser digitado o CNPJ. E a segunda para mostrar os dados da Pessoa Jurídica que a Receita disponibiliza.

Primeira página: receita.php

<?php

/** 
 * Nesta função iremos baixar a imagem do captcha
 *
 * Parametro $url: 
 *   Coloque a url que o captcha usa para reproduzir a imagem
 * Parametro $arquivo: 
 *   Coloque o arquivo para salvar a imagem. 
 *   IMPORTANTE que o arquivo já exista e tenha permissão CHMOD 777
 */
function recebe_imagem($url, $arquivo) {
  $cookie = $_SERVER['DOCUMENT_ROOT'].'/rand/receita.txt'; //Importantissimo que o caminho esteja correto e com permissão CHMOD 777
  
  $ch = curl_init ();

  curl_setopt_array($ch, array(
    CURLOPT_URL => $url, //url que produz a imagem do captcha.
    CURLOPT_COOKIEFILE => $cookie, //esse mais o debaixo fazem a mágica do captcha
    CURLOPT_COOKIEJAR => $cookie,  //esse mais o de cima fazem a mágica do.. ah já falei isso;
    CURLOPT_FOLLOWLOCATION => 1, //não sei, mas funciona :D
    CURLOPT_RETURNTRANSFER => 1, //retorna o conteúdo.
    CURLOPT_BINARYTRANSFER => 1, //essa tranferencia é binária.
    CURLOPT_HEADER => 0, //não imprime o header.
  ));    
  
  $data = curl_exec($ch);
  
  curl_close ($ch);
    
  //salva a imagem
  $fp = fopen($arquivo,'w');
  fwrite($fp, $data);
  fclose($fp);

  //retorna a imagem
  return $arquivo;
}

//Então vamos pegar a imagem
$img = recebe_imagem("http://www.receita.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image", "receita.gif");

//E criar o formulário que mostra a imagem + o campo de inserção do CNPJ
print "<img src='{$img}' />" . 
      '<form action="receita_respond.php" method="POST">
         captcha
         <input size="8" maxlength="4" name="idLetra">
         cnpj
         <input size="16" maxlength="14" name="cnpj">
         <input type="submit">
      </form>';

?>

Explicação no código.

A única coisa a ser explicada aqui é sobre as opções CURLOPT_COOKIEFILE e CURLOPT_COOKIEJAR. Esse dois meninos são muito importantes para que o seu script faça algum tipo de autenticação como login em sites ou possa entrar em páginas seguras, pois como o nome das opções já dizem, eles são responsáveis pelos cookies.

Aqui então temos 2 passos importantes a serem feitos:

  1. Definir o caminho onde o cookie será salvo. Lembrando que o caminho deve ter permissão CHMOD 777 (total leitura e escrita)
  2. Definir as 2 opções do CURL:
  •   CURLOPT_COOKIEFILE é o nome do arquivo que contém os dados do cookie.
  •   CURLOPT_COOKIEJAR é o nome do arquivo que salva todos os cookies internos quando a conexão é fechada

Pois bem. Aprendido isso você está apto a fazer coisas um pouco mais complexas com o cURL. Mas pensa dominar o básico primeiro ok?

Segunda página: receita_respond.php

<?php
// Pega os valores dos campos que foram enviados pelo formulário
// *sem validação mesmo, é só pra exemplo tá?
$cnpj = $_POST['cnpj'];
$letras = $_POST['idLetra'];

#Coisas importantes para dizer ao $ch logo mais

//IMPORTANTE que o caminho esteja correto e tenha permissão CHMOD 777
$cookie = $_SERVER['DOCUMENT_ROOT'].'/rand/receita.txt'; 

// não sei.. coloquei pra garantir
$reffer = "http://google.com"; 

//sempre é bom ter para garantir a entrada do seu serviço
$agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; 

//url da receita que valida o formulário
$url ="http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/valida.asp"; 

//dados do POST do formulário da receita. 
//** Muito importante entender os formulários que você esteja trabalhando **
//os campos NESTA EXATA ordem funcionaram legal ;)
$post_fields = "origem=comprovante&cnpj={$cnpj}&idLetra={$letras}&idSom=&submit1=Consultar&search_type=cnpj"; 

//agora sim.. 1, 2, 3 VALENDO! 
$ch = curl_init();

curl_setopt_array($ch, array(
  CURLOPT_URL => $url, //sem isso, seu cURL é imprestável
  CURLOPT_POST => 1, //afirmo que ele irá fazer um POST
  CURLOPT_POSTFIELDS => $post_fields, //quais são os campos que estarei enviando ao valida.asp?
  CURLOPT_USERAGENT => $agent, //ahh é importante sempre ter né =D
  CURLOPT_REFERER => $reffer, //não sei.. coloquei pra garantir
  CURLOPT_COOKIEFILE => $cookie, //lembra dos cookies que guardamos qndo digitamos o captcha? 
  CURLOPT_COOKIEJAR => $cookie,  //então, precisamos deles :)
  CURLOPT_FOLLOWLOCATION => 1, // não quero explicar, mas é importante. pesquisa ae depois ;)
  CURLOPT_RETURNTRANSFER => 1, // quer ver os dados? então sempre ative esta opção no seu script
  CURLOPT_HEADER => 0, // sem header
));

$result = curl_exec($ch);

curl_close($ch);

//Se deu algum erro, a Receita mostra a mesma página do formulario do captcha
//Vamos descobrir se é a mesma página do formulário do captcha e redirecionar para a nossa página.
if (preg_match("/<title>Emiss.*<\/title>/siU", $result)) {
  //Então volta pro nosso formulário para preenchimento dos dados.
  //Estava com preguiça de pensar algo mais útil, então fiz esse só de exemplo mesmo.
  $host  = $_SERVER['HTTP_HOST'];
  $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  $extra = 'receita.php';
  header("Location: http://$host$uri/$extra");
  return;
}

print $result;
?>

A explicação tá no código.

Basicamente eu pego os dados do formulário, que é o CNPJ e o CAPTCHA, mando validar pelo script da Receita, e pego os dados de retorno, que é a página com os dados do CNPJ. Se não for essa página, provável que tenha algum erro, então volte ao nosso formulário.

___________________________________________________________________________________________________________________
Então não sei mais o que falar e tô com dor nas costas. Se alguém tiver alguma dúvida a gente vai conversando.

Sucesso!