2010-08-09 7 views
7

Ist es möglich, OAuth mit HTTParty zu verwenden? Ich versuche, this API-Aufruf zu tun, aber im Widerspruch zu der Dokumentation, es braucht Authentifizierung.OAuth und HTTParty

Bevor Sie sagen "Verwenden Sie einen Twitter-spezifischen Edelstein", hören Sie mich aus - ich habe es versucht. Ich habe versucht, Twitter, Grackle und unzählige andere, aber keiner dieser spezifischen API-Aufruf. Also, ich habe mich an HTTParty gewandt.

Also, wie könnte ich OAuth mit HTTParty verwenden?

+0

Sie könnte das twitter-Juwel abzweigen und die von Ihnen benötigte Methode hinzufügen (siehe: http://github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb). Wie dem auch sei, das Twitter-Juwel ist ein guter Ort, um zu sehen, wie dies geschieht (da es sowohl HTTParty als auch OAuth verwendet). – Brian

+1

Eigentlich sieht es so aus, als hätte das Twitter-Juwel die gesuchte Funktionalität, siehe Zeilen 33-35 in http://github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb – Brian

+0

Danke. Habe das vorher nicht bemerkt. < –

Antwort

3

Ich habe die Vanille OAuth Edelstein verwendet, um ein paar einfache Twitter API-Aufrufe zu implementieren. Ich brauchte kein schweres Juwel, um alles zu machen, und ich benutzte bereits OAuth, also schien mir ein "Roll-your-own" -Ansatz vernünftig. Ich weiß, dass ich HTTParty nicht erwähnt habe, also bitte mich nicht dafür. Dies kann für andere Nutzer von Vorteil sein, wenn Sie das OAuth-Juwel bereits verwenden.

Falls es hilfreich ist, ist hier der relevante Code (sorry über einige Konstanten und andere Variablen/Methoden am Anfang Mischen - es war die einfachste und genaueste Weg, dies von meinem echten Code zu extrahieren):

#Set up the constants, etc required for Twitter OAuth 
OAUTH_SITE = "https://api.twitter.com" 
TOKEN_REQUEST_METHOD = :post 
AUTHORIZATION_SCHEME = :header 

    def app_request_token_path 
    "/oauth/request_token" 
    end  
    def app_authorize_path 
    "/oauth/authorize" 
    end  
    def app_access_token_path   
    "/oauth/access_token"   
    end 
    def consumer_key 
    "your twitter API key" 
    end 
    def consumer_secret 
    "your twitter API secret" 
    end 

    # Define the OAuth consumer 
    def consumer meth=:post 
    @consumer ||= OAuth::Consumer.new(consumer_key,consumer_secret, { 
     :site => "#{OAUTH_SITE}", 
     :request_token_path=>app_request_token_path, 
     :authorize_path=>app_authorize_path, 
     :access_token_path=>app_access_token_path, 
     :http_method=>:post, 
     :scheme=> :header, 
     :body_hash => '' 
    }) 
    end    

    # Essential parts of a generic OAuth request method 
    def make_request url, method=:get, headers={}, content=''     
    if method==:get 
     res = @access_token.get(url, headers) 
    elsif method==:post 
     res = @access_token.post(url, content, headers) 
    end 

    if res.code.to_s=='200' 
     jres = ActiveSupport::JSON.decode(res.body) 
     if jres.nil? 
     @last_status_text = @prev_error = "Unexpected error making an OAuth API call - response body is #{res.body}" 
     end  
     return jres 
    else 
     @last_status_text = @prev_error = res if res.code.to_s!='200' 
     return nil  
    end 
    end 

# Demonstrate the daily trends API call 
# Note the use of memcache to ensure we don't break the rate-limiter 
    def daily_trends 

    url = "http://api.twitter.com/1/trends/daily.json"  
    @last_status_code = -1 
    @last_status_success = false 
    res = Rails.cache.fetch(url, :expires_in=> 5.minutes) do 
     res = make_request(url, :get)   
     unless res 
     @last_status_code = @prev_error.code.to_i 
     end 
     res 
    end     
    if res 
     @last_status_code = 200 
     @last_status_success = true 
     @last_status_text = "" 
    end 
    return res 
    end 

Ich hoffe, dass dies, vor allem im Zusammenhang mit der breiteren Verwendung des OAuth-Edelstein, für andere nützlich sein könnte.

+0

Danke für den Beitrag Ismael Abreu. Fang an, wie schlecht ich das aus anderem Code extrahiert habe. – Phil

+0

Hey, ich weiß, es war ein Jahr, aber können Sie mich wissen lassen, wo Sie '@ access_token' angeben? Ich liebe dein Beispiel und ziele auf ein Problem, gegen das ich gerade jetzt ankämpfe. – BenMorganIO

+0

Ich wünschte, ich könnte dir dabei helfen. Mein Code hat sich so sehr von dem Original abgelöst, da ich geantwortet habe, dass es schwer ist zu erahnen, was vor sich geht. Aber es war der dritte Schritt beim Austausch zwischen Ihrer App und Twitter, wenn Sie das Anfrage-Token für das Zugriffstoken austauschen. Vielleicht helfen diese Schnipsel: 'request_token = params [: oauth_token]; oauth_options = {: oauth_verifier => Parameter [: oauth_verifier]}; OAuth :: RequestToken.new (consumer, request_token, consumer_secret); @access_token = request_token.get_access_token ({: http_method => TOKEN_REQUEST_METHOD}, params) ' – Phil

0

verwendete ich eine Mischung aus OAuth2 Juwel der Authentifizierungs-Token zu erhalten und HTTParty, um die Abfrage

client = OAuth2::Client.new(apiKey, apiSecret, 
          :site => "https://SiteForAuthentication.com") 
oauthResponse = client.password.get_token(username, password) 
token = oauthResponse.token 

queryAnswer = HTTParty.get('https://api.website.com/query/location', 
          :query => {"token" => token}) 

Nicht perfekt durch einen langen Weg zu machen, aber es scheint, den Trick getan haben bisher