はしがき
会社のチャットツールがWebex Teams(Webex)からMicrosoft Teams(MSTeams)に移行されました。
それに伴い、社内で利用していたBotも移行することになりました。
今回は、移行の際につまづいた点である、それぞれのBotの概念についてと、具体的なやり方について比較します。
Botという概念の比較
WebexにおけるBot
大まかにいうと、ユーザと扱いがほとんど変わりません。
スペースに対しての導入は、Bot作成時に登録するメールアドレス形式の識別子を使用してのインバイトですし、利用を止める時も、ユーザをremoveする時と同じ手順です。
これはAPI経由で同じ動作を行う際も同じで、ユーザと同じようにスペースへの追加・削除が行えます。
MSTeamsにおけるBot
Webexに比べ、こちらはとても複雑です。
MSTeamsにおけるBotは、あるアプリケーションのBot機能、というイメージです。
アプリケーションの実体はAzure上にあり、Botの機能的な実体はBotFramework上に存在します。
BotFrameworkがAzure上のアプリの認証情報を使い、いろいろ動作する、というような挙動をします。
これはWebexのBotとは異なるもので、移行の際にイメージを掴むのがとても難しい部分でした。
具体的なやり方の比較
移行対象としたBot群には以下の機能がありましたので、それぞれのやり方について記載します。
- メッセージの受信(ユーザ → Botのメンションを受ける)
- メッセージの投稿(Botからの一方的なもの)
- メッセージの投稿(ユーザからのメンションを受けてから行う)
- メンションの投稿(Bot → ユーザへのメンション)
メッセージの受信(ユーザ → Botのメンションを受ける)
Webex
メンションを受けた際のWebhook指定をすることで、メンションを受けて動作をするBotが作成可能です。
MSTeams
AppStudioなどで、BotFrameworkを利用したBot機能を持つアプリを作成することで、作成時にメンションを受けた際のWebhook指定ができます。
メッセージの投稿(Botからの一方的なもの)
Webex
Bot作成時のトークンを利用し、メッセージ送信APIを打つことで投稿可能です。
MSTeams
BotFrameworkを利用したBotのみでは、一方的なメッセージ送信を行うことはできません。
そのBotに持たせる機能がメッセージ送信のみであれば、IncomingWebhookアプリを導入することで実現可能です。
他にも機能を持たせるのであれば、GraphAPIを利用するか、BotFrameworkを併用する必要があります。
メッセージの投稿(ユーザからのメンションを受けてから行う)
Webex
メンションを受けた後、送信元のスペースIDに対してメッセージ送信APIを打つことで投稿可能です。
MSTeams
BotFrameworkを利用したBotでメンションを受け、送信元のテナント情報・会話オブジェクトを利用して送信 or 返信 APIを打つことで、投稿可能です。
メンションの投稿(Bot → ユーザへのメンション)
Webex
対象ユーザの識別子(メールアドレス)を指定することでメンション可能です。
MSTeams
対象ユーザの識別子(ID)を指定することでメンション可能です。
このIDは、BotFrameworkでのみ(?)取得できるIDで、BotFramework以外を利用したメンションは基本的にできないものと思われます。
*ユーザ識別子を静的に持っておく、などすれば可能です
おわりに
以上です。
移行部分はある程度感覚でどうにかなるものの、概念部分は読み解くのに時間がかかりました。
(というか、MSのドキュメントわかりにくすぎる・・・)
いろいろな資料や、実際の動作ベースでなんとなく理解したものなので、実際の仕様とは異なる部分があるかもしれませんが、参考になれば幸いです。