"Cada vez que recibes una actualización de webhook, tienes dos opciones"Desde
Telegram Bot Api Faq
Hola Habr!
Durante mucho tiempo, el concepto sin servidor (o más precisamente, su implementación como un servicio AWS Lambda) fue para mí una idea relativamente clara, pero muy abstracta. A menudo sonaba en Radio-T, discusiones sobre el reddit, pero nunca entró en mi vida. Los proyectos de trabajo no viven en la nube, sino los proyectos domésticos, ¿por qué? Las computadoras virtuales se están volviendo más baratas, Docker ha sido dominado y todo funciona bien.
Pero la presentación de Yandex Cloud Functions, y en particular los precios anunciados para este servicio, proporcionaron nuevas ideas para pensar.
TL; DR : en un lluvioso viernes por la noche, escribiremos un simple bot de Telegram en JavaScript que puede responder a las solicitudes con mensajes simples. Si este es el proyecto de su hogar, su uso seguramente le costará mucho más barato que el VPS más presupuestario.
Vamos
¿Qué es Serverless en el sentido más común?
No profundizaré en la jungla; los artículos de revisión sobre este tema aparecen regularmente en Habré. Esta es una oportunidad para colocar una función en la nube, en uno de los lenguajes de programación admitidos por la plataforma, para establecer la condición para su funcionamiento, y eso es todo. Cuando ocurre el disparador, el entorno virtual aumenta, la función funciona en él y se apaga. Junto con el medio ambiente.
¿Cuáles son las ventajas de este enfoque?
Seguridad
Obtiene un entorno aislado seguro con la última versión del compilador / intérprete.
En lugar de monitorear actualizaciones para paquetes en un sistema operativo real en la máquina virtual y configurar políticas de seguridad y un firewall, carga el programa en el servidor y funciona.
Estabilidad y resistencia
En lugar de configurar pm2, configurar una política de reinicio, monitorear una pérdida de memoria y comprender los matices de la implementación: sí, simplemente carga el programa en el servidor y el proveedor de servicios se encarga del resto.
Precio, especialmente en el hogar de proyectos de baja carga.
Al cargar, se tiene en cuenta la cantidad de memoria reservada para la función durante su ejecución y el número de llamadas. De acuerdo con la documentación, 10,000,000 lanzamientos de funciones, ejecutando 800ms con un límite de memoria de 512 MB, costarán 3,900 rublos.
¿Qué significa esto para mí? Mi proyecto típico de mascotas es un bot que responde preguntas programadas para un evento bien conocido en círculos estrechos. Debe ejecutarlo una vez al año, durante varios días. El año pasado, respondió 1000 solicitudes de los participantes, 128mb es más que suficiente para él, el tiempo de ejecución de la función es de 300ms. Tal caso de uso costará 0.046₽ .
Sí, 4.6 kopeks. Además, no pasaré tiempo en la configuración, lo cual es aún más agradable. No hay reglas para pm2, no hay actualización del Dockerfile o el entorno, y una guinda al pastel: SLA 99.9.
De las tareas no resueltas hasta ahora (pero, supongo, esto es cuestión de tiempo): la vinculación de dominios externos, así como el ajuste fino de los métodos http que sirven como desencadenante de la función. Ahora el disparador http se dispara en cualquiera de las solicitudes DELETE, GET, HEAD, OPTIONS, PATCH, POST o PUT para un punto de entrada generado automáticamente como https://functions.yandexcloud.net/xxxxxxxxxxxxxxxx .
De las buenas noticias, este es un https completo que cumple con todos los requisitos de Telegram para trabajar con API a través de webHooks. Pero AWS Lambda tiene complementos en forma de API Gateway, y la configuración del disparador en sí es más amplia si la necesita.
Una limitación obvia del enfoque sin servidor en sí, independientemente de la plataforma: debe usar exactamente lo que ofrecen. No puede escribir código en lenguajes de programación no compatibles ni utilizar parámetros de compilación / interpretación no estándar. También puede haber restricciones adicionales diseñadas para proteger a todos los participantes en el proceso de desarrollo.
¿Cómo crear un archivo .js para trabajar en Yandex.Cloud?
Guía breve a través de la interfaz web:
- crear función
- crear un archivo en la interfaz web con cualquier nombre y extensión js
- elija un intérprete - nodejs10 o nodejs12
- en el archivo escribimos una función con un parámetro en exportaciones.miFunción (bueno, en un campo arbitrario en exportaciones)
- indicar el tiempo de espera de la función, RAM (128 MB-1024 MB en incrementos de 128 MB), punto de entrada (nombredearchivo.miFunción)
- hacer pública la función
Una función escrita en un archivo puede:
Obtenga los datos de la solicitud http a través del parámetro de entrada:
la función no recibe la solicitud en su forma pura y, por supuesto, no controla el progreso de la solicitud; recibe en su único parámetro un objeto con información sobre la solicitud:
{ "httpMethod": "< HTTP >", "headers": "< HTTP->", "multiValueHeaders": "< HTTP->", "queryStringParameters": "< queryString->", "multiValueQueryStringParameters": "< queryString->", "requestContext": "< >", "body": "< >", "isBase64Encoded": <true false> }
Responder a la solicitud http
de acuerdo con la documentación :
{ "statusCode": <HTTP >, "headers": "< HTTP->", "multiValueHeaders": "< HTTP->", "body": "< >", "isBase64Encoded": <true false> }
Entonces, algo viernes, inútil
Primero, mire lo que ya se ha escrito antes: implementaciones de tales bots para el vagón y el pequeño trole de AWS Lambda.
Tienen un problema: para no reinventar la rueda y proporcionar una interfaz familiar, todas estas implementaciones, una vez recibida la solicitud, inician una publicación en el servidor de la API de Telegram. Pero puedes hacerlo más fácil.
Como puede ver en KDPV, y la cita al comienzo de la publicación, cuando trabaja a través de webHook, Telegram escucha la respuesta a su mensaje de actualización para comprender si fue procesado por nuestro bot. Además, está listo para aceptar el mensaje como parte de la misma respuesta.
Según la documentación, la respuesta debe contener solo una función (marcada sendMessage y sendPhoto ). Para muchos proyectos esto será suficiente.
Seguiremos las tradiciones y daremos saludos a Habrovchanam:
exports.input = function (data){ let body = JSON.parse(data.body); let answer = { "method":"sendMessage", "chat_id": body.message.chat.id, "reply_to_message_id" : body.message.message_id, "text" : ", Habr!" }; return { "statusCode": 200, "headers": { 'Content-Type': 'application/json' }, "body": JSON.stringify(answer), "isBase64Encoded": false } }
Establezca la configuración al mínimo:

Y dile a Telegram que usaremos webHook:
curl -F "url=https://functions.yandexcloud.net/{secret_function_id}" https://api.telegram.org/bot{secret_bot_key}/setWebhook
Eso es todo. El bot está funcionando.

Puedes chatear con él: @YandexServerlessBot
Todo lo anterior en una imagen Para resumir: en algunos casos, sin servidor es extremadamente barato, conveniente y ahorra mucho tiempo, y cualquier documentación debe leerse cuidadosamente: entonces puede sorprender gratamente.
Si está interesado, bienvenido a la documentación de Yandex Cloud Functions, hay muchas cosas interesantes, desde la integración con otros servicios en la nube hasta depuración, horarios de carga, etc.
El video de la conferencia también está disponible en YouTube .
UPD : Como lo han demostrado más investigaciones (gracias a IRT por la sugerencia), se puede acceder a los servidores tg sin tales trucos, por lo que puede usar de manera segura las solicitudes de API tradicionales.