我正在开发一个CMS,它可以从用户的Facebook URL(即http://facebook.com/users_unique_url)中获取用户的个人资料图像。我怎样才能做到呢?是否有一个facebook API调用,获取用户的个人资料图像URL,而不需要用户允许应用程序?


当前回答

简单的一行代码,保存完整尺寸的档案图像在您的服务器上。

<?php

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

?>

只有在php.ini中启用了openssl,这才有效。

其他回答

获取图片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,而不是用户名。你可以在那里获得你的facebook id:

http://findmyfbid.com/

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

保存为curl.php 然后在你的文件中: 需要“curl.php”; 美元的照片= " https://graph.facebook.com/me/picture?access_token= "。美元的会话(“access_token”); $sample = new sfFacebookPhoto; $thephotoURL = $sample->getRealUrl($photo); echo $ thephotoURL;

我想我应该张贴这个,因为我花了一些时间来弄清楚细节……即使个人资料照片是公开的,你仍然需要有一个访问令牌在那里,当你卷曲它。

简单的一行代码,保存完整尺寸的档案图像在您的服务器上。

<?php

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

?>

只有在php.ini中启用了openssl,这才有效。

有办法做到这一点;)

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

更新:

从2012年8月底开始,API已经更新,允许您检索不同大小的用户头像。添加可选的宽度和高度字段作为URL参数:

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

其中WIDTH和HEIGHT是您请求的维度值。

这将返回一个最小宽度x高度的头像,同时尝试保持纵横比。例如,

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

这取决于你想要的尺寸。

这个调用将返回一个URL到单个图像,其大小基于您所选择的类型参数。

例如:

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

返回图像的一个小版本的URL。

API只指定配置文件图像的最大大小,而不是实际大小。

广场:

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

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

正常的

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

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

如果你调用默认的USER_ID/picture,你会得到方形类型。

澄清

如果你打电话(如上例所示)

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