2011-04-27 148 views
8

我试图让已经将他们的Facebook帐户连接到我的Rails应用的用户找到已经在应用中注册的Facebook朋友,最好以格式索引(类似于Formspring的显示)。使用Facebook Graph API查找用户的朋友

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

有什么想法?有可能是一种更好的方式,所以要知道是否需要其他信息。非常感谢您的帮助!

EDIT(在用户控制指标的行动截图)

enter image description here

注意在@oauth,应用程序ID和应用程序的秘密在示例图像

回答

16

裁切掉。如果你能得到一个数组对于用户的朋友,您可以在一个SQL语句中使用IN(根据属性等,这里有一些手动和/或伪代码)找到它们:

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) 

[更新]

看起来像考拉返回基于字符串的哈希值的数组,所以你将无法使用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的约定,你Services表的id场将成为记录的主键,而不是服务用户的Facebook ID,因此您可能需要在另一个字段上进行查询。

+0

我已经尝试实现你的答案(见上面的截图),但是当我打电话的用户/索引视图@uids(其中即时通讯做,看它是否得到正确的信息),显示的数字是不来自图表API调用的用户的Facebook ID。我收到一个与“21565518202156551420”无关的数字。有什么我做错了吗?我感谢你的智慧! – ahuang7 2011-04-28 03:30:30

+0

我已经更新了我的答案后,考拉与考拉;看看你有没有更多的运气! – 2011-04-28 14:58:25

+0

哇,真棒,你是编码神。再次感谢! – ahuang7 2011-04-28 19:01:39

2

[更新]

Facebook的图形API不再允许访问的版本> = 2.0的完整用户的好友列表。
API's documentation

应用友:本/me/friends端点不再包括一个人的好友名单 。相反,它现在返回那个也在使用你的应用的朋友的名单。

相关问题