【问题标题】:How to query a Facebook user picture via Meteor's accounts-facebook?如何通过 Meteor 的账户-facebook 查询 Facebook 用户图片?
【发布时间】:2013-02-22 06:56:25
【问题描述】:

我正在尝试获取经过身份验证的 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和gender。这似乎是我想要的,也是推荐的解决方案。唯一的问题是没有返回有关用户图片的数据。

在其他一些帖子的建议下,我尝试将以下内容添加到 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 函数吗?

【问题讨论】:

    标签: facebook meteor


    【解决方案1】:

    改用这个,你不需要访问令牌或任何特殊的东西来获取他们的profile picture,只需他们的 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;
    });
    

    【讨论】:

    • 感谢 Akshat 的反馈。 Accounts.onCreateUser 方法实际上破坏了我的应用程序对用户的引导,但总体思路有效,因此接受了答案。我最终使用了以下内容:Template.userCardTemplate.user_image = function () { if(Meteor.user().services.facebook){ return "http://graph.facebook.com/" + Meteor.user().services.facebook.id + "/picture/?type=large"; } };
    • 我希望您能够随心所欲地使用它!它不应该破坏您的应用程序,您是否在服务器端代码上使用它?您是否在控制台上遇到错误?您在注册时是否传递了选项?
    • 您建议的是好的代码,并且正确地使用了框架。我只是碰巧在引导用户时绕过了 Accounts 模块,并将它们直接插入到 Users 集合中。错误在我这边,因为我使用的是辅助的、非标准的机制来引导用户。我必须重新考虑那个引导文件,并弄清楚如何使用 Accounts 模块来重构它。 (甚至可以为“待办事项”示例提交一个错误修复,以使其跟上 Accounts 模块的最新发展。)
    • 我正在尝试这个,但没有工作。什么都没发生。它没有被添加到数据库中。这仍然适用于新的流星版本吗?
    • 嗨,Rafael,它应该可以工作。你确定你运行了“meteor add accounts-facebook”,并输入了你的应用程序的 ID 和密码吗?如果是,请打开终端windon,运行“meteor mongo”,然后输入“db.users.findOne()”。结果如何?
    【解决方案2】:

    如果你想为 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="...">
    

    【讨论】:

    • 不要忘记:user.profile = options.profile;这将覆盖默认的,并且您将丢失登录/注册所在的名称。对我来说很好^^
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多