Python Telegram Bot设置发送消息时显示“正在输入”的问题
解决Telegram机器人“正在输入...”不显示的问题
我之前也碰到过一模一样的情况,你代码的方向是对的,但几个细节没处理到位,导致“正在输入”的状态根本来不及在客户端显示就被消息覆盖了。下面是具体的解决思路和修正后的代码:
核心问题:动作展示的时间窗口太短
send_chat_action 发送的“正在输入”状态需要在客户端停留一小段时间才能被用户察觉,如果紧接着立刻调用 sendMessage,这个状态会被消息直接冲掉,用户完全看不到。
解决方案步骤:
1. 添加短暂延迟
在发送消息前加1-2秒的延迟,给客户端足够的时间加载并展示“正在输入”状态。可以用Python内置的 time.sleep() 实现,简单场景下完全够用。
2. 适配python-telegram-bot版本的API调用
如果你用的是 python-telegram-bot v13+ 版本,推荐用 context.bot 来调用方法,同时 ChatAction 的导入可以更简洁:
修正后的完整代码示例:
from telegram import ChatAction from telegram.ext import Updater, CommandHandler import time def handle_message(update, context): # 发送正在输入的动作 context.bot.send_chat_action(chat_id=update.effective_chat.id, action=ChatAction.TYPING) # 延迟1.5秒,让状态有足够时间显示 time.sleep(1.5) # 发送消息 context.bot.send_message(chat_id=update.effective_chat.id, text="Hi") def main(): # 替换成你的机器人Token updater = Updater("YOUR_BOT_TOKEN", use_context=True) dp = updater.dispatcher dp.add_handler(CommandHandler("start", handle_message)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
3. 排查其他潜在问题
- 确认
ChatAction导入正确:旧版本可能需要用telegram.ChatAction,但新版本直接从telegram导入即可; - 用
update.effective_chat.id替代update.message.chat_id:前者更通用,能兼容没有message对象的场景(比如回调查询); - 如果是v20+的异步版本,别用
time.sleep(),要换成await asyncio.sleep(1.5),避免阻塞事件循环。
额外提示
你可以根据需求调整延迟时间,一般1-2秒就足够用户看到状态了。另外 ChatAction 还有其他类型,比如 UPLOAD_PHOTO、RECORD_VOICE,都能用同样的方式触发对应的状态提示。
内容的提问来源于stack exchange,提问作者Ali Akhtari
相关产品推荐
相关产品推荐

