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内部的自动逻辑,确保初始化协程被正确awaitapplication.updater.start_polling():异步启动消息轮询,不会独占事件循环asyncio.create_task():将周期性消息任务注册到当前事件循环,实现与轮询任务的并行执行application.wait_closed():维持事件循环运行,直到Bot收到终止信号
内容的提问来源于stack exchange,提问作者Tamar Gogoladze
相关产品推荐
相关产品推荐

