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
相关产品推荐
相关产品推荐

