diary

Google App EngineでTwitter botを作る

with one comment

清水宗治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!

Written by Kei

September 10th, 2009 at 11:01 pm

Posted in Tech

Tagged with , , , ,

One Response to 'Google App EngineでTwitter botを作る'

Subscribe to comments with RSS or TrackBack to 'Google App EngineでTwitter botを作る'.

  1. JSports Rugby bot…

    結構前に作ったんだけど。JSports Rugby (js_rugby) on …

    戯言

    14 Sep 09 at 6:58 pm

Leave a Reply