このページの本文へ

サンプルコードで分かる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)


 関数内でもっとも注目してほしいのは、FriendsHandlerMainHandlerが出てくる部分です。今回のサンプルでは

  • 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へのアクセス」で必要となります。

この連載の記事

一覧へ

この記事の編集者は以下の記事をオススメしています