LumiRSS 上游能力映射矩阵 · FreshRSS / RSSHub

R22 全功能映射审计 · 50 能力族(F01–F30 FreshRSS + H01–H20 RSSHub)+ RSSHub 131 路由快照全目录

生成时间:2026-10-02(Wave3 逐行核实升级) FreshRSS pin:freshrss/freshrss:1.29.1@sha256:ab6b363102cc…(docker-compose.yml:5) RSSHub pin:diygod/rsshub@sha256:387fd32ee2d8…(docker-compose.yml:19 = 快照 _meta.rsshubImage) 核对基线:工作树 release/2.0.1(静态代码审计)

读法与诚实声明

表 1 · 50 能力族映射

编号能力族上游能力Lumi 入口(BFF / Web)状态证据与说明
F01订阅管理(订阅/退订)GReader subscription/list / subscription/edit(官方示例即退订)[GReader API]
BFF adapters/freshrss_control.py:FreshRSSControlAdapter.subscribe(L240) / unsubscribe(L287);routers/subscriptions.py L153 POST /api/v1/subscriptions、L503 DELETE /api/v1/subscriptions/{ref}、L461 unsubscribe-preview
Web AddSourceDialog.tsx → add-source/PreviewStage.tsx(订阅);UnsubscribeDialog.tsx(退订预览确认)
完整接入BFF 端点 + Web 入口双证据;tests/test_freshrss_control.py、tests/test_subscriptions_route.py 经测试。单分类模型(greader categories[0])。
F02分类管理(列表/移动/重命名/新建)分类/订阅分组管理[Subscriptions];greader subscription/edit 自动建分类
BFF freshrss_control.py list_categories(L216)/move_category(L302)/move_to_new_category(L317)/rename_category(L388);subscriptions.py L139 GET /api/v1/categories、L294 PATCH /api/v1/subscriptions/{ref}、L777 PATCH /api/v1/categories/{id:path}
Web MoveSubscriptionDialog.tsx(移动/新建分类)、RenameCategoryDialog.tsx、settings/categories.tsx
完整接入tests/test_freshrss_control.py、tests/test_f004_f005_f006_subscriptions.py 经测试。
F03OPML 导入(预览/树形/撤销/日志)OPML 导入[Subscriptions]
BFF routers/opml.py L82 import/preview、L97 import(合并式)、L168/L184 树形预览/应用、L220 undo、L232 log;opml.py:OpmlService
Web OpmlImportDialog.tsx、OpmlImportFlow.tsx
完整接入tests/test_opml.py、tests/test_f002_opml_selective.py、Web __tests__/opml-import.test.tsx 经测试。经 BFF 代理,浏览器不接触 FreshRSS 凭据。
F04OPML 导出OPML 导出[Subscriptions]
BFF routers/opml.py L49 GET /api/v1/opml/export;freshrss_control.py:export_opml(L360)
Web pages/SubscriptionsPage.tsx L217/L564(useOpmlExportFlow);api/client.ts L1660
完整接入选择性导出 tests/test_f003_opml_export_selection.py 经测试(R07 本轮已落地)。
F05Feed 发现(站点 URL → feed 候选)FreshRSS 添加订阅支持从站点 URL 发现 feed[Subscriptions]
BFF source_discovery.py(0014:safe-fetch 页面 → <link rel=alternate> 声明 → 常见端点有界探测;无递归无爬取,只读);routers/discovery.py L110 POST /api/v1/source-discovery、L26 feed-preview
Web add-source/WebsiteTab.tsx L46(useSourceDiscoveryMutation)
完整接入tests/test_source_discovery.py、Web __tests__/source-discovery.test.tsx 经测试。声明候选交由预览验证,服务绝不触 FreshRSS。
F06刷新调度(全局 cron)FreshRSS 容器 cron 自动更新(CRON_MIN)[FeedUpdates]
BFF 部署层拥有:docker-compose.yml L14 CRON_MIN(13,43)为唯一调度者;BFF 无刷新调度代码
Web 无(非 Lumi UI 域)
不适用委托:FreshRSS 容器 cron。部署配置承担,非代码路径,无 BFF 测试。
F07刷新调度(每源频率 TTL)每源「Do not automatically refresh more often than」[Refreshing feeds]
BFF greader API 无每源 TTL 通道;routers/sources.py L845 仅产出新鲜度建议(advisory),文案明确「逐源频率需在 FreshRSS 原生界面调整」
Web 委托入口:settings/SourcesSettingsSection.tsx L9(FreshRSS 原生界面链接,见 F23)
未接入委托候选:可经原生界面设置(freshrss-coverage.md 缺口 1)。
F08抓取缓存(上游侧)FreshRSS 内置 SimplePie/HTTP 条件抓取缓存(上游内部机制)
BFF 无缓存层——adapters/freshrss.py:list_entries(L508) 直读 stream/contents;Lumi 不 shadow-copy 条目
Web 无
不适用上游抓取缓存属 FreshRSS 域,greader API 无缓存控制通道;RSSHub 预览缓存另见 H13。
F09WebSub(PubSubHubbub)推送FreshRSS 支持 WebSub 推送[FeedUpdates]
BFF 无对应代码:部署拉取由 CRON_MIN 承担(F06),无 push 通道消费
Web 无
未接入上游推送能力未被 Lumi 消费;cron 拉取模式满足当前需求,接入属后续可选。
F10条目流读取(列表/分页/单条详情)greader stream/contents + item contents[GReader API]
BFF adapters/freshrss.py list_entries(L508)、_request_stream(L780)、_request_category_stream(L813)、get_entry(L639)、_request_item_contents(L879);routers/entries.py L49 GET /api/v1/entries(all/unread/starred、feed/分类流、不透明游标)、L209 GET /{entry_ref}
Web EntryList.tsx / EntryRow.tsx;Reader.tsx → ArticleContent.tsx(DOMPurify 最终边界)
完整接入过滤在上游 it 参数完成;tests/test_entries_route.py、tests/test_entries_pagination.py、tests/test_entry_adapter.py 经测试。
F11已读与收藏状态(set 语义)greader edit-tag(Lumi 实测 1.29.1)[GReader API]
BFF freshrss.py:set_entry_state(L682)、_request_edit_tag(L712);routers/entries.py L296 PATCH /api/v1/entries/{entry_ref}/state(set 语义非 toggle;打开不自动已读)
Web EntryActionButtons.tsx L13(read/starred 等五态独立注释)、L138-141(starred patch)
完整接入tests/test_entry_state.py 经测试。
F12条目标签(FreshRSS labels)greader tag/list(官方示例);FreshRSS UI 支持条目 labels[GReader API]
BFF 无透传:set_entry_state 仅 read/star;Lumi 自有标签域 tags.py:TagStore(rss:/library: ItemRef)为独立数据
Web ItemTagButton.tsx(自有标签,非 FreshRSS labels)
未接入FreshRSS 条目 label 无 Lumi 通道;两套标签互不相通(freshrss-coverage.md 缺口 3)。
F13未读计数greader unread-count(官方示例)[GReader API]
BFF BFF 不消费该端点(adapters/freshrss.py 仅 _UNREAD_FILTER 作 it 过滤,无 unread-count 调用)
Web Sidebar.tsx L594「未读」视图(过滤流,无计数徽标)
未接入无依赖场景:过滤流已覆盖未读阅读;如需徽标可后续经 unread-count 实现(freshrss-coverage.md 缺口 5)。
F14视图(公开视图 feed / 来源分流视图)FreshRSS 显示模式/视图为上游 UI 域[主特性页]
BFF 公开视图 feed:routers/view_feed.py L65 GET /feeds/views/{view_id}.{secret}.atom(带令牌免登录 Atom 输出);来源分流视图:new203_views.py + routers/new203_views.py L89-154(CRUD+条目查询,读取侧命名过滤器)
Web 公开视图 feed:ViewFeedTokenDialog.tsx(完整);分流视图仅 new201/api.ts L188-207 API 包装器,无组件调用
部分接入公开视图 feed 通道完整(tests/test_f061_view_feed_atom.py);new203 分流视图 BFF+测试齐备(tests/test_new203_views.py)但 Web 未挂接——后端有但 UI 缺失(并入本行说明)。
F15附件(Enclosure 媒体/播客)条目 enclosure 字段(GReader 条目内容)[GReader API]
BFF freshrss.py L978-982:enclosure 原样透传(仅取 str href + 可选 str type)
Web EnclosurePlayer.tsx L1(audio/video 附件播放器,记忆播放位置)
完整接入BFF 透传 + Web 播放入口双证据。
F16每源全文抓取(含 XPath 文章提取)Feed 设置支持全文抓取/XPath 站点配置[Subscriptions]
BFF 无对应 greader 通道。Lumi 自有 clip/抽取域(clip_fetch.py、article_extract.py)操作对象是 Lumi 库内条目,非上游 feed 配置
Web 无(上游配置面)
未接入委托候选:经原生界面设置。Lumi 自有抽取是另一能力域,不冒充上游配置。
F17全文搜索FreshRSS UI 有搜索/过滤;官方 greader API 文档未记载 search 端点[GReader API]
BFF Lumi 本地派生投影:search_index.py:SearchIndexService + freshrss.py:list_entry_documents(L576)(限界采集 → html_to_text);routers/search.py L77 GET /api/v1/search、L397 POST /api/v1/search/rebuild
Web pages/SearchPage.tsx、CommandPalette.tsx(search 段)
完整接入机制注明:搜索由 Lumi 投影提供,刻意不走上游(上游 API 无通道)。tests/test_search_index.py、tests/test_f017_search_builder.py 经测试。
F18保存查询(保存的搜索/过滤意图)FreshRSS user queries(保存查询)为上游用户域[主特性页]
BFF Lumi 自有保存搜索:saved_search_store.py(存 query+filter 参数、不存结果集,cap 50);routers/search.py L452-516 /api/v1/search/views CRUD/pin
Web SaveSearchDialog.tsx
完整接入tests/test_saved_search_views.py、tests/test_n144_saved_search_scope.py 经测试。
F19过滤(条目过滤)FreshRSS filter actions(每源正则动作)为上游 feed 配置域
BFF 上游 filter actions 无 greader 通道;Lumi 自有服务端屏蔽规则(F045):feed_filter_store.py + routers/feed_filters.py L27/L34/L53/L65/L77(规则 CRUD+试跑;只影响 Lumi entries 时间线,零 adapter 调用负向契约)
Web settings/FilterRulesPage.tsx
部分接入上游侧未接入(委托候选);Lumi 侧规则引擎完整(tests/test_f045_feed_filter_rules.py、Web filter-dry-run.test.tsx)。
F20分享服务(sharing services)分享到外部服务(Clipboard/Email/Buffer 等)[Sharing]
BFF 无分享相关 BFF 代码。Lumi 自有导出域:obsidian_handoff.py(不是 FreshRSS 分享数据)
Web ObsidianExportDialog.tsx(自有导出,非上游分享域)
不适用委托候选,可经原生界面使用(freshrss-coverage.md 缺口 4)。
F21身份与账户隔离FreshRSS 多用户 + admin 用户管理[User management]
BFF Lumi 自有账户体系:accounts_store.py:AccountsStore;FreshRSS 用户由 operator 预置进池(routers/admin/invites.py L406 pool_add、scripts/freshrss_pool.sh),激活时 control_resources.py:bind_freshrss_account 写入绑定
Web admin/AdminScreen.tsx
完整接入每账户订阅/阅读态/AI 设置/FreshRSS 绑定完全隔离(ADR 0005)。tests/test_auth_sessions.py、tests/test_admin_system.py 经测试。
F22登录与注册FreshRSS 自身登录/自注册开关为上游认证域
BFF Lumi:邀请 → /activate 一次性激活(有效期);可选公开注册默认关闭(ADR 0006)
Web LoginScreen.tsx、ActivateScreen.tsx、RegisterScreen.tsx
完整接入FreshRSS 侧登录不经 Lumi(上游凭据零暴露);会话/激活 tests/test_auth_sessions.py 经测试。
F23上游认证边界(API password 生命周期)每用户在 FreshRSS UI 启用 API 访问并生成 API password[GReader API]
BFF Lumi 只安全持有:freshrss.py:FreshRSSSession._get_auth_token(L383)/_get_action_token(L414)(token 仅进程内存);deps.py L165 _build_user_adapter(L176 读每用户 secrets 0600);subscriptions.py L815 GET /api/v1/freshrss/native-url(响应恰 {origin, username},内部 Docker 主机名永不回显);credential_rotation.py(N130)明确不含 freshrss password
Web 委托入口:settings/SourcesSettingsSection.tsx L9(新标签打开原生界面,rel=noopener,标注委托)
完整接入生成/轮换不经 Lumi、需原生界面操作(诚实边界,见 freshrss-coverage.md 委托入口)。tests/test_freshrss_adapter.py、tests/test_freshrss_native_url.py 经测试。
F24GReader API 通道(唯一上游通道)ClientLogin + Authorization: GoogleLogin auth=…[GReader API]
BFF 全部 FreshRSS 读写经此 API——Lumi 唯一上游通道;API password 存每用户 secrets 文件(0600),永不进浏览器
Web 无(服务端持有,凭据零暴露)
完整接入tests/test_freshrss_adapter.py、tests/test_freshrss_native_url.py 经测试。
F25Fever APIFever 兼容 API(官方独立文档页,「less powerful」)[GReader API]
BFF 无对应代码(Lumi 统一走 greader API)
Web 无
不适用上游另有 Fever 通道;Lumi 架构决策只消费 greader,无双通道。
F26保留/归档策略(archiving/purge)全局→分类→每源 Archiving + Purge now + cli/purge.php[Configuration#archiving]
BFF 无上游通道。Lumi 只对自己的派生数据有保留策略:storage_retention.py(F114,仅 ai_versions/task_log 等派生数据)
Web 无
不适用FreshRSS 文章保留完全由上游策略拥有;Lumi 用户内容永不触碰(freshrss-coverage.md 缺口 2)。
F27备份(备份/恢复/远端)FreshRSS 支持逐用户数据导出(admin 域)
BFF Lumi 备份引擎:routers/backup.py(L104/L114 WebDAV、L140+ 备份任务、L255 remote、L428 compare、恢复端点);backup.py L171 assess_freshrss_backup(FreshRSS 数据目录只读评估)+L923;backup_scope.py(范围白名单)
Web settings/backup/(BackupOverview.tsx、BackupHistoryCard.tsx、RestoreWizard.tsx、WebDavCard.tsx)
完整接入tests/test_backup.py、test_backup_restore_roundtrip.py、test_backup_capabilities.py;Web backup-ui/n185/n186 测试。FreshRSS 侧数据文件备份属部署域(Lumi 只做只读评估,不替 operator 备份上游)。
F28版本健康(版本核对/更新提示)FreshRSS admin 版本/更新检查页为上游域
BFF Lumi 自身版本健康完整:routers/health.py L38 GET /api/v1/version(commit 溯源);routers/whats_new.py L23;scripts/check-version.py(web/bff/prod/allinone tag 一致性门禁,L74-94)
Web settings/AboutVersion.tsx(Web/BFF commit 错配诊断)、VersionUpdateToast.tsx
部分接入Lumi 侧完整(tests/test_health.py、tests/test_n198_whats_new.py);FreshRSS 上游版本/更新核对无 API 通道 → 经 F23 委托入口在原生界面查看。
F29扩展与主题(extensions/themes)FreshRSS 扩展系统 + 主题系统[Extensions]
BFF 无对应 BFF 代码(诚实缺席;greader API 无扩展/主题通道)
Web 无(operator 可在 FreshRSS 原生界面管理,经 F23 委托入口)
不适用委托:FreshRSS 原生 UI 域;Lumi 自有设计系统(--lumi-* tokens)不镜像上游界面。
F30单容器 PHP 部署(allinone)FreshRSS 本为单容器 PHP 应用(php-fpm);上游亦提供官方镜像
BFF 部署层:docker-compose.allinone.yml(Caddy + BFF + FreshRSS php-fpm + RSSHub 由 s6-overlay 单容器监督;FreshRSS 数据卷与 4 容器栈互通;内部端口 loopback-only);docker/all-in-one/Dockerfile;./lumirss deploy --single / migrate-single / rollback-single(备份门禁,L26-29/L93/L118);tests/deploy/run-single-topology-tests.sh(67 断言)
Web 无(部署域)
完整接入scripts/check-version.py L74-84 allinone tag 门禁。R05 本轮已落地。
H01实例连接(base URL/健康检查)RSSHub 实例以 env 配置连接[docs.rsshub.app]
BFF rsshub.py RssHubSettings(RSSHUB_BASE_URL / RSSHUB_FRESHRSS_BASE_URL;load_settings L494-508 缺失/非法 → RssHubNotConfigured L155);共享 client main.py L318-319;compose rsshub 服务 + healthcheck(docker-compose.yml L18-30)
Web settings/RssHubAutoConfigCard.tsx(配置/探测入口)
完整接入浏览器永不直连 RSSHub;订阅 URL 用 FreshRSS 容器视角构造(ADR 0008)。tests/test_rsshub_gate.py。
H02路由目录(curated + 快照全目录)上游数百命名空间社区路由目录[docs.rsshub.app](pinned image routes.json → 快照,见表 2)
BFF rsshub.py CATALOG(L255) 14 条精选(2026-09-01 对 pinned 实例逐条实测 HTTP 200 + 可解析 feed)、list_routes(L509);routers/rsshub.py L113 GET /api/v1/rsshub/routes;全量快照目录 rsshub_routes_data.py(13 命名空间/131 路由,表 2);Lumi 扩展:收藏/最近使用 routers L373/385/403/416(rsshub_route_store.py:mask_params 哨兵)
Web add-source/RssHubTab.tsx L54(useRssHubRoutes 搜索/选择;收藏/最近区块)
部分接入刻意 allowlist:curated 14/131,扩展需改代码;全量快照用于 H04 导入匹配。目录存在 ≠ 实测可用(网络验证按导入源与代表样本)。tests/test_rsshub.py、test_n021_rsshub_favorites_recent.py、test_rsshub_catalog_upstream.py 经测试。
H03实例自动识别(detect)实例可达性(/healthz)
BFF routers/rsshub.py L727 GET /api/v1/rsshub/detect:只探测受限候选(configured/compose-dns/host-loopback 三处,2s),绝无 LAN 扫描
Web settings/RssHubAutoConfigCard.tsx L53 useDetectRssHub
完整接入tests/test_rsshub_gate.py 边界经测试。
H04OPML 导入自动采用(R18)非 RSS 源经 RSSHub 转换(RSSHub 定位:feed 生成器)
BFF rsshub_import_flow.py plan(L101 零网络零写入) / apply(L134 先实际验证 _validate L349 再订阅;MAX_VALIDATIONS=30 L55);rsshub_match.py classify_feed_url(L239)(self_rsshub/external_rsshub/native/unknown)+ match_source;rsshub_routes_data.py:match_concrete_path(L197 上界 8 匹配);routers/opml.py L284 plan、L300 apply、L371 mappings、L381 revert
Web OpmlImportFlow.tsx L281(plan 摘要)、SourceStatsDrawer.tsx L264(台账对照/撤销)、api/client.ts L1841-1889
完整接入诚实边界:不自动退订旧源(keptOldSource);已读/收藏状态绑定条目地址不可迁移。tests/test_r18_rsshub_import.py、Web __tests__/r18-rsshub-import.test.tsx 经测试(R18 本轮已落地)。
H05路由溯源(路由 → 我的来源)(Lumi 域)
BFF routers/rsshub.py L961 GET /api/v1/rsshub/routes/{route_key}/my-sources(本人作用域);rsshub.py:match_route_path(L426) 反向匹配(脱敏签名比对,服务端不触真实凭据)
Web RssHubTab.tsx useRssHubRouteMySources
完整接入未读数取自派生投影,文案不冒充「确认没有未读」(routers L934-937)。tests/test_n021_rsshub_favorites_recent.py。
H06路径参数(表单/服务端构造)路由路径含参数段(快照 parameters 元数据)[docs.rsshub.app]
BFF rsshub.py RssHubParameter(L197)、build_path(L450 pattern fullmatch + 逐段 URL 编码 + 结构检查,路径注入不可行)、_template_pattern(L413);运营态表单面 routers/new207_rsshub_form.py L58/L67/L82/L174(schema/validate/apply/uses);Lumi 扩展:参数方案 routers L1077-1133(cap 20/用户,敏感方案 apply 要求重输)+ 参数差异对照 L556(extract_entry_titles L675 / diff_title_sets L694,严格只读)
Web RssHubTab.tsx 参数表单(本地即时校验,真校验在服务端);new201/SourceOpsDialog.tsx L758 RssHubFormPanel;rsshub-route-params-dialog.tsx
完整接入tests/test_rsshub.py、tests/test_new207_rsshub_form.py、tests/test_n030_rsshub_param_presets.py 经测试。
H07通用参数(limit/mode/key 等路由级参数)RSSHub 支持路由通用 query 参数(limit、mode、order、key 等)[docs.rsshub.app]
BFF 不支持——build_path(L455-458) 对未声明参数键显式拒绝(RssHubInvalidParameters);预览仅拼 path(L519/L548),无 query string 透传
Web 无对应输入
未接入诚实边界:经 Lumi 只能订阅路由声明参数的 feed;需要通用参数的源需经原生界面直订或后续扩展白名单。
H08过滤参数(filter/filter_title 等)RSSHub 支持过滤参数(filter、filter_title、exclude_title 等)[docs.rsshub.app]
BFF 不支持——同 H07:参数白名单只含路由声明键
Web 无(Lumi 时间线过滤走自有域,见 F19)
未接入过滤在 Lumi 侧由服务端屏蔽规则(F045)承担,不经 RSSHub 过滤参数。
H09Feed 预览(非变更)RSSHub 对路由路径返回 RSS/Atom 文档
BFF rsshub.py:RssHubService.preview(L522)(origin 锁定 + 有界 body + 重定向不出源);routers/rsshub.py L182 POST /api/v1/rsshub/preview(含 alreadySubscribed 预检)
Web RssHubTab.tsx → add-source/PreviewStage.tsx
完整接入预览绝不改订阅状态;tests/test_rsshub.py 经测试。
H10站点/路由凭据库(write-only)路由所需站点凭据(Cookie/token 等)[docs.rsshub.app]
BFF routers/rsshub.py L770/L777/L798/L809/L819 credentials CRUD(values write-only,仅 configured 旗标可读;envKey/domain/kind 校验;加凭据绝不臆造 RSSHub 路由)
Web settings/RssHubAutoConfigCard.tsx useRssHubCredentials
完整接入tests/test_rsshub_control.py 经测试。
H11管理员配置中心RSSHub 实例 env(缓存/代理/上游凭据等)[docs.rsshub.app]
BFF rsshub_control.py RssHubControlStore(L238)、config_view(L354)、set_secret(L324)(allow-list 非密值 + write-only secrets);routers/rsshub.py L664 GET / L677 PATCH /api/v1/rsshub/config、L866/L876 secrets、L884 apply(restartRequired 如实上报);Lumi 扩展:管理员路由使用聚合 L1005 / _admin_guard(L1139)(响应仅计数)
Web settings/RssHubControlCenter.tsx(配置分组 + 待重启旗标)
部分接入配置中心完整(tests/test_rsshub_control.py,secrets 永不回显,wire 格式锁定 L667-670 注释);使用聚合 BFF+测试齐备但 Web 无调用组件——后端有但 UI 缺失(并入本行说明)。
H12配置生效(env 物化/导出/apply)实例配置以 env 应用[docs.rsshub.app]
BFF routers/rsshub.py L696 GET /api/v1/rsshub/config/export(secrets 不回显)、L825 POST config/env-file(服务端写 0700 目录 + 0600 文件,响应仅计数);rsshub_control.py:export_env(L389);宿主机 services/bff/scripts/apply_rsshub_config.py 应用(dry-run 默认)
Web settings/RssHubControlCenter.tsx L329(下载 env 片段);RssHubAutoConfigCard.tsx L9(0600 物化 + 脚本指引)
完整接入文件内容不经浏览器。tests/test_rsshub_control.py 经测试。
H13缓存 TTL(预览缓存/强制刷新)实例侧 CACHE_EXPIRE 控制路由输出缓存[docs.rsshub.app]
BFF Lumi 预览缓存 rsshub.py:RssHubPreviewCache(L109)(per-user TTL 300s + LRU 50);routers/rsshub.py L219-230 命中不重抓/不记时间线/不 touch 最近使用;强制刷新 L480 POST /api/v1/rsshub/refresh(L444 令牌桶 6 次/分/用户,429+Retry-After;L502 敏感哨兵路由拒绝)= 缓存旁路;实例 CACHE_EXPIRE 经 H11/H12 配置面管理(rsshub_control.py L126)
Web RssHubTab.tsx useRssHubRefreshMutation
完整接入tests/test_n027_rsshub_preview_cache.py(限速与缓存联动)经测试。
H14超时与重试(Lumi 域:对 RSSHub 调用的超时/重试边界)
BFF 共享 client main.py L318-319 timeout=httpx.Timeout(10.0, connect=5.0);rsshub.py:_send(L645-655) httpx.HTTPError → FAILURE_RSSHUB_UNREACHABLE(N026 稳定分类,不与上游拒绝混叠);无自动重试(预览/刷新单次尝试,失败如实入时间线)
Web 时间线卡片如实展示失败类(rsshub-route-health-card.tsx)
部分接入超时边界 + 失败分类完整;重试为显式不做(有界重试仅用于安全幂等操作的约定下,RSSHub 抓取选择不重试)。
H15代理与浏览器渲染依赖(requires 三态)路由可能需要代理/浏览器渲染/登录/Cookie/额外服务(上游路由事实)[docs.rsshub.app]
BFF rsshub.py RssHubRequires(L209)、requires_json(L222)(True/False/None 三态,未知绝不冒充「不需要」);routers/rsshub.py L148 随目录下发;实例侧 PROXY_URI(L135)/PUPPETEER_WS_ENDPOINT(L142)/ACCESS_KEY(L137) 经配置中心 write-only 管理
Web rsshub-requires-chips.tsx(未知显示「未知」chips)
完整接入requires 为 curated 静态知识(人工维护,不随上游路由实现自动更新)。tests/test_n023_rsshub_requires.py 经测试。
H16运行状态(健康时间线/失败分类)上游错误面(不可达/上游拒绝/限流等)
BFF routers/rsshub.py L427 GET /api/v1/rsshub/routes/history(每路由 last 20)+ _record_run(L321);rsshub.py L90-97 N026 稳定失败分类(rsshub_unreachable/upstream_reject/auth_failure/not_found/rate_limited/no_new_content/bad_content/network_error)+ ZERO_ENTRY_HINT(L669) 0 条目诚实提示
Web rsshub-route-health-card.tsx(时间线卡片)
完整接入tests/test_n025_rsshub_route_runs.py、tests/test_n026_rsshub_failure_classes.py 经测试。
H17版本 digest(快照锚定/升级检查)镜像升级会改变路由行为(digest pin 策略)
BFF docker-compose.yml L19(prod L133、e2e L110)digest pin;快照 _meta.rsshubImage 锚定同 digest;tests/test_rsshub_catalog_upstream.py L27 一致性门禁;再生成契约 services/bff/scripts/export_rsshub_routes.py(pin → pull → 按需扩 NAMESPACES → 重跑 → 连 pin 一起提交);升级兼容检查 rsshub_upgrade_check.py:run_upgrade_check(L183) + routers/rsshub.py L1164/L1190(admin-gated;≤12 条真实 preview;targetImage 恒记 pending——Lumi 无 Docker 视角)
Web 升级检查无 Web 调用组件(仅生成类型)
部分接入digest 锚定完整(门禁经测试);N028 升级兼容检查 BFF+测试齐备(tests/test_n028_rsshub_upgrade_check.py)但 Web 未挂接——后端有但 UI 缺失,操作路径暂为管理员 API。
H18访问保护(ACCESS_KEY/网络边界)RSSHub 支持 ACCESS_KEY 访问密钥保护路由[docs.rsshub.app]
BFF 实例发布面回环 only(docker-compose.yml L23 127.0.0.1:1200;allinone 内部 127.0.0.1:12001);浏览器永不直连(ADR 0008 + tests/test_rsshub_gate.py 负向契约);ACCESS_KEY 经配置中心 write-only 管理(rsshub_control.py L137);但 BFF 预览请求不自动附带 ACCESS_KEY(_HEADERS L83 仅 UA)——受保护路由的抓取会归入 auth_failure 分类
Web settings/RssHubControlCenter.tsx(密钥配置面)
部分接入部署边界 + 管理面完整;受保护路由的实际取数未打通(预览失败并如实分类),需实例侧放开或后续实现签名。
H19职责边界(feed 生成器 ≠ 条目库)RSSHub 生成 feed,由订阅方抓取;不存条目状态
BFF 订阅闭环:rsshub.py L562 subscription_url = RSSHUB_FRESHRSS_BASE_URL + path(FreshRSS 抓取 feed,非 BFF/浏览器;容器视角 ADR 0008);快照仅路由元数据非条目数据(rsshub_routes_data.py SNAPSHOT_PATH L48);Lumi SQLite 不 shadow-copy RSS 数据
Web RssHubTab.tsx useSubscribeMutation → POST /api/v1/subscriptions(F01 通道)
完整接入浏览器永不直连 RSSHub;tests/test_rsshub_gate.py(负向契约)经测试。
H20单容器降级(RSSHub 缺席/allinone)RSSHub 可选部署;allinone 内置
BFF 部署层:docker-compose.allinone.yml 单容器内置 RSSHub(loopback 127.0.0.1:12001;RSSHUB_*_BASE_URL 被 compose override 为回环地址);4 容器栈 RSSHUB_BASE_URL 独立可配。BFF:未配置 → RssHubNotConfigured 诚实报错(routers/rsshub.py L126);导入 plan/apply 如实降级(rsshub_import_flow.py L357-358 rsshub_not_configured);原生 RSS 全功能不受影响
Web 添加来源 RSSHub 页签在未配置时给出配置指引
完整接入tests/test_r18_rsshub_import.py 覆盖未配置分支;降级路径诚实(不假成功)。

表 2 · RSSHub 路由快照全目录(13 命名空间 / 131 路由)

来源:services/bff/src/lumirss/rsshub_routes.generated.json(R18 交付)——由 services/bff/scripts/export_rsshub_routes.py 从 pinned 镜像 diygod/rsshub@sha256:387fd32ee2d8789154dcf6446a52365976e768d9ede1a7c1e610cf4da9d89fbc 内的 /app/assets/build/routes.json 提取,_meta.rsshubImage 锚定 digest;tests/test_rsshub_catalog_upstream.py 断言快照镜像 = docker-compose pin。再生成:① 升 pin → ② docker pull 重建容器 → ③ 按需扩充 NAMESPACES → ④ 重跑导出脚本并连 pin 一起提交。

「本站 curated 目录」列 = 该上游 pattern 可实例化出 Lumi 精选目录(rsshub.py CATALOG,共 14/131 路由命中)。目录存在 ≠ 实测可用:网络测试按导入源与代表样本执行(H19 导入 apply 内逐项验证)。

命名空间路径 pattern名称示例所需参数本站 curated 目录
36kr/:category/:subCategory?/:keyword?资讯, 快讯, 用户文章, 主题文章, 专题文章, 搜索文章, 搜索快讯/36kr/newsflashescategory:分类,必填项;keyword:关键词,选填项,仅搜索文章/快讯时有效;subCategory:子分类,选填项,目的是为了兼容老逻辑36kr-newsflashes
36kr/hot-list/:category?资讯热榜/36kr/hot-listcategory:分类,默认为24小时热榜—
cnbeta/头条资讯/cnbeta—cnbeta
cnbeta/category/:id分类/cnbeta/category/movieid:分类 id,可在对应分类页的 URL 中找到—
cnbeta/topics/:id主题/cnbeta/topics/453id:主题 id,可在对应主题页的 URL 中找到—
coolapk/dyh/:dyhId看看号/coolapk/dyh/1524dyhId:看看号ID—
coolapk/hot/:type?/:period?热榜/coolapk/hotperiod:默认为`daily`;type:默认为`jrrm`coolapk-hot
coolapk/huati/:tag话题/coolapk/huati/iPhonetag:话题名称—
coolapk/toutiao/:type?头条/coolapk/toutiaotype:默认为history—
coolapk/tuwen/:type?图文/coolapk/tuwentype:默认为hot—
coolapk/user/:uid/dynamic用户/coolapk/user/3177668/dynamicuid:在个人界面右上分享-复制链接获取—
douban/:id/discussion豆瓣读书论坛/douban/36328704/discussionid:书本id;默认论坛文章使用"按回应时间排序",仅第一页文章—
douban/book/latest/:type?新书速递/douban/book/latest/fictiontype:专题分类,可选,默认为 `all`douban-book-latest
douban/book/rank/:type?热门图书排行/douban/book/rank/fictiontype:图书类型,默认合并列表—
douban/bookstore豆瓣书店/douban/bookstore——
douban/celebrity/:id/:sort?豆瓣电影人/douban/celebrity/1274261id:电影人 id;sort:排序方式,缺省为 `time`(时间排序),可为 `vote` (评价排序)—
douban/channel/:id/:nav?频道专题/douban/channel/30168934/hotid:频道id;nav:专题分类,可选,默认为 default—
douban/channel/:id/subject/:nav频道书影音/douban/channel/30168934/subject/0id:频道id;nav:书影音分类—
douban/commercialpress/latest商务印书馆新书速递/douban/commercialpress/latest——
douban/doulist/:id豆瓣豆列/douban/doulist/37716774id:豆列id—
douban/event/hot/:locationId热门同城活动/douban/event/hot/118172locationId:位置 id, [同城首页](https://www.douban.com/location)打开控制台执行 `window.__loc_id__` 获取—
douban/explore浏览发现/douban/explore——
douban/explore/column/:id浏览发现分栏目/douban/explore/column/2id:分栏目id—
douban/group/:groupid/:type?豆瓣小组/douban/group/648102groupid:豆瓣小组的 id;type:{'default': 'latest', 'description': '类型', 'options': [{'label': '最新', 'value': 'latest'}, {'label': '最热', 'value': 'essence'}, {'label': '精华', 'value': 'elite'}]}—
douban/jobs/:type豆瓣招聘/douban/jobs/campustype:招聘类型,见下表—
douban/list/:type?/:routeParams?豆瓣榜单与集合/douban/list/subject_real_time_hotestrouteParams:额外参数;请参阅以下说明和表格;type:榜单类型,见下表。默认为实时热门书影音—
douban/movie/classification/:sort?/:score?/:tags?豆瓣电影分类/douban/movie/classification/R/7.5/Netflix,2020score:最低评分,默认不限制;sort:排序方式,默认为U;tags:分类标签,多个标签之间用英文逗号分隔,常见的标签到豆瓣电影的分类页面查看,支持自定义标签—
douban/movie/coming电影即将上映/douban/movie/coming——
douban/movie/later即将上映的电影/douban/movie/later——
douban/movie/playing正在上映的电影/douban/movie/playing——
douban/movie/playing/:score正在上映的电影/douban/movie/playing——
douban/movie/ustop北美票房榜/douban/movie/ustop——
douban/movie/weekly/:type?一周口碑榜/douban/movie/weeklytype:分类,可在榜单页 URL 中找到,默认为一周口碑电影榜—
douban/music/latest/:area?最新增加的音乐/douban/music/latest/chinesearea:区域类型,默认全部—
douban/people/:userid/status/:routeParams?用户广播/douban/people/75118396/statusrouteParams:额外参数;见下;userid:整数型用户 id—
douban/people/:userid/wish用户想看/douban/people/exherb/wishuserid:用户id—
douban/recommended/:type?/:routeParams?豆瓣每月推荐片单/douban/recommended/tvrouteParams:额外参数;请参阅以下说明和表格;type:片单类型剧集/电影,tv或movie,默认为tv—
douban/replied/:uid最新回应过的日记/douban/replied/xiaoyaxiaoyauid:用户id,可在用户日记页 URL 中找到—
douban/replies/:uid日记最新回应/douban/replies/xiaoyaxiaoyauid:用户id,可在用户日记页 URL 中找到—
douban/topic/:id/:sort?话题/douban/topic/48823id:话题id;sort:排序方式,hot或new,默认为new—
douban/tv/coming/:sortBy?/:count?即将播出的剧集/douban/tv/comingcount:请求上游返回数量,可选,正整数,默认 `10`;sortBy:排序方式,可选,支持 `hot` 或 `time`,默认 `hot`—
github/activity/:userUser Activities/github/activity/DIYgoduser:GitHub username—
github/advisor/data/:type?/:category?Github Advisory Database RSS/github/advisor/data/reviewed/composer——
github/branches/:user/:repoRepo Branches/github/branches/DIYgod/RSSHubrepo:Repo name;user:User name—
github/comments/:user/:repo/:number?Issue / Pull Request comments/github/comments/DIYgod/RSSHub/8116number:Issue or pull number (if omitted: all);repo:Repo name;user:User / Org name—
github/contributors/:user/:repo/:order?/:anon?Repo Contributors/github/contributors/DIYgod/RSSHubanon:Show anonymous users. Defaults to no, use any values for yes.;order:Sort order by commit numbers, desc and asc (descending by default);repo:Repo name;user:User name—
github/discussion/:user/:repo/:state?/:category?Repo Discussions/github/discussion/DIYgod/RSSHubcategory:Category Name (case-sensitive). Default: `null`.;repo:Repo name;state:{'default': 'open', 'description': 'The state of discussions', 'options': [{'label': 'Open', 'value': 'open'}, {'label': 'Closed', 'value': 'closed'}, {'label': 'Answered', 'value': 'answered'}, {'label': 'Unanswered', 'value': 'unanswered'}, {'label': 'Locked', 'value': 'locked'}, {'label': 'Unlocked', 'value': 'unlocked'}, {'label': 'All', 'value': 'all'}]};user:User name—
github/feed/:user/:types?User's Feed/github/feed/yihong0618/star,release,prtypes:{'default': 'all', 'description': 'Event types to include, comma separated', 'options': [{'label': 'All events', 'value': 'all'}, {'label': 'Create events', 'value': 'create'}, {'label': 'Delete events', 'value': 'delete'}, {'label': 'Fork events', 'value': 'fork'}, {'label': 'Issue comment events', 'value': 'issuecomm'}, {'label': 'Member events', 'value': 'member'}, {'label': 'Pull request events', 'value': 'pr'}, {'label': 'Pull request review comment events', 'value': 'prcomm'}, {'label': 'Public events', 'value': 'public'}, {'label': 'Push events', 'value': 'push'}, {'label': 'Release events', 'value': 'release'}, {'label': 'Watch events (stars)', 'value': 'star'}]};user:GitHub username—
github/file/:user/:repo/:branch/:filepath{.+}File Commits/github/file/DIYgod/RSSHub/master/README.mdbranch:branch name;filepath:path of target file;repo:repository name;user:GitHub user or org name—
github/gist/:gistIdGist Commits/github/gist/d2c152bb7179d07015f336b1a0582679gistId:Gist ID—
github/issue/:user/:repo/:state?/:labels?Repo Issues/github/issue/DIYgod/RSSHub/openlabels:a list of comma separated label names;repo:GitHub repo name;state:{'default': 'open', 'description': 'the state of the issues.', 'options': [{'label': 'Open', 'value': 'open'}, {'label': 'Closed', 'value': 'closed'}, {'label': 'All', 'value': 'all'}]};user:GitHub username—
github/notificationsNotifications/github/notifications——
github/org_event/:org/:types?Organization Event/github/org_event/RSSNextorg:Organization name;types:{'default': 'all', 'description': 'Event types to include, comma separated', 'options': [{'label': 'All events', 'value': 'all'}, {'label': 'Create events', 'value': 'create'}, {'label': 'Delete events', 'value': 'delete'}, {'label': 'Fork events', 'value': 'fork'}, {'label': 'Issue create events', 'value': 'issue'}, {'label': 'Issue comment events', 'value': 'issuecomm'}, {'label': 'Member events', 'value': 'member'}, {'label': 'Pull request events', 'value': 'pr'}, {'label': 'Pull request review comment events', 'value': 'prcomm'}, {'label': 'Pull request review events', 'value': 'prrev'}, {'label': 'Public events', 'value': 'public'}, {'label': 'Push events', 'value': 'push'}, {'label': 'Release events', 'value': 'release'}, {'label': 'Watch events (stars)', 'value': 'star'}, {'label': 'Wiki item create or update events', 'value': 'wiki'}, {'label': 'Commit comment events', 'value': 'cmcomm'}, {'label': 'Discussion events', 'value': 'discussion'}]}—
github/pull/:user/:repo/:state?/:labels?Repo Pull Requests/github/pull/DIYgod/RSSHublabels:a list of comma separated label names;repo:GitHub repo name;state:{'default': 'open', 'description': 'the state of pull requests.', 'options': [{'label': 'Open', 'value': 'open'}, {'label': 'Closed', 'value': 'closed'}, {'label': 'All', 'value': 'all'}]};user:GitHub username—
github/pulse/:user/:repo/:period?Repo Pulse/github/pulse/DIYgod/RSSHubperiod:Time frame, selected from a repository's Pulse/Insights page. Possible values are: `daily`, `halfweekly`, `weekly`, or `monthly`. Default: `weekly`. If your RSS client supports it, consider aligning the polling frequency of the feed to the period.;repo:Repo name;user:User name—
github/repo_event/:owner/:repo/:types?Repository Event/github/repo_event/DIYgod/RSSHubowner:Username or organization name;repo:Repository name;types:{'default': 'all', 'description': 'Event types to include, comma separated', 'options': [{'label': 'All events', 'value': 'all'}, {'label': 'Create events', 'value': 'create'}, {'label': 'Delete events', 'value': 'delete'}, {'label': 'Fork events', 'value': 'fork'}, {'label': 'Issue create events', 'value': 'issue'}, {'label': 'Issue comment events', 'value': 'issuecomm'}, {'label': 'Member events', 'value': 'member'}, {'label': 'Pull request events', 'value': 'pr'}, {'label': 'Pull request review comment events', 'value': 'prcomm'}, {'label': 'Pull request review events', 'value': 'prrev'}, {'label': 'Public events', 'value': 'public'}, {'label': 'Push events', 'value': 'push'}, {'label': 'Release events', 'value': 'release'}, {'label': 'Watch events (stars)', 'value': 'star'}, {'label': 'Wiki item create or update events', 'value': 'wiki'}, {'label': 'Commit comment events', 'value': 'cmcomm'}, {'label': 'Discussion events', 'value': 'discussion'}]}—
github/repos/:user/:type?/:sort?User Repo/github/repos/DIYgodsort:Sort by `created`, `updated`, `pushed`, `full_name`;type:Type of repository, can be `all`, `owner`, `member`, `public`, `private`, `forks`, `sources`;user:GitHub username—
github/search/:query/:sort?/:order?Search Result/github/search/RSSHub/bestmatch/descorder:Sort order, desc and asc (desc descending by default);query:search keyword;sort:Sort options (default to bestmatch)—
github/starred_repos/:userUser Starred Repositories/github/starred_repos/DIYgoduser:User namegithub-starred-repos
github/stars/:user/:repoRepo Stars/github/stars/DIYgod/RSSHubrepo:GitHub repo name;user:GitHub username—
github/topics/:name/:qs?Topics/github/topics/frameworkname:Topic name, which can be found in the URL of the corresponding [Topics Page](https://github.com/topics/framework);qs:Query string, like `l=php&o=desc&s=stars`. Details listed as follows:—
github/trending/:since/:language/:spoken_language?Trending/github/trending/daily/javascript/enlanguage:{'default': 'any', 'description': "the feed language, available in [Trending page](https://github.com/trending/javascript?since=monthly) 's URL, don't filter option is `any`"};since:{'description': 'time range', 'options': [{'label': 'Today', 'value': 'daily'}, {'label': 'This week', 'value': 'weekly'}, {'label': 'This month', 'value': 'monthly'}]};spoken_language:{'description': "natural language, available in [Trending page](https://github.com/trending/javascript?since=monthly) 's URL"}—
github/user/followers/:userUser Followers/github/user/followers/HenryQWuser:GitHub username—
github/user_event/:username/:types?User Event/github/user_event/mslxltypes:{'default': 'all', 'description': 'Event types to include, comma separated', 'options': [{'label': 'All events', 'value': 'all'}, {'label': 'Create events', 'value': 'create'}, {'label': 'Delete events', 'value': 'delete'}, {'label': 'Fork events', 'value': 'fork'}, {'label': 'Issue create events', 'value': 'issue'}, {'label': 'Issue comment events', 'value': 'issuecomm'}, {'label': 'Member events', 'value': 'member'}, {'label': 'Pull request events', 'value': 'pr'}, {'label': 'Pull request review comment events', 'value': 'prcomm'}, {'label': 'Pull request review events', 'value': 'prrev'}, {'label': 'Public events', 'value': 'public'}, {'label': 'Push events', 'value': 'push'}, {'label': 'Release events', 'value': 'release'}, {'label': 'Watch events (stars)', 'value': 'star'}, {'label': 'Wiki item create or update events', 'value': 'wiki'}, {'label': 'Commit comment events', 'value': 'cmcomm'}, {'label': 'Discussion events', 'value': 'discussion'}]};username:Username—
github/wiki/:user/:repo/:page?Wiki History/github/wiki/flutter/flutter/Roadmappage:Page slug, can be found in URL, empty means Home;repo:Repo name;user:User / Org name—
hackernews/:section?/:type?/:value?Stories/hackernews/threads/comments_list/dangsection:{'description': 'Content section, default to `index`. Common sections: `index`, `newest`, `ask`, `show`, `jobs`, `over`, `threads`, `submitted`. Any valid HN section (e.g. `best`, `front`, `active`) is also accepted'};type:{'description': 'Content format, default to `sources`. `sources` links to original articles, `comments` fetches full comment threads, `comments_list` shows parent story with single comment'};value:{'description': 'For `threads`/`submitted` sections, set user ID. For `over` section, set minimum points threshold (default 100). For other sections, appended as `?id=<value>` (e.g. `value=dang` → `?id=dang`)'}hackernews
huxiu/article资讯/huxiu/article—huxiu-article
huxiu/author/:id/:type?用户/huxiu/member/2313050id:用户 id,可在对应用户页 URL 中找到—
huxiu/channel/:id?资讯/huxiu/article——
huxiu/club/:id源流/huxiu/club/1161id:源流 id,可在对应源流页 URL 中找到—
huxiu/collection/:id文集/huxiu/collection/212id:文集 id,可在对应文集页 URL 中找到—
huxiu/member/:id/:type?用户/huxiu/member/2313050id:用户 id,可在对应用户页 URL 中找到—
huxiu/moment24 小时/huxiu/moment——
huxiu/search/:keyword搜索/huxiu/search/生活keyword:关键字—
huxiu/tag/:id标签/huxiu/tag/291id:标签 id,可在对应标签页 URL 中找到—
ithome/:caty分类资讯/ithome/itcaty:类别—
ithome/ranking/:type热榜/ithome/ranking/24htype:类别ithome-ranking-24h
ithome/tag/:name标签/ithome/tag/win11name:标签名称,可从网址链接中获取—
ithome/tw/feeds/:categoryFeeds/ithome/tw/feeds/newscategory:類別—
ithome/zt/:id?专题/ithome/zt/xijiayicategory:专题 id,默认为 xijiayi,即 [喜加一](https://www.ithome.com/zt/xijiayi),可在对应专题页 URL 中找到—
readhub/:category?分类/readhubcategory:分类,见下表,默认为热门话题readhub
readhub/daily每日早报/readhub/daily——
sspai/activity/:slug作者动态/sspai/activity/urfp0d9islug:作者 slug,可在作者主页URL中找到—
sspai/author/:id作者/sspai/author/796518id:作者 slug 或 id,slug 可在作者主页URL中找到,id 不易查找,仅作兼容—
sspai/bookmarks/:slug用户收藏/sspai/bookmarks/urfp0d9islug:用户 slug,可在个人主页URL中找到—
sspai/column/:id专栏/sspai/column/262id:专栏 id—
sspai/index首页/sspai/index——
sspai/matrixMatrix/sspai/matrix—sspai-matrix
sspai/prime/community会员社区/sspai/prime/community——
sspai/series最新上架付费专栏/sspai/series——
sspai/series/:id付费专栏文章更新/sspai/series/77id:专栏 id—
sspai/shortcutsShortcuts Gallery/sspai/shortcuts——
sspai/tag/:keyword标签订阅/sspai/tag/applekeyword:关键词—
sspai/topic/:id专题内文章更新/sspai/topic/250id:专题 id,可在专题主页URL中找到—
sspai/topics专题/sspai/topics——
v2ex/post/:postid帖子/v2ex/post/584403postid:帖子ID,在 URL 可以找到—
v2ex/tab/:tabid标签/v2ex/tab/hottabid:tab标签ID,在 URL 可以找到—
v2ex/topics/:type最热 / 最新主题/v2ex/topics/latesttype:{'default': 'hot', 'description': '主题类型', 'options': [{'label': '最热主题', 'value': 'hot'}, {'label': '最新主题', 'value': 'latest'}]}v2ex-topics
v2ex/xnaXNA/v2ex/xna——
youtube/c/:username/:embed?Custom URL/youtube/c/YouTubeCreatorsembed:Default to embed the video, set to any value to disable embedding;username:YouTube custom URL—
youtube/channel/:id/:routeParams?Channel with id/youtube/channel/UCDwDMPOZfxVV0x_dz0eQ8KQid:YouTube channel id;routeParams:Extra parameters, see the table belowyoutube-channel
youtube/charts/:category?/:country?/:embed?Music Charts/youtube/chartscategory:Chart, see table below, default to `TopVideos`;country:Country Code, see table below, default to global;embed:Default to embed the video, set to any value to disable embedding—
youtube/community/:handleCommunity Posts/youtube/community/@JFlaMusichandle:YouTube handles or channel id—
youtube/live/:username/:embed?Live/youtube/live/@GawrGuraembed:Default to embed the video, set to any value to disable embedding;username:YouTuber id—
youtube/playlist/:id/:embed?Playlist/youtube/playlist/PLqQ1RwlxOgeLTJ1f3fNMSwhjVgaWKo_9Zembed:Default to embed the video, set to any value to disable embedding;id:YouTube playlist id—
youtube/subscriptions/:embed?Subscriptions/youtube/subscriptionsembed:Default to embed the video, set to any value to disable embedding—
youtube/user/:username/:routeParams?Channel with user handle/youtube/user/@JFlaMusicrouteParams:Extra parameters, see the table below;username:YouTuber handle with @—
zhihu/bookstore/newest知乎书店 - 新书/zhihu/bookstore/newest——
zhihu/collection/:id/:getAll?收藏夹/zhihu/collection/26444956getAll:获取全部收藏内容,任意值为打开;id:收藏夹 id,可在收藏夹页面 URL 中找到—
zhihu/daily知乎日报/zhihu/daily—zhihu-daily
zhihu/daily/section/:sectionId知乎日报 - 合集/zhihu/daily/section/2sectionId:合集 id,可在 https://news-at.zhihu.com/api/7/sections 找到—
zhihu/hot/:category?知乎热榜/zhihu/hot——
zhihu/people/activities/:id用户动态/zhihu/people/activities/diygodid:作者 id,可在用户主页 URL 中找到zhihu-people-activities
zhihu/people/allCollections/:id用户全部收藏内容/zhihu/people/allCollections/87-44-49-67id:作者 id,可在用户主页 URL 中找到—
zhihu/people/answers/:id用户回答/zhihu/people/answers/diygodid:作者 id,可在用户主页 URL 中找到—
zhihu/people/pins/:id用户想法/zhihu/people/pins/kan-dan-45id:作者 id,可在用户主页 URL 中找到—
zhihu/pin/daily知乎想法 - 24 小时新闻汇总/zhihu/pin/daily——
zhihu/pin/hotlist知乎想法热榜/zhihu/pin/hotlist——
zhihu/posts/:usertype/:id用户文章/zhihu/posts/people/frederchenid:用户类型usertype,参考用户主页的URL。目前有两种,见下表;usertype:作者 id,可在用户主页 URL 中找到—
zhihu/question/:questionId/:sortBy?问题/zhihu/question/59895982questionId:问题 id;sortBy:排序方式:`default`, `created`, `updated`。默认为 `default`—
zhihu/timeline用户关注时间线/zhihu/timeline——
zhihu/topic/:topicId/:isTop?话题/zhihu/topic/19828946isTop:仅精华,默认为否,其他值为是;topicId:话题 id—
zhihu/weekly知乎书店 - 知乎周刊/zhihu/weekly——
zhihu/xhu/collection/:idxhu - 收藏夹/zhihu/xhu/collection/26444956id:收藏夹 id, 可在收藏夹页面 URL 中找到—
zhihu/xhu/people/activities/:hexIdxhu - 用户动态/zhihu/xhu/people/activities/246e6cf44e94cefbf4b959cb5042bc91hexId:用户的 16 进制 id,获取方式见下方说明—
zhihu/xhu/people/answers/:hexIdxhu - 用户回答/zhihu/xhu/people/answers/246e6cf44e94cefbf4b959cb5042bc91hexId:用户的 16 进制 id,获取方式同 [xhu - 用户动态](#zhi-hu-xhu-yong-hu-dong-tai)—
zhihu/xhu/people/posts/:hexIdxhu - 用户文章/zhihu/xhu/people/posts/246e6cf44e94cefbf4b959cb5042bc91hexId:用户的 16 进制 id,获取方式同 [xhu - 用户动态](#zhi-hu-xhu-yong-hu-dong-tai)—
zhihu/xhu/question/:questionId/:sortBy?xhu - 问题/zhihu/xhu/question/264051433questionId:问题 id;sortBy:排序方式:`default`, `created`, `updated`。默认为 `default`—
zhihu/xhu/topic/:topicIdxhu - 话题/zhihu/xhu/topic/19566035topicId:话题ID—
zhihu/xhu/zhuanlan/:idxhu- 专栏/zhihu/xhu/zhuanlan/githubdailyid:专栏 id, 可在专栏主页 URL 中找到—
zhihu/zhuanlan/:id专栏/zhihu/zhuanlan/googledevelopersid:专栏 id,可在专栏主页 URL 中找到—

状态分布

状态行数
完整接入29
部分接入8
后端有但 UI 缺失0
未接入7
不适用6
未验证0
合计50