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

Chrome Extension: insert a user input string into multiple declarativeNetRequest regexSubstitution rules

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

这是规则之一。 我想知道是否有办法收集用户输入并让 json 引用该输入,而不是 "regexSubstitution": "\1WTTDOTM\2" 规则更改为 "regexSubstitution": "\1[USER_INPUT]\2".

utmsource.json

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

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

{
    "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" }
}

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

如有任何帮助,我们将不胜感激!

编辑----

下面是一个包含多个正则表达式替换规则的 json 规则集的示例:

示例输入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

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

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

condensedruleset.json

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

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

utmsource.json

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

utmmedium.json

[
  {
    "id": 1,
    "priority": 1,
    "action": {
      "type": "redirect",
      "redirect": { "regexSubstitution": "\1Fuck%20Off%20My%20Data\2" }
    },
    "condition": {
      "regexFilter": "(.*?utm_medium=).+?($|\&.*)",
      "resourceTypes": ["main_frame"]
    }
  }
]

等等。清单如下所示:

manifest.json

{
    "manifest_version": 3,
    "name": "CustomUTM",
    "version": "1.3",
    "description": "Custom UTM Extension",
    "declarative_net_request": {
    "rule_resources": [
      {
        "id": "ruleset_1",
        "enabled": true,
        "path": "utmsource.json"
      },
      {
        "id": "ruleset_2",
        "enabled": true,
        "path": "utmmedium.json"
      },
      {
        "id": "ruleset_3",
        "enabled": true,
        "path": "utmcontent.json"
      },
      {
        "id": "ruleset_4",
        "enabled": true,
        "path": "utmcampaign.json"
      },
      {
        "id": "ruleset_5",
        "enabled": true,
        "path": "utmterm.json"
      }
    ]
  },
  "host_permissions": ["*://*/*"],
  "permissions": ["declarativeNetRequest", "declarativeNetRequestFeedback"],
    "icons": {
          "128": "icon128.png" }
}

对查询部分使用 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", "value": "foo"},
          {"key": "utm_term", "value": "foo"},
          {"key": "utm_content", "value": "foo"}
        ]
      }
    }
  }
}