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


Answers:


409

只需通过以下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扩展以使用file_get_contentsPHP 的功能来读取该URL。


73
进一步浏览该页面,另一个有用的事情可能是?type=large可以添加的查询字符串。提出比我正在键入的屏幕抓取更好的答案的道具,顺便说一句:)。
多米尼克

6
<img src="//graph.facebook.com/sarfraz.anees/picture" />如果您在HTTP和HTTPS之间切换,则使用...该协议被浏览器检测到,并且不会在HTTPS上收到混合内容警告。
克里斯·雅各布

39
应该强调的是,有些用户没有为其FB帐户设置用户名。在这种情况下,当您尝试实现此答案时,您将收到FB的默认个人资料图片,问号。为了轻松避免此问题,请改用用户的FB ID。
乔什

7
应该注意的是,在图形API的V2中,使用用户名不再有效。因此,现在您需要首先使用用户名,并且您不再可以使用用户名来获取此用户名。每个应用程序的用户ID也会发生变化,因此您必须具有某种适当的身份验证才能检索可以使用的用户ID。从技术上讲,个人资料图片仍然是公开的,并且可以在graph.facebook.com/v2.2/4/picture?redirect=0上找到,但是仅根据用户个人资料来找出用户ID(上一链接中为4)似乎是不可能的。旧的图表网址仍然可以使用到2015
。– sckd 2014年

36
是2015年,我正在(#803)无法通过用户名(sarfraz.anees)查询用户
Santosh Kumar

268

显示:

50x50像素

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

200像素宽

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

保存(使用PHP)

注意:请勿使用this。请参阅下面的@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始终使用。


6
以下是有关type参数的更多信息:“您可以使用type参数指定所需的图片尺寸,该尺寸应为正方形(50x50),较小(宽度为50像素,高度可变),常规(宽度为100像素,高度可变)之一)和大(大约200像素宽,高度可变)”,通过Facebook上的Graph API

3
要使用此方法,必须将allow_url_fopen设置为on。默认情况下,allow_url_fopen指令是禁用的。您应该意识到启用allow_url_fopen指令的安全隐患。可以访问远程文件的PHP脚本可能容易受到任意代码注入的攻击。启用allow_url_fopen指令后,您可以编写打开远程文件的脚本,就像它们是本地文件一样。
永远

看起来很有用,所以要事先加油打气,但是由于太新了而无法理解,我想知道这是哪种编程语言?我的猜测是PHP。
hello_there_andy 2014年

@hello_there_andy是的!它是PHP(实际上这个问题被标记为PHP,这是我4年前使用的唯一语言)
neiker 2015年

7
在2015年7月,这不再起作用(错误:“无法通过用户名查询用户”)
Flimm

164

更新

从2012年8月底开始,API已更新,可以检索大小不同的用户个人资料图片。添加可选的width和height字段作为URL参数:

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

其中WIDTHHEIGHT是您要求的尺寸值。

这将返回最小尺寸为WIDTHx 的个人资料图片,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可以是用户ID号或用户名。

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

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

在哪里SIZE应该替换为以下单词之一

square
small
normal
large

取决于您想要的大小。

该调用将根据您选择的type参数返回一个具有其大小的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/…)。而不是像{“ data”:{“ url”:“ fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/…之类的JSON, ”,“ width”:148,“ height” :117, “is_silhouette”:假}}
GOKHAN阿克尔巴里斯

我仍然得到与答案相同的答复。您可以在Developers.facebook.com/tools/explorer上的Facebook Developers上的Graph Explorer中尝试一下。输入“ redbull / picture?width = 140&height = 110”并查看响应。我的答案假设您使用Facebook SDKs API / request方法之一调用此方法,该方法将返回JSON响应。
冈纳·卡尔森

2
@GunnarKarlsson,您错过了&redirect=false返回JSON数据而不是重定向到图像的方法
andrewtweber

@andrewtweber非常感谢。我已经为答案添加了说明。
Gunnar Karlsson

3
现在是2015年7月,现在不再有效。(错误:“无法通过用户名查询用户”)
Flimm

20

要获取图片网址,而不是二进制内容:

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


1
是2015年7月,它不再起作用(错误:“无法通过用户名查询用户”)
Flimm

3
您把所有的朋友弄错了:)这是您的Facebook ID,而不是用户名findmyfbid.com
NaturalBornCamper 2015年

1
最好的。确实很疯狂,我尝试将数据保存到体内,然后数据显示在标题@。@中
Davuz,2016年

19

简单的单行代码即可将完整尺寸的配置文件图像保存在您的服务器上。

<?php

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

?>

仅在php.ini中启用openssl时,此方法才有效。


是2015年7月,它不再起作用(错误:“无法通过用户名查询用户”)
Flimm

是的,v1.0调用将在2015年4月30日之后停止工作。除非用户授权了您的应用,否则您将无法获得应用专用的ID
Armand

10

将此添加为已接受答案的注释,但认为它值得更长的解释。从2015年4月开始,这可能会提高几次。

从图api的V2版本开始,接受的答案不再使用用户名起作用。因此,现在您需要首先使用用户名,并且您不再可以使用用户名来获取此用户名。出于隐私原因,使事情更加复杂的是,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中的 docs 和该示例用户: http: //graph.facebook.com/v2.2/4/picture?redirect=0),但仅根据用户个人资料来确定用户的标准用户ID似乎是不可能的-您的应用需要让他们批准与该应用的交互,对于我的用例(仅在其FB个人资料链接旁边显示个人资料图片)就显得过分了。

如果有人想出了一种基于用户名获取个人资料图片的方法,或者选择如何获取用户ID(甚至是替代用户名)来检索个人资料图片,请分享!在此期间,旧的图表网址仍然有效,直到2015年4月。


9

一种方法是使用答案中张贴的代码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;

我以为我会发布此信息,因为花了一些时间来弄清细节...即使个人资料照片是公开的,但卷曲时您仍然需要在其中拥有访问令牌才能获取它。


8

有办法做到这一点;)

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

8

自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像素。


7

我在想-也许ID将是一个有用的工具。每次用户创建新帐户时,它都应获得更高的ID。我在Google上搜索后发现,有一种方法可以通过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/


1
这如何回答这个问题?
Flimm 2015年


4

您担心个人资料图片的大小吗?在使用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/


3

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

这将返回原始的 Facebook头像图片URL。随便做什么吧!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.