2013-09-26 4 views
0

Rhomobile (Android 용)을 사용하여 Twitter에 상태 업데이트를 게시하고 있습니다. 이를 위해 Oauth 구현 단계에 따라 트위터에 로그인 할 수 있지만 로그인 후 HTTP 응답이 {"errors":[{"message":"Could not authenticate you","code":32}]} 일 때마다 상태 업데이트를 게시하려고합니다.Rhomobile : twitter에서 업데이트를 게시 할 수 없습니다.

다음은 상태 업데이트 게시 요청의 관련 코드입니다. 다음 추적

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 서명을 생성하기 전에 ---------

다음

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 

서명 생성 함수는

oauth_consumer_key 2ChmEzWBe5Y9hMYODqA1IQ = & oauth_non CE = & iyb9502vspjnhj9orb87sriych16678b oauth_signature_method = HMAC-SHA1 oauth_timestamp = 1,380,117,614 & &의 oauth_token = 244,586,214-M6A2jMlR7vZiqwAMrfuSj7I7XFzFTRd4 6nV6aTLK oauth_version = 1.0 & & 상태 = Test`

서명을 생성하는 데에 get_auth_signature() @url_param 전달

. 생성 된 서명 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

는 heade로 모든 값을 전달 r에 https://api.twitter.com/1.1/statuses/update.json

에 대한 허가 및 {"errors":[{"message":"Could not authenticate you","code":32}]}

HTTP 응답을 얻었다.

또한 게시 매개 변수로 전달하려고 시도했습니다. 본문은 있지만 운이 없습니다.

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

트위터 서버 타이밍과 시스템 타이밍을 확인했습니다.

트위터 계정에서 얻을 수있는 정적 oauth_token으로 시도했지만 역시 동일한 응답입니다.

제발 도와주세요.내가 누락 된 부분이나 잘못된 부분을 추적 할 수 없습니다.

감사

답변

0

두 가지 :

  • "상태"매개 변수가 이상한있다 https://dev.twitter.com/docs/api/1.1/post/statuses/update

  • 참조 인증 헤더에 안 정상적인 POST 데이터 매개 변수입니다 특수 문자 인코딩 (예 : "%"20)과 같은 API 1.1 문제 다음은 나를 위해 해냈습니다 : url은 서명의 입력을위한 "상태"의 내용을 인코딩하고 그것을 포스트 데이터 자체에 인코딩하지 않습니다.

편집 :

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

당신이 https://api.twitter.com/oauth/access_token를 통해 트위터에서 액세스 토큰을 얻을 때, 트위터는 AUTH_TOKEN와 함께 응답 : 당신은 user_token에 해당하는 비밀을 공급하는 것을 잊었다

auth_token_secret (그리고 id와 screen_name). params에 auth_token을 올바르게 제공 했으므로 (따라서 서명에), 현재 ""를 넣는 곳에 auth_token_secret을 제공해야합니다.

편집 2 : 편집 위

날 궁금합니다 : 당신이 https://api.twitter.com/oauth/access_token를 사용하여 액세스 토큰을 얻을 않았다? 왜냐하면 트위터에서 https://api.twitter.com/oauth/request_token에 제공된 콜백 URL에 대한 호출에서 매개 변수 인 oauth_token_secret을 사용해야하기 때문입니다. 이 콜백 URL은 https://api.twitter.com/oauth/authorize을 통해 사용자 확인에 대한 응답으로 호출됩니다. https://api.twitter.com/oauth/request_token의 경우 ""를 비밀로 사용할 수 있습니다. 왜냐하면 그 단계에 아직 auth_token이 없기 때문에 (따라서 이에 상응하는 비밀은 없습니다).

+0

답장을 보내 주셔서 감사합니다. 사실, 나는 이미 언급 한 첫 번째 것을 시도했지만 동일한 대답을 얻었다. – user1113060

+0

나는 게시물 2 자체를 전달할 때 서명의 입력 상태를 인코딩하고 인코딩을 제거한다고 말한만큼 옵션 2를 시도했다. 여전히 '당신을 인증 할 수 없습니다.'라는 오류 메시지가 나타납니다. 너에게 내가 시도해 보길 원하는 것, 또는 내가 놓칠지도 모른 무엇인가? – user1113060

+0

업데이트 된 답변보기 행운을 빕니다. – Jos