PYTHON YORDAMIDA O'Z TELEGRAM BOTIMIZNI YARATAMIZ! (2-dars)

PYTHON YORDAMIDA O'Z TELEGRAM BOTIMIZNI YARATAMIZ! (2-dars)

mabrur

Message nima?

Oldingi maqolada botni yozib ko'rganlarning ko'pchiligi o'ziga message nima, va nima uchun xabar yuborishda send_message funksiyasi parametrlarida message.chat.id ni ko'rsatishimiz kerak degan savolni berishgan bo'lsa kerak. Buni bilish uchun xabarni konsolda namoyish qilaylik:

import telebot

bot = telebot.TeleBot('TOKEN')

@bot.message_handler(commands=['start'])
def start(message):
    print(message)
    
if __name__ == '__main__':
    bot.polling(none_stop=True)

Endi biz /start buyrug'ini bosganimizdan so'ng, botimiz juda katta miqdordagi ma'lumotlarni yuboradi. Hozir bizda bor narsa - bu json formatida. Json - bu tuzilgan ma'lumotlarni saqlash uchun oddiy format. Hammasi 'key' formatida ko'rsatiladi. Keling, nimaga ega bo'lganimni bir ko'rib chiqaylik:

{
 'content_type': 'text', 
 'message_id': 84, 
 'from_user': 
  {'id': 225146751, 
  'is_bot': False, 
  'first_name': 'MABRUR مبرور', 
  'username': 'mabrur_h11', 
  'last_name': None, 
  'language_code': 'ru'
 }, 
 'date': 1590036065, 
 'chat': {
  'type': 'private', 
  'last_name': None, 
  'first_name': 
  'MABRUR مبرور', 
  'username': 'mabrur_h11', 
  'id': 225146751, 
  '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': None, 
 'forward_from_chat': None, 
 'forward_from_message_id': None, 
 'forward_signature': None, 
 'forward_date': None, 
 'reply_to_message': None, 
 'edit_date': None, 
 'media_group_id': None, 
 'author_signature': None, 
 'text': '/start', 
 'entities': [
 <telebot.types.MessageEntity object at 0x00000225944B54C0>
 ], 
 'json':{
  'message_id': 84, 
  'from': {
   'id': 225146751, 
   'is_bot': False, 
   'first_name': 'MABRUR مبرور', 
   'username': 'mabrur_h11', 
   'language_code': 'ru'
  }, 
  'chat':{
   'id': 225146751, 
   'first_name': 'MABRUR مبرور', 
   'username': 'mabrur_h11', 
   'type': 'private'
  }, 
  'date': 1590036065, 
  'text': '/start', 
  'entities':[
   {
    'offset': 0, 
    'length': 6, 
    'type': 'bot_command'
            }
        ]
    }
}

Masalan, ushbu ma'lumotlarning barchasidan biz xabar yuborgan foydalanuvchining id sini olishni xohlaymiz. Buni amalga oshirish uchun chat murojaatiga o'taman.

Murojaat:

print(message.chat)

Javob:

{'type': 'private', 'last_name': None, 'first_name': 'MABRUR مبرور', 'username': 'mabrur_h11', 'id': 225146751, '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}

Ko'rib turganingizdek chat kalitida yana bir nechta kalitlar mavjud: first_name, last_name, username... va ularning har birini o'ziga yarasha qiymatlari mavjud. Endi id kalitiga yuzlanamiz.

print(message.chat.id)

Ko'rib turganingizdek, kerakli qiymatni olish uchun kalit nomlarini nuqtalar orqali yozishingiz kerak. Endi serverning javobiga qarang:

225146751

Barchasi xohlaganimizdek ketmoqda! Huddi istaganimizdek chat id sini oldik! Endi esa yuboruvchining ismini olamiz. Sezgan bo'lsangiz bu yerda from_user kalitidan foydalanish kerak.

Murojaat:

print(message.from_user)

Javob:

{'id': 225146751, 'is_bot': False, 'first_name': 'MABRUR مبرور', 'username': 'mabrur_h11', 'last_name': None, 'language_code': 'ru'}

Endi esa first_name kaliti qiymatini olamiz:

print(message.from_user.first_name)

Ko'rib turganingizdek, bir necha daqiqa ichida biz chat id sini va ismini telegramdan topishga muvaffaq bo'ldik. 

Endi esa o'rgangan narsalarimizdan kelib chiqib botimizni biroz mukammalashtiraylik.

Birinchi bo'lib botimizga ismimiz bilan murojaat qilishni o'rgatamiz. Buning uchun bot.send_message() funksiyasiga message.from_user.first_name chaqiruvini qo'llaymiz.

bot.send_message(message.chat.id, 'Salom, '+ message.from_user.first_name)

Salom tugmachasini bosishingiz bilan botingiz sizni ismingizni aytib salomlashadi. Xayr tugmachasiga ham huddi shuni qo'llaymiz.


Kodingiz ko'rinishi:

import telebot

bot = telebot.TeleBot('TOKENINGIZ')

keyboard1 = telebot.types.ReplyKeyboardMarkup(True, True)
keyboard1.row('Salom', 'Xayr')

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Salom, siz /start ni bosdingiz', reply_markup=keyboard1)

@bot.message_handler(content_types=['text'])
def send_text(message):
    if message.text.lower() == 'salom':
  bot.send_message(message.chat.id, 'Salom, '+    message.from_user.first_name)    
  elif message.text.lower() == 'xayr':
        bot.send_message(message.chat.id, 'Xayr '+    message.from_user.first_name)

if __name__ == '__main__':
    bot.polling(none_stop=True)

Keling endi bot sizga ob-havo yoki valyuta kursini bera oladigan qilib ko'ramiz. 

Dastlab telebot kutubxonasidan types orqali tugmachalarni chaqirib olamiz.

from telebot import types

Endi esa Salomlashishdan oldin tugmachalar qo'shamiz:

  keyboard = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
    key_havo = types.InlineKeyboardButton(text='Ob-havo')
    keyboard.add(key_havo)

    key_valyuta = types.InlineKeyboardButton(text='Valyuta')
    keyboard.add(key_valyuta)

Salom tugmachasi bosilganidan so'ng Ob-havo yoki valyuta kursini jo'natishini so'raymiz. E'tibor bering, botga yuborilayotgan xabardan so'ng reply_markup ga True qiymatini kiritib qo'yyabmiz. Bu bizga tugmachaga murojaat uchun kerak:

    if message.text.lower() == 'salom':
        bot.send_message(message.chat.id, 'Salom, '+ message.from_user.first_name +' sizga qanday yordam bera olaman?', reply_markup=keyboard)
    elif message.text.lower() == 'xayr':
        bot.send_message(message.chat.id, 'Xayr '+ message.from_user.first_name)

Endi esa, agar ob-havo so'ralsa havoni, valyuta so'ralsa kursni aytadigan shartni kiritamiz.

    if message.text.lower() == 'ob-havo':
        bot.reply_to(message, 'Bugun havo quyoshli')
    elif message.text.lower() == 'valyuta':
        bot.reply_to(message, "Valyuta kursi: 1 USD = 10 129,09 so'm")

E'tibor bergan bo'lsangiz, bot.reply_to() funksiyasidan foydalandim. Bu menga oxirgi yuborilgan xabarga javob berish uchun kerak bo'ladi.

Endi sinab ko'ramiz:


Ajoyib! Barchasi kutilganidek!

Agar nimadir o'xshamayotgan bo'lsa, kodning to'liq ko'rinishiga qarab ko'ring: 

import telebot
from telebot import types

bot = telebot.TeleBot('TOKEN')

keyboard1 = telebot.types.ReplyKeyboardMarkup(True, True)
keyboard1.row('Salom', 'Xayr')

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Salom, siz /start ni bosdingiz', reply_markup=keyboard1)

@bot.message_handler(content_types=['text'])
def send_text(message):
    keyboard = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True)
    key_havo = types.InlineKeyboardButton(text='Ob-havo')
    keyboard.add(key_havo)

    key_valyuta = types.InlineKeyboardButton(text='Valyuta')
    keyboard.add(key_valyuta)

    if message.text.lower() == 'salom':
        bot.send_message(message.chat.id, 'Salom, '+ message.from_user.first_name +' sizga qanday yordam bera olaman?', reply_markup=keyboard)
    elif message.text.lower() == 'xayr':
        bot.send_message(message.chat.id, 'Xayr '+ message.from_user.first_name)

    if message.text.lower() == 'ob-havo':
        bot.reply_to(message, 'Bugun havo quyoshli')
    elif message.text.lower() == 'valyuta':
        bot.reply_to(message, "Valyuta kursi: 1 USD = 10 129,09 so'm")

if __name__ == '__main__':
    bot.polling(none_stop=True)

Bot yaratishga qiziqayotgan va ilk botini ishga tushirmoqchi bo'lgan foydalanuvchilarimiz uchun maksimal ravishda osonroq qilishga harakat qildim. Shu bilan bot yozish bo'yicha kichik maqolamiz yakuniga yetdi )


Report Page