読者です 読者をやめる 読者になる 読者になる

TwitterBotの作成①

GAE上でbotが動くようになったので、一旦書き留めておく。

使用言語:python OS:Mac OS X

1 python-twitter導入

先人の作ったpython-twitterという非常に便利なライブラリがあるので、まずそれをインストールする。

bot用のフォルダの作成する。

・以下のライブラリをダウンロード・インストール

simplejson(simplejson 3.3.0 : Python Package Index)

httplib2(httplib2 - A comprehensive HTTP client library in Python - Google Project Hosting)

oauth2(simplegeo/python-oauth2 · GitHub)

python-twitterのダウンロード・インストール (※ 必ず上記のインストールが完了してからインストールを行う)

python-twitter(python-twitter - A python wrapper around the Twitter API - Google Project Hosting)

・以下のファイル・フォルダを、始めに作成したフォルダに入れる

simplejson/ oauth2/ httplib2/ twitter.py

以下のようになっているとよい。

これでpython-twitterが使えるようになった。

2 botとなるTwitterアカウントの作成

Twitterのサイト(Twitter)で登録するだけ。

3 OAuth対応

OAuthとは、TwitterAPIをたたく時に必要な認証方法。

現在はOAuth認証しか使えないが、2010年秋頃まではBasic認証というものがあり、それを使うことが多かった。
なので、それ以前に書かれたサイトやブログのやり方では現在うまくいかないことがあるので注意が必要。

twitter-developers(Twitter Developers)に登録

アカウントはもちろん今回使うbot

登録すると、Consumer key,Consumer secretが得られる。

・Access Tokenの取得

Settingsタブの、Application TypeのAccessをRead and Writeにする。(重要!)

次に、Detailsタブに戻り、Create my access tokenボタンをクリック。

access tokenのAccess LevelはRead and Writeになっているはず。

もしRead Onlyになっていれば、Recreateする。

これでAccess token,Access token secretも得られ、OAuth認証に必要なものがそろったことになる。

(認証がうまくいくかの確認)

pika_shi_bot.py

#!/usr/bin/env python                                                                                                                                                                                     
# -*- coding: utf-8 -*-                                                                                                                                                                                   

import twitter

CONSUMER_KEY="XXXXXXXXXXXX"
CONSUMER_SECRET="XXXXXXXXXXXX"
ACCESS_TOKEN="XXXXXXXXXXXX"
ACCESS_TOKEN_SECRET="XXXXXXXXXXXX"

api = twitter.Api(consumer_key=CONSUMER_KEY,
                      consumer_secret=CONSUMER_SECRET,
                      access_token_key=ACCESS_TOKEN,
                      access_token_secret=ACCESS_TOKEN_SECRET,
                      cache=None)

postmsg = 'ぴかしなう'
status = api.PostUpdate(postmsg.decode("utf-8"))

XXXXXXXXXXXX のとこには、先程取得したConsumer key,Consumer secret,Access token,Access token secretをそれぞれ入れる。

pika_shi_bot.pyを実行。ここまでうまくいってると、botが「ぴかしなう」とつぶやいてくれるはず。

そしてこのファイルは後にbotを動かすためのメインとなるので、フォルダに入れておく。

4 GAEでアプリケーション作成

GAE(GoogleAppEngine)とは、Googleの提供してくれているサーバ環境。

ここにファイルをあげることで、botを自動的に動かせる。

・GAEへ登録(http://code.google.com/intl/ja/appengine/)

SDK for Pythonのダウンロード・インストール

SDK for Python(Downloads - Google App Engine — Google Developers)

bot用のアプリケーションを作成

My ApplicationsのCreate Applicationをクリックすると作成できる。

これでGAEの環境構築は完了。

5 サーバにファイルをあげる。

botを自動的に動かすには、cronというデーモンプロセスが必要。定期的にプログラムを自動実行してもらう。

・以下の2つのファイルを作成

app.yaml

application: XXXXXXXXXXXX
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: pika_shi_bot.py
  login: admin

XXXXXXXXXXXX には、4で作成したアプリケーションのApplicationIDを入れる。

cron.yaml

cron: 
- description: cron job name
  url: /.*
  schedule: every 15 minutes

この場合だと、15分毎に自動実行。

これらをフォルダに入れる。

これでファイルをサーバにあげる準備はほぼ完了。

ただし

※ 現在のpika_shi_bot.pyでは、15分毎に「ぴかしなう」とつぶやくが、Twitterでは連続して全く同じツイートを投げるとエラーになるので、ツイートに投稿日時を追加しておく。

改pika_shi_bot.py

#!/usr/bin/env python                                                                                                                                                                                     
# -*- coding: utf-8 -*-                                                                                                                                                                                   

import twitter
import datetime

CONSUMER_KEY="XXXXXXXXXXXX"
CONSUMER_SECRET="XXXXXXXXXXXX"
ACCESS_TOKEN="XXXXXXXXXXXX"
ACCESS_TOKEN_SECRET="XXXXXXXXXXXX"

api = twitter.Api(consumer_key=CONSUMER_KEY,
                      consumer_secret=CONSUMER_SECRET,
                      access_token_key=ACCESS_TOKEN,
                      access_token_secret=ACCESS_TOKEN_SECRET,
                      cache=None)

postmsg = 'ぴかしなう[' + datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + ']'
status = api.PostUpdate(postmsg.decode("utf-8"))

python-twitterはそのままではGAEで動かないので修正が必要(重要!)

Issue59(Issue 59 - python-twitter - Won't work on google app engine - A python wrapper around the Twitter API - Google Project Hosting)にあるパッチファイルを参照して変更する。

・動作の確認

以下のコマンドで、現在のフォルダを実行。

dev_appserver.py (フォルダ名) 

そして、ブラウザでhttp://localhost:8080/を開く。

何も表示されなかったら成功。

・フォルダをGAEにあげる

GoogleAppEngineLauncherを立ち上げ、File→Add Existing Application Settings→GAEにあげるフォルダを選択→Add

右上のDeploy→ログイン

これでGAEへのアップ完了。

GAEのアプリケーションのページにある、Cron Jobsで、cronが正常に動作しているか確認できる。

botはこんな感じでつぶやいてくれました。

ちなみに時間は標準時なので、朝早くにポストした訳ではないw

これで土台が固まったって感じ。

さあ、botにどんな機能を持たせよう。