2011-07-13 14 views
5

Korzystam z poniższego kodu, aby odczytać do consumer_key i consumer_secret z config.php, przekazać go do twitter i odzyskać trochę bitów informacji z powrotem.PHP/Twitter oAuth - Automatyczne tweety

To, co poniżej próbuje wykonać skrypt, to "cache" request_token i request_secret. Tak więc teoretycznie powinienem móc ponownie wykorzystać te szczegóły (wszystkie 4 z nich do automatycznego tweetowania, gdy jest to wymagane).

<?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(); 
} 
?> 

Kiedy biegnę /?verify&oauth_token=0000000000000000 - działa jednak próbuje resuse wygenerowane tokeny itp ... dostaję 401

Oto ostatni kawałek kodu, w którym staram się ponownie wykorzystać dane połączone z Twittera z moim consumer_key ic onsumer_secret i uzyskać 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'); 

Nie wiem, co się dzieje źle, jesteś w stanie buforować dane czy trzeba spróbować czegoś innego?

+0

Czy ustawiasz $ consumer_key i $ consumer_key_secret z definicji w config w twoim drugim skrypcie? – GregSchoen

Odpowiedz

5

Nie można przechowywać tokeny OAuth w pamięci podręcznej i więcej niż 1 żądanie z nim, ponieważ OAuth służy do zabezpieczenia systemu, twój "oauth_token" zawiera pewne unikalne dane, token będzie w stanie aby ponownie zadzwonić do twittera, jak tylko zadzwonił, ten "oauth_token" nie jest już ważny, a klasa OAuth powinna zażądać nowego "oauth_token", upewniając się, że każde wykonane połączenie jest bezpieczne.

Dlatego po raz drugi pojawia się błąd "401 nieautoryzowany", ponieważ token jest już nieważny.

Twitter nadal używa OAuth v1 (v2 jest nadal w fazie roboczej, mimo że Facebook i google już zaimplementowały go w niektórych częściach) Poniższy obrazek opisuje przepływ uwierzytelniania OAuth. Mam nadzieję, że to pomaga.

OAuth authentication flow

Jakiś czas temu użyłem tego, aby połączyć się Twitter i wysyłać tweety, wystarczy zauważyć, że nie skorzystać z niektórych klas Zend jako projekt został uruchomiony na serwerze 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

Ale mam rację, sądząc, że mogę autoryzować moje konto za pomocą aplikacji, gdy skonfiguruję ją na dev.twitter.com/apps i wygeneruje token dostępu i tajny klucz dostępu. Też próbowałem tego i dostaję 401, który powinien działać. – CLiown

+0

Dodałem przykładowy kod, którego użyłem po raz ostatni do stworzenia aplikacji Twittera, mam nadzieję, że pomoże – Stephan

0

W drugim skrypcie wygląda na to, że nie konfigurujesz klucza klienta i tajnego klucza klienta podczas tworzenia instancji TwitterOAuth.

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