Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8882

Hubotを使ったslack botの作り方【2020年版】

$
0
0

Hubotとは

HubotとはGithub社が開発したNode.js上で動くBotアプリケーションを作成するためのフレームワークです。

Hubotは、Hubot本体アダプター拡張スクリプトから構成されます。
Hubot本体とチャットアプリの間を仲介するアダプターが存在するため、slack、chatworkなどの様々なチャットツールとHubotを連携することが可能です。
Bot作成フレームワークはHubot以外にも存在しますが、Hubotは様々なチャットツールと連携できる点が他のものと比べて大きな特徴です。

TH800_001.png
GitHub社謹製! bot開発・実行フレームワーク「Hubot」より引用

Hubotを使うことにより、複雑な振る舞いをするBotを作成することが可能です。
slackの既存機能だけでもslack上で"hello"と発言すれば、Botが"hi"と返すような単純な振る舞いであれば可能ですが、それ以上複雑になると対応できません。

Hubotを使えば、
・決められた時刻に発言
・あるサイトから内容をスクレイピングで取得してチャットツール上に表示
・ある発言をするとapiを経由してGoogleカレンダーに予定を登録
が可能になります。

やること

  1. Hubotアプリケーションの作成
  2. Hubot Integrationの設定してHubotとslackを連携
  3. Heroku上でHubotアプリケーションを動かす

1.Hubotアプリケーションの作成

Hubotアプリケーションを新規作成

node.jsとnpmが入っている確認

node -v
npm -v

yoemanとhubotジェネレータをインストールします。
yoとはyoeman(ヨーマン)と呼ばれるクライアント側のwebアプリケーション作成ツールです。
yoemanを使ってhubotアプリケーションを作成します。

npm install -g yo generator-hubot
mkdir myhubot
cd myhubot
yo hubot

yo hubotを実行すると以下のものがターミナル上に表示されます。
スクリーンショット 2019-12-24 12.54.21.png

4つ質問がされるので以下の通り答えていきます。

Owner→Enter
Bot name→Enter
Description→Enter
Bot adapter→今回はslackと連携したbotを作るので「slack」と入力

これでHubotアプリケーションの雛形が作成できました。

注意
別の記事ではhubot --create myhubotを使ったhubotアプリケーションの作成を紹介しているが、実際にコマンドを実行すると以下のエラーが発生する。
'hubot --create'は非推奨になったみたい。
指示通りにyoemanを使ってhubotを作成する。

'hubot --create' is deprecated. Use the yeoman generator instead:
npm install -g yo generator-hubot
mkdir -p myhubot
cd myhubot
yo hubot
See https://github.com/github/hubot/blob/master/docs/index.md for more details on getting started.

Hubotをローカルで起動

Hubotをローカルで起動して、動作確認をしていきます。

pwd #mybotディレクトリにいることを確認
bin/hubot

bin/hubotはmyhubotディレクトリ内にあるシェルスクリプトhubotを実行しています。
bin/hubotでは、npm installpackage.jsonに記述されたパッケージをインストールし、その後Hubot本体を起動しています。

hubot起動時に使用するアダプターを明示していないと、対話モードでHubotが起動します。
スクリーンショット 2019-12-24 13.06.04.png

まだ独自のスクリプトを作成していませんが、Hubotではデフォルトでスクリプトが登録されています。
mybubot echo "ping"と打って、"ping"と返ってくることを確認しましょう。

mybubot> mybubot echo "ping"
mybubot> "ping"

Hubotの独自スクリプト作成

helloと打つとhiを返してくる独自のBotスクリプトを作成してみましょう。

scripts/hello.coffee
module.exports=(robot)->robot.hear(/hello/i,(res)->res.reply("hi"))

Robotクラスのhearメソッドは、hear(マッチさせたい正規表現, コールバック関数)
Responseクラスのreplyメソッドは、reply(発言内容)

