ZaminDocs

Klaviaturalar va callback'lar

Ikki xil klaviatura bor: xabarga biriktiriladigan inline tugmalar va tizim klaviaturasi o'rnida chiqadigan reply klaviatura. Ikkalasi ham reply_markup parametri orqali yuboriladi.

Guruhlarda faqat inline klaviatura ishlaydi (reply klaviatura β†’ 400 only inline keyboards are supported in groups); tugmani istalgan a'zo bosishi mumkin, javob esa faqat bosganga ko'rinadi. Kanal postlarida tugma bo'lmaydi. Batafsil.

Umumiy cheklovlar

CheklovQiymat
Qatorlar≀12
Bitta qatorda tugmalar≀8
Jami tugmalar≀100
Tugma matni1–64 belgi
callback_data1–64 bayt (UTF-8: kirill yoki emoji ko'proq bayt oladi)
URL≀2048 belgi, faqat http/https
Bo'sh qatorRuxsat yo'q

JSON so'rovda reply_markup obyekt bo'ladi; query, form yoki multipart'da β€” JSON matn.

Inline klaviatura

Inline tugmalar xabar ostida turadi. Har bir tugmada text va quyidagilardan aynan bittasi: callback_data (botga signal), url (havola) yoki web_app (hozircha havola sifatida ochiladi).

Python
import os
import requests

TOKEN = os.environ["ZAMIN_BOT_TOKEN"]
API = f"https://api.zamin.app/bot{TOKEN}"
CHAT_ID = int(os.environ["ZAMIN_CHAT_ID"])

keyboard = {
    "inline_keyboard": [
        [
            {"text": "πŸ‘ Yoqdi", "callback_data": "like"},
            {"text": "πŸ‘Ž Yoqmadi", "callback_data": "dislike"},
        ],
        [{"text": "🌐 Batafsil", "url": "https://example.com/maqola"}],
    ]
}
requests.post(
    f"{API}/sendMessage",
    json={"chat_id": CHAT_ID, "text": "Maqola sizga yoqdimi?", "reply_markup": keyboard},
    timeout=15,
)
@maqola_botbot
Maqola sizga yoqdimi?
πŸ‘ YoqdiπŸ‘Ž Yoqmadi
🌐 Batafsil
Β« πŸ‘ Yoqdi Β»
Rahmat! πŸ™Œ

Callback'larni qayta ishlash

callback_data'li tugma bosilganda bot callback_query yangilanishini oladi. Server faqat haqiqatan shu xabar klaviaturasida bor callback_data'ni qabul qiladi, lekin foydalanuvchi har qanday tugmani istalgan vaqtda bosishi mumkin β€” data'ni doim tekshiring.

  1. Darhol answerCallbackQuery chaqiring: bir marta, 60 soniya ichida. Ixtiyoriy text (≀200) qisqa bildirishnoma bo'lib chiqadi, show_alert: true β€” oyna, url β€” havola.
  2. Kerak bo'lsa, xabarni editMessageText yoki editMessageReplyMarkup bilan yangilang (48 soat ichida).
Python
def on_callback(query):
    chat_id = query["message"]["chat"]["id"]
    message_id = query["message"]["message_id"]
    data = query["data"]

    text = {"like": "Rahmat! πŸ™Œ", "dislike": "Fikringiz uchun rahmat."}.get(data, "Noma'lum tugma")
    requests.post(
        f"{API}/answerCallbackQuery",
        json={"callback_query_id": query["id"], "text": text},
        timeout=15,
    )
    # Ovoz berilgach, tugmalarni olib tashlaymiz (reply_markup yuborilmaydi)
    requests.post(
        f"{API}/editMessageText",
        json={"chat_id": chat_id, "message_id": message_id, "text": f"Maqola sizga yoqdimi? β€” {text}"},
        timeout=15,
    )

Reply klaviatura

Reply klaviatura chatning faol klaviaturasiga aylanadi va tizim klaviaturasi o'rnida (yoki u bilan almashinib) ko'rinadi. Oddiy tugma bosilsa, uning matni foydalanuvchining oddiy xabari bo'lib keladi. Klaviatura yangisi yuborilguncha yoki remove_keyboard bilan olib tashlanguncha turadi.

Python
keyboard = {
    "keyboard": [
        ["πŸ• Pitsa", "πŸ” Burger"],          # oddiy matnli tugmalar
        [{"text": "πŸ›’ Savat"}, {"text": "❓ Yordam"}],
    ],
    "resize_keyboard": True,
    "input_field_placeholder": "Taom tanlang",
}
requests.post(
    f"{API}/sendMessage",
    json={"chat_id": CHAT_ID, "text": "Nima buyurtma qilasiz?", "reply_markup": keyboard},
    timeout=15,
)

# Keyinroq olib tashlash:
requests.post(
    f"{API}/sendMessage",
    json={"chat_id": CHAT_ID, "text": "Buyurtma qabul qilindi βœ…", "reply_markup": {"remove_keyboard": True}},
    timeout=15,
)
MaydonMa'nosi
keyboardTugmalar qatorlari. Tugma β€” {"text": …} obyekti yoki oddiy matn.
resize_keyboardIxchamroq ko'rsatish uchun ishora.
one_time_keyboardtrue β€” foydalanuvchining keyingi xabaridan keyin klaviatura yo'qoladi.
input_field_placeholderKiritish maydonidagi ishora matni (≀64).
is_persistentSaqlanadi va ilovaga uzatiladi.

request_contact va request_location

Bot foydalanuvchining telefon raqamini yoki joylashuvini o'zi ko'ra olmaydi. Faqat so'rashi mumkin: reply klaviaturaga request_contact yoki request_location tugmasini qo'shing. Foydalanuvchi tugmani bosganda ilova tasdiq so'raydi ("Telefon raqamingizni @bot bilan ulashasizmi?"). Faqat tasdiqlangandan keyin bot contact yoki location'li xabar oladi.

Python
keyboard = {
    "keyboard": [
        [{"text": "πŸ“± Raqamni yuborish", "request_contact": True}],
        [{"text": "πŸ“ Joylashuvni yuborish", "request_location": True}],
        ["Bekor qilish"],
    ],
    "resize_keyboard": True,
    "one_time_keyboard": True,
}
requests.post(
    f"{API}/sendMessage",
    json={"chat_id": CHAT_ID, "text": "Yetkazib berish uchun raqam va manzil kerak.", "reply_markup": keyboard},
    timeout=15,
)


def on_message(message):
    if "contact" in message:
        phone = message["contact"]["phone_number"]   # foydalanuvchining o'z raqami
        print("Raqam:", phone)
    elif "location" in message:
        loc = message["location"]
        print("Joylashuv:", loc["latitude"], loc["longitude"])
  • Kontakt β€” doim foydalanuvchining o'z raqami va ismi; boshqa odamning kontaktini yuborib bo'lmaydi.
  • Joylashuv β€” bir martalik nuqta (jonli kuzatuv emas).
  • Ilova bu ma'lumotni faqat chatning faol klaviaturasida shunday tugma bo'lsa yuboradi. Klaviaturani olib tashlasangiz, so'rov ham bekor bo'ladi.
  • Bitta tugmada ikkalasi bo'lmaydi.

URL qoidalari

Inline tugmalardagi url, web_app.url va answerCallbackQuery'dagi url quyidagi qoidalar bilan tekshiriladi:

  • Faqat http:// va https:// (web_app uchun faqat https://). zamin://, javascript:, data:, tel: va boshqa sxemalar rad etiladi.
  • URL ichida login/parol, bo'shliq yoki boshqaruv belgilari bo'lmasin; uzunligi ≀2048.
  • zamin.app havolalari faqat ochiq profil, bot yoki kanal sahifasiga: https://zamin.app/<username>, ixtiyoriy ?start=PARAM bilan (PARAM: A-Z a-z 0-9 _ -, ≀64). Taklif havolalari (/+…) va boshqa yo'llar, # qism hamda zamin.app'ning boshqa subdomenlari ruxsat etilmagan.
URLNatija
https://example.com/shop?id=5βœ…
https://zamin.app/ObHavoBot?start=promoβœ…
https://zamin.app/+AbCdEf123❌ taklif havolasi
https://api.zamin.app/v1/β€¦βŒ zamin.app subdomeni
zamin://u/ali❌ sxema
javascript:alert(1)❌ sxema

Ilova bot bergan har qanday havolani ochishdan oldin domenni ko'rsatib, tasdiq so'raydi.