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:
- PHP: Integrando o Facebook ao seu site – parte 1 – Acessando o perfil público
- PHP: Integrando o Twitter ao seu Site – Autenticação de Usuários
- PHP: Integrando o Twitter ao seu Site – Extra (Mais comandos da API)
- PHP: Integrando o Twitter ao seu Site – Parte 2
- PHP: Integrando o Twitter ao seu site – Parte 1
Alguem ai sabe usar a função ‘getXAuthToken’?!?
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.
Ótimo post! Me ajudou bastante!
Minha duvida agora é: Como criar um aplicativo que permita posts no twitter de quem se cadastrar no app.
Meu próximo post será sobre isso Marcelo, só não me pergunte quando eu vou fazê-lo :)
Pingback: Enviando mensagens para o Twitter pelo PHP com OAuth | Supertutoriais
Valeu!! ótimo tutorial!
Me ajudou bastante para entender um outro tutorial em inglês, que mostra como fazer aquele esquema de Deny/Allow.
http://blancer.com/tutorials/73877/how-to-authenticate-users-with-twitter-oauth/
mas fiquei com uma dúvida
sabe se tem como fazer um update no status do usuário que permitiu o acesso sem que ele esteja logado no twitter?
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.
Vou aguardar o seu próximo tutorial,
Eu não estou entendendo é nada disso aqui que eu estou fazendo :), Obrigado pela atenção.
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…
O trabalho vai ser o mesmo, só que ao invés de gravar a senha e o usuário de cada turma, tu vai ter que gravar o token de autenticação. Basicamente é essa a mudança que tu terá que fazer
Seria gravado no banco oauth_token e o oauth_secret e seriam usados no método que você mostrou para enviar o twitt?
Então seria gravado no banco oauth_token e o oauth_secret que seriam usados no método que você mostrou para enviar o twitt?
Exato
Haha valeu!!
Funcionou agora
Muito obrigado!
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.
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
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?
Se tu estiver usando tal e qual foi apresentado aqui, um simples var_dump($result) vai te dizer se tiver ocorrido algum erro na execução da requisição
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?
Pelo que vi, podem ser duas coisas. Uma delas é a data/hora do teu server, outra, pode ser que teu token não esteja correto. Dá uma olhada em ambas
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
Consegui fazer voltar a funcionar. O detalhe foi que a codificação do meu server estava errada e o timezone também.
Valeu
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.
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
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
Tenho idéia sim, o erro é bem explicito, tua aplicação tá somente leitura
Velho, ali na linha 12 dos teus códigos não tem aquela vírgula. Dá msg de erro na linha 15 se deixar ela; Mesmo assim, maravilhoso post.
Valeu Tiago, corrigi o post.
Pelo que vi, podem ser duas coisas. Uma delas é a data/hora do teu server, outra, pode ser que teu token não esteja correto. Dá uma olhada em ambas
Boa tarde!
Não achei o link “My Access Token”. Onde esta isso?
Your apps > Clique na aplicação > menu a direita está o link
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.
Vá no endereço: http://dev.twitter.com/apps logue no sistema e voilá!
Valeu cara muito bom tutorial excelente
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
Olá Douglas. O teu problema é que tu precisa usar o utf8_encode, pois a API do twitter, espera receber uma string com codificação UTF-8
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
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?
o meu script ta em utf-8, mas as informações postadas vem do BD que esta em latin
Teu problema deve estar ai, ou tu usa um banco em utf-8 (que seria o mais correto) ou tu vai ter que converter as strings que vierem do banco para poder enviar para o twitter
meu banco é meio dificil de mudar pois já é bem grande e tal…
mas pra converter nao seria o simples encode??
Nao consegui usar fiz tudo ok todos os tokens da mensagem de tudo tranquilo porem nao twita nem retorna outros dados.
O que pode ser?
http://www.centralproducoes.com/admin/modulos/contato/twittersend.php
Os problemas poderiam ser vários, mas somente com um var_dump do retorno da API que a resposta poderia ser mais precisa.
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?
Olá Leonardo. Utilizando o método GET, tu pode colocar como segundo parametro um array, nele, tu especifica o count, assim:
$connection->get('statuses/home_timeline',array('count' => 5);
Show de bola, perfeito!!!
Obrigado, mais uma vez parabéns pelo tuto, ajudou muito!!!
Muito obrigado por este post. Entre todos os que pesquisei, foi o único que funcionou!!!!
Obrigado e Parabéns!
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?
Olha, eu posso numerar uns 10 problemas que podem ser, mas todos eles começam com a análise do retorno do teu $result.
Provavelmente o melhor tutorial de integração de php com o twitter em Português!
Muitos parabéns e um grande Obrigado!