You need to enable JavaScript to run this app. discord.py如何从用户提及中获取ID并处理命令异常避免报错
优惠活动
大模型
产品
解决方案
定价
更多

discord.py如何从用户提及中获取ID并处理命令异常避免报错

修复方案

你提供的原始代码存在以下问题:

  • 未导入discord.ext.commands模块
  • 函数参数定义为user,但实际代码中调用了未定义的arg变量
  • 没有处理类型转换异常,当传入非提及格式的参数时,discord.py内置的类型转换器会直接抛出未捕获错误

方案1:内置转换器+局部异常处理

保留自动转换用户参数的逻辑,新增错误处理捕获转换失败的场景:

import discord
from discord.ext import commands

# 注意必须开启所需意图,v2.0+版本discord.py默认关闭消息内容、成员相关意图
client = commands.Bot(command_prefix = "$", intents=discord.Intents.all())

@client.command()
async def getUserId(ctx, user: commands.UserConverter = None):
    # 未传参时默认返回命令调用者的ID
    if not user:
        user_id = ctx.author.id
    else:
        user_id = user.id
    await ctx.send(user_id)

# 为该命令单独绑定错误处理,不会影响其他命令
@getUserId.error
async def getUserId_error(ctx, error):
    if isinstance(error, commands.BadArgument):
        await ctx.send("参数格式错误,请使用@提及用户,示例:`$getUserId @张三`")
    else:
        await ctx.send("命令执行失败,请稍后重试")

方案2:手动解析提及(更简单,无转换报错)

不需要依赖内置转换器,直接从消息的提及列表读取用户,无论传入任何参数都不会触发报错:

import discord
from discord.ext import commands

client = commands.Bot(command_prefix = "$", intents=discord.Intents.all())

@client.command()
async def getUserId(ctx):
    # 取消息中第一个被@的用户,没有则取命令调用者
    if ctx.message.mentions:
        user_id = ctx.message.mentions[0].id
    else:
        user_id = ctx.author.id
    await ctx.send(user_id)

如果需要额外支持通过用户ID直接查询,可以在上述代码基础上新增纯数字参数的判断逻辑,配合client.fetch_user()加异常捕获即可实现。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 15:54:03