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

如何使用discord.Member参数实现Discord机器人@用户功能?

Discord机器人!sad命令无法正确@指定用户的解决办法

问题描述

我开发了一个带有!sad命令的Discord机器人,执行该命令时会从sad_list返回随机字符串。现在希望实现:当传入discord.Member参数时,机器人能真正@到指定用户,输出格式为@user#0000 [随机字符串] <3,但修改后的代码只能显示user#0000 [随机字符串] <3,无法触发@提醒。

现有代码(修改后):

@client.command()
async def sad(ctx, user: discord.Member=None):
    print("running 'sad'")
    if user is None:
        await ctx.send(f"{ctx.message.author} {sad_list[randint(0, len(sad_list))]} <3")
    else:
        await ctx.send(f"{user} {sad_list[randint(0, len(sad_list))]} <3")

原因分析

直接在f-string中使用{user}或者{ctx.message.author},只会输出用户的"用户名#标签"字符串表示,这并不是Discord能识别的有效提及格式。Discord需要特定的格式(比如<@用户ID>)才能触发@提醒,而Member对象自带的mention属性会自动生成这个格式。

另外,你的代码还有一个隐藏bug:randint(0, len(sad_list))会生成从0到11的随机数(因为sad_list长度是11),但列表索引是从0到10,这会导致索引越界错误,推荐用random.choice()直接随机选取列表元素,更简洁安全。

修正后的代码

import random
import discord
from discord.ext import commands

sad_list = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"]

@client.command()
async def sad(ctx, user: discord.Member=None):
    print("running 'sad'")
    # 直接随机选择列表元素,避免索引越界
    random_sad_str = random.choice(sad_list)
    
    if user is None:
        # 使用author的mention属性提及命令发送者
        await ctx.send(f"{ctx.message.author.mention} {random_sad_str} <3")
    else:
        # 使用指定用户的mention属性触发@提醒
        await ctx.send(f"{user.mention} {random_sad_str} <3")

关键说明

  1. Member.mention的作用:这个属性会返回类似<@123456789012345678>的字符串,Discord会自动将其渲染为@用户名#0000的可点击提及,同时触发用户的通知。
  2. random.choice()的优势:无需手动计算索引范围,直接从列表中随机选取一个元素,彻底避免索引越界问题。
  3. 如果不想用mention属性,也可以手动构造提及格式:<@{user.id}>,效果和user.mention完全一致,比如:
    await ctx.send(f"<@{user.id}> {random_sad_str} <3")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:23:16