Chrome 浏览器 Manifest V3 版本中 scripting API 解析

这篇具有很好参考价值的文章主要介绍了Chrome 浏览器 Manifest V3 版本中 scripting API 解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Chrome 浏览器 Manifest V3 版本中 scripting API 解析

chrome.scripting

使用 chrome.scripting API 在不同上下文中执行脚本。

可以使用 chrome.scripting APIJavaScriptCSS 注入网站。

一、所需权限

  • scripting

二、Manifest 配置

使用 chrome.scripting API,需要在 manifest.json 中声明 scripting 权限,以及要向其注入脚本的网页的主机权限。使用 host_permissions 关键字或 activeTab 权限。

{
  "name": "Scripting Extension",
  "manifest_version": 3,
  "permissions": ["scripting", "activeTab"],
}

三、注入

  • 使用 target 参数指定要向其注入 JavaScriptCSS 的目标。
  • 唯一的必填字段是 tabId

1. 注入脚本

// 获取 tab ID 
function getTabId() {  }
// 注入脚本
chrome.scripting.executeScript({
  target : {tabId : getTabId()},
  files : [ "script.js" ],
}).then(() => console.log("script injected"));

2. 注入代码

function getTabId() { ... }
function getUserColor() { ... }

function changeBackgroundColor() {
  document.body.style.backgroundColor = getUserColor();
}

chrome.scripting.executeScript({
  target : {tabId : getTabId()},
  func : changeBackgroundColor,
}).then(() => console.log("injected a function"));

3. 传递参数

function getTabId() { ... }
function getUserColor() { ... }
function changeBackgroundColor(backgroundColor) {
  document.body.style.backgroundColor = backgroundColor;
}

chrome.scripting.executeScript({
  target : {tabId : getTabId()},
  func : changeBackgroundColor,
  args : [ getUserColor() ],
}).then(() => console.log("injected a function"));

4. 注入 CSS

function getTabId() { ... }
const css = "body { background-color: red; }";

chrome.scripting.insertCSS({
  target : {tabId : getTabId()},
  css : css,
}).then(() => console.log("CSS injected"));

5. 取消所有脚本

async function unregisterAllDynamicContentScripts() {
  try {
    const scripts = await chrome.scripting.getRegisteredContentScripts();
    const scriptIds = scripts.map(script => script.id);
    return chrome.scripting.unregisterContentScripts(scriptIds);
  } catch (error) {
    const message = [
      "An unexpected error occurred while",
      "unregistering dynamic content scripts.",
    ].join(" ");
    throw new Error(message, {cause : error});
  }
}

四、类型(Types)

1. ContentScriptFilter

属性
  • ids:string[] 可选
    • 如果指定,getRegisteredContentScripts 将仅返回具有此列表中指定的 ID 的脚本

2. CSSInjection

属性
  • css: string可选
    • 包含要注入的 CSS 的字符串。
  • files: string[] 可选
    • 要注入的 CSS 文件的路径(相对于扩展程序的根目录)。必须指定 files 和 css 中的一个。
  • origin: StyleOrigin 可选
    • 注入的样式来源。默认为 AUTHOR
  • target: InjectionTarget
    • 指定要在其中插入 CSS 的目标的详细信息。

3. ExecutionWorld

要在其中执行脚本的 JavaScript 环境。

枚举值
  • ISOLATED
    • 指定独立的环境,是扩展程序独有的执行环境。
  • MAIN
    • 指定 DOM 的主环境,与托管网页的 JavaScript 共享的执行环境。

4. InjectionResult

属性
  • documentId: string
    • 与注入相关的文档。
  • frameId: number
    • 与注入相关的帧。
  • result: any 可选
    • 脚本执行的结果。

5. InjectionTarget

