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
Também estou com problemas a enviar tweets por variavel.
Em texto funciona muito bem em variavel não.
O problema que Carlos citou está na acentuação. O padrão do twitter é UTF-8. Então, se enviar algo com acento, vai dar bronca e não envia. Para consertar isso, basta usar a função utf8_encode() do php.
Ex:
$texto = "Testando post com ácéntúáção";
$result = $connection->post(
'statuses/update',
array(
'status' => utf8_encode($texto)));
É isso! Espero ter ajudado =)
Boa tarde, gostaria de saber como colocar para buscar somente os 5 ultimos twits. Seria por akele array do get? Como seia?
Grato.
Olá fiz tudo o que estava previsto porém não consegui esta dando problema numa linha da programação:
printf('<li><a href="%s">%s</a></li>',
'http://twitter.com/' . $node->user->screen_name. '/status/' . $node->id,
$node->text
);
Será que alguem pode me ajudar? Obrigado.
Que problema exatamente está ocorrendo?
Adicione no array a chave ‘count’ => numeroDeTweetsQueTuQuerRetornar
Pensei que você responderia por e-mail rsrs.. o erro é este aqui.
Parse error syntax error, unexpected T_STRING
que cai bem no "printf"
Isso é erro de PHP, não um problema de script. E o erro é bem claro.
O código esta de acordo com o que você forneceu então é a configuração do php certo?
E mais uma pergunta rsrs
Teria como trabalhar com a home_timeline em base com o que você fez acima?
O problema está antes, muito provavelmente tua requisição não está retornando nada. Um var_dump no $result vai te dizer que deu erro ou não.
Interessante está funcionando :)
Mudei aqui
$result = $connection->get(
'statuses/home_timeline', <- Funcionou :) ta retornando o home_timeline…
array()
);
Agora eu não tinha percebido que ele retornava tudo em array :P
A unica coisa que teria que modificar é o foreach que esta ruim por um for sei lá :P
ola, estou listando corretamente os tweets, porém, o ID retornado $node->id não está batendo com o da minha timeline, o que pode ser? obrigado!
Pow cara, valeu a dica. Estava precisando exatamente disso. Muito fácil a explicação.
Parabéns, e continue sempre com esse espírito de ajuda.
Quem está com problemas no $node->id ( como o Paulo ) , só precisa mudar para $node->id_str , que o problema vai ser resolvido.
espero ter ajudado
Muito boa sua explicação, rápida e objetiva! Vlw pela força, muito me ajudou! Abraços!
Valeu! rápido e simples integrar meu site ao Twitter. Fiz isto também com o "Curtir" do Facebook e ficou ótimo!
Obrigado!
A vírgula dentro do array num tá errada (já que não tem mais nenhum outro parâmetro)?
Errado não está, mas não tem necessidade de ter ela ali.
So tem um porem com essa nova API do Twitter como integro isso no meu site que é uma rede social onde cada usuario postasse a mensagem ia ser enviada para o twitter dele..
pq dessa forma ai acima so vai enviar para a minha conta do twitter.. agora como faço pra usar isso com o usuarios ? pq nao da pra ficar gerando uma chave pra cada um.. pq toda hora tem um novo usuario e ai tem algum geito?
Realmente, tem Jeito sim, não dá pra ficar gerando uma chave para cada um, por isso escrevi esse post :D
Olá
Gostaria de saber se tem alguma forma de pegar os Tweets que contenho determinada palavra através de RSS. Sei que a URL https://twitter.com/statuses/user_timeline/kidh0.rss retorna os tweets de determinado usuário, mas eu queria uma URL q retornasse os tweets por palavra chaves, tem como?
Acredito que tu só vá conseguir fazer isso através da API. Antigamente tinha a opção se RSS nas pesquisas, mas creio que foi depreciado esse recurso.
Quando tentei enviar um tweet deu esse erro:
Fatal error: Cannot redeclare class TwitterOAuth in /home/eduardo/public_html/meusite/inc/twitteroauth_raiz/twitteroauth/twitteroauth.php on line 15
Aqui está meu código:
<?php
// Faz conexão com a API
require('inc/twitteroauth_raiz/twitteroauth/twitteroauth.php');
$consumer_key = 'xxxxx';
$consumer_secret = 'xxxxx';
$oauth_token = 'xxxxx';
$oauth_token_secret = 'xxxxx';
$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';
}
//Tweeta :D
require('inc/twitteroauth_raiz/twitteroauth/twitteroauth.php');
$consumer_key = 'xxxxx';
$consumer_secret = 'xxxxx';
$oauth_token = 'xxxxx';
$oauth_token_secret = 'xxxxx';
$connection = new TwitterOAuth(
$consumer_key,
$consumer_secret,
$oauth_token,
$oauth_token_secret
);
$result = $connection->post(
'statuses/update',
array(
'status' => 'Twittando via PHP :D',
)
);
?>
O que pode ser?
abraço!
Desconsidere meu último comentário, eu tava duplicando a conexão lol
Muito obrigado pela ajuda, excelente tutorial!
abraços!
Tem como colocar na lista o avatar (foto) na lina do usuário e texto?
Como ficaria?
Outra coisa q eu queria saber, quando RT, é descontado o nome do usuario que está re-twitando. O q faz com q o texto apareça sem os caracteres referentes ao desconto finalizando com "…"
O que pode ser feito pra evitar isso?
Se tu usares o retweet nativo da API (https://dev.twitter.com/docs/api/1/post/statuses/retweet/%3Aid) ele não vai adicionar o RT, mas vai fazer o retweet sem descontar o nome do usuário.
Charles, se tu utilizar o método da API https://dev.twitter.com/docs/api/1/get/users/profile_image/%3Ascreen_name, tu pode ter aceso ao avatar do usuário em qualquer tamanho e formato.
Muito bom esse artigo!!!
Mas eu to meio enrolado pra fazer funcionar :(
Rodei o primeiro código para fazer a conexão com a API e dei um var_dump em $result e retornou NULL !!!
As chaves estão corretas. Olhei na configuração do DEV a procura do client/browser mas não achei onde estaria essa opção. Está read and write, seria suficiente??
Onde pode estar meu erro??
Vamos a alguns levantamentos:
Tu mudaste as chaves do artigo para as chaves da tua aplicação?
Tentou acessar a URL gerada pela aplicação fora dela, para ver se está retornando algo?
O read & write é mais q suficiente, mas precisa que tu libere a permissão inicialmente.
Entendi tudo e fiz funcionar certinho. Mais tenho um problema. Como faço para deixar gravado que o usuário já liberou acesso da primeira vez para não ter que ficar colocando sempre a permissão. Onde eu gravo que ele já liberou…rsss
Leandro, creio que esse artigo vai te ajudar: http://blog.hboaventura.com/php-integrando-o-twitter-ao-seu-site-autenticacao-de-usuarios/
Olá.
Boa noite.
Como se aplica o sistema de envio de mensagem no Facebook (seguindo mais ou menos a logica utilizada aqui)?
Tenho um site, que coleta noticias de um banco de dados, dai queria publicar no Feed de noticias do meu Facebook as noticias automaticamente.
Muito obrigado desde já.
Abraço;
Boa tarde Alex, o Facebook usa o mesmo sistema de liberação de token para a utilização da API que o facebook usa (logicamente, para o dominio deles). Em breve pretendo fazer um post explicando como fazer a integração com essa API
Henrique,
Seu post me ajudou bastante. Obrigada.
Henrique, Estou com um problema.
Se eu colocar um texto em:
‘status’ => ‘Text of status here’
ele vai direitinho mas se eu usar uma variável passando parametro ela não vai.
Como posso resolver esse problema?
Se puder me ajudar eu agradeceria.
Anna
Problemas podem ser vários, dentre eles, os mais comuns são codificação (deve enviar em UTF-8 e está mandando em ISO-8859-1) ou algum problema em como está montando a string. Compartilhe o código que fica mais fácil de acertar.
Henrique,
parabéns por todas suas explicações, muito bom mesmo!
Mas estou com um problema. Tenho urls a serem exibidas pelo “$node->text”.
Porém, mesmo terem sido tweetadas expandidas, estão sendo exibidas com t.co.
Será que há alguma maneira de inserir o “expanded_url” junto ao “$node->text” ?
Obrigado.
Olá André, tudo bem? O que tu pode fazer é substituir o valor, recuperando a url expandida, conforme a API https://dev.twitter.com/docs/tweet-entities
Cara, script do cara*** esse!
O foda é que demorei um monte pra copiar e configurar tudo – por volta de 10 minutos =P
Vc poderia continuar e fazer um tuto pro pessoal que quer fazer algo mais complexo, pra mais usuarios – a ideia de descobrir o token de segurança remotamente, é complexo mas… foda-se, é legal quando vc consegue msm…
Também a complementar o twitter mudou um pouco a parte de criar um APP, agora vc cria ele como está descrito em todos os tutos da net – http://dev.twitter.com ->create an app -> nome+descrição+backsloq+captcha, mas o script nao funciona ainda, pra funcionar vc tem que clicar na guia ‘settings’ no topo da página, mudar o modo pra write & read e depois só gerar ou atualizar o seu token
Ainda bem que eles nao complicam mto LOL!
Vlw pelo script
Olá Djoni, tudo bem? Primeiro, que ótimo que o artigo está sendo útil para ti e obrigado pelas novas informações. Quanto ao tutorial, já tenho um artigo preparado com uma aplicação simples, que guarda os tokens para usar sem a necessidade de o usuário sempre dar permissão, deve entrar assim que eu terminar a série sobre o Facebook.
Henrique,
Belo artigo. Parabéns por compartilhar seus conhecimentos.