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

如何终止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:57:15