属性
  • allFrames: boolean 可选
    • 是否将脚本注入标签页内的所有帧。默认值为 false。如果指定了 frameIds,则此值不能为 true
  • documentIds: string[] 可选
    • 要注入到的特定 documentId 的 ID。如果已设置 frameIds,则不能设置此字段。
  • frameIds: number[] 可选
    • 要注入到的特定帧的 ID
  • tabId: number
    • 要注入的标签页的 ID

6. RegisteredContentScript

属性
  • allFrames: boolean 可选
    • 如果指定 true,它将注入所有帧中,即使帧不是标签页中最顶层的帧。系统会单独检查每个框架是否符合网址要求;如果不符合网址要求,该框架将不会注入到子框架中。默认值为 false,表示仅匹配顶部帧。
  • css: string[] 可选
    • 要注入到匹配页面的 CSS 文件列表。在为网页构建或显示任何 DOM 之前,这些对象会按照它们在此数组中显示的顺序进行注入。
  • excludeMatches: string[] 可选
    • 不包括此内容脚本将被注入的网页。
  • id: string 必填项
    • API 调用中指定的内容脚本的 ID。不得以“_”开头,因为该字符已预留为生成的脚本 ID 的前缀。
  • js: string[] 可选
    • 要注入到匹配页面的 JavaScript 文件的列表。这些引用会按照它们在此数组中出现的顺序进行注入。
  • matchOriginAsFallback: boolean 可选
    • 指明在网址包含不受支持的架构的帧中,是否可以注入脚本,具体来说就是:about:data:blob:filesystem:。在这些情况下,系统会检查网址的来源,以确定是否应注入脚本。如果源是 null(与 data: 网址一样),则所使用的源将是创建当前帧的帧或启动到此帧的导航的帧。请注意,该框架可能不是父框架。
  • matches: string[] 可询啊
    • 指定将此内容脚本注入到哪些网页。必须为 registerContentScripts 指定。
  • persistAcrossSessions: boolean 可选
    • 指定此内容脚本是否将在以后的会话中持续存在。默认值为 true
  • runAt: RunAt 可选
    • 指定何时将 JavaScript 文件注入网页。默认值为 document_idle
  • world: ExecutionWorld: 可选
    • 要在其中运行脚本的 JavaScript world 。默认为 ISOLATED

7. ScriptInjection

属性
  • args: any[] 可选
    • 提供给提供的函数中的 curry 参数。仅当指定了 func 参数时,此属性才有效。这些参数必须可进行 JSON 序列化。
  • files: string[] 可选
    • 要注入的 JSCSS 文件的路径(相对于扩展程序的根目录)。必须且只能指定 files 和 func 中的一个。
  • injectImmediately: boolean 可选
    • 是否应尽快在目标中触发注入。并不保证注入一定会在网页加载之前发生,因为在脚本到达目标时,网页可能已经加载完毕。
  • target: InjectionTarget 必填项
    • 详细说明将脚本注入到的目标。
  • world: ExecutionWorld 可选
    • 要在其中运行脚本的 JavaScript world。默认为 ISOLATED
  • func 可选
    • 要注入的 JavaScript 函数。系统将对此函数进行序列化,然后进行反序列化以供注入。这意味着所有绑定的参数和执行上下文都将丢失。必须且只能指定 files 和 func 中的一个。

func 函数如下所示:

()=> {}

8. StyleOrigin

样式更改的来源。

CSS 中,样式更改的来源分为三类。这些类别称为 style origins。它们是 user agent originuser originauthor origin

枚举值
  • User-agent
  • User
  • Author

五、方法(Methods)

1. executeScript()

将脚本注入目标上下文。该脚本将在 document_idle 运行。如果脚本的计算结果是一个 promise,则浏览器将等待该 promise 得到解决并返回结果值。

1. 示例
chrome.scripting.executeScript(
  injection:
  ScriptInjection,
  callback?:
  function,
)
2. 参数
  • injection: ScriptInjection
    • 脚本的详细信息
  • callback: function 可选
    • (results: InjectionResult[])=>void
