Önceki derste temel bir aiogram botu kurmuştuk. Şimdi bu botu, kullanıcının komut yazmak yerine butona tıklayarak işlem yapabildiği bir yapıya dönüştüreceğiz.
Inline Keyboard Oluşturmak
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
keyboard1 = InlineKeyboardMarkup()
keyboard1.add(InlineKeyboardButton("Excel Dersleri", url="https://kushaengineering.com/blog/kategori/excel/"))
InlineKeyboardButton'a url parametresi verirseniz, bu buton doğrudan bir web sayfası açan bir bağlantı butonu olur — herhangi bir kod çalıştırmaz, sadece linke yönlendirir.
Klavyeyi Bir Komuta Bağlamak
@dp.message_handler(commands=["start"])
async def start_command(message: types.Message):
await message.reply("Ne öğrenmek istersiniz?", reply_markup=keyboard1)
reply_markup=keyboard1 parametresi, mesajın altına bu buton grubunu ekler.
Kod Çalıştıran Butonlar: callback_data
Bir butona tıklandığında bir link açmak yerine botun kendi kodunu tetiklemesini istiyorsanız, url yerine callback_data kullanırsınız:
keyboard2 = InlineKeyboardMarkup()
keyboard2.add(InlineKeyboardButton("Metin Var", callback_data="metin_var"))
keyboard2.add(InlineKeyboardButton("Sayı Var", callback_data="sayi_var"))
callback_data, o butona basıldığında botun arka planına gönderilen bir "etiket" gibi düşünülebilir — bot bu etikete bakarak hangi butona basıldığını anlar.
Callback'i Yakalamak
@dp.callback_query_handler(lambda c: c.data == "metin_var")
async def handle_metin(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, "Metin ile ilgili bir işlem yaptınız.")
@dp.callback_query_handler(lambda c: c.data == "sayi_var")
async def handle_sayi(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, "Sayı ile ilgili bir işlem yaptınız.")
@dp.callback_query_handler(lambda c: c.data == "..."), sadece belirtilen callback_data değeriyle eşleşen buton tıklamalarını yakalar. bot.answer_callback_query(...) çağrısı önemlidir — bu olmadan Telegram istemcisinde buton "yükleniyor" animasyonu takılı kalabilir.
Yaygın Bir Hata: Yanlış Kaynaktan callback_data Okuma
callback_query.data yerine yanlışlıkla farklı bir nesneden veri okumaya çalışmak, handler'ın hiç tetiklenmemesine yol açan sık yapılan bir hatadır — callback_data string'inin, butonu tanımlarken yazdığınız değerle birebir aynı olduğundan emin olun.
Sırada Ne Var?
Sırada, Telegram botlarından biraz uzaklaşıp MongoDB veritabanını Python ile kullanmaya başlayacağız.