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

discord.py定时任务发送的消息无法按设定自动删除问题求助

问题根因分析

首先计算你当前的参数可以发现,180分钟循环间隔对应的秒数为180 * 60 = 10800秒,你设置的两条消息删除延迟分别为10650秒、10750秒,仅比循环间隔短150秒、50秒,结合你给出的30分钟间隔运行正常的对照信息,可以定位问题根因如下:

  • 时间冗余不足:如果运行过程中出现Discord API延迟、bot进程卡顿、网络波动,会导致本地的delete_after删除任务触发延迟,旧消息还没完成删除,新的定时消息已经发出,多次叠加后就会积累4~5条留存消息。
  • 本地删除任务不可靠:discord.py的delete_after是依赖bot本地进程计时实现的,如果bot中途断连、重启、进程崩溃,已经发送的消息对应的删除任务会直接丢失,这些消息永远不会被自动删除,多次重启后就会出现多条留存。而你设置30分钟间隔时,循环周期短,就算丢失删除任务,最多也只会留存1条,所以表现正常。
  • 定时任务重复启动:如果你的代码有热重载逻辑、或者启动时重复调用了send.start()、或者后台运行了多个bot进程,会导致多个定时任务并行运行,同时发送多条消息,自然会出现多条留存。
修复方案

你可以按照优先级依次尝试以下修复手段:

  1. 增加时间冗余
    将删除延迟和循环间隔的差值拉大,比如180分钟循环可以把两条消息的删除延迟分别调整为10500秒(175分钟)、10550秒,预留足够的删除时间窗口,避免延迟导致的删除不及时。
  2. 增加前置旧消息清理逻辑
    每次发送新消息前,主动清理频道内历史bot消息,从根源避免多余消息留存,修改后的代码参考如下:
x = 180
@tasks.loop(minutes=x)
async def send():
    open('acceptloot.txt', 'w').close()
    response = "Frag has sent supplies into the field, if you're lucky you can get some!"
    channel = bot.get_channel(903563274807808040)
    # 新增:清理历史bot消息
    async for msg in channel.history(limit=20):
        if msg.author == bot.user:
            try:
                await msg.delete()
            except:
                pass
    # 原有发送逻辑
    await channel.send(file=discord.File('lootbox.png'), delete_after=10500)
    message = await channel.send(response, delete_after=10550)
    await message.add_reaction('✅')

@send.before_loop
async def before():
    await bot.wait_until_ready()

# 确保start只调用一次,如果用cog请在cog_unload里添加send.cancel()
send.start()
  1. 避免任务重复启动
    如果你的bot使用了cog模块,需要在cog的卸载方法里添加任务停止逻辑,避免重载cog时启动多个重复任务:
def cog_unload(self):
    self.send.cancel()

同时检查后台运行状态,确保只有一个bot进程在运行。

内容的提问来源于stack exchange,提问作者Eternal Eternus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:15:01