链接展开

重要

本部分中的代码示例基于 v4.6 及更高版本的 Bot Framework SDK。 如果要查找早期版本的文档,请参阅文档的 Resources 文件夹中 的消息扩展 - v3 SDK 部分。

本文档指导你如何使用开发人员门户和手动将链接展开添加到应用清单。 通过链接展开,当具有特定域的 URL 粘贴到撰写消息区域中时,应用可以注册以接收调用活动。 invoke 包含粘贴到撰写消息区域的完整 URL,你可以使用用户可展开的卡片进行响应,从而提供其他信息或操作。 其工作原理类似于搜索命令,其中 URL 充当搜索词。 现在,无需安装应用即可将链接展开添加到 Microsoft Teams。

屏幕截图显示了 Teams 和其他应用中已安装或未安装的 Teams 应用的链接展开体验。

注意

  • 链接展开结果缓存 30 分钟。
  • 链接展开支持自适应卡片 1.3 及更早版本。
  • 链接展开不需要消息传递扩展命令。 但是,清单中必须至少有一个命令,因为它是消息传递扩展中的必需属性。 有关详细信息,请参阅 撰写扩展
  • 对于移动客户端,仅对不需要身份验证的链接支持链接展开。

下图是 Teams 桌面和移动客户端中链接展开的示例:

将链接粘贴到 Teams 撰写消息区域中时,链接将展开到包含工作项详细信息的卡。

在团队撰写消息区域中粘贴的 Azure DevOps 链接的链接展开示例的屏幕截图。

若要详细了解链接展开,请参阅以下视频:


要将链接展开添加到应用清单,请将新的 messageHandlers 数组添加到应用清单 JSON 的 composeExtensions 节。 可以通过开发人员门户或手动添加数组。 域列表可以包含通配符,例如 *.example.com ,与域的一个段完全匹配。 如果需要匹配 a.b.example.com,请使用 *.*.example.com

注意

确保不直接或通过通配符添加不在你的控制范围中的域。 例如, yourapp.onmicrosoft.com 有效,但 *.onmicrosoft.com 无效。 顶级域是禁止的,例如 、 *.com*.org

  1. 从 Microsoft Teams 客户端打开 开发人员门户 ,然后选择“ 应用 ”选项卡。

    显示开发人员门户的屏幕截图,其中应用以红色突出显示。

    注意

    如果未在 Teams 客户端中添加开发人员门户应用,则必须添加该应用。

    屏幕截图显示 Teams,其中搜索和开发人员门户以红色突出显示。

  2. 加载应用清单。

    显示应用信息的开发人员门户的屏幕截图。

  3. 选择“应用功能”下的“消息传递扩展”,然后选择“选择现有机器人”“创建新机器人”。

    应用功能的屏幕截图,其中应用功能和消息扩展以红色突出显示。

    消息扩展的屏幕截图,其中“选择现有机器人”以红色突出显示。

  4. 选择“保存”。

  5. 选择“预览链接”部分下的“添加域”,然后输入有效域。

  6. 选择“添加”。 下图说明了此流程:

    开发人员门户中消息处理程序部分的屏幕截图。

注意

如果通过Microsoft Entra ID添加身份验证,请使用机器人在 Teams 中展开链接

首先,必须将数组添加到 messageHandlers 应用清单,并使消息扩展能够与链接交互。 以下示例说明了如何手动添加链接展开:

...
{
  "composeExtensions": [
    {
      "botId": "abc123456-ab12-ab12-ab12-abcdef123456",
      "messageHandlers": [
        {
          "type": "link",
          "value": {
            "domains": [
              "*.trackeddomain.com"
            ]
          }
        }
      ]
    }
  ]
}
...

有关完整的清单示例,请参阅 清单参考

将域添加到应用清单后,必须更新 Web 服务代码来处理请求 invoke 。 使用收到的 URL 以搜索服务并创建卡片响应。 如果使用多个卡片进行响应,则仅使用第一个卡片响应。

注意

来自机器人的响应必须包含 属性 preview

支持以下卡片类型:

有关详细信息,请参阅 操作类型调用

以下代码是请求的示例 invoke

以下是发送到机器人的 invoke 示例:

   {
     "type": "invoke",
     "name": "composeExtension/queryLink",
     "value": {
       "url": "https://theurlsubmittedbyyouruser.trackeddomain.com/id/1234"
     }
   }

响应示例:

