コンテンツにスキップ

Hubot

'hubot --create' は古い

このブログで過去に何度かHubotについて書いたときに、新しいbotを作るときのコマンドは hubot --create bot_name だったのですが、このコマンドが非推奨になったようなのでメモ。

hubot --create が使えない

新しいbotを作ろうとして hubot --create コマンドを打つと以下のように怒られた

$ hubot --create test_bot
'hubot --create' is deprecated. Use the yeoman generator instead:
    npm install -g yo generator-hubot
    mkdir -p test_bot
    yo hubot
See https://github.com/github/hubot/blob/master/docs/README.md for more details on getting started.

ところがseeとなっているREADMEファイルは存在しない模様...

yo と generator-hubot とは何か

よくわからないが yogenerator-hubot をインストールしろと言われているのはわかるので調べてみる

yo と generator-xxx

yoはYeomanというGoole社が開発した統合開発ツール群に属するツールの一つで、「雛形作成ツール」であるらしい

そしてその雛形は "generator-xxx" という形でさまざま用意されており、そのHubot版が generator-hubot と言う訳である

つまり上記エラーメッセージは

  • 雛形作成ツールである yo と、Hubotの雛形である generator-hubot をインストールし
  • 新規ディレクトリ上で yo を実行してHubotの雛形を作るべし

ということのようである

yo と generator-hubot のインストール

指定された通り以下のようにインストールする

$ npm install -g yo generator-hubot

(余談:私の場合はNode.jsのインストールされたpathとnpmのrootが違っていたため少々上手くいかなかった。エラーメッセージは素直によく読むべきだ。。。)

yo の実行

インストールが成功したら、新しいbotのディレクトリを作ってそこで yo を実行する

$ mkdir test_bot
$ cd test_bot
$ yo hubot  # これは generator-hubot の雛形を作る、という意味

yo hubot を実行するとHubotのAAが表示され、いくつかのやり取りが立ち上がる

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

? Owner: sojiro
? Bot name: slack-test-bot
? Description: Slack Bot test
? Bot adapter: (campfire) slack
? 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|      
...
...

各項目それぞれデフォルト値が設定されており、なにも入力せずEnterを押していくとその通りになる

今回はSlack用のbotだったので Bot adapter: の欄で slack と入力した

他にも用途に合わせてadapterが用意されているようである

この yo 実行により、Hubotの雛形が作成され、 hubot --create と同様にセットアップが完了する

なおかつadapterを予め設定できる分、セットアップが楽になっている

最後に

今回はHubotに絡んで偶発的に yo を知りましたが、かなり便利そうなのでYeoman含めて今後も使ってみたいところです

参照

HUBOTを使ったSlack Bot作成メモ

SlackにBotを入れたいと思い、少し調べてみたところHUBOTがやはり簡単らしいのでやってみた

HUBOT用のAPI Tokenを取得する

まずはSlackのチームメニューからConfigure Integrationsを選択

{% img /images/slack_hubot/team_menu.png %}

様々な外部サービスとの連携メニューからHUBOTを選択する

{% img /images/slack_hubot/add_hubot.png %}

追加するbotの名前を入力

{% img /images/slack_hubot/set_botname.png %}

ここまでのステップを踏むとAPI Tokenが記されたページが表示される

そしてこの段階でbotがSlackにjoinする

{% img /images/slack_hubot/join_bot.png %}

HUBOTを使ったirc-bot改修メモ #1 -noticeで発言させる-

こちらの記事でつくったirc-botの発言をnoticeにしたい。(botの発言内容に名前やALLなどの文字列が含まれると当人にmentionが飛んでしまうため)

HUBOT_IRC_SEND_NOTICE_MODE

環境変数 HUBOT_IRC_SEND_NOTICE_MODEtrue とすれば良い

実行ファイル(runhubot)に追記

#!/bin/bash

export HUBOT_IRC_NICK="bot_kun"
export HUBOT_IRC_ROOMS="#target_channel"
export HUBOT_IRC_SERVER="irc.hogehoge.local"
export HUBOT_IRC_SEND_NOTICE_MODE=true
#export HUBOT_IRC_PASSWORD="hoge"

bin/hubot -a irc --name myhubot

この実行ファイルからirc-botを起動すると当該irc-botの発言はすべてnoticeとなる。

処理の実体

HUBOT_IRC_SEND_NOTICE_MODEフラグが立っている場合は bot オブジェクトから notice メソッドが呼ばれる。

notice メソッドが呼ばれている bot オブジェクトの実体は new Irc.Client である。

参考: http://node-irc.readthedocs.org/en/latest/API.html

HUBOTを使ったirc-bot作成メモ

①HUBOTを動かすために必要な諸々のインストール

準備として以下をインストールする

  • node.js(サーバー)
  • npm(パッケージ管理コマンド)
  • Redis(KVS)

上記をインストールするためにHomebrewのインストールから始める

$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"

これでHomebrewが入るはず

次にHomebrewを使ってそれぞれインストールする

まずnode.jsとnpm

$ brew install node

このコマンド一発でnode.jsとnpmが入るはず

$ node -v
v0.10.26
$ npm -v
1.4.6

Redisもインストール

$ brew install redis

Redisを起動しておく

$ redis-server &

②HUBOTをインストールする

GitHubからリポジトリをクローンしてインストール

$ cd git/
$ git clone git://github.com/github/hubot.git
$ cd hubot/
$ npm install -g hubot coffee-script

動くか確認

$ hubot
Hubot> 

OK

③HUBOTをircと連携させる

自分用のHUBOTを作る

$ hubot --create myhubot

myhubotの部分は自由に変更可。この名前のディレクトリが作られる

自分用HUBOTにhubot-ircをインストール

$ cd myhubot/
$ npm install hubot-irc --save && npm install

irc連携のためのスクリプトを書く

$ vim runhubot

中身はこんな感じ

$ cat runhubot
#!/bin/bash

export HUBOT_IRC_NICK="bot_kun"
export HUBOT_IRC_ROOMS="#target_channel"
export HUBOT_IRC_SERVER="irc.hogehoge.local"
#export HUBOT_IRC_PASSWORD="hoge"

bin/hubot -a irc --name myhubot

スクリプトの実行権限追加

$ chmod u+x runhubot 

起動スクリプト実行!

$ ./runhubot &

irc上でbotがいるか確認する

bot_kunがいたのでOK

④botにさせたいことを設定する

HUBOTにさせたいことはscriptsディレクトリ以下にCoffeeScriptもしくはJavaScriptで記述する

最初からいくつかのスクリプトが存在するので、それを参考に書けばOK

$ vim scripts/tell_fuga.coffee
$ cat scripts/tell_fuga.coffee
module.exports = (robot) ->

    robot.hear /hoge/, (msg) ->
        msg.send "fuga"

スクリプトを書いたら、再起動すると読み込んでくれる

$ ./runhubot &

⑤cronが使えるようにする

node-cronをインストール

$ npm install cron

cronを使ったスクリプトを書く

$ vim scripts/mention_hoge.coffee

今回は2時間おきに発言するスクリプトを書いてみた

$ cat scripts/mention_hoge.coffee 
cron = require('cron').CronJob
module.exports = (robot) ->
  robot.enter ->
  new cron
    cronTime: "0 0 */2 * * *"
    start: true
    timeZone: "Asia/Tokyo"
    onTick: ->
      robot.send {room: "#target_channel"}, "hoge"

参考資料