Obsidian Save Article

Polar Sponsor
爱发电 赞助
.NET 9.0

保存网页文章到本地 Obsidian Vault,含图片抓取、Markdown 转换、YAML frontmatter 和笔记附加。

Obsidian Save Article

功能概述

Obsidian Save Article是一项面向实际任务的技能,主要用于将网页文章保存到本地 Obsidian Vault,支持图片抓取;当用户发送:;

核心要点

  • 一个网页链接;
  • 可选的 notes 或 comments;
  • 明确要求"保存到 Obsidian"或"收藏文章";

使用与执行

帮我保存这个:https://xxx.com 内容:我的笔记;首次使用:路径配置;第一次运行时的引导流程;首次使用该技能时,系统会自动检测是否已配置保。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

结果检查与注意事项

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

Obsidian Save Article

将网页文章保存到本地 Obsidian Vault,支持图片抓取。

触发方式

当用户发送:

  • 一个网页链接
  • 可选的 notes 或 comments
  • 明确要求"保存到 Obsidian"或"收藏文章"

例如:

  • https://example.com/article 这篇文章不错
  • 帮我保存这个:https://xxx.com 内容:我的笔记

首次使用:路径配置

第一次运行时的引导流程

首次使用该技能时,系统会自动检测是否已配置保存路径。如果没有配置,会引导用户完成设置:

🔷 欢迎使用 Obsidian 文章保存功能!

请选择您要保存到的 Obsidian Vault 类型:

1️⃣ 本地 Obsidian(本地磁盘)
2️⃣ iCloud Obsidian(云端同步)

请回复数字或选项名称。

选项 1:本地 Obsidian

如果用户选择本地 Vault:

📂 请告诉我您的 Obsidian Vault 路径。

例如:~/Documents/Obsidian Vault

或者直接拖拽文件夹到聊天窗口,我会自动识别路径。

用户输入路径后,验证路径有效性:

✅ 找到 Vault:My Notes
   路径:/Users/liz/Documents/Obsidian Vault/My Notes

📁 请输入要保存文章的子文件夹名称(可选)。

例如:Articles、ReadLater、收藏夹
直接回车将保存到根目录。

选项 2:iCloud Obsidian

如果用户选择 iCloud Vault:

☁️ iCloud Obsidian 路径查找指南:

1. 打开 Finder
2. 在左侧边栏找到 "iCloud"
3. 点击 "iCloud Drive"
4. 找到您的 Obsidian Vault 文件夹
5. 右键点击 → "复制路径"

请将路径粘贴到聊天中。

用户输入 iCloud 路径后,类似本地流程询问子文件夹。

路径配置存储

配置完成后,路径信息会保存在:

~/.obsidian-save-article-config.json

内容示例:

{
  "type": "local",
  "vault_path": "/Users/liz/Documents/Obsidian Vault/My Notes",
  "subfolder": "Articles",
  "full_path": "/Users/liz/Documents/Obsidian Vault/My Notes/Articles",
  "configured": true,
  "configured_at": "2026-03-18T01:00:00Z"
}

重新配置路径

用户可以随时重新配置路径:

  • 说"更改 Obsidian 保存路径"或"重新配置"
  • 说"查看当前保存路径"查看配置

保存格式

YAML Frontmatter

---
title: "文章标题"
url: "原始链接"
created: "YYYY/MM/DD"
pagecomment: "用户添加的页面评论"
---

全文内容

重要:图片必须放在 Full Article callout 内部,位于内容之前!

> [!note]- 📄 Full Article
> ![](images/img-xxxxxx.png)
> ![](images/img-yyyyyy.png)
> 文章第一段内容...
> 文章第二段内容...

错误格式(图片在 callout 外部):

> ![](images/img-xxxxxx.png)  ← 错误!在 callout 外面
> [!note]- 📄 Full Article
> 文章内容...

正确格式(图片在 callout 内部):

> [!note]- 📄 Full Article  ← callout 头部先
> ![](images/img-xxxxxx.png)  ← 图片在 callout 内部
> 文章第一段内容...
> 文章第二段内容...

用户 Notes

> 用户笔记内容
^note-xxx

内容抓取方法

该技能支持两种内容抓取方法,系统会自动选择最合适的方式。

方法 1:Jina.ai Reader(首选)

  • 原理:使用 https://r.jina.ai/ 抓取网页内容
  • 优点:快速、返回干净的 Markdown 格式
  • 适用:大多数网站、博客、新闻文章

方法 2:Browser 工具(Fallback)

当 Jina.ai 失败时,自动使用浏览器工具抓取内容。

触发条件:

  • Jina.ai 返回错误
  • Jina.ai 返回空内容或无效内容
  • 连接超时
  • 网站阻止 Jina.ai 访问(如微信公众号文章、付费内容)

操作步骤:

  1. 使用 browser 工具打开目标 URL
  2. 获取页面快照(snapshot)
  3. 提取页面文本内容
  4. 清理和格式化内容

Browser 工具调用示例

# Step 1: 打开页面
browser(action="open", url="https://example.com/article")

