如何让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)
关键注意点
- 用户ID类型匹配:
message.author.id返回整数,所以字典的键必须是整数,不能写成字符串。 - 逻辑优先级控制:如果希望特定用户只收到固定回复,就在发送后添加
return终止后续逻辑;如果需要同时触发固定回复和普通回复,就去掉return。 - 避免多事件冲突:所有消息处理逻辑必须放在同一个
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
相关产品推荐
相关产品推荐

