如何用APScheduler和Aiogram发Telegram消息?遇SSLContext序列化错误
解决Telegram定时任务报错:TypeError: cannot pickle 'SSLContext' object
错误原因
SQLAlchemyJobStore需要将任务参数序列化(pickle)后存入数据库,但你传入的Telegram Bot 实例包含无法被pickle序列化的SSLContext对象,因此触发该错误。
解决方案
方案1:在任务函数内部初始化Bot实例
不要将Bot作为参数传入任务,而是在create_note函数内直接初始化Bot,避免序列化Bot对象:
async def create_note(id): # 在这里初始化Bot bot = Bot(token="你的Telegram机器人Token") await bot.send_message(chat_id=id, text='some text') await bot.close() # 任务完成后关闭连接 # 添加任务时不再传递bot参数 sched.add_job(create_note, 'interval', seconds=5, kwargs={'id': id})
方案2:使用内存JobStore(无需持久化任务时)
如果不需要将任务持久化到数据库,改用默认的内存JobStore,这样就不需要对参数进行序列化:
sched = AsyncIOScheduler(timezone='Europe/Moscow') # 移除SQLAlchemyJobStore配置,使用默认内存存储 sched.add_job(create_note, 'interval', seconds=5, kwargs={'bot': bot, 'id': id})
方案3:全局Bot实例复用(异步环境需注意安全)
如果需要复用Bot实例,可将其设为全局变量,任务函数直接引用,避免传参:
# 全局初始化Bot bot = Bot(token="你的Telegram机器人Token") async def create_note(id): await bot.send_message(chat_id=id, text='some text') # 添加任务时仅传递id参数 sched.add_job(create_note, 'interval', seconds=5, kwargs={'id': id})
注意:异步环境下全局Bot实例要确保协程安全,Telegram官方Bot库通常已处理该问题,但高并发场景需额外留意。
内容的提问来源于stack exchange,提问作者PR. OR
相关产品推荐
相关产品推荐

