Facebook API - 如何通过 Facebook API 获取 Facebook 用户的个人资料图片(无需用户“允许”应用程序)
Posted
技术标签:
【中文标题】Facebook API - 如何通过 Facebook API 获取 Facebook 用户的个人资料图片(无需用户“允许”应用程序)【英文标题】:Facebook API - How do I get a Facebook user's profile image through the Facebook API (without requiring the user to "Allow" the application) 【发布时间】:2011-02-18 17:56:59 【问题描述】:我正在开发一个CMS,它从用户的 Facebook URL(即http://facebook.com/users_unique_url)获取用户的个人资料图片。我怎样才能做到这一点?是否存在无需用户允许应用程序即可获取用户个人资料图片 URL 的 Faceboook API 调用?
【问题讨论】:
【参考方案1】:只需通过这个URL获取数据:
http://graph.facebook.com/userid_here/picture
将userid_here
替换为您要获取其照片的用户的ID。您也可以使用 HTTPS。
您可以使用 php 的 file_get_contents
函数来读取该 URL 并处理检索到的数据。
资源:
http://developers.facebook.com/docs/api
注意:在php.ini
中,您需要确保OpenSSL扩展被启用,才能使用PHP的file_get_contents
函数读取该URL。
【讨论】:
进一步浏览该页面,另一个有用的东西可能是您可以添加的?type=large
查询字符串。提出一个比我正在输入的屏幕抓取更好的答案的道具,顺便说一句:)。
如果您在 HTTP 和 HTTPS 之间切换,请使用 <img src="//graph.facebook.com/sarfraz.anees/picture" />
...该协议被浏览器检测到,您不会在 HTTPS 上收到混合内容警告。
应该强调的是,有些用户确实没有为他们的 FB 帐户设置了用户名。在这种情况下,并且您正在尝试实施此答案,您将收到 FB 的默认个人资料图片,即问号。为轻松避免此问题,请改用用户的 FB ID。
需要注意的是,在图 api 的 V2 中,这不再使用用户名。所以现在你首先需要用户 ID,你不能再使用用户名来获取它。每个应用程序的用户 ID 也会发生变化,因此您必须进行某种适当的身份验证才能检索您可以使用的用户 ID。从技术上讲,个人资料图片仍然是公开的,可以在graph.facebook.com/v2.2/4/picture?redirect=0 获得,但是仅根据用户的个人资料来确定用户 ID(上一个链接中的 4)似乎是不可能的。旧的图表网址在 2015 年 4 月之前仍然有效。
现在是 2015 年,我得到了 (#803) 无法通过用户名查询用户 (sarfraz.anees)【参考方案2】:
有办法做到这一点;)
感谢“http://it.toolbox.com/wiki/index.php/Use_curl_from_PHP_-_processing_response_headers”:
<?php
/**
* Facebook user photo downloader
*/
class sfFacebookPhoto
private $useragent = 'Loximi sfFacebookPhoto PHP5 (cURL)';
private $curl = null;
private $response_meta_info = array();
private $header = array(
"Accept-Encoding: gzip,deflate",
"Accept-Charset: utf-8;q=0.7,*;q=0.7",
"Connection: close"
);
public function __construct()
$this->curl = curl_init();
register_shutdown_function(array($this, 'shutdown'));
/**
* Get the real URL for the picture to use after
*/
public function getRealUrl($photoLink)
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, false);
curl_setopt($this->curl, CURLOPT_HEADER, false);
curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($this->curl, CURLOPT_URL, $photoLink);
//This assumes your code is into a class method, and
//uses $this->readHeader as the callback function.
curl_setopt($this->curl, CURLOPT_HEADERFUNCTION, array(&$this, 'readHeader'));
$response = curl_exec($this->curl);
if (!curl_errno($this->curl))
$info = curl_getinfo($this->curl);
var_dump($info);
if ($info["http_code"] == 302)
$headers = $this->getHeaders();
if (isset($headers['fileUrl']))
return $headers['fileUrl'];
return false;
/**
* Download Facebook user photo
*
*/
public function download($fileName)
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->header);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($this->curl, CURLOPT_HEADER, false);
curl_setopt($this->curl, CURLOPT_USERAGENT, $this->useragent);
curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($this->curl, CURLOPT_TIMEOUT, 15);
curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($this->curl, CURLOPT_URL, $fileName);
$response = curl_exec($this->curl);
$return = false;
if (!curl_errno($this->curl))
$parts = explode('.', $fileName);
$ext = array_pop($parts);
$return = sfConfig::get('sf_upload_dir') . '/tmp/' . uniqid('fbphoto') . '.' . $ext;
file_put_contents($return, $response);
return $return;
/**
* cURL callback function for reading and processing headers.
* Override this for your needs.
*
* @param object $ch
* @param string $header
* @return integer
*/
private function readHeader($ch, $header)
//Extracting example data: filename from header field Content-Disposition
$filename = $this->extractCustomHeader('Location: ', '\n', $header);
if ($filename)
$this->response_meta_info['fileUrl'] = trim($filename);
return strlen($header);
private function extractCustomHeader($start, $end, $header)
$pattern = '/'. $start .'(.*?)'. $end .'/';
if (preg_match($pattern, $header, $result))
return $result[1];
else
return false;
public function getHeaders()
return $this->response_meta_info;
/**
* Cleanup resources
*/
public function shutdown()
if($this->curl)
curl_close($this->curl);
【讨论】:
【参考方案3】:一种方法是在他的回答中使用代码Gamlet posted:
另存为curl.php
然后在你的文件中:
require 'curl.php';
$photo="https://graph.facebook.com/me/picture?access_token=" . $session['access_token'];
$sample = new sfFacebookPhoto;
$thephotoURL = $sample->getRealUrl($photo);
echo $thephotoURL;
我想我会发布这个,因为我花了一些时间来弄清楚细节......即使个人资料图片是公开的,当你 @987654322 时你仍然需要有一个访问令牌才能获得它@它。
【讨论】:
【参考方案4】:博文 Grab the Picture of a Facebook Graph Object 可能会提供另一种形式的解决方案。将教程中的代码与 Facebook 的 Graph API 及其 PHP SDK 库一起使用。
...并且尽量不要使用 file_get_contents(除非您准备好面对后果 - 请参阅 file_get_contents vs curl)。
【讨论】:
【参考方案5】:显示:
50x50 像素
<img src="//graph.facebook.com/fid/picture">
200 像素宽度
<img src="//graph.facebook.com/fid/picture?type=large">
保存(使用 PHP)
注意:不要使用这个。请参阅下面@Foreever 的评论。
$img = file_get_contents('https://graph.facebook.com/'.$fid.'/picture?type=large');
$file = dirname(__file__).'/avatar/'.$fid.'.jpg';
file_put_contents($file, $img);
$fid 是您在 Facebook 上的用户 ID。
注意:如果图像标记为“18+”,您将需要 18+ 用户的有效 access_token:
<img src="//graph.facebook.com/fid/picture?access_token=access_token">
2015 年更新:
Graph API v2.0 无法使用用户名进行查询,您应该始终使用userId
。
【讨论】:
这里是关于 type 参数的更多信息:“您可以使用 type 参数指定您想要的图片大小,它应该是正方形 (50x50)、小 (50 像素宽、可变高度) 之一,普通(100 像素宽,可变高度)和大(约 200 像素宽,可变高度)" 通过 Graph API on Facebook 要使用此方法,您必须将 allow_url_fopen 设置为 on。 allow_url_fopen 指令默认禁用。您应该了解启用 allow_url_fopen 指令的安全隐患。可以访问远程文件的 PHP 脚本可能容易受到任意代码注入的影响。启用 allow_url_fopen 指令后,您可以编写脚本来像打开本地文件一样打开远程文件。 看起来很有用,所以提前欢呼,但是由于太新而无法理解,我想知道这是哪种编程语言?我的猜测是 PHP。 @hello_there_andy 是的!它是 PHP(实际上这个问题被标记为 PHP,它是我 4 年前唯一使用的语言) 在 2015 年 7 月,这不再有效(错误:“无法通过用户名查询用户”)【参考方案6】:要获取图像 URL,而不是二进制内容:
$url = "http://graph.facebook.com/$fbId/picture?type=$size";
$headers = get_headers($url, 1);
if( isset($headers['Location']) )
echo $headers['Location']; // string
else
echo "ERROR";
您必须使用您的 FACEBOOK ID,而不是 USERNAME。您可以在那里获取您的 facebook id:
http://findmyfbid.com/
【讨论】:
现在是 2015 年 7 月,这不再有效(错误:“无法通过用户名查询用户”) 你搞错了朋友 :) 这是你的 Facebook ID,而不是用户名 findmyfbid.com 这里最好的。这绝对是疯狂的,我试图在正文中获取数据,然后数据出现在标题 @.@【参考方案7】:更新:
从 2012 年 8 月开始,API 已更新,允许您检索不同大小的用户个人资料图片。添加可选的宽度和高度字段作为 URL 参数:
https://graph.facebook.com/USER_ID/picture?width=WIDTH&height=HEIGHT
其中WIDTH
和HEIGHT
是您请求的维度值。
这将返回一个最小尺寸为WIDTH
x HEIGHT
的个人资料图片,同时尝试保持纵横比。例如,
https://graph.facebook.com/redbull/picture?width=140&height=110
返回
"data":
"url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/s148x148/2624_134501175351_4831452_a.jpg",
"width": 148,
"height": 117,
"is_silhouette": false
结束更新
要获取用户的头像,请致电
https://graph.facebook.com/USER_ID/picture
其中USER_ID
可以是用户标识号或用户名。
要获取特定尺寸的用户个人资料图片,请调用
https://graph.facebook.com/USER_ID/picture?type=SIZE
SIZE
应替换为其中一个单词
square
small
normal
large
取决于你想要的大小。
此调用会将URL 返回到单个图像,其大小取决于您选择的类型参数。
例如:
https://graph.facebook.com/USER_ID/picture?type=small
返回一个指向图像小版本的 URL。
API 仅指定个人资料图片的最大尺寸,而不是实际尺寸。
正方形:
最大宽度和高度为 50 像素。
小
最大宽度为 50 像素,最大高度为 150 像素。
正常
最大宽度为 100 像素,最大高度为 300 像素。
大
最大宽度为 200 像素,最大高度为 600 像素。
如果您调用默认的 USER_ID/图片,您将获得方形类型。
澄清
如果你打电话(按照上面的例子)
https://graph.facebook.com/redbull/picture?width=140&height=110
如果您使用 Facebook SDK 请求方法之一,它将返回 JSON 响应。否则它将返回图像本身。要始终检索 JSON,请添加:
&redirect=false
像这样:
https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
【讨论】:
很好的解释,但是您提供的 url ('graph.facebook.com/redbull/…) 的返回值会在位置标头 ('Location: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/…) 中以图像 url 响应。不像 JSON 那样 "data": "url": "fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/…", "width": 148, "height": 117, "is_silhouette": false 我仍然得到与我的答案相同的响应。您可以在 developer.facebook.com/tools/explorer 上的 Facebook Developers 上的 Graph Explorer 中试用它。输入 'redbull/picture?width=140&height=110' 并查看响应。我的回答假设您使用 Facebook SDKs API / request 方法之一调用它,这将返回 JSON 响应。 @GunnarKarlsson 您缺少&redirect=false
来返回 JSON 数据而不是重定向到图像
@andrewtweber 非常感谢。我已经对答案进行了澄清。
现在是 2015 年 7 月,这不再有效。 (错误:“无法通过用户名查询用户”)【参考方案8】:
我在想 - 也许 ID 会是一个有用的工具。每次用户创建一个新帐户时,它都应该获得一个更高的 ID。我用谷歌搜索,发现有一种方法可以通过 ID 估计帐户创建日期,并且来自 metadatascience.com 的 Massoud Seifi 收集了一些很好的数据。
阅读这篇文章:
http://metadatascience.com/2013/03/11/inferring-facebook-account-creation-date-from-facebook-user-id/
这里有一些 ID 可供下载:
http://metadatascience.com/2013/03/14/lookup-table-for-inferring-facebook-account-creation-date-from-facebook-user-id/
【讨论】:
这如何回答这个问题?【参考方案9】:@NaturalBornCamper,
不错的代码!这是此类过程的简洁代码功能!
function get_raw_facebook_avatar_url($uid)
$array = get_headers('https://graph.facebook.com/'.$uid.'/picture?type=large', 1);
return (isset($array['Location']) ? $array['Location'] : FALSE);
这将返回 raw Facebook 头像图像 URL。那就随心所欲地去做吧!
【讨论】:
【参考方案10】:在您的服务器上保存完整尺寸的个人资料图像的简单的一行代码。
<?php
copy("https://graph.facebook.com/FACEBOOKID/picture?width=9999&height=9999", "picture.jpg");
?>
这只有在 php.ini 中启用 openssl 时才有效。
【讨论】:
现在是 2015 年 7 月,这不再有效(错误:“无法通过用户名查询用户”) 是的,v1.0 调用将在 2015 年 4 月 30 日之后停止工作。除非用户授权您的应用,否则您无法获取应用特定的 ID【参考方案11】:将此作为评论添加到已接受的答案中,但认为它值得更长的解释。从 2015 年 4 月左右开始,这可能会提高几次。
从图 api 的 V2 开始,接受的答案不再使用用户名。所以现在你首先需要用户 ID,你不能再使用用户名来获取它。更复杂的是,出于隐私原因,Facebook 现在正在更改每个应用程序的用户 ID(请参阅 https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ 和 https://developers.facebook.com/docs/apps/upgrading/#upgrading_v2_0_user_ids ),因此您必须进行某种适当的身份验证才能检索您可以使用的用户 ID。从技术上讲,个人资料图片仍然是公开的,可以在 /userid/picture 上找到(请参阅https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture 的文档和此示例用户:http://graph.facebook.com/v2.2/4/picture?redirect=0)但是仅根据他们的个人资料来确定用户的标准用户 ID 似乎是不可能的 - 你的应用程序需要让他们批准与应用程序的交互,这对于我的用例(只是在他们的 FB 个人资料链接旁边显示个人资料图片)是矫枉过正的。
如果有人想出了一种基于用户名获取个人资料图片的方法,或者,如何获取用户 ID(甚至是替代用户 ID)来检索个人资料图片,请分享!与此同时,旧的图表网址在 2015 年 4 月之前仍然有效。
【讨论】:
【参考方案12】:从 2015 年 4 月开始工作的 PHP (HTTP GET) 解决方案(没有 PHP 5 SDK):
function get_facebook_user_avatar($fbId)
$json = file_get_contents('https://graph.facebook.com/v2.5/'.$fbId.'/picture?type=large&redirect=false');
$picture = json_decode($json, true);
return $picture['data']['url'];
您可以更改参数中的“类型”:
正方形:
最大宽度和高度为 50 像素。
小
最大宽度为 50 像素,最大高度为 150 像素。
正常
最大宽度为 100 像素,最大高度为 300 像素。
大
最大宽度为 200 像素,最大高度为 600 像素。
【讨论】:
【参考方案13】:您是否担心个人资料图片的大小?在使用 PHP 使用 Facebook 实现登录时。我们将向您展示在 Facebook PHP SDK 中获取大尺寸个人资料图片的简单方法。此外,您还可以获取 Facebook 个人资料的自定义尺寸图片。
使用以下代码行设置头像尺寸。
$userProfile = $facebook->api('/me?fields=picture.width(400).height(400)');
查看这个帖子:http://www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/
【讨论】:
【参考方案14】:URI = https://graph.facebook.com//picture?width=500'.format(uid)
您可以通过online facebook id finder tool获取配置文件URI
您还可以传递类型参数,可能值为 small、normal、large、square。
请参考official documentation
【讨论】:
以上是关于Facebook API - 如何通过 Facebook API 获取 Facebook 用户的个人资料图片(无需用户“允许”应用程序)的主要内容,如果未能解决你的问题,请参考以下文章
Facebook Graph API:如何获得在线朋友/或最后 X 分钟活跃
从 facebook API 保存用户的个人资料图片 - PHP SDK V.5
升级图 API 2.0 后从 Facebook 读取新闻提要失败