使用Graph API的Facebook“Friends.getAppUsers”

使用Graph API的Facebook“Friends.getAppUsers”,facebook,facebook-graph-api,facebook-friends,Facebook,Facebook Graph Api,Facebook Friends,我有一个应用程序,它使用旧的REST API调用Friends.getAppUsers来获取已授权我的应用程序的当前用户的好友列表 我已经阅读了文档,如何使用Graph API实现这一点?这方面的一个例子是什么?是的,Graph API的文档记录非常糟糕。我没有看到应用程序的任何文档,但它们在文档中引用了应用程序的信息: 那么,也许您可以使用组语法获取应用程序的成员 您需要一个经过身份验证的会话来测试它。否则,Facebook似乎在推动我们使用FQL直接发送查询: 您可以通过以下方式执行FQL查

我有一个应用程序,它使用旧的REST API调用Friends.getAppUsers来获取已授权我的应用程序的当前用户的好友列表

我已经阅读了文档,如何使用Graph API实现这一点?这方面的一个例子是什么?

是的,Graph API的文档记录非常糟糕。我没有看到应用程序的任何文档,但它们在文档中引用了应用程序的信息:

那么,也许您可以使用组语法获取应用程序的成员

您需要一个经过身份验证的会话来测试它。否则,Facebook似乎在推动我们使用FQL直接发送查询:

您可以通过以下方式执行FQL查询: 吸引 . 您可以将响应格式指定为 XML或JSON,格式为 查询参数


因此,您可以通过FQL查询来获取有关您的应用程序的信息。

我对这个问题做了很多调查。据我所知,没有办法使用Graph API实现Friends.getAppUsers。Facebook提供的最新SDK都使用旧的RESTAPI来使用该应用程序交朋友。

解决方法是自己进行过滤。假设您的数据库中有所有注册应用程序的用户的uid。因此,首先获取所有用户朋友的UID,然后从数据库中选择具有匹配UID的用户


新的Facebook Graph API程序似乎执行得非常糟糕,没有经过深思熟虑。似乎他们在它成熟之前就匆忙发布了它,而且很多以前可用的功能都缺失了。

这可以通过FQL实现

SELECT uid FROM user
WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = ?)
AND is_app_user = 1
QED

旧的REST API:

$facebook->api_client->friends_getAppUsers();
新图形API:

$facebook->api(array('method' => 'friends.getAppUsers'));

您仍然可以在新的Graph API中调用旧的REST API。这是完全正确的

另一种方法是使用FQL获取应用程序用户的好友


我不确定是否有办法只用Graph API来实现这一点。

我搜索了一会儿,我也认为使用Graph API是不可能的

然而,对于我正在使用的特定API,我发布了一个类似的问题,并且得到了一个很好的一般性答案

https://graph.facebook.com/me/friends?fields=installed
或者更一般地说

https://graph.facebook.com/{user id}/friends?fields=installed
这将返回所有好友,对于使用该应用程序的好友,附加字段installed=true

这里是它在工作:

使用,我做了以下工作感谢Igy/Alex的指导。请注意,如果可以看到用户已安装,Facebook将返回一个朋友ID数组,其installed=true

首先扩展User类,添加一个installed字段:

接下来,使用DefaultFacebookClient:

FacebookClient facebook = new DefaultFacebookClient(pFacebookAccessToken);
Connection<InstalledUser> installedFacebookUsers = facebook.fetchConnection("/" + pFacebookId + "/friends", InstalledUser.class, Parameter.with("fields", "installed"));        
for (List<InstalledUser> friends : installedFacebookUsers) {
    for (InstalledUser friend : friends) {
        if (friend.getInsatlled()) {
            // Add friend.getId() to a list of ID, or whatever
        }
    }
}

啊。看起来,轻松切换到graph api更像是我最初希望的一件头痛的事情。除了使用FQL发布之外,您可能更容易完成所需的一切。最坏的情况下,Graph API不会提供您所需的一切,最好的情况下,会让您很难找到如何做到这一点。此SDK方法调用在幕后使用旧的rest API。这不是graph api:-我最初使用此查询,由于延迟,现在我只是通过graph api获取所有好友,然后在我的应用程序端进行筛选。您能提供有关延迟的更多详细信息吗?是否该查询的响应时间过长?我一直在用一个FB账户测试,大约有300多个朋友,响应时间是2到4秒,在我看来还不错。是的,这大概就是我看到的。graph API以500毫秒的速度返回400多个朋友,因此我更喜欢将他们全部获取,然后在我这边进行过滤。你也可以使用我而不是?是;我用以下答案回答了您的问题:此查询检查安装的是哪个应用程序?假设您没有使用任何其他字段,如电子邮件、生日等,为了完整性,请使用/me/friends?fields=id、name、installed、,这将保留字段顺序和返回的标准信息,而不会在2012/12/05将?fields=定义为true。在撰写本文时,此查询将返回所有好友,即使已安装的好友不为true。我们需要手动检查每个用户是否存在installed(已安装)字段。是的,这是正确的,我已编辑了答案,以明确您获得了所有朋友,并且您必须检查哪些朋友具有installed(已安装)标志。这是非常旧的,不再是正确的答案。检查顶部Alex的答案。这可能不是正确的答案,但这是OP的答案,显然,自我评价比将正确答案标记为正确要好,因为自我。
FacebookClient facebook = new DefaultFacebookClient(pFacebookAccessToken);
Connection<InstalledUser> installedFacebookUsers = facebook.fetchConnection("/" + pFacebookId + "/friends", InstalledUser.class, Parameter.with("fields", "installed"));        
for (List<InstalledUser> friends : installedFacebookUsers) {
    for (InstalledUser friend : friends) {
        if (friend.getInsatlled()) {
            // Add friend.getId() to a list of ID, or whatever
        }
    }
}