web-dev-qa-db-fra.com

API Facebook - Comment obtenir l'image de profil d'un utilisateur Facebook via l'API Facebook (sans obliger l'utilisateur à "Autoriser" l'application)

Je travaille sur un CMS qui récupère l'image du profil d'un utilisateur à partir de Facebook URL (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 celui-ci ait besoin de autoriser l'application?

254
John Himmelman

Il suffit de récupérer les données à travers ceci URL :

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

Remplacez userid_here par l'identifiant de l'utilisateur dont vous souhaitez obtenir la photo. Vous pouvez également utiliser HTTPS.

Vous pouvez utiliser la fonction file_get_contents de 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 thefile_get_contents fonction de PHP pour lire cette URL.

408
Sarfraz

Montrer:

50x50 pixels

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

Largeur de 200 pixels

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

Sauvegarder (en utilisant PHP)

NOTE: Ne pas utiliser ceci. 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 utilisateur sur Facebook.

REMARQUE: dans le cas d'images marquées "18+", vous aurez besoin d'un code d'accès valide pour un utilisateur de 18+:

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

MISE À JOUR 2015:

Graph API v2.0 ne peut pas être interrogé à l'aide de noms d'utilisateurs, vous devriez utiliser userId toujours.

265
neiker

UPDATE:

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

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

WIDTH et HEIGHT sont les valeurs de dimension demandées.

Cela retournera une image de profil avec une taille minimale de WIDTH x HEIGHT tout en essayant de conserver le rapport de format. Par exemple,

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

résultats

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

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

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

USER_ID peut être le numéro d'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

SIZE devrait être remplacé par l'un des mots

square
small
normal
large

en fonction de la taille que vous voulez.

Cet appel renverra un URL à 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 maximum 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 le USER_ID/picture par défaut, vous obtenez le type de carré.

CLARIFICATION

Si vous appelez (comme dans 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 de kit de développement logiciel (SDK) de Facebook . Sinon, il retournera 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
163
Gunnar Karlsson

Pour obtenir l'URL de l'image, PAS du 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 identifiant FACEBOOK, PAS USERNAME. Vous pouvez obtenir votre identifiant facebook ici:

http://findmyfbid.com/

20
NaturalBornCamper

Code simple à une ligne pour enregistrer l’image de profil COMPLET 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.

19
Armand

Ajouté ceci en tant que commentaire à la réponse acceptée, mais a estimé qu'il méritait une explication plus longue. À partir d'avril 2015, cette question sera probablement soulevée plusieurs fois.

À partir de la V2 du graphique api, la réponse acceptée ne fonctionne plus avec un nom d'utilisateur. Alors maintenant, vous avez besoin de l’utilisateur d’abord, 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 les identifiants des utilisateurs par application (voir https://developers.facebook.com/docs/graph-api/reference/v2.2/user/ et https://developers.facebook.com/docs/apps/upgrading/#upgrading_v2_0_user_ids ), vous devrez donc disposer d'une sorte d'authentification appropriée pour récupérer un ID utilisateur que vous pourrez utiliser. Techniquement, la photo de profil est toujours publique et disponible sur/userid/picture (voir docs 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= ) Cependant, déterminer l'utilisateur standard d'un utilisateur semble impossible en se basant uniquement sur son profil - votre l'application aurait besoin de les amener à approuver une interaction avec l'application, ce qui, dans mon cas d'utilisation (montrer juste une photo de profil à côté du lien de leur profil FB) est excessive.

Si quelqu'un a trouvé un moyen d'obtenir la photo de profil en fonction de son nom d'utilisateur, ou alternativement, comment obtenir un ID utilisateur (même un nom alternatif) à utiliser pour récupérer une photo de profil, partagez-le! Entre temps, l’ancienne URL du graphique fonctionne jusqu’en avril 2015.

10
sckd

Une solution consiste à utiliser le code Gamlet posted 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 poster ceci, car il m'a fallu un peu de temps pour comprendre les détails ... Même si les photos de profil sont publiques, vous avez toujours besoin d'un jeton d'accès pour l'obtenir lorsque vous curl le.

9
benjaminlotan

Solution de travail PHP (HTTP GET) à 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 maximum 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.

8
Xawier

Il y a moyen de faire ça;)

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

Je pensais - peut-être ID serait un outil utile. Chaque fois qu'un utilisateur crée un nouveau compte, il devrait recevoir un identifiant plus élevé. J'ai googlé et découvert qu'il existait une méthode permettant d'estimer la date de création du compte par ID et que Massoud Seifi de metadatascience.com avait rassemblé de bonnes données à ce sujet.

Enter image description here

Lire 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/

7
Erroid

La publication de blog saisir l'image d'un objet graphique Facebook peut offrir une autre forme de solution. Utilisez le code du didacticiel avec la API Graph de Facebook et sa bibliothèque de SDK PHP.

... Et essayez de ne pas utiliser file_get_contents (sauf si vous êtes prêt à faire face aux conséquences - voir file_get_contents vs curl ) .

6
moostring

Êtes-vous préoccupé par la taille de la photo de profil? au moment de mettre en œuvre la connexion avec Facebook en utilisant PHP. Nous allons vous montrer un moyen simple d’obtenir une photo de profil de grande taille dans Facebook PHP SDK. Vous pouvez également 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)');

vérifiez ce post: http: //www.codexworld.com/how-to-guides/get-large-size-profile-picture-in-facebook-php-sdk/

4
sagar jethi

@NaturelBornCamper,

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 raw de Facebook. N'hésitez pas à faire ce que vous voulez avec!

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

Vous pouvez obtenir l'URI du profil via outil de facebook id Finder en ligne

Vous pouvez également transmettre le type param avec les valeurs possibles small, normal, large et square.

Reportez-vous au documentation officielle

3
user2119554