当前位置: 首页 > article >正文

别再乱装图片插件了!我手写了一个,能扒光整个网页(含背景/iframe/Shadow DOM)

开场白我真的受够了每次想从网页批量保存图片要么右键被禁用要么装了五六个插件还漏掉一半的 CSS 背景图要么好不容易抓到图了却发现插件在后台偷偷上报我的浏览记录。于是我自己写了一个 ——Image Harvest。它能把网页里所有图片包括img、CSS 背景、iframe 内嵌、甚至 Shadow DOM 里的全部扒出来一键打包 ZIP而且本地处理零追踪。官网功能详情image-harvest.kyriewen.cnChrome 商店安装https://chromewebstore.google.com/detail/iecgnjidmogebokcfnejncgnelcepffo这篇文章不讲产品吹水只说技术实现MV3 踩坑、深度图片提取、客户端感知哈希去重、Side Panel Popup 双形态共存。干货 代码 真实踩坑记录希望对写 Chrome 插件的朋友有帮助。一、为什么我要自己写一个图片下载插件现有的同类插件我试过 10 个普遍三个问题抓不全只能抓imgCSSbackground-image、iframe、Shadow DOM 里的图基本放弃。有隐私风险manifest 里申请all_urlswebRequest还往未知服务器发数据。体验拉胯批量下载要么一张张点要么 ZIP 包里一半是占位图。所以我决定自己造轮子。核心目标不漏图递归提取所有图片源不监守自盗纯本地零数据收集好用侧边栏/弹窗双模式、暗色主题、3 档密度二、Manifest V3 的几个坑附解法2.1 Service Worker 冷启动V3 用 service worker 替代 V2 的常驻 background page。它会在几秒无活动后休眠导致下次调用时变量全丢。解决方案用chrome.storage.session缓存关键状态。// 抓取完成后存入 sessionawaitchrome.storage.session.set({lastExtract:{images,timestamp:Date.now()}});// 下次打开面板时恢复constcachedawaitchrome.storage.session.get(lastExtract);if(cachedDate.now()-cached.timestamp60000){returncached.images;}2.2 远程代码被禁止V3 完全禁止执行从外部下载的脚本。对我没影响Image Harvest 所有代码本地打包不依赖任何远程配置。2.3webRequest被declarativeNetRequest替代如果你需要修改网络请求如给图片请求加 header现在只能用声明式规则灵活性降低。不过图片下载器不需要这玩意儿。三、深度图片提取从img到 Shadow DOM3.1 基础提取img和picturefunctionextractSimpleImages(){consturls[];document.querySelectorAll(img).forEach(img{if(img.src)urls.push(img.src);});document.querySelectorAll(picture source).forEach(source{if(source.srcset){consthighestsource.srcset.split(,).pop().trim().split( )[0];urls.push(highest);}});returnurls;}3.2 提取 CSSbackground-image很多网站的 Banner、图标都用背景图实现必须挖出来。functionextractBgImages(rootdocument){constelementsroot.querySelectorAll(*);constbgUrls[];for(leti0;iMath.min(elements.length,2000);i){constbggetComputedStyle(elements[i]).backgroundImage;if(bgbg!none){constmatchbg.match(/url\([]?([^)])[]?\)/);if(match)bgUrls.push(match[1]);}}returnbgUrls;}3.3 递归 Shadow DOM现代前端框架React/Vue常把图片封装在 Shadow DOM 里必须递归遍历。functionextractFromShadowDOM(rootdocument){letresults[];// 普通图片results.push(...extractSimpleImages(root));results.push(...extractBgImages(root));// 递归 Shadow DOMconsthostsroot.querySelectorAll(*);hosts.forEach(host{if(host.shadowRoot){results.push(...extractFromShadowDOM(host.shadowRoot));}});returnresults;}3.4 iframe 处理同源 iframe 可以用chrome.scripting.executeScript注入提取函数。需要webNavigation权限获取所有 frame。constframesawaitchrome.webNavigation.getAllFrames({tabId});for(constframeofframes){if(frame.parentFrameId!-1)continue;// 只处理顶层 iframeconstinjectionawaitchrome.scripting.executeScript({target:{tabId,frameIds:[frame.frameId]},func:extractFromShadowDOM,});// 合并结果...}四、客户端感知哈希pHash实现相似图去重很多用户反馈“下载 100 张图里面有 30 张是重复的缩略图”。所以我在 Pro 版中加了相似图检测。4.1 算法选择dHash速度快纯前端对缩放、轻微裁剪不敏感汉明距离 ≤ 5 判定为相似4.2 核心代码asyncfunctioncomputeDHash(blob){constimgawaitcreateImageBitmap(blob);constcanvasnewOffscreenCanvas(9,8);constctxcanvas.getContext(2d);ctx.drawImage(img,0,0,9,8);constdatactx.getImageData(0,0,9,8).data;// 转灰度constgray[];for(leti0;idata.length;i4){gray.push(0.299*data[i]0.587*data[i1]0.114*data[i2]);}// 差分哈希lethash0n;for(letrow0;row8;row){for(letcol0;col7;col){constleftgray[row*9col];constrightgray[row*9col1];if(rightleft)hash|(1nBigInt(row*7col));}}returnhash;}4.3 Worker 中运行不阻塞 UIconstworkernewWorker(phash-worker.js);worker.postMessage({blob});worker.onmessage(e){console.log(哈希:${e.data.hash});};五、Side Panel Popup 双模式共存Chrome 115 支持 Side Panel但老用户习惯 Popup。我两个都要。实现要点manifest 中配置side_panel.default_path sidepanel.htmlaction.default_popup留空动态控制chrome.action.onClicked.addListener(async(tab){constsettingsawaitgetAppSettings();if(settings.useSidePanel){awaitchrome.sidePanel.open({tabId:tab.id});}else{awaitchrome.action.setPopup({tabId:tab.id,popup:popup.html});chrome.action.openPopup();}});同一套 UI 代码通过window.location.pathname判断当前模式微调布局弹窗固定 620×600侧边栏自适应。六、上架 Chrome Web Store 的 4 个雷区图标尺寸不全必须 16/32/48/128 px缺一个直接驳回。描述太短简短描述 ≤132 字符要包含核心关键词。隐私政策缺失即使不收集数据也要写一份说明“不收集什么”。权限过度不需要all_urls就别写否则审核会问。我第一次提交被拒就是因为隐私政策链接 404。补上后 2 天过审。七、成品 求个赞如果你也受够了那些抓不全、偷数据的图片插件可以试试Image Harvest官网功能详情image-harvest.kyriewen.cnChrome 商店安装https://chromewebstore.google.com/detail/iecgnjidmogebokcfnejncgnelcepffo如果觉得这个工具或这篇文章对你有帮助在 Chrome 商店留个好评对独立开发者是续命药水 给这篇文章点个赞/收藏让更多人看到技术干货我会继续维护和更新任何 bug 或建议欢迎评论区告诉我

