Just $ A sandbox

プログラミングと計算機科学とかわいさ

GAEで(Twitter APIを利用した)簡単webアプリ

webアプリとか書いてみたくなったのでGAEでちょっと何か作って見ることにしました。 と言ってもあまり難しいものを作る技術も時間的余裕も無いので、今回は"Twitterにログインし、与えられた文字列をツイートする"ことだけを行います。

もちろん、OAuth認証を利用しますよ!

準備

GAEの登録の仕方やTwitterのコンシューマーキーの取得方法とかは基本的に割愛します。 今回必要となる登録は大体以下のとおりです。

Downloads - Google App Engine — Google Developersからダウンロードできます。今回はPythonで作ったのでGoogle App Engine SDK for Pythonからダウンロードしました。

  • GAEへの登録・Twittter Applicationの登録

(割愛します)

Google App Engine — Google Developers

Twitter Developers

もちろんなんでも構いませんが個人的にはEclipseをオススメします。PyDevというのを入れるとPythonが使えるようになり、さらにGAEのEclipse用プラグインまで用意されているので非常に開発がしやすいです。詳しくは→ Downloading and Installing the Plugin - Google Plugin for Eclipse — Google Developers

  • 必要なライブラリ

PythonからTwitter APIを叩くことになりますが、Tweepyという素晴らしいライブラリが用意されているので今回はこれを使うことにします。TweepyをPythonにインストールするのではなく、今回はこれをGAEのサーバーにのせる必要があるのでソースファイルを用意してください。私はGithubから貰って来ました。

tweepy/tweepy · GitHub (このリポジトリの、tweepyフォルダ以下のみが必要になります)

また、GAE未経験の方は一応ある程度、GAEについて把握されておいたほうが良いと思います。ありがたいことに、全て日本語のチュートリアルが用意されています→ スタート ガイド: Python - Google App Engine — Google Developers

開発

さて、いよいよ実際に作っていくことにします。 今回作ったものは http://prooving-everyday.appspot.com/ にて動いています。 (何やら怪しげなサイトに見えますがやっていることはOAuth認証→つぶやくということだけです)

今回作ったアプリケーションのフォルダ構成は以下のようになっています。

+ src
  + tweepy          -- さっき取ってきたtweepyフォルダ
  - view            -- 静的ファイル
    - stylesheets
      - index.css
    - index.html
    - posted.html
  - cookie.py       -- cookieをあれこれする
  - setting.py      -- cosumer keyとかsecretを持っておく
  - main.py         -- これが今回のメイン
  - app.yaml        -- 設定ファイル

https://github.com/myuon/prooving-everyday

上でソースファイルを公開しています。

動かすには

実際にこれを動かすには、いくつか必要な設定があります。

  • setting.pyの中にconsumer keyとconsumer secretを記入する。
  • tweepyフォルダの中にtweepyを入れる。

これでおそらく動くようになるはずです。

解説

少しだけ解説をします。

  • viewディレクトリ

ここには静的ファイルが入れてあります。cssは普通のcssファイルで、index.html, posted.htmlはどちらもこのファイルを参照しています。また、htmlファイルはDjangoと呼ばれるPython用のwebアプリケーションフレームワークに基づいて書かれています。例えばindex.htmlの中で、

<a href="{{ url }}">{{ url_linktext }}</a> -- このファイルを表示する際に渡された変数url, url_linktextの文字列を展開する
    
{% if login %}
    hogehoge... -- 変数loginが真ならばhogehogeを実行
{% endif %}

のような表記が見られます。これはDjango特有のもので、詳しくはDjango documentation | Django documentation | Djangoなどを読めば分かる気がします(丸投げ){{GAE SDKは内部にDjangoを含んでいるため、GAE SDKが導入されていればDjangoは別に導入しなくても今回のプログラムは動きます}}。

  • main.py

基本的な構造は以下のとおりです。

class MainPage(webapp.RequestHandler):
    def get(self):
        # MainPageを表示するときの処理
        hogehoge ...

        # 以下の部分で、HTMLファイルに変数を渡す
        self.response.out.write(template.render(path, {'url': url,
                                                       'url_linktext': url_linktext,
                                                       'login': url == u'logout',
                                                       'message': message
                                                       }))

def main():
    application = webapp.WSGIApplication([
                                          # "~~~/"というURLがコールされたらMainPageに飛ばす
                                          ('/', MainPage),
                                          hogehoge ...
                                          ],debug=True)
    run_wsgi_app(application)

やっていることは非常に単純なので説明はいらないと思います。基本的には、

      +---------------------------+
      | トップページ(MainPage)を表示  |
      +---------------------------+
        ↓          ↑ 反映
+-------------------+    +-----------------------------+
| ログインリンクを踏む   | →  | 情報をcookieに書きこんでおく  |
+-------------------+    +-----------------------------+   
   ↓       ↑(コールバック)
+----------------------+
| TwitterからOAuthで認証 |
+----------------------+

のようにしています。ログインしたかどうかの情報をページをまたいで保持していなくてはならないので、それをcookieでブラウザに保存します。

cookieの保存、読み込み、削除を行います。

  • setting.py

Twitter applicationで手に入れたコンシューマーキーやシークレットはここに書いておきます。

書き方はGAEのドキュメントを参照してください。

まとめ

非常に簡単ですがこれだけでTwitterのアカウント認証を行い、フォームに入力された文字列を受け取ってツイートすることが可能になります。 今回はしませんでしたが、TLを表示することももちろん可能なので簡易webクライアントもすぐに作れるようになると思います。 tweepyとDjangoは本当に便利ですね!

参考

※GAE, OAuth, Tweepyで検索を掛けるとそれなりにいくつかのサイトがヒットしますが、どうやらかつてgoogle developer centerがcookieを読み書きするためのpythonコードを公開していたようで(simple_cookieというのがそれ(?))、それとmemcacheを組み合わせて動かしているコードをいくつか見かけました。そしてどうやらsimple_cookieの公式配布場所が移転or閉鎖してしまったようで手に入らなかったため、今回は自作のcookie.pyを利用することにしました。