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

Discord bot开发on_message仅监听指定频道及原有命令失效问题求解

问题成因
  • 命令失效:discord.py框架默认情况下,开发者重写on_message事件后,框架不会自动触发命令解析流程,所有你之前定义的前缀命令都会被拦截,无法正常响应,必须手动调用命令处理方法。
  • 全频道触发自定义逻辑:on_message本身是全局事件,服务器内所有消息都会触发该事件,需要在事件内部做频道过滤;你当前的过滤逻辑存在错误,使用str(message.channel)(获取的是频道名称字符串)和IDS['C_Juego'](通常存储的是频道的整数类型唯一ID)对比,两者类型和内容都不匹配,导致过滤条件永远不生效,所有频道的消息都会进入你的自定义逻辑分支。
修复方案

修改后的on_message代码如下:

@client.event
async def on_message(message):
    global rojo
    global IDS

    # 优先处理所有命令,保证之前定义的clear、swipe等命令正常运行
    await client.process_commands(message)

    # 过滤机器人自身发送的消息
    if message.author == client.user:
        return
    
    # 正确匹配目标频道,直接对比频道的整数ID,避免名称匹配错误
    target_channel_id = IDS['C_Juego']
    if message.channel.id != target_channel_id:
        # 非目标频道直接跳过后续游戏逻辑
        return
    
    # 仅目标频道执行游戏逻辑
    if rojo == 1:
        autor = message.author
        await message.add_reaction("🔴")
        await message.channel.send("Player: " + str(autor) + " removed!")
        role = get(message.guild.roles, name="Jugador")
        await message.author.remove_roles(role)
    else:
        await message.add_reaction("🟢")
        print("verde")

核心改动说明

  1. 事件开头添加await client.process_commands(message),所有消息优先交给框架处理命令逻辑,完全不影响原有命令的使用。
  2. 修正频道匹配规则,使用message.channel.id和存储的整数ID对比,彻底解决频道过滤失效的问题,只有指定频道的消息才会执行后续的游戏逻辑。
  3. 移除冗余的频道二次判断,前面的过滤逻辑已经保证只有目标频道的消息会走到游戏逻辑分支,不需要重复判断。

内容的提问来源于stack exchange,提问作者Nicolás Fernández Sanz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:09:00