# Step 2: 获取快照(使用 aria 模式获取结构化内容)
browser(action="snapshot", snapshotFormat="aria")

# Step 3: 提取文本内容并清理

内容清理规则

从浏览器获取内容后,需要进行清理:

  • 移除导航栏、页脚、广告等无关内容
  • 保留文章标题和正文
  • 转换 HTML 标签为 Markdown 格式
  • 处理特殊字符和编码问题

工作流程

带路径配置的工作流程

  1. 检查配置:读取 ~/.obsidian-save-article-config.json

    • 如果未配置 → 触发首次配置流程(见上文)
    • 如果已配置 → 继续第 2 步
  2. 解析输入:提取 URL 和用户 notes

  3. 抓取内容:

    • Step 1:优先使用 Jina.ai Reader (https://r.jina.ai/)
    • Step 2 (Fallback):如果 Jina.ai 失败,使用 browser 工具:
      • 执行 browser action=open url="" 打开页面
      • 执行 browser action=snapshot 获取页面内容
      • 提取文本并清理格式
    • Step 3:继续图片提取和保存流程
  4. 提取图片:从 HTML 中提取正文图片

  5. 下载图片:调用 download_images.py 保存到配置的 Vault 的 images/ 目录

  6. 转换 Markdown:将图片路径转为本地相对路径

  7. 构建文件:

    • Frontmatter(标题、URL、日期、评论)
    • Full Article callout(图片在前,内容在后)
    • 用户 notes
  8. 保存文件:写入配置的 Vault 路径

路径配置检测逻辑

import os
import json

CONFIG_PATH = os.path.expanduser("~/.obsidian-save-article-config.json")

def load_config():
    """加载配置文件,如果不存在返回 None"""
    if os.path.exists(CONFIG_PATH):
        with open(CONFIG_PATH, 'r') as f:
            return json.load(f)
    return None

def save_config(config):
    """保存配置到文件"""
    with open(CONFIG_PATH, 'w') as f:
        json.dump(config, f, indent=2)

def get_save_path():
    """获取当前配置的保存路径"""
    config = load_config()
    if config and config.get("configured"):
        return config.get("full_path")
    return None

图片下载脚本

调用方式

python ~/.openclaw/workspace/skills/obsidian-save-article/scripts/download_images.py "" ""

参数说明:

  • :要抓取的网页 URL
  • :Obsidian Vault 的路径(脚本会自动在此创建 images/ 子目录)

示例:

# 保存到本地 Vault 的 Articles 文件夹
python ~/.openclaw/workspace/skills/obsidian-save-article/scripts/download_images.py 
  "https://example.com/article" 
  "~/Documents/Obsidian Vault/My Notes/Articles"

# 保存到 iCloud Vault 的 ReadLater 文件夹
python ~/.openclaw/workspace/skills/obsidian-save-article/scripts/download_images.py 
  "https://example.com/article" 
  "~/Library/Mobile Documents/iCloud~com~obsidian~md/Documents/我的 Vault/ReadLater"

返回结果

脚本返回 JSON:

{
  "html": "原始 HTML",
  "images": [["original_url", "local_filename"]],
  "markdown": "转换后的 Markdown"
}

图片处理规则

  • 支持格式:jpg、jpeg、png、gif、webp、svg、bmp
  • 跳过 data:、javascript:、base64 小图
  • 使用 URL 的 MD5 前 12 位作为本地文件名
  • Markdown 中使用相对路径 images/img-xxxx.png

常见问题

Q: 如何查看当前保存路径?

A: 说"查看保存路径"或"我的 Obsidian 配置"

Q: 如何更改保存位置?

A: 说"更改保存路径"或"重新配置"来重新设置

Q: iCloud 路径找不到怎么办?

A:

  1. 确保 macOS 已登录 iCloud
  2. 打开 Finder → iCloud Drive
  3. 找到 Obsidian 文件夹,右键"复制路径"

Q: 图片下载失败怎么办?

A: 文章仍会保存,只是图片位置会保留原始 URL。不影响主要功能。

Q: 什么情况下会使用浏览器抓取?

A: 系统会自动判断。当 Jina.ai 无法使用时,会自动切换到浏览器方式:

  • 微信公众号文章
  • 需要登录的内容
  • 阻止爬虫的网站
  • 返回空内容的页面

Q: 两种抓取方式有什么区别?

A:

特性 Jina.ai Reader Browser 工具
速度 快 较慢
格式 干净 Markdown 需要清理
适用 大多数网站 复杂页面
登录 不支持 可支持

注意事项

  • Jina.ai Reader URL 格式:https://r.jina.ai/<原始URL>
  • X 链接使用:https://r.jina.ai/https://x.com/...
  • 当 Jina.ai 失败时,自动使用 browser 工具作为后备方案
  • 微信公众号文章通常需要使用 browser 工具抓取
  • 图片下载失败不应阻断文章保存
  • 文件名中的特殊字符 <>:"|?* 需要替换
  • 页面正文超过 50000 字符时应截断

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

0

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

0

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习