Komunikace s Twitter API pomocí Google App Engine

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:

  1. Stáhneme knihovnu Twitter4j a naimportujeme do našeho projektu
  2. 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.
  3. Přihlašovací klíče je nutno zadat do souboru WEB-INF/twitter4j.properties
  4. Pro testování API pomocí webového prohlížeče můžeme využívat Twitter API Developer Console

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ů.

<?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.

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.

Seznam všech uživatelů

Tento zdroj vrací seznam všech uložených uživatelů.

<?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

Nejdůležitější odkazy