feedi

feedi

可定制的极简Web订阅阅读器

feedi是一款Web订阅阅读器,具有类似Mastodon的极简界面。支持本地和自托管部署,兼容Mastodon主页和通知流。提供移动友好UI和PWA功能,可自定义解析Reddit、Github和Goodreads等源。其特色包括智能订阅排序、本地文章阅读和Kindle设备支持,满足个性化阅读需求。

feediRSS阅读器Web应用自托管开源软件Github开源项目

feedi

feedi 是一个网页订阅阅读器,具有类似 Mastodon 或 Twitter 信息流的极简界面。

特点:

  • 简易的本地和自托管环境设置。
  • 支持 Mastodon 主页和通知流。
  • 移动设备友好的用户界面。
  • 可作为渐进式网络应用安装。
  • 为 Reddit、Github 和 Goodreads 提供自定义解析器。
  • 可定制的 RSS 解析器和临时网页抓取器。
  • 智能订阅源排序选项(突出显示不常更新的来源,自动标记为已读)。
  • 使用 Mozilla 的阅读模式进行本地文章阅读和预览。
  • 支持发送到 Kindle 设备。

<br/> 关于此项目开发的背景,请参阅这篇博客文章

文档

安装

feedi 需要 Python 3.9 或更高版本。如果你还没有安装,可以考虑使用 pyenvasdf

在本地环境安装 feedi:

git clone https://github.com/facundoolano/feedi.git
cd feedi
make

然后,运行应用:

make run

应用将在 http://localhost:9988/ 可用。

或者,参考使用 Docker 运行非本地设置的说明。

基本用法

添加来源

默认情况下,您的信息流为空。您可以通过多种方式加载内容:

  • 点击"+ 添加信息源"按钮或导航至"/feeds/new"手动添加信息源。
  • 通过粘贴或拖动网站URL到搜索框来发现网站的RSS源。
  • 运行make feed-load feed-sync加载此仓库中包含的一组默认网站。
  • OPML或CSV文件导入一系列信息源。
  • 登录Mastodon账号

首次添加信息源时,应用会获取其最新文章,然后会定期检查新内容(默认每30分钟一次)。

浏览信息流

  • 可以将来源放入文件夹,可通过左侧边栏(桌面端)或导航栏菜单(移动端)访问。
  • 可以通过右侧边栏(桌面端)或导航栏菜单上的控件调整信息流行为:
  • 用户向下滚动时,条目会自动标记为已查看。默认情况下,下次打开应用时会跳过已看过的条目。
  • 默认排序将更新频率较低的来源置顶。另外,还有严格的时间顺序排序选项。

阅读文章

与信息流条目交互有多种方式:

  • 点击文章标题会在新浏览器标签页中打开原始网站。
  • 在某些情况下,如Reddit、Hacker News或Lobste.rs等链接聚合器,会有一个单独的链接用于文章讨论。
  • 点击内容或在聚焦条目时按Enter键,将获取并在本地阅读器中显示文章内容。这将是文章的精简版本(移除了一些网站链接、广告和付费墙),由mozilla/readability库提供支持。请注意,要使用此功能,需要在设置项目时安装node 20或更高版本。
  • 还可以通过将任意文章的URL拖到搜索框来使用阅读器预览。

删除旧文章

条目会在发布后的一段时间内自动删除(默认为7天)。 置顶和收藏的条目永不删除。此外,所有来源都会保留最少数量的条目(默认为5条),不考虑发布日期。

高级功能

从CSV和OPML文件批量导入/导出订阅源

make feed-load将从本地feeds.csv文件加载订阅源。仓库中包含了一个示例文件,以便您可以立即查看一些内容。 还有一个make feed-load-opml命令,可以从OPML格式feeds.opml文件导入RSS订阅源列表。 相应地,还有make feed-dumpmake feed-dump-opml命令用于从应用程序导出订阅源数据。

Mastodon账户设置

