Полнофункциональный фреймворк для разработки Telegram ботов с встроенной БД, FSM, фильтрами и квизами
Project description
TgFramework
Полнофункциональный фреймворк для разработки Telegram ботов с использованием стандартного Telegram Bot API в режиме polling и встроенной базой данных SQLite.
Содержание
Установка
Через PyPI (рекомендуется)
pip install tgframework-bot
Из GitHub (последняя версия)
pip install git+https://github.com/LankiSer/TgBotFramework.git
Для обновления до последней версии:
pip install --upgrade --force-reinstall git+https://github.com/LankiSer/TgBotFramework.git
Из исходников (локально)
Клонируйте репозиторий:
git clone https://github.com/LankiSer/TgBotFramework.git
cd TgBotFramework
pip install -r requirements.txt
Или установите как пакет:
pip install -e .
Обновление библиотеки
Если библиотека уже установлена через PyPI:
pip install --upgrade tgframework-bot
Если установлена из GitHub:
pip install --upgrade --force-reinstall git+https://github.com/LankiSer/TgBotFramework.git
Быстрый старт
from tgframework import Bot
bot = Bot(token="YOUR_BOT_TOKEN_HERE")
@bot.register_command("start")
async def start_command(update, context):
await bot.send_message(
context["chat"]["id"],
"Привет! Я бот на TgFramework."
)
bot.run()
Документация API
Класс Bot
Основной класс для работы с Telegram ботом. Поддерживает polling для получения обновлений от Telegram.
__init__(token: str, db_path: str = "bot.db")
Инициализирует бота.
Параметры:
token(str): Токен бота от @BotFatherdb_path(str, опционально): Путь к файлу базы данных. По умолчанию "bot.db"
Пример:
bot = Bot(token="123456:ABC-DEF", db_path="my_bot.db")
send_message(chat_id: int, text: str, reply_markup: Optional[Dict] = None, parse_mode: Optional[str] = None, reply_to_message_id: Optional[int] = None, **kwargs) -> Dict[str, Any]
Отправляет текстовое сообщение в чат.
Параметры:
chat_id(int): ID чата для отправки сообщенияtext(str): Текст сообщенияreply_markup(Dict, опционально): Клавиатура для прикрепления к сообщениюparse_mode(str, опционально): Режим парсинга текста ("HTML", "Markdown", "MarkdownV2")reply_to_message_id(int, опционально): ID сообщения, на которое отвечаем**kwargs: Дополнительные параметры Telegram Bot API
Возвращает:
Dict[str, Any]: Отправленное сообщение
Пример:
await bot.send_message(
chat_id=123456,
text="Привет!",
parse_mode="HTML"
)
edit_message_text(chat_id: int, message_id: int, text: str, reply_markup: Optional[Dict] = None, parse_mode: Optional[str] = None, **kwargs) -> Dict[str, Any]
Редактирует текст существующего сообщения.
Параметры:
chat_id(int): ID чатаmessage_id(int): ID сообщения для редактированияtext(str): Новый текст сообщенияreply_markup(Dict, опционально): Новая клавиатураparse_mode(str, опционально): Режим парсинга**kwargs: Дополнительные параметры
Возвращает:
Dict[str, Any]: Отредактированное сообщение
Пример:
await bot.edit_message_text(
chat_id=123456,
message_id=789,
text="Обновленный текст"
)
delete_message(chat_id: int, message_id: int) -> bool
Удаляет сообщение из чата.
Параметры:
chat_id(int): ID чатаmessage_id(int): ID сообщения для удаления
Возвращает:
bool: True если успешно удалено
Пример:
await bot.delete_message(chat_id=123456, message_id=789)
answer_callback_query(callback_query_id: str, text: Optional[str] = None, show_alert: bool = False, **kwargs) -> bool
Отвечает на callback query.
Параметры:
callback_query_id(str): ID callback querytext(str, опционально): Текст ответаshow_alert(bool, опционально): Показать ли alert вместо уведомления. По умолчанию False**kwargs: Дополнительные параметры
Возвращает:
bool: True если успешно
Пример:
await bot.answer_callback_query(
callback_query_id="123",
text="Кнопка нажата!"
)
register_command(command: str = None, handler: Callable = None, description: Optional[str] = None)
Регистрирует обработчик команды. Может использоваться как декоратор или как обычный метод.
Параметры:
command(str): Название команды без "/"handler(Callable, опционально): Функция-обработчик (если используется как декоратор)description(str, опционально): Описание команды
Пример использования как декоратора:
@bot.register_command("start")
async def start_command(update, context):
await bot.send_message(context["chat"]["id"], "Привет!")
Пример использования как метода:
async def start_handler(update, context):
await bot.send_message(context["chat"]["id"], "Привет!")
bot.register_command("start", start_handler, "Начать работу")
register_callback(pattern: str = None, handler: Callable = None)
Регистрирует обработчик callback query. Может использоваться как декоратор или как обычный метод.
Параметры:
pattern(str): Паттерн для callback_data (callback должен начинаться с этого паттерна)handler(Callable, опционально): Функция-обработчик (если используется как декоратор)
Пример:
@bot.register_callback("button_")
async def button_handler(update, context):
callback_data = context["callback_data"]
await bot.answer_callback_query(context["callback_query"]["id"])
register_message_handler(handler: Callable = None, filters: Optional[Callable] = None)
Регистрирует обработчик текстовых сообщений. Может использоваться как декоратор или как обычный метод.
Параметры:
handler(Callable, опционально): Функция-обработчик (если используется как декоратор)filters(Callable, опционально): Функция-фильтр для проверки сообщения. Должна возвращать True/False
Пример:
@bot.register_message_handler(
filters=lambda u: u.get("message", {}).get("text")
)
async def text_handler(update, context):
text = context["text"]
await bot.send_message(context["chat"]["id"], f"Вы написали: {text}")
start_polling()
Асинхронно запускает polling для получения обновлений.
Пример:
await bot.start_polling()
stop()
Останавливает бота и закрывает соединения.
Пример:
await bot.stop()
run()
Синхронно запускает бота (блокирующий метод).
Пример:
bot.run()
Класс Database
Класс для работы с SQLite базой данных. Автоматически создает необходимые таблицы.
__init__(db_path: str = "bot.db")
Инициализирует базу данных и создает таблицы.
Параметры:
db_path(str): Путь к файлу базы данных. По умолчанию "bot.db"
Создаваемые таблицы:
users- информация о пользователяхchats- информация о чатахmessages- история сообщенийuser_states- состояния пользователейquizzes- квизы
add_user(user_id: int, username: Optional[str] = None, first_name: Optional[str] = None, last_name: Optional[str] = None, language_code: Optional[str] = None, is_bot: bool = False, is_admin: bool = False)
Добавляет или обновляет информацию о пользователе.
Параметры:
user_id(int): ID пользователяusername(str, опционально): Username пользователяfirst_name(str, опционально): Имя пользователяlast_name(str, опционально): Фамилия пользователяlanguage_code(str, опционально): Код языка пользователяis_bot(bool, опционально): Является ли пользователь ботомis_admin(bool, опционально): Является ли пользователь администратором
Пример:
db.add_user(123456, username="john_doe", first_name="John", is_admin=True)
get_user(user_id: int) -> Optional[sqlite3.Row]
Получает информацию о пользователе.
Параметры:
user_id(int): ID пользователя
Возвращает:
Optional[sqlite3.Row]: Строка с данными пользователя или None
Пример:
user = db.get_user(123456)
if user:
print(user["first_name"])
set_user_state(user_id: int, state: str, data: Optional[str] = None)
Устанавливает состояние пользователя.
Параметры:
user_id(int): ID пользователяstate(str): Состояниеdata(str, опционально): Дополнительные данные в формате JSON
Пример:
db.set_user_state(123456, "waiting_for_name")
get_user_state(user_id: int) -> Optional[sqlite3.Row]
Получает состояние пользователя.
Параметры:
user_id(int): ID пользователя
Возвращает:
Optional[sqlite3.Row]: Данные состояния или None
clear_user_state(user_id: int)
Очищает состояние пользователя.
Параметры:
user_id(int): ID пользователя
add_chat(chat_id: int, chat_type: str, title: Optional[str] = None, username: Optional[str] = None)
Добавляет или обновляет информацию о чате.
Параметры:
chat_id(int): ID чатаchat_type(str): Тип чата ("private", "group", "supergroup", "channel")title(str, опционально): Название чатаusername(str, опционально): Username чата
save_message(message_id: int, chat_id: int, user_id: int, text: Optional[str])
Сохраняет сообщение в базу данных.
Параметры:
message_id(int): ID сообщенияchat_id(int): ID чатаuser_id(int): ID пользователяtext(str, опционально): Текст сообщения
execute(query: str, params: Tuple = ()) -> sqlite3.Cursor
Выполняет произвольный SQL запрос.
Параметры:
query(str): SQL запросparams(Tuple): Параметры запроса
Возвращает:
sqlite3.Cursor: Курсор с результатами
fetchone(query: str, params: Tuple = ()) -> Optional[sqlite3.Row]
Выполняет запрос и возвращает одну строку.
Параметры:
query(str): SQL запросparams(Tuple): Параметры запроса
Возвращает:
Optional[sqlite3.Row]: Одна строка результата или None
fetchall(query: str, params: Tuple = ()) -> List[sqlite3.Row]
Выполняет запрос и возвращает все строки.
Параметры:
query(str): SQL запросparams(Tuple): Параметры запроса
Возвращает:
List[sqlite3.Row]: Список всех строк результата
set_admin(user_id: int, is_admin: bool = True)
Устанавливает статус администратора для пользователя.
Параметры:
user_id(int): ID пользователяis_admin(bool, опционально): Установить статус администратора. По умолчанию True
Пример:
db.set_admin(123456, is_admin=True) # Дать права администратора
db.set_admin(123456, is_admin=False) # Убрать права администратора
is_admin(user_id: int) -> bool
Проверяет, является ли пользователь администратором.
Параметры:
user_id(int): ID пользователя
Возвращает:
bool: True если пользователь является администратором
Пример:
if db.is_admin(123456):
print("Пользователь является администратором")
get_all_admins() -> List[sqlite3.Row]
Получает список всех администраторов.
Возвращает:
List[sqlite3.Row]: Список всех администраторов
Пример:
admins = db.get_all_admins()
for admin in admins:
print(admin["first_name"])
get_all_users(limit: Optional[int] = None) -> List[sqlite3.Row]
Получает список всех пользователей.
Параметры:
limit(int, опционально): Максимальное количество пользователей
Возвращает:
List[sqlite3.Row]: Список пользователей
Пример:
users = db.get_all_users(limit=10) # Последние 10 пользователей
get_user_count() -> int
Получает общее количество пользователей в базе данных.
Возвращает:
int: Количество пользователей
Пример:
count = db.get_user_count()
print(f"Всего пользователей: {count}")
close()
Закрывает соединение с базой данных.
Класс Quiz
Класс для создания и управления квизами.
__init__(db, user_id: int, title: str = "Квиз")
Инициализирует квиз.
Параметры:
db: Экземпляр базы данныхuser_id(int): ID пользователяtitle(str, опционально): Название квиза. По умолчанию "Квиз"
add_question(question: QuizQuestion)
Добавляет вопрос в квиз.
Параметры:
question(QuizQuestion): Вопрос для добавления
add_questions(questions: List[QuizQuestion])
Добавляет несколько вопросов в квиз.
Параметры:
questions(List[QuizQuestion]): Список вопросов
save() -> int
Сохраняет квиз в базу данных.
Возвращает:
int: ID сохраненного квиза
load(quiz_id: int)
Загружает квиз из базы данных.
Параметры:
quiz_id(int): ID квиза
get_current_question() -> Optional[QuizQuestion]
Получает текущий вопрос квиза.
Возвращает:
Optional[QuizQuestion]: Текущий вопрос или None
answer(answer_index: int) -> bool
Обрабатывает ответ пользователя на текущий вопрос.
Параметры:
answer_index(int): Индекс выбранного ответа
Возвращает:
bool: True если ответ правильный, False если неправильный
next_question() -> Optional[QuizQuestion]
Переходит к следующему вопросу.
Возвращает:
Optional[QuizQuestion]: Следующий вопрос или None
is_finished() -> bool
Проверяет, завершен ли квиз.
Возвращает:
bool: True если квиз завершен
get_results() -> Dict[str, Any]
Получает результаты квиза.
Возвращает:
Dict[str, Any]: Словарь с результатами:score(int): Количество правильных ответовtotal(int): Общее количество вопросовpercentage(float): Процент правильных ответовcorrect(int): Количество правильных ответовincorrect(int): Количество неправильных ответов
finish()
Завершает квиз (меняет статус на "finished").
get_user_active_quiz(db, user_id: int) -> Optional['Quiz']
Статический метод. Получает активный квиз пользователя.
Параметры:
db: Экземпляр базы данныхuser_id(int): ID пользователя
Возвращает:
Optional[Quiz]: Активный квиз или None
Пример:
quiz = Quiz.get_user_active_quiz(db, user_id=123456)
Класс QuizQuestion
Dataclass для представления вопроса квиза.
Поля
question(str): Текст вопросаoptions(List[str]): Список вариантов ответаcorrect_answer(int): Индекс правильного ответа в списке optionsexplanation(Optional[str]): Объяснение правильного ответа
Пример:
question = QuizQuestion(
question="Что такое Python?",
options=["Змея", "Язык программирования", "Фреймворк"],
correct_answer=1,
explanation="Python - это высокоуровневый язык программирования."
)
InlineKeyboardBuilder
Класс для построения inline клавиатур.
__init__()
Создает новый построитель inline клавиатуры.
add_button(text: str, callback_data: Optional[str] = None, url: Optional[str] = None, web_app: Optional[Dict] = None, login_url: Optional[Dict] = None, switch_inline_query: Optional[str] = None, switch_inline_query_current_chat: Optional[str] = None, callback_game: Optional[Dict] = None, pay: bool = False) -> 'InlineKeyboardBuilder'
Добавляет кнопку в текущий ряд.
Параметры:
text(str): Текст кнопкиcallback_data(str, опционально): Данные для callbackurl(str, опционально): URL для кнопкиweb_app(Dict, опционально): Web app данныеlogin_url(Dict, опционально): URL для авторизацииswitch_inline_query(str, опционально): Inline query для переключенияswitch_inline_query_current_chat(str, опционально): Inline query для текущего чатаcallback_game(Dict, опционально): Данные для игрыpay(bool, опционально): Является ли кнопка платёжной
Возвращает:
InlineKeyboardBuilder: Self для цепочки вызовов
Пример:
keyboard = InlineKeyboardBuilder()
keyboard.add_button("Кнопка 1", callback_data="btn1")
keyboard.add_button("Кнопка 2", callback_data="btn2")
keyboard.row()
keyboard.add_button("URL кнопка", url="https://example.com")
row() -> 'InlineKeyboardBuilder'
Завершает текущий ряд и начинает новый.
Возвращает:
InlineKeyboardBuilder: Self для цепочки вызовов
build() -> Dict[str, Any]
Строит клавиатуру для использования в Telegram API.
Возвращает:
Dict[str, Any]: Словарь с клавиатурой
Пример:
keyboard = InlineKeyboardBuilder()
keyboard.add_button("Да", callback_data="yes")
keyboard.add_button("Нет", callback_data="no")
await bot.send_message(chat_id, "Выберите:", reply_markup=keyboard.build())
clear() -> 'InlineKeyboardBuilder'
Очищает клавиатуру.
Возвращает:
InlineKeyboardBuilder: Self для цепочки вызовов
ReplyKeyboardBuilder
Класс для построения reply клавиатур.
__init__(resize_keyboard: bool = True, one_time_keyboard: bool = False, input_field_placeholder: Optional[str] = None, selective: bool = False)
Создает новый построитель reply клавиатуры.
Параметры:
resize_keyboard(bool, опционально): Изменять ли размер клавиатуры. По умолчанию Trueone_time_keyboard(bool, опционально): Одноразовая ли клавиатура. По умолчанию Falseinput_field_placeholder(str, опционально): Плейсхолдер для поля вводаselective(bool, опционально): Показывать ли клавиатуру только определённым пользователям. По умолчанию False
add_button(text: str, request_contact: bool = False, request_location: bool = False, request_poll: Optional[Dict[str, str]] = None, web_app: Optional[Dict] = None) -> 'ReplyKeyboardBuilder'
Добавляет кнопку в текущий ряд.
Параметры:
text(str): Текст кнопкиrequest_contact(bool, опционально): Запрашивать ли контактrequest_location(bool, опционально): Запрашивать ли местоположениеrequest_poll(Dict[str, str], опционально): Запрашивать ли опросweb_app(Dict, опционально): Web app данные
Возвращает:
ReplyKeyboardBuilder: Self для цепочки вызовов
row() -> 'ReplyKeyboardBuilder'
Завершает текущий ряд и начинает новый.
Возвращает:
ReplyKeyboardBuilder: Self для цепочки вызовов
build() -> Dict[str, Any]
Строит клавиатуру для использования в Telegram API.
Возвращает:
Dict[str, Any]: Словарь с клавиатурой
remove() -> Dict[str, Any]
Возвращает словарь для удаления клавиатуры.
Возвращает:
Dict[str, Any]: Словарь для удаления клавиатуры
Пример:
keyboard = ReplyKeyboardBuilder()
await bot.send_message(chat_id, "Клавиатура удалена", reply_markup=keyboard.remove())
clear() -> 'ReplyKeyboardBuilder'
Очищает клавиатуру.
Возвращает:
ReplyKeyboardBuilder: Self для цепочки вызовов
StateMachine
Класс для управления состояниями пользователей.
__init__(db)
Инициализирует машину состояний.
Параметры:
db: Экземпляр базы данных
set_state(user_id: int, state: str, data: Optional[Dict] = None)
Устанавливает состояние пользователя.
Параметры:
user_id(int): ID пользователяstate(str): Состояниеdata(Dict, опционально): Дополнительные данные
Пример:
state_machine.set_state(user_id=123456, state="waiting_for_name", data={"step": 1})
get_state(user_id: int) -> Optional[str]
Получает состояние пользователя.
Параметры:
user_id(int): ID пользователя
Возвращает:
Optional[str]: Состояние пользователя или None
get_state_data(user_id: int) -> Optional[Dict]
Получает данные состояния пользователя.
Параметры:
user_id(int): ID пользователя
Возвращает:
Optional[Dict]: Данные состояния или None
clear_state(user_id: int)
Очищает состояние пользователя.
Параметры:
user_id(int): ID пользователя
register_state_handler(state: str, handler: Callable)
Регистрирует обработчик состояния.
Параметры:
state(str): Состояниеhandler(Callable): Функция-обработчик
get_state_handler(state: str) -> Optional[Callable]
Получает обработчик состояния.
Параметры:
state(str): Состояние
Возвращает:
Optional[Callable]: Обработчик или None
Middleware
Система middleware для обработки обновлений.
Класс Middleware
Базовый абстрактный класс для создания middleware.
process(update: Dict[str, Any], context: Dict[str, Any]) -> bool
Абстрактный метод для обработки update.
Параметры:
update(Dict[str, Any]): Update от Telegramcontext(Dict[str, Any]): Контекст обработки
Возвращает:
bool: True если продолжить обработку, False если остановить
Пример:
from tgframework import Middleware
class MyMiddleware(Middleware):
async def process(self, update, context):
# Ваша логика обработки
return True # Продолжить обработку
Класс MiddlewareManager
Менеджер для управления middleware.
add(middleware: Middleware)
Добавляет middleware.
Параметры:
middleware(Middleware): Middleware для добавления
Пример:
bot.middleware_manager.add(MyMiddleware())
process(update: Dict[str, Any], context: Dict[str, Any]) -> bool
Обрабатывает update через все middleware.
Параметры:
update(Dict[str, Any]): Update от Telegramcontext(Dict[str, Any]): Контекст обработки
Возвращает:
bool: True если продолжить обработку, False если остановить
Утилиты
Модуль utils содержит вспомогательные функции.
get_user_info(user: Dict[str, Any]) -> Dict[str, Any]
Получает информацию о пользователе в удобном формате.
Параметры:
user(Dict[str, Any]): Словарь с данными пользователя из Telegram API
Возвращает:
Dict[str, Any]: Словарь с информацией:id(int): ID пользователяusername(str): Usernamefirst_name(str): Имяlast_name(str): Фамилияfull_name(str): Полное имяlanguage_code(str): Код языкаis_bot(bool): Является ли ботомis_premium(bool): Является ли премиум пользователем
Пример:
from tgframework import get_user_info
user_info = get_user_info(context["user"])
print(user_info["full_name"])
get_chat_info(chat: Dict[str, Any]) -> Dict[str, Any]
Получает информацию о чате в удобном формате.
Параметры:
chat(Dict[str, Any]): Словарь с данными чата из Telegram API
Возвращает:
Dict[str, Any]: Словарь с информацией:id(int): ID чатаtype(str): Тип чатаtitle(str): Название чатаusername(str): Username чатаfirst_name(str): Имя (для приватных чатов)last_name(str): Фамилия (для приватных чатов)
format_text(text: str, **kwargs) -> str
Форматирует текст с подстановкой переменных.
Параметры:
text(str): Текст с плейсхолдерами {variable_name}**kwargs: Переменные для подстановки
Возвращает:
str: Отформатированный текст
Пример:
from tgframework import format_text
text = format_text("Привет, {name}!", name="Иван")
# Результат: "Привет, Иван!"
escape_markdown(text: str) -> str
Экранирует специальные символы для Markdown.
Параметры:
text(str): Исходный текст
Возвращает:
str: Экранированный текст
escape_html(text: str) -> str
Экранирует специальные символы для HTML.
Параметры:
text(str): Исходный текст
Возвращает:
str: Экранированный текст
parse_command(text: str) -> tuple[str, str]
Парсит команду из текста.
Параметры:
text(str): Текст команды (например, "/start arg1 arg2")
Возвращает:
tuple[str, str]: Кортеж (команда, аргументы)
Пример:
from tgframework import parse_command
command, args = parse_command("/start hello world")
# command = "start"
# args = "hello world"
Новые возможности 2.0
Webhook поддержка
# Запуск в режиме webhook
await bot.start_webhook(
host="0.0.0.0",
port=8080,
path="/webhook",
secret_token="your_secret_token"
)
FSM (Finite State Machine)
from tgframework import FSMState, StatesGroup, FSMContext, state
class MyStates(StatesGroup):
waiting_for_name = FSMState()
waiting_for_age = FSMState()
@state(MyStates.waiting_for_name)
async def handle_name(update, context):
fsm = FSMContext(bot.state_machine, context["user"]["id"], context["chat"]["id"])
await fsm.set_state(MyStates.waiting_for_age)
await fsm.update_data(name=context["text"])
Готовые фильтры
from tgframework import Filters
# Фильтр для фото
@bot.register_message_handler(filters=Filters.Photo())
async def photo_handler(update, context):
...
# Комбинация фильтров
@bot.register_message_handler(filters=Filters.Text() & Filters.PrivateChat())
async def private_text_handler(update, context):
...
Pagination
from tgframework import PaginationKeyboard
items = ["Элемент 1", "Элемент 2", ...]
pagination = PaginationKeyboard(
items=items,
items_per_page=5,
callback_prefix="page_"
)
keyboard = pagination.build(0) # Первая страница
await bot.send_message(chat_id, "Список:", reply_markup=keyboard)
Обработка ошибок
@bot.register_error_handler
async def error_handler(error, context):
print(f"Ошибка: {error}")
# Ваша логика обработки
Примеры
В папке examples/ находятся примеры ботов:
simple_bot.py- простой бот с базовыми командамиquiz_bot.py- бот с полноценной системой квизовadmin_bot.py- бот с регистрацией пользователей и админкойadvanced_bot.py- продвинутый пример с FSM, фильтрами, pagination и обработкой ошибок
Структура проекта
tgframework/
├── __init__.py # Основной модуль
├── bot.py # Класс бота (polling и webhook)
├── database.py # Работа с базой данных
├── handlers.py # Обработчики
├── quiz.py # Система квизов
├── keyboards.py # Построители клавиатур
├── state.py # Управление состояниями
├── fsm.py # FSM система (как в aiogram)
├── filters.py # Готовые фильтры
├── pagination.py # Pagination для клавиатур
├── rate_limiter.py # Rate limiting защита
├── middleware.py # Middleware система
└── utils.py # Утилиты
examples/
├── simple_bot.py # Простой пример
├── quiz_bot.py # Пример с квизами
├── admin_bot.py # Пример с регистрацией и админкой
└── advanced_bot.py # Продвинутый пример (FSM, фильтры, pagination)
requirements.txt
setup.py
README.md
Сравнение с другими библиотеками
TgFramework создан как простая и удобная альтернатива существующим библиотекам для создания Telegram ботов. Ниже представлено сравнение с популярными решениями:
TgFramework vs python-telegram-bot
Преимущества TgFramework:
- Встроенная база данных SQLite с автоматическим управлением таблицами
- Готовая система квизов
- Более простой и интуитивный API для быстрого старта
- Встроенная система состояний пользователей
- Меньше зависимостей (только aiohttp)
- Простая регистрация обработчиков через декораторы
Недостатки TgFramework:
- Меньше документации и примеров (новый проект)
- Ограниченная поддержка Telegram Bot API (базовые методы)
- Только polling режим (нет webhook)
Когда использовать TgFramework:
- Для быстрого создания простых ботов
- Когда нужна встроенная база данных
- Для проектов с квизами и опросами
- Когда важна простота использования
Когда использовать python-telegram-bot:
- Для сложных проектов с полной поддержкой Telegram Bot API
- Когда нужен webhook вместо polling
- Для enterprise проектов с требованием стабильности
TgFramework vs aiogram
Преимущества TgFramework 2.0:
- Встроенная база данных SQLite с готовыми таблицами (пользователи, чаты, сообщения, состояния, квизы)
- Система квизов из коробки - полнофункциональная система для создания тестов и опросов
- FSM (Finite State Machine) - полноценная система состояний как в aiogram с декораторами
- Готовые фильтры (Filters) - удобные фильтры для обработчиков с операторами &, |, ~
- Pagination для клавиатур - встроенная навигация по страницам
- Rate limiting защита - автоматическая защита от превышения лимитов Telegram API
- Webhook поддержка - работает как polling, так и webhook режим
- Улучшенная обработка ошибок - глобальные обработчики ошибок с логированием
- Встроенная админка по ID пользователей
- Retry механизм - автоматические повторы при ошибках API
- Логирование - встроенная система логирования
- Меньше зависимостей - только aiohttp (vs множество зависимостей в aiogram)
- Более простая архитектура для начинающих
- Меньше абстракций, более понятный код
Недостатки TgFramework:
- Новый проект - меньше сообщества и примеров
- Не все методы Telegram Bot API реализованы (но все основные есть)
- Меньше сторонних расширений и плагинов
Когда использовать TgFramework:
- Для быстрого создания ботов с минимальной настройкой
- Когда нужна встроенная база данных без дополнительной настройки
- Для ботов с квизами и опросами
- Когда важна простота и минимум зависимостей
- Для обучения и экспериментов
- Для production проектов с базовым и средним функционалом
Когда использовать aiogram:
- Для очень сложных ботов с множеством интеграций
- Когда нужны все методы Telegram Bot API без исключений
- Для проектов с большой командой разработчиков, знакомых с aiogram
- Когда нужны сторонние расширения и плагины
TgFramework vs Telethon
Преимущества TgFramework:
- Работает с Bot API (проще получить токен)
- Встроенная база данных
- Готовая система квизов и админки
- Синхронный и асинхронный API
- Проще для начинающих
Недостатки TgFramework:
- Работает только с Bot API (не Client API)
- Меньше возможностей для автоматизации
Когда использовать TgFramework:
- Для создания обычных Telegram ботов
- Когда не нужен Client API функционал
Когда использовать Telethon:
- Для работы с Telegram Client API
- Для автоматизации личных аккаунтов
- Для сложных сценариев взаимодействия с Telegram
Итоговое сравнение
| Функция | TgFramework 2.0 | python-telegram-bot | aiogram | Telethon |
|---|---|---|---|---|
| База данных из коробки | Да (SQLite) | Нет | Нет | Нет |
| Система квизов | Да | Нет | Нет | Нет |
| FSM (состояния) | Да | Частично | Да | Нет |
| Готовые фильтры | Да | Частично | Да | Нет |
| Pagination | Да | Нет | Нет | Нет |
| Rate limiting | Да | Частично | Частично | Нет |
| Webhook поддержка | Да | Да | Да | Да |
| Обработка ошибок | Да (улучшенная) | Да | Да | Да |
| Retry механизм | Да | Да | Частично | Нет |
| Логирование | Да | Да | Да | Да |
| Режим работы | Polling/Webhook | Polling/Webhook | Polling/Webhook | Client/Bot API |
| Простота использования | Высокая | Средняя | Средняя | Низкая |
| Поддержка Bot API | Основные методы | Полная | Полная | Полная |
| Зависимости | Минимум (aiohttp) | Средние | Средние | Средние |
| Админка из коробки | Да | Нет | Нет | Нет |
| Документация | Хорошая | Отличная | Хорошая | Хорошая |
| Сообщество | Растущее | Большое | Большое | Большое |
Вывод
TgFramework 2.0 теперь лучше чем aiogram в следующих аспектах:
- Встроенная база данных - не нужно настраивать SQLAlchemy или другие ORM
- Система квизов - готовая система из коробки, в aiogram нужно писать с нуля
- Админка по ID - готовая система управления администраторами
- Pagination - встроенная навигация по страницам
- Меньше зависимостей - только aiohttp vs множество в aiogram
- Проще для начинающих - более понятный и интуитивный API
- Rate limiting из коробки - автоматическая защита от лимитов
- Улучшенная обработка ошибок - глобальные обработчики с retry
TgFramework 2.0 идеально подходит для:
- Быстрого создания ботов с минимальной настройкой
- Проектов, требующих встроенную базу данных
- Ботов с квизами и опросами
- Проектов, где важна простота и минимум зависимостей
- Production ботов с базовым и средним функционалом
- Обучения и экспериментов
Когда стоит рассмотреть aiogram:
- Если команда уже знакома с aiogram
- Для очень сложных проектов с множеством интеграций
- Когда нужны все методы Telegram Bot API без исключений
Лицензия
MIT License
Авторы
TgFramework Team
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tgframework_bot-2.0.1.tar.gz.
File metadata
- Download URL: tgframework_bot-2.0.1.tar.gz
- Upload date:
- Size: 55.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5cef6258a184bac36149541f0cbe5c8e5c39b191da53b6860d53eefde7b3f31c
|
|
| MD5 |
9885cb060fb8cbe3a6151ac9105c00af
|
|
| BLAKE2b-256 |
1ccbae949cc706d4dddaa4e459b5f517a1b31f6e6bc5afe9f8b21ebfa5ed493c
|
File details
Details for the file tgframework_bot-2.0.1-py3-none-any.whl.
File metadata
- Download URL: tgframework_bot-2.0.1-py3-none-any.whl
- Upload date:
- Size: 35.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
871cba0c56080cc771166af96a58a2e965c74fe6881bc68d1a213fb95959faa3
|
|
| MD5 |
c4b92d5fb93a730ae26518190bd697db
|
|
| BLAKE2b-256 |
bb6a5178abc3ab8b1caded9f92027946112f03143352b07b733d7953ebf32865
|