ユーザデータ収集処理
次に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がスケジュールされて起動される設定です。