プロアクティブ メッセージ

重要

このセクションのコード サンプルは、バージョン 4.6 以降のバージョンの Bot Framework SDK に基づいています。 以前のバージョンのドキュメントをお探しの場合は、ドキュメントのレガシ SDK フォルダーの ボット - v3 SDK セクションを参照してください。

プロアクティブ メッセージとは、ユーザーからのリクエストに応答しないボットによって送信されるメッセージのことです。 このメッセージには、次のようなコンテンツを含めることができます。

  • ウェルカム メッセージ
  • 通知
  • 予定されたメッセージ

重要

ユーザー、グループ チャット、またはチームにプロアクティブ メッセージを送信するには、ボットがメッセージを送信するために必要なアクセス権を持っている必要があります。 グループ チャットまたはチームの場合、ボットを含むアプリを最初にその場所にインストールする必要があります。

必要に応じて、チーム内の Microsoft Graph を使用してアプリを事前にインストールすることも、カスタム アプリ ポリシーを使用してチームやorganizationのユーザーにアプリをインストールすることもできます。 特定のシナリオでは、Graph を使用してアプリをプロアクティブにインストールする必要があります。 ユーザーがプロアクティブ メッセージを受信するには、ユーザーのアプリをインストールするか、ユーザーをアプリがインストールされているチームの一部にします。

プロアクティブ メッセージの送信は、通常のメッセージの送信とは異なります。 返信に使うアクティブな turnContext はありません。 また、メッセージを送信する前に会話を作成する必要があります。 たとえば、チャネル内の新しい 1 対 1 チャットや新しい会話スレッドなどです。 プロアクティブ メッセージングでは、新しいグループ チャットやチーム内の新しいチャネルを作成することはできません。

プロアクティブ メッセージを送信するには、次の手順に従います。

  1. 必要に応じて、Microsoft Entraユーザー ID、ユーザー ID、チーム ID、またはチャネル ID を取得します。
  2. 必要に応じて会話を作成します
  3. 会話ID を取得します
  4. メッセージを送信します

サンプル セクションのコード スニペットは、1 対 1 の会話を作成することです。 1 対 1 の会話とグループメッセージまたはチャネル メッセージの両方のサンプルへのリンクについては、 コード サンプルを参照してください。 プロアクティブ メッセージを効果的に使用するには、 プロアクティブ メッセージングのベスト プラクティスに関するページを参照してください。

Microsoft Entraユーザー ID、ユーザー ID、チーム ID、またはチャネル ID を取得します

チャネル内のユーザーまたはスレッドとの新しい会話を作成でき、正しい ID が必要です。 この ID は、次のいずれかの方法で受信または取得できます。

  • アプリが特定のコンテキストにインストールされると、アクティビティをonMembersAdded受け取ります。
  • アプリがインストールされているコンテキストに新しいユーザーが追加されると、onMembersAddedアクティビティを受信します。
  • ボットが受信するすべてのイベントには、ボット コンテキスト (TurnContext オブジェクト) から取得できる必要な情報が含まれています。
  • アプリがインストールされているチームでチャネルのリストを取得することができます。
  • アプリがインストールされているチームでメンバー リストを取得することができます。

情報を取得する方法に関係なく、 を tenantId 格納してから、 userIdを格納するか、新 channelId しい会話を作成します。 teamId を使って、チームの一般チャネルや既定のチャネルに新しい会話スレッドを作成することもできます。 プロアクティブ メッセージをチャネルに送信する前に、ボットがチームにインストールされていることを確認します。

  • aadObjectIdはユーザーに固有であり、Graph API を使用して取得して個人用チャットで新しい会話を作成できます。 プロアクティブ メッセージを送信する前に、ボットが個人用スコープにインストールされていることを確認します。 を使用してaadObjectIdプロアクティブ メッセージを送信するときに、ボットが個人用スコープにインストールされていない場合、ボットはメッセージを含むForbiddenOperationExceptionエラーを403返します。

  • userId は、ボット ID と特定のユーザーに固有です。 ボット間で userId を再利用することはできません。

  • channelId はグローバルです。

ユーザーまたはチャネルの情報を取得した後、会話を作成します。

注:

を使用した aadObjectId プロアクティブ メッセージの送信は、個人用スコープでのみサポートされます。

会話を作成する

