如何开发一个浏览器插件
参考文章
Chrome 平台 API
一天学会Chrome插件开发
30分钟开发一款抓取网站图片资源的浏览器插件
manifest.json参数详解
Content Security Policy 入门教程
参考源码
github地址:一款提取网页图片数据的浏览器插件
秒杀插件(seckill)
一个chrome插件包含哪些文件及文件夹
D:.
│ manifest.json
│
├─html
│ index.html
│
├─images
│ icon-128.png
│ icon-16.png
│
├─scripts
│ background.js
│
├─styles
│ main.css
│
└─_locales├─en│ messages.json│└─zh_CNmessages.json
简单说明一下:
html:存放html页面
images:存放插件图标
scripts:存放js文件
styles: 存放样式
_locales: 存放多语言文件
manifest.json:用来配置所有和插件相关的配置,作为chrome入口文件,必须放在根目录
看目录结构,像不像一个网站?Bingo! Chrome插件就是一个网站类的应用,它是用html、javascript、css组成的一个webapp; 相比于通常的webapp, Chrome插件还可以调用更多浏览器层面的api,包括书签、历史记录、网络请求拦截、截获用户输入等等。(PS:插件不要随便乱装哦,很危险滴!)。
要想开发一款浏览器插件,必修有manifest.json文件
重要配置说明
manifest.json
如前所述,它包含了一些插件的元数据,作为chrome的入口文件,可以理解为插件的程序清单,那么它到底做了什么事情呢? 结合示例,我们细细来看:
{// 清单版本号,建议使用 版本 2,版本 1 是旧的,已弃用,不建议使用"manifest_version": 2,"name": "chome-plugin", // 插件名称"version": "1.8.6", // 插件版本// 这里写些废话,举个栗子,‘应产品要求,杀个程序祭天’"description": "This is an extension for your chrome","icons":{"16": "images/custom/16x16.png","48": "images/custom/48x48.png","128": "images/custom/128x128.png"},//browser_action和page_action只能添加一个"browser_action":{ //浏览器级别行为,所有页面均生效"default_icon": "images/custom/16x16.png", //图标的图片"default_title": "Hello ELSE", //鼠标移到图标显示的文字"default_popup": "html/popup.html" //单击图标后弹窗页面},"page_action":{ //页面级别的行为,只在特定页面下生效"default_icon":{"24": "images/custom/24x24.png","38": "images/custom/38x38.png"},"default_popup": "html/popup.html","default_title": "Hello ELSE"},// 可选"author": "ELSE TEAM","automation": "...",// 背景页的脚本路径,一般为插件目录的相对地址"background":{"scripts": ["scripts/background.js","scripts/devtools-page.js"]},"devtools_page": "html/devtools-page.html",// 内容脚本一般植入会被植入到页面中, 并且可以控制页面中的dom."content_scripts": [{"js": ["js/else-insert.js"],"css": ["css/else-insert.css"],"matches": ["<all_urls>"]// 被植入到页面,只在这些站点下 content_scripts会运行}],// 数组,声明插件所需要的权限,这里就是很危险的存在了,想干坏事的你是不是很激动!"permissions": ["cookies", // 使用cookies"webRequest", //使用web请求"http://*", //可以通过executeScript或者insertCSS访问的网站地址。如: https://*.google.com/"management", //"storage", //使用本地存储"tabs", //操作标签"contextMenus" //右键菜单]"default_locale ": "zh_CN" //默认语言(比如"zh_CN")
}
更详细的请看 manifest.json参数详解
content-scripts
内容脚本一般植入会被植入到页面中, 并且可以控制页面中的dom. 我们可以利用它实现屏蔽网页广告, 定制页面皮肤等操作. 在manifest.json中的基本配置如下:
{"content_scripts": [{"matches": ["http://*/*","https://*/*"],"js": ["lib/jquery3.4.min.js","content_script.js"],"css": ["base.css"]}],
}
以上代码中我们定义了content_scripts允许注入的页面范围, 插入页面的js以及css, 这样我们就能轻松改变某一个页面的样式.比如我们可以在页面中注入一个按钮:
popup
popup是用户点击插件图标时打开的一个小窗口,当失去焦点后窗口就立即关闭,我们一般用它来处理一些简单的用户交互和插件说明。
由于popup窗口也是一个网页,所以我们一般会建立一个popup.html和popup.js用来控制popup的页面展示和交互.我们在manifest.json中配置如下:
{"page_action": {"default_title": "小夕图片提取插件","default_popup": "popup.html"},
}
这里要注意一点的是,我们在popup.html中不能直接使用script脚本,需要用引入脚本文件的方式.如下:
<!DOCTYPE html>
<html><head><title>在线图片提取工具</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body><div class="pop-wrap"></div><script src="lib/jquery3.4.min.js"></script><script src="popup.js"></script></body>
</html>
如下:
background.js
background页面主要用来提供一些全局配置, 事件监听, 业务转发等.举几个常用案例:
1,定义右键菜单
,background.js 文件
const systems =
{a: '趣谈前端',b: '掘金',c: '微信'
}
// 谷歌浏览器加载监听事件
chrome.runtime.onInstalled.addListener(function (){for (let key of Object.keys(systems)){// 上下文菜单chrome.contextMenus.create({id: key,title: systems[key],type: 'normal',contexts: ['selection'],});}
});
manifest.json 添加 右键菜单 权限
{"permissions": ["contextMenus"]
}
效果如下:
加载并运行插件
在您的浏览器中访问 chrome://extensions 或者 浏览器 --> 设置 --> 更多工具 --> 扩展程序 进入扩展程序管理页面。
通信机制
对于一个相对复杂的浏览器插件来说,我们不仅仅只操作dom或者提供基本的功能就行了,我们还需要向第三方或者自己的服务器抓取有用的页面数据,这个时候就需要用到插件的通信机制了.
因为content_script脚本存在于当前页面,受同源策略影响,导致我们无法将捕获到的数据传给第三方平台或者自己的服务器, 所以我们需要基于浏览器的通信API.一下是谷歌浏览器插件的通信流程:
popup和background相互通信
由官方文档可知popup可以直接访问background页的方法,所以popup可以直接与其通信:
background.js
var getData = (data) =>{console.log('拿到数据:' + data)
}
popup.js
let bgObj = chrome.extension.getBackgroundPage();
bgObj.getData(); // 访问bg的函数
popup或者background页和content_script通信
1,使用chrome的tabs API进行消息通知
参数请看 chrome.tabs
popup.js : 发送消息给content_script和接收消息
// 给当前标签页的 content_script 发送消息给
chrome.tabs.query({ active: true, currentWindow: true}, function (tabs){chrome.tabs.sendMessage(tabs[0].id, "activeBtn", function (response){console.log(response);});}
);// 接收消息
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse){console.log(sender.tab ?"from a content script:" + sender.tab.url :"from the extension");if (request.greeting == "hello")sendResponse({farewell: "goodbye"});
});
content_script接收和发送消息:
// 接收消息
chrome.runtime.onMessage.addListener(function (message, sender, sendResponse){if (message == "activeBtn"){// ...sendResponse( {farewell: "激活成功"});}
});// 主动发送消息
chrome.runtime.sendMessage({greeting: "hello"}, function (response){console.log(response, document.body);// document.body.style.backgroundColor="orange"
});
2,采用如下方式进行长连接
content_script.js
var port = chrome.runtime.connect( {name: "徐小夕"});
port.postMessage({Ling: "你好"
});
port.onMessage.addListener(function (msg)
{if (msg.question == "你是做什么滴?")port.postMessage({answer: "搬砖"} );else if (msg.question == "搬砖有钱吗?")port.postMessage( {answer: "木有"} );
});
popup.js
chrome.runtime.onConnect.addListener(function (port){port.onMessage.addListener(function (msg){if (msg.Ling == "你好")port.postMessage({question: "你是做什么滴?"});else if (msg.answer == "搬砖")port.postMessage({question: "搬砖有钱吗?"});else if (msg.answer == "木有")port.postMessage({question: "太难了."} );});
});
3,数据存储传递消息
chrome.storage用来针对插件全局进行数据存储,我们在任何一个页面(popup或content_script或background)下存储了数据,我们在以上三个页面都可以获取到, 具体用法如下:
获取数据
chrome.storage.sync.get('imgArr', function (data){console.log(data)
});
// 保存数据
chrome.storage.sync.set({'imgArr': imgArr}, function (){console.log('保存成功');
});// 另一种方式
chrome.storage.local.set({key: value}, function (){console.log('Value is set to ' + value);
});
作者:徐小夕
链接:https://www.imooc.com/article/303109
来源:慕课网
本文大部分内容首次发布于慕课网
如何开发一个浏览器插件相关推荐
- flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件
在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布.接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位 ...
- 怎样自己开发一个wordpress插件?
wordpress之所以这么受欢迎,就是因为它有非常大的可扩展性.因为wordpress的可扩展性,我们不仅可以开发出各种各样的wordpress主题模板,而且可以开发出功能强大的wordpress插 ...
- 如何从零开始开发一个 Chrome 插件?
什么是浏览器插件? 简单来说浏览器插件,是浏览器上的一种工具,可以提供一些浏览器没有的功能,帮你做一些有趣的事情.开发者可以根据自己的喜欢,去实现一些功能.插件基于Web技术(html.css.js) ...
- 前端拓展:如何开发一个 Chrome 插件?
什么是浏览器插件? 简单来说浏览器插件,是浏览器上的一种工具,可以提供一些浏览器没有的功能,帮你做一些有趣的事情.开发者可以根据自己的喜欢,去实现一些功能.插件基于Web技术(html.css.js) ...
- 开发一个chrome插件:将百度搜索热点屏蔽掉!
每次百度搜索,搜索结果的右边总是出现些乱七八糟的搜索热点(推的都是些什么玩意,高校替课和我有毛关系,几个悲伤的热点我用星号顶掉了). 强迫症想把它隐藏掉,我用的是chrome浏览器,受adb ...
- 所谓 jQuery 插件,怎样开发一个 jQuery 插件
简单来说,所谓 jQuery 插件就是扩展在 jQuery 原型对象上的一个方法.通过扩展 jQuery 对象,每次调用 jQuery 对象的时候,对象里面都包含了我们自己所添加的那个方法. 一般插件 ...
- 一个浏览器插件,测试xpath的工具
相信大家有一个感觉,就是每当写爬虫时,需要写xpath来找到我们要的数据,调试xpath会浪费很多时间,一次又一次的requests请求,每每看到取到的元素与自己心中想要的元素不符时......... ...
- 使用vue+element开发一个谷歌插件
简单功能:点击浏览器右上角插件icon弹出小弹窗,点击设置弹出设置页,并替换背景颜色. 这里使用vue+element并不是说写插件引用各种库才好,而是为了演示而使用. 开始 1.本地创建文件夹tes ...
- 手摸手教你开发一个postcss插件自动计算vw
因为平时工作中开发h5网页的时候,为了更好适配不同的尺寸, 经常会使用vw单位, 通常是通过vw = 元素尺寸 / 屏幕尺寸 , 比如一个元素在 37.5px的设计图下宽 100px, 那得到的 vw ...
最新文章
- ***网站必备:(经典语句)
- kafka数据 落盘_Kafka架构原理?也就这么回事!
- 为CentOS 7安装VMware-tools
- cpu java poi 导出_java基于poi导出excel透视表代码实例
- 自定义的Android EditText
- 年终总结 | 2019年人工智能+计算机视觉+深度学习笔记思维导图汇总
- 忘记VSS admin密码了
- 促促促,如何确保系统扛得住 | 《尽在双11》抢鲜预览
- CentOS 7 service systemnctl
- 卡特兰数,高精度卡特兰数
- 三菱Q系列PLC大型程序Q01U伺服12轴
- 截图工具FastStone Capture
- verilog符号 与或非 异或_与非门、或非门、异或门、同或门的逻辑表达式和逻辑符号怎么写...
- 计算机学业水平测试表格题,2010 年信息技术学业水平考试试题
- 中兴JAVA直板手机_中兴(zte)L880智能手机(黑色 双卡双待 直板按键 老人机) 京东199元...
- 【Mysql】调优必知的sql访问方式
- python中imread什么意思_Python 中各种imread函数的区别与联系
- WiFi QC 自动测试:ixChariot API初探
- Label--关于Label富文本
- SSM+基于SSM的养老管理系统 毕业设计-附源码221609
热门文章
- DNAT(目的地址转换)-IP映射和端口映射
- 我下载了python所有包,24个G,用以备份
- 【论文阅读】Attention Based Spatial-Temporal GCN...Traffic Flow Forecasting[基于注意力的时空图卷积网络交通流预测](1)
- GitHub开源项目学习 电商系统Mall (三) SpringBoot+MyBatis搭建基本骨架
- python:实现IIR 滤波器算法(附完整源码)
- 怎么把pdf转换为excel表格?有什么实用的转换工具?
- SmoothGrad: removing noise by adding noise论文解读
- 往mysql批量插入datetime
- Internet Download Manager2022中文版免费下载
- 【NLP】用ML实现中文短文本分类(二分类)