PHP / Twitter oAuth – автоматические твиты

Я использую следующий код для чтения в 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'); 

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

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

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

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

Протокол аутентификации OAuth

Некоторое время назад я использовал это для подключения к твиттеру и отправки твитов, просто обратите внимание, что он использовал некоторые классы 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); } } 

В вашем втором скрипте похоже, что вы не устанавливаете потребительский ключ и секрет потребителя при создании экземпляра TwitterOAuth.

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