Chrome 扩展:将用户输入字符串插入多个 declarativeNetRequest regexSubstitution 规则

问题描述

我有一个扩展,用字符串 WTTDOTM 替换 URL 中的 UTM 参数。它的工作原理是拥有多个规则集,每个规则集都有一个单独的 regexSubstitution 规则。我这样做是因为如果我有多个规则试图在同一个规则集中进行正则表达式替换,那么似乎只有一个执行(这会有点相关)。

这是规则之一。 我想知道是否有办法收集用户输入并让 json 引用该输入,以便代替 "regexSubstitution": "\\1WTTDOTM\\2" 规则更改为 { {1}}。

utmsource.json

"regexSubstitution": "\\1[USER_INPUT]\\2"

manifest.json(没有额外规则的简化,它们都遵循上面的格式,只是用utm_medium/campaign/term/content替换了utm_source:

[
{
    "id": 1,"priority": 1,"action": {
      "type": "redirect","redirect": { "regexSubstitution": "\\1WTTDOTM\\2" }
    },"condition": {
      "regexFilter": "(.*?utm_source=).+?($|\\&.*)","resourceTypes": ["main_frame"]
    }
  }
]

我知道我可以使用 updateDynamicrules 创建动态规则,但似乎所有动态规则都存在于同一个规则集中,这就是之前的多个 regexSubstitution 冲突变得相关的地方,因为除非有一种方法可以创建多个不同的动态规则集,只有一个替换会实际执行。

任何帮助将不胜感激!

编辑----

以下是一个包​​含多个 regexSubstitution 规则的 json 规则集示例:

对于示例输入 { "manifest_version": 3,"name": "CustomUTM","version": "1.0","description": "Custom UTM Extension","declarative_net_request": { "rule_resources": [ { "id": "ruleset_1","enabled": true,"path": "utmsource.json" } ] },"host_permissions": ["*://*/*"],"permissions": ["declarativeNetRequest","declarativeNetRequestFeedback"],"icons": { "128": "icon128.png" } }

实际输出https://about.fb.com/regulations/?utm_source=programmatic&utm_medium=paid-offplatform&utm_term=fillerterm&utm_content=fillercontent

虽然所需的输出https://about.fb.com/regulations/?utm_source=programmatic&utm_medium=paid-offplatform&utm_term=fillerterm&utm_content=WTTDOTM

它总是只完成具有最大优先级 # 的规则。这就是为什么我担心 updateDynamicrules,除非我可以使用一些奇怪的正则表达式将这 4 条规则压缩为 1 以进行替换。

压缩规则集.json

https://about.fb.com/regulations/?utm_source=WTTDOTM&utm_medium=paid-WTTDOTM&utm_term=WTTDOTM&utm_content=WTTDOTM

而如果我像这样执行多个规则集,我会得到所需的输出

utmsource.json

[
{
    "id": 1,"resourceTypes": ["main_frame"]
    }
  },{
    "id": 2,"priority": 2,"condition": {
      "regexFilter": "(.*?utm_medium=).+?($|\\&.*)",{
    "id": 3,"priority": 3,"condition": {
      "regexFilter": "(.*?utm_term=).+?($|\\&.*)",{
    "id": 4,"priority": 4,"condition": {
      "regexFilter": "(.*?utm_content=).+?($|\\&.*)","resourceTypes": ["main_frame"]
    }
  }
]

utmmium.json

[
{
    "id": 1,"redirect": { "regexSubstitution": "\\1Fuck%20Off%20My%20Data\\2" }
    },"resourceTypes": ["main_frame"]
    }
  }
]

等等。这个清单看起来像这样:

manifest.json

[
  {
    "id": 1,"resourceTypes": ["main_frame"]
    }
  }
]

解决方法

对查询部分使用 transform 操作,而不是 regexSubstitution,并使用与所有参数匹配的条件。

"condition": {
  "regexFilter": "[?&]utm_(source|medium|term|content)=[^&]+","resourceTypes": ["main_frame"]
},"action": {
  "type": "redirect","redirect": {
    "transform": {
      "queryTransform": {
        "addOrReplaceParams": [
          {"key": "utm_source","value": "foo"},{"key": "utm_medium",{"key": "utm_term",{"key": "utm_content","value": "foo"}
        ]
      }
    }
  }
}