GoogleAppEngine-pythonを利用して簡単なtwitterbotを作成する

pythonGAEtwitter
基本的にGAEがある程度分かっている人向けに書きます。はい。
GAEのサイトからSDKをとってきて開発環境はできているのを前提に書きます。


とりあえずファイルを置くフォルダを作成しましょう。
twitterbotというフォルダを作ります。場所はどこでもいいですが今回はSDKを落としてきたときに作成したgoogle_appengineフォルダ直下に作成しました。
作成するファイルは

twitter.py
postmodel.py
app.yaml
cron.yaml

です。
OAuth認証をしないとかっこ悪いのでtweepyというライブラリを使用します。easy_installが入っているなら

easy_install tweepy

で簡単にインストールできます。
下記のkeyとsecretはhttp://twitter.com/oauthを設定して、取得しておきます。そして、
対話型で

import tweepy
key = "hogehogehoge"
secret = "hogehogehoeg"
auth = tweepy.OAuthHandler(key,secret)
redirect_url = auth.get_authorization_url()
redirect_url

表示されたURLにアクセスして7桁の数字を取得

auth.get_access_token(7桁の数字)
token_key = auth.access_token.key
token_secret = auth.access_token.secret

このtoken_key,token_secretをメモしておきましょう。keyとsecretも使います。


GAEでtweepyを利用するためにはtweepyのソースコードもGAE上にあげる必要があります。
http://codecontrol-samples.googlecode.com/file/gae-tweepy.tar.gz
からファイルをダウンロードして解凍するとtweepyフォルダがあるので、それをtwitterbotフォルダ内にコピーします。
これからプログラムを書いていきます。


twitter.py

import tweepy

CONSUMER_KEY = 'twitterで取得したkey'
CONSUMER_SECRET = '同じくsecret'

TOKEN_KEY = '対話型で取得したkey'
TOKEN_SECRET = '対話型で取得したsecret'

class TwitterAuth(object):
    def getAuth(self):
        auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(TOKEN_KEY,TOKEN_SECRET)
        oauthapi = tweepy.API(auth)
        return oauthapi

    def update(self,oauthapi,post):
        oauthapi.update_status(post.encode('utf-8'))

これはtweepyのインスタンスを作成し、取得するgetAuthメソッドとポストする文字列をutf-8に直してポストするupdateメソッドを定義しています。

from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from twitter import TwitterAuth

import cgi
import os
from google.appengine.ext.webapp import template

import random

class Post(db.Model):
    content = db.StringProperty()

class Update(webapp.RequestHandler):
    def get(self):
        twitter = TwitterAuth()
        twitterapi = twitter.getAuth()
        posts_query = Post().all()
        posts = posts_query.fetch(1000)
        post = posts[random.randint(0,len(posts)-1)].content
        self.response.out.write(posts[random.randint(0,len(posts)-1)].content)
        twitter.update(twitterapi,post)

application = webapp.WSGIApplication(
                                    [
                                     ('/update', Update)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

メインとなるpostmodel.pyです。
Postというモデルはポストする発言を保存するモデルです。
Updateクラスが実際にtwitterにポストするクラスです。twitter.pyからtweepyのインスタンスを取得し、postモデルから1000件までデータを取得します。

random.randint(0,len(posts)-1)

により0〜データ数-1
までの整数を取得します。これによりランダムなポストができるようになります。そしてupdateメソッドによりtwitterにポストします。

cron.yaml

cron:
- url: /update
  schedule: every 12 hours

先ほどのUpdateクラスは/update URLに結びついています。よって/updateを叩くとtwitterにポストするようになっています。なのでこのURLを12時間ごとに叩くようにcron.yamlで設定してあげます。

このtwitterbotフォルダをGAE上にあげて発言したい内容をセットすると簡単なbotの完成です。