Discord用户信息机器人仅含@everyone角色时崩溃问题求助
问题修复:Discord机器人在用户仅含@everyone角色时崩溃
问题原因
报错信息显示embeds.0.fields.5.value: This field is required,说明Embed中「Roles」字段的value为空字符串。当用户只有@everyone角色时,原代码第一个循环会跳过该角色,导致rlist为空,b = ','.join(rlist)得到空字符串,触发Discord API的400错误。同时原代码第二个循环会给所有用户都添加"rol yok!"(因为每个用户都默认拥有@everyone角色),导致角色数量统计错误。
修复代码
调整角色处理逻辑,避免空值并修正统计逻辑:
from unicodedata import name import discord from datetime import datetime from discord.ext import commands intents = discord.Intents.all() bot = commands.Bot(command_prefix='.',intents=intents) @bot.event async def on_ready(): print("Bot calisiyor!") @bot.command(name="user") async def user(ctx, user: discord.Member=None): if user is None: user = ctx.author # 收集除@everyone外的角色 roles = [role.mention for role in user.roles if role.name != "@everyone"] # 无额外角色时显示默认文本,避免空值 role_text = ','.join(roles) if roles else "无额外角色" # 统计有效角色数量(排除@everyone) role_count = len(roles) embed = discord.Embed(colour=user.color, timestamp=ctx.message.created_at) embed.set_author(name=f"用户信息 - {user}") embed.set_thumbnail(url=user.avatar.url) embed.set_footer(text=f'请求来自 - {ctx.author}', icon_url=ctx.author.avatar.url) embed.add_field(name='ID:', value=user.id, inline=False) embed.add_field(name='昵称:', value=user.display_name, inline=False) embed.add_field(name='账号创建时间:', value=datetime.strftime(user.created_at, "%#d/%m/%Y"), inline=False) embed.add_field(name='加入服务器时间:', value=datetime.strftime(user.joined_at, "%#d/%m/%Y"), inline=False) embed.add_field(name='是否是机器人:', value=user.bot, inline=False) embed.add_field(name=f'角色({role_count}个):', value=role_text, inline=False) embed.add_field(name='最高角色:', value=user.top_role.mention, inline=False) await ctx.send(embed=embed)
关键修改点
- 用列表推导式简化角色收集,直接过滤@everyone
- 增加空值判断,无额外角色时显示默认文本,避免Embed字段value为空
- 修正角色数量统计为有效角色的数量(排除@everyone)
- 移除原代码中冗余的第二个循环(错误添加默认文本的逻辑)
内容的提问来源于stack exchange,提问作者NuiDev
相关产品推荐
相关产品推荐

