Spigot+JDA实现Discord嵌入消息时皮肤头像URL无效问题排查
问题描述
使用Spigot结合Java Discord API(JDA)开发功能时,尝试在Discord嵌入消息中显示Minecraft玩家的皮肤头像,调用EmbedBuilder.setAuthor()时抛出以下错误:
Caused by: java.lang.IllegalArgumentException: URL must be a valid http(s) or attachment url. at net.dv8tion.jda.api.EmbedBuilder.setAuthor(EmbedBuilder.java:630)
原代码片段:
public static void sendMCMessage(String message, String username){ TextChannel channel = api.getTextChannelById("1088516469974908928"); EmbedBuilder embed = new EmbedBuilder() .setColor(Color.green) .setAuthor(username, null, "http://minotar.net/helm/" + username + ".png") .setFooter(api.getSelfUser().getName() + " 2023", api.getSelfUser().getAvatarUrl()) .addField(" ", message, true); channel.sendMessageEmbeds(embed.build()).queue(); }
错误原因
JDA的EmbedBuilder对嵌入消息中的图片URL有严格验证:必须使用HTTPS协议,或者是Discord的附件URL。代码中使用的http://minotar.net/...是HTTP协议链接,不符合验证规则,因此触发错误。
解决方案
将minotar的URL协议从HTTP替换为HTTPS即可:
修改后的代码:
public static void sendMCMessage(String message, String username){ TextChannel channel = api.getTextChannelById("1088516469974908928"); EmbedBuilder embed = new EmbedBuilder() .setColor(Color.green) // 替换为HTTPS协议的头像链接 .setAuthor(username, null, "https://minotar.net/helm/" + username + ".png") .setFooter(api.getSelfUser().getName() + " 2023", api.getSelfUser().getAvatarUrl()) .addField(" ", message, true); channel.sendMessageEmbeds(embed.build()).queue(); }
额外注意事项
- 如果Minecraft用户名包含空格或特殊字符,需要对用户名进行URL编码,避免生成无效URL。可以使用
URLEncoder.encode(username, StandardCharsets.UTF_8)处理用户名后再拼接URL。 - 确保minotar服务正常可用,若服务宕机可能导致头像无法加载,此时可以考虑备用的Minecraft皮肤头像服务,同样需使用HTTPS协议。
内容的提问来源于stack exchange,提问作者Cocolennon
相关产品推荐
相关产品推荐

