Баннеры и посты в соцсети: генерация картинок по расписанию


api генерации картинок удобно использовать не только для разовых изображений, но и для контент-плана, где к каждой теме автоматически создаётся визуал. Если темы постов уже лежат в таблице, приложение может брать строку, формировать промпт, запускать генерацию и сохранять ссылку на готовый результат. Ключ для доступа к API выдаётся после входа в разделе API; он показывается один раз.

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

Ниже разберём вариант, в котором один сценарий обслуживает ленту, сторис и обложки, а настройки стиля не приходится заново придумывать для каждого поста. За один запуск операции «Картинка по описанию» списывается 9 ₽.

1) Картинка к каждому посту без дизайнера: где предел

Самая простая автоматизация выглядит так: в таблице есть дата, тема, формат и, при необходимости, дополнительные требования к изображению. Скрипт читает очередную строку, собирает из неё описание и отправляет POST-запрос на /generate. После запуска задача получает идентификатор, а результат можно получить через GET /tasks/{id}.

У API есть базовый адрес https://genius-bot.ru/wp-json/genius/v1. Авторизация выполняется через заголовок Authorization: Bearer <ключ>. Поэтому ключ не нужно помещать непосредственно в текст промпта или передавать как параметр запроса.

Минимальный запуск операции можно сделать через curl. В запросе указывается название операции и описание того, что нужно получить:

curl -X POST "https://genius-bot.ru/wp-json/genius/v1/generate" \
  -H "Authorization: Bearer $GENIUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "service": "image",
    "prompt": "Квадратный визуал для поста о запуске нового продукта, чистая композиция, светлый фон, место для заголовка сверху, фирменная цветовая гамма бренда"
  }'

Конкретные поля операции нужно сверять со списком доступных операций через GET /services. Этот маршрут также возвращает цены. В автоматизации это полезно сделать первым шагом: приложение может проверить, что операция image доступна, а затем запустить её.

Предел такого подхода определяется не количеством строк в таблице, а качеством исходных заданий. Если в каждой строке написано только «пост про скидку», генератору не хватает информации о сюжете, композиции и визуальном языке. Если же в таблице есть тема, формат, объект, настроение и правила бренда, один и тот же сценарий становится значительно предсказуемее.

Есть и технический предел по частоте: на один ключ разрешено не более 60 запросов в минуту. Для обычного контент-плана этого достаточно, но массовую обработку всё равно стоит делать с очередью, а не отправлять сотни запросов одновременно.

Генерация картинок для соцсетей по расписанию
Генерация картинок для соцсетей по расписанию

2) Форматы под ленту, сторис и обложку

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

Условная строка таблицы может выглядеть так: дата — 25 сентября; тема — «новая коллекция»; формат — «лента»; сюжет — «предметная съёмка продукта на светлом столе»; стиль — «минималистичный, спокойный, много воздуха». Для сторис та же тема получает другое значение формата и другое композиционное требование.

Это особенно важно для картинок для соцсетей нейросеть: один и тот же текстовый запрос не должен механически использоваться для всех размещений. Если изображение предназначено для сторис, в промпте нужно явно указать вертикальную композицию и расположение главного объекта. Для обложки полезно описывать свободную область, где позднее появится заголовок.

Можно построить генератор промпта из нескольких независимых частей:

style = "минималистичный брендовый визуал, мягкий свет, чистый фон, без лишних объектов"

prompts = {
    "feed": f"Горизонтальная композиция для поста. Тема: {topic}. {style}",
    "story": f"Вертикальная композиция для сторис. Тема: {topic}. {style}. Главный объект крупно в центральной области",
    "cover": f"Обложка публикации. Тема: {topic}. {style}. Оставить свободное место сверху под заголовок"
}

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

Читать  Озвучить видео другим голосом: когда это уместно, а когда нет

Если одна тема требует три изображения, это также нужно учитывать в расчёте стоимости: операция «Картинка по описанию» стоит 9 ₽ за запуск, поэтому три отдельных запуска стоят 27 ₽. Другие операции имеют отдельные тарифы.

Операция Цена за запуск Когда может пригодиться в контент-плане
Картинка по описанию (image) 9 ₽ Новый визуал для поста, сторис или обложки
Изменить фото по описанию (image-edit) 35 ₽ Изменение уже подготовленного изображения по описанию
Увеличить качество фото (upscale) 50 ₽ Подготовка существующего изображения
Оживить фото (photo-video) 25 ₽ Когда для контента нужен движущийся вариант фотографии
Видео по описанию (video) 119 ₽ Отдельный видеоконтент из текстового задания

