🤖
Хостинг

Telegram бот: webhook ёки поллинг — қайси бирини танлаш керак

08.11.2026
← Барча мақолалар

Telegram бот ёзган ҳар бир дастурчи эртами-кечми битта саволга дуч келади: бот фойдаланувчи хабарларини қандай қабул қилиши керак? Telegram Bot API бунинг учун икки йўл таклиф қилади. Биринчиси поллинг, яъни ботнинг ўзи Telegram серверидан "янги хабар борми?" деб сўраб туриши. Иккинчиси webhook, бунда Telegram ҳар бир янги хабарни ўзи сизнинг серверингиздаги манзилга юборади. Иккала усул ҳам ишончли, лекин улар серверга, тармоққа ва дастур архитектурасига турлича талаб қўяди.

Поллинг қандай ишлайди

Поллинг усулида бот getUpdates методини мунтазам чақиради. Амалда деярли барча кутубхоналар long polling'дан фойдаланади: сўров timeout параметри билан юборилади ва Telegram янги хабар келгунча ёки вақт тугагунча жавобни ушлаб туради. Шу туфайли бот секундига юзлаб бўш сўров юбормайди, хабарлар эса деярли дарҳол етиб келади. Ҳар бир жавобдан кейин бот offset қийматини оширади, шунда бир хабар икки марта қайта ишланмайди.

curl "https://api.telegram.org/bot<TOKEN>/getUpdates?timeout=30&offset=0"

Поллингнинг энг катта афзаллиги соддалиги. Ботга очиқ IP манзил, домен ёки SSL сертификати керак эмас, у ҳатто офисдаги компьютерда ёки NAT ортидаги серверда ҳам ишлайди. Шунинг учун ишлаб чиқиш босқичида ва кичик ботларда поллинг энг қулай танлов. Камчилиги шундаки, бот жараёни доимий ишлаб туриши керак: агар у тўхтаса, хабарлар Telegram томонида навбатда йиғилиб қолади ва бот қайта ишга тушгандагина қайта ишланади.

Webhook қандай ишлайди

Webhook усулида сиз Telegram'га битта HTTPS манзилни рўйхатдан ўтказасиз, масалан https://bot.example.uz/tg/webhook. Шундан кейин ҳар бир янгиланиш шу манзилга POST сўрови сифатида JSON кўринишида келади. Бот доимий сўров юбориб турмайди, у оддий веб-илова каби фақат келган сўровга жавоб беради. Бу кўп фойдаланувчили ботларда ресурсни тежайди ва бир нечта сервер нусхасини юклама мувозанатлагич ортида ишлатиш имконини беради.

Webhook'нинг ўз талаблари бор. Манзил HTTPS бўлиши шарт ва Telegram расмий ҳужжатларига кўра фақат 443, 80, 88 ёки 8443 портлари қўллаб-қувватланади. Сертификат ишончли марказ томонидан берилган бўлиши керак; Let's Encrypt сертификати бунга тўлиқ мос келади. Ўз-ўзидан имзоланган сертификат ҳам ишлатилиши мумкин, лекин бу ҳолда уни setWebhook чақириғида алоҳида юклаш талаб этилади.

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"

Хавфсизлик: secret_token ва махфий йўл

Webhook манзили интернетда очиқ туради, шунинг учун унга исталган одам сохта сўров юбориши мумкин. Бунинг олдини олиш учун setWebhook чақириғида secret_token параметрини беринг. Шундан кейин Telegram ҳар бир сўровга X-Telegram-Bot-Api-Secret-Token сарлавҳасини қўшади ва бот фақат шу сарлавҳа тўғри бўлган сўровларни қабул қилиши керак. Қўшимча эҳтиёт чораси сифатида манзил йўлини тахмин қилиб бўлмайдиган қилиб танлаш ҳам фойдали.

Бот токенини ҳеч қачон очиқ репозиторийга, мижоз томонидаги JavaScript кодига ёки скриншотларга қўйманг. Агар токен тасодифан ошкор бўлиб қолса, уни дарҳол BotFather орқали янгиланг: эски токен бекор қилинади ва унга эга бўлган бегона одам ботингизни бошқара олмайди.

Реал мисол: ўқув маркази учун ёзилиш боти

Тошкентдаги бир ўқув маркази курсларга ёзилиш учун бот ишга туширмоқчи дейлик. Дастлаб бот дастурчининг ноутбукида поллинг билан синовдан ўтказилади, чунки бу босқичда домен ва сертификат билан овора бўлишга ҳожат йўқ. Бот ишга тушгач, марказ уни сайтдаги ариза формаси билан боғламоқчи бўлади ва бот bot.example.uz субдоменига кўчирилади. Бу босқичда webhook қулайроқ: Nginx 443-портда сўровларни қабул қилиб, ички портдаги бот жараёнига узатади.

location /tg/webhook {
    proxy_pass http://127.0.0.1:8081;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

Агар бот сайт билан бир серверда жойлашса ва сайт аллақачон HTTPS орқали ишлаётган бўлса, webhook учун алоҳида сертификат олиш шарт эмас. sayt.uz хостингида субдомен учун ҳам бепул Let's Encrypt сертификати автоматик янгиланиб туради, шунинг учун сертификат муддати тугаб, webhook тўсатдан тўхтаб қолиш хавфи камаяди.

Кўп учрайдиган хатолар

Энг машҳур муаммо икки усулни аралаштириб юбориш. Webhook ўрнатилган бўлса, getUpdates чақируви 409 Conflict хатосини қайтаради. Поллингга қайтиш учун аввал deleteWebhook методини чақириш керак. Худди шу тарзда битта токен билан иккита поллинг жараёнини ишга туширсангиз, улар бир-бирига халақит беради, шунинг учун эски жараён тўлиқ тўхтатилганига ишонч ҳосил қилинг.

Қайси бирини танлаш керак

Агар ботингиз кичик бўлса, оддий VPS ёки уй серверида ишласа ва очиқ HTTPS манзилингиз бўлмаса, поллинг билан бошланг. Агар бот кўп фойдаланувчига хизмат қилса, мавжуд веб-илова ичида ишласа ёки бир нечта сервер нусхасида ишлатилиши керак бўлса, webhook тўғри йўл. Шуни ҳам ҳисобга олингки, PHP асосидаги оддий хостингда доимий жараённи ушлаб туриш одатда имконсиз, лекин webhook сўровлари оддий PHP скрипт орқали бемалол қайта ишланади. Кўп жамоалар ишлаб чиқишда поллинг, production'да эса webhook ишлатади ва замонавий кутубхоналар иккала режим ўртасида ўтишни бир неча қатор код билан ҳал қилади.

Ўхшаш мақолалар

💽 Диск тўлди: 500 хато, бузилган .htaccess ва базани тиклаш 🍃 MongoDB: Atlas булут хизмати ёки ўз серверингиз — қайси бирини танлаш керак 🗄️ Nginx'да статик файлларни кешлаш: Cache-Control, expires ва версиялаш 🐘 PostgreSQL базани хостингда яратиш ва сайтга улаш
🌐 Тил
🇺🇿 O'zbek 🇺🇿 Ўзбек ✓ 🇷🇺 Русский 🇬🇧 English