会話が存在しない場合や、 がわからない場合は作成 conversationIdできます。 会話を 1 回だけ作成し、値またはconversationReferenceオブジェクトをconversationId格納します。

会話を作成するには、 または userIdtenantId、、および serviceUrlが必要aadObjectIdです。

の場合 serviceUrlは、フローまたはグローバル サービス URL の 1 つをトリガーする受信アクティビティの値を使用します。 serviceUrlプロアクティブ なシナリオをトリガーする受信アクティビティから を使用できない場合は、次のグローバル URL エンドポイントを使用します。

  • 公共: https://smba.trafficmanager.net/teams/
  • Gcc: https://smba.infra.gcc.teams.microsoft.com/teams
  • GCCH: https://smba.infra.gov.teams.microsoft.us/teams
  • 国防 総省: https://smba.infra.dod.teams.microsoft.us/teams

コード サンプルについては、サンプルの呼び出しCreateConversationAsyncを参照してください。

アプリが初めてインストールされたときに会話を取得できます。 会話が作成されたら、 会話 ID を取得しますconversationId は、会話更新イベントで使用できます。

会話 ID は、マルチテナント環境でも、特定のチャネル内のボットごとに一意です。 この ID を使用すると、ボットのメッセージが適切なチャネルに転送され、同じ組織内または異なる組織内の他のボットまたはチャネルで中断されることはありません。

がない場合は conversationIdGraph を使用してアプリを事前にインストール して を conversationId取得できます。

会話 ID を取得する

メッセージを送信するには、conversationReference オブジェクトまたは conversationIdtenantId のいずれかを使用します。 この ID は、会話を作成するか、そのコンテキストから送信されたアクティビティから保存することで取得することができます。 参照用にこの ID を格納します。

適切なアドレス情報を取得したら、メッセージを送信できます。

メッセージを送信する

正しいアドレス情報を取得したので、メッセージを送信することができます。 SDK を使用している場合は、メソッドを使用し、直接 API 呼び出しを行う continueConversationconversationIdtenantId 必要があります。 メッセージを送信するには、 を設定します conversationParametersサンプルセクションを参照するか、コード サンプルセクションに記載されているサンプルの 1 つを使用してください。

注:

Teams では、電子メールまたはユーザー プリンシパル名 (UPN) を使用したプロアクティブ メッセージの送信はサポートされていません。

プロアクティブなメッセージを送信したので、ユーザーとボットの間の情報交換を改善するために、プロアクティブなメッセージを送信する間、これらのベスト プラクティスに従う必要があります。

ボットからプロアクティブなメッセージを送信する方法については、次のビデオを参照してください。



ボットをブロック、ミュート、またはアンインストールしたユーザーを理解する

開発者は、レポートを作成して、ボットをブロック、ミュート、またはアンインストールしたorganization内のユーザーを把握できます。 この情報は、organizationの管理者が組織全体のメッセージをブロードキャストしたり、アプリの使用を促進したりするのに役立つ場合があります。

Teams を使用すると、ボットにプロアクティブ メッセージを送信して、ユーザーがボットをブロックまたはアンインストールしたかどうかを確認できます。 ボットがブロックまたはアンインストールされた場合、Teams は と共に 403 応答コードを subCode: MessageWritesBlocked返します。 この応答は、ボットによって送信されたメッセージがユーザーに配信されていないことを示します。

応答コードはユーザーごとに送信され、ユーザーの ID が含まれます。 各ユーザーの応答コードを ID と共にコンパイルして、ボットをブロックしたすべてのユーザーのレポートを作成できます。

403 応答コードの例を次に示します。


HTTP/1.1 403 Forbidden

Cache-Control: no-store, must-revalidate, no-cache

 Pragma: no-cache

 Content-Length: 196

 Content-Type: application/json; charset=utf-8

 Server: Microsoft-HTTPAPI/2.0

 Strict-Transport-Security: max-age=31536000; includeSubDomains

 MS-CV: NXZpLk030UGsuHjPdwyhLw.5.0

 ContextId: tcid=0,server=msgapi-canary-eus2-0,cv=NXZpLk030UGsuHjPdwyhLw.5.0

 Date: Tue, 29 Mar 2022 17:34:33 GMT

{"errorCode":209,"message":"{\r\n  \"subCode\": \"MessageWritesBlocked\",\r\n  \"details\": \"Thread is blocked from message writes.\",\r\n  \"errorCode\": null,\r\n  \"errorSubCode\": null\r\n}"}

