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



Leia também:

  1. PHP: Integrando o Facebook ao seu site – parte 1 – Acessando o perfil público
  2. PHP: Integrando o Twitter ao seu Site – Autenticação de Usuários
  3. PHP: Integrando o Twitter ao seu Site – Extra (Mais comandos da API)
  4. PHP: Integrando o Twitter ao seu Site – Parte 2
  5. PHP: Integrando o Twitter ao seu site – Parte 1

Categoria: Sem categoria
Tags: , ,

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

  1. Dentre um dos futuros (mas não com data marcada) posts, vou fazer um how-to de como integrar uma aplicação com a api do twitter, sem saber o token, deixando na mão do usuário a escolha de liberar ou não.

  2. Pingback: Enviando mensagens para o Twitter pelo PHP com OAuth | Supertutoriais

  3. Que bom que o tutorial te ajudou. Pretendo disponibilizar até o fim do ano um aqui também. Quanto a tua dúvida, no momento que eu permitir o acesso de uma aplicação, ela pode atualizar o teu status sem que tu precise estar logado, pois ela guarda o teu token de autenticação.

  4. O meu problema é o seguinte:
    Estou fazendo um sistema escolar para o meu projeto final da faculdade
    onde são cadastradas várias turmas, e para cada turma várias disciplinas.
    A idéia é: que a cada nova aula adicionada para uma disciplina seja enviado um Twitt para o Twitter cadastrado para aquela turma que tem aquela disciplina.

    Se o Basic Auth ainda estivesse funcionando eu já tinha até a idéia de como fazer era só cadastrar o nome de usuário e senha do Twitter de cada turma e na hora de enviar o Twitt era só puxá-los do banco e usá-los.

    Mas agora com o OAuth estou tendo dificuldades,
    Se puder me ajudar eu agradeço…

  5. Como executo esse codigo na linha de comando do linux? a minha ideia é usar junto com um sistema de monitoramento que tenho aqui na empresa. Ele enviara os tweets e o twitter enviara tudo para meu celular, assim ficarei sabendo se algum link meu cair.
    eu estou tentando o php -q nomeDoScript.php mas nao esta funcionando.

  6. Tudo bem Jonny? A execução do script via linha de comando não tem nenhuma diferença da execução normal. Eu utilizo via linha de comando sem problemas. Via servidor, está funcionando? Talvez tu tenha que debuggar o retorno da execução pra ti ver o que está ocorrento

  7. Obrigado pela resposta Henrique, Eu consegui executar normalmente agora, tive que modificar algumas coisas no php.ini. Eu enviei algumas mensagens ao twitter sem problemas.
    Hoje do nada parou de funcionar a aplicação. O servidor está exatamente como eu deixei ontem e nada. Ja mandei email pro twitter perguntando se eu estava blacklisted e não estou.
    Alguma dica pra debugar isso?

  8. Amigo, o retorno que tive aqui desse comando é o seguinte:

    object(stdClass)#5 (2) {
    ["request"]=>
    string(310) “/1/account/verify_credentials.json?oauth_consumer_key=xxx&oauth_nonce=xxx&oauth_signature=xxx&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1290517225&oauth_token=xxx&oauth_version=1.0″
    ["error"]=>
    string(20) “Invalid / used nonce”
    }

    eu só substitui minhas credencias por xxx.
    Alguma ideia?

  9. Realmente a data do sistema estava errada por algum motivo. Eu troquei e mesmo assim continua sem funcionar. Eu verifiquei as credenciais e os tokens e estão corretos. Antes funcionava e simplesmente parou de funcionar. Bem estranho isso. Se pudermos conversar por email acho que seria melhor, podemos? Eu posto o resultado aqui depois.
    abraço e obrigado pela força

  10. Consegui fazer voltar a funcionar. O detalhe foi que a codificação do meu server estava errada e o timezone também.

    Valeu

  11. Artigo excelente se não fosse por um detalhe: o Captcha do Twitter Developers não funciona, isso mesmo que você leu sem invenção tentei umas 30 vezes ou mais e sempre aparece no topo do formulário :Unable to register this application. Try typing the CAPTCHA again.
    Ou eu estou ficando gaga cego ou esse formulário não funfa nem a pau abraços.

  12. Tudo bem Daniel? Pelo visto não :)
    Seguinte, o Twitter usa como sistema de captcha o reCaptcha, é possível que quando tu estava tentando fazer o resgistro, o sistema estivesse passando por turbulências. Eu já registrei inúmeras aplicações no twitter, então sugiro que tu tente novamente, pois é a primeira vez que vejo essa reclamação

  13. Boa noite henrique, fiz o seu exemplo, só que quando foi para enviar uma mensagem não deu certo, dei um var dump na variavel resulte e me apareceu isso:
    object(stdClass)#5 (2) { ["error"]=> string(33) “Read-only application cannot POST” ["request"]=> string(23) “/1/statuses/update.json” }.
    Vc tem ideia doq seja?
    Obrigado

  14. no meu nao tem este menu, so tem o seguinte texto:
    Welcome to the Developer Beta of the Twitter Application Platform! We’re just getting started, but we thought we’d start releasing components that will help you, the developers, connect your users with the world, right now.

    For starters, we’re allowing you to both register your application here, as well as providing an improved Authentication System, OAuth. To read more about how this help both you and your users, please visit http://oauth.net.

    Enjoy! And please report any bugs or general feedback to api@twitter.com.

  15. Bom Dia

    estou com problemas de codificação quando posto mensagem com acentuação, sempre retorna “Incorrect signature” e se a mensagem não tiver acentuação posta normal a mensagem

  16. Henrique pior que não, se eu não coloca nada ou o encode ele nao posta nada e o estranho é que se eu coloca um decode ele posta, mas com erro de codificação

  17. Ai podem ser dois problemas. Um deles é o teu script estar em iso-8859-1 (muito comum em devs que usam windows) o outro é a aplicação onde tu está enviando a informação (formulário, etc) ser em iso-8859-1. Algum deles confere?

  18. Olá Henrique
    Ótimo tutorial, bem explicado e fácil de entender. O melhor que achei até agora na web… Porém tenho uma dúvida.
    Na parte 1 do Tuto, vc mensiona que se eu quiser limitar o numero de twitts eu tenho que acrescentar o parametro: "?count=5" na URL" na URL, até aí blz. Nesta terceira parte, utilizando o Oauth para recuperar meus Twitts, como limito o número de publicações que vai me retornar?

  19. Olá, estou tendo problemas para enviar tweets. Quando envio como uma mensagem

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

    Porém quando envio como variável
    result = $connection->post(  
        'statuses/update',  
        array(  
            'status' => $tweet,
      )
     );
     
    Ele não envia, qual pode ser o problema? Sendo que a variável tem menos de 140 caracteres? 

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>