Hubotを使ってSlackに投稿されたメッセージに応答してシェルスクリプトを実行させる
はじめに
HubotをSlack上で常駐させることで色々なことができます。ここでは、Hubotをインストールして実際にSlack上に常駐させ、メッセージに応答してHubotが動作するパソコン上でシェルスクリプトを実行させるまでの手順をメモします。
Hubotについて
Hubotは、GitHub社が開発しているチャットボットの開発用のフレームワークです。Hubotを使用することで簡単に自分の目的に合わせたボットを開発することができます。
Hubot is your friendly robot sidekick. Install him in your company to dramatically improve employee efficiency.
そもそもボットは何かについて、Hubotの詳細な説明については以下の記事が大変参考になりました。
本連載では,GitHub社が開発したチャットbot開発・実行フレームワークである「Hubot」を使用して,チャットツールにオリジナルのbotを住まわせ,開発フローに組み込むことで開発を楽にする方法について解説していきます。
前提と環境
Hubotの開発をしたり動作させたりするには、Node.jsとnpmが必要となります。この記事では、以下を前提とします。
- HubotをインストールするOS :Ubuntu18.04
- Node.js : v10.16.0
- npm : 6.10.2
- Slackアカウントは取得済とする
Hubotをインストールする
基本的には以下の公式ドキュメントに従ってインストールを進めます。
Hubot is your friendly robot sidekick. Install him in your company to dramatically improve employee efficiency.
Node.jsとnpmがインストールされている環境で、以下のようにnpmを使ってHubotを生成するためのパッケージをインストールします。
$ npm install -g yo generator-hubot
続いてHubotをインストール先となるディレクトリ作成します。ここでは、myhubot
という適当な名前のディレクトリを作成します。その後作成したディレクトリに移動します。ディレクトリ名は各自決めてOKです。
$ mkdir myhubot
$ cd myhubot
作成したディレクトリにて、以下のようにyo
コマンドを使用することでHubotをインストール、作成します。
$ yo hubot
上記を実行すると、以下のように質問形が表示されます。Hubotを改善するために匿名データを送信してよいか?という質問になります。ここでは、匿名データを送信しないためにn
と入力してEnterを押します。
$ yo hubot
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & https://yeoman.io
========================================================================== (Y/n) n
続いて以下のように作成するボットに関する情報を入力するよう順番に質問が表示されます。
? Owner myowner
? Bot name myhubot
? Description my first bot
? Bot adapter slack
内容は上から順番に下記の通りです。
項目名 | 内容 |
---|---|
Owner | 作成するHubotの適当なオーナー名 |
Bot name | 作成するHubotの名前 |
Description | 作成するHubotの説明 |
Bot adapter | 作成するHubotを動作させたいプラットフォームのためのアダプター。ここではSlackを指定。 |
重要なのはBot adapterです。ここでは、Slack上で動作するHubotを作成したいため、Bot adapterとしてslack
を指定しています。他のアダプターについては、例えばシェル上で動作させるためのshell
があります。詳しくは以下の公式ドキュメントに記載されています。
Hubot is your friendly robot sidekick. Install him in your company to dramatically improve employee efficiency.
全体を通して見ると以下のようになります。
$ yo hubot
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & https://yeoman.io
========================================================================== (Y/n) n _____________________________
/ \
//\ | Extracting input for |
////\ _____ | self-replication process |
//////\ /_____\ \ /
======= |[^_/\_]| /----------------------------
| | _|___@@__|__
+===+/ /// \_\
| |_\ /// HUBOT/\\
|___/\// / \\
\ / +---+
\____/ | |
| //| +===+
\// |xx|
? Owner myowner
? Bot name myhubot
? Description my first bot
? Bot adapter slack
create bin/hubot
create bin/hubot.cmd
create Procfile
create README.md
create external-scripts.json
create hubot-scripts.json
create .gitignore
create package.json
create scripts/example.coffee
create .editorconfig
_____________________________
_____ / \
\ \ | Self-replication process |
| | _____ | complete... |
|__\\| /_____\ \ Good luck with that. /
|//+ |[^_/\_]| /----------------------------
| | _|___@@__|__
+===+/ /// \_\
| |_\ /// HUBOT/\\
|___/\// / \\
\ / +---+
\____/ | |
| //| +===+
\// |xx|
npm notice created a lockfile as package-lock.json. You should commit this file.
+ hubot-heroku-keepalive@1.0.3
+ hubot-google-images@0.2.7
+ hubot-diagnostics@1.0.0
+ hubot-maps@0.0.3
+ hubot-redis-brain@1.0.0
+ hubot-help@1.0.1
+ hubot-pugme@0.1.1
+ hubot@3.3.2
+ hubot-scripts@2.17.2
+ hubot-google-translate@0.2.1
+ hubot-shipit@0.2.1
+ hubot-rules@1.0.0
+ hubot-slack@4.7.1
added 159 packages from 127 contributors and audited 274 packages in 9.657s
found 0 vulnerabilities
以上でhubotのインストールが完了です。続いて動作確認を行います。
Hubotの動作確認をおこなう
Hubotのインストールが完了したら、以下のコマンドを実行して実際にHubotを動かしてみます。
$ bin/hubot
audited 274 packages in 1.398s
found 0 vulnerabilities
No history available
myhubot> [Sun Aug 04 2019 00:57:05 GMT+0900 (GMT+09:00)] WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed in 3.0 (https://github.com/github/hubot-scripts/issues/1113) in favor of packages for each script.
Your hubot-scripts.json is empty, so you just need to remove it.
[Sun Aug 04 2019 00:57:05 GMT+0900 (GMT+09:00)] INFO hubot-redis-brain: Using default redis on localhost:6379
[Sun Aug 04 2019 00:57:05 GMT+0900 (GMT+09:00)] ERROR hubot-heroku-keepalive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web.url | cut -d= -f2)`
上記のように警告とエラーがでますが、とりあえずEnterを押すと、以下のように入力待受状態になります。myhubot
は各自が設定したHubot名になります。
myhubot>
後は実際に適当に入力してみると、以下のように応答してくれます。
myhubot> help
usage:
history
exit, \q - close shell and exit
help, \? - print this usage
clear, \c - clear the terminal screen
Hubotが動作していることを確認できました。なお、上記で表示された警告とエラーは、これはHubotがデータを永続化させるために必要なredisがインストールされていないためです。この記事では、データの永続は不要なためredisはインストールせずに進めます。もし作成するHubotにデータを保持させて永続化したいような場合は、以下の公式ドキュメントを参考にしてみてください。
Hubot用のSlackトークンを取得し、セットアップを行う
Slack上で、作成したhubotを動作させるためには、Slackでトークンを取得する必要があります。トークンを取得するには、以下のようにSlackを開いているウィンドウの左側にある「アプリを追加する」をクリックします。
「アプリを追加する」をクリックすると、以下のようにアプリを検索するページが表示されるので、ここで以下のように「hubot」と検索します。そして検索結果として表示された「Hubot」の「インストール」をクリックします。
続いて以下のようにHubotの説明ページが表示されるので、ここで「設定を追加」をクリックします。
「設定を追加」をクリックすると、以下のようにHubotのユーザ名(Slack上に表示されるユーザ名)の入力フォームが表示されます。ここでは、適当に「myhubot」という名前を入力します。入力後、「Hubotインテグレーションの追加」をクリックします。
続いて以下のように、Hubotのセットアップページが表示されます。以下でxoxb-
から始まる値がHubot用のトークンになります。
上記の「セットアップの手順」に表示されているように、以下をそのまま後ほど使用します。
HUBOT_SLACK_TOKEN=xoxb-1234567889-1297691287308-joup923hotp9283ht3o2j3tp
なお、同じページ内で下にスクロールしてくと、以下のように作成したHubotの名前やアイコンなどを設定可能です。
最後にページ最下部にある「インテグレーションの保存」をクリックしてトークンの取得とセットアップが完了です。
Slackに戻ってみると、以下のように「App」部分に作成した「myhubot」が追加されていることを確認できます。
ただし、このままでは作成したHubotにメッセージを送っても何も反応してくれません。実際に動作させる必要があります。この手順を次に説明します。
HubotをSlack上で動作させる
取得したSlackのトークンを以下のようにHubotの起動時にオプションとして渡すことでSlack上でHubotが動作できるようになります。
$ HUBOT_SLACK_TOKEN=xoxb-1234567889-1297691287308-joup923hotp9283ht3o2j3tp bin/hubot --adapter slack
上記コマンドを実行すると、Slack上でも作成したHubotがオンラインになることを確認できます。
そして試しに作成したHubotにダイレクトメッセージで「help」と送ってみると、以下のように使い方が応答として返ってきます。
これで無事に作成したHubotがSlack上で動作するところまでを確認できました。
Hubotに対して投稿されたメッセージに応答して任意のシェルスクリプトを実行する
Slack上でHubotに送られたメッセージに反応して用意したシェルスクリプトを実行させてみます。
そのために、まずHubotをインストールしたディレクトリ直下にすでに存在するscripts
というディレクトリに移動します。
$ cd scripts
Hubotでは、このscripts
ディレクトリに自由に自分のスクリプトを置いて好きな処理をさせることができます。なお、HubotではCoffeeScriptがデフォルトとなっています。
scripts
の中にshell
という名前の適当なディレクトリを作成します。
$ mkdir shell
そしてshell
ディレクトリ配下に以下の内容を含むシェルスクリプトをhello.sh
という名前で作成しておきます。
#!/bin/sh
echo "Hello from script"
続いて、任意のメッセージに反応して作成したhello.sh
を実行するためのHubotのスクリプトをexec_shell.coffee
という適当な名前で作成します。
$ vi exec_shell.coffee
exec_shell.coffee
の中身を以下のようにします。
module.exports = (robot) ->
robot.respond /myecho/, (msg) ->
@exec = require('child_process').exec
cmd = "sh /home/username/myhubot/scripts/shell/hello.sh"
msg.send "#{cmd} を実行しました。"
@exec cmd, (error, stdout, stderr) ->
if error
msg.send error
msg.send stderr
else
msg.send stdout
robot.respond /testshell/, (msg) ->
@exec = require('child_process').exec
cmd = "sh /home/username/myhubot/scripts/shell/hello.sh"
msg.send "#{cmd} を実行しました。"
@exec cmd, (error, stdout, stderr) ->
if error
msg.send error
msg.send stderr
else
msg.send stdout
上記のスクリプトは、myecho
、もしくはtestshell
というメッセージをHubot宛にメンションを送る(@hubot名)と、sh /home/username/myhubot/scripts/shell/hello.sh
というコマンドを実行するスクリプトです。すなわち、任意のメッセージに反応して指定したシェルスクリプトを実行することができます。
msg.send stdout
は、シェルスクリプトを実行した結果をHubotのメッセージとしてユーザに返します。例えばここで使用したhello.sh
は、実行するとHello from script
と表示するだけのものなので、これをそのままHubotのメッセージとしてユーザに返答します。
シェルのパス等は私の実際の環境となるため上のコードと異なりますが、Slack上では以下のようになります。
ここの例は実用性は全くないですが、後はシェルスクリプトを自由に変更すれば色々なことができます。しかし、当然ながらこれはそのままセキュリティリスクともなるので、実際に運用するシーンやセキュリティについては十分に注意してください。私はラズベリーパイ上にHubotをインストールし、さらにラズベリーパイにつないだ赤外線リモコンを操作するシェルスクリプトを実行したい目的でした。この記事で紹介したように、Hubotを使用して任意のシェルスクリプトを実行させることで、Slackから家電の操作をすることもできます。
まとめ
Hubotを使うことでかなり色々なことができそうです。使い始めるのもとても簡単なのでボットに興味がある方は触ってみてください。
関連記事
- 公開日:2019/12/19 更新日:2019/12/19
コードなしでボットを作成できるフレームワークBotfront
Botfrontは、GUIのエディタでボットに発言させたい内容やユーザのメッセージに対してどのような応答を返すかを編集してボットを作成できるフレームワークです。また、作成したボットをWebサイトやSlack上で動作させることも可能です。この記事では、Botfrontをインストールしてボットを作成するまでをまとめます。
- 公開日:2018/10/31 更新日:2018/10/31
LINEのLIFFアプリを登録する手順と簡単な実例
LIFF(LINE Front-end Framework)はLINEのトークルーム上でWebアプリを呼び出してLINEと連携して動作するアプリのプラットフォームです。ここでは、このLIFFアプリを登録して実際に動作させるまでの手順をメモします。
- 公開日:2018/10/08 更新日:2018/10/08
ユーザの投稿メッセージに応答するSkypeボットをGoogle Apps Scriptで作成する手順
Skypeにてユーザからボットのへの投稿メッセージに応じて適当なメッセージを送り返すボットをGoogle Apps Scriptで作成します。ここではあらかじめ決めたメッセージを返すだけですが、この記事での内容を元に色々な応用に使えると思います。
- 公開日:2018/10/05 更新日:2018/10/05
Skypeにメッセージを投稿するSkypeボットをGoogle Apps Scriptで作成する手順
なユーザの投稿に応答する形ではなく、ボットが主体となって投稿するメッセージをプロアクティブメッセージと呼びます。この記事では、プロアクティブメッセージを任意のSkypeチャットに送信するSkypeボットをGoogle Apps Scriptで作成します。