相关文章:

别再乱装图片插件了!我手写了一个,能扒光整个网页(含背景/iframe/Shadow DOM)

开场白 我真的受够了,每次想从网页批量保存图片,要么右键被禁用,要么装了五六个插件还漏掉一半的 CSS 背景图,要么好不容易抓到图了,却发现插件在后台偷偷上报我的浏览记录。 于是我自己写了一个 —— Image Harvest…...

秘语盾技术团队解析 Ledger Nano X 蓝牙连接优化

秘语盾技术团队解析 Ledger Nano X 蓝牙连接优化 【核心摘要】 作为 Ledger 系列中唯一具备移动端无线连接功能的旗舰产品,Nano X 的蓝牙连接稳定性受限于移动设备系统版本及复杂的射频环境。针对中国用户在使用 Ledger Live App 时常见的“搜索不到设备”或“配对…...

MagiskHide Props Config终极指南:Android设备指纹伪装与安全检测绕过完整方案

MagiskHide Props Config终极指南:Android设备指纹伪装与安全检测绕过完整方案 【免费下载链接】MagiskHidePropsConf This tool is now dead... 项目地址: https://gitcode.com/gh_mirrors/ma/MagiskHidePropsConf 你是否曾经遇到过这样的困扰?在…...

暴雨大讲堂|AI算力异构与液冷重塑算力产业新格局

今年年初至今,短短四个月外部环境的变化应接不暇,不确定性成为常态,似乎人人都可以来上一句“唯一不变的是变化本身”作为口头禅。然而就在这些不确定中市场却给出了一个真实的“确定性”——那就是人工智能驱动下的算力增长。据彭博社近期报…...

基于云模型-MABAC决策框架的冷链物流供应商选择研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

【信号去噪】基于粒子群算法PSO优化小波变换DWT实现信号去噪附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

【光学】㪚斑成像和荧光成像双模态融合Matlab实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

