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