La guía definitiva para decodificar la API de Flickr

Flickr, siendo el sitio de intercambio y administración de fotos más grande del mundo, tiene una API impresionante para permitir a los desarrolladores acceder y manipular casi todos sus datos. Echemos un vistazo a cómo trabajar con la API: en el nivel más bajo posible.

Una palabra del autor

En esta era de la Web 2.0, las aplicaciones web que tienen una API intuitiva y fácil de usar tienen una clara ventaja, ya que les permite a los desarrolladores explotar y construir la plataforma y, por lo tanto, capturar a más usuarios. A medida que avanzamos hacia la web social y los mashups, una buena API ya no es una buena adición: es absolutamente necesaria. Y recordar demasiada abstracción nunca es algo bueno. Si bien hay una serie de kits de API para simplificar el trabajo con la API en cuestión, ¿no sería genial saber qué está pasando realmente debajo del capó? ¿No sería emocionante deconstruir el vudú real entre el kit y la API? Sí, eso pensaba yo! En esta nueva serie, echaremos un vistazo a las API de algunos de los servicios más populares que existen. Hoy echamos un vistazo a la API de Flickr..

La secuencia de eventos

El tango entre el desarrollador y la API comienza y culmina en una serie de pasos bien definidos. Te explicaré cada paso a medida que avanzamos..

Decidir el tipo de solicitud

En primer lugar, debemos decidir el tipo de aplicación que vamos a construir. Aplicaciones de escritorio tener para usar el modelo de escritorio mientras que una aplicación web puede usar cualquiera de los modelos. El modelo móvil está fuera del alcance de este artículo..

Para este artículo, he optado por utilizar el modelo de escritorio, ya que el modelo web requiere que se realicen todas las pruebas en el dominio en el que se implementará la aplicación. Esto podría no ser necesariamente factible para mucha gente. Elegimos el modelo de escritorio ya que está exento de esta restricción..

Obteniendo una clave API

El siguiente paso es obtener una clave de aplicación. Flickr usa esta clave de aplicación para mantener un registro de nuestro uso y otras estadísticas. Entra aquí y solicita tu propia clave API.

Como nuestro uso de esta clave API en particular es meramente educativo, elegimos obtener una clave no comercial.

Complete todos los detalles que el formulario requiere con especial atención a la descripción del proyecto. Los desarrolladores de Flickr realmente leen esta descripción si su aplicación se comporta mal de alguna manera para asegurarse de que sea legítima. Así que pasa ese minuto extra describiendo tu obra maestra..

Un registro exitoso le da esta página. Anote la clave api y el secreto compartido para su uso posterior.

Fundamentos de la API de Flickr

La API de Flickr proporciona varios métodos que pueden o no requerir autenticación. Cada método toma una serie de argumentos que modifican su comportamiento y carga. Las respuestas se pueden recibir en varios formatos, incluidos JSON, XML, SOAP y REST. Todas estas solicitudes se pueden hacer a los puntos finales correspondientes al formato que eligió para realizar la solicitud. Por ejemplo, usaremos REST para el resto de este artículo y, por lo tanto, nuestro punto final de URL será http: // api .flickr.com / services / rest /.

Tirando en datos públicos

Hay una serie de métodos que extraen datos públicos y, por lo tanto, no requieren autenticación de ningún tipo. Solo necesitamos la clave api que habíamos obtenido anteriormente junto con los argumentos requeridos del método en cuestión. Veamos un ejemplo..

El método getPublicGroups es un ejemplo de un método que no requiere autenticación y que extrae datos públicos. Pasamos la identificación de usuario del usuario y nuestra clave de api y la API responde en el formato que solicitó con una lista de grupos de los que el usuario forma parte..

Enviaríamos una solicitud a esta URL..

http://api.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=your_api_key&user_id=user_id_x

Reemplazar tu_api_clave con la llave que obtuvimos anteriormente y user_id_x con un NSID válido. Como me gusta que mis respuestas estén en JSON, puedo agregar otro parámetro que solicite a la API que responda con una carga JSON.

