Телеграм-бот с нейросетью внутри — самый короткий путь от «хочу свой продукт» до «мне заплатили». Не нужен сайт, не нужна регистрация пользователей, не нужен дизайнер: человек пишет боту, бот присылает готовое. Эта инструкция доводит до работающего бота за один вечер, даже если вы никогда не писали код.
Своего кода в таком боте — сорок строк. Всё тяжёлое — генерацию картинок, озвучки, музыки и видео — делает наше API: вы отправляете запрос, получаете файл. Держать модели у себя и покупать видеокарту не нужно.

Шаг 1. Решите, что бот делает
Главная ошибка первого бота — «он будет уметь всё». Такой не запускается никогда. Бот должен делать одно действие и делать его сразу. Вот три, которые покупают чаще других, с настоящей себестоимостью одного результата:
| Бот | Кому продаётся | Операция | Себестоимость |
|---|---|---|---|
| Картинка по описанию | вёрстка постов, карточки товара, иллюстрации | image |
9 ₽ |
| Озвучка текста | монтажёры роликов, объявления, обучающие курсы | tts |
18 ₽ |
| Расшифровка записи | журналисты, юристы, кто ведёт созвоны | stt |
10 ₽ |
Дальше по тексту собираем первый вариант — бот, который рисует картинку по описанию. Чтобы получить любой из двух других, меняется одна строка: название операции и поле с данными.
Шаг 2. Токен бота — две минуты
- Напишите @BotFather команду
/newbot. - Придумайте имя и адрес — адрес должен заканчиваться на
bot. - Скопируйте токен. Выглядит он так:
7123456789:AAH…
/revoke у BotFather, и старый токен мёртв.
Шаг 3. Скелет: бот, который отвечает
Сначала убедимся, что связь есть. Установите библиотеку и запустите десять строк:
pip install pytelegrambotapi requests
import telebot
bot = telebot.TeleBot("ТОКЕН_ОТ_BOTFATHER")
@bot.message_handler(func=lambda m: True)
def echo(message):
bot.send_message(message.chat.id, "Слышу вас: " + message.text)
bot.infinity_polling()
Запустили, написали боту в Телеграме, получили ответ — дальше можно строить что угодно. Не ответил — почти всегда дело в токене: проверьте, что скопировали его целиком, вместе с двоеточием.
Шаг 4. Подключаем генерацию
Теперь мозг. Получите ключ в разделе API — при выпуске на счёт падает 50 ₽, это пять картинок, хватит на отладку. Положите рядом файл genius.py:
import time
import requests
API_KEY = "gb_вставьте_свой_ключ"
BASE = "https://genius-bot.ru/wp-json/genius/v1"
HEADERS = {"Authorization": "Bearer " + API_KEY}
def generate(service, wait=600, **fields):
"""Ставит задачу и ждёт результат. Возвращает список готовых файлов."""
answer = requests.post(BASE + "/generate", headers=HEADERS,
json={"service": service, **fields}, timeout=60)
answer.raise_for_status()
task_id = answer.json()["task_id"]
deadline = time.time() + wait
while time.time() < deadline:
time.sleep(5)
state = requests.get(BASE + "/tasks/" + task_id,
headers=HEADERS, timeout=60).json()
if state["status"] == "completed":
return state["files"]
if state["status"] == "failed":
raise RuntimeError(state.get("message") or "задача не удалась")
raise TimeoutError("задача " + task_id + " не успела за отведённое время")
Проверьте отдельно, до всякого бота: python -c "import genius; print(genius.generate('image', prompt='кот в шляпе')[0]['url'])". Появилась ссылка — генерация работает, и дальше отлаживать придётся только своё.
Подробный разбор самого API — что ещё оно умеет, как ловить ошибки и как получать уведомление вместо ожидания — лежит в отдельной статье: инструкция по запуску на API.
Шаг 5. Бот целиком
Соединяем. Этот бот принимает описание, рисует картинку и следит, чтобы бесплатные попытки не кончались в один вечер по вине одного человека:
import sqlite3
import telebot
from genius import generate
bot = telebot.TeleBot("ТОКЕН_ОТ_BOTFATHER")
FREE = 3 # бесплатных картинок на человека
CONTACT = "@ваш_ник" # куда писать за продолжением
db = sqlite3.connect("bot.db", check_same_thread=False)
db.execute("CREATE TABLE IF NOT EXISTS used (chat INTEGER PRIMARY KEY, n INTEGER)")
db.commit()
def used(chat):
row = db.execute("SELECT n FROM used WHERE chat = ?", (chat,)).fetchone()
return row[0] if row else 0
def count(chat):
db.execute("INSERT INTO used (chat, n) VALUES (?, 1) "
"ON CONFLICT (chat) DO UPDATE SET n = n + 1", (chat,))
db.commit()
@bot.message_handler(commands=["start"])
def hello(message):
bot.send_message(message.chat.id,
"Пришлите описание картинки — верну готовое изображение.\n"
"Чем подробнее опишете, тем ближе результат.\n"
f"Первые {FREE} бесплатно.")
@bot.message_handler(func=lambda m: True)
def draw(message):
chat = message.chat.id
left = FREE - used(chat)
if left <= 0:
bot.send_message(chat, f"Бесплатные закончились. Напишите {CONTACT} — "
"продолжим за небольшую плату.")
return
note = bot.send_message(chat, "Рисую, это занимает около полуминуты…")
try:
files = generate("image", prompt=message.text)
except Exception as error:
bot.edit_message_text(f"Не получилось: {error}", chat, note.message_id)
return
count(chat)
bot.delete_message(chat, note.message_id)
bot.send_photo(chat, files[0]["url"],
caption=f"Готово. Осталось бесплатных: {left - 1}")
bot.infinity_polling()
Счётчик лежит в файле bot.db, а не в памяти: после перезапуска бот помнит, кто сколько потратил. Это ровно то место, на котором обжигаются все — первая версия со словарём в памяти обнуляет лимиты при каждом обновлении кода.
GET /balance раз в сутки и держите на счету столько, сколько готовы потерять в худший день.
Шаг 6. Как брать деньги
Не откладывайте этот шаг до «когда будет много пользователей». Первый платёж — единственная честная проверка, что продукт кому-то нужен. Начинать проще всего так:
- Вручную. Кончились бесплатные — человек пишет вам, переводит деньги, вы прибавляете ему попыток одной строкой в базе. Выглядит кустарно, зато работает в первый же вечер и не требует ни кассы, ни договора.
- Пакетами. Продавайте не «одну картинку», а набор: 20 картинок за 299 ₽. Себестоимость набора — 180 ₽, и вам не приходится пересчитывать каждый запрос.
- Через оплату в Телеграме. Когда заказы пойдут потоком, подключите платежи прямо в боте: человек платит, не выходя из чата. К этому моменту вы уже будете знать, что и за сколько продаётся.
Цену берите не от себестоимости, а от того, сколько человек экономит. Двадцать обложек за 299 ₽ — это дешевле одного часа дизайнера, и покупатель сравнивает именно с этим, а не с вашими девятью рублями за запуск.
Шаг 7. Чтобы бот работал без вас
Пока скрипт запущен у вас на компьютере, бот молчит по ночам и после каждого закрытия крышки. Переезд занимает полчаса. Нужен самый дешёвый сервер — арендовать VPS можно за несколько сотен рублей в месяц, боту на Python этого хватает с запасом.
apt update && apt install -y python3-venv
mkdir -p /opt/mybot && cd /opt/mybot
# сюда кладём genius.py и bot.py
python3 -m venv venv
venv/bin/pip install pytelegrambotapi requests
Чтобы бот поднимался сам после перезагрузки и после падения, опишите его службой — файл /etc/systemd/system/mybot.service:
[Unit]
Description=Телеграм-бот с нейросетью
After=network-online.target
[Service]
WorkingDirectory=/opt/mybot
ExecStart=/opt/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl enable --now mybot
journalctl -u mybot -f # смотреть, что происходит прямо сейчас
С этого момента бот живёт сам: перезагрузился сервер — поднялся, упал от ошибки — перезапустился через пять секунд.
На чём спотыкаются в первый вечер
| Что видно | Что на самом деле | Что делать |
|---|---|---|
| Бот не отвечает вообще | Неверный или обрезанный токен | Скопируйте токен заново целиком, вместе с двоеточием |
| Отвечает через раз | Запущены две копии бота | Оставьте одну: либо на компьютере, либо на сервере |
| «Не получилось: 401» | Ключ API не подставился или отозван | Проверьте API_KEY в genius.py и ключ в разделе API |
| «Не получилось: 402» | Кончились деньги на балансе | Пополните счёт; за неудачные задачи деньги возвращаются сами |
| Картинка приходит, но не та | Слишком короткое описание | Просите у человека подробностей: что, где, в каком стиле, каким планом |
| Лимиты сбрасываются | Счётчик живёт в памяти, а не в базе | Храните в SQLite, как в примере выше |
| Баланс тает сам | Кто-то шлёт сообщения автоматом | Ограничьте частоту: не больше одного запроса в минуту с человека |
Чек-лист: бот готов, когда
- Отвечает на
/startи объясняет, что от человека нужно. - Присылает результат и говорит, сколько бесплатных осталось.
- Не падает от ошибки поставщика, а пишет о ней по-человечески.
- Помнит лимиты после перезапуска.
- Живёт на сервере и поднимается сам.
- Знает, что ответить, когда бесплатные кончились, — иначе первый же готовый платить уйдёт.
Дальше расширять просто: чтобы вместо картинок бот озвучивал текст, поменяйте generate("image", prompt=…) на generate("tts", text=…) и отправляйте результат как аудио. Все 26 операций с ценами и полями — в разделе API, разбор самого API — в пошаговой инструкции по запуску. Посмотреть, как это выглядит у нас, можно в нашем боте.
