Facebook JS SDK 的 FB.api('/me') 方法不会返回我在 Graph API v2.4+ 中期望的字段

IT技术 javascript facebook
2021-01-18 23:54:38

我正在尝试使用 Facebook api 获取一些基本信息,但到目前为止我只获取了用户的姓名和 ID。{ name: "Juan Fuentes", id: "123456" }

我需要获取更多电子信息,例如电子邮件、名字、姓氏和生日

这是我的js代码

function facebookLogin() {
  FB.login(function(response) {
    var token = response.authResponse.accessToken;
    var uid = response.authResponse.userID;
    if (response.authResponse) {
      FB.api('/me', 'get', { access_token: token }, function(response) {
        console.log(response);
      });

      FB.api('/'+uid, 'get', { access_token: token }, function(response) {
        console.log(response);
      });
    }
  },
  { scope: 'public_profile' }
  );
}

这是激活它的按钮

<a id="fb-login" href="#" onclick="facebookLogin()"></a>
4个回答

从 Graph API v2.4 开始,您需要手动指定每个字段:

声明性字段
为了尝试提高移动网络的性能,v2.4 中的节点和边缘要求您明确请求 GET 请求所需的字段。比如GET /v2.4/me/feed默认不再包含赞和评论,但是GET /v2.4/me/feed?fields=comments,likes会返回数据。有关更多详细信息,请参阅有关如何请求特定字段的文档。

例如

FB.api('/me', 'get', { access_token: token, fields: 'id,name,gender' }, function(response) {
    console.log(response);
});
如何发送多级字段,如我想要的 feed api 从范围和从我想要的用户图片应该出现?
2021-03-14 23:54:38
您可以编辑答案以激活类似这样的问题的通知developer.facebook.com/settings/developer/contact
2021-03-18 23:54:38
我花了几天时间才弄明白。我使用 Graph API v2.1 继承了遗留代码,当 FB 在 2017 年 7 月 10 日停止支持它时,该代码突然崩溃。无法使用 API 升级工具寻找升级内容,因为他们从中删除了 v2.3 及以下版本。
2021-03-23 23:54:38
我如何使用新的显式版本从这样的 URL 获取相册对象:graph.facebook.com {album_id}/photos?access_token={app_id}|{app_secret}
2021-03-30 23:54:38
好吧,facebook 没有更新开发者网站上的登录示例,浪费了我几天时间。:)
2021-04-05 23:54:38

也可以将此语法用于来自public_profile范围的数据(在 Graph API v2.9 中测试):

FB.api('/me?fields=birthday,link,gender,age_range', function(response) {
   console.log(response);
});

您可以在Graph API Explorer 中在线测试可能的值,只需单击“获取令牌”按钮:

https://developers.facebook.com/tools/explorer/?method=GET&path=me%3Ffields%3Dbirthday%2Clink%2Cgender%2Cage_range&version=v2.9

这是完整的脚本:

jQuery(document).ready(function () {
    openLoginPopup();
})
function openLoginPopup() {
    FB.getLoginStatus(function (response) {
        if (response.status == 'connected') {
            getCurrentUserInfo(response);
        } else {
            FB.login(function (response) {
                if (response.authResponse) {
                    getCurrentUserInfo(response);
                } else {
                    console.log('Auth cancelled.');
                }
            }, {scope: 'email'});
        }
    });

}

function getCurrentUserInfo() {
    FB.api('/me?fields=id,email,first_name,last_name,name', function (userInfo) {
        console.log(userInfo.name + ': ' + userInfo.email);
    });
}

window.fbAsyncInit = function () {
    FB.init({
//        appId: 'xxxxxxxxxxxxxxxxxxxxx', //livemode
        appId: 'xxxxxxxxxxxx', //testmode
        cookie: true, // Enable cookies to allow the server to access the session.
        xfbml: true, // Parse social plugins on this webpage.
        version: 'v4.0'           // Use this Graph API version for this call.
    });
};


(function (d, s, id) {                      // Load the SDK asynchronously
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id))
        return;
    js = d.createElement(s);
    js.id = id;
    js.src = "https://connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

谢谢。

请注意,电子邮件并不总是通过调用me带有emailas 字段api返回,即使范围email被请求并授予,如果例如用户使用电话号码注册:

https://developers.facebook.com/docs/facebook-login/permissions#reference-email