プロアクティブ メッセージングのベスト プラクティス

ユーザーにプロアクティブ メッセージを送信するのは、ユーザーと効果的なコミュニケーションを行うのに役立ちます。 ただし、ユーザーの観点からは、メッセージはプロンプトなしで表示されます。 ウェルカム メッセージがある場合、アプリを操作するのは初めてです。 この機能を使用し、このメッセージの目的を理解するためにユーザーに完全な情報を提供することが重要です。

ウェルカム メッセージ

プロアクティブ メッセージングを使用してウェルカム メッセージをユーザーに送信する場合、ユーザーがメッセージを受信する理由のコンテキストはありません。 また、これはユーザーとアプリの最初の対話です。 第一印象を良くするチャンスです。 優れたユーザー エクスペリエンスにより、アプリの導入が向上します。 ウェルカム メッセージが低いと、ユーザーがアプリをブロックする可能性があります。 明確なウェルカム メッセージを記述し、目的の効果がない場合はウェルカム メッセージを反復処理します。

適切なウェルカム メッセージには、次のものが含まれます。

  • メッセージの理由 - ユーザーがメッセージを受信する理由を明確にする必要があります。 あなたのボットがチャネルにインストールされていて、すべてのユーザーにウェルカム メッセージを送信した場合は、どのチャネルにインストールされ、誰がインストールしたのかを通知する必要があります。

  • オファー - ユーザーは、アプリで何ができるか、どのような価値をもたらすかを識別できる必要があります。

  • 次の手順 - ユーザーは次の手順を理解する必要があります。 たとえば、コマンドを試したり、アプリを操作したりするようにユーザーを招待します。

通知メッセージ

プロアクティブ メッセージングを使用して通知を送信するには、通知に基づいて一般的なアクションを実行するための明確なパスがユーザーにあることを確認してください。 ユーザーが通知を受け取った理由を明確に理解していることを確認してください。 適切な通知メッセージには、通常、次のものが含まれます。

  • 何が起こったのでしょうか? 何が原因で通知が発生したのかを明確に示しています。

  • 結果はどうでしたか? 通知を受け取るためにどのアイテムが更新されているかを明確にする必要があります。

  • 誰が/何がトリガーになったのですか? 通知が送信される原因となった、アクションを実行したユーザーまたはアクション。

  • ユーザーが対応できることは何ですか? ユーザーが通知に基づいてアクションを取ることを容易にします。

  • ユーザーはどのようにオプトアウトできますか? ユーザーがより多くの通知をオプトアウトするためのパスを指定する必要があります。

組織などの大規模なユーザー グループにメッセージを送信するには、 Graph を使用してアプリをプロアクティブにインストールします。

予定されたメッセージ

プロアクティブ メッセージングを使用してスケジュールされたメッセージをユーザーに送信する場合は、タイム ゾーンがユーザーのタイム ゾーンに更新されていることを確認してください。 これにより、メッセージが適切な時間にユーザーに確実に配信されます。 スケジュール メッセージには通常、次のものが含まれます。

  • ユーザがメッセージを受信する理由。 ユーザーがメッセージを受信する理由を簡単に理解できるようにします。

  • ユーザーは次に何ができますか? ユーザーは、メッセージの内容に基づいて必要なアクションを実行できます。

Graph を使用してアプリをプロアクティブにインストール

以前アプリをインストールしたり操作したりしていないユーザーにプロアクティブにメッセージを送信します。 たとえば、社内コミュニケーターを使用して、組織全体にメッセージを送信する必要があるとします。 この場合、Graph API を使用して、ユーザー向けにアプリをプロアクティブにインストールできます。 インストール時にアプリが受け取る conversationUpdate イベントから必要な値をキャッシュします。

インストールできるのは、組織のアプリ カタログまたは Microsoft Teams ストアにあるアプリのみです。

Graph ドキュメントの「ユーザー向けアプリのインストール」および「Graph を使用した Teams でのプロアクティブ ボットのインストールとメッセージング」を参照してください。 GitHub プラットフォームには Microsoft .NET framework サンプルもあります。