{
 "composeExtension":
   {
     "type": "result",
     "attachmentLayout": "list",
     "attachments": 
     [
       {
         "contentType": "application/vnd.microsoft.card.adaptive",
         "preview": 
          {
            "contentType": "application/vnd.microsoft.card.adaptive",
            "content": << Card Payload >>
          },
          "contentType": "application/vnd.microsoft.card.adaptive",
          "content": << Card Payload >>
       }
      ]
   }
}
      

在 Microsoft Teams 中共享内容的最常见方法是通过链接。 对于任何链接,Teams 会通过图像、标题和说明等信息将链接预览展开到自适应卡片中。

无需在 Microsoft Teams 中安装应用,即可显示链接的丰富展开预览。 以 JSON-LD 格式schema.org 元数据添加到网站,并使用与产品匹配的微功能模板。 Teams 使用这些模板来展开 Microsoft Teams 中链接的丰富预览。

如果已将 schema.org 添加到网站,可以通过将链接粘贴到 Teams 消息撰写区域中来查看链接的丰富展开预览。

屏幕截图显示了在 Teams 消息撰写区域中粘贴链接时丰富的展开预览体验的示例。

如果尚未将 schema.org 添加到网站,可以按照以下步骤手动检查丰富的展开预览体验:

  1. JSON-LD 格式schema.org 元数据添加到网站。

  2. 在网站中,检查支持的 @type 属性,并在脚本标记 application/ld+json下复制元数据。

  3. 打开 自适应卡片设计器 并创建新文件。

  4. 示例数据编辑器中,粘贴网站中的 json 元数据。

    屏幕截图显示了自适应卡片Designer的示例数据编辑器部分中的网站元数据示例。

  5. 检查微功能模板,并在 CARD PAYLOAD 编辑器中添加模板代码。

    屏幕截图显示了自适应卡片Designer卡有效负载编辑器中添加的微功能模板示例。

    如果需要,请在 示例数据编辑器中将模板中的新属性添加到网站元数据。

  6. 若要预览自适应卡片展开体验,请选择“ 预览模式”。

有关详细信息,请参阅 网站链接的微功能

零安装链接展开有助于在用户发现或安装 Teams 中的应用之前为共享链接展开预览。 可以使用新 invoke 请求匿名展开卡片,或者在用户安装应用或进行身份验证之前为用户创建预身份验证的自适应卡片预览。

下图提供了一个顺序流来启用和使用零安装链接展开:

链接展开代码用户流的屏幕截图。

