> termcourse: чтение и публикация в инстансах Discourse из терминала

Это терминальное приложение (TUI), немного для развлечения… и пока оно находится на экспериментальной стадии!

:information_source: Описание Терминальный интерфейс для просмотра и публикации в форумах Discourse: списки тем, полные представления тем, ответы, лайки, поиск и встроенный редактор.
:hammer_and_wrench: Ссылка на репозиторий GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: Гид по установке README.md в репозитории (раздел «Быстрый старт»)
:heart: Поддержка Пожалуйста, рассмотрите возможность стать постоянным спонсором моей работы с открытым исходным кодом (Sponsor @merefield on GitHub Sponsors · GitHub) на уровне, который соответствует возможностям и потребностям вас или вашей организации, чтобы обеспечить проекту необходимое техническое обслуживание и гарантировать, что он будет продолжать работать на вашем сайте в будущем.

Вам нравится termcourse? Пожалуйста, поставьте :star: на GitHub

Обзор

termcourse — это терминальный клиент для Discourse, переработанный в единый исполняемый файл на Go. Он может использовать легковесную браузерную сессию на основе cookie с именем пользователя/электронной почтой и паролем, включая MFA с TOTP и резервными кодами. Аутентификация по API-ключу доступна для сайтов, где интерактивный вход не подходит.

Интерфейс использует текущий стек Charm и работает как с клавиатурой, так и с мышью. Его навигация в стиле папок, контекстные фильтры, адаптивные панели, темизированные элементы управления, рендеринг Markdown и встроенные изображения разработаны для того, чтобы сделать просмотр форума комфортным, не покидая терминал.

Возможности

  • Просмотр списков тем Latest, Hot, New, Unread, Top и Private Message, с переключением периодов для Top.
  • Навигация по постоянным папкам Topics, Search, Notifications и Compose, с контекстными фильтрами второго уровня.
  • Использование клавиатуры на всех этапах или нажатие вкладок, строк тем, элементов управления в нижней части и кнопок с подсветкой при наведении.
  • Открытие видимых тем с помощью Enter или цифровых клавиш 10.
  • Чтение полных тем с ленивой загрузкой сообщений, компактными отрывками, раскрытием выбранных сообщений и адаптивной прокруткой.
  • Клик по треку прогресса темы для перехода непосредственно к этой точке в потоке сообщений.
  • Создание тем, выбор категорий, ответы на темы или отдельные сообщения, а также лайки и отмена лайков сообщений.
  • Поиск сообщений и переход непосредственно к совпадающему сообщению в контексте его темы.
  • Просмотр и фильтрация уведомлений, включая бейджи непрочитанных и личных сообщений.
  • Создание многострочного контента с перемещением курсора, вставкой, переносом строк, поддержкой вставки и живой валидацией.
  • Рендеринг GFM Markdown, включая ссылки, списки, цитаты, код, списки задач и таблицы.
  • Отображение высококачественных встроенных и полноэкранных изображений с помощью графического протокола Kitty, с цветными символами chafa или viu в качестве портативных вариантов.
  • Получение обновлений в реальном времени списков тем, тем, уведомлений и личных сообщений при использовании сессии на основе cookie.
  • Использование учетных данных для каждого сайта из переменных окружения или credentials.yml, с запросом недостающих полей для входа.
  • Выбор из тем default, slate, fairground, rust и hacker, добавление YAML-тем и переключение тем во время работы приложения.
  • Использование truecolor, 256-цветного или 16-цветного вывода с автоматическим определением возможностей терминала.
  • Запуск интерфейса на английском, французском, немецком или испанском языке.
  • Свободное изменение размера терминала: макеты, цвета, списки тем и изображения Kitty реагируют на доступное пространство.
  • Просмотр времени повторной попытки, предоставляемого сервером, когда Discourse ограничивает частоту действия, с необязательной диагностикой HTTP, UI и изображений.

Установка и запуск

На Linux или macOS рекомендуемый установщик загружает предварительно собранную версию для текущей операционной системы и архитектуры, проверяет её контрольную сумму SHA-256 и указанную версию, а затем устанавливает её:

curl -fsSL https://raw.githubusercontent.com/merefield/termcourse/master/install-release.sh | sh
termcourse your.discourse.host

Termcourse запрашивает имя пользователя и пароль, если учетные данные еще не были настроены. Ввод пароля скрыт.

Используйте termcourse --version, чтобы отобразить установленную семантическую версию; та же версия отображается в широком заголовке терминала.

Для локальной установки пользователя, не требующей sudo:

curl -fsSL https://raw.githubusercontent.com/merefield/termcourse/master/install-release.sh |
  TERMCOURSE_BIN_DIR="$HOME/.local/bin" sh

Каждый релиз GitHub предоставляет контрольные суммы SHA-256 и предварительно собранные архивы для Linux, macOS и Windows на архитектурах AMD64 и ARM64. Для Linux/macOS используется .tar.gz; для Windows — .zip. Для предварительно собранных релизов не требуется Go.

