通过OAuthSimple.js发布到Twitter

时间:2013-02-08 07:57:57

标签: javascript oauth google-chrome-extension twitter twitter-oauth

我已经坚持了一段时间。我正在尝试使用OAuthSimple.js在我编写的Chrome扩展程序中与Twitter进行交互。

签名过程似乎适用于检索用户状态的请求,但我似乎无法构建一个请求,当我尝试转发,回复或将推文标记为收藏时,该请求将成功进行身份验证。

我正在关注指南here。我还尝试了多种构造请求的方法,并将请求内容与Twitter提供的OAuth工具的输出进行比较(似乎已经检查),但我仍然得到401错误和通用“我们无法验证你的回答。

以下是我试图形成请求的方式:

var sendTwitterRequest = function(url, params, method, callback) {

  var request = null;

        if ( localStorage.twitterAuthToken ) {
            OAuthSimple().reset();
            request = OAuthSimple(TwitterConsumerKey,TwitterConsumerSecret).sign({
                action:method,
                method:"HMAC-SHA1",
                dataType:"JSON",
                path:url,
                parameters:params,
                signatures:{
                    oauth_version:'1.0',
                    oauth_token:localStorage.twitterAuthToken,
                    oauth_secret:localStorage.twitterAuthVerifier
                }
            });

            console.log(request);

            $j.ajax({
                url:request.signed_url,
                type:method,
                data:request.parameters,
                success:callback
            });     

        }
    };

然后,调用这个方法:

  // this works, I get the data and can do stuff with it
  sendTwitterRequest('http://api.twitter.com/1/statuses/user_timeline.json?user_id=',null,'GET',someMethod());

  // this fails and throws a 401 error every time 
  sendTwitterRequest("https://api.twitter.com/1/statuses/retweet/"+tweetKey+".json",null,'POST',someOtherMethod());

我错过了什么吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

事实证明我创建的请求很好,我只需要最后一个来交换OAuth令牌的请求令牌。当用户被提示输入时,我认为这一步已被覆盖,但事实证明我错了。

由于我只能让OAuth.js处理令牌请求和时间线请求这一事实,我最终还是从OAuthSimple.js切换到了OAuth.js。

其中一些特定于我的应用程序正在执行的操作,因此您可能需要对其进行修改。

新的sendTwitterRequest方法:

var sendTwitterRequest = function(options){

        var accessor={
            consumerSecret:TwitterConsumerSecret
        };

        var message={
            action:options.url,
            method:options.method||"GET",
            parameters:[
                ["oauth_consumer_key",TwitterConsumerKey],
                ["oauth_signature_method","HMAC-SHA1"],
                ["oauth_version","1.0"]
            ]
        };  

        if(options.token){
            message.parameters.push(["oauth_token",options.token])
        }

        if(options.tokenSecret){
            accessor.tokenSecret=options.tokenSecret
        }

        for(var a in options.parameters) {
            message.parameters.push(options.parameters[a])
        }

        OAuth.setTimestampAndNonce(message);
        OAuth.SignatureMethod.sign(message,accessor);

        try {
            $j.ajax({
                url:message.action,
                async:options.async||true,
                type:message.method||'GET',
                data:OAuth.getParameterMap(message.parameters),
                dataType:options.format||'JSON',
                success:function(data) {
                    if (options.success) {options.success(data);}
                }
            });
        } catch ( e ) {
        }

    };

依赖它的方法:

// asks Twitter for an oauth request token. User authorizes and the request token is provided
requestTwitterToken = function() {  
    // this is semi-specific to what my extension is doing, your callback string may need
    // to be slightly different.
    var callbackString = window.top.location + "?t=" + Date.now();

    var params = [
        [ 'oauth_callback', callbackString ]
    ];

    sendTwitterRequest({
        url: "https://api.twitter.com/oauth/request_token",
        method: 'POST',
        parameters: params, 
        format: 'TEXT',
        success: function(data) {
            var returnedParams = getCallbackParams(data);
            if ( returnedParams.oauth_token ) {
                chrome.tabs.create({
                    url:"https://api.twitter.com/oauth/authorize?oauth_token=" + returnedParams.oauth_token
                });
            }
        },error:function( e ) {
            console.log( 'error' );
            console.log( e );
        }
    }); 
};

// exchanges the Twitter request token for an actual access token.
signIntoTwitter = function(token, secret, callback) {
    var auth_url = "https://api.twitter.com/oauth/access_token";

    var authCallback = function(data) {
        var tokens = getCallbackParams(data);

        localStorage.twitterAuthToken = tokens.oauth_token || null;
        localStorage.twitterAuthTokenSecret = tokens.oauth_token_secret || null;

        callback();
    };
    try {
        sendTwitterRequest({url:auth_url, method:'POST', async:true, format:'TEXT', token:token, tokenSecret:secret, success:authCallback});
    } catch ( e ) {
        console.log(e);
    }

};

有了这个,步骤如下:

  • 向Twitter询问令牌(requestTwitterToken())并提供回电
  • 在回调中
  • ,检查是否提供了令牌。如果是这样,那就是初始令牌
  • 将令牌传回Twitter并打开Twitter身份验证页面,允许用户授予访问权限
  • 在此次调用的回调中,查看是否提供了访问令牌
  • 交换请求令牌以获取访问令牌(signIntoTwitter()

之后,我只需使用sendTwitterRequest()方法点击Twitter的API即可获取时间轴并发布推文。