Preguntar a la IA
Español ES
Ir a CleverApp

Webhook entrante

El bloque recibe una solicitud de un servicio externo y ejecuta tu código JavaScript. Así el flujo puede continuar a partir de un evento externo: llegó un pago, cambió el estado de un pedido, se activó un sensor.

Panel de configuración del bloque «Webhook entrante»Panel de configuración del bloque «Webhook entrante»

Ninguna conexión de otros bloques lleva a este bloque: solo lo inicia una solicitud.

Configuración

  • «URL de la solicitud»: la dirección a la que llamar. Se asigna al bloque al crearlo y tiene este aspecto: https://api.<dominio de la plataforma>/hook/<ID del bloque>:<clave secreta>. Sirve cualquier método: GET, POST y otros.
  • «Código JavaScript para procesar la solicitud»: el código que se ejecuta con cada solicitud, hasta 16 384 caracteres.

Advertencia

La dirección contiene una clave secreta. Cualquiera que la conozca puede ejecutar tu código: no la publiques.

Qué recibe el código

La solicitud está en el objeto request:

Campo Qué contiene
request.query Los parámetros de la cadena de consulta
request.headers Los encabezados de la solicitud, con los nombres en minúsculas
request.body El cuerpo de la solicitud como cadena, tal como llegó
request.data Todos los parámetros de la solicitud juntos: de la cadena de consulta, del formulario y de un cuerpo JSON

Más sobre los campos y sobre cómo verificar la firma de una solicitud en Variables integradas.

La solicitud no viene de una persona, así que el propio código debe indicar para qué contacto se ejecuta. Para eso hay funciones:

Función Cómo encuentra al contacto
setContactById(id) Por el ID del contacto en la plataforma
setContactByTelegramId(id) Por el ID de la persona en Telegram
setContactByMaxId(id) Por el ID de la persona en MAX
setContactByVkId(id) Por el ID de la persona en VK
setContactByViberId(id) Por el ID de la persona en Viber

Cada función se describe en detalle en la página Elegir el contacto.

La función devuelve true si el contacto se encuentra entre los contactos de este bot y false si no. Se puede llamar a una de estas funciones una vez por solicitud. Al menos una debe estar en el código; si no, el bloque responde con un error y el código no se ejecuta.

Una vez encontrado el contacto, el código puede usar sus datos (id, name, phone y los demás) y todas las funciones del bloque «Intérprete de JavaScript»: variables, etiquetas, sendMessage, goToBlock, disableContinue.

var contactId = request.query.contact_id;

if (setContactById(contactId)) {
    setContactVariable('order_status', request.data.status);
    sendMessage('El estado de tu pedido ha cambiado.');
}

Para que el servicio externo conozca el ID del contacto, pásaselo antes, por ejemplo con un bloque «Solicitud HTTP» y la plantilla {{ id }}.

Importante

Si no se encuentra el contacto, el código se ejecuta pero no guarda nada: no se escriben variables, etiquetas ni variables globales, no se envían mensajes y la conexión «Continuar» no se activa.

Salidas

  • «Continuar»: se activa cuando el código se ha ejecutado, si se encontró el contacto y el código no llamó a disableContinue().

Qué responde el bloque

La respuesta es un JSON con los campos status (ok o error), message y return_value, que es el valor de la última expresión del código.

Código de respuesta Cuándo
200 El código se ha ejecutado. Si no se encontró el contacto, message contiene Code executed without setting contact
404 Dirección incorrecta: no existe ese bloque o la clave no coincide
422 Un error en el código, el campo de código está vacío, el código no tiene ninguna función para elegir el contacto o el propietario del bot no tiene Pro
429 Demasiadas solicitudes

Cada solicitud y su respuesta quedan en el «Registro de ejecución» del bloque.

«Registro de ejecución» del webhook entrante: método, parámetros y cuerpo de la solicitud, valor devuelto y respuesta del bloque«Registro de ejecución» del webhook entrante: método, parámetros y cuerpo de la solicitud, valor devuelto y respuesta del bloque

Límites

  • El bloque solo funciona mientras el Pro del propietario del bot está activo. Los detalles están en Qué está disponible sin Pro.
  • No más de 30 solicitudes cada 10 segundos por bot (sumando todos sus bloques «Webhook entrante») y no más de 180 solicitudes por minuto desde una misma dirección IP.
  • El código tiene los mismos límites que en el bloque «Intérprete de JavaScript»: ES5 y 5 segundos de ejecución.

Solicitudes de Telegram y MAX

El bloque puede recibir todo lo que la app de mensajería envía a tu bot. En la ventana de conexión de Telegram o MAX, activa el interruptor «Reenviar solicitudes al bloque «Webhook entrante»» y elige el bloque por ID o por nombre en el campo «Bloque».

A partir de ahí, cada evento del canal lo procesa primero el bot, como siempre, según el flujo, y después pasa al código del bloque. El evento, tal como lo envió la app de mensajería, está en request.data.

Así puedes reaccionar a lo que el flujo por sí solo no procesa: mensajes en grupos y canales, que añadan el bot a un chat. Las solicitudes del modo inline de Telegram no se pasan al bloque.

var message = request.data.message;

if (message && message.from && setContactByTelegramId(message.from.id)) {
    setContactTag('wrote_in_group');
    disableContinue();
}

Estos eventos cuentan para el mismo límite de solicitudes por minuto.