如何使用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
相关产品推荐
相关产品推荐

