[{"data":1,"prerenderedAt":981},["ShallowReactive",2],{"$fJmKkflejsPS8r0Nvs8-q2YK9HcZ6UFGPAIpsiM6ey7w":3,"cfn":35},[4,17,24],{"slug":5,"title":6,"lang":7,"desc":8,"date":9,"tags":10,"edit":9,"readingTime":11,"content":16},"cf-network","如何在网站显示当前使用的 Cloudflare 网络","zh-hans","通过解析 Cloudflare 的 \u002Fcdn-cgi\u002Ftrace 接口获取当前网络节点 ID，再结合 Cloudflare Status 的公共 API 匹配出节点名称，从而在网站上动态显示访客正在使用的 Cloudflare 网络名称。","2026-05-24T00:00:00.000Z",[],{"text":12,"minutes":13,"time":14,"words":15},"3 min read",2.57,154200,514,"\u003Cp>今天凌晨给我的个人网站加了一个小功能，就是在网站显示当前使用的 Cloudflare 网络。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-preview.png\" alt=\"\">\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>翻到本网站的最底下，您应该就能看见实际显示的样式。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>实现方式\u003C\u002Fh3>\n\u003Cp>由 Cloudflare 代理的网站，通过访问 \u003Ccode>{domain}\u002Fcdn-cgi\u002Ftrace\u003C\u002Fcode> 可以获取当前使用的 Cloudflare 网络信息。样例如下：\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-plaintext\">\u003Cspan class=\"line\">\u003Cspan>fl=582f239\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>h=kuriyona.com\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>ip=64.90.0.218\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>ts=1779555940.000\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>visit_scheme=https\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>uag=Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\u002F537.36 (KHTML, like Gecko) Chrome\u002F149.0.0.0 Safari\u002F537.36 Edg\u002F149.0.0.0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>colo=HKG\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>sliver=none\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>http=http\u002F3\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>loc=HK\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>tls=TLSv1.3\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>sni=plaintext\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>warp=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>gateway=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>rbi=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>kex=X25519MLKEM768\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>通过解析其中的 \u003Ccode>colo\u003C\u002Fcode> 参数，我们可以获取当前使用的 Cloudflare 网络 ID，比如这里是 \u003Ccode>HKG\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>那么网络 ID 有了，我们就可以根据网络 ID 来显示当前使用的 Cloudflare 网络了。\u003C\u002Fp>\n\u003Cp>Cloudflare Status 提供了一个文件，列出了当前所有的 Cloudflare 网络状态信息。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Ccode>https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-status-api.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>文件的内容很杂，我们需要通过一个简单的脚本来获得我们需要的格式化信息。\u003C\u002Fp>\n\u003Cp>首先通过一个简单的正则表达式(\u003Ccode>^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u003C\u002Fcode>)来筛选复合网络节点的 \u003Ccode>name\u003C\u002Fcode> 字段，再对数据结构进行简化处理。（这里使用 ky 库来获取数据）\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-ts\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> res\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> res\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">components\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">test\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> ({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">match\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">^\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Za-z\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">,]+\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">-\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">*\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">(\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Z]{3}\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">)\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\)\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">$\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.[\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">1\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  }));\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>结合前文中获得的网络 ID，我们就可以获得实际的网络节点名称了。\u003C\u002Fp>\n\u003Ch3>代码实现\u003C\u002Fh3>\n\u003Cp>本站实际使用的代码可以查看 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKuriyona\u002FKuriyona\u002Fblob\u002Fmain\u002Fapp\u002Fcomposables\u002FuseCloudflareStatus.ts\">useCloudflareStatus.ts\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>以下是通用的 TypeScript 完整代码实现：\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-ts\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> from\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\"> 'ky'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\"> \u002F\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">^\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Za-z\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">,]+\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">-\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">*\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">(\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Z]{3}\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">)\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\)\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">$\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> NodeInfo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  colo\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">?\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  loc\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">?\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  [\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">key\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">]: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> CloudflareStatusResult\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">NodeInfo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">[] | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  location\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">export\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> async\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\"> getCloudflareStatus\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(): \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">Promise\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">CloudflareStatusResult\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F 获取节点数据\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesResponse\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesResponse\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">components\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">test\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> ({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">      name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">      code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">match\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.[\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">1\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    }));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F 获取 trace 数据\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceText\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">text\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> Object\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">fromEntries\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    traceText\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">split\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">includes\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'='\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">split\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'='\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  ) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">as\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F 计算当前节点名称\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">find\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">code\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> ===\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">colo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> location\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">loc\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  return\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    location\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  };\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n",{"slug":5,"title":18,"lang":19,"desc":20,"date":9,"tags":21,"edit":9,"readingTime":22,"content":23},"如何在網站顯示當前使用的 Cloudflare 網絡","zh-Hant","通過解析 Cloudflare 的 \u002Fcdn-cgi\u002Ftrace 接口獲取當前網絡節點 ID，再結合 Cloudflare Status 的公共 API 匹配出節點名稱，從而在網站上動態顯示訪客正在使用的 Cloudflare 網絡名稱。",[],{"text":12,"minutes":13,"time":14,"words":15},"\u003Cp>今天凌晨給我的個人網站加了一個小功能，就是在網站顯示當前使用的 Cloudflare 網絡。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-preview.png\" alt=\"\">\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>翻到本網站的最底下，您應該就能看見實際顯示的樣式。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>實現方式\u003C\u002Fh3>\n\u003Cp>由 Cloudflare 代理的網站，通過訪問 \u003Ccode>{domain}\u002Fcdn-cgi\u002Ftrace\u003C\u002Fcode> 可以獲取當前使用的 Cloudflare 網絡信息。樣例如下：\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-plaintext\">\u003Cspan class=\"line\">\u003Cspan>fl=582f239\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>h=kuriyona.com\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>ip=64.90.0.218\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>ts=1779555940.000\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>visit_scheme=https\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>uag=Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\u002F537.36 (KHTML, like Gecko) Chrome\u002F149.0.0.0 Safari\u002F537.36 Edg\u002F149.0.0.0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>colo=HKG\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>sliver=none\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>http=http\u002F3\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>loc=HK\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>tls=TLSv1.3\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>sni=plaintext\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>warp=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>gateway=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>rbi=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>kex=X25519MLKEM768\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>通過解析其中的 \u003Ccode>colo\u003C\u002Fcode> 參數，我們可以獲取當前使用的 Cloudflare 網絡 ID，比如這裏是 \u003Ccode>HKG\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Cp>那麼網絡 ID 有了，我們就可以根據網絡 ID 來顯示當前使用的 Cloudflare 網絡了。\u003C\u002Fp>\n\u003Cp>Cloudflare Status 提供了一個文件，列出了當前所有的 Cloudflare 網絡狀態信息。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Ccode>https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-status-api.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>文件的內容很雜，我們需要通過一個簡單的腳本來獲得我們需要的格式化信息。\u003C\u002Fp>\n\u003Cp>首先通過一個簡單的正則表達式(\u003Ccode>^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u003C\u002Fcode>)來篩選複合網絡節點的 \u003Ccode>name\u003C\u002Fcode> 字段，再對數據結構進行簡化處理。（這裏使用 ky 庫來獲取數據）\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-ts\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> res\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> res\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">components\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">test\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> ({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">match\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">^\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Za-z\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">,]+\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">-\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">*\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">(\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Z]{3}\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">)\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\)\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">$\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.[\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">1\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  }));\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>結合前文中獲得的網絡 ID，我們就可以獲得實際的網絡節點名稱了。\u003C\u002Fp>\n\u003Ch3>代碼實現\u003C\u002Fh3>\n\u003Cp>本站實際使用的代碼可以查看 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKuriyona\u002FKuriyona\u002Fblob\u002Fmain\u002Fapp\u002Fcomposables\u002FuseCloudflareStatus.ts\">useCloudflareStatus.ts\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>以下是通用的 TypeScript 完整代碼實現：\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-ts\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> from\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\"> 'ky'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\"> \u002F\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">^\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Za-z\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">,]+\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">-\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">*\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">(\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Z]{3}\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">)\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\)\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">$\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> NodeInfo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  colo\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">?\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  loc\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">?\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  [\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">key\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">]: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> CloudflareStatusResult\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">NodeInfo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">[] | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  location\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">export\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> async\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\"> getCloudflareStatus\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(): \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">Promise\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">CloudflareStatusResult\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F 獲取節點數據\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesResponse\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesResponse\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">components\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">test\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> ({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">      name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">      code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">match\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.[\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">1\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    }));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F 獲取 trace 數據\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceText\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">text\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> Object\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">fromEntries\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    traceText\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">split\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">includes\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'='\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">split\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'='\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  ) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">as\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F 計算當前節點名稱\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">find\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">code\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> ===\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">colo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> location\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">loc\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  return\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    location\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  };\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n",{"slug":5,"title":25,"lang":26,"desc":27,"date":9,"tags":28,"edit":9,"readingTime":29,"content":34},"How to Display the Current Cloudflare Network Used on a Website","en","By parsing Cloudflare's \u002Fcdn-cgi\u002Ftrace endpoint to obtain the current network node ID, and then matching the node name using Cloudflare Status's public API, you can dynamically display the name of the Cloudflare network that the visitor is using on your website.",[],{"text":30,"minutes":31,"time":32,"words":33},"2 min read",1.88,112800,376,"\u003Cp>Early this morning, I added a small feature to my personal website: displaying the current Cloudflare network in use.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-preview.png\" alt=\"\">\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>Scroll to the bottom of this website, and you should see the actual display style.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>Implementation Approach\u003C\u002Fh3>\n\u003Cp>For websites proxied by Cloudflare, visiting \u003Ccode>{domain}\u002Fcdn-cgi\u002Ftrace\u003C\u002Fcode> returns information about the Cloudflare network currently being used. Example output:\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-plaintext\">\u003Cspan class=\"line\">\u003Cspan>fl=582f239\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>h=kuriyona.com\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>ip=64.90.0.218\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>ts=1779555940.000\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>visit_scheme=https\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>uag=Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\u002F537.36 (KHTML, like Gecko) Chrome\u002F149.0.0.0 Safari\u002F537.36 Edg\u002F149.0.0.0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>colo=HKG\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>sliver=none\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>http=http\u002F3\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>loc=HK\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>tls=TLSv1.3\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>sni=plaintext\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>warp=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>gateway=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>rbi=off\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>kex=X25519MLKEM768\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>By parsing the \u003Ccode>colo\u003C\u002Fcode> parameter, we can obtain the current Cloudflare network ID — in this example, \u003Ccode>HKG\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Now that we have the network ID, we can display the corresponding Cloudflare network name.\u003C\u002Fp>\n\u003Cp>Cloudflare Status provides a file that lists the current status information of all Cloudflare networks.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>\u003Ccode>https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-status-api.png\" alt=\"\">\u003C\u002Fp>\n\u003Cp>The file content is quite messy, so we need a simple script to extract the formatted information we need.\u003C\u002Fp>\n\u003Cp>First, filter the \u003Ccode>name\u003C\u002Fcode> fields of network components using a simple regular expression (\u003Ccode>^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u003C\u002Fcode>), then simplify the data structure. (Here, we use the \u003Ccode>ky\u003C\u002Fcode> library to fetch data.)\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-ts\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> res\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> result\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> res\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">components\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">test\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> ({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">match\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">^\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Za-z\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">,]+\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">-\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">*\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">(\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Z]{3}\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">)\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\)\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">$\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.[\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">1\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  }));\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Combined with the network ID obtained earlier, we can now get the actual network node name.\u003C\u002Fp>\n\u003Ch3>Code Implementation\u003C\u002Fh3>\n\u003Cp>The actual code used on this site can be seen in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKuriyona\u002FKuriyona\u002Fblob\u002Fmain\u002Fapp\u002Fcomposables\u002FuseCloudflareStatus.ts\">useCloudflareStatus.ts\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>Below is a complete TypeScript implementation:\u003C\u002Fp>\n\u003Cpre class=\"shiki one-dark-pro\" style=\"background-color:#282c34;color:#abb2bf\" tabindex=\"0\">\u003Ccode class=\"language-ts\">\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> from\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\"> 'ky'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\"> \u002F\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">^\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Za-z\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">,]+\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">-\\s\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">*\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\(\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">(\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">[A-Z]{3}\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">)\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\)\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">$\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> NodeInfo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  colo\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">?\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  loc\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">?\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  [\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">key\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">]: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">interface\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> CloudflareStatusResult\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">NodeInfo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">[] | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">  location\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">string\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> | \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">undefined\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">export\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> async\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\"> getCloudflareStatus\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(): \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">Promise\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">CloudflareStatusResult\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F Fetch node data\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesResponse\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">json\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesResponse\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">components\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">test\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">c\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> ({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">      name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">      code\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">: \u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">match\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\">REGEX\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.[\u003C\u002Fspan>\u003Cspan style=\"color:#D19A66\">1\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">    }));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F Fetch trace data\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceText\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\"> await\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> ky\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">).\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">text\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> Object\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">fromEntries\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    traceText\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">split\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">filter\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">includes\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'='\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">      .\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">map\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> line\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">split\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">(\u003C\u002Fspan>\u003Cspan style=\"color:#98C379\">'='\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  ) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">as\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> TraceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#7F848E;font-style:italic\">  \u002F\u002F Determine current node name\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#61AFEF\">find\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">((\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75;font-style:italic\">n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">) \u003C\u002Fspan>\u003Cspan style=\"color:#C678DD\">=>\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> n\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">code\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> ===\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">colo\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">)?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">name\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  const\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> location\u003C\u002Fspan>\u003Cspan style=\"color:#56B6C2\"> =\u003C\u002Fspan>\u003Cspan style=\"color:#E5C07B\"> traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">?.\u003C\u002Fspan>\u003Cspan style=\"color:#E06C75\">loc\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#C678DD\">  return\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    nodesData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    traceData\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    currentNodeName\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E06C75\">    location\u003C\u002Fspan>\u003Cspan style=\"color:#ABB2BF\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">  };\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#ABB2BF\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n",[36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360,363,366,369,372,375,378,381,384,387,390,393,396,399,402,405,408,411,414,417,420,423,426,429,432,435,438,441,444,447,450,453,456,459,462,465,468,471,474,477,480,483,486,489,492,495,498,501,504,507,510,513,516,519,522,525,528,531,534,537,540,543,546,549,552,555,558,561,564,567,570,573,576,579,582,585,588,591,594,597,600,603,606,609,612,615,618,621,624,627,630,633,636,639,642,645,648,651,654,657,660,663,666,669,672,675,678,681,684,687,690,693,696,699,702,705,708,711,714,717,720,723,726,729,732,735,738,741,744,747,750,753,756,759,762,765,768,771,774,777,780,783,786,789,792,795,798,801,804,807,810,813,816,819,822,825,828,831,834,837,840,843,846,849,852,855,858,861,864,867,870,873,876,879,882,885,888,891,894,897,900,903,906,909,912,915,918,921,924,927,930,933,936,939,942,945,948,951,954,957,960,963,966,969,972,975,978],{"name":37,"code":38},"Amsterdam, Netherlands - (AMS)","AMS",{"name":40,"code":41},"Amman, Jordan - (AMM)","AMM",{"name":43,"code":44},"Adelaide, SA, Australia - (ADL)","ADL",{"name":46,"code":47},"Americana, Brazil - (QWJ)","QWJ",{"name":49,"code":50},"Accra, Ghana - (ACC)","ACC",{"name":52,"code":53},"Ahmedabad, India - (AMD)","AMD",{"name":55,"code":56},"Albuquerque, NM, United States - (ABQ)","ABQ",{"name":58,"code":59},"Auckland, New Zealand - (AKL)","AKL",{"name":61,"code":62},"Athens, Greece - (ATH)","ATH",{"name":64,"code":65},"Arica, Chile - (ARI)","ARI",{"name":67,"code":68},"Algiers, Algeria - (ALG)","ALG",{"name":70,"code":71},"Almaty, Kazakhstan - (ALA)","ALA",{"name":73,"code":74},"Astara, Azerbaijan - (LLK)","LLK",{"name":76,"code":77},"Anchorage, AK, United States - (ANC)","ANC",{"name":79,"code":80},"Ashburn, VA, United States - (IAD)","IAD",{"name":82,"code":83},"Brisbane, QLD, Australia - (BNE)","BNE",{"name":85,"code":86},"Barcelona, Spain - (BCN)","BCN",{"name":88,"code":89},"Baghdad, Iraq - (BGW)","BGW",{"name":91,"code":92},"Annaba, Algeria - (AAE)","AAE",{"name":94,"code":95},"Atlanta, GA, United States - (ATL)","ATL",{"name":97,"code":98},"Belgrade, Serbia - (BEG)","BEG",{"name":100,"code":101},"Baku, Azerbaijan - (GYD)","GYD",{"name":103,"code":104},"Bangalore, India - (BLR)","BLR",{"name":106,"code":107},"Antananarivo, Madagascar - (TNR)","TNR",{"name":109,"code":110},"Canberra, ACT, Australia - (CBR)","CBR",{"name":112,"code":113},"Berlin, Germany - (TXL)","TXL",{"name":115,"code":116},"Bangkok, Thailand - (BKK)","BKK",{"name":118,"code":119},"Cape Town, South Africa - (CPT)","CPT",{"name":121,"code":122},"Belo Horizonte, Brazil - (CNF)","CNF",{"name":124,"code":125},"Basra, Iraq - (BSR)","BSR",{"name":127,"code":128},"Christchurch, New Zealand - (CHC)","CHC",{"name":130,"code":131},"Austin, TX, United States - (AUS)","AUS",{"name":133,"code":134},"Beirut, Lebanon - (BEY)","BEY",{"name":136,"code":137},"Bandar Seri Begawan, Brunei - (BWN)","BWN",{"name":139,"code":140},"Blumenau, Brazil - (BNU)","BNU",{"name":142,"code":143},"Hagatna, Guam - (GUM)","GUM",{"name":145,"code":146},"Bangor, ME, United States - (BGR)","BGR",{"name":148,"code":149},"Bordeaux, France - (BOD)","BOD",{"name":151,"code":152},"Boston, MA, United States - (BOS)","BOS",{"name":154,"code":155},"Dakar, Senegal - (DKR)","DKR",{"name":157,"code":158},"Dammam, Saudi Arabia - (DMM)","DMM",{"name":160,"code":161},"Bratislava, Slovakia   - (BTS)","BTS",{"name":163,"code":164},"Melbourne, VIC, Australia - (MEL)","MEL",{"name":166,"code":167},"Doha, Qatar - (DOH)","DOH",{"name":169,"code":170},"Brussels, Belgium - (BRU)","BRU",{"name":172,"code":173},"Buffalo, NY, United States - (BUF)","BUF",{"name":175,"code":176},"Dar Es Salaam, Tanzania - (DAR)","DAR",{"name":178,"code":179},"Brasilia, Brazil - (BSB)","BSB",{"name":181,"code":182},"Buenos Aires, Argentina - (EZE)","EZE",{"name":184,"code":185},"Bucharest, Romania - (OTP)","OTP",{"name":187,"code":188},"Dubai, United Arab Emirates - (DXB)","DXB",{"name":190,"code":191},"Djibouti City, Djibouti - (JIB)","JIB",{"name":193,"code":194},"Calgary, AB, Canada - (YYC)","YYC",{"name":196,"code":197},"Cebu, Philippines - (CEB)","CEB",{"name":199,"code":200},"Noumea, New Caledonia - (NOU)","NOU",{"name":202,"code":203},"Perth, WA, Australia - (PER)","PER",{"name":205,"code":206},"Budapest, Hungary - (BUD)","BUD",{"name":208,"code":209},"Durban, South Africa - (DUR)","DUR",{"name":211,"code":212},"Charlotte, NC, United States - (CLT)","CLT",{"name":214,"code":215},"Erbil, Iraq - (EBL)","EBL",{"name":217,"code":218},"Chandigarh, India - (IXC)","IXC",{"name":220,"code":221},"Chicago, IL, United States - (ORD)","ORD",{"name":223,"code":224},"Sydney, NSW, Australia - (SYD)","SYD",{"name":226,"code":227},"Campinas, Brazil - (VCP)","VCP",{"name":229,"code":230},"Changde, China - (CGD)","CGD",{"name":232,"code":233},"Haifa, Israel - (HFA)","HFA",{"name":235,"code":236},"Gaborone, Botswana - (GBE)","GBE",{"name":238,"code":239},"Copenhagen, Denmark - (CPH)","CPH",{"name":241,"code":242},"Chennai, India - (MAA)","MAA",{"name":244,"code":245},"Harare, Zimbabwe - (HRE)","HRE",{"name":247,"code":248},"Jeddah, Saudi Arabia - (JED)","JED",{"name":250,"code":251},"Tahiti, French Polynesia - (PPT)","PPT",{"name":253,"code":254},"Cleveland, OH, United States - (CLE)","CLE",{"name":256,"code":257},"Johannesburg, South Africa - (JNB)","JNB",{"name":259,"code":260},"Kuwait City, Kuwait - (KWI)","KWI",{"name":262,"code":263},"Dublin, Ireland - (DUB)","DUB",{"name":265,"code":266},"Columbus, OH, United States - (CMH)","CMH",{"name":268,"code":269},"Suva, Fiji - (SUV)","SUV",{"name":271,"code":272},"Dallas, TX, United States - (DFW)","DFW",{"name":274,"code":275},"Manama, Bahrain - (BAH)","BAH",{"name":277,"code":278},"Kigali, Rwanda - (KGL)","KGL",{"name":280,"code":281},"Chittagong, Bangladesh - (CGP)","CGP",{"name":283,"code":284},"Hobart, Australia - (HBA)","HBA",{"name":286,"code":287},"Frankfurt, Germany - (FRA)","FRA",{"name":289,"code":290},"Muscat, Oman - (MCT)","MCT",{"name":292,"code":293},"Denver, CO, United States - (DEN)","DEN",{"name":295,"code":296},"Colombo, Sri Lanka - (CMB)","CMB",{"name":298,"code":299},"Lagos, Nigeria - (LOS)","LOS",{"name":301,"code":302},"Curitiba, Brazil - (CWB)","CWB",{"name":304,"code":305},"Wellington, New Zealand - (WLG)","WLG",{"name":307,"code":308},"Luanda, Angola - (LAD)","LAD",{"name":310,"code":311},"Detroit, MI, United States - (DTW)","DTW",{"name":313,"code":314},"Geneva, Switzerland - (GVA)","GVA",{"name":316,"code":317},"Dhaka, Bangladesh - (DAC)","DAC",{"name":319,"code":320},"Florianopolis, Brazil - (FLN)","FLN",{"name":322,"code":323},"Najaf, Iraq - (NJF)","NJF",{"name":325,"code":326},"Fortaleza, Brazil - (FOR)","FOR",{"name":328,"code":329},"Gothenburg, Sweden - (GOT)","GOT",{"name":331,"code":332},"Maputo, Mozambique - (MPM)","MPM",{"name":334,"code":335},"Foshan, China - (FUO)","FUO",{"name":337,"code":338},"Nasiriyah, Iraq - (XNH)","XNH",{"name":340,"code":341},"Durham, NC, United States - (RDU)","RDU",{"name":343,"code":344},"Mombasa, Kenya - (MBA)","MBA",{"name":346,"code":347},"Hamburg, Germany - (HAM)","HAM",{"name":349,"code":350},"Ramallah - (ZDM)","ZDM",{"name":352,"code":353},"Georgetown, Guyana - (GEO)","GEO",{"name":355,"code":356},"Fukuoka, Japan - (FUK)","FUK",{"name":358,"code":359},"Guadalajara, Mexico - (GDL)","GDL",{"name":361,"code":362},"Helsinki, Finland - (HEL)","HEL",{"name":364,"code":365},"Riyadh, Saudi Arabia - (RUH)","RUH",{"name":367,"code":368},"Nairobi, Kenya - (NBO)","NBO",{"name":370,"code":371},"Fuzhou, China - (FOC)","FOC",{"name":373,"code":374},"Halifax, Canada - (YHZ)","YHZ",{"name":376,"code":377},"Guangzhou, China - (CAN)","CAN",{"name":379,"code":380},"Istanbul, Turkey - (IST)","IST",{"name":382,"code":383},"Guatemala City, Guatemala - (GUA)","GUA",{"name":385,"code":386},"Honolulu, HI, United States - (HNL)","HNL",{"name":388,"code":389},"Sulaymaniyah, Iraq - (ISU)","ISU",{"name":391,"code":392},"Oran, Algeria - (ORN)","ORN",{"name":394,"code":395},"Tel Aviv, Israel - (TLV)","TLV",{"name":397,"code":398},"Houston, TX, United States - (IAH)","IAH",{"name":400,"code":401},"Guayaquil, Ecuador - (GYE)","GYE",{"name":403,"code":404},"Haikou, China - (HAK)","HAK",{"name":406,"code":407},"Ouagadougou, Burkina Faso   - (OUA)","OUA",{"name":409,"code":410},"Izmir, Turkey - (ADB)","ADB",{"name":412,"code":413},"Kyiv, Ukraine - (KBP)","KBP",{"name":415,"code":416},"Port Louis, Mauritius - (MRU)","MRU",{"name":418,"code":419},"Indianapolis, IN, United States - (IND)","IND",{"name":421,"code":422},"Hanoi, Vietnam - (HAN)","HAN",{"name":424,"code":425},"Lisbon, Portugal - (LIS)","LIS",{"name":427,"code":428},"Jacksonville, FL, United States - (JAX)","JAX",{"name":430,"code":431},"Hengshui, China - (SJW)","SJW",{"name":433,"code":434},"Joinville, Brazil - (JOI)","JOI",{"name":436,"code":437},"London, United Kingdom - (LHR)","LHR",{"name":439,"code":440},"Kansas City, MO, United States - (MCI)","MCI",{"name":442,"code":443},"Ho Chi Minh City, Vietnam - (SGN)","SGN",{"name":445,"code":446},"Tunis, Tunisia - (TUN)","TUN",{"name":448,"code":449},"Juazeiro do Norte, Brazil - (JDO)","JDO",{"name":451,"code":452},"Hong Kong - (HKG)","HKG",{"name":454,"code":455},"Lima, Peru - (LIM)","LIM",{"name":457,"code":458},"Luxembourg City, Luxembourg - (LUX)","LUX",{"name":460,"code":461},"Kingston, Jamaica - (KIN)","KIN",{"name":463,"code":464},"Kinshasa, DR Congo - (FIH)","FIH",{"name":466,"code":467},"Las Vegas, NV, United States - (LAS)","LAS",{"name":469,"code":470},"Hyderabad, India - (HYD)","HYD",{"name":472,"code":473},"Manaus, Brazil - (MAO)","MAO",{"name":475,"code":476},"Lyon, France - (LYS)","LYS",{"name":478,"code":479},"Cairo, Egypt - (CAI)","CAI",{"name":481,"code":482},"Los Angeles, CA, United States - (LAX)","LAX",{"name":484,"code":485},"Madrid, Spain - (MAD)","MAD",{"name":487,"code":488},"Islamabad, Pakistan - (ISB)","ISB",{"name":490,"code":491},"Windhoek, Namibia - (WDH)","WDH",{"name":493,"code":494},"Manchester, United Kingdom - (MAN)","MAN",{"name":496,"code":497},"Memphis, TN, United States - (MEM)","MEM",{"name":499,"code":500},"Jakarta, Indonesia - (CGK)","CGK",{"name":502,"code":503},"Yamoussoukro, Ivory Coast - (ASK)","ASK",{"name":505,"code":506},"Marseille, France - (MRS)","MRS",{"name":508,"code":509},"Panama City, Panama - (PTY)","PTY",{"name":511,"code":512},"Mexico City, Mexico - (MEX)","MEX",{"name":514,"code":515},"Abidjan, Ivory Coast - (ABJ)","ABJ",{"name":517,"code":518},"Miami, FL, United States - (MIA)","MIA",{"name":520,"code":521},"Milan, Italy - (MXP)","MXP",{"name":523,"code":524},"Jinan, China - (TNA)","TNA",{"name":526,"code":527},"Paramaribo, Suriname - (PBM)","PBM",{"name":529,"code":530},"Kampala, Uganda - (EBB)","EBB",{"name":532,"code":533},"Minneapolis, MN, United States - (MSP)","MSP",{"name":535,"code":536},"Porto Alegre, Brazil - (POA)","POA",{"name":538,"code":539},"Minsk, Belarus - (MSQ)","MSQ",{"name":541,"code":542},"Moscow, Russia - (DME)","DME",{"name":544,"code":545},"Johor Bahru, Malaysia - (JHB)","JHB",{"name":547,"code":548},"Quito, Ecuador - (UIO)","UIO",{"name":550,"code":551},"Munich, Germany - (MUC)","MUC",{"name":553,"code":554},"Kanpur, India - (KNU)","KNU",{"name":556,"code":557},"Nashville, United States - (BNA)","BNA",{"name":559,"code":560},"Newark, NJ, United States - (EWR)","EWR",{"name":562,"code":563},"Nicosia, Cyprus - (LCA)","LCA",{"name":565,"code":566},"Kaohsiung City, Taiwan - (KHH)","KHH",{"name":568,"code":569},"Recife, Brazil - (REC)","REC",{"name":571,"code":572},"Oslo, Norway - (OSL)","OSL",{"name":574,"code":575},"Norfolk, VA, United States - (ORF)","ORF",{"name":577,"code":578},"Karachi, Pakistan - (KHI)","KHI",{"name":580,"code":581},"Ribeirao Preto, Brazil - (RAO)","RAO",{"name":583,"code":584},"Rio de Janeiro, Brazil - (GIG)","GIG",{"name":586,"code":587},"Kathmandu, Nepal - (KTM)","KTM",{"name":589,"code":590},"Palermo, Italy - (PMO)","PMO",{"name":592,"code":593},"Oklahoma City, OK, United States - (OKC)","OKC",{"name":595,"code":596},"Paris, France - (CDG)","CDG",{"name":598,"code":599},"Omaha, NE, United States - (OMA)","OMA",{"name":601,"code":602},"Prague, Czech Republic - (PRG)","PRG",{"name":604,"code":605},"Kolkata, India - (CCU)","CCU",{"name":607,"code":608},"Ottawa, Canada - (YOW)","YOW",{"name":610,"code":611},"Santiago, Chile - (SCL)","SCL",{"name":613,"code":614},"Philadelphia, United States - (PHL)","PHL",{"name":616,"code":617},"Krasnoyarsk, Russia - (KJA)","KJA",{"name":619,"code":620},"Lusaka, Zambia - (LUN)","LUN",{"name":622,"code":623},"Kuala Lumpur, Malaysia - (KUL)","KUL",{"name":625,"code":626},"Phoenix, AZ, United States - (PHX)","PHX",{"name":628,"code":629},"Riga, Latvia - (RIX)","RIX",{"name":631,"code":632},"Santo Domingo, Dominican Republic - (SDQ)","SDQ",{"name":634,"code":635},"Addis Ababa, Ethiopia - (ADD)","ADD",{"name":637,"code":638},"Rome, Italy - (FCO)","FCO",{"name":640,"code":641},"Pittsburgh, PA, United States - (PIT)","PIT",{"name":643,"code":644},"Lilongwe, Malawi - (LLW)","LLW",{"name":646,"code":647},"Portland, OR, United States - (PDX)","PDX",{"name":649,"code":650},"Saint Petersburg, Russia - (LED)","LED",{"name":652,"code":653},"Langfang, China - (PKX)","PKX",{"name":655,"code":656},"Constantine, Algeria - (CZL)","CZL",{"name":658,"code":659},"Queretaro, MX, Mexico - (QRO)","QRO",{"name":661,"code":662},"Santa Venera, Malta - (MLA)","MLA",{"name":664,"code":665},"Richmond, VA, United States - (RIC)","RIC",{"name":667,"code":668},"Sorocaba, Brazil - (SOD)","SOD",{"name":670,"code":671},"Skopje, North Macedonia - (SKP)","SKP",{"name":673,"code":674},"Sofia, Bulgaria - (SOF)","SOF",{"name":676,"code":677},"Macau - (MFM)","MFM",{"name":679,"code":680},"Sacramento, CA, United States - (SMF)","SMF",{"name":682,"code":683},"Stockholm, Sweden - (ARN)","ARN",{"name":685,"code":686},"Salt Lake City, UT, United States - (SLC)","SLC",{"name":688,"code":689},"Tegucigalpa, Honduras - (TGU)","TGU",{"name":691,"code":692},"Stuttgart, Germany   - (STR)","STR",{"name":694,"code":695},"San Antonio, TX, United States - (SAT)","SAT",{"name":697,"code":698},"Manila, Philippines - (MNL)","MNL",{"name":700,"code":701},"San Diego, CA, United States - (SAN)","SAN",{"name":703,"code":704},"Tallinn, Estonia - (TLL)","TLL",{"name":706,"code":707},"Mumbai, India - (BOM)","BOM",{"name":709,"code":710},"Tbilisi, Georgia - (TBS)","TBS",{"name":712,"code":713},"San Francisco, CA, United States - (SFO)","SFO",{"name":715,"code":716},"Vitoria, Brazil - (VIX)","VIX",{"name":718,"code":719},"San Jose, CA, United States - (SJC)","SJC",{"name":721,"code":722},"Thessaloniki, Greece - (SKG)","SKG",{"name":724,"code":725},"Nagpur, India - (NAG)","NAG",{"name":727,"code":728},"Saskatoon, SK, Canada - (YXE)","YXE",{"name":730,"code":731},"Naha, Japan  - (OKA)","OKA",{"name":733,"code":734},"Tirana, Albania - (TIA)","TIA",{"name":736,"code":737},"Campos dos Goytacazes, Brazil - (CAW)","CAW",{"name":739,"code":740},"Seattle, WA, United States - (SEA)","SEA",{"name":742,"code":743},"Vienna, Austria - (VIE)","VIE",{"name":745,"code":746},"New Delhi, India - (DEL)","DEL",{"name":748,"code":749},"Chapeco, Brazil - (XAP)","XAP",{"name":751,"code":752},"Osaka, Japan - (KIX)","KIX",{"name":754,"code":755},"Vilnius, Lithuania - (VNO)","VNO",{"name":757,"code":758},"Sioux Falls, SD, United States - (FSD)","FSD",{"name":760,"code":761},"Bridgetown, Barbados - (BGI)","BGI",{"name":763,"code":764},"Warsaw, Poland - (WAW)","WAW",{"name":766,"code":767},"Patna, India - (PAT)","PAT",{"name":769,"code":770},"Phnom Penh, Cambodia - (PNH)","PNH",{"name":772,"code":773},"Tallahassee, FL, United States - (TLH)","TLH",{"name":775,"code":776},"Santiago de los Caballeros, Dominican Republic - (STI)","STI",{"name":778,"code":779},"Wroclaw, Poland - (WRO)","WRO",{"name":781,"code":782},"Zagreb, Croatia - (ZAG)","ZAG",{"name":784,"code":785},"Qingdao, China - (TAO)","TAO",{"name":787,"code":788},"Tampa, FL, United States - (TPA)","TPA",{"name":790,"code":791},"La Paz, Bolivia - (LPB)","LPB",{"name":793,"code":794},"Toronto, ON, Canada - (YYZ)","YYZ",{"name":796,"code":797},"Seoul, South Korea - (ICN)","ICN",{"name":799,"code":800},"Zurich, Switzerland - (ZRH)","ZRH",{"name":802,"code":803},"Vancouver, BC, Canada - (YVR)","YVR",{"name":805,"code":806},"Shanghai, China - (SHA)","SHA",{"name":808,"code":809},"San Juan, Puerto Rico - (SJU)","SJU",{"name":811,"code":812},"Singapore, Singapore - (SIN)","SIN",{"name":814,"code":815},"Winnipeg, MB, Canada - (YWG)","YWG",{"name":817,"code":818},"Barranquilla, Colombia - (BAQ)","BAQ",{"name":820,"code":821},"Surat Thani, Thailand - (URT)","URT",{"name":823,"code":824},"Palmas, Brazil - (PMW)","PMW",{"name":826,"code":827},"Taipei - (TPE)","TPE",{"name":829,"code":830},"Aracatuba, Brazil - (ARU)","ARU",{"name":832,"code":833},"Port of Spain, Trinidad and Tobago - (POS)","POS",{"name":835,"code":836},"Salvador, Brazil - (SSA)","SSA",{"name":838,"code":839},"Tokyo, Japan - (NRT)","NRT",{"name":841,"code":842},"Ulaanbaatar, Mongolia - (ULN)","ULN",{"name":844,"code":845},"Vientiane, Laos - (VTE)","VTE",{"name":847,"code":848},"Xinyu, China - (KHN)","KHN",{"name":850,"code":851},"Yerevan, Armenia - (EVN)","EVN",{"name":853,"code":854},"Yogyakarta, Indonesia - (JOG)","JOG",{"name":856,"code":857},"Cagayan de Oro, Philippines - (CGY)","CGY",{"name":859,"code":860},"Ljubljana, Slovenia - (LJU)","LJU",{"name":862,"code":863},"Kochi, India - (COK)","COK",{"name":865,"code":866},"Cuiaba, Brazil - (CGB)","CGB",{"name":868,"code":869},"Denpasar, Indonesia - (DPS)","DPS",{"name":871,"code":872},"Kannur, India - (CNN)","CNN",{"name":874,"code":875},"Cali, Colombia - (CLO)","CLO",{"name":877,"code":878},"San Pedro Sula, Honduras - (SAP)","SAP",{"name":880,"code":881},"Shenzhen, China - (SZX)","SZX",{"name":883,"code":884},"Guiyang, China - (KWE)","KWE",{"name":886,"code":887},"Shaoxing, China - (HGH)","HGH",{"name":889,"code":890},"Changzhou, China - (CZX)","CZX",{"name":892,"code":893},"Kunming, China - (KMG)","KMG",{"name":895,"code":896},"Chiang Mai, Thailand - (CNX)","CNX",{"name":898,"code":899},"Zhengzhou, China - (CGO)","CGO",{"name":901,"code":902},"Yangquan, China - (TYN)","TYN",{"name":904,"code":905},"Changsha, China - (CSX)","CSX",{"name":907,"code":908},"Dalian, China - (DLC)","DLC",{"name":910,"code":911},"Beihai, China - (BHY)","BHY",{"name":913,"code":914},"Chongqing, China - (CKG)","CKG",{"name":916,"code":917},"Xiangyang, China - (XFN)","XFN",{"name":919,"code":920},"Da Nang, Vietnam - (DAD)","DAD",{"name":922,"code":923},"Jiaxing, China - (JXG)","JXG",{"name":925,"code":926},"Tarlac City, Philippines - (CRK)","CRK",{"name":928,"code":929},"Thimphu, Bhutan - (PBH)","PBH",{"name":931,"code":932},"Baoji, China - (XIY)","XIY",{"name":934,"code":935},"Astana, Kazakhstan - (NQZ)","NQZ",{"name":937,"code":938},"Kuching, Malaysia - (KCH)","KCH",{"name":940,"code":941},"Aktobe, Kazakhstan - (AKX)","AKX",{"name":943,"code":944},"Tongren, China - (TEN)","TEN",{"name":946,"code":947},"Taizhou, China - (HYN)","HYN",{"name":949,"code":950},"Bishkek, Kyrgyzstan - (FRU)","FRU",{"name":952,"code":953},"Malang, Indonesia - (MLG)","MLG",{"name":955,"code":956},"Lahore, Pakistan - (LHE)","LHE",{"name":958,"code":959},"Chengdu, China - (CTU)","CTU",{"name":961,"code":962},"Agra, India - (AGR)","AGR",{"name":964,"code":965},"Coimbatore, India - (CJB)","CJB",{"name":967,"code":968},"Xingyi, China - (ACX)","ACX",{"name":970,"code":971},"Bhubaneswar, India - (BBI)","BBI",{"name":973,"code":974},"Luoyang, China - (LYA)","LYA",{"name":976,"code":977},"Pune, India - (PNQ)","PNQ",{"name":979,"code":980},"Sambalpur, India - (JRG)","JRG",1781953771084]