Flickr, étant le plus grand site de gestion et de partage de photos au monde, dispose d'une API impressionnante permettant aux développeurs d'accéder et de manipuler la quasi-totalité de ses données. Voyons comment utiliser l'API: au plus bas niveau possible.
À l'ère du Web 2.0, les applications Web dotées d'une API intuitive et facile à utiliser présentent un avantage distinct, car elles permettent aux développeurs d'exploiter et de créer pour la plate-forme et de capturer ainsi plus d'utilisateurs. Au fur et à mesure que nous nous dirigeons vers le Web social et les mashups, une bonne API n’est plus un ajout intéressant: c’est carrément nécessaire. Et rappelez-vous que trop d’abstraction n’est jamais une bonne chose. Bien qu'il existe un certain nombre de kits d'API pour simplifier l'utilisation de l'API en question, ne serait-il pas intéressant de savoir ce qui se passe réellement sous le capot? Ne serait-il pas excitant de déconstruire le vaudou réel qui se passe entre le kit et l’API? Ouais je le pensais! Dans cette nouvelle série, nous examinerons les API de certains des services les plus populaires. Aujourd'hui, regardons l'API Flickr.
Le tango entre le développeur et l'API commence et se termine par une série d'étapes bien définies. Je vais expliquer chaque étape que nous allons.
Tout d’abord, nous devons décider du type d’application que nous allons construire. Applications de bureau avoir d'utiliser le modèle de bureau alors qu'une application Web peut utiliser l'un ou l'autre des modèles. Le modèle mobile dépasse le cadre de cet article.
Pour cet article, j'ai choisi le modèle de bureau, car le modèle Web nécessite que tous les tests soient effectués sur le domaine sur lequel l'application doit être déployée. Cela pourrait ne pas être nécessairement réalisable pour beaucoup de gens. Nous choisissons le modèle de bureau car il est exempt de cette restriction.
L'étape suivante consiste à obtenir une clé d'application. Flickr utilise cette clé d'application pour garder un œil sur notre utilisation et d'autres statistiques. Rendez-vous ici et appliquez votre propre clé API.
Puisque notre utilisation de cette clé API est purement pédagogique, nous avons choisi d’obtenir une clé non commerciale..
Remplissez tous les détails requis par le formulaire avec une attention particulière pour la description du projet. Les développeurs de Flickr lisent cette description si votre application se comporte mal pour s’assurer qu’elle est légitime. Passez donc cette minute supplémentaire à décrire votre chef-d'œuvre.
Une inscription réussie vous rapporte cette page. Notez la clé de l'API et le secret partagé pour une utilisation ultérieure..
L'API Flickr fournit un certain nombre de méthodes pouvant nécessiter ou non une authentification. Chaque méthode prend un certain nombre d'arguments qui modifient son comportement et sa charge. Les réponses peuvent être reçues dans un certain nombre de formats, notamment JSON, XML, SOAP et REST. Toutes ces demandes peuvent être adressées aux points d'extrémité correspondant au format dans lequel vous avez choisi de faire la demande. Par exemple, nous utiliserons REST pour le reste de cet article. Notre point de terminaison d'URL serait donc http: // api. .flickr.com / services / reste /.
Il existe un certain nombre de méthodes qui extraient des données publiques et ne nécessitent donc aucune authentification. Nous avons juste besoin de la clé API que nous avions obtenue précédemment ainsi que de tous les arguments requis de la méthode en question. Regardons un exemple.
La méthode getPublicGroups est un exemple de méthode ne nécessitant pas d'authentification et extrayant des données publiques. Nous transmettons l'ID utilisateur de l'utilisateur et notre clé api. L'API répond dans le format que vous avez demandé avec une liste de groupes dont l'utilisateur fait partie..
Nous enverrions une demande à cette URL.
http://api.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=your_api_key&user_id=user_id_x
Remplacer votre_api_key avec la clé que nous avons obtenue plus tôt et user_id_x avec un NSID valide. J'aime que mes réponses soient en JSON, je peux ajouter un autre paramètre demandant à l'API de répondre avec une charge JSON..
http://api.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=your_api_key&user_id=user_id_x&format=json
L'API enverra une réponse comme suit:
jsonFlickrApi ("photos": "page": 1, "pages": 1, "par page": 100, "total": "2", "photo": ["id": "3728895285", "propriétaire ":" 40318902 @ N02 "," secret ":" df6dfee053 "," serveur ":" 3466 "," ferme ": 4," titre ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689790", "propriétaire": "40318902 @ N02", "secret": "ea9c38a675", "serveur": "2531", "ferme": 3, "titre ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0,]," stat ":" ok ")
Correctement formaté, ça va ressembler à ceci.
jsonFlickrApi ("photos": "page": 1, "pages": 1, "par page": 100, "total": "2", "photo": ["id": "3729689790", "propriétaire ":" 40318902 @ N02 "," secret ":" ea9c38a675 "," serveur ":" 3466 "," ferme ": 4," titre ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689845", "propriétaire": "40318902 @ N02", "secret": "df6dfee053", "serveur": "2531", "ferme": 3, "titre ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")
C’est probablement la raison pour laquelle vous souhaitez apprendre à utiliser l’API Flickr. Nous allons donc passer lentement à chaque étape car cette partie a tendance à confondre les internautes..
Pour obtenir des données privées, chaque méthode nécessite une authentification et pour que l'authentification fonctionne, chacun de nos appels doit être signé. La signature fonctionne comme suit:
Faites une liste alphabétique des arguments
Par exemple, dans l'exemple précédent, notre liste ressemblerait à ceci:
Créer la chaîne de signature
La chaîne de signature est créée en prenant le Secret de l'API nous avons obtenu précédemment et y avons ajouté la liste des arguments. Par exemple, notre chaîne de signature ressemblerait à ceci:
0123456789api_keyxxxformatjsonuseridyyy
Signer notre appel
La dernière étape est la signature réelle. Flickr s'attend à ce que nous prenions le hachage MD5 de notre chaîne de signature et l'ajoutons à notre appel de méthode d'origine en tant que paramètre nommé..
Donc, tout appel authentifié a ce format général
http://api.flickr.com/services/rest/?method=ourmethod&api_key=apikey&api_sig=hashedvalue
Maintenant que la session est terminée, nous pouvons maintenant passer à l'authentification proprement dite. Flickr utilise un système similaire à OAuth pour l'autorisation, ce qui signifie qu'un utilisateur qui souhaite utiliser notre application n'a pas besoin de divulguer ses informations d'identification. Les utilisateurs sont transportés vers le site Web Flickr où il est demandé à l'utilisateur s'il souhaite autoriser notre application à accéder aux données de l'utilisateur..
C'est là un frob entre en jeu. Pour créer le lien de connexion qui conduit l'utilisateur à une page d'autorisation sur Flickr, nous avons besoin d'un moyen d'identifier une session de connexion spécifique..
Pour obtenir un frob identifiant la session, nous devons appeler le flickr.auth.getFrob passer notre clé api en tant qu'argument nommé. Notre URL ressemblerait à ceci:
http://api.flickr.com/services/rest/?method=flickr.auth.getFrob&api_key=apikey&api_sig=hashedvalue
Une réponse JSON ressemble à ceci:
frobcallback ("frob": "_content": "xxx", "stat": "ok")
Après avoir réussi à obtenir un frob, nous pouvons maintenant construire l’URL qui permet à l’utilisateur d’autoriser notre application. L'URL de connexion a ce format général:
http://flickr.com/services/auth/?api_key=apikey&api_sig=apisig&perms=perms&frob=frob
Remplacez la valeur de api_key par celle obtenue précédemment, la valeur de api_sig par un hachage MD5 de notre chaîne de signature et la valeur de frob par la valeur de frob renvoyée par l'API. le permanentes paramètre définit le niveau souhaité d'accès au compte et a des valeurs valides de lire, écrire et supprimer. Chaque accès inclut les droits de tous ses prédécesseurs.
Une URL de connexion valide prend la forme suivante:
http://flickr.com/services/auth/?api_key=63b08e2efcc22de99001634f7d761fdbc&api_sig=663369798c695dp;
Les pages d'autorisation ressemblent à ceci:
Une fois que l'utilisateur a autorisé notre application, nous pouvons continuer. La dernière étape de ce processus consiste à obtenir un auth_token. Un jeton d'authentification lie une clé d'API spécifique à un ID utilisateur spécifique, à savoir un jeton d'authentification peut être utilisé pour manipuler uniquement les données d'un utilisateur spécifique tout en utilisant une clé d'API spécifique. Un jeton d'authentification est nécessaire pour chaque appel de méthode d'API nécessitant une authentification..
L'obtention d'un jeton d'authentification est aussi simple que d'appeler le flickr.auth.getToken méthode transmettant la clé api, la signature frob et api en tant que paramètres nommés. L'URL ressemblerait à ceci:
http://flickr.com/services/auth/?api_key=apikey&api_sig=apisig&frob=frob
Une requête réussie nous fournit un jeton d'authentification qui peut être utilisé indéfiniment pour accéder aux données d'un utilisateur spécifique à l'aide d'une clé api spécifique..
Maintenant que toutes les conditions préalables sont remplies, nous pouvons récupérer les données si nécessaire. N'oubliez pas que chacun de vos appels authentifiés doit être signé et que chaque appel doit donc envoyer les clés api, auth_token et api_sig pour que la méthode appelle au travail.
Au minimum, l’URL de votre demande REST doit ressembler à ceci. D'autres paramètres spécifiques à la méthode ou des paramètres modifiant la charge utile peuvent être ajoutés si nécessaire.
http://flickr.com/services/auth/?api_key=xxx&api_sig=yyy&auth_token=zzz&method=method_name
Lors de la signature, assurez-vous d'inclure également les autres arguments et leurs valeurs. Ceci est une cause fréquente d'erreur et de maux de tête et est facilement corrigé. Incluez-vous des paramètres de rappel dans l'URL pour éviter la restriction entre domaines dans les navigateurs lors de l'utilisation d'AJAX? Ceux-ci doivent aussi aller dans la chaîne de signature!
Examinons un exemple de réponse pour une méthode qui renvoie des photos publiques..
jsonFlickrApi ("photos": "page": 1, "pages": 1, "par page": 100, "total": "2", "photo": ["id": "3729689790", "propriétaire ":" 40318902 @ N02 "," secret ":" ea9c38a675 "," serveur ":" 3466 "," ferme ": 4," titre ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689845", "propriétaire": "40318902 @ N02", "secret": "df6dfee053", "serveur": "2531", "ferme": 3, "titre ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")
Tout va bien, mais la réponse ne contient pas d'URL vers laquelle nous pourrions simplement créer un lien. Au lieu de cela, nous devons créer une URL pour l'image en question en fonction des données renvoyées par le serveur. Voici comment:
L'URL de chaque image sur Flickr suit un schéma bien défini. Déverrouillez cela et la réponse commence à avoir beaucoup plus de sens. Voici l'URL d'une image dans mon compte.
http://farm3.static.flickr.com/2531/3729689790_ea9c38a675_b.jpg
L'URL est composé de plusieurs parties:
En bref, afin de construire la source de l'image, le lien ressemblerait à celui présenté ci-dessous si nous devions analyser la réponse JSON, où data est la variable qui contient la réponse:
"http: // ferme" + data.photos.photo [i] .farm + ".static.flickr.com /" + data.photos.photo [i] .server + "/" + data.photos.photo [ i] .id + "_" + data.photos.photo [i] .secret + ".jpg
Maintenant que nous avons examiné comment récupérer des données à partir de Flickr à l'aide de son API, il est temps d'examiner comment renvoyer des données..
L'API de téléchargement de Flickr se distingue de ses API basées sur REST ou SOAP en ce sens qu'il n'y a aucun point de terminaison d'URL auquel vous pouvez simplement accéder et récupérer des données. Au lieu de cela, les données doivent être envoyées via une demande POST à
http://api.flickr.com/services/upload/
Dans la mesure où cet article ne vous montre pas comment construire une requête POST à partir de rien, nous allons utiliser un élément de formulaire avec une valeur enctype de multipart / form-data afin de générer tout le code pour nous. L'utilisation de cet attribut spécifique nous permet d'affirmer que le formulaire contient des données binaires et qu'il doit être traité comme tel. Un exemple de formulaire ressemblerait à ceci.
Mais rappelez-vous, nous devons toujours envoyer un certain nombre de paramètres au service, notamment la clé api, le jeton d'authentification et la signature de la méthode. Comment fait-on cela? Il suffit de créer un champ de texte masqué et de modifier sa valeur pour refléter les valeurs correctes. Ainsi:
N'oubliez pas que lors de la génération du hachage MD5 de la chaîne de signature, vous devez télécharger chaque élément du formulaire excluant le champ photo. Cela inclut la valeur des boutons d'envoi, car le contenu de l'intégralité du formulaire est envoyé à l'URL. Pour l'exemple ci-dessus, le hachage devrait être calculé comme suit:
var hash = MD5 (secret + "api_key" + apikey + "auth_token" + jeton + "submitUpload");
Vous n'êtes pas entièrement limité à ces arguments. L'API de téléchargement prend en compte un certain nombre d'arguments, notamment le titre de la photo, son titre et sa description. Si vous le souhaitez, vous pouvez également laisser l'utilisateur saisir toutes ces données avec les paramètres de confidentialité, comme ceci:
Un article sur la façon de travailler avec une API de service serait clairement incomplet sans un aperçu des méthodes d'API les plus utilisées. Dans cet esprit, voici quelques méthodes d’API qui devraient être très utiles, que vous créiez un mashup ou que vous cherchiez simplement à récupérer vos propres données..
N'oubliez pas que les appels authentifiés nécessitent des valeurs valides pour que les paramètres api_key, api_sig et auth_token fonctionnent, tandis que les appels normaux peuvent nécessiter ou non des paramètres spécifiques à la méthode.. Tout les appels nécessitent l'envoi du paramètre api_key. Donc, si je mentionne que l'appel nécessite une authentification, le fait que l'appel nécessite les autres arguments est implicitement implicite. Les arguments indiqués ci-dessous sont facultatifs, sauf indication contraire. Les méthodes qui renvoient une liste de données prennent également un argument page et per_page pour définir leur homonyme.
J'ai inclus les réponses de chaque méthode pour vous donner une idée des données qui nous sont renvoyées. J'ai opté pour le format de réponse JSON, car la plupart des développeurs avec lesquels je travaille, comme JSON, sont meilleurs que XML..
flickr.activity.userPhotos
Renvoie une liste des activités récentes sur les photos appartenant à l'appelant..
Arguments: timeframe - Définit le délai dans lequel rechercher les mises à jour.
Authentification: Oui
Réponse
"items": "item": ["type": "photo", "id": "3728895285", "owner": "40318902 @ N02", "nom d'utilisateur": "lordtottuu", "secret": "df6dfee053", "serveur": "3466", "ferme": 4, "titre": "_content": "opac", "commentsold": 1, "commentsnew": 0, "notesold": 0, "notesnew": 0, "vues": 0, "faves": 0, "plus": 0, "activité": "événement": ["type": "comment", "commentid": "40298554- 3728895285-72157621628251433 "," utilisateur ":" 40318902 @ N02 "," nom d'utilisateur ":" lordtottuu "," dateadded ":" 1248131143 "," _content ":" image de démonstration de mon prochain article dans Net Tuts "] ], "page": 1, "pages": 1, "par page": 10, "total": 1, "stat": "ok"
flickr.contacts.getList
Renvoie une liste de contacts pour l'utilisateur appelant.
Arguments: filter - Argument pour filtrer la liste. Les valeurs valides incluent amis, famille, les deux et aucun.
Authentification: Oui
Réponse
"contacts": "page": 1, "pages": 1, "per_page": 1000, "perpage": 1000, "total": 2, "contact": ["nsid": "7488445 @ N05 "," nom d'utilisateur ":" thegleek "," iconserver ":" 179 "," iconfarm ": 1," ignoré ": 0," realname ":" Mike Poleski "," ami ":" 1 "," famille " : "0", "path_alias": null, "location": ""] // reste des contacts, "stat": "ok"
flickr.favorites.getList
Renvoie une liste de photos marquées comme favoris par un utilisateur spécifique..
Arguments: min_fave_date, max_fav_date - Auto-explicatif.
Authentification: Oui
Réponse
"photos": "page": 1, "pages": 1, "perpage": 100, "total": "3", "photo": ["id": "2332823355", "propriétaire": "53555705 @ N00", "secret": "e603be40a2", "serveur": "2333", "ferme": 3, "titre": "Nature morte sur Xbox 360", "ispublic": 1, "isfriend": 0 , "isfamily": 0, "date_faved": "1248134938"] // reste des photos, "stat": "ok"
flickr.people.getPublicPhotos
Obtenir une liste de photos publiques pour l'utilisateur donné.
Arguments: nsid [requis] - ID de l'utilisateur appelant, safe_search - Pour bloquer le contenu NSFW.
Authentification: Non
Réponse
"photos": "page": 1, "pages": 1, "perpage": 100, "total": "15", "photo": ["id": "3728895285", "propriétaire": "40318902 @ N02", "secret": "df6dfee053", "serveur": "3466", "ferme": 4, "titre": "opac", "ispublic": 1, "isfriend": 0, "isfamily ": 0] // reste des photos," stat ":" ok "
flickr.groups.getInfo
Pour obtenir des informations sur un groupe particulier.
Arguments: group_id [requis] - L'ID du groupe pour lequel vous recherchez des informations.
Authentification: Non
Réponse
"groupe": "id": "51035612836 @ N01", "iconserver": "1", "iconfarm": 1, "name": "_content": "API Flickr", "description": "_content": string "Groupe Flickr pour les projets d'API Flickr. Pensez à l'API Flickr, aux projets qui l'utilisent et aux idées incroyables produites par les systèmes exposés par programmation. Pensez Google API + API Amazon + Flickr avec un peu de GMail jeté Les développeurs de Flickr ont fait remarquer à juste titre qu’ils souhaitaient que les discussions techniques directement liées à l’API figurent sur la liste de diffusion. " , "members": "_content": "7775", "privacy": object "_content": "3", "lang": null, "ispoolmoderated": 1, "throttle": object " count ":" 3 "," mode ":" jour "," restrictions ": objet " photos_ok ": 1," videos_ok ": 1," images_ok ": 1," screens_ok ": 1," art_ok ": 1, "safe_ok": 1, "modéré_ok": 0, "restricted_ok": 0, "has_geo": 0, "stat": "ok"
flickr.photos.getExif
Extrait les données EXIF d'une photo existante .
Arguments: photo_id [requis] - ID de la photo dont les données EXIF doivent être extraites.
Authentification: Non
Réponse
"photo": "id": "2332823355", "secret": "e603be40a2", "serveur": "2333", "ferme": 3, "exif": ["tagspace": "TIFF", "tagspaceid": 1, "tag": 271, "label": "Make", "raw": "_content": "Canon", "tagspace": "TIFF", "tagspaceid": 1, "tag": 272, "label": "Modèle", "raw": "_content": "Canon EOS 350D DIGITAL", // reste de l'exif]], "stat": "ok"
flickr.photos.geo.getLocation
Renvoie la latitude et la longitude de l'endroit où une photo spécifique a été prise..
Arguments: photo_d [requis] - Identifiant de la photo dont l'emplacement doit être connu.
Authentification: Non
Réponse
"photo": objet "id": chaîne "229097925", "emplacement": objet "latitude": -33.856874, "longitude": 151.214672, "précision": "16", "contexte": "0" , "localité": "_content": "Sydney", "place_id": "p50kaZyYAJx9BZHQ", "woeid": "1105779", "region": objet "_content": "New South Wales", "place_id" : "puGzSeubAphuNnF2", "woeid": "2344700", "pays": objet "_content": "Australie", "place_id": "om3Zr2abAphqrm3jdA", "woeid": "23424748", "place_id" "p50kaZyYAJx9BZHQ", "woeid": chaîne "1105779", "stat": chaîne "ok"
flickr.photos.getFavorites
Renvoie une liste des personnes qui ont marqué la photo transmise comme favorite..
Arguments: photo_id [requis] - ID de la photo en question.
Authentification: Non
Réponse
"photo": "personne": ["nsid": "39011391 @ N06", "nom d'utilisateur": "derek1960", "favedate": "1243834286", // reste des photos], "id" : "229097925", "secret": "13a21546fb", "serveur": "61", "ferme": 1, "page": 1, "pages": 2, "par page": 10, "total": " 18 "…," stat ":" ok "
flickr.places.getTopPlacesList
Renvoie une liste des 100 lieux les plus balisés du jour.
Arguments: place_type_id [required] - ID numérique d'un lieu pour définir le mode de regroupement des photos.
Authentification: Non
Réponse
"places": objet "total": number100, "place": ["place_id": "4KO02SibApitvSBieQ", "woeid": "23424977", "latitude": "48.890", "longitude": "-116.982 "," lieu_url ":" / États-Unis "," lieu_type ":" pays "," lieu_type_id ":" 12 "," _content ":" États-Unis "," photo_count ":" 23654 ", // reste des 99 pays], "date_start": 1248048000, "date_stop": 1248134399, "stat": "ok"
flickr.tags.getHotList
Renvoie une liste des tags les plus utilisés pour une période donnée.
Arguments: period - Spécifie la période pour laquelle obtenir des balises. count - Spécifie le nombre de balises à renvoyer dans la réponse.
Authentification: Non
Réponse
"hottags": "period": "day", "count": 20, "tag": ["score": "100", "_content": "sundaystreets", "score": "100 "," _content ":" happymondayblues ", " score ":" 100 "," _content ":" melbourneopenhouse2009 "]," stat ": chaîne" ok "
Dans cette partie d'ouverture de la série, nous avons examiné comment utiliser l'API Flickr, notamment comment extraire des données publiques et privées, l'authentification à l'aide de l'API et le téléchargement de données sur le service. Nous avons également examiné certaines des méthodes d'API les plus utilisées ainsi que leurs réponses JSON afin de mieux comprendre la structure des données renvoyées par l'API..
La prochaine API couverte est à vous de décider. Ici, chez Net Tuts, nous répondons à la demande générale et nous allons donc permettre aux lecteurs de choisir l’API du service qui sera prochainement écrit. Dans votre commentaire ci-dessous, laissez le nom du service et l'interface de l'API, si besoin est. Nous avons traité de REST dans cet article, mais nous serions heureux de couvrir les API basées sur SOAP ou XML-RPC si suffisamment de personnes le souhaitent..
Des questions? De belles choses à dire? Des reproches? Hit la section des commentaires et laissez-moi un commentaire. Bonne codage!