2015-05-19 17 views
18

Cercare un modo per simulare la logica dell'API di Flickr per utilizzare le viste di Google.Google view: visualizza i dettagli delle foto per una regione

Su Flickr posso chiamare il metodo flickr.photos.search e ottenere tutte le foto di una località specifica in questo modo:

https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=cb33497ccae3482a7d5252f15b790fe3&woe_id=727232&format=rest&api_sig=bc7b1227243d969498f9d7643438f18f

La risposta:

<?xml version="1.0" encoding="utf-8" ?> 
    <rsp stat="ok"> 
    <photos page="1" pages="7673" perpage="100" total="767266"> 
    <photo id="17856165012" owner="[email protected]" secret="6d2acf3b87" server="7690" farm="8" title="Amsterdam Canal" ispublic="1" isfriend="0" isfamily="0" /> 
    <photo id="17830118816" owner="[email protected]" secret="ee8b55fc5e" server="7756" farm="8" title="IMG_2209" ispublic="1" isfriend="0" isfamily="0" /> 
    <photo id="17668921970" owner="[email protected]" secret="bd0061e638" server="8825" farm="9" title="IMG_2210" ispublic="1" isfriend="0" isfamily="0" /> 
    <photo id="17853550052" owner="[email protected]" secret="c834e9a7eb" server="7738" farm="8" title="IMG_2212" ispublic="1" isfriend="0" isfamily="0" /> 
    <photo id="17856935911" owner="[email protected]" secret="39be86bb4b" server="7723" farm="8" title="IMG_2213" ispublic="1" isfriend="0" isfamily="0" /> 
    <photo id="17233920844" owner="[email protected]" secret="8be2333be3" server="7658" farm="8" title="IMG_2214" ispublic="1" isfriend="0" isfamily="0" /> 
    <photo id="17853542232" owner="[email protected]" secret="8f19ee65c2" server="7747" farm="8" title="IMG_2215" ispublic="1" isfriend="0" isfamily="0" /> 
    <photo id="17856926911" owner="[email protected]" secret="bc0fb6dbc1" server="7667".... 

Poi chiamo flickr.photos.getInfo per ogni ID foto per ottenere le informazioni sulla foto

La risposta:

<?xml version="1.0" encoding="utf-8" ?> 
<rsp stat="ok"> 
    <photo id="17853542232" secret="8f19ee65c2" server="7747" farm="8" dateuploaded="1432037570" isfavorite="0" license="0" safety_level="0" rotation="90" originalsecret="7848968317" originalformat="jpg" views="2" media="photo"> 
    <owner nsid="[email protected]" username="trashhunters" realname="Trash Hunters" location="" iconserver="7748" iconfarm="8" path_alias="trashhunters" /> 
    <title>IMG_2215</title> 
    <description /> 
    <visibility ispublic="1" isfriend="0" isfamily="0" /> 
    <dates posted="1432037570" taken="2015-05-17 13:47:32" takengranularity="0" takenunknown="0" lastupdate="1432040217" /> 
    <editability cancomment="0" canaddmeta="0" /> 
    <publiceditability cancomment="1" canaddmeta="0" /> 
    <usage candownload="1" canblog="0" canprint="0" canshare="1" /> 
    <comments>0</comments> 
    <notes /> 
    <people haspeople="0" /> 
    <tags> 
     <tag id="131822341-17853542232-563433" author="[email protected]" authorname="trashhunters" raw="blikje" machine_tag="0">blikje</tag> 
     <tag id="131822341-17853542232-81138" author="[email protected]" authorname="trashhunters" raw="fanta" machine_tag="0">fanta</tag> 
    </tags> 
    <location latitude="52.367408" longitude="4.862769" accuracy="16" context="0" place_id="xQ4tawtWUL1NrOY" woeid="727232"> 
     <locality place_id="xQ4tawtWUL1NrOY" woeid="727232">Amsterdam</locality> 
     <county place_id="nmbnjNtQUL_iOTHdPg" woeid="12592040">Amsterdam</county> 
     <region place_id="F86XYCBTUb6DPzhs" woeid="2346379">North Holland</region> 
     <country place_id="Exbw8apTUb6236fOVA" woeid="23424909">Netherlands</country> 
    </location> 
    <geoperms ispublic="1" iscontact="0" isfriend="0" isfamily="0" /> 
    <urls> 
     <url type="photopage">https://www.flickr.com/photos/trashhunters/17853542232/</url> 
    </urls> 
    </photo> 
