跳转到内容

使用指南 ​

English · 简体中文

工作台与仪表盘 ​

侧栏提供“仪表盘”“全部订阅”“需要检查”“聚合订阅”“设置”,管理员另有“用户管理”。打开网站首页进入仪表盘;已有的 #/ 链接仍打开全部订阅。

  • 仪表盘:显示当前订阅数、自动更新数、当前保留内容和需要检查的数量;两张紧凑图表分别显示每日新增采集与翻译完成条数、每日订阅总数,可选 7、30、90 天,按 UTC 日期汇总。没有活动的日期显示为零,开始记录前的日期不补造数据。
  • 累计数量:新采集入库的条目和成功完成的翻译单独累计保存。超过保留上限清理内容、删除订阅或清理日志不会减少累计值;仍已保存的同一条目重复抓取不重复计数,重新翻译成功会再计一次。已清理的条目若重新采集入库,也算一次新采集。
  • 开始记录的时间:旧版没有完整的长期统计,因此从升级启用统计时起记录,界面显示起始日期。备份包含累计值和近 90 天趋势,恢复会回到备份时的统计,不把恢复的内容再累计;不含统计的旧备份从恢复时重新开始记录。删除用户会删除该用户的统计。
  • 全部订阅:保留原来的列表、卡片、搜索、筛选、排序和批量操作。统计与聚合移到各自页面。
  • 需要检查:只列出连续抓取失败达到个人阈值(默认 3 次)或核心规则可能失效的订阅。可在“设置 → 通知 → 告警策略”修改次数,成功抓取一次后清零。仅日期、图片或描述等可选字段缺失的轻提示不计入,侧栏、仪表盘和用户管理使用相同口径。
  • 聚合订阅:集中创建和管理聚合地址。设置继续使用左侧栏目、右侧详细信息的布局。

界面语言 ​

界面支持 English 和简体中文。

  • 选择语言:在顶栏的语言菜单,或“设置 → 账号与密码 → 界面语言”中选择。选择保存在账号中,登录的所有设备都会使用。
  • 跟随浏览器:在“设置 → 账号与密码”中选择“跟随浏览器”会清除已保存的选择,界面改按浏览器的偏好语言显示;浏览器语言都不支持时使用服务器的默认语言(未设置 DEFAULT_LOCALE 时为英文,见配置参考)。
  • 登录前:登录页和初始化页按浏览器语言显示,并提供语言菜单;在这里的选择保存在当前设备。
  • 从旧版本升级:升级前已有的账号保持简体中文,可随时切换。
  • 随语言变化的内容:界面、日期和数字格式、服务端返回的错误提示,以及你不在线时写入的文案——抓取日志、批量结果、翻译进度和通知(Bark、Webhook、ntfy、Telegram)按订阅所有者的语言书写。已经写入的记录保持写入时的语言。
  • 不受影响的内容:订阅输出本身。翻译订阅仍按目标语言输出,其他订阅照常输出来源内容。在浏览器中直接打开订阅地址看到的预览页按访问者浏览器的语言显示。

用户与登录 ​

“用户管理”列出每个账号的订阅数(含需要检查和暂停数量)、凭据数、最近活跃时间和创建时间,顶部汇总账号、停用、订阅和需要检查的订阅数;编辑、停用 / 启用和删除位于每行的“⋯”菜单。管理员在侧栏“用户管理”点击右上角“创建用户”,在弹窗中设置用户名及至少 8 字符的初始密码,再将账号信息私下交给对方。所有账号使用同一登录页,不开放自行注册。创建后可编辑用户名、重置密码或切换角色;所有管理员同权,可以管理其他管理员。禁止停用或删除自己,自行降级时必须仍有另一名启用的管理员。改名、改密及角色变化会撤销目标账号的全部登录会话,改名不改变 RSS 地址。

每个账号只看到自己的订阅、Cookie 凭据、批量任务及编辑会话;管理员的日常工作台也遵守这一规则。普通用户可以创建和管理自己的网页订阅与 RSS 翻译,使用管理员统一配置的抓取、翻译服务。普通用户的列表/卡片偏好按账号保存在当前浏览器。

所有用户可在“设置”修改自己的密码,修改后仅此账号的全部登录会话和访问令牌失效。普通用户忘记密码时联系管理员,在“用户管理”重置密码;管理员忘记密码可在服务主机运行 pnpm admin:reset。

“停用”会立即撤销该用户登录,关闭其网页编辑会话,取消可取消的抓取和翻译操作,阻止新后台任务及 RSS 访问。旧任务返回的结果不再保存;既有数据保留。重新启用后需要重新登录,原 RSS 地址恢复可用,原本启用的订阅和待处理任务继续执行,手动暂停的订阅保持暂停。

每个用户都可在“设置 → 通知”管理自己的通知渠道(Bark、Webhook、ntfy、Telegram,可同时启用多个)、失败阈值与重试参数,并分别发送测试通知。故障只通知订阅所有者,未启用任何渠道时不发送,也不会回退至管理员的渠道。系统配置和整站备份恢复仅管理员可用。整站备份包含全部用户的数据,管理员应妥善保管。

