Как создать свой Telegram-бот для SMM с помощью aiogram 3
Полный гайд по созданию Telegram-бота на aiogram 3: установка окружения, хендлеры, клавиатуры, FSM для заказов и деплой на сервер.
Текстово ръководство
Полный гайд по созданию Telegram-бота для SMM на aiogram 3: установка, хендлеры, клавиатуры, FSM для заказов, деплой на сервер.
Как создать свой Telegram-бот для SMM с помощью aiogram 3
aiogram 3 — современный асинхронный фреймворк для Telegram-ботов на Python. В этом туториале создадим полноценного SMM-бота с приёмом заказов, FSM для многошаговых сценариев и интеграцией с SMM-панелью по API. Подходит для разработчиков с опытом Python. Полный код можно развернуть за 2–3 часа.
Установка окружения
Требуется Python 3.11+ и виртуальное окружение:
python -m venv venv
source venv/bin/activate # Linux/Mac
# или venv\\Scripts\\activate на Windows
pip install aiogram==3.13.1 pydantic aiosqlite aiohttp
Создайте структуру проекта:
smm_bot/
├── bot.py
├── config.py
├── handlers/
│ ├── __init__.py
│ ├── start.py
│ └── order.py
├── keyboards/
│ ├── __init__.py
│ └── reply.py
└── states/
└── order.py
Базовая структура бота
# config.py
import os
from dataclasses import dataclass
@dataclass
class Config:
bot_token: str = os.getenv("BOT_TOKEN", "")
admin_id: int = int(os.getenv("ADMIN_ID", "0"))
smm_api_url: str = "https://smmboost.io/api/v2"
smm_api_key: str = os.getenv("SMM_API_KEY", "")
config = Config()
# bot.py
import asyncio
import logging
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.fsm.storage.memory import MemoryStorage
from config import config
from handlers import start, order
async def main():
logging.basicConfig(level=logging.INFO)
bot = Bot(
token=config.bot_token,
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
)
dp = Dispatcher(storage=MemoryStorage())
dp.include_router(start.router)
dp.include_router(order.router)
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Хендлеры команд
# handlers/start.py
from aiogram import Router, types, F
from aiogram.filters import CommandStart
from keyboards.reply import main_menu
router = Router()
@router.message(CommandStart())
async def cmd_start(message: types.Message):
await message.answer(
"👋 Привет! Я SMM-бот.\\n"
"Здесь вы можете заказать подписчиков, лайки и просмотры.\\n\\n"
"Выберите услугу:",
reply_markup=main_menu()
)
@router.message(F.text == "📋 Мои заказы")
async def my_orders(message: types.Message):
# здесь запрос к БД или API панели
await message.answer("У вас пока нет заказов. Создайте первый!")
Клавиатуры
# keyboards/reply.py
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.utils.keyboard import ReplyKeyboardBuilder
def main_menu() -> ReplyKeyboardMarkup:
builder = ReplyKeyboardBuilder()
builder.add(KeyboardButton(text="📷 Instagram"))
builder.add(KeyboardButton(text="✈️ Telegram"))
builder.add(KeyboardButton(text="▶️ YouTube"))
builder.add(KeyboardButton(text="🎵 TikTok"))
builder.add(KeyboardButton(text="📋 Мои заказы"))
builder.add(KeyboardButton(text="💼 Баланс"))
builder.adjust(2, 2, 2)
return builder.as_markup(resize_keyboard=True)
FSM для заказов
FSM (Finite State Machine) — для многошаговых сценариев:
# states/order.py
from aiogram.fsm.state import State, StatesGroup
class OrderFSM(StatesGroup):
platform = State()
service = State()
link = State()
quantity = State()
confirm = State()
# handlers/order.py
from aiogram import Router, types, F
from aiogram.fsm.context import FSMContext
from states.order import OrderFSM
router = Router()
@router.message(F.text == "📷 Instagram")
async def start_order(message: types.Message, state: FSMContext):
await state.set_state(OrderFSM.service)
await message.answer(
"Выберите услугу:\\n"
"1. Подписчики\\n2. Лайки\\n3. Просмотры Reels\\n4. Комментарии"
)
@router.message(OrderFSM.service)
async def process_service(message: types.Message, state: FSMContext):
await state.update_data(service=message.text)
await state.set_state(OrderFSM.link)
await message.answer("Отправьте ссылку на профиль/пост:")
@router.message(OrderFSM.link)
async def process_link(message: types.Message, state: FSMContext):
if "instagram.com" not in message.text:
await message.answer("❌ Неверная ссылка. Попробуйте снова.")
return
await state.update_data(link=message.text)
await state.set_state(OrderFSM.quantity)
await message.answer("Укажите количество (от 100 до 100000):")
@router.message(OrderFSM.quantity)
async def process_quantity(message: types.Message, state: FSMContext):
if not message.text.isdigit():
await message.answer("❌ Введите число.")
return
qty = int(message.text)
if not (100 <= qty <= 100000):
await message.answer("❌ Допустимо от 100 до 100000.")
return
data = await state.get_data()
price = qty * 0.08 # 80 ₽ за 1000
await state.update_data(quantity=qty, price=price)
await state.set_state(OrderFSM.confirm)
await message.answer(
f"📋 Заказ:\\nУслуга: {data['service']}\\nСсылка: {data['link']}\\n"
f"Количество: {qty}\\nСтоимость: {price:.2f} ₽\\n\\nПодтвердить? (Да/Нет)"
)
@router.message(OrderFSM.confirm, F.text.lower() == "да")
async def confirm_order(message: types.Message, state: FSMContext):
data = await state.get_data()
# здесь вызов API SMM-панели
order_id = await create_smm_order(data)
await state.clear()
await message.answer(f"✅ Заказ #{order_id} создан! Статус можно проверить в «Мои заказы».")
async def create_smm_order(data: dict) -> str:
# интеграция с API панели
import aiohttp
from config import config
async with aiohttp.ClientSession() as session:
payload = {
"key": config.smm_api_key,
"action": "add",
"service": 12, # ID услуги
"link": data["link"],
"quantity": data["quantity"]
}
async with session.post(config.smm_api_url, data=payload) as resp:
result = await resp.json()
return result.get("order", "unknown")
Деплой
Для продакшена используйте systemd на VPS или Docker:
# Dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "bot.py"]
# Запуск на VPS через systemd
sudo nano /etc/systemd/system/smmbot.service
[Unit]
Description=SMM Telegram Bot
After=network.target
[Service]
User=deploy
WorkingDirectory=/home/deploy/smm_bot
ExecStart=/home/deploy/smm_bot/venv/bin/python bot.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl enable smmbot && sudo systemctl start smmbot
Тестирование и отладка
Перед запуском бота в продакшен проведите тестирование:
1. Локальное тестирование. Запустите бота на тестовом аккаунте (создайте второго бота через BotFather с токеном для тестов). Пройдите все сценарии: /start, выбор услуги, ввод ссылки, количества, подтверждение, оплата.
2. Проверка edge-cases. Что будет, если пользователь введёт текст вместо числа? Неверную ссылку? Нажмёт «Назад» в середине сценария? Обработайте все эти случаи — иначе бот «упадёт» с ошибкой.
3. Тестирование под нагрузкой. Если ожидаете 100+ одновременных пользователей — протестируйте через locust или pytest-asyncio. aiogram держит 1000+ RPS на одном процессе.
4. Логирование. Подключите Sentry для отслеживания ошибок:
import sentry_sdk
sentry_sdk.init(dsn="YOUR_SENTRY_DSN", traces_sample_rate=1.0)
5. Мониторинг. Настройте уведомления в админ-чат при падении бота. Проверяйте раз в день — systemctl status smmbot.
6. Резервное копирование. Если используете SQLite/PostgreSQL — настройте ежедневный бэкап через cron.
Итог
За 2–3 часа вы получаете полноценного Telegram-бота для SMM на aiogram 3 с FSM для заказов, клавиатурами и интеграцией с панелью по API. Для продакшена замените MemoryStorage на RedisStorage (для сохранения состояния при рестарте), добавьте базу данных (SQLite/PostgreSQL) для хранения заказов и пользователей, и настройте логирование через Sentry для отслеживания ошибок.
Что дальше
- Добавьте оплату через ЮKassa или крипту (CryptoBot API)
- Реализуйте реферальную систему с начислением бонусов
- Подключите админ-панель для операторов (отдельный чат с командами)
- Добавьте уведомления о смене статуса заказа через webhook
- Интегрируйте с Google Analytics 4 через Measurement Protocol
- Настройте A/B тестирование сообщений для повышения конверсии
Беше ли това полезно?
Вашите отзиви ни помагат да подобряваме ръководствата.