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
相关产品推荐
相关产品推荐

