mini_fb 0.2.5 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +65 -9
- data/lib/mini_fb.rb +93 -0
- metadata +4 -4
data/README.markdown
CHANGED
@@ -3,13 +3,76 @@ MiniFB - the simple miniature facebook library
|
|
3
3
|
|
4
4
|
MiniFB is a small, lightweight Ruby library for interacting with the [Facebook API](http://wiki.developers.facebook.com/index.php/API).
|
5
5
|
|
6
|
+
Support
|
7
|
+
--------
|
8
|
+
|
9
|
+
Join our Discussion Group at: http://groups.google.com/group/mini_fb
|
10
|
+
|
6
11
|
Installation
|
7
12
|
-------------
|
8
13
|
|
9
|
-
We're using gemcutter so be sure to have gemcutter as a source, then:
|
10
|
-
|
11
14
|
gem install mini_fb
|
12
15
|
|
16
|
+
|
17
|
+
Facebook Graph API
|
18
|
+
==================
|
19
|
+
|
20
|
+
For an overview of what this is all about, see http://developers.facebook.com/docs/api.
|
21
|
+
|
22
|
+
Authentication
|
23
|
+
--------------
|
24
|
+
|
25
|
+
Facebook now uses Oauth 2 for authentication, but don't worry, this part is easy.
|
26
|
+
|
27
|
+
# Get your oauth url
|
28
|
+
@oauth_url = MiniFB.oauth_url(FB_APP_ID, # your Facebook App ID (NOT API_KEY)
|
29
|
+
"http://www.yoursite.com/sessions/create", # redirect url
|
30
|
+
:scope=>MiniFB.scopes.join(",")) # This asks for all permissions
|
31
|
+
# Have your users click on a link to @oauth_url
|
32
|
+
.....
|
33
|
+
# Then in your /sessions/create
|
34
|
+
access_token_hash = MiniFB.oauth_access_token(FB_APP_ID, "http://www.yoursite.com/sessions/create", FB_SECRET, params[:code])
|
35
|
+
@access_token = access_token_hash["access_token"]
|
36
|
+
# TODO: This is where you'd want to store the token in your database
|
37
|
+
# but for now, we'll just keep it in the cookie so we don't need a database
|
38
|
+
cookies[:access_token] = @access_token
|
39
|
+
|
40
|
+
That's it. You now need to hold onto this access_token. We've put it in a cookie for now, but you probably
|
41
|
+
want to store it in your database or something.
|
42
|
+
|
43
|
+
Getting Data from Facebook
|
44
|
+
--------------------------
|
45
|
+
|
46
|
+
It's very simple:
|
47
|
+
|
48
|
+
@id = {some ID of something in facebook} || "me"
|
49
|
+
@type = {some facebook type like feed, friends, or photos} # (optional) nil will just return the object data directly
|
50
|
+
@response_hash = MiniFB.get(@access_token, @id, :type=>@type)
|
51
|
+
|
52
|
+
Posting Data to Facebook
|
53
|
+
------------------------
|
54
|
+
|
55
|
+
Also pretty simple:
|
56
|
+
|
57
|
+
@id = {some ID of something in facebook}
|
58
|
+
@type = {some type of post like comments, likes, feed} # required here
|
59
|
+
@response_hash = MiniFB.post(@access_token, @id, :type=>@type)
|
60
|
+
|
61
|
+
|
62
|
+
Logging
|
63
|
+
-------
|
64
|
+
|
65
|
+
To enabled logging:
|
66
|
+
|
67
|
+
MiniFB.enable_logging
|
68
|
+
|
69
|
+
|
70
|
+
Original Facebook API
|
71
|
+
=====================
|
72
|
+
|
73
|
+
This API will probably go away at some point, so you should use the Graph API above in most cases.
|
74
|
+
|
75
|
+
|
13
76
|
General Usage
|
14
77
|
-------------
|
15
78
|
|
@@ -85,10 +148,3 @@ This is as simple as calling:
|
|
85
148
|
@fb.call("photos.upload", "filename"=>"<full path to file>")
|
86
149
|
|
87
150
|
The file_name parameter will be used as the file data.
|
88
|
-
|
89
|
-
|
90
|
-
Support
|
91
|
-
--------
|
92
|
-
|
93
|
-
Join our Discussion Group at: http://groups.google.com/group/mini_fb
|
94
|
-
|
data/lib/mini_fb.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'digest/md5'
|
2
2
|
require 'erb'
|
3
3
|
require 'json' unless defined? JSON
|
4
|
+
require 'rest_client'
|
5
|
+
require 'hashie'
|
4
6
|
|
5
7
|
module MiniFB
|
6
8
|
|
@@ -298,6 +300,97 @@ module MiniFB
|
|
298
300
|
login_url
|
299
301
|
end
|
300
302
|
|
303
|
+
def self.graph_base
|
304
|
+
"https://graph.facebook.com/"
|
305
|
+
end
|
306
|
+
|
307
|
+
# options:
|
308
|
+
# - scope: comma separated list of extends permissions. see http://developers.facebook.com/docs/authentication/permissions
|
309
|
+
def self.oauth_url(app_id, redirect_uri, options={})
|
310
|
+
oauth_url = "#{graph_base}oauth/authorize"
|
311
|
+
oauth_url << "?client_id=#{app_id}"
|
312
|
+
oauth_url << "&redirect_uri=#{URI.escape(redirect_uri)}"
|
313
|
+
oauth_url << "&scope=#{options[:scope]}" if options[:scope]
|
314
|
+
end
|
315
|
+
|
316
|
+
# returns a hash with one value being 'access_token', the other being 'expires'
|
317
|
+
def self.oauth_access_token(app_id, redirect_uri, secret, code)
|
318
|
+
oauth_url = "#{graph_base}oauth/access_token"
|
319
|
+
oauth_url << "?client_id=#{app_id}"
|
320
|
+
oauth_url << "&redirect_uri=#{URI.escape(redirect_uri)}"
|
321
|
+
oauth_url << "&client_secret=#{secret}"
|
322
|
+
oauth_url << "&code=#{URI.escape(code)}"
|
323
|
+
resp = RestClient.get oauth_url
|
324
|
+
puts 'resp=' + resp.body.to_s if @@logging
|
325
|
+
params = {}
|
326
|
+
params_array = resp.split("&")
|
327
|
+
params_array.each do |p|
|
328
|
+
ps = p.split("=")
|
329
|
+
params[ps[0]] = ps[1]
|
330
|
+
end
|
331
|
+
return params
|
332
|
+
end
|
333
|
+
|
334
|
+
# options:
|
335
|
+
# - type: eg: feed, home, etc
|
336
|
+
# - metadata: to include metadata in response. true/false
|
337
|
+
def self.get(access_token, id, options={})
|
338
|
+
url = "#{graph_base}#{id}"
|
339
|
+
url << "/#{options[:type]}" if options[:type]
|
340
|
+
url << "?access_token=#{URI.escape(access_token)}"
|
341
|
+
url << "&metadata=1" if options[:metadata]
|
342
|
+
puts 'url=' + url if @@logging
|
343
|
+
begin
|
344
|
+
resp = RestClient.get url
|
345
|
+
rescue RestClient::Exception => ex
|
346
|
+
puts ex.http_code.to_s
|
347
|
+
puts 'ex.http_body=' + ex.http_body if @@logging
|
348
|
+
res_hash = JSON.parse(ex.http_body) # probably should ensure it has a good response
|
349
|
+
raise MiniFB::FaceBookError.new(ex.http_code, "#{res_hash["error"]["type"]}: #{res_hash["error"]["message"]}")
|
350
|
+
end
|
351
|
+
puts 'resp=' + resp.body.to_s if @@logging
|
352
|
+
res_hash = JSON.parse(resp.body)
|
353
|
+
res_hash = Hashie::Mash.new(res_hash)
|
354
|
+
return res_hash
|
355
|
+
end
|
356
|
+
|
357
|
+
# options:
|
358
|
+
# - type: eg: feed, home, etc
|
359
|
+
# - metadata: to include metadata in response. true/false
|
360
|
+
def self.post(access_token, id, options={})
|
361
|
+
url = "#{graph_base}#{id}"
|
362
|
+
url << "/#{options[:type]}" if options[:type]
|
363
|
+
params = {}
|
364
|
+
params["access_token"] = "#{(access_token)}"
|
365
|
+
params["metadata"] = "1" if options[:metadata]
|
366
|
+
puts 'url=' + url if @@logging
|
367
|
+
begin
|
368
|
+
resp = RestClient.post url, params
|
369
|
+
rescue RestClient::Exception => ex
|
370
|
+
puts ex.http_code.to_s
|
371
|
+
puts 'ex.http_body=' + ex.http_body if @@logging
|
372
|
+
res_hash = JSON.parse(ex.http_body) # probably should ensure it has a good json response
|
373
|
+
raise MiniFB::FaceBookError.new(ex.http_code, "#{res_hash["error"]["type"]}: #{res_hash["error"]["message"]}")
|
374
|
+
end
|
375
|
+
puts 'resp=' + resp.body.to_s if @@logging
|
376
|
+
res_hash = JSON.parse(resp.body)
|
377
|
+
res_hash = Hashie::Mash.new(res_hash)
|
378
|
+
return res_hash
|
379
|
+
end
|
380
|
+
|
381
|
+
# Returns all available scopes.
|
382
|
+
def self.scopes
|
383
|
+
all_scopes = []
|
384
|
+
scope_names = ["about_me", "activities", "birthday", "education_history", "events", "groups",
|
385
|
+
"interests", "likes",
|
386
|
+
"location", "notes", "online_presence", "photo_video_tags", "photos", "relationships",
|
387
|
+
"religion_politics", "status", "videos", "website", "work_history"]
|
388
|
+
scope_names.each { |x| all_scopes << "user_" + x; all_scopes << "friends_" + x}
|
389
|
+
all_scopes << "read_friendlists"
|
390
|
+
all_scopes << "read_stream"
|
391
|
+
all_scopes
|
392
|
+
end
|
393
|
+
|
301
394
|
# This function expects arguments as a hash, so
|
302
395
|
# it is agnostic to different POST handling variants in ruby.
|
303
396
|
#
|
metadata
CHANGED
@@ -3,10 +3,10 @@ name: mini_fb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
|
+
- 1
|
6
7
|
- 0
|
7
|
-
-
|
8
|
-
|
9
|
-
version: 0.2.5
|
8
|
+
- 0
|
9
|
+
version: 1.0.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Travis Reeder
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-04-
|
18
|
+
date: 2010-04-29 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|