如何让discord.py开发的机器人在特定用户被@时触发自动回复?
Discord.py 特定用户提及触发自动回复问题解决方案
问题根因
你当前使用硬编码匹配<@user_id>字符串的实现存在两个核心缺陷:
- Discord 对设置了服务器昵称的用户提及会自动生成
<@!用户ID>格式的标记,你的硬编码逻辑无法匹配这种带感叹号的格式 - 纯字符串匹配容错性极低,消息中同时存在其他提及、特殊字符转义等场景时极易出现匹配失效
推荐解决方案
优先使用discord.py原生封装的提及解析属性实现,不用手动匹配消息内容,稳定性更高。
优化后代码
import os import discord import json # 替换为实际目标用户的ID,必须为整数类型,不要添加引号 TARGET_USER_ID = 123456789 # 注意开启消息内容意图,v2.0以上版本discord.py必须配置 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_message(message): # 跳过机器人自身发送的消息 if message.author == client.user: return # 跳过包含@everyone、@here的全员提及消息 if message.mention_everyone: return # 检查目标用户是否在当前消息的提及列表中 if any(user.id == TARGET_USER_ID for user in message.mentions): clock = get_time() clock = json.dumps(clock, indent=4) await message.channel.send("雅典当前时间为:") await message.channel.send(clock[-11: -6]) client.run(os.environ['TOKEN'])
额外配置说明
使用该代码前需要在Discord开发者平台的机器人管理页中,开启Message Content Intent权限,否则机器人无法读取普通消息内容,事件不会触发。
兼容字符串匹配的备选方案
如果你坚持要使用字符串匹配的方式实现,可以兼容两种提及格式:
TARGET_USER_ID = 123456789 # 兼容普通提及和带昵称提及的两种格式 mention_patterns = (f"<@{TARGET_USER_ID}>", f"<@!{TARGET_USER_ID}>") if any(pattern in message.content for pattern in mention_patterns): # 后续逻辑保持不变
内容的提问来源于stack exchange,提问作者Adam Marx
相关产品推荐
相关产品推荐

