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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:39:04