サンプルコードで分かるGAE&Twitter API開発 (4/5)
2010年04月28日 11時00分更新
main.pyの処理を理解しよう
main.pyではどのような処理をしているのか見ていきましょう。全部で400行ほどのコードに、大きく分けて以下の4つの処理があります。
- URLリクエストに対する処理の振り分け
- OAuth認証の実行と認証情報の保存
- Twitter API関数(メソッド)へのアクセス(発言の取得、発言の追加、削除など)
- 取得したデータの表示
それぞれの処理について少し掘り下げて説明します。
URLリクエストに対する処理の振り分け
多くのWebアプリケーションと同様に、今回のサンプルコードもURLパラメーターによって処理が変わります。URLパラメーターごとの処理はmain.pyの末尾の方にある「main」関数で定義します。このmain関数がすべての処理のスタートとなります。
[main.py:387~398行目]
def main():
#URLによってリクエストハンドラを切り替える
application = webapp.WSGIApplication([
('/friends/(\w+)', FriendsHandler), #URLにfriends/が含まれる場合
('/(.*)', MainHandler) #それ以外(通常)の場合
],
debug=True)
util.run_wsgi_app(application)
関数内でもっとも注目してほしいのは、FriendsHandlerとMainHandlerが出てくる部分です。今回のサンプルでは
- URLのドメイン以下の部分が「/friends」で始まる場合は「FriendHandler」というクラスに処理をさせる
- それ以外のすべては「MainHandler」というクラスに処理をさせる
と定義しています。これらのクラスは今回のサンプルコード独自のものですが、webapp.RequestHandlerというクラスを継承したクラスに処理をさせるのはGAEでは一般的な方法です。それぞれのクラス名でmain.pyを検索してみると、実際にクラスや関数を定義している箇所にたどり着きますので、今度はそこから読み進めていけば、処理の順番を追って理解できるわけです。
OAuth認証の実行と認証情報の保存
OAuth認証は本来かなり複雑な処理ですが、今回は「oauth.py」ライブラリーを利用して極力シンプルなコードで済みようにしています。OAuth用のオブジェクトを作成しているのが「CreateClientAndCookie」関数です。
[main.py:57~69行目]
def CreateClientAndCookie(self):
#Twitter認証画面からのコールバック用URLを設定
callback_url = "%s/verify" % self.request.host_url
#TwitterClientクラスの作成
client = oauth.TwitterClient(CONSUMER_KEY, CONSUMER_SECRET,
callback_url)
#Cookiesクラスの作成
cookie = Cookies(self, max_age=COOKIE_EXPIRE_TIME)
return client, cookie
まず、認証後に戻ってくるURL(コールバックURL)を設定しています。「現在の基本URLの末尾にverifyという文字列」の形になっています。前回の記事で「Twitter API登録画面のコールバックURLは適当でよい」と説明したのは、登録したURLと関係なく、ここで設定したURLが使われるからなのです。
その後、Twitter APIの登録時に発行された「コンシューマーキー」と「コンシューマーシークレット」とともに、TwitterClientクラスを作成しています。このTwitterClientクラスを利用して、OAuth認証や認証を必要とするAPIを呼び出しています。同時に、認証後に得られる情報を保存するためのCookie用クラスも作成しています。Cookie用クラスにはsimple_cookie.pyというライブラリーで定義されたCookiesクラスを利用しています。
最後に、作成した2つのクラスを戻り値として戻しています。ちなみに2つの値を簡単に戻り値に設定できるのはPythonの大きな特徴の1つです。
次に、これらのクラスを実際に利用している箇所を見てみましょう。まず、これら2つのクラスが作られている部分です。
[main.py:181行目]
(client, cookie) = CreateClientAndCookie(self)
main関数の部分で出てきた「MainHandler」クラスの冒頭で、真っ先にTwitterClientクラスとCookiesクラスを作成しています。その次に、URLによって処理が切り替わる部分が続いていますが、認証に関係するのは以下の2箇所です。
[main.py:184~186行目]
if mode == "login":
#Twitterの認証画面へリダイレクトする
return self.redirect(client.get_authorization_url())
ここではURL末尾に「login」と付いていた場合の処理です。テンプレート用HTMLである「login.html」を見ると、ログオンのリンクが「/login」となっていることが分かります。「URLの末尾がloginであった場合、Twitterの認証用の画面にリダイレクトする」という処理です。
次は、URL末尾に「verify」と付いていた場合の処理です。つまり、先ほどコールバック用URLとして指定したURLだった場合の処理です。
[main.py:196~200行目]
if mode == "verify":
#認証確認
VerityAuth(self, client, cookie)
#初期画面へリダイレクト
return self.redirect("/")
ここでは、VerifyAuth関数を利用して認証を確認し、その後、初期画面(URLパラメーター無し)にリダイレクト、という動きになっています。初期画面では「認証が済んでいなければログオン画面の表示、認証が済んでいればタイムラインの表示」という動きになっていますので、これでつじつまが合います。
認証処理の最後に、「VerifyAuth」関数の処理を見て見ましょう。
[main.py:74~82行目]
def VerityAuth(self, client, cookie):
auth_token = self.request.get("oauth_token")
auth_verifier = self.request.get("oauth_verifier")
user_info = client.get_user_info(auth_token, auth_verifier=auth_verifier)
#アクセストークンをCookieへ保存
cookie["user_token"] = user_info["token"]
cookie["user_secret"] = user_info["secret"]
cookie["screen_name"] = user_info["username"]
ここでは、コールバックされたURLのパラメーター部分からOAuthの認証確認用の値を取得し、取得した値を利用してTwitterClientクラスの「get_user_info」関数でユーザー情報を取得しています。
TwitterClientクラスは、ユーザー情報の取得まではやってくれますが、保存する機能はありませんので、Cookieに情報を保存しています。ここで保存した情報は、次の「Twitter APIへのアクセス」で必要となります。