如何让Discord机器人仅在消息提及特定用户时做出响应?
修复后的Discord机器人实现方案
原代码存在的问题
- 原有逻辑强制要求@你的内容必须出现在消息最开头才会触发,无法匹配@在消息中间、末尾的场景
- 直接硬匹配字符串的方式容错性极低,遇到带昵称的@格式、嵌入@等场景就会失效
实现逻辑说明
discord.py的Message对象自带mentions属性,会直接返回当前消息中@的所有用户对象列表,直接判断你的用户ID是否在这个列表里即可,不需要手动解析消息内容,准确度更高。
修正后的完整代码
import discord import os emoji = '\N{THUMBS UP SIGN}' # 你的Discord用户ID,可直接替换为你自己的ID TARGET_USER_ID = 666372975062417459 # 2.0以上版本discord.py需要显式声明intents client = discord.Client(intents=discord.Intents.default()) @client.event async def on_ready(): print('{0.user} is now active!'.format(client)) @client.event async def on_message(message): # 忽略机器人自己发送的消息 if message.author == client.user: return # 遍历消息中@的所有用户,判断是否包含目标用户 for user in message.mentions: if user.id == TARGET_USER_ID: await message.add_reaction(emoji) # 匹配到目标后直接跳出循环,不需要重复校验 break client.run(os.environ['TOKEN'])
注意事项
你需要在Discord开发者后台的机器人设置页面,开启Message Content Intent权限,否则机器人无法正常读取消息内容和@列表。
内容的提问来源于stack exchange,提问作者wcoffpsx
相关产品推荐
相关产品推荐

