hubot-twitter-userstreamをリリースしました
先月の話になりますが、HubotからTwitterへ投稿するためのAdapter hubot-twitter-userstreamをnpmで公開しました。
Hubotとは
Github社が作成したチャットボットです。CoffeeScriptで書かれており、Node.js上で動作します。 Hubotはチャットに接続、投稿するためのAdapter, メッセージやイベントにレスポンスを返すScriptなどから構成されており、 それらのモジュールを導入することで簡単に様々なチャットサービスで動作するBOTを作ることができます。
hubot-twitter-userstream で何ができるのか
そもそもHubotのTwitter用のAdapter(MathildeLemee/hubot-twitter · GitHub)はすでに存在していたのですが、実際BOTを作るにあたっていくつか 難点があり
タイムラインからツイートを取得できない
Twitter上で動くBOTは普通タイムラインのツイートを取得して、ツイートによっては反応してリプを返すという挙動を期待すると思うのですが、 hubot-twirrerではstatuses/filterを用いて、自分の名前を検索してマッチしたツイートを受信するという ちょっとよくわからない挙動になっています。これだけでもリプライを送ったりするBOTを作るには致命的です。
フォロー・リムーブができない
- ダイレクトメッセージが送れない
等々致命的な弱点があり、BOTを作る前に、Adapterを自分で作ってやろうと思い至った次第です。
hubot-twitter-userstreamでできること
- ツイートの投稿、返信ができる
- UserStreamを使ってタイムラインからツイートを取得できる
- フォロー・リムーブができる
- ダイレクトメッセージの送受信ができる
- フォローされた、ふぁぼられた等のイベントが受信できる
できないこと
- RT
- 画像のアップロード
- フォロー・フォロワー一覧の取得(例えばBOTを起動していない時にフォローしたユーザーをリフォローできない)
導入方法
Hubot自体の導入方法は hubot/docs at master · github/hubot · GitHub や はじめてのHubot - Qiita を参照してください。
自分のBOTがあるディレクトリmyhubotは用意出来ましたか?出来ましたね!
導入はmyhubot/package.jsonを編集して"dependencies"に「"hubot-twitter-userstream": ""」をこんな感じで追加して
... "dependencies": { "hubot": ">= 2.6.0 < 3.0.0", "hubot-scripts": ">= 2.5.0 < 3.0.0", "hubot-twitter-userstream": "" }, ...
myhubotディレクトリ中で npm install を実行すれば myhubot/node_modules ディレクトリ中にインストールが行われます。
次に環境変数にTwitterのAPI keyをいくつか設定する必要があります。
$ export HUBOT_TWITTER_KEY="key" $ export HUBOT_TWITTER_SECRET="secret" $ export HUBOT_TWITTER_TOKEN="token" $ export HUBOT_TWITTER_TOKEN_SECRET="secret"
それから、自分のスクリーンネーム(ここでは@hubottestとします)をBOTの名前に設定します。
$ export HUBOT_NAME="hubottest"
これで準備は完了です。
使い方
pingを返す
myhubotディレクトリ中で ./bin/hubot -a twitter-userstream と実行することでBOTが起動します。 BOTには初期状態でいくつかScriptが組み込まれているのでテストしてみましょう。
まずBOTのアカウントで自分のアカウントをフォローさせてから「@hubottest ping」というようにリプライを飛ばしてみましょう。 成功すれば、BOTが「PONG」とつぶやきます。
リフォローする
BOTをフォローしたユーザーをフォローするには、 以下のようなスクリプトを用意してscriptsディレクトリに入れて、BOTを再起動します。
# myrules.coffee module.exports = (robot) -> robot.on 'followed', (event) -> robot.logger.info "followed #{event.user.name}!" robot.adapter.join event.user