Fazendo requisição HTTP em Perl
Publicado em:
Fui estudar a API do Twitter e, para enviar um novo status, é preciso fazer uma requisição HTTP enviando via POST o login, a senha e o novo status da conta.
Para fazer isso em Perl usei dois módulos: HTTP::Request e LWP::UserAgent.
HTTP::Request
Esse módulo prepara toda a requisição, define os cabeçalhos, a URI e os parâmetros que deverão ser enviados juntos.
No nosso caso, precisamos informar que o request a ser feito precisa enviar os dados em POST, e que o retorno será um JSON.
require HTTP::Request;
# Login e senha no Twitter
my($username, $password) = ("login twitter", "senha twitter");
# Mensagem do status
my($message) = "Um teste usando a API do Twitter + Perl";
# Inicia o módulo Request
my($req) = HTTP::Request->new();
# Define o envio como POST
$req->method("POST");
# Define a URI de envio
$req->uri("http://api.twitter.com/1/statuses/update.json?status=$message");
# Pede para aceitar código Javascript como retorno.
$req->headers('Accept' => 'text/javascript');
# Envia os dados para a autenticação HTTP, necessária para
# enviar um novo status no Twitter.
$req->authorization_basic($username, $password);
Está tudo preparado para fazer a requisição ao servidor do Twitter e enviar o novo status. Mas quem vai fazer isso é o módulo LWP::UserAgent.
LWP::UserAgent
Esse módulo irá fazer a requisição na URI informada no módulo acima e, depois disso, armazenará o retorno dessa requisição. Dessa forma é possível obter o status e trabalhar em cima dele.
require LWP::UserAgent;
$ua = LWP::UserAgent->new;
# Nesse ponto o request será feito, passando toda a configuração do
# header definido no módulo Request.
$response = $ua->request($req);
print "Status da requisicao: $response->{_rc}\n";
print "Retorno da requisicao: $response->{_content}\n\n";
No caso do Twitter, se o status for atualizado corretamente, o stauts de retorno da requisição deverá ser 200. Qualquer coisa diferente disso é um erro, seja por falta de informações ou login e senha incorretos.
Para identificar a mensagem de erro, basta analizar o conteúdo do JSON que foi retornado. A mensagem de erro vem no node error.
Conclusão
Segue o código completo que tenho para adicionar status no Twitter.
#!/usr/bin/perl -w
use strict;
use JSON qw/from_json/;
use Encode qw/encode/;
require HTTP::Request;
require LWP::UserAgent;
if($#ARGV == -1) {
print "api.pl username:password \"Minha mensagem entre aspas\"\n";
exit();
}
# Pega os parâmetros passados
my($auth, $message) = @ARGV;
# Separa Login e password
my($username, $password) = split(":", $auth);
# Encoda a mensagem para UTF-8, eventando
# erro de acentuação
$message = encode("UTF-8", $message);
# Variáveis que serão usadas mais a frente
my($req, $ua, $response, $json);
my($content, $status); # conteúdo retornado pela API do Twitter
# Cria um request
$req = HTTP::Request->new();
$ua = LWP::UserAgent->new;
# Define o método e url do request
$req->method("POST");
$req->uri("http://api.twitter.com/1/statuses/update.json?status=$message");
# Define headers
$req->headers('Content-Type' => 'text/javascript');
$req->headers('Accept' => 'text/javascript');
# Faz o login
$req->authorization_basic($username, $password);
# Faz o request
$response = $ua->request($req);
# Pega o retorno
$content = from_json($response->{_content});
# Status do retorno
$status = $response->{_rc};
# Se houve erro
if($response->{_rc} != 200) {
print "Status.......: $status\n";
print "Error message: $content->{error}";
print "\n";
exit();
}
# Mostra ID do status criado
print "Status...: $response->{_rc}\n";
print "Status ID: $content->{id}\n";
exit();