set 1 2010

PHP: Integrando o Twitter ao seu Site – Parte 3 (Agora com OAuth)

Yes! I’m alive!

Depois de desaparecer por praticamente 4 meses (se você não me segue no twitter, é claro), cá estou eu novamente, tomando as rédeas para terminar de uma vez esse jornada em 3 partes.

Esta etapa deveria ter como finalidade, conforme o primeiro artigo, o desenvolvimento de uma biblioteca que agregasse as funções que foram desenvolvidas nos primeiros dois artigos, mas as coisas mudaram um pouco de figura. Visto que o Twitter recentemente parou de dar suporte a Basic Auth à sua API, muitas pessoas me pediram para que este terceiro (e último) artigo mudasse para como se autenticar na API usando OAuth. Como sou fácil de se convencer, resolvi mudar o artigo final para atender essa nova demanda.

O que nós vamos ver daqui em diante é o passo a passo de como gerar os tokens necessários para se autenticar no Twitter, usá-los junto com OAuth para se autenticar e enviar/receber os tweets através da API.

Para aqueles que estão praguejando agora e esperavam pela biblioteca que integraria todos os recursos, sugiro dar uma olhada nesses projetos, que, basicamente, fazem o que iríamos fazer aqui (pra que retrabalho, right?):

Parte 3: Usando OAuth para acessar a API do Twitter

Antes de mais nada, vamos explicar o que diabos é OAuth. Mas não vá imaginando grandes coisas. O foco principal não é detalhar e esmiuçar o OAuth, e sim usa-lo para acessar a API do Twitter).

OAuth

Basicamente, OAuth (Open Authorization) é um padrão aberto que permite que os usuários compartilhem seus dados entre sites, sem a necessidade usar seu usuário e senha. Ele se baseia no uso de tokens, que transitam entre os sites, permitindo acesso a recursos especificos por um determinado tempo.

Gerando os tokens (a.k.a. pedindo pro Twitter liberar o acesso)

Primeiramente, vamos gerar os tokens necessários para acessar a API (ou você achou que aquela abominação de colocar o usuário e senha do artigo anterior ia ser definitiva?). Para isso, acesse o Twitter Developers e clique em “Register an app”.

Será solicitado seu usuário e senha e aparecerá a tela para Registrar uma nova aplicação. Neste formulário, para o nosso uso, é importante que seja selecionado em Application Type a opção “Browser” (dãh) e em Default Access Type, a opção “Read & Write” (no nosso exemplo, vamos enviar e receber tweets). Preencha o resto dos campos com os dados da sua aplicação, mas não precisa se preocupar se a Callback URL é valida (lembrando, para o nosso exemplo em especifico).

Feito o cadastro, a página seguinte tem 2 informações necessárias para nosso exemplo: “Consumer key” e “Consumer secret”.

No menu a direita, no link “My Access Token”, tem as duas últimas informações necessárias para continuarmos: “Access Token (oauth_token)” e “Access Token Secret (oauth_token_secret)”.

Aqui cabe uma explicação.

Nossa aplicação é simples e visa o simples acesso aos nossos próprios tweets ou tweets de nossa aplicação. Justamente por essa simplicidade que não vamos ver como obter o Access Token e o Access Token Secret remotamente (não neste artigo, quem sabe mais adiante). Aplicações tipo TwitPic e o TwitCam fazem uso desses tokens e os recuperam remotamente (Lembra? Allow/Deny?) evitando de digitar usuários e senha em aplicações de terceiros.

Bom, depois da explicação, vamos continuar a brincadeira. Já estamos em posse de tudo que precisamos para colocar as mãos em código (estavam ansiosos não?), então pra que ficar esperando, let’s go!

Mãos a obra

A partir de agora é jogo rápido, codificar é sempre mais fácil do que falar (digitar no caso, eu acho).

Eu não vejo porque de reinventar a roda, já existem várias bibliotecas que fazem o trabalho pesado, eu vou usar para o nosso exemplo, uma feita por Abraham Williams, chamada OAuth Twitter PHP, que faz muito bem o que se propõem, é de fácil uso, e foi uma das primeiras que eu achei (just kidding :D ).

