Discord工单机器人发送消息时如何@提及Mods与Admins管理员?
Discord 工单机器人@提醒功能修复方案
原代码存在的问题
- 事件回调内误用未定义的
ctx变量,on_message传入的上下文对象是msg,直接用ctx会触发命名错误 - 硬写
@Mods @Admins不会触发真实的@提醒,需要调用Discord角色对象的mention属性生成可提及格式 - 新版discord.py默认关闭消息内容读取权限,未开启对应意图会导致无法识别消息内容
- 未添加
process_commands调用,后续编写的前缀命令会全部失效 - 没有判断消息所在服务器,私信场景下会触发空对象报错
修正后的可运行代码
import discord from discord.ext import commands # 开启消息内容读取意图 intents = discord.Intents.default() intents.message_content = True intents.members = True # 如需获取成员/角色信息需要开启 client = commands.Bot(command_prefix="+", intents=intents) # 配置项 # 替换为你服务器内Mods、Admins角色的实际ID,可在Discord开启开发者模式后右键复制 MOD_ROLE_ID = 123456789012345678 # 示例ID,替换为实际值 ADMIN_ROLE_ID = 876543210987654321 # 示例ID,替换为实际值 # 工单触发匹配的关键词/频道ID,按你的需求调整 TICKET_TRIGGER = ["915745817694961664"] @client.event async def on_ready(): print("Bot is online") @client.event async def on_message(msg): # 跳过机器人自己发的消息,避免循环触发 if msg.author.bot: return # 只处理服务器内的消息,跳过私信 if not msg.guild: return # 匹配触发规则 for trigger in TICKET_TRIGGER: if trigger in msg.content: # 获取角色对象 mod_role = msg.guild.get_role(MOD_ROLE_ID) admin_role = msg.guild.get_role(ADMIN_ROLE_ID) if not mod_role or not admin_role: await msg.channel.send("提醒:未找到对应管理角色,请检查角色ID配置") return # 发送带@提醒的消息 await msg.channel.send(f"有人创建了工单!{mod_role.mention} {admin_role.mention}") break # 匹配到就退出循环,避免重复发送 # 保留命令处理逻辑 await client.process_commands(msg) client.run("替换为你的Bot TOKEN")
额外配置注意事项
- 你需要先在Discord开发者后台的Bot设置页,开启
Message Content Intent和Server Members Intent两个开关,否则代码会报错 - 要确保机器人拥有对应频道的发送消息、提及角色的权限,否则@不会生效
- 如果你的触发逻辑是「工单频道内有新消息就提醒」,可以把匹配规则替换为
if msg.channel.id in TICKET_TRIGGER,把TICKET_TRIGGER里存的字符串改为数字类型的频道ID即可
内容的提问来源于stack exchange,提问作者London Chowdhury
相关产品推荐
相关产品推荐

