Mattermost を RSS リーダーにしてみた

お疲れ様です!Windows Server にて Mattermost + Hubot RSS Reader で RSS リーダーにしてみました。BOT を使うと色々出来るようになっていいですね!

Mattermost のインストールは Mattermost を Windows でインストールしてみる を参照してください。

準備

必要なものをダウンロードしてインストールします。
安定動作させるために一部最新ではなく前のバージョンにしています。

Hubot は Node.js で作られているので入れます。
Node.js 投稿時:8.11.3 LTS

RSS の情報を保存するのに使います。
MongoDB Download Center | MongoDB Community Server 投稿時:Current Stable Release (4.0.1)

必要なモジュールをビルドするのに使います。
Python Releases for Windows | Python.org 投稿時:2.7.15

必要なモジュールをビルドするのに使います。
以前の Visual Studio ソフトウェアのダウンロード | Visual Studio – Visual Studio Microsoft Build Tools 2015 Update 3
※ Visual C++ 2015 Build Tools のインストールとなります。既に 2015 が入っているときは 「プログラミング言語」-「Visual C++」-「Visual C ++ 2015 用の共通ツール」にチェックを入れてインストールします。

RSS リーダー BOT 作成

ここでは C:\Dev フォルダ配下で作成することにします。
Windows キーを押下して cmd と入力後 Ctrl + Shift + Enter を押下して「管理者:コマンドプロンプト」を起動します。

HUBOT のインストール

次の3つをインストールします。

C:\WINDOWS\system32>npm install -g yo hubot generator-hubot

RSS リーダー BOT のひな形作成

Hubot ひな形作成の generator-hubot を使って今回作成する BOT のひな形を作成します。

C:\WINDOWS\system32>cd /d C:\Dev
C:\Dev>mkdir news
C:\Dev>cd news
C:\Dev\news>yo hubot

BOT 情報の入力を求められたらアダプター以外はデフォルトとして(Enterキー押下)進めます。
※必要に応じてちゃんとした内容にしましょう。

? Owner (User <user@example.com>)
? Bot name (news)
? Description (A simple helpful robot for your Company)
? Bot adapter (campfire) mattermost

ひな形の修正

使わないファイルを削除します。これがあると後でエラーが出るので。

C:\Dev\news>del hubot-scripts.json

external-scripts.json に今回使うモジュールだけ記述します。

[
  "hubot-diagnostics",
  "hubot-help",
  "hubot-mongodb-brain",
  "hubot-rss-reader"
]

必要なモジュールをインストールします。
※hubot-diagnostics と hubot-help はひな形を作成するときにインストールされています。

C:\Dev\hubot>npm install --save hubot-mongodb-brain
C:\Dev\hubot>npm install --save hubot-rss-reader

WARN が出ますが ERR がなければOKです。
ですが、coffee-script で

npm WARN [email protected] requires a peer of [email protected]^1.12.6 but none is installed. You must install peer dependencies yourself.

のようなエラーがでるとずっと出るので新しいのを入れておきます。

C:\Dev\hubot>npm install --save [email protected]">=1.12.6"

RSS の情報を MongoDB に保存するようにしますが、モジュールが新しすぎるとエラーになるので入れ替えます。

C:\Dev\hubot>npm install --save [email protected]

動作確認してみます。
デフォルトだとポートは 8080 になります。
既に使用しているときは bin\hubot.cmd を編集してポートを環境変数で指定します。

@echo off

call npm install
SETLOCAL
SET PATH=node_modules\.bin;node_modules\hubot\node_modules\.bin;%PATH%

rem 要求待ちポート
SET PORT=18080

node_modules\.bin\hubot.cmd --name "news" %* 

作成した BOT を起動します。
BOT が応答するかの確認は BOT 名のあとに ping を付けて実行し PONG と帰ってくればOKです。

C:\Dev\news>bin\hubot
up to date in 2.451s
body-parser deprecated undefined extended: provide extended option node_modules\hubot\src\robot.js:445:21
news> [Fri Aug 10 2018 10:31:51 GMT+0900 (東京 (標準時))] INFO MongoDB connected
[Fri Aug 10 2018 10:31:51 GMT+0900 (東京 (標準時))] INFO hubot-rss-reader: checker start
[Fri Aug 10 2018 10:31:51 GMT+0900 (東京 (標準時))] INFO hubot-rss-reader: wait 3600 seconds
news> news ping
news> PONG

エラーが出ないことを確認し CTRL + D で終了します。
ちなみに ping に対しての反応は「hubot-diagnostics」モジュールがやってます。
help だと「hubot-help」モジュールが反応してくれます。

Mattermost の設定

Mattermost で RSS リーダー BOT とやり取りするための設定をします。

カスタム統合機能の設定

システムコンソールの「統合機能:カスタム統合機能」でウェブフックを有効にします。

bot のユーザー名とプロフィール画像を変更できるように上書きを有効にします。

内向きのウェブフックの追加