通过工件流水线解决 GPT 分支问题

原文:towardsdatascience.com/solve-the-gpt-branching-problem-with-an-artifact-pipeline-44024398c15f?sourcecollection_archive---------11-----------------------#2024-01-09 使用自定义 GPT 设计一个饮食规划应用 https://medium.com/andrew.tyler.lucas?…...

PHP 9.0异步DNS解析+TLS 1.3零往返握手+AI机器人上下文感知缓存:三重加速下首字节响应进入17ms时代(独家压力测试原始日志公开)

更多请点击: https://intelliparadigm.com 第一章:PHP 9.0 异步编程与 AI 聊天机器人对比评测报告 PHP 9.0(当前为前瞻设计草案)引入了原生协程调度器、async/await 语法糖及 Channel 类型,显著重构了异步 I/O 模型。…...

你还在用Worker进程模拟并发?PHP 8.9 原生纤维协程已支持调度器热插拔(仅限RC3+内测通道开放)

更多请点击: https://intelliparadigm.com 第一章:PHP 8.9 纤维协程高并发实战导论 PHP 8.9(预发布版)首次将 Fiber(纤维)原生协程能力深度整合至引擎层,无需依赖扩展或用户态调度器&#xff0…...

Winhance中文版终极指南:完全掌握Windows系统优化与管理

Winhance中文版终极指南:完全掌握Windows系统优化与管理 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…...

C# 13指针与fixed语句安全红线:5类高危模式、3层编译器防护、1套企业级审计清单

更多请点击: https://intelliparadigm.com 第一章:C# 13不安全代码安全管控全景图 C# 13 引入了更精细的不安全代码(unsafe context)管控机制,旨在平衡高性能指针操作与内存安全合规性。编译器现在默认禁用不安全代码…...

MacType终极指南:3步让Windows字体焕然一新,告别模糊显示!

MacType终极指南:3步让Windows字体焕然一新,告别模糊显示! 【免费下载链接】mactype Better font rendering for Windows. 项目地址: https://gitcode.com/gh_mirrors/ma/mactype 还在为Windows系统那模糊不清的字体显示效果而烦恼吗&…...

VirtualBrowser 2.1.15:一站式浏览器指纹管理实战指南

VirtualBrowser 2.1.15:一站式浏览器指纹管理实战指南 【免费下载链接】VirtualBrowser Free anti fingerprint browser, 指纹浏览器, 隐私浏览器, 防识别浏览器, 反识别浏览器, 防关联浏览器, 免费的web3空投专用指纹浏览器 https://virtualbrowser.cc/?srcgithub…...

MacBook Air M5 免费养个 AI 助手:Gemma 4 本地运行 OpenClaw 完全指南

一条命令,5 分钟搞定。本地运行,完全免费,微信随时对话。 先说结论 我用 MacBook Air 13 M5 测试了一整天,结论: ✅ Gemma 4 E4B 本地运行: 流畅,响应 2-4 秒✅ **完全免费: 不花一分钱✅ **隐…...

C# 13内联数组性能真相(Stack-Only Array大揭秘):为什么.NET Runtime团队禁用常规new操作符?

更多请点击: https://intelliparadigm.com 第一章:C# 13内联数组性能真相(Stack-Only Array大揭秘):为什么.NET Runtime团队禁用常规new操作符? C# 13 引入的 inline array(内联数组&#xff0…...

深入浅出:用Xilinx OSERDES2/ISERDES2原语实现CameraLink编解码,对比专用芯片方案怎么选?

CameraLink实现方案深度对比:FPGA原语与专用芯片的技术抉择 在工业视觉和医疗成像领域,CameraLink接口凭借其稳定可靠的高速数据传输能力,成为众多专业设备的首选。当工程师面临CameraLink接口实现方案选择时,往往陷入两难&#x…...

孩子不爱背单词?试试让手指先「记住」——打字侠英语可以这样用

很多家长都有这样的烦恼:英语课上单词听得懂,一动笔写就缺字母;抄了好几遍,考试时还是想不起来。其实不是孩子不用功,而是单一抄写很难形成牢固的肌肉记忆和语境印象。 打字侠英语把孩子熟悉的键盘练习和英语学习合在…...

渗透测试入门

渗透测试入门:揭开网络安全的神秘面纱 在数字化时代,网络安全问题日益突出,黑客攻击和数据泄露事件频发。渗透测试作为网络安全的核心技术之一,通过模拟攻击来发现系统漏洞,成为企业防护的重要工具。如果你对网络安全…...

