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

python-telegram-bot:无法同时发送消息与运行轮询循环

问题解决:Python-Telegram-Bot 同时实现周期性消息与轮询循环

错误原因分析

你的代码报错核心是事件循环冲突:application.run_polling()是同步阻塞方法,它会在内部启动独立的事件循环,但asyncio.run(main())已经启动了一个事件循环,两者叠加导致报错。同时,Application的初始化、关闭协程未被正确await,引发警告。

解决方案代码

使用python-telegram-bot的异步API手动管理事件循环,让周期性消息任务与轮询任务在同一个事件循环中并行运行:

import asyncio
import logging
from telegram.ext import Application

# 配置日志
logging.basicConfig(level=logging.INFO)

token = '1111111111:AAAoOOV_Aaa1aaAAAaA1AA11A1aAaAAaAAA'
user_id = 123456789  # 替换为实际目标用户ID
interval_seconds = 3600  # 周期性消息间隔(示例为1小时)

application = Application.builder().token(token).build()

async def send_periodic_message():
    """周期性向指定用户发送消息的协程"""
    while True:
        try:
            await application.bot.send_message(chat_id=user_id, text="hello user, dont forget to get your pills")
            logging.info("周期性消息发送成功")
        except Exception as e:
            logging.error(f"发送周期性消息失败: {str(e)}")
        await asyncio.sleep(interval_seconds)

async def main() -> None:
    # 手动初始化Application,确保协程正确执行
    await application.initialize()
    # 异步启动轮询,不阻塞事件循环
    await application.updater.start_polling()
    
    # 可选:启动时先发送一次消息
    await application.bot.send_message(chat_id=user_id, text="hello user, dont forget to get your pills")
    
    # 将周期性任务加入当前事件循环,与轮询并行运行
    asyncio.create_task(send_periodic_message())
    
    # 保持事件循环运行,直到收到终止信号(如Ctrl+C)
    await application.wait_closed()

if __name__ == "__main__":
    asyncio.run(main())

关键说明

  • application.initialize():手动完成Application初始化,替代原run_polling内部的自动逻辑,确保初始化协程被正确await
  • application.updater.start_polling():异步启动消息轮询,不会独占事件循环
  • asyncio.create_task():将周期性消息任务注册到当前事件循环,实现与轮询任务的并行执行
  • application.wait_closed():维持事件循环运行,直到Bot收到终止信号

内容的提问来源于stack exchange,提问作者Tamar Gogoladze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:33:32