discord.py如何从@用户提及格式中提取纯数字用户ID
问题根因
原有代码的字符替换逻辑存在变量更新bug:循环遍历待移除字符时,每次替换操作都基于初始未修改的name字符串执行,前两次替换<、@的结果没有被持久保存,只有最后一次替换>的操作实际生效,因此最终输出仅移除了末尾的>,其余格式字符残留。
另外手动替换字符存在兼容缺陷:Discord用户提及有两种标准格式,无昵称时为<@数字ID>,用户设置了服务器昵称时为<@!数字ID>,原代码的待移除字符列表未包含!,即便修复循环逻辑也无法正确处理昵称场景的提及内容。
最优实现方案
discord.py 内置了命令参数转换器,完全不需要手动处理字符串提取ID。直接将命令参数声明为discord.Member类型,框架会自动识别所有合法的@提及格式、校验用户有效性,直接读取成员对象的id属性即可得到纯数字ID:
import discord from discord.ext import commands @bot.command() @commands.has_permissions(administrator=True) async def get_user_id(ctx, target_user: discord.Member): uid = target_user.id print(uid) await ctx.reply(f"被提及用户ID:{uid}")
如果调用时用户未@有效用户,框架会自动返回标准化的参数错误提示,无需额外编写校验逻辑。
手动字符串处理方案(不推荐,仅作参考)
如果存在特殊场景必须手动解析提及字符串,修复循环的变量更新逻辑,同时补充!字符兼容即可:
@bot.command() @commands.has_permissions(administrator=True) async def autp(ctx, name): raw_content = str(name) for char in ["<", "@", "!", ">"]: # 每次替换后更新原字符串,让替换结果累计生效 raw_content = raw_content.replace(char, "") uid = raw_content print(uid) await ctx.reply(f"被提及用户ID:{uid}")
注意该方案需要自行补充ID格式校验、输入合法性校验逻辑,否则容易返回非预期结果。
内容的提问来源于stack exchange,提问作者Xerty - Minecraft
相关产品推荐
相关产品推荐

