You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Teams Bot:如何更新已发送至频道的现有Adaptive Card?

问题:更新Teams频道已发送Adaptive Card的URL失败(PUT请求返回200但无变化)

我有一个接口 /api/send-message-to-channel 用于向Teams频道发送Adaptive Card,代码逻辑如下:

server.post(
  "/api/send-message-to-channel",
  ...
  async (req, res) => {
      ...
      // 渲染Adaptive Card模板,此时URL还未包含messageId
      message = AdaptiveCards.declare<Card>(template).render({
        ...
        url,
      });

      // 发送消息后获取到messageId
      messageId = message.id
  }
)

核心问题是:卡片中嵌入的URL需要包含这个messageId,但messageId只有在消息成功发送到频道后才能拿到。于是我尝试发送完成后,调用Teams REST API更新这条消息,代码如下:

// 构造包含更新后URL的消息体
const updatedMessage = {
  id: messageId,
  type: "message",
  from: ..., // 填充原始消息的from信息
  conversation: ..., // 填充原始消息的conversation信息
  recipient: ..., // 填充原始消息的recipient信息
  attachments: [
    {
      contentType: "application/vnd.microsoft.card.adaptive",
      content: messageWithUpdatedURL, // 替换为包含messageId的URL的卡片内容
    },
  ],
};

// 调用PUT接口更新活动
const response = await fetch(
  serviceUrl + `/v3/conversations/${conversationId}/activities/${messageId}`,
  {
    method: "PUT",
    headers: {
      Authorization: `Bearer ${access_token}`,
    },
    body: JSON.stringify(updatedMessage),
  }
);

请求返回了200状态码,但卡片里的URL并没有更新。请问该怎么正确更新这条原始消息?


解决思路

1. 补上缺失的Content-Type请求头

Teams API要求更新请求必须携带Content-Type: application/json头,你当前的代码里没加这个,这很可能导致服务端无法正确解析请求体,虽然返回200但实际上没处理更新。修改请求头部分:

headers: {
  Authorization: `Bearer ${access_token}`,
  "Content-Type": "application/json"
},

2. 确保更新后的卡片结构完全合法

  • 先验证messageWithUpdatedURL的JSON结构是否正确,检查有没有语法错误或者结构缺失,避免因为卡片本身不合法导致更新不生效。
  • 保证更新后的卡片除了URL字段,其他结构和原始发送的卡片完全一致,不要随意增减字段。

3. 严格匹配from/conversation/recipient字段

Teams API更新消息时,这些字段必须和原始消息完全一致,不能省略或填错:

  • 可以先调用GET接口GET {serviceUrl}/v3/conversations/{conversationId}/activities/{messageId}获取原始消息的完整结构,直接基于这个结构修改attachments里的卡片内容,再用PUT发送,这样能确保所有字段都匹配。

4. 确认机器人权限

检查你的机器人是否拥有ChannelMessage.Update权限,同时确保生成access_token的应用已经配置了对应的权限范围,权限不足也可能导致更新请求看似成功但实际未生效。

5. 尝试添加text字段(可选)

如果还是不行,可以在updatedMessage里加上text字段,填充和卡片内容对应的纯文本内容,有些场景下Teams需要这个字段才能正确触发消息更新。


内容的提问来源于stack exchange,提问作者Robert Stevens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 23:34:51