次の方法で共有


検索コマンドに応答する

重要

このセクションのコード サンプルは、v4.6 以降のバージョンの Bot Framework SDK に基づいています。 以前のバージョンのドキュメントをお探しの場合は、ドキュメントの Resources フォルダーにある メッセージ拡張機能 - v3 SDK セクションを参照してください。

ユーザーが検索コマンドを送信すると、Web サービスは、検索パラメーターを持つvalue オブジェクトを含むcomposeExtension/query呼び出しメッセージを受け取ります。 呼び出しは、次の条件でトリガーされます。

  • 検索ボックスに文字が入力されます。
  • initialRunアプリ マニフェスト で true に設定され、検索コマンドが呼び出されるとすぐに呼び出しメッセージが表示されます。 詳細については、「既定の クエリ」を参照してください。

このドキュメントでは、カードとプレビューの形式でユーザーの要求に応答する方法と、Microsoft Teamsが既定のクエリを発行する条件について説明します。

要求パラメーターは、要求の value オブジェクトにあります。これには、次のプロパティが含まれます。

プロパティ名 用途
commandId ユーザーによって呼び出されるコマンドの名前。アプリ マニフェストで宣言されているコマンドのいずれかと一致します。
parameters パラメーターの配列。 各パラメーター オブジェクトには、パラメーター名と、ユーザーによって提供されるパラメーター値が含まれます。
queryOptions 改ページ パラメーター:
skip: このクエリのカウントをスキップする
count: 返す要素の数。
protected override async Task<MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken)
{
  // Code to handle the query.
}

ユーザーの要求に応答する

ユーザーがクエリを実行すると、Microsoft Teamsはサービスに同期 HTTP 要求を発行します。 その時点で、コードには要求に対する HTTP 応答を提供する 5 秒があります。 この間、サービスは、より多くの参照、または要求を処理するために必要なその他のビジネス ロジックを実行できます。

サービスは、ユーザー クエリと一致する結果で応答する必要があります。 応答は、 200 OK の HTTP 状態コードと、次のプロパティを持つ有効なアプリケーションまたは JSON オブジェクトを示す必要があります。

プロパティ名 用途
composeExtension 最上位レベルの応答エンベロープ。
composeExtension.type 応答の種類。 次の種類がサポートされています。
result: 検索結果の一覧を表示します
auth: 認証するユーザーをプロンプトします
config: メッセージ拡張機能を設定するユーザーをプロンプトします
message: プレーン テキスト メッセージを表示します
composeExtension.attachmentLayout 添付ファイルのレイアウトを指定します。 型 resultの応答に使用されます。
次の種類がサポートされています。
list: サムネイル、タイトル、テキスト フィールドを含むカード オブジェクトの一覧
grid: サムネイル画像のグリッド
composeExtension.attachments 有効な添付ファイル オブジェクトの配列。 型 resultの応答に使用されます。
次の種類がサポートされています。
application/vnd.microsoft.card.thumbnail
application/vnd.microsoft.card.hero
application/vnd.microsoft.teams.card.o365connector
application/vnd.microsoft.card.adaptive
composeExtension.suggestedActions 推奨されるアクション。 auth型またはconfig型の応答に使用されます。
composeExtension.text 表示するメッセージ。 型 messageの応答に使用されます。

config response

config応答は、メッセージング プラットフォーム内でメッセージ拡張機能を構成して有効にするためにサーバーまたはアプリから返されるデータです。 ユーザーが初めてメッセージ拡張機能を構成すると、 config 応答を使用して、メッセージ拡張機能を設定し、必要な構成を指定するようにユーザーに求められます。

次のコード スニペットは、ユーザーがメッセージ拡張機能と対話するときに表示される config 応答を示しています。

{
    "composeExtension": {
        "suggestedActions": {
            "actions": [
                {
                    "type": "openUrl",
                    "title": "Open URL",
                    "value": "https://<your-subdomain>"
                }
            ]
        },
        "type": "config"
    },
    "responseType": "composeExtension"
}

config応答には、次のものが含まれます。

  • Teams ダイアログで構成ページを開く URL を含む value プロパティを使用すると、ユーザーは必要な詳細を入力して構成を送信できます。 value プロパティの例を次に示します。
    • https://<your-subdomain>.ngrok-free.app/searchSettings.html
    • https://<your-subdomain>.devtunnels.ms/searchSettings.html.
  • composeExtension内のtype フィールドは config に設定され、この応答の性質が構成として示されます。
  • この応答を識別する responseType は、アプリの composeExtension 用です。

スクリーンショットは、メッセージ拡張機能の構成応答を示しています。

構成ページで Teams SDK を初期化し、 authentication.notifySuccess() を使用して、収集した構成データを Teams に送信します。 submitConfig() 関数は、ユーザーがセットアップ プロセスを完了した後に構成値を構造化して返す方法を示します。

メッセージ拡張機能の構成フローを完了するには、次の手順を実行します。

  1. value プロパティで提供される URL は、メッセージ拡張機能の構成がトリガーされたときに Teams ダイアログとして URL を開く Web ページをホストする必要があります。

  2. 認証が必要な場合は、サインインが成功したときに、ページで Teams 認証を使用し、 authentication.notifySuccess() を呼び出す必要があります。

  3. ユーザー入力を収集した後、ページは、構成値を Teams に返送する notifySuccess(configData) を呼び出して、セットアップが成功したことを Teams に通知する必要があります。

      microsoftTeams.app.initialize();
    
      function submitConfig() {
          const configData = {
              setting1: "User-selected value",
              setting2: "Another value"
          };
    
          microsoftTeams.authentication.notifySuccess(configData);
      }
    
  4. notifySuccess()が実行されると、構成ウィンドウが自動的に閉じられ、メッセージ拡張機能が正常に設定されます。

