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

如何让Python开发的Discord机器人对特定用户固定回复相同内容?

解决Discord机器人对特定用户发送固定回复的问题

你的问题核心是多个on_message事件冲突——discord.py只会执行最后一个注册的on_message回调,你之前注释的两个事件会被主逻辑的on_message覆盖,导致特定用户的判断逻辑根本没生效。

下面是整合后的完整解决方案:

步骤1:定义特定用户与回复的映射

在run_discord_bot函数内添加字典,存储需要特殊处理的用户ID和对应固定回复:

# 键是用户ID(整数类型),值是要发送的固定回复内容
SPECIAL_USER_REPLIES = {
    195251214307426305: "这是给用户1的专属固定回复",
    305280287519145984: "每次你发言,我都会自动发送这条消息"
}

步骤2:修改主on_message事件逻辑

把特定用户的判断整合到现有on_message函数中,优先处理特殊用户:

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    # 优先处理特定用户的固定回复
    user_id = message.author.id
    if user_id in SPECIAL_USER_REPLIES:
        await message.channel.send(SPECIAL_USER_REPLIES[user_id])
        # 可选:如果不需要触发后续普通回复逻辑,取消下面的注释
        # return

    # 原有的普通消息处理逻辑
    username = str(message.author)
    user_message = str(message.content)
    channel = str(message.channel)

    print(f'{username} said: "{user_message}" ({channel})')

    if user_message[0] == '?':
        user_message = user_message[1:]
        await send_message(message, user_message, is_private=True)
    else:
        await send_message(message, user_message, is_private=False)

关键注意点

  1. 用户ID类型匹配:message.author.id返回整数,所以字典的键必须是整数,不能写成字符串。
  2. 逻辑优先级控制:如果希望特定用户只收到固定回复,就在发送后添加return终止后续逻辑;如果需要同时触发固定回复和普通回复,就去掉return。
  3. 避免多事件冲突:所有消息处理逻辑必须放在同一个on_message事件内,不要注册多个@client.event装饰的on_message函数。

完整修改后的run_discord_bot函数

def run_discord_bot():
    intents = discord.Intents.default()
    intents.message_content = True
    client = discord.Client(intents=intents)

    # 定义特定用户的固定回复
    SPECIAL_USER_REPLIES = {
        195251214307426305: "你好,这是你的专属回复!",
        305280287519145984: "每次你发言,我都会发这条消息~"
    }

    @client.event
    async def on_ready():
        print(f'{client.user} is now running!')

    @client.event
    async def on_message(message):
        if message.author == client.user:
            return

        # 处理特定用户的固定回复
        user_id = message.author.id
        if user_id in SPECIAL_USER_REPLIES:
            await message.channel.send(SPECIAL_USER_REPLIES[user_id])
            # 可选:如果不需要普通回复,取消下面的注释
            # return

        # 原有的普通消息处理逻辑
        username = str(message.author)
        user_message = str(message.content)
        channel = str(message.channel)

        print(f'{username} said: "{user_message}" ({channel})')

        if user_message[0] == '?':
            user_message = user_message[1:]
            await send_message(message, user_message, is_private=True)
        else:
            await send_message(message, user_message, is_private=False)

    TOKEN=""
    with open("token.txt") as file:
        TOKEN = file.read()
    
    client.run(TOKEN)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:26:28