Ir al contenido

Responder a botones y menús

Cuando alguien pulsa un botón o elige algo en un menú, Discord envía a tu bot una interacción. Tu bot tiene que responder en menos de 3 segundos.

  1. Tu bot envía un mensaje con un botón que tiene custom_id: "contador".
  2. Un usuario pulsa el botón.
  3. Discord envía a tu bot una interacción de tipo MESSAGE_COMPONENT (3) con ese custom_id.
  4. Tu bot mira el custom_id, decide qué hacer y responde (mensaje nuevo, editar el mensaje o abrir un modal).

Dentro de la interacción, el campo data trae la información del componente:

Campo Tipo Descripción
custom_id string El custom_id que pusiste en el componente.
component_type entero Tipo del componente (2 = botón, 3 = string select…).
values array de strings Solo en menús: los valores elegidos.
resolved objeto Solo en menús de usuario/rol/canal: los datos completos (usuarios, roles, canales) de lo elegido.
Ejemplo de interacción recibida (resumida)
{
"type": 3,
"id": "1234567890",
"token": "aW50ZXJhY3Rpb24...",
"data": {
"custom_id": "contador",
"component_type": 2,
"id": 3
},
"message": { "id": "...", "flags": 32768, "components": [] }
}
Tipo Valor ¿Qué hace? ¿Cuándo usarlo?
CHANNEL_MESSAGE_WITH_SOURCE 4 Envía un mensaje nuevo. Responder con información (puede ser efímero).
DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE 5 “Pensando…” y respondes después. Cuando tardarás más de 3 s en tener el mensaje.
DEFERRED_UPDATE_MESSAGE 6 Confirma el clic sin mostrar nada; editas después. Procesos lentos que acaban editando el mensaje.
UPDATE_MESSAGE 7 Edita el mensaje donde está el botón. Contadores, paginación, cambiar el estado.
MODAL 9 Abre un formulario (modal). Pedir texto, archivos u opciones al usuario.

Cada vez que alguien pulsa el botón, el mensaje se actualiza con el nuevo número (respuesta tipo 7).

Vista previa
Mi BotAPPHoy a las 12:00

Contador

Has pulsado el botón 3 veces.

Mensaje del contador
{
"flags": 32768,
"components": [
{
"type": 17,
"accent_color": 5793266,
"components": [
{
"type": 10,
"content": "### Contador\nHas pulsado el botón **3** veces."
},
{
"type": 1,
"components": [
{
"type": 2,
"style": 1,
"label": "+1",
"custom_id": "contador:3"
},
{
"type": 2,
"style": 4,
"label": "Reiniciar",
"custom_id": "reiniciar"
}
]
}
]
}
]
}

Responde a la interacción con un UPDATE_MESSAGE (7). El cuerpo es el mensaje completo nuevo:

POST /interactions/{interaction.id}/{interaction.token}/callback
{
"type": 7,
"data": {
"flags": 32768,
"components": [
{
"type": 17,
"accent_color": 5793266,
"components": [
{ "type": 10, "content": "### Contador\nHas pulsado el botón **4** veces." },
{
"type": 1,
"components": [
{ "type": 2, "style": 1, "label": "+1", "custom_id": "contador:4" },
{ "type": 2, "style": 4, "label": "Reiniciar", "custom_id": "reiniciar" }
]
}
]
}
]
}
}

Un mensaje efímero solo lo ve quien pulsó el botón. Suma los flags IS_COMPONENTS_V2 (32768) y EPHEMERAL (64) = 32832.

Vista previa
Mi BotAPPHoy a las 12:00

✅ Te has apuntado al evento. ¡Nos vemos allí!

👁 Solo tú puedes ver esto
{
"type": 4,
"data": {
"flags": 32832,
"components": [
{ "type": 10, "content": "✅ Te has apuntado al evento. ¡Nos vemos allí!" }
]
}
}

En los menús, los valores elegidos llegan en data.values:

data de la interacción
{
"custom_id": "elegir_color",
"component_type": 3,
"values": ["rojo", "azul"]
}

Si usaste DEFERRED_UPDATE_MESSAGE (6) o quieres cambiar la respuesta más tarde, edita la respuesta original:

PATCH /webhooks/{application.id}/{interaction.token}/messages/@original

Y para enviar mensajes adicionales (follow-ups):

POST /webhooks/{application.id}/{interaction.token}

Aprende a pedir datos al usuario con modales.