9045fee67e
PyPI still only has rdt-cli 0.4.1 while the doctor hint required >=0.4.2, so the suggested install command always failed. Installs from the upstream GitHub repo pinned to the 0.4.2 commit instead, and syncs all four docs that still taught the PyPI path. Verified locally: clean-venv install from the pinned source yields rdt 0.4.2 and rdt status works. 86 tests pass. Fixes #294.
80 lines
3.5 KiB
Python
80 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""Reddit — search and read via rdt-cli (public-clis/rdt-cli).
|
||
|
||
NOTE: Reddit requires authentication since 2024. All API requests
|
||
(including public subreddit reads) return HTTP 403 without a valid
|
||
session cookie. Run `rdt login` after installation to authenticate.
|
||
"""
|
||
|
||
import json
|
||
import shutil
|
||
import subprocess
|
||
|
||
from .base import Channel
|
||
|
||
_CREDENTIAL_FILE = "~/.config/rdt-cli/credential.json"
|
||
# Pinned to the 0.4.2 state — PyPI still only has 0.4.1 (upstream issue #10).
|
||
_RDT_GIT_SOURCE = "git+https://github.com/public-clis/rdt-cli.git@5e4fb3720d5c174e976cd425ccc3b879d52cac66"
|
||
|
||
|
||
class RedditChannel(Channel):
|
||
name = "reddit"
|
||
description = "Reddit 帖子和评论"
|
||
backends = ["rdt-cli"]
|
||
tier = 1 # Reddit requires login since 2024 (rdt login) — not zero-config
|
||
|
||
def can_handle(self, url: str) -> bool:
|
||
from urllib.parse import urlparse
|
||
|
||
d = urlparse(url).netloc.lower()
|
||
return "reddit.com" in d or "redd.it" in d
|
||
|
||
def check(self, config=None):
|
||
rdt = shutil.which("rdt")
|
||
if not rdt:
|
||
return "off", (
|
||
"需要安装 rdt-cli。PyPI 版本可能暂时落后,推荐直接从 GitHub 安装:\n"
|
||
f" pipx install '{_RDT_GIT_SOURCE}'\n"
|
||
"如已确认 PyPI 版本已更新,也可使用:\n"
|
||
" pipx install rdt-cli\n"
|
||
" uv tool install rdt-cli\n"
|
||
"最新源码:https://github.com/public-clis/rdt-cli\n"
|
||
"安装后运行 `rdt login` 登录(需先在浏览器登录 reddit.com)"
|
||
)
|
||
|
||
try:
|
||
r = subprocess.run(
|
||
[rdt, "status", "--json"],
|
||
capture_output=True,
|
||
encoding="utf-8",
|
||
errors="replace",
|
||
timeout=10,
|
||
)
|
||
data = json.loads(r.stdout or "{}")
|
||
authenticated = data.get("data", {}).get("authenticated", False)
|
||
username = data.get("data", {}).get("username") or ""
|
||
|
||
if authenticated:
|
||
suffix = f"(已登录:{username})" if username else ""
|
||
return "ok", (f"rdt-cli 可用{suffix}(搜索帖子、阅读全文、查看评论)")
|
||
|
||
return "warn", (
|
||
"rdt-cli 已安装但未登录。Reddit 自 2024 年起要求认证,"
|
||
"未登录时所有请求均返回 403。\n\n"
|
||
"方法一(自动):运行 `rdt login`\n"
|
||
" 先在浏览器登录 reddit.com,再运行此命令自动提取 Cookie。\n\n"
|
||
"方法二(手动,适用于 Chrome/Edge 127+ 无法自动提取时):\n"
|
||
" 1. Chrome 应用商店安装 Cookie-Editor 扩展:\n"
|
||
" https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm\n"
|
||
" 2. 在浏览器打开 reddit.com(确保已登录)\n"
|
||
" 3. 点击 Cookie-Editor 图标,找到 `reddit_session`,复制其 Value\n"
|
||
f" 4. 将以下内容写入 {_CREDENTIAL_FILE}:\n"
|
||
' {"cookies": {"reddit_session": "<粘贴 Value>"}, '
|
||
'"source": "manual", "username": "<你的用户名>", '
|
||
'"modhash": null, "saved_at": 0, "last_verified_at": null}\n\n'
|
||
"验证:`rdt status --json` 确认 authenticated: true"
|
||
)
|
||
|
||
except (json.JSONDecodeError, FileNotFoundError, subprocess.TimeoutExpired):
|
||
return "warn", "rdt-cli 已安装但状态检查失败,运行 `rdt status` 查看详情"
|