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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:33