API di Facebook - Come posso ottenere l'immagine del profilo di un utente di Facebook tramite l'API di Facebook (senza richiedere all'utente di "consentire" l'applicazione)


Risposte:


409

Basta recuperare i dati tramite questo URL :

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

Sostituisci userid_herecon l'id dell'utente di cui vuoi ottenere la foto. Puoi anche usare HTTPS.

Puoi usare la file_get_contentsfunzione di PHP per leggere quell'URL ed elaborare i dati recuperati.

Risorsa:

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

Nota: in php.ini, devi assicurarti che l' estensione OpenSSL sia abilitata per usare la file_get_contentsfunzione di PHP per leggere quell'URL.


73
Guardando oltre quella pagina, un'altra cosa utile potrebbe essere la ?type=largequerystring che puoi aggiungere. Puntelli per avere una risposta decisamente migliore rispetto allo screen-scraping che stavo scrivendo, BTW :).
Domenic,

6
Usa <img src="//graph.facebook.com/sarfraz.anees/picture" />se cambi tra HTTP e HTTPS ... il protocollo viene rilevato dal browser e non riceverai avvisi di contenuto misto su HTTPS.
Chris Jacob,

39
Va sottolineato, alcuni utenti NON hanno un nome utente impostato per il loro account FB. In questo caso, e stai tentando di implementare questa risposta, riceverai l'immagine del profilo predefinito di FB, il punto interrogativo. Per evitare facilmente questo problema, utilizzare invece l'ID FB dell'utente.
Josh,

7
Va notato che in V2 del grafico api questo non funziona più usando un nome utente. Quindi ora è necessario prima l'ID utente e non è più possibile utilizzare un nome utente per ottenerlo. Anche Userid cambia per app, quindi dovrai avere una sorta di autenticazione corretta per recuperare un userid che puoi usare. Tecnicamente la foto del profilo è ancora pubblica e disponibile su graph.facebook.com/v2.2/4/picture?redirect=0 ma capire l' id utente (4 nel link precedente) sembra impossibile basandosi solo sul profilo dell'utente. L'URL del vecchio grafico funziona ancora fino ad aprile 2015.
sckd,

