まくろぐ

チャットボット: ユーザーの参加/離脱のイベントをハンドルする

更新:
作成:

Bot Builder SDK の ActivityHandler を使って、ユーザーが会話に参加したこと、離脱したことをハンドルする方法を説明します。 ActivityHandler を使ったボット実装の基本に関しては下記を参照してください。

下記は、ユーザーが新しく会話に参加したときに、ボットから挨拶するように実装した例です。 ユーザー参加のイベントをハンドルするには、ActivityHandler#onMembersAdded() で、イベントハンドラを登録します。

mybot.js
const { ActivityHandler, BotFrameworkAdapter } = require('botbuilder');

// ボット実装
class MyBot extends ActivityHandler {
  constructor() {
    super();
    this.onMessage(this.handleMessage);
    this.onMembersAdded(this.handleMembersAdded);
  }

  async handleMessage(context, next) {
    const name = context.activity.from.name;
    const utterance = context.activity.text;
    await context.sendActivity(`${name}さんは、${utterance}と言いました。`);
    await next();
  }

  async handleMembersAdded(context, next) {
    const members = context.activity.membersAdded;
    for (let i = 0; i < members.length; ++i) {
      const m = members[i];
      if (m.id !== context.activity.recipient.id) {
        // ボット以外のユーザが参加したときにメッセージを表示
        await context.sendActivity(`${m.name}さん、こんにちは!`);
      }
    }
    await next();
  }
}

exports.MyBot = MyBot;

ちなみに、このイベントハンドラは、ボット自身が会話に参加したときにも呼び出されます。 ボット以外のユーザーが参加したときだけメッセージを送るには、context.activity.recipient.id と参加者の ID を比較し、通常のユーザーであることを確認します(recipient.id にはボットの ID が入っています)。

上記の例では、ユーザーが参加したときのイベントをハンドルしていますが、ユーザー離脱時のイベントも ActivityHandler#onMembersRemoved() を使って同様にハンドルすることができます。

Bot Framework Emulator を使っている場合は、画面上部の Restart conversation ボタンを押せば、ボットからのメッセージを確認することができます。

/p/onctywi/handle-members-added-001.png

Slack をチャンネル(クライアント)として使用している場合は、あるチャンネルにボットを招待したときや、そのチャンネルに新しくユーザーを招待したときに onMembersAdded() が呼び出されるようです。 なので、このイベントハンドラはそんなに頻繁に呼び出されるものではありません。

関連記事

まくろぐ
サイトマップまくへのメッセージ