网页高清图 → Eagle 采集与打标(通用版)
把任意网页的高清图片采集进用户的 Eagle,并按「用户自己的 Eagle 标签库」打标。
本技能不依赖任何个人机器路径:Eagle 库路径在运行时自动探测,标签白名单来自
用户库本身的 tagsGroups,目标文件夹由用户指定(不存在则自动创建)。
适用网址范围:不限于特定平台。油猴脚本(见「推荐采集方式」)可在所有网页 上存高清图,已实测可用的站点包括:国内主流图文社区笔记页、微信公众号文章、ArchDaily 等 建筑图库、以及各类普通网页(国内站点居多)。只要页面上有
<img>,基本都能抓。
何时使用
- 用户在任意网页(最常见是国内主流图文社区的笔记页,如
example.com/notes/...或example.com/explore/...)浏览,想顺手把高清图存进 Eagle —— 用油猴脚本最省事。 - 用户发来一个国内主流图文社区笔记链接,要求把图片下载并自动打标存进 Eagle —— 用 skill 固定流程(已验证)。
- 用户发来任意国内/国外网页链接(如
https://某设计博客/一篇有图的文章),要求把高清图下到 Eagle、按来源分文件夹、打标签—— 用web子命令一条龙(见「方式二」)。 - 用户发来一个 Instagram 帖子链接(
instagram.com/p/...或instagram.com/reel/...), 要求把图片存进 Eagle(通常放进名为「ins」的文件夹)—— 油猴脚本可存图,但整条自动流程尚未验证。 - 用户要求「按我的标签库打标 / 不新增标签」。
- 这是一个可复用的固定流程:链接 → 下载 → 识别打标 → 导入 Eagle(国内主流图文社区已全链路验证;
web命令已泛化到任意网页)。 - 平台自动识别:
fetch按链接域名走国内主流图文社区/Instagram 分支;web则抓取任意网页,用户直接贴链接即可。
支持范围与验证状态
| 采集方式 | 支持站点 | 高清图 | 自动打标 | 整条流程验证状态 |
|----------|----------|--------|----------|------------------|
| 油猴脚本(Tampermonkey) | 所有网页(任意含 <img> 的页面) | ✅ 自动升级(ArchDaily medium_jpg→large_jpg、去缩略图参数等) + 过滤小图/banner/导栏/黑名单 | 存图时已把每张图的上下文写进备注;之后跑 tag-eagle 会按备注里的上下文逐图差异化打标 | ✅ 存图已实测:国内主流图文社区 / ArchDaily / 普通网页 |
| skill Python 固定流程 | 国内主流图文社区(主)、Instagram(分支) | 取决于源站直链 | ✅ tag 启发式 + tag-eagle | ✅ 国内主流图文社区已完整跑通;⚠️ Instagram 分支未做完整闭环验证 |
| web 命令(直接发链接给我) | 任意网页(国内站点为主,含被墙国外站走代理) | ✅ 通用高清化 + 过滤(微信 mmbiz→原图、ArchDaily→large_jpg、Unsplash→2400px;自动过滤 banner/导栏/图标/tracking pixel) | ✅ 一条龙:fetch→按来源站点进文件夹→逐图文字识别打标 | ✅ 已实测整条闭环:微信公众号(微信文章) → 有效高清图进「微信公众号」文件夹 → 按每张图周边文字上下文逐图差异化打标(封面/分析图/室内各得不同标签) |
| tag-eagle 打标 | 任意已入库 item(不限平台) | — | ✅ 批量加标签 | ✅ 通用可用 |
关键说明:
- 油猴脚本的「网址范围」最宽——国内各类站点(国内主流图文社区、微信公众号、建筑图库、电商、普通博客等)的高清图都能存,不挑平台。
- 文件夹命名与油猴脚本保持一致:Instagram →
ins,国内主流图文社区 →xhs,微信公众号 →微信公众号,其它站点用域名(如archdaily.com)。避免出现「微信公众号」和mp.weixin.qq.com两个同名不同来源的文件夹。 - web 命令已过滤常见无效图:尺寸过小(<400px 短边)、比例过宽(>1.8 的 banner/导栏条)、文件过小(<5KB 的 tracking pixel / 0x0 gif)以及 URL/文件名含广告/分享/二维码等关键词的图片会被自动跳过。
- 打标已差异化(逐图文字识别):同一篇文章的多张图不再套同一组标签。
web抓取和油猴脚本都会在每张图入库时把周边文字上下文(alt/标题/图注/前后段落)写进备注;tag-eagle读取备注后,会先聚合算出「全篇主题标签」,再按每张图自己的上下文算出「本地标签」,最终标签 = 全篇主题(前 2) + 单图本地命中。尺寸比例构图线索仍作为备注补充信号保留(鸟瞰全景/室内表现/平面总图)。 - 整条 skill 流程(采集 + 自动打标)目前「国内主流图文社区」和「微信公众号」已完整跑通验证。Instagram 用 Tampermonkey 那套只验证了「能存图」,自动抓取 + 轮播打标的完整闭环尚未验证跑通——遇到 Instagram 需求时优先用油猴脚本存图,再
tag-eagle打标。
前置条件
- Eagle 正在运行,且当前打开的就是目标库(技能通过 Eagle 本地 API
端口
41595通信,并从其Settings自动定位库路径)。 - 国内主流图文社区:网络可访问该社区域名。未登录态往往被反爬拦截——抓不到图时,
让用户提供浏览器登录 Cookie(传给
fetch --cookie),或改用 Eagle 官方 浏览器插件把图收进库后再用本流程打标。 - Instagram(两种模式,越简单越好):
- 极简模式(推荐,零配置):直接把 Instagram 帖子链接发来即可。
fetch会先走 Instagram 公开的 oEmbed 接口(instagram.com/oembed,无需任何登录 Cookie) 拿到帖子封面图并下载进 Eagle。适合「只发链接就存图」的场景。 - 完整模式(需一次 Cookie):若你想要全部轮播图 + 自动打标,提供一次登录
Cookie(浏览器 F12 → Network → 对能打开帖子的
bz?__a=1请求右键 → Copy as cURL (bash) →fetch <URL> --cookie-curl "<整段cURL>")。Cookie 会缓存到本地~/.workbuddy/ins_cookie.txt,之后只发链接即可走完整模式。 - Instagram 在国内通常被墙,
fetch会自动探测本机常见代理端口(如 7897/7890/1080)走代理;若你的代理不在这些端口,用fetch --proxy "http://127.0.0.1:端口"显式指定。
- 极简模式(推荐,零配置):直接把 Instagram 帖子链接发来即可。
- 用户的 Eagle 库里最好已有一套标签库(
tagsGroups非空),作为打标白名单。
推荐采集方式:浏览器一键存图脚本(零 Cookie / 零代理)
技能自带一个 Tampermonkey 油猴脚本 references/eagle-quick-save.user.js,是最省事、
最稳的采集方式——不用折腾 Instagram 登录 Cookie、不用管本机代理、不怕反爬,因为取图
用的是你浏览器里已登录的会话:
- 装油猴扩展:浏览器安装 Tampermonkey。
- 新建脚本 → 全选 → 把技能目录里
references/eagle-quick-save.user.js的内容粘进去 → 保存(脚本已验证可在 Instagram 帖子页解析出全部轮播高清原图,并复用已有的同名文件夹)。 - 打开要收藏的页面(任意网站都行:Instagram 帖子 / 国内主流图文社区笔记 / 微信公众号文章 / 普通网页)。
- 点页面右下角「存到 Eagle」按钮 → 先弹出图片预览面板,每张图带勾选框(默认全勾):
只勾选你想保存的图,点「保存到 Eagle」才存;支持「全选 / 全不选」,点面板外或 ✕ 取消。
图片进对应文件夹:Instagram →
ins,国内主流图文社区 →xhs,微信公众号 →微信公众号, 其它网站 → 用域名作文件夹名(如example.com)。 文件夹已存在则复用(不再重复新建)。 Instagram 只解析「当前这一个帖子」的图(不混推荐帖);其它网站抓取整页所有可保存的图片(自动过滤图标/头像/logo)。 对 ArchDaily 等建筑图库,脚本会把medium_jpg/small_jpg/thumb_jpg自动升级为large_jpg(2000px 级别高清),无_jpg后缀的旧路径则升级为slideshow,和 Eagle 官方扩展右键存图效果一致。 - 收集完后,用
tag-eagle给该文件夹一键打标(见下)。
脚本未启用时不影响技能任何其它功能。若你更习惯 Eagle 官方浏览器插件,也可以直接用 它把图拖进库(按域名自动分文件夹),后续打标流程完全一样。Instagram 帖子页用油猴脚本存图已可用,但「抓取 + 自动轮播打标」的完整 skill 流程尚未验证跑通,故 Instagram 场景建议走「油猴存图 → tag-eagle 打标」两段式。
方式二:直接发链接给我(WorkBuddy 侧 Python 通用网页抓取)
不想装油猴、或想让我自动批处理时,直接把任意网页链接发来即可。技能用 web 子命令
在 WorkBuddy 侧抓图,整条流程一条龙:高清下载 → 按来源域名进 Eagle 文件夹 → 启发式打标。
- 网址范围:不限平台,国内各类站点(国内主流图文社区 / 微信公众号 / 建筑图库 / 电商 / 普通博客等)都能抓;
国外站点(Instagram / ArchDaily 等)也能抓,被墙时加
--proxy http://127.0.0.1:7897。 - 高清处理:自动去缩略图尺寸后缀 / 放大宽度参数;微信
mmbiz→原图、ArchDaily 缩略图升级为large_jpg、 Unsplash 升级为 2400px。 - 过滤无效图:自动跳过 banner/导栏/tracking pixel/小图标(尺寸 <400px 短边、宽高比 >1.8、文件 <5KB、0x0 小 gif、URL/文件名含广告/分享/二维码等关键词)。
- 按来源分文件夹:文件夹名与油猴脚本一致——Instagram→
ins、国内主流图文社区→国内主流图文社区、微信公众号→微信公众号,其它站点用域名(如example.com),已存在则复用。 - 差异化打标(逐图文字识别):不再所有图套同一组标签。
web抓页面时会按文档顺序提取每张图的周边文字上下文(最近小标题、alt/title、图注figcaption、前后段落文字),用轻量中文关键词提取(优先 jieba,缺失则 CJK n-gram 兜底)抽出「内容线索」写入备注;打标时每张图独立算标签 = 全篇主题标签(前 2) + 该图本地文字命中的标签。实测同一篇微信文章里封面图、建筑体量分析图、室内空间图各自得到不同标签(原先仅靠尺寸比例猜构图,现升级为按文章文字识别)。
命令:
python <skill>/scripts/xhs_to_eagle.py web "https://国内某网站/一篇有图的文章" \
[--proxy http://127.0.0.1:7897] [--apply] [--min-size 400]
- 默认先预览打标结果(不写 Eagle);确认无误加
--apply真正写入标签。 - 只下载不导入加
--no-import;导入后不打标加--no-tag(之后手动tag-eagle --folder <域名> --apply)。 - 整条流程需要 Eagle 正在运行(下载 / 导入 / 打标三步都依赖本地 API 41595),且库里有标签库作白名单。
这是「固定流程」(
fetch→import→tag→verify)的任意网页通用版:fetch只认 国内主流图文社区 / Instagram,web则能抓任意网页。两者底层共用同一套高清化与按域名分文件夹逻辑。
收集完后用 tag-eagle 打标
无论用上面的油猴脚本还是 Eagle 官方插件,图进库后都统一用 tag-eagle 打标:
python <skill>/scripts/xhs_to_eagle.py tag-eagle --folder ins --dry-run
- 默认预览:打印每个 item 的候选标签,不改动 Eagle。
- 确认无误后加
--apply真正写入:python <skill>/scripts/xhs_to_eagle.py tag-eagle --folder ins --apply - 建筑类 / 英文文案等内置同义词覆盖不到的内容,加
--synonyms <同义词.json>:python <skill>/scripts/xhs_to_eagle.py tag-eagle --folder ins \ --synonyms "C:/Users/hj/WorkBuddy/煎鸡蛋-0803/tmp_ig_demo/building_synonyms.json" --apply - 已存在于 item 上的标签会自动跳过(不会重复),可放心反复跑。
文本来源 = item 名称 + 来源 URL + 备注(annotation);#话题 也会作为信号。
标签白名单仍是用户 Eagle 库本身的 tagsGroups。
这条路的「采集」交给油猴脚本(它用你的浏览器登录态处理反爬),skill 只负责「打标」, 因此最稳。下面「固定流程」是给没装脚本、想全自动抓取的备选方案。
固定流程
步骤 0:确认环境与目标
- 运行
detect确认能定位 Eagle 库:
若返回空,说明 Eagle 没运行过 / 路径探测失败,提示用户先启动 Eagle,或 在后续python <skill>/scripts/xhs_to_eagle.py detectimport时显式传--lib <库路径>。 - 询问用户两件事(若对话中已明确可跳过):
- 目标文件夹:名称或 folderId(国内主流图文社区默认建议「xhs」,Instagram 默认建议「ins」, 不存在会自动创建)。
- 标签规则:默认用用户库自带标签库;如需限定范围也可口头说明。
- 用
folders/tags列出当前库的文件夹与标签白名单,方便确认与后续匹配:python <skill>/scripts/xhs_to_eagle.py folders python <skill>/scripts/xhs_to_eagle.py tags
步骤 1:抓取并下载图片
python <skill>/scripts/xhs_to_eagle.py fetch "<笔记URL>" --out <临时目录> [--cookie "<Cookie>"] [--proxy "http://127.0.0.1:端口"]
- 自动识别平台:链接含
instagram.com走 Instagram 分支,否则走国内主流图文社区分支。 - 国内主流图文社区:从
__INITIAL_STATE__与正文提取图片直链,严格过滤 JS/CSS、头像、 视频缩略图等站点资源,只保留真实图片。 - Instagram:解析帖子内嵌 JSON(
window.__additionalDataLoaded或?__a=1接口), 抽取单图display_url与轮播edge_sidecar_to_children的全部图片,并提取 文案与#话题作为打标文本信号。Instagram 必须带登录 Cookie(见前置条件)。 - 下载到
<临时目录>,并写出manifest.json(含图片清单、标题、文案、话题、来源 URL、作者)。 - 图片按
img_00.jpg, img_01.jpg …命名。 - 若 0 张图片下载成功,脚本会明确报错并给出方案(传
--cookie/ 用 Eagle 插件), 不要静默继续。
步骤 2:打标(二选一)
方案 A(推荐,不依赖视觉、可解释、可复核):启发式打标
- 运行
tag子命令,脚本用笔记的标题/正文/话题词与白名单做匹配,并打出每个标签的命中证据:python <skill>/scripts/xhs_to_eagle.py tag --out <临时目录> [--whitelist <白名单.json>] [--dry-run] - 默认从用户 Eagle 库读白名单;传
--whitelist可不依赖 Eagle 运行(适合没启动 Eagle 时先打草稿)。 --top 5控制最多标签数,--threshold 1控制最低命中分数,--no-synonyms关闭内置同义词,--synonyms <file>自定义同义词表。- 命中结果按 score 降序打印(标题命中=3 / 话题=2 / 正文=1),低于阈值的标签直接丢弃。
- 确认无误后去掉
--dry-run写入tags.json。这是按整篇笔记打的候选集,每张图套用同一组标签;如需逐图差异,可手动编辑tags.json。
方案 B(视觉识别):AI 逐张识别
- 用多模态能力逐张读取
<临时目录>/img_*.jpg,从白名单挑 2–5 个标签,写入tags.json。 - 绝不使用白名单之外的标签(用户要求「不新增标签」)。
步骤 3:导入 Eagle
python <skill>/scripts/xhs_to_eagle.py import \
--folder "<文件夹名或ID>" --out <临时目录> [--name-prefix "<备注>"]
- 自动把文件夹名解析为 folderId(不存在则调用 Eagle API 创建)。
- 逐张调用
POST /api/item/addFromPath,带上tags、website(笔记 URL)、name(<备注或笔记标题>-<序号>)、folderId。 - 导入前会再次过滤掉
tags.json中任何不在白名单的标签(兜底)。 - 导入结果写入
<临时目录>/imported.json(含每张的 item id 与最终标签)。 - 建议先加
--dry-run预览将要执行的导入,确认无误后再正式导入。
步骤 4:校验
python <skill>/scripts/xhs_to_eagle.py verify --out <临时目录>
- 读取
imported.json中每个 item id,回查其metadata.json的tags, 与导入时一致则打印OK,否则MISMATCH。
脚本参考(<skill>/scripts/xhs_to_eagle.py)
单一 CLI,子命令:
| 子命令 | 作用 |
|--------|------|
| detect | 跨平台探测并打印当前 Eagle 库路径 |
| tags | 打印当前库标签白名单(tagsGroups 展平) |
| folders| 打印当前库所有文件夹 id + name |
| fetch | 抓取国内主流图文社区/Instagram 图片下载到 --out(--cookie / --proxy / 自动读缓存) |
| import | 按 tags.json 导入指定文件夹(--dry-run 可预览) |
| tag | 按笔记文本启发式打标,写入 tags.json(--dry-run 可预览) |
| tag-eagle | 给 Eagle 文件夹里已有 item 批量打标(--apply 才写入;配合 Eagle 插件收集) |
| web | 抓取任意网页高清图并一条龙按来源域名进 Eagle 文件夹 + 打标(--proxy / --no-import / --apply) |
| verify | 校验已导入项的标签是否正确 |
跨平台说明:库路径探测依次检查
%APPDATA%/Eagle/Settings(Windows)、
~/Library/Application Support/Eagle/Settings(macOS)、
~/.config/Eagle/Settings(Linux)中的 libraryHistory,取第一个存在
metadata.json 的库。
常见问题
- Eagle 未运行 / API 不通:启动 Eagle,确认本地 API(41595)开启。
- 抓不到图片 / 全是 FAILED:未登录态反爬。让用户从浏览器复制 Cookie 传
--cookie,或用 Eagle 官方浏览器插件把图收藏进库后再走 import 流程。 - 标签匹配困难:先跑
tags看用户白名单全貌,再让模型从里面选;严格不超出。 - 重复导入:同一链接再跑会产生重复项;导入前可按文件名/来源在库里查重, 或用户确认覆盖。
- 用户库没有标签库:
tags为空时无法自动打标,图片会无标签导入;此时建议 用户先在 Eagle 里建好标签库,或口头提供一套标签供本次使用。 - Cookie 不用每次重输:国内主流图文社区 Cookie 缓存到
~/.workbuddy/xhs_cookie.txt, Instagram Cookie 缓存到~/.workbuddy/ins_cookie.txt;下次直接fetch <URL>即可 自动带上(也可--cookie-file读 Eagle 插件导出的 cookie)。Cookie 含登录态,注意保管。 - Instagram 抓不到图:几乎都是未登录墙或代理问题。请确认:①传了从已登录
Instagram 浏览器复制的
--cookie;②本机有可达的代理(脚本自动探测 7897/7890/1080 等端口,否则用--proxy显式指定)。Cookie 失效/被风控会返回 401/403,需重新复制。 - Instagram Cookie 被拒(错误码 1357004 / "很抱歉发生错误"):这是 Cookie 不完整
导致的——只给
cookie:头的子集(缺shbid/shbts/dtsg等)会被 Instagram 拒。 最稳的解决方式:在 Network 面板里,对那个能正常打开帖子的bz?__a=1&...请求 点右键 → Copy → "Copy as cURL (bash)",把整段粘贴给技能,用fetch <URL> --cookie-curl "<整段cURL>"运行——脚本会自动从中提取完整 Cookie 与 所有请求头。脚本也会自动对%3A之类做解码、走主页 www-claim 校验流程。 - Instagram 是英文文案:内置同义词表已补充英文别名(interior/cafe/handmade/
garden 等),
tag仍能把英文话题映射到中文标签库;若仍不准,用--synonyms自定义 或调高--threshold。 - 启发式打标不准怎么办:
tag是文本信号匹配,不是看图——它给的是「候选」 而非「定论」。先看--dry-run输出,删掉不合适的、补上漏的,再正式写tags.json。要更准可加--synonyms自定义别名或调高--threshold。 - 用油猴脚本 / Eagle 插件收集后怎么打标:直接
tag-eagle --folder <文件夹名> --apply。 默认预览(不改动),加--apply才写入;已存在的标签自动跳过不重复。建筑类等 英文内容加--synonyms补同义词。注意tag-eagle需要 Eagle 正在运行(读 item/list)。 - 一键存图脚本在哪 / 怎么装:脚本在技能目录
references/eagle-quick-save.user.js。 装 Tampermonkey 后在新建脚本里全选粘贴保存即可。支持 Instagram / 国内主流图文社区 / 微信公众号 页面,点右下角「存到 Eagle」按钮存图。建议从技能文件复制,避免复制对话里的长文本时 混入不可见字符导致脚本不执行(表现为按钮消失)。 - 油猴脚本「保存失败:未能从页面解析出图片」:确认当前打开的是具体帖子页
(
instagram.com/p/短码/),不是个人主页或 Explore。Instagram 改版频繁,若内嵌 JSON 解析失效,脚本会依次尝试 data-sjs 解析 → 旧内嵌 JSON → DOM 兜底;仍失败请把弹窗文字与 F12 Console 里[Eagle Quick Save]开头的日志反馈,以便调整解析器。 - 油猴脚本每次都新建文件夹:正常不会——脚本先
GET /api/folder/list查已有同名根 文件夹并复用其 id;只有查不到才新建。若仍出现重复文件夹,多为 Eagle 里有多个同名根 文件夹,删掉多余的即可。 - tag-eagle 找不到文件夹:先
folders看现有文件夹名/id;tag-eagle的--folder只查找、不会新建(避免误建空文件夹),确认名字拼写与folders列表一致即可。 - tag-eagle 打出空标签:说明 item 名称/URL/备注里没有命中白名单的词。先
tags看白名单全貌,再决定加--synonyms或口头提供别名;也可用 Eagle 插件 收藏时把页面标题/描述保留完整,文本信号更足。
输出
- 笔记图片进入用户指定 Eagle 文件夹,每张带 2–5 个「用户标签库内」的标签, 无新增标签。
- 过程产出:
manifest.json(图片清单)、tags.json(标签分配)、imported.json(导入回执),可供追溯。
Scan to join WeChat group