MiniFB is a small, lightweight Ruby library for interacting with the Facebook API.
Join our Discussion Group at: http://groups.google.com/group/mini_fb
There is a demo Rails app that uses mini_fb graph api at: http://github.com/appoxy/mini_fb_demo
gem install mini_fb For an overview of what this is all about, see http://developers.facebook.com/docs/api.
Facebook now uses Oauth 2 for authentication, but don't worry, this part is easy.
# Get your oauth url @oauth_url = MiniFB.oauth_url(FB_APP_ID, # your Facebook App ID (NOT API_KEY) "http://www.yoursite.com/sessions/create", # redirect url :scope=>MiniFB.scopes.join(",")) # This asks for all permissions # Have your users click on a link to @oauth_url ..... # Then in your /sessions/create access_token_hash = MiniFB.oauth_access_token(FB_APP_ID, "http://www.yoursite.com/sessions/create", FB_SECRET, params[:code]) @access_token = access_token_hash["access_token"] # TODO: This is where you'd want to store the token in your database # but for now, we'll just keep it in the cookie so we don't need a database cookies[:access_token] = @access_token That's it. You now need to hold onto this access_token. We've put it in a cookie for now, but you probably want to store it in your database or something.
@response_hash = MiniFB.get(@access_token, @id, @options ={}) It's very simple:
@id ={some ID of something in facebook} || "me" @options: type ={some facebook type like feed, friends, or photos} version ={version of the graph api}. Example: "2.5" fields ={array of fields to explicit fetch} params ={optional params} # @response_hash is a hash, but also allows object like syntax for instance, the following is true: @response_hash["user"] == @response_hash.user See http://developers.facebook.com/docs/api for the available types.
Also pretty simple:
@id ={some ID of something in facebook} @type ={some type of post like comments, likes, feed} # required here @response_hash = MiniFB.post(@access_token, @id, :type=>@type) my_query = "select uid,a,b,c from users where ...." @res = MiniFB.fql(@access_token, my_query) To enabled logging:
MiniFB.enable_logging This API will probably go away at some point, so you should use the Graph API above in most cases.
The most general case is to use MiniFB.call method:
user_hash = MiniFB.call(FB_API_KEY, FB_SECRET, "Users.getInfo", "session_key"=>@session_key, "uids"=>@uid, "fields"=>User.all_fields) Which simply returns the parsed json response from Facebook.
You can use the Graph api Oauth 2.0 token with original api methods. BEWARE: This has only been tested against stream.publish at present.
MiniFB.rest(@access_token, "rest.api.method", options) eg:
response = MiniFB.rest(@access_token, "stream.publish", :params =>{:uid => @user_id, :target_id => @target_user_id, :message => "Hello other user!" }) all responses will be json. In the instance of 'bad json' methods, the response will formatted{'response': '#{bad_response_string}'}
Get a MiniFB::Session:
@fb = MiniFB::Session.new(FB_API_KEY, FB_SECRET, @fb_session, @fb_uid) Then it makes it a bit easier to use call for a particular user/session.
response = @fb.call("stream.get") With the session, you can then get the user information for the session/uid.
user = @fb.user Then get info from the user:
first_name = user["first_name"] Or profile photos:
photos = user.profile_photos Or if you want other photos, try:
photos = @fb.photos("pids"=>[12343243,920382343,9208348]) Get a MiniFB::OAuthSession with a Spanish locale:
@fb = MiniFB::OAuthSession.new(access_token, 'es_ES') Using the session object to make requests:
@fb.get('117199051648010') @fb.post('me', :type => :feed, :params =>{:message => "This is me from MiniFB" }) @fb.fql('SELECT id FROM object_url WHERE url="http://www.imdb.com/title/tt1250777/"') @fb.rest('notes.create', :params =>{:title => "ToDo", :content => "Try MiniFB" }) Getting graph objects through the session:
@fb.me @fb.me.name @fb.me.connections @fb.me.feed @ssp = @fb.graph_object('117199051648010') @ssp.mission @ssp.photos This is actually very easy, first follow these instructions: http://wiki.developers.facebook.com/index.php/Connect/Setting_Up_Your_Site
Then add the following script to the page where you put the login button so it looks like this:
<script> function facebook_onlogin(){document.location.href = "<%= url_for :action=>"fb_connect" %>"} </script> <fb:login-button onlogin="facebook_onlogin();"></fb:login-button> Define an fb_connect method in your login/sessions controller like so:
def fb_connect @fb_info = MiniFB.parse_cookie_information(FB_APP_ID, cookies) # some users may have to use their API rather than the app. ID. puts "uid=#{@fb_info['uid']}" puts "session=#{@fb_info['session_key']}" if MiniFB.verify_cookie_signature(FB_APP_ID, FB_SECRET, cookies) # And here you would create the user if it doesn't already exist, then redirect them to wherever you want. else # The cookies may have been modified as the signature does not match end end This is as simple as calling:
@fb.call("photos.upload", "filename"=>"<full path to file>") The file_name parameter will be used as the file data.
