marți, 4 noiembrie 2008

Tema 1 - Take 2

Pentru această temă am ales reţeaua socială hi5 (http://www.hi5.com) şi limbajul C#. Pornind de la un profil existent pe hi5 a trebuit să realizez o ierarhie a prietenilor cu rădăcina în profilul respectiv (pentru mai multe detalii vizitaţi pagina http://interfeteweb.pluto.ro unde se află şi enunţul temei). De la început am avut de optat între două variante: să parsez în HTML sau să folosesc un API existent pentru hi5. Evident, am ales varianta a doua. O problemă cu acest API este că se află încă în stadiu BETA şi astfel documentaţia este destul de săracă şi de multe ori incompletă (API-ul folosit se găseşte la adresa http://api.hi5.com).
La adresa de mai sus se găsesc şi descrieri WSDL pentru nişte servicii web ce ar putea fi folosite pentru a extrage informaţii din hi5. Totuşi, am ales să folosesc modelul REST deoarece oferă o metodă foarte simplă de a afla prietenii unui utilizator hi5 cunoscând numai id-ul acestuia. Metoda folosită este descrisă destul de sumar aici. Astfel, dacă luăm un id pentru un utilizator şi extragem răspunsul de la cererea făcută la adresa: http://api.hi5.com/rest/profile/foaf/[id] (evident [id] se inlocuieşte cu un id valid) obţinem un XML. FOAF reprezintă Friend Of A Friend. Răspunsul la o cerere ca cea de mai sus este un XML ce respectă protocolul FOAF. (http://www.foaf-project.org/). Un exemplu de răspuns XML este următorul:

<rdf:RDF>
<foaf:Person rdf:nodeId="me">
<foaf:nick>xxxxx</foaf:nick>
<foaf:givenName>xxxxxx</foaf:givenName>
<foaf:surName>XXXX</foaf:surName>
<foaf:mboxSha1Sum>a71850698cf0d7cfac95742de871c58817d45341</foaf:mboxSha1Sum>
<foaf:img rdf:resource="http://photos2.hi5.com/......"/>
<foaf:weblog rdf:resource="http://www.hi5.com/profile/displayJournal.do?userid=[id]"/>
<foaf:gender>female</foaf:gender>
<lang:masters>ro</lang:masters>
<foaf:homePage rdf:resource="http://www.hi5.com/friend/profile/displayProfile.do?userid=[id]"/>
<foaf:knows>
<foaf:Person>
<foaf:nick>XXXXX</foaf:nick>
<rdfs:seeAlso rdf:resource="http://api.hi5.com/rest/profile/foaf/[idnick1]"/>
</foaf:Person>
</foaf:knows>
<foaf:knows>
<foaf:Person>
<foaf:nick></foaf:nick>
<rdfs:seeAlso rdf:resource="http://api.hi5.com/rest/profile/foaf/[idnick2]"/>
</foaf:Person>
</foaf:knows>
Se poate observa din XML-ul de mai sus că se pot extrage informaţii despre utilizatorul pentru care s-a efectuat cererea (nick, nume, prenume, poză, pagina profilului, etc.). Printre informaţiile importante se regăsesc şi prietenii acestui utilizator (nickul lor şi adresa pentru FOAF-ul lor). Din FOAF-ul prietenului putem să extragem usor id-ul acestuia. Dacă avem nevoie de pagina cu profilul unui utilizator se observă că poate fi obţinută ştiind id-ul acestuia: http://www.hi5.com/friend/profile/displayProfile.do?userid=[id].
Având REST-ul şi FOAF-ul la îndemână putem să construim o ierarhie plecând de la id-ul unui utilizator. Ierarhia care ne interesează în mod sepecial are forma unui arbore, în rădăcină aflându-se userul de la care se porneşte. Însă ierarhia unei reţele sociale de genul hi5 este în mod normal un graf ale cărui legături se pot afla prin intermediul cererii REST descrise mai sus. Pentru a obţine un arbore o parcurgere DFS sau BFS ar fi necesară. Eu am folosit o parcurgere DFS oprindu-mă la nivelul maxim până la care se face căutarea (nivel dat într-un fişier de configurare). Pentru astfel de parcurgeri, în general trebuie ţinută evidenţa nodurilor prin care s-a trecut pentru evitarea ciclurilor. Pentru simplitate am folosit o listă în care am introdus id-urile pentru nodurile prin care am trecut, însă pentru o adâncime mare a arborelui este foarte posibil să apară mulţi utilizatori hi5 cu mii de prieteni care la rândul lor au mii de prieteni şi pot exista probleme legate de utilizarea memoriei.

Florian Popa

2 comentarii:

V spunea...

foarte interesant; asteptam si posturi pe alte subiecte decat temele:)

Ruxandra Voiculet spunea...

m-a ajutat mult cu tema, chiar cautam un api pentu hi5 si am gasit aici tot c imi trebuia:D, mrs

 
SEO Romania