API Facebook - Как получить изображение профиля пользователя 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.

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

Ресурс:

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

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

Sarfraz
источник
73
Просматривая эту страницу дальше, ?type=largeможно добавить еще одну полезную строку запроса. Рекомендую придумать совершенно лучший ответ, чем скриншот, который я печатал, кстати, :).
Доменик
6
Используйте, <img src="//graph.facebook.com/sarfraz.anees/picture" />если вы переключаетесь между HTTP и HTTPS ... протокол обнаруживается браузером, и вы не получите предупреждения о смешанном содержимом по HTTPS.
Крис Джейкоб
39
Следует подчеркнуть, что некоторым пользователям НЕ задано имя пользователя для их учетной записи FB. Когда это так, и вы пытаетесь реализовать этот ответ, вы получите изображение профиля FB по умолчанию, знак вопроса. Чтобы легко избежать этой проблемы, используйте вместо этого FB ID пользователя.
Джош
7
Следует отметить, что в V2 графа API это больше не работает с использованием имени пользователя. Так что теперь вам сначала нужен идентификатор пользователя, и вы больше не можете использовать имя пользователя для его получения. Идентификатор пользователя также меняется в зависимости от приложения, поэтому для получения идентификатора пользователя, который вы можете использовать, вам потребуется какая-то надлежащая аутентификация. Технически фотография профиля все еще общедоступна и доступна на graph.facebook.com/v2.2/4/picture?redirect=0, однако выяснение идентификатора пользователя (4 в предыдущей ссылке) кажется невозможным только на основе профиля пользователя. Старый URL-адрес графика все еще работает до апреля 2015 года.
Sckd
36
Это 2015, и я получаю (# 803) Не могу запросить пользователей по их имени пользователя (sarfraz.anees)
Сантош Кумар
268

Показывать:

50x50 пикселей

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

Ширина 200 пикселей

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

Сохранить (используя PHP)

ПРИМЕЧАНИЕ: не используйте это . Смотрите @ комментарий навсегда ниже.

$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всегда.

neiker
источник
6
Вот дополнительная информация о параметре типа: «Вы можете указать желаемый размер изображения с аргументом типа, который должен быть квадратным (50x50), маленьким (50 пикселей в ширину, с переменной высотой), нормальным (100 пикселей в ширину, с переменной высотой) ) и большой (шириной около 200 пикселей, с переменной высотой) "Через API Graph в Facebook
3
Чтобы использовать этот метод, вы должны установить для allow_url_fopen значение on. Директива allow_url_fopen по умолчанию отключена. Вы должны знать о последствиях безопасности для включения директивы allow_url_fopen. PHP-скрипты, которые могут обращаться к удаленным файлам, потенциально уязвимы для произвольного внедрения кода. Когда директива allow_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 / picture, вы получите квадратный тип.

ПОЯСНЕНИЯ

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

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
Гуннар Карлссон
источник
Отличное объяснение, но возвращаемое вами значение 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, "height" : 117, "is_silhouette": false}}
Гекхан Барыш Акер
Я все еще получаю тот же ответ, что и в моем ответе. Вы можете попробовать это в графическом обозревателе на сайте разработчиков 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 года, и это больше не работает. (ошибка: «Не
удается
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, а не имя пользователя. Вы можете получить свой идентификатор Facebook там:

http://findmyfbid.com/

NaturalBornCamper
источник
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.

Armand
источник
Это июль 2015 года, и это больше не работает (ошибка: «Невозможно запросить пользователей по имени пользователя»)
Flimm
Да, вызовы v1.0 перестанут работать после 30 апреля 2015 года. Вы не сможете получить конкретный идентификатор приложения, если пользователь не авторизировал ваше приложение
Armand
10

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

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

sckd
источник
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;

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

benjaminlotan
источник
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'];
}

Вы можете изменить тип в параметре:

Квадрат:

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

Маленький

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

Нормальный

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

большой

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

Xawier
источник
7

Я думал - может быть, ID будет полезным инструментом. Каждый раз, когда пользователь создает новую учетную запись, он должен получить более высокий идентификатор. Я гуглил и обнаружил, что есть метод для оценки даты создания учетной записи по ID, и Масуд Сейфи из 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/

Erroid
источник
1
Как это отвечает на вопрос?
Flimm
6

Сообщение в блоге « Возьмите изображение графического объекта Facebook» может предложить другую форму решения. Используйте код из учебника вместе с API Graph Facebook и его библиотекой PHP SDK.

... И старайтесь не использовать file_get_contents (если вы не готовы столкнуться с последствиями - см. File_get_contents против curl ).

moostring
источник
4

Вас беспокоит размер картинки профиля? во время реализации входа в систему с Facebook с использованием PHP. Мы покажем вам простой способ получить большое изображение профиля в 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);
}

Это вернет URL необработанного изображения аватара Facebook. Не стесняйтесь делать то, что вы хотите с ним тогда!

TFont
источник