La guida definitiva alla decodifica dell'API di Flickr

Flickr, essendo il più grande sito di gestione e condivisione delle foto al mondo, ha un'API impressionante per consentire agli sviluppatori di accedere e manipolare quasi tutti i suoi dati. Diamo un'occhiata a come lavorare con l'API: al livello più basso possibile.

Una parola dall'autore

In questa era del Web 2.0, le applicazioni web che hanno un'API intuitiva e facile da usare hanno un netto vantaggio in quanto consentono agli sviluppatori di sfruttare e creare per la piattaforma e quindi catturare più utenti. Mentre ci avviciniamo al social web e ai mashup, una buona API non è più una bella aggiunta: è assolutamente necessaria. E ricorda che troppa astrazione non è mai una buona cosa. Mentre ci sono un certo numero di kit API là fuori per semplificare il lavoro con l'API in questione, non sarebbe bello sapere cosa sta succedendo in realtà? Non sarebbe eccitante decostruire il vero voodoo tra il kit e l'API? Sì, lo pensavo! In questa nuova serie, daremo un'occhiata alle API di alcuni dei servizi più popolari là fuori. Oggi diamo un'occhiata all'API di Flickr.

La sequenza degli eventi

Il tango tra lo sviluppatore e l'API inizia e culmina in una serie di passaggi ben definiti. Spiegherò ogni passo mentre procediamo.

Decidere il tipo di applicazione

Prima di tutto, dobbiamo decidere il tipo di applicazione che stiamo per costruire. Applicazioni desktop avere utilizzare il modello desktop mentre un'applicazione Web può utilizzare uno dei modelli. Il modello mobile va oltre lo scopo di questo articolo.

Per questo articolo ho scelto di andare con il modello desktop dal momento che il modello web richiede che tutti i test vengano eseguiti sul dominio su cui l'app deve essere distribuita. Questo potrebbe non essere necessariamente fattibile per molte persone. Scegliamo il modello desktop poiché è privo di questa restrizione.

Ottenere una chiave API

Il prossimo passo è ottenere una chiave dell'applicazione. Flickr utilizza questo tasto app per tenere sotto controllo il nostro utilizzo e altre statistiche. Vai qui e chiedi la tua chiave API.

Poiché il nostro utilizzo di questa particolare chiave API è puramente educativo, scegliamo di ottenere una chiave non commerciale.

Compila tutti i dettagli richiesti dal modulo con particolare attenzione alla descrizione del progetto. Gli sviluppatori di Flickr leggono effettivamente questa descrizione se la tua app si comporta male in qualche modo per assicurarsi che sia legittima. Quindi trascorri quel minuto in più che descrive il tuo capolavoro.

Una registrazione riuscita ti porta questa pagina. Annotare la chiave API e il segreto condiviso per un uso successivo.

Nozioni di base sull'API di Flickr

L'API di Flickr fornisce una serie di metodi che possono o non possono richiedere l'autenticazione. Ogni metodo accetta un numero di argomenti che ne modificano il comportamento e il carico utile. Le risposte possono essere ricevute in numerosi formati, tra cui JSON, XML, SOAP e REST. Tutte queste richieste possono essere fatte ai punti finali corrispondenti al formato che hai scelto per effettuare la richiesta. Ad esempio, utilizzeremo REST per il resto di questo articolo e quindi il nostro endpoint URL sarà http: // api .flickr.com / servizi / riposo /.

Tirare i dati pubblici

Esistono numerosi metodi che inseriscono dati pubblici e quindi non richiedono alcuna autenticazione di sorta. Abbiamo solo bisogno della chiave API che abbiamo ottenuto in precedenza insieme a qualsiasi argomento richiesto del metodo in questione. Diamo un'occhiata a un esempio.

Il metodo getPublicGroups è un esempio di un metodo che non richiede l'autenticazione e che richiama dati pubblici. Passiamo l'id utente dell'utente e la nostra chiave API e l'API risponde nel formato richiesto con un elenco di gruppi di cui l'utente fa parte.

Vorremmo inviare una richiesta a questo URL.

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

Sostituire your_api_key con la chiave che abbiamo ottenuto in precedenza e user_id_x con un NSID valido. Poiché mi piace che le mie risposte siano in JSON, posso aggiungere un altro parametro chiedendo all'API di rispondere con un payload 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 invierà una risposta in questo modo:

jsonFlickrApi ("foto": "pagina": 1, "pagine": 1, "per pagina": 100, "totale": "2", "foto": ["id": "3728895285", "proprietario ":" 40318902 @ N02 "," segreto ":" df6dfee053 "," server ":" 3466 "," farm ": 4," title ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689790", "proprietario": "40318902 @ N02", "segreto": "ea9c38a675", "server": "2531", "farm": 3, "titolo ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0,]," stat ":" ok ")

Correttamente formattato, assomiglierà a questo.

jsonFlickrApi ("foto": "pagina": 1, "pagine": 1, "per pagina": 100, "totale": "2", "foto": ["id": "3729689790", "proprietario ":" 40318902 @ N02 "," segreto ":" ea9c38a675 "," server ":" 3466 "," farm ": 4," title ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689845", "proprietario": "40318902 @ N02", "segreto": "df6dfee053", "server": "2531", "farm": 3, "titolo ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")

Tirare i dati personali

Questo è probabilmente il motivo per cui vuoi imparare come lavorare con l'API di Flickr e quindi analizzeremo ogni passaggio lentamente poiché questa parte tende a confondere le persone.

firma

Per ottenere dati privati, ogni metodo richiede l'autenticazione e affinché l'autenticazione funzioni, ciascuna delle nostre chiamate deve essere firmata. La firma funziona così:

Crea una lista alfabetica degli argomenti

Ad esempio, nell'esempio precedente la nostra lista sarebbe così:

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

Crea la stringa della firma

La stringa della firma viene creata prendendo il Segreto dell'API abbiamo ottenuto in precedenza e quindi aggiungendo l'elenco di argomenti ad esso. Ad esempio, la nostra stringa di firma sarebbe così:

0123456789api_keyxxxformatjsonuseridyyy

Firmando la nostra chiamata

Il passo finale è la firma effettiva. Flickr si aspetta che prendiamo l'hash MD5 della nostra stringa di firma e lo aggiungiamo alla nostra chiamata al metodo originale come parametro con nome.

Quindi ogni chiamata autenticata ha questo formato generale

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

Ottenere un frob

Ora, con la firma, possiamo ora passare all'autentica autenticazione. Flickr utilizza un sistema simile a OAuth per l'autorizzazione, il che significa che un utente che desidera utilizzare la nostra app non ha bisogno di divulgare le proprie credenziali utente. Gli utenti vengono trasportati sul sito Web di Flickr dove viene chiesto all'utente se desidera consentire alla nostra app di accedere ai dati dell'utente.

Questo è dove a frob entra. Per creare il collegamento di accesso che porta l'utente a una pagina di autorizzazione su Flickr, abbiamo bisogno di un modo per identificare una sessione di login specifica.

Per ottenere un frob per identificare la sessione, dobbiamo chiamare il flickr.auth.getFrob passando la nostra chiave API come argomento con nome. Il nostro URL dovrebbe essere così:

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

Una risposta JSON sembra così:

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

Costruire l'URL di accesso

Dopo aver ottenuto con successo un frob, ora possiamo lavorare sulla creazione dell'URL che consente all'utente di autorizzare la nostra applicazione. L'URL di accesso ha questo formato generale:

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

Sostituisci il valore di akey_key con quello che avevamo ottenuto in precedenza, il valore di api_sig con un hash MD5 della nostra stringa di firma e il valore di frob con il valore frob restituito dall'API. Il permanenti parametro definisce il livello desiderato di accesso all'account e ha valori validi di leggi, scrivi e cancella. Ogni accesso include i diritti di tutti i suoi predecessori.

Un URL di accesso valido assume questo formato:

 http://flickr.com/services/auth/?api_key=63b08e2efcc22de9900163f4d761fdbc&api_sig=663369798c695dbe2fd7e2af7576dd2b&perms=delete&frob=72157621742082858-8e995a1104e28114-870912

Le pagine di autorizzazione sono così:


Innanzitutto, Flickr si assicura che l'utente non sia stato convinto nell'autorizzazione dell'applicazione.
Successivamente, si assicura che l'utente conosca il livello di autorizzazione che sta concedendo all'applicazione.
Autorizzazione riuscita!

Ottenere il token di autenticazione

Una volta che l'utente ha dato l'autorizzazione per la nostra applicazione, possiamo procedere in avanti. Il passaggio finale in questo processo è ottenere un auth_token. Un token di autenticazione lega una chiave API specifica a un ID utente specifico in cui un token di autenticazione può essere utilizzato per manipolare solo i dati di un utente specifico mentre si utilizza una chiave API specifica. Un token di autenticazione è necessario per ogni chiamata al metodo API che richiede l'autenticazione.

Ottenere un token di autenticazione è semplice come chiamare il flickr.auth.getToken metodo che passa nella chiave API, firma frob e api come parametri con nome. L'URL dovrebbe essere così:

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

Una richiesta corretta ci autorizza un token di autenticazione che può essere utilizzato indefinitamente per accedere a dati di un utente specifico utilizzando una chiave API specifica.

Effettuare la chiamata

Ora che tutti i prerequisiti sono stati soddisfatti, possiamo andare a recuperare i dati secondo necessità. Ricorda, ciascuna delle tue chiamate autenticate deve essere firmata e quindi ogni chiamata deve inviare il api_key, auth_token e api_sig per il metodo call to work.

Al minimo di base, l'URL della richiesta REST deve apparire come questo. Altri parametri o parametri specifici del metodo che modificano il carico utile possono essere aggiunti secondo necessità.

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

Durante la firma, assicurati di includere anche gli altri argomenti e i loro valori. Questa è una causa frequente di errore e mal di testa ed è facilmente risolta. Stai includendo parametri di callback nell'URL per evitare la restrizione cross-domain nei browser durante l'utilizzo di AJAX? Anche quelli devono andare nella stringa della firma!

Ricostruire gli URL

Diamo un'occhiata a una risposta di esempio per un metodo che restituisce foto pubbliche.

jsonFlickrApi ("foto": "pagina": 1, "pagine": 1, "per pagina": 100, "totale": "2", "foto": ["id": "3729689790", "proprietario ":" 40318902 @ N02 "," segreto ":" ea9c38a675 "," server ":" 3466 "," farm ": 4," title ":" opac "," ispublic ": 1," isfriend ": 0, "isfamily": 0, "id": "3729689845", "proprietario": "40318902 @ N02", "segreto": "df6dfee053", "server": "2531", "farm": 3, "titolo ":" scale "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")

Va tutto bene e dandy ma la risposta non contiene un URL a cui potremmo semplicemente collegarci. Invece dobbiamo costruire un URL per l'immagine in questione in base ai dati inviati dal server. Ecco come:

L'URL di Ever image su Flickr segue uno schema ben definito. Sblocca questo e la risposta inizia ad avere molto più senso. Ecco l'URL di un'immagine nel mio account.

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

L'URL è composto da un numero di parti:

  • Farm ID. 3 nel nostro caso.
  • ID del server. 2531 qui.
  • ID foto: un modo per identificare in modo univoco ogni singola foto ospitata da Flickr. 3729689845 in questo caso.
  • Foto segreta - ea9c38a675
  • Dimensione immagine: definisce la dimensione dell'immagine da restituire. I valori possibili includono o per originale, b per larghezza / altezza di 1024, m per 240, t per 100 e s per 75. Se non specificato, il valore predefinito è una larghezza / altezza di 500.

In breve, al fine di costruire la fonte dell'immagine, il collegamento sarebbe simile a quello mostrato di seguito se siamo stati fatti per analizzare la risposta JSON in cui i dati sono la variabile che contiene la risposta:

"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

Caricamento su Flickr

Ora che abbiamo dato un'occhiata a come recuperare i dati da Flickr usando la sua API, è tempo di dare un'occhiata a come inviare i dati indietro.

L'API di caricamento di Flickr è distinta dalle API basate su REST o SOAP in quanto non esistono endpoint URL a cui accedere e recuperare dati. Invece i dati devono essere inviati tramite una richiesta POST a

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

Dal momento che è al di fuori dello scopo di questo articolo per mostrarti come costruire una query POST da zero, useremo un elemento form con un valore enctype di / Form-data multipart per generare tutto il codice per noi. Usando questo attributo specifico possiamo affermare che il modulo contiene dati binari e che deve essere gestito come tale. Un modulo di esempio sarebbe simile a questo.

Ma ricorda, abbiamo ancora bisogno di inviare un numero di parametri al servizio tra cui la chiave API, il token auth e la firma del metodo. Come lo facciamo? È solo questione di creare un campo di testo nascosto e modificarne il valore per riflettere i valori corretti. Così:

Ricorda che durante la generazione dell'hash MD5 della stringa della firma devi caricare ogni elemento del modulo escluso il campo fotografico. Ciò include il valore dei pulsanti di invio poiché i contenuti dell'intero modulo sono pubblicati nell'URL. Per l'esempio sopra, l'hash dovrebbe essere calcolato in questo modo:

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

Non sei completamente limitato a questi argomenti. L'API di caricamento contiene una serie di argomenti tra cui il titolo della foto, il titolo e la descrizione. Se volessi, potresti facilmente consentire all'utente di inserire tutti questi dati insieme alle impostazioni della privacy in questo modo:

Metodi comunemente usati

Un articolo su come lavorare con l'API di un servizio sarebbe chiaramente incompleto senza dare uno sguardo ad alcuni dei metodi API più usati. Con questo in mente, ecco alcuni metodi API che dovrebbero essere molto utili indipendentemente dal fatto che si stia creando un mashup o semplicemente cercando di recuperare i propri dati.

Ricorda, le chiamate autenticate richiedono valori validi per i parametri api_key, api_sig e auth_token per funzionare mentre le chiamate normali potrebbero o meno richiedere parametri specifici del metodo. Tutti le chiamate richiedono l'invio del parametro api_key. Quindi, se cito che la chiamata richiede l'autenticazione, il fatto che la chiamata richieda gli altri argomenti è implicito implicitamente. Gli argomenti indicati di seguito sono facoltativi, salvo diversamente indicato. I metodi che restituiscono un elenco di dati accettano anche un argomento page e per_page per definire i loro omonimi.

Ho incluso le risposte di ciascun metodo per darti un'idea dei dati che ci vengono restituiti. Sono andato con JSON come formato di risposta dal momento che la maggior parte degli sviluppatori lavora con JSON meglio di XML.

flickr.activity.userPhotos
Restituisce un elenco di attività recenti su foto appartenenti all'utente chiamante.

argomenti: timeframe: definisce il periodo di tempo in cui cercare gli aggiornamenti.
Autenticazione: Sì
Risposta

"articoli": "oggetto": ["tipo": "foto", "id": "3728895285", "proprietario": "40318902 @ N02", "nome proprio": "lordtottuu", "segreto": "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 "," utente ":" 40318902 @ N02 "," nomeutente ":" lordtottuu "," dateadded ":" 1248131143 "," _content ":" Immagine demo per il mio prossimo articolo su Net Tuts "] ], "pagina": 1, "pagine": 1, "per pagina": 10, "totale": 1, "stat": "ok"

flickr.contacts.getList
Restituisce un elenco di contatti per l'utente chiamante.

argomenti: filter - Argument per filtrare l'elenco. I valori validi includono amici, famiglia, entrambi e nessuno dei due.
Autenticazione: Sì
Risposta

"contatti": "pagina": 1, "pagine": 1, "per_page": 1000, "per pagina": 1000, "totale": 2, "contatto": ["nsid": "7488445 @ N05 "," username ":" thegleek "," iconserver ":" 179 "," iconfarm ": 1," ignorato ": 0," realname ":" Mike Poleski "," friend ":" 1 "," family " : "0", "path_alias": null, "posizione": ""] // Resto dei contatti, "stat": "ok"

flickr.favorites.getList
Restituisce un elenco di foto contrassegnate come preferite da un utente specifico.

argomenti: min_fave_date, max_fav_date - Auto esplicativo.
Autenticazione: Sì
Risposta

"foto": "pagina": 1, "pagine": 1, "per pagina": 100, "totale": "3", "foto": ["id": "2332823355", "proprietario": "53555705 @ N00", "segreto": "e603be40a2", "server": "2333", "farm": 3, "titolo": "Xbox 360 still life", "ispublic": 1, "isfriend": 0 , "isfamily": 0, "date_faved": "1248134938"] // Resto delle foto, "stat": "ok"

flickr.people.getPublicPhotos
Ottieni un elenco di foto pubbliche per l'utente specificato.

argomenti: nsid [richiesto] - ID dell'utente chiamante, safe_search - Per bloccare il contenuto NSFW.
Autenticazione: No
Risposta

"foto": "pagina": 1, "pagine": 1, "per pagina": 100, "totale": "15", "foto": ["id": "3728895285", "proprietario": "40318902 @ N02", "segreto": "df6dfee053", "server": "3466", "farm": 4, "titolo": "opac", "ispublic": 1, "isfriend": 0, "isfamily ": 0] // Resto della foto," stat ":" ok "

flickr.groups.getInfo
Per ottenere informazioni su un particolare gruppo.

argomenti: group_id [richiesto] - L'ID del gruppo di cui si cercano informazioni.
Autenticazione: No
Risposta

"group": "id": "51035612836 @ N01", "iconserver": "1", "iconfarm": 1, "nome": "_content": "Flickr API", "descrizione":  "_content": string "Un gruppo Flickr per i progetti Flickr API. Sensibilizzare l'Flickr API, i progetti che lo utilizzano e le incredibili idee che i sistemi esposti a livello di codice producono." Google API + Amazon API + Flickr API con un po 'di GMail generata Gli sviluppatori di Flickr hanno giustamente sottolineato che vogliono mantenere discussioni tecniche direttamente correlate all'API nella mailing list. " , "membri": "_content": "7775", "privacy": object "_content": "3", "lang": null, "ispoolmoderated": 1, "throttle": object " count ":" 3 "," mode ":" day "," restricments ": object " photos_ok ": 1," videos_ok ": 1," images_ok ": 1," screens_ok ": 1," art_ok ": 1, "safe_ok": 1, "moderato_ok": 0, "restricted_ok": 0, "has_geo": 0, "stat": "ok"

flickr.photos.getExif
Estrae i dati EXIF ​​di una foto esistente .

argomenti: photo_id [richiesto] - ID della foto i cui dati EXIF ​​devono essere estratti.
Autenticazione: No
Risposta

"foto": "id": "2332823355", "segreto": "e603be40a2", "server": "2333", "farm": 3, "exif": ["spazio tag": "TIFF", "tagspaceid": 1, "tag": 271, "label": "Make", "raw": "_content": "Canon", "tags": "TIFF", "tagspaceid": 1, "tag": 272, "label": "Model", "raw": "_content": "Canon EOS 350D DIGITAL", // Resto dei dati exif], "stat": "ok"

flickr.photos.geo.getLocation
Restituisce la latitudine e la longitudine del luogo in cui è stata scattata una foto specifica.

argomenti: photo_d [richiesto] - ID della foto di cui si deve conoscere la posizione.
Autenticazione: No
Risposta

"foto": object "id": stringa "229097925", "posizione": oggetto "latitudine": -33.856874, "longitudine": 151.214672, "precisione": "16", "contesto": "0" , "località": "_content": "Sydney", "place_id": "p50kaZyYAJx9BZHQ", "woeid": "1105779", "region": oggetto "_content": "New South Wales", "place_id" : "puGzSeubAphuNnF2", "woeid": "2344700", "country": object "_content": "Australia", "place_id": "om3Zr2abAphqrm3jdA", "woeid": "23424748", "place_id": stringa "p50kaZyYAJx9BZHQ", "woeid": stringa "1105779", "stat": stringa "ok"

flickr.photos.getFavorites
Restituisce un elenco di persone che hanno contrassegnato la foto passata come preferita.

argomenti: photo_id [richiesto] - ID della foto in questione.
Autenticazione: No
Risposta

"foto": "persona": ["nsid": "39011391 @ N06", "nomeutente": "derek1960", "favedate": "1243834286", // Resto delle foto], "id" : "229097925", "segreto": "13a21546fb", "server": "61", "farm": 1, "pagina": 1, "pagine": 2, "per pagina": 10, "totale": " 18 "...," stat ":" ok "

flickr.places.getTopPlacesList
Restituisce un elenco dei 100 luoghi più taggati per un giorno.

argomenti: place_type_id [richiesto] - ID numerico di un luogo per definire come raggruppare le foto.
Autenticazione: No
Risposta

"places": object "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 ":" Stati Uniti "," foto_count ":" 23654 ", // Rest dei 99 paesi], "data_start": 1248048000, "date_stop": 1248134399, "stat": "ok"

flickr.tags.getHotList
Restituisce un elenco dei tag più utilizzati per un determinato periodo di tempo.

argomenti: period - Specifica il periodo per il quale ottenere i tag. conteggio: specifica il numero di tag da restituire nella risposta.
Autenticazione: No
Risposta

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

In conclusione

In questa parte iniziale della serie, abbiamo esaminato come lavorare con l'API di Flickr, incluso come recuperare i dati pubblici e privati, l'autenticazione con l'API e come caricare i dati nel servizio. Abbiamo anche esaminato alcuni dei metodi API più utilizzati insieme alle loro risposte JSON per comprendere meglio la struttura dei dati che l'API restituisce.

Quale delle prossime API è interamente a te. Qui, su Net Tuts, rispondiamo alle richieste più diffuse e quindi consentiremo a te, i lettori, di decidere quale API del servizio verrà scritta in seguito. Nel tuo commento qui sotto, lascia il nome del servizio e l'interfaccia API, se necessario. Abbiamo parlato di REST in questo articolo, ma saremmo lieti di includere le API basate su SOAP o XML-RPC se un numero sufficiente di persone lo desidera.

Domande? Belle cose da dire? Critiche? Colpisci la sezione dei commenti e lasciami un commento. Buona programmazione!

  • Seguici su Twitter o iscriviti al feed RSS di NETTUTS per ulteriori tuts e articoli di sviluppo web giornalieri.