在 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) - 表示匹配 ipuag 字面意思的非捕获组。 = - 从字面上表示 =(.*) - 表示第一个匹配任何零个或多个时间且前面有 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的主要内容,如果未能解决你的问题,请参考以下文章

第1670期浅谈正则表达式原理

使用正则表达式从对象中检索值 - JS [关闭]

在js中使用正则表达式从字符串中提取正确的用户名

使用 JS 正则表达式从 html 中删除所有脚本标签

js 正则表达式记录所有在js中使用正则表达式的情况

js使用正则表达式从url中获取参数值