🤖 документация по 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())
💡 Примечания:
- Скрипт работает только на Windows.
- Для Linux/macOS можно заменить логику на
psutil и kill.
- Будьте осторожны — скрипт завершает все процессы python.exe, кроме текущего.
⚙ Обработчик /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!")
💡 Примечания:
- Inline-клавиатура создаётся функцией
settings_keyboard с динамическими данными.
- В будущем данные настроек можно получать из базы данных вместо заглушки
get_settings.
- Callback-обработчики используют
CallbackQuery и F.data для определения кнопки.
- Можно расширять клавиатуру новыми кнопками и обработчиками по аналогии.