[{"data":1,"prerenderedAt":4645},["ShallowReactive",2],{"post-cf-network":3,"cfn":3700},[4,1117,1984,2824,3697],{"locale":5,"post":6},"zh-Hans",{"id":7,"title":8,"body":9,"date":1109,"desc":1110,"description":15,"edit":1109,"extension":1111,"meta":1112,"navigation":420,"path":1113,"seo":1114,"stem":1115,"__hash__":1116},"blog\u002Fblog\u002Fzh-hans\u002Fcf-network.md","如何在网站显示当前使用的 Cloudflare 网络",{"type":10,"value":11,"toc":1105},"minimark",[12,16,23,29,33,41,147,158,161,164,171,176,179,190,375,378,381,391,394,1101],[13,14,15],"p",{},"今天凌晨给我的个人网站加了一个小功能，就是在网站显示当前使用的 Cloudflare 网络。",[13,17,18],{},[19,20],"img",{"alt":21,"src":22},"","https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-preview.png",[24,25,26],"blockquote",{},[13,27,28],{},"翻到本网站的最底下，您应该就能看见实际显示的样式。",[30,31,32],"h3",{"id":32},"实现方式",[13,34,35,36,40],{},"由 Cloudflare 代理的网站，通过访问 ",[37,38,39],"code",{},"{domain}\u002Fcdn-cgi\u002Ftrace"," 可以获取当前使用的 Cloudflare 网络信息。样例如下：",[42,43,47],"pre",{"className":44,"code":45,"language":46,"meta":21,"style":21},"language-plaintext shiki shiki-themes github-dark","fl=582f239\nh=kuriyona.com\nip=64.90.0.218\nts=1779555940.000\nvisit_scheme=https\nuag=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\ncolo=HKG\nsliver=none\nhttp=http\u002F3\nloc=HK\ntls=TLSv1.3\nsni=plaintext\nwarp=off\ngateway=off\nrbi=off\nkex=X25519MLKEM768\n","plaintext",[37,48,49,57,63,69,75,81,87,93,99,105,111,117,123,129,135,141],{"__ignoreMap":21},[50,51,54],"span",{"class":52,"line":53},"line",1,[50,55,56],{},"fl=582f239\n",[50,58,60],{"class":52,"line":59},2,[50,61,62],{},"h=kuriyona.com\n",[50,64,66],{"class":52,"line":65},3,[50,67,68],{},"ip=64.90.0.218\n",[50,70,72],{"class":52,"line":71},4,[50,73,74],{},"ts=1779555940.000\n",[50,76,78],{"class":52,"line":77},5,[50,79,80],{},"visit_scheme=https\n",[50,82,84],{"class":52,"line":83},6,[50,85,86],{},"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\n",[50,88,90],{"class":52,"line":89},7,[50,91,92],{},"colo=HKG\n",[50,94,96],{"class":52,"line":95},8,[50,97,98],{},"sliver=none\n",[50,100,102],{"class":52,"line":101},9,[50,103,104],{},"http=http\u002F3\n",[50,106,108],{"class":52,"line":107},10,[50,109,110],{},"loc=HK\n",[50,112,114],{"class":52,"line":113},11,[50,115,116],{},"tls=TLSv1.3\n",[50,118,120],{"class":52,"line":119},12,[50,121,122],{},"sni=plaintext\n",[50,124,126],{"class":52,"line":125},13,[50,127,128],{},"warp=off\n",[50,130,132],{"class":52,"line":131},14,[50,133,134],{},"gateway=off\n",[50,136,138],{"class":52,"line":137},15,[50,139,140],{},"rbi=off\n",[50,142,144],{"class":52,"line":143},16,[50,145,146],{},"kex=X25519MLKEM768\n",[13,148,149,150,153,154,157],{},"通过解析其中的 ",[37,151,152],{},"colo"," 参数，我们可以获取当前使用的 Cloudflare 网络 ID，比如这里是 ",[37,155,156],{},"HKG","。",[13,159,160],{},"那么网络 ID 有了，我们就可以根据网络 ID 来显示当前使用的 Cloudflare 网络了。",[13,162,163],{},"Cloudflare Status 提供了一个文件，列出了当前所有的 Cloudflare 网络状态信息。",[24,165,166],{},[13,167,168],{},[37,169,170],{},"https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json",[13,172,173],{},[19,174],{"alt":21,"src":175},"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-status-api.png",[13,177,178],{},"文件的内容很杂，我们需要通过一个简单的脚本来获得我们需要的格式化信息。",[13,180,181,182,185,186,189],{},"首先通过一个简单的正则表达式(",[37,183,184],{},"^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$",")来筛选复合网络节点的 ",[37,187,188],{},"name"," 字段，再对数据结构进行简化处理。（这里使用 ky 库来获取数据）",[42,191,195],{"className":192,"code":193,"language":194,"meta":21,"style":21},"language-ts shiki shiki-themes github-dark","const res = await ky.get('https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json').json();\nconst result = res.components\n  .filter((c) => REGEX.test(c.name))\n  .map((n) => ({\n    name: n.name,\n    code: n.name.match(\u002F^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u002F)?.[1],\n  }));\n","ts",[37,196,197,237,249,282,301,306,370],{"__ignoreMap":21},[50,198,199,203,207,210,213,217,221,224,228,231,234],{"class":52,"line":53},[50,200,202],{"class":201},"snl16","const",[50,204,206],{"class":205},"sDLfK"," res",[50,208,209],{"class":201}," =",[50,211,212],{"class":201}," await",[50,214,216],{"class":215},"s95oV"," ky.",[50,218,220],{"class":219},"svObZ","get",[50,222,223],{"class":215},"(",[50,225,227],{"class":226},"sU2Wk","'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'",[50,229,230],{"class":215},").",[50,232,233],{"class":219},"json",[50,235,236],{"class":215},"();\n",[50,238,239,241,244,246],{"class":52,"line":59},[50,240,202],{"class":201},[50,242,243],{"class":205}," result",[50,245,209],{"class":201},[50,247,248],{"class":215}," res.components\n",[50,250,251,254,257,260,264,267,270,273,276,279],{"class":52,"line":65},[50,252,253],{"class":215},"  .",[50,255,256],{"class":219},"filter",[50,258,259],{"class":215},"((",[50,261,263],{"class":262},"s9osk","c",[50,265,266],{"class":215},") ",[50,268,269],{"class":201},"=>",[50,271,272],{"class":205}," REGEX",[50,274,275],{"class":215},".",[50,277,278],{"class":219},"test",[50,280,281],{"class":215},"(c.name))\n",[50,283,284,286,289,291,294,296,298],{"class":52,"line":71},[50,285,253],{"class":215},[50,287,288],{"class":219},"map",[50,290,259],{"class":215},[50,292,293],{"class":262},"n",[50,295,266],{"class":215},[50,297,269],{"class":201},[50,299,300],{"class":215}," ({\n",[50,302,303],{"class":52,"line":77},[50,304,305],{"class":215},"    name: n.name,\n",[50,307,308,311,314,316,319,322,325,328,332,335,338,342,344,347,350,353,356,359,361,364,367],{"class":52,"line":83},[50,309,310],{"class":215},"    code: n.name.",[50,312,313],{"class":219},"match",[50,315,223],{"class":215},[50,317,318],{"class":226},"\u002F",[50,320,321],{"class":201},"^",[50,323,324],{"class":205},"[A-Za-z\\s,]",[50,326,327],{"class":201},"+",[50,329,331],{"class":330},"sns5M","-",[50,333,334],{"class":205},"\\s",[50,336,337],{"class":201},"*",[50,339,341],{"class":340},"sRjNt","\\(",[50,343,223],{"class":330},[50,345,346],{"class":205},"[A-Z]",[50,348,349],{"class":201},"{3}",[50,351,352],{"class":330},")",[50,354,355],{"class":340},"\\)",[50,357,358],{"class":201},"$",[50,360,318],{"class":226},[50,362,363],{"class":215},")?.[",[50,365,366],{"class":205},"1",[50,368,369],{"class":215},"],\n",[50,371,372],{"class":52,"line":89},[50,373,374],{"class":215},"  }));\n",[13,376,377],{},"结合前文中获得的网络 ID，我们就可以获得实际的网络节点名称了。",[30,379,380],{"id":380},"代码实现",[13,382,383,384],{},"本站实际使用的代码可以查看 ",[385,386,390],"a",{"href":387,"rel":388},"https:\u002F\u002Fgithub.com\u002FKuriyona\u002FKuriyona.com\u002Fblob\u002Fmain\u002Fapp\u002Fcomposables\u002FuseCloudflareStatus.ts",[389],"nofollow","useCloudflareStatus.ts",[13,392,393],{},"以下是通用的 TypeScript 完整代码实现：",[42,395,397],{"className":192,"code":396,"language":194,"meta":21,"style":21},"import ky from 'ky';\n\nconst REGEX = \u002F^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u002F;\n\ninterface NodeInfo {\n  name: string;\n  code: string | undefined;\n}\n\ninterface TraceData {\n  colo?: string;\n  loc?: string;\n  [key: string]: string | undefined;\n}\n\ninterface CloudflareStatusResult {\n  nodesData: NodeInfo[] | undefined;\n  traceData: TraceData | undefined;\n  currentNodeName: string | undefined;\n  location: string | undefined;\n}\n\nexport async function getCloudflareStatus(): Promise\u003CCloudflareStatusResult> {\n  \u002F\u002F 获取节点数据\n  const nodesResponse = await ky.get('https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json').json();\n  const nodesData = nodesResponse.components\n    .filter((c) => REGEX.test(c.name))\n    .map((n) => ({\n      name: n.name,\n      code: n.name.match(REGEX)?.[1],\n    }));\n\n  \u002F\u002F 获取 trace 数据\n  const traceText = await ky.get('https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace').text();\n  const traceData = Object.fromEntries(\n    traceText\n      .split('\\n')\n      .filter((line) => line.includes('='))\n      .map((line) => line.split('=')),\n  ) as TraceData;\n\n  console.log(traceData);\n\n  \u002F\u002F 计算当前节点名称\n  const currentNodeName = nodesData.find((n) => n.code === traceData?.colo)?.name;\n\n  const location = traceData?.loc;\n\n  return {\n    nodesData,\n    traceData,\n    currentNodeName,\n    location,\n  };\n}\n",[37,398,399,416,422,463,467,478,491,508,513,517,526,538,549,574,578,582,591,611,627,643,659,664,669,701,708,735,748,772,789,795,814,820,825,831,859,878,884,906,935,961,974,979,991,996,1002,1035,1040,1053,1058,1066,1072,1078,1084,1090,1096],{"__ignoreMap":21},[50,400,401,404,407,410,413],{"class":52,"line":53},[50,402,403],{"class":201},"import",[50,405,406],{"class":215}," ky ",[50,408,409],{"class":201},"from",[50,411,412],{"class":226}," 'ky'",[50,414,415],{"class":215},";\n",[50,417,418],{"class":52,"line":59},[50,419,421],{"emptyLinePlaceholder":420},true,"\n",[50,423,424,426,428,430,433,435,437,439,441,443,445,447,449,451,453,455,457,459,461],{"class":52,"line":65},[50,425,202],{"class":201},[50,427,272],{"class":205},[50,429,209],{"class":201},[50,431,432],{"class":226}," \u002F",[50,434,321],{"class":201},[50,436,324],{"class":205},[50,438,327],{"class":201},[50,440,331],{"class":330},[50,442,334],{"class":205},[50,444,337],{"class":201},[50,446,341],{"class":340},[50,448,223],{"class":330},[50,450,346],{"class":205},[50,452,349],{"class":201},[50,454,352],{"class":330},[50,456,355],{"class":340},[50,458,358],{"class":201},[50,460,318],{"class":226},[50,462,415],{"class":215},[50,464,465],{"class":52,"line":71},[50,466,421],{"emptyLinePlaceholder":420},[50,468,469,472,475],{"class":52,"line":77},[50,470,471],{"class":201},"interface",[50,473,474],{"class":219}," NodeInfo",[50,476,477],{"class":215}," {\n",[50,479,480,483,486,489],{"class":52,"line":83},[50,481,482],{"class":262},"  name",[50,484,485],{"class":201},":",[50,487,488],{"class":205}," string",[50,490,415],{"class":215},[50,492,493,496,498,500,503,506],{"class":52,"line":89},[50,494,495],{"class":262},"  code",[50,497,485],{"class":201},[50,499,488],{"class":205},[50,501,502],{"class":201}," |",[50,504,505],{"class":205}," undefined",[50,507,415],{"class":215},[50,509,510],{"class":52,"line":95},[50,511,512],{"class":215},"}\n",[50,514,515],{"class":52,"line":101},[50,516,421],{"emptyLinePlaceholder":420},[50,518,519,521,524],{"class":52,"line":107},[50,520,471],{"class":201},[50,522,523],{"class":219}," TraceData",[50,525,477],{"class":215},[50,527,528,531,534,536],{"class":52,"line":113},[50,529,530],{"class":262},"  colo",[50,532,533],{"class":201},"?:",[50,535,488],{"class":205},[50,537,415],{"class":215},[50,539,540,543,545,547],{"class":52,"line":119},[50,541,542],{"class":262},"  loc",[50,544,533],{"class":201},[50,546,488],{"class":205},[50,548,415],{"class":215},[50,550,551,554,557,559,561,564,566,568,570,572],{"class":52,"line":125},[50,552,553],{"class":215},"  [",[50,555,556],{"class":262},"key",[50,558,485],{"class":201},[50,560,488],{"class":205},[50,562,563],{"class":215},"]",[50,565,485],{"class":201},[50,567,488],{"class":205},[50,569,502],{"class":201},[50,571,505],{"class":205},[50,573,415],{"class":215},[50,575,576],{"class":52,"line":131},[50,577,512],{"class":215},[50,579,580],{"class":52,"line":137},[50,581,421],{"emptyLinePlaceholder":420},[50,583,584,586,589],{"class":52,"line":143},[50,585,471],{"class":201},[50,587,588],{"class":219}," CloudflareStatusResult",[50,590,477],{"class":215},[50,592,594,597,599,601,604,607,609],{"class":52,"line":593},17,[50,595,596],{"class":262},"  nodesData",[50,598,485],{"class":201},[50,600,474],{"class":219},[50,602,603],{"class":215},"[] ",[50,605,606],{"class":201},"|",[50,608,505],{"class":205},[50,610,415],{"class":215},[50,612,614,617,619,621,623,625],{"class":52,"line":613},18,[50,615,616],{"class":262},"  traceData",[50,618,485],{"class":201},[50,620,523],{"class":219},[50,622,502],{"class":201},[50,624,505],{"class":205},[50,626,415],{"class":215},[50,628,630,633,635,637,639,641],{"class":52,"line":629},19,[50,631,632],{"class":262},"  currentNodeName",[50,634,485],{"class":201},[50,636,488],{"class":205},[50,638,502],{"class":201},[50,640,505],{"class":205},[50,642,415],{"class":215},[50,644,646,649,651,653,655,657],{"class":52,"line":645},20,[50,647,648],{"class":262},"  location",[50,650,485],{"class":201},[50,652,488],{"class":205},[50,654,502],{"class":201},[50,656,505],{"class":205},[50,658,415],{"class":215},[50,660,662],{"class":52,"line":661},21,[50,663,512],{"class":215},[50,665,667],{"class":52,"line":666},22,[50,668,421],{"emptyLinePlaceholder":420},[50,670,672,675,678,681,684,687,689,692,695,698],{"class":52,"line":671},23,[50,673,674],{"class":201},"export",[50,676,677],{"class":201}," async",[50,679,680],{"class":201}," function",[50,682,683],{"class":219}," getCloudflareStatus",[50,685,686],{"class":215},"()",[50,688,485],{"class":201},[50,690,691],{"class":219}," Promise",[50,693,694],{"class":215},"\u003C",[50,696,697],{"class":219},"CloudflareStatusResult",[50,699,700],{"class":215},"> {\n",[50,702,704],{"class":52,"line":703},24,[50,705,707],{"class":706},"sAwPA","  \u002F\u002F 获取节点数据\n",[50,709,711,714,717,719,721,723,725,727,729,731,733],{"class":52,"line":710},25,[50,712,713],{"class":201},"  const",[50,715,716],{"class":205}," nodesResponse",[50,718,209],{"class":201},[50,720,212],{"class":201},[50,722,216],{"class":215},[50,724,220],{"class":219},[50,726,223],{"class":215},[50,728,227],{"class":226},[50,730,230],{"class":215},[50,732,233],{"class":219},[50,734,236],{"class":215},[50,736,738,740,743,745],{"class":52,"line":737},26,[50,739,713],{"class":201},[50,741,742],{"class":205}," nodesData",[50,744,209],{"class":201},[50,746,747],{"class":215}," nodesResponse.components\n",[50,749,751,754,756,758,760,762,764,766,768,770],{"class":52,"line":750},27,[50,752,753],{"class":215},"    .",[50,755,256],{"class":219},[50,757,259],{"class":215},[50,759,263],{"class":262},[50,761,266],{"class":215},[50,763,269],{"class":201},[50,765,272],{"class":205},[50,767,275],{"class":215},[50,769,278],{"class":219},[50,771,281],{"class":215},[50,773,775,777,779,781,783,785,787],{"class":52,"line":774},28,[50,776,753],{"class":215},[50,778,288],{"class":219},[50,780,259],{"class":215},[50,782,293],{"class":262},[50,784,266],{"class":215},[50,786,269],{"class":201},[50,788,300],{"class":215},[50,790,792],{"class":52,"line":791},29,[50,793,794],{"class":215},"      name: n.name,\n",[50,796,798,801,803,805,808,810,812],{"class":52,"line":797},30,[50,799,800],{"class":215},"      code: n.name.",[50,802,313],{"class":219},[50,804,223],{"class":215},[50,806,807],{"class":205},"REGEX",[50,809,363],{"class":215},[50,811,366],{"class":205},[50,813,369],{"class":215},[50,815,817],{"class":52,"line":816},31,[50,818,819],{"class":215},"    }));\n",[50,821,823],{"class":52,"line":822},32,[50,824,421],{"emptyLinePlaceholder":420},[50,826,828],{"class":52,"line":827},33,[50,829,830],{"class":706},"  \u002F\u002F 获取 trace 数据\n",[50,832,834,836,839,841,843,845,847,849,852,854,857],{"class":52,"line":833},34,[50,835,713],{"class":201},[50,837,838],{"class":205}," traceText",[50,840,209],{"class":201},[50,842,212],{"class":201},[50,844,216],{"class":215},[50,846,220],{"class":219},[50,848,223],{"class":215},[50,850,851],{"class":226},"'https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace'",[50,853,230],{"class":215},[50,855,856],{"class":219},"text",[50,858,236],{"class":215},[50,860,862,864,867,869,872,875],{"class":52,"line":861},35,[50,863,713],{"class":201},[50,865,866],{"class":205}," traceData",[50,868,209],{"class":201},[50,870,871],{"class":215}," Object.",[50,873,874],{"class":219},"fromEntries",[50,876,877],{"class":215},"(\n",[50,879,881],{"class":52,"line":880},36,[50,882,883],{"class":215},"    traceText\n",[50,885,887,890,893,895,898,901,903],{"class":52,"line":886},37,[50,888,889],{"class":215},"      .",[50,891,892],{"class":219},"split",[50,894,223],{"class":215},[50,896,897],{"class":226},"'",[50,899,900],{"class":205},"\\n",[50,902,897],{"class":226},[50,904,905],{"class":215},")\n",[50,907,909,911,913,915,917,919,921,924,927,929,932],{"class":52,"line":908},38,[50,910,889],{"class":215},[50,912,256],{"class":219},[50,914,259],{"class":215},[50,916,52],{"class":262},[50,918,266],{"class":215},[50,920,269],{"class":201},[50,922,923],{"class":215}," line.",[50,925,926],{"class":219},"includes",[50,928,223],{"class":215},[50,930,931],{"class":226},"'='",[50,933,934],{"class":215},"))\n",[50,936,938,940,942,944,946,948,950,952,954,956,958],{"class":52,"line":937},39,[50,939,889],{"class":215},[50,941,288],{"class":219},[50,943,259],{"class":215},[50,945,52],{"class":262},[50,947,266],{"class":215},[50,949,269],{"class":201},[50,951,923],{"class":215},[50,953,892],{"class":219},[50,955,223],{"class":215},[50,957,931],{"class":226},[50,959,960],{"class":215},")),\n",[50,962,964,967,970,972],{"class":52,"line":963},40,[50,965,966],{"class":215},"  ) ",[50,968,969],{"class":201},"as",[50,971,523],{"class":219},[50,973,415],{"class":215},[50,975,977],{"class":52,"line":976},41,[50,978,421],{"emptyLinePlaceholder":420},[50,980,982,985,988],{"class":52,"line":981},42,[50,983,984],{"class":215},"  console.",[50,986,987],{"class":219},"log",[50,989,990],{"class":215},"(traceData);\n",[50,992,994],{"class":52,"line":993},43,[50,995,421],{"emptyLinePlaceholder":420},[50,997,999],{"class":52,"line":998},44,[50,1000,1001],{"class":706},"  \u002F\u002F 计算当前节点名称\n",[50,1003,1005,1007,1010,1012,1015,1018,1020,1022,1024,1026,1029,1032],{"class":52,"line":1004},45,[50,1006,713],{"class":201},[50,1008,1009],{"class":205}," currentNodeName",[50,1011,209],{"class":201},[50,1013,1014],{"class":215}," nodesData.",[50,1016,1017],{"class":219},"find",[50,1019,259],{"class":215},[50,1021,293],{"class":262},[50,1023,266],{"class":215},[50,1025,269],{"class":201},[50,1027,1028],{"class":215}," n.code ",[50,1030,1031],{"class":201},"===",[50,1033,1034],{"class":215}," traceData?.colo)?.name;\n",[50,1036,1038],{"class":52,"line":1037},46,[50,1039,421],{"emptyLinePlaceholder":420},[50,1041,1043,1045,1048,1050],{"class":52,"line":1042},47,[50,1044,713],{"class":201},[50,1046,1047],{"class":205}," location",[50,1049,209],{"class":201},[50,1051,1052],{"class":215}," traceData?.loc;\n",[50,1054,1056],{"class":52,"line":1055},48,[50,1057,421],{"emptyLinePlaceholder":420},[50,1059,1061,1064],{"class":52,"line":1060},49,[50,1062,1063],{"class":201},"  return",[50,1065,477],{"class":215},[50,1067,1069],{"class":52,"line":1068},50,[50,1070,1071],{"class":215},"    nodesData,\n",[50,1073,1075],{"class":52,"line":1074},51,[50,1076,1077],{"class":215},"    traceData,\n",[50,1079,1081],{"class":52,"line":1080},52,[50,1082,1083],{"class":215},"    currentNodeName,\n",[50,1085,1087],{"class":52,"line":1086},53,[50,1088,1089],{"class":215},"    location,\n",[50,1091,1093],{"class":52,"line":1092},54,[50,1094,1095],{"class":215},"  };\n",[50,1097,1099],{"class":52,"line":1098},55,[50,1100,512],{"class":215},[1102,1103,1104],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sns5M, html code.shiki .sns5M{--shiki-default:#DBEDFF}html pre.shiki code .sRjNt, html code.shiki .sRjNt{--shiki-default:#85E89D;--shiki-default-font-weight:bold}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":21,"searchDepth":59,"depth":59,"links":1106},[1107,1108],{"id":32,"depth":65,"text":32},{"id":380,"depth":65,"text":380},"2026-05-24","通过解析 Cloudflare 的 \u002Fcdn-cgi\u002Ftrace 接口获取当前网络节点 ID，再结合 Cloudflare Status 的公共 API 匹配出节点名称，从而在网站上动态显示访客正在使用的 Cloudflare 网络名称。","md",{},"\u002Fblog\u002Fzh-hans\u002Fcf-network",{"title":8,"description":15},"blog\u002Fzh-hans\u002Fcf-network","r9x__ldE5hdhdMYCUs1YncNUWDbMeA-kId5xk9j7eSU",{"locale":1118,"post":1119},"zh-Hant-TW",{"id":1120,"title":1121,"body":1122,"date":1109,"desc":1978,"description":1126,"edit":1109,"extension":1111,"meta":1979,"navigation":420,"path":1980,"seo":1981,"stem":1982,"__hash__":1983},"blog\u002Fblog\u002Fzh-Hant\u002Fcf-network.md","如何在網站顯示當前使用的 Cloudflare 網絡",{"type":10,"value":1123,"toc":1974},[1124,1127,1131,1136,1139,1145,1213,1221,1224,1227,1233,1237,1240,1249,1377,1380,1383,1389,1392,1972],[13,1125,1126],{},"今天凌晨給我的個人網站加了一個小功能，就是在網站顯示當前使用的 Cloudflare 網絡。",[13,1128,1129],{},[19,1130],{"alt":21,"src":22},[24,1132,1133],{},[13,1134,1135],{},"翻到本網站的最底下，您應該就能看見實際顯示的樣式。",[30,1137,1138],{"id":1138},"實現方式",[13,1140,1141,1142,1144],{},"由 Cloudflare 代理的網站，通過訪問 ",[37,1143,39],{}," 可以獲取當前使用的 Cloudflare 網絡信息。樣例如下：",[42,1146,1147],{"className":44,"code":45,"language":46,"meta":21,"style":21},[37,1148,1149,1153,1157,1161,1165,1169,1173,1177,1181,1185,1189,1193,1197,1201,1205,1209],{"__ignoreMap":21},[50,1150,1151],{"class":52,"line":53},[50,1152,56],{},[50,1154,1155],{"class":52,"line":59},[50,1156,62],{},[50,1158,1159],{"class":52,"line":65},[50,1160,68],{},[50,1162,1163],{"class":52,"line":71},[50,1164,74],{},[50,1166,1167],{"class":52,"line":77},[50,1168,80],{},[50,1170,1171],{"class":52,"line":83},[50,1172,86],{},[50,1174,1175],{"class":52,"line":89},[50,1176,92],{},[50,1178,1179],{"class":52,"line":95},[50,1180,98],{},[50,1182,1183],{"class":52,"line":101},[50,1184,104],{},[50,1186,1187],{"class":52,"line":107},[50,1188,110],{},[50,1190,1191],{"class":52,"line":113},[50,1192,116],{},[50,1194,1195],{"class":52,"line":119},[50,1196,122],{},[50,1198,1199],{"class":52,"line":125},[50,1200,128],{},[50,1202,1203],{"class":52,"line":131},[50,1204,134],{},[50,1206,1207],{"class":52,"line":137},[50,1208,140],{},[50,1210,1211],{"class":52,"line":143},[50,1212,146],{},[13,1214,1215,1216,1218,1219,157],{},"通過解析其中的 ",[37,1217,152],{}," 參數，我們可以獲取當前使用的 Cloudflare 網絡 ID，比如這裏是 ",[37,1220,156],{},[13,1222,1223],{},"那麼網絡 ID 有了，我們就可以根據網絡 ID 來顯示當前使用的 Cloudflare 網絡了。",[13,1225,1226],{},"Cloudflare Status 提供了一個文件，列出了當前所有的 Cloudflare 網絡狀態信息。",[24,1228,1229],{},[13,1230,1231],{},[37,1232,170],{},[13,1234,1235],{},[19,1236],{"alt":21,"src":175},[13,1238,1239],{},"文件的內容很雜，我們需要通過一個簡單的腳本來獲得我們需要的格式化信息。",[13,1241,1242,1243,1245,1246,1248],{},"首先通過一個簡單的正則表達式(",[37,1244,184],{},")來篩選複合網絡節點的 ",[37,1247,188],{}," 字段，再對數據結構進行簡化處理。（這裏使用 ky 庫來獲取數據）",[42,1250,1251],{"className":192,"code":193,"language":194,"meta":21,"style":21},[37,1252,1253,1277,1287,1309,1325,1329,1373],{"__ignoreMap":21},[50,1254,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275],{"class":52,"line":53},[50,1256,202],{"class":201},[50,1258,206],{"class":205},[50,1260,209],{"class":201},[50,1262,212],{"class":201},[50,1264,216],{"class":215},[50,1266,220],{"class":219},[50,1268,223],{"class":215},[50,1270,227],{"class":226},[50,1272,230],{"class":215},[50,1274,233],{"class":219},[50,1276,236],{"class":215},[50,1278,1279,1281,1283,1285],{"class":52,"line":59},[50,1280,202],{"class":201},[50,1282,243],{"class":205},[50,1284,209],{"class":201},[50,1286,248],{"class":215},[50,1288,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307],{"class":52,"line":65},[50,1290,253],{"class":215},[50,1292,256],{"class":219},[50,1294,259],{"class":215},[50,1296,263],{"class":262},[50,1298,266],{"class":215},[50,1300,269],{"class":201},[50,1302,272],{"class":205},[50,1304,275],{"class":215},[50,1306,278],{"class":219},[50,1308,281],{"class":215},[50,1310,1311,1313,1315,1317,1319,1321,1323],{"class":52,"line":71},[50,1312,253],{"class":215},[50,1314,288],{"class":219},[50,1316,259],{"class":215},[50,1318,293],{"class":262},[50,1320,266],{"class":215},[50,1322,269],{"class":201},[50,1324,300],{"class":215},[50,1326,1327],{"class":52,"line":77},[50,1328,305],{"class":215},[50,1330,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365,1367,1369,1371],{"class":52,"line":83},[50,1332,310],{"class":215},[50,1334,313],{"class":219},[50,1336,223],{"class":215},[50,1338,318],{"class":226},[50,1340,321],{"class":201},[50,1342,324],{"class":205},[50,1344,327],{"class":201},[50,1346,331],{"class":330},[50,1348,334],{"class":205},[50,1350,337],{"class":201},[50,1352,341],{"class":340},[50,1354,223],{"class":330},[50,1356,346],{"class":205},[50,1358,349],{"class":201},[50,1360,352],{"class":330},[50,1362,355],{"class":340},[50,1364,358],{"class":201},[50,1366,318],{"class":226},[50,1368,363],{"class":215},[50,1370,366],{"class":205},[50,1372,369],{"class":215},[50,1374,1375],{"class":52,"line":89},[50,1376,374],{"class":215},[13,1378,1379],{},"結合前文中獲得的網絡 ID，我們就可以獲得實際的網絡節點名稱了。",[30,1381,1382],{"id":1382},"代碼實現",[13,1384,1385,1386],{},"本站實際使用的代碼可以查看 ",[385,1387,390],{"href":387,"rel":1388},[389],[13,1390,1391],{},"以下是通用的 TypeScript 完整代碼實現：",[42,1393,1395],{"className":192,"code":1394,"language":194,"meta":21,"style":21},"import ky from 'ky';\n\nconst REGEX = \u002F^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u002F;\n\ninterface NodeInfo {\n  name: string;\n  code: string | undefined;\n}\n\ninterface TraceData {\n  colo?: string;\n  loc?: string;\n  [key: string]: string | undefined;\n}\n\ninterface CloudflareStatusResult {\n  nodesData: NodeInfo[] | undefined;\n  traceData: TraceData | undefined;\n  currentNodeName: string | undefined;\n  location: string | undefined;\n}\n\nexport async function getCloudflareStatus(): Promise\u003CCloudflareStatusResult> {\n  \u002F\u002F 獲取節點數據\n  const nodesResponse = await ky.get('https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json').json();\n  const nodesData = nodesResponse.components\n    .filter((c) => REGEX.test(c.name))\n    .map((n) => ({\n      name: n.name,\n      code: n.name.match(REGEX)?.[1],\n    }));\n\n  \u002F\u002F 獲取 trace 數據\n  const traceText = await ky.get('https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace').text();\n  const traceData = Object.fromEntries(\n    traceText\n      .split('\\n')\n      .filter((line) => line.includes('='))\n      .map((line) => line.split('=')),\n  ) as TraceData;\n\n  console.log(traceData);\n\n  \u002F\u002F 計算當前節點名稱\n  const currentNodeName = nodesData.find((n) => n.code === traceData?.colo)?.name;\n\n  const location = traceData?.loc;\n\n  return {\n    nodesData,\n    traceData,\n    currentNodeName,\n    location,\n  };\n}\n",[37,1396,1397,1409,1413,1453,1457,1465,1475,1489,1493,1497,1505,1515,1525,1547,1551,1555,1563,1579,1593,1607,1621,1625,1629,1651,1656,1680,1690,1712,1728,1732,1748,1752,1756,1761,1785,1799,1803,1819,1843,1867,1877,1881,1889,1893,1898,1924,1928,1938,1942,1948,1952,1956,1960,1964,1968],{"__ignoreMap":21},[50,1398,1399,1401,1403,1405,1407],{"class":52,"line":53},[50,1400,403],{"class":201},[50,1402,406],{"class":215},[50,1404,409],{"class":201},[50,1406,412],{"class":226},[50,1408,415],{"class":215},[50,1410,1411],{"class":52,"line":59},[50,1412,421],{"emptyLinePlaceholder":420},[50,1414,1415,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451],{"class":52,"line":65},[50,1416,202],{"class":201},[50,1418,272],{"class":205},[50,1420,209],{"class":201},[50,1422,432],{"class":226},[50,1424,321],{"class":201},[50,1426,324],{"class":205},[50,1428,327],{"class":201},[50,1430,331],{"class":330},[50,1432,334],{"class":205},[50,1434,337],{"class":201},[50,1436,341],{"class":340},[50,1438,223],{"class":330},[50,1440,346],{"class":205},[50,1442,349],{"class":201},[50,1444,352],{"class":330},[50,1446,355],{"class":340},[50,1448,358],{"class":201},[50,1450,318],{"class":226},[50,1452,415],{"class":215},[50,1454,1455],{"class":52,"line":71},[50,1456,421],{"emptyLinePlaceholder":420},[50,1458,1459,1461,1463],{"class":52,"line":77},[50,1460,471],{"class":201},[50,1462,474],{"class":219},[50,1464,477],{"class":215},[50,1466,1467,1469,1471,1473],{"class":52,"line":83},[50,1468,482],{"class":262},[50,1470,485],{"class":201},[50,1472,488],{"class":205},[50,1474,415],{"class":215},[50,1476,1477,1479,1481,1483,1485,1487],{"class":52,"line":89},[50,1478,495],{"class":262},[50,1480,485],{"class":201},[50,1482,488],{"class":205},[50,1484,502],{"class":201},[50,1486,505],{"class":205},[50,1488,415],{"class":215},[50,1490,1491],{"class":52,"line":95},[50,1492,512],{"class":215},[50,1494,1495],{"class":52,"line":101},[50,1496,421],{"emptyLinePlaceholder":420},[50,1498,1499,1501,1503],{"class":52,"line":107},[50,1500,471],{"class":201},[50,1502,523],{"class":219},[50,1504,477],{"class":215},[50,1506,1507,1509,1511,1513],{"class":52,"line":113},[50,1508,530],{"class":262},[50,1510,533],{"class":201},[50,1512,488],{"class":205},[50,1514,415],{"class":215},[50,1516,1517,1519,1521,1523],{"class":52,"line":119},[50,1518,542],{"class":262},[50,1520,533],{"class":201},[50,1522,488],{"class":205},[50,1524,415],{"class":215},[50,1526,1527,1529,1531,1533,1535,1537,1539,1541,1543,1545],{"class":52,"line":125},[50,1528,553],{"class":215},[50,1530,556],{"class":262},[50,1532,485],{"class":201},[50,1534,488],{"class":205},[50,1536,563],{"class":215},[50,1538,485],{"class":201},[50,1540,488],{"class":205},[50,1542,502],{"class":201},[50,1544,505],{"class":205},[50,1546,415],{"class":215},[50,1548,1549],{"class":52,"line":131},[50,1550,512],{"class":215},[50,1552,1553],{"class":52,"line":137},[50,1554,421],{"emptyLinePlaceholder":420},[50,1556,1557,1559,1561],{"class":52,"line":143},[50,1558,471],{"class":201},[50,1560,588],{"class":219},[50,1562,477],{"class":215},[50,1564,1565,1567,1569,1571,1573,1575,1577],{"class":52,"line":593},[50,1566,596],{"class":262},[50,1568,485],{"class":201},[50,1570,474],{"class":219},[50,1572,603],{"class":215},[50,1574,606],{"class":201},[50,1576,505],{"class":205},[50,1578,415],{"class":215},[50,1580,1581,1583,1585,1587,1589,1591],{"class":52,"line":613},[50,1582,616],{"class":262},[50,1584,485],{"class":201},[50,1586,523],{"class":219},[50,1588,502],{"class":201},[50,1590,505],{"class":205},[50,1592,415],{"class":215},[50,1594,1595,1597,1599,1601,1603,1605],{"class":52,"line":629},[50,1596,632],{"class":262},[50,1598,485],{"class":201},[50,1600,488],{"class":205},[50,1602,502],{"class":201},[50,1604,505],{"class":205},[50,1606,415],{"class":215},[50,1608,1609,1611,1613,1615,1617,1619],{"class":52,"line":645},[50,1610,648],{"class":262},[50,1612,485],{"class":201},[50,1614,488],{"class":205},[50,1616,502],{"class":201},[50,1618,505],{"class":205},[50,1620,415],{"class":215},[50,1622,1623],{"class":52,"line":661},[50,1624,512],{"class":215},[50,1626,1627],{"class":52,"line":666},[50,1628,421],{"emptyLinePlaceholder":420},[50,1630,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649],{"class":52,"line":671},[50,1632,674],{"class":201},[50,1634,677],{"class":201},[50,1636,680],{"class":201},[50,1638,683],{"class":219},[50,1640,686],{"class":215},[50,1642,485],{"class":201},[50,1644,691],{"class":219},[50,1646,694],{"class":215},[50,1648,697],{"class":219},[50,1650,700],{"class":215},[50,1652,1653],{"class":52,"line":703},[50,1654,1655],{"class":706},"  \u002F\u002F 獲取節點數據\n",[50,1657,1658,1660,1662,1664,1666,1668,1670,1672,1674,1676,1678],{"class":52,"line":710},[50,1659,713],{"class":201},[50,1661,716],{"class":205},[50,1663,209],{"class":201},[50,1665,212],{"class":201},[50,1667,216],{"class":215},[50,1669,220],{"class":219},[50,1671,223],{"class":215},[50,1673,227],{"class":226},[50,1675,230],{"class":215},[50,1677,233],{"class":219},[50,1679,236],{"class":215},[50,1681,1682,1684,1686,1688],{"class":52,"line":737},[50,1683,713],{"class":201},[50,1685,742],{"class":205},[50,1687,209],{"class":201},[50,1689,747],{"class":215},[50,1691,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710],{"class":52,"line":750},[50,1693,753],{"class":215},[50,1695,256],{"class":219},[50,1697,259],{"class":215},[50,1699,263],{"class":262},[50,1701,266],{"class":215},[50,1703,269],{"class":201},[50,1705,272],{"class":205},[50,1707,275],{"class":215},[50,1709,278],{"class":219},[50,1711,281],{"class":215},[50,1713,1714,1716,1718,1720,1722,1724,1726],{"class":52,"line":774},[50,1715,753],{"class":215},[50,1717,288],{"class":219},[50,1719,259],{"class":215},[50,1721,293],{"class":262},[50,1723,266],{"class":215},[50,1725,269],{"class":201},[50,1727,300],{"class":215},[50,1729,1730],{"class":52,"line":791},[50,1731,794],{"class":215},[50,1733,1734,1736,1738,1740,1742,1744,1746],{"class":52,"line":797},[50,1735,800],{"class":215},[50,1737,313],{"class":219},[50,1739,223],{"class":215},[50,1741,807],{"class":205},[50,1743,363],{"class":215},[50,1745,366],{"class":205},[50,1747,369],{"class":215},[50,1749,1750],{"class":52,"line":816},[50,1751,819],{"class":215},[50,1753,1754],{"class":52,"line":822},[50,1755,421],{"emptyLinePlaceholder":420},[50,1757,1758],{"class":52,"line":827},[50,1759,1760],{"class":706},"  \u002F\u002F 獲取 trace 數據\n",[50,1762,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783],{"class":52,"line":833},[50,1764,713],{"class":201},[50,1766,838],{"class":205},[50,1768,209],{"class":201},[50,1770,212],{"class":201},[50,1772,216],{"class":215},[50,1774,220],{"class":219},[50,1776,223],{"class":215},[50,1778,851],{"class":226},[50,1780,230],{"class":215},[50,1782,856],{"class":219},[50,1784,236],{"class":215},[50,1786,1787,1789,1791,1793,1795,1797],{"class":52,"line":861},[50,1788,713],{"class":201},[50,1790,866],{"class":205},[50,1792,209],{"class":201},[50,1794,871],{"class":215},[50,1796,874],{"class":219},[50,1798,877],{"class":215},[50,1800,1801],{"class":52,"line":880},[50,1802,883],{"class":215},[50,1804,1805,1807,1809,1811,1813,1815,1817],{"class":52,"line":886},[50,1806,889],{"class":215},[50,1808,892],{"class":219},[50,1810,223],{"class":215},[50,1812,897],{"class":226},[50,1814,900],{"class":205},[50,1816,897],{"class":226},[50,1818,905],{"class":215},[50,1820,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841],{"class":52,"line":908},[50,1822,889],{"class":215},[50,1824,256],{"class":219},[50,1826,259],{"class":215},[50,1828,52],{"class":262},[50,1830,266],{"class":215},[50,1832,269],{"class":201},[50,1834,923],{"class":215},[50,1836,926],{"class":219},[50,1838,223],{"class":215},[50,1840,931],{"class":226},[50,1842,934],{"class":215},[50,1844,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865],{"class":52,"line":937},[50,1846,889],{"class":215},[50,1848,288],{"class":219},[50,1850,259],{"class":215},[50,1852,52],{"class":262},[50,1854,266],{"class":215},[50,1856,269],{"class":201},[50,1858,923],{"class":215},[50,1860,892],{"class":219},[50,1862,223],{"class":215},[50,1864,931],{"class":226},[50,1866,960],{"class":215},[50,1868,1869,1871,1873,1875],{"class":52,"line":963},[50,1870,966],{"class":215},[50,1872,969],{"class":201},[50,1874,523],{"class":219},[50,1876,415],{"class":215},[50,1878,1879],{"class":52,"line":976},[50,1880,421],{"emptyLinePlaceholder":420},[50,1882,1883,1885,1887],{"class":52,"line":981},[50,1884,984],{"class":215},[50,1886,987],{"class":219},[50,1888,990],{"class":215},[50,1890,1891],{"class":52,"line":993},[50,1892,421],{"emptyLinePlaceholder":420},[50,1894,1895],{"class":52,"line":998},[50,1896,1897],{"class":706},"  \u002F\u002F 計算當前節點名稱\n",[50,1899,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922],{"class":52,"line":1004},[50,1901,713],{"class":201},[50,1903,1009],{"class":205},[50,1905,209],{"class":201},[50,1907,1014],{"class":215},[50,1909,1017],{"class":219},[50,1911,259],{"class":215},[50,1913,293],{"class":262},[50,1915,266],{"class":215},[50,1917,269],{"class":201},[50,1919,1028],{"class":215},[50,1921,1031],{"class":201},[50,1923,1034],{"class":215},[50,1925,1926],{"class":52,"line":1037},[50,1927,421],{"emptyLinePlaceholder":420},[50,1929,1930,1932,1934,1936],{"class":52,"line":1042},[50,1931,713],{"class":201},[50,1933,1047],{"class":205},[50,1935,209],{"class":201},[50,1937,1052],{"class":215},[50,1939,1940],{"class":52,"line":1055},[50,1941,421],{"emptyLinePlaceholder":420},[50,1943,1944,1946],{"class":52,"line":1060},[50,1945,1063],{"class":201},[50,1947,477],{"class":215},[50,1949,1950],{"class":52,"line":1068},[50,1951,1071],{"class":215},[50,1953,1954],{"class":52,"line":1074},[50,1955,1077],{"class":215},[50,1957,1958],{"class":52,"line":1080},[50,1959,1083],{"class":215},[50,1961,1962],{"class":52,"line":1086},[50,1963,1089],{"class":215},[50,1965,1966],{"class":52,"line":1092},[50,1967,1095],{"class":215},[50,1969,1970],{"class":52,"line":1098},[50,1971,512],{"class":215},[1102,1973,1104],{},{"title":21,"searchDepth":59,"depth":59,"links":1975},[1976,1977],{"id":1138,"depth":65,"text":1138},{"id":1382,"depth":65,"text":1382},"通過解析 Cloudflare 的 \u002Fcdn-cgi\u002Ftrace 接口獲取當前網絡節點 ID，再結合 Cloudflare Status 的公共 API 匹配出節點名稱，從而在網站上動態顯示訪客正在使用的 Cloudflare 網絡名稱。",{},"\u002Fblog\u002Fzh-hant\u002Fcf-network",{"title":1121,"description":1126},"blog\u002Fzh-Hant\u002Fcf-network","LKSDGPkUecgE85j7S7lHjrSkjMpG4y4OR79nNpx1-DA",{"locale":1985,"post":1986},"zh-Hant-HK",{"id":1120,"title":1121,"body":1987,"date":1109,"desc":1978,"description":1126,"edit":1109,"extension":1111,"meta":2822,"navigation":420,"path":1980,"seo":2823,"stem":1982,"__hash__":1983},{"type":10,"value":1988,"toc":2818},[1989,1991,1995,1999,2001,2005,2073,2079,2081,2083,2089,2093,2095,2101,2229,2231,2233,2238,2240,2816],[13,1990,1126],{},[13,1992,1993],{},[19,1994],{"alt":21,"src":22},[24,1996,1997],{},[13,1998,1135],{},[30,2000,1138],{"id":1138},[13,2002,1141,2003,1144],{},[37,2004,39],{},[42,2006,2007],{"className":44,"code":45,"language":46,"meta":21,"style":21},[37,2008,2009,2013,2017,2021,2025,2029,2033,2037,2041,2045,2049,2053,2057,2061,2065,2069],{"__ignoreMap":21},[50,2010,2011],{"class":52,"line":53},[50,2012,56],{},[50,2014,2015],{"class":52,"line":59},[50,2016,62],{},[50,2018,2019],{"class":52,"line":65},[50,2020,68],{},[50,2022,2023],{"class":52,"line":71},[50,2024,74],{},[50,2026,2027],{"class":52,"line":77},[50,2028,80],{},[50,2030,2031],{"class":52,"line":83},[50,2032,86],{},[50,2034,2035],{"class":52,"line":89},[50,2036,92],{},[50,2038,2039],{"class":52,"line":95},[50,2040,98],{},[50,2042,2043],{"class":52,"line":101},[50,2044,104],{},[50,2046,2047],{"class":52,"line":107},[50,2048,110],{},[50,2050,2051],{"class":52,"line":113},[50,2052,116],{},[50,2054,2055],{"class":52,"line":119},[50,2056,122],{},[50,2058,2059],{"class":52,"line":125},[50,2060,128],{},[50,2062,2063],{"class":52,"line":131},[50,2064,134],{},[50,2066,2067],{"class":52,"line":137},[50,2068,140],{},[50,2070,2071],{"class":52,"line":143},[50,2072,146],{},[13,2074,1215,2075,1218,2077,157],{},[37,2076,152],{},[37,2078,156],{},[13,2080,1223],{},[13,2082,1226],{},[24,2084,2085],{},[13,2086,2087],{},[37,2088,170],{},[13,2090,2091],{},[19,2092],{"alt":21,"src":175},[13,2094,1239],{},[13,2096,1242,2097,1245,2099,1248],{},[37,2098,184],{},[37,2100,188],{},[42,2102,2103],{"className":192,"code":193,"language":194,"meta":21,"style":21},[37,2104,2105,2129,2139,2161,2177,2181,2225],{"__ignoreMap":21},[50,2106,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127],{"class":52,"line":53},[50,2108,202],{"class":201},[50,2110,206],{"class":205},[50,2112,209],{"class":201},[50,2114,212],{"class":201},[50,2116,216],{"class":215},[50,2118,220],{"class":219},[50,2120,223],{"class":215},[50,2122,227],{"class":226},[50,2124,230],{"class":215},[50,2126,233],{"class":219},[50,2128,236],{"class":215},[50,2130,2131,2133,2135,2137],{"class":52,"line":59},[50,2132,202],{"class":201},[50,2134,243],{"class":205},[50,2136,209],{"class":201},[50,2138,248],{"class":215},[50,2140,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159],{"class":52,"line":65},[50,2142,253],{"class":215},[50,2144,256],{"class":219},[50,2146,259],{"class":215},[50,2148,263],{"class":262},[50,2150,266],{"class":215},[50,2152,269],{"class":201},[50,2154,272],{"class":205},[50,2156,275],{"class":215},[50,2158,278],{"class":219},[50,2160,281],{"class":215},[50,2162,2163,2165,2167,2169,2171,2173,2175],{"class":52,"line":71},[50,2164,253],{"class":215},[50,2166,288],{"class":219},[50,2168,259],{"class":215},[50,2170,293],{"class":262},[50,2172,266],{"class":215},[50,2174,269],{"class":201},[50,2176,300],{"class":215},[50,2178,2179],{"class":52,"line":77},[50,2180,305],{"class":215},[50,2182,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223],{"class":52,"line":83},[50,2184,310],{"class":215},[50,2186,313],{"class":219},[50,2188,223],{"class":215},[50,2190,318],{"class":226},[50,2192,321],{"class":201},[50,2194,324],{"class":205},[50,2196,327],{"class":201},[50,2198,331],{"class":330},[50,2200,334],{"class":205},[50,2202,337],{"class":201},[50,2204,341],{"class":340},[50,2206,223],{"class":330},[50,2208,346],{"class":205},[50,2210,349],{"class":201},[50,2212,352],{"class":330},[50,2214,355],{"class":340},[50,2216,358],{"class":201},[50,2218,318],{"class":226},[50,2220,363],{"class":215},[50,2222,366],{"class":205},[50,2224,369],{"class":215},[50,2226,2227],{"class":52,"line":89},[50,2228,374],{"class":215},[13,2230,1379],{},[30,2232,1382],{"id":1382},[13,2234,1385,2235],{},[385,2236,390],{"href":387,"rel":2237},[389],[13,2239,1391],{},[42,2241,2242],{"className":192,"code":1394,"language":194,"meta":21,"style":21},[37,2243,2244,2256,2260,2300,2304,2312,2322,2336,2340,2344,2352,2362,2372,2394,2398,2402,2410,2426,2440,2454,2468,2472,2476,2498,2502,2526,2536,2558,2574,2578,2594,2598,2602,2606,2630,2644,2648,2664,2688,2712,2722,2726,2734,2738,2742,2768,2772,2782,2786,2792,2796,2800,2804,2808,2812],{"__ignoreMap":21},[50,2245,2246,2248,2250,2252,2254],{"class":52,"line":53},[50,2247,403],{"class":201},[50,2249,406],{"class":215},[50,2251,409],{"class":201},[50,2253,412],{"class":226},[50,2255,415],{"class":215},[50,2257,2258],{"class":52,"line":59},[50,2259,421],{"emptyLinePlaceholder":420},[50,2261,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2286,2288,2290,2292,2294,2296,2298],{"class":52,"line":65},[50,2263,202],{"class":201},[50,2265,272],{"class":205},[50,2267,209],{"class":201},[50,2269,432],{"class":226},[50,2271,321],{"class":201},[50,2273,324],{"class":205},[50,2275,327],{"class":201},[50,2277,331],{"class":330},[50,2279,334],{"class":205},[50,2281,337],{"class":201},[50,2283,341],{"class":340},[50,2285,223],{"class":330},[50,2287,346],{"class":205},[50,2289,349],{"class":201},[50,2291,352],{"class":330},[50,2293,355],{"class":340},[50,2295,358],{"class":201},[50,2297,318],{"class":226},[50,2299,415],{"class":215},[50,2301,2302],{"class":52,"line":71},[50,2303,421],{"emptyLinePlaceholder":420},[50,2305,2306,2308,2310],{"class":52,"line":77},[50,2307,471],{"class":201},[50,2309,474],{"class":219},[50,2311,477],{"class":215},[50,2313,2314,2316,2318,2320],{"class":52,"line":83},[50,2315,482],{"class":262},[50,2317,485],{"class":201},[50,2319,488],{"class":205},[50,2321,415],{"class":215},[50,2323,2324,2326,2328,2330,2332,2334],{"class":52,"line":89},[50,2325,495],{"class":262},[50,2327,485],{"class":201},[50,2329,488],{"class":205},[50,2331,502],{"class":201},[50,2333,505],{"class":205},[50,2335,415],{"class":215},[50,2337,2338],{"class":52,"line":95},[50,2339,512],{"class":215},[50,2341,2342],{"class":52,"line":101},[50,2343,421],{"emptyLinePlaceholder":420},[50,2345,2346,2348,2350],{"class":52,"line":107},[50,2347,471],{"class":201},[50,2349,523],{"class":219},[50,2351,477],{"class":215},[50,2353,2354,2356,2358,2360],{"class":52,"line":113},[50,2355,530],{"class":262},[50,2357,533],{"class":201},[50,2359,488],{"class":205},[50,2361,415],{"class":215},[50,2363,2364,2366,2368,2370],{"class":52,"line":119},[50,2365,542],{"class":262},[50,2367,533],{"class":201},[50,2369,488],{"class":205},[50,2371,415],{"class":215},[50,2373,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392],{"class":52,"line":125},[50,2375,553],{"class":215},[50,2377,556],{"class":262},[50,2379,485],{"class":201},[50,2381,488],{"class":205},[50,2383,563],{"class":215},[50,2385,485],{"class":201},[50,2387,488],{"class":205},[50,2389,502],{"class":201},[50,2391,505],{"class":205},[50,2393,415],{"class":215},[50,2395,2396],{"class":52,"line":131},[50,2397,512],{"class":215},[50,2399,2400],{"class":52,"line":137},[50,2401,421],{"emptyLinePlaceholder":420},[50,2403,2404,2406,2408],{"class":52,"line":143},[50,2405,471],{"class":201},[50,2407,588],{"class":219},[50,2409,477],{"class":215},[50,2411,2412,2414,2416,2418,2420,2422,2424],{"class":52,"line":593},[50,2413,596],{"class":262},[50,2415,485],{"class":201},[50,2417,474],{"class":219},[50,2419,603],{"class":215},[50,2421,606],{"class":201},[50,2423,505],{"class":205},[50,2425,415],{"class":215},[50,2427,2428,2430,2432,2434,2436,2438],{"class":52,"line":613},[50,2429,616],{"class":262},[50,2431,485],{"class":201},[50,2433,523],{"class":219},[50,2435,502],{"class":201},[50,2437,505],{"class":205},[50,2439,415],{"class":215},[50,2441,2442,2444,2446,2448,2450,2452],{"class":52,"line":629},[50,2443,632],{"class":262},[50,2445,485],{"class":201},[50,2447,488],{"class":205},[50,2449,502],{"class":201},[50,2451,505],{"class":205},[50,2453,415],{"class":215},[50,2455,2456,2458,2460,2462,2464,2466],{"class":52,"line":645},[50,2457,648],{"class":262},[50,2459,485],{"class":201},[50,2461,488],{"class":205},[50,2463,502],{"class":201},[50,2465,505],{"class":205},[50,2467,415],{"class":215},[50,2469,2470],{"class":52,"line":661},[50,2471,512],{"class":215},[50,2473,2474],{"class":52,"line":666},[50,2475,421],{"emptyLinePlaceholder":420},[50,2477,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496],{"class":52,"line":671},[50,2479,674],{"class":201},[50,2481,677],{"class":201},[50,2483,680],{"class":201},[50,2485,683],{"class":219},[50,2487,686],{"class":215},[50,2489,485],{"class":201},[50,2491,691],{"class":219},[50,2493,694],{"class":215},[50,2495,697],{"class":219},[50,2497,700],{"class":215},[50,2499,2500],{"class":52,"line":703},[50,2501,1655],{"class":706},[50,2503,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522,2524],{"class":52,"line":710},[50,2505,713],{"class":201},[50,2507,716],{"class":205},[50,2509,209],{"class":201},[50,2511,212],{"class":201},[50,2513,216],{"class":215},[50,2515,220],{"class":219},[50,2517,223],{"class":215},[50,2519,227],{"class":226},[50,2521,230],{"class":215},[50,2523,233],{"class":219},[50,2525,236],{"class":215},[50,2527,2528,2530,2532,2534],{"class":52,"line":737},[50,2529,713],{"class":201},[50,2531,742],{"class":205},[50,2533,209],{"class":201},[50,2535,747],{"class":215},[50,2537,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556],{"class":52,"line":750},[50,2539,753],{"class":215},[50,2541,256],{"class":219},[50,2543,259],{"class":215},[50,2545,263],{"class":262},[50,2547,266],{"class":215},[50,2549,269],{"class":201},[50,2551,272],{"class":205},[50,2553,275],{"class":215},[50,2555,278],{"class":219},[50,2557,281],{"class":215},[50,2559,2560,2562,2564,2566,2568,2570,2572],{"class":52,"line":774},[50,2561,753],{"class":215},[50,2563,288],{"class":219},[50,2565,259],{"class":215},[50,2567,293],{"class":262},[50,2569,266],{"class":215},[50,2571,269],{"class":201},[50,2573,300],{"class":215},[50,2575,2576],{"class":52,"line":791},[50,2577,794],{"class":215},[50,2579,2580,2582,2584,2586,2588,2590,2592],{"class":52,"line":797},[50,2581,800],{"class":215},[50,2583,313],{"class":219},[50,2585,223],{"class":215},[50,2587,807],{"class":205},[50,2589,363],{"class":215},[50,2591,366],{"class":205},[50,2593,369],{"class":215},[50,2595,2596],{"class":52,"line":816},[50,2597,819],{"class":215},[50,2599,2600],{"class":52,"line":822},[50,2601,421],{"emptyLinePlaceholder":420},[50,2603,2604],{"class":52,"line":827},[50,2605,1760],{"class":706},[50,2607,2608,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628],{"class":52,"line":833},[50,2609,713],{"class":201},[50,2611,838],{"class":205},[50,2613,209],{"class":201},[50,2615,212],{"class":201},[50,2617,216],{"class":215},[50,2619,220],{"class":219},[50,2621,223],{"class":215},[50,2623,851],{"class":226},[50,2625,230],{"class":215},[50,2627,856],{"class":219},[50,2629,236],{"class":215},[50,2631,2632,2634,2636,2638,2640,2642],{"class":52,"line":861},[50,2633,713],{"class":201},[50,2635,866],{"class":205},[50,2637,209],{"class":201},[50,2639,871],{"class":215},[50,2641,874],{"class":219},[50,2643,877],{"class":215},[50,2645,2646],{"class":52,"line":880},[50,2647,883],{"class":215},[50,2649,2650,2652,2654,2656,2658,2660,2662],{"class":52,"line":886},[50,2651,889],{"class":215},[50,2653,892],{"class":219},[50,2655,223],{"class":215},[50,2657,897],{"class":226},[50,2659,900],{"class":205},[50,2661,897],{"class":226},[50,2663,905],{"class":215},[50,2665,2666,2668,2670,2672,2674,2676,2678,2680,2682,2684,2686],{"class":52,"line":908},[50,2667,889],{"class":215},[50,2669,256],{"class":219},[50,2671,259],{"class":215},[50,2673,52],{"class":262},[50,2675,266],{"class":215},[50,2677,269],{"class":201},[50,2679,923],{"class":215},[50,2681,926],{"class":219},[50,2683,223],{"class":215},[50,2685,931],{"class":226},[50,2687,934],{"class":215},[50,2689,2690,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710],{"class":52,"line":937},[50,2691,889],{"class":215},[50,2693,288],{"class":219},[50,2695,259],{"class":215},[50,2697,52],{"class":262},[50,2699,266],{"class":215},[50,2701,269],{"class":201},[50,2703,923],{"class":215},[50,2705,892],{"class":219},[50,2707,223],{"class":215},[50,2709,931],{"class":226},[50,2711,960],{"class":215},[50,2713,2714,2716,2718,2720],{"class":52,"line":963},[50,2715,966],{"class":215},[50,2717,969],{"class":201},[50,2719,523],{"class":219},[50,2721,415],{"class":215},[50,2723,2724],{"class":52,"line":976},[50,2725,421],{"emptyLinePlaceholder":420},[50,2727,2728,2730,2732],{"class":52,"line":981},[50,2729,984],{"class":215},[50,2731,987],{"class":219},[50,2733,990],{"class":215},[50,2735,2736],{"class":52,"line":993},[50,2737,421],{"emptyLinePlaceholder":420},[50,2739,2740],{"class":52,"line":998},[50,2741,1897],{"class":706},[50,2743,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766],{"class":52,"line":1004},[50,2745,713],{"class":201},[50,2747,1009],{"class":205},[50,2749,209],{"class":201},[50,2751,1014],{"class":215},[50,2753,1017],{"class":219},[50,2755,259],{"class":215},[50,2757,293],{"class":262},[50,2759,266],{"class":215},[50,2761,269],{"class":201},[50,2763,1028],{"class":215},[50,2765,1031],{"class":201},[50,2767,1034],{"class":215},[50,2769,2770],{"class":52,"line":1037},[50,2771,421],{"emptyLinePlaceholder":420},[50,2773,2774,2776,2778,2780],{"class":52,"line":1042},[50,2775,713],{"class":201},[50,2777,1047],{"class":205},[50,2779,209],{"class":201},[50,2781,1052],{"class":215},[50,2783,2784],{"class":52,"line":1055},[50,2785,421],{"emptyLinePlaceholder":420},[50,2787,2788,2790],{"class":52,"line":1060},[50,2789,1063],{"class":201},[50,2791,477],{"class":215},[50,2793,2794],{"class":52,"line":1068},[50,2795,1071],{"class":215},[50,2797,2798],{"class":52,"line":1074},[50,2799,1077],{"class":215},[50,2801,2802],{"class":52,"line":1080},[50,2803,1083],{"class":215},[50,2805,2806],{"class":52,"line":1086},[50,2807,1089],{"class":215},[50,2809,2810],{"class":52,"line":1092},[50,2811,1095],{"class":215},[50,2813,2814],{"class":52,"line":1098},[50,2815,512],{"class":215},[1102,2817,1104],{},{"title":21,"searchDepth":59,"depth":59,"links":2819},[2820,2821],{"id":1138,"depth":65,"text":1138},{"id":1382,"depth":65,"text":1382},{},{"title":1121,"description":1126},{"locale":2825,"post":2826},"en",{"id":2827,"title":2828,"body":2829,"date":1109,"desc":3691,"description":2833,"edit":1109,"extension":1111,"meta":3692,"navigation":420,"path":3693,"seo":3694,"stem":3695,"__hash__":3696},"blog\u002Fblog\u002Fen\u002Fcf-network.md","How to Display the Current Cloudflare Network Used on a Website",{"type":10,"value":2830,"toc":3687},[2831,2834,2838,2843,2847,2853,2921,2929,2932,2935,2941,2945,2948,2961,3089,3092,3096,3102,3105,3685],[13,2832,2833],{},"Early this morning, I added a small feature to my personal website: displaying the current Cloudflare network in use.",[13,2835,2836],{},[19,2837],{"alt":21,"src":22},[24,2839,2840],{},[13,2841,2842],{},"Scroll to the bottom of this website, and you should see the actual display style.",[30,2844,2846],{"id":2845},"implementation-approach","Implementation Approach",[13,2848,2849,2850,2852],{},"For websites proxied by Cloudflare, visiting ",[37,2851,39],{}," returns information about the Cloudflare network currently being used. Example output:",[42,2854,2855],{"className":44,"code":45,"language":46,"meta":21,"style":21},[37,2856,2857,2861,2865,2869,2873,2877,2881,2885,2889,2893,2897,2901,2905,2909,2913,2917],{"__ignoreMap":21},[50,2858,2859],{"class":52,"line":53},[50,2860,56],{},[50,2862,2863],{"class":52,"line":59},[50,2864,62],{},[50,2866,2867],{"class":52,"line":65},[50,2868,68],{},[50,2870,2871],{"class":52,"line":71},[50,2872,74],{},[50,2874,2875],{"class":52,"line":77},[50,2876,80],{},[50,2878,2879],{"class":52,"line":83},[50,2880,86],{},[50,2882,2883],{"class":52,"line":89},[50,2884,92],{},[50,2886,2887],{"class":52,"line":95},[50,2888,98],{},[50,2890,2891],{"class":52,"line":101},[50,2892,104],{},[50,2894,2895],{"class":52,"line":107},[50,2896,110],{},[50,2898,2899],{"class":52,"line":113},[50,2900,116],{},[50,2902,2903],{"class":52,"line":119},[50,2904,122],{},[50,2906,2907],{"class":52,"line":125},[50,2908,128],{},[50,2910,2911],{"class":52,"line":131},[50,2912,134],{},[50,2914,2915],{"class":52,"line":137},[50,2916,140],{},[50,2918,2919],{"class":52,"line":143},[50,2920,146],{},[13,2922,2923,2924,2926,2927,275],{},"By parsing the ",[37,2925,152],{}," parameter, we can obtain the current Cloudflare network ID — in this example, ",[37,2928,156],{},[13,2930,2931],{},"Now that we have the network ID, we can display the corresponding Cloudflare network name.",[13,2933,2934],{},"Cloudflare Status provides a file that lists the current status information of all Cloudflare networks.",[24,2936,2937],{},[13,2938,2939],{},[37,2940,170],{},[13,2942,2943],{},[19,2944],{"alt":21,"src":175},[13,2946,2947],{},"The file content is quite messy, so we need a simple script to extract the formatted information we need.",[13,2949,2950,2951,2953,2954,2956,2957,2960],{},"First, filter the ",[37,2952,188],{}," fields of network components using a simple regular expression (",[37,2955,184],{},"), then simplify the data structure. (Here, we use the ",[37,2958,2959],{},"ky"," library to fetch data.)",[42,2962,2963],{"className":192,"code":193,"language":194,"meta":21,"style":21},[37,2964,2965,2989,2999,3021,3037,3041,3085],{"__ignoreMap":21},[50,2966,2967,2969,2971,2973,2975,2977,2979,2981,2983,2985,2987],{"class":52,"line":53},[50,2968,202],{"class":201},[50,2970,206],{"class":205},[50,2972,209],{"class":201},[50,2974,212],{"class":201},[50,2976,216],{"class":215},[50,2978,220],{"class":219},[50,2980,223],{"class":215},[50,2982,227],{"class":226},[50,2984,230],{"class":215},[50,2986,233],{"class":219},[50,2988,236],{"class":215},[50,2990,2991,2993,2995,2997],{"class":52,"line":59},[50,2992,202],{"class":201},[50,2994,243],{"class":205},[50,2996,209],{"class":201},[50,2998,248],{"class":215},[50,3000,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019],{"class":52,"line":65},[50,3002,253],{"class":215},[50,3004,256],{"class":219},[50,3006,259],{"class":215},[50,3008,263],{"class":262},[50,3010,266],{"class":215},[50,3012,269],{"class":201},[50,3014,272],{"class":205},[50,3016,275],{"class":215},[50,3018,278],{"class":219},[50,3020,281],{"class":215},[50,3022,3023,3025,3027,3029,3031,3033,3035],{"class":52,"line":71},[50,3024,253],{"class":215},[50,3026,288],{"class":219},[50,3028,259],{"class":215},[50,3030,293],{"class":262},[50,3032,266],{"class":215},[50,3034,269],{"class":201},[50,3036,300],{"class":215},[50,3038,3039],{"class":52,"line":77},[50,3040,305],{"class":215},[50,3042,3043,3045,3047,3049,3051,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071,3073,3075,3077,3079,3081,3083],{"class":52,"line":83},[50,3044,310],{"class":215},[50,3046,313],{"class":219},[50,3048,223],{"class":215},[50,3050,318],{"class":226},[50,3052,321],{"class":201},[50,3054,324],{"class":205},[50,3056,327],{"class":201},[50,3058,331],{"class":330},[50,3060,334],{"class":205},[50,3062,337],{"class":201},[50,3064,341],{"class":340},[50,3066,223],{"class":330},[50,3068,346],{"class":205},[50,3070,349],{"class":201},[50,3072,352],{"class":330},[50,3074,355],{"class":340},[50,3076,358],{"class":201},[50,3078,318],{"class":226},[50,3080,363],{"class":215},[50,3082,366],{"class":205},[50,3084,369],{"class":215},[50,3086,3087],{"class":52,"line":89},[50,3088,374],{"class":215},[13,3090,3091],{},"Combined with the network ID obtained earlier, we can now get the actual network node name.",[30,3093,3095],{"id":3094},"code-implementation","Code Implementation",[13,3097,3098,3099],{},"The actual code used on this site can be seen in ",[385,3100,390],{"href":387,"rel":3101},[389],[13,3103,3104],{},"Below is a complete TypeScript implementation:",[42,3106,3108],{"className":192,"code":3107,"language":194,"meta":21,"style":21},"import ky from 'ky';\n\nconst REGEX = \u002F^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u002F;\n\ninterface NodeInfo {\n  name: string;\n  code: string | undefined;\n}\n\ninterface TraceData {\n  colo?: string;\n  loc?: string;\n  [key: string]: string | undefined;\n}\n\ninterface CloudflareStatusResult {\n  nodesData: NodeInfo[] | undefined;\n  traceData: TraceData | undefined;\n  currentNodeName: string | undefined;\n  location: string | undefined;\n}\n\nexport async function getCloudflareStatus(): Promise\u003CCloudflareStatusResult> {\n  \u002F\u002F Fetch node data\n  const nodesResponse = await ky.get('https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json').json();\n  const nodesData = nodesResponse.components\n    .filter((c) => REGEX.test(c.name))\n    .map((n) => ({\n      name: n.name,\n      code: n.name.match(REGEX)?.[1],\n    }));\n\n  \u002F\u002F Fetch trace data\n  const traceText = await ky.get('https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace').text();\n  const traceData = Object.fromEntries(\n    traceText\n      .split('\\n')\n      .filter((line) => line.includes('='))\n      .map((line) => line.split('=')),\n  ) as TraceData;\n\n  console.log(traceData);\n\n  \u002F\u002F Determine current node name\n  const currentNodeName = nodesData.find((n) => n.code === traceData?.colo)?.name;\n\n  const location = traceData?.loc;\n\n  return {\n    nodesData,\n    traceData,\n    currentNodeName,\n    location,\n  };\n}\n",[37,3109,3110,3122,3126,3166,3170,3178,3188,3202,3206,3210,3218,3228,3238,3260,3264,3268,3276,3292,3306,3320,3334,3338,3342,3364,3369,3393,3403,3425,3441,3445,3461,3465,3469,3474,3498,3512,3516,3532,3556,3580,3590,3594,3602,3606,3611,3637,3641,3651,3655,3661,3665,3669,3673,3677,3681],{"__ignoreMap":21},[50,3111,3112,3114,3116,3118,3120],{"class":52,"line":53},[50,3113,403],{"class":201},[50,3115,406],{"class":215},[50,3117,409],{"class":201},[50,3119,412],{"class":226},[50,3121,415],{"class":215},[50,3123,3124],{"class":52,"line":59},[50,3125,421],{"emptyLinePlaceholder":420},[50,3127,3128,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164],{"class":52,"line":65},[50,3129,202],{"class":201},[50,3131,272],{"class":205},[50,3133,209],{"class":201},[50,3135,432],{"class":226},[50,3137,321],{"class":201},[50,3139,324],{"class":205},[50,3141,327],{"class":201},[50,3143,331],{"class":330},[50,3145,334],{"class":205},[50,3147,337],{"class":201},[50,3149,341],{"class":340},[50,3151,223],{"class":330},[50,3153,346],{"class":205},[50,3155,349],{"class":201},[50,3157,352],{"class":330},[50,3159,355],{"class":340},[50,3161,358],{"class":201},[50,3163,318],{"class":226},[50,3165,415],{"class":215},[50,3167,3168],{"class":52,"line":71},[50,3169,421],{"emptyLinePlaceholder":420},[50,3171,3172,3174,3176],{"class":52,"line":77},[50,3173,471],{"class":201},[50,3175,474],{"class":219},[50,3177,477],{"class":215},[50,3179,3180,3182,3184,3186],{"class":52,"line":83},[50,3181,482],{"class":262},[50,3183,485],{"class":201},[50,3185,488],{"class":205},[50,3187,415],{"class":215},[50,3189,3190,3192,3194,3196,3198,3200],{"class":52,"line":89},[50,3191,495],{"class":262},[50,3193,485],{"class":201},[50,3195,488],{"class":205},[50,3197,502],{"class":201},[50,3199,505],{"class":205},[50,3201,415],{"class":215},[50,3203,3204],{"class":52,"line":95},[50,3205,512],{"class":215},[50,3207,3208],{"class":52,"line":101},[50,3209,421],{"emptyLinePlaceholder":420},[50,3211,3212,3214,3216],{"class":52,"line":107},[50,3213,471],{"class":201},[50,3215,523],{"class":219},[50,3217,477],{"class":215},[50,3219,3220,3222,3224,3226],{"class":52,"line":113},[50,3221,530],{"class":262},[50,3223,533],{"class":201},[50,3225,488],{"class":205},[50,3227,415],{"class":215},[50,3229,3230,3232,3234,3236],{"class":52,"line":119},[50,3231,542],{"class":262},[50,3233,533],{"class":201},[50,3235,488],{"class":205},[50,3237,415],{"class":215},[50,3239,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258],{"class":52,"line":125},[50,3241,553],{"class":215},[50,3243,556],{"class":262},[50,3245,485],{"class":201},[50,3247,488],{"class":205},[50,3249,563],{"class":215},[50,3251,485],{"class":201},[50,3253,488],{"class":205},[50,3255,502],{"class":201},[50,3257,505],{"class":205},[50,3259,415],{"class":215},[50,3261,3262],{"class":52,"line":131},[50,3263,512],{"class":215},[50,3265,3266],{"class":52,"line":137},[50,3267,421],{"emptyLinePlaceholder":420},[50,3269,3270,3272,3274],{"class":52,"line":143},[50,3271,471],{"class":201},[50,3273,588],{"class":219},[50,3275,477],{"class":215},[50,3277,3278,3280,3282,3284,3286,3288,3290],{"class":52,"line":593},[50,3279,596],{"class":262},[50,3281,485],{"class":201},[50,3283,474],{"class":219},[50,3285,603],{"class":215},[50,3287,606],{"class":201},[50,3289,505],{"class":205},[50,3291,415],{"class":215},[50,3293,3294,3296,3298,3300,3302,3304],{"class":52,"line":613},[50,3295,616],{"class":262},[50,3297,485],{"class":201},[50,3299,523],{"class":219},[50,3301,502],{"class":201},[50,3303,505],{"class":205},[50,3305,415],{"class":215},[50,3307,3308,3310,3312,3314,3316,3318],{"class":52,"line":629},[50,3309,632],{"class":262},[50,3311,485],{"class":201},[50,3313,488],{"class":205},[50,3315,502],{"class":201},[50,3317,505],{"class":205},[50,3319,415],{"class":215},[50,3321,3322,3324,3326,3328,3330,3332],{"class":52,"line":645},[50,3323,648],{"class":262},[50,3325,485],{"class":201},[50,3327,488],{"class":205},[50,3329,502],{"class":201},[50,3331,505],{"class":205},[50,3333,415],{"class":215},[50,3335,3336],{"class":52,"line":661},[50,3337,512],{"class":215},[50,3339,3340],{"class":52,"line":666},[50,3341,421],{"emptyLinePlaceholder":420},[50,3343,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362],{"class":52,"line":671},[50,3345,674],{"class":201},[50,3347,677],{"class":201},[50,3349,680],{"class":201},[50,3351,683],{"class":219},[50,3353,686],{"class":215},[50,3355,485],{"class":201},[50,3357,691],{"class":219},[50,3359,694],{"class":215},[50,3361,697],{"class":219},[50,3363,700],{"class":215},[50,3365,3366],{"class":52,"line":703},[50,3367,3368],{"class":706},"  \u002F\u002F Fetch node data\n",[50,3370,3371,3373,3375,3377,3379,3381,3383,3385,3387,3389,3391],{"class":52,"line":710},[50,3372,713],{"class":201},[50,3374,716],{"class":205},[50,3376,209],{"class":201},[50,3378,212],{"class":201},[50,3380,216],{"class":215},[50,3382,220],{"class":219},[50,3384,223],{"class":215},[50,3386,227],{"class":226},[50,3388,230],{"class":215},[50,3390,233],{"class":219},[50,3392,236],{"class":215},[50,3394,3395,3397,3399,3401],{"class":52,"line":737},[50,3396,713],{"class":201},[50,3398,742],{"class":205},[50,3400,209],{"class":201},[50,3402,747],{"class":215},[50,3404,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423],{"class":52,"line":750},[50,3406,753],{"class":215},[50,3408,256],{"class":219},[50,3410,259],{"class":215},[50,3412,263],{"class":262},[50,3414,266],{"class":215},[50,3416,269],{"class":201},[50,3418,272],{"class":205},[50,3420,275],{"class":215},[50,3422,278],{"class":219},[50,3424,281],{"class":215},[50,3426,3427,3429,3431,3433,3435,3437,3439],{"class":52,"line":774},[50,3428,753],{"class":215},[50,3430,288],{"class":219},[50,3432,259],{"class":215},[50,3434,293],{"class":262},[50,3436,266],{"class":215},[50,3438,269],{"class":201},[50,3440,300],{"class":215},[50,3442,3443],{"class":52,"line":791},[50,3444,794],{"class":215},[50,3446,3447,3449,3451,3453,3455,3457,3459],{"class":52,"line":797},[50,3448,800],{"class":215},[50,3450,313],{"class":219},[50,3452,223],{"class":215},[50,3454,807],{"class":205},[50,3456,363],{"class":215},[50,3458,366],{"class":205},[50,3460,369],{"class":215},[50,3462,3463],{"class":52,"line":816},[50,3464,819],{"class":215},[50,3466,3467],{"class":52,"line":822},[50,3468,421],{"emptyLinePlaceholder":420},[50,3470,3471],{"class":52,"line":827},[50,3472,3473],{"class":706},"  \u002F\u002F Fetch trace data\n",[50,3475,3476,3478,3480,3482,3484,3486,3488,3490,3492,3494,3496],{"class":52,"line":833},[50,3477,713],{"class":201},[50,3479,838],{"class":205},[50,3481,209],{"class":201},[50,3483,212],{"class":201},[50,3485,216],{"class":215},[50,3487,220],{"class":219},[50,3489,223],{"class":215},[50,3491,851],{"class":226},[50,3493,230],{"class":215},[50,3495,856],{"class":219},[50,3497,236],{"class":215},[50,3499,3500,3502,3504,3506,3508,3510],{"class":52,"line":861},[50,3501,713],{"class":201},[50,3503,866],{"class":205},[50,3505,209],{"class":201},[50,3507,871],{"class":215},[50,3509,874],{"class":219},[50,3511,877],{"class":215},[50,3513,3514],{"class":52,"line":880},[50,3515,883],{"class":215},[50,3517,3518,3520,3522,3524,3526,3528,3530],{"class":52,"line":886},[50,3519,889],{"class":215},[50,3521,892],{"class":219},[50,3523,223],{"class":215},[50,3525,897],{"class":226},[50,3527,900],{"class":205},[50,3529,897],{"class":226},[50,3531,905],{"class":215},[50,3533,3534,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554],{"class":52,"line":908},[50,3535,889],{"class":215},[50,3537,256],{"class":219},[50,3539,259],{"class":215},[50,3541,52],{"class":262},[50,3543,266],{"class":215},[50,3545,269],{"class":201},[50,3547,923],{"class":215},[50,3549,926],{"class":219},[50,3551,223],{"class":215},[50,3553,931],{"class":226},[50,3555,934],{"class":215},[50,3557,3558,3560,3562,3564,3566,3568,3570,3572,3574,3576,3578],{"class":52,"line":937},[50,3559,889],{"class":215},[50,3561,288],{"class":219},[50,3563,259],{"class":215},[50,3565,52],{"class":262},[50,3567,266],{"class":215},[50,3569,269],{"class":201},[50,3571,923],{"class":215},[50,3573,892],{"class":219},[50,3575,223],{"class":215},[50,3577,931],{"class":226},[50,3579,960],{"class":215},[50,3581,3582,3584,3586,3588],{"class":52,"line":963},[50,3583,966],{"class":215},[50,3585,969],{"class":201},[50,3587,523],{"class":219},[50,3589,415],{"class":215},[50,3591,3592],{"class":52,"line":976},[50,3593,421],{"emptyLinePlaceholder":420},[50,3595,3596,3598,3600],{"class":52,"line":981},[50,3597,984],{"class":215},[50,3599,987],{"class":219},[50,3601,990],{"class":215},[50,3603,3604],{"class":52,"line":993},[50,3605,421],{"emptyLinePlaceholder":420},[50,3607,3608],{"class":52,"line":998},[50,3609,3610],{"class":706},"  \u002F\u002F Determine current node name\n",[50,3612,3613,3615,3617,3619,3621,3623,3625,3627,3629,3631,3633,3635],{"class":52,"line":1004},[50,3614,713],{"class":201},[50,3616,1009],{"class":205},[50,3618,209],{"class":201},[50,3620,1014],{"class":215},[50,3622,1017],{"class":219},[50,3624,259],{"class":215},[50,3626,293],{"class":262},[50,3628,266],{"class":215},[50,3630,269],{"class":201},[50,3632,1028],{"class":215},[50,3634,1031],{"class":201},[50,3636,1034],{"class":215},[50,3638,3639],{"class":52,"line":1037},[50,3640,421],{"emptyLinePlaceholder":420},[50,3642,3643,3645,3647,3649],{"class":52,"line":1042},[50,3644,713],{"class":201},[50,3646,1047],{"class":205},[50,3648,209],{"class":201},[50,3650,1052],{"class":215},[50,3652,3653],{"class":52,"line":1055},[50,3654,421],{"emptyLinePlaceholder":420},[50,3656,3657,3659],{"class":52,"line":1060},[50,3658,1063],{"class":201},[50,3660,477],{"class":215},[50,3662,3663],{"class":52,"line":1068},[50,3664,1071],{"class":215},[50,3666,3667],{"class":52,"line":1074},[50,3668,1077],{"class":215},[50,3670,3671],{"class":52,"line":1080},[50,3672,1083],{"class":215},[50,3674,3675],{"class":52,"line":1086},[50,3676,1089],{"class":215},[50,3678,3679],{"class":52,"line":1092},[50,3680,1095],{"class":215},[50,3682,3683],{"class":52,"line":1098},[50,3684,512],{"class":215},[1102,3686,1104],{},{"title":21,"searchDepth":59,"depth":59,"links":3688},[3689,3690],{"id":2845,"depth":65,"text":2846},{"id":3094,"depth":65,"text":3095},"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.",{},"\u002Fblog\u002Fen\u002Fcf-network",{"title":2828,"description":2833},"blog\u002Fen\u002Fcf-network","LQ3eL7y80lms45shaXKZReya8ao1y2G7spOGbH6l6WA",{"locale":3698,"post":3699},"ja",null,[3701,3704,3707,3710,3713,3716,3719,3722,3725,3728,3731,3734,3737,3740,3743,3746,3749,3752,3755,3758,3761,3764,3767,3770,3773,3776,3779,3782,3785,3788,3791,3794,3797,3800,3803,3806,3809,3812,3815,3818,3821,3824,3827,3830,3833,3836,3839,3842,3845,3848,3851,3854,3857,3860,3863,3866,3869,3872,3875,3878,3881,3884,3887,3890,3893,3896,3899,3902,3905,3908,3911,3914,3917,3920,3923,3926,3929,3932,3935,3938,3941,3944,3947,3950,3953,3956,3959,3962,3965,3968,3971,3974,3977,3980,3983,3986,3989,3992,3995,3998,4001,4004,4007,4010,4013,4016,4019,4022,4025,4028,4031,4034,4037,4040,4043,4046,4049,4052,4055,4058,4061,4064,4067,4070,4073,4076,4079,4082,4085,4088,4091,4094,4097,4100,4103,4106,4109,4112,4115,4117,4120,4123,4126,4129,4132,4135,4138,4141,4144,4147,4150,4153,4156,4159,4162,4165,4168,4171,4174,4177,4180,4183,4186,4189,4192,4195,4198,4201,4204,4207,4210,4213,4216,4219,4222,4225,4228,4231,4234,4237,4240,4243,4246,4249,4252,4255,4258,4261,4264,4267,4270,4273,4276,4279,4282,4285,4288,4291,4294,4297,4300,4303,4306,4309,4312,4315,4318,4321,4324,4327,4330,4333,4336,4339,4342,4345,4348,4351,4354,4357,4360,4363,4366,4369,4372,4375,4378,4381,4384,4387,4390,4393,4396,4399,4402,4405,4408,4411,4414,4417,4420,4423,4426,4429,4432,4435,4438,4441,4444,4447,4450,4453,4456,4459,4462,4465,4468,4471,4474,4477,4480,4483,4486,4489,4492,4495,4498,4501,4504,4507,4510,4513,4516,4519,4522,4525,4528,4531,4534,4537,4540,4543,4546,4549,4552,4555,4558,4561,4564,4567,4570,4573,4576,4579,4582,4585,4588,4591,4594,4597,4600,4603,4606,4609,4612,4615,4618,4621,4624,4627,4630,4633,4636,4639,4642],{"name":3702,"code":3703},"Amsterdam, Netherlands - (AMS)","AMS",{"name":3705,"code":3706},"Amman, Jordan - (AMM)","AMM",{"name":3708,"code":3709},"Adelaide, SA, Australia - (ADL)","ADL",{"name":3711,"code":3712},"Americana, Brazil - (QWJ)","QWJ",{"name":3714,"code":3715},"Accra, Ghana - (ACC)","ACC",{"name":3717,"code":3718},"Ahmedabad, India - (AMD)","AMD",{"name":3720,"code":3721},"Albuquerque, NM, United States - (ABQ)","ABQ",{"name":3723,"code":3724},"Auckland, New Zealand - (AKL)","AKL",{"name":3726,"code":3727},"Athens, Greece - (ATH)","ATH",{"name":3729,"code":3730},"Arica, Chile - (ARI)","ARI",{"name":3732,"code":3733},"Algiers, Algeria - (ALG)","ALG",{"name":3735,"code":3736},"Almaty, Kazakhstan - (ALA)","ALA",{"name":3738,"code":3739},"Astara, Azerbaijan - (LLK)","LLK",{"name":3741,"code":3742},"Anchorage, AK, United States - (ANC)","ANC",{"name":3744,"code":3745},"Ashburn, VA, United States - (IAD)","IAD",{"name":3747,"code":3748},"Brisbane, QLD, Australia - (BNE)","BNE",{"name":3750,"code":3751},"Barcelona, Spain - (BCN)","BCN",{"name":3753,"code":3754},"Baghdad, Iraq - (BGW)","BGW",{"name":3756,"code":3757},"Annaba, Algeria - (AAE)","AAE",{"name":3759,"code":3760},"Atlanta, GA, United States - (ATL)","ATL",{"name":3762,"code":3763},"Belgrade, Serbia - (BEG)","BEG",{"name":3765,"code":3766},"Baku, Azerbaijan - (GYD)","GYD",{"name":3768,"code":3769},"Bangalore, India - (BLR)","BLR",{"name":3771,"code":3772},"Antananarivo, Madagascar - (TNR)","TNR",{"name":3774,"code":3775},"Canberra, ACT, Australia - (CBR)","CBR",{"name":3777,"code":3778},"Berlin, Germany - (TXL)","TXL",{"name":3780,"code":3781},"Bangkok, Thailand - (BKK)","BKK",{"name":3783,"code":3784},"Cape Town, South Africa - (CPT)","CPT",{"name":3786,"code":3787},"Belo Horizonte, Brazil - (CNF)","CNF",{"name":3789,"code":3790},"Basra, Iraq - (BSR)","BSR",{"name":3792,"code":3793},"Christchurch, New Zealand - (CHC)","CHC",{"name":3795,"code":3796},"Austin, TX, United States - (AUS)","AUS",{"name":3798,"code":3799},"Beirut, Lebanon - (BEY)","BEY",{"name":3801,"code":3802},"Bandar Seri Begawan, Brunei - (BWN)","BWN",{"name":3804,"code":3805},"Blumenau, Brazil - (BNU)","BNU",{"name":3807,"code":3808},"Hagatna, Guam - (GUM)","GUM",{"name":3810,"code":3811},"Bangor, ME, United States - (BGR)","BGR",{"name":3813,"code":3814},"Bordeaux, France - (BOD)","BOD",{"name":3816,"code":3817},"Boston, MA, United States - (BOS)","BOS",{"name":3819,"code":3820},"Dakar, Senegal - (DKR)","DKR",{"name":3822,"code":3823},"Dammam, Saudi Arabia - (DMM)","DMM",{"name":3825,"code":3826},"Bratislava, Slovakia   - (BTS)","BTS",{"name":3828,"code":3829},"Melbourne, VIC, Australia - (MEL)","MEL",{"name":3831,"code":3832},"Doha, Qatar - (DOH)","DOH",{"name":3834,"code":3835},"Brussels, Belgium - (BRU)","BRU",{"name":3837,"code":3838},"Buffalo, NY, United States - (BUF)","BUF",{"name":3840,"code":3841},"Dar Es Salaam, Tanzania - (DAR)","DAR",{"name":3843,"code":3844},"Brasilia, Brazil - (BSB)","BSB",{"name":3846,"code":3847},"Buenos Aires, Argentina - (EZE)","EZE",{"name":3849,"code":3850},"Bucharest, Romania - (OTP)","OTP",{"name":3852,"code":3853},"Dubai, United Arab Emirates - (DXB)","DXB",{"name":3855,"code":3856},"Djibouti City, Djibouti - (JIB)","JIB",{"name":3858,"code":3859},"Calgary, AB, Canada - (YYC)","YYC",{"name":3861,"code":3862},"Cebu, Philippines - (CEB)","CEB",{"name":3864,"code":3865},"Noumea, New Caledonia - (NOU)","NOU",{"name":3867,"code":3868},"Perth, WA, Australia - (PER)","PER",{"name":3870,"code":3871},"Budapest, Hungary - (BUD)","BUD",{"name":3873,"code":3874},"Durban, South Africa - (DUR)","DUR",{"name":3876,"code":3877},"Charlotte, NC, United States - (CLT)","CLT",{"name":3879,"code":3880},"Erbil, Iraq - (EBL)","EBL",{"name":3882,"code":3883},"Chandigarh, India - (IXC)","IXC",{"name":3885,"code":3886},"Chicago, IL, United States - (ORD)","ORD",{"name":3888,"code":3889},"Sydney, NSW, Australia - (SYD)","SYD",{"name":3891,"code":3892},"Campinas, Brazil - (VCP)","VCP",{"name":3894,"code":3895},"Changde, China - (CGD)","CGD",{"name":3897,"code":3898},"Haifa, Israel - (HFA)","HFA",{"name":3900,"code":3901},"Gaborone, Botswana - (GBE)","GBE",{"name":3903,"code":3904},"Copenhagen, Denmark - (CPH)","CPH",{"name":3906,"code":3907},"Chennai, India - (MAA)","MAA",{"name":3909,"code":3910},"Harare, Zimbabwe - (HRE)","HRE",{"name":3912,"code":3913},"Jeddah, Saudi Arabia - (JED)","JED",{"name":3915,"code":3916},"Tahiti, French Polynesia - (PPT)","PPT",{"name":3918,"code":3919},"Cleveland, OH, United States - (CLE)","CLE",{"name":3921,"code":3922},"Johannesburg, South Africa - (JNB)","JNB",{"name":3924,"code":3925},"Kuwait City, Kuwait - (KWI)","KWI",{"name":3927,"code":3928},"Dublin, Ireland - (DUB)","DUB",{"name":3930,"code":3931},"Columbus, OH, United States - (CMH)","CMH",{"name":3933,"code":3934},"Suva, Fiji - (SUV)","SUV",{"name":3936,"code":3937},"Dallas, TX, United States - (DFW)","DFW",{"name":3939,"code":3940},"Manama, Bahrain - (BAH)","BAH",{"name":3942,"code":3943},"Kigali, Rwanda - (KGL)","KGL",{"name":3945,"code":3946},"Chittagong, Bangladesh - (CGP)","CGP",{"name":3948,"code":3949},"Hobart, Australia - (HBA)","HBA",{"name":3951,"code":3952},"Frankfurt, Germany - (FRA)","FRA",{"name":3954,"code":3955},"Muscat, Oman - (MCT)","MCT",{"name":3957,"code":3958},"Denver, CO, United States - (DEN)","DEN",{"name":3960,"code":3961},"Colombo, Sri Lanka - (CMB)","CMB",{"name":3963,"code":3964},"Lagos, Nigeria - (LOS)","LOS",{"name":3966,"code":3967},"Curitiba, Brazil - (CWB)","CWB",{"name":3969,"code":3970},"Wellington, New Zealand - (WLG)","WLG",{"name":3972,"code":3973},"Luanda, Angola - (LAD)","LAD",{"name":3975,"code":3976},"Detroit, MI, United States - (DTW)","DTW",{"name":3978,"code":3979},"Geneva, Switzerland - (GVA)","GVA",{"name":3981,"code":3982},"Dhaka, Bangladesh - (DAC)","DAC",{"name":3984,"code":3985},"Florianopolis, Brazil - (FLN)","FLN",{"name":3987,"code":3988},"Najaf, Iraq - (NJF)","NJF",{"name":3990,"code":3991},"Fortaleza, Brazil - (FOR)","FOR",{"name":3993,"code":3994},"Gothenburg, Sweden - (GOT)","GOT",{"name":3996,"code":3997},"Maputo, Mozambique - (MPM)","MPM",{"name":3999,"code":4000},"Foshan, China - (FUO)","FUO",{"name":4002,"code":4003},"Nasiriyah, Iraq - (XNH)","XNH",{"name":4005,"code":4006},"Durham, NC, United States - (RDU)","RDU",{"name":4008,"code":4009},"Mombasa, Kenya - (MBA)","MBA",{"name":4011,"code":4012},"Hamburg, Germany - (HAM)","HAM",{"name":4014,"code":4015},"Ramallah - (ZDM)","ZDM",{"name":4017,"code":4018},"Georgetown, Guyana - (GEO)","GEO",{"name":4020,"code":4021},"Fukuoka, Japan - (FUK)","FUK",{"name":4023,"code":4024},"Guadalajara, Mexico - (GDL)","GDL",{"name":4026,"code":4027},"Helsinki, Finland - (HEL)","HEL",{"name":4029,"code":4030},"Riyadh, Saudi Arabia - (RUH)","RUH",{"name":4032,"code":4033},"Nairobi, Kenya - (NBO)","NBO",{"name":4035,"code":4036},"Fuzhou, China - (FOC)","FOC",{"name":4038,"code":4039},"Halifax, Canada - (YHZ)","YHZ",{"name":4041,"code":4042},"Guangzhou, China - (CAN)","CAN",{"name":4044,"code":4045},"Istanbul, Turkey - (IST)","IST",{"name":4047,"code":4048},"Guatemala City, Guatemala - (GUA)","GUA",{"name":4050,"code":4051},"Honolulu, HI, United States - (HNL)","HNL",{"name":4053,"code":4054},"Sulaymaniyah, Iraq - (ISU)","ISU",{"name":4056,"code":4057},"Oran, Algeria - (ORN)","ORN",{"name":4059,"code":4060},"Tel Aviv, Israel - (TLV)","TLV",{"name":4062,"code":4063},"Houston, TX, United States - (IAH)","IAH",{"name":4065,"code":4066},"Guayaquil, Ecuador - (GYE)","GYE",{"name":4068,"code":4069},"Haikou, China - (HAK)","HAK",{"name":4071,"code":4072},"Ouagadougou, Burkina Faso   - (OUA)","OUA",{"name":4074,"code":4075},"Izmir, Turkey - (ADB)","ADB",{"name":4077,"code":4078},"Kyiv, Ukraine - (KBP)","KBP",{"name":4080,"code":4081},"Port Louis, Mauritius - (MRU)","MRU",{"name":4083,"code":4084},"Indianapolis, IN, United States - (IND)","IND",{"name":4086,"code":4087},"Hanoi, Vietnam - (HAN)","HAN",{"name":4089,"code":4090},"Lisbon, Portugal - (LIS)","LIS",{"name":4092,"code":4093},"Jacksonville, FL, United States - (JAX)","JAX",{"name":4095,"code":4096},"Hengshui, China - (SJW)","SJW",{"name":4098,"code":4099},"Joinville, Brazil - (JOI)","JOI",{"name":4101,"code":4102},"London, United Kingdom - (LHR)","LHR",{"name":4104,"code":4105},"Kansas City, MO, United States - (MCI)","MCI",{"name":4107,"code":4108},"Ho Chi Minh City, Vietnam - (SGN)","SGN",{"name":4110,"code":4111},"Tunis, Tunisia - (TUN)","TUN",{"name":4113,"code":4114},"Juazeiro do Norte, Brazil - (JDO)","JDO",{"name":4116,"code":156},"Hong Kong - (HKG)",{"name":4118,"code":4119},"Lima, Peru - (LIM)","LIM",{"name":4121,"code":4122},"Luxembourg City, Luxembourg - (LUX)","LUX",{"name":4124,"code":4125},"Kingston, Jamaica - (KIN)","KIN",{"name":4127,"code":4128},"Kinshasa, DR Congo - (FIH)","FIH",{"name":4130,"code":4131},"Las Vegas, NV, United States - (LAS)","LAS",{"name":4133,"code":4134},"Hyderabad, India - (HYD)","HYD",{"name":4136,"code":4137},"Manaus, Brazil - (MAO)","MAO",{"name":4139,"code":4140},"Lyon, France - (LYS)","LYS",{"name":4142,"code":4143},"Cairo, Egypt - (CAI)","CAI",{"name":4145,"code":4146},"Los Angeles, CA, United States - (LAX)","LAX",{"name":4148,"code":4149},"Madrid, Spain - (MAD)","MAD",{"name":4151,"code":4152},"Islamabad, Pakistan - (ISB)","ISB",{"name":4154,"code":4155},"Windhoek, Namibia - (WDH)","WDH",{"name":4157,"code":4158},"Manchester, United Kingdom - (MAN)","MAN",{"name":4160,"code":4161},"Memphis, TN, United States - (MEM)","MEM",{"name":4163,"code":4164},"Jakarta, Indonesia - (CGK)","CGK",{"name":4166,"code":4167},"Yamoussoukro, Ivory Coast - (ASK)","ASK",{"name":4169,"code":4170},"Marseille, France - (MRS)","MRS",{"name":4172,"code":4173},"Panama City, Panama - (PTY)","PTY",{"name":4175,"code":4176},"Mexico City, Mexico - (MEX)","MEX",{"name":4178,"code":4179},"Abidjan, Ivory Coast - (ABJ)","ABJ",{"name":4181,"code":4182},"Miami, FL, United States - (MIA)","MIA",{"name":4184,"code":4185},"Milan, Italy - (MXP)","MXP",{"name":4187,"code":4188},"Jinan, China - (TNA)","TNA",{"name":4190,"code":4191},"Paramaribo, Suriname - (PBM)","PBM",{"name":4193,"code":4194},"Kampala, Uganda - (EBB)","EBB",{"name":4196,"code":4197},"Minneapolis, MN, United States - (MSP)","MSP",{"name":4199,"code":4200},"Porto Alegre, Brazil - (POA)","POA",{"name":4202,"code":4203},"Minsk, Belarus - (MSQ)","MSQ",{"name":4205,"code":4206},"Moscow, Russia - (DME)","DME",{"name":4208,"code":4209},"Johor Bahru, Malaysia - (JHB)","JHB",{"name":4211,"code":4212},"Quito, Ecuador - (UIO)","UIO",{"name":4214,"code":4215},"Munich, Germany - (MUC)","MUC",{"name":4217,"code":4218},"Kanpur, India - (KNU)","KNU",{"name":4220,"code":4221},"Nashville, United States - (BNA)","BNA",{"name":4223,"code":4224},"Newark, NJ, United States - (EWR)","EWR",{"name":4226,"code":4227},"Nicosia, Cyprus - (LCA)","LCA",{"name":4229,"code":4230},"Kaohsiung City, Taiwan - (KHH)","KHH",{"name":4232,"code":4233},"Recife, Brazil - (REC)","REC",{"name":4235,"code":4236},"Oslo, Norway - (OSL)","OSL",{"name":4238,"code":4239},"Norfolk, VA, United States - (ORF)","ORF",{"name":4241,"code":4242},"Karachi, Pakistan - (KHI)","KHI",{"name":4244,"code":4245},"Ribeirao Preto, Brazil - (RAO)","RAO",{"name":4247,"code":4248},"Rio de Janeiro, Brazil - (GIG)","GIG",{"name":4250,"code":4251},"Kathmandu, Nepal - (KTM)","KTM",{"name":4253,"code":4254},"Palermo, Italy - (PMO)","PMO",{"name":4256,"code":4257},"Oklahoma City, OK, United States - (OKC)","OKC",{"name":4259,"code":4260},"Paris, France - (CDG)","CDG",{"name":4262,"code":4263},"Omaha, NE, United States - (OMA)","OMA",{"name":4265,"code":4266},"Prague, Czech Republic - (PRG)","PRG",{"name":4268,"code":4269},"Kolkata, India - (CCU)","CCU",{"name":4271,"code":4272},"Ottawa, Canada - (YOW)","YOW",{"name":4274,"code":4275},"Santiago, Chile - (SCL)","SCL",{"name":4277,"code":4278},"Philadelphia, United States - (PHL)","PHL",{"name":4280,"code":4281},"Krasnoyarsk, Russia - (KJA)","KJA",{"name":4283,"code":4284},"Lusaka, Zambia - (LUN)","LUN",{"name":4286,"code":4287},"Kuala Lumpur, Malaysia - (KUL)","KUL",{"name":4289,"code":4290},"Phoenix, AZ, United States - (PHX)","PHX",{"name":4292,"code":4293},"Riga, Latvia - (RIX)","RIX",{"name":4295,"code":4296},"Santo Domingo, Dominican Republic - (SDQ)","SDQ",{"name":4298,"code":4299},"Addis Ababa, Ethiopia - (ADD)","ADD",{"name":4301,"code":4302},"Rome, Italy - (FCO)","FCO",{"name":4304,"code":4305},"Pittsburgh, PA, United States - (PIT)","PIT",{"name":4307,"code":4308},"Lilongwe, Malawi - (LLW)","LLW",{"name":4310,"code":4311},"Portland, OR, United States - (PDX)","PDX",{"name":4313,"code":4314},"Saint Petersburg, Russia - (LED)","LED",{"name":4316,"code":4317},"Langfang, China - (PKX)","PKX",{"name":4319,"code":4320},"Constantine, Algeria - (CZL)","CZL",{"name":4322,"code":4323},"Queretaro, MX, Mexico - (QRO)","QRO",{"name":4325,"code":4326},"Santa Venera, Malta - (MLA)","MLA",{"name":4328,"code":4329},"Richmond, VA, United States - (RIC)","RIC",{"name":4331,"code":4332},"Sorocaba, Brazil - (SOD)","SOD",{"name":4334,"code":4335},"Skopje, North Macedonia - (SKP)","SKP",{"name":4337,"code":4338},"Sofia, Bulgaria - (SOF)","SOF",{"name":4340,"code":4341},"Macau - (MFM)","MFM",{"name":4343,"code":4344},"Sacramento, CA, United States - (SMF)","SMF",{"name":4346,"code":4347},"Stockholm, Sweden - (ARN)","ARN",{"name":4349,"code":4350},"Salt Lake City, UT, United States - (SLC)","SLC",{"name":4352,"code":4353},"Tegucigalpa, Honduras - (TGU)","TGU",{"name":4355,"code":4356},"Stuttgart, Germany   - (STR)","STR",{"name":4358,"code":4359},"San Antonio, TX, United States - (SAT)","SAT",{"name":4361,"code":4362},"Manila, Philippines - (MNL)","MNL",{"name":4364,"code":4365},"San Diego, CA, United States - (SAN)","SAN",{"name":4367,"code":4368},"Tallinn, Estonia - (TLL)","TLL",{"name":4370,"code":4371},"Mumbai, India - (BOM)","BOM",{"name":4373,"code":4374},"Tbilisi, Georgia - (TBS)","TBS",{"name":4376,"code":4377},"San Francisco, CA, United States - (SFO)","SFO",{"name":4379,"code":4380},"Vitoria, Brazil - (VIX)","VIX",{"name":4382,"code":4383},"San Jose, CA, United States - (SJC)","SJC",{"name":4385,"code":4386},"Thessaloniki, Greece - (SKG)","SKG",{"name":4388,"code":4389},"Nagpur, India - (NAG)","NAG",{"name":4391,"code":4392},"Saskatoon, SK, Canada - (YXE)","YXE",{"name":4394,"code":4395},"Naha, Japan  - (OKA)","OKA",{"name":4397,"code":4398},"Tirana, Albania - (TIA)","TIA",{"name":4400,"code":4401},"Campos dos Goytacazes, Brazil - (CAW)","CAW",{"name":4403,"code":4404},"Seattle, WA, United States - (SEA)","SEA",{"name":4406,"code":4407},"Vienna, Austria - (VIE)","VIE",{"name":4409,"code":4410},"New Delhi, India - (DEL)","DEL",{"name":4412,"code":4413},"Chapeco, Brazil - (XAP)","XAP",{"name":4415,"code":4416},"Osaka, Japan - (KIX)","KIX",{"name":4418,"code":4419},"Vilnius, Lithuania - (VNO)","VNO",{"name":4421,"code":4422},"Sioux Falls, SD, United States - (FSD)","FSD",{"name":4424,"code":4425},"Bridgetown, Barbados - (BGI)","BGI",{"name":4427,"code":4428},"Warsaw, Poland - (WAW)","WAW",{"name":4430,"code":4431},"Patna, India - (PAT)","PAT",{"name":4433,"code":4434},"Phnom Penh, Cambodia - (PNH)","PNH",{"name":4436,"code":4437},"Tallahassee, FL, United States - (TLH)","TLH",{"name":4439,"code":4440},"Santiago de los Caballeros, Dominican Republic - (STI)","STI",{"name":4442,"code":4443},"Wroclaw, Poland - (WRO)","WRO",{"name":4445,"code":4446},"Zagreb, Croatia - (ZAG)","ZAG",{"name":4448,"code":4449},"Qingdao, China - (TAO)","TAO",{"name":4451,"code":4452},"Tampa, FL, United States - (TPA)","TPA",{"name":4454,"code":4455},"La Paz, Bolivia - (LPB)","LPB",{"name":4457,"code":4458},"Toronto, ON, Canada - (YYZ)","YYZ",{"name":4460,"code":4461},"Seoul, South Korea - (ICN)","ICN",{"name":4463,"code":4464},"Zurich, Switzerland - (ZRH)","ZRH",{"name":4466,"code":4467},"Vancouver, BC, Canada - (YVR)","YVR",{"name":4469,"code":4470},"Shanghai, China - (SHA)","SHA",{"name":4472,"code":4473},"San Juan, Puerto Rico - (SJU)","SJU",{"name":4475,"code":4476},"Singapore, Singapore - (SIN)","SIN",{"name":4478,"code":4479},"Winnipeg, MB, Canada - (YWG)","YWG",{"name":4481,"code":4482},"Barranquilla, Colombia - (BAQ)","BAQ",{"name":4484,"code":4485},"Surat Thani, Thailand - (URT)","URT",{"name":4487,"code":4488},"Palmas, Brazil - (PMW)","PMW",{"name":4490,"code":4491},"Taipei - (TPE)","TPE",{"name":4493,"code":4494},"Aracatuba, Brazil - (ARU)","ARU",{"name":4496,"code":4497},"Port of Spain, Trinidad and Tobago - (POS)","POS",{"name":4499,"code":4500},"Salvador, Brazil - (SSA)","SSA",{"name":4502,"code":4503},"Tokyo, Japan - (NRT)","NRT",{"name":4505,"code":4506},"Ulaanbaatar, Mongolia - (ULN)","ULN",{"name":4508,"code":4509},"Vientiane, Laos - (VTE)","VTE",{"name":4511,"code":4512},"Xinyu, China - (KHN)","KHN",{"name":4514,"code":4515},"Yerevan, Armenia - (EVN)","EVN",{"name":4517,"code":4518},"Yogyakarta, Indonesia - (JOG)","JOG",{"name":4520,"code":4521},"Cagayan de Oro, Philippines - (CGY)","CGY",{"name":4523,"code":4524},"Ljubljana, Slovenia - (LJU)","LJU",{"name":4526,"code":4527},"Kochi, India - (COK)","COK",{"name":4529,"code":4530},"Cuiaba, Brazil - (CGB)","CGB",{"name":4532,"code":4533},"Denpasar, Indonesia - (DPS)","DPS",{"name":4535,"code":4536},"Kannur, India - (CNN)","CNN",{"name":4538,"code":4539},"Cali, Colombia - (CLO)","CLO",{"name":4541,"code":4542},"San Pedro Sula, Honduras - (SAP)","SAP",{"name":4544,"code":4545},"Shenzhen, China - (SZX)","SZX",{"name":4547,"code":4548},"Guiyang, China - (KWE)","KWE",{"name":4550,"code":4551},"Shaoxing, China - (HGH)","HGH",{"name":4553,"code":4554},"Changzhou, China - (CZX)","CZX",{"name":4556,"code":4557},"Kunming, China - (KMG)","KMG",{"name":4559,"code":4560},"Chiang Mai, Thailand - (CNX)","CNX",{"name":4562,"code":4563},"Zhengzhou, China - (CGO)","CGO",{"name":4565,"code":4566},"Yangquan, China - (TYN)","TYN",{"name":4568,"code":4569},"Changsha, China - (CSX)","CSX",{"name":4571,"code":4572},"Dalian, China - (DLC)","DLC",{"name":4574,"code":4575},"Beihai, China - (BHY)","BHY",{"name":4577,"code":4578},"Chongqing, China - (CKG)","CKG",{"name":4580,"code":4581},"Xiangyang, China - (XFN)","XFN",{"name":4583,"code":4584},"Da Nang, Vietnam - (DAD)","DAD",{"name":4586,"code":4587},"Jiaxing, China - (JXG)","JXG",{"name":4589,"code":4590},"Tarlac City, Philippines - (CRK)","CRK",{"name":4592,"code":4593},"Thimphu, Bhutan - (PBH)","PBH",{"name":4595,"code":4596},"Baoji, China - (XIY)","XIY",{"name":4598,"code":4599},"Astana, Kazakhstan - (NQZ)","NQZ",{"name":4601,"code":4602},"Kuching, Malaysia - (KCH)","KCH",{"name":4604,"code":4605},"Aktobe, Kazakhstan - (AKX)","AKX",{"name":4607,"code":4608},"Tongren, China - (TEN)","TEN",{"name":4610,"code":4611},"Taizhou, China - (HYN)","HYN",{"name":4613,"code":4614},"Bishkek, Kyrgyzstan - (FRU)","FRU",{"name":4616,"code":4617},"Malang, Indonesia - (MLG)","MLG",{"name":4619,"code":4620},"Lahore, Pakistan - (LHE)","LHE",{"name":4622,"code":4623},"Chengdu, China - (CTU)","CTU",{"name":4625,"code":4626},"Agra, India - (AGR)","AGR",{"name":4628,"code":4629},"Coimbatore, India - (CJB)","CJB",{"name":4631,"code":4632},"Xingyi, China - (ACX)","ACX",{"name":4634,"code":4635},"Bhubaneswar, India - (BBI)","BBI",{"name":4637,"code":4638},"Luoyang, China - (LYA)","LYA",{"name":4640,"code":4641},"Pune, India - (PNQ)","PNQ",{"name":4643,"code":4644},"Sambalpur, India - (JRG)","JRG",1779981581357]