web-dev-qa-db-fra.com

Obtenir la "vraie" URL de photo de profil Facebook à partir de l'API graphique

Facebook Graph API me dit que je peux obtenir une photo de profil d’un utilisateur utilisant

http://graph.facebook.com/517267866/picture?type=large

qui fonctionne bien. Cependant, lorsque vous tapez l'URL ci-dessus dans un navigateur, l'adresse réelle de l'image est

http://profile.ak.fbcdn.net/profile-ak-snc1/v227/560/83/n517267866_1928.jpg

Comment puis-je obtenir la deuxième URL en utilisant la première par programmation?

75
ericbae

La première URL donne une HTTP 302 (redirection temporaire) à la seconde. Ainsi, pour rechercher la deuxième URL par programme, vous pouvez émettre une requête HTTP pour la première URL et obtenir l'en-tête Location de la réponse.

Cela dit, ne vous fiez pas à la deuxième URL étant permanente. En lisant un peu le code de réponse HTTP (de 302 par opposition à un 301 permanent), il est possible que Facebook modifie ces URL régulièrement pour empêcher les personnes, par exemple, d'utiliser leurs serveurs pour héberger des images.


Edit: Notez que l'URL CDN publiée par le PO est maintenant un 404; nous savons donc que nous ne pouvons pas compter sur une URL de longue durée. De même, si vous vous connectez à l’API Graph à partir d’un <img> sur une page sécurisée par SSL, il y a un paramètre vous devez ajouter assurez-vous d'utiliser https://graph.facebook.com.


Update: L'API a ajouté un paramètre - redirect=false - qui renvoie le code JSON plutôt qu'une redirection. Le code JSON retraité comprend l'URL du CDN:

{
   "data": {
      "url": "http://profile.ak.fbcdn.net/...",
      "is_silhouette": false
   }
}

Encore une fois, je ne compterais pas sur la durée de vie de cette URL CDN. La réponse JSON est envoyée avec des en-têtes CORS permissifs. Vous êtes donc libre de le faire côté client avec des requêtes XHR.

72
josh3736
36
Adfsd

Je sais que c'est tard, mais il existe un autre moyen d'obtenir l'URL de l'image de profil.

Vous pouvez ajouter le paramètre redirect=false à votre URL d'origine pour obtenir l'URL réelle de l'image vers laquelle vous seriez normalement redirigé. 

Ainsi, la nouvelle demande ressemblerait à http://graph.facebook.com/517267866/picture?type=large&redirect=false . Cela renverra un objet JSON contenant l'URL de l'image et un boolean is_silhouette (true si l'image est l'image Facebook par défaut). 

L'image sera aussi de la taille que vous avez spécifiée. Vous pouvez également le vérifier en ajoutant des dimensions: http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400

16
joanna

Pour tous ceux qui souhaitent obtenir la photo de profil sous iOS:

Je viens de faire cela pour obtenir la photo Facebook de l'utilisateur:

NSString *profilePicURL = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture?type=large", fbUserID];

où 'fbUserID' est l'ID de profil de l'utilisateur Facebook.

De cette façon, je peux toujours appeler l'URL de profilePicURL pour obtenir l'image, et je l'obtenir toujours, pas de problème. Si vous avez déjà l'ID utilisateur, vous n'avez besoin d'aucune demande d'API, collez simplement l'ID dans l'URL après facebook.com/.

FYI à tous ceux qui cherchent qui ont besoin du fbUserID dans iOS:

if (FBSession.activeSession.isOpen) {
    [[FBRequest requestForMe] startWithCompletionHandler:
     ^(FBRequestConnection *connection,
       NSDictionary<FBGraphUser> *user,
       NSError *error) {
         if (!error) {
             self.userName = user.name;
             self.fbUserID = user.id;
         }
     }];
}

Vous aurez besoin d'une FBSession active pour que cela fonctionne (voir la documentation de Facebook et l'exemple "Scrumptious").

7
Fateh Khalsa

Si vous voulez le JSON d'une image de profil de bonne qualité avec l'URL, vous pouvez l'utiliser:

http://graph.facebook.com/517267866/picture?height=1024&redirect=false

si vous avez juste besoin de l'image, utilisez-la sans le paramètre redirect:

http://graph.facebook.com/517267866/picture?height=1024

517267866 est l'ID de profil de l'un des exemples ci-dessus. Mettez l'identifiant facebook dont vous avez besoin

J'espère que ça aide

5
Kasas
$url = 'http://graph.facebook.com/100000771470028/picture?type=large';
$rray=get_headers($url);
$hd = $rray[4];
echo(substr($hd,strpos($hd,'http')));

Cela renverra l'URL que vous avez demandé, et le problème de la modification de l'URL par Facebook n'a pas d'importance, car vous appelez de manière dynamique l'URL à partir de l'URL d'origine.

3
KAS

c'est le seul qui fonctionne vraiment:

me?fields=picture.type(*YOURTYPE*)

VOTRE TYPEpeut être l’un des suivants: small, normal, album, large, square

2
Fabio Napodano

Pour Android:

Selon le dernier SDK de Facebook,

Vous devez d’abord appeler GraphRequest API pour obtenir tous les détails de l’utilisateur dans lequel API donne également URL of current Profile Picture.

Bundle params = new Bundle();
params.putString("fields", "id,email,gender,cover,picture.type(large)");
new GraphRequest(token, "me", params, HttpMethod.GET,
        new GraphRequest.Callback() {
            @Override
            public void onCompleted(GraphResponse response) {
                if (response != null) {
                    try {
                        JSONObject data = response.getJSONObject();
                        if (data.has("picture")) {
                            String profilePicUrl = data.getJSONObject("picture").getJSONObject("data").getString("url");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
}).executeAsync();
2
Rajesh

Maintenant, Facebook a besoin de SSL 

-> Important ajouté S, https -> https://graph.facebook.com/userId/?fields=picture&type=large

Travaux en juin/2014

1
luizfelipetx
function getFacebookImageFromURL($url)
{
  $headers = get_headers($url, 1);
  if (isset($headers['Location']))
  {
    return $headers['Location'];
  }
}

$url = 'https://graph.facebook.com/zuck/picture?type=large';
$imageURL = getFacebookImageFromURL($url);
1
TheDayIsDone

Hmm..i a tout essayé pour obtenir l'URL de l'image de l'utilisateur. La solution idéale était l'utilisation fql comme ceci->

    $fql_b = 'SELECT pic from user where uid = ' . $user_id;
    $ret_obj_b = $facebook->api(array(
                               'method' => 'fql.query',
                               'query' => $fql_b,
                             ));


             $dp_url =$ret_obj_b[0]['pic'];

remplacez la photo par la valeur grand, pic_square pour obtenir les autres résultats souhaités .

0
Priyanshu
ImageView user_picture;
userpicture=(ImageView)findViewById(R.id.userpicture);
URL img_value = null;
img_value = new URL("http://graph.facebook.com/"+id+"/picture?type=large");
Bitmap mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
userpicture.setImageBitmap(mIcon1);

Où ID correspond à votre ID de profil .

0
madhu sudhan