こんにちは、おかきょー言います。
最近、Botkit でのライブラリの仕様変更により、 これまでに掲載されているQiita での方法では実装すると、
TypeError: Botkit.slackbot() is not a function
とエラーが返されました。調べてみると、バージョンが4.0に変更してから、記述方法が変わっていることがわかりました。
この記事では、どのように変化したかについてまとめてみたいと思います。
この記事は、こちらの記事を参照しました.
https://botkit.ai/docs/v4/advanced.html#how-to-upgrade-from-07-to-40
変更後の仕様について
この仕様変更については主に以下の点で変更がありました。
- ライブラリが TypeScript で開発されている
- async, await といった非同期処理で実装されていること
- プラットフォームに依存しないライブラリに変更したこと
コードでの変化
ボットをインストールときの変更点
Botkit では、それまでBotkit のライブラリ内にSlack、Facebook 等で利用できるライブラリが定義されていました。しかし、4.0以降では作りたいボットに応じて、botbuilder-adapter-xxx
が必要です。そのため、Slackbot を利用する時は、
npm install --save botbuilder-adapter-slack
を先にインストールしないといけません。
- 0.7 以前の書き方
var Botkit = require('botkit');
var controller = new Botkit.slackbot(options);
- 4.0 以降の書き方
const { Botkit } = require('botkit');
const { SlackAdapter } = require('botbuilder-adapter-slack');
const adapter = new SlackAdapter({
//認証には、BotTokenだけでなく、verificationToken,
//あるいは clientSingleSecretToken のいづれかが必要です。
verificationToken:process.env.SLACK_VERIFY,
botToken: process.env.SLACK_TOKEN
});
let controller = new Botkit({
adapter: adapter
});
構文上での変更点
コードを記述する際、これまでと異なり、async, await を利用した書き方に変化しています。
- 0.7 以前での書き方
controller.hears('foo', 'message_received', function(bot, message) {
bot.reply(message,'bar');
});
- 4.0 以降の書き方
controller.hears('foo', 'message', async(bot, message) => {
await bot.reply(message,'bar');
});
direct_message,mension での使い方
Botkitでは、 0.7以前では、direct_message, mention に対して事前に含まれていましたが、これらを利用する際は、botbuilder-adapter-slack
からそれらが使えるようになるミドルウェアを読み込む必要があります。
-0.7 以前
controller.hears('foo', 'direct_message', function(bot, message) {
bot.reply(message,'bar');
});
-4.0 以降
const { SlackAdapter,SlackMessageTypeMiddleware} = require('botbuilder-adapter-slack');
adapter.use(new SlackMessageTypeMiddleware())
(省略)
controller.hears('foo', 'message', async(bot, message) => {
await bot.reply(message,'bar');
});
以上の方を参考にして、Slack Bot を開発するといいです。