如何从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:用户在当前服务器的自定义昵称,未设置则为Nonemember.discriminator:用户名后的四位后缀(如0831)member.display_name:Discord官方提供的显示名,会自动优先返回昵称,无昵称则返回官方用户名
内容的提问来源于stack exchange,提问作者demon
相关产品推荐
相关产品推荐

