Hubotを使ってSlackに投稿されたメッセージに応答してシェルスクリプトを実行させる

公開日:2019/08/07 更新日:2019/08/07
Hubotを使ってSlackに投稿されたメッセージに応答してシェルスクリプトを実行させるのサムネイル

はじめに

HubotをSlack上で常駐させることで色々なことができます。ここでは、Hubotをインストールして実際にSlack上に常駐させ、メッセージに応答してHubotが動作するパソコン上でシェルスクリプトを実行させるまでの手順をメモします。

Hubotについて

Hubotは、GitHub社が開発しているチャットボットの開発用のフレームワークです。Hubotを使用することで簡単に自分の目的に合わせたボットを開発することができます。

hubot.github.com

Hubot is your friendly robot sidekick. Install him in your company to dramatically improve employee efficiency.

そもそもボットは何かについて、Hubotの詳細な説明については以下の記事が大変参考になりました。

gihyo.jp

本連載では,GitHub社が開発したチャットbot開発・実行フレームワークである「Hubot」を使用して,チャットツールにオリジナルのbotを住まわせ,開発フローに組み込むことで開発を楽にする方法について解説していきます。

前提と環境

Hubotの開発をしたり動作させたりするには、Node.jsとnpmが必要となります。この記事では、以下を前提とします。

  • HubotをインストールするOS :Ubuntu18.04
  • Node.js : v10.16.0
  • npm : 6.10.2
  • Slackアカウントは取得済とする

Hubotをインストールする

基本的には以下の公式ドキュメントに従ってインストールを進めます。

hubot.github.com

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をインストール、作成します。

~/myhubot
$ yo hubot

上記を実行すると、以下のように質問形が表示されます。Hubotを改善するために匿名データを送信してよいか?という質問になります。ここでは、匿名データを送信しないためにnと入力してEnterを押します。

~/myhubot
$ 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

続いて以下のように作成するボットに関する情報を入力するよう順番に質問が表示されます。

~/myhubot
? 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.github.com

Hubot is your friendly robot sidekick. Install him in your company to dramatically improve employee efficiency.

全体を通して見ると以下のようになります。

~/myhubot
$ 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を動かしてみます。

~/myhubot
$ 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にデータを保持させて永続化したいような場合は、以下の公式ドキュメントを参考にしてみてください。

github.com

A hubot script to persist hubot's brain using redis

Hubot用のSlackトークンを取得し、セットアップを行う

Slack上で、作成したhubotを動作させるためには、Slackでトークンを取得する必要があります。トークンを取得するには、以下のようにSlackを開いているウィンドウの左側にある「アプリを追加する」をクリックします。

click-add-app.png

「アプリを追加する」をクリックすると、以下のようにアプリを検索するページが表示されるので、ここで以下のように「hubot」と検索します。そして検索結果として表示された「Hubot」の「インストール」をクリックします。

search-hubot-app.png

続いて以下のようにHubotの説明ページが表示されるので、ここで「設定を追加」をクリックします。

hubot-description.png

「設定を追加」をクリックすると、以下のようにHubotのユーザ名(Slack上に表示されるユーザ名)の入力フォームが表示されます。ここでは、適当に「myhubot」という名前を入力します。入力後、「Hubotインテグレーションの追加」をクリックします。

configure-hubot.png

続いて以下のように、Hubotのセットアップページが表示されます。以下でxoxb-から始まる値がHubot用のトークンになります。

setup-hubot.png

上記の「セットアップの手順」に表示されているように、以下をそのまま後ほど使用します。

HUBOT_SLACK_TOKEN=xoxb-1234567889-1297691287308-joup923hotp9283ht3o2j3tp

なお、同じページ内で下にスクロールしてくと、以下のように作成したHubotの名前やアイコンなどを設定可能です。

hubot-other-settings.png

最後にページ最下部にある「インテグレーションの保存」をクリックしてトークンの取得とセットアップが完了です。

save-configureation.png

Slackに戻ってみると、以下のように「App」部分に作成した「myhubot」が追加されていることを確認できます。

myhubot-on-slack.png

ただし、このままでは作成したHubotにメッセージを送っても何も反応してくれません。実際に動作させる必要があります。この手順を次に説明します。

HubotをSlack上で動作させる

取得したSlackのトークンを以下のようにHubotの起動時にオプションとして渡すことでSlack上でHubotが動作できるようになります。

~/myhubot
$ HUBOT_SLACK_TOKEN=xoxb-1234567889-1297691287308-joup923hotp9283ht3o2j3tp bin/hubot --adapter slack

上記コマンドを実行すると、Slack上でも作成したHubotがオンラインになることを確認できます。

check-online-hubot.png

そして試しに作成したHubotにダイレクトメッセージで「help」と送ってみると、以下のように使い方が応答として返ってきます。

demo-help.png

これで無事に作成したHubotがSlack上で動作するところまでを確認できました。

Hubotに対して投稿されたメッセージに応答して任意のシェルスクリプトを実行する

Slack上でHubotに送られたメッセージに反応して用意したシェルスクリプトを実行させてみます。 そのために、まずHubotをインストールしたディレクトリ直下にすでに存在するscriptsというディレクトリに移動します。

~/myhubot
$ cd scripts

Hubotでは、このscriptsディレクトリに自由に自分のスクリプトを置いて好きな処理をさせることができます。なお、HubotではCoffeeScriptがデフォルトとなっています。 scriptsの中にshellという名前の適当なディレクトリを作成します。

~/myhubot/scripts
$ mkdir shell

そしてshellディレクトリ配下に以下の内容を含むシェルスクリプトをhello.shという名前で作成しておきます。

~/myhubot/scripts/shell/hello.sh
#!/bin/sh
echo "Hello from script"

続いて、任意のメッセージに反応して作成したhello.shを実行するためのHubotのスクリプトをexec_shell.coffeeという適当な名前で作成します。

~/myhubot/scripts
$ vi exec_shell.coffee

exec_shell.coffeeの中身を以下のようにします。

~/myhubot/scripts/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上では以下のようになります。

hello-from-script-demo.png

ここの例は実用性は全くないですが、後はシェルスクリプトを自由に変更すれば色々なことができます。しかし、当然ながらこれはそのままセキュリティリスクともなるので、実際に運用するシーンやセキュリティについては十分に注意してください。私はラズベリーパイ上にHubotをインストールし、さらにラズベリーパイにつないだ赤外線リモコンを操作するシェルスクリプトを実行したい目的でした。この記事で紹介したように、Hubotを使用して任意のシェルスクリプトを実行させることで、Slackから家電の操作をすることもできます。

まとめ

Hubotを使うことでかなり色々なことができそうです。使い始めるのもとても簡単なのでボットに興味がある方は触ってみてください。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。