Slack を XMPP プロトコルで Hubot と連携する

個人でもリモコンとして活用している Hubot ですが、いつもの Heroku ではなく、Raspberry PI の中で起動しようとして、アダプター設定で苦労したので、メモします。

要件

  • ポートフォワーディングを設定していない (したくない)。
  • 複数の bot が、同じ Room に常駐し、bot 同士で支持の出し合いを行う必要がある。

不採用

hubot-gtalk

今まで hubot-irkitGoogle 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

引用元: https://gist.github.com/cwsaylor/17522

comments powered by Disqus