web-dev-qa-db-fra.com

Comment obtenir une URL de photo volumineuse en un seul appel d'API?

Je souhaite afficher immédiatement de grandes photos dans l'affichage du flux de mon application Facebook. Est-il possible d'obtenir la grande URL src photo à partir d'un flux/flux en utilisant un seul appel d'API? L'identifiant de la photo est renvoyé dans le flux/flux et on peut bien sûr ensuite fournir cet identifiant de la photo dans un appel supplémentaire d'API FQL ou graphique pour récupérer toutes les informations concernant cette photo. Cependant, existe-t-il un moyen d'utiliser des appels multi-requête ou par lots pour obtenir une URL src de photo plus grande à l'aide d'un API aller-retour?

39
John Wright

Je n'ai pas essayé cela avec les photos de flux/flux, mais la manière généralement acceptée de le faire est:

http://graph.facebook.com/{ID of object}/picture

Si vous voulez la version "grande", vous feriez:

http://graph.facebook.com/{ID of object}/picture?type=large

Je ne suis pas sûr à 100% si cela fonctionnerait pour une photo réelle (au lieu d'une photo de profil d'utilisateur ou d'une photo de profil de page), mais j'ai l'intuition qu'il en sera ainsi. est autorisé à voir la photo (sauf si elle est publique).

85
streetlogics

Si quelqu'un cherche à cela et que taper gros n'est pas suffisant, j'ai trouvé d'autres solutions.

Le type large est un peu petit de toute façon (près de 200 pixels). Vous pouvez obtenir une image plus grande en ajoutant i.e. ?width=1000 ou ?height=1000. Facebook retournera l'image la plus proche de la dimension donnée et préservera les proportions. Lorsque vous passez les deux dimensions comme ?width=1000&height=1000, facebook réduira l'image à des dimensions données (dans ce cas, carré).

31
Lucas

Utilisez Facebook UserId (Oject ID) pour obtenir la photo.

https://graph.facebook.com/173xxxx8635/picture?type=large&redirect=false

qui renvoie des données JSON avec une URL d'image.

{
   "data": {
      "is_silhouette": false,
      "url": "https://fbcdn-profile-a.akamaihd.net/xxx/xyz/1cc066a2cae3f301d"
   }
}
2
Madan Sapkota

Lorsque j'ai eu ce problème, j'ai constaté que c'était l'image que je téléchargeais plutôt que la taille que je prenais.

Si par exemple j'ai téléchargé toutes mes photos avec une demande de

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,picture&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"picture"] 
    }
}];

J'utilise la recherche par clé du dictionnaire "image" comme je le souhaite.

Cela me permettra d'obtenir une image de qualité inférieure à celle obtenue si j'avais recherché "source" dans cette recherche:

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,source&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"source"] 
    }
}];

Si vous allez sur Facebook API Explorer et recherchez des photos puis cliquez sur l’image et les liens jpg source, vous pourrez constater la différence de taille et de qualité.

Depuis que j'ai changé cette méthode, j’ai réussi à me débarrasser des paramètres de type car cela ne semble pas faire l’objet d’une modification. 

Remarque: j'utilise un iPhone et non un iPad ou un écran plus grand, donc je ne sais pas en quoi cela affecte les écrans plus grands.

1
simon_smiley

Une bonne astuce avec la nouvelle API consiste à extraire le champ pic_cover de la table des événements et à le traiter en fonction de la taille que vous souhaitez utiliser. 

1
user1445685

La réponse de @streetlogics fonctionne bien, mais uniquement sur les images qui ont {object_id}.

http://graph.facebook.com/{object_id}/picture

Mais je voulais aussi de grandes images pour les liens partagés du flux, qui n'ont parfois pas {object_id}. J'ai finalement réalisé que l'URL miniature {picture} contient l'URL codée de la grande image du site d'origine: 

https://external.xx.fbcdn.net/safe_image.php?d=AQBe9UvGd0vPbAHP&w=130&h=130&url=http%3A%2F%2Fskift.com%2Fwp-content%2Fuploads%2F2015%2F12%2Fpollution.jpg&cfs=1

-> contient ->

http://skift.com/wp-content/uploads/2015/12/pollution.jpg

J'ai donc créé une boucle qui vérifie {object_id} et si non présent, extrait l'URL de {picture}:

if(isset($post['object_id'])) {
    echo "http://graph.facebook.com/".$post['object_id']."/picture";
    }
    elseif(isset($post['picture'])) {
        echo urldecode(preg_replace('/&cfs.*/', '', preg_replace('/.*url=/', '', $post['picture'])));
    } 
    else {
        echo "no_large_image";
}
0
williamtx