</rsp> 

Mi interessa il longitudine, latitudine, tempo impiegato e utente informazioni. Ho esaminato lo Google places API ma non ho trovato il modo.

Aggiornamento: tanto per essere chiari, ho trovato la richiesta place details, su Google API, ma le foto di risultati non contiene posizione o dati utente:

..."photos" : [ 
     { 
      "height" : 2322, 
      "html_attributions" : [ 
       "\u003ca href=\"//lh5.googleusercontent.com/-QO7PKijayYw/AAAAAAAAAAI/AAAAAAAAAZc/fTtRm3YH3cA/s100-p-k/photo.jpg\"\u003eWilliam Stewart\u003c/a\u003e" 
      ], 
      "raw_reference" : { 
       "fife_url" : "https://lh3.googleusercontent.com/-7mKc4261Edg/VB01Tfy2OWI/AAAAAAAADII/BHs-SIudu64/k/" 
      }, 
      "width" : 4128 
     },... 

Tutto il consiglio sarebbe apprezzato:)

+0

Le chiamate API sono un po 'contorte. Si effettua una richiesta di lat/long. Ottieni un posto o un elenco di luoghi a seconda di quanto sei specifico riguardo a ciò che stai cercando. Quindi esegui una chiamata API per le immagini e quindi un'altra chiamata API per ciascun URL immagine. –

+0

Sto utilizzando l'API precedente che non richiede la chiave API BC le chiavi API sono specifiche del dominio. La nuova API è migliore. Ma se stai chiudendo la domanda, sono al 70%, ma ho notato che hai accettato una risposta. LMK se si è ancora aperti a un'implementazione come risposta o si accontenta della risposta corrente. –

+0

Sicuro! Sarò felice di avere un altro approccio, grazie! –

risposta

9

Ho buone notizie e cattive notizie per voi. La buona notizia è che è possibile, la cattiva notizia è che ci sono una quantità pazzesca di avvertimenti e non è garantito che sarai in grado di ottenere le informazioni che desideri per ogni foto.

Fase 1: Le informazioni utente

Quando tu richiedi informazioni luogo dal luogo API si riceve una serie di foto. Ogni foto ha uno url, uno width, uno height e uno html_attributions stringa. Se la mia comprensione è corretta, l'ultima stringa sarà vuota se il proprietario dello stabilimento ha caricato le foto da solo, ma nel caso in cui si tratti di contenuti di terze parti conterrà un link che devi includere nella pagina con attribuzione dell'utente. Per utilizzare la prima foto per Google HQ dalla tua domanda otteniamo le seguenti informazioni

{ 
    url: 'https://lh5.googleusercontent.com/-7mKc4261Edg/VB01Tfy2OWI/AAAAAAAADII/BHs-SIudu64/s0/20140109_152438.jpg', 
    width: 2322, 
    height: 4128, 
    html_attributions: '<a href="https://plus.google.com/107252953636064841537">William Stewart</a>' 
} 

Nella grande maggioranza dei casi (se non tutti) questo sarà un collegamento a un account utente Google Plus, da cui può estrarre lo userId. In questo caso 107252953636064841537

Fase 2: Trovare la foto

