Розробка бота для автоматичної публікації товарів з сайту в Telegram-канал
Бот бере товари з каталогу сайту та публікує їх у Telegram-канал: з фотографією, описом, ціною та кнопкою переходу на сторінку товару. Підходить для магазинів, які хочуть використовувати Telegram-канал як додатковий канал продажів без ручного оформлення кожного поста.
Архітектура
Scheduler (Cron/Celery Beat)
↓
ProductPublisher Service
↓ — вибірка товарів для публікації
Database (products)
↓ — скачування зображення
CDN / S3
↓ — відправка поста
Telegram Bot API (sendPhoto / sendMediaGroup)
↓ — відмітка як опубліковано
Database (telegram_posts)
Формування публікації
import httpx
from aiogram import Bot
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
bot = Bot(token=BOT_TOKEN)
async def publish_product(product: dict) -> None:
caption = (
f"<b>{product['name']}</b>\n\n"
f"{product['short_description']}\n\n"
f"💰 <b>{product['price']:,.0f} ₽</b>"
)
keyboard = InlineKeyboardMarkup(inline_keyboard=[[
InlineKeyboardButton(
text="🛒 Купити",
url=f"https://example.com/products/{product['slug']}"
)
]])
if product.get('images'):
await bot.send_photo(
chat_id=CHANNEL_ID,
photo=product['images'][0]['url'],
caption=caption,
parse_mode='HTML',
reply_markup=keyboard
)
else:
await bot.send_message(
chat_id=CHANNEL_ID,
text=caption,
parse_mode='HTML',
reply_markup=keyboard
)
# Відмітка як опубліковано
await db.execute(
'INSERT INTO telegram_posts (product_id, channel_id, published_at) VALUES ($1, $2, NOW())',
product['id'], CHANNEL_ID
)
Розклад публікації
Публікація кількох постів поряд — поганий тон. Оптимально: 1–3 товара у день, у визначений час:
# Celery Beat Schedule
CELERYBEAT_SCHEDULE = {
'publish-morning': {
'task': 'bot.tasks.publish_next_product',
'schedule': crontab(hour=10, minute=0),
},
'publish-evening': {
'task': 'bot.tasks.publish_next_product',
'schedule': crontab(hour=19, minute=0),
},
}
Черга публікації
Товари не вибираються випадково — формується черга:
- Пріоритет за датою створення товару або ручною сортуванням в адмінці
- Товари, уже опубліковані менше 30 днів назад, пропускаються
- Неактивні товари виключаються автоматично
- Оператор може позначити товар як «опублікувати наступним»
Терміни
Бот з розкладом публікації та чергою: 3–5 робочих днів.







