appengine pythonで数時間でtwitterのbotを作る

一日につぶやいた数を毎日23:55に自動でつぶやくbot, nekofierをappengine上で作りました。
以下、その時のメモです。簡単な仕組みなのでbotを作成する際の参考になれば。

nekofierってなに?

一日につぶやいた数を毎日23:55に自動でつぶやきます。この時、つぶやきにweb上のどこかにあるネコ画像へのリンクも一緒につぶやきます。
こんな感じです↓

ソースはgithubに置いてあります。
https://github.com/yatt/nekofier

構成

こんな感じの構成です。

  • 毎日23:50に画像更新
  • 毎日23:55に、その日つぶやいた回数と画像リンクをつぶやく

作るのに要求される知識

  • pythonの基本的な構文
  • oauthの認証プロセス
  • twitterのRESTful API
  • appengineの基本的な開発の進め方

取得・発行が必要なデータ

  • twitterのoauth consumer token/secretと、そのアプリに対する、利用者のaccess token/secret
  • appengineのアプリID


以下、具体的な実現方法。

プログラミング Google App Engine

プログラミング Google App Engine

猫画像をどこから持ってくるか?

nekostagramという、instagramと連携するwebアプリをクロールしてurlを取得するようにします。こんなコードを実行して、猫画像のリンクを取得します。

# coding: utf-8
import urllib
import re

def get():
    # nekostagramからデータを取得
    conn = urllib.urlopen('http://nekostagram.heroku.com/')
    cont = conn.read(4096)
    # 画像リンクのみ抽出
    lst = re.findall(r'(http://dist.+?\.jpg)["\']', cont)
    return lst[0]


かわいい・・・


twitterの認証処理

twitterは認証にoauthという仕組みを使います。oauthの仕組み自体はtwitterの開発者サイトなどにわかりやすい説明があります。
通常、外部公開するtwitterアプリは、oauthの認証画面に飛ばしてコールバックして処理を継続する・・などという処理をしますが、今回は、自分一人だけが使う事を想定しているので、簡単のため、特にoauth認証のための画面や処理などは用意していません。リモートシェルなどからアクセストークンを直接データストアに保存しています。アクセストークンは https://dev.twitter.com/apps の、アプリ詳細画面から発行、表示させることができます。

twitterのRESTful APIを叩く

RESTful APIを叩くのに、拙作のtwittwer apiライブラリ、twitterlibを用いました。

定期実行をどうやるか?

appengineは、定期で特定のurlをキックする仕組みを提供しています。この仕組みをつかって毎日の猫画像の更新とつぶやきを実行します。
アップロードするソース群のルートにcron.yamlを配置して特定の記述をする事で対応します。今回は以下のような記述をしました。

cron:
- description: tweet it
  url: /batch/tweet
  schedule: every day 23:55
  timezone: Asia/Tokyo
- description: update photo link
  url: /batch/updatelink
  schedule: every day 23:50
  timezone: Asia/Tokyo

nekofierのソース内では、外部からこれらのリンクにアクセスされないよう保護する設定をしています。

まとめ

appengine pythonを使えば、これぐらいのbotは簡単に作って動かすことができます!

料金改定以降、無料枠利用者にはかなり厳しくなったappengineですが、この程度の用途であれば無料枠に収まりきらないというのは考えにくいですし、簡単なbotを作って動かしたい、という用途には向いているんじゃないでしょうか。