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

遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:15:31