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

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

14 ответов


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


показать:

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+", Вам понадобится действительный access_token от пользователя 18+:

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

обновление 2015:

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


обновление:

начиная с конца августа 2012, API был обновлен, чтобы позволить вам получать фотографии профиля пользователя в различных размерах. Добавьте необязательные поля width и height в качестве параметров 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 SDKs. В противном случае он вернет себе имидж. Чтобы всегда извлекать JSON, добавьте:

&redirect=false

вот так:

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

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


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

<?php

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

?>

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


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

по состоянию на V2 api graph принятый ответ больше не работает с использованием имени пользователя. Итак, теперь вам сначала нужен userid, и вы больше не можете использовать имя пользователя для этого. Чтобы еще больше усложнить ситуацию, по соображениям конфиденциальности Facebook теперь меняет userid на приложение (см. 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) однако выяснение стандартного userid пользователя кажется невозможным только на основе их профиля - ваше приложение должно будет заставить их одобрить взаимодействие с приложением, которое для моего случая использования (просто показ профиля рядом с их ссылкой профиля FB) является излишним.

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


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

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


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

спасибо "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);
            }
        }
    }

рабочее решение 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 пикселов.


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


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

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


вы обеспокоены размером изображения профиля? на момент реализации логин с Facebook с использованием PHP. Мы покажем вам простой способ получить изображение профиля большого размера в Facebook PHP SDK. Кроме того, вы можете получить изображение пользовательского размера профиля Facebook.

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

$userProfile = $facebook - > api ('/me?поля=картинка.ширина(400).высота(400)');

проверить это post:http://www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/


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


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

вы можете получить URI профиля через онлайн facebook id finder инструмент

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

передать официальная документация