monoの開発ブログ

HerokuでStreaming APIを使うTwitter Botを作る

Herokuを使うと無料でTwitterのStreaming APIを活用したbotを動かせるようなので、試してみました。

Herokuの仕様

Herokuのアプリケーションでは、1ヶ月に750時間無料で利用できます。通常だとWebサーバが1インスタンス起動していて、672-744時間ほど消費するので余計なことをする余裕はありませんが、Webサーバを落としてしまえばbotを常時起動しておくことができるようになります。

設定

以下の記事を参考にしました。

Webサーバを止めてbotを動かす、みたいなことはCeder Stackというものを使うと簡単にできるようです。

botのプログラム

gemをBundlerで管理しているbotであればほとんど変更することなく動きます。私はuserstreamというgemを利用して作成したbotをHerokuで動かしています。

以下はbotのサンプルプログラムです。ここからはこのプログラムを例に説明します。

foreman

Herokuのプロセス管理にはforemanというgemを利用します。

$ gem install foreman

foremanでは、Procfileにプロセスを起動するためのコマンドを記述しておき、foreman startコマンドを実行するとProcfileに記述しておいたコマンドでプロセスが立ち上がります。サンプルでは1行しか記述していませんが、本来はたくさんのプロセスを一元管理するためのgemのようです。

$ foreman start

現時点では設定をしていないのでエラーですぐに終了してしまいます。foremanはカレントディレクトリの.envというファイルを読み込んでその内容を環境変数に設定してくれるので、設定は.envに記述し、コードではENVを参照します。普通のアプリケーションでは独自の設定ファイルを用意するかもしれませんが、Herokuでは仕様上リポジトリに入っていないファイルをデプロイできないため、設定ファイルをデプロイしようとすると設定ファイルをリポジトリに含める必要があり、気持ち悪いです。代わりにHerokuでは起動時の環境変数を設定する機能が用意されているので、ローカルでも.envに記述して環境変数を利用することで、同じコードで処理できて便利だと思います。

$ cp .env.example .env
$ vi .env

.env

.envはkey=valueの形式で記述します。

TWITTER_CONSUMER_KEY=...
TWITTER_CONSUMER_SECRET=...
TWITTER_OAUTH_TOKEN=...
TWITTER_OAUTH_TOKEN_SECRET=...

プロジェクトの作成・デプロイ

プロジェクト作成時に--stack cedarを指定しておきます。既存のプロジェクトをCedarスタックに変更することはできないようなので、指定を忘れたら一度消して作り直してください。

$ heroku create heroku-twitter-bot --stack cedar
$ heroku addons:add logging
$ git push heroku master

heroku configコマンドで設定を追加しておくと、起動時に環境変数を設定してくれます。

$ heroku config:add TWITTER_CONSUMER_KEY=... TWITTER_CONSUMER_SECRET=... TWITTER_OAUTH_TOKEN=... TWITTER_OAUTH_TOKEN_SECRET=...

botのプロセスが1つ起動するように設定します。

$ heroku scale bot=1

正常に起動していれば、heroku psコマンドでプロセスを確認できます。

$ heroku ps

サンプルプログラムはUserStreamで受信した情報をログに出力します。正常に動作していれば、以下のコマンドでUserStreamを受信する様子を確認できるはずです。

$ heroku logs --tail

おわりに

無料でStreaming APIを使えるサーバというだけでもかなり稀ですが、Herokuはアプリケーションをいくらでも作り放題という超強力な仕様です。24時間動かせるマシンを用意できないためにbot作成を諦めていた方も、Herokuでbotを動かしてみてはいかがでしょうか。

おまけ