3.2 KiB
Обновление 4 — Исправление отображения картинок
Контекст
В update-2 и update-3 была реализована отправка новостей через XHTML-IM (XEP-0071) с картинкой через тег <img>.
По результатам тестирования картинки не отображаются:
- Gajim — показывает URL картинки вместо изображения (использует plain-text fallback)
- Monocle Chat (форк Conversations) — показывает незагруженную заглушку
Причины установлены в ходе анализа лога stanza.
Исправление 1 — двойной <body> в XHTML-IM
Проблема
slixmpp xep_0071 при присвоении msg["html"]["body"] = xhtml_body самостоятельно оборачивает
содержимое в <body xmlns="http://www.w3.org/1999/xhtml">. Текущая реализация _build_xhtml
также включает этот тег, в результате в stanza попадает вложенный <body>:
<body xmlns="http://www.w3.org/1999/xhtml"> ← добавляет slixmpp
<body> ← добавляет наш код
<p>...</p>
</body>
</body>
Это невалидный XHTML-IM, что приводит к использованию plain-text fallback в строгих клиентах.
Решение
В методе _build_xhtml убрать обёртку <body xmlns="...">...</body> — возвращать только
внутренние элементы (<p>, <br/>). slixmpp добавит <body> сам.
Исправление 2 — OOB для отображения картинок в Conversations-клиентах
Проблема
Клиенты семейства Conversations (включая Monocle Chat) блокируют загрузку внешних изображений
из XHTML-IM <img src="..."> по умолчанию — это намеренная защита от трекинг-пикселей.
Картинка парсится, но не загружается.
Решение
Дополнительно к XHTML-IM прикреплять URL картинки как Out-of-Band Data (XEP-0066). Conversations и его форки умеют рендерить OOB-ссылки как inline-превью.
Для этого к сообщению добавляется элемент:
<x xmlns="jabber:x:oob">
<url>https://example.com/image.jpg</url>
</x>
Техническая реализация
- Зарегистрировать плагин
xep_0066вJabberConnection - В методе
send_to_room_xhtmlдобавить OOB-поле к сообщению, если переданimage_url:msg["oob"]["url"] = image_url - Сигнатуру
send_to_room_xhtmlрасширить необязательным параметромimage_url: str | None = None - В
JabberNewsPublisher.publishпередаватьitem.image_urlвsend_to_room_xhtml