ボット向けのプロアクティブなメッセージング

重要

この記事は、v3 Bot Framework SDK に基づいています。 SDK バージョン 4.6 以降の最新のドキュメントをお探しの場合は、「 会話型ボット」 セクションを参照してください。

プロアクティブ メッセージは、会話を開始するためにボットから送信されるメッセージです。 次のようなさまざまな理由で、ボットに会話を開始させたい場合があります。

  • 個人用ボットの会話のウェルカム メッセージ。
  • アンケートの回答。
  • 外部イベント通知。

新しい会話スレッドを開始するためにメッセージを送信する場合と、既存の会話に応答してメッセージを送信する場合とは異なります。 ボットが新しい会話を開始するとき、メッセージを投稿する既存の会話はありません。 事前対応型メッセージを送信するには、次の手順を実行する必要があります。

  1. 話す内容を決める
  2. ユーザーの一意の ID とテナント ID を取得する
  3. メッセージを送信する

プロアクティブ メッセージを作成する場合は、メッセージの送信に使用するConnectorClientを作成する前に、MicrosoftAppCredentials.TrustServiceUrl を呼び出してサービス URL を渡す必要があります。 そうでない場合、アプリは 401: Unauthorized 応答を受信します。 詳細については、 サンプルを参照してください。

事前対応型メッセージングのベスト プラクティス

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

通常、プロアクティブ メッセージは、ウェルカム メッセージまたは通知の 2 つのカテゴリのいずれかに分類されます。

ウェルカム メッセージ

プロアクティブ メッセージングを使用してユーザーにウェルカム メッセージを送信する場合は、ユーザーの視点からすると、メッセージがプロンプトなしで表示されることを確認します。 ウェルカム メッセージがある場合は、ユーザーがアプリを操作したのが初めてです。 最適なウェルカム メッセージは次のとおりです。

  • このメッセージが表示される理由: このメッセージを受け取る理由は、ユーザーにとって明確である必要があります。 ボットがチャネルにインストールされ、すべてのユーザーにウェルカム メッセージを送信した場合は、ボットがインストールされたチャネルと、潜在的にインストールされたユーザーを知らせます。
  • 提供する内容: 彼らはあなたのアプリで何ができますか? あなたは彼らにどのような価値をもたらすことができますか?
  • 次に何をすべきか: コマンドを試してみるか、何らかの方法でアプリを操作するように招待します。

通知メッセージ

事前対応型メッセージングを使用して通知を送信する場合は、通知に基づいて一般的なアクションを実行するための明確なパスをユーザーが把握し、通知が発生した理由を明確に理解する必要があります。 適切な通知メッセージには通常、次のものが含まれます。

  • 何が起きたのか: 通知の原因が明確に示されます。
  • 何が起こったか: 通知の原因となるように更新されたアイテム/モノを明確にする必要があります。
  • 実行者: 通知を送信する原因となったアクションを実行したユーザー
  • 対処方法: ユーザーが通知に基づいてアクションを簡単に実行できるようにします。
  • オプトアウトする方法: 追加通知をオプトアウトするためのパスをユーザーに提供します。

必要なユーザー情報を取得する

ボットは、ユーザーの 一意の IDテナント ID を取得することで、個々の Microsoft Teams ユーザーとの新しい会話を作成できます。これらの値は、次のいずれかの方法を使用して取得できます。

  • チャネルから チーム名簿を取得する ことで、アプリがインストールされます。
  • ユーザーが チャネルでボットと対話するときにキャッシュします。
  • ユーザーが チャネル会話に@mentioned されると、ボットも参加しています。
  • アプリが個人用スコープにインストールされたとき、またはチャネルまたはグループ チャットに新しいメンバーが追加されたときに、conversationUpdate イベントを受信したときにキャッシュすることで、

Graph を使用してアプリを事前にインストールする

Graph を使用したアプリのプロアクティブなインストールはベータ版です。

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

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

詳細については、Graph ドキュメントの「 ユーザー用アプリをインストールする 」を参照してください。 .NET にもサンプルがあります。

