Rhomobile:无法在Twitter上发布更新

时间:2013-09-26 05:24:17

标签: android twitter twitter-oauth rhomobile

我正在使用Rhomobile(适用于Android)在Twitter上发布状态更新。为此,按照Oauth实现的步骤,我可以使用Twitter登录,但在登录后,每次尝试发布状态更新时,我都会将HTTP响应发送为{"errors":[{"message":"Could not authenticate you","code":32}]}

以下是发布状态更新请求的相关代码。

def post_to_twitter(comment)

    $rnd = rand(36**32).to_s(36)    
    $post_status_url = "https://api.twitter.com/1.1/statuses/update.json"   
    $oauth_token1 = @account_set.tt_oauth_token
    $oauth_token_secret1 = @account_set.tt_oauth_token_secret

    @oauth_nonce = $rnd
    @oauth_timestamp = Time.now.to_i.to_s
    @http_port = System.get_property('rhodes_port')

    @url_param =  "oauth_consumer_key="+ $oauth_consumer_key + "&" +
                  "oauth_nonce=" + @oauth_nonce + "&" +
                  "oauth_signature_method=" + $oauth_signature_method + "&" +
                  "oauth_timestamp=" + @oauth_timestamp + "&" +
                  "oauth_token=" + $oauth_token1  + "&" +
                  "oauth_version="+ $oauth_version + "&" +
                  "status=" + Rho::RhoSupport.url_encode("Test") 

    $oauth_sign = get_auth_signature($post_status_url, @url_param, "")

    @auth_header = "OAuth oauth_consumer_key="+ $oauth_consumer_key + ", " +
                  "oauth_nonce=" + @oauth_nonce + ", " +
                  "oauth_signature=" + $oauth_sign + ", " +
                  "oauth_signature_method=" + $oauth_signature_method + ", " +
                  "oauth_timestamp=" + @oauth_timestamp + ", " +
                  "oauth_token=" + $oauth_token1  + ", " +
                  "oauth_version="+ $oauth_version + ", " +
                  "status=" + Rho::RhoSupport.url_encode("Test")

    postTTres = Rho::AsyncHttp.post(
      :url => $post_status_url,
      :headers =>{"Content-Type" => "application/x-www-form-urlencoded", "Authorization" => @auth_header }
    )
    p postTTres 
end

签名生成功能如下:

def get_auth_signature (url, url_param, secret)
    signature = "POST&" + Rho::RhoSupport.url_encode(url).to_s +
    "&" + Rho::RhoSupport.url_encode(url_param).to_s

    key = $oauth_consumer_secret + "&" + secret
    hmac = HMAC::SHA1.new(key)
    hmac.update(signature)
    $signature = Base64.encode64("#{hmac.digest}")      
    $signature = Rho::RhoSupport.url_encode("#{$signature.gsub(/\n/,'')}")
    return $signature
end

跟踪时的参数值如下:

生成签名之前

@url_param ---------

  

oauth_consumer_key = 2ChmEzWBe5Y9hMYODqA1IQ&安培; oauth_non   CE = iyb9502vspjnhj9orb87sriych16678b&安培; oauth_signature_method = HMAC-SHA1&安培; oauth_timestamp = 1380117614&安培;组oauth_token = 244586214-M6A2jMlR7vZiqwAMrfuSj7I7XFzFTRd4   6nV6aTLK&安培; oauth_version = 1.0&安培;状态= Test`

@url_param传递给get_auth_signature()以生成签名。 生成的签名URL和签名是

签名字符串----------

  

POST&安培; HTTPS%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate。   JSON&安培; oauth_consumer_key%3D2ChmEzWBe5Y9hMYODqA1IQ%26oauth_nonce%3Diyb9502vspjnhj9orb87sriych16678b%26oauth_signature_method%3DHMAC-SHA1%26oauth_timesta   熔点%3D1380117614%26oauth_token%3D244586214-M6A2jMlR7vZiqwAMrfuSj7I7XFzFTRd46nV6aTLK%26oauth_version%3D1.0%26status%3DTest“`

Base64字符串-------

  

gjdXuU3qoGNt90Q2dRhNM3IXaBI%3D

将所有这些值作为标题授权传递给https://api.twitter.com/1.1/statuses/update.json

得到了

Http响应为{"errors":[{"message":"Could not authenticate you","code":32}]}

还尝试将其作为帖子参数传递给:body但没有运气。

postTTres = Rho::AsyncHttp.post(
   :url => $post_status_url,
   :headers =>{"Content-Type" => "application/x-www-form-urlencoded"}, 
   :body => @url_param + "&oauth_signature=" + $oauth_sign
)

使用Twitter服务器时间检查系统时间,没关系。

还尝试使用静态oauth_token我们可以从Twitter帐户获取,但后来响应相同。

请帮我解决这个问题。我无法追查我所缺少的或我出错的地方。

由于

1 个答案:

答案 0 :(得分:0)

两件事:

  • “status”参数是普通的post数据参数,不应该在授权标题中,请参阅https://dev.twitter.com/docs/api/1.1/post/statuses/update

  • API 1.1存在一个奇怪的问题,编码特殊字符(例如%20表示“”)。以下是为我做的:url对签名输入的“status”内容进行编码,不对帖子数据本身进行编码。

编辑:

您忘记提供与user_token对应的秘密:

$oauth_sign = get_auth_signature($post_status_url, @url_param, "")

当您通过https://api.twitter.com/oauth/access_token从Twitter获得访问令牌时,Twitter会使用auth_token和auth_token_secret(以及id和screen_name)进行回复。你在params中正确提供了auth_token(从而提供了签名),但你应该提供你当前放置“”的auth_token_secret。

编辑2:

以上编辑让我想知道:您是否使用https://api.twitter.com/oauth/access_token获得了访问令牌?因为你应该使用oauth_token_secret作为从twitter到提供给https://api.twitter.com/oauth/request_token的回调网址的调用中的参数。此回调网址称为对通过https://api.twitter.com/oauth/authorize确认用户的响应。对于https://api.twitter.com/oauth/request_token,您可以使用“”作为秘密,因为在该阶段还没有auth_token(因此没有相应的秘密)。