Реализация автоматического постинга новых товаров в социальные сети
Когда менеджер публикует товар в каталоге, система сама рассылает анонс в нужные каналы: ВКонтакте, Telegram-канал, Facebook Page, Odnoklassniki. Без ручного копирования, без задержек, с правильным форматированием под каждую платформу.
Архитектура
Ядро — event-driven пайплайн. Публикация товара генерирует событие ProductPublished, которое подхватывают отдельные listener-ы для каждой соцсети. Каждый listener ставит задачу в очередь, воркер её обрабатывает независимо от остальных.
ProductPublished event
├── VkPostListener → queue: vk-posts
├── TelegramPostListener → queue: telegram-posts
├── FacebookPostListener → queue: facebook-posts
└── OdnoklassnikiPostListener → queue: ok-posts
Такая схема гарантирует, что сбой в одной соцсети не блокирует публикацию в других.
ВКонтакте
Используется VK API v5.199. Для публикации от имени сообщества нужен токен сообщества с правом wall. Загрузка фото — двухшаговая: сначала получить upload URL, потом залить файл и сохранить.
// Шаг 1: получить сервер загрузки
$uploadServer = $vk->photos->getWallUploadServer(['group_id' => $groupId]);
// Шаг 2: загрузить изображение
$uploaded = Http::attach('photo', file_get_contents($imageUrl), 'photo.jpg')
->post($uploadServer['upload_url']);
// Шаг 3: сохранить фото
$saved = $vk->photos->saveWallPhoto([
'group_id' => $groupId,
'photo' => $uploaded['photo'],
'server' => $uploaded['server'],
'hash' => $uploaded['hash'],
]);
// Шаг 4: опубликовать пост
$vk->wall->post([
'owner_id' => -$groupId,
'message' => $caption,
'attachments' => "photo{$saved[0]['owner_id']}_{$saved[0]['id']}",
]);
Telegram
Telegram Bot API — самый простой в интеграции. Метод sendPhoto или sendMediaGroup для нескольких фото. Подпись поддерживает HTML и MarkdownV2.
import httpx
async def post_to_telegram(bot_token: str, channel_id: str, photo_url: str, caption: str):
async with httpx.AsyncClient() as client:
resp = await client.post(
f"https://api.telegram.org/bot{bot_token}/sendPhoto",
json={
"chat_id": channel_id,
"photo": photo_url,
"caption": caption,
"parse_mode": "HTML",
},
timeout=15,
)
resp.raise_for_status()
return resp.json()
Лимит подписи — 1024 символа. Если описание длиннее, отправляется дополнительным сообщением через sendMessage с reply_to_message_id.
Facebook Page
Graph API v19.0, метод /{page-id}/photos. Требует Page Access Token с правом pages_manage_posts.
POST /v19.0/{page-id}/photos
?url=https://cdn.example.com/img.jpg
&message=Новый товар в каталоге...
&published=true
Шаблоны текста
Разные платформы требуют разного форматирования. Шаблоны хранятся в базе и редактируются через CMS:
| Платформа | Особенности |
|---|---|
| ВКонтакте | До 16 тыс. символов, эмодзи, ссылки кликабельны |
| Telegram | HTML-теги <b>, <i>, <a>, лимит 1024 |
| Ссылки в тексте — preview генерируется автоматически |
Переменные в шаблоне: {name}, {price}, {url}, {description}, {tags}.
Повторные попытки и мониторинг
Каждая задача в очереди имеет 3 попытки с экспоненциальной задержкой (1 мин → 5 мин → 15 мин). После исчерпания попыток — запись в таблицу failed_social_posts с телом ошибки и уведомление администратора. Метрики публикаций (успех/провал по каждой платформе) выводятся в дашборде.
Сроки реализации
Интеграция двух платформ (VK + Telegram) — 4–6 рабочих дней. Каждая дополнительная платформа — 1–2 дня. Панель управления с историей постов и шаблонами — ещё 2–3 дня.







