October 29
AioGram - namoz vaqti
Namoz Vaqtlari Telegram Bot Kodini Darslik Sifatida Izohlash (aiogram 3.22)
Salom! Siz taqdim etgan kod aiogram 3.22 kutubxonasi yordamida yaratilgan oddiy Telegram botdir. Bu bot O'zbekistonning Namangan shahri uchun namoz vaqtlarini ko'rsatadi. Ma'lumotlar Aladhan API dan olinadi. Bot quyidagi buyruqlarga javob beradi:
- /start: Bot haqida ma'lumot va yordam.
- /namoz: Bugungi namoz vaqtlari (Namangan uchun, o'zbekcha nomlar bilan).
Bu darslikda kodni qism-qismga bo'lib izohlayman: Har bir qator yoki blokni tushuntiraman, nima uchun kerakligini va qanday ishlayotganini. Bu yangi boshlovchilar uchun foydali bo'ladi. Kod Python 3 da yozilgan, asinxron (async) usulda ishlaydi.
1. Kirish: O'rnatish va Umumiy Tuzilish
- O'rnatish: Kodni ishga tushirish uchun Python 3.8+ kerak. Quyidagi paketlarni o'rnating: text
pip install aiogram==3.22.0 aiohttp - Bot Token: Kodda BOT_TOKEN = "7627050170:AAF2w-NYia_7u1GaTD6lW5wSLwEx4C9Tepc" β bu Telegram BotFather dan olingan token. O'zingizniki bilan almashtiring.
- Ishga Tushirish: Faylni bot.py deb saqlang va python bot.py bilan ishga tushiring. Bot doimiy ishlaydi (Ctrl+C bilan to'xtating).
- Umumiy Tuzilish:
Endi kodni qator-qator izohlaymiz.
2. Import Qismi (Kutubxonalar Yuklash)
import asyncio # Asinxron operatsiyalar uchun import logging # Loglar uchun (xatoliklarni kuzatish) from datetime import datetime # Sana va vaqt bilan ishlash uchun import aiohttp # Asinxron HTTP so'rovlar uchun (API dan ma'lumot olish) from aiogram import Bot, Dispatcher, F # aiogram asosiy komponentlari from aiogram.filters import Command # Buyruq filtrlari from aiogram.types import Message # Xabar turlari from aiogram.enums import ParseMode # Markdown format uchun from aiogram.client.default import DefaultBotProperties # *** YANGI: DefaultBotProperties import qilish (xato tuzatish uchun)
- Izoh: Bu qismda kerakli kutubxonalar yuklanadi.
- asyncio: Asinxron kodni ishlatish uchun (bot bir vaqtda bir nechta so'rovni boshqarishi mumkin).
- logging: Xatoliklarni konsolga chiqarish va kuzatish uchun.
- datetime: Bugungi sanani olish uchun.
- aiohttp: API ga asinxron so'rov yuborish uchun (HTTP GET).
- aiogram modullari: Bot yaratish (Bot), xabarlarni boshqarish (Dispatcher), filtrlar (Command, F), xabar turlari (Message), formatlash (ParseMode), va default sozlamalar (DefaultBotProperties β aiogram 3.7+ da parse_mode ni belgilash uchun).
3. Logging Sozlamalari
# Logging sozlamalari: Bot ishida xatoliklarni konsolga chiqarish logging.basicConfig(level=logging.INFO)
- Izoh: Logging ni sozlaydi. INFO darajasi β oddiy ma'lumotlar va xatolar konsolga chiqadi. Bu botdagi muammolarni topishga yordam beradi (masalan, API xatosi).
4. Bot Token va Yaratish
# Bot tokenini shu yerga kiriting (BotFather dan olingan) BOT_TOKEN = "7627050170:AAF2w-NYia_7u1GaTD6lW5wSLwEx4C9Tepc" # O'z tokeningizni yozing! # Bot va Dispatcher yaratish bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN)) # *** Tuzatilgan: default parametri orqali Markdown belgilash dp = Dispatcher() # Xabarlarni boshqaruvchi
- Izoh:
- BOT_TOKEN: Botning "pasporti" β Telegram bilan bog'lanish uchun kerak. BotFather dan oling.
- bot = Bot(...): Bot ob'ektini yaratadi. default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN) β barcha javoblarda Markdown formatini standart qiladi (masalan, qalin matn).
- dp = Dispatcher(): Xabarlarni qabul qiluvchi va handlerlarga (funksiyalarga) yuboruvchi ob'ekt. Botning "miyasi".
5. API Sozlamalari
# Aladhan API sozlamalari: Toshkent uchun (ID=434877, mamlakat=O'zbekiston)
CITY_ID = 434877 # Toshkent shahar ID (API dan)
COUNTRY = "Uzbekistan"
METHOD = 2 # Hanafiy mazhab uchun (O'zbekiston uchun mos)
# API URL shabloni
PRAYER_API_URL = f"https://api.aladhan.com/v1/timingsByCity?city=Namangan&country={COUNTRY}&method={METHOD}"- Izoh:
- CITY_ID: Shahar ID (lekin bu kodda ishlatilmagan, ehtimol eskilik).
- COUNTRY = "Uzbekistan": Mamlakat nomi (API uchun inglizcha).
- METHOD = 2: Namoz hisoblash usuli (2 β Hanafiy mazhab, O'zbekiston uchun mos).
- PRAYER_API_URL: API manzili. f-string orqali shablon yaratilgan. Bu yerda city=Namangan β Namangan shahri uchun o'zgartirilgan. API dan JSON javob olinadi.
6. /start Buyrug'i Handleri
# /start buyrug'i: Foydalanuvchiga salom va yordam ko'rsatish
@dp.message(Command("start"))
async def start_handler(message: Message):
"""
/start buyrug'i uchun handler.
Foydalanuvchiga bot haqida ma'lumot beradi.
"""
welcome_text = (
"Assalomu alaykum! πΊπΏ\n"
"Bu bot namoz vaqtlarini ko'rsatadi (Namangan uchun).\n\n"
"Buyruqlar:\n"
"/namoz - Bugungi namoz vaqtlari\n"
"/start - Bu xabar"
)
await message.answer(welcome_text) # Javob yuborish- Izoh:
- @dp.message(Command("start")): Dekorator β bu funksiya /start buyruqiga bog'lanadi.
- async def start_handler(message: Message): Asinxron funksiya. message β kiruvchi xabar ob'ekti.
- welcome_text: Matn shabloni (multiline string). O'zbekcha salom va yordam.
- await message.answer(...): Foydalanuvchiga javob yuboradi. await β asinxron kutish.
7. /namoz Buyrug'i Handleri
# /namoz buyrug'i: Namoz vaqtlarini API dan olish va ko'rsatish
@dp.message(Command("namoz"))
async def prayer_times_handler(message: Message):
"""
/namoz buyrug'i uchun handler.
Asinxron ravishda API dan ma'lumot oladi va formatlab yuboradi.
"""
try:
# Asinxron HTTP so'rov yuborish
async with aiohttp.ClientSession() as session:
async with session.get(PRAYER_API_URL) as response:
if response.status == 200: # Muvaffaqiyatli javob
data = await response.json() # JSON ni o'qish
timings = data['data']['timings'] # Vaqtlar ma'lumoti
# Bugungi sana
today = datetime.now().strftime("%d.%m.%Y")
# Namoz vaqtlari matni (Markdown formatda)
prayer_text = (
f"π *Bugungi namoz vaqtlari (Namangan)*\n"
f"π
Sana: {today}\n\n"
f"π
Bomdot: {timings['Fajr']}\n"
f"βοΈ Quyosh: {timings['Sunrise']}\n"
f"π Peshin: {timings['Dhuhr']}\n"
f"π Asr: {timings['Asr']}\n"
f"π Shom: {timings['Maghrib']}\n"
f"π Xufton(Vitr): {timings['Isha']}\n\n"
f"*Manba: Aladhan API*\n"
f"*Dasturchi: @nematjon_shahobiddinov*"
)
await message.answer(prayer_text) # Formatlangan javob yuborish
else:
await message.answer("β API xatosi: Ma'lumot olinmadi. Keyinroq urinib ko'ring.") # Xato xabari
except Exception as e: # Boshqa xatolar (internet, va h.k.)
logging.error(f"Xato: {e}") # Logga yozish
await message.answer("β Xato yuz berdi. Botni qayta ishga tushiring.")- Izoh:
- @dp.message(Command("namoz")): /namoz buyruqiga bog'langan.
- try-except: Xatolarni ushlash (masalan, internet yo'q yoki API xatosi).
- async with aiohttp.ClientSession() as session: HTTP sessiyasi yaratish (asinxron).
- session.get(PRAYER_API_URL): API ga GET so'rov yuborish.
- if response.status == 200: Muvaffaqiyatli bo'lsa, JSON o'qish (await response.json()).
- timings = data['data']['timings']: Vaqtlar lug'atini olish (masalan, 'Fajr': '04:30').
- today = datetime.now().strftime("%d.%m.%Y"): Bugungi sanani formatlash.
- prayer_text: Matn shabloni. Namoz nomlari o'zbekcha (Bomdot = Fajr, va h.k.). Emoji va Markdown ishlatilgan.
- await message.answer(...): Javob yuborish.
- else va except: Xato xabarlari. logging.error: Xatoni logga yozish.
8. Asosiy Funksiya va Ishga Tushirish
# Botni ishga tushirish funksiyasi
async def main():
"""
Asosiy funksiya: Botni polling rejimida ishga tushirish.
Polling - Telegram serverini doimiy tekshirish (webhook o'rniga oddiy).
"""
# Dispatcher ga botni bog'lash
await dp.start_polling(bot)
# Dasturni ishga tushirish
if __name__ == "__main__":
asyncio.run(main()) # Asinxron ishga tushirish- Izoh:
- async def main(): Asosiy asinxron funksiya. dp.start_polling(bot) β botni polling rejimida ishga tushiradi (Telegram serverini doimiy tekshiradi, webhook o'rniga oddiy usul).
- if __name__ == "__main__": Fayl to'g'ridan-to'g'ri ishga tushirilganda bajariladi (modul sifatida emas).
- asyncio.run(main()): Asinxron kodni ishga tushiradi.
```python
import asyncio # Asinxron operatsiyalar uchun
import logging # Loglar uchun (xatoliklarni kuzatish)
from datetime import datetime # Sana va vaqt bilan ishlash uchun
import aiohttp # Asinxron HTTP so'rovlar uchun (API dan ma'lumot olish)
from aiogram import Bot, Dispatcher, F # aiogram asosiy komponentlari
from aiogram.filters import Command # Buyruq filtrlari
from aiogram.types import Message # Xabar turlari
from aiogram.enums import ParseMode # Markdown format uchun
from aiogram.client.default import DefaultBotProperties # *** YANGI: DefaultBotProperties import qilish (xato tuzatish uchun)
# Logging sozlamalari: Bot ishida xatoliklarni konsolga chiqarish
logging.basicConfig(level=logging.INFO)
# Bot tokenini shu yerga kiriting (BotFather dan olingan)
BOT_TOKEN = "7627050170:AAF2w-NYia_7u1GaTD6lW5wSLwEx4C9Tepc" # O'z tokeningizni yozing!
# Bot va Dispatcher yaratish
bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN)) # *** Tuzatilgan: default parametri orqali Markdown belgilash
dp = Dispatcher() # Xabarlarni boshqaruvchi
# Aladhan API sozlamalari: Toshkent uchun (ID=434877, mamlakat=O'zbekiston)
CITY_ID = 434877 # Toshkent shahar ID (API dan)
COUNTRY = "Uzbekistan"
METHOD = 2 # Hanafiy mazhab uchun (O'zbekiston uchun mos)
# API URL shabloni
PRAYER_API_URL = f"https://api.aladhan.com/v1/timingsByCity?city=Namangan&country={COUNTRY}&method={METHOD}"
# /start buyrug'i: Foydalanuvchiga salom va yordam ko'rsatish
@dp.message(Command("start"))
async def start_handler(message: Message):
"""
/start buyrug'i uchun handler.
Foydalanuvchiga bot haqida ma'lumot beradi.
"""
welcome_text = (
"Assalomu alaykum! πΊπΏ\n"
"Bu bot namoz vaqtlarini ko'rsatadi (Namangan uchun).\n\n"
"Buyruqlar:\n"
"/namoz - Bugungi namoz vaqtlari\n"
"/start - Bu xabar"
)
await message.answer(welcome_text) # Javob yuborish
# /namoz buyrug'i: Namoz vaqtlarini API dan olish va ko'rsatish
@dp.message(Command("namoz"))
async def prayer_times_handler(message: Message):
"""
/namoz buyrug'i uchun handler.
Asinxron ravishda API dan ma'lumot oladi va formatlab yuboradi.
"""
try:
# Asinxron HTTP so'rov yuborish
async with aiohttp.ClientSession() as session:
async with session.get(PRAYER_API_URL) as response:
if response.status == 200: # Muvaffaqiyatli javob
data = await response.json() # JSON ni o'qish
timings = data['data']['timings'] # Vaqtlar ma'lumoti
# Bugungi sana
today = datetime.now().strftime("%d.%m.%Y")
# Namoz vaqtlari matni (Markdown formatda)
prayer_text = (
f"π *Bugungi namoz vaqtlari (Namangan)*\n"
f"π
Sana: {today}\n\n"
f"π
Bomdot: {timings['Fajr']}\n"
f"βοΈ Quyosh: {timings['Sunrise']}\n"
f"π Peshin: {timings['Dhuhr']}\n"
f"π Asr: {timings['Asr']}\n"
f"π Shom: {timings['Maghrib']}\n"
f"π Xufton(Vitr): {timings['Isha']}\n\n"
f"*Manba: Aladhan API*\n"
f"*Dasturchi: @nematjon_shahobiddinov*"
)
await message.answer(prayer_text) # Formatlangan javob yuborish
else:
await message.answer("β API xatosi: Ma'lumot olinmadi. Keyinroq urinib ko'ring.") # Xato xabari
except Exception as e: # Boshqa xatolar (internet, va h.k.)
logging.error(f"Xato: {e}") # Logga yozish
await message.answer("β Xato yuz berdi. Botni qayta ishga tushiring.")
# Botni ishga tushirish funksiyasi
async def main():
"""
Asosiy funksiya: Botni polling rejimida ishga tushirish.
Polling - Telegram serverini doimiy tekshirish (webhook o'rniga oddiy).
"""
# Dispatcher ga botni bog'lash
await dp.start_polling(bot)
# Dasturni ishga tushirish
if __name__ == "__main__":
asyncio.run(main()) # Asinxron ishga tushirish
```