遍历Discord频道消息历史并删除时遇进程终止问题求助
问题分析与修复方案
核心问题
你的代码存在多个逻辑错误和异步编程规范问题,直接导致功能失效和进程崩溃:
- 重复定义
on_ready事件,后定义的会覆盖前一个,导致初始化日志无法输出 - 未导入
schedule库却直接使用,且同步的schedule库不能在异步函数中调用,会阻塞Discord事件循环 channel.history()默认仅获取最近100条消息,无法删除全部历史- 未处理空消息列表的情况,调用
delete_messages会抛出异常 - 无限循环无延迟发送消息,触发Discord的请求频率限制,最终导致进程被终止
- 递归调用
my_background_task会不断创建新任务,造成内存泄漏
修复后的代码
import discord import asyncio from discord.ext import tasks # 初始化客户端,启用必要的意图 intents = discord.Intents.default() intents.messages = True intents.guilds = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'已登录为 {client.user}') # 启动定时任务 message_loop.start() @tasks.loop(seconds=5) async def message_loop(): channel = client.get_channel(999999999999999) # 替换为你的频道ID if not channel: print('未找到目标频道') return # 批量删除历史消息(最多100条/次,仅能删除14天内的消息) try: while True: history = await channel.history(limit=100).flatten() if not history: break await channel.delete_messages(history) # 避免请求过快触发限制 await asyncio.sleep(1) except discord.errors.HTTPException as e: print(f'删除消息失败: {e}') # 发送测试消息 await channel.send('Test') # 运行客户端 client.run('你的Bot令牌')
关键修改说明
- 使用Discord.py官方的
tasks.loop装饰器替代schedule库,完美适配异步事件循环 - 修复重复定义
on_ready的问题,统一初始化逻辑 - 添加意图配置,确保Bot能正常获取频道和消息数据(Discord API强制要求)
- 循环批量删除消息,直到清空频道(兼容Discord API的批量删除限制)
- 添加异常捕获,处理删除消息时的错误情况
- 为删除操作添加延迟,避免触发频率限制
- 移除递归调用,防止任务叠加导致内存泄漏
关于signal: killed错误
这个错误通常是因为:
- Bot发送消息频率过高,被Discord限制或宿主环境强制终止进程
- 内存泄漏导致进程占用资源过高,被系统杀死
修复后的代码通过tasks.loop严格控制发送频率,避免无限递归,可彻底解决此问题。
内容的提问来源于stack exchange,提问作者BorangeOrange1337
相关产品推荐
相关产品推荐

