Telegram bot yozgan har bir dasturchi ertami-kechmi bitta savolga duch keladi: bot foydalanuvchi xabarlarini qanday qabul qilishi kerak? Telegram Bot API buning uchun ikki yo'l taklif qiladi. Birinchisi polling, ya'ni botning o'zi Telegram serveridan "yangi xabar bormi?" deb so'rab turishi. Ikkinchisi webhook, bunda Telegram har bir yangi xabarni o'zi sizning serveringizdagi manzilga yuboradi. Ikkala usul ham ishonchli, lekin ular serverga, tarmoqqa va dastur arxitekturasiga turlicha talab qo'yadi.
Polling qanday ishlaydi
Polling usulida bot getUpdates metodini muntazam chaqiradi. Amalda deyarli barcha kutubxonalar long polling'dan foydalanadi: so'rov timeout parametri bilan yuboriladi va Telegram yangi xabar kelguncha yoki vaqt tugaguncha javobni ushlab turadi. Shu tufayli bot sekundiga yuzlab bo'sh so'rov yubormaydi, xabarlar esa deyarli darhol yetib keladi. Har bir javobdan keyin bot offset qiymatini oshiradi, shunda bir xabar ikki marta qayta ishlanmaydi.
curl "https://api.telegram.org/bot<TOKEN>/getUpdates?timeout=30&offset=0"
Pollingning eng katta afzalligi soddaligi. Botga ochiq IP manzil, domen yoki SSL sertifikati kerak emas, u hatto ofisdagi kompyuterda yoki NAT ortidagi serverda ham ishlaydi. Shuning uchun ishlab chiqish bosqichida va kichik botlarda polling eng qulay tanlov. Kamchiligi shundaki, bot jarayoni doimiy ishlab turishi kerak: agar u to'xtasa, xabarlar Telegram tomonida navbatda yig'ilib qoladi va bot qayta ishga tushgandagina qayta ishlanadi.
Webhook qanday ishlaydi
Webhook usulida siz Telegram'ga bitta HTTPS manzilni ro'yxatdan o'tkazasiz, masalan https://bot.example.uz/tg/webhook. Shundan keyin har bir yangilanish shu manzilga POST so'rovi sifatida JSON ko'rinishida keladi. Bot doimiy so'rov yuborib turmaydi, u oddiy veb-ilova kabi faqat kelgan so'rovga javob beradi. Bu ko'p foydalanuvchili botlarda resursni tejaydi va bir nechta server nusxasini yuklama muvozanatlagich ortida ishlatish imkonini beradi.
Webhook'ning o'z talablari bor. Manzil HTTPS bo'lishi shart va Telegram rasmiy hujjatlariga ko'ra faqat 443, 80, 88 yoki 8443 portlari qo'llab-quvvatlanadi. Sertifikat ishonchli markaz tomonidan berilgan bo'lishi kerak; Let's Encrypt sertifikati bunga to'liq mos keladi. O'z-o'zidan imzolangan sertifikat ham ishlatilishi mumkin, lekin bu holda uni setWebhook chaqirig'ida alohida yuklash talab etiladi.
curl -F "url=https://bot.example.uz/tg/webhook" \
-F "secret_token=uzun-tasodifiy-satr" \
-F "drop_pending_updates=true" \
"https://api.telegram.org/bot<TOKEN>/setWebhook"
curl "https://api.telegram.org/bot<TOKEN>/getWebhookInfo"
Xavfsizlik: secret_token va maxfiy yo'l
Webhook manzili internetda ochiq turadi, shuning uchun unga istalgan odam soxta so'rov yuborishi mumkin. Buning oldini olish uchun setWebhook chaqirig'ida secret_token parametrini bering. Shundan keyin Telegram har bir so'rovga X-Telegram-Bot-Api-Secret-Token sarlavhasini qo'shadi va bot faqat shu sarlavha to'g'ri bo'lgan so'rovlarni qabul qilishi kerak. Qo'shimcha ehtiyot chorasi sifatida manzil yo'lini taxmin qilib bo'lmaydigan qilib tanlash ham foydali.
Bot tokenini hech qachon ochiq repozitoriyga, mijoz tomonidagi JavaScript kodiga yoki skrinshotlarga qo'ymang. Agar token tasodifan oshkor bo'lib qolsa, uni darhol BotFather orqali yangilang: eski token bekor qilinadi va unga ega bo'lgan begona odam botingizni boshqara olmaydi.
Real misol: o'quv markazi uchun yozilish boti
Toshkentdagi bir o'quv markazi kurslarga yozilish uchun bot ishga tushirmoqchi deylik. Dastlab bot dasturchining noutbukida polling bilan sinovdan o'tkaziladi, chunki bu bosqichda domen va sertifikat bilan ovora bo'lishga hojat yo'q. Bot ishga tushgach, markaz uni saytdagi ariza formasi bilan bog'lamoqchi bo'ladi va bot bot.example.uz subdomeniga ko'chiriladi. Bu bosqichda webhook qulayroq: Nginx 443-portda so'rovlarni qabul qilib, ichki portdagi bot jarayoniga uzatadi.
location /tg/webhook {
proxy_pass http://127.0.0.1:8081;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
Agar bot sayt bilan bir serverda joylashsa va sayt allaqachon HTTPS orqali ishlayotgan bo'lsa, webhook uchun alohida sertifikat olish shart emas. sayt.uz hostingida subdomen uchun ham bepul Let's Encrypt sertifikati avtomatik yangilanib turadi, shuning uchun sertifikat muddati tugab, webhook to'satdan to'xtab qolish xavfi kamayadi.
Ko'p uchraydigan xatolar
Eng mashhur muammo ikki usulni aralashtirib yuborish. Webhook o'rnatilgan bo'lsa, getUpdates chaqiruvi 409 Conflict xatosini qaytaradi. Polling'ga qaytish uchun avval deleteWebhook metodini chaqirish kerak. Xuddi shu tarzda bitta token bilan ikkita polling jarayonini ishga tushirsangiz, ular bir-biriga xalaqit beradi, shuning uchun eski jarayon to'liq to'xtatilganiga ishonch hosil qiling.
getWebhookInfojavobidagilast_error_messagemaydoni webhook nega ishlamayotganini ko'rsatadi: sertifikat xatosi, ulanish vaqti tugashi yoki 5xx javob.pending_update_countqiymati o'sib borsa, Telegram xabarlarni yetkaza olmayapti va ular navbatda turibdi.- Webhook so'roviga tez javob qaytaring. Og'ir ishni, masalan PDF yaratish yoki tashqi API chaqiruvini, navbatga yoki fon vazifasiga o'tkazing.
Qaysi birini tanlash kerak
Agar botingiz kichik bo'lsa, oddiy VPS yoki uy serverida ishlasa va ochiq HTTPS manzilingiz bo'lmasa, polling bilan boshlang. Agar bot ko'p foydalanuvchiga xizmat qilsa, mavjud veb-ilova ichida ishlasa yoki bir nechta server nusxasida ishlatilishi kerak bo'lsa, webhook to'g'ri yo'l. Shuni ham hisobga olingki, PHP asosidagi oddiy hostingda doimiy jarayonni ushlab turish odatda imkonsiz, lekin webhook so'rovlari oddiy PHP skript orqali bemalol qayta ishlanadi. Ko'p jamoalar ishlab chiqishda polling, production'da esa webhook ishlatadi va zamonaviy kutubxonalar ikkala rejim o'rtasida o'tishni bir necha qator kod bilan hal qiladi.