若要使应用为零安装链接展开做好准备,请执行以下步骤:

  1. 清单架构中,将 属性supportsAnonymizedPayloads设置为 true。

  2. 设置应用以处理新 invoke 请求 composeExtensions/anonymousQueryLink

    invoke 请求的示例:

    清单中“invoke”请求“composeExtensions/anonymousQueryLink”声明的屏幕截图。

    invoke请求有效负载的示例:

    {
       "name":"composeExtension/anonymousQueryLink",
       "type":"invoke",
       "timestamp":"2021-12-02T08:12:21.148Z",
       "localTimestamp":"2021-12-02T00:12:21.148-08:00",
       "id":"f:43d59e15-6114-bd53-08c3-b232aa648ec1",
       "channelId":"msteams",
       "serviceUrl":"https://smba.trafficmanager.net/amer/",
       "from":{
          "id":"redacted",
          "name":"redacted"
       },
       "conversation":{
          "isGroup":true,
          "conversationType":"groupChat",
          "tenantId":"redacted",
          "id":" redacted",
          "name":" redacted"
       },
       "recipient":{
          "id":"28:85fa138c-7654-4236-86eb-466160687029",
          "name":"test bot"
       },
       "entities":[
          {
             "locale":"en-US",
             "country":"US",
             "platform":"Mac",
             "timezone":"America/Los_Angeles",
             "type":"clientInfo"
          }
       ],
       "channelData":{
          "tenant":{
             "id":" redacted"
          },
          "source":{
             "name":"compose"
          }
       },
       "value":{
          "url":"https://test.test.com/test"
       },
       "locale":"en-US",
       "localTimezone":"America/Los_Angeles"
    }
    
  3. 响应 composeExtensions/anonymousQueryLink 有效负载。

    1. 对于非身份验证方案:必须使用 as result 和 卡 发送回响应type。 使用以下模板:

      {
        "composeExtension": {
          "type": "result",
          "attachmentLayout": "list",
          "attachments": [
            {
              "contentType": "application/vnd.microsoft.teams.card.o365connector",
              "content": {
                "sections": [
                  {
                    "activityTitle": "[85069]: Create a cool app",
                    "activityImage": "https://placekitten.com/200/200"
                  },
                  {
                    "title": "Details",
                    "facts": [
                      {
                    "name": "Assigned to:",
                    "value": "[Larry Brown](mailto:larryb@example.com)"
                      },
                      {
                    "name": "State:",
                    "value": "Active"
                      }
                    ]
                  }
                 ]
               }
            }
          ]
        }
      }
      
    2. 对于身份验证方案:必须使用 附件中的可选预身份验证卡将响应type与 as auth 一起发回。 使用以下模板:

      {
         "composeExtension": {
            "type": "auth",
            "attachmentLayout": "list",
            "attachments": [
               {
                 "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                 "type": "AdaptiveCard",
                 "version": "1.5",
                 "actions": [],
                 "body": [
                   {
                     "type": "TextBlock",
                     "size": "medium",
                     "weight": "bolder",
                     "text": "Zero-install test app"
                  },
                  {
                     "type": "TextBlock",
                     "text": "Link your account with this app for a full experience",
                     "wrap": true
                  }
                 ]
               }
            ]
         }
      }
      
  4. 仅限身份验证) 的预身份验证卡 (:创建卡预览,为未安装应用的用户展开链接。 可以创建预先模板化卡或添加相关占位符字段供用户更新。 用户甚至可以在安装应用之前了解该应用。

    可以创建自定义卡并添加相关字段。 用户可以根据字段填写所需的信息。 下图演示了自定义卡预览:

    自定义卡的屏幕截图,其中包含要更新的字段。

    下图演示了默认预览卡:

    链接展开代码默认预览卡的屏幕截图。

    注意

    将链接粘贴到邮件撰写区域中后,Teams 会将链接展开到卡并提示用户登录到应用。 如果用户未登录到应用,则链接不会在聊天中以卡的形式发布。

  5. 优点和限制

    零安装链接展开有助于为用户提供增强的体验,例如:

    • 在用户安装你的应用之前,为用户在 Teams 中共享的链接展开预览。
    • 为应用创建欢迎卡,以使用占位符字段显示预览。

测试零安装链接展开时,不要将应用安装为个人应用。 而是将应用上传到 Teams。

注意

不要直接从 Microsoft Visual Studio 调试器运行测试应用。

若要测试零安装链接展开,请执行以下步骤:

  1. 登录到 Teams 管理中心

  2. 在左窗格中,选择“ Teams 应用>”“管理应用”。

    Teams 管理中心和 Teams 中自定义应用上传部分的屏幕截图。

  3. 选择“ + 上传新应用”。

    Teams 管理中心的屏幕截图以及上传自定义应用的位置

  4. 选择“上传”。

  5. 选择“ 打开 ”以上传测试应用程序的 zip 文件。

  6. 应用上传成功后,转到为组织生成的Teams>应用>。

    Teams 客户端的屏幕截图,其中包含组织上传的 Teams 应用

  7. 可以通过在 composeExtensions/anonymousQueryLink 应用程序中实现匿名QueryLink 请求的方法中设置断点来测试调用请求。

当用户在会议中共享链接时,Teams 应用会展开指向自适应卡片的链接。 链接展开结果在 Teams 中缓存 30 分钟。 可以更新应用以设置缓存策略并删除应用的缓存。 当应用的链接在 Teams 中的不同上下文中共享时,此操作可帮助你在自适应卡片中显示不同的内容。

若要删除链接展开缓存,请在 属性下suggestedActions使用 type as setcachepolicy 更新机器人。 Teams 不会使用 缓存应用链接 "type": "setCachePolicy"的结果。

属性的 suggestedActions 以下 JSON 有效负载示例:

"suggestedActions": {
            "actions": [
                {
                    "type": "setCachePolicy",
                    "value": "{\"type\":\"no-cache\"}"
                }
            ]
        },

分步指南

按照 分步指南 使用机器人在 Teams 中展开链接。

代码示例

示例名称 说明 .NET Node.js 清单
零个安装链接展开。 此示例演示如何将基于 搜索 的消息传送扩展与配置页配合使用。 此示例还具有零安装链接展开功能。 View View View

另请参阅