it-swarm.com.ru

API Facebook - Как получить изображение профиля пользователя Facebook через API Facebook (не требуя от пользователя «Разрешить» приложение)

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

254
John Himmelman

Просто получите данные через это 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.

408
Sarfraz

Показывать:

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.

265
neiker

ОБНОВИТЬ:

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

Маленький

максимальная ширина 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
163
Gunnar Karlsson

Чтобы получить 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/

20
NaturalBornCamper

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

<?php

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

?>

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

19
Armand

Добавил это как комментарий к принятому ответу, но чувствовал, что заслуживает более длинного объяснения. Начиная примерно с апреля 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= ) однако выяснить стандартный идентификатор пользователя пользователя невозможно на основании только его профиля - ваш приложение должно заставить их одобрить взаимодействие с приложением, которое в моем случае использования (просто показывает изображение профиля рядом с их ссылкой на профиль FB) является излишним.

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

10
sckd

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

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

9
benjaminlotan

Рабочее 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
Xawier

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

Благодаря " 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
Gamlet

Я думал - может быть 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/

7
Erroid

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

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

6
moostring

Вас беспокоит размер картинки профиля? во время реализации входа в систему с 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/

4
sagar jethi

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

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

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

Вы можете получить URI профиля через онлайн инструмент поиска id Facebook

Вы также можете передать тип param с возможными значениями small, normal, large, square.

См. официальная документация

3
user2119554