如何在顶部为Facebook好友排序用户列表?

时间:2012-08-01 18:09:33

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

我希望能够从我的应用程序返回一个用户列表,首先列出当前用户的Facebook好友。我看到有办法查询Graph API以返回使用应用程序的用户的朋友,但我希望能够显示在我的网站上执行特定操作的用户列表,并对首先列出的FB朋友进行排序,所以每当我显示用户列表时,我都可以进行这种排序。

我见过的最好的例子是在meetup.com上。他们在显示参加聚会的人员名单时这样做。这是一个例子:

An example of how Meetup sorts a user list with FB friends first

我不知道它会对任何人产生任何影响,但它是一个Rails应用程序,我使用OmniAuth通过Facebook进行身份验证。

2 个答案:

答案 0 :(得分:2)

您无法对好友状态进行排序,因为没有好友状态列。您不能执行任何复杂的SQL操作来加入 friends 表或将其与另一个表联合,因为FQL不支持这些操作。您可以做的最好的事情是通过单独的查询来确定朋友是谁......

SELECT uid FROM friend WHERE uid IN (...ALL USER IDs...)

从该查询返回的所有 uid 将是您的完整列表的子集,仅包括那些朋友。

其他信息

Meetup应用程序是......

  1. 首先查询它的本地数据库以生成参与者列表。 (让我们调用结果[participants])
  2. 然后,他们在facebook friend 数据库上执行查询,以确定哪些[participants]是朋友。 (让我们调用结果[participating_friends])

    SELECT uid FROM friend WHERE uid IN([participants])

  3. 他们还将[participating_friends] uid的列表存储在本地数据库中。一列是用户的ID( uid ),另一列是他们朋友的uid( friendid )。

  4. 最后,为了确定朋友的朋友,他们通过以下查询查询他们的本地朋友数据库(来自3):

    SELECT friendid FROM local_friends WHERE uid IN([participating_friends])

  5. 更新:回想起来,Meetup可能会投入更广泛的网络,如下所示:

    Meetup应用程序是......

    1. 首先查询它的本地数据库以生成参与者列表。 (让我们调用结果[participants])
    2. 然后,他们在facebook friend 数据库上执行查询,以确定哪些[participants]是朋友。 (让我们调用结果[participating_friends])

      SELECT uid FROM friend WHERE uid IN([participants])

    3. 确定应用用户的所有朋友,他们也是应用用户并将结果存储在本地数据库中,保存 uid 和关联的 friendid

      SELECT uid FROM user WHERE uid IN(SELECT uid2 FROM friend WHERE uid1 = me())AND is_app_user

    4. 最后,要确定朋友的朋友,请计算新的设置:

      [participants_not_friends] = [participants] - [participating_friends]。

      然后使用如下查询查询本地好友数据库(来自3):

      SELECT friendid FROM local_friends WHERE uid IN([participants_not_friends])

答案 1 :(得分:0)

是的,您可以获得每个用户的好友列表。我就是这样做的。

注册时,如果用户在Facebook注册,则将其ID存储在数据库中。

当经过身份验证的用户查看您的某条记录时,请通过API发出此FQL查询:

SELECT uid, name, pic_square, mutual_friend_count FROM user 
 WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())
   AND is_app_user 
 ORDER BY mutual_friend_count DESC

这会让您回复您的应用的其他用户,他们是您的应用用户和每位朋友之间的共同朋友数量所订购的当前用户的朋友(假设更亲密的朋友有更多的共同朋友)。

您可以通过将此查询的结果与数据库中存储的Facebook ID进行比较,将此列表与数据库中的任何其他指标进行比较。

展示朋友的朋友是一个棘手的主张。如果您尝试此查询:

SELECT uid2 FROM friend WHERE uid1 IN 
 (SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 1)

它会抛出权限错误。 Facebook不会让你结交朋友的朋友。

如果它对您的应用程序很重要,您可以通过在每次登录时缓存每个应用用户最近的好友列表来解决这个问题(如果您还要求扩展访问令牌,还可以按计划进行缓存),并查询此表看看是否有与所有用户的朋友共同的朋友。您需要仔细查看服务条款,看看这是多么合法。