> termcourse:在终端中阅读和发布 Discourse 实例的内容

这是一个终端应用(TUI),目前还带点趣味性……在这个阶段也还有些实验性质!

:information_source: 简介 一个用于浏览和发布 Discourse 论坛内容的终端 UI,支持主题列表、完整主题视图、回复、点赞、搜索以及内置的编辑器。
: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: 赞助 请考虑以适合您或您所在组织资源和需求的级别,持续赞助我的开源工作(https://github.com/sponsors/merefield),以确保该项目获得应有的维护,并能在未来继续为您的站点提供服务。

喜欢 termcourse?请在 GitHub 上给它一个 :star:

概述

termcourse 是一个基于终端的 Discourse 客户端,重构为单个 Go 可执行文件。它可以使用权重较轻的浏览器风格 Cookie 会话,通过用户名/电子邮件和密码进行登录,支持 TOTP 和备用代码 MFA。对于不适合交互式登录的站点,可以使用 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 中获取每个站点的凭据,并提示输入缺失的登录字段。
  • defaultslatefairgroundrusthacker 主题中选择,添加 YAML 主题,并在应用运行时切换主题。
  • 使用真彩色、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 Release 都提供 SHA-256 校验和以及适用于 AMD64 和 ARM64 的 Linux、macOS 和 Windows 的预构建存档。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 中,或使用 README 中描述的按主机配置的 credentials.yml

用户名/密码登录(推荐)

用户名/密码登录支持实时更新:

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

身份验证说明

  • 用户名/密码登录遵循 Discourse 的 CSRF 和 Cookie 流程,并支持实时 MessageBus 更新。
  • 支持 TOTP 和备用代码 MFA。
  • API 密钥身份验证保留 HTTP 功能,但不建立实时浏览器会话。
  • 某些站点会禁用或限制脚本化的用户名/密码登录;API 凭据是这些站点的回退方案。

安全性

  • Termcourse 不会将提示输入的凭据或会话 Cookie 写入磁盘;会话 Cookie 保留在内存中。
  • 密码提示可防止密码出现在 shell 历史记录中。
  • 持久化凭据是可选的,并保留在用户的环境变量或 YAML 文件中,由用户控制。
  • 诊断日志记录是可选的,默认禁用,并且不会记录凭据或响应主体。

局限性

  • 禁止远程登录流程的站点可能需要 API 密钥身份验证。
  • 实时更新需要用户名/密码 Cookie 身份验证。
  • 原生内联图像质量取决于终端支持情况;首选 Kitty,其他地方可使用符号渲染。
  • 它存在于终端中。:slight_smile:

致谢

部分灵感来自 Dumbcourse: old browser friendly UI at dumb/d-pad/small screens: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 个赞

这相当低保真,但它有效。

你需要安装 viuchafa——这本身可能就是一个项目 :slight_smile:

chafa 的高质量模式或使用 viu 时,Windows Terminal 优于 MacOS terminal,因为它支持更多的颜色(感谢微软!)

发布说明:图像渲染(在终端中!)

图像渲染

  • 增加了带后端选择的内联帖子图像预览:
    • 自动优先尝试 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 转义片段显示为纯文本。

注意:我发现有一个站点会阻止远程用户名/密码,因此在这种情况下此客户端将无法工作(除非您拥有该站点并可以设置 API 密钥!),欢迎提出建议,但目前不支持这些情况。

我不确定我会在现实世界中使用它,我看不到它对我有什么用,但我试过了,它很令人愉快。我喜欢能够从一个裸机、原始的界面与下一代论坛平台进行交互。

在某种程度上,它在美学上非常令人愉悦。

1 个赞

是的,我想它可能在以下情况下有用:

  • 您使用的是低保真平台时
  • 在树莓派(Raspberry Pi)上捣鼓时(顺便说一下,尚未测试)
  • 从服务器检查您是否在线……或者前端代码是否崩溃!:smiley:
  • 对于一个非常基于文本的 Discourse 站点……
  • ……以及作为一种技术好奇心 :slight_smile:

我一直想用 Terminus 在我的手机上测试一下……

3 个赞

好的,可能是今天的最后一次更新:

  • 界面现在可以响应窗口大小调整了 :tada:
  • 顶部栏说明中的内容有所改进
  • 键 1 到 (1)0 现在会打开主题列表中的相应编号主题

请记住运行 git pull 来获取更新。

3 个赞

伙计,我现在得开始做我的 ASCII 艺术品了!!
¯\_(ツ)_/¯

3 个赞

我添加了一个完全可定制的主题系统,“fairground”是这样的:

“slate”是这样的:

详情请见 README :graduation_cap:

5 个赞

好的,各位,一些劲爆的 :tangerine: 更新来了:

  • 添加对私信的支持 - 连按两次 f 键 :tada:
  • 随着宽度扩展,逐步为“类别”、“用户”、“查看次数”添加额外的列
  • 调整垂直分隔线的主题
  • 更新了 README

2 个赞

我昨天合并了此项:

  • 如果您费力安装了 chafa 或 viu,现在您将获得一项新功能:帖子图片的“全窗口”切换。在 Windows 上这尤其好,因为 Windows 终端应用程序对色彩深度支持很慷慨。

termcourse 现在在主题列表状态栏中有了未读私信 (PM) 状态弹出窗口,就像浏览器客户端一样,当您移动光标时,它会逐条发布已读通知。

2 个赞

我已合并针对 macOS 主题的修复程序

2 个赞

不错……它能在 Pip-Boy 上运行吗?

3 个赞

欢迎提交拉取请求(PR)或分享颜色代码,我会将其添加到示例主题的 yml 文件中 :slight_smile:

2 个赞

太棒了!已合并,谢谢!

2 个赞

https://github.com/merefield/termcourse/pull/2

所以渲染效果非常糟糕……我已经修复了它……用户界面现在具有差异渲染,因此速度更快、更流畅……它不再在每次光标移动时都重绘整个屏幕。

到目前为止我只在 Windows 上测试过,所以请反馈任何问题——但这应该能显著帮助较慢的系统。

我还添加了一些测试和 GitHub CI!

现在有了一个基于 MessageBus 的实时通知系统,当主题列表有新更新时(这样你就可以按 g 刷新):

接下来可能会研究主题已读徽章……

太棒了!

为什么不使用与 Discourse 相同的键盘快捷键呢?这样体验会更无缝 :slight_smile:

1 个赞

不是个坏主意……这绝对值得在某个阶段进行一次审查,看看是否可以将事物合理地拉得更近一些 :+1: ……但不同媒介之间当然存在一些显著差异,所以有些事情可能仍然不同。

1 个赞