Usare le Yahoo! API

Vedi tutte le pagine e le modifiche recenti o scarica i sorgenti nella pagina


Yahoo! offre da molto tempo un ampio pacchetto di servizi per gli sviluppatori, tra cui anche alcuni Web Service REST tramite cui è possibile accedere a un sacco di informazioni differenti.

Per fare ciò è necessario ottenere una chiave detta AppID che sia univoca per la vostra applicazione, una cosa molto veloce.

Usare i web service è poi un’operazione assolutamente banale, che consiste di due fasi: Proviamo a fare una prova di richiesta utilizzando le api di Yahoo! SiteExplorer, un nuovo servizio che permette di ottenere delle informazioni utili su un proprio sito web. Utilizzeremo la libreria open-uri che ci permette di accedere ad una risorsa sul web come se fosse locale (ovviamente in sola lettura):
>> require 'open-uri'
=> true
>> URL="http://api.search.yahoo.com/SiteExplorerService/V1/inlinkData?query=%s&a
ppid=%s" 
=> "http://api.search.yahoo.com/SiteExplorerService/V1/inlinkData?query=%s&appid
=%s" 
>> open(URL%["http://ruby-it.org","MioMagicoAppID"]).read

Tenete a mente che "stringa" % ["elem1", "elem2"] serve a mettere i valori contenuti nell’Array dentro la stringa, come se si trattasse di una sprintf (e infatti si notino i %s nella costante URL )

L’output è una lunga stringa xml che comincia così:
=> "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ResultSet xmlns:xsi=\"http://www.
w3.org/2001/XMLSchema-instance\" xmlns=\"urn:yahoo:srch\" xsi:schemaLocation=\"u
rn:yahoo:srch http://api.search.yahoo.com/SiteExplorerService/V1/InlinkDataResponse.xsd\" totalResultsAvailable=\"241\" firstResultPosition=\"1\" totalResultsRe
turned=\"50\"><Result><Title>Planet Apache</Title><Url>http://www.planetapache.o
.......

ovviamente viene fuori un dump abbastanza lungo e poco interessante. Come gestirlo? Beh se andate a leggervi la documentazione di Yahoo! O se semplicemente date un’occhiata ai sorgenti, potrete notare che si tratta di XML che usa XMLSchema, ed esiste una precisa definizione.

Siccome ruby ha un modulo parte della distribuzione standard per gestire i file XSD, trasformare quel pezzo di xml in un oggetto è semplicissimo:
>> obj=XSD::Mapping.xml2obj(open(URL%["http://ruby-it.org","riffappid"]).read)
=> #<SOAP::Mapping::Object:0x283892c {urn:yahoo:srch}Result=[#<SOAP::Mapping::Ob
ject:0x28386f8 {urn:yahoo:srch}Title="Planet Apache" {urn:yahoo:srch}Url="http:/
/www.planetapache.org/" {urn:yahoo:srch}ClickUrl="http://www.planetapache.org/">
...
Come già visto per il Client SOAP da WSDL possiamo visualizzare i metodi definiti in questo oggetto usando:
>> obj.methods(false)
Il false serve a indicare che vogliamo ottenere solo i metodi definiti in questo oggetto:
=> ["xmlattr_totalResultsReturned", "xmlattr_totalResultsAvailable=", "xmlattr_s
chemaLocation", "xmlattr_totalResultsReturned=", "xmlattr_firstResultPosition",
"xmlattr_schemaLocation=", "result", "xmlattr_totalResultsAvailable", "xmlattr_f
irstResultPosition=", "result="]
E visto questo potete scrivere, allegramente:
>> puts "Ci sono %s risultati"% obj.xmlattr_totalResultsAvailable
Ci sono 241 risultati
>> puts "il primo link viene da %s" % obj.result[0].url
il primo link viene da http://www.planetapache.org/

Ovviamente le possibilità sono infinite, io per esempio mi sono scritto una semplice miniapplicazione che traccia un grafico dei cambiamenti relativi ai miei siti, per la quale non era necessario avere una maggiore pulizia del codice. In realtà è possibile far si che i risultati siano mappati su strutture molto più preciso e pulite (senza xmlattr_foo ad esempio), per i quali viu rimando alla documentazione di SOAP4R—Gabriele

Updated on April 26, 2006 09:09 by Ruby Fan (151.37.124.28)