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

如何在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的定时任务工具,它是服务器端独立运行的,不能直接和用户会话绑定,所以得走这几步:

  1. 拿到用户输入的时长后,把用户的会话关键信息(比如conversationId、serviceUrl、userId)存到数据库或者Azure Storage里,同时记录提醒的到期时间。
  2. 写一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:07:44