谷歌浏览器插件

1、什么是谷歌浏览器插件

谷歌浏览器插件官方名称是扩展。只不过大家都统一习惯性叫插件。所以接下来文中也以插件来命名。
官方文档介绍什么是扩展,以及API参考和核心模块和搭建一个简单插件教程。大家可以前往官方文档查看。这里就不一一介绍了。
简单说下manifest.json 相关配置字段说明。
manifest.json

 // 扩展名称
   "name": "谷歌插件",
   // 版本。由1到4个整数构成。多个整数间用"."隔开
   "version": "1.0",
   // manifest文件版本号。Chrome18开始必须为2
   "manifest_version": 2,
   // 描述。132个字符以内
   "description": ",
   // 扩展图标。推荐大小16,48,128
   "icons": {
     "16": "image/icon16.png",
     "48": "image/icon48.png",
     "128": "image/icon128.png"
   },
   // 语言
   "default_locale": "en",
   // 地址栏右侧图标管理,含图标及弹出页面的设置等
   // 建议至少保留一个设置,不然扩展图标是暗的
   "browser_action": {
     "default_icon": "",
     "default_title": "",
     "default_popup": ""
   },
   // 地址栏最后附加图标。含图标及行为等
   "page_action": {
     "default_icon": "",
     "default_title": "",
     "default_popup": ""
   },
   // 主题,用于更改整个浏览器的外观
   "theme": {},
   // 指定扩展需要跳转到的URL
   "app": {},
   // 指定扩展进程的background运行环境及运行脚本
   "background": {
     "scripts": [ ],
   },
   // 替换页面
   "chrome_url_overrides": {
   },
   // 指定在web页面运行的脚本/插入的css及运行/插入时机
   "content_scripts": [],
   // 安全策略
   "content_security_policy": ",
   "file_browser_handlers": [],
   // 扩展的官方主页
   "homepage_url": "http://xxx",
   // 插件在隐私模式下的配置
   "incognito": "spanning",
   // 用户操作意图描述
   "intents": {},
   // 扩展唯一标识。不需要人为指定
   "key": ",
   // 扩展所需chrome的最小版本
   "minimum_chrome_version": "1.0",
   // 消息与本地处理模块映射
   "nacl_modules": [],
   // 是否允许脱机运行
   "offline_enabled": true,
   // ominbox即地址栏。用于响应地址栏的输入事件
   "omnibox": {
     "keyword": "myKey"
   },
   // 选项页。用于在扩展管理页面跳转到选项设置
   "options_page": "options.html",
   // 申请权限
   "permissions": [ ],
   // 扩展。可调用第三方扩展
   "plugins": [],
   // 指定所需要的特殊技术。目前只支持"3D"
   "requirements": {},
   // 自动升级
   "update_url": "",
   // 指定资源路径,为String数组
   "web_accessible_resources": []

常用
name 扩展名称。

version 插件的版本。

manifest_version manifest配置文件版本。

description 对于插件功能的描述。

icons 插件的图标 可以为插件找一个好看的图标。

browser_action 可以定义插件的图标,点击插件时弹出的页面,以及插件的标题,建议始终保留一个,直接不设置这个属性图标会是灰色的,设置了后才会亮起来。

background 背景页,扩展进程的背景运行环境,可以拦截修改请求等等。

content_scripts 内容脚本,可以指定在什么时机向什么页面插入什么脚本或者css资源

permissions 权限申请项,比如存储权限storage,请求拦截权限webRequest, webRequestBlocking等等。

2、如何简单实现插件来拦截网络请求
谷歌的插件版本目前有v2 和v3 。不同的版本api有些改变,是不相互兼容的。
下面是使用用v2版本api来实现插件拦截网站请求的

方式一:

background.js

//监听所有请求
chrome.webRequest.onBeforeRequest.addListener(
  function(info) {
    console.log(info.url);
    chrome.tabs.sendMessage(details.tabId, details, function(response) {
      // 此处可以修改response
  });
    return  ({cancel: false});
},
({
    urls: ["*://*/*"],
    types: ["script"]
}),
["blocking"]);

在manifest.json注入权限

"permissions": [
    "tabs",
    "storage",
    "activeTab",
    "scripting",
    "<all_urls>",
    "webRequest",
    "webRequestBlocking"
]
 "background": {
    "service": "background.js"
  },

方式二:

核心代码:
创建main.js

let interceptor = {
    urls: [],
    originalXHR: window.XMLHttpRequest,
    originalFetch: window.fetch.bind(window),
    myXHR: function () {
        return interceptor.originalXHR(...args).then((response) => {
         // 此处可以修改response
        })
    },
    myFetch: function (...args) {
        return interceptor.originalFetch(...args).then((response) => {
         // 此处可以修改response
        })
    }
}
window.XMLHttpRequest = interceptor.myXHR
window.fetch = interceptor.myFetch;

网络请求方式fetch/xhr
所以需要分别处理两种情况。
所有的请求都会在response中获取url,以及返回的相关数据。
可在这里处理你想要处理的逻辑。

将mian.js注入到页面中
需要新建一个script.js

var mainFile = chrome.extension.getURL('./main.js')
var scriptTag = document.createElement('script')
scriptTag.type = 'text/javascript'
scriptTag.src = mainFile
document.documentElement.appendChild(scriptTag)

拦截请求是需要申请权限的
在manifest.json加入

"permissions": [
    "storage",
    "scripting",
    "<all_urls>"
  ],
"content_scripts": [
    {
      "css": [
        "css/index.css"
      ],
      "matches": [
        "<all_urls>"
      ],
      "js": [
        "./script.js"
      ]
    }
  ],
  "web_accessible_resources": ["inject/main.js"]

在这推荐一个开源请求拦截插件:ajax interceptor
大家可以阅读相关的源码。我也是从中学习到的。后续会更新v3版的网络请求拦截。感谢大家的观看。如有问题,欢迎评论区交流。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容