Interfejs API Facebooka - Jak uzyskać zdjęcie profilowe użytkownika Facebooka poprzez interfejs API Facebooka (bez wymagania od użytkownika „Zezwolenia” na aplikację)

257

Pracuję nad CMS, który pobiera zdjęcie profilowe użytkownika z jego adresu URL na Facebooku (czyli http://facebook.com/users_unique_url ). Jak mogę to osiągnąć? Czy istnieje wywołanie API Faceboook, które pobiera adres URL obrazu profilu użytkownika bez konieczności zezwolenia aplikacji?

John Himmelman
źródło

Odpowiedzi:

409

Wystarczy pobrać dane przez ten adres URL :

http://graph.facebook.com/userid_here/picture

Zastąp userid_hereidentyfikator użytkownika, którego zdjęcie chcesz uzyskać. Możesz także użyć HTTPS.

Możesz użyć funkcji PHP file_get_contentsdo odczytania tego adresu URL i przetworzenia odzyskanych danych.

Ratunek:

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

Uwaga: W php.inimusisz upewnić się, że rozszerzenie OpenSSL jest włączone, aby używać file_get_contentsfunkcji PHP do odczytu tego adresu URL.

Sarfraz
źródło
73
Patrząc dalej na tę stronę, kolejną przydatną rzeczą może być ?type=largekwerenda, którą możesz dodać. Rekwizyty za wymyślenie o wiele lepszej odpowiedzi niż ekranowanie, które pisałem, BTW :).
Domenic,
6
Użyj, <img src="//graph.facebook.com/sarfraz.anees/picture" />jeśli zmieniasz pomiędzy HTTP i HTTPS ... protokół jest wykrywany przez przeglądarkę, a ostrzeżenia o mieszanej zawartości nie będą wyświetlane w HTTPS.
Chris Jacob
39
Należy podkreślić, że niektórzy użytkownicy NIE mają ustawionej nazwy użytkownika dla swojego konta FB. Gdy tak jest i próbujesz zaimplementować tę odpowiedź, otrzymasz domyślne zdjęcie profilowe FB, znak zapytania. Aby łatwo uniknąć tego problemu, użyj zamiast tego identyfikatora FB użytkownika.
Josh
7
Należy zauważyć, że w V2 interfejsu API wykresu nie działa to już przy użyciu nazwy użytkownika. Więc teraz potrzebujesz najpierw identyfikatora użytkownika i nie możesz już używać nazwy użytkownika, aby to uzyskać. Identyfikator użytkownika zmienia się również w zależności od aplikacji, więc będziesz musiał mieć jakieś odpowiednie uwierzytelnienie, aby pobrać identyfikator użytkownika, którego możesz użyć. Technicznie zdjęcie profilowe jest nadal publiczne i dostępne na graph.facebook.com/v2.2/4/picture?redirect=0, jednak ustalenie identyfikatora użytkownika (4 w poprzednim linku) wydaje się niemożliwe na podstawie profilu użytkownika. Stary adres URL wykresu nadal działa do kwietnia 2015 r.
sckd
36
Jest 2015 i otrzymuję (# 803) Nie mogę zapytać użytkowników o nazwę użytkownika (sarfraz.anees)
Santosh Kumar
268

Pokazywać:

50 x 50 pikseli

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

200 pikseli szerokości

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

Aby zapisać (używając PHP)

UWAGA: Nie używaj tego . Zobacz komentarz @ Foreever poniżej.

$img = file_get_contents('https://graph.facebook.com/'.$fid.'/picture?type=large');
$file = dirname(__file__).'/avatar/'.$fid.'.jpg';
file_put_contents($file, $img);

Gdzie $ fid to identyfikator użytkownika na Facebooku.

UWAGA: W przypadku obrazów oznaczonych jako „18+” będziesz potrzebować prawidłowego tokena dostępu od użytkownika 18+:

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

AKTUALIZACJA 2015:

Graph API v2.0 nie może być przeszukiwany przy użyciu nazw użytkowników, powinieneśuserId zawsze używać .

neiker
źródło
6
Oto więcej informacji na temat parametru type: „Możesz określić żądany rozmiar obrazu za pomocą argumentu type, który powinien być kwadratowy (50x50), mały (50 pikseli, zmienna wysokość), normalny (100 pikseli, zmienna wysokość ) i duże (szerokość około 200 pikseli, zmienna wysokość) ”Przez interfejs API Graph na Facebooku
3
Aby użyć tej metody, musisz ustawić enable_url_fopen na on. Dyrektywa allow_url_fopen jest domyślnie wyłączona. Powinieneś zdawać sobie sprawę z konsekwencji bezpieczeństwa dla włączenia dyrektywy allow_url_fopen. Skrypty PHP, które mogą uzyskiwać dostęp do zdalnych plików, są potencjalnie podatne na wstrzyknięcie dowolnego kodu. Gdy włączona jest dyrektywa allow_url_fopen, możesz pisać skrypty otwierające zdalne pliki tak, jakby były plikami lokalnymi.
Forever,
Wygląda na użyteczne, więc z góry wiwatuje, ale będąc o jeden poziom zbyt nowym, by zrozumieć, chciałbym wiedzieć, w jakim języku programowania to jest? Domyślam się, że PHP.
hello_there_andy
@hello_there_andy Tak! To PHP (właściwie pytanie jest oznaczone jako PHP i był to jedyny język, którego używam 4 lata temu)
neiker
7
W lipcu 2015 r. To już nie działa (błąd: „Nie można zapytać użytkowników o nazwę użytkownika”)
Flimm
164

AKTUALIZACJA :

Od końca sierpnia 2012 r. Interfejs API został zaktualizowany, aby umożliwić pobieranie zdjęć profilów użytkownika w różnych rozmiarach. Dodaj opcjonalne pola szerokości i wysokości jako parametry adresu URL:

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

gdzie WIDTHi jakie HEIGHTsą żądane wartości wymiarów.

Spowoduje to zwrócenie zdjęcia profilowego o minimalnym rozmiarze WIDTHx HEIGHTpodczas próby zachowania proporcji. Na przykład,

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

zwroty

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

ZAKOŃCZ AKTUALIZACJĘ

Aby uzyskać zdjęcie profilowe użytkownika, zadzwoń

https://graph.facebook.com/USER_ID/picture

gdzie USER_IDmoże być numer identyfikacyjny użytkownika lub nazwa użytkownika.

Aby uzyskać zdjęcie profilowe użytkownika o określonym rozmiarze, zadzwoń

https://graph.facebook.com/USER_ID/picture?type=SIZE

gdzie SIZEnależy zastąpić jednym ze słów

square
small
normal
large

w zależności od pożądanego rozmiaru.

To wywołanie zwróci adres URL do pojedynczego obrazu o rozmiarze zależnym od wybranego parametru typu.

Na przykład:

https://graph.facebook.com/USER_ID/picture?type=small

zwraca adres URL małej wersji obrazu.

Interfejs API określa tylko maksymalny rozmiar obrazów profilowych, a nie rzeczywisty rozmiar.

Plac:

maksymalna szerokość i wysokość 50 pikseli.

Mały

maksymalna szerokość 50 pikseli i maksymalna wysokość 150 pikseli.

Normalna

maksymalna szerokość 100 pikseli i maksymalna wysokość 300 pikseli.

Duży

maksymalna szerokość 200 pikseli i maksymalna wysokość 600 pikseli.

Jeśli zadzwonisz na domyślny identyfikator / zdjęcie USER, otrzymasz typ kwadratu.

WYJAŚNIENIE

Jeśli zadzwonisz (jak w powyższym przykładzie)

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

zwróci odpowiedź JSON, jeśli używasz jednej z metod żądania Facebook SDK . W przeciwnym razie zwróci sam obraz. Aby zawsze pobrać JSON, dodaj:

&redirect=false

tak:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
Gunnar Karlsson
źródło
Świetne wyjaśnienie, ale zwrócona wartość adresu URL, który podałeś („ graph.facebook.com/redbull/… ), odpowiada adresem URL obrazu w nagłówku lokalizacji („ Lokalizacja: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/… ). nie jako JSON jak {"data": {"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/... ", "width": 148, "height" : 117, „is_silhouette”: false}}
Gökhan Barış Aker
Nadal otrzymuję taką samą odpowiedź jak w mojej odpowiedzi. Możesz to wypróbować w Graph Explorer na Facebooku Developers na developers.facebook.com/tools/explorer. Wpisz „redbull / picture? Width = 140 & height = 110” i zobacz odpowiedź. Moja odpowiedź zakłada, że ​​wywołujesz to przy użyciu jednej z metod API / żądania Facebook SDK, która zwróci odpowiedź JSON.
Gunnar Karlsson
2
@GunnarKarlsson brakuje Ci &redirect=falsepowrotu danych JSON zamiast przekierowania do obrazu
andrewtweber
@andrewtweber wielkie dzięki. Do odpowiedzi dodałem wyjaśnienie.
Gunnar Karlsson,
3
Jest lipiec 2015 r. I to już nie działa. (błąd: „Nie można zapytać użytkowników o nazwę użytkownika”)
Flimm
20

Aby uzyskać adres URL obrazu, NIE zawartość binarną:

$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";

Musisz użyć swojego identyfikatora FACEBOOK, NIE NAZWA UŻYTKOWNIKA. Możesz dostać tam swój identyfikator na Facebooku:

http://findmyfbid.com/

NaturalBornCamper
źródło
1
Jest lipiec 2015 r. I to już nie działa (błąd: „Nie można zapytać użytkowników o nazwę użytkownika”)
Flimm
3
Źle zrozumiałeś, przyjacielu :) To twój identyfikator na Facebooku, a nie nazwa użytkownika findmyfbid.com
NaturalBornCamper
1
Najlepsze z tutaj. To szalone, zdecydowanie próbowałem uzyskać dane w ciele, a następnie dane pojawiają się w nagłówku @. @
Davuz
19

