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

如何从Discord机器人的message.mentions中提取所有用户名?

从Discord message.mentions中提取多个用户名的解决方法

问题描述

我在从Discord机器人的message.mentions中提取用户名时遇到困难,因为其中可能包含多个用户名。尝试了message.mentions[0]、message.mentions.name等方法,但都无法正常工作,请问有没有简单的实现方式?

message.mentions的示例内容:

[<Member id=1039533025127583754 name='karlosbotospicus' discriminator='0831' bot=True nick=None guild=>, <Member id=431438830504247299 name='metrix' discriminator='4505' bot=False nick='Vašek' guild=>]

使用的代码片段:

import smtplib
from email.message import EmailMessage
from email.utils import formatdate
from pprint import pprint
import os 
import discord
from discord.ext import commands
from dotenv import load_dotenv
from typing import Tuple, Any, List
import anything

from dotenv import load_dotenv  

@bot.event
async def on_message(message):
    if message.mentions:
        await message.channel.send(message.mentions)

解决方案

首先明确:message.mentions返回的是Member对象的列表,列表本身没有name属性,所以直接调用message.mentions.name会报错;而message.mentions[0]是取列表中的第一个Member对象,需访问该对象的属性才能获取用户名。

1. 提取单个用户名(第一个提及的用户)

如果只需要第一个被@用户的用户名,直接访问对应Member对象的name或nick属性:

@bot.event
async def on_message(message):
    if message.mentions:
        # 获取第一个提及用户的官方用户名
        first_username = message.mentions[0].name
        # 或者优先取服务器昵称,没有则用官方用户名
        first_username = message.mentions[0].nick or message.mentions[0].name
        await message.channel.send(f"第一个提及的用户:{first_username}")

2. 提取所有提及的用户名

如果要批量提取所有被@用户的信息,遍历message.mentions列表即可:

@bot.event
async def on_message(message):
    if message.mentions:
        # 生成所有提及用户的用户名列表(优先昵称)
        usernames = [member.nick or member.name for member in message.mentions]
        # 用逗号分隔输出所有用户名
        await message.channel.send(f"提及的用户:{', '.join(usernames)}")
        
        # 如果需要带 discriminator(如karlosbotospicus#0831)
        full_usernames = [f"{member.name}#{member.discriminator}" for member in message.mentions]
        await message.channel.send(f"完整用户名:{', '.join(full_usernames)}")

关键属性说明

  • member.name:用户的Discord官方用户名(不带后缀 discriminator)
  • member.nick:用户在当前服务器的自定义昵称,未设置则为None
  • member.discriminator:用户名后的四位后缀(如0831)
  • member.display_name:Discord官方提供的显示名,会自动优先返回昵称,无昵称则返回官方用户名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:15:29