OAuth и HTTPParty

Можно ли использовать OAuth с HTTParty? Я пытаюсь выполнить этот вызов API, но это противоречит документации, она требует аутентификации.

Прежде чем вы скажете: «Используйте специальный Gem для Twitter», выслушайте меня — я пробовал. Я пробовал twitter, grackle и множество других, но ни один из них не поддерживает этот конкретный вызов API. Итак, я обратился к HTTParty.

Итак, как я могу использовать OAuth с HTTParty?


person Ethan Turkeltaub    schedule 09.08.2010    source источник
comment
Вы можете разветвить гем twitter и добавить нужный метод (см.: github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb). В любом случае, гем Twitter может быть хорошим местом, чтобы увидеть, как это делается (поскольку он использует как HTTParty, так и OAuth).   -  person Brian    schedule 09.08.2010
comment
На самом деле, похоже, что у драгоценного камня Twitter есть функциональность, которую вы ищете, см. строки 33-35 в github.com/jnunemaker/twitter/blob/master/lib/twitter/base.rb   -  person Brian    schedule 09.08.2010
comment
Спасибо. Не замечал этого раньше ›.‹   -  person Ethan Turkeltaub    schedule 11.08.2010
comment
Меня все еще очень интересует этот ответ.   -  person user94154    schedule 12.06.2011
comment
Я искал один сам. Из примера запроса на странице Twitter Dev (dev.twitter.com /docs/api/1/get/oauth/authenticate) Я чувствую, что должен быть способ. Вот запрос: https://api.twitter.com/oauth/authenticate?oauth_token=Z6eEdO8MOmk394WozF5oKyuAv855l4Mlqo7hhlSLik   -  person tvalent2    schedule 23.05.2012


Ответы (3)


Я использовал ванильный гем OAuth для реализации нескольких простых вызовов Twitter API. Мне не нужен был тяжеловесный драгоценный камень, чтобы делать все, и я уже использовал OAuth, поэтому подход «сделай сам» казался разумным. Я знаю, что не упомянул HTTParty, поэтому, пожалуйста, не ругайте меня за это. Это может быть полезно другим для понимания сути простого Twitter OAuth, если вы уже используете гем OAuth.

Если это полезно, вот соответствующий код (извините за смешивание некоторых констант и других переменных/методов в начале - это был самый простой и точный способ извлечь это из моего реального кода):

#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  

Я надеюсь, что это, в основном в контексте более широкого использования драгоценного камня OAuth, может быть полезно для других.

person Phil    schedule 27.07.2012
comment
Спасибо за редактирование Исмаэль Абреу. Поймал, как плохо я извлек это из другого кода. - person Phil; 18.07.2013
comment
Эй, я знаю, что прошел год, но не могли бы вы дать мне знать, где вы указываете @access_token? Мне нравится ваш пример, и я нацелен на проблему, над которой сейчас бьюсь. - person BenMorganIO; 21.05.2014
comment
Хотел бы я помочь тебе с этим. Мой код так сильно отличался от оригинала с тех пор, как я ответил, что трудно понять, что происходит. Но это был третий шаг в обмене между вашим приложением и Twitter, когда вы обмениваете токен запроса на токен доступа. Возможно, эти фрагменты помогут: request_token = params[:oauth_token]; oauth_options = {:oauth_verifier => params[:oauth_verifier]}; OAuth::RequestToken.new(consumer, request_token, consumer_secret) ; @access_token = request_token.get_access_token({:http_method=>TOKEN_REQUEST_METHOD}, params) - person Phil; 28.05.2014

Я не думаю, что HTTParty поддерживает OAuth (хотя я не эксперт по HTTParty, на мой вкус он слишком высокоуровневый и медленный).

Я бы просто вызвал запрос Twitter напрямую, используя гем OAuth. В документации Twitter API даже есть пример использования: https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#ruby

person Lukas Stejskal    schedule 18.06.2012

Я использовал сочетание драгоценного камня OAuth2 для получения токена аутентификации и HTTParty для выполнения запроса.

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})

Не идеально далеко, но, похоже, до сих пор добился цели

person TimSmith-Aardwolf    schedule 05.10.2015