На Windows скачайте и проверьте установщик, а затем запустите его, не изменяя политику выполнения для всей системы:

Invoke-WebRequest https://raw.githubusercontent.com/merefield/termcourse/master/install-release.ps1 -OutFile install-release.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File .\install-release.ps1

По умолчанию он устанавливается в %LOCALAPPDATA%\Programs\termcourse\bin и выполняет ту же проверку контрольной суммы и версии. Установщики также могут зафиксировать версию релиза с помощью --version или -Version. Go 1.26.6 или новее требуется только при установке из исходного кода.

Чтобы собрать локальный исполняемый файл из выгрузки кода:

git clone https://github.com/merefield/termcourse.git
cd termcourse
make build
./termcourse your.discourse.host

Для многократного использования храните данные для входа в локальном .env или используйте credentials.yml для каждого хоста, описанный в README.

Вход по имени пользователя/паролю (рекомендуется)

Вход по имени пользователя/паролю обеспечивает обновления в реальном времени:

DISCOURSE_USERNAME="you@example.com" \
DISCOURSE_PASSWORD="your_password" \
termcourse your.discourse.host

Резервная аутентификация по API-ключу

DISCOURSE_API_KEY="your_key" \
DISCOURSE_API_USERNAME="your_username" \
termcourse your.discourse.host

См. актуальное README для настройки, тем, элементов управления, графических бэкендов и устранения неполадок.

Примечания по аутентификации

  • Вход по имени пользователя/паролю следует потоку CSRF и cookie Discourse и обеспечивает обновления MessageBus в реальном времени.
  • Поддерживаются MFA с TOTP и резервными кодами.
  • Аутентификация по API-ключу сохраняет функциональность HTTP, но не устанавливает браузерную сессию в реальном времени.
  • Некоторые сайты отключают или ограничивают скриптовый вход по имени пользователя/паролю; для таких сайтов используются учетные данные API.

Безопасность

  • Termcourse не записывает запрашиваемые учетные данные или cookie сессии на диск; cookie сессии остаются в памяти.
  • Запрос пароля не позволяет паролю попасть в историю оболочки.
  • Постоянные учетные данные являются необязательными и остаются под контролем пользователя в переменных окружения или YAML-файлах.
  • Диагностическое логирование включается по запросу, по умолчанию отключено и не записывает учетные данные или тела ответов.

Ограничения

  • Сайты, запрещающие удаленные потоки входа, могут требовать аутентификации по API-ключу.
  • Для обновлений в реальном времени требуется аутентификация по имени пользователя/паролю с использованием cookie.
  • Качество встроенных изображений зависит от поддержки терминала; предпочтительным является Kitty, с рендерингом символов в качестве альтернативы.
  • Оно находится в терминале. :slight_smile:

Благодарности

Частично вдохновлено Dumbcourse: UI для старых браузеров, D-pad и малых экранов. :clap:

27 лайков

Теперь вы можете быстро входить в систему на нескольких сайтах (очевидно, по одной сессии за вкладку). Я внес следующие улучшения:

Улучшения аутентификации и конфигурации termcourse

  • Вход по имени пользователя и паролю теперь является путем по умолчанию.
  • Вам больше не нужно указывать https:// — это опционально.
  • Отсутствующие поля для входа запрашиваются интерактивно (например: имя пользователя известно, пароль отсутствует).
  • Справка CLI включает основные переменные окружения и расположение файлов отладочных логов.

Учетные данные и поведение ENV

  • Поддерживается файл учетных данных с сопоставлением по хосту с порядком поиска:
    1. TERMCOURSE_CREDENTIALS_FILE (если задан)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • Приоритет аутентификации:
    1. Флаги CLI
    2. Учетные данные хоста из YAML
    3. Общие переменные окружения DISCOURSE_*
    4. Интерактивный запрос
  • Для аутентификации: при входе отсутствующие значения имени пользователя или пароля запрашиваются.
  • Для аутентификации по API как имя пользователя API, так и ключ должны иметь непустые значения.

Отладка

  • Отладка HTTP/аутентификации: TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • Отладка рендеринга UI: TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

Чистота репозитория

  • Добавлены файлы credentials.example.yml и .env.example с согласованными примерами.
  • Добавлены записи в .gitignore для локальных файлов с секретами:
    • .env
    • credentials.yml
3 лайка

Это довольно низкоуровневое решение, но оно работает.

Вам нужно установить viu или chafa — а это уже может стать отдельным проектом :slight_smile:

В режиме высокого качества с chafa или с viu, Windows Terminal превосходит терминал macOS, так как поддерживает гораздо больше цветов (спасибо Microsoft!)

Примечания к выпуску: Рендеринг изображений (в терминале!)