Faça o download da versão mais recente da biblioteca (na data de criação deste artigo, era a 0.2.0-beta3) e descompacte o diretório “twitteroauth” dentro da sua aplicação.

Feito isso, vamos criar o script que vai fazer a conexão com a API:

require_once('twitteroauth/twitteroauth.php');

$consumer_key = 'sua-consumer-key';
$consumer_secret = 'seu-consumer-secret';
$oauth_token = 'seu-oauth-token';
$oauth_token_secret = 'seu-oauth-token-secret';

$connection = new TwitterOAuth(
    $consumer_key,
    $consumer_secret,
    $oauth_token,
    $oauth_token_secret,
);

$result = $connection->get(
    'account/verify_credentials',
    array()
);

if(property_exists($result, 'error')){
    echo 'Ooops. Deu erro';
} else {
    echo 'Tudo tranquilo';
}

Explicando:

  • Linha 1: Require para a biblioteca do Twitter OAuth;
  • Linha 3 a 6: Simples atribuição dos tokens a variáveis (parece ficar mais fácil de visualizar);
  • Linha 8 a 13: Criando a instância da classe TwitterOAuth usando os parâmetros levantados anteriormente;
  • Linha 15 a 18: Uso o método get da classe TwitterOAuth para recuperar os dados da conta do Twitter;
  • Linha 20 a 24: Simples verificação a verificação foi feita com sucesso.

O método get tem como parâmetros o recurso e os parâmetros a ser passados para a API. Para este exemplo, usei o recurso “account/verify_credentials”, que basicamente trás informações sobre o usuário. A lista completa de recursos pode ser vista aqui.

Recuperando os tweets

Partindo do pressuposto que já está tudo certo e você está autorizado na API, vamos brincar mais um pouco.
No primeiro artigo da série, mostrei como recuperar de maneiras mais simples (RSS, basicamente) os tweets do usuário. Agora que já estamos mais profissionais no assunto, vamos usar a API para recuperar esses dados. É bem simples:

require_once('twitteroauth/twitteroauth.php');

$consumer_key = 'sua-consumer-key';
$consumer_secret = 'seu-consumer-secret';
$oauth_token = 'seu-oauth-token';
$oauth_token_secret = 'seu-oauth-token-secret';

$connection = new TwitterOAuth(
    $consumer_key,
    $consumer_secret,
    $oauth_token,
    $oauth_token_secret,
);

$result = $connection->get(
    'statuses/user_timeline',
    array()
);

echo '<ol>';
foreach($result as $node){
    printf('<li><a href="%s">%s</a></li>',
        'http://twitter.com/' . $node->user->screen_name. '/status/' . $node->id,
        $node->text
    );
}
echo '</ol>';

A Explicação também é simples: Eu adaptei o exemplo do primeiro post para ao invés de percorrer um XML ele percorrer o resultado da consulta à API. Com isso ele vai montar a mesma lista com os Tweets.

Enviando um tweet

No segundo artigo, utilizamos cURL para acessar a API e enviar tweets, passando o usuário e senha. Isso não é legal, e é evil. Agora podemos usar o método “post” para enviar os tweets, basicamente temos que mudar o recurso e passar a mensagem como parametro:

require_once('twitteroauth/twitteroauth.php');

$consumer_key = 'sua-consumer-key';
$consumer_secret = 'seu-consumer-secret';
$oauth_token = 'seu-oauth-token';
$oauth_token_secret = 'seu-oauth-token-secret';

$connection = new TwitterOAuth(
    $consumer_key,
    $consumer_secret,
    $oauth_token,
    $oauth_token_secret,
);

$result = $connection->post(
    'statuses/update',
    array(
        'status' => 'Text of status here',
    )
);

Rápido, fácil e indolor. Assim que as coisas devem ser!

Com isso você já tem uma boa base para criar aplicações no seu site, interagindo com a API do Twitter. Como complemento recomendo fortemente ler a documentação da Twitter Developers, que tem muita coisa boa pra ser aproveitada.

Pessoal, fico por aqui, até a próxima e boa diversão!

Links:

Créditos da imagem do “mano” twitter – Luciano Fontoura


mai 11 2010

PHP: Integrando o Twitter ao seu Site – Parte 2

