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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:24:19