Bot API asoslari
Bot API β oddiy HTTPS interfeys. Har bir metod bitta URL; parametrlar query, JSON, form yoki multipart orqali yuboriladi; javob doim JSON.
So'rov manzili
https://api.zamin.app/bot<TOKEN>/<metod>Masalan: https://api.zamin.app/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe. Metod nomi katta-kichik harfga sezgir emas (getMe = getme), lekin hujjatdagidek yozish tavsiya etiladi.
GET yoki POST
Har bir metod GET va POST bilan ishlaydi. Parametrlarni quyidagi usullardan biri bilan yuboring:
| Usul | Content-Type | Qachon |
|---|---|---|
| Query satri | β | Oddiy GET so'rovlar: ?chat_id=β¦&text=β¦ |
| JSON | application/json | Tavsiya etiladi. reply_markup va massivlarni obyekt sifatida yuborasiz. |
| Form | application/x-www-form-urlencoded | Ko'p kutubxonalar shunday yuboradi. |
| Multipart | multipart/form-data | Fayl yuklash (sendPhoto, sendDocument, β¦). Bitta fayl, β€12 maydon. |
- Query, form va multipart'da murakkab qiymatlar (
reply_markup,commands,allowed_updates) JSON matn sifatida yuboriladi. - Mantiqiy qiymatlar:
true/false, matnda"true","false","1","0". - Butun sonlar: son yoki raqamli matn (16 xonagacha).
- Noma'lum parametrlar xato bermaydi, shunchaki e'tiborga olinmaydi.
- JSON va form tanasi β€64 KB; multipart'dagi har bir matn maydoni β€64 KB; fayl β€50 MB (rasm β€20 MB).
import os
import requests
TOKEN = os.environ["ZAMIN_BOT_TOKEN"]
API = f"https://api.zamin.app/bot{TOKEN}"
# JSON
requests.post(f"{API}/sendMessage", json={"chat_id": 4810235517, "text": "Salom"}, timeout=15)
# Query satri (GET)
requests.get(f"{API}/sendMessage", params={"chat_id": 4810235517, "text": "Salom"}, timeout=15)# JSON
curl -s -X POST "https://api.zamin.app/bot$ZAMIN_BOT_TOKEN/sendMessage" \
-H "Content-Type: application/json" \
-d '{"chat_id": 4810235517, "text": "Salom"}'
# Query satri (GET)
curl -s "https://api.zamin.app/bot$ZAMIN_BOT_TOKEN/sendMessage?chat_id=4810235517&text=Salom"Javob shakli
Muvaffaqiyatli javob:
{
"ok": true,
"result": { "id": 1000001, "is_bot": true, "first_name": "Ob-havo", "username": "ObHavoBot" }
}Xato:
{
"ok": false,
"error_code": 400,
"description": "Bad Request: chat not found"
}429 javobida qo'shimcha parameters.retry_after (soniya) bo'ladi. Bu har bir limit uchun bir xil shakl:
{
"ok": false,
"error_code": 429,
"description": "Too Many Requests: retry after 3",
"parameters": { "retry_after": 3 }
}HTTP status kodi error_code bilan bir xil. Parametr tekshiruvi xatolarida tavsif Bad Request: <maydon>: <sabab> ko'rinishida bo'ladi, masalan Bad Request: text: message text is empty.
Autentifikatsiya va token
Token so'rov manzilida bo'ladi β boshqa sarlavha yoki kalit kerak emas. Token ko'rinishi: <bot_id>:<36 ta url-safe belgi> (A-Z a-z 0-9 _ -).
- Noto'g'ri yoki bekor qilingan token:
401 Unauthorized. - Bitta IP manzildan (IPv6 uchun /64 tarmoqdan) 10 daqiqada 20 marta noto'g'ri token yuborilsa, shu IP'dan keladigan noto'g'ri tokenli so'rovlar vaqtincha
429oladi. To'g'ri tokenli so'rovlar bloklanmaydi. - Bot bloklangan (suspended) yoki egasining hisobi cheklangan bo'lsa:
403 Forbidden: bot is suspended.
Rate limitlar
Limitlar "token chelak" (token bucket) usulida: chelak to'la bo'lsa, qisqa portlash (burst) mumkin, so'ng belgilangan tezlikda to'ladi.
- Bitta qoida: qaysi limitdan oshsangiz ham javob
429 Too Many Requests: retry after Nvaparameters.retry_after = N(soniya) bo'ladi. Istisnolar: kunlik chatlar limiti (daily limit of chats reached,retry_after: 3600) va proksi darajasidagi IP limiti (pastda). - Rad etilgan so'rov hech narsa sarflamaydi. Limit rad etgan so'rov hech narsa qilmagan: xabar yuborilmagan, fayl saqlanmagan, boshqa limitlardan olingan tokenlar qaytarilgan.
retry_aftersoniya kutib, aynan o'sha so'rovni qayta yuborish xavfsiz (umumiy 50/s so'rovlar limitiga esa har bir so'rov, rad etilgani ham, kiradi). - Tayyor yordamchi: Python yordamchi klassi (
with_retry).
| Limit | Qiymat | Nimaga |
|---|---|---|
| Bot API so'rovlari | 50 / soniya (portlash 100 gacha) | Bitta botning barcha metod chaqiruvlari, getUpdates ham. |
| Bot xabarlari | 30 / soniya (portlash 30) | sendMessage, sendPhoto, β¦ β bot bo'yicha jami. |
| Bitta chatga xabar | 1 / soniya (portlash 5) | Bitta foydalanuvchiga ketma-ket xabarlar. |
| Bitta guruh yoki kanalga xabar | 20 / daqiqa (portlash 20) | Guruhda yuborish, tahrirlash, qadash; kanalda post. Batafsil. |
| Guruh xabarlarini shifrlash | 1 000 qurilma / soniya bot bo'yicha, 1 500 bot egasi bo'yicha (barcha botlari), 5 000 umumiy | Guruhdagi har bir xabar (tahrir, qadash) har bir odamning β€10 ta qurilmasi + botning o'zi uchun shifrlanadi: 50 kishilik guruhda har kimda 2 tadan telefon bo'lsa β 101. Batafsil. |
| Bir vaqtdagi fayl uzatishlar | 3 ta bot bo'yicha, 16 ta umumiy β yuklab olish va yuklash alohida | Yuklab olish (/file/botβ¦) va multipart yuklash, shaxsiy chatlar ham; guruh yoki kanalga file_id bilan qayta yuborish yuklash hisoblanadi. Oshsa: 429, retry_after: 1. |
| Kunlik chatlar | 10 000 turli chat / kun (UTC) | Faqat tasdiqlanmagan botlar. Oshsa: daily limit of chats reached, retry_after 3600. |
| Noto'g'ri token | 20 / 10 daqiqa / IP | Keyin shu IP'dan noto'g'ri tokenli so'rovlar 429. |
| Bir IP'dan so'rovlar | β20 / soniya (portlash 60) | api.zamin.app proksisi darajasida, IP bo'yicha. Bu 429 javobida JSON bo'lmasligi mumkin. |
| Long poll'lar | 2000 ta ochiq so'rov (barcha botlar) | To'lib qolsa, getUpdates darhol (bo'sh) javob qaytaradi. |
Xato kodlari
Har bir metod sahifasida uning o'ziga xos xatolari bor. Quyidagilar istalgan metodda bo'lishi mumkin:
| Kod | Tavsif | Ma'nosi | Nima qilish kerak |
|---|---|---|---|
| 400 | Bad Request: β¦ | Parametr noto'g'ri yoki yetishmaydi. | Tavsifdagi maydon nomini tekshiring. |
| 400 | Bad Request: chat not found | chat_id noto'g'ri, foydalanuvchi botni boshlamagan, bloklagan yoki hisobi o'chirilgan; guruh yoki kanalda β bot u yerda a'zo emas. | Shu foydalanuvchiga yozishni to'xtating. Bloklash haqida my_chat_member yangilanishi keladi. |
| 401 | Unauthorized | Token noto'g'ri yoki bekor qilingan. | Tokenni tekshiring; @ZaminBot'dan yangisini oling. |
| 403 | Forbidden: bot is suspended | Bot moderatsiya tomonidan bloklangan. | Zamin qo'llab-quvvatlash xizmatiga murojaat qiling. |
| 404 | Not Found: method not found | Bunday metod yo'q. | Metod nomini tekshiring (ro'yxat). |
| 409 | Conflict: β¦ | getUpdates va webhook to'qnashuvi yoki ikkita getUpdates. | Yangilanishlar sahifasiga qarang. |
| 413 | Request Entity Too Large | So'rov yoki fayl juda katta. | Fayl β€50 MB (rasm β€20 MB), JSON tanasi β€64 KB. |
| 429 | Too Many Requests: retry after N | Limitlardan biri (so'rovlar, xabarlar, guruh, shifrlash, fayl uzatish). So'rov bajarilmagan, olgan tokenlari qaytarilgan. | parameters.retry_after soniya kutib, o'sha so'rovni qayta yuboring (Rate limitlar). |
| 500 | Internal Server Error | Server xatosi. | Biroz kutib qayta urining. |
Fayllarni yuklab olish
Fayl yuborilgan xabarda file_id bo'ladi. getFile bilan file_path'ni oling va faylni quyidagi manzildan yuklab oling:
GET https://api.zamin.app/file/bot<TOKEN>/<file_path>file_idshu botga xos: boshqa bot uni ishlata olmaydi.- Bot ko'rgan faylni qayta yuklamasdan,
file_idorqali qayta yuborishi mumkin. - Faylni URL orqali yuborib bo'lmaydi: multipart bilan yuklang.
Telegram Bot API'dan farqlar
Zamin Bot API shakllari Telegram'ga o'xshash, lekin bir xil emas. Asosiy farqlar:
| Mavzu | Zamin |
|---|---|
| Chatlar | Shaxsiy chatlar, guruhlar va kanallar. Guruhlar uchidan-uchiga shifrlangan; privacy mode'dan tashqari xabarlar faqat guruh egasi roziligi bilan (guruhdagi farqlar). |
| Foydalanuvchi id'si | Har bir bot uchun alohida psevdonim raqam. |
| Bloklangan foydalanuvchi | 400 chat not found (403 emas). |
| Formatlash | parse_mode yo'q β faqat oddiy matn. |
| Fayllar | URL orqali yuborish yo'q; javoblarda kamroq maydon (davomiylik, eskiz yo'q). |
| Webhook sarlavhasi | X-Zamin-Bot-Api-Secret-Token. |
| Webhook javobi | Faqat status kodi muhim (2xx); javob tanasidagi metod chaqiruvi bajarilmaydi. |
| Yo'q metodlar | Inline rejim, to'lovlar, o'yinlar, stikerlar, forward/copy, caption tahrirlash va boshqalar. |