Mastodon集成允许将用户主页feed和通知收件箱都作为订阅源获取。 feedi首先需要通过导航到管理订阅源 > Mastodon登录或访问/auth/mastodonURL来获得访问Mastodon账户的授权。填写实例名称并授予访问权限后,feedi将重定向到添加订阅源表单,在那里可以添加Mastodon或Mastodon通知订阅源(或两者都添加)。

GitHub通知订阅源

您可以将GitHub的通知导入feedi。为此,请导航到您的GitHub主页https://github.com/,打开页面HTML源代码并搜索atom feed链接。它应该看起来像这样:

<link rel="alternate" type="application/atom+xml" title="ATOM" href="/facundoolano.private.atom?token=<TOKEN>" />

复制href URL并使用它在feedi中添加新的RSS订阅源。

Goodreads主页订阅源

您可以将Goodreads.com的通知导入feedi。为此,请导航到您的Goodreads主页https://www.goodreads.com/,打开页面HTML源代码并搜索atom feed链接。它应该看起来像这样:

<link href='https://www.goodreads.com/home/index_rss/<ID>?key=<KEY>' rel='alternate' title='Goodreads' type='application/atom+xml'>

复制href URL并使用它在feedi中添加新的RSS订阅源。

Reddit订阅源

Reddit通过在URL后附加.rss来将公共页面作为RSS订阅源公开,例如https://www.reddit.com/r/selfhosted.rsswww.reddit.com/user/someuser.rss。 此外,经过身份验证的用户可以访问私人账户页面的RSS订阅源:首页、已保存的链接、消息收件箱等。可以在这里找到链接。 feedi为Reddit列表消息和链接以及用户收件箱使用特殊用途的订阅源解析器。

Kindle设备支持

该应用程序允许注册Kindle邮箱地址,以便将清理过的文章HTML发送到设备上,比默认的Amazon Send to Kindle Chrome扩展获得更好的效果。这需要设置SMTP凭据以发送电子邮件。 使用基本Gmail账户实现的步骤:

  1. 注册一个Google电子邮件账户。
  2. 为该账户开启两步验证。
  3. 导航到应用密码设置并为应用生成密码(需要激活两步验证才能使用)。
  4. 在应用配置中添加SMTP设置:
FEEDI_EMAIL = "YOUR.EMAIL@gmail.com" FEEDI_EMAIL_PASSWORD = "GENERATED APP PASSWORD" FEEDI_EMAIL_SERVER = "smtp.gmail.com" FEEDI_EMAIL_PORT = 587
  1. 导航到/auth/kindle或在搜索框中输入"kindle",然后输入您设备的@kindle.com电子邮件地址。
  2. 转到您的Amazon个人文档设置,并将您的feedi电子邮件地址添加到已批准的文档电子邮件列表中。 完成此设置后,浏览文章时将可以使用"发送到Kindle"命令。

订阅源解析

该应用程序通过定期从不同的订阅源(RSS/Atom、Mastodon嘟文和通知、自定义爬虫)获取项目,并将它们调整为Entry数据库模型,该模型大致匹配我们期望在前端显示的内容。

RSS/Atom订阅源

大多数RSS订阅源应该能被默认解析器正确处理,但有时需要添加自定义功能来清理或扩展数据以获得更好的外观和体验。这可以通过继承feedi.parsers.rss.BaseParser来实现。静态方法is_compatible确定是否应使用该特定类解析给定的订阅源;parse_*方法覆盖了前端预期的每个字段的默认逻辑。 例如,这个lobste.rs链接聚合器的解析器被调整为内联显示外部链接提交的摘要,并区分源文章URL和lobste.rs讨论URL:

