Pythonda Telegram bot yaratamiz
Namuna yoki mavjud algoritmdan foydalangan holda robotni yaratib bo’lgan tanib bo’lmaydigan foydalanuvchilar, yordamchi ishlashni to’xtatganda ko’pincha vaziyatga duch kelishadi.
Webhook-da Telegram uchun botni qanday yaratish mumkin
Telegram-botlar tezda abonentlar hayotiga kirdi. Ularni Webhooks-da yaratish, ilgari ishlatilgan getUpdates usulidan afzalroqdir. Bu birinchi navbatda doimiy aloqaning mavjudligi bilan bog’liq. Usul amalga oshirishning turli usullariga ega, tushunish oson, ishonchli.
- 1 Botlar nima uchun kerak?
- 2 Ulardan qanday foydalanish
- 3 Bot toifalari
- 4 WebHooks nima?
- 5 Qanday sozlanadi
- 6 Veb-hook-da botni qanday ro’yxatdan o’tkazish kerak
- 7 Agar bot ishlamasa nima qilish kerak
- 8 topilmalar
Botlar nima uchun kerak?
Robotlar – bu tezkor messenjer foydalanuvchilarining hayotini sezilarli darajada soddalashtiradigan bir qator funktsiyalarga ega bo’lgan kichik dasturlar. Qo’llash doirasi keng. Ular yangiliklar olishlari, audio, video qidirishlari, qimmatli qog’ozlar savdosi, valyuta kurslarini kuzatishlari mumkin.
Bota api-ning asosiy vazifasi kiruvchi buyruqqa tirik odamning harakatlarini taqlid qilib javob berishdir.
Ulardan qanday foydalanish
Webhooks bot algoritmini tushunish oson.
Odam va robot o’rtasidagi o’zaro ta’sir ketma-ket buyruqlar orqali amalga oshiriladi:
- Abonent buyruq yozadi.
- Robot ishlov beradi va uni serverga yuboradi.
- Buyruq ishlov beriladi va javob sifatida qaytariladi.
- Bot uni ekranda namoyish etadi.
Ushbu ketma-ketlik har safar Telegram botiga murojaat qilganingizda takrorlanadi.
Bot toifalari
Telegram-da ishlatiladigan botlar umumiy ko’rinishga ega. Ularning oddiy profillardan yagona farqi – ismning oxirida “bot” prefiksi mavjudligi.
Mavjud yordamchilar quyidagi turlarga bo’linadi.
- O’yin.
- Yordamchilar.
- Chat botlari.
- Informatorlar.
WebHooks nima?
Webhooks – bu real vaqt rejimida individual voqealarni kuzatish usuli. ESputnik tomonidan ishlaydi. WebHook sizdan qo’shimcha so’rovlarisiz barcha aloqa faoliyati to’g’risida ma’lumotlarni etkazib beradi. Olingan ma’lumotlar muntazam ravishda belgilangan POST URL manziliga yuboriladi.
Qanday sozlanadi
Telegram Webhook-ni sozlash juda murakkab jarayon.
U quyidagi ketma-ketlikda bajariladi:
- Node.js dasturini o’rnating, yangi loyiha yarating.
- Kerakli fayllar va bog’liqliklarni yaratish uchun siz quyidagi buyruqni ro’yxatdan o’tkazishingiz kerak: https://ibb.co/Zgx0FM2.
- Agar hamma narsa to’g’ri bo’lsa, setWebhook katalogi quyidagicha ko’rinadi: https://ibb.co/sVHcttC.
- Index.js faylida yozing: https://ibb.co/V2Y9kch.
- Index.js faylida yozing: https://ibb.co/VJJnvq6.
- Veb-aloqani tekshirishni yarating. Quyidagi kodni qo’shing: https://ibb.co/2hsrk8m.
Ushbu kod Webhook-ni messenjer platformasida sinovdan o’tkazishga imkon beradi, bu esa Webhook Telegram botining faoliyati va haqiqiyligini tasdiqlaydi.
Veb-hook-da botni qanday ro’yxatdan o’tkazish kerak
Webhooks-da Telegram uchun yordamchini yaratish oddiy robotni yaratish jarayonidan biroz farq qiladi. U o’zi imzolagan sertifikatlar yordamida tuzilgan.
To’g’ri kalit va o’z-o’zidan imzolangan sertifikat.
Operatsiyalar ma’lum bir ketma-ketlikka ega:
- OpenSSl paketini o’rnating.
- To’g’ri kalit va o’z-o’zidan imzolangan sertifikatni yarating.
- Umumiy nomni kiritish so’ralganda, siz server manzilini kiritishingiz kerak: https://ibb.co/GpDF2dy.
- Biz sertifikatlar katalogiga o’tamiz, bot.py va config.py-ni yaratamiz.
- Ikkinchi katalogda biz bot token o’zgaruvchisini yozamiz.
- Bot.py-ni oching, ikkita kutubxonani import qiling.
- Biz robotning quyidagi namunasini yaratamiz: https://ibb.co/zJQ9Jb0.
- Biz veb-serverni amalga oshiramiz: https://ibb.co/k578dNR.
- Oldindan imzolangan sertifikat va qaytish manzilini serverga yuboramiz: https://ibb.co/qCfc4vR.
- Uning parametrlarini belgilang, ishga tushiring: https://ibb.co/rsntJMR.
- Biz bot Telegram setWebhook-ni ishga tushiramiz, uni faollashtiramiz, bir nechta xabarlarni yuboramiz: https://ibb.co/dKQ6HpQ.
- Biz ochilgan oynaga qaraymiz. Agar status kodi 200 bo’lsa, unda hamma narsa yaxshi, yordamchi xabar oldi va u ishlaydi.
Agar bot ishlamasa nima qilish kerak
Namuna yoki mavjud algoritmdan foydalangan holda robotni yaratib bo’lgan tanib bo’lmaydigan foydalanuvchilar, yordamchi ishlashni to’xtatganda ko’pincha vaziyatga duch kelishadi.
Telegramda yoki boshqa dasturlash tillarida Webhook Python bilan bog’liq har qanday muammolar uchun siz ushbu tavsiyalarga amal qilishingiz kerak:
- @ Robotga buyruq bering. Bu mavjud texnologik muammolardan xalos bo’lishga imkon beradi. Agar kerak bo’lsa, yangi sobit bot yaratiladi.
- Suhbatni faollashtirish uchun / maxfiylikni yozing. Robotingiz manzilini kiriting, javobni kuting. U mavjud xatolar ro’yxatini tayyorlaydi, ularni tuzatish usullarini ko’rsatib beradi.
- Agar siz bot ishlayotganini ko’rsangiz va chat javob bermasa – qo’llab-quvvatlash xizmatiga murojaat qiling.
- Agar siz yaratgan yordamchi ishlamayotgan bo’lsa – kodda xatolikni qidiring.
topilmalar
Ko’rib turganingizdek, Webhooks usulidan foydalanib Telegram uchun bot yaratish – bu juda ehtiyotkorlik talab qiladigan murakkab emas, ammo aniq jarayon. Yuqoridagi ko’rsatmalar ushbu muammoni tushunishga yordam beradi. O’zingizning yordamchingizni yaratish jarayoni yarim soat davom etadi va hech qanday qiyinchiliklarga olib kelmaydi.
Pythonda Telegram bot yaratamiz
Pythonda Telegram bot yaratamiz
1. Bu qanday bot bo’ladi?
Bugun yaratmoqchi bo’lgan botimiz www.worldometers.info/coronavirus saytidan aynan biz
kiritgan davlatlar to’g’risidagi ma’lumotlarni oladi va bizga yuboradi va bularning
bari Telegram messenjerida sodir bo’ladi.
2. Kerakli modullarni o’rnatamiz
Bizga TelegramAPI bilan ishlash uchun pyTelegramBotAPI modulidan foydalanamiz. To’g’ri,
agar bundan avval python bilan ishlaganlar bo’lsa bilishadiki, bundan ham yaxshiroq modullar
mavjud. Lekin pyTelegramBotAPI modulining afzalliklari u Telegram APIsidan to’liq foydalana oladi
va u yetarlicha soddadir.
Ikkinchi modulimiz esa COVID-19-Cases deb nomlanadi va aynan shu
mudulimiz www.worldometers.info/coronavirus saytidan bizga kerakli bo’lgan
ma’lumotlarni parsing qiladi, ya’ni bizga massiv ko’rinishida olib beradi va biz ularni o’z kodimizda
qo’llaymiz. Bu modullarni o’rnatish uchun pip paket menejeridan foydalanamiz. Windows konsolida
quyidagi buyruqlarni kiritamiz:
pip install COVID-19-Cases # COVID-19-Cases modulini o’rnatish uchun
pip install pyTelegramBotAPI # pyTelegramBotAPI modulini o’rnatish uchun
buyrug’larni kiritgandan so’ng, enter tugmasini bosamiz va yuklashning tugashini kutamiz.
3. Telegram bot tokenini olamiz
Telegram messenjerida botlar yaratish uchun maxsus bot ya’ni @BotFather yaratilgan bo’lib, u
yordamida botlar va telegram o’yinlarini yaratish mumkin.
Biz ham bo’lajak botimizning tokenini shu yerdan olamiz.
Telegram dasturida “qidiruv” bo’limida @BotFather deb yozamiz va birinchi bo’lib topilgan botni
ishga tushiramiz.
Botga /newbot buyrug’ini yuboramiz va sizga bot nomini kiritishni so’raydi. Bunda istalgan nomni
tanlashingiz mumkin (probellar qo’yish mumkin).
So’ngra bot sizdan yaratmoqchi bo’lgan botingizning nikenamesini so’raydi. Bunda probelni ishlatish,
ya’ni joy tashlash mumkin emas va nikename oxiri bot so’zi bilan tugashi lozim. Takrorlanmagan
nomni tanlagandan so’ng @BotFather sizga yaratilgan botning adresini va tokenini yuboradi va bu
quyidagi suratdagidek bo’ladi:
2.
Shundan so’ng kompyuterda istalgan katalogda main.py (boshqa nom bersa ham bo’ladi) faylini
yaratib uni istalgan text editorida ochamiz va kodni yozishni boshlaymiz.
4. Kodni yozishni boshlaymiz
Sizga tushunarli bo’lishi uchun kodni satrma-satr tushuntirib ketaman.
Birinchi bo’lib barcha kerakli modullarni kodga ulaymiz:
import telebot # pyTelegramBotAPI modulini ulaymiz
import covid19cases as covid # COVID-19-Cases modulini covid nomi bilan
ulaymiz
Modullar ulangach botimizga ulanamiz. Bu uchun:
bot = telebot.TeleBot(‘TOKEN’)
deb yozamiz va albatta TOKEN
o’rniga @BotFather dan olgan tokeningizni qo’yasiz.
3.
Endi foydalanuvchi botni ishga tushirganda, ya’ni /start buyrug’i berilganda botning bajarishi kerak
bo’lgan vazifalarni belgilaymiz. Demak, nima qilamiz:
Biroz qiziqroq qilish uchun bot foydalanuvchiga sticker yuboradi.
Foydalanuvchining nomini yozib, salomlashamiz.
Telegramning maxsus tugmalarini chiqaramiz.
Bunday tugmalarni ishlatish uchun esa TelegramAPIda ko’rsatilgan maxsus metoddan
foydalanamiz, ya’ni:
KeyboardButton() – bu metodni ishlatish uchun pyTelegramBotAPI
modulining maxsus
klassidan, aynan types klassindan foydalanamiz.
Bu klassni ishlatish uchun esa uni birinchi ulash kerak. Bu uchun esa:
from telebot import types
satrini faylning yuqorisiga kiritamiz.
Endi bot /start buyrug’i kiritilganda nima qilishini kod bilan yozamiz.
@bot.message_handler(commands=[‘start’])
# start buyrug’i kiritilganda
def send_welcome(message): # send_welcome() funksiya ishga tushadi
@bot.message_handler(commands=[‘start’])buyrug’i berilganda quyidagi massiv javob
sifatida yuboriladi:
‘message_id’: 1,
‘from_user’: ‘id’: None,
‘is_bot’: False,
‘first_name’: None,
‘username’: None,
‘last_name’: None,
‘language_code’: None>,
‘date’: None,
‘chat’: ‘type’: ‘private’,
‘last_name’: None,
‘first_name’: None,
‘username’: None,
‘id’: None,
‘title’: None,
‘all_members_are_administrators’: None,
‘photo’: None,
‘description’: None,
‘invite_link’: None,
‘pinned_message’: None,
‘sticker_set_name’: None,
‘can_set_sticker_set’: None>,
‘forward_from_chat’: None,
‘forward_from’: None,
‘forward_date’: None,
‘reply_to_message’: None,
‘edit_date’: None,
4.
‘author_signature’: None,
‘text’: ‘/start’,
‘entities’: ‘[]’,
‘caption_entities’: None,
‘audio’: None,
‘document’: None,
‘photo’: None,
‘sticker’: None,
‘video’: None,
‘video_note’: None,
‘voice’: None,
‘caption’: None,
‘contact’: None,
‘location’: None,
‘venue’: None,
‘new_chat_member’: None,
‘new_chat_members’: None,
‘left_chat_member’: None,
‘new_chat_title’: None,
‘new_chat_photo’: None,
‘delete_chat_photo’: None,
‘group_chat_created’: None,
‘supergroup_chat_created’: None,
‘channel_chat_created’: None,
‘migrate_to_chat_id’: None,
‘migrate_from_chat_id’: None,
‘pinned_message’: None,
‘invoice’: None,
‘successful_payment’: None>
send_welcome()funksiyasi ichida esa birinchi navbatda rejadagi stickerni yuboramiz.
Sticker .webpkengaytmasidagi fayl bo’lib uni olish uchun aynan Telegram dasturidan foydalanamiz
va uni open()funksiyasi yordamida stickerni rbhuquqi bilan ya’ni o’qish imkoniyati bilan ochamiz.
sticker = open(‘sticker.webp’, ‘rb’)
TelegramAPIda sticker yuborish funksiyasi:
bot.send_sticker() – deb nomlanadi va u asosan 2 ta argument qabul qiladi.
1. Muloqot olib borilayotgan chatning idsi.
2. Stickerning o’zi. (bu holatda sticker o’zgaruvchisi)
Stickerni yuboramiz:
bot.send_sticker(message.chat.id, sticker)
Endi reja bo’yicha salomlashish matnini yozamiz:
hello_text = “Salom, !\n botiga xush kelibsiz!\nSo’ngi ma’lumotlarni
olish uchun davlatni tanlang”.format(message.from_user.first_name,
bot.get_me().first_name)
5.
Kodning bu qismidagi format()funksiyasining vazifasi, matnda berilgan <0>va o’rniga mos
ravishda message.from_user.first_name
va bot.get_me().first_name
o’zgaruvchilarini joylashtirishdan iboratdir.
So’ngra aynan tugmalarni ulaymiz va aks ettiramiz:
markup = types.ReplyKeyboardMarkup()
itembtna = types.KeyboardButton(‘Aqsh’)
itembtnr = types.KeyboardButton(‘Rossiya’)
itembtnx = types.KeyboardButton(‘Xitoy’)
itembtni = types.KeyboardButton(‘Ispaniya’)
itembtnit = types.KeyboardButton(‘Italiya’)
itembtnu = types.KeyboardButton(‘O\’zbekiston’)
markup.row(itembtna, itembtnx, itembtnr)
markup.row(itembtni, itembtnit, itembtnu)
Bu yerda markup.row(itembtna, itembtnx, itembtnr) vamarkup.row(itembtni,
itembtnit, itembtnu)satrlari yuqorida yaratilgan tugmalarni Ikki qatorga bo’lib joylashtiradi.
Endi matnni yuboramiz va bu uchun send_message()funksiyasidan foydalanamiz. Bu ham
yuqoridagi funksiya kabi asosiy ikkita argument qabul qiladi, ammo bu yerda tugmalar qo’shilgaligi
sabab 3-argument qo’shamiz:
1. Muloqot olib borilayotgan chatning idsi.
2. Stickerning o’zi. (bu holatda sticker o’zgaruvchisi)
3. Tugmalarni o’z ichiga oluvchi o’zgaruvchi(bu holatda markup o’zgaruvchisi)
5. Davlat tanlanganda bot nima qiladi?
Bu vazifani bajarish uchun ham yuqoridagidek yechim qilamiz, ya’ni:
@bot.message_handler(content_types=[“text”])
def get_information(message):
Endi faqat xabarning turiga qaraymiz. Foydalanuvchi yuborgan xabarning turi text – matn turiga
tegishli bo’lganda get_information()funksiyasi ishga tushadi.
get_information()ishga tushganda nimalar qilamiz:
1. Foydalanuvchi qaysi tugmani bosganiga qarab res o’zgaruvchisiga kerakli matnni kiritamiz.
2. res o’zgaruvchisidagi davlat haqidagi ma’lumotlarni COVID-19-Casesmoduli yordamida olib
kerakli o’zgaruvchilarga bo’lamiz.
3. Olingan ma’lumotlarni alohida matnda jamlab foydalanuvchiga yuboramiz.
1-qadamdan boshlaymiz:
Foydalanuvchi yuborgan matnni message.text
o’zgaruvchisida saqlanadi va buni qaysi tugma
bosilganini bilish uchun foydalanamiz.
Yuqoridagi o’zgaruvchini har safar tugmalardan qaysi biridagi matnga tengligini tekshiramiz, agar
birontasiga ham teng bo’lmasa butun dunyodagi bemorlar soni yuboramiz va bu
uchun get_global_cases() funksiyasidan foydalanamiz.
0>
6.
2-qadam:
Aniq bir davlar haqidagi ma’lumot olish uchun esa get_country_cases()funksiyasidan
foydalanamiz va argument sifatida davlarning ingliz tilidagi bosh harf bilan yozilgan nomini beramiz
va bu funksiyalar COVID-19-Casesmoduliga tegishlidir. reso’zgaruvchisiga ma’lumot sifatida
aniqlangan davlat nomi kiritilgan funksiyani beramiz va bu o’zgaruvchi taxminan quyiadgidek
ma’lumotga ega bo’ladi:
res = ‘CountryOrRegion’: ‘Uzbekistan’,
‘TotalCases’: ‘2,453’,
‘NewCases’: ‘+35’,
‘TotalDeaths’: ’10’,
‘NewDeaths’: ‘0’,
‘TotalRecovered’: ‘1,982’,
‘ActiveCases’: ‘461’,
‘Critical’: ‘8’,
‘CasesPerOneMillion’: ’73’,
‘DeathsPerOneMillion’: ‘0.3’,
‘TotalTests’: ‘325,000’,
‘TestsPerOneMillion’: ‘9,710’,
‘Continent’: ‘Asia’,
‘LastUpdated’: ‘May 11, 2020, 11:45 GMT’
>
3-qadam:
So’ngra foydalanuvchiga yuborish uchun matnga bu ma’lumotlarni kiritamiz:
lat = res[‘TotalCases’]
new = res[‘NewCases’]
deth = res[‘TotalDeaths’]
rec = res[‘TotalRecovered’]
text = “Jami kasallanganlar soni: \nBugun aniqlangan bemorlar soni:
\nJami o’limlar soni: \nJami tuzalganlar soni: \nAgarda bu sonlar
ortishini istamasangiz Uyda qoling“.format(lat, new.replace(“+”,
“”), deth, rec)
Bu yerda yuqoridagi res o’zgaruvchidagi ma’lumotlarni ularning nomi bilan boshqa o’zgaruvchilarga
bo’lamiz.
Hammasi tayyor bo’lgach matnni foydalanuvchiga yuboramiz:
bot.send_message(message.chat.id, text, parse_mode=’html’)
va albatta HTML teglarni ham ishlatish imkonini beruvchi parse_mode=’html’lug’atini qo’shamiz.
Eng oxirida esa botni to’xtovsiz ishtalish uchun
bot.polling(none_stop=True)
buyrug’ini beramiz. non_stop=Trueto’xtovsiz ishlashini ta’minlaydi.
Vanihoyat, dasturning barcha bo’laklarni bitta joyga yig’amiz:
import telebot
# connect all modules
from telebot import types
import config
import covid19cases as covid
# connect bot to code
bot = telebot.TeleBot(‘token’)
7.
# check command start
@bot.message_handler(commands=[‘start’])
def send_welcome(message):
# send sticker
sticker = open(‘sticker_three.webp’, ‘rb’)
bot.send_sticker(message.chat.id, sticker)
hello_text = “Salom, !\n botiga xush kelibsiz!\nSo’ngi
ma’lumotlarni olish uchun davlatni
tanlang”.format(message.from_user.first_name, bot.get_me().first_name)
# make keyboard
markup = types.ReplyKeyboardMarkup()
itembtna = types.KeyboardButton(‘Aqsh’)
itembtnr = types.KeyboardButton(‘Rossiya’)
itembtnx = types.KeyboardButton(‘Xitoy’)
itembtni = types.KeyboardButton(‘Ispaniya’)
itembtnit = types.KeyboardButton(‘Italiya’)
itembtnu = types.KeyboardButton(‘O\’zbekiston’)
markup.row(itembtna, itembtnx, itembtnr)
markup.row(itembtni, itembtnit, itembtnu)
bot.send_message(message.chat.id, hello_text, reply_markup=markup)
# check contetn
@bot.message_handler(content_types=[“text”])
def get_information(message):
if message.chat.type == ‘private’:
# check which button selected user
if message.text == ‘Aqsh’:
res = covid.get_country_cases(“USA”)
elif message.text == ‘Ispaniya’:
res = covid.get_country_cases(“Spain”)
elif message.text == ‘Rossiya’:
res = covid.get_country_cases(“Russia”)
elif message.text == ‘O\’zbekiston’:
res = covid.get_country_cases(“Uzbekistan”)
elif message.text == ‘Buyuk Britaniya’:
res = covid.get_country_cases(“UK”)
elif message.text == ‘Italiya’:
res = covid.get_country_cases(“Italy”)
elif message.text == ‘Fransiya’:
res = covid.get_country_cases(“France”)
elif message.text == ‘Germaniya’:
res = covid.get_country_cases(“Germany”)
elif message.text == ‘Turkiya’:
res = covid.get_country_cases(“Turkey”)
elif message.text == ‘Xitoy’:
res = covid.get_country_cases(“China”)
else:
res = covid.get_global_cases()
#send user all text with information
lat = res[‘TotalCases’]
new = res[‘NewCases’]
deth = res[‘TotalDeaths’]
rec = res[‘TotalRecovered’]
text = “Jami kasallanganlar soni: \nBugun aniqlangan bemorlar
soni: \nJami o’limlar soni: \nJami tuzalganlar soni: \nAgarda bu
8.
sonlar ortishini istamasangiz Uyda qoling“.format(lat,
new.replace(“+”, “”), deth, rec)
bot.send_message(message.chat.id, text, parse_mode=’html’)
# run programm non-stop
bot.polling(none_stop=True)
# Ans it’s end
Shu bilan bugun sizga ko’rsatmoqchi va o’rgatmoqchi bo’lgan narsalarim shulardan iborat
edi.
Agarda siz bu maqolamni oxiragacha o’qigan bo’lsangiz sizga katta rahmat aytmoqchiman va albatta
sizga yoqgan bo’lsa layk bosing, o’zingizda sinab ko’ring, fikrlaringiz, istaklaringiz bo’lsa izoh
qoldiring. Eslatib o’tish kerak-ki o’tgan maqolamda qoldirilgan bitta ijobiy izoh shu maqolamni
yozishga menga motivatsiya bo’ldi, deb bemalol ayta olaman. Agar qayerdadir tushunmagan
joylaringiz bo’lsa yoki mening xatolarimni topgan bo’lsangiz, albatta izohlarga yozing va
unutmang:”Dasturlashda hech narsa qiyin emas”
Xayr, omon bo’ling!
Maqola muallifi: Azizmurod Murodov
Comments are closed, but trackbacks and pingbacks are open.