En este momento estoy trabajando en la creación de un bot que publicará una imagen aleatoria de una carpeta local en mi VSC. Sin embargo, publicar un mensaje incrustado con la imagen genera un error:
DiscordAPIError: incrustaciones de cuerpo de formulario no válidas[0].image.url: no se pudo interpretar "{'archivo adjunto': ['1.jpg', '2mkjR-3__400x400.jpg', '8921036_sa.jpg', '91Vk1mS1x3L.png'] , 'nombre': Ninguno}" como cadena.
Esto se puede reproducir con el código de ejemplo:
const Discord = require('discord.js'); const { Intents } = Discord; const fs = require('fs'); const config = require('config'); const authToken = config.get('authToken'); const myIntents = new Intents([ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES ]); const client = new Discord.Client({ intents: myIntents }); client.on("ready", (client) => { console.log(`Logged in as ${client.user.tag}.`); }); client.on("messageCreate", (message) => { if ('.pic' === message.content) { let files = fs.readdirSync('./assets/images/'); let chosenFile = files[Math.floor(Math.random() * files.length)]; const image = new Discord.MessageAttachment(files); const embed = new Discord.MessageEmbed() .setTitle('yeet') .setImage(image) .setFooter('By K4STOR',''); message.channel.send({embeds: [embed]}); } }); client.login(authToken);Además de la secuencia de comandos anterior, deberá:
¿Cómo se puede arreglar el código anterior para enviar la imagen?
Prueba esto:
var fs = require('fs'); client.on("ready", () => { console.log("Why did I make this...") command(client, 'pic', (message) => { //choose one file from folder "./images" randomly var files = fs.readdirSync("./images/") let chosenFile = files[Math.floor(Math.random() * files.length)] //create embed and use image from messageAttachments const embed = new Discord.MessageEmbed() .setTitle('yeet') .setImage(`attachment://${chosenFile}`) .setFooter('By K4STOR','') //discord.js V13 variant of sending embeds //necessary to set files, otherwise #setImage with localfile does not work message.channel.send({ embeds: [embed], files: [`./images/${chosenFile}`] }); }) }) MessageEmbed.setImage() toma una URL, no un MessageAttachment . Para los archivos adjuntos, debe pasarlos a través de la opción de files TextChannel.send() . Tenga en cuenta que la guía sobre cómo adjuntar imágenes a un mensaje incrustado muestra esto.
Además, la ruta al directorio de imágenes debe combinarse con el nombre de archivo elegido cuando se crea el objeto adjunto.
Tenga en cuenta que todas las imágenes aparecen en el mensaje de error. Esto se debe a un problema menor: el archivo adjunto se establece en files , en lugar de en el chosenFile . Tenga en cuenta que este tipo de problema se considera en SO.
Solo estos cambios se verían así:
const path = require('path'); ... const imgDir = './assets/images/'; ... const image = new Discord.MessageAttachment( path.join(imgDir, chosenFile), chosenFile, {url: 'attachment://' + chosenFile}); const embed = new Discord.MessageEmbed() .setImage(image.url) ... message.channel.send({embeds: [embed], files: [image]});La muestra con los cambios anteriores aplicados sería:
const Discord = require('discord.js'); const { Intents } = Discord; const fs = require('fs'); const path = require('path'); const config = require('config'); const authToken = config.get('authToken'); const myIntents = new Intents([ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES ]); const client = new Discord.Client({ intents: myIntents }); client.on("ready", (client) => { console.log(`Logged in as ${client.user.tag}.`); }); const imgDir = './assets/images/'; client.on("messageCreate", (message) => { if ('.pic' === message.content) { let files = fs.readdirSync(imgDir); let chosenFile = files[Math.floor(Math.random() * files.length)]; const image = new Discord.MessageAttachment( path.join(imgDir, chosenFile), chosenFile, {url: 'attachment://' + chosenFile}); const embed = new Discord.MessageEmbed() .setTitle('yeet') .setImage(image.url) .setFooter('By K4STOR',''); console.log(`Sending ${chosenFile}.`); message.channel.send({embeds: [embed], files: [image]}); } }); client.login(authToken);