Цены в таблице указаны за один запуск. Для автоматизации это удобнее абонентской модели: стоимость конкретного контент-плана можно посчитать по числу фактических операций.

3) Узнаваемый стиль: как описать его один раз

Если каждый промпт начинается с нуля, стиль быстро расползается. Сегодня фон получается светлым и пустым, завтра появляется много декоративных элементов, а через неделю изменяется характер освещения. Для контент-плана лучше вынести повторяющиеся требования в отдельный блок.

Например, постоянная часть может описывать палитру, характер света, тип композиции, материалы, уровень детализации и допустимые элементы. Переменная часть отвечает только за тему конкретного поста. В результате приложение соединяет два текста перед отправкой в API.

BRAND_STYLE = """
Визуальный стиль бренда:
сдержанная предметная композиция,
мягкий рассеянный свет,
чистый фон,
минимум декоративных элементов,
натуральные материалы,
главный объект легко считывается в центре кадра,
без логотипов и текста, если они не указаны отдельно.
"""

def make_prompt(topic, format_name):
    return f"""
{BRAND_STYLE}

Тема: {topic}
Формат размещения: {format_name}

Создай изображение, соответствующее теме и указанному формату.
Не добавляй элементы, которых нет в описании темы.
"""

Такой шаблон имеет ещё одно преимущество: его можно менять отдельно от расписания. Если бренд переходит от предметных сцен к более редакционным фотографиям, достаточно изменить блок BRAND_STYLE. Строки с датами и темами при этом остаются прежними.

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

Не стоит пытаться заставить генератор одновременно решать задачу дизайнера, копирайтера и бренд-менеджера одной длинной фразой. Для автоматического контент-плана лучше иметь структуру: стиль, тема, объект, композиция, формат и ограничения. Чем стабильнее эта структура, тем проще потом найти причину неудачного результата.

Форматы изображений для ленты и сторис
Форматы изображений для ленты и сторис

4) Генерация по расписанию из таблицы тем

Для расписания удобно разделить процесс на четыре этапа. Первый — получить строки, которым уже наступило время генерации. Второй — сформировать промпт. Третий — запустить операцию и сохранить идентификатор задачи. Четвёртый — дождаться результата через /tasks/{id} или получить уведомление на callback_url.

Webhook особенно удобен, если генерация не должна блокировать весь сценарий. При запуске можно передать callback_url, а когда задача будет готова, на этот адрес придёт POST. Ваш сервер после получения уведомления может записать ссылку на результат в базу или таблицу.

Пример минимального клиента на Python с библиотекой requests выглядит так:

import os
import requests

BASE_URL = "https://genius-bot.ru/wp-json/genius/v1"
API_KEY = os.environ["GENIUS_API_KEY"]

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

payload = {
    "service": "image",
    "prompt": (
        "Визуал для публикации о новой коллекции. "
        "Минималистичная предметная сцена, мягкий свет, "
        "чистый фон, главный объект крупно, "
        "свободное пространство сверху под заголовок."
    ),
    "callback_url": "https://example.com/hooks/image-ready",
}

response = requests.post(
    f"{BASE_URL}/generate",
    headers=headers,
    json=payload,
    timeout=30,
)

response.raise_for_status()
task = response.json()

print(task)

Здесь callback_url является адресом вашего обработчика, а не адресом сервиса API. После запуска приложение должно сохранить идентификатор задачи из ответа. Если webhook не используется, отдельный процесс может периодически запрашивать GET /tasks/{id} и проверять состояние.

В реальном планировщике я бы добавил поле status в таблицу. Значения могут быть вроде pending, running, ready и error. Это не специальный формат сервиса, а внутренняя разметка вашего приложения, которая помогает не запустить одну строку дважды.

Ещё один полезный маршрут — GET /balance. Перед большой серией генераций приложение может проверить остаток и не запускать пачку, если средств недостаточно. При выпуске первого ключа на баланс начисляется 50 ₽ для пробы, поэтому первые тестовые запросы можно использовать для проверки всей цепочки: таблица → промпт → API → задача → результат.

Читать  Качество изображений из API: апскейл, артефакты и что чинить

Для расписания также нужно учитывать ограничение 60 запросов в минуту на ключ. Если утром требуется создать 100 изображений, их нельзя отправлять одной плотной пачкой. Очередь с ограничением скорости решает эту задачу на уровне приложения.

