Skip to main content
ESPBoards

Enviar mensajes desde ESP32 al canal de Discord con Webhooks

Envía mensajes desde un microcontrolador ESP32 a tu canal de Discord usando Webhooks de Discord. Envía mensajes simples o mensajes formateados usando Discord Embeds.


Discord ha evolucionado mucho más allá de sus raíces en los juegos y el chat simple. Se ha convertido en una plataforma dinámica para que comunidades de todo tipo se conecten, colaboren y se comuniquen en tiempo real junto con bots, lo que lo convierte en una herramienta invaluable para fomentar la participación y construir comunidades alrededor de intereses compartidos.

Ahora, imagina si tu ESP32, con sus capacidades para interactuar con el mundo físico, pudiera comunicarse sin problemas con Discord. Esto abre un mundo de posibilidades. De repente, puedes recibir notificaciones, actualizaciones, o incluso controlar tus dispositivos con ESP32 directamente desde Discord.

En este post, exploraremos cómo hacer esto realidad, repasando el proceso de configurar tu ESP32 para enviar mensajes a servidores de Discord.

Configuración del Bot de Discord #

Siguiendo las instrucciones en la página de soporte de Discord "Introducción a los Webhooks", crea un nuevo Webhook en tu canal de Discord.

Junto al nombre del canal, haz clic en el engranaje de configuración.

Selecciona "Integraciones", y haz clic en "Webhooks" y "Nuevo Hook". Aparecerá un nuevo Hook a continuación.

Haz clic en él y copia la URL haciendo clic en el botón "Copiar URL del Webhook".

Guarda esta URL, ya que la necesitarás en un momento.

Preparar el ESP32 #

Puedes encontrar un ejemplo de código completo en el Repositorio de GitHub.

Crea una carpeta llamada discord_message. Esta será el directorio principal del proyecto de Arduino.

Secrets #

Crea un archivo secrets.h en el directorio raíz del proyecto. Copia el siguiente código:

#define WIFI_SSID "<REPLACE_WITH_YOUR_WIFI_SSID>"
#define WIFI_PASS "<REPLACE_WITH_YOUR_WIFI_PASSWORD>"
#define DISCORD_WEBHOOK "<REPLACE_WITH_DISCORD_WEBHOOK_URL>"
#define DISCORD_TTS "false"
  1. Completa tus credenciales de WiFi en WIFI_SSID y WIFI_PASS
  2. Pega la URL del Webhook de Discord que copiaste anteriormente. Debería tener este formato: https://discord.com/api/webhooks/xxx/zzz
  3. Si deseas habilitar la conversión de texto a voz de Discord para los mensajes, todos los que tengan tts habilitado lo escucharán.

Certificado SSL/TLS de la Aplicación de Discord #

Crea un archivo discordCert.h en el directorio raíz del proyecto y copia el siguiente código:

/*
* Get current discordapp.com certificate:
* openssl s_client -showcerts -connect discordapp.com:443
*/

const char* DISCORD_CERT = R"(
-----BEGIN CERTIFICATE-----
MIIDzTCCArWgAwIBAgIQCjeHZF5ftIwiTv0b7RQMPDANBgkqhkiG9w0BAQsFADBa
MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl
clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw
MDEyNzEyNDgwOFoXDTI0MTIzMTIzNTk1OVowSjELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkZmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkZmxhcmUgSW5jIEVD
QyBDQS0zMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEua1NZpkUC0bsH4HRKlAe
nQMVLzQSfS2WuIg4m4Vfj7+7Te9hRsTJc9QkT+DuHM5ss1FxL2ruTAUJd9NyYqSb
16OCAWgwggFkMB0GA1UdDgQWBBSlzjfq67B1DpRniLRF+tkkEIeWHzAfBgNVHSME
GDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0l
BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYI
KwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
b20wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL09t
bmlyb290MjAyNS5jcmwwbQYDVR0gBGYwZDA3BglghkgBhv1sAQEwKjAoBggrBgEF
BQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzALBglghkgBhv1sAQIw
CAYGZ4EMAQIBMAgGBmeBDAECAjAIBgZngQwBAgMwDQYJKoZIhvcNAQELBQADggEB
AAUkHd0bsCrrmNaF4zlNXmtXnYJX/OvoMaJXkGUFvhZEOFp3ArnPEELG4ZKk40Un
+ABHLGioVplTVI+tnkDB0A+21w0LOEhsUCxJkAZbZB2LzEgwLt4I4ptJIsCSDBFe
lpKU1fwg3FZs5ZKTv3ocwDfjhUkV+ivhdDkYD7fa86JXWGBPzI6UAPxGezQxPk1H
goE6y/SJXQ7vTQ1unBuCJN0yJV0ReFEQPaA1IwQvZW+cwdFD19Ae8zFnWSfda9J1
CZMRJCQUzym+5iPDuI9yP+kHyCREU3qzuWFloUwOxkgAyXVjBYdwRVKD05WdRerw
6DEdfgkfCv4+3ao8XnTSrLE=
-----END CERTIFICATE-----
)";

