如何实现Telegram机器人问卷命令序列?Telegraf SDK问题求助
搞定Telegraf问卷机器人的命令序列方案
嘿,我来帮你解决这个80+问题的问卷机器人开发难题!用Telegraf做这类多步骤交互,核心就是靠**会话(Session)**跟踪用户的答题进度,下面给你一套可运行的完整方案,你可以直接套用到你的项目里。
核心思路
- 用Telegraf的
session中间件存储用户当前的答题位置和已提交的答案 - 把所有问卷问题整理成结构化数组,方便按顺序调用
- 通过命令触发问卷,然后自动按顺序推送问题、收集用户回复
完整示例代码
const { Telegraf, session } = require('telegraf'); // 初始化机器人,替换成你的Bot Token const bot = new Telegraf('YOUR_BOT_TOKEN'); // 启用会话中间件,用来跟踪答题进度 bot.use(session()); // 定义你的问卷结构,把80+问题都放到这个数组里 // 每个元素包含问题文本和对应分值(可根据需求调整结构) const questionnaire = [ { question: "Q1: Seldom I am feeling good. (1 point)", points: 1 }, { question: "Q2: I am feeling good always. (2 points)", points: 2 }, // ... 这里继续添加剩下的78+个问题 ]; // 触发问卷的命令,用户发送/start_survey就启动问卷 bot.command('start_survey', async (ctx) => { // 初始化会话数据:当前问题索引、已收集的答案 ctx.session.survey = { currentIndex: 0, answers: [] }; // 发送第一个问题 await ctx.reply(questionnaire[0].question); }); // 处理用户的答题回复 bot.on('text', async (ctx) => { // 如果用户不在问卷流程中,直接忽略或提示 if (!ctx.session?.survey) return; const { currentIndex, answers } = ctx.session.survey; const currentQuestion = questionnaire[currentIndex]; // 保存当前问题的答案(可根据需求扩展,比如验证输入格式) answers.push({ questionId: `Q${currentIndex + 1}`, questionText: currentQuestion.question, userAnswer: ctx.message.text, points: currentQuestion.points }); // 计算下一个问题的索引 const nextIndex = currentIndex + 1; if (nextIndex < questionnaire.length) { // 还有问题,发送下一个 ctx.session.survey.currentIndex = nextIndex; await ctx.reply(questionnaire[nextIndex].question); } else { // 问卷结束,汇总结果 await ctx.reply('🎉 问卷已完成!感谢你的参与!'); // 这里可以把answers数据保存到数据库,或者发送给管理员 console.log('用户的问卷答案:', answers); // 清除会话中的问卷数据 delete ctx.session.survey; } }); // 增加取消问卷的命令 bot.command('cancel_survey', async (ctx) => { if (ctx.session?.survey) { delete ctx.session.survey; await ctx.reply('❌ 问卷已取消,你可以随时发送/start_survey重新开始'); } else { await ctx.reply('你当前没有在进行问卷哦'); } }); // 启动机器人 bot.launch(); // 处理进程退出信号,优雅关闭机器人 process.once('SIGINT', () => bot.stop('SIGINT')); process.once('SIGTERM', () => bot.stop('SIGTERM'));
关键细节说明
- 会话存储:默认Telegraf用内存存储会话,开发测试没问题,但生产环境建议用Redis(安装
telegraf-session-redis包),避免重启机器人丢失数据 - 问题结构:你可以根据实际需求修改
questionnaire数组的结构,比如添加选项、分值规则、输入验证条件等 - 答案处理:示例中只是简单保存用户输入,你可以扩展逻辑,比如验证用户输入是否符合要求(比如只能输入数字),不符合的话提示重新输入
- 异常处理:可以添加逻辑处理用户中途发送其他命令或无关消息的情况,避免问卷流程中断
调试小技巧
- 开发时可以先只放3-5个问题测试流程,没问题再批量添加80+个问题
- 用
console.log打印ctx.session.survey查看会话数据,跟踪答题进度
内容的提问来源于stack exchange,提问作者Parsaria
相关产品推荐
相关产品推荐

