V tomto článku popíšu způsob implementace stahování tweetů (zpráv) z populární sociální sítě Twitter na platformě Google App Engine. Implementace je prováděna v Javě.
Výsledná aplikace běží na adrese fit-w20-ss11-101-2.appspot.com
Zdrojové kódy: https://github.com/vojtasvoboda/TwitterSnapshots
Struktura analyzovaných dat
Stahovaná data určené k následné analýze budeme uchovávat jako úplný graf, z čehož plyne, že musíme definovat co je uzlem a co hranou.
-
Uzly grafu - uživatelé, kteří píší zprávy s definovaným hashtagem
-
Hrany grafu - vztahy mezi uživateli. Vzhledem k tomu, že na Twitteru neexistuje oboustranný vztah typu „přátelství“, vztah je pouze jednostranný, musí být hrany grafu orientované.
-
Orientace hran - určuje, jestli osoba A sleduje osobu B, nebo jestli je osoba A sledována osobou B.
Připojení na Twitter API
Snapshoty pořizuji pomocí poskytované webové služby Twitter API. Pro přístup k API je nutno využít OAuth, což je metoda pro autentizaci přístupu k API. Pro přístup k Twitter API pomocí OAuth využíváme knihovnu Twitter4j určenou přímo pro GAE.
Pro napojení se na Twitter API postupujeme zhruba takto:
-
Stáhneme knihovnu Twitter4j a naimportujeme do našeho projektu
-
Je potřeba se zaregistrovat na https://dev.twitter.com/apps/new, kde se vloží naše aplikace a získáme přihlašovací klíče pro OAuth.
-
Přihlašovací klíče je nutno zadat do souboru WEB-INF/twitter4j.properties
-
Pro testování API pomocí webového prohlížeče můžeme využívat Twitter API Developer Console
-
Nadále budeme již pracovat pouze se seznamem zdrojů dostupných přes API pomocí knihovny Twitter4j
Tvorba snapshotů
Využívané REST API zdroje
Twitter API Resource | Twitter4j metoda | Popis |
---|---|---|
search | search(query) | vyhledávání tweetů dle zadané otázky (keyword, hashtag, …) |
friends/ids | getFriendsIDs() | vrací seznam ID uživatelů, které zadaný uživatel sleduje |
followers/ids | getFollowersIDs() | vrací seznam ID uživatelů, kteří sledují zadaného uživatele |
friendships/show | showFriendship(sourceId, targetId) | vrací informace o vztahu dvou uživatelů |
users/show | showUser(userId) | získá jméno uživatele na základě id |
Zdroj search má jako parametr objekt typu Query, který umožňuje specifikaci jazyka dle ISO_639-1 a dále nastavení počtu vrácených tweetů (max. 100).
Struktura tříd v programu
-
/persistence/Edge/ - reprezentuje hranu grafu, tzn. vztah dvou uživatelů. Obsahuje id hrany, ID uživatele ze kterého hrana vystupuje, ID uživatele kam hrana míří.
-
/persistence/User/ - reprezentuje uživatele tweetu - obsahuje id autora, jméno autora (nickname).
-
/persistence/Snapshot/ - reprezentuje jeden snapshot v jednom okamžiku. Obsahuje List uživatelů a List hran. Dále datum vytvoření, počet uzlů a hran.
-
/metadata/Snapshots/ - třída pro generování seznamu snapshotů v XML pro REST API.
-
/servlets/GetTweets/ - třída pro opakovaný sběr tweetů. Spouští se jednou za 24hod pomocí GAE CRONu.
-
/services/GoogleChart/ - třída pro generování URL grafu, který reprezentuje vývoj snapshotů v čase.
Některé třídy jako třeba User, nebo Snapshot mají i svůj DAO pro manipulaci. Stejně jako v první úloze tyto třídy převedeme pomocí JAXB (mapování POJO na XML pomocí anotací) na XML, které poskytujeme webovou službou.
Postup pro sběr snapshotů
-
Jednou za 24hod. (vždy ve 03:00 AM) spustíme pomocí GAE CRONu soubor servlets/GetTweets.java dostupný na base_url/GetTweets
-
Tímto dojde k načtení 10ti tweetů, kde z každého tweetů získáme autora tweetu
-
Ke každému autorovi načteme prvních 5 Friends (lidí, které uživatel sleduje) a 5 Followers (lidí, kterými je sledován)
-
To nám ve výsledků dává cca 150 uzlů a 150 hran. REST API Twitteru bohužel omezuje počet dotazů na 150 za hodinu.
-
Takto vytvoříme Snapshot - orientovaný graf, který je vždy sestavován celý znova, při každém Snapshotu, tzn. complete.
Poskytované webové služby
Seznam všech snapshotů
Tento zdroj vrací seznam všech uložených snapshotů.
-
HTTP metoda: GET
-
Produces: application/xml
- data:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <snapshots> <snapshot edge="0" node="0" created="2011-04-10T18:48:02.836Z"/> <snapshot edge="0" node="1" created="2011-04-10T20:44:26.977Z"/> </snapshots>
-
HTTP status kódy:
-
200 OK - úspěšné vrácení metadat
-
404 Not Found - špatná URL požadavku
-
500 Server Error - chyba na straně serveru
-
Grafické znázornění všech snapshotů
Tento zdroj vrací obrázek ve formátu png generovaný službou Google Chart.
-
HTTP metoda: GET
-
Produces: image/png
-
data: PNG image
-
HTTP status kódy:
-
200 OK - úspěšné vrácení metadat
-
404 Not Found - špatná URL požadavku
-
500 Server Error - chyba na straně serveru
-
Grafické znázornění všech snapshotů
Tento zdroj také vrací obrázek ve formátu png generovaný službou Google Chart. Udělal jsem testovací resource, pokud je problém simulovat Content-Type: image/png.
-
HTTP metoda: GET
-
Produces: image/png
-
data: PNG image
-
HTTP status kódy:
-
200 OK - úspěšné vrácení metadat
-
404 Not Found - špatná URL požadavku
-
500 Server Error - chyba na straně serveru
-
Adresa grafu
Tento zdroj vrací URL adresu generovaného grafu, opět pro testovací účel.
-
HTTP metoda: GET
-
Produces: text/html
-
data: URL adresa
-
HTTP status kódy:
-
200 OK - úspěšné vrácení metadat
-
404 Not Found - špatná URL požadavku
-
500 Server Error - chyba na straně serveru
-
Seznam všech uživatelů
Tento zdroj vrací seznam všech uložených uživatelů.
-
HTTP metoda: GET
-
Produces: application/xml
-
data:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <snapshots> <snapshot edge="0" node="0" created="2011-04-10T18:48:02.836Z"/> <snapshot edge="0" node="1" created="2011-04-10T20:44:26.977Z"/> </snapshots>
-
HTTP status kódy:
-
200 OK - úspěšné vrácení metadat
-
404 Not Found - špatná URL požadavku
-
500 Server Error - chyba na straně serveru
-