如何从外部向Azure Bot Service API发送自适应卡片JSON
嗨,我明白你的需求了——你现在的Azure Bot Service调用/api/notify时只会发硬编码的自适应卡片到Teams渠道,想要改成每次调用都能根据传入的自定义内容发送不同的卡片对吧?这其实不难,咱们一步步来调整:
1. 修改API端点,接收自定义卡片数据
首先你需要把/api/notify端点改成支持POST请求,并且能从请求体里读取你传入的自适应卡片JSON内容。之前的代码是硬写死卡片数据,现在要把这部分替换成从外部接收的参数。
举个C#(ASP.NET Core)的例子,你可以在Bot的Controller里修改Notify方法:
[HttpPost("api/notify")] public async Task<IActionResult> Notify([FromBody] AdaptiveCard customCard) { // 这里要确保你已经有获取Teams渠道对话引用的逻辑 var conversationReference = await GetTeamsConversationReference(); if (conversationReference == null) { return NotFound("无法找到Teams渠道的对话引用"); } // 使用传入的自定义卡片创建消息活动 var message = MessageFactory.Attachment(new Attachment { ContentType = AdaptiveCard.ContentType, Content = customCard }); // 通过Bot Framework发送消息到Teams await _adapter.ContinueConversationAsync(_appId, conversationReference, async (turnContext, cancellationToken) => { await turnContext.SendActivityAsync(message, cancellationToken); }, CancellationToken.None); return Ok("自定义卡片已发送"); }
注:如果用的是其他语言(比如Node.js),逻辑是一样的——让API接收POST请求体里的卡片JSON,再传入发送消息的逻辑中。
2. 确保对话引用的获取逻辑可用
你需要提前保存好Teams渠道的对话引用(Conversation Reference),这样Bot才能知道要把消息发到哪个Teams渠道里。如果之前没有做这一步,可以在Bot第一次和Teams渠道建立对话时,把对话引用存储到数据库或者配置文件中,后续调用/api/notify时直接取用。
3. 测试自定义卡片发送
现在你可以用Postman或者curl这类工具,发送POST请求到https://www.sampleAzurebotservices.com/api/notify,请求体带上你自定义的自适应卡片JSON,比如:
{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.0", "body": [ { "type": "TextBlock", "text": "这是自定义的卡片标题", "size": "Large", "weight": "Bolder" }, { "type": "TextBlock", "text": "这里是自定义的卡片内容,还可以加链接哦~" }, { "type": "ActionSet", "actions": [ { "type": "Action.OpenUrl", "title": "点击访问自定义链接", "url": "https://your-custom-link.com" } ] } ] }
发送后,对应的Teams渠道就能收到你自定义的自适应卡片了。
4. 额外的安全性建议
为了避免恶意请求调用你的API,建议给/api/notify端点添加身份验证,比如使用API密钥或者Azure AD OAuth验证,确保只有授权的请求才能发送卡片。
内容的提问来源于stack exchange,提问作者Nanda kumar

