检索Facebook个人资料图片的URL

Retrieving Facebook Profile Picture URL

本文关键字:URL 资料图片 Facebook 检索      更新时间:2023-09-26

我在一个MEAN应用程序中使用satellizer进行身份验证。验证完成后,我想获得用户的个人资料图片。以下是我的代码:

Angular Controller

(function(){
    'use strict';
    angular
        .module('nayakans07')
        .controller('RegisterController', registerController);
    function registerController ($scope, $auth) {
        $scope.authenticate = function (provider) {
            $auth.authenticate(provider)
                .then(function (res) {
                    console.log(res);
                }, authErrorHandler);
        };
        function authErrorHandler (err) {
            console.log(err);
        }
    }
})();

Node.js路由处理程序

(function () {
    'use strict';
    var request = require('request');
    var qs = require('querystring');
    var tokenHelper = require('../helpers/tokenHelper.js');
    var config = require('../config/configuration.js');
    var Member = require('../models/memberModel.js');
    module.exports = function (req, res) {
        var accessTokenUrl = 'https://graph.facebook.com/oauth/access_token';
        var grapApiProfileUrl = 'https://graph.facebook.com/me';
        var graphApiProfileImageUrl = 'https://graph.facebook.com/me/picture?width=250&json=true';
        var params = {
            client_id: req.body.clientId,
            redirect_uri: req.body.redirectUri,
            code: req.body.code,
            client_secret: config.FACEBOOK_SECRET
        };
        request.get({
            url: accessTokenUrl,
            qs: params
        }, function (err, response, accessToken) {
            accessToken = qs.parse(accessToken);
            request.get({
                url: grapApiProfileUrl,
                qs: accessToken,
                json: true
            }, function (err, response, profile) {
                console.log(profile);
                Member.findOne({
                    facebookId: profile.id
                }, function (err, existingMember) {
                    if (existingMember) {
                        return res.status(200).send({
                            user: existingMember,
                            token: tokenHelper.createToken(existingMember, req, res)
                        });
                    } else {
                        request.get({
                            url: graphApiProfileImageUrl,
                            qs: accessToken,
                        }, function (err, response, profileImage) {
                            console.log(profileImage);
                            var fbData = {
                                facebookId: profile.id,
                                fullName: profile.name,
                                email: profile.email,
                                profileImage: profileImage
                            };
                            return res.status(200).send(fbData);
                        });
                    }
                });
            });
        });
    };

})();

我从facebook获得访问令牌后,我用访问令牌调用https://graph.facebook.com/me/picture?width=250&json=true端点以获得个人资料pic链接。在Facebook的API资源管理器调用相同的端点令牌我得到配置文件图像url,但当我从node.js端点处理程序调用它,我得到一些二进制数据。部分回应如下:

����JFIF���Photoshop 3.08BIM�gtc2XjTON-90Jqu9JFj83(bFBMD01000ac0030000b909000069110000fe120000dc14000069190000c02400002326000029280000872a0000fd3e0000��ICC_PROF

如何获取配置文件图像的URL而不是此响应

不确定这是否仍然是您正在使用的API版本的情况,但如果没有传递正确的参数,它会导致301重定向到图像(尽管他们的API Explorer建议…)您可以检查浏览器的网络监控来验证这一点。

有各种各样的来源,包括官方Facebook Graph-API文档,其中指出:

默认情况下,此边将返回到图片图像的302重定向。要访问有关图片的数据,请在查询中包含redirect=false。

(来源:https://developers.facebook.com/docs/graph-api/reference/user/picture/#Reading)

以及一些(老的,但类似的)SO答案:https://stackoverflow.com/a/7881978/624590

你有几个选择。一种方法是添加redirect=false查询参数(根据上面的Facebook文档)。

另一个选项是通过添加额外的查询参数&fields=url显式地请求URL(我上面链接到的答案建议&fields=picture,但据我所知,这已经过时了)。如果您需要响应中的高度和宽度,只需将它们添加到查询:&fields=url,height,width。根据我使用Facebook API的经验,显式请求字段往往是一种更可靠的方式。