Базовый инструмент архивации для Discourse

Форум Discourse, который я использую, через пару недель будет закрыт, поэтому я решил создать его архив. Я провёл много исследований, методом проб и ошибок нашёл простое решение с помощью HTTrack. Вот всё, что я узнал.

Архивирование сайта Discourse с помощью HTTrack
Для пользователей Windows лучшим решением, по-видимому, является HTTrack. Это сработало отлично: сайт был сохранён в виде HTML-файлов. Были архивированы все категории, темы и сообщения, включая все страницы с относительными навигационными ссылками.

Базовое руководство по HTTrack можно найти здесь. Я оставил настройки по умолчанию, но добавил следующие пользовательские параметры:

  • Веб-адреса:
    • https://forums.gearboxsoftware.com/c/homeworld/
    • https://forums.gearboxsoftware.com/c/homeworld-dok/
  • Правила сканирования:
    • -gearboxsoftware.com/* -forums.gearboxsoftware.com/* +forums.gearboxsoftware.com/c/homeworld/* +forums.gearboxsoftware.com/c/homeworld-dok/* +forums.gearboxsoftware.com/t/* +forums.gearboxsoftware.com/user_avatar/* +sea2.discourse-cdn.com/*
  • Идентификатор браузера (также известный как User Agent):
    • Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

Примечание: Существует проблема с CSS, из-за которой ссылки на категории не работают, однако её можно легко исправить, как описано ниже.

Проблема с CSS
При просмотре страниц категорий как Googlebot ссылки на темы не работают. Пример можно найти здесь.

Это делает навигацию по страницам категорий невозможной в HTTrack, archive.org и кэше Google. Похоже, что это проблема Discourse, связанная с файлом CSS. Чтобы исправить ссылки, просто заблокируйте или удалите следующий CSS-файл:

  • stylesheets/desktop_theme_10_1965d1d398092f2d9f956b36e08b127e00f53b70.css?__ws=forums.gearboxsoftware.com

@codinghorror — Не могли бы вы это исправить?

Трудности
Я столкнулся со следующими трудностями, но в итоге преодолел их после множества проб и ошибок.

  • Страницы Discourse динамически генерируются с помощью JavaScript. Это приводит к плохим результатам при использовании большинства инструментов архивации/сканирования.
  • Большинство тем загружают только первые ~20 сообщений; остальные сообщения появляются только при прокрутке вниз. Нажатие Ctrl+P открывает страницу /print, где видны все сообщения. Пользователи ограничены печатью 5 страниц в час в режиме печати, но этот лимит может быть увеличен администратором сайта Discourse.
  • Adrelanos отметил, что многостраничные темы не архивировались HTTrack должным образом, однако я подозреваю, что эта проблема была связана с его настройками HTTrack, так как у меня её не было.
  • Сохранение страницы в PDF не включает свёрнутые разделы деталей.
  • Страницы можно загрузить в базовом HTML, добавив ?_escaped_fragment_ в конец URL, но этот трюк работает только для тем, а не для категорий.

Упомянутые выше трудности перестают быть проблемой, как только вы узнаете, что все страницы/контент Discourse могут быть корректно отображены как HTML для сканеров. Для этого необходимо изменить идентификатор пользователя (User Agent) вашего сканера/браузера на Googlebot, чтобы получить HTML-версию страниц.

Archive.org
Если вы используете функцию «Сохранить страницу сейчас» на web.archive.org, будет сохранена JavaScript-версия Discourse с плохими результатами. Archive.org использует идентификатор пользователя (User Agent) человека, запрашивающего архив. Поэтому вы должны изменить свой User Agent на Googlebot. Вы можете установить расширение для Chrome под названием «User-Agent Switcher for Chrome». В настройках добавьте:

  • Название: Googlebot
  • Строка: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
  • Группа: Chrome
  • Индикатор: 1

Альтернативные инструменты архивации
Многие инструменты перечислены здесь: Archive an old forum "in place" to start a new Discourse forum
Я также кратко протестировал GUI-инструменты, такие как Cyotek WebCopy, A1 Website Download и WAIL.
К инструментам командной строки относятся утилита mcmcclur и wget. Руководство по wget можно найти здесь.
Однако для пользователей Windows лучшим решением, по-видимому, является HTTrack.

Примечание: Поскольку я новый пользователь, я ограничен двумя ссылками в одном сообщении. Поэтому я превратил некоторые ссылки в текст с предварительным форматированием.

Я теперь определил корневую причину. Оказалось, что фоновое изображение конфликтует со ссылками!

В этом файле:
stylesheets/desktop_theme_10_1965d1d398092f2d9f956b36e08b127e00f53b70.css

В этом коде:

body:before {
    backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
    content: "";
    display: block;
    background-color: #000000;
    background-image: url("data:image/svg+xml,%3Csvg width='6' height='6' viewBox='0 0 6 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23adadad' fill-opacity='0.4' fill-rule='evenodd'%3E%3Cpath d='M5 0h1L0 6V5zM6 5v1H5z'/%3E%3C/g%3E%3C/svg%3E");
    position: fixed;
    height: 100vh;
    width: 100vw;
    top: 0;
    left: 0;
    z-index: 0;
    opacity: 0.03;
    background-size: 70%;
}

Исправление проблемы с CSS
Переместите фоновое изображение на слой ниже, чтобы исправить ссылки.

  • Откройте stylesheets/desktop_theme_10_1965d1d398092f2d9f956b36e08b127e00f53b70.css и замените все три вхождения “z-index:-1;” на “z-index:-2;”. Затем замените “z-index:0;” на “z-index:-1;”.
  • Затем откройте desktop_32713c1b6551369eb391868f3d4e3f2ac9c38cf1.css и просто замените все три вхождения “z-index:-1;” на “z-index:-2;”. Теперь ссылки будут работать.

Спасибо, что сообщили нам. Поскольку это просмотр через краулер/архив, эти изображения в любом случае не должны отображаться, поэтому я открыл PR для их удаления.

На всякий случай: я написал минимально жизнеспособный скрипт на Python, который выполняет простую резервную копию контента постов с помощью API: GitHub - jamesob/discourse-archive: Provides a simple archive of Discourse content · GitHub

Он довольно примитивный, но должен дать кому-то общее представление о том, как создать архив, подходящий для публикации.

Только что придумал способ парсить весь контент сайта Discourse модульным образом (можно выбирать категории/темы/лимиты для парсинга). Посмотрите. Пока это просто инструмент для получения локальной/статической версии сайта: GitHub - Diegorb1329/broad_listening_eth · GitHub