joi, 13 noiembrie 2008

Tema 1 - Take 3

Prima temă la Interfete Evoluate a constat în analiza unei comunităţi web, mai precis în extragerea de informaţii privind relaţiile sociale din cadrul unei astfel de comunităţi. Pentru enunţul complet al temei vizitaţi http://interfeteweb.pluto.ro. Primul pas a fost să caut o reţea socială care să-mi pună la dispoziţie un API eficient şi uşor de utilizat, evitând astfel parsarea paginilor HTML. După ce am luat în considerare mai multe reţele sociale m-am oprit asupra comunităţii Twitter care pune la dispoziţie programatorilor un API ce aderă la principiile de design REST (Representational State Transfer).
Pentru temă am avut nevoie de metoda care furnizează informaţii despre prietenii unui utilizator Twitter, informaţii ce se pot obţine cu usurinţă printr-o cerere HTTP de tip GET catre un URL de forma http://twitter.com/statuses/friends/{user}.{format}. În acest url {user} va fi inlocuit cu ID-ul sau numele utilizatorului pentru care se doreşte lista de prieteni, iar {format} cu xml sau json, în funcţie de ce format de date se doreşte să aibă răspunsul. Spre deosebire de metodele similare puse la dispoziţie de API-urile altor reţele sociale, aici nu este nevoie nici de autentificare şi nici de obţinerea unui API-key.
Răspunsul conţine lista cu prietenii utilizatorului dat precum şi câteva informaţii despre fiecare. În cazul în care se alege formatul XML un răspuns are următoarea structură:

<users type="array">
<user>
<id>id_utilizator</id>
<name>nume</name>
<screen_name>nume_utilizator</screen_name>
<location/>
<description/>
<profile_image_url>
http://static.twitter.com/images/default_profile_normal.png
</profile_image_url>
<url/>
<protected>false</protected>
<followers_count>3</followers_count>
<status>
<created_at>Mon May 12 13:17:11 +0000 2008</created_at>
<id>id_user</id>
<text>Testing twitter in web purposes..</text>
<source>web</source>
<truncated>false</truncated>
<in_reply_to_status_id/>
<in_reply_to_user_id/>
<favorited>false</favorited>
</status>
</user>
.
.
.
</users>

Informaţia de interes ce trebuie extrasă din răspunsul XML este numele de utilizator specificat în interiorul elementului screen_name. Obţinându-se numele utilizatorilor din listă se pot forma URL-urile pentru profil şi pentru alte cereri care să întoarcă prietenii acestor utilizatori. URL-ul profilului are următorul format: http://twitter.com/{nume_utilizator}.
După ce am stabilit ce am de făcut, am trecut la implementare. Am ales limbajul python pentru că este simplu, puternic şi elegant şi împreună cu minidom, un parser de XML cu funcţionalitate de bază, se pretează perfect la cerinţele temei. Cum reţeaua socială analizată are structura unui graf, parcurgerea se face recursiv, pornind de la nodul corespunzător utilizatorului specificat. Pentru a nu se repeta utilizatorii la care se ajunge pe mai multe căi, s-a menţinut în memorie o mulţime cu utilizatorii vizitaţi. Ar fi de preferat ca gradul relaţiilor afişate în fişierul cu rezultate să fie cat mai mic (să se ajugă la un prieten pe o cale mai scurtă), iar din acest motiv s-ar preta o parcurgere în lăţime a grafului (BFS).

Liviu Frateanu

2 comentarii:

Mihaela spunea...
Acest comentariu a fost eliminat de autor.
Mihaela spunea...

E chiar interesant si abia astept sa fie disponibila si rezolvarea pentru ca nu am mai lucrat cu un astfel de API. Keep up the good work.

 
SEO Romania