【问题标题】:PHP/Twitter oAuth - Automated TweetsPHP/Twitter oAuth - 自动推文
【发布时间】:2011-10-04 21:31:45
【问题描述】:

我使用以下代码从 config.php 读取 consumer_keyconsumer_secret,将其传递给 twitter 并从中检索一些信息。

下面的脚本试图做的是“缓存”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&amp;oauth_token=0000000000000000 - 它可以工作,但是尝试重新使用生成的令牌等...我得到一个 401

这是我尝试重用来自 Twitter 的详细信息以及我的 consumer_key 和 consumer_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');

不知道出了什么问题,您可以缓存详细信息还是我需要尝试其他方法?

【问题讨论】:

  • 您是否在第二个脚本的配置中设置了 $consumer_key 和 $consumer_key_secret?

标签: php twitter twitter-oauth


【解决方案1】:

您不能将 OAuth 令牌存储在缓存中并使用它存储超过 1 个请求,因为 OAuth 可以帮助确保系统安全,您的“oauth_token”将包含一些唯一数据,此令牌将只能拨打电话后立即回电 twitter,“oauth_token”不再有效,OAuth 类应请求新的“oauth_token”,从而确保每次通话都是安全的。

这就是为什么您第二次收到“401 未授权”错误,因为令牌不再有效。

twitter 仍在使用 OAuth v1(尽管 facebook 和 google 已经在某些部分实现了 v2,但它仍处于草稿过程中) 下图描述了 OAuth 身份验证的流程。 希望对您有所帮助。

不久前,我用它连接到 twitter 并发送推文,请注意它确实使用了一些 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);
    }

}

【讨论】:

  • 但是当我在 dev.twitter.com/apps 上设置它并生成访问令牌和访问令牌秘密时,我是否认为我可以使用该应用程序授权我的帐户。我也试过了,我得到了一个应该可以工作的 401。
  • 我添加了一些我上次用来创建推特应用程序的示例代码,希望对您有所帮助
【解决方案2】:

在您的第二个脚本中,您似乎没有在创建 TwitterOAuth 实例时设置使用者密钥和使用者秘密。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多