在 JS 中使用正则表达式从 Cloudflare cdn-cgi/trace 文本结果中提取 ip 和 uag
Posted
技术标签:
【中文标题】在 JS 中使用正则表达式从 Cloudflare cdn-cgi/trace 文本结果中提取 ip 和 uag【英文标题】:Extract ip and uag from Cloudflare cdn-cgi/trace text result using regex in JS 【发布时间】:2020-10-23 08:46:27 【问题描述】:您好,我计划使用 Cloudflare cdn-cgi 跟踪服务来获取客户端 IP 和用户代理结果。如果我获取此链接:https://www.cloudflare.com/cdn-cgi/trace
,我得到的结果是文本格式。
结果文本示例:
fl=47f54
h=www.cloudflare.com
ip=11.111.11.11
ts=1597428248.652
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/83.0.4103.116 Safari/537.36
colo=OH
http=http/2
loc=US
tls=TLSv1.3
sni=plaintext
warp=off
我做了一些研究,发现我需要使用正则表达式?但不确定如何从结果中仅提取 ip 和 uag。
...
ip=11.111.11.11
...
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
...
对于我获取的每个结果,如何从上述文本中提取结果 11.111.11.11
(所有客户端的 ip 更改)和 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
(所有客户端的 uag 或用户代理更改)?
【问题讨论】:
This 可能会有所帮助。如果有帮助,请告诉我? 感谢您的帮助。 【参考方案1】:你可以试试:
^(?:ip|uag)=(.*)$
上述正则表达式的解释:
^, $
- 分别代表行的开始和结束。
(?:ip|uag)
- 表示匹配 ip
或 uag
字面意思的非捕获组。
=
- 从字面上表示 =
。
(.*)
- 表示第一个匹配任何零个或多个时间且前面有 ip=
或 uag=
的处理组。
你可以在here.找到上述正则表达式的demo
const myRegexp = /^(?:ip|uag)=(.*)$/gm;
const myString = `fl=47f54
h=www.cloudflare.com
ip=11.111.11.11
ts=1597428248.652
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
colo=OH
http=http/2
loc=US
tls=TLSv1.3
sni=plaintext
warp=off`;
let match;
let resultString = "";
match = myRegexp.exec(myString);
while (match != null)
resultString = resultString.concat(match[1] + "\n");
match = myRegexp.exec(myString);
console.log(resultString);
第二种方法:
const myString = `fl=47f54
h=www.cloudflare.com
ip=11.111.11.11
ts=1597428248.652
visit_scheme=https
uag=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
colo=OH
http=http/2
loc=US
tls=TLSv1.3
sni=plaintext
warp=off`;
// Split on new line filter on the condition that element starts with ip or uag and join
console.log(myString.split("\n").filter(el => el.startsWith("ip") || el.startsWith("uag")).join('\n'));
【讨论】:
【参考方案2】:如何将其转换为 JSON 然后访问它。
async function getCloudflareJSON()
let data = await fetch('https://1.1.1.1/cdn-cgi/trace').then(res=>res.text())
let arr = data.trim().split('\n').map(e=>e.split('='))
return Object.fromEntries(arr)
getCloudflareJSON().then(console.log)
输出:
fl: "202f225", h: "1.1.1.1", ip: "47.37.137.777", ts: "1625581799.09", visit_scheme: "https", …
参考: Link1
【讨论】:
以上是关于在 JS 中使用正则表达式从 Cloudflare cdn-cgi/trace 文本结果中提取 ip 和 uag的主要内容,如果未能解决你的问题,请参考以下文章