Conexão Ao Twitter Usando O oAuth

Complementando a matéria anterior que falamos sobre “conexão ao Twitter usando o PHP”, hoje vamos falar sobre a autenticação através do oAuth.

Todo programador, assim como os usuários sabem que a autenticação é uma das partes mais importantes no sistema. Se a autenticação não for perfeita, certamente trará prejuízos e vulnerabilidade ao seu Projeto!

Visando dar maior liberdade a seus usuários, sem esquecer de mantendo a segurança, vários Programadores e Administradores estão passando a usar oAuth em suas aplicações para conectar ao Twitter.

twitter

O Que É O oAuth?

É um script protodolo aberto (free) de segurança e autenticação que usa APIs.

Ele permite que usuários efetuem acessos ilimitados de seus web sites ao Twitter.

Como O oAuth É Usado?

O oAuth pode ser usado para acessar o Twitter por um curto período.

Exemplo:

Quando um usuário efetua login em uma página, seus dados são enviados através do método GET ao Twitter.

Antes de enviá-los o Sistema faz uma série de verificações, conferindo se os dados informados são realmente de uma conta válida do Twitter.

Criando Uma Conta No Twitter

Bem… nem precisamos dizer, né?

Se você pretende usar este código em suas aplicações, utilize uma conta válida do Twitter.

Bem… agora tratando-se do desenvolvedor:

Ao verificar nossa solução, você verá que para você ter acesso à solução “API” será necessário criar uma conta de desenvolvedor.

Como Encontrar O oAuth?

Como dissemos anteriormente, o oAuth é um script gratuito e pode ser facilmente encontrado na Internet.

Claro, assim como eu encontrei, você também encontrará muitos exemplos com falha na Internet, porém, mesmo que os diversos scripts funcionem corretamente, os originais através dos links a seguir:

OBS.: Desta página o único ficheiro que deveremos usar é o “OAuth.php”. Porém, sería ideal (até para conhecer outros recursos) verificar todas as páginas.

Conhecendo O Sistema

Abaixo e em anexo temos um sistema especial para seu uso.

Ele foi testado e aprovado, podendo ser usado por qualquer programador (após as configurações devidas).

Até para facilitar seu entendimento, vamos descrever cada ficheiro e expor os comentários dentro deles.

config.php


redirect.php:


getRequestToken(OAUTH_CALLBACK);

// Salva as credenciais temporáriamente na sessão
$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

switch ($connection->http_code) {
case 200:
// Gera a autorização, autoriza a URL e redireciona o usuário para o Twitter
$url = $connection->getAuthorizeURL($token);
header('Location: ' . $url);
break;
default:

// Mostra uma notificação se o acesso ao Twitter der erro
echo 'Conexão ao Twitter não realizada. Atualize sua página ou tente novamente.';
}

connect.php:


consumer key e o secret para testar este código. Cadastre-se na página a seguir:

- https://twitter.com/apps';
exit;
}

// Gera uma imagem com link para o arquivo redirect.php
$content = 'Sign in with Twitter';

// Inclui HTML nesta página
include('html.inc');

clearsessions.php:


callback.php:


getAccessToken($_REQUEST['oauth_verifier']);

// Salva o token de acesso. Caso você queira, pode salvar em uma base de dados para uso futuro.
$_SESSION['access_token'] = $access_token;

// Remove as informações do oauth_token
unset($_SESSION['oauth_token']);
unset($_SESSION['oauth_token_secret']);

// Se a resposta ao HTTP é 200 ele continua conectado
if (200 == $connection->http_code) {
// O usuário é verificado e o token de acesso é salvo para ser usado no futuro.
$_SESSION['status'] = 'verified';
header('Location: ./index.php');
} else {
header('Location: ./clearsessions.php');
}

index.php:


get('account/verify_credentials');

/* Alguns exemplos de chamada em Tela */
//$connection->get('users/show', array('screen_name' => 'Quemuel Aquino'));
//$connection->post('statuses/update', array('status' => date(DATE_RFC822)));
//$connection->post('statuses/destroy', array('id' => 5437877770));
//$connection->post('friendships/create', array('id' => 9436992));
//$connection->post('friendships/destroy', array('id' => 9436992));

// Inclui HTML na página
include('html.inc');

OBS.: Os 2 arquivos a seguir estarão dentro do diretório "twitteroauth".

twitteroauth.php:


http_status; }
function lastAPICall() { return $this->last_api_call; }

