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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:14:53