Botxona

6 standart qoida — bot kodi qanday bo'lishi kerak

Botxona har bir yuklangan botni 6 ta standart bo'yicha avtomatik tekshiradi (natijani qayerdan ko'rish). Bu qoidalar shunchaki formalik emas — ular botingiz uxlab-uyg'onishi, zaxiralanishi va analitikasi ishlashi uchun zarur. Quyida har biri: nima, nega, qanday tekshirish va tayyor tuzatish kodi.

1. Token faqat BOT_TOKEN dan

Nima: bot tokeni kodda ochiq yozilmasligi, faqat BOT_TOKEN muhit o'zgaruvchisidan o'qilishi kerak.

Nega: token kodda qattiq yozilgan bo'lsa, tokenni almashtirish uchun kodni qayta yuklash kerak bo'ladi; bundan tashqari, kod boshqa birov bilan ulashilsa token ham oshkor bo'ladi.

Qanday tekshiriladi: tizim kod ichida raqam:harf-belgi ko'rinishidagi haqiqiy tokenga o'xshash qatorlarni qidiradi. Topilsa — 🔴 (fail).

Tuzatish:

import os
BOT_TOKEN = os.getenv("BOT_TOKEN")
const token = process.env.BOT_TOKEN

Odatiy xato: tokenni test paytida qulaylik uchun kodga yozib qo'yib, keyin unutib qoldirish. Yuklashdan oldin qidiruv (Ctrl+F) orqali tekshiring.

2. API manzil TELEGRAM_API_URL dan

Nima: bot Telegram bilan to'g'ridan-to'g'ri emas, TELEGRAM_API_URL orqali (platforma proksisi) gaplashishi kerak.

Nega: Botxona analitikasi (DAU, xatolar, javob vaqti) aynan shu proksi orqali o'tgan so'rovlardan yig'iladi — kod o'zgartirmasdan. Proksi, shuningdek, izolyatsiya va xavfsizlik qatlamini ta'minlaydi.

Qanday tekshiriladi: kodda TELEGRAM_API_URL ishlatilishi va api.telegram.org ga to'g'ridan-to'g'ri murojaat yo'qligi tekshiriladi.

Tuzatish — aiogram 3:

import os
from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer

session = AiohttpSession(
    api=TelegramAPIServer.from_base(os.getenv("TELEGRAM_API_URL", "https://api.telegram.org"))
)
bot = Bot(token=BOT_TOKEN, session=session)

Tuzatish — python-telegram-bot:

from telegram.ext import Application

api = os.getenv("TELEGRAM_API_URL", "https://api.telegram.org")
app = (
    Application.builder()
    .token(BOT_TOKEN)
    .base_url(f"{api}/bot")
    .base_file_url(f"{api}/file/bot")
    .build()
)

Tuzatish — grammY (Node.js):

import { Bot } from "grammy"
const bot = new Bot(process.env.BOT_TOKEN, {
  client: { apiRoot: process.env.TELEGRAM_API_URL },
})

Tuzatish — Telegraf (Node.js):

const { Telegraf } = require("telegraf")
const bot = new Telegraf(process.env.BOT_TOKEN, {
  telegram: { apiRoot: process.env.TELEGRAM_API_URL },
})

Odatiy xato: TELEGRAM_API_URL ni ishlatib, lekin standart qiymat sifatida kodning boshqa joyida api.telegram.org ga qattiq havola qoldirib ketish — ikkalasi bir vaqtda bo'lmasin.

3. Kutubxonalar aniq versiyasi bilan

Nima: Python uchun requirements.txt, Node.js uchun package.json da barcha kutubxonalar aniq versiya bilan yozilgan bo'lishi kerak (masalan aiogram==3.13.1, oddiy aiogram emas).

Nega: versiyasiz kutubxona vaqt o'tib yangilanib, kodni buzishi mumkin — bot bugun ishlaydi, ertaga versiyalar mos kelmay ishlamay qoladi.

Tuzatish:

aiogram==3.13.1
python-dotenv==1.0.1
{
  "dependencies": {
    "grammy": "^1.30.0"
  }
}

Odatiy xato: pip freeze > requirements.txt ni loyihaning haqiqiy virtual muhitida emas, global Python muhitida ishlatib, keraksiz o'nlab kutubxonani ham qo'shib yuborish.

4. Aniq kirish nuqtasi

Nima: tizim qaysi faylni ishga tushirishni bilishi kerak. Python uchun standart nomzodlar: main.py, bot.py, app.py. Node.js uchun package.json dagi "start" skripti yoki main maydoni.

Nega: aniq kirish nuqtasisiz tizim qaysi faylni ishga tushirishni taxmin qilishga majbur bo'ladi — bir nechta nomzod bo'lsa, noto'g'ri fayl tanlanishi mumkin.

Tuzatish — aniqlik uchun botxona.yaml qo'shing:

runtime: python
entry: main.py
runtime: node
start: node src/index.js

Batafsil sxema: botxona.yaml.

5. Doimiy ma'lumot faqat DATA_DIR da

Nima: bot saqlaydigan barcha fayllar (SQLite baza, Excel eksport, rasm va h.k.) DATA_DIR muhit o'zgaruvchisi ko'rsatgan papkada bo'lishi kerak.

Nega: bot konteyneri qayta ishga tushganda (redeploy, restart) DATA_DIRdan tashqari fayl tizimi tozalanadi — faqat DATA_DIR saqlanadi va har kuni zaxiralanadi (Ma'lumotlar va zaxira).

Tuzatish:

import os
DATA_DIR = os.getenv("DATA_DIR", "./data")
os.makedirs(DATA_DIR, exist_ok=True)
db_path = os.path.join(DATA_DIR, "bot.sqlite3")
const DATA_DIR = process.env.DATA_DIR || "./data"
const dbPath = require("path").join(DATA_DIR, "bot.sqlite3")

Odatiy xato: joriy papkaga (./) yoki loyihaning o'ziga (./data emas, .) yozish — build vaqtida ishlaydi, lekin production konteynerida fayl tizimi faqat DATA_DIR da yozishga ruxsat beradi.

6. Sozlamalar .env.example da

Nima: botingiz kutayotgan barcha muhit o'zgaruvchilari (ADMIN_IDS, CHANNEL_ID va h.k.) .env.example faylida, izohi bilan, lekin qiymatisiz ro'yxatlangan bo'lishi kerak.

Nega: shu ro'yxat asosida Botxona paneli sizga sozlamalarni kiritish uchun forma ko'rsatadi — .env.example bo'lmasa, o'zgaruvchilarni qo'lda qo'shishga to'g'ri keladi.

Tuzatish:

# Adminlar Telegram ID'lari, vergul bilan
ADMIN_IDS=

# Kanal ID (kanal o'sishini kuzatish uchun)
CHANNEL_ID=

Platforma o'zi beradigan BOT_TOKEN, TELEGRAM_API_URL, DATA_DIR, TZ, PORT ni .env.example ga qo'shish shart emas — ular avtomatik beriladi (Muhit o'zgaruvchilari).

Keyingi qadam

Kodni yuklab, natijani ko'ring: Tekshiruv natijasini o'qish. Formatga ishonchingiz komil bo'lmasa, Promptlar kutubxonasidagi "Standartlashtirish" prompti mavjud kodni avtomatik moslashtirib beradi.