Реализация планировщика автопостинга контента из сайта в соцсети
Планировщик — это не просто «поставить задачу в очередь». Это инструмент управления контент-потоком: очередь постов на несколько недель вперёд, визуальный календарь, ограничение частоты, приоритеты, паузы по расписанию (ночь, выходные).
Модель данных
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 дней.