Ora, il prossimo passo logico sembrerebbe andare alle API Google+, ma si scopre che ancora non hanno incluso un modo per accedere Google+ Foto. Sorprendentemente, tuttavia, Picasa Web API è ancora attivo e in esecuzione e sembra che restituisca ancora dati aggiornati. Quindi, successivamente, possiamo richiedere tutti gli album per questo utente tramite il seguente URL utilizzando lo userId che abbiamo trovato sopra (Google ha gentilmente utilizzato gli stessi ID o semplicemente supporta gli ID utente di Google+).

https://picasaweb.google.com/data/feed/api/user/107252953636064841537

Lì c'è una sola <entry> per ogni album l'utente ha, che contiene il seguente

<feed> 
    [...] 
    <entry> 
     [...] 
     <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://picasaweb.google.com/data/feed/api/user/107252953636064841537/albumid/6061059278861279377" /> 
     [...] 
    </entry> 
</feed> 

Si avrebbe bisogno di richiedere ogni poppata album per ottenere un elenco di foto richiedendo l'url nel campo href. Ciò restituirà un altro documento XML che contiene le seguenti informazioni per ogni foto:

<entry> 
    <id>https://picasaweb.google.com/data/entry/api/user/107252953636064841537/albumid/6061059278861279377/photoid/6061059282579110242</id> 
    <published>2014-09-20T08:05:33.000Z</published> 
    <updated>2014-10-08T20:11:49.889Z</updated> 
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/photos/2007#photo" /> 
    <title type="text">20140109_152438.jpg</title> 
    <summary type="text" /> 
    <content type="image/jpeg" src="https://lh3.googleusercontent.com/-7mKc4261Edg/VB01Tfy2OWI/AAAAAAAADII/BHs-SIudu64/20140109_152438.jpg" /> 
    <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="https://picasaweb.google.com/data/feed/api/user/107252953636064841537/albumid/6061059278861279377/photoid/6061059282579110242" /> 
    <link rel="alternate" type="text/html" href="https://picasaweb.google.com/107252953636064841537/September20201402#6061059282579110242" /> 
    <link rel="http://schemas.google.com/photos/2007#canonical" type="text/html" href="https://picasaweb.google.com/lh/photo/CpdWkfaimetJbSbFK2cojdMTjNZETYmyPJy0liipFm0" /> 
    <link rel="self" type="application/atom+xml" href="https://picasaweb.google.com/data/entry/api/user/107252953636064841537/albumid/6061059278861279377/photoid/6061059282579110242" /> 
    <link rel="http://schemas.google.com/photos/2007#report" type="text/html" href="https://picasaweb.google.com/lh/reportAbuse?uname=107252953636064841537&amp;aid=6061059278861279377&amp;iid=6061059282579110242" /> 
    <gphoto:id>6061059282579110242</gphoto:id> 
    <gphoto:version>7</gphoto:version> 
    <gphoto:position>2.0</gphoto:position> 
    <gphoto:albumid>6061059278861279377</gphoto:albumid> 
    <gphoto:access>public</gphoto:access> 
    <gphoto:width>4128</gphoto:width> 
    <gphoto:height>2322</gphoto:height> 
    <gphoto:size>1756108</gphoto:size> 
    <gphoto:client /> 
    <gphoto:checksum /> 
    <gphoto:timestamp>1389241477000</gphoto:timestamp> 
    <gphoto:imageVersion>3202</gphoto:imageVersion> 
    <gphoto:commentingEnabled>true</gphoto:commentingEnabled> 
    <gphoto:commentCount>0</gphoto:commentCount> 
    <gphoto:streamId>cs_01_3c7bd15d390e38745feedfd0c8ec076f</gphoto:streamId> 
    <gphoto:license id="0" name="All Rights Reserved" url="">ALL_RIGHTS_RESERVED</gphoto:license> 
    <gphoto:shapes faces="done" /> 
    <exif:tags> 
    <exif:fstop>2.2</exif:fstop> 
    <exif:make>SAMSUNG</exif:make> 
    <exif:model>GT-I9505</exif:model> 
    <exif:exposure>0.030303031</exif:exposure> 
    <exif:flash>false</exif:flash> 
    <exif:focallength>4.2</exif:focallength> 
    <exif:iso>80</exif:iso> 
    <exif:time>1389281077000</exif:time> 
    <exif:imageUniqueID>721da79fdf344aa70000000000000000</exif:imageUniqueID> 
    </exif:tags> 
    <media:group> 
    <media:content url="https://lh3.googleusercontent.com/-7mKc4261Edg/VB01Tfy2OWI/AAAAAAAADII/BHs-SIudu64/20140109_152438.jpg" height="288" width="512" type="image/jpeg" medium="image" /> 
    <media:credit>William Stewart</media:credit> 
    <media:description type="plain" /> 
    <media:keywords /> 
    <media:thumbnail url="https://lh3.googleusercontent.com/-7mKc4261Edg/VB01Tfy2OWI/AAAAAAAADII/BHs-SIudu64/s72/20140109_152438.jpg" height="41" width="72" /> 
    <media:thumbnail url="https://lh3.googleusercontent.com/-7mKc4261Edg/VB01Tfy2OWI/AAAAAAAADII/BHs-SIudu64/s144/20140109_152438.jpg" height="81" width="144" /> 
    <media:thumbnail url="https://lh3.googleusercontent.com/-7mKc4261Edg/VB01Tfy2OWI/AAAAAAAADII/BHs-SIudu64/s288/20140109_152438.jpg" height="162" width="288" /> 
    <media:title type="plain">20140109_152438.jpg</media:title> 
    </media:group> 
