Как собрать телеграм-бота с нейросетью и запустить его: пошаговая инструкция


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

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

Из чего состоит телеграм-бот с нейросетью
Из чего состоит телеграм-бот с нейросетью

Шаг 1. Решите, что бот делает

Главная ошибка первого бота — «он будет уметь всё». Такой не запускается никогда. Бот должен делать одно действие и делать его сразу. Вот три, которые покупают чаще других, с настоящей себестоимостью одного результата:

Бот Кому продаётся Операция Себестоимость
Картинка по описанию вёрстка постов, карточки товара, иллюстрации image 9 ₽
Озвучка текста монтажёры роликов, объявления, обучающие курсы tts 18 ₽
Расшифровка записи журналисты, юристы, кто ведёт созвоны stt 10 ₽

Дальше по тексту собираем первый вариант — бот, который рисует картинку по описанию. Чтобы получить любой из двух других, меняется одна строка: название операции и поле с данными.

Шаг 2. Токен бота — две минуты

  1. Напишите @BotFather команду /newbot.
  2. Придумайте имя и адрес — адрес должен заканчиваться на bot.
  3. Скопируйте токен. Выглядит он так: 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, как в примере выше
Баланс тает сам Кто-то шлёт сообщения автоматом Ограничьте частоту: не больше одного запроса в минуту с человека

Чек-лист: бот готов, когда

  1. Отвечает на /start и объясняет, что от человека нужно.
  2. Присылает результат и говорит, сколько бесплатных осталось.
  3. Не падает от ошибки поставщика, а пишет о ней по-человечески.
  4. Помнит лимиты после перезапуска.
  5. Живёт на сервере и поднимается сам.
  6. Знает, что ответить, когда бесплатные кончились, — иначе первый же готовый платить уйдёт.

Дальше расширять просто: чтобы вместо картинок бот озвучивал текст, поменяйте generate("image", prompt=…) на generate("tts", text=…) и отправляйте результат как аудио. Все 26 операций с ценами и полями — в разделе API, разбор самого API — в пошаговой инструкции по запуску. Посмотреть, как это выглядит у нас, можно в нашем боте.

API для разработчиковОзвучка, музыка, видео и картинки одним ключом. Пробный баланс при выпуске.
Получить ключ