Continuando o artigo anterior, hoje vamos dar mais um passo na integração do twitter ao seu site. Neste artigo vou mostrar como podemos enviar tweets direto do seu site usando a biblioteca cURL do PHP.

Se você não está familiarizado com essa biblioteca, não se preocupe, vamos dar um jeito de fazer parte da familia :D

Parte 2: Atualizando sua timeline

Como diria a bruxa do desenho do Pica-Pau (lembre-se, desenho!): “E lá vamos nós!”. Para começar, uma explicação básica do que é a biblioteca cURL e seu processo de instalação.

cURL

cURL(Client URL Reques Library) na wikipedia: “cURL é um projeto de sofware que fornece uma biblioteca e uma ferramenta de linha de comando para transferir dados usando vários protocolos”. Ele nos permite, basicamente, fazer requisições para uma URL e recuperar o resultado dessa requisição. Podemos também adicionar parâmetros a ela.

O PHP tem uma biblioteca para usar o CURL. A instalação é bem simples. No Ubuntu basta digitar a seguinte no terminal:

sudo apt-get update && sudo apt-get install curl php5-curl

Com isso você tem tanto a ferramenta para linha de comando quanto a biblioteca para PHP instaladas na sua máquina.

Um teste bem simples para ver o cURL funcionando é digitar o seguinte no terminal:

curl http://www.hboaventura.com

O retorno vai ser o código-fonte do meu site no seu terminal. Não vou me estender muito na cURL, tem bastante conteúdo na web, just google it!

Usando o php-curl para enviar tweets

Com o ambiente pronto, podemos agora focar na integração com o PHP que o pacote php5-curl adiciona ao nosso server. Basicamente, para enviar um tweet, você vai precisar:

  • seu usuário (d’oh);
  • sua senha (tinha dúvidas sobre isso ainda?);
  • a mensagem que você quer tweetar (até vou procurar no dicionário se isso já virou um verbete);

Assim como no outro artigo, a explicação é maior do que o código propriamente dito. Com esses dados a mão, o que temos que fazer é usar algumas funções do php-cURL para “embuti-los” na requisição. Vamos ao que importa (código!):

$usuario = 'kidh0';
$senha = 'hahaNoWay!';
$mensagem = 'Wow! Meu primeiro tweet via API';

$url = 'http://twitter.com/statuses/update.xml';

$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_POST, true);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, 'status='.$mensagem);
curl_setopt($curl_handle, CURLOPT_USERPWD, $usuario.':'.$senha);
$resultado = curl_exec($curl_handle);
curl_close($curl_handle);

Explicando a coisa toda:

  • Linhas 1 a 3: Basicamente coloquei em atributos os dados necessários para a requisição;
  • Linha 5: URL para qual é feita a requisição (envio do tweet). Note que o arquivo requisitado é um XML, por isso o retorno é um XML, mas a API do Twitter também aceita o formato JSON, retornando, obviamente, uma string JSON;
  • Linha 7: Inicia uma nova sessão e retorna o handler cURL para ser usado com as outras funções, leia mais;* Linha 9: Seta a requisição para ser um POST HTTP;
  • Linha 10: Ao setar para true, retornará o resultado de curl_exec() como uma string, se estiver false, vai jogar na tela direto;
  • Linha 11: Seta para 30 o número de segundos para esperar enquanto tenta conectar;
  • Linha 12: Adiciona um campo para o POST chamado status com o conteudo da variável $mensagem;
  • Linha 13: Seta o usuário e senha para a validação da requisição;
  • Linha 14: Atribui a variável $resultado o resultado da requisição. Vale lembrar aqui que o retorno, em caso de sucesso, vai ser um XML com todas os atributos do status. Em caso de erro, retornará a mensagem referente;
  • Linha 15: Fecha a conexão, mas não é necessário;

Para manipular a variável $resultado (lógico, se você optou por retornar um XML) podemos usar nosso bom amigo SimpleXML que foi usado no post anterior).

Com isso temos uma simples mas funcional integração de envio de tweets direto do seu site para o Twitter, prático e rápido.

No próximo artigo (e final, at least!), vamos fazer uma classe para trabalhar com o que vimos até agora, colocando um plus a mais :D . Até o próximo artigo!