robot.hear(/hello/i, (res)で"hello"という文字列が渡ってくると、第2引数のコールバック関数を実行します。res.reply("hi")で"hi"という文字列をチャットツール側で発言するようにしています。

2.Hubot Integrationの設定してHubotとslackを連携

次はローカルで動くHubotとslackを連携して、slack上にbotを導入してみましょう。

Hubot Integrationの設定

slackのアプリ連携からHubotを追加します。
スクリーンショット 2019-12-24 13.21.28.png

slackのアプリディレクトリからHubotを選択して、HubotのBotユーザを作成します。
ここで入力されたユーザ名が、slack上で発言するBotのユーザ名になります。
スクリーンショット 2019-12-23 12.28.41.png

HubotアダプターのAPIトークンが表示されるので、メモしておきます。

Hubot___Slack_App_ディレクトリ.jpg

アダプターを指定してHubotを起動

slackと連携したHubotをローカル上に起動するために、以下コマンドでHubotを起動します。

HUBOT_SLACK_TOKEN=上記でメモしたHubotアダプターのAPIトークン ./bin/hubot --adapter slack

slack上でhelloと発言するとBotがhiと返してくれるようになりました。

スクリーンショット 2019-12-24 13.31.00.png

ちなみに、slackチャンネル上でBotを動かすには、チャンネルにBotを/invite @ユーザ名で招待しておく必要があります。

3.Heroku上でHubotアプリケーションを動かす

今まではローカル上でHubotを起動していました。
しかしこれだと、常にローカルPCを起動させておく必要がありますし、もしローカルのPCを閉じるとBotが動かなくなります。
そこでHeroku上でHubotを動かしておくことにします。

Herokuに登録

Herokuの登録自体は多くの記事がありますので、ここでは説明を省略します。
以下などの記事を参考に3まで完了させてください。
【Rails】Herokuの登録&初期設定からデプロイ方法までまとめ

1.Herokuのアカウント登録
2.Toolbeltインストール
3.heroku login

Herokuに環境変数設定&Push

Herokuに環境変数HUBOT_SLACK_TOKENを設定します。

heroku config:set HUBOT_SLACK_TOKEN=hoge

Hubotアプリケーションのcommit

git init
git add .
git commit -m "first commit"
git push heroku master  #herokuにmasterブランチをpushする

するとBuild failedエラーが発生。

% git push heroku master                                                          
Total 0 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Node.js app detected
remote:
remote: -----> Creating runtime environment
remote:
remote:        NPM_CONFIG_LOGLEVEL=error
remote:        NODE_ENV=production
remote:        NODE_MODULES_CACHE=true
remote:        NODE_VERBOSE=false
remote:
remote: -----> Installing binaries
remote:        engines.node (package.json):  0.10.x
remote:        engines.npm (package.json):   unspecified (use default)
remote:
remote:        Resolving node version 0.10.x...
remote:        Downloading and installing node 0.10.48...
remote:        Detected package-lock.json: defaulting npm to version 5.x.x
remote:        Bootstrapping npm 5.x.x (replacing 2.15.1)...
remote:        npm 5.x.x installed
remote:
remote: /tmp/build_9e550049100749e72c047c136d3131ae/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote:       var notifier = require('update-notifier')({pkg})
remote:                                                     ^
remote: SyntaxError: Unexpected token }
remote:     at Module._compile (module.js:439:25)
remote:     at Object.Module._extensions..js (module.js:474:10)
remote:     at Module.load (module.js:356:32)
remote:     at Function.Module._load (module.js:312:12)
remote:     at Function.Module.runMain (module.js:497:10)
remote:     at startup (node.js:119:16)
remote:     at node.js:945:3
remote:
remote: /tmp/build_9e550049100749e72c047c136d3131ae/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote:       var notifier = require('update-notifier')({pkg})
remote:                                                     ^
remote: SyntaxError: Unexpected token }
remote:     at Module._compile (module.js:439:25)
remote:     at Object.Module._extensions..js (module.js:474:10)
remote:     at Module.load (module.js:356:32)
remote:     at Function.Module._load (module.js:312:12)
remote:     at Function.Module.runMain (module.js:497:10)
remote:     at startup (node.js:119:16)
remote:     at node.js:945:3
remote:
remote: /tmp/build_9e550049100749e72c047c136d3131ae/.heroku/node/lib/node_modules/npm/bin/npm-cli.js:79
remote:       var notifier = require('update-notifier')({pkg})
remote:                                                     ^
remote: SyntaxError: Unexpected token }
remote:     at Module._compile (module.js:439:25)
remote:     at Object.Module._extensions..js (module.js:474:10)
remote:     at Module.load (module.js:356:32)
remote:     at Function.Module._load (module.js:312:12)
remote:     at Function.Module.runMain (module.js:497:10)
remote:     at startup (node.js:119:16)
remote:     at node.js:945:3
remote:
remote: -----> Build failed
remote:
remote:        We're sorry this build is failing! You can troubleshoot common issues here:
remote:        https://devcenter.heroku.com/articles/troubleshooting-node-deploys
remote:
remote:        If you're stuck, please submit a ticket so we can help:
remote:        https://help.heroku.com/
remote:
remote:        Love,
remote:        Heroku
remote:
remote:  !     Push rejected, failed to compile Node.js app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !   Push rejected to rocky-gorge-05187.
remote:
To https://git.heroku.com/rocky-gorge-05187.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/rocky-gorge-05187.git'

You can troubleshoot common issues here: https://devcenter.heroku.com/articles/troubleshooting-node-deploysこのURL見れば同じ問題を解決できるよーと言われているので、見てみる。

まずはbuildpackを設定して再実行。build failedは解消できず。

heroku buildpacks:set heroku/nodejs

次に章のCompare Node and npm Versionsでは開発環境と本番環境でNodeとnpmのversionを揃えなさいと言われているので、まずはローカルでnodeとnpmのバージョンを見る。

node --version
npm --version

表示されたバージョンをpackage.jsonに設定。
nodeとnpmのバージョンを指定。

package.json
"engines":{"node":"10.16.0","npm":"6.9.0"}

再度、git push heroku masterでbuild成功。

参考文献

GitHub社謹製! bot開発・実行フレームワーク「Hubot」
https://gihyo.jp/dev/serial/01/hubot/0001

Hubotを使ってSlackへBotを投げる
https://qiita.com/shosho/items/057d7b67d1dd3a700554


Viewing all articles
Browse latest Browse all 8882

Trending Articles