🤖 документация по Telegram Bot aiogram

⚙ Каркас Telegram Bot с автоматическим завершением старых процессов Python

# ---------------------------------------------
# Библиотеки
# ---------------------------------------------
import os           # Работа с ОС, получение PID
import subprocess   # Для tasklist и taskkill
import asyncio      # Асинхронный запуск бота
import logging      # Логирование

from aiogram import Bot, Dispatcher, types
from aiogram.filters.command import Command

# ---------------------------------------------
# Убиваем другие процессы python.exe
# ---------------------------------------------
def kill_python_processes(exclude_pid=None):
    """
    Завершает все процессы python.exe на Windows, кроме exclude_pid.
    Предотвращает TelegramConflictError.
    """
    try:
        result = subprocess.run(
            'tasklist /FI "IMAGENAME eq python.exe"',
            capture_output=True, text=True, shell=True
        )
        lines = result.stdout.splitlines()
        for line in lines[3:]:
            parts = line.split()
            if len(parts) >= 2:
                pid = int(parts[1])
                if exclude_pid and pid == exclude_pid:
                    continue
                print(f"Убиваем процесс python.exe с PID={pid}")
                subprocess.run(f'taskkill /F /PID {pid}', shell=True)
    except Exception as e:
        print(f"Ошибка при попытке убить процессы: {e}")

# ---------------------------------------------
# Логирование
# ---------------------------------------------
logging.basicConfig(level=logging.INFO)

# ---------------------------------------------
# Настройка бота
# ---------------------------------------------
BOT_TOKEN = "ВАШ_ТОКЕН"
if not BOT_TOKEN:
    raise RuntimeError("Укажи BOT_TOKEN")

bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()

# ---------------------------------------------
# Хэндлер команды /start
# ---------------------------------------------
@dp.message(Command("start"))
async def cmd_start(message: types.Message):
    await message.answer("Hello!")

# ---------------------------------------------
# Асинхронный запуск бота
# ---------------------------------------------
async def main():
    print("🤖 Бот запущен…")
    await dp.start_polling(bot)

# ---------------------------------------------
# Главный блок запуска
# ---------------------------------------------
if __name__ == "__main__":
    current_pid = os.getpid()
    kill_python_processes(exclude_pid=current_pid)
    asyncio.run(main())
💡 Примечания:

⚙ Обработчик /settings с inline-клавиатурой

# ---------------------------------------------
# Импорт и команда /settings
# ---------------------------------------------
from aiogram.filters.command import Command
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
from aiogram import F



@dp.message(Command("settings"))
async def cmd_settings(message: types.Message):
    """
    При команде /settings показываем inline клавиатуру с настройками
    """
    await message.answer(
        "Настройки бота:",
        reply_markup=settings_keyboard(message.chat.id)
    )

# ---------------------------------------------
# Функция для генерации inline-клавиатуры
# ---------------------------------------------
def settings_keyboard(chat_id):
    st = get_settings(chat_id)
    kb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text=f"🎨 Mode: {st['mode']}", callback_data="mode")],
        [InlineKeyboardButton(text=f"🌈 Color: {st['color']}", callback_data="color")],
        [InlineKeyboardButton(text="🖼 Фон", callback_data="bg")]
    ])
    return kb

# ---------------- Заглушка get_settings ----------------
def get_settings(chat_id):
    """
    Возвращает словарь с настройками пользователя.
    Для теста можно вернуть фиксированные значения.
    """
    return {"mode": "Dark", "color": "Blue"}

# ---------------------------------------------
# Callback-обработчики кнопок
# ---------------------------------------------
@dp.callback_query(F.data == "mode")
async def cb_mode(c: CallbackQuery):
    await c.answer("mode!")

@dp.callback_query(F.data == "color")
async def cb_color(c: CallbackQuery):
    await c.answer("color!")

@dp.callback_query(F.data == "bg")
async def cb_bg(c: CallbackQuery):
    await c.answer("background!")
💡 Примечания: