我们可以通过谷歌浏览器插件,在别人的网站上注入自己的脚本。 我们叫这个脚本为 Content Scripts 。
content_scripts 到底有多强
就这么说吧, 他可以直接操作任意页面的 dom , 所以其强大可想而知了吧。
内容脚本在将扩展程序文件声明为可通过网络访问的资源后,便可访问它们。它们可以直接访问以下扩展程序 API:
- dom
- i18n
- storage
- runtime.connect()
- runtime.getManifest()
- runtime.getURL()
- runtime.id
- runtime.onConnect
- runtime.onMessage
- runtime.sendMessage()
内容脚本无法直接访问其他 API。但它们可以通过与扩展程序的其他部分交换消息来间接访问它们。
如何使用?
这里我们默认阁下已经看了我的第一篇文章, 浏览器插件入门:juejin.cn/post/736204…
所以我们直接开始
在manifest.json直接申明
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*/*"],
"css": ["my-styles.css"],
"js": ["content-script.js"]
}
],
...
}
这里进行一下简单的参数说明:
| 名称 | 类型 | 说明 |
|---|---|---|
matches | 字符串数组 | 必需。用于指定要将内容脚本注入到哪些网页。详细信息请参阅文档中的匹配模式说明及排除网址的相关文档。 |
css | 字符串数组 | 可选。列出要注入到匹配页面的 CSS 文件。元素将以数组中的顺序进行注入。 |
js | 字符串数组 | 可选。列出要注入到匹配页面的 JavaScript 文件。这些文件的顺序将决定注入的顺序。每个字符串都对应扩展根目录中的资源相对路径。前导斜杠将被自动剪除。 |
run_at | RunAt 枚举 | 可选。用于指定何时将脚本注入到网页中。 RunAt是一个枚举,指定了注入时机。默认值为 document_idle,表示在文档完成加载后注入。 |
match_about_blank | boolean | 可选。规定脚本是否应对 about:blank 帧进行注入,这些 is 父帧或源框架与 matches 项中定义的模式之一相匹配。值为 false时不进行注入。默认值为 false。 |
match_origin_as_fallback | boolean | 可选。规定脚本是否应注入由与 matches 项匹配的来源创建的 iframe,像 about:、data:、blob: 和 file: 等可能有不同架构的情况。详见文档中的相关说明。 |
world | ExecutionWorld 枚举 | 可选。用于指定执行脚本的 JavaScript 环境。 ExecutionWorld是枚举类型,定义了不同环境。默认值为 ISOLATED,表示在一个隔离的世界中进行脚本执行。详见文档中的隔离环境中作业说明。 |
配置好 JS 之后, 我们就可以直接写我们注入脚本的内容了。 直接编写 JS 即可。
编写脚本, 统计当前访问的技术文章的字数 与 使用的图片链接
这个就没有啥好说的了。 直接代码上墙: content-script.js
"use strict";
const $article = document.getElementById("article-root");
if ($article) {
const wordLength = $article.innerText.length;
const $imgs = $article.querySelectorAll("img");
const $container = document.createElement("div");
const $wordsElement = document.createElement("p");
$wordsElement.innerText = `统计该文章字符:共计 ${wordLength} 个字符`;
$container.append($wordsElement);
const $desc = (document.createElement("p").innerText = "提取该文章的所有图片");
$container.append($desc);
for (const img of $imgs) {
const src = img.getAttribute("src");
if (src) {
const $p = document.createElement("p");
const $a = document.createElement("a");
$a.setAttribute("href", src);
$a.setAttribute("target", "_blank");
$a.innerText = src;
$p.append($a);
$container.append($p);
}
}
document.getElementsByClassName("author-info-block")?.[0]?.insertAdjacentElement("afterend", $container);
}
最基础的 dom 操作, 没有啥好说的。 来看看效果吧。