Facebook-API - Wie erhalte ich das Profilbild eines Facebook-Benutzers über die Facebook-API (ohne dass der Benutzer die Anwendung zulassen muss)?

257

Ich arbeite an einem CMS , das das Profilbild eines Benutzers von seiner Facebook- URL abruft ( dh http://facebook.com/users_unique_url ). Wie kann ich das erreichen? Gibt es einen Faceboook-API-Aufruf, der die Profilbild-URL eines Benutzers abruft, ohne dass der Benutzer die Anwendung zulassen muss ?

John Himmelman
quelle

Antworten:

409

Rufen Sie einfach die Daten über diese URL ab :

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

Ersetzen Sie userid_heredurch die ID des Benutzers, von dem Sie das Foto erhalten möchten. Sie können auch HTTPS verwenden.

Sie können die PHP- file_get_contentsFunktion verwenden, um diese URL zu lesen und die abgerufenen Daten zu verarbeiten.

Ressource:

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

Hinweis: In php.inimüssen Sie sicherstellen, dass die OpenSSL- Erweiterung aktiviert ist, um die file_get_contentsFunktion von PHP zum Lesen dieser URL zu verwenden.

Sarfraz
quelle
73
Wenn Sie diese Seite weiter ?type=largedurchsehen , könnte eine weitere nützliche Sache der Querystring sein, den Sie hinzufügen können. Requisiten für eine viel bessere Antwort als das Screen-Scraping, das ich geschrieben habe, übrigens :).
Domenic
6
Verwenden <img src="//graph.facebook.com/sarfraz.anees/picture" />Sie diese Option, wenn Sie zwischen HTTP und HTTPS wechseln. Das Protokoll wird vom Browser erkannt und es werden keine Warnungen zu gemischten Inhalten auf HTTPS angezeigt.
Chris Jacob
39
Es sollte betont werden, dass einige Benutzer KEINEN Benutzernamen für ihr FB-Konto festgelegt haben. Wenn dies der Fall ist und Sie versuchen, diese Antwort zu implementieren, erhalten Sie das Standardprofilbild von FB, das Fragezeichen. Verwenden Sie stattdessen die FB-ID des Benutzers, um dieses Problem leicht zu vermeiden.
Josh
7
Es ist zu beachten, dass dies in V2 der Grafik-API nicht mehr mit einem Benutzernamen funktioniert. Jetzt benötigen Sie zuerst die Benutzer-ID, und Sie können keinen Benutzernamen mehr verwenden, um diese zu erhalten. Die Benutzer-IDs ändern sich auch pro App, sodass Sie über eine ordnungsgemäße Authentifizierung verfügen müssen, um eine Benutzer-ID abzurufen, die Sie verwenden können. Technisch gesehen ist das Profilbild immer noch öffentlich und unter graph.facebook.com/v2.2/4/picture?redirect=0 verfügbar. Es scheint jedoch unmöglich, die Benutzer-ID (4 im vorherigen Link) anhand des Benutzerprofils herauszufinden. Die alte Grafik-URL funktioniert noch bis April 2015.
sckd
36
Es ist 2015 und ich bekomme (# 803) Benutzer können nicht nach ihrem Benutzernamen (sarfraz.anees) abgefragt werden
Santosh Kumar
268

Zeigen:

50x50 Pixel

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

200 Pixel Breite

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

Speichern (mit PHP)

HINWEIS: Verwenden Sie dies nicht . Siehe den Kommentar von @ Foreever unten.

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

Wobei $ fid Ihre Benutzer-ID auf Facebook ist.

HINWEIS: Bei Bildern, die als "18+" gekennzeichnet sind, benötigen Sie ein gültiges access_token von einem 18+ Benutzer:

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

UPDATE 2015:

Die Graph API v2.0 kann nicht mit Benutzernamen abgefragt werden. Sie sollten sie userIdimmer verwenden.

Neiker
quelle
6
Weitere Informationen zum Typparameter: "Sie können die gewünschte Bildgröße mit dem Typargument angeben, das quadratisch (50 x 50), klein (50 Pixel breit, variable Höhe) und normal (100 Pixel breit, variable Höhe) sein soll ) und groß (ca. 200 Pixel breit, variable Höhe) "Via Graph API auf Facebook
3
Um diese Methode zu verwenden, müssen Sie allow_url_fopen auf on setzen. Die Anweisung allow_url_fopen ist standardmäßig deaktiviert. Sie sollten sich der Sicherheitsauswirkungen der Aktivierung der Direktive allow_url_fopen bewusst sein. PHP-Skripte, die auf Remote-Dateien zugreifen können, sind möglicherweise anfällig für die willkürliche Code-Injektion. Wenn die Direktive allow_url_fopen aktiviert ist, können Sie Skripts schreiben, die entfernte Dateien so öffnen, als wären sie lokale Dateien.
foreever
Sieht nützlich aus, also Prost im Voraus, aber da ich eine Stufe zu neu bin, um zu verstehen, würde ich gerne wissen, in welcher Programmiersprache dies ist? Meine Vermutung ist PHP.
hallo_there_andy
@hello_there_andy Ja! Es ist PHP (eigentlich ist die Frage als PHP markiert und es war die einzige Sprache, die ich vor 4 Jahren
benutzte
7
Im Juli 2015 funktioniert dies nicht mehr (Fehler: "Benutzer können nicht nach ihrem Benutzernamen abgefragt werden")
Flimm
164

UPDATE :

Ab Ende August 2012 wurde die API aktualisiert, damit Sie Benutzerprofilbilder in verschiedenen Größen abrufen können. Fügen Sie die optionalen Felder für Breite und Höhe als URL-Parameter hinzu:

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

wo WIDTHund HEIGHTsind Ihre gewünschten Dimensionswerte.

Dadurch wird ein Profilbild mit einer Mindestgröße von WIDTHx zurückgegeben, HEIGHTwährend versucht wird, das Seitenverhältnis beizubehalten. Beispielsweise,

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

kehrt zurück

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

Rufen Sie an, um das Profilbild eines Benutzers zu erhalten

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

Dabei USER_IDkann es sich um die Benutzer-ID oder den Benutzernamen handeln.

Rufen Sie an, um ein Benutzerprofilbild einer bestimmten Größe zu erhalten

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

wo SIZEsollte durch eines der Wörter ersetzt werden

square
small
normal
large

abhängig von der gewünschten Größe.

Dieser Aufruf gibt eine URL zu einem einzelnen Bild zurück, deren Größe auf dem von Ihnen gewählten Typparameter basiert.

Beispielsweise:

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

Gibt eine URL zu einer kleinen Version des Bildes zurück.

Die API gibt nur die maximale Größe für Profilbilder an, nicht die tatsächliche Größe.

Quadrat:

maximale Breite und Höhe von 50 Pixel.

Klein

maximale Breite von 50 Pixel und maximale Höhe von 150 Pixel.

Normal

maximale Breite von 100 Pixel und maximale Höhe von 300 Pixel.

Groß

maximale Breite von 200 Pixel und maximale Höhe von 600 Pixel.

Wenn Sie die Standard-USER_ID / das Standardbild aufrufen, erhalten Sie den quadratischen Typ.

KLÄRUNG

Wenn Sie anrufen (wie im obigen Beispiel)

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

Es wird eine JSON- Antwort zurückgegeben, wenn Sie eine der Anforderungsmethoden für Facebook SDKs verwenden . Andernfalls wird das Bild selbst zurückgegeben. Fügen Sie Folgendes hinzu, um den JSON immer abzurufen:

&redirect=false

wie so:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
Gunnar Karlsson
quelle
Gute Erklärung, aber der von Ihnen angegebene Rückgabewert der URL (' graph.facebook.com/redbull/… ) antwortet mit der Bild-URL im Speicherort-Header (' Standort: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4) /c0.19.180.142/… ). nicht als JSON wie {"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
Ich bekomme immer noch die gleiche Antwort wie in meiner Antwort. Sie können es im Graph Explorer auf Facebook Developers unter developer.facebook.com/tools/explorer ausprobieren. Geben Sie 'redbull / picture? Width = 140 & height = 110' ein und sehen Sie die Antwort. In meiner Antwort wird davon ausgegangen, dass Sie dies mit einer der API- / Anforderungsmethoden von Facebook SDKs aufrufen, die eine JSON-Antwort zurückgeben.
Gunnar Karlsson
2
@ GunnarKarlsson Sie vermissen die &redirect=false, um die JSON-Daten zurückzugeben, anstatt zum Bild umzuleiten
andrewtweber
@andrewtweber vielen Dank. Ich habe der Antwort eine Klarstellung hinzugefügt.
Gunnar Karlsson
3
Es ist Juli 2015 und das funktioniert nicht mehr. (Fehler: "Benutzer können nicht nach ihrem Benutzernamen abgefragt werden")
Flimm
20

So erhalten Sie die Bild-URL, NICHT binären Inhalt:

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

Sie müssen Ihre FACEBOOK-ID verwenden, NICHT USERNAME. Dort können Sie Ihre Facebook-ID abrufen:

http://findmyfbid.com/

NaturalBornCamper
quelle
1
Es ist Juli 2015 und dies funktioniert nicht mehr (Fehler: "Benutzer können nicht nach ihrem Benutzernamen abgefragt werden")
Flimm
3
Du hast alles falsch Freund :) Es ist deine Facebook ID, nicht Benutzername findmyfbid.com
NaturalBornCamper
1
Das Beste von hier. Es ist definitiv verrückt, ich habe versucht, Daten in den Körper zu bekommen und dann erscheinen die Daten in der Kopfzeile @. @
Davuz
19

Einfacher einzeiliger Code zum Speichern des Profilbilds in voller Größe auf Ihrem Server.

<?php

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

?>

Dies funktioniert nur, wenn openssl in der php.ini aktiviert ist.

Armand
quelle
Es ist Juli 2015 und dies funktioniert nicht mehr (Fehler: "Benutzer können nicht nach ihrem Benutzernamen abgefragt werden")
Flimm
Ja, v1.0-Anrufe funktionieren nach dem 30. April 2015 nicht mehr. Sie können keine anwendungsspezifische ID erhalten, es sei denn, der Benutzer hat Ihre App autorisiert
Armand
10

Fügte dies als Kommentar zur akzeptierten Antwort hinzu, hielt es jedoch für eine längere Erklärung. Ab etwa April 2015 wird dies wahrscheinlich einige Male angesprochen.

Ab V2 der Grafik-API funktioniert die akzeptierte Antwort nicht mehr mit einem Benutzernamen. Jetzt benötigen Sie zuerst die Benutzer-ID, und Sie können keinen Benutzernamen mehr verwenden, um diese zu erhalten. Um die Angelegenheit aus Datenschutzgründen weiter zu verkomplizieren, ändert Facebook jetzt die Benutzer- IDs pro App (siehe https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ und https://developers.facebook) .com / docs / apps / upgrade / # upgrade_v2_0_user_ids ), sodass Sie über eine ordnungsgemäße Authentifizierung verfügen müssen, um eine Benutzer-ID abzurufen, die Sie verwenden können. Technisch gesehen ist das Profilbild immer noch öffentlich und unter / userid / picture verfügbar (siehe Dokumente unter https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture) und dieses Beispielbenutzer: http: //graph.facebook.com/v2.2/4/picture?redirect=0) Es scheint jedoch unmöglich, die Standardbenutzer-ID eines Benutzers nur anhand seines Profils herauszufinden. Ihre App müsste sie dazu bringen, die Interaktion mit der App zu genehmigen, was für meinen Anwendungsfall (nur ein Profilbild neben ihrem FB-Profillink anzeigen) übertrieben ist.

Wenn jemand einen Weg gefunden hat, um das Profilbild basierend auf dem Benutzernamen zu erhalten, oder alternativ, wie man eine Benutzer-ID (auch eine alternative) zum Abrufen eines Profilbilds verwendet, teilen Sie diese bitte mit! In der Zwischenzeit funktioniert die alte Grafik-URL noch bis April 2015.

sckd
quelle
9

Eine Möglichkeit besteht darin, den in seiner Antwort angegebenen Code Gamlet zu verwenden :

  • Speichern Sie es als curl.php

  • Dann in Ihrer Datei:

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

Ich dachte, ich würde dies posten, weil ich ein bisschen Zeit gebraucht habe, um die Einzelheiten herauszufinden ... Auch wenn Profilbilder öffentlich sind, müssen Sie immer noch einen Zugriffstoken haben, um sie zu erhalten, wenn Sie sie einrollen .

Benjaminlotan
quelle
8

Es gibt einen Weg das zu tun;)

Vielen Dank an " 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);
            }
        }
    }
