Slack を XMPP プロトコルで Hubot と連携する
個人でもリモコンとして活用している Hubot ですが、いつもの Heroku ではなく、Raspberry PI の中で起動しようとして、アダプター設定で苦労したので、メモします。
要件
- ポートフォワーディングを設定していない (したくない)。
- 複数の bot が、同じ Room に常駐し、bot 同士で支持の出し合いを行う必要がある。
不採用
hubot-gtalk
今まで hubot-irkit は Google Talk を Mac OS X の Messages.app に登録して使っていました。
ただ、Google Talk のチャットに複数の bot を常駐させるには、その分アカウント作成が必要になり、スケーラビリティが低いため、不採用にしました。
hubot-slack
仕事でも愛用している Slack がオフィシャルで提供している hubot-slack アダプタの場合、Webhook を使いメッセージの送受信をしているため、ポートフォワーディングが必要なので、不採用でした。
採用
Slack + hubot-xmpp
Slack は、XMPP で会話をするゲートウェイを用意しており、それと hubot-xmpp アダプタを連携して、Hubot を動かすことにしました。
設定方法
前提として、Owner 権限が必要です。
Admin Settings の Gateways セクションを展開し、上記の様に、XMPP を有効にします。
次に、個人の Gateway 情報画面 を開き、Host
, User
, Pass
情報を取得し、Raspberry PI 側で、以下の様に環境変数を書き出します。
export HUBOT_XMPP_HOST=conference.myteam.xmpp.slack.com
export HUBOT_XMPP_ROOMS=general@$HUBOT_XMPP_HOST
export HUBOT_XMPP_USERNAME=hubot@$HUBOT_XMPP_HOST
export HUBOT_XMPP_PASSWORD=<super secret>
HUBOT_XMPP_HOST
: Gateway 情報画面 にある、Host
の先頭に、conference.
を付与したもの。
HUBOT_XMPP_ROOMS
: #{ルーム名}@$HUBOT_XMPP_HOST
の形式で、カンマ区切りの文字列。
HUBOT_XMPP_USERNAME
: ユーザー名。#{User}@$HUBOT_XMPP_HOST
の形式。
HUBOT_XMPP_PASSWORD
: Gateway 情報画面 にある、Pass
。
Hubot の起動
あとは、通常と同じく、hubot-xmpp を採用した bot を起動するだけです。
もし、新規から始める場合は Hubot プロジェクトを作成し、
npm install -g hubot
npm install -g hubot-xmpp
npm install -g coffee-script
nodenv rehash
hubot -a xmpp -c pi-hubot
cd pi-hubot
起動します。
hubot -a xmpp
しばらくすると ping に応答する様になります。
god の設定
死活管理と自動起動に god を使います。
gem install god
sudo vim /etc/init.d/god # 下記参照
sudo chmod +x /etc/init.d/god
sudo update-rc.d -f god defaults
/etc/god/hubot.god
# vim: set ft=ruby
God.watch do |w|
w.name = "hubot"
w.start = "/home/pi/.nodenv/shims/hubot -a xmpp"
w.dir = "/home/pi/hubot"
w.log = "/home/pi/hubot/hubot.log"
w.env = ENV.select{|k,v| k.start_with? 'HUBOT' }
w.uid = 'pi'
w.gid = 'gpio'
w.keepalive
end
/etc/init.d/god
#!/bin/bash
#
# god Startup script for God monitoring tool.
#
# chkconfig: - 85 15
# description: god monitors your system
#
USER=pi
HOME=/home/pi
CONF_DIR=/etc/god/*
PID=/var/run/god.pid
LOG=/var/log/god.log
PATH=/home/pi/.rbenv/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RETVAL=0
source /home/pi/dotfiles/env.d/secret/env.sh
case "$1" in
start)
god -P $PID --no-syslog # -l $LOG --log-level warn
god load $CONF_DIR
RETVAL=$?
;;
stop)
kill `cat $PID`
RETVAL=$?
;;
restart)
kill `cat $PID`
god -P $PID --no-syslog # -l $LOG --log-level warn
god load $CONF_DIR
RETVAL=$?
;;
status)
RETVAL=$?
;;
*)
echo "Usage: god {start|stop|restart|status}"
exit 1
;;
esac
exit $RETVAL