Image for DnmCovers — динамические обложки для ВК

DnmCovers — динамические обложки для ВК

май 2018 г.

О проекте

Мой первый большой PHP-проект: движок, который по расписанию собирает данные из разных источников и собирает из них «живую» обложку сообщества ВКонтакте. Сервис обслуживал сразу несколько групп (в т.ч. миллионников) и работал без участия редакторов: сам подтягивал свежие цифры, рендерил изображение и заменял обложку в группе через VK API.

Что умеет (модули данных)

  • VK-метрики: число подписчиков, текущее описание/статус, последние посты/комментарии, топ активных участников (лайки/комменты/репосты за период), счётчики по группам одной сети.
  • Погода (OpenWeather): температура, иконки/погодные описания, ветер/давление; дневной/ночной набор иконок.
  • Курсы и котировки: официальный курс ЦБ РФ (доллар/евро и др.), цена Brent.
  • Трафик города (Яндекс): баллы пробок/текстовое описание.
  • YouTube: инфо по каналу, последнее видео и его статистика.
  • Telegram: количество подписчиков канала.
  • Время/таймеры/дата: счётчики/обратные отсчёты (ивенты, дедлайны).
    Каждый модуль имеет свой TTL и файловый кэш — сеть дергается только когда это реально нужно.

Архитектура

  • Worker (ядро): абстрактный класс, который собирает данные из модулей, подставляет в шаблон и отдаёт на рендер. Для каждой обложки создаётся свой мини-класс MyWorker с бизнес-логикой: какие блоки показать, в каком формате, как ранжировать топ.
  • VKAPI: тонкая обёртка над методами photos.getOwnerCoverPhotoUploadServerphotos.saveOwnerCoverPhoto (в т.ч. кроп под мобильные/десктопные координаты), базовые ретраи и логирование.
  • View/Template: HTML-слой layer.tpl с плейсхолдерами (%leftText%, %rightText%, %fonts%, %locdir%) и кастомными шрифтами через @font-face. Шаблон собирается и рендерится в итоговое изображение (JPEG/PNG).
  • Image (GD): низкоуровневые операции: отрисовка текста (многострочность, кернинг, тень/обводка, выравнивание по осям), работа с картинками (маски/круг, кроп, подгон по сторонам, подмена отсутствующих аватаров), кэш удалённых изображений.
  • Многогрупповость: один инстанс движка обслуживает много групп (общая статистика сети и индивидуальные обложки).
  • Cache: файловый кэш с учётом TTL на каждый источник.
  • Конфиг и панель: централизованные пути/токены, директории для временных файлов/кэша, и интеграция с маленькой панелью управления.
  • Ошибки/алерты: сбор ошибок в буфер + отправка в Telegram; если не доступен — fallback в личку VK админам (без утечек трейсбеков в публичный ответ).

Исполнение и производительность

  • Cron-задачи: регулярный запуск обновлений; батч-режим с curl_multi — несколько обложек рендерятся параллельно, чтобы не упираться в сетевые задержки.
  • Окружение: PHP с gd (freetype/jpeg/webp), доступ к MySQL и внешним API; файловый кэш для снижения нагрузки.
  • Оптимизации: разнесённые TTL, локальный кэш сторонних картинок, минимизация внешних запросов; в шаблонах — только то, что влияет на узнаваемость и конверсию.

Рендер и шаблоны

  • Двухслойная модель: «фон» (обложка проекта) + «фронт»/«бэк» слои с текстом/иконками — можно быстро переключать композиции без перепаковки кода.
  • Типографика: подключение кастомных шрифтов в шаблоне, подстройка межбуквенных/межстрочных интервалов на уровне движка, безопасная обрезка длинных строк.
  • Медиа и аватарки: маски (круг/скругление), дефолтные заглушки, подмена размеров w/h/size с сохранением пропорций.

Защита от лимитов и «тонкие места»

  • Rate-limit дружелюбность: всё, что можно, берётся из кэша; тяжёлые операции (топы/YouTube/погода) — с увеличенным TTL и деградацией «по-умному» (резервные значения/фэйковые пользователи для top-блоков).
  • Исключения: списки исключённых ID (не попадут в топ/ранжирование) и маскировка пустых данных, чтобы не «ломать» сетку шаблона.
  • Временные зоны и расписание: генерация в Europe/Moscow, учёт ночного оформления (альтернативный фон/иконки).

Роль и зона ответственности

С нуля спроектировал и написал ядро, модули под все источники данных, шаблонизатор/отрисовку, VK-интеграцию и крон-планировщик; настроил окружение и мониторинг ошибок. В бою сервис обслуживал несколько крупных пабликов, стабильно обновлял обложки и переживал сетевые сбои без «битых» картинок.

Итог

Готовая «машинка» для живых обложек: понятная архитектура, быстрый рендер, безопасная интеграция с VK и богатый набор виджетов — от топа участников до погоды и YouTube. Работала «на потоке» и не требовала ручной поддержки.

Similar projects
Similar projects