Prosty jednoliniowy kod do zapisania obrazu profilu w PEŁNYM rozmiarze na serwerze.

<?php

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

?>

Działa to tylko wtedy, gdy openssl jest włączony w php.ini.

Armand
źródło
Jest lipiec 2015 r. I to już nie działa (błąd: „Nie można zapytać użytkowników o nazwę użytkownika”)
Flimm
Tak, połączenia wer. 1.0 przestaną działać po 30 kwietnia 2015 r. Nie można uzyskać identyfikatora specyficznego dla aplikacji, chyba że użytkownik autoryzuje aplikację
Armand
10

Dodał to jako komentarz do zaakceptowanej odpowiedzi, ale uznał, że zasługuje na dłuższe wyjaśnienie. Począwszy od kwietnia 2015 r. Prawdopodobnie zostanie to podniesione kilka razy.

Począwszy od wersji V2 interfejsu API, zaakceptowana odpowiedź nie działa już przy użyciu nazwy użytkownika. Więc teraz potrzebujesz najpierw identyfikatora użytkownika i nie możesz już używać nazwy użytkownika, aby to uzyskać. Aby jeszcze bardziej skomplikować sprawy, ze względu na prywatność, Facebook zmienia teraz identyfikator użytkownika na aplikację (patrz https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ oraz https: //developers.facebook .com / docs / apps / upgrade / # upgradeading_v2_0_user_ids ), więc będziesz musiał mieć jakieś odpowiednie uwierzytelnienie, aby pobrać identyfikator użytkownika, którego możesz użyć. Technicznie zdjęcie profilowe jest nadal publiczne i dostępne pod adresem / userid / picture (patrz dokumenty na https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture i ten przykładowy użytkownik: http: //graph.facebook.com/v2.2/4/picture?redirect=0), jednak ustalenie standardowego identyfikatora użytkownika wydaje się niemożliwe na podstawie jego profilu - Twoja aplikacja musiałaby skłonić go do zatwierdzenia interakcji z aplikacją, która w moim przypadku (po prostu pokazując zdjęcie profilowe obok linku do profilu FB) jest nadmierna.

Jeśli ktoś wymyślił sposób, aby uzyskać zdjęcie profilowe na podstawie nazwy użytkownika, lub alternatywnie, jak uzyskać identyfikator użytkownika (nawet alternatywny) do pobrania zdjęcia profilowego, udostępnij! W międzyczasie stary adres URL wykresu nadal działa do kwietnia 2015 r.

sckd
źródło
9

Jednym ze sposobów jest użycie kodu Gamlet opublikowanego w jego odpowiedzi:

  • Zapisz to jako curl.php

  • Następnie w twoim pliku:

    require 'curl.php';
    
    $photo="https://graph.facebook.com/me/picture?access_token=" . $session['access_token'];
    $sample = new sfFacebookPhoto;
    $thephotoURL = $sample->getRealUrl($photo);
    echo $thephotoURL;

Pomyślałem, że to opublikuję, ponieważ zajęło mi to trochę czasu, aby dowiedzieć się o szczegółach ... Mimo że zdjęcia profilowe są publiczne, nadal musisz mieć token dostępu, aby go zdobyć, gdy go zwiniesz .

benjaminlotan
źródło
8

Jest na to sposób;)

