PHP / Twitter oAuth - Автоматические твиты - PullRequest
5 голосов
/ 14 июля 2011

Я использую следующий код, чтобы прочитать consumer_key и consumer_secret из config.php, передать его в твиттер и получить от них часть информации.

То, что пытается сделать приведенный ниже скрипт, это «кешировать» request_token и request_secret. Так что теоретически я должен быть в состоянии повторно использовать эти детали (все 4 из них для автоматического твита при необходимости).

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

Когда я запускаю /?verify&oauth_token=0000000000000000 - все равно работает, пытаясь повторно использовать сгенерированные токены и т.д ... Я получаю 401

Вот последний фрагмент кода, где я пытаюсь повторно использовать детали из Twitter в сочетании с моими consumer_key и c onsumer_secret и получаю 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');

Не уверен, что происходит не так, вы можете кэшировать детали или мне нужно попробовать что-то еще?

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

Вы не можете хранить токены OAuth в кеше и более чем на 1 запрос с ним, поскольку OAuth призван помочь защитить систему, ваш «oauth_token» будет содержать некоторые уникальные данные, этот токен сможет только Как только вызов будет выполнен, выполните один обратный вызов в твиттере, чтобы «oauth_token» больше не действовал, и класс OAuth должен запросить новый «oauth_token», таким образом убедившись, что каждый сделанный вызов безопасен.

Именно поэтому вы получаете сообщение об ошибке «401 несанкционированный» во второй раз, поскольку токен больше не действителен.

Твиттер все еще использует OAuth v1 (v2 все еще находится в процессе черновика, хотя Facebook и Google уже реализовали его в некоторых частях) Изображение ниже описывает процесс аутентификации OAuth. Надеюсь, это поможет.

OAuth authentication flow

Некоторое время назад я использовал это для подключения к твиттеру и отправки твитов, просто отметьте, что он использовал некоторые классы Zend, поскольку проект выполнялся на 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 голосов
/ 14 июля 2011

Во втором сценарии создается впечатление, что вы не устанавливаете Ключ потребителя и Секрет потребителя при создании экземпляра TwitterOAuth.

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