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

アラタナエンジニアブログ

aratana Engineer's Blog

こんな僕でも30分でSlackのbotを作れた。

こんにちは。アラタナの良心、宮崎ひび(@hibi_myzk)です。あ、これを夜中に読んでるクリスマスに何の予定もないみなさんは、こんばんは。早いもので、もう師走ですね。お坊さんが忙しくて走り回る時期なので「師走」と言われていますが、もともと師走はサンスクリット語で「シヴァス」から来ています。シヴァスは燃えさかる炎の意味があり、年末にかけて炎上する今の時期にピッタリだという気がします。まあ、ぜんぶ嘘なんですけどね!


さて、ここからホントの話です。僕の所属してるチームではSlackを使ってコミュニケーションをとっています。むしろ、Slack以外で会話をしないレベルです。もう、bot作るしかない流れですね。さっそくHubotを使ってSlackのbotを作ってみましょう。知識ゼロだったので30分かかりましたが、知識があったらそんなにかかりません。クリスマスにbot作る予定をいれても、そんなもの一瞬で終わりますよ。


https://slack.com

f:id:shunsuk:20141204092416p:plain


HubotはGitHubが開発したbotフレームワークです。YeomanのHubotジェネレーターを使うと楽です。YeomanはWebのプロジェクトの雛形をサクッと作ってくれるアレです。僕は脳内で「伊右衛門」と呼んでいますが、いつか人前で口に出してしまいそうで不安です。ちなみに、亀山政春のことは「マッサン」と読んでいます。(小ネタにマッサンを挟むなんてSEO完璧ですね!あまちゃんあまちゃんちゅらさん向井理!)


https://hubot.github.com

f:id:shunsuk:20141204092443p:plain


http://yeoman.io

f:id:shunsuk:20141204092535p:plain


node.jsがないとはじまりません。まあ、大抵のことはnode.jsがないとはじまりませんよね。

$ brew install node


HubotがRedisを使うので、いちおうインストールしておきます。(いらないかも)

$ brew install redis


node.jsのパッケージを管理するnpmでYeomanをインストールします。お〜いお茶

$ npm install -g yo grunt-cli bower


Hubotのジェネレーターをインストールします。じぇねれーたー!じぇじぇじぇあまちゃんちゅらさん向井理

$ npm install -g generator-hubot


これで準備完了。おでんで言えば、大根の面取りが終わったところです。それでは、プロジェクトを作ってみましょう。アンパンマンで言えば、これから生地を形にしていきます。

$ mkdir sushibot
$ cd sushibot
$ yo hubot


いくつかの質問に答えていくとプロジェクトが自動的に生成されます。インタラクティブですね。WIRED誌風に言うと、インタラクティヴですね。Bot adapterを聞かれたら、元気よく「slack」と答えてあげてください。

f:id:shunsuk:20141204085111p:plain


プロジェクトが作られたら動作確認します。

$ bin/hubot


あれ。エラーが出る。。。

bin/hubot: line 5: npm: command not found


とりあえず、bin/hubotの5行目に追記しときますか。Homebrew環境です。

export PATH="/usr/local/bin:$PATH”


もう一度。

$ bin/hubot


警告出ますが、持ち前のスルー力を発揮します。returnキーを押すとプロンプトが出てくるので、pingしてみます。

Hubot> hubot ping
Hubot> PONG

わーい。


もうさっそくサーバーに上げちゃいましょう。今回はお手軽にHerokuを使います。Heroku Toolbeltをインストールしておいてください。

https://toolbelt.heroku.com

$ git init
$ git add .
$ git commit -m “first comment”
$ heroku login
$ heroku create sushibot
$ heroku addons:add redistogo:nano
$ git push heroku master


ブラウザで確認してみます。

$ heroku open

「Cannot GET /」と表示されていればOKです。


次にSlackの設定です。Slackにログインしたら、Configure Integrationsというメニューを探してください。スクショ撮り忘れたので、がんばって探してください。隠れてます。どうせクリスマス予定ないんだから、時間かけて探してください。

f:id:shunsuk:20141204085153p:plain
f:id:shunsuk:20141204085209p:plain


あ。ここから行けるわ。

http://my.slack.com/services/new/hubot


トークンなどの設定が出てくるのでコピペします。Webページ上の設定をコピして、コンソールにペします。下のコマンドを発行すると、Herokuの環境変数が設定されます。

$ heroku config:set HUBOT_SLACK_TOKEN=[your token] HUBOT_SLACK_TEAM=[your team] HUBOT_SLACK_BOTNAME=[your bot name]


アプリのURLを調べます。

$ heroku apps:info
(略)
Web URL: https://sushibot.herokuapp.com/
(略)


Webページ側のHubot URLにコンソールでコピしたURLをペします。

f:id:shunsuk:20141204085240p:plain


ついでにHerokuにも設定。

$ heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=[your bot app url]


これでbotが反応してくれるはずです。Slack上でpingしてみます。キタコレ。ちなみに、アイコンは好きなものに変えられます。

f:id:shunsuk:20141204085315p:plain


ここからが本番です。おでんで言えば、あー、おでんの作り方わからんわー。Slack上の発言を監視します。scripts/example.coffeeにいろいろ例が載っていますが、持ち前のスルー力を発揮してとりあえず簡単に。CoffeeScriptで書きます。

module.exports = (robot) ->

  robot.hear /(sushi|すし|スシ|寿司)/i, (msg) ->
    msg.send "スシが食べたい。”


こんな感じで、発言を正規表現で引っ掛けて、応答するメッセージを送るだけです。下準備に時間がかかりましたが、いったん設定してしまえば後は楽勝ですね。僕の人生は楽勝じゃないですけどね!

f:id:shunsuk:20141204085340p:plain


画像とか返してみましょうか。SlackはURLを投稿すると画像を表示してくれます。ですが、連続して同じURLを投稿するとキャッシュされて画像が表示されません。そこで、URLの後ろにタイムスタンプをつけてみました。

module.exports = (robot) ->

  robot.hear /(sushi|すし|スシ|寿司)/i, (msg) ->
    msg.send "スシが食べたい。"

  robot.hear /(kanna|かんな|カンナ|環奈|天使)/i, (msg) ->
    timestamp = (new Date()).toISOString().replace(/[^0-9]/g, "")
    msg.send "https://dl.dropboxusercontent.com/u/000000/kanna.jpg?#{timestamp}”


f:id:shunsuk:20141204085415p:plain

橋本環奈、マジ天使。


文脈完全無視なので、普通に会話してても「かんな」が含まれてると反応します。マジ天使ですね。botが。

f:id:shunsuk:20141204085509p:plain


どうです?簡単でしょ?次回からは30分もかかりません。定型文を返すだけでなく、もっといろいろ試してみてください。人工無能とか使って、それっぽい返事をしてくれるbotを作ればクリスマスもハッピーに過ごせますよ。


ちなみに上の写真は台湾でイベントをやったときに、プレゼンしたりカメラマンしたりしながら撮影したものです。橋本環奈ちゃんとは帰りの飛行機がいっしょだったのですが、一緒に乗ってた知り合いは挨拶されていましたが、僕は挨拶されませんでした。世知辛い世の中ですね!