2011-07-13 22 views
5

Utilizo el siguiente código para leer consumer_key y consumer_secret desde config.php, pásalo a Twitter y recupera algunos bits de información de ellos.PHP/Twitter oAuth - Tweets automatizados

Lo que la secuencia de comandos a continuación intenta hacer es 'cache' la request_token y request_secret. En teoría, debería ser capaz de reutilizar esos detalles (los 4 de ellos para twittear automáticamente cuando sea necesario).

<?php 

require_once('twitteroauth/twitteroauth.php'); 
require_once('config.php'); 

    $consumer_key = CONSUMER_KEY; 
    $consumer_secret = CONSUMER_SECRET; 

if (isset($_GET["register"])) 
{ 
    // If the "register" parameter is set we create a new TwitterOAuth object 
    // and request a token 

    /* Build TwitterOAuth object with client credentials. */ 

    $oauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 
    $request = $oauth->getRequestToken(); 

    $request_token = $request["oauth_token"]; 
    $request_token_secret = $request["oauth_token_secret"]; 

    // At this I store the two request tokens somewhere. 

    file_put_contents("request_token", $request_token); 
    file_put_contents("request_token_secret", $request_token_secret); 

    // Generate a request link and output it 
    $request_link = $oauth->getAuthorizeURL($request); 
    echo "Request here: <a href=\"" . $request_link . "\">" . $request_link . "</a>"; 
    die(); 
} 
elseif (isset($_GET["validate"])) 
{ 
    // This is the validation part. I read the stored request 
    // tokens. 

    $request_token = file_get_contents("request_token"); 
    $request_token_secret = file_get_contents("request_token_secret"); 

    // Initiate a new TwitterOAuth object. This time we provide them with more details: 
    // The request token and the request token secret 

    $oauth = new TwitterOAuth($consumer_key, $consumer_secret, 
     $request_token, $request_token_secret); 

    // Ask Twitter for an access token (and an access token secret) 
    $request = $oauth->getAccessToken(); 

    // There we go 
    $access_token = $request['oauth_token']; 
    $access_token_secret = $request['oauth_token_secret']; 

    // Now store the two tokens into another file (or database or whatever): 
    file_put_contents("access_token", $access_token); 
    file_put_contents("access_token_secret", $access_token_secret); 

    // Great! Now we've got the access tokens stored. 
    // Let's verify credentials and output the username. 
    // Note that this time we're passing TwitterOAuth the access tokens. 


    $oauth = new TwitterOAuth($consumer_key, $consumer_secret, 
     $access_token, $access_token_secret); 

    // Send an API request to verify credentials 
    $credentials = $oauth->oAuthRequest('https://twitter.com/account/verify_credentials.xml', 'GET', array()); 

    // Parse the result (assuming you've got simplexml installed) 
    $credentials = simplexml_load_string($credentials); 

    var_dump($credentials); 

    // And finaly output some text 
    echo "Access token saved! Authorized as @" . $credentials->screen_name; 
    die(); 
} 
?> 

Cuando corro /?verify&oauth_token=0000000000000000 - Funciona sin embargo tratando de resuse las señales generadas etc ... consigo un 401

Aquí es el último bit de código donde intento de reutilizar los datos de Twitter combinados con mi consumer_key yc onsumer_secret y obtener el 401:

require_once('twitteroauth/twitteroauth.php'); 
require_once('config.php'); 

// Read the access tokens 
$access_token = file_get_contents("access_token"); 
$access_token_secret = file_get_contents("access_token_secret"); 

// Initiate a TwitterOAuth using those access tokens 
$oauth = new TwitterOAuth($consumer_key, $consumer_key_secret, 
    $access_token, $access_token_secret); 

// Post an update to Twitter via your application: 
$oauth->OAuthRequest('https://twitter.com/statuses/update.xml', 
    array('status' => "Hey! I'm posting via #OAuth!"), 'POST'); 
No

seguro de lo que está pasando mal, que son capaces de almacenar en caché los datos o tengo que probar otra cosa?

+0

¿Está configurando $ consumer_key y $ consumer_key_secret de las definiciones en config en su segundo script? – GregSchoen

Respuesta

5

No se pueden almacenar los tokens de OAuth en caché y con más de 1 solicitud, ya que OAuth está ahí para ayudar a que el sistema sea seguro, su "oauth_token" contendrá algunos datos únicos, este token solo podrá para hacer una llamada nuevamente a Twitter, tan pronto como se realizó la llamada, que "oauth_token" ya no es válido, y la clase OAuth debe solicitar un nuevo "oauth_token", asegurándose así de que cada llamada realizada sea segura.

Es por eso que está recibiendo un error "401 no autorizado" por segunda vez ya que el token ya no es válido.

twitter sigue usando OAuth v1 (v2 aún está en el proceso de borrador aunque Facebook y Google ya lo implementaron en algunas partes) La imagen siguiente describe el flujo de la autenticación OAuth. Espero que ayude.

OAuth authentication flow

Hace un tiempo lo utilizó para conectarse a Twitter y enviar tweets, justo en cuenta que lo hizo hacer uso de algunas clases de Zend medida que el proyecto se ejecuta en un servidor de Zend.

require_once 'Zend/Service/Twitter.php'; 
class Twitter { 

    protected $_username = '<your_twitter_username>'; 
    protected $_token = '<your_twitter_access_token>'; 
    protected $_secret = '<your_twitter_access_token_secret>'; 
    protected $_twitter = NULL; 

    //class constructor 
    public function __construct() { 
     $this->getTwitter(); 
    } 

    //singleton twitter object 
    protected function getTwitter() { 
     if (null === $this->_twitter) { 
      $accessToken = new Zend_Oauth_Token_Access; 
      $accessToken->setToken($this->_token) 
        ->setTokenSecret($this->_secret); 

      $this->_twitter = new Zend_Service_Twitter(array(
         'username' => $this->_username, 
         'accessToken' => $accessToken, 
        )); 

      $response = $this->_twitter->account->verifyCredentials(); 
      if ($response->isError()) { 
       throw new Zend_Exception('Provided credentials for Twitter log writer are wrong'); 
      } 
     } 
     return $this->_twitter; 
    } 

    //send a status message to twitter 
    public function update($tweet) { 
     $this->getTwitter()->status->update($tweet); 
    } 

} 
+0

Pero estoy en lo cierto al pensar que puedo autorizar mi cuenta con la aplicación cuando la configuro en dev.twitter.com/apps y genera un token de acceso y un secreto de token de acceso. También lo intenté y obtuve un 401 que debería funcionar. – CLiown

+0

Agregué un código de muestra que usé la última vez para crear una aplicación de Twitter, espero que ayude – Stephan

0

En su segundo script, parece que no está configurando la clave del consumidor y el secreto del consumidor cuando crea su instancia de TwitterOAuth.

// Initiate a TwitterOAuth using those access tokens 
$oauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret);