Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Playing with the Yahoo Fantasy Sports API in IRB

I want to play around with the Yahoo Fantasy Sports API. I have no idea where to start. What do I need to do in order to start playing with the API in IRB and start calling and retrieving different players or stats? This is my first attempt at tackling an API that does not have a readily available Ruby gem.

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

I've followed the steps detailed in the dev guide and set up my developer Consumer key and Secret key. Not sure what to do with this information though.

I'm using Rails 3.2.2 and Ruby 1.9.2

like image 400
user1276232 Avatar asked Mar 20 '12 22:03

user1276232


2 Answers

I've been spending many hours the past couple weeks trying to get a site to tie in with the Yahoo fantasysports API and only recently got over the hurdle of being able to get authenticated through OAuth, make valid requests, and refresh access tokens indefinitely. Here are the steps you need to take to be able to mess around in IRB:

Gem stuff

  • Include oauth-plugin in your Gemfile. This will also install the OAuth/OAuth2 ruby gems as dependencies. This will handle the request/access tokens needed, but won't be fully compatible right out of the box.

  • The oauth-plugin requires an authentication system to be in place for your app. I would highly recommend devise both for its ease of use and the fact that the oauth-plugin pretty much works along with it with very little setup. I found it easier to connect the two if I first generate 'User' through devise before I generated a consumer with the oauth-plugin. There are tons of guides for devise if you run into issues.

Migration stuff

  • A quirk of the Yahoo version of OAuth is that you need to store a 'session_handle' for a user in order to refresh the access token when it expires after 60 minutes. I just edited the existing OauthConsumerToken migration to include t.string :session_handle. I'm not sure what the issue was with MYSQL when I did this, but I had to also specify a limit of 190 for the consumer_tokens index that oauth created. So my full add index is add_index :consumer_tokens, :token, :unique => true, :length => 190. I would recommend also adding a :guid string column to the users table, since that is what Yahoo uses as a unique identifier.

  • To accommodate the two extra columns we are tracking that oauth doesn't know about (session handle and guid), you need to override some of the oauth-plugin default behaviour. I've already forked the project and made the necessary changes if you want to just use my version (https://github.com/JamesSwift/oauth-plugin). The three dependencies for my version are a session_handle column in the ConsumerTokens table, a yahoo_guid column in the Users table, and set the variable CB_URL in your development.rb to be the url that you registered your app under with Yahoo. Also remember that if you use my version of the plugin you need to specify the path/github url depending on how you want to include it.

Configuration stuff

  • You need to set the :key and :secret in config/intializers/oauth_consumers.rb. I call my consumer a YahooToken, so mine looks like this:

    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'
    
  • You also need to specify the global yahoo settings in the custom token class you created. Again, mine is a YahooToken, so in app/models/yahoo_token.rb my first few lines are:

    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"
      }      
    
  • Tell your user model it has a token:

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

Actually doing stuff, stuff

  • Now you can load up your server, create a user, and go to http://localhost:3000/oauth_consumers/yahoo to get your token. Yahoo refuses to redirect you back to localhost, so you will end up getting redirected to CB_URL/parameters-that-yahoo-returns. Copy the parameter string and go to http://localhost:3000/oauth_consumers/yahoo/callback/paste-the-string-here. This should successfully complete the initial retrieval of the access token. Don't worry, you only need to do this once per local user while developing locally. It automatically redirects in production environments.

  • Now that you have a token you can use it in IRB for the next hour as much as you want. Here is an example of using the token from the console:

    t = User.first.yahoo
    resp = t.client.get("http://fantasysports.yahooapis.com/fantasy/v2/users;use_login=1")
    puts resp.body
    
  • You can also put &format=json at the end to get it in json instead of xml

  • After 60 minutes you need to get a new access token. I have a refresh function in my 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
    
  • Whenever my token expires I just t = t.refresh!. I would also recommend an age method on your tokens which will facilitate creating a rake task that will refresh tokens every hour for you automatically.

  • All the available fantasysports related resources are listed here:(http://developer.yahoo.com/fantasysports/guide/)

like image 133
JamesSwift Avatar answered Sep 21 '22 04:09

JamesSwift


To get started, I would suggest you familiarize yourself with OAuth, which the Yahoo Fantasy Sports API uses for authentication. You will also need to know how to make HTTP requests in Ruby. Most of the rest of work will be in reading the API documentation and experimenting.

If you're looking for Ruby libraries for using OAuth or making HTTP requests, or anything else you run into, you may find The Ruby Toolbox helpful.

like image 43
Justin Workman Avatar answered Sep 22 '22 04:09

Justin Workman