REST API を使用して新しい会話を作成する前に、認証を行い、 ベアラー トークン を持っていることを確認してください。

POST {Service URL of your bot}/v3/conversations

{
  "bot": {
    "id": "c38eda0f-e780-49ae-86f0-afb644203cf8",
    "name": "The Bot"
  },
  "members": [
    {
      "id": "29:012d20j1cjo20211"
    }
  ],
  "channelData": {
    "tenant": {
      "id": "197231joe-1209j01821-012kdjoj"
    }
  }
}

ボット アプリ ID として id を、ボット名として name を指定します。 ボットTurnContextオブジェクト (turnContext.Activity.From.Id など) からmembersidを取得できます。 同様に、turnContext.Activity.ChannelData.Tenant.Id などのボットTurnContextオブジェクトからテナントのid

ユーザー ID とテナント ID を指定する必要があります。 呼び出しが成功すると、API は次の応答オブジェクトを返します。

{
    "id":"a:1qhNLqpUtmuI6U35gzjsJn7uRnCkW8NiZALHfN8AMxdbprS1uta2aT-jytfIlsZR3UZeg3TsIONNInBHsdjzj3PtfHuhkxxvS1jZZ61UAbw8fIdXcNSJyTJm7YvHFOgxo"

}

この ID は、個人用チャットの一意の会話 ID です。 この値は保存し、今後のユーザーとの対話に再利用します。

.NET の使用

この例では、 Microsoft.Bot.Connector.Teams NuGet パッケージを使用します。

// Create or get existing chat conversation with user
var response = client.Conversations.CreateOrGetDirectConversation(activity.Recipient, activity.From, activity.GetTenantId());

// Construct the message to post to conversation
Activity newActivity = new Activity()
{
    Text = "Hello",
    Type = ActivityTypes.Message,
    Conversation = new ConversationAccount
    {
        Id = response.Id
    },
};

// Post the message to chat conversation with user
await client.Conversations.SendToConversationAsync(newActivity, response.Id);

Node.js の使用

var address =
{
    channelId: 'msteams',
    user: { id: userId },
    channelData: {
        tenant: {
            id: tenantId
        }
    },
    bot:
    {
        id: appId,
        name: appName
    },
    serviceUrl: session.message.address.serviceUrl,
    useAuth: true
}

var msg = new builder.Message().address(address);
msg.text('Hello, this is a notification');
bot.send(msg);

チャネル会話の作成

チームが追加したボットがチャネルに投稿すると、新しい返信チェーンを作成できます。 Node.js Teams SDK を使用している場合は、 startReplyChain() を使用します。これにより、正しいアクティビティ ID と会話 ID で完全に設定されたアドレスが提供されます。 C# を使っている場合、以下の例を参照してください。

または、REST API を使用して、リソース /conversations POST 要求を発行することもできます。

チャネル会話の作成例

このサンプルからの .NET の例

using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Connector.Teams.Models;
using Microsoft.Teams.TemplateBotCSharp.Properties;
using System;
using System.Threading.Tasks;

namespace Microsoft.Teams.TemplateBotCSharp.Dialogs
{
    [Serializable]
    public class ProactiveMsgTo1to1Dialog : IDialog<object>
    {
        public async Task StartAsync(IDialogContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var channelData = context.Activity.GetChannelData<TeamsChannelData>();
            var message = Activity.CreateMessageActivity();
            message.Text = "Hello World";

            var conversationParameters = new ConversationParameters
            {
                  IsGroup = true,
                  ChannelData = new TeamsChannelData
                  {
                      Channel = new ChannelInfo(channelData.Channel.Id),
                  },
                  Activity = (Activity) message
            };

            MicrosoftAppCredentials.TrustServiceUrl(serviceUrl, DateTime.MaxValue);
            var connectorClient = new ConnectorClient(new Uri(activity.ServiceUrl));
            var response = await connectorClient.Conversations.CreateConversationAsync(conversationParameters);

            context.Done<object>(null);
        }
    }
}

関連項目

Bot Framework サンプル。