ボットでダイアログを使用する

アダプティブ カードの [ TaskFetchAction ] ボタンを使用して、Microsoft Teams ボットからダイアログ (TeamsJS v1.x のタスク モジュールと呼ばれます) を呼び出します。 ダイアログでは、ユーザーのポップアップ ウィンドウを開いて、複雑なフォームやマルチステップ ワークフローに最適な対話が提供されます。

ダイアログを呼び出す方法は 2 つあります。

  • 新しい呼び出しメッセージ task/fetch: task/fetchでアダプティブ カードのAction.Execute カード アクションを使用すると、HTML またはアダプティブ カードベースのダイアログがボットから動的にフェッチされます。
  • ディープ リンク URL: ダイアログにディープ リンク構文を使用すると、アダプティブ カードのAction.OpenUrl カードアクションを使用できます。 ディープ リンク URL では、ダイアログ URL またはアダプティブ カード本文は、 task/fetchに対するサーバーラウンド トリップを回避するために既に認識されています。

重要

url および fallbackUrl は、HTTPS 暗号化プロトコルを実装する必要があります。

注:

Teams クライアント v1 では、ダイアログはタスク モジュールと呼ばれます。 場合によっては、同義語で使用される場合があります。

ダイアログ 起動ツールを作成する

ボットからダイアログを呼び出すには、 TaskFetchAction ボタンを含むアダプティブ カードを送信します。 各ボタンには、ボットが返すダイアログ コンテンツを決定するために使用するデータが含まれています。

警告

Teams、Outlook、Microsoft 365 ドメインの Web バージョンを含む Microsoft のクラウド サービスは、 *.cloud.microsoft ドメインに移行しています。 サポートされている Microsoft 365 Web クライアント ホストでアプリが引き続きレンダリングされるように、できるだけ早く次の手順を実行します。

  1. TeamsJS ライブラリを v.2.19.0 以降に更新します。 新しいドメインで警告が表示されないようにするには、 microsoftTeams.app.initialize() を呼び出す必要があります。 TeamsJS の最新リリースの詳細については、「 Microsoft Teams JavaScript クライアント ライブラリ」を参照してください。

  2. アプリの コンテンツ セキュリティ ポリシー (CSP) ヘッダーを定義している場合は、 frame-ancestors ディレクティブを更新して、 *.cloud.microsoft ドメインを含めます。 移行中に下位互換性を確保するには、CSP ヘッダーに既存の frame-ancestors 値を保持します。 この方法により、既存および将来の Microsoft 365 ホスト アプリケーションの両方でアプリが引き続き動作し、以降の変更の必要性が最小限に抑えられます。

アプリの CSP ヘッダーの frame-ancestors ディレクティブで次のドメインを更新します。

https://*.cloud.microsoft

タスク/フェッチ要求または応答

次の手順では、 task/fetchを使用してダイアログ (TeamsJS v1.x のタスク モジュールと呼ばれます) を呼び出す方法について説明します。

  1. この画像は、購入Action.Execute カードアクションを持つアダプティブ カードを示しています。 type プロパティの値は task/fetch であり、残りの data オブジェクトを選択できます。

  2. ボットは、 card.action アクティビティを受け取ります。 Teams SDK では、 OnAdaptiveCardAction ハンドラーを使用してこれを処理します。 詳細については、「 アクションの実行」を参照してください。

  3. ボットは、 ActionResponse オブジェクトを作成し、それを返します。 応答のスキーマの詳細については、 タスク/送信に関する説明を参照してください。 次のコードは、ラッパー オブジェクトに埋め込まれた TaskInfo オブジェクト を含む応答本文の例を示しています。

    {
      "task": {
        "type": "continue",
        "value": {
          "title": "Task module title",
          "height": 500,
          "width": "medium",
          "url": "https://contoso.com/msteams/taskmodules/newcustomer",
          "fallbackUrl": "https://contoso.com/msteams/taskmodules/newcustomer"
        }
      }
    }
    

    task/fetch イベントとそのボットの応答は、Microsoft Teams JavaScript クライアント ライブラリ (TeamsJS) のmicrosoftTeams.tasks.startTask()関数に似ています。

  4. Microsoft Teamsダイアログが表示されます。

次のセクションでは、ダイアログの結果を送信する方法の詳細を説明します。

ダイアログの結果を送信する

ユーザーがダイアログを終了すると、結果がアプリに送信されます。 申請のしくみは、ダイアログ コンテンツ タイプによって異なります。

  • アダプティブ カード (TaskInfo.カード): ユーザーが [Action.Submit] ボタンを選択すると、Teams によってダイアログ送信イベントがアプリに送信されます。 ダイアログ送信ハンドラーは、カードからフォーム データを受け取ります。 C# で、 [TaskSubmit] 属性を使用します。 TypeScript で、 app.on('dialog.submit', ...)を使用します。 Python では、 @app.on_dialog_submitを使用します。
  • Web ページ (TaskInfo.url): Web ページは TeamsJS クライアント ライブラリから microsoftTeams.tasks.submitTask(formData) を呼び出します。これにより、アプリで同じダイアログ送信イベントがトリガーされます。

ダイアログ送信イベントを処理する

ユーザーがダイアログを送信すると、ボットは task/submit 呼び出しメッセージを受け取ります。 応答する場合は、いくつかのオプションがあります。