// Constrói o Objeto TwitterOAuth
function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
$this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
$this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
if (!empty($oauth_token) && !empty($oauth_token_secret)) {
$this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
} else {
$this->token = NULL;
}
}

// GET de request_token para o Twitter
function getRequestToken($oauth_callback = NULL) {
$parameters = array();
if (!empty($oauth_callback)) {
$parameters['oauth_callback'] = $oauth_callback;
}
$request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
$token = OAuthUtil::parse_parameters($request);
$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
return $token;
}

// Retorna string e autoriza a URL
function getAuthorizeURL($token, $sign_in_with_twitter = TRUE) {
if (is_array($token)) {
$token = $token['oauth_token'];
}
if (empty($sign_in_with_twitter)) {
return $this->authorizeURL() . "?oauth_token={$token}";
} else {
return $this->authenticateURL() . "?oauth_token={$token}";
}
}

function getAccessToken($oauth_verifier = FALSE) {
$parameters = array();
if (!empty($oauth_verifier)) {
$parameters['oauth_verifier'] = $oauth_verifier;
}
$request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
$token = OAuthUtil::parse_parameters($request);
$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
return $token;
}

function getXAuthToken($username, $password) {
$parameters = array();
$parameters['x_auth_username'] = $username;
$parameters['x_auth_password'] = $password;
$parameters['x_auth_mode'] = 'client_auth';
$request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
$token = OAuthUtil::parse_parameters($request);
$this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
return $token;
}

// GET do OAuthRequest
function get($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'GET', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response);
}
return $response;
}

// POST do OAuthRequest
function post($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'POST', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response);
}
return $response;
}

// Exclui a função oAuthRequest
function delete($url, $parameters = array()) {
$response = $this->oAuthRequest($url, 'DELETE', $parameters);
if ($this->format === 'json' && $this->decode_json) {
return json_decode($response);
}
return $response;
}

// Formata e acessa um OAuth / API
*/
function oAuthRequest($url, $method, $parameters) {
if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
$url = "{$this->host}{$url}.{$this->format}";
}
$request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
$request->sign_request($this->sha1_method, $this->consumer, $this->token);
switch ($method) {
case 'GET':
return $this->http($request->to_url(), 'GET');
default:
return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata());
}
}

// Retorna as informações do API
function http($url, $method, $postfields = NULL) {
$this->http_info = array();
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
curl_setopt($ci, CURLOPT_HEADER, FALSE);

switch ($method) {
case 'POST':
curl_setopt($ci, CURLOPT_POST, TRUE);
if (!empty($postfields)) {
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
}
break;
case 'DELETE':
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
if (!empty($postfields)) {
$url = "{$url}?{$postfields}";
}
}

curl_setopt($ci, CURLOPT_URL, $url);
$response = curl_exec($ci);
$this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
$this->http_info = array_merge($this->http_info, curl_getinfo($ci));
$this->url = $url;
curl_close ($ci);
return $response;
}

// Pega as informações do HEADER
function getHeader($ch, $header) {
$i = strpos($header, ':');
if (!empty($i)) {
$key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
$value = trim(substr($header, $i + 2));
$this->http_header[$key] = $value;
}
return strlen($header);
}
}

oauth.php:

code

Bem... este é um exemplo simples de acesso. Você poderá melhorá-lo e adaptá-lo às suas reais necessidades...

Não se esqueça de verificar as observações (disponíveis em cada ficheiro) e efetuar seu cadastro no Twitter, senão ele não vai funcionar.

Faça seu teste e deixe aqui seu comentário...

Grande abraço.

Faça o download do código: Conexão Ao Twitter Usando O oAuth

1 Star2 Stars3 Stars4 Stars5 Stars (4 votes, average: 4.00 out of 5)

