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


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

Вкладывать деньги на старте не нужно: при выпуске ключа на счёт падает 50 ₽. Этого хватает на пять картинок или пять расшифровок — достаточно, чтобы довести первую версию до рабочего состояния и показать её людям.

Сколько времени это занимает

Ниже — реальные отрезки, не «ну примерно за недельку». Дольше всего идёт четвёртый шаг, и то потому, что там появляется ваша собственная логика.

От ключа до работающего бота: сколько занимает каждый шаг
От ключа до работающего бота: сколько занимает каждый шаг

Как устроен любой запрос

Схема одинаковая для всех операций: картинка, озвучка, музыка, видео — разница только в названии операции и в наборе полей. Вы отправляете один POST, получаете номер задачи, а через несколько секунд забираете ссылку на готовый файл.

Путь одного запроса: задача, номер, готовый файл
Путь одного запроса: задача, номер, готовый файл

Базовый адрес один: https://genius-bot.ru/wp-json/genius/v1. Ключ передаётся заголовком Authorization: Bearer ВАШ_КЛЮЧ — так же, как в большинстве известных вам сервисов.

Шаг 1. Ключ — две минуты

  1. Откройте раздел API и войдите — через Телеграм, ВКонтакте или почту, как удобнее.
  2. Нажмите «Получить ключ». Ключ выдаётся сразу, вместе с ним появляется секрет — он понадобится позже, для проверки подписи уведомлений.
  3. Скопируйте оба значения к себе. Ключ показывается один раз.

Проверьте, что ключ живой. Команда ниже работает в любом терминале — в Linux, в macOS, в Windows через PowerShell:

curl -H "Authorization: Bearer ВАШ_КЛЮЧ" \
     https://genius-bot.ru/wp-json/genius/v1/balance

В ответ приходит баланс. Подаренные деньги показаны отдельной строкой:

{"balance":50,"currency":"RUB","trial":50,
 "trial_note":"Пробные деньги за выпуск ключа: тратятся только на запросы к API."}
Ключ — это пароль к вашим деньгам. Его нельзя класть в публичный репозиторий и нельзя вставлять в код страницы: всё, что попало в браузер, видно любому посетителю. Ключ живёт на сервере, а страница обращается к вашему серверу — не напрямую к нам.

Шаг 2. Первый файл — одной командой

Самая дешёвая проверка — картинка по описанию, 9 ₽. Ставим задачу:

curl -X POST https://genius-bot.ru/wp-json/genius/v1/generate \
     -H "Authorization: Bearer ВАШ_КЛЮЧ" \
     -H "Content-Type: application/json" \
     -d '{"service":"image","prompt":"кофе на столе, вид сверху, тёплый свет"}'

Ответ приходит мгновенно — это ещё не картинка, а номер задачи:

{"task_id":"ea320b3512ae7a65a87e06830dc906ad","service":"image",
 "status":"pending","cost":9,"balance":433.53}

Через 10–40 секунд спрашиваем результат по этому номеру:

curl -H "Authorization: Bearer ВАШ_КЛЮЧ" \
     https://genius-bot.ru/wp-json/genius/v1/tasks/ea320b3512ae7a65a87e06830dc906ad
{"task_id":"ea320b3512ae7a65a87e06830dc906ad","service":"image",
 "status":"completed",
 "files":[{"label":"Результат","kind":"image",
           "url":"https://genius-bot.ru/wp-content/uploads/…/ea320b35-d5d0d8ee.jpg"}],
 "cost":9}

Откройте ссылку в браузере — это ваш первый файл, сделанный из вашей команды. Всё остальное в этой статье — обвязка вокруг этих двух запросов.

Про деньги. Стоимость списывается в момент создания задачи, а не в момент готовности. Если задача не удалась, деньги возвращаются на баланс автоматически — доплачивать за чужой сбой не нужно.

Шаг 3. То же самое из кода

Пятнадцать строк на Python, которые делают обе части: ставят задачу и ждут файл. Сохраните как 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 + " не успела за отведённое время")


if __name__ == "__main__":
    files = generate("image", prompt="кофе на столе, вид сверху, тёплый свет")
    print(files[0]["url"])