管理员可以通过侧栏顶部的工作台切换器(显示“我的工作台”或“正在管理”)直接切换到任意账号,也可以在用户列表点击“管理工作台”,进入该账号的订阅、Cookie、批量任务和个人通知。管理他人时侧栏和顶栏改用琥珀色提示,页面顶部持续显示“正在管理:用户名”,点击“返回我的工作台”或在切换器中选择“我的工作台”退出。地址栏会带上目标账号(#/u/用户ID/…),刷新或前进 / 后退都会停留在同一工作台。操作使用真实管理员身份,不模拟目标账号登录。停用用户可查看和修改静态配置,新建、抓取、翻译、浏览器操作及通知测试须先启用。Cookie 值不回显,可使用已有凭据或替换,订阅只能绑定同一所有者的凭据。

“删除用户”先展示订阅、凭据和任务数量,再要求输入目标用户名确认。确认后账号、订阅、历史、凭据、任务、个人设置与通知记录永久删除,旧 RSS 地址失效,无法撤销。

访问令牌 ​

想用脚本或 AI Agent 管理订阅时,在“设置 → 访问令牌”创建个人访问令牌:填写名称(方便以后辨认),选择权限和有效期。

  • 只读(read):只能查看订阅、条目、日志等,不能做任何修改。
  • 读写(write):还可以创建、修改、刷新、删除订阅和凭据等。
  • 有效期可选 30 天、90 天、1 年或永不过期。

完整令牌以 fl_ 开头,只在创建后显示一次,请立即复制保存;之后列表只显示开头几个字符、权限、有效期和最近使用时间。不再使用或怀疑泄露时点击“吊销”,使用它的脚本会立即失去访问权限。

令牌代表你本人:只能访问你自己的工作台,权限与你在网页上的权限相同;但不能导出或恢复备份、管理账号,也不能创建或吊销令牌,这些操作只能在网页上完成。修改密码、账号被停用或删除时,全部令牌立即失效。调用示例见开发与接口;也可以用 feedlantern 命令行或 MCP server 操作,见 Agent CLI 与 MCP。

调用记录 ​

每个令牌旁显示最近 24 小时的调用次数和失败次数。点击“调用记录”展开该令牌的调用明细:时间、方法、接口(例如 /api/feeds/:id)、状态码、耗时和来源 IP。可按“成功 / 被拒绝 / 出错”筛选,失败的请求标红,每页 20 条,点击“加载更多”查看更早的记录。

  • 记录什么:每次带 Authorization: Bearer 令牌的 /api/* 请求都会记录,包括写操作,以及被拒绝的请求(401 令牌已过期、403 权限不足或接口仅限网页登录、429 限流)。已过期令牌的 401 记在该令牌名下;无法识别的令牌(例如写错或已吊销)不记录。
  • 不记录什么:不记录令牌本身和请求的查询参数,接口只记路由模板(例如 /api/feeds/:id),不记原始路径。网页登录(Cookie 会话)后的操作不记录,调用记录只反映脚本和 Agent 用令牌发起的请求。
  • 来源 IP 遵循 TRUSTED_PROXIES:只有来自可信代理的请求才采用 X-Forwarded-For 中的地址。
  • 保留多久:与抓取日志共用“日志保留天数”(默认 30 天),并且每个令牌最多保留 2000 条、全站最多 20000 条,超出时删除最早的记录。吊销令牌会同时删除它的调用记录。

管理员进入某个用户的工作台后,可以在“设置 → 访问令牌”只读查看该用户的令牌和调用记录,但不能替他创建或吊销令牌。

创建订阅 ​

登录后点击“新建订阅”,输入网址及可选 Cookie,点击“打开并自动识别”。按钮右侧的箭头还提供“RSS 翻译”和“批量添加”两种方式。软件寻找重复列表并匹配标题、链接及可选字段。明确结果直接预览,有多个合理列表时选择候选;缺少可选字段不阻止保存。

在“调整匹配”中可点选网页内容、切换条目容器、清除错误字段或编辑 CSS 选择器。修改后重新预览,匹配有效才可保存。手动字段会在重新识别时保留,除非明确选择替换。

网页加载后会逐屏滚动,触发滚动入场动画和视口内的延迟加载,再恢复原位置。编辑预览、批量识别和后台刷新使用相同流程;滚动最多 20 步或 8 秒,到底部稳定后提前结束。默认只处理源网址这一页;需要往后翻时见下面的“多页采集”。不能保证完整采集无限滚动或虚拟列表。

多页采集 ​

编辑匹配规则时,网页画面下方有“多页采集”面板,默认“不翻页,只抓源网址这一页”。可以选择一种翻页方式:

  • 点击“下一页”链接或按钮:点击“在网页上点选”,再在网页画面中点击“下一页”;也可以直接填写 CSS 选择器。网页带有 rel="next" 的链接时会优先使用它。链接按地址打开,没有地址的按钮会被点击,等待列表变化后再抽取。
  • URL 模板:填写如 https://example.com/list?page={n} 的模板、起始页码和步长。第 1 页始终是源网址,第 2 页起依次把 {n} 换成起始页码、起始页码 + 步长……;按偏移量翻页的网站可填写 offset={n}、起始 20、步长 20。
  • 点击“加载更多”按钮:在同一页点击按钮,新出现的条目算作下一“页”。只点击按钮,不持续滚动。

“最多页数”包含第 1 页,默认 3,最多 10。“每页间隔”默认 3 秒,可设 2–30 秒,每次另加最多 20% 的随机抖动,以降低被网站风控的风险。以下情况会提前停止:一页的条目都已在订阅里出现过(日常刷新通常只看第 1 页就停止)、找不到或已禁用“下一页”、新页没有条目或与前面的页相同、URL 模板的页面返回 404 或 410。同一链接只保留一次,第 1 页的条目排在最前,单次抓取最多收集 1000 条;本次采到的条目都会保存,之后按订阅的“保留条数”(自动为 200 条)清理已从网页上消失的旧条目。

点击“试抓多页”会按与后台刷新相同的逻辑逐页打开(在编辑会话的另一个标签中进行,当前网页画面不变),显示每页抓到几条,以及在哪一页、因为什么原因停止,预览列表换成合并后的结果。翻页设置随订阅保存,在批量添加中“打开并调整匹配”时同样可以设置。

每一页都使用订阅的 Cookie 凭据和同一个浏览器会话,并经过与第 1 页相同的网络安全检查:“下一页”链接或模板指向内网、本机或其他私有地址时会被拦截。第 2 页及以后失败时保留已抓到的条目,订阅仍算更新成功,抓取日志写明“第 k 页失败”;只有第 1 页失败才算整体失败。单次多页抓取最长约 3 分钟,到时停在已抓到的页;后台并发与同站串行的限制不变。

日期点选 ​

日期和来源、分类混在一行时,选择“日期”后点击时间所在区域即可。框选仍表示整个容器,提示和预览显示提取出的时间;无需为“3 分钟前”寻找独立标签。也可以在高级匹配规则中填写日期容器的 CSS 选择器。

优先采用有效的 datetime;其次解析直属文本,再检查完整文本。支持“刚刚”“3分前”等秒、分钟、小时、天、周前及英文对应表达。相对时间按本次页面加载时刻估算,预览显示“估算”,保存后同一链接的估算时间不随刷新漂移;之后取得准确时间可纠正估算。多个无法区分的日期、“昨天”、月/年前等含糊表达不猜测,解析失败不会抹去历史日期。

霂明导航的 /intel 页面按文章链接读取内嵌数据中的准确时间戳;未匹配时使用页面提供的时间基准估算。清空日期规则会停止提取新日期,已经保存的历史日期保留。

订阅设置 ​

点击列表或卡片中的“订阅设置”,或点击订阅名称后切换到“订阅设置”标签。订阅地址、刷新状态和“立即刷新”固定在面板上方(翻译订阅还在这里显示翻译完成、等待和失败数量,以及“重试未完成翻译”),下方依次是“订阅内容”“运行日志”“订阅设置”三个标签;设置有未保存的修改时,关闭面板或切换标签会先提示。名称和刷新间隔直接显示,点击“保存设置”即可生效,无需打开或预览目标网页。修改名称同时更新订阅列表名称和 RSS 频道标题;仅改名称时,地址、历史和调度不变。编辑匹配中的名称也使用同一设置。升级时若旧版本两个名称不同,会保留阅读器名称并同步到列表。阅读器已保存的名称或用户自定义名称可能不会自动更新。

刷新间隔支持 5–1440 分钟的整数。间隔变化后从保存生效时重新计时,不会立即抓取;已暂停订阅继续暂停,恢复时会立即刷新。关闭设置或进入“编辑匹配规则”前,如果有未保存修改,会提醒确认丢弃。暂停或轮换密钥不会清空正在填写的设置。

输出内容:条目过滤、输出条数与保留条数 ​

“订阅设置 → 输出内容”控制订阅地址里发布哪些条目,RSS、Atom 和 JSON Feed 三种地址共用同一设置。过滤只影响输出,已存储的条目不会被删除,修改后立即生效,改回或清空规则即可恢复。

  • 包含关键词:每行一个。填写后,只输出标题或摘要包含其中任意一个的条目。
  • 排除关键词:每行一个。标题或摘要包含任意一个就不输出,优先于包含关键词。
  • 匹配不区分大小写,看的是输出中的标题和摘要(RSS 来源和翻译订阅按去掉 HTML 标签后的正文)。翻译订阅匹配翻译后的内容,双语模式同时包含原文;翻译未完成的条目本来就不输出。
  • 按正则表达式匹配:勾选后每条按正则处理,对标题和摘要分别匹配,所以 ^\[广告\] 表示标题以“[广告]”开头。为避免拖慢输出,每条不超过 200 个字符、每类最多 30 条,不支持嵌套重复(如 (a+)+、(a|b)+)和反向引用;单个订阅的正则运行超过 100 毫秒会被中断,本次输出暂不过滤,并在设置页提示。保存时会先在已有条目上试运行。

填写时,下方实时显示“已存储 N 条,输出 X 条,过滤 Y 条”;保存后,“订阅内容”中被过滤的条目淡化显示,并标注“命中排除关键词”或“未命中包含关键词”,超出输出条数的条目标注“超出输出条数”。

输出条数支持 10–500,默认 100,过滤之后再计算条数。调小输出条数不会立即删除数据,下次抓取时再按保留条数清理;调大后由之后抓到的新条目逐步补足。

保留条数是数据库里为该订阅最多保存的历史条目数,留空为“自动”:网页订阅保留 max(200, 输出条数) 条,RSS 订阅保留 max(100, 输出条数) 条,与之前的行为相同。也可以填写 10–1000 之间的整数,但不能少于输出条数(保存时会提示)。和输出条数一样,调小后不立即删除,下次抓取时清理最早发现的条目;调大后历史会逐步积累。

保留条数的几条保护规则,避免“已经推送过的条目被当成新条目再推一次”:

  • 网页订阅判断新条目靠数据库里已存的链接。因此每次抓取时,本次在网页上(包括翻页采到的各页)仍能看到的条目都会保留,即使超过保留条数;只有已经从网页上消失的旧条目才会被清理。开启翻页时,日常刷新遇到“整页都已见过”才停止,保留条数过小会让较深的页被重新当作新内容,建议至少保留两页的条目数。
  • RSS 订阅另外记录了上次来源中出现过的条目,已清理但仍在来源里的条目不会重新入库。
  • 翻译订阅只输出翻译完成的条目;被清理的条目连同其待翻译任务一起删除,不会再消耗翻译额度。保留条数不少于输出条数,所以翻译完成后输出条数仍能补足。
  • 规则失效预警只看每次抓取的原始结果,不依赖已保存的历史,不受保留条数影响。

日常管理 ​

默认使用列表,可切换卡片并记住偏好。两种视图支持直接复制 RSS、打开订阅设置与选择。点击名称查看内容、来源和刷新状态;从订阅设置进入“编辑匹配规则”,编辑完成或返回后回到设置。这些操作位于“全部订阅”,状态统计位于“仪表盘”。全选复选框位于列表表头,搜索后只作用于当前结果,“状态 → 需要检查”显示抓取失败或规则可能失效的订阅,也可只看“抓取失败”或“规则可能失效”,可与搜索、来源和输出筛选组合使用,方便逐项查看。改变搜索、来源、输出或状态筛选会清空选择。

多选后,列表上方会出现批量操作栏,点击“批量修改设置”,可统一设置翻译输出模式(双语、仅译文、原文)、目标语言、翻译服务、刷新间隔(5–1440 分钟)、输出条数(10–500)和保留条数(保持原值、改为自动,或指定 10–1000 条)。模式默认“保持原值”,间隔和条数留空则不修改,可以只改一项;保留条数少于某个订阅的输出条数时,该订阅修改失败并列出原因,其余订阅照常保存;条目过滤只能逐个订阅设置(接口支持批量传入 itemFilter);网页和 RSS 订阅均支持。保存沿用单个订阅的设置逻辑,不重新抓取来源,暂停状态保持不变。

批量复制每行一个 RSS 地址;“导出 OPML”(列表表头导出当前结果和全部聚合订阅,聚合订阅放在“聚合订阅”文件夹中;批量操作栏只导出所选订阅)生成标准 OPML 文件,可一次导入 NetNewsWire、Reeder、Inoreader、Feedly 等阅读器。支持暂停、恢复、刷新和删除。失败逐项显示,成功项目不回滚,失败项保留选择。选择较多订阅时,界面自动分批请求;立即刷新使用少量并行的单订阅请求,避免整批共用一个长请求;实际抓取并发由服务端配置控制,同一来源 hostname 仍串行。删除会同时删除该订阅历史;密钥轮换会立即撤销旧 RSS、Atom 和 JSON Feed 地址。

聚合订阅 ​

聚合订阅把自己名下的多个订阅(网页订阅和 RSS 翻译订阅都可以)合并成一个订阅地址,适合把同一主题的来源合在一起,阅读器里只需添加一次。

  • 创建:在“聚合订阅”页点“新建聚合”,或点“新建订阅”右侧的下拉箭头,选择“聚合订阅”,填写名称、勾选成员;也可以在订阅列表里多选后,点批量操作栏的“加入聚合”,加入已有聚合或用所选订阅新建一个。已在其中的订阅不会重复添加。
  • 搜索后全选:新建或编辑聚合时,按名称或网址搜索,再点“全选搜索结果”,一次加入所有匹配订阅。例如搜索 Twitter 后可全选匹配来源;已有的其他选择保留。“取消选择搜索结果”只取消当前匹配项,清空搜索即可查看全部成员。
  • 管理:进入侧栏“聚合订阅”,每个聚合可以复制地址、在新标签页打开、编辑名称和成员;“⋯”菜单里可以轮换密钥或删除聚合(成员订阅不受影响)。
  • 内容:按时间把所有成员已收集的内容合并成一条时间线,时间优先使用发布时间,没有发布时间时使用首次发现的时间;每条用 <category> 注明来自哪个订阅;同一链接只出现一次(保留最先收集到的那份,之后其他成员再收集到也不会替换它,阅读器不会重复显示)。总条数默认最多 100 条,可在编辑聚合时改为 10–500 条。每个成员贡献的条目与它自己的订阅地址完全一致:翻译订阅只输出已翻译完成的条目,成员自己的条目过滤和输出条数同样生效(先按成员规则选出条目,再合并、去重、截断到聚合的条数上限)。
  • 只读:聚合只读取成员已经保存的条目,打开或刷新聚合地址不会触发抓取。成员被删除时自动移出聚合;成员暂停后,已有条目仍然输出。所有者账号被停用后,聚合地址和单个订阅地址一样不可用。

聚合地址形如 /bundles/聚合ID/密钥.xml,带独立密钥;把 .xml 换成 .atom 或 .json 即可得到同一内容的 Atom 1.0 或 JSON Feed 1.1(来源分别写成 Atom 的 category 和 JSON Feed 的 tags)。轮换密钥后三种地址同时失效。所有成员翻译成同一目标语言时,聚合声明该语言(RSS 的 <language> 等);成员语言不一致或含原文订阅时不声明语言。在浏览器中直接打开时同样显示可读预览页,每条内容下标注来源订阅。

来源为什么用 <category> 而不是 <source>:RSS 2.0 的 <source> 必须带上来源订阅的 RSS 地址,而成员的地址包含它自己的密钥,写进去就会通过聚合地址泄露;改写成网页地址又不符合规范。<category> 不需要地址,多数阅读器把它显示为标签,也可以按标签筛选。

订阅地址、格式与浏览器预览 ​

同一订阅提供三种格式,内容、过滤规则和输出条数完全相同,按阅读器支持的格式选择:

格式地址Content-Type
RSS 2.0/feeds/订阅ID/密钥.xmlapplication/rss+xml
Atom 1.0/feeds/订阅ID/密钥.atomapplication/atom+xml
JSON Feed 1.1/feeds/订阅ID/密钥.jsonapplication/feed+json

订阅面板的“订阅地址”上方可在 RSS 2.0、Atom 1.0、JSON Feed 1.1 之间切换,复制按钮随之变为“复制 Atom 地址”等,选择按浏览器保存。列表中的“复制 RSS”、批量复制和 OPML 导出仍使用 RSS 地址。三种地址使用同一个密钥,轮换后同时失效。

RSS 地址形如 /feeds/订阅ID/密钥.xml。阅读器、命令行工具和脚本读取它时始终得到标准 RSS 2.0(包含 ttl 刷新间隔、generator,有图片的条目附带 media:thumbnail 缩略图)。直接在浏览器地址栏打开同一地址时,会显示一个可读页面:订阅名称、来源、复制按钮和最近 30 条内容,页面底部提供“查看原始 XML”(地址后加 ?format=xml)。

Atom 和 JSON Feed 地址没有预览页;在浏览器中直接打开时分别以 application/xml、application/json 返回原文,方便查看而不是下载。

只有浏览器顶层打开 RSS 地址时才会显示预览:判断依据是浏览器自动附带的 Sec-Fetch-Dest: document、Sec-Fetch-Mode: navigate 和 Accept: text/html。阅读器、浏览器插件的后台请求和页面脚本都不会发送这组请求头,因此不会被误判成网页。预览页同样需要密钥,和 RSS 内容一样请勿公开分享;响应带 X-Robots-Tag: noindex,避免被搜索引擎收录。

界面与主题 ​

顶栏右上角的按钮在“跟随系统”“亮色”“暗色”之间切换,选择按浏览器保存。地址栏会记住当前页面、设置分组和打开的订阅面板(例如 #/settings/translation、#/feed/订阅ID/logs),刷新后保持原位,浏览器的前进 / 后退也可使用。在订阅页按 / 可直接搜索,按 Esc 清空搜索。列表可按添加顺序、名称、最近更新或“需要检查优先”排序;点击状态栏的“需要检查”或订阅下方的错误原因,可分别筛选出错订阅或直接打开该订阅的运行日志。手机上主导航移到屏幕底部,订阅面板从底部弹出。设置按分组分页显示:左侧(手机上为顶部横向标签)点选日志与显示、翻译服务、服务器与网络(这三组仅管理员可见)、通知、Cookie 凭据、网络配置、账号与密码、访问令牌、备份与迁移或关于,右侧只显示该组。每组的保存按钮只保存本组;有未保存的修改时,按钮旁显示“未保存”,切换分组、离开设置页或关闭页面前会先提示。

批量添加 ​

点击“新建订阅”右侧的箭头,选择“批量添加”。每行一个网址,最多 100 个;先修正无效行,重复行会跳过。可统一刷新间隔和网络配置,并逐行选择 Cookie。

明确结果自动创建;歧义结果显示候选样例,点击“打开并调整匹配”后重新加载验证并保存。失败可重试,已存在网址复用原订阅。任务在后台执行,关闭页面不会停止,重启后恢复。取消只影响未开始的项。结果页可以复制整批订阅地址。

在“设置 → Cookie 凭据”中粘贴 Cookie 字符串或 OpenCookie 兼容 JSON,可以上传 JSON 文件。凭据可以命名、替换并供多个订阅引用;只有域名兼容时才会携带。过期或失效需从已登录浏览器重新导入。服务不提供交互登录或验证码处理。

网络配置(代理与请求头) ​

有些网站要求特定的出口 IP、User-Agent 或 Referer 才能访问。在“设置 → 网络配置”中添加一组配置,可以包含:

  • 代理:http://、https:// 或 socks5:// 加主机和端口,例如 socks5://proxy.example.com:1080;需要认证时填写用户名和密码。
  • User-Agent:网页订阅同时改变网页里看到的 navigator.userAgent。
  • Referer:打开订阅页面时发送的来源地址。
  • 额外请求头:最多 20 个,名称最长 64 个字符,值最长 2048 个字符。只发送给订阅网址所在的网站及其子域名(忽略开头的 www.),不会发给图片、脚本等第三方资源;HTTPS 订阅不会把它们发到 HTTP 地址。Host、Cookie、Cookie2、Proxy-、Connection、Keep-Alive、Transfer-Encoding、TE、Trailer、Upgrade、Content-Length、Content-Encoding、Expect、Accept-Encoding、Sec- 不能设置;User-Agent 和 Referer 使用上面的专用字段;Cookie 请使用 Cookie 凭据。

网页订阅在“新建订阅 → 加载与网络设置”中选择,RSS 翻译在编辑页选择,批量添加时为整批选择,已有订阅可在“订阅设置”中更换或改回默认网络。编辑器预览、批量识别、规则失效后的“重新识别”和后台刷新使用同一份配置,开启多页采集时每一页都经过同一个代理并带上相同的请求头;修改配置后,下一次抓取生效。

代理密码和请求头的值加密保存,保存后不再显示;编辑时留空即保持原值。更改代理地址时需要重新填写用户名和密码。卡片上的“测试连接”会用这组配置请求一次网址,检查代理是否可达、认证是否正确。测试网址会自动填好,可以修改:优先使用这组配置的第一个订阅(最早创建的那个)的来源地址;没有订阅使用时,用你在这个浏览器里上次测试过的网址(按配置分别记住);都没有时填 https://cp.cloudflare.com/generate_204。这是专门用来检查连通性的地址:Cloudflare 全球 anycast 网络,在中国大陆一般也能直连(Google 的 gstatic 地址在大陆直连不通);返回空的 HTTP 204,不跳转,响应很快;Clash、Surge、sing-box 等代理软件多年来都用它作默认测试地址。目标网站返回任意 2xx 状态(包括 204)就算测试成功;返回其他状态码时会显示实际状态码,说明已经连上但网站没有正常响应。测试不跟随重定向,返回 3xx 时请改用跳转后的网址。

代理同样受内网拦截:不能指向本机、局域网或云元数据地址。代理装在本机或局域网时,需要管理员把它的 host:port(例如 192.168.1.10:1080)加入“设置 → 服务器与网络”中的允许访问的主机。目标网站仍由 FeedLantern 解析并校验,代理收到的是已校验的 IP 地址;因此依赖代理端 DNS 的场景(例如只有代理能解析的域名)不受支持,本机 DNS 被污染时可开启加密 DNS。开启加密 DNS(DNS over HTTPS)后,配置了代理的订阅连加密 DNS 查询也经同一个代理发出:本机直连不到 cloudflare-dns.com、只有代理能出网时(例如关闭了 Surge、Clash 的增强模式),代理订阅照样能解析。查到的地址仍在本机做内网和保留地址检查,再交给代理连接;网页订阅的每一页、RSS 订阅和“测试连接”都是如此。经代理查询的结果与直连查询分开缓存,不会混用。查询失败时提示会写明“经代理 … 的加密 DNS 查询失败”。

正被订阅使用的网络配置不能删除,先在订阅中改用其他配置。

兼容范围 ​

支持普通 DOM 列表、动态渲染和 Cookie 页面。支持按“下一页”链接或按钮、URL 页码模板和“加载更多”按钮采集最多 10 页(见多页采集)。暂不支持全文、无限滚动的完整采集、iframe 内部点选、封闭 Shadow DOM 和 Canvas 内容。规则失效时保留历史,修复前不会静默替换规则。

“调整匹配”会把网页截成长图,在本地用滚轮或触控板滚动,不再等待服务器。截图按每段 8000 像素分段:滚动到接近底部时自动加载下一段;自动识别的列表在下面时,会先加载到那里再滚动过去。最多显示 48000 像素,更长的网页会在底部注明。鼠标悬停时会立即框出将要选中的元素并显示其标签;按 ↑ / ↓ 扩大或缩小范围,点击即选中,并在同一次请求中刷新订阅预览。选中后也可以用“扩大 / 缩小”按钮调整。

需要先进入另一个列表页时,按住 ⌘(Windows / Linux 为 Ctrl)点击网页中的链接。画面跳转后,选择“以此页为源网址”会把该页填入源网址并重新识别;“返回源网址”回到原页面。跳转期间不能点选或保存,避免规则与源网址不一致。只有当网页里有独立的内部滚动区域时,才会出现上下按钮,用于滚动远端网页的内部区域。退出编辑或离开页面会释放远端编辑会话。

日期自动识别优先选取包含直属时间文本的元信息区域,避免选中整个条目父容器。手动点选时仅高亮可解析的时间文本;保存的仍是容器选择器,支持“分类 · 来源 · 27 分钟前”这类混合内容。

订阅内容 ​

“订阅内容”标签按阅读器的样式列出已保存的条目:来源域名和发布时间、标题、默认折叠为三行的摘要,有图片时在右侧显示缩略图。点击“展开全文”在原位阅读完整内容,再点“收起”折叠。标题链接在新标签页打开原文;正文在隔离的框架中显示,不能运行脚本,其中的链接只会在新标签页打开,不会跳转管理页面。

翻译订阅的条目只用小标记表示状态:“翻译中”表示还在排队或翻译,“翻译失败”下方会写明原因。双语模式下标题显示译文,原文标题以较浅的字体显示在下一行;展开全文后每段译文下方以较浅的字体附上原文。被过滤或超出输出条数的条目会变淡并标明原因。

运行日志 ​

点击订阅名称打开订阅面板,切换到“运行日志”标签。翻译订阅在这里分为“抓取记录”和“翻译记录”两段,用顶部的切换按钮查看;其他订阅只有抓取记录。

抓取记录 ​

每条记录展示执行时间、来源、状态、耗时、有效条目数、新增条目数及失败原因。开启多页采集的订阅还会显示“翻页:共 3 页(12 + 10 + 0 条);第 3 页失败:……”这样的说明,标明抓了几页、每页新增几条和停止原因。可按状态筛选,每页 20 条,通过“加载更多”查看历史;最新页每 5 秒自动更新,查看历史或离开标签后暂停更新。

日志默认保留最近 30 天,可在设置页调整,定时、手动(包括批量刷新)、创建、修改规则、恢复订阅和批量创建均会记录实际发生的抓取。并发请求合并成一次抓取时只记录一次,来源取最先发起该任务的入口。没有新文章仍算成功,无法提取有效条目算失败;失败保留已有文章。服务异常重启留下的执行记录显示“中断”,耗时未知。

连接超时会写明哪个网站、等了多久,例如“连接 rss.example.com 超时(20 秒未响应)”(RSS 来源 20 秒,网页 30 秒);只写主机名,网址中的路径和查询参数不会出现在日志、订阅列表和告警里。没有配置网络代理时,提示会附上最常见的原因:本机开启了代理软件的增强模式或 Fake-IP,而 FeedLantern 不读取系统代理,请开启 TUN/增强模式并打开 DNS-over-HTTPS,或在“设置 → 网络配置”中为该订阅配置代理;已配置代理时则提示检查代理是否可用。手动取消、停用账号或服务停止导致的中止记为“中断”,不会当作超时或失败告警。

在“设置 → 通知”启用至少一个渠道(Bark、Webhook、ntfy 或 Telegram)后,连续失败达到个人阈值时会发到所有已启用的渠道,详情逐个渠道显示“待发送/待重试/已发送/发送失败/已取消”,例如“通知:Bark 已发送 · Webhook 发送失败(…)”;没有启用任何渠道显示“通知:未启用”。同一连续故障只告警一次,多条失败日志关联同一告警状态。恢复成功后重置,下次失败可再次告警,默认不推送恢复消息。配置步骤见配置参考。

规则失效预警 ​

网站改版后,旧规则常常还能抽到几条内容,抓取不会失败,但条目数从 20 降到 3、标题全变成“阅读全文”或链接都指向同一个地址。为了发现这种情况,网页订阅每次抓取成功后会记录本次的条目数和各字段的有效率,与该订阅最近的正常抓取比较:

检查异常条件与提示
条目数基线中位数至少 5 条,本次少于基线的 30%(例如从 20 条降到 5 条及以下)
标题基线中至少 80% 的条目有不重复的标题,本次降到 30% 及以下(例如全部变成同一个文字)
日期、图片、摘要基线中至少 80% 的条目有该字段,本次降到 30% 及以下;规则没有配置的字段不检查。只有这些字段缺失时,显示“部分字段缺失”轻提示
链接基线中至少 80% 的链接不重复,本次全部相同,或不重复的链接少于 50%

基线是最近 10 次正常抓取(同一网址、同一套规则)的中位数,至少积累 5 次才开始判断,所以新订阅和刚修改过规则的订阅在前 5 次抓取不会预警。标题、链接、日期等比例只在本次至少 3 条内容时检查。没有标题或链接的条目本来就不会保存,它们的减少体现为条目数下降。RSS 来源订阅不做这项检查。

出现预警时,抓取仍记为成功,条目照常保存,RSS 输出不受影响。订阅在列表中显示“规则可能失效”,并计入状态栏的“需要检查”;订阅面板顶部列出原因,对应的抓取日志带“规则可能失效”标记。可疑的结果不会计入基线;之后出现一次正常抓取,预警自动消失。开启多页采集的订阅只用第 1 页的条目做统计和“重新识别”对比:每次抓几页会随增量停止和最多页数变化,修改最多页数不会被当成条目数骤增或骤降。

如果只有日期、图片或摘要缺失,而条目数、标题和链接没有触发规则告警,显示“部分字段缺失”:说明本次仍提取了多少条内容以及哪些字段可能缺失,订阅继续输出,不推送通知,也不计入“需要检查”或“规则可能失效”筛选。可用“状态 → 部分字段缺失”单独查看。之后出现条目数、标题或链接异常时,会升级为规则告警,仍按通知开关和冷却时间处理;恢复正常后提示清除。

升级后,已有的可选字段告警会自动降级,尚未发送的对应通知会取消。旧历史日志没有分级信息时,显示中性的“规则检查记录”;已发送通知的历史状态保留。

在订阅面板中可以:

  • 重新识别:用订阅保存的 Cookie 和等待设置打开网页,分别按当前规则抽取、运行自动识别,并排显示两边的条目数和前几条内容。下方按字段列出有变化的选择器:自动识别得到的字段默认勾选,手动选择过的字段默认不勾选,需要逐项勾选才会替换。勾选组合与新识别结果不同时,先“预览所选组合”;预览至少有 1 条内容后才能“替换所选字段”。替换后立即按新规则抓取一次,基线从新规则重新积累。在确认替换之前,已保存的规则不会改变。
  • 重新识别缺失字段:用于“部分字段缺失”,默认只勾选已重新找到的相关自动识别字段,保留条目容器、标题、链接等正常规则;没有找到字段时不会默认删除旧规则,手动选择的字段仍需自行勾选。预览并确认后才保存。
  • 忽略此警告:页面确实变少了(例如网站只保留了部分栏目)时,忽略后以本次结果作为新的基线,之后重新积累 5 次再判断。

启用任一通知渠道后,“规则可能失效”每出现一次就发到所有已启用的渠道(标题“订阅灯:规则可能失效”,Webhook 事件类型 rules.warning),持续期间不重复推送,与抓取失败告警分开计算;在“设置 → 通知 → 告警策略”中取消“规则可能失效时通知”即可单独关闭。健康统计每个订阅最多保留 20 条样本,并和抓取日志一样按“日志保留天数”清理。

RSS 翻译订阅(仅译文 / 双语) ​

点击「新建订阅 → RSS 翻译」,输入现有 RSS 2.0 或 Atom 1.0 地址,点击「预览订阅源」。确认原文后填写名称、刷新间隔、输出模式、目标语言和翻译服务,保存即可复制新的 RSS 地址。

  • 默认每 30 分钟刷新,输出简体中文双语内容。标题译文在前,正文在同一内容块中先显示译文,再显示原文;代码不翻译。
  • 目标语言可选简体中文、繁體中文、英语、日语、韩语;订阅的 RSS <language> 随目标语言输出(如 zh-cn、ja)。
  • 翻译服务默认“跟随默认”,即管理员在设置中选定的服务;也可以为单个订阅指定 Google、DeepL 或 OpenAI 兼容接口。管理员尚未配置的服务显示“(未配置)”,不能选择。
  • 首次导入只处理源中最新 20 条,后续处理新条目和已导入条目的变化,默认输出最近收集的 100 条(可在“输出内容”中调整,见上文)。首次跳过的旧条目不会在下一次刷新时自动补翻。
  • 只翻译订阅源提供的内容:有全文就翻译全文,只有摘要就翻译摘要,不另行访问文章页面。第一版 RSS 输入不附加 Cookie;可使用源自身提供的带访问令牌的订阅地址。
  • 图片、链接、列表、表格和代码保留;不安全的 HTML 会被清理。管理页面正文在隔离预览框中展示,预览中的链接不会跳转管理页面;可用条目标题打开原文。
  • 翻译在后台进行。阅读器获取订阅时只读取缓存,不等待 Google。只有标题和正文均翻译成功的文章才会输出到订阅链接;等待、失败和部分完成的条目不会输出。首次尚无成品时返回有效的空 RSS。管理页仍显示原文和处理状态。
  • 订阅面板顶部显示翻译完成、等待和失败数量;有未完成的文章时可点击旁边的「重试未完成翻译」。条目上以“翻译中 / 翻译失败”小标记显示状态,失败原因显示在条目下方。暂停订阅也会暂停新翻译,恢复后继续。
  • 在订阅设置中切换「仅译文/双语」,输出地址与条目 ID 保持不变,无需重新翻译。更换目标语言或翻译服务会重新翻译已有文章:完成前这些文章暂不出现在订阅链接中,完成后条目 ID 不变,阅读器不会重复推送;之前用过的服务和语言的片段缓存仍保留,切回时很快完成。修改 RSS 来源地址会清除该订阅原有条目,从新来源重新开始;保存前应确认地址。

翻译服务 ​

管理员在「设置 → 翻译服务」中配置各服务。三个服务各是一张卡片,标出“默认”“已配置”或“未配置”(API Key 只显示是否已配置,不回显);默认服务的卡片自动展开,其他卡片点击展开。点击卡片上的“设为默认”更换默认服务,尚未配置的服务不能设为默认(DeepL 需要 API Key,OpenAI 兼容接口需要接口地址和模型名称)。未设为默认的服务仍可在单个订阅中选用。保存时只提交实际修改的内容,API Key 留空表示保留原值。每个服务的并发数、启动间隔和限流退避分别计算,一个服务被限流不影响使用其他服务的订阅。修改默认服务只影响之后的翻译任务,已完成的译文不会重新翻译。

  • Google 免费翻译:默认服务,无需密钥,实验性,详见下一节。
  • DeepL:填写 DeepL API Key。“套餐”选“自动”时,以 :fx 结尾的 Key 使用免费版接口 api-free.deepl.com,其他使用付费版 api.deepl.com;也可手动指定。额度用完(HTTP 456)或限流(HTTP 429)时 DeepL 暂停调度并自动重试。
  • OpenAI 兼容接口:填写接口地址(Base URL,如 https://api.openai.com/v1,请求发送到 接口地址/chat/completions)、模型名称和 API Key(本地模型可留空),可选自定义系统提示词。FeedLantern 只发送正文中的文字片段(代码块、行内代码、图片和标签结构不发送,由本地按原结构组装),并要求模型按编号原样返回每一段;返回的段数、编号或标签对不上、输出被截断或出现多余内容时,整批视为失败并自动重试,不会写入缓存或订阅链接。自定义提示词放在固定的格式要求之前,只影响翻译风格,不能改变返回格式。
  • 本机或局域网模型(如 Ollama:http://127.0.0.1:11434/v1)默认会被网络安全策略拦截;需要管理员在「服务器与网络 → 网络访问白名单」中加入精确的 127.0.0.1:11434 后才能使用。DeepL 和公网接口同样经过地址安全校验。
  • 每个服务旁有“测试”按钮,用当前填写(尚未保存)的设置翻译一句示例,便于确认 Key 和地址。
  • API Key 加密保存在数据库中,保存后页面只显示“已保存,留空保持不变”,接口不会返回 Key;勾选“保存时删除已保存的 Key”可移除。完整加密备份包含 Key,轻量配置导出不含 Key(导入时保留本机已保存的 Key)。

不同服务、不同目标语言的译文分别缓存,不会互相串用;升级前的缓存视为“Google + 简体中文”继续使用。

Google 免费翻译(实验性) ​

使用 Google 浏览器翻译通道(translate-pa.googleapis.com/v1/translateHtml),与沉浸式翻译 1.33.1 发布脚本的浏览器模式采用相同请求格式,无需申请云账户或配置付费 API。它不是 Google Cloud Translation 官方付费接口,没有可用性保证,可能因服务器出口 IP、请求频率或接口变化而失败。首次使用时请在实际部署服务器验证连通性。

默认最多同时发出 6 个翻译请求,启动间隔为 100 毫秒;同一篇文章的标题、正文片段和长文本分段可并行处理,最终按原文顺序组装。可在「设置 → 翻译服务」调整 Google 的并发数(1–16)和启动间隔(0–5000 毫秒),0 表示不额外间隔,保存后生效。成功片段持久缓存;同样的片段可跨条目复用。临时失败最多尝试 3 次,分别至少等待 60 秒和 300 秒,并遵循服务端 Retry-After(最多 24 小时)。只有明确的限流响应(例如 429、403、自动化请求限制页面或 Retry-After)会暂缓整条翻译队列;普通单条错误不阻塞其他订阅。手动重试不会跳过仍有效的限流等待期。超出尝试次数后需要手动重试。

Google 请求被限制时,网页抓取、RSS 输出和已有译文继续可用,不会自动切换到其他服务。文章原文有变化时,旧译文不会冒充最新内容;未完成的新版本暂不进入 RSS 输出,管理页可查看原文,已成功片段仍可复用。

RSS 获取失败会进入既有抓取日志和失败告警流程(取决于你的通知设置);翻译失败显示为独立翻译状态,向所有者所有已启用的通知渠道发送独立告警。完整加密备份包含译文、缓存和未完成任务;轻量配置导出不含内容,导入后重新获取。片段缓存最多保留最近使用的 20,000 段,定期清理;保留条目的成品译文不因此丢失。

RSS 翻译进度与日志 ​

在订阅面板的“运行日志 → 翻译记录”中查看,每 2 秒更新:顶部是翻译服务当前的状态,下面列出未完成的文章(翻译中、排队等待或失败,以及失败原因和下次重试时间),最后是翻译日志(片段完成数量、缓存命中、失败原因),失败的记录标红。翻译日志每个订阅保留最新 200 条(且不超过 7 天),界面显示最近 100 条;服务端标准输出也记录翻译事件。全站请求数包含其他 RSS 翻译订阅。

翻译请求使用原生文本数组,合并最多 50 个片段(合计原文不超过 1800 字符),再按设置并发提交。返回数量不符、类型异常或包含空译文时,整批拒绝写入缓存和发布。已有完整译文保留;新通道使用独立片段缓存,避免混用旧接口结果。Google 免费接口实际返回限流时暂停请求并自动重试;管理页显示恢复调度时间。仅整篇翻译完成后才进入公开订阅。

每个通知渠道都提供“发送测试通知”,使用当前填写的值发送一次测试,不保存设置,也不要求启用自动告警。启用任一渠道后,首次翻译失败(含限流)会推送到所有已启用的渠道;同一订阅连续失败去重,与抓取故障分别处理。全部文章翻译恢复成功后重新允许告警。推送失败沿用“告警策略”中的发送次数、重试间隔和冷却设置,每个渠道分别重试。翻译本身最多尝试 3 次:第一次失败后至少 1 分钟,第二次后至少 5 分钟;Google 限流还触发至少 1 分钟的全局退避,并遵守更长的 Retry-After。第三次失败后可在订阅详情手动重试。

批量添加 RSS 翻译 ​

在“新建订阅”的下拉菜单中选择“批量添加”,将“批量订阅类型”切换为“RSS 翻译”,每行填写一个 RSS/Atom 地址,选择统一的输出模式(双语或仅译文)、目标语言、翻译服务及刷新间隔,然后点击“开始批量添加翻译”。每批最多 100 个地址,可点击“从 OPML 导入”读取阅读器导出的 OPML 文件;重复项自动跳过;同址网页订阅与翻译订阅分别识别。后台读取订阅源后自动创建订阅并启动翻译,源读取失败可在批量任务中重试。任务显示“已创建”表示订阅创建完成,文章翻译进度请到订阅详情查看。关闭页面后任务继续运行。

网页抓取订阅翻译与列表筛选 ​

订阅列表和卡片分别显示来源(网页抓取 / RSS 来源 / PubMed 检索)与输出模式(原文 / 中文翻译 / 双语翻译;其他目标语言显示为“日语翻译”“双语翻译(日语)”等),可按来源或是否翻译筛选,全选仅作用于当前筛选结果。

网页订阅在“订阅设置 → 输出模式”选择“仅译文”或“双语”即可开启翻译,并可同时选择目标语言和翻译服务。系统处理已有标题和抓取摘要,保留图片与条目标识,后续抓取内容变化时重新翻译;不额外访问文章全文。只有完成翻译的条目进入公开 RSS,可在详情查看进度、日志及重试,失败沿用 Bark 告警。切回原文立即恢复原始输出,订阅地址不变。升级时已有网页订阅默认保持原文输出。

PubMed 订阅 ​

推荐用法:PubMed 检索订阅。 在“新建订阅”菜单中选择“PubMed 检索”(或在新建页顶部切换到“PubMed 检索”),像 PubMed 的 Advanced Search Builder 一样组合检索条件,直接生成订阅,不用再去 PubMed 网站生成 RSS 链接。FeedLantern 通过 NCBI 官方的 E-utilities 接口读取最新的匹配文章:esearch 按“Most recent”(收录进 PubMed 的时间,新的在前,与 PubMed RSS 的顺序相同)取最新 N 篇,efetch 取标题、作者、期刊、发表日期和摘要。

检索构建器 ​

  • 检索条件:每行包括逻辑运算(AND / OR / NOT,第一行没有)、字段和检索词,可以添加多行,按从上到下的顺序组合(与 PubMed 构建器相同,例如三行写成 ((A) AND (B)) OR (C))。字段有:全部字段(All Fields)、标题/摘要(Title/Abstract)、标题(Title)、作者(Author)、第一作者(Author - First)、末位作者(Author - Last)、期刊(Journal)、机构(Affiliation)、MeSH 主题词(MeSH Terms)、文献类型(Publication Type)、语言(Language),以及期刊 NLM ID([jid])。
  • 与 PubMed 构建器一致,默认不加引号:每个条件写成 (检索词[字段])(“全部字段”不带标签),条件之间用 AND / OR / NOT 连接,检索词原样发送。这样 PubMed 会做自动词映射(ATM):例如 cryo electron microscopy 会映射到 MeSH 主题词,Sun Jin-peng[Author] 会同时匹配 Sun, Jin Peng 等写法;加了引号就只匹配原样的短语,结果会少很多(实测分别是 24903 和 10997 篇)。PubMed 不区分大小写。
  • 精确短语:每行有一个“精确短语”开关,默认关闭;打开后给这一行的检索词加上引号,只匹配原样短语并关闭自动词映射。自己输入的引号也会原样保留。
  • 只处理会破坏语法的字符:[、] 会被当成字段标签的开头,换成空格;没有配对的括号或引号会被去掉;检索词中单独出现的大写 AND / OR / NOT 会被 PubMed 当成运算符,构建器会提示(改成小写或打开“精确短语”即可按普通词检索)。
  • 筛选:发表日期(不限 / 最近 N 天 / 指定区间,日期写作 YYYY、YYYY/MM 或 YYYY/MM/DD,任一端可留空)、只看有摘要的文章(hasabstract),以及文章类型快捷项(综述、系统综述、Meta 分析、临床试验、随机对照试验、病例报告,多选为 OR)。
  • 查询式:构建器下方实时显示生成的 PubMed 查询式,例如 (cryo-EM[Title/Abstract]) AND (ShanghaiTech University[Affiliation])。可以直接修改查询式:能还原成条件时构建器同步更新;还原不了(例如 a AND (b OR c) 这类右侧分组,或构建器没有的字段)时提示“已切换为手动编辑”,查询式按原样保存,可点“放弃手动修改”回到构建器。引号或括号不配对、AND/OR/NOT 缺少一侧时会直接指出,不会发送给 NCBI。
  • 预览:右侧显示匹配总数和最新 5 篇(标题、期刊、日期、作者)、NCBI 的提示(例如“找不到带引号的短语”),以及 PubMed 实际执行的查询式(esearch 返回的 querytranslation),可以看到自动词映射展开了哪些词。输入停顿约 0.8 秒后才请求一次,相同查询一分钟内直接复用结果;所有预览与刷新共用全局的 NCBI 限流队列,队列过长时预览会提示稍后再试。点“在 PubMed 中打开”可以在 PubMed 网站上对照同一检索。
  • 订阅设置:订阅名默认是查询式原文加“ - PubMed”,与 PubMed 网站的标题一致,例如 (Mengmeng Lin[Author]) AND (ShanghaiTech[Affiliation]) - PubMed;在你手动修改之前随查询式实时更新(“ - PubMed”是固定后缀,不随界面语言变化)。名称最长 200 个字符,查询式太长时从中间截断并加省略号、保留结尾的“ - PubMed”,保存和执行的仍是完整查询式。阅读器里看到的 RSS、Atom、JSON 频道标题都是这个名称。“每次抓取最新文章数”可选 10 / 20 / 50 / 100(默认 20),已存的文章不会重复加入。输出模式可选原文、仅译文或双语,沿用 RSS 翻译订阅的翻译流程、目标语言和翻译服务;刷新间隔、网络配置(代理和 DoH)、条目过滤、输出条数和保留条数、聚合订阅、通知都与其他订阅一样可用。规则失效预警只适用于网页订阅;PubMed 检索出错时按抓取失败处理,抓取日志给出可读的原因。
  • 编辑:在订阅面板“订阅设置 → 编辑检索条件”回到同一个构建器。修改检索条件后已存文章保留(条目按 PMID 识别),新的匹配文章在下次刷新时加入。如果名称还是默认的“旧查询式 - PubMed”,会跟着新查询式更新;自定义过的名称保持不变,并提示“名称未随查询式更新”。

查询式示例:

想订阅查询式
某机构的某位作者(Sun Jin-peng[Author]) AND (ShanghaiTech University[Affiliation])
某期刊里的某个主题(PLoS Pathog[Journal]) AND (Wolbachia[Title/Abstract])
某机构的冷冻电镜论文,只看有摘要的((cryo-EM[Title/Abstract]) AND (ShanghaiTech University[Affiliation])) AND (hasabstract)
最近 30 天某领域的综述(CRISPR-Cas Systems[MeSH Terms]) AND ("last 30 days"[Date - Publication]) AND ("Review"[pt])

条目链接为 https://pubmed.ncbi.nlm.nih.gov/<PMID>/,正文与 PubMed RSS 的排版一致:第一行是引用信息(期刊缩写、日期、卷期页码和 DOI),随后是作者(超过 10 位时以 et al. 结尾)、摘要(分段摘要每段一行,没有摘要时显示 NO ABSTRACT)和 PMID / PMC / DOI 链接;条目时间是文章收录进 PubMed 当天纽约时间 6:00(与 PubMed RSS 相同)。翻译订阅会翻译标题和摘要。命令行和 MCP 也可以预览和创建 PubMed 检索订阅,见 Agent CLI。

仍想用 PubMed 的 RSS 链接 ​

PubMed 的 RSS 地址仍可以作为普通 RSS 翻译订阅使用,FeedLantern 不会在后台改写这类地址:

  • 期刊 RSS(https://pubmed.ncbi.nlm.nih.gov/rss/journals/<NLM ID>/…,在期刊页点 RSS 得到):NCBI 现在对程序访问期刊 RSS 一律返回工作量证明验证页(要求浏览器运行脚本并写入 Cookie),不再返回 RSS,因此这类订阅会抓取失败,报错说明“NCBI 用验证页拦截了这个 PubMed 期刊 RSS 地址”。FeedLantern 不会尝试绕过这类验证。期刊请改用检索式 RSS:在 PubMed 中搜索 "PLoS Pathog"[jour](换成你的期刊缩写),再点 Create RSS,用得到的 /rss/search/… 链接订阅;或者直接使用上面的 PubMed 检索订阅。
  • 检索式 RSS(/rss/search/<ID>/…):目前仍可直接抓取。

官方 RSS 与 E-utilities 的区别:两者读的是同一个 PubMed 后端,结果一致;NCBI 服务端偶发的 5xx 错误两者都会遇到,转换不能消除这类故障。E-utilities 的好处是:它是 NCBI 提供给程序的官方接口,不会被网页验证页拦截(期刊 RSS 已经被拦截);查询式透明、可以在 FeedLantern 里直接编辑;每次抓取篇数(10/20/50/100)和日期等条件可以自己设置。建议:期刊 RSS 一律转换;检索式 RSS 可以继续使用,想在 FeedLantern 里管理检索条件或担心以后也被拦截时再转换。

把 PubMed RSS 订阅转换为检索订阅 ​

订阅面板对 PubMed 的期刊 RSS 和检索式 RSS 都会给出提示和“转换为 PubMed 检索订阅”按钮。转换前 FeedLantern 先验证,任何情况下都不会自动转换:

  1. 还原查询式:读取一次这个 RSS 地址(与其他 NCBI 请求共用限流队列)。检索式 RSS 的频道标题就是原始查询式,去掉“: Latest results from PubMed”这类后缀即可;括号不配对时尝试补齐(标记为“已补齐”);以省略号、AND/OR/NOT 结尾或引号不闭合的标题视为疑似截断,不作猜测。期刊 RSS 按地址里的期刊缩写预填 "PLoS Pathog"[Journal](没有缩写时用 101238921[jid],PubMed 会把它映射为同一期刊)。
  2. 对比:用 esearch 执行还原的查询式,取最新 200 篇,看 RSS 里最新的 20 条有多少在其中(覆盖率)。至少 80% 时判定为“可直接转换”。期刊 RSS 被 NCBI 拦截读不到时,改与订阅已存的条目对比。
  3. 结果:可直接转换时,面板显示还原的查询式和覆盖率,点“确认转换”即可;标题疑似截断、覆盖率低、RSS 读取失败或没有可对比的条目时,打开构建器并预填候选查询式,提示“未能确认与原 RSS 一致,请核对”和原因,核对后再“确认转换”。

订阅很多时,可以在订阅列表顶部的提示条点“验证并转换”,或勾选订阅后用批量操作“转换为 PubMed 检索订阅”:

  • 验证在服务端后台进行:关闭窗口或页面、甚至服务重启后都会继续;再次打开时看到当前进度和已有结果,不用重来。整体进度条显示“已完成 N / 共 M”和预计剩余时间,每一行显示排队中、验证中、可直接转换、需要核对(及原因)、失败或已转换。
  • 尽量不访问 PubMed 网页:大多数检索式 RSS 订阅的名字就是 RSS 标题(即查询式),FeedLantern 先用订阅名还原查询式,与订阅已存的条目(链接里的 PMID)对比,每个订阅只需要一次 E-utilities 请求;只有这样确认不了时,才读取一次 RSS 地址取频道标题和最新条目。
  • 并发但不超限:同时验证 5 个订阅,所有 NCBI 请求仍共用全局限流(不带 Key 每秒 3 个,带 Key 每秒 10 个)。未配置 Key 时界面会提示并链接到设置页;60 个订阅不带 Key 约 20 秒,带 Key 更快。
  • 结果会保存:订阅地址和名称都没变的订阅不会重复验证(标为“沿用上次验证”),也可以点“重新验证”;验证可以停止,失败项可以重试。
  • 边验证边转换:已经验证通过的订阅可以随时先转换,不必等全部完成;确认后只转换“可直接转换”的,需要核对的留在表里,点“核对”逐个在构建器中处理。转换是幂等的,失败项可以重试。

以前的版本验证一个订阅需要先抓一次 RSS 网页、再查 E-utilities,而且逐个串行进行,60 个订阅要几分钟;现在大多只需一次 E-utilities 请求,并行等待应答。命令行可以用 feedlantern pubmed convert --all-verified 先看报告,再加 --yes 执行,用 feedlantern pubmed checks 查看后台任务,见 Agent CLI。

转换时默认保留现有名称(可能是你自己改过的);单个和批量转换的确认界面都有“同时把名称改为‘查询式 - PubMed’”选项,默认不勾选,勾选后批量汇总表会显示新旧名称对照。转换后订阅 ID、RSS 地址、已存条目和译文、翻译设置(输出模式、目标语言、翻译服务)、条目过滤、输出条数、保留条数、聚合订阅的成员资格、刷新间隔和网络配置都不变;条目身份与 PubMed RSS 相同(pubmed:<PMID>),已有文章不会被当成新文章重复推送。转换后的第一次抓取中,正文排版的细小差异可能让近期文章重新排队翻译一次,相同段落直接命中译文缓存。

NCBI 使用规则与设置 ​

NCBI 要求程序访问 E-utilities 时遵守频率限制,并在请求中注明工具名和联系邮箱:

  • 所有 PubMed 检索订阅的刷新和构建器预览共用一个请求队列:不填 API Key 时每秒最多 3 个请求,填写后每秒最多 10 个。每个订阅每次刷新、每次预览各发出 2 个请求(esearch、efetch),批量刷新时依次排队,不会并发打满。NCBI 仍返回 429(请求过于频繁)时,FeedLantern 按 Retry-After 暂停整条队列后重试一次,仍失败则记为抓取失败,提示“NCBI E-utilities 请求过于频繁(HTTP 429)…”。
  • 管理员可以在「设置 → PubMed(NCBI)」填写 NCBI API Key(可选,在 NCBI 账号的 Account Settings → API Key Management 中免费申请)和联系邮箱(可选)。API Key 与翻译服务的 Key 一样加密保存、不回显,轻量配置导出不含 Key;勾选“保存时删除已保存的 Key”可移除。NCBI 拒绝 Key 时,抓取日志会提示检查或删除它。
  • 点“测试”可以在保存前检查当前填写的 Key 和邮箱:FeedLantern 发一个最小的 esearch 请求(retmax=0),给出明确结果——有效(显示 NCBI 回报的速率上限,带 Key 为每秒 10 个)、NCBI 不接受(例如 Key 已被删除,NCBI 返回 type: invalid)、格式不对(NCBI 返回 API key not wellformed)、被限流、网络不通;其他情况显示 NCBI 原始错误的摘要,不硬归类。邮箱只做基本格式检查。保存后显示“已配置 Key”和上次测试的结果与时间;Key 改动后会提示重新测试。
  • 每个请求固定带 tool=feedlantern;填写了联系邮箱时同时带 email,没填时不发送邮箱。NCBI 建议附上邮箱:请求异常时他们会先通过邮箱联系,而不是直接封禁来源 IP。共用出口 IP 的部署尤其建议填写。
  • E-utilities 请求与普通 RSS 来源一样经过网络安全策略、DNS over HTTPS 设置和订阅所选网络配置的代理与 User-Agent;网络配置中的自定义请求头只发给订阅地址所在的网站,不会发给 eutils.ncbi.nlm.nih.gov。

基于 MIT 许可证开源 · 在自己的服务器上部署