重要
本部分中的代码示例基于 v4.6 及更高版本的 Bot Framework SDK。 如果要查找早期版本的文档,请参阅文档的 Resources 文件夹中 的消息扩展 - v3 SDK 部分。
用户提交搜索命令后,Web 服务会收到一 composeExtension/query
条调用消息,其中包含具有 value
搜索参数的 对象。 调用是使用以下条件触发的:
本文档指导你如何以卡片和预览的形式响应用户请求,以及 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 请求。 此时,代码有 5 秒的时间向请求提供 HTTP 响应。 在此期间,服务可以执行更多查找,或者执行处理请求所需的任何其他业务逻辑。
服务必须响应结果与用户查询匹配。 响应必须指示 的 HTTP 状态代码 200 OK
以及具有以下属性的有效应用程序或 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
是服务器或应用返回的数据,用于在消息传送平台中配置和启用消息扩展。 当用户首次配置消息扩展时, config
将使用响应来提示用户设置消息扩展并提供任何必要的配置。
以下代码片段显示 config
当用户与消息扩展交互时出现的响应:
{
"composeExtension": {
"suggestedActions": {
"actions": [
{
"type": "openUrl",
"title": "Open URL",
"value": "https://<your-subdomain>"
}
]
},
"type": "config"
},
"responseType": "composeExtension"
}
响应 config
包括:
- 属性
value
,该属性包含用于在 Teams 对话框中打开配置页的 URL,允许用户输入必要的详细信息并提交配置。 属性的value
几个示例包括:https://<your-subdomain>.ngrok-free.app/searchSettings.html
-
https://<your-subdomain>.devtunnels.ms/searchSettings.html
.
- 中的
type
composeExtension
字段设置为config
,指示此响应作为配置的性质。 -
responseType
标识此响应的 是应用的composeExtension
。
在配置页上初始化 Teams SDK,并使用 authentication.notifySuccess()
将收集的配置数据发送回 Teams。
submitConfig()
函数演示如何在用户完成设置过程后构造和返回配置值。
若要完成消息扩展配置流,请执行以下作:
属性中
value
提供的 URL 必须承载一个网页,该网页在触发消息扩展配置时以 Teams 对话框的形式打开该 URL。如果需要身份验证,页面必须使用 Teams 身份验证并在成功登录后调用
authentication.notifySuccess()
。收集用户输入后,页面必须通过调用
notifySuccess(configData)
将配置值发送回 Teams 来通知 Teams 安装成功:microsoftTeams.app.initialize(); function submitConfig() { const configData = { setting1: "User-selected value", setting2: "Another value" }; microsoftTeams.authentication.notifySuccess(configData); }
执行后
notifySuccess()
,配置窗口将自动关闭,消息扩展设置成功。
result
响应类型
结果列表显示在Microsoft Teams UI 中,每个项目的预览。 预览是通过以下两种方式之一生成的:
-
preview
在 对象中使用attachment
属性。 附件preview
只能是 Hero 或缩略图卡。 - 从 对象的基本
title
、text
和image
属性中提取attachment
。 仅当未指定属性时,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 }
}
});
}
默认查询
如果在清单中将 设置为 initialRun
true
,Microsoft Teams 会在用户首次打开消息扩展时发出 默认 查询。 服务可以使用一组预填充的结果来响应此查询。 当搜索命令需要身份验证或配置、显示最近查看的项目、收藏夹或不依赖于用户输入的任何其他信息时,这非常有用。
默认查询具有与任何常规用户查询相同的结构, name
字段设置为 initialRun
,并将 value
设置为 true
,如以下 对象所示:
{
"type": "invoke",
"name": "composeExtension/query",
"value": {
"commandId": "searchCmd",
"parameters": [
{
"name": "initialRun",
"value": "true"
}
],
"queryOptions": {
"skip": 0,
"count": 25
}
},
⋮
}
代码示例
示例名称 | Description | .NET | Node.js | 清单 |
---|---|---|---|---|
Teams 消息扩展搜索 | 此示例演示如何生成基于搜索的消息扩展。 它会搜索 NuGet 包,并将结果显示为自适应卡片。 | View | View | View |
Teams 消息扩展身份验证和配置 | 此示例显示了一个消息扩展,该扩展具有配置页、接受搜索请求并在用户登录后返回结果。 它还展示了零应用安装链接展开以及普通链接展开。 | View | View | View |