http://api.flickr.com/services/rest/?method=flickr.people.getPublicPhotos&api_key=your_api_key&user_id=user_id_x_format=json

La API enviará una respuesta así:

jsonFlickrApi ("photos": "page": 1, "pages": 1, "perpage": 100, "total": "2", "photo": ["id": "3728895285", "owner ":" 40318902 @ N02 "," secret ":" df6dfee053 "," server ":" 3466 "," farm ": 4," title ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689790", "owner": "40318902 @ N02", "secret": "ea9c38a675", "server": "2531", "farm": 3, "title ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0,]," stat ":" ok ")

Con el formato correcto, se verá así.

jsonFlickrApi ("photos": "page": 1, "pages": 1, "perpage": 100, "total": "2", "photo": ["id": "3729689790", "owner ":" 40318902 @ N02 "," secret ":" ea9c38a675 "," server ":" 3466 "," farm ": 4," title ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689845", "owner": "40318902 @ N02", "secret": "df6dfee053", "server": "2531", "farm": 3, "title ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")

Tirando en datos privados

Esta es probablemente la razón por la que desea aprender a trabajar con la API de Flickr, por lo que repasaremos cada paso lentamente, ya que esta parte tiene una tendencia a confundir a la gente..

Firma

Para obtener datos privados, cada método necesita autenticación y para que la autenticación funcione, cada una de nuestras llamadas debe estar firmada. La firma funciona así:

Haz una lista ordenada alfabéticamente de los argumentos

Por ejemplo, en el ejemplo anterior, nuestra lista se vería así:

  • api_key: xxx
  • formato: json
  • user_id: yyy

Crear la cadena de firma

La cadena de firma se crea tomando la API secreto obtuvimos anteriormente y luego le agregamos la lista de argumentos. Por ejemplo, nuestra cadena de firma se vería así:

0123456789api_keyxxxformatjsonuseridyyy

Firmando nuestra llamada

El paso final es la firma real. Flickr espera que tomemos el hash MD5 de nuestra cadena de firma y lo añadamos a nuestro método de llamada original como un parámetro con nombre.

Así que cualquier llamada autenticada tiene este formato general.

http://api.flickr.com/services/rest/?method=ourmethod&api_key=apikey&api_sig=hashedvalue

Obteniendo un frob

Ahora con la firma fuera del camino, ahora podemos pasar a la autenticación real. Flickr usa un sistema similar a OAuth para la autorización, lo que significa que un usuario que quiera usar nuestra aplicación no necesita divulgar sus credenciales de usuario. Los usuarios son transportados al sitio web de Flickr donde se le pregunta al usuario si desea permitir que nuestra aplicación acceda a los datos del usuario..

Aquí es donde un frob entra. Para crear el enlace de inicio de sesión que lleva al usuario a una página de autorización en Flickr, necesitamos una forma de identificar una sesión de inicio de sesión específica.

Para obtener un frob para identificar la sesión, necesitamos llamar al flickr.auth.getFrob pasando nuestra clave api como un argumento con nombre. Nuestra URL se vería así:

http://api.flickr.com/services/rest/?method=flickr.auth.getFrob&api_key=apikey&api_sig=hashedvalue

Una respuesta JSON se ve así:

frobcallback ("frob": "_content": "xxx", "stat": "ok")

Construyendo la URL de inicio de sesión

Una vez obtenido con éxito un frob, ahora podemos trabajar en la construcción de la URL que le permita al usuario autorizar nuestra aplicación. La URL de inicio de sesión tiene este formato general:

http://flickr.com/services/auth/?api_key=apikey&api_sig=apisig&perms=perms&frob=frob

Reemplace el valor de api_key con el que obtuvimos anteriormente, el valor de api_sig con un hash MD5 de nuestra cadena de firma y el valor de frob con el valor frob devuelto por la API. los perms parámetro define el nivel deseado de acceso a la cuenta y tiene valores válidos de leer, escribir y borrar. Cada acceso incluye los derechos de todos sus predecesores..

Una URL de inicio de sesión válida toma este formulario:

 http://flickr.com/services/auth/?api_key=63b08e2efcc22de9900163f4d761fdbc&api_sig=663369798c695dbe2fd7e2af7576dd2b&perms=delete&frob=72157621742021888.cash

Las páginas de autorización se ven así:


Primero, Flickr se asegura de que el usuario no haya sido engañado para autorizar la aplicación.
A continuación, se asegura de que el usuario conoce el nivel de autorización que otorga a la aplicación..
Autorización exitosa!

Obtención del token de autenticación.

Una vez que el usuario haya autorizado nuestra aplicación, podemos proceder. El paso final en este proceso es obtener una sello de autenticacion. Un token de autenticación vincula una clave de API específica a un ID de usuario específico, es decir, un token de autenticación se puede utilizar para manipular solo los datos de un usuario específico al usar una clave de API específica. Un token de autenticación es necesario para todas y cada una de las llamadas de métodos API que requieren autenticación.

Obtener un token de autenticación es tan simple como llamar al flickr.auth.getToken Método que pasa en la clave api, frob y api signature como parámetros nombrados. La URL se vería así:

http://flickr.com/services/auth/?api_key=apikey&api_sig=apisig&frob=frob

Una solicitud exitosa nos proporciona un token de autenticación que puede usarse indefinidamente para acceder a los datos de un usuario específico utilizando una clave api específica.

Haciendo la llamada

Ahora que se han cumplido todos los requisitos previos, podemos ir recuperando los datos según sea necesario. Recuerde, cada una de sus llamadas autenticadas debe estar firmada y, por lo tanto, cada llamada debe enviarse en api_key, auth_token y api_sig para que el método call funcione..

En la base mínima, la URL de su solicitud REST debe tener este aspecto. Otros parámetros específicos del método o parámetros que modifican la carga útil se pueden agregar según sea necesario.

 http://flickr.com/services/auth/?api_key=xxx&api_sig=yyy&auth_token=zzz&method=method_name

Al firmar, asegúrese de incluir también los otros argumentos y sus valores. Esta es una causa frecuente de error y dolor de cabeza y se puede corregir fácilmente. ¿Está incluyendo parámetros de devolución de llamada en la URL para evitar la restricción de dominios cruzados en los navegadores mientras usa AJAX? Los que tienen que ir en la cadena de la firma también!

Reconstruyendo las URLs

Veamos un ejemplo de respuesta para un método que devuelve fotos públicas..

jsonFlickrApi ("photos": "page": 1, "pages": 1, "perpage": 100, "total": "2", "photo": ["id": "3729689790", "owner ":" 40318902 @ N02 "," secret ":" ea9c38a675 "," server ":" 3466 "," farm ": 4," title ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689845", "owner": "40318902 @ N02", "secret": "df6dfee053", "server": "2531", "farm": 3, "title ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")

Todo está bien y elegante, pero la respuesta no contiene una URL a la que podríamos vincular. En su lugar, tenemos que construir una URL para la imagen en cuestión en función de los datos enviados desde el servidor. Aquí es cómo:

La URL de cada imagen en Flickr sigue un patrón bien definido. Desbloquea esto y la respuesta comienza a tener mucho más sentido. Aquí está la URL de una imagen en mi cuenta.

http://farm3.static.flickr.com/2531/3729689790_ea9c38a675_b.jpg

La URL está formada por varias partes:

  • Identificación de la granja. 3 en nuestro caso.
  • ID del servidor. 2531 aquí.
  • Identificación con foto: una forma de identificar de manera única todas y cada una de las fotos alojadas en Flickr. 3729689845 en este caso.
  • Foto secreta - ea9c38a675
  • Tamaño de imagen: define el tamaño de la imagen que se devolverá. Los valores posibles incluyen o para el original, b para un ancho / alto de 1024, m para 240, t para 100 y s para 75. Cuando no se especifica, el valor predeterminado es un ancho / alto de 500.

En resumen, para construir la fuente de la imagen, el enlace se vería como el que se muestra a continuación si se nos hiciera analizar la respuesta JSON, donde los datos son la variable que contiene la respuesta:

"http: // farm" + data.photos.photo [i] .farm + ".static.flickr.com /" + data.photos.photo [i] .server + "/" + data.photos.photo [ i] .id + "_" + data.photos.photo [i] .secret + ".jpg

Subiendo a Flickr

Ahora que hemos echado un vistazo a cómo recuperar datos de Flickr usando su API, es hora de echar un vistazo a cómo devolver datos.

La API de carga de Flickr es distinta de las API basadas en REST o SOAP, ya que no hay puntos finales de URL a los que pueda acceder y recuperar datos. En su lugar, los datos deben enviarse mediante una solicitud POST a

http://api.flickr.com/services/upload/

Ya que está fuera del alcance de este artículo para mostrarle cómo construir una consulta POST desde cero, usaremos un elemento de formulario con un valor de enctype de multipart / form-data Para generar todo el código para nosotros. El uso de este atributo determinado nos permite afirmar que el formulario contiene datos binarios y que debe manejarse como tal. Una forma de muestra se vería así.

Pero recuerde, todavía debemos enviar una serie de parámetros al servicio, incluida la clave api, el token de autenticación y la firma del método. ¿Como hacemos eso? Es solo una cuestión de crear un campo de texto oculto y modificar su valor para reflejar los valores correctos. Al igual que:

Recuerde que al generar el hash MD5 de la cadena de firma debe cargar cada Elemento del formulario excluyendo el campo foto. Esto incluye el valor de los botones de envío ya que los contenidos de todo el formulario se publican en la URL. Para el ejemplo anterior, el hash debería calcularse así:

var hash = MD5 (secreto + "api_key" + apikey + "auth_token" + token + "submitUpload");

No estás enteramente limitado a esos argumentos. La API de carga admite varios argumentos, incluido el título de la foto, su título y su descripción. Si lo desea, puede permitir al usuario ingresar todos esos datos junto con la configuración de privacidad de la siguiente manera:

Métodos de uso común

Un artículo sobre cómo trabajar con la API de un servicio estaría claramente incompleto sin echar un vistazo a algunos de los métodos API más utilizados. Con esto en mente, aquí hay algunos métodos de API que deberían ser muy útiles independientemente de si está creando un mashup o simplemente busca recuperar sus propios datos..

Recuerde, las llamadas autenticadas requieren valores válidos para que funcionen los parámetros api_key, api_sig y auth_token, mientras que las llamadas normales pueden o no requerir parámetros específicos del método. Todos las llamadas requieren que se envíe el parámetro api_key. Entonces, si menciono que la llamada requiere autenticación, el hecho de que la llamada requiera los otros argumentos está implícitamente implícito. Los argumentos anotados a continuación son opcionales a menos que se mencione lo contrario Los métodos que devuelven una lista de datos también toman una página y un argumento per_page para definir sus nombres..

He incluido las respuestas de cada método para darle una idea sobre los datos que se nos devuelven. He optado por JSON como formato de respuesta, ya que la mayoría de los desarrolladores con los que trabajo como JSON son mejores que XML.

flickr.activity.userPhotos
Devuelve una lista de la actividad reciente en las fotos que pertenecen al usuario llamante.

Argumentos: timeframe - Define el marco de tiempo en el que buscar actualizaciones.
Autenticación: Si
Respuesta

"items": "item": ["type": "photo", "id": "3728895285", "owner": "40318902 @ N02", "ownername": "lordtottuu", "secret": "df6dfee053", "server": "3466", "farm": 4, "title": "_content": "opac", "commentsold": 1, "commentsnew": 0, "notesold:: 0, "notesnew": 0, "views": 0, "faves": 0, "more": 0, "activity": "event": ["type": "comment", "commentid": "40298554- 3728895285-72157621628251433 "," usuario ":" 40318902 @ N02 "," username ":" lordtottuu "," dateadded ":" 1248131143 "," _content ":" Demo image for my coming on Net Tuts "] ], "page": 1, "pages": 1, "perpage": 10, "total": 1, "stat": "ok"

flickr.contacts.getList
Devuelve una lista de contactos para el usuario llamante..

Argumentos: filter - Argumento para filtrar la lista. Los valores válidos incluyen amigos, familiares, ambos y ninguno.
Autenticación: Si
Respuesta

"contacts": "page": 1, "pages": 1, "per_page": 1000, "perpage": 1000, "total": 2, "contact": ["nsid": "7488445 @ N05 "," username ":" thegleek "," iconserver ":" 179 "," iconfarm ": 1," ignored ": 0," realname ":" Mike Poleski "," friend ":" 1 "," family " : "0", "path_alias": null, "location": ""] // Resto de los contactos, "stat": "ok"

flickr.favorites.getList
Devuelve una lista de fotos marcadas como favoritas por un usuario específico.

Argumentos: min_fave_date, max_fav_date - Se explica por sí mismo.
Autenticación: Si
Respuesta

"photos": "page": 1, "pages": 1, "perpage": 100, "total": "3", "photo": ["id": "2332823355", "owner": "53555705 @ N00", "secreto": "e603be40a2", "servidor": "2333", "granja": 3, "título": "Xbox 360 still life", "ispublic": 1, "isfriend": 0 , "isfamily": 0, "date_faved": "1248134938"] // Resto de las fotos, "stat": "ok"

flickr.people.getPublicPhotos
Obtener una lista de fotos públicas para el usuario dado.

Argumentos: nsid [requerido] - Id. del usuario llamante, safe_search - Para bloquear el contenido NSFW.
Autenticación: No
Respuesta

"photos": "page": 1, "pages": 1, "perpage": 100, "total": "15", "photo": ["id": "3728895285", "owner": "40318902 @ N02", "secreto": "df6dfee053", "servidor": "3466", "granja": 4, "título": "opac", "ispublic": 1, "isfriend": 0, "isfamily ": 0] // Resto de las fotos," stat ":" ok "

flickr.groups.getInfo
Para obtener información sobre un grupo en particular.

Argumentos: group_id [requerido]: el ID del grupo sobre el que busca información.
Autenticación: No
Respuesta

"group": "id": "51035612836 @ N01", "iconserver": "1", "iconfarm": 1, "name": "_content": "Flickr API", "description":  "_content": string "Un grupo de Flickr para proyectos de la API de Flickr. Impulsa el conocimiento de la API de Flickr, los proyectos que la usan y esas increíbles ideas que producen los sistemas expuestos de forma programada. Piense en la API de Google + Amazon API + API de Flickr con un poco de GMail lanzado Los desarrolladores de Flickr señalaron correctamente que quieren mantener las discusiones técnicas directamente relacionadas con la API en la lista de correo ". , "members": "_content": "7775", "privacy": object "_content": "3", "lang": null, "ispoolmoderated": 1, "throttle": object " count ":" 3 "," mode ":" day "," restricciones ": objeto " photos_ok ": 1," videos_ok ": 1," images_ok ": 1," screens_ok ": 1," art_ok ": 1, "safe_ok": 1, "moderado_ok": 0, "restricted_ok": 0, "has_geo": 0, "stat": "ok"

flickr.photos.getExif
Extrae datos EXIF ​​de una foto existente .

Argumentos: photo_id [requerido] - ID de la foto cuyos datos EXIF ​​se van a extraer.
Autenticación: No
Respuesta

"photo": "id": "2332823355", "secret": "e603be40a2", "server": "2333", "farm": 3, "exif": ["tagspace": "TIFF", "tagspaceid": 1, "tag": 271, "label": "Make", "raw": "_content": "Canon", "tagspace": "TIFF", "tagspaceid": 1, "tag": 272, "label": "Model", "raw": "_content": "Canon EOS 350D DIGITAL", // Resto de los datos exif], "stat": "ok"

flickr.photos.geo.getLocation
Devuelve la latitud y longitud del lugar donde se tomó una foto específica.

Argumentos: photo_d [requerido] - ID de la foto cuya ubicación se debe conocer.
Autenticación: No
Respuesta

"foto": objeto "id": cadena "229097925", "ubicación": objeto "latitud": -33.856874, "longitud": 151.214672, "exactitud": "16", "contexto": "0" , "localidad": "_content": "Sydney", "place_id": "p50kaZyYAJx9BZHQ", "woeid": "1105779", "region": object "_content": "New South Wales", "place_id" : "puGzSeubAphuNnF2", "woeid": "2344700", "country": object "_content": "Australia", "place_id": "om3Zr2abAphqrm3jdA", "woeid": "23424748", "place_id: string "p50kaZyYAJx9BZHQ", "woeid": string "1105779", "stat": string "ok"

flickr.photos.getFavoritos
Devuelve una lista de personas que han marcado la foto pasada como favorita.

Argumentos: photo_id [requerido] - ID de la foto en cuestión.
Autenticación: No
Respuesta

"foto": "persona": ["nsid": "39011391 @ N06", "username": "derek1960", "favedate": "1243834286", // Resto de las fotos], "id" : "229097925", "secreto": "13a21546fb", "servidor": "61", "granja": 1, "página": 1, "páginas": 2, "por página": 10, "total": " 18 "...," stat ":" ok "

flickr.places.getTopPlacesList
Devuelve una lista de los 100 lugares más etiquetados de un día..

Argumentos: place_type_id [requerido] - ID numérico de un lugar para definir cómo agrupar fotos.
Autenticación: No
Respuesta

"places": objeto "total": number100, "place": ["place_id": "4KO02SibApitvSBieQ", "woeid": "23424977", "latitude": "48.890", "longitude": "-116.982 "," place_url ":" / United + States "," place_type ":" country "," place_type_id ":" 12 "," _content ":" United States "," photo_count ":" 23654 ", // Rest de los 99 países], "date_start": 1248048000, "date_stop": 1248134399, "stat": "ok"

flickr.tags.getHotList
Devuelve una lista de las etiquetas más utilizadas para un período de tiempo determinado.

Argumentos: periodo - Especifica el periodo para el cual obtener etiquetas. recuento: especifica el número de etiquetas que se devolverán en la respuesta.
Autenticación: No
Respuesta

"hottags": "period": "day", "count": 20, "tag": ["score": "100", "_content": "sundaystreets", "score": "100 "," _content ":" happymondayblues ", " score ":" 100 "," _content ":" melbourneopenhouse2009 "]," stat ": string" ok "

En conclusión

En esta parte inicial de la serie, analizamos cómo trabajar con la API de Flickr, incluido cómo recuperar datos públicos y privados, la autenticación con la API y cómo cargar datos en el servicio. También examinamos algunos de los métodos API más utilizados junto con sus respuestas JSON para comprender mejor la estructura de los datos que la API envía..

La API que se cubre a continuación depende totalmente de usted. Aquí, en Net Tuts, atendemos la demanda popular y, por lo tanto, vamos a dejar que ustedes, los lectores, decidan qué API de servicio se escribirá a continuación. En su comentario a continuación, deje el nombre del servicio y la interfaz de la API, si es necesario. Cubrimos REST en este artículo, pero nos complacería cubrir las API basadas en SOAP o XML-RPC si la gente lo desea..

Preguntas? Cosas bonitas que decir? Criticas? Pulsa la sección de comentarios y déjame un comentario. Feliz codificacion!

  • Síganos en Twitter o suscríbase a la Fuente RSS de NETTUTS para obtener más artículos y artículos de desarrollo web diarios.