Реалізація автоматичного постинга нових товарів у соціальні мережі
Коли менеджер публікує товар у каталозі, система сама розсилає анонс у потрібні канали: ВКонтакте, 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 дні.







