ユーザデータ収集処理
次にCronとして起動されるユーザデータ収集処理を説明します。ユーザデータ収集処理のリクエストハンドラを以下に示します。
class GetRelatedUserDataHandler(webapp.RequestHandler):
# 処理対象ユーザIDの関連ID集合と、関連ユーザデータを最大100件取得する。
def get(self):
# 擬似キューのデータを1件取得。
q = db.GqlQuery("SELECT * FROM WaitGetRelatedData LIMIT 1")
wait_grds = q.fetch(1)
# データが存在しない場合は終了
if wait_grds == None:
return
wait_grd = wait_grds[0]
# 関連ユーザ取得処理(最大100件のユーザデータ)
_put_related_users(wait_grd.screen_name)
# 関連ユーザID集合取得処理
_put_ids(wait_grd.screen_name)
# 擬似キューのデータを削除
wait_grd.delete()
関連ユーザ取得処理
_put_related_usersメソッドのソースを以下に示します。
def _put_related_users(screen_name):
# Twitter APIアクセス
friends = twutil.get_related_user_data(screen_name,'friends')
# ユーザのエンティティを保存し、関連ユーザデータ作成用擬似キューに格納する。
for target_tw_user in friends:
tw_user = TwitterUser.get_by_key_name(target_tw_user.screen_name)
# データが既に存在する場合は、データは作成しない
if tw_user != None:
continue
target_tw_user.seq = Counter.next_id('TwitterUser')
target_tw_user.put()
_put_wait_get_related_data(target_tw_user.screen_name)
get_related_user_dataメソッドはTwitterの関連ユーザ取得API「http://twitter.com/statuses/friends/$screen_name.xml」にアクセスし、$screen_nameがフォローしているユーザ情報を中編のリスト2に示したようなデータ形式で取得し、TwitterUserエンティティ集合を生成し返します。ここでは処理の詳細説明は割愛します。
関連ユーザID取得処理
_put_idsメソッドは、Twitterのfriends ID取得APIにアクセスし、引数で渡されたscreen_nameに該当するユーザがフォローしているIDの集合を取得し、Twitterユーザエンティティのfriends_ids属性に設定します。ソースを以下に示します。
def _put_ids(screen_name):
# Twitter APIアクセス
friend_ids = twutil.get_friend_ids(screen_name)
# エンティティにID集合を保存する
tw_user = TwitterUser.get_by_key_name(screen_name)
tw_user.friend_ids = friend_ids[:4900]
tw_user.put()
friends[:4900]と4900番目より大きい要素を切り捨てているのは、Google App Engineでは1エンティティあたり5000までしかインデックスをつくれないという制限のためです。たとえば4900のfriend_idを1エンティティに保存した場合4900のインデックスが作成されます。
twitterutil.pyのget_friend_idsメソッドでは、Twitterのfriends ID取得API(http://twitter.com/statuses/friends/$screen_name.xml)にアクセスし、中編のリスト3に示したXMLを取得し、ID集合をリストに格納して返します。APIアクセスのソースの説明はここでは割愛します。
cronの設定
ここまでで説明したユーザデータ収集処理は、Google App Engineのcronから起動されるのを想定しています。cronを設定するには、アプリケーションのルートディレクトリにcron.yamlというファイルを作成し、cronの記述を定義します。以下にcron.yamlを示します。
cron: - description: Get Related User Data url: /grud schedule: every 5 minutes
「cron:」の記述の後にある「url: /grud」は「http://ホスト名/crud」のURLでリクエストハンドラが起動されることを意味します。そのあとの「schedule: every 5 minutes」は、5分ごとにcronがスケジュールされて起動される設定です。
