Discord机器人Whois命令报错DiscordAPIError: Invalid Form Body 求助
解决Discord机器人Whois命令的DiscordAPIError: Invalid Form Body错误
嘿,我帮你排查出这个错误的几个核心原因——都是因为你的MessageEmbed里有不符合Discord API规范的内容,下面是具体问题和修复方案:
1. 活动字段处理错误
你代码里的member.user.presence.activities是一个对象数组,直接塞到addField里会输出[object Object]这种无效内容,Discord API肯定不买账。而且用户可能根本没在玩任何东西,得做空值兜底。
2. 日期对象未格式化
member.user.createdAt是原生的Date对象,直接传给Embed字段的话,Discord API无法正确解析成可读格式,必须转成字符串。
3. Inline字段排版冲突
Discord的Embed要求同一行最多放3个带true(inline)参数的字段,你原来的代码里有些字段的inline设置可能导致排版超出限制,触发API校验失败。
4. 可选排查:缺失Presence权限
如果你的机器人没有GUILD_PRESENCES服务器权限,user.presence会返回空值,也可能间接引发错误,记得去服务器设置里给机器人开这个权限。
修复后的完整代码
if (command === 'whois') { let user = message.mentions.users.first() || message.author; // 简化变量赋值逻辑 const member = message.guild.member(user); // 处理用户活动:提取活动名称,无活动则显示"None" const activities = member.presence?.activities || []; const activityDisplay = activities.length ? activities.map(act => act.name).join(', ') : 'None'; // 格式化日期为本地可读字符串 const joinedDiscord = user.createdAt.toLocaleString(); const joinedServer = member.joinedAt?.toLocaleString() || 'Unknown'; const embed = new Discord.MessageEmbed() .setColor("RANDOM") .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) .addField(`${user.tag}`, `${user}`, true) .addField("ID:", `${user.id}`, true) .addField("Nickname:", member.nickname || 'None', true) .addField("Status:", user.presence?.status || 'Offline', true) .addField("Current Activity", activityDisplay) .addField("Joined Discord", joinedDiscord) .addField("Joined This Server", joinedServer) .addField("Roles", member.roles.cache.map(r => `\`${r.name}\``).join(' - ')) .setFooter(client.user.username); message.channel.send(embed); }
额外优化点说明
- 用了可选链
?.来处理可能的空值(比如用户隐身或机器人拿不到presence数据时),避免抛出Cannot read property的错误。 - 简化了用户变量的赋值逻辑,不用写多余的if-else。
- 新增了用户加入当前服务器的时间,让Whois信息更完整。
- 调整了inline字段的数量,确保每行不超过3个,符合Discord的Embed规则。
内容的提问来源于stack exchange,提问作者LinusDropTips
相关产品推荐
相关产品推荐

