Tu primer mensaje V2
En esta guía vas a enviar un mensaje como este. Elige tu lenguaje en las pestañas: tu elección se recuerda en todas las páginas.
{ "flags": 32768, "components": [ { "type": 17, "accent_color": 5793266, "components": [ { "type": 10, "content": "## Mi primer mensaje V2 🎉\nHecho con un **Container** y un **Text Display**." }, { "type": 14 }, { "type": 1, "components": [ { "type": 2, "style": 1, "label": "Hola", "custom_id": "say_hello" } ] } ] } ]}Requisitos
Sección titulada «Requisitos»-
Crea una aplicación en el Portal de Desarrolladores de Discord y copia el token del bot (pestaña Bot).
-
Invita al bot a tu servidor con el permiso Enviar mensajes.
-
Instala la librería de tu lenguaje:
No necesitas nada: solo
curlo cualquier cliente HTTP.Ventana de terminal npm install discord.jsUsa una versión reciente de discord.js v14 (los builders de Components V2 llegaron en la 14.19).
Ventana de terminal pip install -U discord.pyNecesitas discord.py 2.6 o superior (añade
LayoutView,Container,Section…).Ventana de terminal go get github.com/bwmarrin/discordgo@latestUsa la última versión: incluye
Container,TextDisplay,SectionyMessageFlagsIsComponentsV2.
Enviar el mensaje
Sección titulada «Enviar el mensaje»Guarda el JSON de arriba como payload.json y envíalo:
curl -X POST "https://discord.com/api/v10/channels/ID_DEL_CANAL/messages" \ -H "Authorization: Bot $DISCORD_TOKEN" \ -H "Content-Type: application/json" \ -d @payload.jsonimport { Client, GatewayIntentBits, MessageFlags, ContainerBuilder, ButtonBuilder, ButtonStyle,} from 'discord.js';
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once('clientReady', async () => { const channel = await client.channels.fetch('ID_DEL_CANAL');
const container = new ContainerBuilder() .setAccentColor(0x5865f2) .addTextDisplayComponents((text) => text.setContent('## Mi primer mensaje V2 🎉\nHecho con un **Container** y un **Text Display**.'), ) .addSeparatorComponents((separator) => separator) .addActionRowComponents((row) => row.setComponents( new ButtonBuilder().setCustomId('say_hello').setLabel('Hola').setStyle(ButtonStyle.Primary), ), );
await channel.send({ flags: MessageFlags.IsComponentsV2, components: [container], });});
client.login(process.env.DISCORD_TOKEN);import osimport discord
intents = discord.Intents.default()client = discord.Client(intents=intents)
@client.eventasync def on_ready(): channel = client.get_channel(123456789012345678) # ID del canal
view = discord.ui.LayoutView() container = discord.ui.Container( discord.ui.TextDisplay("## Mi primer mensaje V2 🎉\nHecho con un **Container** y un **Text Display**."), discord.ui.Separator(), discord.ui.ActionRow( discord.ui.Button(label="Hola", style=discord.ButtonStyle.primary, custom_id="say_hello"), ), accent_colour=0x5865F2, ) view.add_item(container)
# discord.py añade el flag IS_COMPONENTS_V2 automáticamente al usar LayoutView await channel.send(view=view)
client.run(os.environ["DISCORD_TOKEN"])package main
import ( "log" "os" "os/signal"
"github.com/bwmarrin/discordgo")
func main() { s, err := discordgo.New("Bot " + os.Getenv("DISCORD_TOKEN")) if err != nil { log.Fatal(err) }
s.AddHandler(func(s *discordgo.Session, r *discordgo.Ready) { color := 0x5865F2 _, err := s.ChannelMessageSendComplex("ID_DEL_CANAL", &discordgo.MessageSend{ Flags: discordgo.MessageFlagsIsComponentsV2, Components: []discordgo.MessageComponent{ discordgo.Container{ AccentColor: &color, Components: []discordgo.MessageComponent{ discordgo.TextDisplay{Content: "## Mi primer mensaje V2 🎉\nHecho con un **Container** y un **Text Display**."}, discordgo.Separator{}, discordgo.ActionsRow{ Components: []discordgo.MessageComponent{ discordgo.Button{Label: "Hola", Style: discordgo.PrimaryButton, CustomID: "say_hello"}, }, }, }, }, }, }) if err != nil { log.Println("error enviando el mensaje:", err) } })
if err := s.Open(); err != nil { log.Fatal(err) } defer s.Close()
stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt) <-stop}Otras formas de enviar un mensaje V2
Sección titulada «Otras formas de enviar un mensaje V2»Respondiendo a un comando o botón
Sección titulada «Respondiendo a un comando o botón»La respuesta a una interacción usa el mismo cuerpo, envuelto en type y data:
{ "type": 4, "data": { "flags": 32768, "components": [ { "type": 10, "content": "¡Comando recibido!" } ] }}Lo verás en detalle en Interacciones.
Con un webhook
Sección titulada «Con un webhook»Los webhooks ignoran los componentes salvo que añadas ?with_components=true:
curl -X POST "https://discord.com/api/v10/webhooks/ID/TOKEN?with_components=true" \ -H "Content-Type: application/json" \ -d @payload.jsonCon archivos adjuntos
Sección titulada «Con archivos adjuntos»Para mostrar una imagen o un archivo subido por tu bot, envía la petición como multipart/form-data y refiérete al archivo con attachment://nombre:
curl -X POST "https://discord.com/api/v10/channels/ID_DEL_CANAL/messages" \ -H "Authorization: Bot $DISCORD_TOKEN" \ -F 'payload_json={"flags":32768,"components":[{"type":12,"items":[{"media":{"url":"attachment://foto.png"}}]}]}' \import { AttachmentBuilder, MediaGalleryBuilder, MessageFlags } from 'discord.js';
const file = new AttachmentBuilder('./foto.png');const gallery = new MediaGalleryBuilder().addItems((item) => item.setURL('attachment://foto.png'));
await channel.send({ flags: MessageFlags.IsComponentsV2, components: [gallery], files: [file] });file = discord.File("foto.png", filename="foto.png")
view = discord.ui.LayoutView()gallery = discord.ui.MediaGallery()gallery.add_item(media="attachment://foto.png")view.add_item(gallery)
await channel.send(view=view, file=file)f, _ := os.Open("foto.png")defer f.Close()
s.ChannelMessageSendComplex(channelID, &discordgo.MessageSend{ Flags: discordgo.MessageFlagsIsComponentsV2, Files: []*discordgo.File{{Name: "foto.png", ContentType: "image/png", Reader: f}}, Components: []discordgo.MessageComponent{ discordgo.MediaGallery{ Items: []discordgo.MediaGalleryItem{ {Media: discordgo.UnfurledMediaItem{URL: "attachment://foto.png"}}, }, }, },})Siguiente paso
Sección titulada «Siguiente paso»Tu bot ya envía mensajes V2. Ahora aprende a responder cuando alguien pulsa un botón.