Chrome Extension网络篇

1,244 阅读4分钟

在插件Manifest V3中,废弃webRequest API,替换成declarativeNetRequest API。

简介

chrome.declarativeNetRequest API 用于通过指定声明性规则来阻止或修改网络请求。这让扩展程序可以修改网络请求,而无需拦截它们并查看其内容,从而提供更多隐私。

生命周期

Manifest V2

规则集

使用declarativeNetRequest对网络请求做处理,实质上是定义一些json格式的规则,这些规则会匹配所有的网络请求,并遵从这些规则做相应处理。

权限

在配置规则集之前,需要开启对应权限:

manifest.json

{
  "permissions": [
      "declarativeNetRequest", 
      "declarativeNetRequestWithHostAccess", 
      "declarativeNetRequestFeedback"
  ],
  "host_permissions": ["<all_urls>"]
}
  • declarativeNetRequest:升级或者阻止请求不需要申请"host_permissions",但是如果需要重定向请求,或者修改请求头,则要申请相应的"host_permissions"
  • declarativeNetRequestWithHostAccess:>= Chrome 96,任何功能都需要申请相应的"host_permissions"
  • declarativeNetRequestFeedback:可以使用调式方法onRuleMatchedDebug和匹配规则成功方法getMatchedRules

静态规则集配置

静态规则配置分为两步,如下:

1.创建一个配置规则集的json文件

rule.json

[
  {
    "id": 1,
    "priority": 1,
    "action": { "type": "block" },
    "condition": {
      "urlFilter": "*static*",
      "domains": ["bdstatic.com"], // 百度静态资源域名
      "resourceTypes": ["script"]
    }
  }
]

2.manifest.json中添加declarative_net_request,并指向配置规则集的json文件

manifest.json:

{
  "name": "demo1",
  "declarative_net_request": {
    "rule_resources": [
      {
        "id": "ruleset",
        "enabled": true,
        "path": "rules.json"
      }
    ]
  },
  "permissions": ["declarativeNetRequest"],
  "host_permessions": ["<all_urls>"]
}

rule_resources中有三个参数:

  • id:每个规则集需要对应一个id
  • enabled:默认这个规则集是否启用
  • path:配置规则的json文件地址

动态规则集配置

直接在background script中添加规则即可

background.ts

chrome.declarativeNetRequest.updateDynamicRules(
  {
    addRules: [
      {
        id: 1,
        priority: 1,
        action: { type: 'block' },
        condition: {
          urlFilter: '*^static^*|',
          domains: ['bdstatic.com'],
          resourceTypes: ['script']
        }
      }
    ]
  }
)

规则配置

一个规则以对象的格式定义,其中有四个属性:id、priority、action、condition

id

每个规则需要对应一个id,不同的规则不能设置相同的id

priority

优先级,填一个数字,数字越大,优先级越高

action

如果规则匹配,则采取的操作。有以下四个参数。

1.type: 必填参数,操作的类型,参数为:"block"(拦截请求), "redirect"(重定向请求), "allow"(允许请求), "upgradeScheme"(升级请求), "modifyHeaders"(修改请求头), 或"allowAllRequests"(允许所有请求)。

2.redirect:选填,只有操作类型为redirect时才可填,描述应该如何执行重定向,标黄为重点。

  • extensionPath:相对于扩展目录的路径。应该以'/'开头。
  • regexSubstitution:指定正则表达式过滤器的规则的替换模式.
  • url:需要重定向到的网址,不可以重定向到javascript url
  • transform:url转换
  • requestHeaders:选填,只有操作类型为modifyHeaders时才可填,用于修改请求头
  • responseHeaders:选填,只有操作类型为modifyHeaders时才可填,用于修改响应头

condition

触发此规则的条件。有以下参数,皆是选填参数,由于参数较多,标黄的五个为常用参数(域名匹配、请求方法匹配、资源类型匹配、url匹配)。

1.domainType:指定网络请求是发起它的域的"firstParty"(第一方)还是"thirdParty"(第三方)。如果省略,则接受所有请求。

2.domains:匹配域名列表,如省略则匹配所有域名的请求。

3.excludedDomains:和domains相反,指定一个排除匹配规则的域名列表,优先级高于domains

4.requestMethods:http匹配请求方法("get"、"post"等)列表,如省略则匹配所有请求方法。

5.excludedRequestMethods:与requestMethods相反,排除一个请求方法列表,优先级高于requestMethods。

6.resourceTypes:匹配资源类型("main_frame"、""xmlhttprequest"等)列表,如省略则匹配所有请求类型。

7.excludedResourceTypes:跟resourceTypes相反。

8.tabIds:匹配tabid列表,如省略则匹配所有tabs页。

9.excludedTabIds:和tabIds相反。

10.isUrlFilterCaseSensitive:是否区分大小写,默认是true,区分大小写

11.regexFilter:匹配网络请求的正则表达式

12.urlFilter:匹配网络请求的url

匹配规则

这里的匹配规则跟正常的正则不太一样

匹配规则匹配不匹配
"abc"abcd.com example.com/abcdab.com
"abc*d"abcd.com example.com/abcxyzdabc.com
"||a.example.com"a.example.com/ baexample.com/xyzexample.com/
"|https*"example.comexample.com/ https.com
"example*^123|"example.com/123 abc.com/example?123example.com/1234 abc.com/example0123

'*': 通配符。匹配任何数量的字符。

'|' :左/右anchor。如果在模式的两端使用,分别指定url的开头/结尾。

'||':域名anchor。如果使用在模式的开头,指定URL的(子)域的开始。

'^':分隔符。它可以匹配除字母、数字或下列之一以外的任何东西。_ - . %. 这也可以匹配URL的结尾。

因此,urlFilter由以下部分组成:(可选的左/域名anchor)+模式+(可选的右anchor)。 如果省略,所有的URL都被匹配。不允许出现空字符串。

注意:

  • 不允许以||开头的模式。使用代替。
  • 只能指定urlFilter或regexFilter中的一个。

常见场景配置

修改求情头

stackoverflow.com/questions/6… QAQ

[
  {
    "id": 1,
    "priority": 10,
    "action": {
      "type": "modifyHeaders",
      "requestHeaders": [
        { "header": "Accept-Encoding", "operation": "remove" },
        { "header": "Accept-Language", "operation": "set", "value": "en;q=0.8" },
        { "header": "x-env-tt", "operation": "set", "value": "test" }
      ]
    },
    "condition": { "urlFilter": "*^sugrec*", "domains": ["baidu.com"], "resourceTypes": ["xmlhttprequest"] }
  }
]

阻止资源请求

[
  {
    "id": 9,
    "priority": 1,
    "action": {
      "type": "block"
    },
    "condition": { "urlFilter": "||bdstatic.com", "resourceTypes": ["stylesheet"] }
  }
]

URLTransform转换

[
  {
    "id": 5,
    "priority": 5,
    "action": {
      "type": "redirect",
      "redirect": {
        "transform": {
          "queryTransform": {
            "addOrReplaceParams": [
              {
                "key": "wd",
                "replaceOnly": true,
                "value": "我来看看"
              }
            ]
          }
        }
      }
    },
    "condition": {
      "urlFilter": "*^sugrec*",
      "domains": ["baidu.com"],
      "resourceTypes": ["xmlhttprequest"]
    }
  }
]