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

Telegram提醒Bot开发报错求助:多输入处理及类型转换问题

问题解决:Telegram提醒Bot的输入处理与错误修复

错误原因拆解

  • invalid literal for int() with base 10: '/reminder':你直接把用户触发命令的文本/reminder转成整数,这显然不符合数字格式,自然报错。
  • 无法获取多输入:Telegram Bot的消息是异步触发的,用户每一次回复都会生成新的Update对象,你当前的同步写法根本抓不到后续的用户输入,必须用状态管理来跟踪用户处于哪个输入步骤。

修复方案(基于python-telegram-bot v13+)

用ConversationHandler管理对话流程,跟踪用户当前需要输入的内容(提醒文本、小时、分钟、AM/PM),同时加上输入验证避免类型错误。

完整示例代码

from telegram import Update
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, ConversationHandler
import datetime
import time

# 定义对话状态标记
REMIND_TEXT, HOUR, MINUTE, AMPM = range(4)

def start_reminder(update: Update, context):
    update.message.reply_text("要我提醒你什么内容?")
    return REMIND_TEXT

def save_remind_text(update: Update, context):
    # 把提醒内容存在用户会话数据里
    context.user_data['remind'] = update.message.text
    update.message.reply_text("请输入小时(1-12):")
    return HOUR

def save_hour(update: Update, context):
    try:
        hour = int(update.message.text)
        if 1 <= hour <= 12:
            context.user_data['hour'] = hour
            update.message.reply_text("请输入分钟(0-59):")
            return MINUTE
        else:
            update.message.reply_text("小时输入无效!请输入1-12之间的数字。")
            return HOUR
    except ValueError:
        update.message.reply_text("请输入有效的数字作为小时!")
        return HOUR

def save_minute(update: Update, context):
    try:
        minute = int(update.message.text)
        if 0 <= minute <= 59:
            context.user_data['minute'] = minute
            update.message.reply_text("请输入am或pm:")
            return AMPM
        else:
            update.message.reply_text("分钟输入无效!请输入0-59之间的数字。")
            return MINUTE
    except ValueError:
        update.message.reply_text("请输入有效的数字作为分钟!")
        return MINUTE

def setup_reminder(update: Update, context):
    ampm = update.message.text.lower()
    if ampm in ['am', 'pm']:
        # 转换为24小时制
        target_hour = context.user_data['hour']
        if ampm == 'pm':
            target_hour += 12
        remind_content = context.user_data['remind']
        update.message.reply_text(f"提醒已设置:{context.user_data['hour']}:{context.user_data['minute']} {ampm},到点我会通知你!")
        
        # 等待触发提醒
        while True:
            now = datetime.datetime.now()
            if now.hour == target_hour and now.minute == context.user_data['minute']:
                update.message.reply_text(f"【提醒】{remind_content}")
                break
            time.sleep(30)  # 每30秒检查一次,减少资源占用
            
        return ConversationHandler.END
    else:
        update.message.reply_text("请输入'am'或'pm'!")
        return AMPM

def cancel_setup(update: Update, context):
    update.message.reply_text("提醒设置已取消。")
    return ConversationHandler.END

def main():
    # 替换成你的Bot Token
    updater = Updater("YOUR_BOT_TOKEN")
    dp = updater.dispatcher
    
    # 创建对话处理器
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('reminder', start_reminder)],
        states={
            REMIND_TEXT: [MessageHandler(Filters.text & ~Filters.command, save_remind_text)],
            HOUR: [MessageHandler(Filters.text & ~Filters.command, save_hour)],
            MINUTE: [MessageHandler(Filters.text & ~Filters.command, save_minute)],
            AMPM: [MessageHandler(Filters.text & ~Filters.command, setup_reminder)]
        },
        fallbacks=[CommandHandler('cancel', cancel_setup)]
    )
    
    dp.add_handler(conv_handler)
    
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

关键修复点

  • 状态跟踪:用ConversationHandler记录用户当前处于哪个输入环节,确保每一次回复都对应正确的收集逻辑。
  • 输入验证:转换整数前做异常捕获,同时检查输入范围,避免无效输入导致崩溃。
  • 过滤命令干扰:通过~Filters.command排除用户发送的命令,只处理普通文本输入。
  • 资源优化:把无限循环改成每30秒检查一次时间,减少CPU占用。

额外建议

  • 别在主线程里用while True等时间,建议用APScheduler这类定时任务库处理提醒,避免阻塞Bot的其他功能。
  • 可以加重复提醒、日期设置的功能,让Bot更实用。

内容的提问来源于stack exchange,提问作者Yogendran Prakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:15:34