在插件Manifest V3中,废弃webRequest API,替换成declarativeNetRequest API。
简介
chrome.declarativeNetRequest API 用于通过指定声明性规则来阻止或修改网络请求。这让扩展程序可以修改网络请求,而无需拦截它们并查看其内容,从而提供更多隐私。
生命周期
规则集
使用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/abcd | ab.com |
"abc*d" | abcd.com example.com/abcxyzd | abc.com |
"||a.example.com" | a.example.com/ baexample.com/xyz | example.com/ |
"|https*" | example.com | example.com/ https.com |
"example*^123|" | example.com/123 abc.com/example?123 | example.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"]
}
}
]