Facebook API - Как получить изображение профиля пользователя Facebook через API Facebook (без необходимости "Разрешить" приложение)

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

Ответ 1

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

Ответ 2

Показывать:

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.

Ответ 3

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
      }
   }

END UPDATE

Чтобы получить изображение профиля пользователя, вызовите

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 пикселей.

Normal

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

Большой

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

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

РАЗЪЯСНЕНИЕ

Если вы вызываете (как показано выше)

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

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

&redirect=false

так:

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

Ответ 4

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

Ответ 5

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

<?php

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

?>

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

Ответ 6

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

Как и в случае V2 графика api, принятый ответ больше не работает с использованием имени пользователя. Итак, теперь вам нужно сначала указать userid, и вы больше не можете использовать имя пользователя, чтобы получить это. Чтобы еще больше усложнить ситуацию, по соображениям конфиденциальности Facebook теперь меняет идентификатор пользователя для каждого приложения (см. https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ и https://developers.facebook.com/docs/apps/upgrading/#upgrading_v2_0_user_ids), поэтому для получения идентификатора пользователя, который вы можете использовать, вам потребуется некоторая надлежащая аутентификация. Технически профиль pic по-прежнему открыт и доступен на /userid/picture (см. Docs на https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture и в этом примере пользователь: http://graph.facebook.com/v2.2/4/picture?redirect=0), однако выяснение пользовательского стандартного идентификатора пользователя кажется невозможным, основываясь только на их профиле - ваше приложение должно заставить их одобрить взаимодействие с приложением, которое для моего варианта использования (просто показывая рисунок профиля рядом с их FB) является излишним.

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

Ответ 7

Один из способов - использовать в своем ответе код Gamlet:

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

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

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

Ответ 9

Работа с 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 пикселей.

Normal

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

Большой

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

Ответ 10

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

Ответ 12

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

Ответ 13

@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 изображения изображения raw. Не стесняйтесь делать то, что вы хотите с ним!