API API - Як отримати зображення профілю Facebook через API Facebook (не вимагаючи від користувача "Дозволити" програму)


257

Я працюю над CMS, який отримує зображення профілю користувача з його URL-адреси у Facebook (тобто http://facebook.com/users_unique_url ). Як я можу це досягти? Чи існує виклик API Faceboook, який отримує URL-адресу зображення профілю користувача, не потребуючи дозволу програми?

Відповіді:


409

Просто отримайте дані через цю 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-адреси.


73
Переглянувши цю сторінку далі, ще однією корисною справою може бути ?type=largeзапит, який ви можете додати. Реквізити для того, щоб придумати абсолютно кращу відповідь, ніж екранування, яке я набирав, BTW :).
Доменіч

6
Використовуйте, <img src="//graph.facebook.com/sarfraz.anees/picture" />якщо ви переходите між HTTP та HTTPS ... протокол виявляє браузер, і ви не отримаєте змішаних попереджень щодо вмісту на HTTPS.
Кріс Якоб

39
Слід підкреслити, що деякі користувачі НЕ встановлюють ім’я користувача для свого FB-акаунта. Коли це так, і ви намагаєтесь реалізувати цю відповідь, ви отримаєте зображення профілю FB за замовчуванням, знак питання. Щоб легко уникнути цієї проблеми, використовуйте замість цього ідентифікатор FB.
Джош

7
Слід зазначити, що у V2 графі api це більше не працює з використанням імені користувача. Отже, спочатку вам потрібен userid, і ви більше не можете використовувати ім'я користувача, щоб отримати це. Userid також змінюється для кожної програми, тому для отримання користувача, який ви можете використовувати, вам доведеться мати якусь належну автентифікацію. Технічно профіль ПІК досі в відкритому доступі на graph.facebook.com/v2.2/4/picture?redirect=0 проте з'ясувати ідентифікатор користувача (4 в попередній посиланням) здається неможливим на основі тільки в профілі користувача. Стара
графічна

36
Настає
Santosh Kumar

268

Показати:

50x50 пікселів

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

Ширина 200 пікселів

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

Зберегти (за допомогою PHP)

ПРИМІТКА: Не використовуйте це . Дивіться коментар @ Forever нижче.

$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+", вам знадобиться дійсний access_token від користувача 18+:

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

ОНОВЛЕННЯ 2015:

API API v2.0 не можна запитувати за допомогою імен користувачів, їх слід використовувати userIdзавжди.


6
Ось додаткові відомості про параметр типу: "Ви можете вказати потрібний розмір зображення за допомогою аргументу типу, який повинен бути квадратним (50x50), малим (50 пікселів у ширину, змінною висотою), нормальним (100 пікселів в ширину, змінною висотою ) та великі (близько 200 пікселів у ширину, різної висоти) "Via Graph API на Facebook

3
Щоб скористатися цим методом, вам потрібно встановити дозволити_url_fopen. Директива enable_url_fopen відключена за замовчуванням. Ви повинні знати про наслідки для безпеки включення директиви enable_url_fopen. Сценарії PHP, які можуть отримати доступ до віддалених файлів, потенційно вразливі до довільного введення коду. Коли ввімкнено директиву дозволу_url_fopen, ви можете писати сценарії, які відкривають віддалені файли так, ніби вони є локальними файлами.
Раніше

Здається, корисно, тому вітаємо заздалегідь, але будучи на одному рівні занадто новим, щоб зрозуміти, я хотів би знати, в якій мові програмування це? Моя здогадка - PHP.
hello_there_andy

@hello_there_andy Так! Це PHP (насправді питання позначено як PHP, і це була єдина мова, якою я користуюсь 4 роки тому)
neiker

7
У липні 2015 року це більше не працює (помилка: "Неможливо запитувати користувачів за їхнім іменем користувача")
Flimm

164

ОНОВЛЕННЯ :

Починаючи з кінця серпня 2012 року, API було оновлено, що дозволяє отримувати зображення профілю користувачів різного розміру. Додайте необов'язкові поля ширини та висоти як параметри URL-адреси:

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

де WIDTHі HEIGHTякі запитувані значення параметрів.

Це поверне зображення профілю з мінімальним розміром 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може бути ідентифікаційний номер користувача або ім’я користувача.

Щоб отримати зображення профілю користувача певного розміру, зателефонуйте

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

він буде повертати JSON відповідь , якщо ви використовуєте один з методів запиту Facebook SDKs . Інакше воно поверне зображення саме. Щоб завжди отримати JSON, додайте:

&redirect=false

