Den ultimate guiden til dekoding av Flickr API

Flickr, som er den største bildeledelsen og delingsstedet i verden, har en imponerende API for å la utviklere få tilgang til og manipulere nesten alle dataene. La oss se på hvordan du arbeider med API: på lavest mulig nivå.

Et ord fra forfatteren

I denne Web 2.0-epoken har webprogrammer som har en brukervennlig, intuitiv API en klar fordel, da utviklerne kan utnytte og bygge for plattformen og dermed fange flere brukere. Når vi beveger oss mot sosiale nettsider og mashups, er en god API ikke et fint tillegg lenger: det er rett og slett nødvendig. Og husk for mye abstraksjon er aldri en god ting. Selv om det finnes en rekke API-kits der ute for å forenkle arbeidet med API-en, ville det ikke vært kult å vite hva som faktisk foregår under hetten? Ville det ikke være spennende å dekonstruere den faktiske voodoo som skjer mellom kit og API? Ja, jeg trodde det! I denne nye serien tar vi en titt på APIene for noen av de mest populære tjenestene der ute. I dag tar vi en titt på Flickr API.

Sekvensen av hendelser

Tango mellom utvikler og API begynner og kulminerer i en rekke veldefinerte trinn. Jeg skal forklare hvert trinn når vi går.

Bestemmer type søknad

Først av alt må vi bestemme hvilken type søknad vi skal bygge. Stasjonære applikasjoner ha å bruke skrivebordsmodellen mens et webprogram kan bruke en av modellene. Mobilmodellen er utenfor rammen av denne artikkelen.

For denne artikkelen har jeg valgt å gå med skrivebordsmodellen siden webmodellen krever at alle testene skal gjøres på domenet som appen skal distribueres til. Dette kan ikke nødvendigvis være mulig for mange mennesker. Vi velger skrivebordsmodellen, siden den er uten denne begrensningen.

Skaffe en API-nøkkel

Det neste trinnet er å skaffe en applikasjonsnøkkel. Flickr bruker denne appnøkkelen til å holde faner på bruken vår og annen statistikk. Hodet på her og søk etter din egen API-nøkkel.

Siden vår bruk av denne bestemte API-nøkkelen er rent pedagogisk, velger vi å skaffe en ikke-kommersiell nøkkel.

Fyll ut alle detaljer skjemaet krever, med spesiell oppmerksomhet til beskrivelsen av prosjektet. Devs på Flickr leser faktisk denne beskrivelsen hvis appen din feiler på en eller annen måte for å sikre at den er legitim. Så tilbringe det ekstra minuttet som beskriver mesterverket ditt.

En vellykket registrering gir deg denne siden. Legg merke til api-nøkkelen og den delte hemmeligheten for senere bruk.

Flickr API Grunnleggende

Flickr API gir en rekke metoder som kanskje eller ikke krever godkjenning. Hver metode tar en rekke argumenter som endrer oppførsel og nyttelast. Respons kan mottas i en rekke formater, inkludert JSON, XML, SOAP og REST. Alle disse forespørslene kan gjøres til sluttpunkter som svarer til formatet du har valgt for å gjøre forespørselen inn. For eksempel bruker vi REST for resten av denne artikkelen, og så vil URL-sluttpunktet være http: // api .flickr.com / tjenester / hvile /.

Trekke i offentlige data

Det finnes en rekke metoder som trekker inn offentlige data og krever derfor ingen godkjenning av noe slag. Vi trenger bare api-nøkkelen vi hadde oppnådd tidligere, sammen med eventuelle nødvendige argumenter for den aktuelle metoden. La oss se på et eksempel.

Metoden getPublicGroups er et eksempel på en metode som ikke krever godkjenning, og som trekker i offentlige data. Vi sender inn brukerens bruker-ID og vår api-nøkkel, og API-en reagerer i det formatet du ba om med en liste over grupper brukeren er en del av.

Vi ville sende inn en forespørsel til denne nettadressen.

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

Erstatte your_api_key med nøkkelen vi oppnådde tidligere og user_id_x med gyldig NSID. Siden jeg liker svarene mine på JSON, kan jeg legge til en annen parameter som ber API-en å svare med en JSON nyttelast.

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

API-en vil sende et svar slik:

jsonFlickrApi ("bilder": "side": 1, "sider": 1, "perpage": 100, "totalt": "2", "bilde": ["id": "3728895285" ":" 40318902 @ N02 "," hemmelig ":" df6dfee053 "," server ":" 3466 "," gård ": 4," tittel ":" opac "," ispublic ": 1," isfriend " "isfamily": 0, "id": "3729689790", "eier": "40318902 @ N02", "hemmelig": "ea9c38a675", "server": "2531", "gård": 3, "tittel ":" skala "," ispublic ": 1," isfriend ": 0," isfamily ": 0,]," stat ":" ok ")

Riktig formatert, det kommer til å se slik ut.

jsonFlickrApi ("bilder": "side": 1, "sider": 1, "perpage": 100, "totalt": "2", "bilde": ["id": "3729689790" ":" 40318902 @ N02 "," hemmelig ":" ea9c38a675 "," server ":" 3466 "," gård ": 4," tittel ":" opac "," ispublic ": 1," isfriend " "isfamily": 0, "id": "3729689845", "eier": "40318902 @ N02", "hemmelig": "df6dfee053", "server": "2531", "gård": 3, "tittel ":" skala "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")

Trekker i private data

Dette er sannsynligvis grunnen til at du vil lære å jobbe med Flickr API, så vi går sakte hvert steg sakte siden denne delen har en tendens til å forvirre folk.

signering

For å oppnå privat data må hver metode godkjenne og for godkjenning til arbeid, må hver av våre samtaler signeres. Signering fungerer slik:

Lag en alfabetisk sortert liste over argumenter

For eksempel, i det forrige eksempelet vil vår liste se slik ut:

  • api_key: xxx
  • format: json
  • user_id: yyy

Opprett signaturstrengen

Signaturstrengen er opprettet ved å ta API-hemmelig vi oppnådde tidligere og deretter legge til listen over argumenter til den. For eksempel ser vår signaturstreng ut slik:

0123456789api_keyxxxformatjsonuseridyyy

Signering av samtalen vår

Det siste trinnet er selve signeringen. Flickr forventer at vi tar MD5 hash av vår signaturstreng og legger den til vår opprinnelige metodeanrop som en navngitt parameter.

Så alle godkjente anrop har dette generelle formatet

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

Skaffe en frob

Nå med signeringen ut av veien, kan vi nå gå videre til selve autentiseringen. Flickr bruker et system som ligner OAuth for autorisasjon, noe som betyr at en bruker som vil bruke vår app, ikke trenger å avsløre brukerens legitimasjon. Brukere blir transportert til Flickrs nettsted der brukeren blir spurt om han / hun vil tillate appen vår å få tilgang til brukerens data.

Dette er hvor en frob kommer inn. For å opprette påloggingslenken som tar brukeren til en autorisasjonsside på Flickr, trenger vi en måte å identifisere en bestemt påloggingsøkt på..

For å få en frob for å identifisere økten, må vi ringe flickr.auth.getFrob passerer api-nøkkelen som et navngitt argument. Vår nettadresse vil se slik ut:

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

En JSON-respons ser slik ut:

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

Konstruerer innloggingsadressen

Etter å ha fått en frob, kan vi nå jobbe med å bygge URL-adressen som lar brukeren godkjenne vår søknad. Påloggingsadressen har dette generelle formatet:

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

Erstatt api_keys verdi med den vi hadde oppnådd tidligere, api_sigs verdi med en MD5-hash av signaturstrengen og frobens verdi med frob-verdien returnert av API. De perms parameter definerer ønsket nivå av konto tilgang og har gyldige verdier av lese, skrive og slette. Hver tilgang inkluderer rettighetene til alle sine forgjengere.

En gyldig påloggingsadresse tar dette skjemaet:

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

Godkjennelsessidene ser slik ut:


For det første sørger Flickr for at brukeren ikke ble innvilget i godkjenning av søknaden.
Deretter sørges det for at brukeren vet hvilket godkjenningsnivå han / hun gir til søknaden.
Vellykket autorisasjon!

Skaffe autentoken

Når brukeren har gitt fullmakt til søknaden vår, kan vi fortsette fremover. Det siste trinnet i denne prosessen er å skaffe en auth_token. En auth token knytter en bestemt API-nøkkel til en bestemt bruker-ID, dvs. et auth token kan brukes til å manipulere kun en bestemt brukers data mens du bruker en bestemt API-nøkkel. Et autentegn er nødvendig for hvert API-metodeanrop som krever godkjenning.

Å få et autentegn er like enkelt som å kalle flickr.auth.getToken metode passerer i api-nøkkelen, frob og api signatur som navngitte parametere. Nettadressen vil se slik ut:

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

En vellykket forespørsel gir oss et autentegn som kan brukes uendelig til å få tilgang til en bestemt brukeres data ved hjelp av en bestemt api-nøkkel.

Ringe anropet

Nå, at alle forutsetningene er oppfylt, kan vi gå om å hente data etter behov. Husk at hvert av de autentiserte samtalene dine må signeres, og at hver samtale må sende inn api_key, auth_token og api_sig for at metoden skal ringe til jobb.

På basisminimum må nettadressen for din REST-forespørsel se slik ut. Andre metodespesifikke parametere eller parametere som endrer nyttelastet, kan vedlegges etter behov.

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

Når du signerer, må du også ta med de andre argumentene og deres verdier. Dette er en hyppig årsak til feil og hodepine og kan lett utbedres. Inkluderer du tilbakeringingsparametere i nettadressen for å unngå kryssdomenes begrensning i nettlesere mens du bruker AJAX? De må også gå i signaturstrengen!

Rekonstruere nettadressene

La oss ta en titt på et eksempelrespons for en metode som returnerer offentlige bilder.

jsonFlickrApi ("bilder": "side": 1, "sider": 1, "perpage": 100, "totalt": "2", "bilde": ["id": "3729689790" ":" 40318902 @ N02 "," hemmelig ":" ea9c38a675 "," server ":" 3466 "," gård ": 4," tittel ":" opac "," ispublic ": 1," isfriend " "isfamily": 0, "id": "3729689845", "eier": "40318902 @ N02", "hemmelig": "df6dfee053", "server": "2531", "gård": 3, "tittel ":" skala "," ispublic ": 1," isfriend ": 0," isfamily ": 0]," stat ":" ok ")

Det er greit og dumt, men svaret inneholder ikke en nettadresse vi bare kunne lenke til. I stedet må vi lage en URL for det aktuelle bildet basert på dataene som sendes tilbake fra serveren. Her er hvordan:

Alltid bildens URL på Flickr følger et godt definert mønster. Lås opp dette og svaret begynner å gjøre mye mer fornuftig. Her er nettadressen til et bilde i kontoen min.

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

Nettadressen er laget av en rekke deler:

  • Gård ID. 3 i vårt tilfelle.
  • Server ID. 2531 her.
  • Foto ID - En måte å unikt identifisere hvert bilde som er vert for Flickr. 3729689845 i dette tilfellet.
  • Foto hemmelig - ea9c38a675
  • Bildestørrelse - Definerer størrelsen på bildet som skal returneres. Mulige verdier inkluderer o for original, b for en bredde / høyde på 1024, m for 240, t for 100 og s for 75. Når den ikke er angitt, er den standard til en bredde / høyde på 500.

Kort sagt, for å konstruere kilden til bildet, vil linken se ut som den som er vist nedenfor hvis vi ble gjort for å analysere JSON-responsen der data er variabelen som inneholder svaret:

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

Laster opp til Flickr

Nå som vi har tatt en titt på hvordan du henter data fra Flickr ved hjelp av API, er det på tide å se på hvordan du sender data tilbake.

Flickrs opplastings-API er forskjellig fra sine REST- eller SOAP-baserte APIer, fordi det ikke finnes noen URL-endepunkter du bare kunne få tilgang til og hente data. I stedet må data sendes via en POST-forespørsel til

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

Siden det er utenfor omfanget av denne artikkelen for å vise deg hvordan du bygger en POST-spørring fra grunnen, bruker vi et skjemaelement med en enktype-verdi av multipart / skjema-data for å generere all koden for oss. Ved hjelp av dette bestemte attributtet kan vi angi at skjemaet inneholder binære data, og det må håndteres som sådan. En prøveform ville se slik ut.

Men husk, vi trenger fortsatt å sende inn en rekke parametere til tjenesten, inkludert api-nøkkelen, autentoken og metodesignaturen. Hvordan gjør vi det? Det er bare et spørsmål om å lage et skjult tekstfelt og endre deres verdi for å reflektere de riktige verdiene. Som så:

Husk at mens du genererer MD5-hasen på signaturstrengen, må du laste opp hver element i skjemaet unntatt bildefeltet. Dette inkluderer innleveringsknappens verdi siden innholdet i hele skjemaet blir lagt ut på nettadressen. For eksempelet ovenfor, ville hash måtte beregnes som slik:

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

Du er ikke helt begrenset til disse argumentene. Opplastings-API-en tar i bruk en rekke argumenter, inkludert tittelen på bildet, tittelen og beskrivelsen. Hvis du vil at du kan like lett la brukeren angi alle disse dataene sammen med personverninnstillinger som slik:

Vanligvis brukte metoder

En artikkel om hvordan du arbeider med en tjeneste-API, vil være tydelig ufullstendig uten å se på noen av de mest brukte API-metodene. Med det i tankene, her er noen API-metoder som burde være svært nyttige, uansett om du lager en mashup eller bare ser for å hente dine egne data.

Husk at autentiserte samtaler krever gyldige verdier for api_key, api_sig og auth_token-parametrene til å fungere mens vanlige samtaler kanskje eller ikke krever metodespesifikke parametere. Alle samtaler krever at api_key-parameteren skal sendes inn. Så hvis jeg nevner at anropet krever godkjenning, er det implisitt at anropet krever de andre argumentene. Argumenter nevnt nedenfor er valgfrie med mindre annet er nevnt. Metoder som returnerer en liste over data, tar også en side og per_page argument for å definere navnene sine.

Jeg har tatt med svar fra hver metode for å gi deg en ide om dataene som leveres tilbake til oss. Jeg har gått med JSON som svarformat siden de fleste devs jeg jobber med som JSON bedre enn XML.

flickr.activity.userPhotos
Returnerer en liste over nylig aktivitet på bilder som tilhører den ringerne.

argumenter: tidsramme - Definerer tidsrammen for å se etter oppdateringer.
Godkjenning: Ja
Respons

"item": "" type ":" bilde "," id ":" 3728895285 "," eier ":" 40318902 @ N02 "," eget navn ":" lordtottuu "," hemmelig " "dv6dfee053", "server": "3466", "farm": 4, "title": "_content": "opac", "commentsold": 1, "commentsnew": 0, "notesold" "noter": 0, "visninger": 0, "faves": 0, "mer": 0, "aktivitet": "event": ["type": "kommentar", "commentid": "40298554- 3728895285-72157621628251433 "," bruker ":" 40318902 @ N02 "," brukernavn ":" lordtottuu "," dateadded ":" 1248131143 "," _content ":" Demo bilde for min kommende artikkel på Net Tuts "] ], "side": 1, "sider": 1, "per side": 10, "totalt": 1, "stat": "ok"

flickr.contacts.getList
Returnerer en liste over kontakter for den anropende brukeren.

argumenter: filter - Argument for å filtrere ut listen. Gyldige verdier inkluderer venner, familie, begge og heller ikke.
Godkjenning: Ja
Respons

"kontakter": "side": 1, "sider": 1, "per_side": 1000, "perside": 1000, "totalt": 2, "kontakt": ["nsid": "7488445 @ N05 "," brukernavn ":" thegleek "," iconserver ":" 179 "," iconfarm ": 1," ignorert ": 0," realname ":" Mike Poleski "," venn ":" 1 "," familie " : "0", "path_alias": null, "plassering": ""] // Resten av kontaktene, "stat": "ok"

flickr.favorites.getList
Returnerer en liste over bilder merket favoritt av en bestemt bruker.

argumenter: min_fave_date, max_fav_date - Selvforklarende.
Godkjenning: Ja
Respons

"photos": "side": 1, "sider": 1, "per side": 100, "totalt": "3", "bilde": ["id": "2332823355", "eier" "53555705 @ N00", "hemmelig": "e603be40a2", "server": "2333", "gård": 3, "tittel": "Xbox 360 stilleben", "ispublic": 1, "isfriend": 0 , "isfamily": 0, "date_faved": "1248134938"] // Resten av bildene, "stat": "ok"

flickr.people.getPublicPhotos
Få en liste over offentlige bilder for den oppgitte brukeren.

argumenter: nsid [påkrevd] - ID for den anropende brukeren, safe_search - For å blokkere NSFW-innhold.
Godkjenning: Nei
Respons

"side": 1, "sider": 1, "per side": 100, "totalt": "15", "bilde": ["id": "3728895285", "eier" "40318902 @ N02", "hemmelig": "df6dfee053", "server": "3466", "gård": 4, "tittel": "opac", "ispublic": 1, "isfriend": 0, "isfamily ": 0] // Resten av bildene," stat ":" ok "

flickr.groups.getInfo
For å få informasjon om en bestemt gruppe.

argumenter: group_id [påkrevd] - IDen til gruppen du søker informasjon om.
Godkjenning: Nei
Respons

"id": "51035612836 @ N01", "iconserver": "1", "iconfarm": 1, "navn": "_content": "Flickr API", "beskrivelse":  "_content": streng "En Flickr-gruppe for Flickr API-prosjekter. Kjør bevissthet om Flickr API, prosjekter som bruker den og de utrolige ideene som programmatisk eksponerte systemer produserer. Tenk Google API + Amazon API + Flickr API med litt GMail kastet i. Utviklerne av Flickr påpekte rett og slett at de ønsket å holde tekniske diskusjoner direkte relatert til API-en på adresselisten. "  "medlemmer": "_content": "7775", "personvern": objekt "_content": "3", "lang": null, "ispoolmoderated": 1, "gasspjeld" telle ":" 3 "," modus ":" dag "," restriksjoner ": objekt " photos_ok ": 1," videos_ok ": 1," pictures_ok ": 1," screens_ok ": 1," art_ok ": 1, "safe_ok": 1, "moderate_ok": 0, "restricted_ok": 0, "has_geo": 0, "stat": "ok"

flickr.photos.getExif
Ekstrakter EXIF-data på et eksisterende bilde .

argumenter: photo_id [påkrevd] - ID for bildet hvis EXIF-data skal utvinnes.
Godkjenning: Nei
Respons

"id": "2332823355", "hemmelig": "e603be40a2", "server": "2333", "gård": 3, "exif": ["tagspace": "TIFF" "tagspaceid": 1, "tag": 271, "label": "Lag", "rå": "_content": "Canon", "tagspace": "TIFF" "tag": 272, "label": "Modell", "raw": "_content": "Canon EOS 350D DIGITAL", / resten av exif dataene], "stat": "ok"

flickr.photos.geo.getLocation
Returnerer breddegrad og lengdegrad på stedet der et bestemt bilde ble tatt.

argumenter: photo_d [påkrevd] - ID for bildet hvis sted skal være kjent.
Godkjenning: Nei
Respons

"bilde": objekt "id": streng "229097925", "plassering": objekt "breddegrad": -33.856874, "lengdegrad": 151.214672, "nøyaktighet": "16" , "sted": "_content": "Sydney", "place_id": "p50kaZyYAJx9BZHQ", "woeid": "1105779", "region": objekt "_content": "New South Wales", "place_id" : "pu0zzub" "p50kaZyYAJx9BZHQ", "woeid": streng "1105779", "stat": streng "ok"

flickr.photos.getFavorites
Returnerer en liste over personer som har merket det bestått bildet som favoritt.

argumenter: photo_id [påkrevd] - ID for bildet i spørsmålet.
Godkjenning: Nei
Respons

"person": "" nsid ":" 39011391 @ N06 "," brukernavn ":" derek1960 "," favedate ":" 1243834286 ", // Resten av bildene]," id " : "229097925", "hemmelig": "13a21546fb", "server": "61", "gård": 1, "side": 1, "sider": 2, "perpage": 10, "totalt" 18 "...," stat ":" ok "

flickr.places.getTopPlacesList
Returnerer en liste over de 100 mest merkede stedene for en dag.

argumenter: place_type_id [required] - Numerisk ID for et sted for å definere hvordan du skal klynge bilder.
Godkjenning: Nei
Respons

"steder": objekt "totalt": nummer100, "sted": ["place_id": "4KO02SibApitvSBieQ", "woeid": "23424977", "breddegrad": "48.890", "lengdegrad": "-116.982 "," place_url ":" / United + States "," place_type ":" land "," place_type_id ":" 12 "," _content ":" United States "," photo_count ":" 23654 " av de 99 landene], "date_start": 1248048000, "date_stop": 1248134399, "stat": "ok"

flickr.tags.getHotList
Returnerer en liste over mest brukte koder for en gitt tidsperiode.

argumenter: periode - Angir perioden for å skaffe tagger. telle - Angir antall koder som skal returneres i svaret.
Godkjenning: Nei
Respons

"period": "dag", "telle": 20, "tag": ["score": "100", "_content": "sundaystreets", "score": "100 "," _content ":" happymondayblues ", " score ":" 100 "," _content ":" melbourneopenhouse2009 "]," stat ": streng" ok "

For å konkludere

I denne åpne delen av serien så vi på hvordan du skal arbeide med Flickr API, inkludert hvordan du henter offentlig og privat data, autentiserer med API og hvordan du laster opp data til tjenesten. Vi tok også en titt på noen av de mest brukte API-metodene sammen med deres JSON-svar for å bedre forstå strukturen av dataene som API sender tilbake.

Hvilken API er dekket neste er helt opp til deg. Her, på Net Tuts, imøtekommer vi populær etterspørsel, så vi skal la leserne bestemme hvilken tjeneste API skal skrives om neste gang. I kommentaren din nedenfor, la navnet på tjenesten og API-grensesnittet bli om nødvendig. Vi dekket REST i denne artikkelen, men vi vil gjerne dekke SOAP-baserte eller XML-RPC-baserte APIer hvis det er nok folk som ønsker det.

Spørsmål? Hyggelige ting å si? Kritikk? Treff kommentar delen og la meg en kommentar. Glad koding!

  • Følg oss på Twitter, eller abonner på NETTUTS RSS Feed for flere daglige webutviklingsverktøy og artikler.