Dzięki „ 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);
            }
        }
    }
Mała wioska
źródło
8

Działające rozwiązanie PHP (HTTP GET) od kwietnia 2015 r. (Bez zestawu SDK PHP 5):

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'];
}

Możesz zmienić „typ” w parametrze:

Plac:

maksymalna szerokość i wysokość 50 pikseli.

Mały

maksymalna szerokość 50 pikseli i maksymalna wysokość 150 pikseli.

Normalna

maksymalna szerokość 100 pikseli i maksymalna wysokość 300 pikseli.

Duży

maksymalna szerokość 200 pikseli i maksymalna wysokość 600 pikseli.

Xawier
źródło
7

Myślałem - może ID będzie użytecznym narzędziem. Za każdym razem, gdy użytkownik utworzy nowe konto, powinien otrzymać wyższy identyfikator. Poszukałem go i stwierdziłem, że istnieje metoda oszacowania daty utworzenia konta według ID, a Massoud Seifi z metadatascience.com zebrał kilka dobrych danych na ten temat.

Wpisz opis zdjęcia tutaj

Przeczytaj ten artykuł:

http://metadatascience.com/2013/03/11/inferring-facebook-account-creation-date-from-facebook-user-id/

A oto kilka identyfikatorów do pobrania:

http://metadatascience.com/2013/03/14/lookup-table-for-inferring-facebook-account-creation-date-from-facebook-user-id/

Erroid
źródło
1
Jak to odpowiada na pytanie?
Flimm,
4

Czy martwi Cię rozmiar zdjęcia profilowego? w momencie wdrażania logowania do Facebooka przy użyciu PHP. Pokażemy ci prosty sposób na uzyskanie dużego zdjęcia profilowego w Facebook PHP SDK. Możesz również uzyskać obraz o niestandardowym rozmiarze profilu na Facebooku.

Ustaw wymiar zdjęcia profilowego, używając następującego wiersza kodu.

$ userProfile = $ facebook-> api ('/ me? fields = picture.width (400) .height (400)');

sprawdź ten post: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

Sagar Jethi
źródło
3

@NaturalBornCamper,

Niezły kod! Oto funkcja czystego kodu dla takiego procesu!

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

Spowoduje to zwrócenie surowego adresu URL obrazu awatara na Facebooku. W takim razie możesz robić z nim, co chcesz!

tfont
źródło