Запуск — две команды:

pip install requests
python genius.py

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

Читать  Как запустить свой проект на нейросетях в одиночку: пошаговая инструкция

Если вам ближе JavaScript, то же самое на Node:

const BASE = "https://genius-bot.ru/wp-json/genius/v1";
const HEAD = { "Authorization": "Bearer " + process.env.GENIUS_KEY,
               "Content-Type": "application/json" };

async function generate(service, fields) {
  const made = await fetch(BASE + "/generate", { method: "POST", headers: HEAD,
    body: JSON.stringify({ service, ...fields }) }).then(r => r.json());

  for (let i = 0; i < 120; i++) {
    await new Promise(r => setTimeout(r, 5000));
    const state = await fetch(`${BASE}/tasks/${made.task_id}`,
                              { headers: HEAD }).then(r => r.json());
    if (state.status === "completed") return state.files;
    if (state.status === "failed") throw new Error(state.message);
  }
  throw new Error("задача не успела");
}

Шаг 4. Бот, который принимает заказы

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

import telebot                      # pip install pytelegrambotapi
from genius import generate         # функция из прошлого шага

bot = telebot.TeleBot("ТОКЕН_ОТ_BOTFATHER")
free_left = {}                      # сколько бесплатных осталось у человека


@bot.message_handler(commands=["start"])
def hello(message):
    free_left.setdefault(message.chat.id, 3)
    bot.send_message(message.chat.id,
                     "Пришлите описание картинки — верну готовое изображение.\n"
                     "Первые три бесплатно.")


@bot.message_handler(func=lambda m: True)
def draw(message):
    chat = message.chat.id
    if free_left.get(chat, 3) <= 0:
        bot.send_message(chat, "Бесплатные закончились. Напишите @ваш_ник, "
                               "чтобы продолжить.")
        return

    note = bot.send_message(chat, "Рисую, это занимает около полуминуты…")
    try:
        files = generate("image", prompt=message.text)
    except Exception as error:
        bot.edit_message_text("Не получилось: %s" % error, chat, note.message_id)
        return

    free_left[chat] = free_left.get(chat, 3) - 1
    bot.delete_message(chat, note.message_id)
    bot.send_photo(chat, files[0]["url"],
                   caption="Готово. Осталось бесплатных: %d" % free_left[chat])


bot.infinity_polling()

Токен бота берётся у @BotFather за минуту. Запускается всё так:

pip install requests pytelegrambotapi
python bot.py

Пока скрипт работает, бот отвечает. Закрыли терминал — бот замолчал; этим займёмся на следующем шаге.

Что доделать до того, как показывать бота людям:

  • Счётчик бесплатных живёт в памяти. После перезапуска у всех снова три попытки. Для начала хватит, но как только пойдут люди — переносите в файл или в SQLite, это пара строк.
  • Приём денег. Проще всего начать вручную: человек пишет вам, вы принимаете перевод и снимаете ограничение. Автоматическая оплата — следующий шаг, а не первый.
  • Длинные операции. Музыка и видео идут минуты, а не секунды. Предупреждайте об этом сообщением, иначе человек решит, что бот завис.
  • Свой предел. Поставьте потолок расходов в день: одна ошибка в цикле способна съесть баланс за час.

Шаг 5. Чтобы работало без вас

Бот полезен, когда отвечает круглосуточно, а не пока открыт ваш ноутбук. Для этого нужен сервер: подойдёт самый дешёвый — арендовать 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 requests pytelegrambotapi

Описываем службу, чтобы бот сам поднимался после перезагрузки и после падения — файл /etc/systemd/system/mybot.service:

[Unit]
Description=Мой бот на Genius API
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        # смотреть, что происходит

Всё. С этого момента бот живёт своей жизнью, а вы видите его дневник одной командой.

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

Вебхук: чтобы не спрашивать, а узнавать

Опрос статуса раз в пять секунд — нормально для бота и скрипта. Но если запросов много или операция долгая, удобнее, чтобы мы сами сообщили о готовности. Для этого добавьте в запрос callback_url:

{"service":"music","prompt":"спокойный лоуфай для кофейни",
 "callback_url":"https://ваш-сервер.ру/genius"}