28 Responses

  1. Quemuel,

    Coloquei seu exemplo dentro do meu site em http://imovelavenda.com.br/oauth/twitter/

    Tentei usa-lo, segui cada detalhe mas ainda deve faltar algo pois quando executo /oauth/twitter/index.php (do seu exemplo, configurado para mim) ele simplesmente mostra a minha index original e não acontece nada, nem solicita a autorização de conexão.

    A linha abaixo deve postar 'Teste de mensagem!', correto?
    $connection->post('statuses/update', array('status' => 'Teste de mensagem!'));

    Como posso apurar esse erro?

    Grato

  2. Sorry! Tudo ok! ;D

    Revisei tudo e percebi que tinha uma diretiva no meu .htaccess que redirecionava qualquer solicitação de index.html para nossa raiz. Alterei para home.html e ficou perfeito.

    Ahh, só achei um erro no arquivo twitteroauth.php na linha 138 que impossibilitou a execução mas era só um "*/" que você esqueceu de retirar.

    Só mais uma coisa, reparei que está em UTF-8 e tranca quando tem acentuação, como se faz para usar acentuação nos posts, suporta ISO-8859-1?

    Valeu pelo script!

  3. Quemuel,

    Como posso fazer para postar texto com acentuação (ISO-8859-1)?

    Obrigado

  4. Olá Roger,

    Conforme conversamos hoje através do MSN, caso alguém tenha alguma dúvida, é só usar a função nativa do PHP utf8_encode()

    Obrigado pelo elogio postado no email.

    Abraço,

    Quemuel

    1. Olá Quemuel! Obrigado pela sua participação. Bom fim de semana! Um Abraço Rui Soares

  5. Olá, para todos.
    Criei um site em joomla e gostaria que as atualizações fossem publicadas no twitter utilizando a API do site encurtador de urls http://clipe.me
    Alguem poderia me ajudar a entender como utilizo?

    Obrigado pela ajuda.

    Paulo

  6. Tentei utilizar o script para não conseguir logar. Dar erro interno no servidor

  7. Olá gostaria  de ter um exemplo de como seria este arquivo (html.inc),  agradeço …

  8. Ola tudo blz? cara me ta dando o seu script um erro meto os dados no config e quando ponho a rodar no meu servidor aparece esta mensagem "Conexão ao Twitter não realizada. Atualize sua página ou tente novamente. " Amigo não é preciso meter o oauth_token e o oauth_token_secret?

  9. Bom Dia,
    Primeiramente, parabéns pelo post.
    Eu tenho uma dúvida, já consegui registrar uma nova aplicação, peguei os keys já inseri neste modelo, consigo me autenticar. agora gostaria de fazer uma simples consulta via .php que seria por exemplo quantos amigos tenho. Você tem como me dar alguma dica de como faço isso usando este modelo que você postou de autenticação ?

  10. Eu instalei a API configurei o Twitter exibe a tela de autorização de uso da App, mas não faz mais nada ele retorna ao arquivo connect.php e não faz mas nada, como posso ter certeza que a conexão foi fechada e qual um método para posta tweets?

  11. Olá, fiz tudo conforme o tutorial, consegui conectar no Twitter, mas ele me gera um número de 7 dígitos, denominado PIN, e pede:

    "You've successfully granted access to dalcarobo.com!
    Simply return to dalcarobo.com and enter the following PIN to complete the process."

    O que faço com esse PIN?

  12. só não entendi onde eu consigo o OAUTH_CALLBACK os outros dois eu achei mas este não 

  13. Parabens to a tempos procurando algo que realmente funcione sobre essa Class OAuth, Esse foi o primeiro que conectou de verdade, se poder adiantar mais alguma coisa estarei de volta para estudo obrigado

  14. Opa!!! a timeline está sendo puxada no formato de texto. Como eu faço para deixar as URLs e Hashtags com link???? Abraço!

  15. "Could not connect to Twitter. Refresh the page or try again later. " como resolvo isso?

  16. Conexão ao Twitter não realizada. Atualize sua página ou tente novamente. ( como resolvo isso? coloquei td direito no arquivo config )

  17. Opa!!! Estou tentando implementar mas não to conseguindo, alguem poderia me ajudar? depois que eu logo com o twitter com a app… me retorna este erro.. não sei o que é que eu posso estar fazendo de errado!

    "Esta página da web tem um loop de redirecionamento" "Erro 310 (net::ERR_TOO_MANY_REDIRECTS): Houve muitos redirecionamentos."

    Alguem poderia me ajudar?

  18. Estou com uma dúvida.

    Vi que toda vez que eu tento logar com o Twitter tenho que clicar em "autorizar" e não simplesmente logar no twitter (como acontece com as autorizações de login via Facebook no qual é necessário autorizar apenas uma vez.)

    Você sabe se o Twitter é possivel fazer desta forma tb ? como ?

  19. Oi fiz o que falou tudo funcionando direito. La no twitter tem o meu aplicativo com o acesso aceito, mas na minha aplicação ainda fica pedindo toda hora para autorizar acesso. Isso é normal.

  20. Tem como alguém me dar uma luz?
    Eu já fui atrás em vários lugares e nada, nada funciona, preciso disso para sexta.
    Tem como alguém me ajudar?!

Leave a Reply

Your email address will not be published. Required fields are marked *


Como Criar Um Site, Blog - WebMaster.pt