Google App EngineでTwitter botを作る
清水宗治botは、pythonで書かれていてGoogle App Engine上で動いています。ちょっと前に、Google App Engineがcronをサポートしたというのを聞いたので、それを試してみたくてこの環境で作ってみました。すごく簡単だったので、作り方を紹介します。
Twitterへの投稿には、Python Twitterてのを使ってみました。いや〜、便利な世の中ですね、先人に感謝です。ちゃっちゃと手軽にやりたかったので、データはファイルから読むようにしました。ここでは1日1Twitするbotを作るので、データファイルは、シンプルに日付とテキストをカンマで区切った行がただダラダラと並ぶ構造にしました。データファイルはdata.txtという名前で、UTF-8で保存してください。
9/9,実に秋晴れktkr 9/10,景治と将棋を指す。まだまだガキには負けないわw : : :
メインのPythonのコード、main.pyはこんな感じ。
#!/usr/bin/env python # -*- coding:utf-8 -*- import datetime from datetime import datetime import twitter def my_twitter_api_init(self, username=None, password=None, input_encoding=None, request_headers=None): """overriding twitter.Api.__init__ method not to use FS cache. """ import urllib2 from twitter import Api self._cache = None self._urllib = urllib2 self._cache_timeout = Api.DEFAULT_CACHE_TIMEOUT self._InitializeRequestHeaders(request_headers) self._InitializeUserAgent() self._InitializeDefaultParameters() self._input_encoding = input_encoding self.SetCredentials(username, password) twitter.Api.__init__ = my_twitter_api_init f = open('./data.txt') today = datetime.now() while 1: line = f.readline() if not line: break datetext, text = line.split(',') mon, day = datetext.split('/') if int(mon) == today.month and int(day) == today.day : twitterapi = twitter.Api(username="TWITTER_USERNAME", password="TWITTER_PASSWORD") result = twitterapi.PostUpdate(text.decode('utf-8')) break
TWITTER_USERNAMEとTWITTER_PASSWORDには、あなたの使うTwitterアカウント情報を入れてください。
ポイントは、Twitter PythonのApiクラスでファイルキャッシュが使われているのですが、これがGoogle App Engineでは使えないらしいので__INIT__を上書きして使わないように変更することです。ここは、「GAE/Python で Twitter bot を作る」という記事を参考にしました。メインの処理は超原始的で、データファイルの中から今日の日付のものを見つけてそれをTwitterに送る、というだけです。
ここではBotを動かす上で必要最小限のことだけを紹介したいと思っているので、エラー処理とか画面になんか出力するとかいう処理は一切入ってません。そういったおしゃれなことは自分で心ゆくまで好きなように実装してみてください。それから、ちょっと手を加えれば、こんなファイルをダラダラ読むかわりに、データベースを検索してみたり、RSSを読みに行ってみたりすることも簡単にできます。そんな楽しい作業をいちいち解説するほど野暮じゃないので、ぜひ自分でいろいろ試して楽しんでみてください。
アプリケーションの定義ファイルであるapp.yamlはこんな感じ。
application: YOUR_GOOGLE_APP_NAME version: 1 runtime: python api_version: 1 handlers: - url: /.* script: main.py login: admin
YOUR_GOOGLE_APP_NAMEには、自分のアプリケーション名を入れてください。
これで、このアプリケーションのURLをブラウザから叩くと、Pythonのプログラムが実行されてTwitterに投稿が飛ぶようになります。これだとこのURLにアクセスがあるたびにプログラムが実行されてしまうため、login: adminという行を加えて、プログラムの管理者(大抵は自分だけ)で認証されたときだけ実行されるようにします。詳しくはここを参照してください。そうそう、余談ですが、最近Twitterは、まったく同じ内容の投稿が連続で飛んでくると、2つ目以降を無視するみたいです。
このプログラムを定期的に実行させるためのcron.yamlはこんな感じ。
cron: - description: dialy twit url: / schedule: every day 14:40 timezone: Asia/Tokyo
これで、日本時間の毎日午後2時40分に、このアプリケーションが起動されます。
アプリケーションのディレクトリ構造は至ってシンプルです。
/
|– main.py
|– simplejson/
|– twitter.py
|– data.txt
|– app.yaml
|– cron.yaml
このように、すべて、ルートの直下にぶち込みます。Python Twitterのライブラリtwitter.pyもルートの直下に、Python Twitterが依存しているsimplejsonはライブラリのフォルダごとルートの直下に配置します。
これで準備は全て終わりです。Google App Engine Launcherを使って手元の環境で動作を確認したら、あとはそれをdeployして完成です。Enjoy!
JSports Rugby bot…
結構前に作ったんだけど。JSports Rugby (js_rugby) on …
戯言
14 Sep 09 at 6:58 pm edit_comment_link(__('Edit', 'sandbox'), ' ', ''); ?>