Google App Engineで開発するスケールするアプリケーション(中編)
Google App EngineとTwitterの連携アプリケーション構築
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>
この記事は参考になりましたか?
- Google App Engineで開発するスケールするアプリケーション連載記事一覧
-
- Google App Engineで開発するスケールするアプリケーション(後編)
- Google App Engineで開発するスケールするアプリケーション(中編)
- Google App Engineで開発するスケールするアプリケーション(前編)
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア



