65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (1投票)

2022 年 1 月 31 日

CPOL

5分钟阅读

viewsIcon

3447

如何使用 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
    ) { }

}

如上所示,框架为您提供了两个对象:TurnContextAppBasedLinkQueryTurnContext 提供处理传入请求所需的信息。具体来说,您可以使用它将响应发送回用户。AppBasedLinkQuery 类表示应用程序基于链接的查询的请求正文。它包含两个属性

  • Url,其中包含用户粘贴的 URL
  • State,其中包含 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 入门

© . All rights reserved.