Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

simple sinatra facebook extension in 300 lines of ruby

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 examples
Octocat-spinner-32 lib
Octocat-spinner-32 README
Octocat-spinner-32 sinbook.gemspec
README
sinbook: simple sinatra facebook extension in 300 lines of ruby
  (c) 2009 Aman Gupta (tmm1)

=== Usage

  require 'sinbook'
  require 'sinatra'

  facebook do
    api_key  '4579...cbb0'
    secret   '5106...2342'
    app_id   81747826609
    url      'http://apps.facebook.com/myappname'
    callback 'http://myappserver.com'
  end

  get '/' do
    fb.require_login!
    "Hi <fb:name uid=#{fb[:user]} useyou=false />!"
  end


=== Features

  sinbook provides a simple `facebook` helper (also aliased to `fb`).

    >> fb.valid?
    => true                              # valid (authenticated) request from facebook's servers

    >> pp fb.params
    {
      :logged_out_facebook => false,     # request came from a user logged into facebook
      :added => true,                    # user is logged into our app
      :user => 1234,                     # user's facebook uid
      :friends => [1,2,3],               # list of user's friends
      ...
    }

    >> fb[:user]                         # [] is aliased to params[]
    => 1234

    >> fb.callback
    => 'http://apps.facebook.com/myappname'

    >> fb.callback('/homepage')
    => 'http://apps.facebook.com/myappname/homepage'

    >> fb.url('/images/static.gif')
    => 'http://myappserver.com/images/static.gif'

    >> fb.appurl
    => 'http://apps.facebook.com/add.php?api_key=4579...cbb0'

    >> fb.addurl
    => 'http://www.facebook.com/apps/application.php?id=81747826609'

    >> fb.redirect('/welcome')           # redirect using an fb:redirect tag

    >> fb.require_login!                 # redirect to addurl page unless logged in


  The helper can also be used to make API calls

    >> fb.users.getInfo :uid => 1234, :fields => [:name]
    => [{'uid' => 1234, 'name' => 'Frank Sinatra'}]

    >> fb.groups.get :uid => 1234
    => [{'name' => 'Sinatra Users'}]

    >> fb.profile.setFBML :profile => 'hello world'
    => true

    >> fb.profile.getFBML
    => 'hello world'


=== Other Options

  facebook do
    symbolize_keys true
  end

  >> fb.groups.get :uid => 1234
  => [{:name => 'Sinatra Users'}]


=== Standalone Usage

  require 'sinbook'
  fb = Sinbook.new(
    :api_key  => '4579...cbb0',
    :secret   => '5106...2342',
    :app_id   => 81747826609
  )

  >> fb.friends.get :uid => 1234, :session_key => 'user-session-key'
  => [4321,4567,9876]


=== Local Development

  To develop locally, use ssh to setup a reverse tunnel to your external server.
  For example, set your callback url to http://myserver.com:4567/, and run:

    ssh -gNR 4567:localhost:4567 me@myserver.com

  Then, simply launch sinatra on your local machine. Facebook will make requests to
  http://myserver.com:4567/ which will be forwarded to port 4567 on your local machine.

  For facebook connect, I generally add a CNAME on my domain for fb.myserver.com, and setup
  nginx on my server with the following:

    server {
      server_name fb.myserver.com;
      location / {
        proxy_pass http://localhost:4567;
      }
    }

  Make sure your connect url is set to 'http://myserver.com' and the base domain is set to 'myserver.com',
  so that the fb.myserver.com subdomain works.

=== TODO

  * Add a batch mode for api calls:

      groups, pics = fb.batch do |b|
        b.groups.get :uid => 123
        b.users.getInfo :uids => 123, :fields => [:pic_square]
      end
Something went wrong with that request. Please try again.