30分钟开发一款抓取网站图片资源的浏览器插件

网站建设4年前发布
131 0 0
20230306014627b6aad4063f2582f5e3c03812adde2ad6eb45a0470,基于谷歌浏览器的插件层出不穷, 它可以帮助我们解决单一网站解决不了的很多问题,也有很多前端极客们开发了大量有意思的浏览器插件,所以我也花了大概一天的时间,看完了谷歌浏览器插件开发文档,在这里特地总结一下经验, 并通过一个实际案例来复盘插件开发的流程和注意事项。,在开始正文之前,我们先来看看笔者总结的概览:,20230306014627b9357fc24f94c6b9e371170ac6c125f43693f9425,如果对浏览器插件开发比较熟悉的朋友可以直接看最后一节插件开发实战。,首先我们看看的浏览器插件的定义:,要想开发一款浏览器插件,我们只需要有一个manifest.json文件即可, 为了快速上手浏览器插件开发,我们需要把浏览器开发者工具打开, 具体步骤如下:,20230306014628a5ae76277c29934645c257580974529c1f27b9583,通过以上三个步骤我们就可以开启浏览器插件开发之旅了.浏览器插件一般放在浏览器地址栏右侧,我们可以在manifest.json文件配置插件的icon,并配置一定的规则,就能看到我们的浏览器插件图标了,如下图:,20230306014628b464520857b79e49947841e0bec8680c97b2d2716,下面我们来具体讲解一下浏览器插件开发的核心概念。,浏览器插件一般涉及以下几个核心文件:,笔者画了一张简图来大致表示一下它们之间的关系:,20230306014629c9110c04995809e16e85896558eb3240a81fb2314,接下来我们来具体了解一下以上几个核心知识点。,谷歌官网给我们提供了一份简单的配置,如下:,各字段含义介绍如下:,20230306014704c68a8d0841f7854074296452d373ef08de92de192,background页面主要用来提供一些全局配置, 事件监听, 业务转发等.举几个常用案例:,定义右键菜单。,效果如下:,202303060955083391b0f57c770c11388065b5057145c178f94e126,设置只有.com后缀的页面才会激活插件。,如下图所示,当页面地址的后缀不等于.com时,插件icon将不被激活:,20230306014630d73bf4f0857943bad02295e0bd3790bb4af93d759, 和content_script或者popup页面进行消息通信。,内容脚本一般植入会被植入到页面中, 并且可以控制页面中的dom. 我们可以利用它实现屏蔽网页广告, 定制页面皮肤等操作. 在manifest.json中的基本配置如下:,以上代码中我们定义了content_scripts允许注入的页面范围, 插入页面的js以及css, 这样我们就能轻松改变某一个页面的样式.比如我们可以在页面中注入一个按钮:,20230306014630c794b7d7771f53d95f069664bf0ce810fca4ff232,在后面的浏览器插件案例中笔者会详细介绍content_scripts的用法。,popup是用户点击插件图标时打开的一个小窗口,当失去焦点后窗口就立即关闭,我们一般用它来处理一些简单的用户交互和插件说明。,由于popup窗口也是一个网页,所以我们一般会建立一个popup.html和popup.js用来控制popup的页面展示和交互.我们在manifest.json中配置如下:,这里要注意一点的是,我们在popup.html中不能直接使用script脚本,需要用引入脚本文件的方式.如下:,以下是笔者写的一个插件的popup页面:,2023030609550878f47a4854bd7dd2926029467ecf1e3f977fdc784,
,对于一个相对复杂的浏览器插件来说,我们不仅仅只操作dom或者提供基本的功能就行了,我们还需要向第三方或者自己的服务器抓取有用的页面数据,这个时候就需要用到插件的通信机制了.因为content_script脚本存在于当前页面,受同源策略影响,导致我们无法将捕获到的数据传给第三方平台或者自己的服务器, 所以我们需要基于浏览器的通信API.以下是谷歌浏览器插件的通信流程:,20230306014705343644573937fb10dbc983496453576723294f928,由官方文档可知popup可以直接访问background页的方法,所以popup可以直接与其通信:,content_script接收和发送消息:,有关消息的长连接,在谷歌官网也写的很清楚:,20230306014632157ae6a78df8e5d136b761d38e6d4289586b44128,我们可以采用如下方式进行长连接:,chrome.storage用来针对插件全局进行数据存储,我们在任何一个页面(popup或content_script或background)下存储了数据,我们在以上三个页面都可以获取到, 具体用法如下:,谷歌浏览器的插件应用场景很多,正如文章开头的思维导图中写的.以下是笔者总结的一些应用场景,大家感兴趣可以尝试去实现:,还有很多实用工具可以开发,大家可以好好把玩。接下来就来通过实现一个网页图片提取插件,来总结以下浏览器插件开发流程。,首先还是按照笔者的风格,在开发任何一种工具之前都要明确需求,所以我们来看看该插件的功能点:,基本上就这几个功能,接下来我会展示核心代码,在介绍代码之前我们先预览一下插件的实现效果:,20230306014633c422e2c49a8da62d785535c4fe2282199a394a6562023030601463325f46bd61bd0df26f3c4525ebb9bcf0d820afb402,插件目录结构如下:,2023030601463332f490f80a4604ffd31589b85d9a990b5caf69420,因为插件的开发比较简单,所以我直接用jquery开发。这里我们主要关注popup.js和content_script.js, popup.js中主要用来获取从content_script页传过来的图片数据,并展示在popup.html中,另外又一个需要注意的是当页面没有注入生成按钮时,popupu需要发送信息给content页面,主动让其生成按钮,代码如下:,对于content页面,我们需要实现的是动态生成按钮,并且在页面中植入弹窗来展示获取到的图片,另一方面需要将图片数据传递给storage,以便popup页面可以获取图片数据。,由于页面比较简单,笔者就不用过多的第三方库了,笔者先简单手写一个modal组件,代码如下:,第一步,我们先批量获取页面图片数据:,因为图片的src路径可能是相对地址,所以笔者在这里用正则简单处理以下,当然我们可以进行更细粒度的控制。,第二步,将图片数据存储到storage中:,第三步,生成预览图片的弹窗,这里用笔者上面实现的modal组件:,第四步,当popup发送激活按钮的通知时,我们要在网页中动态插入生成按钮:,setTimeout那段纯属是为了吸引用户视线,当然我们可以用更优雅的方式来处理。插件核心代码主要是这些,当然还有很多细节要考虑,我把配置文件和一些细节放到github了,如果感兴趣的朋友可以安装感受一下。,github地址:https://github.com/MrXujiang。,本文转载自微信公众号「趣谈前端」,可以通过以下二维码关注。转载本文请联系趣谈前端公众号。,20230306014634a10528709147dfdc3ef0017a1654dd5cd351fc463
© 版权声明

相关文章