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

アダプティブ カードの 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 ボタン付きのアダプティブ カードを送信します。 各ボタンには、ボットが返すダイアログ コンテンツを決定するために使用するデータが含まれています。

警告

Web バージョンの Teams、Outlook、Microsoft 365 ドメインを含む 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 オブジェクトを作成し、それを返します。 応答のスキーマの詳細については、 task/submitに関するディスカッションを参照してください。 次のコードは、ラッパー オブジェクトに埋め込まれた 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.Apps;
using Microsoft.Teams.Apps.TaskModules;

teams.OnTaskSubmit(async (context, cancellationToken) =>
{
  var data = context.Activity.Value?.Data as JsonElement?;
    if (data == null)
    {
    return TaskModuleResponse.CreateBuilder()
      .WithType(TaskModuleResponseTypes.Message)
      .WithMessage("No data found in the activity value")
      .Build();
    }

    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 context.SendAsync($"Hi {name}, thanks for submitting the form!", cancellationToken);
            return TaskModuleResponse.CreateBuilder()
              .WithType(TaskModuleResponseTypes.Message)
              .WithMessage("Form was submitted")
              .Build();
        default:
            return TaskModuleResponse.CreateBuilder()
              .WithType(TaskModuleResponseTypes.Message)
              .WithMessage("Unknown submission type")
              .Build();
    }
      });

マルチステップ ダイアログ チェーン

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

using System.Text.Json;
using Microsoft.Teams.Apps;
using Microsoft.Teams.Apps.Schema;
using Microsoft.Teams.Apps.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");

    TeamsAttachment nextStepAttachment = TeamsAttachment.CreateBuilder()
      .WithAdaptiveCard(JsonSerializer.SerializeToElement(nextStepCard))
      .Build();

    return TaskModuleResponse.CreateBuilder()
      .WithType(TaskModuleResponseTypes.Continue)
      .WithTitle($"Thanks {nameStep1} - Get Email")
      .WithCard(nextStepAttachment)
      .Build();

case "webpage_dialog_step_2":
    var nameStep2 = GetFormValue("name") ?? "Unknown";
    var emailStep2 = GetFormValue("email") ?? "No email";
    await context.SendAsync($"Hi {nameStep2}, thanks for submitting the form! We got that your email is {emailStep2}", cancellationToken);
    return TaskModuleResponse.CreateBuilder()
      .WithType(TaskModuleResponseTypes.Message)
      .WithMessage("Multi-step form completed successfully")
      .Build();

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

Bot Framework カード アクションのスキーマはアダプティブ カード Action.Submit アクションとは異なり、ダイアログを呼び出す方法も異なります。 Action.Submit の data オブジェクトには、カード内の他のプロパティに干渉しないように、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
ダイアログ サンプル ボット - V4 このサンプル アプリでは、Bot Framework v4 を使用してダイアログ (TeamsJS v1.x ではタスク モジュールと呼ばれます) を使用する方法を示します。 表示 表示 該当なし 表示

関連項目