API Facebook - Comment puis-je obtenir l'image de profil d'un utilisateur Facebook via l'API Facebook (sans obliger l'utilisateur à «autoriser» l'application)

257

Je travaille sur un CMS qui récupère l'image de profil d'un utilisateur à partir de son URL Facebook (c'est-à-dire http://facebook.com/users_unique_url ). Comment puis-je accomplir cela? Existe-t-il un appel d'API Faceboook qui récupère l'URL de l'image de profil d'un utilisateur sans que l'utilisateur ait besoin d' autoriser l'application?

John Himmelman
la source

Réponses:

409

Récupérez simplement les données via cette URL :

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

Remplacez userid_herepar l'ID de l'utilisateur dont vous souhaitez obtenir la photo. Vous pouvez également utiliser HTTPS également.

Vous pouvez utiliser la file_get_contentsfonction PHP pour lire cette URL et traiter les données récupérées.

Ressource:

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

Remarque: Dans php.ini, vous devez vous assurer que l' extension OpenSSL est activée pour utiliser la file_get_contentsfonction de PHP pour lire cette URL.

Sarfraz
la source
73
En parcourant cette page plus loin, une autre chose utile pourrait être la ?type=largechaîne de requête que vous pouvez ajouter. Accessoires pour trouver une réponse bien meilleure que le grattage d'écran que je tapais, BTW :).
Domenic
6
À utiliser <img src="//graph.facebook.com/sarfraz.anees/picture" />si vous changez entre HTTP et HTTPS ... le protocole est détecté par le navigateur et vous n'obtiendrez pas d'avertissements de contenu mixtes sur HTTPS.
Chris Jacob
39
Il convient de souligner que certains utilisateurs n'ont PAS de nom d'utilisateur défini pour leur compte FB. Lorsque c'est le cas et que vous essayez d'implémenter cette réponse, vous recevrez l'image de profil par défaut de FB, le point d'interrogation. Pour éviter facilement ce problème, utilisez plutôt l'ID FB de l'utilisateur.
Josh
7
Il convient de noter que dans la version 2 de l'API du graphique, cela ne fonctionne plus en utilisant un nom d'utilisateur. Alors maintenant, vous avez d'abord besoin de l'ID utilisateur et vous ne pouvez plus utiliser de nom d'utilisateur pour l'obtenir. L'ID utilisateur change également par application, vous devrez donc avoir une sorte d'authentification appropriée pour récupérer un ID utilisateur que vous pouvez utiliser. Techniquement, la photo du profil est toujours publique et disponible sur graph.facebook.com/v2.2/4/picture?redirect=0, mais déterminer l'ID utilisateur (4 dans le lien précédent) semble impossible en se basant uniquement sur le profil de l'utilisateur. L'ancienne URL du graphique fonctionne toujours jusqu'en avril 2015.
sckd
36
Nous sommes en 2015 et je reçois (# 803) Impossible d'interroger les utilisateurs par leur nom d'utilisateur (sarfraz.anees)
Santosh Kumar
268

Montrer:

50x50 pixels

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

200 pixels de largeur

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

Pour enregistrer (en utilisant PHP)

REMARQUE: ne l'utilisez pas . Voir le commentaire de @ Foreever ci-dessous.

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

Où $ fid est votre identifiant sur Facebook.

REMARQUE: dans le cas d'images marquées "18+", vous aurez besoin d'un access_token valide d'un utilisateur 18+:

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

MISE À JOUR 2015:

Graphique v2.0 API ne peut être trouvée en utilisant les noms d' utilisateur, vous devez utiliser userIdtoujours.

neiker
la source
6
Voici plus d'informations sur le paramètre type: "Vous pouvez spécifier la taille d'image souhaitée avec l'argument type, qui doit être l'un des carrés (50x50), petit (50 pixels de large, hauteur variable), normal (100 pixels de large, hauteur variable ), et grand (environ 200 pixels de large, hauteur variable) "via l' API Graph sur Facebook
3
Pour utiliser cette méthode, vous devez activer allow_url_fopen. La directive allow_url_fopen est désactivée par défaut. Vous devez être conscient des implications de sécurité de l'activation de la directive allow_url_fopen. Les scripts PHP qui peuvent accéder aux fichiers distants sont potentiellement vulnérables à l'injection de code arbitraire. Lorsque la directive allow_url_fopen est activée, vous pouvez écrire des scripts qui ouvrent des fichiers distants comme s'il s'agissait de fichiers locaux.
Foreever
Semble utile, donc applaudit à l'avance, mais étant un niveau trop nouveau pour comprendre, j'aimerais savoir dans quel langage de programmation il s'agit? Ma conjecture est PHP.
hello_there_andy
@hello_there_andy Yep! C'est PHP (en fait, la question est étiquetée comme PHP et c'était le seul langage que j'utilise il y a 4 ans)
neiker
7
En juillet 2015, cela ne fonctionne plus (erreur: "Impossible d'interroger les utilisateurs par leur nom d'utilisateur")
Flimm
164

MISE À JOUR :

Depuis fin août 2012, l'API a été mise à jour pour vous permettre de récupérer les photos de profil de l'utilisateur dans différentes tailles. Ajoutez les champs facultatifs de largeur et de hauteur en tant que paramètres d'URL:

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

WIDTHet HEIGHTsont vos valeurs de dimension demandées.

Cela renverra une image de profil avec une taille minimale de WIDTHx HEIGHTtout en essayant de conserver le rapport d'aspect. Par exemple,

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

Retour

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

FIN DE LA MISE À JOUR

Pour obtenir la photo de profil d'un utilisateur, appelez

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

USER_IDpeut être le numéro d'identification de l'utilisateur ou le nom d'utilisateur.

Pour obtenir une photo de profil utilisateur d'une taille spécifique, appelez

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

SIZEdoit être remplacé par l'un des mots

square
small
normal
large

selon la taille que vous souhaitez.

Cet appel renvoie une URL vers une seule image avec sa taille en fonction du paramètre de type choisi.

Par exemple:

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

renvoie une URL vers une petite version de l'image.

L'API spécifie uniquement la taille maximale des images de profil, pas la taille réelle.

Carré:

largeur et hauteur maximales de 50 pixels.

Petit

largeur maximale de 50 pixels et hauteur maximale de 150 pixels.

Ordinaire

largeur maximale de 100 pixels et hauteur maximale de 300 pixels.

Grand

largeur maximale de 200 pixels et hauteur maximale de 600 pixels.

Si vous appelez l'USER_ID / image par défaut, vous obtenez le type carré.

CLARIFICATION

Si vous appelez (selon l'exemple ci-dessus)

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

il renverra une réponse JSON si vous utilisez l'une des méthodes de demande des SDK Facebook . Sinon, il renverra l'image elle-même. Pour toujours récupérer le JSON, ajoutez:

&redirect=false

ainsi:

https://graph.facebook.com/redbull/picture?width=140&height=110&redirect=false
Gunnar Karlsson
la source
Excellente explication, mais la valeur de retour de l'URL que vous avez donnée (' graph.facebook.com/redbull/… ) répond avec l'URL de l'image dans l'en-tête de l'emplacement (' Location: fbcdn-profile-a.akamaihd.net/hprofile-ak-ash4 /c0.19.180.142/… ). pas en tant que JSON comme {"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
J'obtiens toujours la même réponse que dans ma réponse. Vous pouvez l'essayer dans l'explorateur de graphiques sur Facebook Developers à developers.facebook.com/tools/explorer. Entrez 'redbull / picture? Width = 140 & height = 110' et voyez la réponse. Ma réponse suppose que vous appelez cela en utilisant l'une des méthodes de demande / API Facebook SDK, qui renverra une réponse JSON.
Gunnar Karlsson
2
@GunnarKarlsson vous manque le &redirect=falsepour renvoyer les données JSON au lieu de rediriger vers l'image
andrewtweber
@andrewtweber merci beaucoup. J'ai ajouté une clarification à la réponse.
Gunnar Karlsson
3
Nous sommes en juillet 2015 et cela ne fonctionne plus. (erreur: "Impossible d'interroger les utilisateurs par leur nom d'utilisateur")
Flimm
20

Pour obtenir l'URL de l'image, PAS le contenu binaire:

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

Vous devez utiliser votre ID FACEBOOK, PAS LE NOM D'UTILISATEUR. Vous pouvez y obtenir votre identifiant facebook:

http://findmyfbid.com/

NaturalBornCamper
la source
1
Nous sommes en juillet 2015 et cela ne fonctionne plus (erreur: "Impossible d'interroger les utilisateurs par leur nom d'utilisateur")
Flimm
3
Vous avez tout faux ami :) C'est votre identifiant Facebook, pas votre nom d'utilisateur findmyfbid.com
NaturalBornCamper
1
Le meilleur d'ici. C'est
complètement
19

Code simple d'une ligne pour enregistrer l'image de profil de taille complète sur votre serveur.

<?php

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

?>

Cela ne fonctionnera que si openssl est activé dans php.ini.

Armand
la source
Nous sommes en juillet 2015 et cela ne fonctionne plus (erreur: "Impossible d'interroger les utilisateurs par leur nom d'utilisateur")
Flimm
Oui, les appels v1.0 cesseront de fonctionner après le 30 avril 2015. Vous ne pouvez pas obtenir d'ID spécifique à l'application à moins que l'utilisateur n'ait autorisé votre application
Armand
10

A ajouté cela comme un commentaire à la réponse acceptée, mais a estimé qu'il méritait une explication plus longue. À partir d'avril 2015, cela sera probablement soulevé plusieurs fois.

Depuis la V2 de l'API du graphique, la réponse acceptée ne fonctionne plus en utilisant un nom d'utilisateur. Alors maintenant, vous avez d'abord besoin de l'ID utilisateur et vous ne pouvez plus utiliser de nom d'utilisateur pour l'obtenir. Pour compliquer encore les choses, pour des raisons de confidentialité, Facebook modifie désormais l'ID utilisateur par application (voir https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ et https: //developers.facebook .com / docs / apps / upgrade / # upgradeing_v2_0_user_ids ), vous devrez donc avoir une sorte d'authentification appropriée pour récupérer un ID utilisateur que vous pouvez utiliser. Techniquement, la photo de profil est toujours publique et disponible sur / userid / picture (voir les documents sur https://developers.facebook.com/docs/graph-api/reference/v2.0/user/picture et cet exemple d'utilisateur: http: //graph.facebook.com/v2.2/4/picture?redirect=0), mais il semble impossible de déterminer l'ID utilisateur standard d'un utilisateur uniquement en fonction de son profil - votre application devrait les amener à approuver l'interaction avec l'application qui pour mon cas d'utilisation (montrant simplement une photo de profil à côté de leur lien de profil FB) est exagérée.

Si quelqu'un a trouvé un moyen d'obtenir la photo de profil en fonction du nom d'utilisateur, ou alternativement, comment obtenir un ID utilisateur (même alternatif) à utiliser pour récupérer une photo de profil, veuillez partager! En attendant, l'ancienne URL du graphique fonctionne toujours jusqu'en avril 2015.

sckd
la source
9

Une façon consiste à utiliser le code Gamlet affiché dans sa réponse:

  • Enregistrez-le sous curl.php

  • Puis dans votre dossier:

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

Je pensais que je publierais ceci, car cela m'a pris un peu de temps pour comprendre les détails ... Même si les photos de profil sont publiques, vous devez toujours avoir un jeton d'accès pour l'obtenir lorsque vous le recourbez .

benjaminlotan
la source
8

Il y a moyen de le faire;)

Merci à " 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);
            }
        }
    }