Рендеринг изображений

  • Добавлены встроенные превью изображений в постах с выбором бэкенда:
    • Автоматически сначала пробует chafa, затем viu.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: консервативный вывод для стабильности терминала.
    • quality: рендеринг символов с более высокой детализацией и цветопередачей.
  • Добавлен контроль высоты превью:
    • TERMCOURSE_IMAGE_LINES (по умолчанию: 14)
    • Применяется к высоте строки превью; полезно для настройки визуальной плотности.
  • Улучшено поведение соотношения сторон в viu:
    • Переход к рендерингу, ориентированному на строки (-h), для лучшего сохранения соотношения сторон.
  • Добавлены элементы управления фильтрами качества превью:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 фильтрует шумные превью, состоящие только из блоков.
    • Установите значение 0, чтобы всегда показывать вывод рендерера.
  • Добавлен предел безопасности для загрузки изображений:
    • TERMCOURSE_IMAGE_MAX_BYTES (по умолчанию: 5242880)
    • Предотвращает влияние загрузок изображений чрезмерного размера на производительность.
  • Добавлена поддержка ссылок на изображения Discourse вида upload://…:
    • Автоматическое преобразование в /uploads/short-url/…
  • Улучшена очистка и стабильность терминала:
    • Сохраняет необходимые валидные SGR-коды цветов.
    • Удаляет дестабилизирующие управляющие и графические последовательности.
    • Предотвращает отображение фрагментов ANSI-escape-последовательностей как обычного текста.

Примечание: Я обнаружил один сайт, который блокирует удаленное использование имени пользователя и пароля, поэтому этот клиент не будет работать в такой ситуации (если только вы не являетесь владельцем сайта и не можете настроить API-ключ!). Предложения приветствуются, но на данный момент поддержка в таких случаях отсутствует.

Я не уверен, что буду использовать это в реальной жизни, я не вижу для себя пользы, но я попробовал, и это восхитительно. Мне нравится возможность взаимодействовать с форумной платформой нового поколения через примитивный, «голый» интерфейс.

В каком-то смысле это очень эстетично.

1 лайк

Спасибо!

Да, я думаю, что это может оказаться полезным в следующих случаях:

  • вы работаете на платформе с низким разрешением
  • возитесь с Raspberry Pi (пока не протестировано, к сведению)
  • с сервера проверяете, что всё работает…
  • … или если фронтенд-код падает! :smiley:
  • для сайта на Discourse, который в основном текстовый…
  • … и просто из технического любопытства :nerd_face:

Я собирался протестировать это на телефоне с Terminus…

3 лайка

OK, вероятно, последнее обновление на сегодня:

  • интерфейс теперь адаптируется к изменению размера окна :tada:
  • улучшены инструкции в верхней панели
  • клавиши 1–9 и 0 теперь открывают соответствующие темы в списке

Не забудьте выполнить git pull, чтобы получить обновления.

3 лайка

Черт, теперь мне надо заняться своим ASCII-артом!!
¯(ツ)

3 лайка

Я добавил полностью настраиваемую систему темизации, вот тема «fairground»:

… а вот тема «slate»:

… и вот тема «rust»:

Детали в README :graduation_cap:

5 лайков

Вот и поехали, ребята, несколько сочных :tangerine: обновлений:

  • добавлена поддержка личных сообщений — дважды нажмите F :tada: (на данном этапе только список, просмотр и ответ, создание нового ЛС пока не доступно)
  • добавлены дополнительные столбцы для категории, пользователей и просмотров, которые появляются по мере расширения ширины
  • улучшена тема для вертикальных разделителей
  • обновлён README

2 лайка

Я объединил это вчера:

  • Если вы приложите усилия для установки chafa или viu, вы теперь будете вознаграждены новой функцией: переключатель «полноэкранное окно» для изображений в постах. В Windows это особенно полезно благодаря широкой поддержке глубины цвета в приложении Windows Terminal.

Теперь в строке состояния списка тем в termcourse отображается всплывающее уведомление о непрочитанных личных сообщениях, и, как и в браузере, уведомления о прочтении отправляются по каждому сообщению по мере перемещения курсора.

2 лайка

Я объединил исправления для тем в macOS

2 лайка

Неплохо… Работает ли это на Пип-бое?

3 лайка

Не стесняйтесь сделать PR или поделиться кодами цветов, и я добавлю их в пример themes.yml :slight_smile:

2 лайка

Отлично! Объединено, спасибо!

2 лайка

Рендеринг был не очень хорошим… поэтому я его исправил… теперь интерфейс использует «рендеринг различий», что делает его намного быстрее и плавнее… он больше не перерисовывает весь экран при каждом движении курсора. :sweat_smile:

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

Я также добавил несколько тестов и GitHub CI! (и это супер быстро, потому что используется minitest)

Теперь реализована система уведомлений в реальном времени на базе MessageBus, которая сообщает о новых обновлениях в списке тем в строке состояния (так что вы можете нажать g для обновления):

Скорее всего, следующим шагом будет работа над значками прочтения тем…

Это здорово!

Почему бы не использовать те же сочетания клавиш, что и в Discourse? Так опыт будет более бесшовным :slight_smile:

1 лайк

Неплохая идея… Определённо стоит попробовать на каком-то этапе, чтобы посмотреть, можно ли разумно сблизить подходы :+1:… но, конечно, есть существенные различия в форматах, поэтому некоторые вещи могут остаться разными.

1 лайк