3. 返回
  • Promise<InjectionResult[]>

2. getRegisteredContentScripts()

返回此扩展程序中与指定过滤器匹配的所有动态注册的内容脚本。

1. 示例
chrome.scripting.getRegisteredContentScripts(
  filter?:
  ContentScriptFilter,
  callback?:
  function,
)
2. 参数
  • filter: ContentScriptFilter 可选
    • 用于过滤扩展程序动态注册的脚本的对象。
  • callback: function 可选
    • (scripts: RegisteredContentScript[])=>void
3. 返回
  • Promise<RegisteredContentScript[]>

3. insertCSS()

CSS 样式表插入目标上下文。如果指定了多个帧,系统会忽略不成功的注入。

1. 示例
chrome.scripting.insertCSS(
  injection:
  CSSInjection,
  callback?:
  function,
)
2. 参数
  • injection: CSSInjection
    • 要插入的样式的详细信息。
  • callback: function 可选
    • ()=>void
3. 返回
  • Promise<void>

4. registerContentScripts()

为此扩展程序注册一个或多个内容脚本。

1. 示例
chrome.scripting.registerContentScripts(
  scripts:
  RegisteredContentScript[],
  callback?:
  function,
)
2. 参数
  • scripts: RegisteredContentScript[]
    • 包含要注册的脚本的列表。
  • callback: function 可选
    • ()=>void
3. 返回
  • Promise<void>

5. removeCSS()

从目标上下文中移除此扩展程序之前插入的 CSS 样式表。

1. 示例
chrome.scripting.removeCSS(
  injection:
  CSSInjection,
  callback?:
  function,
)
2. 参数
  • injection: CSSInjection
    • 要移除的样式的详细信息。
  • callback: function 可选
    • ()=>void
3. 返回
  • Promise<void>

6. unregisterContentScripts()

Promise Chrome 96 及更高版本

为此扩展程序取消注册内容脚本。

1. 示例
chrome.scripting.unregisterContentScripts(
  filter?:
  ContentScriptFilter,
  callback?:
  function,
)
2. 参数
  • filter: ContentScriptFilter 可选
    • 如果指定,则仅取消注册与过滤条件匹配的动态内容脚本。否则,该扩展程序的所有动态内容脚本都会被取消注册。
  • callback: function 可选
    • ()=>void
3. 返回
  • Promise<void>

7. updateContentScripts()

更新此扩展程序的一个或多个内容脚本。文章来源地址https://www.toymoban.com/news/detail-805436.html

1. 示例
chrome.scripting.updateContentScripts(
  scripts:
  RegisteredContentScript[],
  callback?:
  function,
)
2. 参数
  • scripts: RegisteredContentScript
    • 包含要更新的脚本列表。
  • callback: function 可选
    • ()=>void
3. 返回
  • Promise<void>

引用

  • 【scripting】