Hamlet
la source
8

Solution PHP (HTTP GET) fonctionnelle à partir d'avril 2015 (sans 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'];
}

Vous pouvez changer le «type» dans parametr:

Carré:

largeur et hauteur maximales de 50 pixels.

Petit

largeur maximale de 50 pixels et hauteur maximale de 150 pixels.

Ordinaire

largeur maximale de 100 pixels et hauteur maximale de 300 pixels.

Grand

largeur maximale de 200 pixels et hauteur maximale de 600 pixels.

Xawier
la source
7

Je pensais - peut-être que l' ID sera un outil utile. Chaque fois qu'un utilisateur crée un nouveau compte, il doit obtenir un ID plus élevé. J'ai recherché sur Google et trouvé qu'il existe une méthode pour estimer la date de création du compte par ID et Massoud Seifi de metadatascience.com a recueilli de bonnes données à ce sujet.

Entrez la description de l'image ici

Lisez cet article:

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

Et voici quelques identifiants à télécharger:

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

Erroid
la source
1
Comment cela répond-il à la question?
Flimm
4

Êtes-vous préoccupé par la taille de l'image de profil? au moment de l'implémentation de la connexion avec Facebook en utilisant PHP. Nous allons vous montrer le moyen simple d'obtenir une photo de profil de grande taille dans le SDK PHP de Facebook. En outre, vous pouvez obtenir l'image de taille personnalisée du profil Facebook.

Définissez la dimension de l'image de profil à l'aide de la ligne de code suivante.

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

consultez cet article: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

Sagar Jethi
la source
3

@NaturalBornCamper,

Beau code! Voici une fonction de code épurée pour un tel processus!

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

Cela renverra l' URL de l'image d'avatar Facebook brute . N'hésitez pas à en faire ce que vous voulez!

tfont
la source