36
È il 2015 e sto ottenendo (# 803) Impossibile interrogare gli utenti con il loro nome utente (sarfraz.anees)
Santosh Kumar,

268

Mostrare:

50x50 pixel

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

200 pixel di larghezza

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

Per salvare (usando PHP)

NOTA: non usare questo . Vedi il commento di @ Foreever di seguito.

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

Dove $ fid è il tuo ID utente su Facebook.

NOTA: nel caso di immagini contrassegnate come "18+", sarà necessario un token di accesso valido da un utente 18+:

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

AGGIORNAMENTO 2015:

L'API Graph v2.0 non può essere interrogata utilizzando nomi utente, è necessario utilizzarla userIdsempre.


6
Ecco ulteriori informazioni sul parametro type: "Puoi specificare la dimensione dell'immagine desiderata con l'argomento type, che dovrebbe essere uno di quadrato (50x50), piccolo (50 pixel di larghezza, altezza variabile), normale (100 pixel di larghezza, altezza variabile ) e grande (circa 200 pixel di larghezza, altezza variabile) "Tramite l' API Graph su Facebook

3
Per utilizzare questo metodo, devi attivare allow_url_fopen. La direttiva allow_url_fopen è disabilitata per impostazione predefinita. Dovresti essere consapevole delle implicazioni di sicurezza dell'abilitazione della direttiva allow_url_fopen. Gli script PHP che possono accedere ai file remoti sono potenzialmente vulnerabili all'iniezione di codice arbitraria. Quando la direttiva allow_url_fopen è abilitata, è possibile scrivere script che aprono file remoti come se fossero file locali.
sempre il

Sembra utile, quindi esulta in anticipo, ma essendo un livello troppo nuovo per capire mi piacerebbe sapere in quale linguaggio di programmazione si trova? La mia ipotesi è PHP.
hello_there_andy,

@hello_there_andy Yep! È PHP (in realtà la domanda è contrassegnata come PHP ed era l'unica lingua che uso 4 anni fa)
neiker

7
A luglio 2015 questo non funziona più (errore: "Impossibile interrogare gli utenti con il loro nome utente")
Flimm

164

AGGIORNAMENTO :

A partire dalla fine di agosto 2012, l'API è stata aggiornata per consentire di recuperare le immagini del profilo dell'utente in varie dimensioni. Aggiungi i campi opzionali di larghezza e altezza come parametri URL:

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

dove WIDTHe HEIGHTsono i valori delle dimensioni richiesti.

Ciò restituirà un'immagine del profilo con una dimensione minima di WIDTHx HEIGHTdurante il tentativo di preservare le proporzioni. Per esempio,

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

ritorna

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

AGGIORNAMENTO FINE

Per ottenere l'immagine del profilo di un utente, chiama

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

dove USER_IDpuò essere il numero ID utente o il nome utente.

Per ottenere un'immagine del profilo utente di una dimensione specifica, chiama

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

dove SIZEdovrebbe essere sostituito con una delle parole

square
small
normal
large

a seconda delle dimensioni desiderate.

Questa chiamata restituirà un URL a una singola immagine con le sue dimensioni in base al parametro del tipo scelto.

Per esempio:

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

restituisce un URL a una versione ridotta dell'immagine.

L'API specifica solo la dimensione massima per le immagini del profilo, non la dimensione effettiva.

Piazza:

larghezza e altezza massima di 50 pixel.

Piccolo

larghezza massima di 50 pixel e altezza massima di 150 pixel.

Normale

larghezza massima di 100 pixel e altezza massima di 300 pixel.

Grande

larghezza massima di 200 pixel e altezza massima di 600 pixel.

Se chiami il USER_ID / immagine predefinito ottieni il tipo quadrato.

UNA PRECISAZIONE

Se chiami (come da esempio sopra)

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

restituirà una risposta JSON se si utilizza uno dei metodi di richiesta degli SDK di Facebook . Altrimenti restituirà l'immagine stessa. Per recuperare sempre JSON, aggiungere:

&redirect=false

così:

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

Grande spiegazione, ma il valore di ritorno dell'URL che hai fornito (' graph.facebook.com/redbull/… ) risponde con l'URL dell'immagine nell'intestazione della posizione (' Posizione: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/… ). non come un JSON come {"data": {"url": " fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4/c0.19.180.142/… ", "larghezza": 148, "altezza" : 117, "is_silhouette": false}}
Gökhan Barış Aker

Ricevo ancora la stessa risposta della mia risposta. Puoi provarlo in Graph Explorer su Facebook Developers all'indirizzo developers.facebook.com/tools/explorer. Inserisci 'redbull / picture? Width = 140 & height = 110' e vedi la risposta. La mia risposta presuppone che tu stia chiamando questo utilizzando uno dei metodi di richiesta / API dell'SDK di Facebook, che restituirà una risposta JSON.
Gunnar Karlsson,

2
@GunnarKarlsson ti manca il &redirect=falseper restituire i dati JSON invece di reindirizzare all'immagine
andrewtweber

@andrewtweber grazie mille. Ho aggiunto un chiarimento alla risposta.
Gunnar Karlsson,

3
È luglio 2015 e questo non funziona più. (errore: "Impossibile interrogare gli utenti con il loro nome utente")
Flimm

20

Per ottenere l'URL dell'immagine, NON il contenuto binario:

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

Devi usare il tuo ID FACEBOOK, NON USERNAME. Puoi ottenere il tuo ID Facebook lì:

http://findmyfbid.com/


1
È luglio 2015 e questo non funziona più (errore: "Impossibile interrogare gli utenti con il loro nome utente")
Flimm

3
Hai tutto sbagliato amico :) E 'il tuo ID di Facebook, non il nome utente findmyfbid.com
NaturalBornCamper

1
Il meglio di qui. È assolutamente pazzesco, ho provato a ottenere i dati nel corpo e poi i dati compaiono nell'intestazione @. @
Davuz

19

