获取facebook更改后的facebook用户档案图片(10月24日)



所以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核心。

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

此终结点支持应用程序作用域用户ID(ASID(、用户ID(UID(和页面作用域用户标识(PSID(。目前,您可以查询无需任何要求的ASIC和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",
]

作为响应,您将获得access_token,您需要将其附加在新的图像URL上。

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客户端的方法。你可以在这里查看我升级的Laravel Socialite提供商课程。

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}

最新更新