到了这里,关于Chrome 浏览器 Manifest V3 版本中 scripting API 解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows下多Chrome谷歌浏览器版本共存

    某些年代久远的 WEB 应用,必须在指定的浏览器或版本才能正常运行😂,此时就需要多个版本 chrome 浏览器共存。 可以从 https://www.chromedownloads.net/ 下载需要的版本,此处下载的是 87.0.4280.141_chrome64_stable_windows_installer.exe 本文使用的解压工具为 7-zip 把上图的 7z 文件解压到指定

    2024年02月06日
    浏览(57)
  • 在Mac电脑上同时运行不同版本的chrome浏览器

    正好最近有个需求,然后要在低版本的chrome上看看有些新的api能否跑起来,但是现在用的chrome版本是最新的112.X的,我随便下载了个低版本的浏览器,但是下完后,打开这个低版本的chrome,查看版本信息,发现还是最新的112.X。 我就很纳闷,上网查资料,发现很多答案都是让

    2024年02月09日
    浏览(72)
  • 同一操作系统中安装多个不同版本谷歌Chrome浏览器

    本来我电脑上已经有103版本的Chrome浏览器: 1. 现在我需要安装一个89版本的Chrome浏览器,我已经有该版本的.exe文件: 如果没有该安装包的,https://www.chromedownloads.net/chrome64win/ 通过这个网址可以下载到相应版本的chrome浏览器, 记住,必须时离线安装包,不能是在线安装包。

    2024年02月05日
    浏览(40)
  • Chrome/Safari 浏览器怎么查看网络请求的 http 协议版本

    通过 Chrome 或者 Safari 浏览器的开发者工具查看网络请求后,发现只能看到 scheme 是 https,但是看不到 http 协议是 1.1 还是 2,亦或者是 http3 查看 http 请求 http 协议版本的方法是:鼠标右键表头中的任何一项,随后勾选上「Protocol」 随后可以看到新增了一列 Protocol,显示了 htt

    2024年02月15日
    浏览(41)
  • 找不到和chrome浏览器版本不同的chromedriver的解决方法

    某一天我很久没有chromedriver之后,发现我的google版本是下图这样 打开这个网站下载新版本的chromedriver,我发现没有103.0.5060.114。虽然我不知道为什么没有但是问题总是要解决啊! chromedriver下载地址:http://chromedriver.storage.googleapis.com/index.html 于是我下载了103.0.5060.134版本的chrom

    2024年02月11日
    浏览(40)
  • Selenium根据Chrome浏览器版本自动下载/更新驱动chromedriver.exe

    个人经常使用到 selenium 来控制浏览器进行相关的操作,但是 Chrome浏览器 经常会自动更新,导致已有的 驱动程序chromedriver.exe 失效,需要重新下载。 以前尝试过禁止Chrome浏览器更新,但是这并不是很好的解决方案。 于是换了个方向,既然Chrome浏览器会自动更新,那么在我使

    2024年02月09日
    浏览(56)
  • 最新版本chrome浏览器出现的跨域问题及解决方案

    最近将chrome浏览器更新到了最新版本 ,在个别网站上出现了跨域访问问题。 目录 解决办法: (1)增加参数配置代码 (2)重新打开浏览器 在桌面快捷方式中右键》属性》快捷方式中的目标后面加入以下参数配置代码 注意:其中chrome.exe与--disable之间有一个空格 然后重新打

    2024年02月06日
    浏览(40)
  • chrome浏览器跨域设置(版本号108之后的跨域设置)

    1、首先在chrome浏览器安装目录下复制chrome.exe,生成一个新的命名为chrome-cross.exe 注意:为什么要在目录下复制一个新的?是因为如果名字相同,可能会导致设置好的跨域浏览器打开后跟原来的chrome.exe是同一个浏览器,设置的跨域浏览器就不是生效了。 2、点击 chrome-cross.exe

    2024年02月15日
    浏览(40)
  • chrome.exe版本不对selenium进行爬虫时无法启动谷歌浏览器

    问题描述:由于谷歌浏览器升级,导致谷歌驱动chrome.exe版本不对,使用selenium进行爬虫时无法启动谷歌浏览器。  解决方法:1. 在谷歌浏览器的设置下,查看浏览器的Chrome版本号。  2. 进入CNPM Binaries Mirror网页,下载对应版本的谷歌驱动器。本文的浏览器是103.0.5060.53,故下载

    2024年02月12日
    浏览(45)
  • 使用selenium,但chrome无法启动,需要安装浏览器对应版本(最新)的chromedriver

    使用selenium无法启动chrome,代码 报错如下: 安装地址 查询了浏览器版本:117.0.5927 但是国内的镜像网找不到,只更新到114版本 需要安装驱动,点击了最下面的网址 https://chromedriver.chromium.org/home 如图为有效信息 - 点击跳转: https://googlechromelabs.github.io/chrome-for-testing (点击这里

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包