API Facebook - Как получить изображение профиля пользователя Facebook через API Facebook (не требуя от пользователя «Разрешить» приложение) - PullRequest
254 голосов
/ 12 мая 2010

Я работаю над CMS , который выбирает изображение профиля пользователя со своего Facebook URL (то есть http://facebook.com/users_unique_url). Как я могу это сделать? вызов API Faceboook, который выбирает URL-адрес изображения профиля пользователя, и пользователю не нужно Разрешить приложение?

Ответы [ 14 ]

408 голосов
/ 12 мая 2010

Просто извлеките данные по этому URL :

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

Замените userid_here идентификатором пользователя, для которого вы хотите получить фотографию. Вы также можете использовать HTTPS.

Вы можете использовать функцию PHP file_get_contents для чтения этого URL и обработки полученных данных.

Ресурс:

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

Примечание: В php.ini необходимо убедиться, что расширение OpenSSL позволяет использовать функцию file_get_contents PHP для чтения этого URL.

265 голосов
/ 30 декабря 2010

Показать:

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.

ПРИМЕЧАНИЕ. В случае изображений, помеченных как «18+», вам потребуется действительный токен доступа от пользователя 18+:

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

ОБНОВЛЕНИЕ 2015:

Graph API v2.0 не может быть запрошен с использованием имен пользователей, вы должны использовать userId всегда.

163 голосов
/ 28 апреля 2012

UPDATE

Начиная с конца августа 2012 года, 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 пикселей.

Small

максимальная ширина 50 пикселей и максимальная высота 150 пикселей.

Нормальный

максимальная ширина 100 пикселей и максимальная высота 300 пикселей.

Large

максимальная ширина 200 пикселей и максимальная высота 600 пикселей.

Если вы вызываете USER_ID / изображение по умолчанию, вы получите квадратный тип.

ПОЯСНЕНИЯ

Если вы звоните (согласно приведенному выше примеру)

https://graph.facebook.com/redbull/picture?width=140&height=110

будет возвращен JSON ответ , если вы используете один из методов запроса Facebook SDK . В противном случае он вернет само изображение. Чтобы всегда получать JSON, добавьте:

&redirect=false

вот так:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
20 голосов
/ 22 февраля 2012

Чтобы получить 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, а НЕ ИМЯ ПОЛЬЗОВАТЕЛЯ. Вы можете получить свой идентификатор Facebook там:

http://findmyfbid.com/

19 голосов
/ 19 апреля 2014

Простой однострочный код для сохранения изображения профиля полного размера на вашем сервере.

<?php

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

?>

Это будет работать только если openssl включен в php.ini.

10 голосов
/ 10 ноября 2014

Добавил это как комментарий к принятому ответу, но чувствовал, что заслуживает более длинного объяснения. Начиная примерно с апреля 2015 года, этот показатель, вероятно, будет повышен несколько раз.

Начиная с V2 графика api, принятый ответ больше не работает с использованием имени пользователя. Так что теперь вам сначала нужен идентификатор пользователя, и вы больше не можете использовать имя пользователя для его получения. Чтобы еще больше усложнить ситуацию, по соображениям конфиденциальности Facebook теперь меняет идентификатор пользователя для каждого приложения (см. https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ и https://developers.facebook.com/docs/apps/upgrading/#upgrading_v2_0_user_ids), поэтому вам потребуется какая-то надлежащая аутентификация для получения идентификатора пользователя, который вы можете использовать. Технически фотография профиля все еще общедоступна и доступна по адресу / 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) является излишним.

Если кто-то нашел способ получить изображение профиля на основе имени пользователя или, альтернативно, как получить идентификатор пользователя (даже альтернативный) для получения изображения профиля, пожалуйста, поделитесь! Между тем, старый URL-адрес графика все еще работает до апреля 2015 года.

9 голосов
/ 29 августа 2010

Одним из способов является использование кода Гамлет отправил в своем ответе:

  • Сохранить как 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;
    

Я думал, что опубликую это, потому что мне потребовалось немного времени, чтобы выяснить подробности ... Несмотря на то, что изображения профиля являются общедоступными, вам все равно нужен токен доступа, чтобы получить его, когда вы curl it.

8 голосов
/ 11 декабря 2015

Рабочее решение PHP (HTTP GET) с апреля 2015 года (без 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 пикселей.

8 голосов
/ 28 июля 2010

Есть способ сделать это;)

Благодаря "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);
            }
        }
    }
7 голосов
/ 30 апреля 2013

Я думал - может быть, ID будет полезным инструментом. Каждый раз, когда пользователь создает новую учетную запись, он должен получить более высокий идентификатор. Я гуглил и обнаружил, что есть метод для оценки даты создания учетной записи по ID, и Масуд Сейфи из metadatascience.com собрал некоторые хорошие данные об этом.

Enter image description here

Прочитайте эту статью:

http://metadatascience.com/2013/03/11/inferring-facebook-account-creation-date-from-facebook-user-id/

А вот несколько идентификаторов для скачивания:

http://metadatascience.com/2013/03/14/lookup-table-for-inferring-facebook-account-creation-date-from-facebook-user-id/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...