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

@paiza_runみたいな機能をSlackに超簡単につけてみた備忘録

2016.10.29にシェル芸勉強会のLT大会で話したことを、もう少し詳しく書きます。 (発表が、あまりにざっくり過ぎたのもあり。。)
私が試した環境はmacOSです。

ちなみに、paiza_runというのはTwitterアカウントで、コードをつぶやくと実行結果を返してくれる、一部で大人気のアカウントです。
twitter.com

Hubotの導入

導入する環境はローカルでも、さくらのVPSみたいな環境でも大丈夫だと思います。
私はローカルでしか、やったこと無いのですが。

Node.jsとnpmの準備

ココは各自環境に合わせて使えるようにしてください。

npmでHubotに必要なモジュールをインストール

npm install -g hubot yo generator-hubot coffee-scriptでインストールできるハズです。
グローバルインストールが嫌な人は-gを抜いてください。
各モジュールの内訳としては、

モジュール 詳細
hubot hubotです
yo プロジェクトのひな型生成ツールらしい
generator-hubot Hubotのプロジェクト生成ツール
coffee-script https://ja.wikipedia.org/wiki/CoffeeScript

Hubotを生成する

yo hubotと叩くとジェネレータが起動します。
メールアドレスやらオーナー名やらbot名やらの設定を経て、生成されます。

(スマホで見ると表示くずれてるかもです。)

                     _____________________________  
                    /                             \ 
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             / 
 ======= |[^_/\_]|   /----------------------------  
  |   | _|___@@__|__                                
  +===+/  ///     \_\                               
   | |_\ /// HUBOT/\\                             
   |___/\//      /  \\                            
         \      /   +---+                            
          \____/    |   |                            
           | //|    +===+                            
            \//      |xx|                            

? Owner butackle
? Bot name testBOT
? Description test
? 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|                            

SlackとHubotをつなげる

SlackにHubotを出現させる

ここから導入したいSlackチームを選んで、表示名とか表示画像とかを設定します。 slack.com 後からでも設定は変えられます。
あとは設定画面にAPI Tokenというものが記載されているので、それをコピっておいてください。
このあとの作業で使います。

Hubotの環境にSlackのTokenを設定する

先ほどコピっておいたAPIトークンを設定します。
export HUBOT_SLACK_TOKEN=<API Token>でOKです。
たまに再起動したあと設定し忘れてて、HubotとSlackが繋がらなくなって、やや焦ることがあったので、binの中のhubotに書いておくのも良いと思ったりします。

Hubot を起動する

./bin/hubot --adapter slackでHubotを起動します。
うまく繋がれば、bot名の横の丸が緑色になっているはずです。 f:id:butackle:20161030123051p:plain
試しにPINGと打つとPONGと返してくれます。
f:id:butackle:20161030123210p:plain

f:id:butackle:20161120143624p:plain

コマンド入力に対応させる

今回は単純に打ったメッセージをそのまま実行するという簡単な仕様にします。
なので、かなり簡単に実装できます。

上記の内容をscripts内に好きなファイル名でcoffeeスクリプトのファイルを保存してもらえれば大丈夫だと思います。
私はindex.coffeeで保存してます。

ざっくりコード説明

  • L2 → robot.hear /regexp/指定した正規表現にマッチしたメッセージが投げられた場合に処理するという意味になっています。私が指定した正規表現/.+/iなので、何か一文字でも入力されたら処理する仕様になっています。なので、ココの正規表現を変えれば処理条件のカスタムが可能です。

  • L4-L5 → 取得したmsgには色々な情報がのっかっているので、入力されたメッセージだけを抽出してます。

  • L6−L9→ コマンド実行して、その結果を成功・エラー問わずSlackで送るように設定されています。"#{Command}"がコマンド文です。これはローカルで、そのまま実行するようになっています。なので、例えばvagrant ssh -- #{Command}のようにすれば『起動しているvagrant環境で実行した結果を返す』というようなことも可能です。


ホントに少ーしだけ詳しく書きました。
出来たら、またLTリベンジしたいなと思っております。
また、このままだと危険シェル芸もそのまま実行されたりします。
安全対策に関しては、自己責任でお願いしますね!


参考資料

SlackのBot(hubot)を作ってみる - Qiita

SlackからSeleniumを起動して自動テストを行うようにした挑戦の備忘録 - Qiita

Child Process | Node.js v7.4.0 Documentation