"Setiap kali Anda menerima pembaruan webhook, Anda memiliki dua opsi"Dari
Telegram Bot Api Faq
Halo, Habr!
Untuk waktu yang lama, konsep tanpa server (atau lebih tepatnya, penerapannya sebagai layanan AWS Lambda) bagi saya adalah ide yang relatif jelas, tetapi sangat abstrak. Dia sering terdengar di Radio-T, diskusi tentang reddit, tetapi tidak pernah memasuki hidupku. Proyek yang bekerja tidak hidup di awan, tetapi proyek rumah - mengapa? Komputer virtual semakin murah, Docker telah dikuasai, dan semuanya berfungsi dengan baik.
Tetapi presentasi Fungsi Yandex Cloud, dan khususnya harga yang diumumkan untuk layanan ini, memberikan makanan baru untuk dipikirkan.
TL; DR - pada Jumat malam yang hujan kami akan menulis bot Telegram sederhana dalam javascript yang dapat menanggapi permintaan dengan pesan sederhana. Jika ini adalah proyek rumah Anda - penggunaannya hampir pasti akan jauh lebih murah daripada VPS paling murah.
Ayo pergi.
Apa Serverless dalam arti paling umum?
Saya tidak akan pergi jauh ke dalam hutan, ulasan artikel tentang topik ini secara teratur muncul di Habré. Ini adalah kesempatan untuk menempatkan fungsi di cloud, di salah satu bahasa pemrograman yang didukung oleh platform, untuk menetapkan kondisi untuk operasinya - dan itu saja. Ketika pemicu terjadi, lingkungan virtual naik, fungsi berfungsi di dalamnya, dan mati. Bersama dengan lingkungan.
Apa kelebihan dari pendekatan ini?
Keamanan
Anda mendapatkan lingkungan terisolasi yang aman dengan kompiler / juru bahasa versi terbaru.
Alih-alih memantau pembaruan untuk paket pada OS nyata di Mesin Virtual dan mengatur kebijakan keamanan dan firewall, Anda mengunggah program ke server dan berfungsi.
Stabilitas dan ketahanan
Alih-alih mengkonfigurasi pm2, mengatur kebijakan reboot, memantau kebocoran memori dan memahami nuansa penyebaran - ya, Anda cukup mengunggah program ke server, dan penyedia layanan mengurus sisanya.
Harga, terutama di rumah proyek-proyek berbiaya rendah
Saat mengisi daya, jumlah memori yang disediakan untuk fungsi selama eksekusi dan jumlah panggilan diperhitungkan. Menurut dokumentasi, 10.000.000 peluncuran fungsi, menjalankan 800ms dengan batas memori 512 MB, akan menelan biaya 3.900 rubel.
Apa artinya ini bagi saya? Proyek peliharaan saya yang khas adalah bot yang menjawab pertanyaan terjadwal untuk acara yang terkenal di kalangan sempit. Anda perlu menjalankannya setahun sekali, selama beberapa hari. Tahun lalu, ia menjawab 1000 permintaan dari peserta, 128mb lebih dari cukup baginya, waktu pelaksanaan fungsi adalah 300ms. Kasing seperti itu akan dikenakan biaya 0,046₽ .
Ya, 4,6 kopecks. Plus, saya tidak akan menghabiskan waktu untuk pengaturan, yang bahkan lebih menyenangkan. Tidak ada aturan untuk PM2, tidak ada aktualisasi Dockerfile atau lingkungan, dan ceri pada kue - SLA 99.9.
Dari tugas-tugas yang belum terpecahkan sejauh ini (tapi, saya kira, ini adalah masalah waktu) - pengikatan domain eksternal, serta penyempurnaan metode http yang berfungsi sebagai pemicu untuk fungsi tersebut. Sekarang memicu http memicu permintaan DELETE, GET, HEAD, OPTCH, PATCH, POST atau PUT untuk titik masuk yang dibuat secara otomatis seperti https://functions.yandexcloud.net/xxxxxxxxxxxxxxxx .
Dari kabar baiknya, ini adalah https lengkap yang memenuhi semua persyaratan Telegram untuk bekerja dengan api melalui webHooks. Tetapi AWS Lambda memiliki add-on dalam bentuk API Gateway, dan pengaturan pemicu itu sendiri lebih luas jika Anda membutuhkannya.
Keterbatasan yang jelas dari pendekatan serverless itu sendiri, terlepas dari platform - Anda harus menggunakan apa yang mereka berikan. Anda tidak dapat menulis kode dalam bahasa pemrograman yang tidak didukung atau menggunakan parameter kompiler / juru bahasa yang tidak standar. Mungkin juga ada batasan tambahan yang dirancang untuk melindungi semua peserta dalam proses pengembangan.
Bagaimana cara membuat file .js agar berfungsi di Yandex.Cloud?
Panduan singkat melalui antarmuka web:
- buat Function
- buat file di antarmuka web dengan nama dan ekstensi js
- pilih penerjemah - nodejs10 atau nodejs12
- dalam file kita menulis fungsi dengan satu parameter di exports.myFunction (well, dalam bidang arbitrer dalam ekspor)
- menunjukkan batas waktu fungsi, RAM (128MB-1024MB dengan peningkatan 128MB), titik masuk (nama file.fungsi saya)
- membuat fungsi publik
Fungsi yang ditulis dalam file dapat:
Dapatkan data permintaan http melalui parameter input:
fungsi tidak menerima permintaan dalam bentuknya yang murni, dan tentu saja tidak mengontrol kemajuan permintaan - ia menerima hanya parameternya objek dengan informasi tentang permintaan:
{ "httpMethod": "< HTTP >", "headers": "< HTTP->", "multiValueHeaders": "< HTTP->", "queryStringParameters": "< queryString->", "multiValueQueryStringParameters": "< queryString->", "requestContext": "< >", "body": "< >", "isBase64Encoded": <true false> }
Membalas permintaan http
sesuai dengan dokumentasi :
{ "statusCode": <HTTP >, "headers": "< HTTP->", "multiValueHeaders": "< HTTP->", "body": "< >", "isBase64Encoded": <true false> }
Jadi, sesuatu hari Jumat, tidak berguna
Pertama, lihat apa yang sudah ditulis di depan kita - implementasi bot seperti itu untuk gerobak AWS Lambda dan troli kecil .
Mereka memiliki satu masalah - agar tidak menemukan kembali roda, dan untuk menyediakan antarmuka yang akrab, semua implementasi ini, setelah menerima permintaan, memulai posting ke server api telegram. Tetapi Anda dapat melakukannya dengan lebih mudah.
Seperti yang dapat Anda lihat di KDPV, dan kutipan di awal posting - ketika bekerja melalui webHook, telegram mendengarkan respons terhadap pesan pembaruannya untuk memahami apakah itu diproses oleh bot kami. Selain itu, ia siap menerima pesan sebagai bagian dari jawaban yang sama.
Menurut dokumentasi, jawabannya harus hanya berisi satu fungsi (memeriksa sendMessage dan sendPhoto ). Bagi banyak proyek ini sudah cukup.
Kami akan mengikuti tradisi dan memberi salam kepada 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 } }
Atur pengaturan ke minimum:

Dan beri tahu Telegram bahwa kita akan menggunakan webHook:
curl -F "url=https://functions.yandexcloud.net/{secret_function_id}" https://api.telegram.org/bot{secret_bot_key}/setWebhook
Itu saja. Bot bekerja.

Anda dapat mengobrol dengannya: @YandexServerlessBot
Semua hal di atas dalam satu gambar Untuk meringkas - dalam beberapa kasus serverless sangat murah, nyaman, dan menghemat banyak waktu, dan dokumentasi apa pun harus dibaca dengan hati-hati: maka itu akan sangat mengejutkan.
Jika Anda tertarik, selamat datang di dokumentasi Yandex Cloud Functions, ada banyak hal menarik, mulai dari integrasi dengan layanan cloud lainnya hingga debug, jadwal muat, dll.
Video konferensi juga tersedia di YouTube .
UPD : Seperti penelitian lebih lanjut telah menunjukkan (terima kasih kepada IRT untuk tipnya), server tg dapat diakses tanpa trik seperti itu, sehingga Anda dapat menggunakan permintaan api tradisional dengan aman.