PHP/Twitter oAuth - 自动推文 [英] PHP/Twitter oAuth - Automated Tweets

查看:34
本文介绍了PHP/Twitter oAuth - 自动推文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Im using the following code to read to consumer_key and consumer_secret from config.php, pass it to twitter and retrieve some bits of information back from them.

下面的脚本试图做的是缓存" request_token 和 request_secret.所以理论上我应该能够重用这些细节(所有 4 个细节都可以在需要时自动推文).

What the script below attempts to do is 'cache' the request_token and request_secret. So in theory I should be able to reuse those details (all 4 of them to automatically tweet when required).

<?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

When i run /?verify&oauth_token=0000000000000000 - It works however trying to resuse the generated tokens etc... I get a 401

这是我尝试重用 Twitter 中的详细信息以及我的 consumer_key 和 consumer_secret 并获得 401 的最后一段代码:

Here is the last bit of code where I attempt to reuse the details from Twitter combined with my consumer_key and consumer_secret and get the 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');

不知道出了什么问题,你能缓存详细信息还是我需要尝试其他的东西?

Not sure whats going wrong, are you able to cache the details or do i need to try something else?

推荐答案

您不能将 OAuth 令牌存储在缓存中,也不能存储超过 1 个请求,因为 OAuth 可以帮助确保系统安全,您的oauth_token" 将包含一些独特的数据,这个令牌只能向 twitter 发出一次回调,一旦调用,oauth_token"就不再有效,OAuth 类应该请求一个新的oauth_token",从而确保每次调用都是安全的.

You can't store the OAuth tokens in cache and to more than 1 request with it, as OAuth is there to help make the system secure, your "oauth_token" will contain some unique data, this token will only be able to make one call back to twitter, as soon as the call was made, that "oauth_token" is no longer valid, and the OAuth class should request a new "oauth_token", thus making sure that every call that was made is secure.

这就是您第二次收到401 未授权"错误的原因,因为令牌不再有效.

That is why you are getting an "401 unauthorized" error on the second time as the token is no longer valid.

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

twitter is still using OAuth v1 (v2 is still in the draft process even though facebook and google already implemented it in some parts) The image below describes the flow of the OAuth authentication. Hope it helps.

不久前我用它连接到 Twitter 并发送推文,请注意它确实使用了一些 Zend 类,因为该项目在 zend 服务器上运行.

A while ago I used this to connect to twitter and send tweets, just note that it did make use of some Zend classes as the project was running on a zend server.

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

}

这篇关于PHP/Twitter oAuth - 自动推文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