在Facebook更改(10月24日)后获取Facebook用户个人资料图片

3

因此,Facebook更改了网站获取用户个人资料图片的方式,所有细节都在此处: https://developers.facebook.com/docs/graph-api/reference/user/picture/

所以我和SOF都是从Facebook获取用户的个人资料图片如下: https://graph.facebook.com/1108834579148558/picture?type=large

现在我们获取Facebook提供的默认图像。

在Facebook文档中,他们写道,我们需要附加访问令牌才能从现在开始获取用户个人资料图片,它是如何工作的呢?

我唯一能想到的是,在用户登录时,Facebook可以检索用户个人资料图片,有没有人可以帮忙解决,我正在使用.Net Core。

1个回答

5

Facebook在他们的新文档这里中解释了2020年10月之后获取用户图像的新方法,并将所需更改说明如下:

此端点支持应用程序范围用户ID(ASID)、用户ID(UID)和页面范围用户ID(PSID)。目前,您可以查询没有任何要求的ASID和UID。然而,从2020年10月24日开始,所有基于UID的查询都需要访问令牌。如果您查询UID,则必须包括一个令牌:

1. 以任何Facebook提供的形式获取access_token

根据您的应用程序结构,您将使用Facebook提供的以下方法之一来获取access_token。您可以在FB文档这里中了解更多关于access_token的信息。
应用访问令牌
客户端访问令牌

以我正在使用的客户端访问令牌为例:
https://graph.facebook.com/oauth/access_token发出GET请求,并使用以下参数:

[
   "client_id"     => #FACEBOOK_CLIENT_ID, 
   "client_secret" => #FACEBOOK_CLIENT_SECRET, 
   "grant_type"    => "client_credentials",
]

作为响应,您将获得您需要附加到新图像URL上的access_token
2. 使用附加的access_token获取完整的头像URL。
截至2020年10月23日,这对我有效。 完整的图像格式现在是
{$this->graphUrl}/{$this->version}/{$userID}/picture?type=large&redirect=false&access_token={$access_token} 如果您设置redirect=false,则会收到JSON对象作为响应:
{
    "data": {
        "height": 100,
        "is_silhouette": false,
        "url": "https://platform-lookaside.fbsbx.com/platform/profilepic/?asid=10152700727498624&height=100&width=100&ext=1606081666&hash=AeTQyGgugiSbRcB7Sxw",
        "width": 100
    }
}

另一方面,如果您保留redirect=true或根本不设置它,则会获得图像本身,然后可以将其保存在磁盘上或使用URL作为图像路径。但我不确定该URL是否长期有效。我现在已经使用相同的URL工作了将近一周,因此我认为在使用有效的access_token请求后,该URL将保持不变。
PHP示例请求如下:
由于我是在PHP中实现的,所以无法提供示例代码,但可以向您展示我在Laravel框架中使用Guzzle Client完成的方式。您可以查看我升级后的Laravel Socialite Provider Class here
    public function getAccessToken(){
        // Make a request to get the Access Client
        $res = Http::get("https://graph.facebook.com/oauth/access_token", [
            "client_id"     => config('services.facebook.client_id'),
            "client_secret" => config('services.facebook.client_secret'),
            "grant_type"    => "client_credentials",
        ]);

        // Response is a JSON Object, so decode it into an Array
        $r = $res->json();

        // Return the access_token Array Key out of the response
        return Arr::get($r, 'access_token', false);
    }


    public function getFacebookAvatar(array $user){
        // get the access_token from the above method
        $access_token = $this->getAccessToken();

        // build the new URI path for the User Image
        $path = "{$this->graphUrl}/{$this->version}/{$userID}/picture?type=large&redirect=false&access_token={$access_token}";
        $res  = Http::get($path);
        
        // Get the final User Image URL out of the response
        return Arr::get($res->json(), 'data.url', false);
    }

快速粗暴的构建自己的访问令牌(不推荐)

有一种方法可以构建自己的access_token,但由于您提供了完整的凭据,这种方法仅用于测试目的,因为可能会被劫持。您可以通过使用以下格式将凭据和|作为分隔符构建连接字符串来实现:{cliend_id}|{client_secret}


嘿 @Gkiokan,感谢你的帮助!关于访问令牌,应用程序需要“上线”或“验证”才能使用访问令牌吗? - Alex
@Alex 如果您是应用程序所有者,那就没关系了。但是,只要其他用户尝试通过您的应用程序访问API,该应用程序就需要处于活动模式。其中一些用户属于普通公众,而另一些用户则是实时绑定的。例如,对于不在开发团队中的其他用户的fb登录,直到应用程序获得实时状态才能使用。验证状态与API无关。 - Gkiokan
@Gkiokan 最后一个方法可以使用客户端令牌而不是客户端密钥,这里有一个小例子 https://developers.facebook.com/docs/facebook-login/access-tokens/#clienttokens 但我找不到更多细节,但它可以使用此令牌而不是使用密钥。 - Felipe Barreto
@FelipeBarreto 你可以在“生成应用访问令牌”部分找到信息。但即使在那里,Facebook也声明出于安全原因不应使用该方法。但是,在开发环境中进行快速而简单的测试请求时,它可以被使用。在文档页面中搜索此内容:“curl -i -X GET“https://graph.facebook.com/{api-endpoint}&access_token={your-app_id}|{your-app_secret}”或在此处 https://developers.facebook.com/docs/facebook-login/access-tokens/?locale=en_US#generating-an-app-access-token - Gkiokan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接