メインメニューの「統合機能」で「内向きのウェブフック」の設定をします。
入力はタイトルとチャンネルを選択するだけです。
更新すると URL が表示されるので控えておきます。

外向きのウェブフックの追加

メインメニューの「統合機能」で「外向きのウェブフック」の設定をします。
入力はタイトル、トリガーワード、コールバックURLだけでよいです。
注意点はトリガーワードを BOT 名(Hubot実行時の –name オプション)と同じにすることです。
コールバックURLはローカルホストの Hubot 要求待ちポートに ENDPOINT を付けたものになります。
ENDPOINT は BOT 名と incoming にしておきます。

更新するとトークンが表示されるので控えておきます。

RSS リーダー BOT の実行

環境変数の設定

Mattermost アダプターの環境変数設定

変数内容
MATTERMOST_ENDPOINT外向きのウェブフックで指定した ENDPOINT を指定
MATTERMOST_TOKEN外向きのウェブフックで控えたトークンを指定
MATTERMOST_INCOME_URL内向きのウェブフックで控えた URL を指定
MATTERMOST_HUBOT_USERNAMEユーザー名として表示される名前を指定
MATTERMOST_ICON_URLユーザーアイコンとして表示される画像の URL を指定

その他詳細はこちらを参照 renanvicente/hubot-mattermost: A hubot adapter for Mattermost # Environment variables

hubot-rss-reader の環境変数設定

変数内容
HUBOT_RSS_INTERVALRSS の更新チェック間隔(秒)
HUBOT_RSS_USERAGENTユーザーエージェント
HUBOT_RSS_LIMIT_ON_ADD追加できる RSS の制限
HUBOT_RSS_HEADER記事のタイトルヘッダーにつける文字
HUBOT_RSS_PRINTSUMMARY記事内容の表示有無
HUBOT_RSS_PRINTIMAGE記事内の画像表示有無
HUBOT_RSS_PRINTERRORエラー字のメッセージ表示有無
HUBOT_RSS_IRCCOLORSIRC カラーで表示するかどうか

その他詳細はこちらを参照 shokai/hubot-rss-reader: RSS Reader on Hubot # Configure

bin\hubot.cmd の編集

bin\hubot.cmd を編集して各環境変数を指定します。
必要な部分だけ指定して残りはデフォルトを使用します。

@echo off

call npm install
SETLOCAL
SET PATH=node_modules\.bin;node_modules\hubot\node_modules\.bin;%PATH%

rem 要求待ちポート
SET PORT=18080
rem SET HUBOT_LOG_LEVEL="debug"

rem Mattermost adapter の設定 **********
SET MATTERMOST_ENDPOINT=/news/incoming
SET MATTERMOST_TOKEN=9gojizzip7gsu81fboibm1dk1r
SET MATTERMOST_INCOME_URL=http://localhost:8400/hooks/wcqysdxicibqijtjhorcxhskbc
SET MATTERMOST_HUBOT_USERNAME=News
SET MATTERMOST_ICON_URL=https://cdnjs.cloudflare.com/ajax/libs/webicons/2.0.0/webicons/webicon-rss.png

rem hubot-rss-reader の設定 **********
SET HUBOT_RSS_INTERVAL=3600
SET HUBOT_RSS_USERAGENT=Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
SET HUBOT_RSS_LIMIT_ON_ADD=10
SET HUBOT_RSS_HEADER=:dango:
rem SET HUBOT_RSS_PRINTSUMMARY=true
rem SET HUBOT_RSS_PRINTIMAGE=true
rem SET HUBOT_RSS_PRINTERROR=true
rem SET HUBOT_RSS_IRCCOLORS=false

node_modules\.bin\hubot.cmd --name "news" %* 

BOT の実行

アダプターを指定して実行します。

C:\Dev\hubot>bin\hubot -a mattermost

address forbidden のエラーが発生するとき

Mattermost のバージョンによっては外向けのウェブフックセキュリティが厳しくなっています。
そのため、同じサーバー内で実行時は Hubot へ接続ができません。

Configuration Settings#Allow untrusted internal connections to — Mattermost 5.1 documentation
Outgoing Webhook – [EROR] Event POST failed, err=Post http:192.168.3.207: address forbidden · Issue #7529 · mattermost/mattermost-server · GitHub

Mattermost と Hubot を別々のサーバーで運用するか、mattermost\config\config.jsonAllowedUntrustedInternalConnections に許可するネットワーク情報を指定します。
簡単にしてしまうならセキュリティ上よろしくないが 0.0.0.0/0localhost または 127.0.0.1 とし、外向けウェブフックのコールバックURLをこれと合わせれば接続できます。

これで使えるようになりました。
好きなチャンネルで次の内容をとポストすると追加され、現状が読み込まれます。

news rss add https://note.miyabis.jp/feed

登録内容を見たければ news rss list で確認できます。
削除したければ news rss delete https://note.miyabis.jp/feed となります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*