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

Python Discord机器人执行stats命令如何显示提及用户名且不触发ping

问题原因

你当前的代码直接将用户输入的原始提及字符串(格式为<@!用户ID>/<@用户ID>)拼接在了发送内容中,Discord会自动识别该格式并触发对应用户的ping通知,同时你手动解析用户ID的逻辑冗余且容易出错。

解决方案

直接使用discord.py内置的用户参数转换器获取用户对象,调用用户名属性输出名称,同时可以配置发送消息的允许提及参数彻底屏蔽提及通知,修改后的代码如下:

import discord
from discord import User # 导入User类型用于参数转换

@client.command()
async def stats(ctx, target_user: User): # 用转换器直接把输入转成User对象
    # 直接从User对象获取用户ID,不需要手动解析字符串
    path = f'users/{target_user.id}.txt'
    # 用with语句管理文件读取更安全,避免文件句柄泄漏
    with open(path, 'r', encoding='utf-8') as f:
        lines = f.read().splitlines()
    # 发送时使用target_user.name(用户名)或者target_user.display_name(服务器内昵称),不会触发ping
    # 额外加allowed_mentions参数彻底禁用所有提及通知,双保险
    await ctx.channel.send(
        f'Stats for {target_user.display_name}\nExp: {lines[0]}\nMessages Sent: {lines[1]}',
        allowed_mentions=discord.AllowedMentions.none()
    )

额外说明

  • 如果需要全局禁止机器人发消息触发ping,可以在初始化Client的时候统一配置,不需要每次发消息单独加参数:
    intents = discord.Intents.default()
    client = discord.Client(
        intents=intents,
        allowed_mentions=discord.AllowedMentions(everyone=False, roles=False, users=False)
    )
    
  • 建议补充文件不存在的异常捕获逻辑,避免用户查询不存在的账号时机器人报错崩溃。

内容的提问来源于stack exchange,提问作者Snitz Foam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:06:04