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(){
$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",
]);
$r = $res->json();
return Arr::get($r, 'access_token', false);
}
public function getFacebookAvatar(array $user){
$access_token = $this->getAccessToken();
$path = "{$this->graphUrl}/{$this->version}/{$userID}/picture?type=large&redirect=false&access_token={$access_token}";
$res = Http::get($path);
return Arr::get($res->json(), 'data.url', false);
}
快速粗暴的构建自己的访问令牌(不推荐)
有一种方法可以构建自己的access_token
,但由于您提供了完整的凭据,这种方法仅用于测试目的,因为可能会被劫持。您可以通过使用以下格式将凭据和|
作为分隔符构建连接字符串来实现:{cliend_id}|{client_secret}
。