REST API を使用して新しい会話を作成する前に、認証と ベアラー トークン があることを確認します。 異なるコンテキストで会話を作成するための REST API を次に示します。

  • 1 対 1 のチャットで会話を作成するための REST API

  • チャネルで会話を作成するための REST API

  • メッセージ交換のメッセージを更新する REST API: 会話内の既存のアクティビティを更新するには、要求エンドポイントに conversationId と activityId を含めます。 このシナリオを完了するには、元の POST 呼び出しによって返されたアクティビティ ID をキャッシュする必要があります。

    PUT {Service URL of your bot}/v3/conversations/{conversationId}/activities/{activityId}
    
    
    {
        "type": "message",
        "text": "This message has been updated"
    }
    

    会話内の既存のアクティビティを更新するには、リクエスト エンドポイントに conversationIdactivityId を含めます。 このシナリオを完了するには、元の activity ID 事後呼び出しによって返された をキャッシュする必要があります。 呼び出しに成功した場合、API は以下の応答オブジェクトを返します。

    {
        "id": "{{activityID}}"
    }
    

サンプル

次のコードは、プロアクティブなメッセージを送信する方法を示しています。

[Route("api/notify")]
[ApiController]
public class NotifyController : ControllerBase
{
    private readonly IBotFrameworkHttpAdapter _adapter;
    private readonly string _appId;
    private readonly ConcurrentDictionary<string, ConversationReference> _conversationReferences;

    public NotifyController(IBotFrameworkHttpAdapter adapter, IConfiguration configuration, ConcurrentDictionary<string, ConversationReference> conversationReferences)
    {
        _adapter = adapter;
        _conversationReferences = conversationReferences;
        _appId = configuration["MicrosoftAppId"] ?? string.Empty;
    }

    public async Task<IActionResult> Get()
    {
        foreach (var conversationReference in _conversationReferences.Values)
        {
            var newReference = new ConversationReference()
            {
                Bot = new ChannelAccount()
                {
                    Id = conversationReference.Bot.Id
                },
                Conversation = new ConversationAccount()
                {
                    Id = conversationReference.Conversation.Id
                },
                ServiceUrl = conversationReference.ServiceUrl,
            };

            // Sends a proactive message from the bot to a conversation.
            await ((BotAdapter)_adapter).ContinueConversationAsync(_appId, newReference, BotCallback, default(CancellationToken));
        }
        
        // Let the caller know proactive messages have been sent.
        return new ContentResult()
        {
            Content = "<html><body><h1>Proactive messages have been sent.</h1></body></html>",
            ContentType = "text/html",
            StatusCode = (int)HttpStatusCode.OK,
        };
    }

    private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        // If you encounter permission-related errors when sending this message, see
        // https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-howto-proactive-message?view=azure-bot-service-4.0&tabs=csharp#avoiding-401-unauthorized-errors
        // Sends an activity to the sender of the incoming activity.
        await turnContext.SendActivityAsync("proactive hello");
    }
}

会話参照の作成を示すコード スニペットの例。

 var newReference = new ConversationReference()
        {
            Bot = new ChannelAccount()
            {
                Id = conversationReference.Bot.Id
            },
            Conversation = new ConversationAccount()
            {
                Id = conversationReference.Conversation.Id
            },
            ServiceUrl = conversationReference.ServiceUrl,
        };

コード サンプル

次の表は、基本的な会話フローを Teams アプリケーションに組み込んだ簡単なコード サンプルと、Teams のチャネルで新しい会話スレッドを作成する方法を示しています。

サンプルの名前 説明 .NET Node.js Python マニフェスト
Teams での会話の基本 このサンプル アプリでは、ボット フレームワーク v4 で使用できるさまざまなボット会話イベントを個人用とチームのスコープで使用する方法を示します。 表示 表示 表示 表示
チャネルで新しいスレッドを開始する このサンプルでは、Bot Framework v4 を使用して特定のチームのチャネルでスレッドを開始する方法を示します。 表示 表示 表示 表示
アプリのプロアクティブ インストールとプロアクティブ通知の送信 このサンプルは、ユーザー向けのアプリのプロアクティブなインストールを使用し、Microsoft Graph API を呼び出してプロアクティブな通知を送信する方法を示しています。 表示 表示 該当なし 表示
プロアクティブ メッセージング これは、Bots を使用してプロアクティブなアラーム メッセージを送信するために、ユーザーの会話参照情報を保存する方法を示すサンプルです。 表示 表示 該当なし

次のステップ

関連項目