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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:42:46