如何通过Adaptive Card向Microsoft Teams发送李克特量表问题并回收答案?需示例及Bot回调方法
实现Microsoft Teams中基于Adaptive Card的李克特量表问答
一、设计李克特量表的Adaptive Card
李克特量表通常包含一组等级选项(如1-5分、非常不同意到非常同意),可通过Adaptive Card的Input.ChoiceSet组件实现,搭配Action.Submit组件让用户提交答案。
示例Adaptive Card JSON
{ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.4", "body": [ { "type": "TextBlock", "text": "请对本次服务满意度进行评分", "size": "Medium", "weight": "Bolder" }, { "type": "Input.ChoiceSet", "id": "satisfactionRating", "label": "满意度评分", "style": "expanded", "choices": [ { "title": "非常不满意", "value": "1" }, { "title": "不满意", "value": "2" }, { "title": "一般", "value": "3" }, { "title": "满意", "value": "4" }, { "title": "非常满意", "value": "5" } ], "isRequired": true, "errorMessage": "请选择一个评分" } ], "actions": [ { "type": "Action.Submit", "title": "提交", "data": { "action": "submitRating", "questionId": "serviceSatisfaction001" } } ] }
- 关键说明:
id字段用于标识输入项,后续获取答案时需通过该ID取值choices定义李克特量表的等级选项,value可设置为便于统计的数值或字符串data字段可携带自定义元数据(如问题ID、动作类型),方便机器人区分不同提交请求
二、将卡片发送到Microsoft Teams
通过Bot Framework SDK将Adaptive Card作为附件发送给Teams用户,以下是C#和Node.js的简化实现示例:
C# 示例
var cardJson = File.ReadAllText("path/to/your/card.json"); var adaptiveCard = JsonConvert.DeserializeObject<AdaptiveCard>(cardJson); var attachment = new Attachment { ContentType = AdaptiveCard.ContentType, Content = adaptiveCard }; var reply = MessageFactory.Attachment(attachment); await turnContext.SendActivityAsync(reply, cancellationToken);
Node.js 示例
const fs = require('fs'); const cardJson = JSON.parse(fs.readFileSync('path/to/your/card.json', 'utf8')); const reply = { attachments: [ { contentType: 'application/vnd.microsoft.card.adaptive', content: cardJson } ] }; await context.sendActivity(reply);
三、回收答案并回传给机器人
用户点击「提交」按钮后,Teams会将选择的数据发送给机器人,需在机器人的消息处理逻辑中捕获并解析这些数据。
C# 处理提交的答案
在机器人的OnMessageActivityAsync方法中判断并解析卡片提交数据:
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { if (turnContext.Activity.Value != null) { var submissionData = JsonConvert.DeserializeObject<Dictionary<string, string>>(turnContext.Activity.Value.ToString()); if (submissionData.TryGetValue("satisfactionRating", out var ratingValue)) { var questionId = submissionData["questionId"]; // 可在此处添加存储答案、生成统计数据等逻辑 await turnContext.SendActivityAsync($"感谢你的反馈!你选择的评分是:{ratingValue}", cancellationToken: cancellationToken); } } else { await turnContext.SendActivityAsync("请通过卡片提交你的评分", cancellationToken: cancellationToken); } }
Node.js 处理提交的答案
在机器人的onMessage回调中处理提交数据:
this.onMessage(async (context, next) => { if (context.activity.value) { const submissionData = context.activity.value; const ratingValue = submissionData.satisfactionRating; // 可在此处添加存储答案、生成统计数据等逻辑 await context.sendActivity(`感谢你的反馈!你选择的评分是:${ratingValue}`); } else { await context.sendActivity("请通过卡片提交你的评分"); } await next(); });
核心要点
- 用户提交的数据会包含在
turnContext.Activity.Value(C#)或context.activity.value(Node.js)中,结构与卡片中定义的输入项ID和data字段完全对应 - 自定义
data字段可帮助区分不同问卷问题,便于后续数据分类统计和业务逻辑处理
内容的提问来源于stack exchange,提问作者Samthrusha
相关产品推荐
相关产品推荐