</entry> 

Si noti come l'attributo src del tag <content> è uguale alla url dalla prima chiamata API, ad eccezione del sottodominio che si dovrebbe ignorare (che è diverso a causa del bilanciamento del carico). Nota anche come tutte le informazioni disponibili sulla foto sono esposte nel documento xml e in che modo contiene tutti i dati exif che sono stati rimossi dalla foto stessa. Ovviamente non tutte le foto contengono informazioni GPS, e quello sopra è un esempio di questo. Se tuttavia una foto contiene informazioni GPS, sarà inclusa in quel documento o nei dati exif e/o in un tag <georss:where>.

conclusive

Per trovare le informazioni che state cercando si avrebbe bisogno di scorrere tutti gli album degli utenti e quindi cercare una foto con una simile url per quello che hai ricevuto dal API di Google Places. Le avvertenze più importanti sono che funzionerà solo per le foto da Google+, che richiede un numero molto alto di di richieste e che l'API di Picasa Web probabilmente verrà interrotta a un certo punto, anche se a quel punto almeno una parte della sua funzionalità sarà essere trasferito all'API Foto Google+ (anche se Google sta pianificando di nuovo a make Google Photos a standalone service, quindi in tal caso potrebbe essere semplicemente rinominato). In ogni caso, tutto considerato sono sorpreso che sia possibile in quanto l'API di Google Place non è fatta per tutto questo, quindi in questo senso sei abbastanza fortunato immagino.

+0

Grazie per lo sforzo, manca ancora un passaggio: ottieni tutte le foto per una regione. Qualche idea di come farlo? –

+0

@ShlomiSchwartz Ah, beh, Picasa Web API non fornisce tale funzionalità, quindi in questo caso suppongo che tu abbia due opzioni: crea il tuo indice eseguendo la scansione di tutti i Picasa Web Album tramite l'API o interrogando i luoghi tramite l'API di Google Places e quindi recuperare le foto associate come descritto. Nel secondo caso c'è una chiamata API 'nearbysearch' relativamente semplice o nell'API javascript 'PlaceSearchRequest'. –

+0

Siamo spiacenti, ma questa informazione non è corretta. Hanno infatti dato accesso alle foto. Le chiamate API sono un po 'complicate. Prima devi scegliere il luogo specifico, poi ottieni richiesta dettagli, quindi chiama api per ogni foto. E questo è con l'API obsoleta che sto usando per creare un Plunker. La nuova API è molto migliore ma richiede una chiave specifica del dominio. –