【官方未公开的DOTS 2.0性能开关】:启用UnsafeHashMap优化+禁用Auto-RefCounting+强制Chunk对齐,实测CPU占用下降41.6%(附可复现Benchmark工程)

更多请点击: https://intelliparadigm.com 第一章:【官方未公开的DOTS 2.0性能开关】:启用UnsafeHashMap优化禁用Auto-RefCounting强制Chunk对齐,实测CPU占用下降41.6%(附可复现Benchmark工程) Unity DOT…...

codex模拟autosota方案

结论:先别急着自己构建完整 AutoSOTA agent 系统。 你现在最该做的是搭一个 AutoSOTA-lite 工作流:复现基线 -> 生成优化想法 -> 实现单个改动 -> 跑实验 -> 审核有效性 -> 记录报告。 Agent 可以以后自动化;现在最值钱的是 评…...

AI光互连商POET订单骤停,近半市值蒸发!供应链保密红线敲响警钟

订单骤停:一纸违约通知,四成市值蒸发美东时间4月27日,光互连方案商POET Technologies股价单日暴跌47.25%,收报7.95美元,盘中一度触及7.50美元低位。上周五,这家公司刚刚创下15.50美元的11年新高&#xff0c…...

关于在网页中使用CSS样式

一.目前在网页中要使用CSS有三中方法。1.行内样式(行内式)优点&#xff1a;直接就可以在标签内写&#xff0c;是比较快&#xff0c;直接作用于标签。缺点&#xff1a;代码臃肿&#xff0c;不利与维护。代码如下&#xff1a;<!DOCTYPE html> <html lang"en"&…...

脑机接口初创公司Neurable寻求向消费级可穿戴设备授权“读心“技术

脑机接口&#xff08;BCI&#xff09;技术曾经只存在于科幻小说中&#xff0c;如今已成为科技行业竞争激烈的赛道之一。其核心原理是将人脑的神经信号传输至计算机进行处理。Neurable正是这一领域的参赛者之一&#xff0c;该公司本周宣布&#xff0c;计划将其"读心"技…...

微软向美国约7%员工提供自愿退休买断计划

微软将向美国约7%的员工提供自愿退休买断计划&#xff0c;涉及约8750名员工&#xff0c;这是该公司51年历史上首次推出此类项目。此举背景是&#xff0c;整个科技行业正在AI投资成本压力下进行结构性调整。该计划面向美国高级总监及以下级别的员工开放。与此同时&#xff0c;包…...

如何开展高质量用户访谈?掌握 UX 研究的 4 个核心要素与提问艺术

【投稿】原创文章发布于 https://figma-file.store/blog/4455.html 成功的用户访谈包含四个核心要素。 一、明确目标和目的 明确目标和目的意味着设定清晰的研究目标。与产品经理或业务方沟通&#xff0c;挖掘更深层次的洞察。 设定清晰的目标和目的将帮助你&#xff1a; …...

【GPR回归预测】双向长短期记忆神经网络结合高斯过程回归(BiLSTM-GPR)的多变量回归预测 (多输入单输出)【含Matlab源码 15399期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥 🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤�…...

实战案例——AI智能客服机器人(全渠道发布)

&#xff5c;知识库 工作流 卡片 多平台部署 &#xff5c; 从0到1搭建企业级智能客服前七篇文章&#xff0c;我们逐一攻克了Coze的核心功能&#xff1a;智能体基础、知识库、卡片、插件、工作流、数据库。现在是时候把这些能力串起来&#xff0c;完成一个真正的商业级项目—…...

M4Markets vs FP Markets vs XM:平台稳定性与高波动时的表现

在交易领域&#xff0c;平台稳定性并非锦上添花&#xff0c;而是生存之本。尤其在市场剧烈波动时——突发地缘冲突、央行利率决议突袭、黑天鹅事件降临——平台能否扛住压力&#xff0c;往往是普通交易者与成功者的分水岭。今天&#xff0c;我们将深入剖析三大热门平台&#xf…...

如何选择适合项目的「限流 / 熔断 / 降级」方案

如何选择适合项目的「限流 / 熔断 / 降级」方案 一、先分清 3 个核心概念&#xff08;避免选错&#xff09; 限流&#xff1a;防刷、防打爆、控制 QPS熔断&#xff1a;依赖服务超时 / 报错太多&#xff0c;直接断开&#xff0c;防止雪崩&#xff08;比如大模型接口超时、向量库…...