hubot-rocketchat + hubot-rss-reader でニュースフィードを読む

  • 12
    いいね
  • 0
    コメント

tl; dr

Rocket.Chat で Slack の RSS Integration みたいなことをする。

利用イメージ

rocketchat.png

インストール手順

Yaomen のインストール

「hubot を利用する」といっても利用用途としては2つの方向性があると思っていて、
自分で Hubot の実装をしたい場合と、単に誰かが作った Hubot を使いたいだけの場合。

どちらの場合であっても Yaomen でスケルトンとなる Hubot を作成して、その上で、
自分でコードを書くか、既存のモジュールを読み込ませるか…となるので注意。

sudo npm install -g yo hubot generator-hubot

スケルトンの生成

こんな感じ。

$ mkdir hubot
$ cd hubot
$ yo hubot  --owner=foo@example.com --name hubot --description='blah' --adapter='rocketchat'

メールアドレス、ボット名、説明などは、Hubot のソースを公開しない限りは適当でよい。
adapter オプションは無視されるっぽいけど、一応…。

adapter モジュールは Hubot のモジュールの一種で、Hubot とチャットプロトコルを
連携させるための機構である。この機構のおかげで、一度作った Hubot を
Slack、Rocket.Chat、IRC 等のように異なるチャットプロトコルに使いまわせる。

この辺は一般ユーザーで作業しても良いが、Hubot はデーモン化することになるので、
デーモン用のユーザーなどで動かしたい場合はそのアカウントに sudo -i して
作業しておいたほうが後々パーミッションでハマらなくてよろしい。

hubot-scripts.json を削除する

端折ってもいいが、毎回ログに「deprecated だぞ」と出てウザいので削除する。

$ rm hubot-scripts.json

external-scripts.json を編集する

これが Hubot のモジュール一覧である。デフォルトだと下記のようになっている。
adapter モジュールは Hubot 起動時に指定するので記載しなくても良い。

external-scripts.json
[
  "hubot-diagnostics",
  "hubot-help",
  "hubot-heroku-keepalive",
  "hubot-google-images",
  "hubot-google-translate",
  "hubot-pugme",
  "hubot-maps",
  "hubot-redis-brain",
  "hubot-rules",
  "hubot-shipit"
]

hubot-heroku-keepalive は Hubot を Heroku で動かすなら残す。

hubot-google-imageshubot-google-translatehubot-maps は Google の
各種 API のキーがないと動作しないので注意。そんな便利なモジュールではない。

hubot-pugmehubot-ruleshubot-shipit は実用性皆無。

hubot-redis-brain はイケてないらしいので hubot-mongodb-brain に置き換え。
brain モジュールは、Hubot の設定やキャッシュを永続化するための機構で、
これも差し替えが可能。今回の構成だと RSS のキャッシュに利用されている。

…というわけで、自分の環境だと下記の通り。

external-scripts.json
[
  "hubot-diagnostics",
  "hubot-help",
  "hubot-mongodb-brain",
  "hubot-rss-reader"
]

hubot-redis-brain がどうイケていないかは下記参照のこと。

参考:
- またHubotのbrainが爆発したのでhubot-mongodb-brain作った

必要なモジュールをインストールする

npm install -save hubot-{diagnostics,help,mongodb-brain,rss-reader}

hubot-rss-reader を利用する場合、coffeescript のバージョンが古くて
壮絶にハマるので、下記を追加で。

$ npm install coffee-script@">=1.9.0" -save

参考:
- ERROR TypeError: undefined is not a function - Issue #39 - shokai/hubot-rss-reader

各種設定を行う

node.js では環境変数を使って設定するのが主流だが、Hubot でも同様である。
環境変数が設定されていれば手段は問わない。

ただ、動作検証などでインタラクティブに Hubot と会話したいことが多々あるので
hubot の起動スクリプト(bin/hubot)に環境変数をベタ書きしてしておいた方が
デバッグ時に本番と同じ設定を利用できるので便利だと思われる。

bin/hubot
#!/bin/sh

export FOO_BAR='blah blah'

# ...snip...

set -e

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

exec node_modules/.bin/hubot --name "hubot" "$@"

Hubot 用ユーザーを作成する

事前に Rocket.Chat 側でユーザーを作成しておくこと。

ユーザー名、パスワードは環境変数 ROCKETCHAT_USERROCKETCHAT_PASSWORD
Hubot に設定することができる。

動かしてみる

動作確認はインタラクティブに応答してくれる shell adapter を利用すると良い。
オプションを省略して起動すると shell アダプターとなる。

$ ./bin/hubot
hubot> hubot ping
hubot> PONG

hubot ping に対して PONG と応答してくるのは、hubot-diagnostics
含まれている動作で、主に動作確認用である。

shell adapter は Ctrl-d で抜けられる。

hubot を Rocket.Chat に接続する

Rocket.Chat のユーザー名、パスワード、ルームあたりを設定しておいて
Hubot の起動時に adapter を変更すると Rocket.Chat に繋がるはず。

$ ./bin/hubot -a rocketchat

フォアグラウンドで動くが、一旦気にしないことに。

Rocket.Chat 側で、ちゃんと Hubot がログインしているか確認するとよい。

Hubot をデーモン化する

このままだと使い勝手が悪いので、Hubot をデーモン化する。

Node.js 界隈では forever とか色々あるようだが、よく分かっていないので
systemd 先生にお願いする。

/etc/systemd/system/hubot.services
[Unit]
Description=Hubot Server
After=rocketchat.service

[Service]
Type=simple
Restart=always
StandardOutput=syslog
SyslogIdentifier=Hubot
User=rocketchat
Group=rocketchat
WorkingDirectory=/var/lib/hubot
ExecStart=/var/lib/hubot/bin/hubot -a rocketchat

[Install]
WantedBy=multi-user.target

これで大体終わりである。

hubot-rss-reader の使い方

RSS を表示してほしいルームで hubot rss add http://example.com/index.rss とか。

Rocket.Chat を立てた時にデフォルトで用意されている #general は adapter で
特別扱いされているのか、削除すると怒られるので気を付けるように。