0

Rhomobile (for 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&status=Test`

に渡し@url_paramget_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 mp%3D1380117614%26oauth_token%3D244586214-M6A2jMlR7vZiqwAMrfuSj7I7XFzFTRd46nV6aTLK%26oauth_version%3D1.0%26status%3DTest"`

Base64 文字列 -------

gjdXuU3qogNt90Q2dRhNM3IXaBI%3D

これらすべての値をヘッダー Authorization としてhttps://api.twitter.com/1.1/statuses/update.jsonに渡します

そして得た

としての HTTP 応答{"errors":[{"message":"Could not authenticate you","code":32}]}

また、:body の post パラメータとして渡そうとしましたが、うまくいきませんでした。

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

Twitterサーバーのタイミングでシステムのタイミングを確認しましたが、問題ありません。

また、Twitter アカウントから取得できる静的な oauth_token でも試してみましたが、同じ応答がありました。

これを修正するのを手伝ってください。何が欠けているのか、どこが間違っているのかを追跡することができません。

ありがとう

4

1 に答える 1