Semplice codice a una riga per salvare l'immagine del profilo di dimensione COMPLETA sul tuo server.

<?php

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

?>

Funzionerà solo se openssl è abilitato in php.ini.


È luglio 2015 e questo non funziona più (errore: "Impossibile interrogare gli utenti con il loro nome utente")
Flimm

Sì, le chiamate v1.0 smetteranno di funzionare dopo il 30 aprile 2015. Non è possibile ottenere un ID specifico dell'applicazione a meno che l'utente non abbia autorizzato l'app
Armand,

10

Aggiunto questo come commento alla risposta accettata, ma sentivo che meritava una spiegazione più lunga. A partire da aprile 2015 questo sarà probabilmente sollevato alcune volte.

A partire da V2 del grafico api la risposta accettata non funziona più usando un nome utente. Quindi ora è necessario prima l'ID utente e non è più possibile utilizzare un nome utente per ottenerlo. Per complicare ulteriormente le cose, per motivi di privacy, Facebook sta ora cambiando la userid per app (vedi https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ e https: //developers.facebook .com / docs / apps / upgrading / # upgrading_v2_0_user_ids ), quindi dovrai avere una sorta di autenticazione adeguata per recuperare un userid che puoi usare. Tecnicamente la foto del profilo è ancora pubblica e disponibile su / userid / picture (vedi i documenti su https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture e questo esempio utente: http: //graph.facebook.com/v2.2/4/picture?redirect=0) tuttavia è impossibile capire l'id utente standard di un utente in base al proprio profilo: la tua app dovrebbe farli approvare l'interazione con l'app che per il mio caso d'uso (mostrare solo un'immagine del profilo accanto al link del profilo FB) è eccessiva.

Se qualcuno ha trovato un modo per ottenere l'immagine del profilo in base al nome utente o, in alternativa, come ottenere un userid (anche alternato) da utilizzare per recuperare un'immagine del profilo, condividi! Nel frattempo, l'URL del vecchio grafico funziona ancora fino ad aprile 2015.


9

Un modo è usare il codice Gamlet pubblicato nella sua risposta:

  • Salva come curl.php

  • Quindi nel tuo file:

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

Ho pensato di postare questo, perché mi ci è voluto un po 'di tempo per capire i dettagli ... Anche se le foto del profilo sono pubbliche, devi comunque avere un token di accesso lì per ottenerlo quando lo arriccia .


8

C'è modo di farlo;)

Grazie a " 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

Soluzione PHP (HTTP GET) funzionante da aprile 2015 (senza 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'];
}

Puoi cambiare 'tipo' nel parametro:

Piazza:

larghezza e altezza massima di 50 pixel.

Piccolo

larghezza massima di 50 pixel e altezza massima di 150 pixel.

Normale

larghezza massima di 100 pixel e altezza massima di 300 pixel.

Grande

larghezza massima di 200 pixel e altezza massima di 600 pixel.


7

Stavo pensando: forse l' ID sarà uno strumento utile. Ogni volta che un utente crea un nuovo account, dovrebbe ottenere un ID superiore. Ho cercato su Google e ho scoperto che esiste un metodo per stimare la data di creazione dell'account tramite ID e Massoud Seifi di metadatascience.com ha raccolto alcuni dati positivi al riguardo.

Inserisci qui la descrizione dell'immagine

Leggi questo articolo:

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

E qui ci sono alcuni ID da scaricare:

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


1
Come risponde alla domanda?
Flimm,


4

Sei preoccupato per le dimensioni dell'immagine del profilo? al momento dell'implementazione del login con Facebook tramite PHP. Ti mostreremo il modo semplice per ottenere un'immagine di profilo di grandi dimensioni in Facebook PHP SDK. Inoltre, puoi ottenere l'immagine di dimensioni personalizzate del profilo Facebook.

Imposta la dimensione dell'immagine del profilo usando la seguente riga di codice.

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

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


3

@NaturalBornCamper,

Bel codice! Ecco una funzione di codice definita per tale processo!

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

Ciò restituirà la cruda Facebook URL avatar immagine. Sentiti libero di fare quello che vuoi con esso allora!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.