Twitterユーザー情報の構成
アプリケーションを開発する準備が整ったところで、いよいよアプリケーションの設計について説明していきます。まずはアプリケーションの中心データとなる Twitterのユーザー情報について説明します。Twitter APIからはさまざまなユーザー情報が取得できますが、当アプリケーションでは、表2に示す属性を使用します。これらの情報をTwitter APIを通して取得し、Datastoreに保存します。
属性名 | 属性説明 |
id | twitter上のユーザーID。 |
name | 名前。漢字も指定可能 |
screen_name | 画面表示名。英数字文字列のIDでURLを構成する。 |
url | ブログなどのURL |
profile_image_url | プロフィール画像アイコンのURL |
location | 現在地 |
description | ユーザーに関する説明文。 |
friend_ids | フォローしているユーザーIDの集合 |
ユーザーデータ取得処理
図1に示した処理構成のうち、まずはユーザーデータ取得処理から説明します。ユーザーデータ取得処理は、TwitterのAPIにアクセスし、ユーザー属性情報とフォローの情報(friends)をDatastoreに保存する処理を担当します。図7にその処理構成を示しました。
ユーザーデータ取得処理は、さらに2つの処理から構成されます。それは「初期データ作成処理」と「ユーザーデータ収集処理」です。「初期データ作成処理」は、アプリケーション運用開始時の最初の1件のユーザーデータを作成するための処理で、開発者によって手動で1回のみ実行されます。その後は「関連ユーザーデータ収集処理」がcronで実行されるごとに、Twitter APIからユーザーデータが取得され、Datastoreに自動で保存されていきます。
初期データ作成処理
まずは、「ユーザーデータ取得処理」のうち「初期データ作成処理」から説明します。処理概要を図8に示しました。
初期データ作成処理では、以下の処理を実行します。
- ユーザー属性取得APIにアクセスし、初期ユーザーの属性情報を取得する
- API情報から取得した情報をTwitterUserエンティティとしてDatastoreに保存する
- 初期ユーザーを属性としたWaitGetRelatedDataエンティティを1件保存する
ユーザー属性取得APIは「http://twitter.com/users/show/$screen_name.xml」というURLでアクセスし、「$screen_name」に指定したscreen_nameに該当するユーザー情報を返却します。また「$screen_name」には、 Twitterで採番しているidを指定することができます。また「.xml」を「.json」に変更することで、JSON形式でデータを取得することができます。APIで取得できる情報の一部をリスト1に示します。
<?xml version="1.0" encoding="UTF-8"?> <user> <id>15027717</id> <name>佐藤治夫</name> <screen_name>haru860</screen_name> <location>東京都渋谷区恵比寿</location> <description>BPの社長です。</description> <profile_image_url>http://a3.twimg.com/profile_images/359750475/haru_normal.jpg</profile_image_url> <url>http://ameblo.jp/beproud-inc/</url> <protected>false</protected> <followers_count>370</followers_count> <profile_background_color>9ae4e8</profile_background_color> --- 省略 </user>
WaitGetRelatedData エンティティは、データ収集処理が処理するべき対象のユーザー情報を格納し、キューとしての役割を果たします。Google App Engineでは、TaskQueueという仕組みが用意されていますが、ここでエンティティをキューの代わりとして使用するのは、Twitterへの時間単位あたりのアクセス回数を制御するためです。Twitterでは、APIへのアクセス回数制限を設けており、1ユーザーあたり1時間70回までとなっています。TaskQueueを使用すると、実行順番が空き次第、処理が実行されてしまいます。そこで本稿のアプリケーションでは、キューの代わりとして、処理するタスクごとにエンティティ1件を作成し、Cronで該当エンティティのデータを対象として処理します。キューの代わりに使用するWaitGetRelatedDataエンティティの属性を表3に示します。
属性名 | 型 | 説明 |
screen_name | str | 処理対象ユーザーのscreen_name。 |
created_at | datetime.datetime | データが作成された日時。 |
err_flg | bool | エラーが発生したらTrueを設定。エラーが発生したら該当ユーザーの処理は次回からスキップするようにする。 |
ユーザーデータ収集処理
次にユーザーデータ取得処理を構成する2つの処理のうち、ユーザーデータ収集処理について説明します。処理概要を図9に示しました。
図9では、主に以下の処理を実行します。
- 関連ユーザー取得APIにアクセスし、処理対象のユーザーがフォローしているユーザーの情報を最大100件取得する。
- 1.で取得したユーザー情報をTwitterUserエンティティとして新規にDatastoreに保存する。
- friends ID取得APIにアクセスし、処理対象のユーザがフォローしているユーザユーザのID集合を該当ユーザのfriend_ids属性に保存する。
- 新規に作成した分のWaitGetRelatedDataのEntityを保存する。
関連ユーザー取得APIは「http://twitter.com/statuses/friends/$screen_name.xml」というURLでアクセスし、「$screen_name」に指定したユーザーがフォローしているユーザーで、直近につぶやいたユーザー100件のユーザー属性情報を取得することができます。リスト2に関連ユーザー取得APIで取得できるXMLの一部を示します。
<?xml version="1.0" encoding="UTF-8"?> <users type="array"> <user> <id>157207801</id> <name>ユーザーB</name> <screen_name>user_b</screen_name> <location></location> <description>ユーザーBです。</description> ~省略 </user> <user> <id>217217809</id> <name>ユーザーC/name> <screen_name>user_C</screen_name> <location></location> <description>ユーザーCです。</description> ~省略 </user> 以降user要素の繰り返し(最大100件) </users>
friends ID取得APIで取得できる情報
friends ID取得APIは「http://twitter.com/statuses/friends/$screen_name.xml」というURLでアクセスし、「$screen_name」に指定したユーザがフォローしているユーザ全件のID集合を取得することができます。friends ID 取得APIから取得できるXMLの一部を示します。
<?xml version="1.0" encoding="UTF-8"?> <ids> <id>3278331</id> <id>3701281</id> <id>4950991</id> </ids>