链接抓取工作流:一键保存网页到 Obsidian

链接抓取工作流:一键保存网页到 Obsidian
看到一篇好文章,想存到 Obsidian 里。传统做法:
- 复制链接
- 打开浏览器阅读模式
- 全选复制
- 粘贴到 Obsidian
- 手动加标题、来源、标签
- 发现格式乱了,手动修
太累了。而且英文文章还得另开翻译软件。
后来写了个工具:给它一个链接,它自动抓正文、AI 生成摘要、英文逐段翻译、保存到 Obsidian、回链到今天的 Daily Note。一条命令搞定。
效果展示
# 抓取一篇英文文章
bun tools/link-capture.ts --url "<REDACTED_URL>"
生成的 Obsidian 笔记:
---
source_url: "<REDACTED_URL>"
source_host: "example.com"
captured_at: "2026-02-08T10:30:00Z"
source_language: "en"
daily_note: "[2026-02-08](/2026-02-08)"
tags: ["link-clip", "技术"]
---
# Article Title
> [!abstract] 中文摘要
> 这篇文章介绍了 xxx,核心观点是 yyy,作者认为 zzz。
> [!info] 来源
> [example.com](<REDACTED_URL>) · 2026-02-08
---
## Introduction
**EN:** The quick brown fox jumps over the lazy dog...
**ZH:** 敏捷的棕色狐狸跳过了懒狗...
---
## Main Content
**EN:** Lorem ipsum dolor sit amet...
**ZH:** 这是正文内容的翻译...
特点:
- 自动识别语言,英文文章逐段翻译
- AI 生成中文摘要(放在 callout 里,醒目)
- 自动回链到 Daily Note
快速开始
1. 克隆工具
cd ~/your-project
# 工具在 tools/link-capture.ts
2. 配置环境变量
export AI_API_KEY="sk-..."
export AI_BASE_URL="<REDACTED_URL>" # 或你的 API 地址
3. 运行
# 抓取并保存到 Obsidian
bun tools/link-capture.ts --url "<REDACTED_URL>"
# 只抓取不保存
bun tools/link-capture.ts --url "<REDACTED_URL>" --no-save
# 指定输出目录
bun tools/link-capture.ts --url "<REDACTED_URL>" --output-dir "~/Obsidian/Clips"
技术架构
工作流分四层:
1. 抓取层:Jina Reader → 失败则回退 Playwriter(浏览器抓取)
2. 理解层:AI 分析语言、生成摘要、提取关键词
3. 翻译层:英文内容逐段翻译(EN/ZH 配对)
4. 落盘层:写入 Obsidian + 回链 Daily Note
为什么用 Jina Reader
直接用 fetch 抓网页有很多问题:
- JavaScript 渲染的内容抓不到
- 反爬机制(Cloudflare、登录墙)
- 提取正文要自己写 parser
Jina Reader(<REDACTED_URL>)帮你解决这些:
- 自动渲染 JavaScript
- 绕过部分反爬
- 返回干净的 Markdown 正文
免费额度够个人用。
回退到 Playwriter
有些网站 Jina 也抓不了,这时用 Playwriter(本地浏览器自动化):
bun tools/link-capture.ts --url "<REDACTED_URL>" --force-playwriter
Playwriter 用真实的 Chrome 浏览器,能抓任何你能看到的内容。
AI 摘要 Prompt
const prompt = `分析这篇文章,返回 JSON:
{
"language": "en" 或 "zh",
"summary": "2-3 句中文摘要",
"keywords": ["关键词1", "关键词2"]
}
文章内容:
${content.slice(0, 4000)}`;
用最便宜的模型就行,gpt-4o-mini 或 gemini-2.5-flash-lite。
逐段翻译
如果检测到英文,会把文章按段落拆分,每段都翻译:
## Section Title
**EN:** Original English paragraph...
**ZH:** 中文翻译...
这样保留了原文,方便对照学习。
Obsidian 结构
笔记保存到:~/Documents/Obsidian/Vault/20 Sources/Link Clips/
frontmatter 包含:
| 字段 | 说明 |
|---|---|
| source_url | 原始链接 |
| source_host | 域名 |
| captured_at | 抓取时间 |
| source_language | 语言(en/zh) |
| daily_note | 回链到 Daily Note |
| tags | 自动生成的标签 |
配套 Obsidian Bases 视图可以按时间、来源、标签筛选。
我踩过的坑
1. Jina 有些网站抓不到
Substack 的部分文章、Medium 的付费墙、Twitter/X 都不行。这时用 Playwriter 回退。
2. 翻译太长会超 token
一篇 5000 字的英文文章,加上翻译输出,token 很容易爆。解决:按段落分批翻译,每次 2-3 段。
3. 格式不一致
有些网站的正文混杂广告、推荐链接。Jina 大部分能过滤,但偶尔会漏。实在不行手动删一下。
进阶:和 Daily Note 联动
抓取后自动在今天的 Daily Note 里加一条:
## 今日阅读
- <span class="private-link" title="未发布的笔记">Link Clips/Article Title</span>
这样回顾一天干了什么,链接抓取也会出现。
对比其他方案
| 方案 | 优点 | 缺点 |
|---|---|---|
| 本方案 | 一键完成、AI 摘要、逐段翻译 | 需要配置 |
| Obsidian Web Clipper | 官方插件、简单 | 没有翻译、摘要要自己写 |
| Readwise | 功能全、同步多端 | 收费、数据在云端 |
| 手动复制粘贴 | 不用配置 | 累、格式乱 |
附录:Claude Code Skill 配置
最重要的交付物:复制下面的内容到 .claude/skills/link-capture/SKILL.md,然后你就可以用自然语言让 AI 帮你抓链接了。
---
name: link-capture
description: "抓取网页正文,AI 生成摘要,英文逐段翻译,保存到 Obsidian。触发词:抓链接、保存网页、翻译文章、落盘 Obsidian"
---
# 链接抓取工作流
## 功能
给一个 URL,自动抓取正文、生成中文摘要、英文文章逐段翻译、保存到 Obsidian 并回链 Daily Note。
## 使用方式
直接用自然语言触发:
- "帮我抓一下这个链接 https://..."
- "保存这篇文章到 Obsidian"
- "翻译并保存 https://..."
- "抓取这个英文文章,要翻译"
## 依赖
- Jina Reader API(免费,用于抓取网页正文)
- OpenAI 兼容 API(用于摘要和翻译)
- Playwriter(可选,Jina 失败时的回退方案)
## 配置
环境变量:
- AI_API_KEY: OpenAI 兼容 API 密钥
- AI_BASE_URL: API 地址(默认 <REDACTED_URL>)
- OUTPUT_DIR: Obsidian vault 路径
## 核心逻辑
1. 用 Jina Reader 抓取正文:`<REDACTED_URL>`
2. 失败则回退 Playwriter(本地浏览器自动化)
3. AI 分析:检测语言、生成中文摘要、提取关键词
4. 如果是英文,按段落翻译(EN/ZH 配对格式)
5. 生成 Obsidian Markdown(frontmatter + callout 摘要 + 正文)
6. 保存到 Obsidian vault,回链到今天的 Daily Note
## 示例
输入:"帮我抓一下 https://example.com/good-article"
输出:在 Obsidian 生成笔记,包含:
- 中文摘要(callout 格式)
- 原文(英文则带逐段翻译)
- 自动回链到 Daily Note
附录:给 AI 的复现指令
帮我搭建一个链接抓取工具,要求抓取网页正文、AI 生成中文摘要、英文逐段翻译、保存到 Obsidian。
目标:输入 URL,输出格式化的 Obsidian 笔记。
技术栈:Bun + TypeScript
项目结构:
tools/
├── link-capture.ts # 主入口
└── lib/
├── fetcher.ts # 抓取层(Jina + Playwriter 回退)
├── analyzer.ts # AI 分析(语言检测、摘要、关键词)
├── translator.ts # 逐段翻译
└── saver.ts # Obsidian 落盘
核心逻辑:
1. 用 Jina Reader 抓取正文:fetch(`<REDACTED_URL>`)
2. 失败则回退 Playwriter(本地浏览器)
3. AI 分析:检测语言、生成摘要、提取关键词
4. 如果是英文,按段落翻译(EN/ZH 配对)
5. 生成 Obsidian Markdown:frontmatter + callout 摘要 + 正文
6. 保存到指定目录,并回链到 Daily Note
环境变量:
- AI_API_KEY: OpenAI 兼容 API 密钥
- AI_BASE_URL: API 地址
- OUTPUT_DIR: Obsidian vault 路径
命令行参数:
--url <url> 必须,要抓取的链接
--no-save 只输出不保存
--output-dir <path> 指定输出目录
--force-playwriter 强制使用浏览器抓取
成功标志:Obsidian vault 里出现新笔记,包含中文摘要和翻译