Сам контент-план при этом может оставаться простым:

Дата Тема Формат Статус
25.09 Новая коллекция feed pending
26.09 Совет по использованию продукта story pending
27.09 История бренда cover pending

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

5) Текст на картинке: почему его лучше класть поверх

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

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

Это особенно удобно для баннеров через API. Само изображение создаётся операцией image, а типографика становится отдельным этапом вашего пайплайна. Если требуется изменить только заголовок, изображение не нужно генерировать повторно.

Такой подход также помогает разделить ответственность компонентов. Генератор отвечает за визуальную сцену, ваш шаблон — за сетку и текст, а таблица — за содержание конкретной публикации. В результате изменение формулировки поста не требует нового изображения.

Для иллюстрации можно хранить в таблице отдельные поля title, subtitle и cta. В промпт попадает только описание изображения, а эти поля используются позднее при сборке финального макета.

Текст поверх сгенерированной картинки
Текст поверх сгенерированной картинки

6) Сколько стоит месяц контента

Расходы проще всего считать от количества запусков. Если публиковать один визуал в день в течение 30 дней и на каждый пост делать один запуск операции «Картинка по описанию», получится 30 × 9 ₽ = 270 ₽.

Если для каждого дня нужны две версии — например, отдельные изображения для ленты и сторис, — получится 60 запусков, или 540 ₽. Три варианта на каждый из 30 дней дадут 90 запусков и 810 ₽.

Визуалов в день Запусков за 30 дней Стоимость при 9 ₽ за запуск
1 30 270 ₽
2 60 540 ₽
3 90 810 ₽
5 150 1 350 ₽

Это расчёт только для операции «Картинка по описанию». Если часть материалов проходит через другие операции, их нужно считать отдельно. Например, изменение фотографии по описанию стоит 35 ₽ за запуск, увеличение качества — 50 ₽, а оживление фотографии — 25 ₽.

Оплата идёт за запуск, без абонентской платы и без минимального платежа. Поэтому в автоматизации нет необходимости заранее покупать фиксированный пакет генераций: расходы можно привязать к фактическому числу строк контент-плана и вариантов на каждую строку.

Для контроля бюджета достаточно хранить в таблице или базе четыре значения: операцию, количество запусков, цену операции и итоговую сумму. Цены можно получить через GET /services, а текущий остаток — через GET /balance. Это позволяет не держать тарифы в нескольких местах приложения.

Если нужен не только генератор изображений, а ещё и текстовый этап, сервис поддерживает совместимый с OpenAI формат для POST /chat/completions и GET /models. В клиентской библиотеке достаточно изменить base_url и ключ. Для чата указана цена 40 ₽ за миллион токенов запроса и 400 ₽ за миллион токенов ответа, но эти расходы относятся к текстовым операциям и не входят в расчёт изображений выше.

Частые вопросы

Какой маршрут использовать для запуска генерации изображения?

Для запуска используется POST https://genius-bot.ru/wp-json/genius/v1/generate. Запрос авторизуется заголовком Authorization: Bearer <ключ>. Ключ выдаётся в разделе API после входа и показывается один раз.

Как получить результат, если генерация выполняется не сразу?

После запуска нужно сохранить идентификатор задачи и проверять её состояние через GET /tasks/{id}. Альтернативный вариант — передать callback_url: когда задача будет готова, на указанный адрес придёт POST.

Читать  Перевести видео на другой язык: почему перевод не влезает в ролик

Можно ли запускать генерацию по расписанию?

Да, расписание можно реализовать на стороне вашего приложения: планировщик выбирает готовые строки таблицы и отправляет запросы в API. Само расписание не является отдельной операцией API; оно относится к логике вашего сценария автоматизации.

Сколько стоит одна картинка?

Операция «Картинка по описанию» стоит 9 ₽ за один запуск. Если для одного поста нужны три отдельных изображения, расчёт составляет 27 ₽, если каждый вариант запускается отдельной операцией.

Есть ли ограничение на число запросов?

На один ключ разрешено не более 60 запросов в минуту. При массовой генерации стоит использовать очередь или другой механизм ограничения скорости.

Где взять ключ и посмотреть информацию об API?

Ключ выдаётся после входа в разделе доступа к API и документации. Там же можно начать настройку подключения. Ключ показывается один раз, поэтому его стоит сохранить в переменной окружения или другом защищённом хранилище, а не прописывать непосредственно в коде.

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