Facebook API – 如何通过Facebook API获取Facebook用户的个人资料图片(无需用户“允许”该应用程序)

我正在开发一个CMS ,从他们的Facebook URL (即http://facebook.com/users_unique_url )获取用户的个人资料图片。 我怎样才能做到这一点? 是否有Faceboook API调用提取用户的configuration文件图像URL,而用户不需要允许应用程序?

只需通过此URL获取数据:

http://graph.facebook.com/userid_here/picture

用你想获取照片的用户的IDreplaceuserid_here 。 您也可以使用HTTPS。

您可以使用PHP的file_get_contents函数来读取该URL并处理检索到的数据。

资源:

http://developers.facebook.com/docs/api

注意:php.ini ,您需要确保启用OpenSSL扩展来使用PHP的file_get_contents函数来读取该URL。

以显示:

50×50像素

 <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上..

注意:如果图像标记为“18+”,则需要来自18位以上用户的有效access_token:

 <img src="//graph.facebook.com/{{fid}}/picture?access_token={{access_token}}"> 

更新

从2012年8月底开始,API已更新,允许您检索不同大小的用户个人资料照片。 将可选的宽度和高度字段添加为URL参数:

 https://graph.facebook.com/USER_ID/picture?width=WIDTH&height=HEIGHT 

WIDTHHEIGHT是你要求的尺寸值。

这将返回一个最小尺寸为WIDTH x HEIGHT的configuration文件图片,同时尝试保留宽高比。 例如,

 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 } } 

END UPDATE

要获取用户的个人资料图片,请致电

 https://graph.facebook.com/USER_ID/picture 

其中USER_ID可以是用户标识号或用户名。

要获取特定尺寸的用户个人资料图片,请致电

 https://graph.facebook.com/USER_ID/picture?type=SIZE 

SIZE应该用其中一个词来代替

 square small normal large 

取决于你想要的大小。

此调用将根据您select的types参数将URL返回到单个图像的大小。

例如:

 https://graph.facebook.com/USER_ID/picture?type=small 

将URL返回到图像的小版本。

API仅指定configuration文件映像的最大大小,而不是实际大小。

广场:

最大宽度和高度为50像素。

最大宽度为50像素,最大高度为150像素。

正常

最大宽度为100像素,最大高度为300像素。

最大宽度为200像素,最大高度为600像素。

如果你打电话给默认的USER_ID /图片,你会得到正方形的types。

澄清

如果你打电话(按照上面的例子)

 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,请不要使用二进制内容:

 $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/

简单的一行代码,以保存您的服务器上的全尺寸的个人资料图像。

 <?php copy("https://graph.facebook.com/FACEBOOKID/picture?width=9999&height=9999", "picture.jpg"); ?> 

这只会在php.ini中启用openssl时才起作用。

添加这个作为接受答案的评论,但觉得值得更长的解释。 从2015年4月左右开始,这可能会提高几次。

从graphicsapi的V2开始,接受的答案不再使用用户名。 所以现在你首先需要用户名,而且你不能再使用用户名来获得这个。 更为复杂的是,出于隐私的原因,Facebook现在正在改变用户的每个应用程序(请参阅https://developers.facebook.com/docs/graph-api/reference/v2.2/user/和https:://developers.facebook .com / docs / apps / upgrading /#upgrading_v2_0_user_ids ),所以你将不得不有一些正确的身份validation来检索你可以使用的用户标识符。 从技术上来说,configuration文件图片仍然是公开的,并且可以在/ userid / picture处获得(参见https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture上的文档,本示例用户:; http: //graph.facebook.com/v2.2/4/picture?redirect=0 )然而,根据用户的个人资料来确定用户的标准用户标识似乎是不可能的 – 您的应用需要让他们批准与应用进行交互我的用例(只显示他们的FB个人资料链接旁边的个人资料图片)是矫枉过正。

如果有人已经想出了一个方法来获取基于用户名的个人资料图片,或者,如何获得一个用户ID(即使是一个交替的)用来检索个人资料图片,请分享! 与此同时,旧graphicsurl仍然有效,直到2015年4月。

一种方法是使用Gamlet在他的答案中发布的代码:

  • 保存为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; 

我以为我会张贴这个,因为我花了一些时间来弄清楚的细节…即使configuration文件图片是公开的,你仍然需要有一个访问令牌,当你curl它。

有办法做到这一点;)

感谢“ 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); } } } 

我在想 – 也许ID将是一个有用的工具。 每当用户创build一个新的帐户,它应该得到一个更高的ID。 我search了一下,发现有一种方法可以通过ID来估算账户创builddate,而来自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/

从2015年4月开始使用PHP(HTTP GET)解决scheme(不含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']; } 

你可以在参数中改变'type':

广场:

最大宽度和高度为50像素。

最大宽度为50像素,最大高度为150像素。

正常

最大宽度为100像素,最大高度为300像素。

最大宽度为200像素,最大高度为600像素。

博客文章抓取Facebookgraphics对象的图片可能提供另一种forms的解决scheme。 使用教程中的代码以及Facebook的Graph API和PHP SDK库。

…尽量不要使用file_get_contents (除非你已经准备好面对后果 – 参见file_get_contents vs curl )。

你关心个人资料图片的大小吗? 在使用PHP实现与Facebook的login时。 我们将向您展示在Facebook PHP SDK中获取大尺寸档案图片的简单方法。 此外,你可以得到Facebookconfiguration文件的自定义大小的图像。

通过使用下面的代码行设置configuration文件图片尺寸。

$ 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/

@NaturalBornCamper,

不错的代码! 这是一个干净的代码function,这样的过程!

 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); } 

这将返回原始的 Facebook头像图片url。 随意随意做任何你想要的东西吧!