Ten en cuenta que este es el certificado de discordapp.com en el momento de escribir este post. Si el certificado ha cambiado mientras tanto, puedes obtener un nuevo certificado con este comando:

openssl s_client -showcerts -connect discordapp.com:443

Código de ESP32 para Enviar un Mensaje a Discord #

Crea un archivo discord.h en el directorio raíz de tu proyecto. Copia el siguiente código:

#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <WiFiClientSecure.h>
#include "discordCert.h"

const char ssid[] = WIFI_SSID;
const char pass[] = WIFI_PASS;
const String discord_webhook = DISCORD_WEBHOOK;
const String discord_tts = DISCORD_TTS;

WiFiMulti WiFiMulti;

void connectWIFI() {
WiFiMulti.addAP(ssid, pass);
WiFi.mode(WIFI_STA);
while ((WiFiMulti.run() != WL_CONNECTED)) {
Serial.print(".");
}
Serial.println("WiFi Connected");
}

void sendDiscord(String content, String embedJson) {
WiFiClientSecure *client = new WiFiClientSecure;
if (client) {
client -> setCACert(DISCORD_CERT);
{
HTTPClient https;
if (https.begin(*client, discord_webhook)) {
https.addHeader("Content-Type", "application/json");

String jsonPayload = "{\"content\":\"" + content + "\",\"tts\":" + discord_tts + ",\"embeds\": [" + embedJson + "]}";
int httpCode = https.POST(jsonPayload);

if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.print("HTTP Response: ");
Serial.println(payload);
}
} else {
Serial.print("HTTP Post failed: ");
Serial.println(https.errorToString(httpCode).c_str());
}

https.end();
}
}

delete client;
}
}

void sendDiscordMessage(String content) {
sendDiscord(content, "");
}

void sendDiscordEmbeds(String embeds) {
sendDiscord("", embeds);
}

Este código proporciona 3 funciones:

  • sendDiscordMessage(String content): Envía un mensaje simple a Discord
  • sendDiscordEmbeds(String embeds): Envía un mensaje con Embeds a Discord
  • sendDiscord(String content, String embedJson): Envía un texto simple y Embeds en un mensaje

La función principal sendDiscord() establece un certificado de la aplicación de Discord en WiFiClientSecure, configura el contenido del mensaje de Discord y finalmente envía el mensaje al Webhook de Discord.

Enviar el Mensaje desde ESP32 a tu Canal de Discord #

Crea un archivo discord_message.ino en el directorio raíz de tu proyecto. Agrega el siguiente código:

#include "secrets.h"
#include "discord.h"

String message = "";
String embedJson = "";

void setup() {
Serial.begin(9600);
connectWIFI();
// sendDiscordMessage(message);
// sendDiscordEmbeds(embedJson);
// sendDiscord(message, embedJson);
}

void loop() {
}

Como puedes ver, este es el archivo principal del proyecto de Arduino. Simplemente inicia la conexión serial y conecta la placa ESP32 a una red WiFi. Si descomentas cualquiera de las líneas comentadas, enviará un mensaje a Discord al configurar el ESP32, después de que se inicie y se conecte a la red WiFi. Para reenviar el mensaje nuevamente con este ejemplo, puedes reiniciar el ESP32 o mover la función sendDiscord...() a loop() o a la parte apropiada del código de tu aplicación.

Mensaje Simple a Discord desde ESP32 #

Para enviar un mensaje simple al canal de Discord, descomenta la línea sendDiscordMessage(message); y configura la variable message con cualquier mensaje que desees enviar a Discord.

- // sendDiscordMessage(message);
+ sendDiscordMessage(message);

Por ejemplo, si configuramos el mensaje de la siguiente manera:

String message = "¡Hola desde ESP32!";

Y subimos el código, después de que el ESP32 se inicie y se conecte exitosamente a la red WiFi, enviará un mensaje al Webhook de Discord. Después de unos segundos, deberías ver el mensaje en Discord.

Embeds de Discord con ESP32 #

Los embeds de Discord son una forma de mejorar la apariencia y la interactividad de los mensajes enviados en Discord. Permiten a los usuarios incluir medios enriquecidos, como imágenes, videos y texto formateado, en sus mensajes. Los Embeds se pueden usar para mostrar información en un formato visualmente atractivo.

embedJson es un array de embeds y puede contener hasta 10 embeds en un solo mensaje.

Por ejemplo, si configuramos el embedJson de la siguiente manera:

String embedJson = R"({
"author": {
"name": "Temperature Sensor",
"icon_url": "https://picsum.photos/200"
},
"title": ":thermometer: Temperature too high! **28.32°C**",
"color": 16711680,
"footer": {
"text": "",
"icon_url": "https://picsum.photos/200"
}
})";

Descomenta la línea sendDiscordEmbeds(embedJson); y sube el código.

- // sendDiscordEmbeds(embedJson);
+ sendDiscordEmbeds(embedJson);

Igual que anteriormente, después de que el ESP32 se inicie y se conecte a la red WiFi, el ESP32 enviará un mensaje a Discord, pero esta vez con Embeds. Con la configuración anterior, se vería así:

Combinar Mensaje de Discord y Embeds de Discord #

Si deseas enviar tanto texto simple como Embeds de Discord en un mensaje, completa las variables message y embedJson y descomenta la siguiente línea: sendDiscord(message, embedJson);.

- // sendDiscord(message, embedJson);
+ sendDiscord(message, embedJson);

Esto enviará un mensaje que se verá así:

Otros Ejemplos de Mensajes de Discord con ESP32 #

Spotify #

String embedJson = R"({
"title": "New song added!",
"color": 2021216,
"thumbnail": {
"url": "https://picsum.photos/400"
},
"fields": [
{
"name": "Track",
"value": "Scars To Your Beautiful",
"inline": true
},
{
"name": "Artist",
"value": "Alessia Cara",
"inline": true
},
{
"name": "Album",
"value": "Know-It-All",
"inline": true
}
],
"footer": {
"text": "Added Februrary 5, 2018 at 11:48AM",
"icon_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Spotify_logo_without_text.svg/200px-Spotify_logo_without_text.svg.png"
}
})";

Este ejemplo podría usarse para una aplicación que integre ESP32 y Spotify y envíe las actualizaciones a Discord.

Otras Funciones de los Embeds #

String embedJson = R"({
"author": {
"name": "Birdie♫",
"url": "https://www.reddit.com/r/cats/",
"icon_url": "https://picsum.photos/200"
},
"title": "Title lorem ipsum something very nice",
"url": "https://google.com/",
"description": "Text message. You can use Markdown here. *Italic* **bold** __underline__ ~~strikeout~~ [hyperlink](https://google.com) `code`",
"color": 15258703,
"fields": [
{
"name": "Text",
"value": "More text",
"inline": true
},
{
"name": "Even more text",
"value": "Yup",
"inline": true
},
{
"name": "Use `\"inline\": true` parameter, if you want to display fields in the same line.",
"value": "okay..."
},
{
"name": "Thanks!",
"value": "You're welcome :wink:"
}
],
"thumbnail": {
"url": "https://picsum.photos/600"
},
"image": {
"url": "https://picsum.photos/1200/600"
},
"footer": {
"text": "Woah! So cool! :smirk:",
"icon_url": "https://picsum.photos/200"
}
})";

Este ejemplo demuestra la mayoría de las funciones de los Embeds de Discord. Puedes encontrar más detalles sobre los Embeds de Discord aquí.

Recursos Adicionales #

Conclusión #

En este post hemos creado un programa de ejemplo para ESP32 que envía un mensaje al canal de Discord, usando los Webhooks de Discord. Hemos probado diferentes escenarios, como enviar un texto simple y enviar Embeds de Discord, que permiten un mejor formato de los mensajes. Este ejemplo puede usarse como base para una aplicación más compleja, que enviaría un mensaje a Discord cuando los sensores conectados al ESP32 detecten anomalías o escenarios similares.