摘要 / Summary
Reddit 通道(rdt-cli 后端)在持有有效 reddit_session cookie 的情况下仍被 Reddit 返回 403 Blocked。根因在下游 rdt-cli:其 httpx 传输被 Reddit 按 TLS/HTTP 客户端指纹封禁,而同样的凭据走 urllib / curl / requests 均正常 。上游已有修复(rdt-cli PR #20 :httpx→requests),但未合并;本项目将 rdt-cli pin 在 v0.4.2(httpx 版) ,因此集成至今仍是坏的。
复现 / Reproduction(本机实测 2026-08-21)
同一台机器、同一个有效 reddit_session、同一 URL https://www.reddit.com/api/me.json?raw_json=1、同一套 Chrome 指纹 headers:
urllib → 200 application/json
curl → 200 application/json
httpx.Client → 403 text/html '<body class=theme-beta>...' ← rdt-cli 内部用的就是 httpx
rdt status → authenticated=false, error="Access forbidden: Resource"
与 rdt-cli 上游 Issue #13 (aaajiao)的复现过程完全一致——连 403 的 <body class=theme-beta> 响应体都相同。
根因 / Root cause
上游 :rdt-cli 的 httpx TLS/HTTP 栈被 Reddit 指纹识别并封锁,凭据再有效也 403。见 public-clis/rdt-cli#13 ;修复 PR #20 (httpx→requests,urllib3 可通过指纹检查,123 项测试通过)于 2026-08-07 提交,至今未合并 (上游 2026-03 已停更)。
本项目 :agent_reach/channels/reddit.py 将 rdt-cli pin 到 5e4fb3720d5c174e976cd425ccc3b879d52cac66(= 2026-03-21 v0.4.2,httpx 版),不含 fix(youtube,bilibili): 修复 yt-dlp 渠道 10 个 bug #20 修复 。
为什么 doctor 发现不了 / Why doctor can't catch it
_check_rdt() 刻意不执行 rdt status(避免触发上游自动刷新浏览器 Cookie),只静态检查 credential.json 是否存在 + 7 天 TTL。因此只要 cookie 文件存在且新鲜,doctor 永远返回 warn、永不 fail ——用户会误判为 cookie / 代理问题,实际是 rdt 客户端被 WAF 封。对 VPS / 无头服务器场景(无 OpenCLI 桌面浏览器),Reddit 读取链路实际不可用,但 doctor 不报。
建议 / Suggestions(贴合"胶水层、不改上游源码"定位)
前移 pin :把 _RDT_GIT_SOURCE 的 commit 从 5e4fb37(httpx 版)前移到含 requests 修复的版本。等待 fix(youtube,bilibili): 修复 yt-dlp 渠道 10 个 bug #20 合并期间,可先用其提交 3ff6db5;合并后用主分支即可。一行改动,不触碰上游源码。
doctor 增加真实可用性探针 :对 rdt 通道用 requests 以已存 cookie 直接请求一个只读端点(如 /api/me.json)做一次性验证(不调用 rdt status、不触发上游自动刷新逻辑),把 403 显示为真实 error,而不是永远 warn。
文档补一行 :guides/setup-reddit.md 说明 rdt-cli httpx 传输已知被 WAF 封(上游 Instagram cookies 配置后无法使用 - 被重定向到登录页 #13 /fix(youtube,bilibili): 修复 yt-dlp 渠道 10 个 bug #20 ),修复正式合并前可本地应用该补丁;搜索类需求建议走 Exa 兜底(site:reddit.com,见 Reddit health can be ok while search.json still gets 403; search should prefer Exa #222 )。
补充 / Notes
摘要 / Summary
Reddit 通道(rdt-cli 后端)在持有有效
reddit_sessioncookie 的情况下仍被 Reddit 返回 403 Blocked。根因在下游 rdt-cli:其 httpx 传输被 Reddit 按 TLS/HTTP 客户端指纹封禁,而同样的凭据走 urllib / curl / requests 均正常。上游已有修复(rdt-cli PR #20:httpx→requests),但未合并;本项目将 rdt-cli pin 在 v0.4.2(httpx 版),因此集成至今仍是坏的。复现 / Reproduction(本机实测 2026-08-21)
同一台机器、同一个有效
reddit_session、同一 URLhttps://www.reddit.com/api/me.json?raw_json=1、同一套 Chrome 指纹 headers:与 rdt-cli 上游 Issue #13(aaajiao)的复现过程完全一致——连 403 的
<body class=theme-beta>响应体都相同。根因 / Root cause
agent_reach/channels/reddit.py将 rdt-cli pin 到5e4fb3720d5c174e976cd425ccc3b879d52cac66(= 2026-03-21 v0.4.2,httpx 版),不含 fix(youtube,bilibili): 修复 yt-dlp 渠道 10 个 bug #20 修复。为什么 doctor 发现不了 / Why doctor can't catch it
_check_rdt()刻意不执行rdt status(避免触发上游自动刷新浏览器 Cookie),只静态检查credential.json是否存在 + 7 天 TTL。因此只要 cookie 文件存在且新鲜,doctor 永远返回 warn、永不 fail——用户会误判为 cookie / 代理问题,实际是 rdt 客户端被 WAF 封。对 VPS / 无头服务器场景(无 OpenCLI 桌面浏览器),Reddit 读取链路实际不可用,但 doctor 不报。建议 / Suggestions(贴合"胶水层、不改上游源码"定位)
_RDT_GIT_SOURCE的 commit 从5e4fb37(httpx 版)前移到含 requests 修复的版本。等待 fix(youtube,bilibili): 修复 yt-dlp 渠道 10 个 bug #20 合并期间,可先用其提交3ff6db5;合并后用主分支即可。一行改动,不触碰上游源码。/api/me.json)做一次性验证(不调用rdt status、不触发上游自动刷新逻辑),把 403 显示为真实 error,而不是永远 warn。guides/setup-reddit.md说明 rdt-cli httpx 传输已知被 WAF 封(上游 Instagram cookies 配置后无法使用 - 被重定向到登录页 #13/fix(youtube,bilibili): 修复 yt-dlp 渠道 10 个 bug #20),修复正式合并前可本地应用该补丁;搜索类需求建议走 Exa 兜底(site:reddit.com,见 Reddit health can be ok while search.json still gets 403; search should prefer Exa #222)。补充 / Notes