result 応答の種類

結果の一覧は、各項目のプレビューを含むMicrosoft Teams UI に表示されます。 プレビューは、次の 2 つの方法のいずれかで生成されます。

  • attachment オブジェクト内で preview プロパティを使用する。 preview添付ファイルには、ヒーローまたはサムネイル カードのみを指定できます。
  • attachment オブジェクトの基本的なtitletextimage プロパティから抽出します。 基本プロパティは、 preview プロパティが指定されていない場合にのみ使用されます。

注:

メッセージ拡張機能の検索結果では、パディングはサポートされていません。

Teams では、次のカードの種類がサポートされています。

ヒーローまたはサムネイルのカード

ヒーローまたはサムネイル カードの場合、呼び出しアクションを除き、ボタンやタップなどの他のアクションはプレビュー カードではサポートされていません。 ヒーロー カードとサムネイル カードの場合、プレビューは既定で生成されるため、 preview プロパティを指定する必要はありません。 カードについて知り、サムネイルとヒーローのカードの種類を使用する方法については、「カードとは何か」を参照し、カードとカードアクションを追加します

アダプティブ カードまたはコネクタ カード

Microsoft 365 グループのアダプティブ カードまたはコネクタ カードを送信するには、プレビューを含める必要があります。 preview プロパティはヒーローまたはサムネイルのカードである必要があり、それぞれのカードはプレビューとして生成されます。 preview プロパティが attachment オブジェクトで指定されていない場合、プレビューは生成されません。 詳細については、「Microsoft 365 グループにコネクタ カードを使用する」を参照してください。

応答の例

protected override async Task<MessagingExtensionResponse> OnTeamsMessagingExtensionQueryAsync(ITurnContext<IInvokeActivity> turnContext, MessagingExtensionQuery query, CancellationToken cancellationToken) 
{
  var text = query?.Parameters?[0]?.Value as string ?? string.Empty;

  // Searches NuGet for a package.
  var obj = JObject.Parse(await (new HttpClient()).GetStringAsync($"https://azuresearch-usnc.nuget.org/query?q=id:{text}&prerelease=true"));
  var packages = obj["data"].Select(item => (item["id"].ToString(), item["version"].ToString(), item["description"].ToString()));

  // We take every row of the results and wrap them in cards wrapped in in MessagingExtensionAttachment objects.
  // The Preview is optional, if it includes a Tap, that will trigger the OnTeamsMessagingExtensionSelectItemAsync event back on this bot.
  var attachments = packages.Select(package => new MessagingExtensionAttachment
      {
          ContentType = HeroCard.ContentType,
          Content = new HeroCard { Title = package.Item1 },
          Preview = new HeroCard { Title = package.Item1, Tap = new CardAction { Type = "invoke", Value = package } }.ToAttachment()
      })
      .ToList();

  // The list of MessagingExtensionAttachments must we wrapped in a MessagingExtensionResult wrapped in a MessagingExtensionResponse.
  return new MessagingExtensionResponse
  {
      ComposeExtension = new MessagingExtensionResult
      {
          Type = "result",
          AttachmentLayout = "list",
          Attachments = attachments
      }
  };
}

タップ アクションを有効にして処理する

protected override Task<MessagingExtensionResponse> OnTeamsMessagingExtensionSelectItemAsync(ITurnContext<IInvokeActivity> turnContext, JObject query, CancellationToken cancellationToken)
{
    // The Preview card's Tap should have a Value property assigned, this will be returned to the bot in this event.
    var (packageId, version, description, projectUrl, iconUrl) = query.ToObject<(string, string, string, string, string)>();

    var card = new ThumbnailCard
    {
        Title = "Card Select Item",
        Subtitle = description
    };

    var attachment = new MessagingExtensionAttachment
    {
        ContentType = ThumbnailCard.ContentType,
        Content = card,
    };

    return Task.FromResult(new MessagingExtensionResponse
    {
        ComposeExtension = new MessagingExtensionResult
        {
            Type = "result",
            AttachmentLayout = "list",
            Attachments = new List<MessagingExtensionAttachment> { attachment }
        }
    });
}

既定のクエリ

マニフェストで initialRuntrue に設定Microsoft Teams、ユーザーが最初にメッセージ拡張機能を開いたときに 既定 のクエリを発行します。 サービスは、事前設定された結果のセットを使用して、このクエリに応答できます。 これは、検索コマンドで認証または構成が必要な場合、最近表示されたアイテム、お気に入り、またはユーザー入力に依存しないその他の情報を表示する場合に便利です。

既定のクエリは通常のユーザー クエリと同じ構造で、 name フィールドは initialRun に設定され、 value 次のオブジェクトに示すように true に設定されます。

{
  "type": "invoke",
  "name": "composeExtension/query",
  "value": {
    "commandId": "searchCmd",
    "parameters": [
      {
        "name": "initialRun",
        "value": "true"
      }
    ],
    "queryOptions": {
      "skip": 0,
      "count": 25
    }
  },
  ⋮
}

コード サンプル

サンプルの名前 説明 .NET Node.js マニフェスト
Teams メッセージ拡張機能検索 このサンプルでは、ユーザーが NuGet パッケージを検索し、結果をカードとして取得できるようにするメッセージ拡張機能を Teams で作成する方法を示します。 表示 表示 表示
Teams メッセージ拡張機能の認証と構成 このサンプルでは、Teams のメッセージ拡張機能に認証を実装し、セキュリティで保護されたアクセスとユーザー固有の操作を有効にする方法を示します。 表示 表示 表示

次の手順

関連項目