так:

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

Чудове пояснення, але повернене значення URL, який ви дали (' graph.facebook.com/redbull/… ) відповідає URL-адресою зображення в заголовку місця (' Location: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/… ). не як JSON, як {"data": {"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/… ", "width": 148, "висота" : 117, "is_silhouette": false}}
Gökhan Barış Aker

Я все одно отримую таку ж відповідь, як і у своїй відповіді. Ви можете спробувати це в Graph Explorer на розробниках Facebook за адресою developers.facebook.com/tools/explorer. Введіть "redbull / picture? Width = 140 & height = 110" і подивіться відповідь. Моя відповідь передбачає, що ви викликаєте це за допомогою одного з методів API / запиту SDK Facebook, який поверне відповідь JSON.
Гуннар Карлссон

2
@GunnarKarlsson вам не вистачає &redirect=falseповернення даних JSON замість переадресації на зображення
andrewtweber

@andrewtweber велике спасибі До відповіді я додав уточнення.
Гуннар Карлссон

3
Зараз липень 2015 року, і це вже не працює. (помилка: "Неможливо запитувати користувачів за їхнім іменем користувача")
Flimm

20

Щоб отримати 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, а не USERNAME. Ви можете отримати свій ідентифікатор facebook там:

http://findmyfbid.com/


1
Це липень 2015 року, і це більше не працює (помилка: "Неможливо запитувати користувачів за їхнім іменем користувача")
Flimm

3
Ви все помилилися з другом :) Це ваш ідентифікатор у Facebook, а не ім'я користувача findmyfbid.com
NaturalBornCamper

1
Найкраще тут. Це безумовно безумовно, я намагався отримати дані в тілі, а потім дані з’являються у заголовку @. @
Davuz

19

Простий однорядковий код для збереження зображення профілю ПОВНОГО розміру на вашому сервері.

<?php

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

?>

Це буде працювати лише в тому випадку, якщо openssl увімкнено у php.ini.


Це липень 2015 року, і це більше не працює (помилка: "Неможливо запитувати користувачів за їхнім іменем користувача")
Flimm

Так, виклики v1.0 припинять свою роботу після 30 квітня 2015 року. Ви не можете отримати ідентифікатор програми, якщо користувач не авторизував ваш додаток
Armand

10

Додав це як коментар до прийнятої відповіді, але вважав, що це заслуговує на довше пояснення. Починаючи з квітня 2015 року, можливо, це буде піднято кілька разів.

Станом на V2 графіка api прийнята відповідь більше не працює з використанням імені користувача. Отже, спочатку вам потрібен userid, і ви більше не можете використовувати ім'я користувача, щоб отримати це. Щоб ще більше ускладнити питання, з міркувань конфіденційності Facebook тепер змінює користувальницьку програму на додаток (див. Https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ та https: //developers.facebook .com / docs / apps / upgrade / # upgradeing_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

Одним із способів є використання коду, який Гамлет розмістив у своїй відповіді:

  • Збережіть як 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

Робоче рішення 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'];
}

Ви можете змінити 'type' у параметрі:

Майдан:

максимальна ширина та висота 50 пікселів.

Маленький

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

Нормальний

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

Великий

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


7

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

Введіть тут опис зображення

Прочитайте цю статтю:

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/


1
Як це відповідає на питання?
Flimm

6

Публікація в блозі « Схопіть малюнок об’єкта графіку Facebook» може запропонувати іншу форму рішення. Використовуйте код у підручнику разом із графічним API API та його бібліотекою PHP SDK у Facebook .

... І намагайтеся не використовувати file_get_contents (якщо ви не готові зіткнутися з наслідками - див. File_get_contents vs curl ).


4

Вас турбує розмір картинки профілю? на момент здійснення входу з Facebook за допомогою PHP. Ми покажемо вам простий спосіб отримати зображення профілю великого розміру у Facebook PHP SDK. Також ви можете отримати зображення на замовлення розміру у профілі Facebook.

Встановіть розмір зображення профілю за допомогою наступного рядка коду.

$ userProfile = $ facebook-> api ('/ me? polja = picture.width (400). висота (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);
}

Це поверне необроблену URL-адресу зображення аватара Facebook. Тоді можете сміливо робити все, що завгодно!


3
URI  = https://graph.facebook.com/{}/picture?width=500'.format(uid)

Ви можете отримати URI профілю через онлайн інструмент пошуку ідентифікаторів facebook

Ви також можете передавати парам типу з можливими значеннями малий, нормальний, великий, квадратний.

Перегляньте офіційну документацію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.