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

discord.py机器人单条消息多次触发重复回复问题如何修复

问题根因

现有代码存在两处逻辑缺陷导致重复回复:

  • @机器人的分支执行完回复操作后,没有中断后续代码执行,程序会继续进入违禁词校验逻辑,因此消息同时@机器人且包含违禁词时会触发两次回复
  • 违禁词遍历逻辑中,每匹配到一个违禁词就会发送一次回复,匹配后没有终止循环,因此单条消息包含N个违禁词时就会发送N次回复
修复方法

核心处理原则:任意一个触发条件命中、发送完对应回复后,立刻终止后续所有判断逻辑,不再执行剩余校验。
修复后完整代码如下:

import random
import discord

banned = ['x', 'y', 'z']
insults = ['x', 'y', 'z']
mentions = ["x", "y", "z"]

@client.event
async def on_ready():
  await client.change_presence(status=discord.Status.online, activity=discord.Game('x'))
  print('Bot is ready')
  print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    # 优先处理@机器人场景
    if client.user.mentioned_in(message):
        # @everyone/@here不触发回复
        if not message.mention_everyone:
            await message.channel.send(random.choice(mentions))
            # 回复完成直接终止函数,不再执行后续违禁词校验
            return
    # 提前将消息内容转小写,避免循环内重复转换
    msg_content = message.content.lower()
    # 遍历违禁词,匹配到第一个就触发回复并终止循环
    for word in banned:
        if word in msg_content:
            await message.channel.send(random.choice(insults))
            # 跳出循环,不再检查剩余违禁词
            break
调整说明
  • 调整了@场景的判断逻辑,命中有效@(非@全体)并发送回复后直接return,从执行路径上切断后续违禁词校验,彻底避免双触发问题
  • 违禁词校验时,匹配到第一个命中的词发送回复后立刻break终止循环,不会继续遍历剩余违禁词,解决多违禁词重复回复问题
  • 如果需要调整触发优先级(比如优先校验违禁词、再校验@),只需要调换两个判断块的先后顺序即可,保持「触发即终止」的逻辑就不会出现重复回复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:31:05