在IRB中使用Yahoo Fantasy Sports API

时间:2012-03-20 22:18:57

标签: ruby-on-rails ruby api ruby-on-rails-3.1

我想玩Yahoo Fantasy Sports API。我不知道从哪里开始。为了开始在IRB中使用API​​并开始调用和检索不同的玩家或统计数据,我需要做什么?这是我第一次尝试处理没有现成Ruby gem的API。

Yahoo Fantasy Sports API:http://developer.yahoo.com/fantasysports/guide/

我已按照开发指南中详述的步骤操作,并设置了我的开发人员使用者密钥和密钥。不知道如何处理这些信息。

我正在使用Rails 3.2.2和Ruby 1.9.2

3 个答案:

答案 0 :(得分:11)

过去几周我花了很多时间试图让一个网站与雅虎幻想体验API相结合,并且最近才克服了能够通过OAuth进行身份验证,发出有效请求和刷新访问权限的障碍无限期的令牌。以下是您在IRB中需要采取的步骤:

宝石的东西

  • 在您的Gemfile中包含oauth-plugin。这也将安装OAuth / OAuth2 ruby​​ gems作为依赖项。这将处理所需的请求/访问令牌,但不会完全兼容。

  • oauth-plugin需要为您的应用设置一个身份验证系统。我强烈推荐devise这两个因为它的易用性以及oauth-plugin几乎与它一起工作的事实,只需很少的设置。如果我在使用oauth-plugin生成使用者之前首先通过设计生成'User',我发现连接这两者更容易。如果遇到问题,有大量的设计指南。

迁移内容

  • 雅虎版OAuth的一个怪癖是,您需要为用户存储“session_handle”,以便在60分钟后过期时刷新访问令牌。我刚刚编辑了现有的OauthConsumerToken迁移,以包含t.string :session_handle。当我这样做时,我不确定MYSQL的问题是什么,但我还必须为oauth创建的consumer_tokens索引指定限制为190。所以我的完整添加索引是add_index :consumer_tokens, :token, :unique => true, :length => 190。我建议还在users表中添加一个:guid字符串列,因为这是Yahoo用作唯一标识符的。

  • 为了容纳我们正在跟踪oauth不知道的两个额外列(会话句柄和guid),您需要覆盖一些oauth-plugin默认行为。如果您想使用我的版本(https://github.com/JamesSwift/oauth-plugin),我已经分叉了项目并进行了必要的更改。我的版本的三个依赖项是ConsumerTokens表中的session_handle列,Users表中的yahoo_guid列,并将development.rb中的变量CB_URL设置为url你在雅虎注册你的应用程序。另请记住,如果您使用我的插件版本,则需要根据您希望的方式指定路径/​​ github网址。

配置内容

  • 您需要在:key中设置:secretconfig/intializers/oauth_consumers.rb。我称我的消费者为YahooToken,所以我看起来像这样:

    OAUTH_CREDENTIALS={
      :yahoo => {
        :key => "the key given to me by yahoo"
        :secret => "the secret given to me by yahoo"
      }
    }
    
    load 'oauth/models/consumers/service_loader.rb'
    
  • 您还需要在自己创建的自定义令牌类中指定全局yahoo设置。同样,我的是YahooToken,所以在app/models/yahoo_token.rb我的前几行是:

    class YahooToken < ConsumerToken
    
      YAHOO_SETTINGS={
        :site=>"http://fantasysports.yahooapis.com/fantasy/v2",
        :authorize_url =>"https://api.login.yahoo.com/oauth/v2/request_auth",
        :request_token_url => "https://api.login.yahoo.com/oauth/v2/get_request_token",
        :access_token_url => "https://api.login.yahoo.com/oauth/v2/get_token",
        :oauth_version=>"1.0"
      }      
    
  • 告诉您的用户模型它有一个令牌:

    has_one :yahoo, :class_name=>"YahooToken", :dependent=>:destroy
    

实际上做东西,东西

  • 现在您可以加载服​​务器,创建用户,然后转到http://localhost:3000/oauth_consumers/yahoo获取令牌。雅虎拒绝将您重定向回localhost,因此您最终会被重定向到CB_URL/parameters-that-yahoo-returns。复制参数字符串并转到http://localhost:3000/oauth_consumers/yahoo/callback/paste-the-string-here。这应该成功完成访问令牌的初始检索。不用担心,在本地开发时,每个本地用户只需执行一次此操作。它会在生产环境中自动重定向。

  • 现在您有了一个令牌,您可以在IRB中使用它,以便在下一个小时内尽可能多地使用它。以下是从控制台使用令牌的示例:

    t = User.first.yahoo
    resp = t.client.get("http://fantasysports.yahooapis.com/fantasy/v2/users;use_login=1")
    puts resp.body
    
  • 您也可以将&format=json放在最后,以json代替xml

  • 60分钟后,您需要获得一个新的访问令牌。我在YahooToken中有刷新功能:

    def refresh!
        old_one = self
        request_token = OAuth::RequestToken.new(YahooToken.consumer, self.token, self.secret)
    
        options={}
        options[:oauth_session_handle]=self.session_handle
    
        access_token = request_token.get_access_token options
        new_one = YahooToken.find_or_create_from_access_token self.user, access_token
    
        if new_one
          old_one.delete
          return new_one
        end
    
        return nil
      end
    
  • 每当我的令牌过期,我只是t = t.refresh!。我还会在你的令牌上推荐一种年龄方法,这将有助于创建一个rake任务,每天为你自动刷新令牌。

  • 此处列出了所有可用的fantasysports相关资源:(http://developer.yahoo.com/fantasysports/guide/

答案 1 :(得分:1)

要开始使用,我建议您熟悉一下OA Fantasy Sports API用于身份验证的OAuth。您还需要知道如何在Ruby中发出HTTP请求。其余的大部分工作都是阅读API文档和试验。

如果您正在寻找使用OAuth或发出HTTP请求的Ruby库,或者您遇到的任何其他问题,您可能会发现The Ruby Toolbox有帮助。

答案 2 :(得分:1)

我更喜欢pelle/oauth-pluginrefresh!中保存session_handle而不是叉子。

消费者包装

model/YahooToken.rb受到@JamesSwift的启发。

移植

我使用omniauth-yahoo进行授权,因此guid会在Authorization模型中保存,您需要在consumer_tokens中添加session_handle(:string)和更改token(:text)列。

享受。