构建用于 Microsoft Teams 的 Java 消息扩展和连接器,第 2 部分:构建链接展开消息扩展





1.00/5 (1投票)
如何使用 Java 和 Spring MVC 在 Microsoft Teams 应用中实现链接展开
在本系列三篇文章的第一篇文章中,我们讨论了如何构建用于搜索的消息扩展。在本文中,我们将学习如何创建一个链接展开消息扩展。
探索链接展开
链接展开允许您在用户将特定域的链接粘贴到 Microsoft Teams 消息撰写区域时调用应用程序中的方法。此操作在许多情况下都很有用。例如,您可以解析 URL 并为用户提供其他按钮,以便用户无需访问网站并阅读其内容即可执行任务。此功能可以加快用户在 Microsoft Teams 中执行的许多任务,同时最大限度地减少干扰。
以下是 azure.microsoft.com 自动链接展开的示例
用户粘贴链接后,Microsoft Teams 会自动显示最相关的信息。
本文将探讨如何使用 Java 和 Spring MVC 来构建链接展开。添加链接展开与构建消息扩展类似:我们首先注册并实现机器人,然后准备应用程序清单。我们至少为消息扩展添加一个命令(否则,清单将无法安装)。然后,我们配置消息处理程序以提供触发链接展开的域列表。
与之前一样,我们将使用 ngrok 的本地环境。应用程序的完整源代码可在 GitHub 上找到。
创建项目
我们可以使用 Yeoman 生成器来创建项目
yo botbuilder-java
我们按如下方式配置机器人
- 名称:
link-unfurling
- 包名:
db.teams.linkunfurling
- 模板:Empty Bot
此命令将创建一个带有 EmptyBot
类(src/main/java/EmptyBot.java)的新项目
public class EmptyBot extends ActivityHandler { }
让我们将文件名和类名重命名为 LinkUnfurling
,然后将基类修改为 TeamsActivityHandler
public class LinkUnfurling extends TeamsActivityHandler { }
为了使其正常工作,我们还需要修改 Application.java 中的 getBot
方法
@Bean
public Bot getBot() {
return new LinkUnfurling();
}
实现机器人
现在我们需要注册机器人。在创建清单之前实现机器人至关重要。否则,链接展开可能会缓存结果。如果您更改了处理链接展开调用的方法中的任何内容,您通常需要重新安装 Teams 应用程序。
我们按照上一篇文章中的方法来注册机器人。因此,让我们注册新的机器人 link-unfurling-bot 并将其端点配置为本地 ngrok 转发 URL 或如果您决定将机器人部署到 Internet(例如,使用 Azure Spring Cloud)的实际 URL。
然后,生成机器人密码并将其与机器人 ID 粘贴到 application.properties
中
使用搜索命令
为了使清单可安装,我们需要为消息扩展至少有一个命令。因此,我们使用之前开发的类似回显的搜索命令处理程序。唯一的区别在于我们有硬编码的英雄卡文本(“Link unfurling
”)
@Override
protected CompletableFuture<MessagingExtensionResponse> onTeamsMessagingExtensionQuery(
TurnContext turnContext,
MessagingExtensionQuery query
) {
// Get query text
String queryText = GetQueryText(query);
// Create a hero card
HeroCard card = new HeroCard();
card.setTitle("Echo");
card.setSubtitle(queryText);
card.setText("Link unfurling");
// Create attachment
MessagingExtensionAttachment attachment = new MessagingExtensionAttachment();
attachment.setContent(card);
attachment.setContentType(HeroCard.CONTENTTYPE);
attachment.setPreview(card.toAttachment());
// Prepare result
MessagingExtensionResult result = new MessagingExtensionResult();
result.setAttachmentLayout("list");
result.setType("result");
result.setAttachment(attachment);
// Return the response
return CompletableFuture.completedFuture(new MessagingExtensionResponse(result));
}
GetQueryText
是一个辅助方法。它从消息扩展接收的参数中提取搜索查询文本。它的工作原理如上一篇文章所述。
上面的代码生成的屏幕截图如下
实现链接展开
当用户粘贴包含在消息处理程序下注册的域的链接时,Bot Framework 会调用 onTeamsAppBasedLinkQuery
方法。要实现链接展开,您只需在机器人的类中重写 onTeamsAppBasedLinkQuery
方法。以下是 LinkUnfurling
类的示例
public class LinkUnfurling extends TeamsActivityHandler {
@Override
protected CompletableFuture<MessagingExtensionResponse> onTeamsAppBasedLinkQuery(
TurnContext turnContext,
AppBasedLinkQuery query
) { }
}
如上所示,框架为您提供了两个对象:TurnContext
和 AppBasedLinkQuery
。TurnContext
提供处理传入请求所需的信息。具体来说,您可以使用它将响应发送回用户。AppBasedLinkQuery
类表示应用程序基于链接的查询的请求正文。它包含两个属性
Url
,其中包含用户粘贴的 URLState
,其中包含 OAuth 流的 magic code
这里,我们只使用第一个属性。更具体地说,我们首先创建一个 ThumbnailCard
,将其标题设置为 CodeProject,文本设置为用户粘贴的 URL。此外,我们将图像设置为 CodeProject 徽标
ThumbnailCard card = new ThumbnailCard();
card.setTitle("CodeProject");
card.setText(query.getUrl());
final String logoLink =
"https://codeproject.freetls.fastly.net/App_Themes/CodeProject/Img/logo250x135.gif";
CardImage cardImage = new CardImage(logoLink);
card.setImages(Collections.singletonList(cardImage));
然后,我们创建一个附件(与消息扩展相同的方式)
// Create attachments
MessagingExtensionAttachment attachments = new MessagingExtensionAttachment();
attachments.setContentType(HeroCard.CONTENTTYPE);
attachments.setContent(card);
我们将附件附加到 MessagingExtensionResult
类实例,如下所示
// Result
MessagingExtensionResult result = new MessagingExtensionResult();
result.setAttachmentLayout("list");
result.setType("result");
result.setAttachments(Collections.singletonList(attachments));
最后,我们生成并返回响应
// MessagingExtensionResponse
return CompletableFuture.completedFuture(new MessagingExtensionResponse(result));
这是完整的方法
@Override
protected CompletableFuture<MessagingExtensionResponse> onTeamsAppBasedLinkQuery(
TurnContext turnContext,
AppBasedLinkQuery query
) {
// Create ThumbnailCard
ThumbnailCard card = new ThumbnailCard();
card.setTitle("CodeProject");
card.setText(query.getUrl());
final String logoLink =
"https://codeproject.freetls.fastly.net/App_Themes/CodeProject/Img/logo250x135.gif";
CardImage cardImage = new CardImage(logoLink);
card.setImages(Collections.singletonList(cardImage));
// Create attachments
MessagingExtensionAttachment attachments = new MessagingExtensionAttachment();
attachments.setContentType(HeroCard.CONTENTTYPE);
attachments.setContent(card);
// Result
MessagingExtensionResult result = new MessagingExtensionResult();
result.setAttachmentLayout("list");
result.setType("result");
result.setAttachments(Collections.singletonList(attachments));
// MessagingExtensionResponse
return CompletableFuture.completedFuture(new MessagingExtensionResponse(result));
}
创建清单
为了测试我们的链接展开应用程序,我们需要创建清单并安装 Microsoft Teams 应用程序。我们按照与上一篇文章完全相同的方式来创建清单。我们只需通过添加消息处理程序来启用链接展开。**消息处理程序**是您在**消息扩展**屏幕上看到的最后一个配置选项。您可以按照 Microsoft 的文档中的说明配置域。在这里,我们只添加一个域:www.codeproject.com。
为了方便起见,我已将最终清单和配套代码 上传到 GitHub。您仍然需要更新第 28 行以包含您的机器人标识符。然后,将 manifest.json 与附带的图标一起压缩。之后,在 App Studio 或 Developer Portal 中使用**导入现有应用**。
将所有内容整合
现在,生成(mvn clean install
)并启动您的 Web 服务(java -jar target/link-unfurling-1.0.0-SNAPSHOT.jar
)。然后,打开 Microsoft Teams,转到聊天窗口并粘贴 codeproject.com 的任何链接。
例如
https://codeproject.org.cn/Articles/5299822/Java-on-Azure-Adding-Containers
您将看到以下结果
后续步骤
在这里,我们学习了如何使用 Java 和 Spring MVC 在 Microsoft Teams 应用程序中实现链接展开。我们从创建 Empty Bot 项目模板开始,然后添加了一个链接展开处理程序。最后,我们准备了应用程序清单。
创建链接展开是一个两步过程。您首先构建具有至少一个命令的消息扩展,然后指定域列表。当用户粘贴包含其中一个域的链接时,Bot Framework 会调用机器人类中的 onTeamsAppBasedLinkQuery
方法。在此方法中,您可以准备以卡片形式显示的响应。
请继续阅读第三部分,即本系列三篇文章的最后一部分,届时我们将探讨构建 Webhooks 和通知连接器。
要了解如何使用 Azure 服务构建、迁移和扩展 Azure 上的 Java 应用程序,请查看Azure Java 入门。