当前位置: 首页 > 知识库问答 >
问题:

Facebook图形API v2。0-/me/friends返回空,或仅返回同时使用我的应用程序的朋友

拓拔麒
2023-03-14

我正在尝试使用Graph API v2获取我的朋友姓名和ID。0,但数据返回空:

{
  "data": [
  ]
}

当我使用v1时。0,以下请求一切正常:

FBRequest* friendsRequest = [FBRequest requestForMyFriends];
[friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection,
                                              NSDictionary* result,
                                              NSError *error) {
    NSArray* friends = [result objectForKey:@"data"];
    NSLog(@"Found: %i friends", friends.count);
    for (NSDictionary<FBGraphUser>* friend in friends) {
        NSLog(@"I have a friend named %@ with id %@", friend.name, friend.id);
    }
}];

但是现在我找不到朋友了!

共有3个答案

孙清野
2023-03-14

Facebook现在已经修改了他们的政策。如果您的应用程序没有Canvas实现,并且您的应用程序不是游戏,则无论如何都无法获得整个好友列表。当然也有taggable_friends,但那只是用来标记的。

您将能够提取仅授权该应用程序的好友列表。

使用图形API 1.0的应用程序将工作到2015年4月30日,之后将被弃用。

请参阅以下内容以获得更多详细信息:

>

  • 用户好友

    Facebook应用开发常见问题

  • 唐永春
    2023-03-14

    虽然西蒙·克罗斯的回答是被接受和正确的,但我想我会用一个需要做什么的例子(Android)来加强它。我会尽我所能保持笼统,只关注问题。就我个人而言,我最终将东西存储在数据库中,以便加载顺利,但这需要一个CursorAdapter和ContentProvider,这在这里有点超出范围。

    我自己来到这里,然后想,现在怎么办?!

    问题

    就像user3594351一样,我注意到好友数据是空白的。我通过使用FriendPickerFragment发现了这一点。三个月前有效的方法现在不再有效了。就连Facebook的例子也不例外。所以我的问题是“我如何手工创建FriendPickerFragment?”?

    什么不起作用

    西蒙·克罗斯的选项#1不够强大,无法邀请朋友使用该应用程序。西蒙·克罗斯还推荐了请求对话框,但一次只允许五个请求。请求对话框还显示了在任何给定的Facebook登录会话期间相同的朋友。没有用。

    什么有效(摘要)

    选项2需要一些艰苦的工作。你必须确保遵守Facebook的新规则:1。)你是第二局。)您有一个画布应用程序(网络状态)3。)你的应用已在Facebook注册。这一切都是在Facebook开发者网站的“设置”下完成的。

    为了在我的应用程序中手动模拟好友选取器,我执行了以下操作:

    1. 创建一个显示两个片段的选项卡活动。每个片段显示一个列表。一个片段用于可用的朋友(/me/friends),另一个片段用于不可侵犯的朋友(/me/invitable\u friends)。使用相同的片段代码呈现两个选项卡

    细节

    异步任务

    private class DownloadFacebookFriendsTask extends AsyncTask<FacebookFriend.Type, Boolean, Boolean> {
    
        private final String TAG = DownloadFacebookFriendsTask.class.getSimpleName();
        GraphObject graphObject;
        ArrayList<FacebookFriend> myList = new ArrayList<FacebookFriend>();
    
        @Override
        protected Boolean doInBackground(FacebookFriend.Type... pickType) {
            //
            // Determine Type
            //
            String facebookRequest;
            if (pickType[0] == FacebookFriend.Type.AVAILABLE) {
                facebookRequest = "/me/friends";
            } else {
                facebookRequest = "/me/invitable_friends";
            }
    
            //
            // Launch Facebook request and WAIT.
            //
            new Request(
                Session.getActiveSession(),
                facebookRequest,
                null,
                HttpMethod.GET,
                new Request.Callback() {
                    public void onCompleted(Response response) {
                        FacebookRequestError error = response.getError();
                        if (error != null && response != null) {
                            Log.e(TAG, error.toString());
                        } else {
                            graphObject = response.getGraphObject();
                        }
                    }
                }
            ).executeAndWait();
    
            //
            // Process Facebook response
            //
            //
            if (graphObject == null) {
                return false;
            }
    
            int numberOfRecords = 0;
            JSONArray dataArray = (JSONArray) graphObject.getProperty("data");
            if (dataArray.length() > 0) {
    
                // Ensure the user has at least one friend ...
                for (int i = 0; i < dataArray.length(); i++) {
    
                    JSONObject jsonObject = dataArray.optJSONObject(i);
                    FacebookFriend facebookFriend = new FacebookFriend(jsonObject, pickType[0]);
    
                    if (facebookFriend.isValid()) {
                        numberOfRecords++;
    
                        myList.add(facebookFriend);
                    }
                }
            }
    
            // Make sure there are records to process
            if (numberOfRecords > 0){
                return true;
            } else {
                return false;
            }
        }
    
        @Override
        protected void onProgressUpdate(Boolean... booleans) {
            // No need to update this, wait until the whole thread finishes.
        }
    
        @Override
        protected void onPostExecute(Boolean result) {
            if (result) {
                /*
                User the array "myList" to create the adapter which will control showing items in the list.
                 */
    
            } else {
                Log.i(TAG, "Facebook Thread unable to Get/Parse friend data. Type = " + pickType);
            }
        }
    }
    

    我创建的FacebookFriend类

    public class FacebookFriend {
    
        String facebookId;
        String name;
        String pictureUrl;
        boolean invitable;
        boolean available;
        boolean isValid;
        public enum Type {AVAILABLE, INVITABLE};
    
        public FacebookFriend(JSONObject jsonObject, Type type) {
            //
            //Parse the Facebook Data from the JSON object.
            //
            try {
                if (type == Type.INVITABLE) {
                    //parse /me/invitable_friend
                    this.facebookId =  jsonObject.getString("id");
                    this.name = jsonObject.getString("name");
    
                    // Handle the picture data.
                    JSONObject pictureJsonObject = jsonObject.getJSONObject("picture").getJSONObject("data");
                    boolean isSilhouette = pictureJsonObject.getBoolean("is_silhouette");
                    if (!isSilhouette) {
                        this.pictureUrl = pictureJsonObject.getString("url");
    
                    } else {
                        this.pictureUrl = "";
                    }
    
                    this.invitable = true;
                } else {
                    // Parse /me/friends
                    this.facebookId =  jsonObject.getString("id");
                    this.name = jsonObject.getString("name");
                    this.available = true;
                    this.pictureUrl = "";
                }
    
                isValid = true;
            } catch (JSONException e) {
                Log.w("#", "Warnings - unable to process Facebook JSON: " + e.getLocalizedMessage());
            }
        }
    }
    
    潘琨
    2023-03-14

    在v2中。Graph API的0,调用/me/friends返回同样使用该应用程序的人的朋友。

    此外,在v2中。0,您必须向每个用户请求用户\u好友权限<默认情况下,每次登录时不再包括code>user\u friends。每个用户必须授予user\u friends权限才能出现在对/me/friends的响应中。有关更多详细信息,请参阅Facebook升级指南,或查看下面的摘要。

    如果您想访问非应用程序好友列表,有两个选项:

    >

    如果您的应用程序是一个游戏,并且您的游戏支持Facebook画布,那么您可以使用/me/invitable\u friendsendpoint来呈现自定义邀请对话框,然后将此API返回的令牌传递到标准请求对话框。

    在其他情况下,应用程序不再能够检索用户朋友的完整列表(仅限于使用user\u friends权限专门授权您的应用程序的朋友)。这已经被Facebook确认为“设计”。

    对于希望允许人们邀请朋友使用应用程序的应用程序,您仍然可以使用网络上的发送对话框或iOS和Android系统上的新消息对话框。

    更新:Facebook在此处发布了关于这些变化的常见问题解答:https://developers.facebook.com/docs/apps/faq它解释了开发者可以选择的所有邀请朋友的选项等。

     类似资料:
    • 我尝试使用graph api v2.0获取我的组,但数据返回为空: 在此之前,我使用v1.0,这是可行的。我使用:

    • 问题内容: 我正在尝试使用我的Facebook帐户登录到我的网站,但是Facebook仅给出名称和ID,不足以登录用户。在我获得完整的信息之前,例如名字,姓氏,电子邮件等。 现在由facebook提供的数据: 我正在使用Oauth v2.0通过Facebook将用户登录到我的网站。 问题答案: 看起来您正在使用Graph API的v2.4。看到 https://developers.faceboo

    • 我试图利用WordPress的admin-ajax特性来为一个插件构建一个动态管理面板选项集。从本质上讲,一旦从下拉菜单(Select/option menu)中选择了一个选项,PHP函数就会对下拉菜单进行排序,并显示更多下拉菜单,这些下拉菜单位于下拉菜单的上方。我从一个简单的返回开始,我希望在后面使用这个返回,但是我似乎无法将文本打印出来而不遇到问题。 我设置的AJAX显示了200状态,但响应从

    • 我通常使用getBoundingClientRect()。宽度当开发一个Swiper组件使用反应挂钩,但在一些例子getBoundingClientRect()。宽度返回0。 我在useEffect函数中使用了setTimeout,效果很好; 下面是简单的swiper代码演示: 简单swiper演示代码

    • 我正在使用新的谷歌播放服务驱动器API来实现备份和恢复数据与我的Android应用程序中的应用程序文件夹。我遵循了谷歌驱动器开发人员指南中的入侵。当我只使用一台设备并且不卸载并重新安装应用程序时,我可以成功备份和还原数据。但是当我使用两个设备或关闭并重新安装应用程序时出现问题。 场景1:我在一台设备上安装了我的应用程序,并成功将数据备份到“应用程序文件夹”,我可以在Google驱动器“管理应用程序

    • 问题内容: 当前遇到此确切问题: 运行代码时,文件C中出现错误: 在其中扔了一个调试器,发现A是一个空对象。什么是 真正 奇怪的是,我只获得了在文件C错误,而不是文件B.超级混淆这里。 问题答案: 这不是webpack问题,而是CommonJS模块的属性。 首次需要CommonJS模块时,其属性将初始化为幕后的空对象。 然后,模块可以决定扩展此属性或覆盖它。 因此,当require 和requir