LINUX DO(Discourse)终端客户端。用键盘在终端里刷帖、看楼、搜索。
| 站点 | 仅 https://linux.do(不做多站点) |
| 技术 | Go + Charm(bubbletea / bubbles / lipgloss) |
| 能力 | 最新帖列表(含标签)、主题楼层、搜索、Cookie / 浏览器登录 |
| 不做 | 发帖、回帖、点赞、通知、私信 |
- Go(见
go.mod) - 能访问 linux.do 的网络(若用代理,终端与浏览器尽量同一节点)
- (可选)本机 Chrome / Chromium:用于
login --browser自动抓 Cookie
git clone <本仓库>
cd ldo-tui
# 直接运行
go run ./cmd/ldo-tui
# 或安装到 $GOBIN
go install ./cmd/ldo-tui
ldo-tui首次运行会自动创建配置目录与模板文件(不会覆盖已有内容),并提示你去编辑 Cookie:
~/.config/ldo-tui/
├── cookie.txt # Cookie 只放这里(主要填写)
├── user-agent.txt # UA 只放这里(已有默认值)
├── credentials.json # 仅可选 API key / username(不含 cookie/ua)
└── README.txt
# 1. 写入 Cookie(三选一,见下文「登录」)
go run ./cmd/ldo-tui login --browser
# 或手动编辑 ~/.config/ldo-tui/cookie.txt
# 2. 检查是否打得通 API
go run ./cmd/ldo-tui doctor
# 期望: status 200 · json true · cloudflare false
# 3. 进入 TUI
go run ./cmd/ldo-tui路径查看:
go run ./cmd/ldo-tui path默认目录:~/.config/ldo-tui/
(若设置了 XDG_CONFIG_HOME,则为 $XDG_CONFIG_HOME/ldo-tui/)
| 文件 | 存什么 | 谁来写 |
|---|---|---|
cookie.txt |
仅 Request Cookie | 你填,或 login --browser |
user-agent.txt |
仅 User-Agent | 默认已有;建议与浏览器一致 |
credentials.json |
仅 user_api_key / username(可选) |
一般不用管 |
README.txt |
说明 | 首次自动生成 |
Cookie / UA 不会再写进 credentials.json,避免两处不一致。旧版若 JSON 里还有这两个字段,启动时会自动迁到 .txt 并清掉 JSON 里的副本。
- 浏览器打开 https://linux.do 并完成验证(能正常刷帖)。
F12→ Network → 点开一条成功请求(如latest.json)。- Request Headers(请求头)→ 复制
Cookie整段。 - 粘贴到
cookie.txt的非注释行(#开头行为注释,会被忽略)。
正确示例:
# 下面一行才是有效内容
cf_clearance=xxx; _forum_session=yyy; _t=zzz; ...
错误示例(不要这样):
# 这是 Response 的 Set-Cookie,带属性,会导致持续 429
cf_clearance=xxx; HttpOnly; Path=/; Domain=linux.do; Expires=...
程序会尽量自动剥掉 HttpOnly / Path / Domain 等属性,但请优先复制 Request Cookie。
权限:目录建议 700,凭证文件 600(login / 自动保存时会设置)。
linux.do 在 Cloudflare 后。终端客户端不像完整浏览器,匿名或错误 Cookie 时经常出现:
- HTTP 429
- 页面 “Just a moment…” / “请稍候…”
- 响应头
cf-mitigated: challenge
本客户端会:
- 使用 Chrome TLS 指纹 访问
- 携带你保存的 Cookie + User-Agent
- 控制请求频率、短缓存、避免对 CF 挑战无意义重试
需本机已装 Chrome / Chromium。
go run ./cmd/ldo-tui login --browser- 弹出浏览器窗口,打开 linux.do
- 你完成 Cloudflare / 如需可登录账号
- 检测到
cf_clearance后,自动写入配置并探测 API
TUI 内遇到 429 时按 b,效果相同。
编辑 ~/.config/ldo-tui/cookie.txt,按上一节从浏览器复制 Request Cookie。
可选同步修改 user-agent.txt(与复制 Cookie 的那次请求 UA 一致更稳)。
# 先把 Cookie / UA 放到临时文件
pbpaste > /tmp/ldo-cookie.txt
echo 'Mozilla/5.0 ...' > /tmp/ldo-ua.txt
go run ./cmd/ldo-tui login \
--cookie-file /tmp/ldo-cookie.txt \
--user-agent-file /tmp/ldo-ua.txt默认会先 probe,成功才保存。强制保存:--no-probe。
若你有 Discourse User API Key,可在 TUI 按 n 粘贴,或:
go run ./cmd/ldo-tui login --api-key '你的key'对 Cloudflare 边缘挑战,通常仍需要有效的 cf_clearance Cookie,不能只靠 API Key。
go run ./cmd/ldo-tui logout或 TUI 列表页按 L。
ldo-tui 启动 TUI(自动加载配置)
ldo-tui login --browser 打开浏览器,过 CF 后自动保存 Cookie/UA
ldo-tui login [flags] 从参数/文件/环境变量保存凭证
ldo-tui logout 清除本地凭证
ldo-tui path 打印配置文件路径
ldo-tui doctor 探测 /latest.json 是否可达
ldo-tui help 帮助
| 参数 | 说明 |
|---|---|
--browser |
浏览器自动抓 Cookie |
--cookie |
Cookie 字符串 |
--cookie-file |
从文件读 Cookie |
--user-agent |
User-Agent 字符串 |
--user-agent-file |
从文件读 UA |
--api-key |
User-Api-Key |
--no-probe |
不探测,直接保存 |
cookie: set (...), cf_clearance=true
status: 200
json: true
cloudflare:false
OK — API reachable.
| 键 | 作用 |
|---|---|
j / k 或 ↑ / ↓ |
列表:移动光标 |
j / l / → / ] |
主题内:下一楼(整楼跳转,类似右滑翻评论) |
k / h / ← / [ |
主题内:上一楼 |
↑ / ↓ |
主题内:细滚一行(长帖内部) |
Enter |
打开主题 |
r |
刷新当前列表或主题(Latest 保持当前页) |
] / → / Ctrl+F |
列表:下一页(Latest) |
[ / ← / Ctrl+B |
列表:上一页(Latest) |
o |
用系统浏览器打开当前主题 |
/ |
搜索 |
b |
浏览器登录(自动抓 Cookie,应对 429) |
n |
手动粘贴 Cookie 或 User-Api-Key |
L |
登出(列表页) |
g / G |
到顶 / 到底 |
Esc |
返回上一层 |
q |
列表页退出;主题页也可返回 |
? |
帮助 |
Ctrl+C |
强制退出 |
状态栏会显示当前页,例如:30 topics · p.1 ([ prev ] next)。
列表 Latest / 搜索结果
│ Enter
▼
主题楼层(滚动阅读)
│ Esc
▼
列表
正文以文本显示(Discourse cooked HTML 会转成纯文本),长段落会自动按终端宽度换行。图片等富内容用 o 在浏览器中查看。
列表行会显示话题标签,例如:
> 分享一个 Go 的 TUI 框架… #go #tui 12r 2h
标签过多时自动截断(如 +3),窄终端上优先显示标题。
首次
go run ./cmd/ldo-tui → 生成 ~/.config/ldo-tui/
填写 cookie.txt
或 login --browser / TUI 按 b
go run ./cmd/ldo-tui doctor → 确认 200
go run ./cmd/ldo-tui → 刷帖
之后
直接 go run ./cmd/ldo-tui
Cookie 过期或又 429 → 更新 cookie.txt 或按 b / login --browser
建议:
- 终端代理与浏览器同一出口(例如都走
http://localhost:7890) - 少连续狂按
r(已有间隔与短缓存,仍不必刷爆) - Cookie 换代理节点后通常会失效,需重新获取
均可选;会覆盖配置文件中的对应项(适合临时调试,不必每次 export)。
| 变量 | 含义 |
|---|---|
LDO_COOKIE |
Cookie 字符串 |
LDO_USER_AGENT |
User-Agent |
LDO_USER_API_KEY |
User-Api-Key |
HTTPS_PROXY / HTTP_PROXY |
HTTP 代理(与浏览器一致) |
XDG_CONFIG_HOME |
配置根目录(默认 ~/.config) |
示例:
export HTTPS_PROXY=http://localhost:7890
export HTTP_PROXY=http://localhost:7890
go run ./cmd/ldo-tui doctor按顺序检查:
cookie.txt是否为 Request Cookiedoctor里names应类似:cf_clearance, _forum_session, _t, ...- 不应出现:
Path,Domain,Expires,SameSite(那是 Set-Cookie 属性)
- 是否含
cf_clearancedoctor显示cf_clearance=true
- 代理是否与浏览器一致
- 节点一变,clearance 常立刻失效
- UA 是否大致一致
- 改
user-agent.txt或与浏览器对齐
- 改
- 重新抓取
login --browser或 TUI 按b
- 确认跑的是同一套二进制 / 同一配置目录
- 重启 TUI(会重新读配置)
- 看是否改过
XDG_CONFIG_HOME
通常仍可读公开帖;若异常,请从已登录且能刷帖的页面复制完整 Request Cookie。
- 确认已安装 Chrome 或 Chromium
- 在弹出窗口里手动完成验证,勿立即关闭
- 最多等待约 3 分钟;失败可改手写
cookie.txt
要。其中含会话信息,文件权限为 600。勿提交到 Git,勿发到公开聊天。
# 测试
go test ./...
# 构建
go build -o ldo-tui ./cmd/ldo-tui主要包结构:
cmd/ldo-tui/ 入口与子命令
internal/linuxdo/ HTTP 客户端、JSON 解析、Cookie 清洗
internal/auth/ 凭证读写、浏览器抓 Cookie、首次配置生成
internal/ui/ bubbletea 界面
internal/render/ 列表行、HTML→文本
internal/config/ 路径与常量
Agent / 设计交接见本地 .agent/(仅本地维护,不随仓库入库)。
- 专用 linux.do,不做通用 Discourse 多站点客户端
- 当前版本以阅读为主;发帖/回帖等不在范围内
- 请正当使用:礼貌请求频率,勿做批量爬取或绕过站点安全策略的工具
本项目灵感来自 lhpqaq/ldo(linux.do 终端客户端),在其思路上按个人使用习惯重写。
MIT License,见 LICENSE。