応答の種類 シナリオ
応答なし 最も単純な応答は、まったく応答がないことです。 ボットは、ユーザーがダイアログで終了したときに応答する必要はありません。
MessageTask Teams では、ダイアログのポップアップ メッセージ ボックスにメッセージが表示されます。
ContinueTask アダプティブ カードのシーケンスをウィザードまたはマルチステップ エクスペリエンスで連結できます。

次のタブは、.NET、TypeScript、Python でダイアログ送信イベントを処理する方法を示しています。

using System.Text.Json;
using Microsoft.Teams.Api.TaskModules;
using Microsoft.Teams.Apps;
using Microsoft.Teams.Apps.Activities.Invokes;
using Microsoft.Teams.Apps.Annotations;
using Microsoft.Teams.Common.Logging;

[TaskSubmit]
public async Task<Microsoft.Teams.Api.TaskModules.Response> OnTaskSubmit([Context] Tasks.SubmitActivity activity, [Context] IContext.Client client, [Context] ILogger log)
{
    var data = activity.Value?.Data as JsonElement?;
    if (data == null)
    {
        log.Info("[TASK_SUBMIT] No data found in the activity value");
        return new Microsoft.Teams.Api.TaskModules.Response(
            new Microsoft.Teams.Api.TaskModules.MessageTask("No data found in the activity value"));
    }

    var submissionType = data.Value.TryGetProperty("submissiondialogtype", out var submissionTypeObj) && submissionTypeObj.ValueKind == JsonValueKind.String
        ? submissionTypeObj.ToString()
        : null;

    string? GetFormValue(string key)
    {
        if (data.Value.TryGetProperty(key, out var val))
        {
            if (val is JsonElement element)
                return element.GetString();
            return val.ToString();
        }
        return null;
    }

    switch (submissionType)
    {
        case "simple_form":
            var name = GetFormValue("name") ?? "Unknown";
            await client.Send($"Hi {name}, thanks for submitting the form!");
            return new Microsoft.Teams.Api.TaskModules.Response(
                new Microsoft.Teams.Api.TaskModules.MessageTask("Form was submitted"));
        default:
            return new Microsoft.Teams.Api.TaskModules.Response(
                new Microsoft.Teams.Api.TaskModules.MessageTask("Unknown submission type"));
    }
}

複数ステップのダイアログ チェーン

送信ハンドラーから ContinueTask 応答を返すことで、アダプティブ カードを複数ステップ ウィザードに連結できます。 各ステップは新しいカードを返し、最後のステップはダイアログを閉じるMessageTaskを返します。

using System.Text.Json;
using Microsoft.Teams.Api;
using Microsoft.Teams.Api.TaskModules;
using Microsoft.Teams.Cards;

// Add these cases to your OnTaskSubmit method
case "webpage_dialog_step_1":
    var nameStep1 = GetFormValue("name") ?? "Unknown";
    var nextStepCardJson = $$"""
    {
        "type": "AdaptiveCard",
        "version": "1.4",
        "body": [
            {
                "type": "TextBlock",
                "text": "Email",
                "size": "Large",
                "weight": "Bolder"
            },
            {
                "type": "Input.Text",
                "id": "email",
                "label": "Email",
                "placeholder": "Enter your email",
                "isRequired": true
            }
        ],
        "actions": [
            {
                "type": "Action.Submit",
                "title": "Submit",
                "data": {"submissiondialogtype": "webpage_dialog_step_2", "name": "{{nameStep1}}"}
            }
        ]
    }
    """;

    var nextStepCard = JsonSerializer.Deserialize<AdaptiveCard>(nextStepCardJson)
        ?? throw new InvalidOperationException("Failed to deserialize next step card");

    var nextStepTaskInfo = new TaskInfo
    {
        Title = $"Thanks {nameStep1} - Get Email",
        Card = new Attachment
        {
            ContentType = new ContentType("application/vnd.microsoft.card.adaptive"),
            Content = nextStepCard
        }
    };

    return new Response(new ContinueTask(nextStepTaskInfo));

case "webpage_dialog_step_2":
    var nameStep2 = GetFormValue("name") ?? "Unknown";
    var emailStep2 = GetFormValue("email") ?? "No email";
    await client.Send($"Hi {nameStep2}, thanks for submitting the form! We got that your email is {emailStep2}");
    return new Response(new MessageTask("Multi-step form completed successfully"));

Bot Framework カード アクションと Adaptive Card Action.Submit アクション

Bot Framework カード アクションのスキーマは、アダプティブ カードのAction.Submitアクションとは異なり、ダイアログを呼び出す方法も異なります。 Action.Submitdata オブジェクトにはmsteams オブジェクトが含まれているため、カード内の他のプロパティと干渉しません。 次の表は、各カード アクションの例を示しています。

Bot Framework カード アクション Adaptive Card Action.Submit アクション
{
"type": "invoke",
"title": "Buy",
"value": {
"type": "task/fetch",
<...>
}
}
{
"type": "Action.Submit",
"id": "btnBuy",
"title": "Buy",
"data": {
<...>,
"msteams": {
"type": "task/fetch"
}
}
}

コード サンプル

サンプルの名前 説明 .NET Node.js マニフェスト Python
ダイアログ サンプル bots-V4 このサンプル アプリでは、Bot Framework v4 を使用してダイアログ (TeamsJS v1.x のタスク モジュールと呼ばれます) を使用する方法を示します。 表示 表示 該当なし 表示

関連項目