Reemake Digital Agency · Технический разбор

Как RM VK Sender парсит картинки из тела статьи Joomla

Чтобы пост в ВК был красивым, нужна качественная картинка. Разбираем алгоритм: как компонент находит изображение в HTML статьи, проверяет формат, конвертирует WebP в JPEG и загружает в ВК. С кодом и объяснением приоритетов.

Алгоритм

6 шагов парсинга

1. Читает поле fulltext. Берёт HTML материала из #__content. Смотрит весь контент статьи — включая текст после разделителя «Читать далее».

2. Ищет img через DOMDocument. Не regex — DOMDocument надёжнее парсит HTML. Находит все <img>, берёт первый с валидным src.

3. Проверяет URL. Относительные пути (images/photo.jpg) превращает в абсолютные (https://site.ru/images/photo.jpg). Пропускает data-URI и SVG.

4. Скачивает файл. Через cURL с таймаутом 10 секунд. Сохраняет во временную папку /tmp. Проверяет размер — до 50 МБ.

5. Определяет формат. Через getimagesize() — WebP, PNG, GIF, BMP, JPEG. Конвертирует в JPEG с качеством 90 через GD.

6. Загружает в ВК. Через photos.getWallUploadServer + photos.saveWallPhoto. Получает ID фото и прикрепляет к посту.

Приоритеты

Какая картинка берётся первой

ПриоритетИсточник
1Вводное изображение (thumbnail Joomla) — если задано в материале
2Первая картинка в поле fulltext (тело статьи)
3Первая картинка в поле introtext (вводный текст)
4Если картинки нет — пост публикуется без изображения

Код

Как выглядит поиск картинки

$dom = new DOMDocument();
@$dom->loadHTML('<meta charset="UTF-8">' . $fulltext);
$images = $dom->getElementsByTagName('img');

foreach ($images as $img) {
    $src = $img->getAttribute('src');
    if (empty($src) || strpos($src, 'data:') === 0) continue;
    $url = $this->makeAbsolute($src);
    if ($this->isValidImage($url)) return $url;
}
return null;

Ключевое: meta charset="UTF-8" перед загрузкой HTML. Без него DOMDocument ломает кириллицу в атрибутах alt и title — картинка может не найтись.

Fallback

Что если картинки нет вообще

Компонент публикует текст без изображения. Лучше так, чем пропустить пост целиком. Плюс в настройках есть опция «Только с картинкой» — если включена, пост без изображения вообще не публикуется. Оба варианта рабочие, выбирайте по задаче редакции.

Кейс · Симметрия

Мебельная компания: 100 % картинок благодаря порядку парсинга

Задача: «Симметрия» — мебельная компания из Перми. Раньше при публикации в ВК картинка бралась из вводного изображения Joomla — но у многих материалов вводное не было задано, и посты уходили серым текстом.

Что сделали: настроили RM VK Sender с приоритетом «вводное → fulltext». Для материалов, где thumbnail не задан, компонент ищет первую картинку в теле. Плюс — оставили опцию «Только с картинкой» — если картинки совсем нет, пост не публикуется.

Результат: 100 % постов с картинками. Даже материалы без явного thumbnail уходят с фотографией из текста. Вовлечённость группы +38 % за 2 месяца. Редакция перестала проверять каждый пост вручную.

Вопросы и ответы

Частые вопросы

Что если в статье несколько картинок?
Берётся первая по порядку в HTML. Так пост выглядит единообразно. Хотите другую — поставьте вводное изображение в материале, оно приоритетнее.

Можно ли указать конкретную картинку?
Да. Задайте вводное изображение в материале Joomla — компонент возьмёт именно его, а не первое из тела.

Почему картинка не нашлась, хотя она есть?
Проверьте лог компонента. Частые причины: относительный URL, битый файл, таймаут скачивания (медленный сервер). В 90 % случаев — решается за минуту.

Что если статья — с видео вместо картинки?
Компонент берёт превью видео, если оно есть в HTML как img. Если только iframe — пост уйдёт без картинки. Решается вручную через вводное изображение.

Хотите, чтобы картинки всегда были в постах?

Установим RM VK Sender. Проверим на ваших статьях — с WebP, PNG, GIF. Настроим приоритет парсинга под редакцию.

Обсудить задачу →
8 (950) 442-49-00 reemake@inbox.ru Max Messenger Max

с 8:00 до 20:00 (МСК)

г. Пермь