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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:49:29