Когда файл готов, мы постучимся на этот адрес и принесём тот же ответ, что отдаёт /tasks/…. Запрос подписан: в заголовке X-Genius-Signature лежит HMAC-SHA256 от тела, посчитанный вашим секретом. Проверять подпись обязательно — иначе на ваш адрес сможет написать кто угодно:

import hashlib
import hmac
from fastapi import FastAPI, Request

SECRET = "секрет_из_кабинета"
app = FastAPI()


@app.post("/genius")
async def ready(request: Request):
    body = await request.body()
    mine = hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(mine, request.headers.get("X-Genius-Signature", "")):
        return {"ok": False}

    task = await request.json()
    if task["status"] == "completed":
        print("готово:", task["task_id"], task["files"][0]["url"])
    return {"ok": True}
Вебхук требует сервера с адресом, доступным снаружи. Если его пока нет — спокойно оставайтесь на опросе: он работает из любого места, в том числе с домашнего компьютера.

Что брать под свою задачу

Одним ключом открываются 26 операций. Самые ходовые — ниже; название из строки service подставляется в запрос без изменений.

Операции Genius-bot API с ценами за один запуск
Операции Genius-bot API с ценами за один запуск

Сколько это стоит на самом деле

Считать удобно не в рублях за запрос, а в результатах за тысячу рублей — сразу видно, на чём строится продукт:

Операция service Цена Сколько на 1000 ₽
Картинка по описанию image 9 ₽ 111 картинок
Текст песни lyrics 9 ₽ 111 текстов
Расшифровка записи stt 10 ₽ 100 расшифровок
Озвучка текста tts 18 ₽ 55 озвучек
Оживить фото photo-video 25 ₽ 40 роликов
Создать музыку music 59 ₽ 16 треков
Видео по описанию video 119 ₽ 8 роликов
Говорящий аватар avatar 120 ₽ 8 роликов

Дальше арифметика простая. Если ваш бот делает обложки и вы берёте за пакет из трёх штук 300 ₽, себестоимость пакета — 27 ₽. Остальное уходит на вашу работу, продвижение и прибыль. Главное — знать первую цифру, чтобы не продавать в минус на длинных операциях вроде дубляжа.

Цены в статье могут устареть, ответ сервиса — нет. Актуальный список с ценами и полями всегда отдаёт GET /wp-json/genius/v1/services, и ключ для этого запроса не нужен.

Когда что-то пошло не так

Сервис отвечает понятным кодом и текстом по-русски. Вот всё, что вы реально встретите:

Код Что случилось Что делать
401 Ключа нет в заголовке или он отозван Проверьте Authorization: Bearer и сам ключ в разделе API
402 На балансе меньше, чем стоит операция Пополните счёт; в ответе видно, сколько есть и сколько нужно
400 Не хватает обязательного поля или операция названа неверно Сверьтесь со списком /services: там перечислены поля каждой операции
429 Больше 60 запросов в минуту с одного ключа Почти всегда это цикл без паузы. Ставьте sleep между попытками
404 Задача не найдена Проверьте номер: он выдаётся один раз при создании
403 Задача принадлежит другому ключу Спрашивайте статус тем же ключом, которым создавали
502 / 503 Сбой на стороне модели или операция временно выключена Повторите через минуту; деньги за неудачную задачу возвращаются сами

Чек-лист: что должно быть готово к концу вечера

  1. Ключ получен, /balance отвечает вашим балансом.
  2. Первый файл создан командой из терминала и открывается по ссылке.
  3. Скрипт genius.py работает у вас на компьютере.
  4. Бот отвечает в Телеграме и присылает результат.
  5. Бот поднят на сервере и переживает перезагрузку.
  6. Поставлен предел расходов и придуман способ принимать деньги.
Читать  Как запустить свой проект на нейросетях в одиночку: пошаговая инструкция

Дальше расширяется просто: новая операция — это другое значение service и другие поля, вся остальная обвязка уже написана. Полная справка по всем 26 операциям, готовая спецификация OpenAPI и коллекция Postman лежат в разделе API. Если хочется сначала пощупать инструменты руками, без кода — они же собраны в нашем боте и в кабинете озвучки.

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