12

我正在尝试获取经过身份验证的 Facebook 用户的个人资料图片,以便在 Meteor 应用程序中使用。我试过以下

Meteor.publish("facebook_avatar_url", function() {
    return Meteor.users.find({_id: this.userId}, {fields: {
        'services.facebook.id': 1,
        'services.facebook.name': 1,
        'services.facebook.gender': 1,
        'services.facebook.picture': 1,
        'services.facebook.picture.data': 1,
        'services.facebook.picture.data.url': 1
    }});
});

它只返回 id、name 和性别。这似乎是我想要的,也是推荐的解决方案。唯一的问题是没有返回有关用户图片的数据。

在其他一些帖子的建议下,我尝试将以下内容添加到 server/server.js,但它 a) 似乎不是推荐的方法,并且 b) 似乎没有做任何事情。所以,这似乎是一个死胡同,但似乎有人认为它可以用来加载个人资料图片。

var getFbPicture;

Accounts.loginServiceConfiguration.remove({
    service: "facebook"
});


Accounts.onCreateUser(function(options, user) {
    if (options.profile) {
        options.profile.picture = getFbPicture(user.services.facebook.accessToken);
        user.profile = options.profile;
    }
    return user;
});

getFbPicture = function(accessToken) {
    var result;
    result = Meteor.http.get("https://graph.facebook.com/me", {
        params: {
            access_token: accessToken,
            fields: 'picture'
        }
    });
    if (result.error) {
        throw result.error;
    }
    return result.data.picture.data.url;
};

所以,我现在有点不确定该往哪个方向走。这是需要在 Facebook Graph API 上设置权限的东西吗?还是在 Facebook 应用程序上?我在发布功能中有语法错误吗?我需要重新访问 onCreateUser 函数吗?

4

2 回答 2

36

改用这个,你不需要访问令牌或任何特殊的东西来获取他们的个人资料图片,只需要他们的 facebook 用户 ID。

Accounts.onCreateUser(function(options, user) {
    if (options.profile) {
        options.profile.picture = "http://graph.facebook.com/" + user.services.facebook.id + "/picture/?type=large";
        user.profile = options.profile;
    }
    return user;
});
于 2013-02-22T07:32:22.067 回答
3

如果你想为 facebook 获取图片

Accounts.onCreateUser(function(options, user) {
    if (typeof(user.services.facebook) != "undefined") {
        user.services.facebook.picture = "http://graph.facebook.com/" + user.services.facebook.id + "/picture/?type=large";
    }
    return user;
});

你可以添加这个辅助函数

UI.registerHelper("getImageUser", function (userId) {
    var user= Meteor.users.findOne(userId);
    if (user.services)
    {
        if (user.services.facebook)
            return user.services.facebook.picture;
        if (user.services.twitter)
            return user.services.twitter.profile_image_url;
        if (user.services.google)
            return user.services.google.picture;
    }
    else
    {
        return "images/withOutPhoto.png";
    }
});

在你的 html

<img src="{{getImageUser this._id}}" alt="...">
于 2014-09-16T18:26:35.600 回答