如何在Teams自适应卡片中通过Action.Submit获取输入值并设置TimerTrigger
问题解决:Teams机器人获取自适应卡片输入值并设置定时提醒
一、代码该放哪儿?
处理自适应卡片Submit动作的代码,要放在机器人的核心消息处理文件里——也就是你说的teamsBot.js(如果用的是Bot Framework SDK v4的Teams模板,这个文件是处理用户所有消息/交互的入口)。因为用户点击「Start!」后,Teams会把卡片输入数据打包成activity.value发送给机器人,必须在机器人接收消息的逻辑里捕获这个交互。
二、修正获取输入值的代码
你写的代码里有个小错误:卡片输入框的id是id_minutes,但代码里取的是id_number,改过来就能拿到值了。下面是可直接用的修正版:
// 放在teamsBot.js的onMessage方法里(或类似的消息处理函数) async onMessage(context, next) { const txt = context.activity.text; const submitData = context.activity.value; // 判断是不是自适应卡片的Submit提交 if (!txt && submitData) { // 用输入框的id "id_minutes" 取出用户输入的时长 const minutes = parseFloat(submitData.id_minutes); // 校验输入是否合法(只能是1或3分钟) if (!isNaN(minutes) && (minutes === 1 || minutes === 3)) { await context.sendActivity(`已设置${minutes}分钟后提醒喝水!`); // 调用定时提醒的逻辑 await this.scheduleWaterReminder(context, minutes); } else { await context.sendActivity("请输入1或3分钟哦!"); } } else { // 处理普通文本消息,比如用户发"开始"就弹出自适应卡片 if (txt.toLowerCase() === "开始") { const adaptiveCard = { /* 把你的自适应卡片JSON放这儿 */ }; await context.sendActivity({ attachments: [CardFactory.adaptiveCard(adaptiveCard)] }); } } await next(); }
三、用TimerTrigger实现定时提醒
TimerTrigger是Azure Functions的定时任务工具,它是服务器端独立运行的,不能直接和用户会话绑定,所以得走这几步:
- 拿到用户输入的时长后,把用户的会话关键信息(比如
conversationId、serviceUrl、userId)存到数据库或者Azure Storage里,同时记录提醒的到期时间。 - 写一个TimerTrigger函数,定期扫描存储里的待提醒任务,时间到了就用Bot Framework的API给用户发消息。
简化版TimerTrigger示例(假设用Azure Storage存会话信息):
// 放在timerTrigger.js里 const { BotFrameworkAdapter } = require('botbuilder'); module.exports = async function (context, myTimer) { // 从存储里读取待处理的提醒任务 const pendingReminders = await getPendingRemindersFromStorage(); for (const reminder of pendingReminders) { // 创建Bot连接器,用机器人的身份认证信息 const adapter = new BotFrameworkAdapter({ appId: process.env.MicrosoftAppId, appPassword: process.env.MicrosoftAppPassword }); // 构造发送消息的上下文,用存储的会话信息 const turnContext = await adapter.createConversationAsync( reminder.serviceUrl, reminder.conversationId, reminder.botId, reminder.userId, { text: "该喝水啦!" } ); await turnContext.sendActivity("别忘了起身喝杯水哦💧"); // 标记这个提醒任务已完成 await markReminderAsCompleted(reminder.id); } };
关键注意事项
- 自适应卡片Submit动作发送的
activity类型可能是message或invoke,如果用的是SDK v4.12+,可以专门用handleTeamsCardActionInvoke方法处理,比在onMessage里判断更精准。 - 一定要保存
serviceUrl,这是机器人和Teams通信的专属地址,不同用户/租户的serviceUrl可能不一样。 - 输入值必须做合法性校验,避免无效时长导致定时任务出错。
内容的提问来源于stack exchange,提问作者Monika K
相关产品推荐
相关产品推荐

