Разработка бота для автоматической публикации товаров из сайта в Instagram
Бот автоматически берёт товары из каталога сайта и публикует их в Instagram — с фото, описанием, ценой, хэштегами. Без ручной работы контент-менеджера, без дублирования данных, без опозданий.
Как это работает технически
Instagram не предоставляет прямой публичный API для постинга от имени личного аккаунта. Официальный путь — Instagram Graph API через Meta Business Suite. Он позволяет публиковать фото, карусели и Reels для бизнес-аккаунтов и аккаунтов авторов.
Схема интеграции:
- Сайт (CMS/магазин) → очередь задач (Redis + BullMQ или Laravel Queue)
- Воркер достаёт задачу → подготавливает медиа и текст
- Запрос к Graph API: загрузка изображения → создание контейнера → публикация
POST https://graph.facebook.com/v19.0/{ig-user-id}/media
?image_url=https://cdn.example.com/products/123.jpg
&caption=Новинка%3A%20Кроссовки%20Air%20Max%0A%0AЦена%3A%201290%20руб.%0A%0A%23кроссовки%20%23обувь
&access_token={PAGE_ACCESS_TOKEN}
POST https://graph.facebook.com/v19.0/{ig-user-id}/media_publish
?creation_id={container-id}
&access_token={PAGE_ACCESS_TOKEN}
Для публикации карусели (несколько фото товара) — сначала создаются дочерние контейнеры для каждого изображения, затем родительский контейнер типа CAROUSEL.
Что нужно со стороны клиента
- Instagram Business или Creator аккаунт
- Привязанная Facebook Page
- Приложение Meta с правами
instagram_basic,instagram_content_publish,pages_read_engagement - Long-lived access token (действует 60 дней, необходимо автообновление)
Автообновление токена реализуется через scheduled job — за 7 дней до истечения токен обменивается на новый через /oauth/access_token?grant_type=fb_exchange_token.
Генерация подписи к посту
Шаблон подписи собирается из полей товара:
def build_caption(product):
lines = [
f"✨ {product['name']}",
"",
product['short_description'][:200] if product['short_description'] else "",
"",
f"💰 Цена: {product['price']} {product['currency']}",
]
if product.get('sale_price'):
lines.append(f"🔥 Акционная цена: {product['sale_price']} {product['currency']}")
lines += ["", " ".join(f"#{tag}" for tag in product['tags'][:10])]
return "\n".join(line for line in lines if line is not None)
Длина подписи — до 2200 символов, хэштегов — до 30. Превышение лимита обрабатывается обрезкой описания, не хэштегов.
Триггеры публикации
| Триггер | Механизм |
|---|---|
| Новый товар в статусе «опубликован» | Webhook / Observer на модели Product |
| Изменение цены на X% | Поле price_changed_at + cron сравнение |
| Плановый постинг | Поле instagram_scheduled_at в товаре |
| Ручной запуск из админки | Кнопка → API endpoint → задача в очередь |
Дедупликация и лимиты
Graph API допускает до 25 публикаций в сутки на аккаунт (для карусели — считается как 1). Бот ведёт таблицу instagram_posts с полями product_id, ig_media_id, published_at. Перед постингом проверяется:
- не был ли товар опубликован за последние N дней
- не превышен ли дневной лимит
- доступно ли изображение по URL (HEAD-запрос с таймаутом 5с)
Сроки реализации
Базовый бот с публикацией одиночных фото — 5–7 рабочих дней. Карусель, шаблонизатор подписей, панель управления в админке, повторные попытки при ошибках API — ещё 3–5 дней.







