当我单击一个链接(或被一个站点重定向)时,我希望用一个不同的通用值替换请求URL中的各种跟踪参数的值。对于这个例子,让我们使用我的用户名,这样一个链接指向
www.abc.com/?utm_source=originalsource&utm_campaign=originalcampaign&cid=originalcid&gclid=originalgclid
会变成www.abc.com/?utm_source=WTTDOTM&utm_campaign=WTTDOTMcampaign&cid=WTTDOTM&gclid=WTTDOTM
重要的是,在发送请求之前对这些参数进行编辑,因为这样做是为了避免UTM/cid/gclid/etc跟踪,并在查看这些跟踪参数的人的流量数据中留下标记。我知道我必须使用webRequest,逻辑看起来很简单,但我不知道如何用js动态地在URL中找到和替换。这个答案看起来是我所要求的最接近的,但我不知道只修改一个URL的较小的片段会如何工作,因为我对javascript非常缺乏经验,而且我大部分的编码知识都只是把东西放在一起,直到它起作用为止。
首先是一个简单的子问题,我的问题是:在请求页面之前,如何使用webRequest API在utm_campaign=***
中替换utm_campaign=WTTDOTM
?
编辑:
@wOxxOm感谢您的帮助!我想我现在已经有了总体结构,但我仍然在挣扎于正则表达式规则的格式,这是我非常不熟悉的。按照我的理解,规则^(.*?utm_source=)(.+?(?=\\&)|$)(.*)
(和它的“中介”变体)将捕获'utm_source=‘之前的所有值到第1组中,在'&’之后捕获所有值(如果它是最后一个参数,则没有值)到第3组,然后我应该能够生成regexSubstition group1+WTTDOTM+group3,对吗?当我当前试图上传下面解压缩的扩展名时,会遇到一个错误,上面写着"rules.json: Rule 1“指定"regexFilter”键的不正确值。我想我只是格式化错误,但我不知道我需要修复什么。你能帮上忙吗?这是我的rules.json和manifest.json文件。
rules.json
[
{
"id": 1,
"priority": 1,
"action": {
"type": "redirect",
"redirect": {
"regexSubstitution": "\\1WTTDOTM\\3"
}
},
"condition": {
"regexFilter": "^(.*?utm_source=)(.+?(?=\\&)|$)(.*)",
"resourceTypes": [
"main_frame"
]
}
},
{
"id": 2,
"priority": 2,
"action": {
"type": "redirect",
"redirect": {
"regexSubstitution": "\\1WTTDOTM\\3"
}
},
"condition": {
"regexFilter": "^(.*?utm_medium=)(.+?(?=\\&)|$)(.*)",
"resourceTypes": [
"main_frame"
]
}
}
]
manifest.json
{
"manifest_version": 2,
"name": "WTTDOTM is a UTM",
"version": "1.3",
"permissions": [
"declarativeNetRequest",
"declarativeNetRequestFeedback",
"<all_urls>"
],
"description": "Replaces all UTM values with 'WTTDOTM'",
"declarative_net_request" : {
"rule_resources" : [{
"id": "1",
"enabled": true,
"path": "rules.json"
},
{
"id": "2",
"enabled": true,
"path": "rules.json"
}],
"icons": {
"128": "icon128.png" }
}
}
发布于 2021-03-23 00:42:34
使用正则表达式可能不是不可能做到这一点,但这将是令人沮丧的。您试图捕获的文本可能包含几乎任何内容,因此构建一个正则表达式来捕获--每个查询参数后面的内容和每个查询参数之后的内容--将非常困难。相反,我建议使用在URLSearchParams API中内置的Chrome。
结合Javascript的URL对象,您想要做的事情可能如下所示:
const replaceTrackerParams = (urlString, replacementString) => {
const url = new URL(urlString);
const params = new URLSearchParams(url.search);
// If campagin parameters exist, replace them
params.has('utm_source') && params.set('utm_source', replacementString)
params.has('utm_campaign') && params.set('utm_campaign', replacementString)
// Return modified URL
return url.hostname + '?' + params.toString()
}
根据需要用更复杂的逻辑替换速记语法。
另一个答案是使用declarativeNetRequest,因为它是更新的、更有效的API。这是真的,但我认为它还不支持回调函数。
https://stackoverflow.com/questions/66730060
复制相似问题