type
status
date
slug
summary
tags
category
icon
password

一、蓝图

 

二、准备工作

(一)邮件推送服务

不论邮件内容如何,最终要实现的是稳定、可控的把邮件发给用户,因此,邮件推送就是首先要设计并实现的。

1. 自建方案

使用 post.io 、 iRedMail 等构建微服务。
夜梦星尘の折腾日记夜梦星尘の折腾日记邮局系列教程 | 使用poste.io部署自己的邮局 – 夜梦星尘の折腾日记

2. 直接调用 SMTP

需配置内容:
  • QQ 邮箱
    • 网易邮箱

      3. 云服务方案

      为了避免发国内用户 QQ 邮箱时被丢进垃圾箱,所以用腾讯云。
      邮件推送简介_邮件推送购买指南_邮件推送操作指南-腾讯云
      • 发信域名配置
        • 拥有一个腾讯云托管的域名,添加子域名如 post.xxx.com,然后配置一堆东西。
          notion image
      • 发信地址配置
        • 设置了 SMTP 密码。
      • 发信模版配置
        • 写一个 HTML 并上传,等待审核。
          腾讯云审核初次未审批通过,不支持全变量模板以及直接将整个 URL 作为变量,以下是二次提交过审的模板。
      • 开始发信
        • 选择过审的模板,手写 Json 数据替换模板变量,发信成功则可开始构建代码调用。
          • notion image

      (二)数据抓取目标

      1. 数据来源

      • PubMed(权威)
        • 骨科、最近一年、按日期从近到远、第一页的网页内容(邮件每日推送,日期很重要,同时也要和数据库历史数据进行比对)
      • PMC(PubMed 的公开子集,可以获取到文献全文及其 PDF)
        • 骨科、最近一年、按日期从近到远、第一页的网页内容
      • GoogleSholar(不太好用)
        • q=orthopedics:这是搜索查询本身。你可以将其更改为任何你想要搜索的术语,例如 q=cardiology。你还可以使用高级搜索语法,如 author:"john smith" 来搜索特定作者,或者用引号将短语括起来,如 "A History of the China Sea",以搜索确切的短语。
        • hl=en:这表示界面语言为英语(English)。你可以将其更改为其他语言代码,例如 zh-CN 代表简体中文。
        • scisbd=1:这是一个过滤器,它将结果限制在过去一年内发表的论文,并按日期排序。
        • as_sdt=0,5:这是一个更复杂的过滤器。0 通常表示不包括专利,而 7 表示包括专利。

      2. 附加功能

      • 支持定制不同「关键词」,替换 orthopedics;
      • 支持对数据来源网站列表做 CRUD。

      (三)VPS、n8n 及其工具 API key

      1. 一台崭新的 VPS

      • VPS 一是部署 n8n 和邮件服务等后端程序,二是后续时间充沛可以自己完成网页解析,脱离 n8n。
      notion image

      2. n8n+后端服务

      • n8n 文档
      n8n_ion8n_ion8n.io - AI workflow automation tool
      欢迎来到 n8n 中文教程 | 简单易懂的现代魔法 - n8n 中文使用教程欢迎来到 n8n 中文教程 | 简单易懂的现代魔法 - n8n 中文使用教程欢迎来到 n8n 中文教程 | 简单易懂的现代魔法 - n8n 中文使用教程
      • 需配置密钥的服务
      Firecrawl - The Web Data API for AIFirecrawl - The Web Data API for AIFirecrawl - The Web Data API for AI
      首次调用 API | DeepSeek API Docs
      PostgreSQLPostgreSQLPostgreSQL

      三、开始构建

      (一)n8n 定时提取网页中数据

      1. 定时任务触发

      • 新建一个工作流,修改该工作流设置中的时区,并添加定时任务触发节点作为起始点——如上海时间每天早上八点,激活后此工作流将定时开始运行。
        • notion image
          notion image

      2. Firecrawl 抓取目标网页内容

      • n8n 中的 Firecrawl 有七种功能(20250904),因为之前已经准备了带查询参数的目标网页 URL,所以直接开始用 【Scrape a url and get its content】 即可。
        • notion image
        • Search and optionally scrape search results (搜索并抓取搜索结果)
          • 功能: 在搜索引擎上执行搜索,并可以选择性地抓取搜索结果页面上的数据。
          • 适用场景: 需要从搜索引擎结果中快速收集信息,比如进行市场调研、关键词分析或监控竞争对手的排名。
        • Map a website and get urls (映射网站并获取 URL)
          • 功能: 扫描一个网站并生成一个完整的URL列表,就像创建一张网站地图。
          • 适用场景: 在进行网站审计、SEO分析时非常有用,可以快速了解网站的整体结构和所有页面。
        • Scrape a url and get its content (抓取 URL 并获取内容)
          • 功能: 抓取单个网页的内容,并将其转换为结构化的数据,如文本或Markdown。
          • 适用场景: 从单个网页上提取特定信息,例如获取一篇博客文章、一个产品描述或一个新闻报道的内容。
        • Crawl a website (爬取网站)
          • 功能: 递归地抓取整个网站,自动跟随链接,获取多个页面上的数据。
          • 适用场景: 当你需要从整个网站上收集大量数据时,比如建立一个内容数据库、进行大规模的数据分析或创建自己的搜索引擎索引。
        • Get crawl status (获取爬取状态)
          • 功能: 查看正在进行的网站爬取任务的进度和状态。
          • 适用场景: 监控大型爬取任务,确保任务顺利进行,并在出现错误时及时排查。
        • Extract Data (提取数据)
          • 功能: 从爬取到的内容中提取特定类型的数据,通常需要定义好数据的提取规则。
          • 适用场景: 从非结构化的文本中提取结构化信息,比如从产品页面中提取价格、名称和评论,或从简历中提取联系方式和工作经历。
        • Get Extract Status (获取提取状态)
          • 功能: 检查数据提取任务的进度和结果。
          • 适用场景: 监控数据提取过程,确保所有目标数据都被正确地提取出来。
      • 测试直接抓取,成功返回数据。
        • notion image
      • 使用 Agent 提取数据并整理为需要的格式。
        • notion image

      (二)n8n 向数据库保存结构化数据

      1. 初始化数据表

      • 原生 sql 实现
        • 例如创建一个记录用户查看详情页、点击退订时需要携带的 token 的表:
      • ORM 实现
        • 例如创建一个 django 项目,连接远程 postgreSQL 数据库并使用 models 完成迁移与合并:

      2. 连接、查看数据表

      • 确认创建成功
        • 在 postgreSQL 中可以查到,就可以开始用 n8n 插入要存储的数据了。
          notion image
          notion image

      3. 把 Agent 输出的邮件内容持久化存储到 postgreSQL 数据库

      • 根据文本哈希值去重,避免重复新增相同内容
      • 保存
        • notion image

      (三)腾讯云邮件推送服务接口开发与部署

      • 使用 FastAPI 调用腾讯云邮件推送服务
        • SMTP 直接发送
        • n8n 通过 HTTP 节点调用 FastAPI 推送邮件
          • notion image
         
        Cloudflare R2+Workers 实现对象存储基于 NotionNext 建站(序)
        Loading...