Реалізація планувальника автопостинга контенту з сайту у соцмережі
Планувальник — це не просто «поставити завдання у чергу». Це інструмент управління контент-потоком: черга постів на кілька тижнів вперед, візуальний календар, обмеження частоти, пріоритети, паузи за розкладом (ніч, вихідні).
Модель даних
CREATE TABLE scheduled_posts (
id SERIAL PRIMARY KEY,
source_type VARCHAR(50), -- 'product', 'promotion', 'article', 'manual'
source_id INTEGER,
channel VARCHAR(30), -- 'vk', 'telegram', 'instagram', 'ok'
scheduled_at TIMESTAMP NOT NULL,
status VARCHAR(20) DEFAULT 'pending', -- pending|processing|sent|failed|cancelled
attempts SMALLINT DEFAULT 0,
last_error TEXT,
external_post_id VARCHAR(100), -- ID поста на платформі після публікації
content JSONB, -- сериалізований контент (текст, медіа, посилання)
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_scheduled_posts_fire ON scheduled_posts (scheduled_at, status)
WHERE status = 'pending';
Диспетчер завдань
Диспетчер запускається кожну хвилину через cron (або як демон з sleep-loop):
def dispatch_pending_posts():
now = datetime.utcnow()
posts = db.query("""
SELECT * FROM scheduled_posts
WHERE status = 'pending'
AND scheduled_at <= %s
ORDER BY scheduled_at ASC
LIMIT 50
FOR UPDATE SKIP LOCKED
""", [now])
for post in posts:
db.execute("UPDATE scheduled_posts SET status='processing' WHERE id=%s", [post.id])
enqueue_post_job(post)
FOR UPDATE SKIP LOCKED — захист від подвійної обробки при кількох воркерах.
Обмеження частоти (rate limiting)
Кожна платформа має лімити:
| Платформа | Ліміт |
|---|---|
| Instagram Graph API | 25 постів/день на аккаунт |
| ВКонтакте | 50 постів/день на сообщество |
| Telegram Bot | ~30 повідомлень/сек на бота |
| Facebook Page | без жорсткого ліміту, soft throttle |
Перед постановкою у чергу диспетчер перевіряє лічильники через Redis:
key = f"post_count:{channel}:{date.today().isoformat()}"
count = redis.incr(key)
redis.expire(key, 86400)
if count > DAILY_LIMITS[channel]:
reschedule_to_tomorrow(post)
return
Часові вікна публікації
Налаштування по каналу визначають, коли можна публікувати:
{
"vk": {
"allowed_hours": [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
"allowed_days": [1, 2, 3, 4, 5, 6, 7],
"min_interval_minutes": 30
},
"telegram": {
"allowed_hours": [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
"allowed_days": [1, 2, 3, 4, 5, 6, 7],
"min_interval_minutes": 15
}
}
Якщо пост запланований на нічний час, диспетчер зсуває його на найближче дозволене вікно.
Розумне розподілення
При включенні опції smart_schedule система не ставить усі пости в один час. Алгоритм:
- Бере всі пості зі статусом
pendingбез конкретного часу - Вичисляє доступні слоти у найближчі 7 днів з урахуванням уже запланованих
- Рівномірно розподіляє пості по слотам з мінімальним інтервалом
Це актуально для інтернет-магазинів зі сотнями товарів — щоб не публікувати все разом після імпорту каталогу.
Інтерфейс управління
В CMS — сторінка «Черга постів» з:
- Таблицею запланованих постів з фільтрами по каналу, статусу, даті
- Кнопками «Опублікувати зараз», «Перенести», «Відмінити»
- Календарним видом (місяць/тиждень) з drag-and-drop переносом слотів
- Історією відправлених постів з посиланнями на опубліковані записи
Час реалізації
Планувальник з базовими правилами та двома каналами — 6–8 робочих днів. Розумне розподілення, календарний UI, rate limiting по всім платформам — ще 3–5 днів.







