使用Graph API的Facebook'Friends.getAppUsers'


87

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

我已经阅读了文档,如何使用Graph API做到这一点?这样的例子是什么?

Answers:


119

我搜索了一会儿,我也认为使用Graph API无法实现这一点。

但是,我发布了一个类似的问题,“为旧的GetAppUsers调用替换”,以查看使用我的应用程序的用户朋友?,对于我使用的特定API,给出了一个很好的一般答案。

https://graph.facebook.com/me/friends?fields=installed

或更一般地

https://graph.facebook.com/{user id}/friends?fields=installed

这将返回所有朋友,并为使用该应用程序的朋友提供附加字段“ installed = true”。

它在Graph API Explorer中工作


4
是的 我用以下答案回答了您的问题:facebook.stackoverflow.com/questions/7956639/…–
Igy

2
该查询针对哪个应用程序检查安装?
iOS Monster

3
假设您没有使用其他任何字段(例如电子邮件,生日等),出于完整性考虑/me/friends?fields=id,name,installed,它会保留字段顺序和?fields=未定义的返回标准信息(2012年12月5日为true)。
质粒87 2012年

5
在撰写本文时,此查询返回所有朋友(即使installed不正确)。我们需要手动检查installed每个用户是否存在该字段。
Pankaj Bhambhani 2013年

是的,这是正确的,我已经编辑了答案,以使您清楚地认识所有朋友,并且必须检查哪些朋友已安装标志。
亚历克斯

27

这可以通过FQL完成。

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

QED!


1
我最初使用此查询,由于存在延迟,我现在仅通过图api得到所有朋友,然后在应用程序端进行过滤。
理查德

您能否提供有关延迟的更多详细信息?查询花费的时间太长了吗?我一直在与约300个以上的朋友一起使用FB帐户进行测试,响应时间为几秒钟(2到4),这对IMO来说还算不错。
loungerdork

1
是的,大致就是我所看到的。graph API需要大约500ms的时间才能返回400个以上的朋友,因此我更喜欢将它们全部收集起来,然后再进行过滤。
理查德

3
您还可以使用me()代替?
philfreo 2011年

8

是的,Graph API的文档非常糟糕。我没有看到有关“应用程序”类型的任何文档,但是它们确实在docs中引用了应用程序的信息:

https://graph.facebook.com/2439131959

因此,也许您可​​以使用Group语法获取应用程序的成员?

https://graph.facebook.com/2439131959/members

您将需要一个经过身份验证的会话来对其进行测试。否则,似乎Facebook迫使我们使用FQL直接发送查询:

http://developers.facebook.com/docs/reference/fql/application

您可以通过获取https://api.facebook.com/method/fql.query?query=QUERY来执行FQL查询 。您可以使用format查询参数将响应格式指定为XML或JSON。

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


2
啊。似乎将光切换到图形api更像是我最初希望的头痛。
理查德2010年

4
使用FQL完成您所需的一切(发布除外)可能会更容易。Graph API在最坏的情况下不会为您提供所需的一切,在最好的情况下,将使查找方法变得非常烦人。
Daniel Schaffer

6

旧的REST API:

$facebook->api_client->friends_getAppUsers();

新的图形API:

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

4
此SDK方法调用在内部使用了旧的rest api。它不是图形API :-(
理查德(Richard)2010年

5

我对此问题进行了很多调查。据我所知,没有办法Friends.getAppUsers使用Graph API。Facebook提供的最新SDK均使用旧的REST API来吸引使用该应用程序的朋友。


6
这已经很老了,不再是正确的答案。在顶部检查Alex的答案。
巴赫2012年

这可能不是正确的答案,但它是OP的答案,支持自己显然比将正确的答案标记为正确的感觉更好,这是因为自我。
阿贾克斯

4

使用restFB,我做了以下工作(感谢Igy / Alex的指导)。注意,Facebook的返回朋友ID的与“已安装” =真,如果被安装在用户(如可以看到的阵列这里)。

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

import com.restfb.Facebook;
import com.restfb.types.User;

public class InstalledUser extends User {

    @Facebook
    private boolean installed;

    public InstalledUser() {        
    }

    public boolean getInsatlled() {
        return 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
        }
    }
}

1

解决方法是自己进行过滤。大概,您已经将注册应用程序的用户的所有uid都坐在了自己的数据库中。因此,首先获取所有用户朋友的uid,然后从数据库中选择具有匹配uid的用户。

新的Facebook Graph API程序似乎执行得很差,没有经过深思熟虑。似乎他们急于在它成熟之前为Facebook f8发布它,并且缺少许多以前可用的功能。


0

您仍然可以在新的Graph API中调用旧的REST API。那是完全有效的。

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

我不确定是否仅使用Graph API就能做到这一点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.