[{"data":1,"prerenderedAt":1308},["ShallowReactive",2],{"posts-zh-Hans":3},[4,134,1234],{"id":5,"title":6,"body":7,"date":125,"desc":126,"description":117,"edit":125,"extension":127,"meta":128,"navigation":129,"path":130,"seo":131,"stem":132,"__hash__":133},"blog\u002Fblog\u002Fzh-hans\u002Fabout-name.md","关于未晞酱的名字",{"type":8,"value":9,"toc":116},"minimark",[10,14,18,21,25,28,36,39,53,65,77,81,84,87,93,96,107,110,113],[11,12,13],"h3",{"id":13},"我的名字",[15,16,17],"p",{},"我叫「Kuriyona」，这是我给自己取的网名。",[15,19,20],{},"我也叫「未晞」，这是我确定性别认同之后给自己取的真名。",[11,22,24],{"id":23},"关于kuriyona","关于「Kuriyona」",[15,26,27],{},"它借助日语的音韵与汉字的意蕴而生。",[15,29,30,31,35],{},"「Kuriyona」读作 ku-ri-yo-na ",[32,33,34],"code",{},"クリヨナ","。",[15,37,38],{},"而「Kuriyona」对应的汉字可以写做「栗夜奈」。",[15,40,41,45,46,45,49,52],{},[42,43,44],"strong",{},"「栗」"," ",[32,47,48],{},"kuri",[32,50,51],{},"クリ"," 是一个象征我过去网名和一直以来的外号的词，也和我现实中的姓氏同音。",[15,54,55,45,58,45,61,64],{},[42,56,57],{},"「夜」",[32,59,60],{},"yu",[32,62,63],{},"ヨ"," 是我想要为此加入的意蕴。",[15,66,67,45,70,45,73,76],{},[42,68,69],{},"「奈」",[32,71,72],{},"na",[32,74,75],{},"ナ"," 则像一个轻柔的语气词，带着一点点说不清的余韵，由原来男性化的 ta 变成了女性化的 na。",[11,78,80],{"id":79},"关于未晞","关于「未晞」",[15,82,83],{},"而「未晞」，则是我为自己取的真名。",[15,85,86],{},"它出自《诗经·秦风》里的那一句：",[88,89,90],"blockquote",{},[15,91,92],{},"「蒹葭萋萋，白露未晞」。",[15,94,95],{},"清晨的露水还没有被太阳晒干，\n芦苇在风中轻轻摇曳，\n一切刚刚醒来，\n一切还未完成。",[15,97,98,99,102,103,106],{},"「未晞」意味着——\n",[42,100,101],{},"破晓","之前最后的湿润，\n也是",[42,104,105],{},"新生","之初最安静的光。",[15,108,109],{},"在确定自己的性别认同之后，\n我便选了这两个字，\n作为对自己真实存在的确认。",[11,111,112],{"id":112},"小记",[15,114,115],{},"「Kuriyona」是我曾经藏身的小夜，\n「未晞」是我终于迎来的破晓。",{"title":117,"searchDepth":118,"depth":118,"links":119},"",2,[120,122,123,124],{"id":13,"depth":121,"text":13},3,{"id":23,"depth":121,"text":24},{"id":79,"depth":121,"text":80},{"id":112,"depth":121,"text":112},"2026-05-18","未晞酱名字的由来","md",{},true,"\u002Fblog\u002Fzh-hans\u002Fabout-name",{"title":6,"description":117},"blog\u002Fzh-hans\u002Fabout-name","pcM-wGxyTzCbCX7ZwU3XUi3_K4hRxQxqrqrH-sncBoo",{"id":135,"title":136,"body":137,"date":1227,"desc":1228,"description":141,"edit":1227,"extension":127,"meta":1229,"navigation":129,"path":1230,"seo":1231,"stem":1232,"__hash__":1233},"blog\u002Fblog\u002Fzh-hans\u002Fcf-network.md","如何在网站显示当前使用的 Cloudflare 网络",{"type":8,"value":138,"toc":1223},[139,142,148,153,156,163,267,277,280,283,290,295,298,309,494,497,500,510,513,1219],[15,140,141],{},"今天凌晨给我的个人网站加了一个小功能，就是在网站显示当前使用的 Cloudflare 网络。",[15,143,144],{},[145,146],"img",{"alt":117,"src":147},"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-preview.png",[88,149,150],{},[15,151,152],{},"翻到本网站的最底下，您应该就能看见实际显示的样式。",[11,154,155],{"id":155},"实现方式",[15,157,158,159,162],{},"由 Cloudflare 代理的网站，通过访问 ",[32,160,161],{},"{domain}\u002Fcdn-cgi\u002Ftrace"," 可以获取当前使用的 Cloudflare 网络信息。样例如下：",[164,165,169],"pre",{"className":166,"code":167,"language":168,"meta":117,"style":117},"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",[32,170,171,179,184,189,195,201,207,213,219,225,231,237,243,249,255,261],{"__ignoreMap":117},[172,173,176],"span",{"class":174,"line":175},"line",1,[172,177,178],{},"fl=582f239\n",[172,180,181],{"class":174,"line":118},[172,182,183],{},"h=kuriyona.com\n",[172,185,186],{"class":174,"line":121},[172,187,188],{},"ip=64.90.0.218\n",[172,190,192],{"class":174,"line":191},4,[172,193,194],{},"ts=1779555940.000\n",[172,196,198],{"class":174,"line":197},5,[172,199,200],{},"visit_scheme=https\n",[172,202,204],{"class":174,"line":203},6,[172,205,206],{},"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",[172,208,210],{"class":174,"line":209},7,[172,211,212],{},"colo=HKG\n",[172,214,216],{"class":174,"line":215},8,[172,217,218],{},"sliver=none\n",[172,220,222],{"class":174,"line":221},9,[172,223,224],{},"http=http\u002F3\n",[172,226,228],{"class":174,"line":227},10,[172,229,230],{},"loc=HK\n",[172,232,234],{"class":174,"line":233},11,[172,235,236],{},"tls=TLSv1.3\n",[172,238,240],{"class":174,"line":239},12,[172,241,242],{},"sni=plaintext\n",[172,244,246],{"class":174,"line":245},13,[172,247,248],{},"warp=off\n",[172,250,252],{"class":174,"line":251},14,[172,253,254],{},"gateway=off\n",[172,256,258],{"class":174,"line":257},15,[172,259,260],{},"rbi=off\n",[172,262,264],{"class":174,"line":263},16,[172,265,266],{},"kex=X25519MLKEM768\n",[15,268,269,270,273,274,35],{},"通过解析其中的 ",[32,271,272],{},"colo"," 参数，我们可以获取当前使用的 Cloudflare 网络 ID，比如这里是 ",[32,275,276],{},"HKG",[15,278,279],{},"那么网络 ID 有了，我们就可以根据网络 ID 来显示当前使用的 Cloudflare 网络了。",[15,281,282],{},"Cloudflare Status 提供了一个文件，列出了当前所有的 Cloudflare 网络状态信息。",[88,284,285],{},[15,286,287],{},[32,288,289],{},"https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json",[15,291,292],{},[145,293],{"alt":117,"src":294},"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-status-api.png",[15,296,297],{},"文件的内容很杂，我们需要通过一个简单的脚本来获得我们需要的格式化信息。",[15,299,300,301,304,305,308],{},"首先通过一个简单的正则表达式(",[32,302,303],{},"^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$",")来筛选复合网络节点的 ",[32,306,307],{},"name"," 字段，再对数据结构进行简化处理。（这里使用 ky 库来获取数据）",[164,310,314],{"className":311,"code":312,"language":313,"meta":117,"style":117},"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",[32,315,316,356,368,401,420,425,489],{"__ignoreMap":117},[172,317,318,322,326,329,332,336,340,343,347,350,353],{"class":174,"line":175},[172,319,321],{"class":320},"snl16","const",[172,323,325],{"class":324},"sDLfK"," res",[172,327,328],{"class":320}," =",[172,330,331],{"class":320}," await",[172,333,335],{"class":334},"s95oV"," ky.",[172,337,339],{"class":338},"svObZ","get",[172,341,342],{"class":334},"(",[172,344,346],{"class":345},"sU2Wk","'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'",[172,348,349],{"class":334},").",[172,351,352],{"class":338},"json",[172,354,355],{"class":334},"();\n",[172,357,358,360,363,365],{"class":174,"line":118},[172,359,321],{"class":320},[172,361,362],{"class":324}," result",[172,364,328],{"class":320},[172,366,367],{"class":334}," res.components\n",[172,369,370,373,376,379,383,386,389,392,395,398],{"class":174,"line":121},[172,371,372],{"class":334},"  .",[172,374,375],{"class":338},"filter",[172,377,378],{"class":334},"((",[172,380,382],{"class":381},"s9osk","c",[172,384,385],{"class":334},") ",[172,387,388],{"class":320},"=>",[172,390,391],{"class":324}," REGEX",[172,393,394],{"class":334},".",[172,396,397],{"class":338},"test",[172,399,400],{"class":334},"(c.name))\n",[172,402,403,405,408,410,413,415,417],{"class":174,"line":191},[172,404,372],{"class":334},[172,406,407],{"class":338},"map",[172,409,378],{"class":334},[172,411,412],{"class":381},"n",[172,414,385],{"class":334},[172,416,388],{"class":320},[172,418,419],{"class":334}," ({\n",[172,421,422],{"class":174,"line":197},[172,423,424],{"class":334},"    name: n.name,\n",[172,426,427,430,433,435,438,441,444,447,451,454,457,461,463,466,469,472,475,478,480,483,486],{"class":174,"line":203},[172,428,429],{"class":334},"    code: n.name.",[172,431,432],{"class":338},"match",[172,434,342],{"class":334},[172,436,437],{"class":345},"\u002F",[172,439,440],{"class":320},"^",[172,442,443],{"class":324},"[A-Za-z\\s,]",[172,445,446],{"class":320},"+",[172,448,450],{"class":449},"sns5M","-",[172,452,453],{"class":324},"\\s",[172,455,456],{"class":320},"*",[172,458,460],{"class":459},"sRjNt","\\(",[172,462,342],{"class":449},[172,464,465],{"class":324},"[A-Z]",[172,467,468],{"class":320},"{3}",[172,470,471],{"class":449},")",[172,473,474],{"class":459},"\\)",[172,476,477],{"class":320},"$",[172,479,437],{"class":345},[172,481,482],{"class":334},")?.[",[172,484,485],{"class":324},"1",[172,487,488],{"class":334},"],\n",[172,490,491],{"class":174,"line":209},[172,492,493],{"class":334},"  }));\n",[15,495,496],{},"结合前文中获得的网络 ID，我们就可以获得实际的网络节点名称了。",[11,498,499],{"id":499},"代码实现",[15,501,502,503],{},"本站实际使用的代码可以查看 ",[504,505,509],"a",{"href":506,"rel":507},"https:\u002F\u002Fgithub.com\u002FKuriyona\u002FKuriyona.com\u002Fblob\u002Fmain\u002Fapp\u002Fcomposables\u002FuseCloudflareStatus.ts",[508],"nofollow","useCloudflareStatus.ts",[15,511,512],{},"以下是通用的 TypeScript 完整代码实现：",[164,514,516],{"className":311,"code":515,"language":313,"meta":117,"style":117},"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",[32,517,518,535,540,581,585,596,609,626,631,635,644,656,667,692,696,700,709,729,745,761,777,782,787,819,826,853,866,890,907,913,932,938,943,949,977,996,1002,1024,1053,1079,1092,1097,1109,1114,1120,1153,1158,1171,1176,1184,1190,1196,1202,1208,1214],{"__ignoreMap":117},[172,519,520,523,526,529,532],{"class":174,"line":175},[172,521,522],{"class":320},"import",[172,524,525],{"class":334}," ky ",[172,527,528],{"class":320},"from",[172,530,531],{"class":345}," 'ky'",[172,533,534],{"class":334},";\n",[172,536,537],{"class":174,"line":118},[172,538,539],{"emptyLinePlaceholder":129},"\n",[172,541,542,544,546,548,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579],{"class":174,"line":121},[172,543,321],{"class":320},[172,545,391],{"class":324},[172,547,328],{"class":320},[172,549,550],{"class":345}," \u002F",[172,552,440],{"class":320},[172,554,443],{"class":324},[172,556,446],{"class":320},[172,558,450],{"class":449},[172,560,453],{"class":324},[172,562,456],{"class":320},[172,564,460],{"class":459},[172,566,342],{"class":449},[172,568,465],{"class":324},[172,570,468],{"class":320},[172,572,471],{"class":449},[172,574,474],{"class":459},[172,576,477],{"class":320},[172,578,437],{"class":345},[172,580,534],{"class":334},[172,582,583],{"class":174,"line":191},[172,584,539],{"emptyLinePlaceholder":129},[172,586,587,590,593],{"class":174,"line":197},[172,588,589],{"class":320},"interface",[172,591,592],{"class":338}," NodeInfo",[172,594,595],{"class":334}," {\n",[172,597,598,601,604,607],{"class":174,"line":203},[172,599,600],{"class":381},"  name",[172,602,603],{"class":320},":",[172,605,606],{"class":324}," string",[172,608,534],{"class":334},[172,610,611,614,616,618,621,624],{"class":174,"line":209},[172,612,613],{"class":381},"  code",[172,615,603],{"class":320},[172,617,606],{"class":324},[172,619,620],{"class":320}," |",[172,622,623],{"class":324}," undefined",[172,625,534],{"class":334},[172,627,628],{"class":174,"line":215},[172,629,630],{"class":334},"}\n",[172,632,633],{"class":174,"line":221},[172,634,539],{"emptyLinePlaceholder":129},[172,636,637,639,642],{"class":174,"line":227},[172,638,589],{"class":320},[172,640,641],{"class":338}," TraceData",[172,643,595],{"class":334},[172,645,646,649,652,654],{"class":174,"line":233},[172,647,648],{"class":381},"  colo",[172,650,651],{"class":320},"?:",[172,653,606],{"class":324},[172,655,534],{"class":334},[172,657,658,661,663,665],{"class":174,"line":239},[172,659,660],{"class":381},"  loc",[172,662,651],{"class":320},[172,664,606],{"class":324},[172,666,534],{"class":334},[172,668,669,672,675,677,679,682,684,686,688,690],{"class":174,"line":245},[172,670,671],{"class":334},"  [",[172,673,674],{"class":381},"key",[172,676,603],{"class":320},[172,678,606],{"class":324},[172,680,681],{"class":334},"]",[172,683,603],{"class":320},[172,685,606],{"class":324},[172,687,620],{"class":320},[172,689,623],{"class":324},[172,691,534],{"class":334},[172,693,694],{"class":174,"line":251},[172,695,630],{"class":334},[172,697,698],{"class":174,"line":257},[172,699,539],{"emptyLinePlaceholder":129},[172,701,702,704,707],{"class":174,"line":263},[172,703,589],{"class":320},[172,705,706],{"class":338}," CloudflareStatusResult",[172,708,595],{"class":334},[172,710,712,715,717,719,722,725,727],{"class":174,"line":711},17,[172,713,714],{"class":381},"  nodesData",[172,716,603],{"class":320},[172,718,592],{"class":338},[172,720,721],{"class":334},"[] ",[172,723,724],{"class":320},"|",[172,726,623],{"class":324},[172,728,534],{"class":334},[172,730,732,735,737,739,741,743],{"class":174,"line":731},18,[172,733,734],{"class":381},"  traceData",[172,736,603],{"class":320},[172,738,641],{"class":338},[172,740,620],{"class":320},[172,742,623],{"class":324},[172,744,534],{"class":334},[172,746,748,751,753,755,757,759],{"class":174,"line":747},19,[172,749,750],{"class":381},"  currentNodeName",[172,752,603],{"class":320},[172,754,606],{"class":324},[172,756,620],{"class":320},[172,758,623],{"class":324},[172,760,534],{"class":334},[172,762,764,767,769,771,773,775],{"class":174,"line":763},20,[172,765,766],{"class":381},"  location",[172,768,603],{"class":320},[172,770,606],{"class":324},[172,772,620],{"class":320},[172,774,623],{"class":324},[172,776,534],{"class":334},[172,778,780],{"class":174,"line":779},21,[172,781,630],{"class":334},[172,783,785],{"class":174,"line":784},22,[172,786,539],{"emptyLinePlaceholder":129},[172,788,790,793,796,799,802,805,807,810,813,816],{"class":174,"line":789},23,[172,791,792],{"class":320},"export",[172,794,795],{"class":320}," async",[172,797,798],{"class":320}," function",[172,800,801],{"class":338}," getCloudflareStatus",[172,803,804],{"class":334},"()",[172,806,603],{"class":320},[172,808,809],{"class":338}," Promise",[172,811,812],{"class":334},"\u003C",[172,814,815],{"class":338},"CloudflareStatusResult",[172,817,818],{"class":334},"> {\n",[172,820,822],{"class":174,"line":821},24,[172,823,825],{"class":824},"sAwPA","  \u002F\u002F 获取节点数据\n",[172,827,829,832,835,837,839,841,843,845,847,849,851],{"class":174,"line":828},25,[172,830,831],{"class":320},"  const",[172,833,834],{"class":324}," nodesResponse",[172,836,328],{"class":320},[172,838,331],{"class":320},[172,840,335],{"class":334},[172,842,339],{"class":338},[172,844,342],{"class":334},[172,846,346],{"class":345},[172,848,349],{"class":334},[172,850,352],{"class":338},[172,852,355],{"class":334},[172,854,856,858,861,863],{"class":174,"line":855},26,[172,857,831],{"class":320},[172,859,860],{"class":324}," nodesData",[172,862,328],{"class":320},[172,864,865],{"class":334}," nodesResponse.components\n",[172,867,869,872,874,876,878,880,882,884,886,888],{"class":174,"line":868},27,[172,870,871],{"class":334},"    .",[172,873,375],{"class":338},[172,875,378],{"class":334},[172,877,382],{"class":381},[172,879,385],{"class":334},[172,881,388],{"class":320},[172,883,391],{"class":324},[172,885,394],{"class":334},[172,887,397],{"class":338},[172,889,400],{"class":334},[172,891,893,895,897,899,901,903,905],{"class":174,"line":892},28,[172,894,871],{"class":334},[172,896,407],{"class":338},[172,898,378],{"class":334},[172,900,412],{"class":381},[172,902,385],{"class":334},[172,904,388],{"class":320},[172,906,419],{"class":334},[172,908,910],{"class":174,"line":909},29,[172,911,912],{"class":334},"      name: n.name,\n",[172,914,916,919,921,923,926,928,930],{"class":174,"line":915},30,[172,917,918],{"class":334},"      code: n.name.",[172,920,432],{"class":338},[172,922,342],{"class":334},[172,924,925],{"class":324},"REGEX",[172,927,482],{"class":334},[172,929,485],{"class":324},[172,931,488],{"class":334},[172,933,935],{"class":174,"line":934},31,[172,936,937],{"class":334},"    }));\n",[172,939,941],{"class":174,"line":940},32,[172,942,539],{"emptyLinePlaceholder":129},[172,944,946],{"class":174,"line":945},33,[172,947,948],{"class":824},"  \u002F\u002F 获取 trace 数据\n",[172,950,952,954,957,959,961,963,965,967,970,972,975],{"class":174,"line":951},34,[172,953,831],{"class":320},[172,955,956],{"class":324}," traceText",[172,958,328],{"class":320},[172,960,331],{"class":320},[172,962,335],{"class":334},[172,964,339],{"class":338},[172,966,342],{"class":334},[172,968,969],{"class":345},"'https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace'",[172,971,349],{"class":334},[172,973,974],{"class":338},"text",[172,976,355],{"class":334},[172,978,980,982,985,987,990,993],{"class":174,"line":979},35,[172,981,831],{"class":320},[172,983,984],{"class":324}," traceData",[172,986,328],{"class":320},[172,988,989],{"class":334}," Object.",[172,991,992],{"class":338},"fromEntries",[172,994,995],{"class":334},"(\n",[172,997,999],{"class":174,"line":998},36,[172,1000,1001],{"class":334},"    traceText\n",[172,1003,1005,1008,1011,1013,1016,1019,1021],{"class":174,"line":1004},37,[172,1006,1007],{"class":334},"      .",[172,1009,1010],{"class":338},"split",[172,1012,342],{"class":334},[172,1014,1015],{"class":345},"'",[172,1017,1018],{"class":324},"\\n",[172,1020,1015],{"class":345},[172,1022,1023],{"class":334},")\n",[172,1025,1027,1029,1031,1033,1035,1037,1039,1042,1045,1047,1050],{"class":174,"line":1026},38,[172,1028,1007],{"class":334},[172,1030,375],{"class":338},[172,1032,378],{"class":334},[172,1034,174],{"class":381},[172,1036,385],{"class":334},[172,1038,388],{"class":320},[172,1040,1041],{"class":334}," line.",[172,1043,1044],{"class":338},"includes",[172,1046,342],{"class":334},[172,1048,1049],{"class":345},"'='",[172,1051,1052],{"class":334},"))\n",[172,1054,1056,1058,1060,1062,1064,1066,1068,1070,1072,1074,1076],{"class":174,"line":1055},39,[172,1057,1007],{"class":334},[172,1059,407],{"class":338},[172,1061,378],{"class":334},[172,1063,174],{"class":381},[172,1065,385],{"class":334},[172,1067,388],{"class":320},[172,1069,1041],{"class":334},[172,1071,1010],{"class":338},[172,1073,342],{"class":334},[172,1075,1049],{"class":345},[172,1077,1078],{"class":334},")),\n",[172,1080,1082,1085,1088,1090],{"class":174,"line":1081},40,[172,1083,1084],{"class":334},"  ) ",[172,1086,1087],{"class":320},"as",[172,1089,641],{"class":338},[172,1091,534],{"class":334},[172,1093,1095],{"class":174,"line":1094},41,[172,1096,539],{"emptyLinePlaceholder":129},[172,1098,1100,1103,1106],{"class":174,"line":1099},42,[172,1101,1102],{"class":334},"  console.",[172,1104,1105],{"class":338},"log",[172,1107,1108],{"class":334},"(traceData);\n",[172,1110,1112],{"class":174,"line":1111},43,[172,1113,539],{"emptyLinePlaceholder":129},[172,1115,1117],{"class":174,"line":1116},44,[172,1118,1119],{"class":824},"  \u002F\u002F 计算当前节点名称\n",[172,1121,1123,1125,1128,1130,1133,1136,1138,1140,1142,1144,1147,1150],{"class":174,"line":1122},45,[172,1124,831],{"class":320},[172,1126,1127],{"class":324}," currentNodeName",[172,1129,328],{"class":320},[172,1131,1132],{"class":334}," nodesData.",[172,1134,1135],{"class":338},"find",[172,1137,378],{"class":334},[172,1139,412],{"class":381},[172,1141,385],{"class":334},[172,1143,388],{"class":320},[172,1145,1146],{"class":334}," n.code ",[172,1148,1149],{"class":320},"===",[172,1151,1152],{"class":334}," traceData?.colo)?.name;\n",[172,1154,1156],{"class":174,"line":1155},46,[172,1157,539],{"emptyLinePlaceholder":129},[172,1159,1161,1163,1166,1168],{"class":174,"line":1160},47,[172,1162,831],{"class":320},[172,1164,1165],{"class":324}," location",[172,1167,328],{"class":320},[172,1169,1170],{"class":334}," traceData?.loc;\n",[172,1172,1174],{"class":174,"line":1173},48,[172,1175,539],{"emptyLinePlaceholder":129},[172,1177,1179,1182],{"class":174,"line":1178},49,[172,1180,1181],{"class":320},"  return",[172,1183,595],{"class":334},[172,1185,1187],{"class":174,"line":1186},50,[172,1188,1189],{"class":334},"    nodesData,\n",[172,1191,1193],{"class":174,"line":1192},51,[172,1194,1195],{"class":334},"    traceData,\n",[172,1197,1199],{"class":174,"line":1198},52,[172,1200,1201],{"class":334},"    currentNodeName,\n",[172,1203,1205],{"class":174,"line":1204},53,[172,1206,1207],{"class":334},"    location,\n",[172,1209,1211],{"class":174,"line":1210},54,[172,1212,1213],{"class":334},"  };\n",[172,1215,1217],{"class":174,"line":1216},55,[172,1218,630],{"class":334},[1220,1221,1222],"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":117,"searchDepth":118,"depth":118,"links":1224},[1225,1226],{"id":155,"depth":121,"text":155},{"id":499,"depth":121,"text":499},"2026-05-24","通过解析 Cloudflare 的 \u002Fcdn-cgi\u002Ftrace 接口获取当前网络节点 ID，再结合 Cloudflare Status 的公共 API 匹配出节点名称，从而在网站上动态显示访客正在使用的 Cloudflare 网络名称。",{},"\u002Fblog\u002Fzh-hans\u002Fcf-network",{"title":136,"description":141},"blog\u002Fzh-hans\u002Fcf-network","r9x__ldE5hdhdMYCUs1YncNUWDbMeA-kId5xk9j7eSU",{"id":1235,"title":1236,"body":1237,"date":1301,"desc":1244,"description":1241,"edit":1302,"extension":127,"meta":1303,"navigation":129,"path":1304,"seo":1305,"stem":1306,"__hash__":1307},"blog\u002Fblog\u002Fzh-hans\u002Fhello-world.md","Hello World",{"type":8,"value":1238,"toc":1299},[1239,1242,1245,1296],[15,1240,1241],{},"Ciallo～(∠·ω\u003C )⌒★",[15,1243,1244],{},"这是未晞酱的第一个博客喵~",[164,1246,1248],{"className":311,"code":1247,"language":313,"meta":117,"style":117},"const neko = new Neko();\nneko.owner = 'Weixi-chan';\nneko.say('Hello World!');\n",[32,1249,1250,1267,1280],{"__ignoreMap":117},[172,1251,1252,1254,1257,1259,1262,1265],{"class":174,"line":175},[172,1253,321],{"class":320},[172,1255,1256],{"class":324}," neko",[172,1258,328],{"class":320},[172,1260,1261],{"class":320}," new",[172,1263,1264],{"class":338}," Neko",[172,1266,355],{"class":334},[172,1268,1269,1272,1275,1278],{"class":174,"line":118},[172,1270,1271],{"class":334},"neko.owner ",[172,1273,1274],{"class":320},"=",[172,1276,1277],{"class":345}," 'Weixi-chan'",[172,1279,534],{"class":334},[172,1281,1282,1285,1288,1290,1293],{"class":174,"line":121},[172,1283,1284],{"class":334},"neko.",[172,1286,1287],{"class":338},"say",[172,1289,342],{"class":334},[172,1291,1292],{"class":345},"'Hello World!'",[172,1294,1295],{"class":334},");\n",[1220,1297,1298],{},"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 .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}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);}",{"title":117,"searchDepth":118,"depth":118,"links":1300},[],"2026-05-16","2026-05-17",{},"\u002Fblog\u002Fzh-hans\u002Fhello-world",{"title":1236,"description":1241},"blog\u002Fzh-hans\u002Fhello-world","Rs_XRtHf9wapg9TP_t6Lh94K3_3OSo4Zx_hPEETmcTg",1779981581045]