3連休中ですがボッチなので、せめてボットと戯れようと Twitter の公開タイムラインを監視&応答ツイートする Hubot のアダプターを試してみました。
ちなみに、Hubot のアダプター一覧はここで参照できます。
⇒ https://github.com/github/hubot/blob/master/docs/adapters.md
今回の大まかな方針としては、次のとおりです。
- Hubot は Heroku で動かします。
- どれくらい CPU を使うか未検証なので、無料枠に収まるかは分かりませんw
- ただ今回のもの程度であれば、私の環境では無料枠で動いています。
- ボットは Twitter の 公開タイムライン を監視します。
- よって、とりこぼしがあっても仕方なし、とします。
- ボット用の Twitter アカウントを用意します。
- Twitter へのアプリケーション登録もします。
ボットの作成で必要なものは、Mac、Yeoman の環境、Heroku のアカウントです。これらの環境を用意する手順については先日、似たようなものをこちらに書いたので、宜しければ参考にしてください。
⇒ Yoeman で Hubot を作成して Heroku へデプロイし Slack と連携する
雛形ボットの作成と動作確認
ボットの作成
-
適当な作業用のディレクトリを作成して、ジェネレータを起動。
- ジェネレータのインストールについては、上記リンクの手順をご覧ください。現在のバージョンは
0.1.4
です。
$ mkdir hubot_twitter $ cd hubot_twitter $ yo hubot
- ジェネレータのインストールについては、上記リンクの手順をご覧ください。現在のバージョンは
-
Bot name
とDescription
を適当に入力し、Bot adapter
はtwitter
と入力します。-
Bot name
は Hubot の起動オプション-n
で指定するので、ここでは適当でいいです。
-
-
次のようにファイルが展開されました。
package.json
はこんな感じ。 -
まずは、この状態で動作するか、ローカルで動作確認します。
$ cd hubot_twitter $ ./bin/hubot
-
Hubot>
コンソールで、次のように応答が返ってこればOK。動作確認したらexit
で抜けます。
Twitter 側でアプリケーション登録
適当なボット用の Twitter アカウントを用意し、ログイン状態で https://apps.twitter.com/
にアクセスします。
適当にアプリケーション名や説明、ウェブサイトを記載し、
Premissions
タブにて、権限を Read and Write
に変更します。
Keys and Access Tokens
タブにて、Access Token/Secret
を新たに発行します。後の為に控えておくのは次の4つの情報です。
Consumer Key (API Key)
Consumer Secret (API Secret)
Access Token
Access Token Secret
ローカルで動作確認
次のように Hubot の起動スクリプトを作成し、
#!/bin/sh
export HUBOT_TWITTER_KEY="控えていた情報"
export HUBOT_TWITTER_SECRET="控えていた情報"
export HUBOT_TWITTER_TOKEN="控えていた情報"
export HUBOT_TWITTER_TOKEN_SECRET="控えていた情報"
bin/hubot -a twitter -n HogeTweetBot
※ 上記の例でいうと HobeTweetBot
が語りかけ対象のボット名になります。
起動スクリプトに実行権限を付与して、実行します。
$ cd hubot_twitter
$ chomod +x local_run.sh
$ ./local_run.sh
Twitterで、確認してみます。世界中の誰がつぶやいても応答するのですが、今回はボット自らのアカウントでつぶやきます。
Heroku へのアップロードし動作確認
- 先ほどの
local_run.sh
と同じ立ち上げ方を Heroku 上で出来るようProcfile
を修正します。
web: bin/hubot -a twitter -n HogeTweetBot
-
Git でコミットします。
$ cd hubot_twitter $ git init $ git add . $ git commit -m "firs comment"
先ほどの
local_run.sh
には トークン等を記載してしまっているため、ファイル名を.gitignore
に追記して、コミットされないようにしてください! -
Heroku へプッシュします。
$ heroku create $ git push heroku master
-
Heroku が動いているか確認します。
$ heroku open
エラー出ますが、とりあえずはOK。
-
Heroku へ環境変数を追加し、もう一度
$ heroku open
してみます。$ heroku config:add HUBOT_TWITTER_KEY="控えていた情報" $ heroku config:add HUBOT_TWITTER_SECRET="控えていた情報" $ heroku config:add HUBOT_TWITTER_TOKEN="控えていた情報" $ heroku config:add HUBOT_TWITTER_TOKEN_SECRET="控えていた情報"
次のように表示されればエラーは出てません。
-
Twitterで動作確認してみます。
ボットを作成してみる
ここまで出来てたら、あとは適当なボットを作成するのみです。簡単な例で、あいうえお
に対して「こんにちわ!」、かきくけこ
に対して「こんばんわ!」を応答するには次のようにします。
module.exports = (robot) ->
robot.respond /あいうえお/i, (msg) ->
msg.send "こんにちわ!"
robot.respond /かきくけこ/i, (msg) ->
msg.send "こんばんわ!"
上記のファイルをコミット、Heroku へ反映した後、つぶやいてみます。
また当然、Hubot の組み込みスクリプト(external-scripts.json
で組み込んでいるもの)も利用できますので、試しに猫の画像を探してもらいます。
いろいろ出来そうですね^^
補足:今回の Twitter 用アダプターについて
アダプターのソースは node_modules/hubot-twitter/src/twitter.coffee
です。ソースの中身をみてみると、Twitter の API名で言うと Streaming API
の Public streams
の statuses/filter
で track(検索キーワード)
を指定して、ボット名を抽出しています。
Twitter の APIリファレンス(statuses/filter)
⇒ https://dev.twitter.com/streaming/reference/post/statuses/filter
Twitter の仕様上、全タイムラインの監視はできず取りこぼしが発生し、またこのアダプターの仕様上、ボットに指示を出す場合はボット名で呼びかける必要があります。(チャットのタイムラインを robot.hear
でだらっと眺める、ということが出来ない。)
もし、本格的に Twitter ボットのようなものを実現したい場合は、Node.js 用の Twitter ライブラリである twit を利用したり、上記の Twitter アダプターのソースを参考にしたり、hubot-scripts にある Twitter 系のソースを参考にしたりして、自分で作るのが良いかと思います。
また、ボットの Twitter アカウントと フォロー/フォロワー の関係を作れば、Twitter の Streaming API
を利用したとしても、より取りこぼしが少ない抽出の仕方ができるかと思いますし、もしくは Streaming API
を使わず、普通に Twitter クライアントアプリケーションのようなものを作ることも可能かと思います。
Twitter の APIリファレンス(Streaming API)
⇒ https://dev.twitter.com/streaming/overview
おまけ:Hubot に hubot-scripts を組み込む方法
Hubot の組み込みスクリプト(external-scripts.json
で組み込んでいるもの)以外にも、「hubot-scripts」とうのも予め用意されていますので、これらも簡単に利用することが出来ます。
hubot-scripts
⇒ https://github.com/github/hubot-scripts
結構な量があるので、何がどういうものか分かりませんね^^;
今回の環境でいうと node_modules/hubot-scripts/
配下に各ソースが格納されています。これらを Hubot へ組み込むには hubot-scripts.json
に利用するものを追記して、Hubot を起動するだけです。
["twitter.coffee"]
※ .coffee
も書くのに注意。
もし依存するモジュールがあれば(だいたい各ソースの先頭に説明が記載されています)、package.json
に追記して $ npm install
してください。
おわりに
今回のソースは GitHub に置きました。
⇒ https://github.com/hkusu/Hubot_Twitter_sample
Hubot は Heroku に簡単に載せられ(= グローバルにインターネット公開できる)、アクションを定期実行でき、各種サービス連携のアダプターも豊富、HTTPリクエストの受け取り/発行もできるしで、「チャット連携」にかぎらず、何かちょっとしたツールやサービスを作るのにも手軽でいいのかなと思います。