2013-09-26 108 views
0

我正在使用Rhomobile(Android版)在Twitter上發佈狀態更新。爲此,按照Oauth實現的步驟,我可以使用Twitter登錄,但在登錄後,當嘗試發佈狀態更新時,每次我都收到HTTP響應爲{"errors":[{"message":"Could not authenticate you","code":32}]}Rhomobile:無法在twitter上發佈更新

以下是使請求發佈狀態更新的相關代碼。

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_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 熔點%3D1380117614%26oauth_token%3D244586214-M6A2jMlR7vZiqwAMrfuSj7I7XFzFTRd46nV6aTLK%26oauth_version%3D1.0%26status%3DTest「`

Base64的串 - -----

gjdXuU3qoGNt90Q2dRhNM3IXaBI%3D

傳遞所有這些值作爲heade [R授權給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帳戶中獲得但是同樣的迴應。

請幫我解決這個問題。我無法追查我失蹤的或者我出錯的地方。

感謝

回答

0

兩件事情:

  • 「狀態」參數是普通帖子的數據參數,不應該在授權頭,看到https://dev.twitter.com/docs/api/1.1/post/statuses/update

  • 有一個奇怪的問題與API 1.1,編碼特殊字符(如%「20」)。下面是爲我做的:url對簽名輸入的「status」內容進行編碼,不要將其編碼在post數據本身中。

編輯:

你忘了提供對應於user_token祕密:

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

當您通過https://api.twitter.com/oauth/access_token獲得來自Twitter的訪問令牌,微博用的auth_token和回覆auth_token_secret(以及id和screen_name)。你正確地提供了auth_token的參數(從而簽名),但你應該提供auth_token_secret你現在放在哪裏「」。

編輯2:

上方的編輯讓我懷疑:你獲得使用https://api.twitter.com/oauth/access_token的訪問令牌?因爲爲此,您應該使用oauth_token_secret,該參數是從twitter到調用https://api.twitter.com/oauth/request_token的回調url的參數。此回調網址被稱爲通過https://api.twitter.com/oauth/authorize確認用戶的回覆。對於https://api.twitter.com/oauth/request_token,您可以使用「」作爲祕密,因爲在該階段中沒有auth_token(因此沒有相應的祕密)。

+0

感謝您的回覆。其實,我已經嘗試了你提到的第一件事,但得到了同樣的答覆。 – user1113060

+0

我已經嘗試過選項2,因爲您只表示簽名輸入的編碼狀態,並且在傳遞後身體時移除編碼。還是一樣的錯誤信息'無法驗證你'。還有什麼你想讓我試一試或者我可能會錯過的任何東西? – user1113060

+0

看到我更新的答案。祝你好運。 – Jos