Как создать чат-бота в Telegram для приёма заказов: aiogram 3
Продвинутый туториал: создаём Telegram-бота для приёма заказов на Python + aiogram 3. FSM для состояний, кнопки, интеграция с БД, деплой на VPS.
Besedilni vodnik
Продвинутый туториал: создаём Telegram-бота для приёма заказов на Python + aiogram 3. FSM для состояний, кнопки, интеграция с БД, деплой на VPS.
Как создать чат-бота в Telegram для приёма заказов: aiogram 3
В этом продвинутом туториале создадим полноценного Telegram-бота для приёма заказов на Python с библиотекой aiogram 3. Бот будет принимать ссылку, количество, услугу, сохранять заказы в SQLite и отправлять уведомления администратору.
Требования
- Python 3.10+.
- Telegram-бот через @BotFather (токен).
- VPS или локальная машина для запуска (рекомендуется VPS для 24/7).
- Базовые знания Python.
Шаг 1. Установка зависимостей
Создайте виртуальное окружение и установите пакеты:
python -m venv venv
source venv/bin/activate # Linux/Mac
# или venv\\Scripts\\activate на Windows
pip install aiogram==3.4.1 aiosqlite pydantic
Структура проекта:
tg-bot/
├── bot.py
├── config.py
├── db.py
├── handlers/
│ ├── __init__.py
│ ├── start.py
│ └── order.py
└── keyboards.py
Шаг 2. Конфигурация
# config.py
import os
from dataclasses import dataclass
@dataclass
class Config:
bot_token: str = os.getenv("BOT_TOKEN", "YOUR_TOKEN_HERE")
admin_id: int = int(os.getenv("ADMIN_ID", "123456789"))
db_path: str = "orders.db"
config = Config()
Шаг 3. Инициализация бота
# 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())
Шаг 4. База данных
# db.py
import aiosqlite
from config import config
async def init_db():
async with aiosqlite.connect(config.db_path) as db:
await db.execute('''
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
username TEXT,
service TEXT NOT NULL,
link TEXT NOT NULL,
quantity INTEGER NOT NULL,
status TEXT DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
await db.commit()
async def create_order(user_id: int, username: str, service: str, link: str, quantity: int):
async with aiosqlite.connect(config.db_path) as db:
cursor = await db.execute(
'INSERT INTO orders (user_id, username, service, link, quantity) VALUES (?, ?, ?, ?, ?)',
(user_id, username, service, link, quantity)
)
await db.commit()
return cursor.lastrowid
Шаг 5. Клавиатуры
# keyboards.py
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.utils.keyboard import InlineKeyboardBuilder, InlineKeyboardButton
def main_menu():
return ReplyKeyboardMarkup(
keyboard=[
[KeyboardButton(text="📦 Сделать заказ")],
[KeyboardButton(text="📋 Мои заказы"), KeyboardButton(text="ℹ️ Помощь")]
],
resize_keyboard=True
)
def services_kb():
kb = InlineKeyboardBuilder()
services = [
("Подписчики Instagram", "ig_followers"),
("Лайки Instagram", "ig_likes"),
("Просмотры Telegram", "tg_views"),
("Подписчики YouTube", "yt_subs"),
]
for name, code in services:
kb.button(text=name, callback_data=f"service:{code}")
kb.adjust(1)
return kb.as_markup()
Шаг 6. Обработчик /start
# handlers/start.py
from aiogram import Router, F
from aiogram.filters import CommandStart
from aiogram.types import Message
from keyboards import main_menu
from db import init_db
router = Router()
@router.message(CommandStart())
async def cmd_start(message: Message):
await init_db()
await message.answer(
f"Привет, {message.from_user.first_name}!\\n"
f"Я бот приёма заказов SMMBoost.\\n"
f"Выберите действие:",
reply_markup=main_menu()
)
@router.message(F.text == "ℹ️ Помощь")
async def help_handler(message: Message):
await message.answer(
"📌 <b>Помощь</b>\\n\\n"
"1. Нажмите «Сделать заказ»\\n"
"2. Выберите услугу\\n"
"3. Укажите ссылку на профиль/пост\\n"
"4. Введите количество\\n"
"5. Подтвердите заказ\\n\\n"
"Поддержка: @smmboost_support"
)
Шаг 7. FSM для заказа
# handlers/order.py
from aiogram import Router, F
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.types import Message, CallbackQuery
from keyboards import services_kb, main_menu
from db import create_order
from config import config
router = Router()
class OrderForm(StatesGroup):
service = State()
link = State()
quantity = State()
@router.message(F.text == "📦 Сделать заказ")
async def start_order(message: Message, state: FSMContext):
await message.answer("Выберите услугу:", reply_markup=services_kb())
await state.set_state(OrderForm.service)
@router.callback_query(OrderForm.service, F.data.startswith("service:"))
async def service_selected(cb: CallbackQuery, state: FSMContext):
service_code = cb.data.split(":")[1]
await state.update_data(service=service_code)
await cb.message.answer("Отправьте ссылку на профиль или пост:")
await state.set_state(OrderForm.link)
@router.message(OrderForm.link)
async def link_received(message: Message, state: FSMContext):
link = message.text.strip()
if not link.startswith(("http://", "https://")):
await message.answer("❌ Неверная ссылка. Отправьте URL:")
return
await state.update_data(link=link)
await message.answer("Введите количество (от 10 до 100000):")
await state.set_state(OrderForm.quantity)
@router.message(OrderForm.quantity)
async def quantity_received(message: Message, state: FSMContext):
try:
quantity = int(message.text)
if not (10 <= quantity <= 100000):
raise ValueError()
except ValueError:
await message.answer("❌ Введите число от 10 до 100000:")
return
data = await state.get_data()
order_id = await create_order(
user_id=message.from_user.id,
username=message.from_user.username or "",
service=data["service"],
link=data["link"],
quantity=quantity
)
# Уведомление администратору
admin_text = (
f"🔔 <b>Новый заказ #{order_id}</b>\\n\\n"
f"Услуга: {data['service']}\\n"
f"Ссылка: {data['link']}\\n"
f"Количество: {quantity}\\n"
f"Клиент: @{message.from_user.username or 'нет'}"
)
await message.bot.send_message(config.admin_id, admin_text)
await message.answer(
f"✅ Заказ #{order_id} принят!\\n"
f"Мы свяжемся с вами в течение 30 минут.",
reply_markup=main_menu()
)
await state.clear()
Шаг 8. Запуск бота
python bot.py
Откройте бота в Telegram, нажмите /start, протестируйте полный цикл заказа.
Шаг 9. Деплой на VPS
- Загрузите файлы на VPS через SCP или Git.
- Установите Python 3.10+ и зависимости.
- Создайте systemd-сервис для автозапуска:
# /etc/systemd/system/tgbot.service
[Unit]
Description=Telegram SMM Bot
After=network.target
[Service]
User=root
WorkingDirectory=/root/tg-bot
ExecStart=/root/tg-bot/venv/bin/python bot.py
Restart=always
RestartSec=5
Environment=BOT_TOKEN=your_token
Environment=ADMIN_ID=your_id
[Install]
WantedBy=multi-user.target
Запуск:
systemctl daemon-reload
systemctl enable tgbot
systemctl start tgbot
systemctl status tgbot
Логи: journalctl -u tgbot -f.
Расширения
- Оплата через Telegram Payments — добавьте кнопку оплаты после подтверждения.
- Админ-панель — команды /admin для просмотра заказов и статистики.
- Webhook вместо polling для высокой нагрузки.
- PostgreSQL вместо SQLite для продакшена.
- i18n — мультиязычность через gettext.
Чек-лист готового бота
- [ ] Бот отвечает на /start.
- [ ] Меню работает (3 кнопки).
- [ ] Выбор услуги через inline-кнопки.
- [ ] Валидация ссылки (только URL).
- [ ] Валидация количества (10–100000).
- [ ] Заказ сохраняется в SQLite.
- [ ] Администратор получает уведомление.
- [ ] Бот запущен на VPS через systemd.
Заключение
Создание Telegram-бота для приёма заказов на aiogram 3 — задача на 4–6 часов для разработчика среднего уровня. Используйте FSM для управления состояниями, SQLite для хранения заказов, systemd для 24/7 работы на VPS. Готовый бот обрабатывает заказы автоматически, освобождая время менеджера. Расширяйте функционал постепенно: оплата, админ-панель, webhook, мультиязычность. Системный бот экономит 20–40 часов в месяц на ручной обработке заказов.
Je bilo to koristno?
Vaše mnenje nam pomaga izboljševati vodnike.