Webhooks

Las webhooks pueden enviar mensajes a un canal de texto sin tener que iniciar sesión como bot. También pueden buscar, editar y eliminar sus propios mensajes. Hay una variedad de métodos en discord.js para interactuar con webhooks. En esta sección, aprenderás a crear, buscar, editar y utilizar webhooks.

¿Qué es un webhook?

Los webhooks son una utilidad que se utilizan para enviar mensajes a canales de texto sin necesidad de un bot de Discord. Los webhooks son útiles para permitir que algo envíe mensajes sin requerir un bot de Discord. También puedes editar o eliminar directamente los mensajes que envió a través del webhook. Hay dos estructuras para hacer uso de esta funcionalidad: Webhook y WebhookClient. WebhookClient es una versión extendida de un Webhook, que te permite enviar mensajes a través de él sin necesidad de un cliente bot.

TIP

Si quieres leer sobre el uso de webhooks a través de la API sin discord.js, puedes leer sobre ellos aquíopen in new window.

Detectar mensajes de webhooks

Los bots reciben mensajes de webhooks en un canal de texto como de costumbre. Puedes detectar si un webhook envió el mensaje comprobando si el Message.webhookId no es null. En este ejemplo, revisamos si un webhook envió el mensaje.

if (message.webhookId) return;
1

Si quieres obtener el objeto Webhook que envió el mensaje, puedes usar el método Message#fetchWebhook()open in new window.

Obteniendo webhooks

TIP

La búsqueda de webhooks siempre hará uso de colecciones y promesas. Si no comprendes ninguno de los conceptos, revísalos y luego vuelve a esta sección. Puedes leer sobre colecciones aquí, y sobre promesas aquí y aquíopen in new window.

Obteniendo todos los webhooks de un Guild

Puedes obtener todos los webhoooks de un Guild usando Guild#fetchWebhooks()open in new window. Esto devolverá una promesa que se resolverá en una colección de Webhooks.

Obteniendo webhooks de un canal

Los webhooks que pertenecen a un canal se pueden recuperar usando TextChannel#fetchWebhooks()open in new window. Esto devolverá una promesa que se resolverá en una colección de Webhooks. Se devolverá una colección incluso si el canal contiene un solo webhook. Si estás seguro de que el canal contiene un único webhook, puedes usar Collection#first()open in new window en la colección para obtener el webhook.

Obteniendo un solo webhook

Usando el cliente

Puedes obtener un webhook específico usando su id con Client#fetchWebhook()open in new window. Puedes obtener la ID del webhook mirando su enlace, el número después de https://discord.com/api/webhooks/ es el id, y la parte posterior es el token.

Usando el constructor WebhookClient

Si no estás utilizando un cliente de bot, puedes obtener un webhook creando una nueva instancia de WebhookClient y pasando el id y el token al constructor. Estas credenciales no requieren que tengas una aplicación de bot, pero también ofrece información limitada en lugar de obtenerla con un cliente autorizado.

const webhookClient = new WebhookClient({ id: 'id', token: 'token' });
1

Tanbién puedes pasar solo una url:

const webhookClient = new WebhookClient({ url: 'https://discord.com/api/webhooks/id/token' });
1

Creando webhooks

Creación de webhooks a través de la configuración del servidor

Puedes crear webhooks directamente a través del cliente de Discord. Ve a Configuración del servidor y verás una pestaña de "Integraciones".

Integrations tab

Si ya has creado un webhook, la pestaña de webhooks se verá así; deberás hacer clic en el botón Ver webhooks.

Integrations tab

Una vez que estés ahí, haz clic en el botón Crear webhook / Nuevo webhook; esto creará un webhook. Desde aquí, puedes editar el canal, el nombre y el avatar. Copia el enlace, la primera parte es la identificación y la segunda es el token.

Creating a Webhook

Creando webhooks con discord.js

Los webhooks se pueden crear con el método TextChannel#createWebhook()open in new window.

channel.createWebhook('Some-username', {
	avatar: 'https://i.imgur.com/AfFp7pu.png',
})
	.then(webhook => console.log(`Webhook creado: ${webhook}`))
	.catch(console.error);
1
2
3
4
5

Editar webhooks

Puedes editar Webhooks y WebhookClients para cambiar su nombre, avatar y canal usando Webhook#edit()open in new window.

webhook.edit({
	name: 'Some-username',
	avatar: 'https://i.imgur.com/AfFp7pu.png',
	channel: '222197033908436994',
})
	.then(webhook => console.log(`Webhook editado: ${webhook}`))
	.catch(console.error);
1
2
3
4
5
6
7

Usar webhooks

Los webhooks pueden enviar mensajes a canales de texto, así como recuperar, editar y eliminar los tuyos. Estos métodos son los mismos para ambos Webhook y WebhookClient.

Enviando mensajes

Los webhooks, como los bots, pueden enviar hasta 10 incrustaciones por mensaje. También pueden enviar archivos adjuntos y contenido normal. El método Webhook#send()open in new window utilizado para enviar a una webhook es muy similar al método utilizado para enviar a un canal de texto. Los webhooks también pueden elegir cómo aparecerá el nombre de usuario y el avatar cuando envíen el mensaje.

Ejemplo usando un WebhookClient:

const { MessageEmbed, WebhookClient } = require('discord.js');
const { webhookId, webhookToken } = require('./config.json');

const webhookClient = new WebhookClient({ id: webhookId, token: webhookToken });

const embed = new MessageEmbed()
	.setTitle('Titulo')
	.setColor('#0099ff');

webhookClient.send({
	content: 'Webhook test',
	username: 'some-username',
	avatarURL: 'https://i.imgur.com/AfFp7pu.png',
	embeds: [embed],
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Ejemplo usando un Webhook:

const { Client, Intents, MessageEmbed } = require('discord.js');
const { token } = require('./config.json');

const client = new Client({ intents: [Intents.FLAGS.GUILDS] });

const embed = new MessageEmbed()
	.setTitle('Titulo')
	.setColor('#0099ff');

client.once('ready', async () => {
	const channel = client.channels.cache.get('123456789012345678');
	try {
		const webhooks = await channel.fetchWebhooks();
		const webhook = webhooks.first();

		await webhook.send({
			content: 'Webhook test',
			username: 'some-username',
			avatarURL: 'https://i.imgur.com/AfFp7pu.png',
			embeds: [embed],
		});
	} catch (error) {
		console.error('Error al intentar enviar un mensaje: ', error);
	}
});

client.login(token);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

Obteniendo mensajes

Puedes usar Webhook#fetchMessage()open in new window para obtener mensajes enviados previamente por el Webhook.

const message = await webhookClient.fetchMessage('123456789012345678');
1

Editando mensajes

Puedes usar Webhook#editMessage()open in new window para editar mensajes enviados previamente por el Webhook.

const message = await webhook.editMessage('123456789012345678', {
	content: '¡Editado!',
	username: 'algún-nombre-de-usuario',
	avatarURL: 'https://i.imgur.com/AfFp7pu.png',
	embeds: [embed],
});
1
2
3
4
5
6

Eliminando mensajes

Puedes usar Webhook#deleteMessage()open in new window para eliminar mensajes enviados previamente por el Webhook.

await webhookClient.deleteMessage('123456789012345678');
1

Resultado del código

Si quieres comparar tu código con el código que hemos hecho durante el camino, puedes revisarlo en nuestro repositorio de GitHub aquí open in new window.