Webhook de Discord
Reenvíe eventos de Zenovay a un canal de Discord: útil para los canales del equipo de ingeniería o las salas de operaciones de crecimiento de la comunidad.
Los webhooks de Discord son de ámbito de canal. No se necesita ningún bot de Discord ni OAuth.
Los webhooks de salida son una función Pro+. Actualice su plan para habilitarlos.
1. Crear el webhook de Discord
- En Discord, abra el canal que debe recibir las alertas de Zenovay.
- Haga clic en el icono de engranaje (Editar canal) → Integrations → Webhooks → New Webhook.
- Asígnele un nombre ("Zenovay Alerts") y un avatar si lo desea.
- Haga clic en Copy Webhook URL: tendrá el aspecto
https://discord.com/api/webhooks/123456789012345678/XXXXXXXX....
2. Añadir el webhook en Zenovay
- En
app.zenovay.com, vaya a Settings → Webhooks. - Seleccione el sitio web del que desea recibir notificaciones.
- Haga clic en Add webhook.
- Complete los campos:
- Name:
Discord #ops(o lo que tenga sentido para usted) - URL: pegue la URL del webhook de Discord del Paso 1
- Events: seleccione los que le interesen
- Name:
- Haga clic en Create webhook.
- Haga clic en Send test event (el icono de avión de papel): en aproximadamente 5 segundos debería aparecer un mensaje en su canal de Discord.
Discord acepta JSON arbitrario, pero renderizará el payload sin formato como texto sin formato. Para mensajes más elaborados, consulte el Paso 3.
3. (Opcional) Formatear con embeds de Discord
Discord admite embeds enriquecidos con colores, campos y marcas de tiempo. Zenovay envía un evento JSON genérico; para renderizarlo como un embed, ejecute un pequeño relay:
// Cloudflare Workers / Node / Vercel — anywhere that runs JS
export default {
async fetch(req) {
const event = await req.json();
const colour = event.event_type === 'website_down' ? 0xdc2626
: event.event_type === 'traffic_spike' ? 0x10b981
: 0x3b82f6;
const discordPayload = {
embeds: [{
title: `Zenovay: ${event.event_type}`,
description: `Event for site ${event.website_id}`,
color: colour,
fields: [
{ name: 'Event type', value: event.event_type, inline: true },
{ name: 'Time', value: event.timestamp, inline: true },
],
footer: { text: 'Zenovay Analytics' },
}],
};
await fetch(DISCORD_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(discordPayload),
});
return new Response('ok');
},
};
Apunte la URL del webhook de Zenovay a este relay en lugar de a Discord directamente.
4. Verificar la firma de Zenovay
Para los relays en producción, verifique la firma HMAC-SHA256 para que solo los eventos genuinos de Zenovay lleguen a Discord:
import { createHmac } from 'crypto';
const signature = req.headers.get('x-zenovay-signature'); // 'sha256=<hex>'
const provided = signature.replace(/^sha256=/, '');
const expected = createHmac('sha256', YOUR_WEBHOOK_SECRET)
.update(rawBody)
.digest('hex');
if (provided !== expected) {
return new Response('invalid signature', { status: 401 });
}
Su secreto de webhook se muestra en Settings → Webhooks → haga clic en el icono del ojo en la tarjeta del webhook.
Resolución de problemas
- Discord rechaza con HTTP 400: el receptor de webhooks de Discord es estricto: los payloads con claves de nivel superior desconocidas pueden obtener un 400. Use el relay del Paso 3 para reformatear.
- Límites de velocidad: los webhooks de Discord tienen un límite de velocidad por canal (aproximadamente 30 mensajes por minuto). Para tipos de eventos activos como
traffic_spike, agrupelos en su relay o filtrelos en la configuración del webhook de Zenovay. - El evento de prueba llega pero los eventos reales no: confirme que los tipos de eventos correctos están seleccionados en la configuración del webhook de Zenovay. El evento de prueba usa
event_type: 'test'independientemente de lo que esté seleccionado.