如何终止Telegram机器人的等待状态?求添加停止命令的实现方法
解决python-telegram-bot中/posts命令的等待状态终止问题
你的代码核心问题是嵌套注册消息处理器——在cmd_stat里定义的get_username处理器会被永久注册,导致所有后续消息都会触发它,无法自动停止。这种写法也不符合python-telegram-bot的使用规范,正确的做法是通过用户状态管理来控制等待逻辑,配合停止命令重置状态。
解决方案代码示例
from telegram import types from telegram.ext import ApplicationBuilder, CommandHandler, MessageHandler, filters import asyncio import os # 假设L是你的自定义模块,URL是已定义的常量 # L = ... # URL = "https://t.me/" # 用户状态管理:key=聊天ID,value=当前状态标识 user_states = {} async def cmd_posts(update, context): chat_id = update.effective_chat.id # 将用户状态设为「等待输入用户名/链接」 user_states[chat_id] = "waiting_for_username" await update.message.answer("输入用户名或发送个人主页链接\n发送/stop可取消操作") async def cmd_stop(update, context): chat_id = update.effective_chat.id # 清除用户的等待状态 if chat_id in user_states: del user_states[chat_id] await update.message.answer("已取消当前操作") else: await update.message.answer("没有正在进行的操作可取消") async def handle_message(update, context): chat_id = update.effective_chat.id message_text = update.message.text # 仅处理处于「等待输入」状态的用户消息 if chat_id in user_states and user_states[chat_id] == "waiting_for_username": # 优先判断是否是停止命令 if message_text == "/stop": del user_states[chat_id] await update.message.answer("已取消当前操作") return # 处理用户名/链接逻辑 username = message_text.replace(URL, "").replace("/", "") print(username) try: profile = L.check_profile_id(username) await update.message.answer("找到用户,请稍候... ⏳", disable_notification=True) L.download_profile(profile) dirname = str(username) print('路径: ', dirname) await asyncio.sleep(1) media = types.MediaGroup() await types.ChatActions.upload_photo() os.chdir(dirname) # 操作完成后清除等待状态 del user_states[chat_id] # 这里可以补充发送媒体组的逻辑,比如await update.message.reply_media_group(media) await update.message.answer("操作完成") except Exception as e: # 异常时也需要清除状态,避免后续消息误触发 del user_states[chat_id] await update.message.answer(f"操作出错: {str(e)}") def main(): # 替换为你的机器人Token TOKEN = "YOUR_BOT_TOKEN" application = ApplicationBuilder().token(TOKEN).build() # 注册命令处理器 application.add_handler(CommandHandler("posts", cmd_posts)) application.add_handler(CommandHandler("stop", cmd_stop)) # 注册文本消息处理器(排除命令消息) application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message)) application.run_polling() if __name__ == "__main__": main()
关键逻辑说明
user_states字典用来跟踪每个用户的当前状态,只有状态为waiting_for_username时,才会处理用户的输入消息。/posts命令负责开启等待状态,/stop命令负责终止等待状态,也可以在消息处理器中直接识别/stop命令。- 无论操作成功还是失败,都要清除用户的等待状态,避免后续消息继续触发该逻辑。
- 用全局的
MessageHandler替代嵌套处理器,逻辑更清晰,状态控制更灵活。
内容的提问来源于stack exchange,提问作者Rafael Pereyra
相关产品推荐
相关产品推荐

