Telethon脚本asyncio事件循环报错问题求助
解决Telethon asyncio事件循环冲突问题
错误原因
你当前代码的核心问题是:在全局作用域直接调用了bot.start()。这个方法在非异步环境下执行时,会自动创建一个临时的asyncio事件循环来完成Bot的认证连接,但后续你用asyncio.run(main())又创建了全新的事件循环。Telethon要求客户端连接后不能切换事件循环,因此触发了RuntimeError: The asyncio event loop must not change after connection。
正确实现方式
要实现Bot 24/7持续运行并并发执行自定义任务,需要把客户端启动逻辑放到异步函数内部,同时用asyncio.create_task()管理自定义任务,最后通过bot.run_until_disconnected()保持客户端在线。
完整代码示例
from telethon import TelegramClient, events from telethon.tl.types import PeerUser, PeerChat, PeerChannel import asyncio API_ID = 'xyz' API_HASH = 'xyz' BOT_TOKEN = 'xyz' # 仅创建客户端实例,不立即启动 bot = TelegramClient('bot_session', api_id=API_ID, api_hash=API_HASH) async def custom_continuous_task(): """自定义的持续运行任务示例(每小时发送一次消息)""" while True: await bot.send_message('me', 'Bot持续运行中...') # 这里可以添加你的其他逻辑,比如fetch_messages()等 await asyncio.sleep(3600) # 间隔1小时执行一次 async def main(): # 在异步上下文里启动Bot await bot.start(bot_token=BOT_TOKEN) print("Bot已成功启动") # 将自定义任务转为后台任务并发执行 asyncio.create_task(custom_continuous_task()) # 让Bot保持在线,处理Telegram连接和事件,直到手动终止 await bot.run_until_disconnected() # 启动整个异步程序 asyncio.run(main())
关键注意点
- 不要在全局作用域启动客户端:必须把
await bot.start()放到异步函数内部执行,确保和后续代码使用同一个事件循环。 - 并发管理自定义任务:用
asyncio.create_task()可以让多个自定义任务和Bot的核心逻辑同时运行。 - 保持Bot在线:
bot.run_until_disconnected()会阻塞当前协程,维持Telegram的连接,处理消息更新等事件,直到程序被手动停止。
内容的提问来源于stack exchange,提问作者user28854634
相关产品推荐
相关产品推荐

