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

如何使用Discord.py删除指定频道特定用户的重复消息(含历史)

Discord机器人指定频道去重删消息实现方案

问题A:限制逻辑仅在指定频道生效

直接通过频道ID做判断即可,不要用频道名匹配(频道名可被修改,判断不稳定):

  • 先开启Discord客户端开发者模式,右键目标频道选择「复制ID」,将ID存为配置常量
  • 在on_message事件触发的最优先层级判断当前消息所属频道ID,和配置的目标ID不匹配就直接终止后续逻辑,不执行去重删除操作。

问题B:扫描清理频道历史重复消息

利用discord.py提供的频道历史消息遍历接口,在机器人启动完成的on_ready生命周期里执行首次历史扫描:

  • 启动后先获取目标频道实例,从最早的消息开始倒序遍历(保证保留最早发送的有效消息,后续重复的直接删除)
  • 遍历过程中仅筛选目标作者发送的消息,和已记录的消息集合做比对,重复的直接调用删除接口,未出现过的内容存入已见集合
  • 若频道消息量较大,可配置扫描条数上限,避免触发接口限流。

现有代码优化点

  • 不要用字符串匹配用户名判断作者,用户名可随意修改,直接用用户ID做判断稳定性更高
  • 用set集合替代列表存储已见消息,集合的元素存在性判断时间复杂度为O(1),消息量大时性能远高于列表
  • 记得配置消息内容意图,discord.py新版本需要主动开启message_content意图才能读取消息正文,同时要给机器人授予目标频道的管理消息权限。

修改后完整代码

import discord

# 以下配置替换为实际值
TOKEN = 'YOUR_BOT_TOKEN'
TARGET_CHANNEL_ID = 1234567890  # 替换为目标生效频道的ID
TARGET_AUTHOR_ID = 10987654321  # 替换为要监控的News_Bot账号ID
HISTORY_SCAN_LIMIT = 2000       # 历史消息最大扫描条数,按需调整

# 初始化必要意图
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

# 用集合存储已见消息,查重效率更高
seen_messages = set()

@client.event
async def on_ready():
    print(f"机器人登录成功:{client.user}")
    target_channel = client.get_channel(TARGET_CHANNEL_ID)
    if not target_channel:
        print("配置错误:未找到指定目标频道")
        return
    
    # 从最早的消息开始扫描,保留首发内容,删除后续重复项
    async for msg in target_channel.history(limit=HISTORY_SCAN_LIMIT, oldest_first=True):
        if msg.author.id != TARGET_AUTHOR_ID:
            continue
        if msg.content in seen_messages:
            await msg.delete()
        else:
            seen_messages.add(msg.content)
    print("历史重复消息清理完成,开始监听新消息")

@client.event
async def on_message(message):
    # 非指定频道直接跳过
    if message.channel.id != TARGET_CHANNEL_ID:
        return
    # 非目标作者发送的消息直接跳过
    if message.author.id != TARGET_AUTHOR_ID:
        return
    # 重复消息删除,新内容加入记录
    if message.content in seen_messages:
        await message.delete()
    else:
        seen_messages.add(message.content)

client.run(TOKEN)

注意:需要去Discord开发者后台的机器人配置页,开启「Message Content Intent」开关,同时邀请机器人进服务器时勾选「管理消息」权限,否则机器人无法读取消息内容、执行删除操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:06:51