使用Facebook Graph API查找用户的朋友

时间:2011-04-27 05:09:52

标签: ruby-on-rails ruby facebook facebook-graph-api omniauth

我正在尝试允许将其Facebook帐户连接到我的rails应用程序的用户找到已经在应用程序中注册的Facebook好友,最好采用索引格式(类似于Formspring的显示)。

目前我正在使用Devise,OAuth + Fbook Javascript SDK和Koala。我有每个用户的Facebook UID连接他们在数据库中保存的Facebook,但我不知道如何过滤Facebook API调用的结果@friends = @ graph.get_connections(“我”,“朋友”)为了显示与API调用数据具有匹配UID的用户。

有什么想法?可能还有更好的方法,所以如果需要任何其他信息,请知道。非常感谢你的帮助!

EDIT(用户控制器中索引操作的屏幕截图)

enter image description here

在@oauth注意,app id和app secret在示例图片中被裁剪

2 个答案:

答案 0 :(得分:16)

如果您可以为用户的朋友获取一组UID,您可以使用IN在一个SQL语句中找到它们(这里有一些handwaving和/或伪代码,具体取决于属性等):

uids = @friends.collect(&:uid)
# uids is an array of Facebook UID's, say [1234, 5678, 9012]
registered_friends = User.where('fb_uid IN (?)', uids)
# "SELECT users.* FROM users WHERE (fb_uid IN (1234, 5678, 9012))"

如果您的Facebook数据属于其他型号,您可以选择关闭该型号并执行includes以引入用户。

registered_friends = Authorizations.where(:type => 'Facebook') \
  .where('fb_uid IN (?)', uids).includes(:user).collect(&:user)

<强> [更新]

看起来Koala会返回一个基于字符串的Hashes数组,因此您将无法使用collect(&:id)来获取ID。以下是我在控制台上获取ID数组的信息(显然屏蔽了敏感数据):

pry(main)> oauth = Koala::Facebook::OAuth.new 'xxxxxxx', 'yyyyyyyyy'
=> #<Koala::Facebook::OAuth:0x00000100d03be8>
pry(main)> token = 'zzzzzzzzzz'
=> "zzzzzzzzzz"
pry(main)> graph = Koala::Facebook::GraphAPI.new token
=> #<Koala::Facebook::GraphAPI:0x00000100ce3ac8>
pry(main)> friends = graph.get_connections "me", "friends"
=> [{"name"=>"A Friend", "id"=>"An ID"}, {"name"=>"Another Friend", "id"=>"Another ID"}]
uids = friends.collect { |f| f["id"] }
=> ["An ID", "Another ID"]

此外,如果您遵循Rails约定,id表的Services字段将成为记录的主键,而不是服务用户的Facebook ID,因此您可能需要查询其他字段。

答案 1 :(得分:2)

<强> [更新]

Facebook的Graph API不再允许访问版本&gt; = 2.0的完整用户的好友列表。
来自API's documentation

  

App好友/me/friends端点不再包含完整列表   一个人的朋友。相反,它现在返回该列表   也正在使用你的应用程序的人的朋友。