> 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 в репозитории (раздел Quickstart)
:heart: Поддержка Пожалуйста, рассмотрите возможность стать постоянным спонсором моей работы над open source проектами (Sponsor @merefield on GitHub Sponsors · GitHub) на уровне, соответствующем вашим ресурсам и потребностям, чтобы этот проект получал заслуженное обслуживание и продолжал работать на вашем сайте в будущем.

Нравится termcourse? Поставьте :star: на GitHub

Обзор

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

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

Возможности

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

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

Для установки из исходного кода требуется Go 1.26.6 или новее. Самый короткий путь:

go install github.com/merefield/termcourse/cmd/termcourse@latest
termcourse your.discourse.host

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

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

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: старый интерфейс, удобный для браузера, на тупых/д-пад/маленьких экранах. :clap:

26 лайков

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

Улучшения аутентификации и конфигурации 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 лайк