Weiler
quelle
8

Funktionierende PHP (HTTP GET) -Lösung ab April 2015 (ohne 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'];
}

Sie können 'type' in parametr ändern:

Quadrat:

maximale Breite und Höhe von 50 Pixel.

Klein

maximale Breite von 50 Pixel und maximale Höhe von 150 Pixel.

Normal

maximale Breite von 100 Pixel und maximale Höhe von 300 Pixel.

Groß

maximale Breite von 200 Pixel und maximale Höhe von 600 Pixel.

Xawier
quelle
7

Ich dachte - vielleicht ist ID ein nützliches Werkzeug. Jedes Mal, wenn ein Benutzer ein neues Konto erstellt, sollte er eine höhere ID erhalten. Ich habe gegoogelt und festgestellt, dass es eine Methode gibt, um das Kontoerstellungsdatum anhand der ID zu schätzen, und Massoud Seifi von metadatascience.com hat einige gute Daten darüber gesammelt.

Geben Sie hier die Bildbeschreibung ein

Lesen Sie diesen Artikel:

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

Und hier sind einige IDs zum Herunterladen:

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

Erroid
quelle
1
Wie beantwortet dies die Frage?
Flimm
4

Sind Sie besorgt über die Größe des Profilbildes? zum Zeitpunkt der Implementierung der Anmeldung bei Facebook mit PHP. Wir zeigen Ihnen den einfachen Weg, um ein großes Profilbild im Facebook PHP SDK zu erhalten. Sie können auch das benutzerdefinierte Bild des Facebook-Profils erhalten.

Stellen Sie die Profilbildgröße mithilfe der folgenden Codezeile ein.

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

Überprüfen Sie diesen Beitrag: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

Sagar Jethi
quelle
3

@NaturalBornCamper,

Schöner Code! Hier ist eine Clean-Cut-Code-Funktion für einen solchen Prozess!

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

Dies gibt die rohe Facebook-Avatar-Bild-URL zurück. Dann können Sie damit machen, was Sie wollen!

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

Sie können die Profil-URI über das Online-Tool zur Suche nach Facebook-IDs abrufen

Sie können den Typparameter auch mit möglichen Werten klein, normal, groß, quadratisch übergeben.

Siehe die offizielle Dokumentation

user2119554
quelle