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进程,会导致多个定时任务并行运行,同时发送多条消息,自然会出现多条留存。
修复方案
你可以按照优先级依次尝试以下修复手段:
- 增加时间冗余
将删除延迟和循环间隔的差值拉大,比如180分钟循环可以把两条消息的删除延迟分别调整为10500秒(175分钟)、10550秒,预留足够的删除时间窗口,避免延迟导致的删除不及时。 - 增加前置旧消息清理逻辑
每次发送新消息前,主动清理频道内历史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()
- 避免任务重复启动
如果你的bot使用了cog模块,需要在cog的卸载方法里添加任务停止逻辑,避免重载cog时启动多个重复任务:
def cog_unload(self): self.send.cancel()
同时检查后台运行状态,确保只有一个bot进程在运行。
内容的提问来源于stack exchange,提问作者Eternal Eternus
相关产品推荐
相关产品推荐