class LobstersParser(BaseParser): def is_compatible(_feed_url, feed_data): return 'lobste.rs' in feed_data['feed'].get('link', '') def parse_content_short(self, entry): # 只有外部链接提交才有'Comments'链接 if 'Comments' in entry['summary']: url = self.parse_content_url(entry) return (self.fetch_meta(url, 'og:description') or self.fetch_meta(url, 'description')) return entry['summary'] def parse_entry_url(self, entry): # 返回讨论URL,对于外部链接,它与entry['link']不同 if 'Comments' in entry['summary']: soup = BeautifulSoup(entry['summary'], 'lxml') return soup.find("a", string="Comments")['href'] return entry['link']

您可以在这个模块中看到几个自定义RSS解析器。

自定义订阅源

除了RSS和Mastodon订阅源外,该应用程序还可以通过自定义解析器获取任意来源的内容。这对于抓取不提供订阅源的网站或直接消费JSON API很有用。 要添加自定义解析器,请继承feedi.parsers.custom.CustomParseris_compatible方法确定是否应使用该解析器解析给定的URL。fetch方法执行实际的条目获取和解析。有关一些示例,请参阅feedi.parsers.custom模块。 一旦实现了解析器,当在Web应用程序中添加带有预期URL的"自定义"类型的新订阅源时,就会使用它。

键盘快捷键

快捷键场景动作
Cmd+k聚焦搜索输入框
Enter搜索框聚焦提交第一个建议
Escape搜索框或建议聚焦隐藏建议
向下箭头, Ctrl+n搜索框或建议聚焦下一个建议
向上箭头, Ctrl+n建议聚焦上一个建议
Enter条目聚焦打开条目内容
Cmd+Enter, Cmd+左键点击条目聚焦在新标签页打开条目内容
Cmd+Shift+Enter, Cmd+Shift+左键点击条目聚焦在新窗口打开条目讨论
向下箭头, Tab条目聚焦聚焦下一个条目
向上箭头, Shift+Tab条目聚焦聚焦上一个条目
p条目聚焦固定条目
f条目聚焦收藏条目
Escape查看条目内容返回

用户管理

默认的应用程序配置假设是单用户未认证设置,但如果需要安全性,可以启用身份验证,例如将应用程序部署到互联网上或支持多个账户。 要启用用户身份验证:

  1. 配置中删除DEFAULT_AUTH_USER设置。
  2. 如果您已经创建了数据库,请使用make db-reset重置它。或者,使用make user-del EMAIL=admin@admin.com删除默认用户。请注意,这也会从数据库中删除与之关联的订阅源和条目。
  3. 您可以通过运行make user-add EMAIL=some@email.address来创建新用户。该命令将提示输入密码。 请注意,前端没有开放的用户注册功能,但如果需要,添加这个功能应该很简单。有关详细信息,请查看auth模块flask-login文档

使用Docker运行

从GitHub包获取镜像: docker pull ghcr.io/facundoolano/feedi:latest

创建一个卷以持久化数据库数据: docker volume create feedidb

将默认订阅源加载到默认管理员用户: docker run -v feedidb:/app/instance ghcr.io/facundoolano/feedi flask --app feedi/app.py feed load feeds.csv admin@admin.com docker run -v feedidb:/app/instance ghcr.io/facundoolano/feedi flask --app feedi/app.py feed sync

以开发模式运行: docker run -p 9988:9988 -v feedidb:/app/instance ghcr.io/facundoolano/feedi

要在生产模式下运行,需要一个至少包含密钥的配置文件: echo "SECRET_KEY = '$(python -c 'import secrets; print(secrets.token_hex())')'" >> production.py docker run -p 9988:9988 -e FLASK_ENV=production -v feedidb:/app/instance -v $(pwd)/production.py:/app/feedi/config/production.py ghcr.io/facundoolano/feedi

要启用身份验证,请在生产配置文件中添加DEFAULT_AUTH_USER=None

非本地设置

您可以参考Flask文档以获取有关如何将feedi部署到非本地环境的说明。存储库中包含的设置脚本展示了Debian服务器的示例设置。您可以通过ssh远程运行它,如make prod-install SSH=user@server

编辑推荐精选

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成AI工具AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机AI图像热门
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

下拉加载更多