メモ。
ブラウザから /admin
にアクセスしたら管理画面みたいなものが開いて Bot の簡単なカスタマイズができる、みたいなことがやりたくて
特定の URL で静的なページを返すようなことができるのか調べてみました。
結論から言うと robot.router
が Express サーバーのインスタンスになっているようなので、この変数に対して通常の Express アプリ開発と同じようなノリでできそうです。
公式ドキュメントのこちらに記載があります。
https://hubot.github.com/docs/scripting/#http-listener
Hubot includes support for the express web framework to serve up HTTP requests. It listens on the port specified by the
EXPRESS_PORT
orPORT
environment variables (preferred in that order) and defaults to 8080.
また、Hubot のソースコードで言うとこのあたり。
https://github.com/github/hubot/blob/master/src/robot.coffee#L411
サンプルコード
CoffeeScript ではなく ES2015 で書いています。
参考:HubotをES2015で書いてHerokuにデプロイする - dackdive's blog
module.exports = (robot) => { robot.router.get('/admin', (req, res) => { res.end('Hello, World!'); }); };
結果
表示できました。
注)
$ ./bin/hubot
を直接実行するとデフォルトでポートは 8080 番が使われますが、この時は
$ heroku local web # Procfile は以下 web: bin/hubot -a slack --require build
コマンドを使い、Heroku アプリのローカル実行として実行しています。
heroku local
コマンドでアプリを起動した時、デフォルトのポートは 5000 番なので キャプチャでは :5000
にアクセスしています。
ejs などのテンプレートエンジンも使ってみる
スクリプト内に HTML をゴリゴリ書いていくのはつらいので、JavaScript のテンプレートエンジンも使えるか試してみます。
Express とテンプレートエンジンの使い方についてはこちらの記事を参考にします。
ゼロからはじめるExpress + Node.jsを使ったアプリ開発 - Qiita
$ npm i --save ejs
でインストールします。
スクリプトとテンプレートファイルのディレクトリ構成は以下のようになっています。
. ├── Procfile ├── README.md ├── bin │ ├── hubot │ └── hubot.cmd ├── build ...................... src をトランスパイルしたスクリプト │ └── index.js ├── external-scripts.json ├── package.json ├── src │ └── index.js └── views ...................... テンプレート置き場 └── index.ejs
スクリプト&テンプレート
// src/index.js module.exports = (robot) => { robot.router.set('view engine', 'ejs'); robot.router.get('/admin', (req, res) => { res.render('index', {}); }); };
<!-- views/index.ejs --> <html> <body> <h1>This is Admin Page!</h1> </body> </html>
結果
できました。
今後の予定
まだ軽く試しただけなので、このまま通常の Express アプリ開発と同じように、JS ライブラリや UI フレームワークを使って静的サイトを構築していけるのかはわかりません。
あと、このページで Bot のメッセージ定型文を登録・管理できるように...とかしたくなったら、データの永続化方法とかも調べてみないといけませんね。
Persistence の項を読むと hubot.brain
という KVS を提供しているみたいだけど、Heroku で使おうとするとどうなるのか。