PageSourceSearch

https://noisedh.cn/posts/JsDelivr-CDN%E5%8A%A0%E9%80%9F%E8%AE%BF%E9%97%AE%E6%9C%8D%E5%8A%A1%E9%83%A8%E7%BD%B2/

html noisedh.cn collected 2026-09-28 06:37:02 UTC 150,676 bytes, 257 lines download raw bytes

1<!doctype html><html lang=zh-CN><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><meta http-equiv=X-UA-Compatible content="IE=edge, chrome=1"><base href=../../><title>JsDelivr-CDN加速访问服务部署 | Noise导航 & 收录值得珍藏的网站</title><link rel="shortcut icon" href=assets/images/favicon4.png><link rel=stylesheet id=iconfont-css href='assets/css/iconfont-3.03029.1.css?v=1789212122' type=text/css media=all><link rel=stylesheet id=bootstrap-css href='assets/css/bootstrap.min-4.3.1.css?v=1789212122' type=text/css media=all><link rel=stylesheet id=iowen-css href='assets/css/styles.css?v=1789212122' type=text/css media=all><link rel=stylesheet id=loading-css href='assets/css/loading.css?v=1789212122' type=text/css media=all><link rel=stylesheet id=custom-css href='assets/css/custom-style.css?v=1789212122' type=text/css media=all><link rel=stylesheet id=sticker-theme-css href='assets/css/sticker-theme.css?v=1789212122' type=text/css media=all><link rel=stylesheet id=APlayer.min-css href='assets/css/APlayer.min.css?v=1789212122' type=text/css media=all><link rel=stylesheet id=fortawesome-css href='assets/fontawesome-5.15.4/css/all.min.css?v=1789212122' type=text/css><link rel=stylesheet id=fortawesome-v4shims-css href='assets/fontawesome-5.15.4/css/v4-shims.min.css?v=1789212122' type=text/css>
1<script defer type=text/javascript src='assets/js/jquery.min.js?v=1789212122' id=jquery-js></script>
1<script>(function(){function e(e){e.querySelectorAll("li.menu-item-has-children.focus").forEach(function(e){e.classList.remove("focus");var t=e.querySelector("a[aria-expanded]");t&&t.setAttribute("aria-expanded","false")})}document.addEventListener("click",function(t){var n,o,i,s=document.querySelector(".content-header-menu");if(!s)return;if(n=t.target.closest(".content-header-menu li.menu-item-has-children > a.content-header-toggle"),n){t.preventDefault(),o=n.parentElement,i=!o.classList.contains("focus"),e(s),i?(o.classList.add("focus"),n.setAttribute("aria-expanded","true")):n.setAttribute("aria-expanded","false");return}t.target.closest(".content-header-menu")||e(s)}),document.addEventListener("keydown",function(t){if(t.key!=="Escape")return;var n=document.querySelector(".content-header-menu");if(!n)return;e(n)})})()</script>
1</head><body class=io-grey-mode><div id=loading><div class=modern-spinner></div><div class=loading-text>Noise导航 & 收录珍藏的网站</div></div><div class=page-container><div id=sidebar class="sticky sidebar-nav fade mini-sidebar" style=width:60px><div class="modal-dialog h-100 sidebar-nav-inner"><div class="sidebar-logo border-bottom border-color"><div class="logo overflow-hidden"><a href class=logo-expanded><img src=assets/images/bioitee-expand-light.png height=40 class=logo-light alt="Noise导航 & 收录值得珍藏的网站">
2<img src=assets/images/bioitee-expand-dark.png height=40 class="logo-dark d-none" alt="Noise导航 & 收录值得珍藏的网站">
3</a><a href class=logo-collapsed><img src=assets/images/logo-collapse-light.png height=40 class=logo-light alt="Noise导航 & 收录值得珍藏的网站">
4<img src=assets/images/logo-collapse-dark.png height=40 class="logo-dark d-none" alt="Noise导航 & 收录值得珍藏的网站"></a></div></div><div class="sidebar-menu flex-fill"><div class=sidebar-scroll><div class=sidebar-menu-inner><ul><li class=sidebar-item><a href=#366a7288b80ec8882b88467447296837 class=smooth onclick='return handleSidebarClick("366a7288b80ec8882b88467447296837")'><i class="far fa-star fa-lg icon-fw icon-lg mr-2"></i>
5<span>常用推荐</span></a></li><li class=sidebar-item><a href=#ba8a9f017addcf48c6a6efa1c9b6fbae class="smooth change-href" data-change=#ba8a9f017addcf48c6a6efa1c9b6fbae onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("ba8a9f017addcf48c6a6efa1c9b6fbae"))'><i class="fas fa-folder-open fa-lg icon-fw icon-lg mr-2"></i>
6<span>媒体创作</span>
7<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#ba8a9f017addcf48c6a6efa1c9b6fbae class=smooth onclick='return handleSidebarClick("ba8a9f017addcf48c6a6efa1c9b6fbae")'><span>CG三维</span></a></li><li><a href=#9687024e9548d3eec95c62505ededf22 class=smooth onclick='return handleSidebarClick("9687024e9548d3eec95c62505ededf22")'><span>模版插件·设计素材</span></a></li><li><a href=#176f5d3c2dc21852d895c0301c6d0615 class=smooth onclick='return handleSidebarClick("176f5d3c2dc21852d895c0301c6d0615")'><span>字幕配音·AI合成</span></a></li><li><a href=#256add6472c39cf985c9f482f2fd1139 class=smooth onclick='return handleSidebarClick("256add6472c39cf985c9f482f2fd1139")'><span>无版权图库</span></a></li><li><a href=#4ab14590c4ab7544c44ae9b72b117bb4 class=smooth onclick='return handleSidebarClick("4ab14590c4ab7544c44ae9b72b117bb4")'><span>封面图文</span></a></li><li><a href=#e3470e009a16d3c9a907de1a4c70bf66 class=smooth onclick='return handleSidebarClick("e3470e009a16d3c9a907de1a4c70bf66")'><span>无版权视频</span></a></li><li><a href=#94c19ba59d80112f75304cecfa9573aa class=smooth onclick='return handleSidebarClick("94c19ba59d80112f75304cecfa9573aa")'><span>创意灵感</span></a></li><li><a href=#8f2a864d4278173e4ced5adeb760d044 class=smooth onclick='return handleSidebarClick("8f2a864d4278173e4ced5adeb760d044")'><span>音乐世界</span></a></li><li><a href=#57ff7a3cab58001ca1c2c188bbd1625a class=smooth onclick='return handleSidebarClick("57ff7a3cab58001ca1c2c188bbd1625a")'><span>剪辑能手</span></a></li><li><a href=#66742ab162c1b94064cd7586c93642fe class=smooth onclick='return handleSidebarClick("66742ab162c1b94064cd7586c93642fe")'><span>摄影聚焦</span></a></li><li><a href=#ad378beb674f77ee50cd52385d51e263 class=smooth onclick='return handleSidebarClick("ad378beb674f77ee50cd52385d51e263")'><span>无人机航拍</span></a></li><li><a href=#62e7296b8d9758fba513834a178eaa63 class=smooth onclick='return handleSidebarClick("62e7296b8d9758fba513834a178eaa63")'><span>虚拟直播</span></a></li></ul></li><li class=sidebar-item><a href=#5738972fad13b53f2ba0b3988f844f9d class="smooth change-href" data-change=#5738972fad13b53f2ba0b3988f844f9d onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("5738972fad13b53f2ba0b3988f844f9d"))'><i class="fas fa-square icon-fw icon-lg mr-2"></i>
8<span>媒体运营</span>
9<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#5738972fad13b53f2ba0b3988f844f9d class=smooth onclick='return handleSidebarClick("5738972fad13b53f2ba0b3988f844f9d")'><span>媒体平台</span></a></li><li><a href=#858968f484120ec6093c8fb972bfc36c class=smooth onclick='return handleSidebarClick("858968f484120ec6093c8fb972bfc36c")'><span>运营工具</span></a></li><li><a href=#c8c69c0ad7d6d6a07b29836b7423a924 class=smooth onclick='return handleSidebarClick("c8c69c0ad7d6d6a07b29836b7423a924")'><span>数据运营</span></a></li><li><a href=#0f65b992f04951f4dab21088ba8e32db class=smooth onclick='return handleSidebarClick("0f65b992f04951f4dab21088ba8e32db")'><span>解说文案</span></a></li><li><a href=#972dc22edd767bf529a76627319b3a91 class=smooth onclick='return handleSidebarClick("972dc22edd767bf529a76627319b3a91")'><span>抖音工具箱</span></a></li><li><a href=#5b94e814593bb583fa2cd10d9a541697 class=smooth onclick='return handleSidebarClick("5b94e814593bb583fa2cd10d9a541697")'><span>小红书工具</span></a></li><li><a href=#a48a29350c95d810591246a1bb1d4d79 class=smooth onclick='return handleSidebarClick("a48a29350c95d810591246a1bb1d4d79")'><span>微信工具</span></a></li></ul></li><li class=sidebar-item><a href=#f7e40e681ad1d41b91fa3d61a5960db7 class="smooth change-href" data-change=#f7e40e681ad1d41b91fa3d61a5960db7 onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("f7e40e681ad1d41b91fa3d61a5960db7"))'><i class="fas fa-shopping-cart icon-fw icon-lg mr-2"></i>
10<span>电商外贸</span>
11<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#f7e40e681ad1d41b91fa3d61a5960db7 class=smooth onclick='return handleSidebarClick("f7e40e681ad1d41b91fa3d61a5960db7")'><span>电商·平台</span></a></li><li><a href=#84277e54ee26a9a9b6a9373517d3167a class=smooth onclick='return handleSidebarClick("84277e54ee26a9a9b6a9373517d3167a")'><span>电商·运营</span></a></li><li><a href=#de3e4b706505a692efb5026745a076e6 class=smooth onclick='return handleSidebarClick("de3e4b706505a692efb5026745a076e6")'><span>电商·获客</span></a></li><li><a href=#46684ce5275bbf2e7df656dff7c14371 class=smooth onclick='return handleSidebarClick("46684ce5275bbf2e7df656dff7c14371")'><span>电商·支付</span></a></li><li><a href=#ee0596fe4c97f21164a49e791a69533e class=smooth onclick='return handleSidebarClick("ee0596fe4c97f21164a49e791a69533e")'><span>电商·工具</span></a></li><li><a href=#11c4a78cf8f607d14a35ccd1c03eb70a class=smooth onclick='return handleSidebarClick("11c4a78cf8f607d14a35ccd1c03eb70a")'><span>电商·货源</span></a></li><li><a href=#696153e56493f9a56c14b3e8b6fee7df class=smooth onclick='return handleSidebarClick("696153e56493f9a56c14b3e8b6fee7df")'><span>电商·物流</span></a></li><li><a href=#e90260b9c81983e315b116c2f1e46bdd class=smooth onclick='return handleSidebarClick("e90260b9c81983e315b116c2f1e46bdd")'><span>电商·商标</span></a></li><li><a href=#4faaa2cb735902262398c3d04ff93cca class=smooth onclick='return handleSidebarClick("4faaa2cb735902262398c3d04ff93cca")'><span>电商·接码</span></a></li><li><a href=#f48b8bfb2f9ef5e39820b11683d73007 class=smooth onclick='return handleSidebarClick("f48b8bfb2f9ef5e39820b11683d73007")'><span>电商·AI</span></a></li></ul></li><li class=sidebar-item><a href=#17174d0d9b74ae9e400f6fa022a7121a class="smooth change-href" data-change=#17174d0d9b74ae9e400f6fa022a7121a onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("17174d0d9b74ae9e400f6fa022a7121a"))'><i class="fas fa-briefcase icon-fw icon-lg mr-2"></i>
12<span>职场生涯</span>
13<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#17174d0d9b74ae9e400f6fa022a7121a class=smooth onclick='return handleSidebarClick("17174d0d9b74ae9e400f6fa022a7121a")'><span>求职招聘</span></a></li><li><a href=#5eeec3f3ae4c2e9640bd7913bf4d2864 class=smooth onclick='return handleSidebarClick("5eeec3f3ae4c2e9640bd7913bf4d2864")'><span>简历模版</span></a></li><li><a href=#0817644a87e5db6091ebda657b47098b class=smooth onclick='return handleSidebarClick("0817644a87e5db6091ebda657b47098b")'><span>投简脚本</span></a></li><li><a href=#bbadb741daba189fca4a2529cd8be3d2 class=smooth onclick='return handleSidebarClick("bbadb741daba189fca4a2529cd8be3d2")'><span>企业查</span></a></li><li><a href=#4b4ac9cdd339b459f6ce064daf7d817c class=smooth onclick='return handleSidebarClick("4b4ac9cdd339b459f6ce064daf7d817c")'><span>创业投资</span></a></li><li><a href=#f5e0c78a52df70d5dc6770ea0747a6a7 class=smooth onclick='return handleSidebarClick("f5e0c78a52df70d5dc6770ea0747a6a7")'><span>一人公司</span></a></li></ul></li><li class=sidebar-item><a href=#050f32bfde7b80111a0aaa333a1354e0 class="smooth change-href" data-change=#050f32bfde7b80111a0aaa333a1354e0 onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("050f32bfde7b80111a0aaa333a1354e0"))'><i class="far fas fa-tape icon-fw icon-lg mr-2"></i>
14<span>影视片场</span>
15<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#050f32bfde7b80111a0aaa333a1354e0 class=smooth onclick='return handleSidebarClick("050f32bfde7b80111a0aaa333a1354e0")'><span>电影影视</span></a></li><li><a href=#565a168e17c15bbf3e729478513ed132 class=smooth onclick='return handleSidebarClick("565a168e17c15bbf3e729478513ed132")'><span>动漫番剧</span></a></li><li><a href=#2bd7ad6c9ae985984608569955394b92 class=smooth onclick='return handleSidebarClick("2bd7ad6c9ae985984608569955394b92")'><span>
15直播聚合</span></a></li></ul></li><li class=sidebar-item><a href=#d1465fae0d32afdfe9d060700dfd01b5 class="smooth change-href" data-change=#d1465fae0d32afdfe9d060700dfd01b5 onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("d1465fae0d32afdfe9d060700dfd01b5"))'><i class="fas fa-users fa-lg icon-fw icon-lg mr-2"></i>
16<span>社区论坛</span>
17<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#d1465fae0d32afdfe9d060700dfd01b5 class=smooth onclick='return handleSidebarClick("d1465fae0d32afdfe9d060700dfd01b5")'><span>社区·编程开发类</span></a></li><li><a href=#dfd03df84a130a5e1bf75136df05aeb5 class=smooth onclick='return handleSidebarClick("dfd03df84a130a5e1bf75136df05aeb5")'><span>社区·综合技术类</span></a></li><li><a href=#eafe17a641c878c57987a1aadbb2243f class=smooth onclick='return handleSidebarClick("eafe17a641c878c57987a1aadbb2243f")'><span>社区·软件技术类</span></a></li><li><a href=#f0e1e94336ab80488a6ec29592e18934 class=smooth onclick='return handleSidebarClick("f0e1e94336ab80488a6ec29592e18934")'><span>社区·资源类</span></a></li><li><a href=#199100ab176d50b388f676954c66c676 class=smooth onclick='return handleSidebarClick("199100ab176d50b388f676954c66c676")'><span>社区·影视类</span></a></li><li><a href=#5ff5f6e2bc8d1b815c5227bcf243df9c class=smooth onclick='return handleSidebarClick("5ff5f6e2bc8d1b815c5227bcf243df9c")'><span>社区·设计摄影类</span></a></li><li><a href=#5512c742b5d8f799a9d078986c5344fa class=smooth onclick='return handleSidebarClick("5512c742b5d8f799a9d078986c5344fa")'><span>社区·游戏类</span></a></li><li><a href=#549bc64b4630ab46df7543baab901757 class=smooth onclick='return handleSidebarClick("549bc64b4630ab46df7543baab901757")'><span>社区·知识类</span></a></li><li><a href=#2ba06405ea616f6a3f7bde4711a6d157 class=smooth onclick='return handleSidebarClick("2ba06405ea616f6a3f7bde4711a6d157")'><span>社区·寻人寻亲</span></a></li><li><a href=#daa972b7676860936c06b15cd5afb2dc class=smooth onclick='return handleSidebarClick("daa972b7676860936c06b15cd5afb2dc")'><span>社区·其它类</span></a></li></ul></li><li class=sidebar-item><a href=#61297feabecfd7e5284f4e9f86812f7a class="smooth change-href" data-change=#61297feabecfd7e5284f4e9f86812f7a onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("61297feabecfd7e5284f4e9f86812f7a"))'><i class="fas fa-sitemap fa-lg icon-fw icon-lg mr-2"></i>
18<span>知识库</span>
19<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#61297feabecfd7e5284f4e9f86812f7a class=smooth onclick='return handleSidebarClick("61297feabecfd7e5284f4e9f86812f7a")'><span>文档知识库</span></a></li><li><a href=#f33a77e697fb019382c44ed42af87d3c class=smooth onclick='return handleSidebarClick("f33a77e697fb019382c44ed42af87d3c")'><span>notion站点</span></a></li><li><a href=#2f8da5246b81d570ab747ead30135f31 class=smooth onclick='return handleSidebarClick("2f8da5246b81d570ab747ead30135f31")'><span>电子书库</span></a></li></ul></li><li class=sidebar-item><a href=#75b6a126bd825871580822d685b7f7ae class="smooth change-href" data-change=#75b6a126bd825871580822d685b7f7ae onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("75b6a126bd825871580822d685b7f7ae"))'><i class="fas fa-heart fa-lg icon-fw icon-lg mr-2"></i>
20<span>博客人生</span>
21<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#75b6a126bd825871580822d685b7f7ae class=smooth onclick='return handleSidebarClick("75b6a126bd825871580822d685b7f7ae")'><span>博客人生·独立博客</span></a></li><li><a href=#4849444c9fd6b6e8e0e98ff90d5ea71e class=smooth onclick='return handleSidebarClick("4849444c9fd6b6e8e0e98ff90d5ea71e")'><span>博客人生·构建</span></a></li><li><a href=#3c46f165c0d1fa7813c2b1d47f4d2e57 class=smooth onclick='return handleSidebarClick("3c46f165c0d1fa7813c2b1d47f4d2e57")'><span>优质播客</span></a></li></ul></li><li class=sidebar-item><a href=#cb071680f61eb360a03c0c2504698a40 class="smooth change-href" data-change=#cb071680f61eb360a03c0c2504698a40 onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("cb071680f61eb360a03c0c2504698a40"))'><i class="fas fa-gamepad icon-fw icon-lg mr-2"></i>
22<span>游戏人生</span>
23<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#cb071680f61eb360a03c0c2504698a40 class=smooth onclick='return handleSidebarClick("cb071680f61eb360a03c0c2504698a40")'><span>游戏仓库</span></a></li><li>
23<a href=#9eb6d428062614c9df869f7258ad5931 class=smooth onclick='return handleSidebarClick("9eb6d428062614c9df869f7258ad5931")'><span>网页游戏</span></a></li></ul></li><li class=sidebar-item><a href=#9aaf73084f4e862a1cf0930d0e7647af class="smooth change-href" data-change=#9aaf73084f4e862a1cf0930d0e7647af onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("9aaf73084f4e862a1cf0930d0e7647af"))'><i class="fas fa-code fa-lg icon-fw icon-lg mr-2"></i>
24<span>独立开发</span>
25<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#9aaf73084f4e862a1cf0930d0e7647af class=smooth onclick='return handleSidebarClick("9aaf73084f4e862a1cf0930d0e7647af")'><span>云端部署</span></a></li><li><a href=#f2ba032066d4d2a2a1d5d8e8eb3249d9 class=smooth onclick='return handleSidebarClick("f2ba032066d4d2a2a1d5d8e8eb3249d9")'><span>原型设计</span></a></li><li><a href=#0ffed74bc27ec71c5063acb66cca8459 class=smooth onclick='return handleSidebarClick("0ffed74bc27ec71c5063acb66cca8459")'><span>前端开发</span></a></li><li><a href=#edb9c40b5e91e507efcf9f3ce7f2082f class=smooth onclick='return handleSidebarClick("edb9c40b5e91e507efcf9f3ce7f2082f")'><span>后端涉及</span></a></li><li><a href=#2950cdb85cbd97afd2de2ee194249d86 class=smooth onclick='return handleSidebarClick("2950cdb85cbd97afd2de2ee194249d86")'><span>编程学习</span></a></li><li><a href=#59ddf3cc5c481ff4fa090262e6747a74 class=smooth onclick='return handleSidebarClick("59ddf3cc5c481ff4fa090262e6747a74")'><span>工具箱</span></a></li><li><a href=#7eb3bf08084e63475a208fb6e0210aae class=smooth onclick='return handleSidebarClick("7eb3bf08084e63475a208fb6e0210aae")'><span>API平台</span></a></li><li><a href=#596d27dcf95273df6e39644f9c1dc9d6 class=smooth onclick='return handleSidebarClick("596d27dcf95273df6e39644f9c1dc9d6")'><span>开发·CDN</span></a></li></ul></li><li class=sidebar-item><a href=#dcec9b13c1de515016a3bc0f92cfa345 class="smooth change-href" data-change=#dcec9b13c1de515016a3bc0f92cfa345 onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("dcec9b13c1de515016a3bc0f92cfa345"))'><i class="fas fa-terminal icon-fw icon-lg mr-2"></i>
26<span>源码主题</span>
27<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#dcec9b13c1de515016a3bc0f92cfa345 class=smooth onclick='return handleSidebarClick("dcec9b13c1de515016a3bc0f92cfa345")'><span>Wordpress</span></a></li><li><a href=#aed202cba285c5d88223f596ec232de2 class=smooth onclick='return handleSidebarClick("aed202cba285c5d88223f596ec232de2")'><span>Typecho</span></a></li><li><a href=#f1f58e8c06b2a61ce13e0c0aa9473a72 class=smooth onclick='return handleSidebarClick("f1f58e8c06b2a61ce13e0c0aa9473a72")'><span>hugo</span></a></li><li><a href=#ecf1af8bbe2a3020d96fe7ea971a03ad class=smooth onclick='return handleSidebarClick("ecf1af8bbe2a3020d96fe7ea971a03ad")'><span>hexo</span></a></li><li><a href=#da5e1343247a4f1a14129614c500ce33 class=smooth onclick='return handleSidebarClick("da5e1343247a4f1a14129614c500ce33")'><span>Astro</span></a></li><li><a href=#2ef03765f9406b56b06f11faffd6e442 class=smooth onclick='return handleSidebarClick("2ef03765f9406b56b06f11faffd6e442")'><span>引导主页</span></a></li></ul></li><li class=sidebar-item><a href=#fa731100e665a1f275884f2c28299093 class="smooth change-href" data-change=#fa731100e665a1f275884f2c28299093 onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("fa731100e665a1f275884f2c28299093"))'><i class="fas fa-cog icon-fw icon-lg mr-2"></i>
28<span>AI新时代</span>
29<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#fa731100e665a1f275884f2c28299093 class=smooth onclick='return handleSidebarClick("fa731100e665a1f275884f2c28299093")'><span>AI·知识库·文档</span></a></li><li><a href=#89f0e36a5b4e6d106f05d96e67251560 class=smooth onclick='return handleSidebarClick("89f0e36a5b4e6d106f05d96e67251560")'><span>AI·工具集</span></a></li><li><a href=#33562a16d8bc80089d8f542f0bd0d235 class=smooth onclick='return handleSidebarClick("33562a16d8bc80089d8f542f0bd0d235")'><span>AI·提示词</span></a></li><li><a href=#a8c21b48b8df0ae120fc5aecf8c04cf5 class=smooth onclick='return handleSidebarClick("a8c21b48b8df0ae120fc5aecf8c04cf5")'><span>AI·SKILL</span></a></li><li><a href=#deca35cdb2e4ef38cc96f2f36af8498f class=smooth onclick='return handleSidebarClick("deca35cdb2e4ef38cc96f2f36af8498f")'><span>AI·MCP</span></a></li><li>
29<a href=#ac3b75fa9d9f84da434315d05c79cb13 class=smooth onclick='return handleSidebarClick("ac3b75fa9d9f84da434315d05c79cb13")'><span>AI·产品</span></a></li><li><a href=#7d41a6ce9ddb3f92a25394cee36c55ba class=smooth onclick='return handleSidebarClick("7d41a6ce9ddb3f92a25394cee36c55ba")'><span>AI·绘画</span></a></li><li><a href=#cd0ee86e05f5180ab5a142aae62d36ba class=smooth onclick='return handleSidebarClick("cd0ee86e05f5180ab5a142aae62d36ba")'><span>AI·问答</span></a></li><li><a href=#e3b293d137a03765523ed46e32abfedf class=smooth onclick='return handleSidebarClick("e3b293d137a03765523ed46e32abfedf")'><span>AI·视频</span></a></li><li><a href=#3246b8c07b0d1dace56d6de86f966c17 class=smooth onclick='return handleSidebarClick("3246b8c07b0d1dace56d6de86f966c17")'><span>AI·图设</span></a></li><li><a href=#9bafc78b66dcc52d564b7fcfdfc4b4fa class=smooth onclick='return handleSidebarClick("9bafc78b66dcc52d564b7fcfdfc4b4fa")'><span>AI·音乐</span></a></li><li><a href=#9041b01112fc6b8efc8b0beaa6ad8d62 class=smooth onclick='return handleSidebarClick("9041b01112fc6b8efc8b0beaa6ad8d62")'><span>AI·PPT</span></a></li><li><a href=#1ed7d103ac6d9631d95039e69bfc48dd class=smooth onclick='return handleSidebarClick("1ed7d103ac6d9631d95039e69bfc48dd")'><span>AI·3D</span></a></li><li><a href=#54af569696d50c6bd4b3bc1c090439cd class=smooth onclick='return handleSidebarClick("54af569696d50c6bd4b3bc1c090439cd")'><span>AI·搜索</span></a></li><li><a href=#eaaa63ba3573e921b7f169d6911f4b79 class=smooth onclick='return handleSidebarClick("eaaa63ba3573e921b7f169d6911f4b79")'><span>AI·写作</span></a></li><li><a href=#33afa73af585028e6c6d68e711f1fd7e class=smooth onclick='return handleSidebarClick("33afa73af585028e6c6d68e711f1fd7e")'><span>AI·模型+平台</span></a></li><li><a href=#bb908028789094518cbb93a7af441d71 class=smooth onclick='return handleSidebarClick("bb908028789094518cbb93a7af441d71")'><span>AI·代码</span></a></li><li><a href=#7eb28c427c371b1413a03b2d18be6336 class=smooth onclick='return handleSidebarClick("7eb28c427c371b1413a03b2d18be6336")'><span>AI·数字人</span></a></li><li><a href=#45768f2f2674d0b81a30b345e24ef005 class=smooth onclick='return handleSidebarClick("45768f2f2674d0b81a30b345e24ef005")'><span>AI·代理·工作流</span></a></li><li><a href=#ee50c626cbdeb44721527a1e4f147520 class=smooth onclick='return handleSidebarClick("ee50c626cbdeb44721527a1e4f147520")'><span>AI·知识库·产品</span></a></li><li><a href=#a115b8455f6e101e6fb18878c613f650 class=smooth onclick='return handleSidebarClick("a115b8455f6e101e6fb18878c613f650")'><span>AI·API·商店</span></a></li></ul></li><li class=sidebar-item><a href=#2c2831b1e8a3fb8a20cca894e65dfaae class="smooth change-href" data-change=#2c2831b1e8a3fb8a20cca894e65dfaae onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("2c2831b1e8a3fb8a20cca894e65dfaae"))'><i class="fas fa-circle icon-fw icon-lg mr-2"></i>
30<span>极客下载</span>
31<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#2c2831b1e8a3fb8a20cca894e65dfaae class=smooth onclick='return handleSidebarClick("2c2831b1e8a3fb8a20cca894e65dfaae")'><span>下载·视频</span></a></li><li><a href=#649ab8c4e238377104003faf5181af03 class=smooth onclick='return handleSidebarClick("649ab8c4e238377104003faf5181af03")'><span>下载MAC</span></a></li><li><a href=#196b520c8edbb4bdab5679bdc40b1d02 class=smooth onclick='return handleSidebarClick("196b520c8edbb4bdab5679bdc40b1d02")'><span>下载·扩展</span></a></li><li><a href=#86e1e9db92dc038c38bc521be3bb54da class=smooth onclick='return handleSidebarClick("86e1e9db92dc038c38bc521be3bb54da")'><span>下载·综合</span></a></li><li><a href=#b8bad0362feea3fe3c7f9e3f9950b8a5 class=smooth onclick='return handleSidebarClick("b8bad0362feea3fe3c7f9e3f9950b8a5")'><span>下载·安卓</span></a></li><li><a href=#001b7d102ea3f43e19187ec956283083 class=smooth onclick='return handleSidebarClick("001b7d102ea3f43e19187ec956283083")'><span>下载·IPA</span></a></li><li><a href=#c5f58cc2df3df192afeb667c5a8ee1be class=smooth onclick='return handleSidebarClick("c5f58cc2df3df192afeb667c5a8ee1be")'><span>下载·系统</span></a></li><li><a href=#6c95afa51f53cd1f7bae2281438f4b3a class=smooth onclick='return handleSidebarClick("6c95afa51f53cd1f7bae2281438f4b3a")'><span>
31下载·壁纸</span></a></li></ul></li><li class=sidebar-item><a href=#3501779327e1f3fa0300c3e16848478d class="smooth change-href" data-change=#3501779327e1f3fa0300c3e16848478d onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("3501779327e1f3fa0300c3e16848478d"))'><i class="fas fa-inbox icon-fw icon-lg mr-2"></i>
32<span>App精选</span>
33<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#3501779327e1f3fa0300c3e16848478d class=smooth onclick='return handleSidebarClick("3501779327e1f3fa0300c3e16848478d")'><span>笔记工具</span></a></li><li><a href=#a7bf369893f934c46c4256f4ec0d0aec class=smooth onclick='return handleSidebarClick("a7bf369893f934c46c4256f4ec0d0aec")'><span>效率生产力</span></a></li><li><a href=#961e6747385bba773a8f4f240f7d3591 class=smooth onclick='return handleSidebarClick("961e6747385bba773a8f4f240f7d3591")'><span>Read-Later</span></a></li><li><a href=#2c509530bf439a36168a86e21c160c06 class=smooth onclick='return handleSidebarClick("2c509530bf439a36168a86e21c160c06")'><span>开发工具</span></a></li></ul></li><li class=sidebar-item><a href=#e0d6d2c60f92bfde9ed960eb2c25104b class="smooth change-href" data-change=#e0d6d2c60f92bfde9ed960eb2c25104b onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("e0d6d2c60f92bfde9ed960eb2c25104b"))'><i class="fas fa-cube icon-fw icon-lg mr-2"></i>
34<span>极客创造</span>
35<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#e0d6d2c60f92bfde9ed960eb2c25104b class=smooth onclick='return handleSidebarClick("e0d6d2c60f92bfde9ed960eb2c25104b")'><span>极客·自动化·集成</span></a></li><li><a href=#eb2b014e10ae81233c72de6326adbaf6 class=smooth onclick='return handleSidebarClick("eb2b014e10ae81233c72de6326adbaf6")'><span>极客·Agent·自动化</span></a></li><li><a href=#4efdd04077437434c17c0d5d24c1117b class=smooth onclick='return handleSidebarClick("4efdd04077437434c17c0d5d24c1117b")'><span>极客·热榜资讯</span></a></li><li><a href=#4a95f3443b181bc5aca5e857a1a36358 class=smooth onclick='return handleSidebarClick("4a95f3443b181bc5aca5e857a1a36358")'><span>极客·产品发现</span></a></li></ul></li><li class=sidebar-item><a href=#af405bdd96107a896db74afe1d3bca2d class="smooth change-href" data-change=#af405bdd96107a896db74afe1d3bca2d onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("af405bdd96107a896db74afe1d3bca2d"))'><i class="fas fa-rss-square icon-fw icon-lg mr-2"></i>
36<span>极客订阅</span>
37<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#af405bdd96107a896db74afe1d3bca2d class=smooth onclick='return handleSidebarClick("af405bdd96107a896db74afe1d3bca2d")'><span>周刊期刊</span></a></li><li><a href=#215feec56c2ae2ebc5c15e0bf7baf63b class=smooth onclick='return handleSidebarClick("215feec56c2ae2ebc5c15e0bf7baf63b")'><span>公众号</span></a></li><li><a href=#ffb7e666a70151215b4c55c6268d7d72 class=smooth onclick='return handleSidebarClick("ffb7e666a70151215b4c55c6268d7d72")'><span>Newsletter</span></a></li><li><a href=#60a193bfe41dfcbb8a905bff9e1af0c6 class=smooth onclick='return handleSidebarClick("60a193bfe41dfcbb8a905bff9e1af0c6")'><span>RSS生产力</span></a></li><li><a href=#c718e74814a80f113f830f6ed94b807b class=smooth onclick='return handleSidebarClick("c718e74814a80f113f830f6ed94b807b")'><span>RSS源精选</span></a></li><li><a href=#6eaf4665898fa0e2b5fb1746e8cd4f1a class=smooth onclick='return handleSidebarClick("6eaf4665898fa0e2b5fb1746e8cd4f1a")'><span>RSS阅读</span></a></li><li><a href=#563da017dbb5a944efc82a3b71233a62 class=smooth onclick='return handleSidebarClick("563da017dbb5a944efc82a3b71233a62")'><span>RSS源合集</span></a></li></ul></li><li class=sidebar-item><a href=#9f8ceeb7689703f51edfaa812d1dde3b class="smooth change-href" data-change=#9f8ceeb7689703f51edfaa812d1dde3b onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("9f8ceeb7689703f51edfaa812d1dde3b"))'><i class="fas fa-cloud fa-lg icon-fw icon-lg mr-2"></i>
38<span>云盘资源</span>
39<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#9f8ceeb7689703f51edfaa812d1dde3b class=smooth onclick='return handleSidebarClick("9f8ceeb7689703f51edfaa812d1dde3b")'><span>云盘搜索</span></a></li><li><a href=#9bcda4b46e011f66e1b0c3c5709eb5e4 class=smooth onclick='return handleSidebarClick("9bcda4b46e011f66e1b0c3c5709eb5e4")'><span>云盘存储</span></a></li><li><a href=#bc76010a301551ee163dc0b442ee3bcf class=smooth onclick='return handleSidebarClick("bc76010a301551ee163dc0b442ee3bcf")'><span>自建云盘站</span></a></li><li>
39<a href=#0acfcafe5b5a3b739cdd0b7765524e11 class=smooth onclick='return handleSidebarClick("0acfcafe5b5a3b739cdd0b7765524e11")'><span>蓝奏云盘站</span></a></li></ul></li><li class=sidebar-item><a href=#8f940a02fd43006202f164ec7ffebf6e class="smooth change-href" data-change=#8f940a02fd43006202f164ec7ffebf6e onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("8f940a02fd43006202f164ec7ffebf6e"))'><i class="fas fa-tree icon-fw icon-lg mr-2"></i>
40<span>永硕E盘</span>
41<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#8f940a02fd43006202f164ec7ffebf6e class=smooth onclick='return handleSidebarClick("8f940a02fd43006202f164ec7ffebf6e")'><span>永硕·书签网址类</span></a></li><li><a href=#f80bc006607d962b6b66cff51d9a6d44 class=smooth onclick='return handleSidebarClick("f80bc006607d962b6b66cff51d9a6d44")'><span>永硕·软件文件类</span></a></li><li><a href=#888b025f8bb1eddb0f46f710275641dd class=smooth onclick='return handleSidebarClick("888b025f8bb1eddb0f46f710275641dd")'><span>永硕·游戏娱乐类</span></a></li><li><a href=#d5f73b721ca19d7554632d5a3d3dc2f6 class=smooth onclick='return handleSidebarClick("d5f73b721ca19d7554632d5a3d3dc2f6")'><span>永硕·科考类</span></a></li></ul></li><li class=sidebar-item><a href=#eb06c151e3c24937085f9fe8091ed71c class="smooth change-href" data-change=#eb06c151e3c24937085f9fe8091ed71c onclick='var sidebar=document.getElementById("sidebar");return!sidebar||!sidebar.classList.contains("mini-sidebar")||(event&&(event.preventDefault(),event.stopImmediatePropagation()),handleSidebarClick("eb06c151e3c24937085f9fe8091ed71c"))'><i class="fas fa-compass icon-fw icon-lg mr-2"></i>
42<span>探索发现</span>
43<i class="iconfont icon-arrow-r-m sidebar-more text-sm"></i></a><ul><li><a href=#eb06c151e3c24937085f9fe8091ed71c class=smooth onclick='return handleSidebarClick("eb06c151e3c24937085f9fe8091ed71c")'><span>科学机场</span></a></li><li><a href=#e19ce21394d61858a49ac3b3ad2e21df class=smooth onclick='return handleSidebarClick("e19ce21394d61858a49ac3b3ad2e21df")'><span>免费科学APP</span></a></li><li><a href=#010401de0d1f1267fc6504e48bd6ad2b class=smooth onclick='return handleSidebarClick("010401de0d1f1267fc6504e48bd6ad2b")'><span>免费节点</span></a></li><li><a href=#17a4264ad240b4f79fd3e8272d9c9757 class=smooth onclick='return handleSidebarClick("17a4264ad240b4f79fd3e8272d9c9757")'><span>规则·模块</span></a></li><li><a href=#5407db44292a8b8a5c2cc81b6afebdc0 class=smooth onclick='return handleSidebarClick("5407db44292a8b8a5c2cc81b6afebdc0")'><span>TG·BOT·相关</span></a></li><li><a href=#61ca7aec8b4c7327eb747807bab87406 class=smooth onclick='return handleSidebarClick("61ca7aec8b4c7327eb747807bab87406")'><span>TG·频道·推荐</span></a></li><li><a href=#156f092fff99281fa177234e56db6b02 class=smooth onclick='return handleSidebarClick("156f092fff99281fa177234e56db6b02")'><span>更多导航</span></a></li><li><a href=#2be525823de4b4122354ed9b8b194f19 class=smooth onclick='return handleSidebarClick("2be525823de4b4122354ed9b8b194f19")'><span>摸鱼趣站</span></a></li><li><a href=#7e0ccead84b317a572804707c1647a69 class=smooth onclick='return handleSidebarClick("7e0ccead84b317a572804707c1647a69")'><span>LGBT友好</span></a></li><li><a href=#2b503cfa98c1d66919ed22341e5d68b8 class=smooth onclick='return handleSidebarClick("2b503cfa98c1d66919ed22341e5d68b8")'><span>临时邮箱</span></a></li><li><a href=#7905c0b8616905b9625e0924b6bab154 class=smooth onclick='return handleSidebarClick("7905c0b8616905b9625e0924b6bab154")'><span>图标字体</span></a></li><li><a href=#3cc7e53fccf5147e5393e916d31c52bb class=smooth onclick='return handleSidebarClick("3cc7e53fccf5147e5393e916d31c52bb")'><span>更多探索</span></a></li></ul></li></ul></div></div></div><div class="border-top py-2 border-color"><div class=flex-bottom><ul><li id=menu-item-212 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-212 sidebar-item"><a target=_blank rel=noopener href=soso/><i class="fas fa-star icon-fw icon-lg mr-2"></i>
44<span>主页版</span></a></li><li id=menu-item-212 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-212 sidebar-item"><a href=#friendlink><i class="fab fa-grav icon-fw icon-lg mr-2"></i>
45<span>友情链接</span></a></li><li id=menu-item-212 class="menu-item menu-item-type-custom menu-item-object-custom menu-item-212 sidebar-item"><a target=_blank rel=noopener href=./about><i class="fas fa-info-circle icon-fw icon-lg mr-2"></i>
46<span>关于本站</span></a></li></ul></div></div></div></div><div class="main-content flex-fill grid-bg"><div class=big-header-banner><meta name=viewport content="width=device-width,initial-scale=1"><div id=header class="page-header sticky compact-header content-header-shell"><div class="navbar navbar-expand-md"><div class="container-fluid p-0"><a href class="navbar-brand d-md-none" title="Noise导航 & 收录值得珍藏的网站" target=_blank><img src=../../assets/images/logo-collapse-light.png class=logo-light alt="Noise导航 & 收录值得珍藏的网站">
47<img src=../../assets/images/logo-collapse-dark.png class="logo-dark d-none" alt="Noise导航 & 收录值得珍藏的网站"></a><div class="collapse navbar-collapse order-2 order-md-1 content-header-nav"><div class=header-mini-btn><label><input id=mini-button type=checkbox>
48<svg viewbox="0 0 100 100"><path class="line--1" d="M0 40h62c18 0 18-20-17 5L31 55"/><path class="line--2" d="M0 50h80"/><path class="line--3" d="M0 60h62c18 0 18 20-17-5L31 45"/></svg></label></div><ul class="navbar-nav site-menu compact-menu content-header-menu"><li class=content-header-item><a href=./ target=_blank><i class="fa fa-home fa-lg mr-2"></i>
49<span>首页</span></a></li><li class=content-header-item><a href=./about/ target=_blank><i class="fa fa-info-circle fa-lg mr-2"></i>
50<span>关于本站</span></a></li><li class=content-header-item><a href=./tougao/ target=_blank><i class="fa fa-paper-plane fa-lg mr-2"></i>
51<span>投稿</span></a></li><li class=content-header-item><a href=./update/ target=_blank><i class="fa fa-pencil-square-o fa-lg mr-2"></i>
52<span>更新记录</span></a></li><li class=content-header-item><a href=https://github.com/rcy1314/noisedh-nav target=_blank><i class="fa fa-github fa-lg mr-2"></i>
53<span>开源仓库</span></a></li><li class=content-header-item><a href=./mcp/ target=_blank><i class="fa fa-coffee fa-lg mr-2"></i>
54<span>MCP/Skill</span></a></li><li class=content-header-item><a href=https://www.noisedh.cn/rss.xml target=_blank><i class="fa fa-rss-square fa-lg mr-2"></i>
55<span>订阅收录更新</span></a></li><li class=content-header-item><a href=./invalidlinks/ target=_blank><i class="fa fa-calendar-times-o fa-lg mr-2"></i>
56<span>失效链接记录</span></a></li><li class="content-header-item menu-item-has-children"><a href=javascript: class=content-header-toggle aria-haspopup=true aria-expanded=false><i class="fa fa-map-signs fa-lg mr-2"></i>
57<span>更多</span></a><ul class="sub-menu content-header-submenu"><li><a href=./assets/emoji/ target=_blank>😀Emoji</a></li><li><a href=https://t.me/quanshoulu target=_blank>🗳TG</a></li><li><a href=https://noisedaohang.netlify.app target=_blank>🎁备用1</a></li><li><a href=https://daohang-c5k.pages.dev target=_blank>🎁备用2</a></li><li><a href=https://noisedh.maozi.io target=_blank>🎁备用3</a></li><li><a href=https://noisedh.vercel.app target=_blank>🎁备用4</a></li><li><a href=https://noisedh.link target=_blank>🎁备用5</a></li><li><a href=./jiuban/ target=_blank>📑旧版</a></li></ul></li></ul></div><ul class="nav navbar-menu text-xs order-1 order-md-2"><li class="nav-item d-md-none mobile-menu ml-3 ml-md-4"><a href=javascript: id=sidebar-switch data-toggle=modal data-target=#sidebar><i class="iconfont icon-classification icon-2x"></i></a></li></ul></div></div></div><div class="placeholder compact-header-placeholder"></div></div><div id=content class="content-site customize-site ndh-article-page"><div class=container-fluid><div class=ndh-article-wrap><div class=ndh-article-card><header class=ndh-article-header><a class=ndh-article-back href=../../><i class="fa fa-angle-left" aria-hidden=true></i>
58<span>返回</span></a><h1 class=ndh-article-title>JsDelivr-CDN加速访问服务部署</h1><div class=ndh-article-meta><span class=ndh-article-badge>2026-05-23</span>
59<a class="ndh-article-badge ndh-article-badge-tag" href=../../tags/CDN/>#CDN</a>
60<a class="ndh-article-badge ndh-article-badge-tag" href=../../tags/JsDelivr/>#JsDelivr</a></div></header><article class=ndh-article-content><p><img src=https://pub-966e34c3775840c796027a55f797ae41.r2.dev/e5641f1a-9fa8-45ac-a5c3-90f8f03dfe91.png alt></p><p>前言:这个服务本意是提供一些开发文件及图床的jsd代理加速,避免国内使用相关服务时无法访问或访问过慢,现提供两种高效使用该服务的部署方式,如果你在使用中有问题,也可以留言反馈</p><h2 id=服务介绍>服务介绍</h2><p>主要把常见的 <strong>GitHub / npm / unpkg</strong> 资源链接解析为 <strong>jsDelivr CDN</strong> 资源,并提供多种输出方式(直连/代理/跳转):</p><ul><li>
60带有安全管理体系,一键识别拉黑恶意攻击扫描IP,可自行设置解封时间</li><li>日志查看,包含登录删除等操作也会被记录,可设置保留日志的时间(自动清理)</li><li>流量统计,可显示近 30 天流量汇总(字节/请求数)与 Top使用列表</li><li>页面设置,带有公告设置及网站标题、icon的设置,公告支持md、txt、html写法</li></ul><h2 id=在线使用>在线使用</h2><p>访问:https://jsd.cdn.noisework.cn</p><h2 id=功能与特性>功能与特性</h2><ul><li>支持链接识别与转换<ul><li>GitHub:<code>raw.githubusercontent.com</code> / <code>github.com/.../blob/...</code> / <code>github.com/.../raw/...</code></li><li>npm:<code>unpkg.com</code></li><li>jsDelivr CDN:<code>cdn.jsdelivr.net/gh/...</code> / <code>cdn.jsdelivr.net/npm/...</code>(可直接作为上游)</li><li>简写<ul><li><code>gh:owner/repo@ref/path/to/file.ext</code></li><li><code>npm:pkg@ver/path/to/file.ext</code>(支持作用域包:<code>npm:@scope/pkg@ver/path/to/file.ext</code>)</li></ul></li></ul></li><li>输出方式<ul><li><code>/gh/&lt;owner>/&lt;repo>@&lt;ref>/&lt;path></code>:同路径直连(服务端代理 jsDelivr 并返回内容;推荐图床/跨域)</li><li><code>/npm/&lt;pkg>@&lt;ver>/&lt;path></code>:同路径直连(服务端代理 jsDelivr 并返回内容;推荐图床/跨域)</li><li><code>/cdn?url=...</code>:代理输出(同样返回内容,适合"只能用 query 参数"的场景)</li><li><code>/r?url=...</code>:Redirect(302 跳转到 jsDelivr)</li><li><code>/u?url=...</code>:仅解析,返回 JSON(首页/前端页面使用)</li></ul></li><li>安全策略(Proxy)<ul><li>仅允许代理 jsDelivr 官方域名:<code>cdn.jsdelivr.net</code>、<code>fastly.jsdelivr.net</code></li><li>默认开启 <code>Access-Control-Allow-Origin: *</code>,适合图片/静态资源跨域引用</li></ul></li><li>缓存策略(Proxy)<ul><li>若 URL ref 识别为"稳定版本"(例如 commit sha 或 semver),会返回长期缓存</li><li>若为 <code>main/master/latest</code> 等不稳定 ref,默认短缓存</li></ul></li></ul><p><img src=https://cdn.jsdelivr.net/gh/rcy1314/phototc@main/uPic/1779527661941.png alt=1779527661941></p><h2 id=一docker-部署>一、Docker 部署</h2><pre tabindex=0><code>docker pull noise233/jsd-noise:latest
61</code></pre><p>推荐按下面这样跑(首次会自动创建并初始化 <code>/app/data/app.db</code>;以后复用旧数据直接沿用该目录即可):</p><pre tabindex=0><code>docker run -d \
62  --name jsd-noise \
63  -p 5011:5011 \
64  -v &#34;$(pwd)/data:/app/data&#34; \
65  -e PORT=5011 \
66  -e DB_PATH=/app/data/app.db \
67  -e TZ=Asia/Shanghai \
68  noise233/jsd-noise:latest
69</code></pre><p>默认首次注册的用户为管理员,如果你有旧数据如在/opt/jsd/文件夹中,则使用 <code>-v /opt/jsd:/app/data \</code>即可</p><p>你也可以一键部署在zeabur或fly.io等无服务器平台</p><p><img src=https://cdn.jsdelivr.net/gh/rcy1314/phototc@main/uPic/1779527616400.png alt=1779527616400></p><h2 id=二nginx>二、Nginx</h2><p>适用于服务器轻量化使用,可直接在宝塔面板一键修改网站配置文件,将下面代码复制后修改必要的文件路径即可,已经配置了缓存时间及文件大小限制,可自行修改</p><p>网站首页文件:https://noise.lanzoul.com/iJdlt3q5tokd</p><p>功能同上述,但没有后台</p><p>配置文件代码:</p><pre tabindex=0><code>server {
70    # ===== 监听端口(同时支持 HTTP/HTTPS 和 IPv4/IPv6) =====
71    listen 80;
72    listen 443 ssl http2;
73    listen [::]:80;
74    listen [::]:443 ssl http2;
75
76    # ===== 域名(请替换为你自己的站点域名) =====
77    server_name cdn.example.com www.cdn.example.com;  # 替换为你的真实域名
78
79    # ===== 网站根目录(用于本机资源,如 /custom_413.html) =====
80    # 如果你的项目不在默认宝塔目录,请一并修改这里
81    root /www/wwwroot/cdn.example.com;  # 替换为你的实际站点根目录
82
83    # ===== 宝塔扩展配置目录(如伪静态、重写规则等) =====
84    # 路径中的域名也需要同步替换
85    include /www/server/panel/vhost/nginx/extension/cdn.example.com/*.conf;
86
87    #CERT-APPLY-CHECK--START
88    # 用于 SSL 证书申请时的文件验证相关配置 —— 请勿删除
89    include /www/server/panel/vhost/nginx/well-known/cdn.example.com.conf;
90    #CERT-APPLY-CHECK--END
91
92    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
93    #error_page 404/404.html;
94
95    #HTTP_TO_HTTPS_START
96    # 自动将 HTTP 跳转到 HTTPS(.well-known 除外,用于证书申请验证)
97    set $isRedcert 1;
98    if ($server_port != 443) {
99        set $isRedcert 2;
100    }
101    if ( $uri ~ /\.well-known/ ) {
102        set $isRedcert 1;
103    }
104    if ($isRedcert != 1) {
105        rewrite ^(/.*)$ https://$host$1 permanent;
106    }
107    #HTTP_TO_HTTPS_END
108
109    # ===== SSL 证书与参数 =====
110    # 证书路径同样需要替换为你的域名对应路径
111    ssl_certificate     /www/server/panel/vhost/cert/cdn.example.com/fullchain.pem;
112    ssl_certificate_key /www/server/panel/vhost/cert/cdn.example.com/privkey.pem;
113
114    # 【安全建议】
115    # 当前配置包含 TLSv1/TLSv1.1,已属于不安全协议,建议只保留 TLSv1.2 TLSv1.3
116    # 参考各类安全基线,仅启用现代 TLS 版本
117    ssl_protocols TLSv1.2 TLSv1.3;  # 建议去掉 TLSv1 TLSv1.1
118
119    # 【安全建议】
120    # cipher 套件建议按 Mozilla Intermediate 规范更新,例如只保留带 ECDHE+AES-GCM/ChaCha20 的套件
121    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:EECDH+AES256:RSA+AES128:RSA+AES256:!MD5;
122    ssl_prefer_server_ciphers on;
123
124    ssl_session_cache shared:SSL:10m;
125    ssl_session_timeout 10m;
126
127    # HSTS:告诉浏览器未来一年只使用 HTTPS 访问本站
128    add_header Strict-Transport-Security &#34;max-age=31536000&#34;;
129
130    # 当客户端使用 HTTP 请求 HTTPS 端口时,Nginx 返回 497,这里跳转为 HTTPS
131    error_page 497 https://$host$request_uri;
132
133    # ===== 首页规则 =====
134    location = / {
135        # 如果主页是 PHP 项目,一般改为 index.php index.html
136        index index.html;  # 根据实际情况调整为 index.php index.html 等
137    }
138
139    # ===== 通用请求处理:先尝试本地文件,否则走反向代理 =====
140    location / {
141        try_files $uri $uri/ @proxy;
142    }
143
144    # ===== 反向代理 jsdelivr CDN 的核心逻辑 =====
145    location @proxy {
146        # 上游:jsdelivr CDN
147        proxy_pass https://cdn.jsdelivr.net;
148
149        # 确保 SNI 匹配 jsdelivr(尤其是共享 IP / CDN 场景)
150        proxy_ssl_server_name on;
151
152        # 传递客户端真实信息给上游
153        proxy_set_header Host cdn.jsdelivr.net;
154        proxy_set_header X-Real-IP $remote_addr;
155        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
156        proxy_set_header REMOTE-HOST $remote_addr;
157
158        # 支持 WebSocket / 保持长连接
159        proxy_http_version 1.1;
160        proxy_set_header Upgrade $http_upgrade;
161        proxy_set_header Connection $connection_upgrade;
162
163        # 显示缓存命中状态(调试用,可按需注释)
164        add_header X-Cache $upstream_cache_status;
165
166        # ===== 服务端缓存配置 =====
167        # 忽略上游某些控制头,让 Nginx 自己决定缓存策略
168        # 说明:忽略 Cache-Control / Expires 可以让 Nginx 按自身规则缓存;
169        #       忽略 Set-Cookie 是因为 jsdelivr 基本不会在静态资源上用 Cookie,
170        #       但如果有敏感会话信息,需谨慎评估是否真的要忽略。
171        proxy_ignore_headers Set-Cookie Cache-Control expires;
172
173        # 使用共享内存区域 cache_one 作为缓存空间
174        # 注意:需要在 http 块中提前定义 proxy_cache_path,例如:
175        #   proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_one:100m inactive=180d max_size=10g;
176        proxy_cache cache_one;
177        proxy_cache_key $host$uri$is_args$args;
178
179        # 缓存正常响应和重定向
180        proxy_cache_valid 200 304 301 302 1440m;
181
182        # 防止大文件回源时占用过多磁盘/带宽
183        proxy_max_temp_file_size 5m;
184
185        # 拦截上游错误码,交给 error_page 处理
186        proxy_intercept_errors on;
187
188        # 自定义 413 错误页面(实体过大)
189        error_page 413 /custom_413.html;
190
191        # ===== 客户端缓存控制(浏览器端) =====
192        # 对常见静态资源设置较长过期时间,减轻服务器压力
193        if ($uri ~* &#34;\.(gif|mp4|mp3|png|jpg|css|js|webp)$&#34;) {
194            expires 2M;  # 浏览器缓存 2 个月
195        }
196    }
197
198    # ===== 自定义 413 页面(请求体过大) =====
199    # 注意:Nginx 对 413 的自定义错误页有特殊限制,
200    #       需要确保所在 location 的 client_max_body_size 大于实际限制,
201    #       否则 error_page 可能不会生效,仍会返回默认 413 页面。
202    location = /custom_413.html {
203        root /www/wwwroot/cdn.example.com;  # 与 server.root 保持一致,或单独指定
204        internal;          # 只允许内部重定向访问
205        default_type text/html;
206        return 200 &#39;文件超过5MB,不予返回!&#39;;
207    }
208}
209</code></pre><p>使用时需要做的几件事:</p><ol><li>把所有 <code>cdn.example.com</code> / <code>www.cdn.example.com</code> 替换为你自己的域名。</li><li>把 <code>/www/wwwroot/cdn.example.com</code> 和证书路径替换为你实际的路径。</li><li>在 <code>http</code> 块中添加 <code>proxy_cache_path</code> 定义(示例里是 <code>cache_one</code>),例如:</li></ol><pre tabindex=0><code>   proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_one:100m inactive=180d max_size=10g;
210</code></pre><p>如果你不想使用我的首页文件而自建的是 PHP 项目,把 <code>index.html</code> 改成 <code>index.php</code>。</p></article><nav class=ndh-article-nav aria-label=文章导航><a class="ndh-article-nav-link ndh-article-nav-prev" href=posts/%E4%BD%BF%E7%94%A8Studio%E6%9C%AC%E5%9C%B0%E5%BF%AB%E9%80%9F%E6%9E%84%E5%BB%BAwordpress/><span class=ndh-article-nav-k>上一篇</span>
211<span class=ndh-article-nav-t>使用Studio本地快速构建wordpress</span>
212</a><a class="ndh-article-nav-link ndh-article-nav-next" href=posts/Cloudflare%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%89%E5%85%A8%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE/><span class=ndh-article-nav-k>下一篇</span>
213<span class=ndh-article-nav-t>Cloudflare自定义安全规则配置</span></a></nav></div></div></div></div><style>.ndh-article-wrap{max-width:980px;margin:0 auto;padding:14px 12px 26px;box-sizing:border-box}.ndh-article-card{border:2px dashed rgba(18,21,33,.22);border-radius:22px;background-color:rgba(255,255,255,.94);background-image:linear-gradient(0deg,rgba(0,0,0,.018),transparent 34%),repeating-linear-gradient(90deg,rgba(0,0,0,.012),rgba(0,0,0,.012) 1px,transparent 1px,transparent 12px),repeating-linear-gradient(0,rgba(0,0,0,1%),rgba(0,0,0,1%) 1px,transparent 1px,transparent 14px);padding:18px 18px 16px;box-shadow:0 10px rgba(17,20,34,.1),0 22px 44px rgba(0,0,0,.1);position:relative;overflow:hidden}body.io-black-mode .ndh-article-card{border-color:var(--ndh-border-soft);background-color:rgba(20,20,20,.92);background-image:linear-gradient(0deg,rgba(255,255,255,2%),rgba(255,255,255,0) 34%),repeating-linear-gradient(90deg,rgba(255,255,255,.018),rgba(255,255,255,.018) 1px,transparent 1px,transparent 12px),repeating-linear-gradient(0,rgba(255,255,255,.014),rgba(255,255,255,.014) 1px,transparent 1px,transparent 14px);box-shadow:0 10px rgba(2,4,12,.32),0 26px 60px rgba(0,0,0,.58)}.ndh-article-card::before{content:'';position:absolute;top:-12px;left:50%;transform:translateX(-50%)rotate(-2.6deg);width:132px;height:34px;border-radius:10px;background:rgba(255,255,255,.64);border:1px solid rgba(18,21,33,.12);box-shadow:0 14px 30px rgba(0,0,0,.12);pointer-events:none}body.io-black-mode .ndh-article-card::before{background:rgba(255,255,255,8%);border-color:var(--ndh-border-soft);box-shadow:0 16px 36px rgba(0,0,0,.55)}.ndh-article-card::after{content:'';position:absolute;right:0;bottom:0;width:0;height:0;border-style:solid;border-width:0 0 56px 56px;border-color:transparent transparent rgba(0,0,0,8%)transparent;pointer-events:none;opacity:.9}body.io-black-mode .ndh-article-card::after{border-color:transparent transparent rgba(255,255,255,.1)transparent;opacity:.8}.ndh-article-header{padding-bottom:14px;border-bottom:1px dashed rgba(18,21,33,.18)}body.io-black-mode .ndh-article-header{border-bottom-color:var(--ndh-border-soft)}.ndh-article-back{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px 999px 999px 10px;border:2px solid rgba(18,21,33,.18);background:rgba(83,128,255,8%);color:rgba(19,32,63,.86);text-decoration:none;font-weight:800;line-height:1;box-shadow:0 6px rgba(17,20,34,.1);-webkit-tap-highlight-color:transparent}body.io-black-mode .ndh-article-back{border-color:var(--ndh-border-soft);background:rgba(143,184,255,.12);color:var(--ndh-text-strong);box-shadow:0 6px rgba(2,4,12,.28)}.ndh-article-back:hover{text-decoration:none;color:rgba(19,32,63,.92);transform:translateY(-1px)}body.io-black-mode .ndh-article-back:hover{color:var(--ndh-text-strong)}.ndh-article-title{margin:14px 0 10px;font-size:1.6rem;line-height:1.2;font-weight:900;color:#182039;word-break:break-word}body.io-black-mode .ndh-article-title{color:var(--ndh-text-strong)}.ndh-article-meta{display:flex;flex-wrap:wrap;gap:8px;margin:0}.ndh-article-badge{display:inline-flex;align-items:center;padding:3px 9px;border-radius:999px;border:1px solid rgba(18,21,33,.12);background:rgba(17,24,39,4%);color:rgba(19,32,63,.74);font-size:.78rem;font-weight:800;line-height:1.2;text-decoration:none;-webkit-tap-highlight-color:transparent}body.io-black-mode .ndh-article-badge{border-color:var(--ndh-border-soft);background:rgba(255,255,255,6%);color:rgba(238,243,255,.82)}.ndh-article-badge-tag{border-color:rgba(33,79,211,.2);background:rgba(33,79,211,8%);color:rgba(33,79,211,.92)}body.io-black-mode .ndh-article-badge-tag{border-color:rgba(143,184,255,.22);background:rgba(143,184,255,.12);color:rgba(219,237,248,.92)}.ndh-article-badge-update{border-color:rgba(241,150,0,.22);background:rgba(241,150,0,.1);color:rgba(160,92,0,.92)}body.io-black-mode .ndh-article-badge-update{border-color:rgba(255,201,56,.26);background:rgba(255,201,56,.14);color:rgba(255,232,170,.92)}.ndh-article-content{padding-top:16px;color:rgba(19,32,63,.88);font-size:16px;line-height:1.85;overflow-wrap:break-word}body.io-black-mode .ndh-article-content{color:rgba(238,243,255,.86)}.ndh-article-content a{color:#214fd3;text-decoration:none;pointer-events:auto}body.io-black-mode .ndh-article-content a{color:var(--ndh-accent)}.ndh-article-content a:hover{text-decoration:underline}.ndh-article-content img{max-width:100%;height:auto;display:block;margin:14px auto;border-radius:14px;border:1px solid rgba(18,21,33,.1)}body.io-black-mode .ndh-article-content img{border-color:var(--ndh-border-soft)}.ndh-article-content h2,.ndh-article-content h3,.ndh-article-content h4{margin:22px 0 10px;line-height:1.3;color:#182039;font-weight:900}body.io-black-mode .ndh-article-content h2,body.io-black-mode .ndh-article-content h3,body.io-black-mode .ndh-article-content h4{color:var(--ndh-text-strong)}.ndh-article-content p{margin:0 0 14px}.ndh-article-content ul,.ndh-article-content ol{margin:0 0 14px;padding-left:1.35em}.ndh-article-content blockquote{margin:14px 0;padding:10px 12px;border-left:4px solid rgba(33,79,211,.28);background:rgba(33,79,211,6%);border-radius:12px}body.io-black-mode .ndh-article-content blockquote{border-left-color:rgba(143,184,255,.28);background:rgba(143,184,255,.1)}.ndh-article-content pre{margin:14px 0;padding:34px 14px 12px;border-radius:14px;border:1px solid rgba(18,21,33,.1);background:rgba(17,24,39,4%);overflow:auto;-webkit-overflow-scrolling:touch;position:relative}body.io-black-mode .ndh-article-content pre{border-color:var(--ndh-border-soft);background:rgba(255,255,255,6%)}.ndh-article-content code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,liberation mono,courier new,monospace;font-size:.92em}.ndh-article-content :not(pre)>code{padding:.08em .36em;border-radius:8px;border:1px solid rgba(18,21,33,.1);background:rgba(17,24,39,4%)}body.io-black-mode .ndh-article-content :not(pre)>code{border-color:var(--ndh-border-soft);background:rgba(255,255,255,6%)}.ndh-code-copy-btn{position:absolute;top:10px;right:10px;width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:10px;border:1px solid rgba(18,21,33,.12);background:rgba(255,255,255,.72);color:rgba(19,32,63,.78);cursor:pointer;padding:0;opacity:0;transition:opacity .12s ease,transform .12s ease,background-color .12s ease,color .12s ease;-webkit-tap-highlight-color:transparent}.ndh-code-copy-btn:hover{opacity:1;transform:translateY(-1px);background:rgba(83,128,255,.12);color:rgba(33,79,211,.92)}.ndh-code-copy-btn:active{transform:translateY(1px)}.ndh-article-content pre:hover .ndh-code-copy-btn{opacity:1}@media(hover:none){.ndh-code-copy-btn{opacity:1}}body.io-black-mode .ndh-code-copy-btn{border-color:var(--ndh-border-soft);background:rgba(255,255,255,8%);color:rgba(238,243,255,.8)}body.io-black-mode .ndh-code-copy-btn:hover{background:rgba(143,184,255,.14);color:rgba(219,237,248,.92)}.ndh-code-copy-btn svg{width:16px;height:16px;fill:currentColor}.ndh-article-content table{display:block;width:100%;overflow:auto;border-collapse:collapse;margin:14px 0;border-radius:14px;border:1px solid rgba(18,21,33,.1)}body.io-black-mode .ndh-article-content table{border-color:var(--ndh-border-soft)}.ndh-article-content th,.ndh-article-content td{padding:10px 12px;border-bottom:1px dashed rgba(18,21,33,.12);vertical-align:top}body.io-black-mode .ndh-article-content th,body.io-black-mode .ndh-article-content td{border-bottom-color:var(--ndh-border-soft)}.ndh-article-nav{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:18px;padding-top:14px;border-top:1px dashed rgba(18,21,33,.18)}body.io-black-mode .ndh-article-nav{border-top-color:var(--ndh-border-soft)}.ndh-article-nav-link{display:flex;flex-direction:column;gap:4px;padding:12px;border-radius:18px;border:2px dashed rgba(18,21,33,.2);background:rgba(255,255,255,.56);text-decoration:none;min-width:0;box-shadow:0 10px 22px rgba(0,0,0,.1)}body.io-black-mode .ndh-article-nav-link{border-color:var(--ndh-border-soft);background:rgba(255,255,255,6%);box-shadow:0 14px 30px rgba(0,0,0,.55)}.ndh-article-nav-link:hover{text-decoration:none;border-color:rgba(33,79,211,.26)}body.io-black-mode .ndh-article-nav-link:hover{border-color:rgba(143,184,255,.26)}.ndh-article-nav-prev{text-align:left}.ndh-article-nav-next{text-align:right}.ndh-article-nav-k{font-size:.76rem;font-weight:900;color:rgba(19,32,63,.66)}body.io-black-mode .ndh-article-nav-k{color:rgba(238,243,255,.7)}.ndh-article-nav-t{font-size:.92rem;font-weight:800;color:rgba(19,32,63,.92);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}body.io-black-mode .ndh-article-nav-t{color:var(--ndh-text-strong)}@media(max-width:768px){#content.ndh-article-page>.container-fluid{padding-left:0;padding-right:0}.ndh-article-wrap{max-width:100%;padding-left:10px;padding-right:10px}.ndh-article-card{padding:16px 14px 14px;border-radius:18px}.ndh-article-title{font-size:1.38rem}.ndh-article-nav{grid-template-columns:1fr}}</style>
213<script>(function(){var e=document.querySelector(".ndh-article-content");if(!e)return;e.querySelectorAll("a[href]").forEach(function(e){var t=e.getAttribute("href")||"";if(!t)return;if(t[0]==="#")return;if(t.indexOf("mailto:")===0)return;if(t.indexOf("tel:")===0)return;if(t.indexOf("javascript:")===0)return;e.setAttribute("target","_blank"),e.setAttribute("rel","noopener noreferrer")});function t(){var e=["#aiChatBtn img","#aiChatPanel .ai-chat-logo img","#aiChatPanel .ai-welcome-icon img",".navbar-brand img"];e.forEach(function(e){document.querySelectorAll(e).forEach(function(e){if(!e)return;var t=e.getAttribute("src")||"";if(!t)return;if(/^(https?:)?\/\//i.test(t))return;if(t.indexOf("data:")===0)return;if(t.indexOf("blob:")===0)return;if(t[0]==="/")return;if(t.indexOf("../")!==0&&t.indexOf("..\\")!==0)return;try{e.setAttribute("src",new URL(t,window.location.href).toString())}catch{}})})}function n(){var e="";try{e=document.baseURI||""}catch{}e||(e="./"),e=String(e).replace(/#.*$/,""),window.location&&window.location.protocol==="file:"&&/\/$/.test(e)&&(e=e+"index.html"),document.querySelectorAll(".content-header-menu a[href]").forEach(function(t){t.addEventListener("click",function(n){try{var o,s=t.getAttribute("href")||"";if(!s)return;if(s[0]!=="#")return;n.preventDefault(),n.stopPropagation(),o=e+s,window.location.href=o}catch{}},!0)})}function s(){var e="";try{e=document.baseURI||""}catch{}e||(e="./"),e=String(e).replace(/#.*$/,""),window.location&&window.location.protocol==="file:"&&/\/$/.test(e)&&(e=e+"index.html"),document.querySelectorAll("#sidebar a[href]").forEach(function(t){try{var n=t.getAttribute("href")||"";if(!n)return;if(n[0]!=="#")return;t.removeAttribute("onclick"),t.addEventListener("click",function(t){try{t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation();var s=e+n;window.location.href=s}catch{}},!0)}catch{}})}function o(e){var t=String(e||"");return t?navigator.clipboard&&typeof navigator.clipboard.writeText=="function"?navigator.clipboard.writeText(t).then(function(){return!0},function(){return!1}):new Promise(function(e){try{var s,n=document.createElement("textarea");n.value=t,n.setAttribute("readonly","readonly"),n.style.position="fixed",n.style.top="-1000px",n.style.left="-1000px",document.body.appendChild(n),n.select(),s=document.execCommand("copy"),n.remove(),e(!!s)}catch{e(!1)}}):Promise.resolve(!1)}e.querySelectorAll("pre > code").forEach(function(e){var t,n=e&&e.parentElement?e.parentElement:null;if(!n)return;if(n.querySelector(".ndh-code-copy-btn"))return;t=document.createElement("button"),t.type="button",t.className="ndh-code-copy-btn",t.setAttribute("aria-label","复制代码"),t.setAttribute("title","复制"),t.innerHTML='<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M16 1H6a2 2 0 0 0-2 2v12h2V3h10V1zm3 4H10a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2zm0 16h-9V7h9v14z"/></svg>',t.addEventListener("click",function(n){n.preventDefault(),n.stopPropagation();var s=e.textContent||"";o(s).then(function(e){t.setAttribute("title",e?"已复制":"复制失败"),window.setTimeout(function(){t.setAttribute("title","复制")},900)})}),n.appendChild(t)}),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){t(),n(),s()}):(t(),n(),s())})()</script>
213<footer class="main-footer footer-type-1 text-xs"><div id=footer-tools class="d-flex flex-column"><a href=javascript: id=go-to-up class="btn rounded-circle go-up m-1" rel=go-top><i class="iconfont icon-to-up"></i>
214</a><a href=javascript:void(0); id=aiChatBtn class="btn rounded-circle kefu m-1" data-toggle=tooltip data-placement=left title=AI助手><img src=../../assets/images/favicon4.png alt=AI>
215<span class=ai-btn-label>AI</span>
216</a><a href=tougao class="btn rounded-circle kefu m-1" target=_blank data-toggle=tooltip data-placement=left title=投稿><i class="fa fa-paper-plane"></i></a><div id=toggleSection class=toggle-section><a href=javascript:void(0); id=forceReloadBtn class="btn rounded-circle kefu m-1" data-toggle=tooltip data-placement=left title=强制刷新并重新缓存><i class="fa fa-refresh" aria-hidden=true></i>
217</a><a href=https://www.noisework.cn/lianxi/weixin.png class="btn rounded-circle kefu m-1" target=_blank data-toggle=tooltip data-placement=left title=联系我><i class="far fa-comment-dots"></i>
218</a><a href=./invalidlinks/ class="btn rounded-circle kefu m-1" target=_blank data-toggle=tooltip data-placement=left title=失效检测记录><i class="fa fa-question-circle"></i>
219</a><a href=./bookmarks.html class="btn rounded-circle kefu m-1" data-action=download-bookmarks download=bookmarks.html target=_blank data-toggle=tooltip data-placement=left title=导出为书签文件><i class="fa fa-download"></i></a></div><a href=javascript:void(0); id=toggleButton class="btn rounded-circle m-1" data-toggle=tooltip data-placement=left title=展开/折叠><i class="fa fa-plus-circle"></i>
220</a><a href=javascript: onclick=switchNightMode() class="btn rounded-circle switch-dark-mode m-1" id=yejian-day data-toggle=tooltip data-placement=left title=日间模式><i class="mode-ico iconfont icon-night"></i></a></div><div id=forceReloadTip class=force-reload-tip style=display:none><div class=force-reload-title>⚡页面刷新提示</div><div class=force-reload-desc>如遇页面异常、内容未更新或缓存问题,可点击右下角折叠选项中
221<b><i class="fa fa-refresh" aria-hidden=true></i> 强制刷新</b> 按钮,清除缓存并重新加载页面。</div><div class=force-reload-actions><label class="force-reload-label custom-checkbox-label" style=margin-right:10px><input type=checkbox id=neverShowForceReloadTip class="force-reload-checkbox custom-checkbox-input">
222<span class=custom-checkbox></span>
223不再提示
224</label><button id=closeForceReloadTip class=force-reload-btn>我知道了</button></div></div><style>.gradient-text{color:rgba(24,32,57,.82);font-weight:650}@supports(-webkit-background-clip:text){.gradient-text{background:linear-gradient(90deg,rgba(33,79,211,.95),rgba(241,64,75,.92),rgba(255,183,77,.92));background-size:220% 100%;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:footer-gradient 6s ease-in-out infinite}}body.io-black-mode .gradient-text{color:rgba(238,243,255,.92);text-shadow:0 1px 0 rgba(0,0,0,.35)}@supports(-webkit-background-clip:text){body.io-black-mode .gradient-text{background:linear-gradient(90deg,rgba(255,255,255,.98),rgba(143,184,255,.96),rgba(255,215,111,.96));background-size:240% 100%;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:footer-gradient 6s ease-in-out infinite}}@keyframes footer-gradient{0%{background-position:0}100%{background-position:100%}}.toggle-section{display:none;transition:all .3s ease}.toggle-section.show{display:block}#toggleButton .fa-plus-circle{transition:transform .3s ease}#toggleButton.active .fa-plus-circle{transform:rotate(45deg)}.force-reload-tip{display:none;position:fixed;z-index:99999;bottom:40px;right:80px;padding:12px 18px 16px;border-radius:12px;box-shadow:0 14px 34px rgba(0,0,0,.18);font-size:14px;max-width:320px;min-width:180px;word-break:break-word;line-height:1.5;transform:rotate(-1.2deg);backdrop-filter:none}.force-reload-tip:before{content:'';position:absolute;top:-10px;left:18px;width:74px;height:22px;border-radius:7px;transform:rotate(-6deg);pointer-events:none}.force-reload-tip:after{content:'';position:absolute;right:0;bottom:0;width:0;height:0;border-style:solid;border-width:0 0 22px 22px;pointer-events:none}.io-grey-mode .force-reload-tip{background:#fffdf2;color:#1f1f1f;border:1px solid rgba(0,0,0,8%)}.io-grey-mode .force-reload-tip:before{background:rgba(255,255,255,.65);border:1px solid rgba(0,0,0,8%);box-shadow:0 8px 18px rgba(0,0,0,.12)}.io-grey-mode .force-reload-tip:after{border-color:transparent transparent rgba(0,0,0,.1)transparent}.io-black-mode .force-reload-tip{background:#1f1f1f;color:rgba(255,255,255,.92);border:1px solid rgba(255,255,255,.12);box-shadow:0 14px 34px rgba(0,0,0,.45)}.io-black-mode .force-reload-tip:before{background:rgba(255,255,255,8%);border:1px solid rgba(255,255,255,.12);box-shadow:0 10px 22px rgba(0,0,0,.35)}.io-black-mode .force-reload-tip:after{border-color:transparent transparent rgba(255,255,255,.16)transparent}.force-reload-title{font-weight:700;margin-bottom:6px;font-size:15px}.force-reload-desc{font-size:13px;line-height:1.5;margin-bottom:8px}.force-reload-actions{margin-top:6px;text-align:right;display:flex;flex-wrap:wrap;align-items:center;gap:8px;justify-content:flex-end}.force-reload-btn{background:#ea660e;color:#fff;border:none;padding:2px 10px;border-radius:5px;cursor:pointer;font-size:13px}.io-grey-mode .force-reload-btn{box-shadow:0 8px 18px rgba(0,0,0,.14)}.io-black-mode .force-reload-btn{box-shadow:0 10px 22px rgba(0,0,0,.35)}.force-reload-label{font-size:12px;cursor:pointer;display:flex;align-items:center;margin-left:0;user-select:none;position:relative}.custom-checkbox-input{opacity:0;width:0;height:0;position:absolute}.custom-checkbox{width:16px;height:16px;border:2px solid #ea660e;border-radius:4px;display:inline-block;margin-right:6px;position:relative;transition:border-color .2s}.io-grey-mode .custom-checkbox{background:rgba(0,0,0,6%)}.io-black-mode .custom-checkbox{background:rgba(255,255,255,8%)}.custom-checkbox-input:checked+.custom-checkbox{background:#ea660e;border-color:#ea660e}.custom-checkbox-input:checked+.custom-checkbox:after{content:'';position:absolute;
224left:4px;top:0;width:5px;height:10px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}.custom-checkbox-label{position:relative;padding-left:0}.force-reload-checkbox{display:none}@media(max-width:480px){.force-reload-tip{right:12vw;left:unset;bottom:4vw;padding:10px 12px 14px;font-size:12px;min-width:unset;max-width:80vw}.force-reload-title{font-size:13px}.force-reload-desc{font-size:11px;margin-bottom:6px}.force-reload-btn{font-size:12px;padding:2px 8px}.force-reload-label{font-size:11px}.custom-checkbox{width:14px;height:14px;margin-right:4px}}.ai-chat-panel{--ai-panel-bg:#ffffff;--ai-border:rgba(18, 21, 33, 0.82);--ai-surface:#ffffff;--ai-surface-muted:#f6f8ff;--ai-bubble-bg:#ffffff;--ai-bubble-border:rgba(18, 21, 33, 0.22);--ai-code-bg:#e9eefc;--ai-blockquote-bg:#eef2ff;--ai-warn-bg:#fff7e0;--ai-warn-border:#f0d7a2;--ai-error-bg:#ffe9ea;--ai-error-border:#f6b5b8;--ai-grid-line:rgba(18, 21, 33, 0.08);display:flex;position:fixed;bottom:80px;right:72px;width:460px;min-width:320px;max-width:min(560px,calc(100vw - 92px));height:560px;min-height:380px;border-radius:18px 18px 18px 12px;z-index:100000;flex-direction:column;overflow:hidden;transform:translateY(20px)scale(.95);opacity:0;visibility:hidden;transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .25s ease,visibility 0s .35s;pointer-events:none;background-color:var(--ai-panel-bg);background-image:linear-gradient(var(--ai-grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--ai-grid-line) 1px,transparent 1px);background-size:18px 18px;border:2px solid var(--ai-border);box-shadow:6px 6px rgba(17,20,34,.14),0 18px 40px rgba(71,90,148,.1)}.ai-chat-panel::before{content:"";position:absolute;top:-6px;left:50%;width:96px;height:28px;border-radius:10px;background:#fff5bb;border:1px solid rgba(18,21,33,.1);box-shadow:0 6px 12px rgba(103,121,165,.1);transform:translateX(-50%)rotate(-4deg);z-index:0;pointer-events:none}.ai-chat-panel.open{transform:translateY(0)scale(1);opacity:1;visibility:visible;transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .25s ease,visibility 0s 0s;pointer-events:auto}.ai-chat-panel.dragging,.ai-chat-panel.resizing{transition:none!important}.ai-resize-handle{position:absolute;bottom:0;right:0;width:20px;height:20px;cursor:nwse-resize;z-index:10;opacity:.4;transition:opacity .2s}.ai-resize-handle:hover{opacity:.8}.ai-resize-handle::before,.ai-resize-handle::after{content:'';position:absolute;background:var(--sticker-text-secondary);border-radius:1px}.ai-resize-handle::before{width:10px;height:2px;bottom:5px;right:3px;transform:rotate(-45deg)}.ai-resize-handle::after{width:6px;height:2px;bottom:3px;right:2px;transform:rotate(-45deg)}.ai-chat-logo img,.ai-welcome-icon img,.ai-thinking-avatar img{width:100%;height:100%;object-fit:cover;border-radius:inherit}.io-black-mode .ai-chat-panel{--ai-panel-bg:#141828;--ai-border:rgba(255, 255, 255, 0.14);--ai-surface:#141828;--ai-surface-muted:#1a2238;--ai-bubble-bg:#151b2f;--ai-bubble-border:rgba(255, 255, 255, 0.12);--ai-code-bg:#2b3556;--ai-blockquote-bg:#192040;--ai-warn-bg:#2a230f;--ai-warn-border:#5a4a20;--ai-error-bg:#3a1416;--ai-error-border:#5c1f24;--ai-grid-line:rgba(255, 255, 255, 0.06);background-color:var(--ai-panel-bg);background-image:linear-gradient(var(--ai-grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--ai-grid-line) 1px,transparent 1px);background-size:18px 18px;border-color:var(--ai-border);box-shadow:6px 6px rgba(2,4,12,.28),0 18px 44px rgba(2,4,12,.26)}.io-black-mode .ai-chat-panel::before{background:#22315a;border-color:rgba(255,255,255,.1);box-shadow:0 6px 12px rgba(2,4,12,.24)}.ai-chat-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px 12px;border-bottom:1px dashed var(--ai-border);flex-shrink:0;position:relative;z-index:2}.ai-chat-header-left{display:flex;align-items:center;gap:8px}.ai-chat-logo{width:32px;height:32px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:16px;color:#fff;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);box-shadow:0 4px 12px rgba(102,126,234,.3)}.ai-chat-logo.has-image{background:0 0!important;box-shadow:none!important}.ai-chat-logo i{font-size:inherit;color:inherit;line-height:1;display:inline-block}.ai-chat-logo img{width:100%;height:100%;object-fit:cover;border-radius:inherit}.io-black-mode .ai-chat-logo{background:linear-gradient(135deg,#8fb8ff 0%,#a78bfa 100%);box-shadow:0 4px 12px rgba(143,184,255,.2)}.io-black-mode .ai-chat-logo.has-image{background:0 0!important;box-shadow:none!important}.ai-chat-title{font-size:13px;font-weight:700;color:var(--sticker-text-strong)}.ai-mcp-badge{display:inline-flex;align-items:center;gap:3px;font-size:10px;font-weight:600;padding:2px 7px;border-radius:6px;letter-spacing:.5px}.io-grey-mode .ai-mcp-badge{background:rgba(53,92,255,.1);color:var(--sticker-accent)}.io-black-mode .ai-mcp-badge{background:rgba(143,184,255,.12);color:var(--sticker-accent)}.ai-chat-header-right{display:flex;gap:4px}.ai-chat-header-btn{width:30px;height:30px;border:none;border-radius:8px;
224cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:13px;transition:all .2s;background:0 0;color:var(--sticker-text-secondary)}.io-grey-mode .ai-chat-header-btn:hover{background:rgba(0,0,0,6%);color:var(--sticker-text-primary)}.io-black-mode .ai-chat-header-btn:hover{background:rgba(255,255,255,8%);color:var(--sticker-text-primary)}.ai-chat-settings{position:absolute;left:0;right:0;top:58px;bottom:0;padding:16px;overflow:auto;background:var(--ai-panel-bg);border-top:1px dashed var(--ai-border);z-index:3}.ai-settings-title{font-size:13px;font-weight:800;color:var(--sticker-text-strong);margin-bottom:6px}.ai-settings-desc{font-size:12px;color:var(--sticker-text-secondary);margin-bottom:14px}.ai-settings-grid{display:flex;flex-direction:column;gap:10px}.ai-settings-row{display:flex;gap:10px}.ai-settings-field{display:flex;flex-direction:column;gap:6px;width:100%}.ai-settings-field-half{flex:1}.ai-settings-label{font-size:12px;font-weight:700;color:var(--sticker-text-secondary)}.ai-settings-input{height:38px;padding:0 12px;border-radius:10px;border:1px solid var(--ai-border);background:var(--ai-surface-muted);color:var(--sticker-text-strong);outline:none}.ai-settings-input::placeholder{color:var(--sticker-text-secondary);opacity:.75}.ai-settings-actions{display:flex;gap:8px;margin-top:14px}.ai-settings-btn{height:36px;padding:0 12px;border-radius:10px;border:1px solid var(--ai-border);background:0 0;color:var(--sticker-text-strong);cursor:pointer;font-size:12px;font-weight:700}.ai-settings-btn-primary{background:var(--sticker-accent);border-color:transparent;color:#fff}.ai-chat-messages{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px;scroll-behavior:smooth}.ai-chat-messages::-webkit-scrollbar{width:4px}.ai-chat-messages::-webkit-scrollbar-thumb{border-radius:4px}.io-grey-mode .ai-chat-messages::-webkit-scrollbar-thumb{background:rgba(0,0,0,.12)}.io-black-mode .ai-chat-messages::-webkit-scrollbar-thumb{background:rgba(255,255,255,.1)}.ai-chat-welcome{text-align:center;padding:24px 12px}.ai-welcome-icon{width:56px;height:56px;border-radius:16px;display:inline-flex;align-items:center;justify-content:center;font-size:26px;color:#fff;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);box-shadow:0 8px 24px rgba(102,126,234,.3);margin-bottom:14px}.ai-welcome-icon.has-image{background:0 0!important;box-shadow:none!important}.ai-welcome-icon i{font-size:inherit;color:inherit;line-height:1;display:inline-block}.ai-welcome-icon img{width:100%;height:100%;object-fit:cover;border-radius:inherit}.io-black-mode .ai-welcome-icon{background:linear-gradient(135deg,#8fb8ff 0%,#a78bfa 100%);box-shadow:0 8px 24px rgba(143,184,255,.2)}.io-black-mode .ai-welcome-icon.has-image{background:0 0!important;box-shadow:none!important}.ai-welcome-title{font-size:14px;font-weight:700;color:var(--sticker-text-strong);margin-bottom:8px}.ai-welcome-text{font-size:13px;color:var(--sticker-text-secondary);line-height:1.6;white-space:pre-line;margin-bottom:16px}.ai-welcome-tips{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin-bottom:12px}.ai-tip-chip{display:inline-block;padding:6px 14px;border-radius:20px;font-size:12px;cursor:pointer;transition:all .2s;font-weight:500}.io-grey-mode .ai-tip-chip{background:var(--ai-surface-muted);color:var(--sticker-accent);border:1px solid var(--ai-border)}.io-grey-mode .ai-tip-chip:hover{background:var(--ai-surface);border-color:var(--ai-border)}.io-black-mode .ai-tip-chip{background:var(--ai-surface-muted);color:var(--sticker-accent);border:1px solid var(--ai-border)}.io-black-mode .ai-tip-chip:hover{background:var(--ai-surface);border-color:var(--ai-border)}.ai-welcome-notice{font-size:11px;color:#92400e;padding:6px 12px;border-radius:8px;margin-top:4px;background:var(--ai-warn-bg);border:1px solid var(--ai-warn-border)}.io-black-mode .ai-welcome-notice{color:#fbbf24}.ai-msg{display:flex;gap:8px;max-width:92%;animation:ai-msg-in .3s ease}@keyframes ai-msg-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.ai-msg.user{align-self:flex-end;flex-direction:row-reverse}.ai-msg-bubble-wrap{position:relative;display:inline-flex;max-width:100%}.ai-msg-copy{position:absolute;top:6px;right:6px;width:24px;height:24px;border-radius:8px;border:1px solid rgba(17,20,34,.12);background:rgba(255,255,255,.7);color:rgba(17,20,34,.78);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transform:translateY(-2px);transition:opacity .15s ease,transform .15s ease;z-index:3}.ai-msg:hover .ai-msg-copy{opacity:1;transform:translateY(0)}.ai-msg.user .ai-msg-copy{border-color:rgba(255,255,255,.22);background:rgba(17,20,34,.16);color:rgba(255,255,255,.92)}.io-black-mode .ai-msg-copy{border-color:rgba(255,255,255,.12);background:rgba(2,4,12,.35);color:rgba(238,243,255,.86)}@media(max-width:580px){.ai-msg-copy{opacity:1;transform:none}}.ai-msg-avatar{position:relative;width:34px;height:34px;border-radius:12px;display:flex;align-items:center;justify-content:center;padding:2px;font-size:12px;font-weight:900;flex-shrink:0;overflow:hidden;border:2px solid rgba(17,20,34,.92);background:linear-gradient(180deg,rgba(255,245,182,.98),rgba(255,214,132,.94));color:#111521;box-shadow:5px 5px rgba(17,20,34,.14)}.ai-msg-avatar::before,.ai-thinking-avatar::before{content:"";position:absolute;top:-4px;left:50%;width:14px;
224height:8px;border-radius:999px;background:rgba(255,255,255,.7);border:1px solid rgba(17,20,34,.12);transform:translateX(-50%)rotate(-6deg);pointer-events:none;z-index:2}.ai-msg-avatar[data-role=assistant],.ai-thinking-avatar{background:linear-gradient(180deg,rgba(255,244,177,.98),rgba(255,206,118,.94));color:#111521}.ai-msg-avatar[data-role=user]{background:linear-gradient(180deg,rgba(185,222,255,.98),rgba(129,188,255,.94));color:#10203d}.ai-msg-avatar[data-has-image=true],.ai-thinking-avatar[data-has-image=true]{padding:0;background:#fff}.ai-msg-avatar img,.ai-thinking-avatar img{position:relative;z-index:1;display:block;width:100%;height:100%;object-fit:cover;border-radius:inherit;background:rgba(255,255,255,.92)}.ai-avatar-label{position:relative;z-index:1;display:inline-flex;align-items:center;justify-content:center;min-width:100%;padding:0 4px;font-size:11px;line-height:1;letter-spacing:.08em;text-transform:uppercase;white-space:nowrap}.io-black-mode .ai-msg-avatar,.io-black-mode .ai-thinking-avatar{border-color:rgba(255,255,255,.12);box-shadow:5px 5px rgba(2,4,12,.28)}.io-black-mode .ai-msg-avatar::before,.io-black-mode .ai-thinking-avatar::before{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.12)}.io-black-mode .ai-msg-avatar[data-role=assistant],.io-black-mode .ai-thinking-avatar{background:linear-gradient(180deg,rgba(64,86,160,.98),rgba(36,52,104,.94));color:rgba(238,243,255,.96)}.io-black-mode .ai-msg-avatar[data-role=user]{background:linear-gradient(180deg,rgba(78,109,196,.98),rgba(47,74,146,.94));color:rgba(238,243,255,.96)}.ai-msg-body{padding:10px 14px;border-radius:14px;font-size:12px;line-height:1.65;word-break:break-word;overflow-x:auto;max-width:100%;box-sizing:border-box}.ai-msg-body.ai-msg-body-streaming{white-space:pre-wrap}.ai-msg.ai .ai-msg-body{border-top-left-radius:4px}.ai-msg.user .ai-msg-body{border-top-right-radius:4px}.io-grey-mode .ai-msg.ai .ai-msg-body{background:var(--ai-bubble-bg);color:var(--sticker-text-primary);border:2px solid var(--ai-bubble-border);box-shadow:4px 4px rgba(17,20,34,.12)}.io-grey-mode .ai-msg.user .ai-msg-body{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border:2px solid var(--ai-bubble-border);box-shadow:4px 4px rgba(17,20,34,.12)}.io-black-mode .ai-msg.ai .ai-msg-body{background:var(--ai-bubble-bg);color:var(--sticker-text-primary);border:2px solid var(--ai-bubble-border);box-shadow:4px 4px rgba(2,4,12,.28)}.io-black-mode .ai-msg.user .ai-msg-body{background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border:2px solid var(--ai-bubble-border);box-shadow:4px 4px rgba(2,4,12,.28)}.ai-msg-body h1,.ai-msg-body h2,.ai-msg-body h3,.ai-msg-body h4{margin:8px 0 4px;font-weight:700;color:var(--sticker-text-strong)}.ai-msg-body h3{font-size:13px}.ai-msg-body h4{font-size:12px}.ai-msg-body p{margin:4px 0;color:inherit}.ai-msg-body ul,.ai-msg-body ol{padding-left:18px;margin:4px 0}.ai-msg-body li{margin:2px 0}.ai-msg-body a{color:var(--sticker-accent);text-decoration:underline;text-underline-offset:2px}.ai-msg-body a:hover{opacity:.8}.ai-msg-body code{padding:1px 5px;border-radius:4px;font-size:12px;font-family:sf mono,Consolas,monospace}.io-grey-mode .ai-msg-body code{background:var(--ai-code-bg);color:#d63384}.io-black-mode .ai-msg-body code{background:var(--ai-code-bg);color:#f9a8d4}.ai-msg-body pre{margin:8px 0;padding:10px 12px;border-radius:8px;overflow-x:auto;max-width:100%;font-size:12px;word-break:break-all}.io-grey-mode .ai-msg-body pre{background:#f1f5f9;border:1px solid var(--ai-border)}.io-black-mode .ai-msg-body pre{background:#0f1424;border:1px solid var(--ai-border)}.ai-msg-body pre code{padding:0;background:0 0;color:inherit}.ai-msg-body blockquote{margin:6px 0;padding:6px 12px;border-left:3px solid var(--sticker-accent);border-radius:0 6px 6px 0;font-style:italic}.io-grey-mode .ai-msg-body blockquote{background:var(--ai-blockquote-bg)}.io-black-mode .ai-msg-body blockquote{background:var(--ai-blockquote-bg)}.ai-msg-body table{border-collapse:collapse;margin:6px 0;font-size:12px;width:100%}.ai-msg-body th,.ai-msg-body td{border:1px solid var(--ai-border);padding:4px 8px;text-align:left}.ai-msg-body th{font-weight:600;color:var(--sticker-text-strong)}.ai-msg-body hr{border:none;border-top:1px solid var(--ai-border);margin:8px 0}.ai-msg-body strong{font-weight:700;color:var(--sticker-text-strong)}.ai-search-card{display:block;padding:8px 12px;border-radius:14px 14px 14px 8px;margin:4px 0;text-decoration:none;transition:all .2s;max-width:100%;overflow:hidden;box-sizing:border-box}.io-grey-mode .ai-search-card{background:var(--ai-surface);border:2px solid var(--ai-border);box-shadow:6px 6px rgba(17,20,34,.14)}.io-grey-mode .ai-search-card:hover{background:var(--ai-surface-muted);transform:translateY(-2px)}.io-black-mode .ai-search-card{background:var(--ai-surface);border:2px solid var(--ai-border);box-shadow:6px 6px rgba(2,4,12,.28)}.io-black-mode .ai-search-card:hover{background:var(--ai-surface-muted);transform:translateY(-2px)}.ai-search-card-title{font-size:12px;font-weight:600;color:var(--sticker-accent)}.ai-search-card-desc{font-size:11px;color:var(--sticker-text-secondary);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ai-search-card-url{font-size:10px;color:var(--sticker-text-secondary);margin-top:2px;opacity:.7;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;display:block}.ai-search-pager{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;padding-top:10px;border-top:1px dashed var(--ai-border)}.ai-search-pager-info{font-size:11px;color:var(--sticker-text-secondary);opacity:.85;white-space:nowrap}.ai-search-pager-actions{display:inline-flex;align-items:center;gap:8px;flex-shrink:0}.ai-page-btn{height:30px;padding:0 10px;border-radius:10px;border:1px solid var(--ai-border);background:var(--ai-surface);color:var(--sticker-text-primary);font-size:12px;font-weight:600;cursor:pointer}.ai-page-btn:active{transform:scale(.98)}.ai-page-btn[disabled]{opacity:.45;cursor:not-allowed;transform:none}.ai-page-indicator{font-size:11px;color:var(--sticker-text-secondary);opacity:.85;white-space:nowrap}.ai-chat-thinking{display:flex;gap:8px;padding:8px 16px;border-top:1px solid var(--sticker-border-soft);flex-shrink:0}.ai-thinking-avatar{position:relative;width:34px;height:34px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:13px;padding:2px;color:#111521;flex-shrink:0}.ai-thinking-avatar i{font-size:inherit;color:inherit;line-height:1;display:inline-block}.ai-thinking-avatar .ai-avatar-label{font-size:10px}.ai-thinking-content{flex:1}.ai-thinking-label{font-size:12px;font-weight:600;color:var(--sticker-accent);margin-bottom:4px}.ai-thinking-dots{display:flex;gap:4px}.ai-thinking-dots span{width:6px;height:6px;border-radius:50%;background:var(--sticker-accent);opacity:.4;animation:ai-dot-pulse 1.4s infinite ease-in-out}.ai-thinking-dots span:nth-child(1){animation-delay:0s}.ai-thinking-dots span:nth-child(2){animation-delay:.2s}.ai-thinking-dots span:nth-child(3){animation-delay:.4s}@keyframes ai-dot-pulse{0%,80%,100%{opacity:.4;transform:scale(1)}40%{opacity:1;transform:scale(1.3)}}.ai-thinking-process{margin-top:6px;padding:8px 10px;border-radius:8px;font-size:11px;line-height:1.5;max-height:120px;overflow-y:auto;white-space:pre-wrap;word-break:break-all}.io-grey-mode .ai-thinking-process{background:var(--ai-surface-muted);color:var(--sticker-text-secondary);border:1px dashed var(--ai-border)}.io-black-mode .ai-thinking-process{background:var(--ai-surface-muted);color:var(--sticker-text-secondary);border:1px dashed var(--ai-border)}.ai-chat-input-area{padding:10px 14px;border-top:1px solid var(--ai-border);flex-shrink:0}.ai-chat-input-wrap{display:flex;align-items:flex-end;
224gap:8px;border-radius:14px;padding:8px 10px;transition:box-shadow .2s}.io-grey-mode .ai-chat-input-wrap{background:var(--ai-surface-muted);border:1.5px solid var(--ai-border)}.io-grey-mode .ai-chat-input-wrap:focus-within{border-color:var(--sticker-accent);box-shadow:0 0 0 3px rgba(53,92,255,.1)}.io-black-mode .ai-chat-input-wrap{background:var(--ai-surface-muted);border:1.5px solid var(--ai-border)}.io-black-mode .ai-chat-input-wrap:focus-within{border-color:var(--sticker-accent);box-shadow:0 0 0 3px rgba(143,184,255,.12)}.ai-chat-input{flex:1;border:none;outline:none;resize:none;font-size:12px;line-height:1.5;max-height:80px;font-family:inherit;background:0 0;color:var(--sticker-text-primary);box-sizing:border-box;min-height:34px;padding:8px 2px;overflow-y:auto}.ai-chat-input::placeholder{color:var(--sticker-text-secondary);opacity:.6}.ai-chat-send{width:34px;height:34px;border-radius:10px;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;color:#fff;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);transition:all .2s;flex-shrink:0}.ai-chat-send:hover{transform:scale(1.05);box-shadow:0 4px 12px rgba(102,126,234,.4)}.ai-chat-send:active{transform:scale(.95)}.ai-chat-send:disabled{opacity:.5;cursor:not-allowed;transform:none;box-shadow:none}.ai-chat-send.is-loading{background:linear-gradient(135deg,#ef4444 0%,#f97316 100%)}.io-black-mode .ai-chat-send.is-loading{background:linear-gradient(135deg,#fb7185 0%,#f59e0b 100%)}.io-black-mode .ai-chat-send{background:linear-gradient(135deg,#8fb8ff 0%,#a78bfa 100%)}.ai-chat-input-hint{display:flex;align-items:center;justify-content:space-between;margin-top:6px;font-size:10px;color:var(--sticker-text-secondary);opacity:.6}.ai-hint-mcp{display:inline-flex;align-items:center;gap:3px}.ai-msg-loading{display:flex;gap:4px;padding:4px 0}.ai-msg-loading span{width:6px;height:6px;border-radius:50%;background:var(--sticker-accent);animation:ai-dot-pulse 1.4s infinite ease-in-out}.ai-msg-loading span:nth-child(1){animation-delay:0s}.ai-msg-loading span:nth-child(2){animation-delay:.2s}.ai-msg-loading span:nth-child(3){animation-delay:.4s}.ai-msg-error{font-size:12px;padding:6px 10px;border-radius:8px;border:1px solid var(--ai-error-border)}.io-grey-mode .ai-msg-error{background:var(--ai-error-bg);color:#dc2626}.io-black-mode .ai-msg-error{background:var(--ai-error-bg);color:#fca5a5}#aiChatBtn{position:relative;color:#fff!important;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%)!important;box-shadow:0 4px 14px rgba(102,126,234,.35)!important}.io-black-mode #aiChatBtn{background:linear-gradient(135deg,#8fb8ff 0%,#a78bfa 100%)!important;box-shadow:0 4px 14px rgba(143,184,255,.25)!important;color:#1b1d1f!important}#aiChatBtn:hover{transform:scale(1.08);transition:transform .2s}#aiChatBtn img{width:26px;height:26px;border-radius:50%;object-fit:cover;display:block}#aiChatBtn .ai-btn-label{position:absolute;top:-6px;left:-4px;font-size:8px;font-weight:700;padding:1px 4px;border-radius:6px;color:#fff;background:linear-gradient(135deg,#f5576c,#f093fb);line-height:1.3;letter-spacing:.3px;pointer-events:none}.io-black-mode #aiChatBtn .ai-btn-label{color:#1b1d1f}.ai-chat-header{cursor:move;user-select:none}.ai-chat-panel.dragging{transition:none!important}.ai-mode-switch{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:10px;margin-top:4px;background:var(--ai-warn-bg);border:1px solid var(--ai-warn-border)}.ai-mode-switch-text{flex:1;font-size:12px;line-height:1.4}.io-grey-mode .ai-mode-switch-text{color:#92400e}.io-black-mode .ai-mode-switch-text{color:#fbbf24}.ai-mode-switch-btn{font-size:11px;padding:3px 10px;border-radius:8px;border:none;cursor:pointer;font-weight:600;white-space:nowrap;transition:all .2s}.io-grey-mode .ai-mode-switch-btn{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.io-black-mode .ai-mode-switch-btn{background:linear-gradient(135deg,#8fb8ff,#a78bfa);color:#1b1d1f}.ai-mode-switch-btn:hover{transform:scale(1.03)}@media(max-width:580px){.ai-chat-panel{left:12px;right:78px;width:auto;max-width:420px;min-width:0;height:min(66vh,520px);max-height:min(66vh,520px);min-height:320px;bottom:calc(96px + env(safe-area-inset-bottom));border-radius:16px}.ai-chat-header{padding:10px 12px}.ai-chat-title{font-size:13px}.ai-msg-body{font-size:11px;line-height:1.6}.ai-chat-input-area{padding:8px 10px}.ai-chat-input{font-size:12px}.ai-resize-handle{display:none}.ai-tip-chip{font-size:11px;padding:4px 8px}.ai-welcome-title{font-size:16px}.ai-welcome-tips{gap:6px}.ai-tip-chip{font-size:11px;padding:5px 10px}}@media(max-width:360px){.ai-chat-panel{left:8px;right:78px;max-width:none;bottom:calc(88px + env(safe-area-inset-bottom))}}</style>
224<script>function setCookie(e,t,n){var s,o="";n&&(s=new Date,s.setTime(s.getTime()+n*24*60*60*1e3),o="; expires="+s.toUTCString()),document.cookie=e+"="+(t||"")+o+"; path=/"}function getCookie(e){for(var t,s=e+"=",o=document.cookie.split(";"),n=0;n<o.length;n++){for(t=o[n];t.charAt(0)==" ";)t=t.substring(1,t.length);if(t.indexOf(s)==0)return t.substring(s.length,t.length)}return null}function eraseCookie(e){document.cookie=e+"=; Max-Age=-99999999; path=/"}function forceReloadAndClearCache(){eraseCookie("neverShowForceReloadTip"),"caches"in window?caches.keys().then(function(e){return Promise.all(e.map(function(e){return caches.delete(e)}))}).then(function(){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(function(e){for(let t of e)t.unregister()});try{localStorage.clear(),sessionStorage.clear()}catch{}location.reload(!0)}):location.reload(!0)}document.addEventListener("DOMContentLoaded",function(){const t=document.getElementById("toggleButton"),s=document.getElementById("toggleSection"),i=document.getElementById("forceReloadBtn"),e=document.getElementById("forceReloadTip"),o=document.getElementById("closeForceReloadTip"),n=document.getElementById("neverShowForceReloadTip");if(s.classList.remove("show"),t.classList.remove("active"),e&&o&&n){let t=getCookie("neverShowForceReloadTip");t?e.style.display="none":(e.style.display="block",o.addEventListener("click",function(){n.checked?(setCookie("neverShowForceReloadTip","1",3
22465),e.style.display="none"):e.style.display="none"}),n.checked=!1)}i.addEventListener("click",function(){confirm(`确定要强制刷新并清除缓存吗?
225此操作将清除本地缓存并重新加载页面。`)&&forceReloadAndClearCache()}),t.addEventListener("click",function(){s.classList.toggle("show"),t.classList.toggle("active")});const a=document.querySelectorAll('a[data-action="download-bookmarks"], a[download="bookmarks.html"]');(a||[]).forEach(function(e){if(!e)return;e.addEventListener("click",async function(t){t.preventDefault(),t.stopPropagation();const n=e.getAttribute("href")||"";if(!n||n==="#"||n.startsWith("javascript:"))return;let s=n;try{s=new URL(n,document.baseURI).toString()}catch{}const o=(e.getAttribute("download")||"bookmarks.html").trim()||"bookmarks.html";try{const t=await fetch(s,{cache:"no-store"});if(!t.ok)throw new Error("Bad response");const i=await t.text(),a=new Blob([i],{type:"application/octet-stream"}),n=URL.createObjectURL(a),e=document.createElement("a");e.href=n,e.download=o,document.body.appendChild(e),e.click(),e.remove(),setTimeout(function(){URL.revokeObjectURL(n)},1e3)}catch{const e=document.createElement("a");e.href=s,e.download=o,document.body.appendChild(e),e.click(),e.remove()}})})})</script>
225<script>document.addEventListener("DOMContentLoaded",function(){(function(){"use strict";const Ce={apiUrl:"https://www.dmxapi.cn/v1/chat/completions",apiKey:"sk-aOFPUdKw5MtDlr0qSzhDz9RPYfXhbCxucFsEMv6irFCpUmU2",model:"qwen-flash-free",assistantAvatarUrl:JSON.parse('""'),assistantAvatarLabel:JSON.parse('"AI"'),userAvatarUrl:JSON.parse('""'),userAvatarLabel:JSON.parse('"ME"'),mcpUrl:"https://extension.noisework.cn/mcp",mcpSearchUrl:"https://extension.noisework.cn/api/search",enableMcp:JSON.parse("true"),enableLocalSearch:JSON.parse("true"),localSearchIndex:"/search-index.json",searchMode:"auto",enableThinking:JSON.parse("true"),maxTokens:Number("4096"),temperature:Number("0.7"),systemPrompt:JSON.parse(`"你是 NOISE导航 的AI助手,帮助用户搜索和了解站内收录的网站资源。1. 当用户询问网站推荐或工具时,优先使用搜索站内数据给出精准回答,回答应简洁有用,包含网站名称、链接和简要说明;2. 理解问题意图(对比/推荐/步骤/解释/清单),从候选中筛选与归纳,输出结构化答案;3. 不要只把检索结果原样列出来,需要进行适度整理和总结;4. 输出数量要智能:用户明确要求'唯一/最推荐/挑一个'时给 1 个;否则给 3-8 个分组/排序后的建议,并为每个给一句话理由与链接;5. 搜索结果是重要参考,但你也可以结合自身知识给出更全面的回答,不必被搜索结果完全限制;6. 若站内检索无结果或相关性很低,明确说明站内未检索到匹配项,再基于你的常识和知识给出建议"`)};let e=Object.assign({},Ce);const de="ndh-ai-provider-settings-v1",A="ndh-ai-chat-history-v1",Je="ndh-ai-visitor-id-v1",oe="ndh-ai-chat-lock-v1",Qe="ndh-ai-chat-next-allowed-v1",Xe="ndh-ai-rate-limit-until-v1",ot=300,It=function(){try{const e=localStorage.getItem(Je);if(e)return e;const t="v_"+Math.random().toString(36).slice(2)+Date.now().toString(36);return localStorage.setItem(Je,t),t}catch{return"v_"+Math.random().toString(36).slice(2)+Date.now().toString(36)}}(),q=function(){try{const e="ndh-ai-client-id-v1",t=sessionStorage.getItem(e);if(t)return t;const n="c_"+Math.random().toString(36).slice(2)+Date.now().toString(36);return sessionStorage.setItem(e,n),n}catch{return"c_"+Math.random().toString(36).slice(2)}}();function he(e){if(!e||typeof e!="string")return null;try{return JSON.parse(e)}catch{return null}}function We(){try{const t=localStorage.getItem(de),e=he(t);return!e||typeof e!="object"?null:e}catch{return null}}function Ht(e){try{localStorage.setItem(de,JSON.stringify(e||{}))}catch{}}function Be(){try{localStorage.removeItem(de)}catch{}}function fe(){return A+"::"+It}function Pe(){try{const t=fe();let e=localStorage.getItem(t);if(!e){const n=localStorage.getItem(A),s=sessionStorage.getItem(A);if(e=n||s||"",e){try{localStorage.setItem(t,e)}catch{}try{localStorage.removeItem(A)}catch{}try{sessionStorage.removeItem(A)}catch{}}}const n=he(e);return Array.isArray(n)?n.filter(e=>e&&typeof e=="object"&&(e.role==="user"||e.role==="ai")&&typeof e.content=="string").map(e=>({id:typeof e.id=="string"?e.id:"m_"+Math.random().toString(36).slice(2),role:e.role,content:e.content,isMarkdown:e.role==="ai"})).slice(-60):[]}catch{return[]}}function Pt(e){try{const t=fe();localStorage.setItem(t,JSON.stringify(Array.isArray(e)?e:[]))}catch{}}function Rt(){try{localStorage.removeItem(fe())}catch{}try{localStorage.removeItem(A)}catch{}try{sessionStorage.removeItem(A)}catch{}}let l=Pe(),pe=0;function Lt(){if(pe)return;pe=window.setTimeout(function(){pe=0,Pt(l.slice(-60))},150)}function Ne(e){if(!e||!e.id)return;const t=l.findIndex(t=>t&&t.id===e.id);t>=0?l[t]=Object.assign({},l[t],e):l.push(e),l=l.slice(-60),Lt()}function ge(){try{const t=localStorage.getItem(oe),e=he(t);return!e||typeof e!="object"?null:!e.owner||!e.expiresAt?null:e}catch{return null}}function Nt(){const t=Date.now(),e=ge();return Boolean(e&&e.owner&&e.owner!==q&&Number(e.expiresAt)>t)}function Dt(){const e=Date.now();try{const t={owner:q,expiresAt:e+9e4};localStorage.setItem(oe,JSON.stringify(t))}catch{}}function zt(){const t=Date.now(),e=ge();if(!e||e.owner!==q)return;e.expiresAt=t+9e4;try{localStorage.setItem(oe,JSON.stringify(e))}catch{}}function Tt(){const e=ge();if(!e||e.owner!==q)return;try{localStorage.removeItem(oe)}catch{}}function St(){try{const e=Number(localStorage.getItem(Qe)||"0");return Number.isFinite(e)?e:0}catch{return 0}}function At(e){try{localStorage.setItem(Qe,String(Number(e)||0))}catch{}}function _e(){try{const e=Number(localStorage.getItem(Xe)||"0");return Number.isFinite(e)?e:0}catch{return 0}}function kt(e){try{localStorage.setItem(Xe,String(Number(e)||0))}catch{}}function Et(e){try{const s=e&&e.headers?e.headers.get("Retry-After")||"":"",t=String(s||"").trim();if(!t)return 0;if(/^\d+$/.test(t))return Math.max(0,Number(t)*1e3);const n=Date.parse(t);return Number.isFinite(n)?Math.max(0,n-Date.now()):0}catch{return 0}}let H=0;function Ct(){if(!H)return;clearInterval(H),H=0}function X(e){const t=Math.ceil(Math.max(0,Number(e)||0)/1e3);return t}function L(){const t=Date.now(),n=_e(),e=n-t;return e>0?(s&&!b&&(s.disabled=!0,s.classList.remove("is-loading"),s.title="请稍后再试",s.innerHTML='<span style="font-size:12px;font-weight:700;">'+X(e)+"s</span>"),H||(H=window.setInterval(function(){const t=Date.now(),n=_e(),e=n-t;if(e<=0){L();return}s&&!b&&(s.disabled=!0,s.title="请稍后再试",s.innerHTML='<span style="font-size:12px;font-weight:700;">'+X(e)+"s</span>")},250)),!0):(Ct(),s&&!b&&(s.disabled=!1,Z("idle")),!1)}function nt(t){const n=Math.max(1e3,Math.min(10*60*1e3,Number(t)||0)),s=Date.now()+n;kt(s),L();
225const o=X(n),i=k==="ai"&&(e.enableLocalSearch||e.enableMcp),r=i?"你也可以先切到「本地搜索」继续用。":"";a("ai","请求过于频繁,请在 "+o+" 秒后再试。"+r,!0)}function tt(e,t){return new Promise(function(n,s){if(t&&t.aborted){s(new DOMException("Aborted","AbortError"));return}const i=window.setTimeout(function(){t&&t.removeEventListener("abort",o),n()},Math.max(0,Number(e)||0));function o(){clearTimeout(i),t&&t.removeEventListener("abort",o),s(new DOMException("Aborted","AbortError"))}t&&t.addEventListener("abort",o,{once:!0})})}async function Ot(e){if(!Nt())return;const t=Date.now(),o=St(),n=Math.max(t,o)+ot;At(n);const s=n-t;s>0&&await tt(s,e)}let I=0;function _t(){if(I)return;I=window.setInterval(zt,15e3)}function yt(){if(!I)return;clearInterval(I),I=0}function Le(){const t=We();if(!t)return!1;const s=Object.prototype.hasOwnProperty.call(t,"apiUrl"),o=Object.prototype.hasOwnProperty.call(t,"apiKey"),i=Object.prototype.hasOwnProperty.call(t,"model"),n={apiUrl:(t.apiUrl||"").trim(),apiKey:(t.apiKey||"").trim(),model:(t.model||"").trim(),maxTokens:t.maxTokens,temperature:t.temperature};return s&&(e.apiUrl=n.apiUrl),o&&(e.apiKey=n.apiKey),i&&(e.model=n.model),Number.isFinite(Number(n.maxTokens))&&Number(n.maxTokens)>0&&(e.maxTokens=Number(n.maxTokens)),Number.isFinite(Number(n.temperature))&&Number(n.temperature)>=0&&(e.temperature=Number(n.temperature)),!0}function Ie(){return Boolean(e.apiUrl&&e.model)}Le();let U=Ie(),k=U?"ai":"local";const t=document.getElementById("aiChatPanel"),jt=document.getElementById("aiChatBtn"),bt=document.getElementById("aiChatClose"),Ue=document.getElementById("aiChatSettingsBtn"),vt=document.getElementById("aiChatClear"),o=document.getElementById("aiChatMessages"),v=document.getElementById("aiChatInput"),s=document.getElementById("aiChatSend"),Ve=document.getElementById("aiChatThinking"),h=document.getElementById("aiThinkingProcess"),m=document.getElementById("aiChatSettingsPanel"),w=document.getElementById("aiSettingProvider"),r=document.getElementById("aiSettingApiUrl"),ae=document.getElementById("aiSettingApiKey"),u=document.getElementById("aiSettingModel"),Y=document.getElementById("aiSettingMaxTokens"),te=document.getElementById("aiSettingTemperature"),et=document.getElementById("aiSettingSave"),Ye=document.getElementById("aiSettingReset"),Ke=document.getElementById("aiSettingCancel"),gt=o?o.querySelector(".ai-chat-welcome")?o.querySelector(".ai-chat-welcome").outerHTML:"":"";let p=[],b=!1,y=null,ve=!1;L();let Te=!1,Ee=!1;const ye={openai:{apiUrl:"https://api.openai.com/v1/chat/completions",model:""},openrouter:{apiUrl:"https://openrouter.ai/api/v1/chat/completions",model:""},deepseek:{apiUrl:"https://api.deepseek.com/chat/completions",model:"deepseek-chat"},moonshot:{apiUrl:"https://api.moonshot.ai/v1/chat/completions",model:"kimi-k2.6"},dashscope:{apiUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",model:"qwen-plus"}};function pt(e){const t=String(e||"").trim();return t?t.includes("api.openai.com")?"openai":t.includes("openrouter.ai")?"openrouter":t.includes("api.deepseek.com")?"deepseek":t.includes("api.moonshot.ai")?"moonshot":t.includes("dashscope.aliyuncs.com")?"dashscope":"custom":"custom"}function we(){const e=document.getElementById("aiWelcomeNotice");if(!e)return;if(U){e.style.display="none",e.textContent="";return}e.textContent="当前未配置 AI 服务商参数,将使用站内搜索模式。点击右上角设置可配置 API URL / Model(API Key 可选,若接口鉴权失败会提示补充)。仅保存在当前浏览器。",e.style.display="block"}function ft(){if(!m)return;const e=We(),n=e&&typeof e.apiUrl=="string"?e.apiUrl.trim():"",s=e&&typeof e.model=="string"?e.model.trim():"",t=e&&typeof e.providerId=="string"&&e.providerId?e.providerId:pt(n);if(w){const e=Array.from(w.options||[]).some(e=>e.value===t);w.value=e?t:"custom"}if(t&&t!=="custom"&&ye[t]){const e=ye[t];r&&(r.value=n||e.apiUrl||""),u&&(u.value=s||e.model||"")}else r&&(r.value=n),u&&(u.value=s);Y&&(Y.value=e&&e.maxTokens!==0[0]&&e.maxTokens!==null?String(e.maxTokens):""),te&&(te.value=e&&e.temperature!==0[0]&&e.temperature!==null?String(e.temperature):""),ae&&(ae.value=e&&e.apiKey?String(e.apiKey):""),m.style.display="block",r&&r.focus()}function $(){if(!m)return;m.style.display="none"}
225function mt(){if(!m)return!1;if(m.style.display==="none")return!1;try{return window.getComputedStyle(m).display!=="none"}catch{return!0}}function ht(){if(mt()){$();return}ft()}function ke(e){if(e==null)return null;const t=String(e).trim();if(!t)return null;const n=Number(t);return Number.isFinite(n)?n:null}function Ae(){e=Object.assign({},Ce),Le(),U=Ie(),k=U?"ai":"local",we()}function ut(){const t=document.getElementById("aiModeBadge");if(!t)return;const n=Array.from(t.childNodes).find(e=>e.nodeType===3);if(n){const t=e.searchMode==="mcp"?"MCP":e.searchMode==="local"?"LOCAL":"AUTO";n.textContent=t}}const Me=document.getElementById("aiModeBadge");Me&&Me.addEventListener("click",function(){const t=["auto","local","mcp"],n=t.indexOf(e.searchMode),s=(n+1)%t.length;e.searchMode=t[s],ut();const o=e.searchMode==="mcp"?"MCP":e.searchMode==="local"?"LOCAL":"AUTO";a("ai","✅ 已切换搜索模式为:"+o,!0)}),Ue&&Ue.addEventListener("click",ht),Ke&&Ke.addEventListener("click",$),w&&w.addEventListener("change",function(){const t=String(w.value||"custom"),e=ye[t];if(!e){r&&(r.value=""),u&&(u.value="");return}r&&(r.value=e.apiUrl||""),u&&e.model&&(u.value=e.model)}),m&&m.addEventListener("click",function(e){e.target===m&&$()}),et&&et.addEventListener("click",function(){const e=w?String(w.value||"custom"):"custom",s=(r?r.value:"").trim(),o=(ae?ae.value:"").trim(),i=(u?u.value:"").trim(),t=ke(Y?Y.value:""),n=ke(te?te.value:""),a=Boolean(s||o||i||t!==null||n!==null);if(a){const a={};e&&e!=="custom"&&(a.providerId=e),a.apiUrl=s,a.apiKey=o,a.model=i,t!==null&&(a.maxTokens=t),n!==null&&(a.temperature=n),Ht(a)}else Be();Ae(),$()}),Ye&&Ye.addEventListener("click",function(){Be(),Ae(),$()});let i=null,C=!1;window.__AI_SEARCH_INDEX__={getIndex:()=>i,isLoaded:()=>C};function P(e){if(Array.isArray(e))return e;if(e&&Array.isArray(e.results))return e.results;if(e&&Array.isArray(e.data))return e.data;if(typeof e=="string")try{return P(JSON.parse(e))}catch{return null}return null}we();function Wt(e){return/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/.test(e)}function lt(e){const t=[],n=(e||"").toLowerCase().trim();if(!n)return t;const s=n.match(/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]+/g)||[];for(const e of s)if(e.length===1)t.push(e);else{for(let n=0;n<e.length-1;n++)t.push(e.substring(n,n+2));e.length<=4&&t.push(e)}const o=n.match(/[a-z0-9]+/g)||[];for(const e of o)e.length>=2&&t.push(e);return t}function ct(e){let t=e.trim();const n=[/^(有没有|有什么|有哪些|请|帮我|推荐|搜索|找一下|我想|请问|能不能|可以|怎么样|如何|怎么)/,/(呢|吗|吧|啊|呀|嘛|的|了|吧|么|呢)$/,/^(一些|几个|好的|好用的|不错的)/];for(const e of n)t=t.replace(e,"");return t=t.trim()||e.trim(),lt(t)}function rt(e,t){if(!t.length)return 0;let n=0;const o=g(e.title),i=g(e.description),a=g(e.taxonomy),r=g(e.term),c=g(e.url),s=o.toLowerCase(),l=i.toLowerCase(),d=a.toLowerCase(),u=r.toLowerCase(),h=c.toLowerCase();for(const e of t){let o=!1;s.includes(e)&&(n+=s===e?20:10,o=!0),(d.includes(e)||u.includes(e))&&(n+=8,o=!0),l.includes(e)&&(n+=3,o=!0),h.includes(e)&&(n+=2,o=!0),o||(n-=1)}return n}async function at(e){if(C||await He(),!i||!i.length)throw new Error("搜索索引未加载");const n=ct(e);if(!n.length)return[];const t=[];for(const e of i){const s=rt(e,n);s>0&&t.push({...e,title:g(e.title),url:g(e.url),description:g(e.description),taxonomy:g(e.taxonomy),term:g(e.term),_score:s})}return t.sort((e,t)=>t._score-e._score),t}async function He(){if(C)return;try{const o=P(window.__HEADER_SEARCH_INDEX__);if(Array.isArray(o)&&o.length){i=o,C=!0,window.__AI_SEARCH_INDEX__&&(window.__AI_SEARCH_INDEX__.searchIndex=i,window.__AI_SEARCH_INDEX__.loaded=!0),console.log("[AI Search] 复用页内搜索索引,共 "+i.length+" 条记录");return}async function t(){try{const e=P(window.__HEADER_SEARCH_INDEX__);if(Array.isArray(e)&&e.length)return e}catch{}const n=window.CONFIG&&window.CONFIG.searchIndexScriptUrl?String(window.CONFIG.searchIndexScriptUrl):"search-index.js",e=document.getElementById("header-search-index-js");function t(){try{const e=P(window.__HEADER_SEARCH_INDEX__);return Array.isArray(e)&&e.length?e:[]}catch{return[]}}if(e){const n=t();return n.length?n:await new Promise(function(n){let s=!1;const o=window.setTimeout(function(){if(s)return;s=!0,n([])},2500);function i(){if(s)return;s=!0,clearTimeout(o),n(t())}function a(){if(s)return;s=!0,clearTimeout(o),n([])}e.addEventListener("load",i,{once:!0}),e.addEventListener("error",a,{once:!0})})}return await new Promise(function(e){let s=!1;const i=window.setTimeout(function(){if(s)return;s=!0,e([])},2500),o=document.createElement("script");o.id="header-search-index-js",o.src=n,o.async=!1,o.onload=function(){if(s)return;s=!0,clearTimeout(i),e(t())},o.onerror=function(){if(s)return;s=!0,clearTimeout(i),e([])},document.head.appendChild(o)})}const a=await t();if(Array.isArray(a)&&a.length){i=a,C=!0,window.__AI_SEARCH_INDEX__&&(window.__AI_SEARCH_INDEX__.searchIndex=i,window.__AI_SEARCH_INDEX__.loaded=!0),console.log("[AI Search] 复用脚本搜索索引,共 "+i.length+" 条记录");return}const s=window.location.origin,r=window.location.pathname,c=[window.CONFIG&&window.CONFIG.searchIndexUrl?String(window.CONFIG.searchIndexUrl):e.localSearchIndex,s+"/docs/search-index.json",s+"/search-index.json",s+"/docs/index.searchindex.json",s+"/index.searchindex.json","search-index.json","../search-index.json","../../search-index.json",r.replace(/\/[^/]*$/,"/")+"docs/search-index.json",r.replace(/\/[^/]*$/,"/")+"search-index.json"].filter(
225Boolean);console.log("[AI Search] 尝试加载搜索索引,路径列表:",c);let n=null;for(const e of c)try{const t=new AbortController,s=window.setTimeout(function(){try{t.abort()}catch{}},2500);try{n=await fetch(e,{cache:"no-store",signal:t.signal})}finally{clearTimeout(s)}if(n.ok){console.log("[AI Search] 索引加载成功:",e);break}}catch(t){console.log("[AI Search] 路径 "+e+" 加载失败:",t.message)}if(!n||!n.ok)throw console.warn("[AI Search] 所有搜索路径均尝试失败"),new Error("所有路径均加载失败");if(i=P(await n.json()),!Array.isArray(i))throw new Error("索引格式错误: 非数组");C=!0,window.__AI_SEARCH_INDEX__&&(window.__AI_SEARCH_INDEX__.searchIndex=i,window.__AI_SEARCH_INDEX__.loaded=!0),console.log("[AI Search] 本地索引已加载,共 "+i.length+" 条记录")}catch(e){console.error("[AI Search] 索引加载失败:",e),i=[],C=!0,window.__AI_SEARCH_INDEX__&&(window.__AI_SEARCH_INDEX__.searchIndex=[],window.__AI_SEARCH_INDEX__.loaded=!0)}}async function J(t){const s=e.searchMode;let n=[];if(e.enableLocalSearch&&(s==="local"||s==="auto"))try{if(n=await at(t),n.length>0)return{results:n,source:"local"}}catch(e){console.warn("[AI Search] 本地搜索失败,尝试回退:",e)}if(e.enableMcp&&(s==="mcp"||s==="auto"||s==="local"&&n.length===0))try{if(n=await Bt(t),n.length>0)return{results:n,source:"mcp"}}catch(e){console.warn("[AI Search] MCP 搜索失败:",e)}return{results:[],source:"none"}}if(typeof marked!="undefined"){const e=new marked.Renderer;e.html=function(e){return n(e)},e.link=function(e,t,s){const o=x(e,{allowHash:!0,allowMailto:!0}),i=t?' title="'+n(t)+'"':"",a=o||"#";return'<a href="'+n(a)+'"'+i+' target="_blank" rel="noopener noreferrer">'+s+"</a>"},e.image=function(e,t,s){const o=x(e,{allowDataImage:!0});if(!o)return"";const i=t?' title="'+n(t)+'"':"",a=n(s||"");return'<img src="'+n(o)+'" alt="'+a+'"'+i+' loading="lazy" referrerpolicy="no-referrer" />'},marked.setOptions({breaks:!0,gfm:!0,headerIds:!1,mangle:!1,renderer:e})}function x(e,t){const s=t||{},n=String(e??"").trim();if(!n)return"";if(s.allowHash&&n.startsWith("#"))return n;if(/^javascript:/i.test(n)||/^vbscript:/i.test(n))return"";if(s.allowDataImage&&/^data:image\//i.test(n))return n;try{const e=new URL(n,document.baseURI),t=(e.protocol||"").toLowerCase();return t==="http:"||t==="https:"?e.toString():s.allowMailto&&t==="mailto:"?e.toString():""}catch{return n.startsWith("/")?n:""}}function it(e){const d=String(e??"").replace(/\r\n/g,`
226`),s=d.split(`
227`);let t=0,i=!1,a=[];const o=[];function c(e){const o=String(e??""),a=/https?:\/\/[^\s)]+/g;let i=0,t=null,s="";for(;(t=a.exec(o))!==null;){const r=t.index,c=t.index+t[0].length;s+=n(o.slice(i,r));let e=t[0];for(;e&&/[.,;:!?))\]]$/.test(e);)e=e.slice(0,-1);const a=x(e,{allowHash:!1,allowMailto:!0});a?s+='<a href="'+n(a)+'" target="_blank" rel="noopener noreferrer">'+n(e)+"</a>":s+=n(t[0]),i=c}return s+=n(o.slice(i)),s}function r(e){const o=String(e??""),a=/`https?:\/\/[^\s`]+`|\[([^\]]+)\]\(([^)]+)\)|`([^`]+)`|\*\*([^*]+)\*\*|https?:\/\/[^\s)]+/g;let i=0,s=null,t="";for(;(s=a.exec(o))!==null;){t+=c(o.slice(i,s.index));const e=s[0];if(e.startsWith("`http")){const s=e.slice(1,-1),o=x(s,{allowHash:!1,allowMailto:!0});o?t+='<a href="'+n(o)+'" target="_blank" rel="noopener noreferrer">'+n(s)+"</a>":t+="<code>"+n(s)+"</code>"}else if(e.startsWith("http")){let s=e;for(;s&&/[.,;:!?))\]]$/.test(s);)s=s.slice(0,-1);const o=x(s,{allowHash:!1,allowMailto:!0});o?t+='<a href="'+n(o)+'" target="_blank" rel="noopener noreferrer">'+n(s)+"</a>":t+=n(e)}else if(e.startsWith("[")){const e=s[1]||"",i=s[2]||"",o=x(i,{allowHash:!0,allowMailto:!0});o?t+='<a href="'+n(o)+'" target="_blank" rel="noopener noreferrer">'+n(e)+"</a>":t+=n(e)}else if(e.startsWith("`")){const o=s[3]||e.slice(1,-1);t+="<code>"+n(o)+"</code>"}else if(e.startsWith("**")){const o=s[4]||e.slice(2,-2);t+="<strong>"+n(o)+"</strong>"}else t+=n(e);i=s.index+e.length}return t+=c(o.slice(i)),t}function l(){const e=a.join(`
228`);o.push("<pre><code>"+n(e)+"</code></pre>"),a=[]}for(;t<s.length;){const e=s[t];if(i){if(/^```/.test(e)){i=!1,l(),t++;continue}a.push(e),t++;continue}if(/^```/.test(e)){i=!0,a=[],t++;continue}if(!e.trim()){t++;continue}const n=e.match(/^(#{1,6})\s+(.+)$/);if(n){const e=n[1].length;o.push("<h"+e+">"+r(n[2])+"</h"+e+">"),t++;continue}const d=e.match(/^\s*[-*+]\s+(.+)$/),u=e.match(/^\s*\d+\.\s+(.+)$/);if(d){const e=[];for(;t<s.length;){const n=s[t].match(/^\s*[-*+]\s+(.+)$/);if(!n)break;e.push("<li>"+r(n[1])+"</li>"),t++}o.push("<ul>"+e.join("")+"</ul>");continue}if(u){const e=[];for(;t<s.length;){const n=s[t].match(/^\s*\d+\.\s+(.+)$/);if(!n)break;e.push("<li>"+r(n[1])+"</li>"),t++}o.push("<ol>"+e.join("")+"</ol>");continue}const c=[];for(;t<s.length;){const e=s[t];if(!e.trim())break;if(/^```/.test(e))break;if(/^(#{1,6})\s+/.test(e))break;if(/^\s*[-*+]\s+/.test(e))break;if(/^\s*\d+\.\s+/.test(e))break;c.push(e),t++}const h=c.map(r).join("<br>");o.push("<p>"+h+"</p>")}return i&&(i=!1,l()),o.join(`
229`)}function $e(e){if(typeof marked!="undefined")try{return marked.parse(e)}catch{return E(e)}return it(e)}function n(e){return String(e).replace(/[&<>"']/g,function(e){return e==="&"?"&amp;":e==="<"?"&lt;":e===">"?"&gt;":e==='"'?"&quot;":"&#39;"})}function Ut(e){return n(e).replace(/\n/g,"<br>")}function E(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function g(e){return e==null?"":String(e)}function st(e){const t=String(e||"").trim();if(!t)return"";if(/^(https?:)?\/\//i.test(t)||t.startsWith("/"))return t;try{return new URL(t,document.baseURI).toString()}catch{return t}}function Ge(e){const t=document.createElement("span");return t.className="ai-avatar-label",t.textContent=String(e||"").trim().slice(0,4)||"AI",t}function ne(t){const s=t==="ai"||t==="assistant",n=document.createElement("div"),o=st(s?e.assistantAvatarUrl:e.userAvatarUrl),i=s?e.assistantAvatarLabel:e.userAvatarLabel;if(n.className="ai-msg-avatar",n.setAttribute("data-role",s?"assistant":"user"),o){const e=document.createElement("img");return e.src=o,e.alt=s?"AI avatar":"User avatar",e.loading="lazy",e.addEventListener("error",function(){n.removeAttribute("data-has-image"),e.remove(),n.querySelector(".ai-avatar-label")||n.appendChild(Ge(i))}),n.setAttribute("data-has-image","true"),n.appendChild(e),n}return n.appendChild(Ge(i)),n}
229function xt(){t.classList.add("open"),window.innerWidth<=580&&(t.style.left="",t.style.top="",t.style.right="",t.style.bottom="",t.style.width="",t.style.height=""),e.enableLocalSearch&&!C&&He()}function Ze(){t.classList.remove("open")}jt.addEventListener("click",function(){t.classList.contains("open")?Ze():(xt(),setTimeout(()=>v.focus(),400))}),bt.addEventListener("click",Ze);let j=!1,re=0,ie=0,M=0,F=0,me=0,le=0,G=!1,V=0,B=0,d=0;function De(){const e=t.getBoundingClientRect();return{x:e.left,y:e.top}}t.addEventListener("mousedown",function(e){if(window.innerWidth<=580)return;const n=t.querySelector(".ai-chat-header");if(!n||!n.contains(e.target))return;if(e.target.closest(".ai-chat-header-btn")||e.target.closest("button"))return;j=!0,G=!1;const s=De();re=e.clientX,ie=e.clientY,M=s.x,F=s.y,me=t.offsetWidth,le=t.offsetHeight,V=M,B=F,t.classList.add("dragging"),t.style.willChange="left, top",e.preventDefault()});function Se(){d=0;const e=window.innerWidth-me,n=window.innerHeight-le;t.style.left=Math.max(0,Math.min(V,e))+"px",t.style.top=Math.max(0,Math.min(B,n))+"px",t.style.right="auto",t.style.bottom="auto"}document.addEventListener("mousemove",function(e){if(window.innerWidth<=580)return;if(!j)return;const t=e.clientX-re,n=e.clientY-ie;((t<0?-t:t)>3||(n<0?-n:n)>3)&&(G=!0),V=M+t,B=F+n,d||(d=requestAnimationFrame(Se))}),document.addEventListener("mouseup",function(){j&&(j=!1,t.classList.remove("dragging"),d&&cancelAnimationFrame(d),d=0,t.style.willChange="")}),t.addEventListener("touchstart",function(e){if(window.innerWidth<=580)return;const n=t.querySelector(".ai-chat-header");if(!n||!n.contains(e.target))return;if(e.target.closest(".ai-chat-header-btn")||e.target.closest("button"))return;const s=e.touches[0];j=!0,G=!1;const o=De();re=s.clientX,ie=s.clientY,M=o.x,F=o.y,me=t.offsetWidth,le=t.offsetHeight,V=M,B=F,t.classList.add("dragging"),t.style.willChange="left, top"},{passive:!0}),document.addEventListener("touchmove",function(e){if(window.innerWidth<=580)return;if(!j)return;const t=e.touches[0],n=t.clientX-re,s=t.clientY-ie;((n<0?-n:n)>3||(s<0?-s:s)>3)&&(G=!0),V=M+n,B=F+s,d||(d=requestAnimationFrame(Se))},{passive:!0}),document.addEventListener("touchend",function(){j&&(j=!1,t.classList.remove("dragging"),d&&cancelAnimationFrame(d),d=0,t.style.willChange="")});const je=t.querySelector(".ai-resize-handle");let O=!1,Q=0,se=0,N=0,D=0,W=0,R=0,c=0;je&&(je.addEventListener("mousedown",function(e){if(window.innerWidth<=580)return;O=!0,Q=e.clientX,se=e.clientY,N=t.offsetWidth,D=t.offsetHeight,W=N,R=D,t.classList.add("resizing"),t.style.willChange="width, height",e.preventDefault(),e.stopPropagation()}),je.addEventListener("touchstart",function(e){if(window.innerWidth<=580)return;O=!0;const n=e.touches[0];Q=n.clientX,se=n.clientY,N=t.offsetWidth,D=t.offsetHeight,W=N,R=D,t.classList.add("resizing"),t.style.willChange="width, height"},{passive:!0}));function ze(){c=0,t.style.width=W+"px",t.style.height=R+"px"}document.addEventListener("mousemove",function(e){if(window.innerWidth<=580)return;if(!O)return;W=Math.max(320,N+(e.clientX-Q)),R=Math.max(380,D-(e.clientY-se)),c||(c=requestAnimationFrame(ze))}),document.addEventListener("touchmove",function(e){if(window.innerWidth<=580)return;if(!O)return;const t=e.touches[0];W=Math.max(320,N+(t.clientX-Q)),R=Math.max(380,D-(t.clientY-se)),c||(c=requestAnimationFrame(ze))},{passive:!0}),document.addEventListener("mouseup",function(){O&&(O=!1,t.classList.remove("resizing"),c&&cancelAnimationFrame(c),c=0,t.style.willChange="")}),document.addEventListener("touchend",function(){O&&(O=!1,t.classList.remove("resizing"),c&&cancelAnimationFrame(c),c=0,t.style.willChange="")});function wt(e){ee();const t=document.createElement("div");t.className="ai-msg ai";const r=ne("assistant"),s=document.createElement("div");s.className="ai-msg-body";const n=document.createElement("div");n.className="ai-mode-switch",n.innerHTML='<div class="ai-mode-switch-text"><i class="fa fa-exclamation-triangle"></i> '+E(e)+'</div><button class="ai-mode-switch-btn" id="aiSwitchToLocal">切换本地搜索</button>',s.appendChild(n),t.appendChild(r),t.appendChild(s),o.appendChild(t),_();const i=n.querySelector("#aiSwitchToLocal");i&&i.addEventListener("click",function(){k="local",a("ai","✅ 已切换为本地搜索模式,
229可直接输入关键词搜索站内资源。",!0)})}vt.addEventListener("click",function(){Oe(),p=[],l=[],Rt(),o.innerHTML=gt||"",v.value="",v.style.height="",f(),we(),o&&(o.scrollTop=0)}),v.addEventListener("input",function(){this.style.height="auto";const e=Math.max(34,Math.min(this.scrollHeight,80));this.style.height=e+"px"}),v.addEventListener("keydown",function(e){e.key==="Enter"&&!e.shiftKey&&(e.preventDefault(),ue())});function Z(e){if(!s)return;if(e==="loading"){s.classList.add("is-loading"),s.title="停止",s.innerHTML='<i class="fa fa-stop"></i>';return}s.classList.remove("is-loading"),s.title="发送",s.innerHTML='<i class="fa fa-paper-plane"></i>'}function Oe(){if(!b)return;try{y&&y.abort()}catch{}f(),Z("idle")}s.addEventListener("click",function(){if(b){Oe();return}ue()}),document.addEventListener("click",function(e){const t=e.target.closest(".ai-tip-chip");t&&t.dataset.q&&(v.value=t.dataset.q,ue())});function xe(e,t){if(!e)return!0;const n=Number.isFinite(t)?t:120;return e.scrollHeight-e.scrollTop-e.clientHeight<=n}function _(e){const t=e||xe(o,140);if(!t)return;requestAnimationFrame(()=>{if(!e&&!xe(o,200))return;o.scrollTop=o.scrollHeight})}function ee(){const e=o.querySelector(".ai-chat-welcome");e&&e.remove()}function a(e,t,n,s){ee();const r=document.createElement("div");r.className="ai-msg "+e;const l="m_"+Date.now().toString(36)+Math.random().toString(36).slice(2);r.dataset.msgId=l;const d=ne(e),c=document.createElement("div");c.className="ai-msg-bubble-wrap";const a=document.createElement("div");a.className="ai-msg-body",n!==!1&&e==="ai"?(a.innerHTML=$e(t),Fe(a)):a.textContent=t;const i=document.createElement("button");i.type="button",i.className="ai-msg-copy",i.title="复制",i.setAttribute("aria-label","复制"),i.dataset.copy=String(t??""),i.innerHTML='<i class="fa fa-copy"></i>',c.appendChild(a),c.appendChild(i),r.appendChild(d),r.appendChild(c),o.appendChild(r),_(!0);const u=s!==!1&&!ve&&(e==="user"||e==="ai");return u&&Ne({id:l,role:e,content:String(t??""),isMarkdown:e==="ai"}),a}function Fe(e){if(!e)return;e.querySelectorAll("a").forEach(e=>{const n=e.getAttribute("href")||"",t=x(n,{allowHash:!0,allowMailto:!0});t?e.setAttribute("href",t):e.removeAttribute("href"),e.target="_blank",e.rel="noopener noreferrer"}),e.querySelectorAll("img").forEach(e=>{const n=e.getAttribute("src")||"",t=x(n,{allowDataImage:!0});if(!t){e.remove();return}e.setAttribute("src",t),e.setAttribute("loading","lazy"),e.setAttribute("referrerpolicy","no-referrer")})}async function Mt(e){const n=String(e??"");if(!n)return;if(navigator.clipboard&&navigator.clipboard.writeText){await navigator.clipboard.writeText(n);return}const t=document.createElement("textarea");t.value=n,t.style.position="fixed",t.style.left="-9999px",t.style.top="0",document.body.appendChild(t),t.focus(),t.select(),document.execCommand("copy"),t.remove()}document.addEventListener("click",function(e){const t=e.target.closest(".ai-msg-copy");if(!t)return;const n=t.dataset.copy||"";Mt(n).then(function(){t.innerHTML='<i class="fa fa-check"></i>',window.setTimeout(function(){t.innerHTML='<i class="fa fa-copy"></i>'},900)}).catch(function(){})});function Ft(){const e=Pe();if(!e||e.length===0)return;ve=!0;try{o.innerHTML="",l=e.slice(-60),p=l.map(e=>({role:e.role==="ai"?"assistant":"user",content:e.content}));for(const e of l){a(e.role,e.content,e.role==="ai",!1);const t=o.lastElementChild;t&&t.dataset&&(t.dataset.msgId=e.id);const n=t?t.querySelector(".ai-msg-copy"):null;n&&(n.dataset.copy=e.content)}_()}finally{ve=!1}}function K(e,t,n){ee();const m=document.createElement("div");m.className="ai-msg ai";const j=ne("assistant"),a=document.createElement("div");a.className="ai-msg-body";const g=document.createElement("div");g.style.cssText="font-weight:700;margin-bottom:6px;font-size:13px;color:var(--sticker-text-strong)",g.textContent="🔍 搜索「"+t+"」找到 "+e.length+" 个结果",a.appendChild(g);const u=n==="local"?"本地索引":n==="mcp"?"MCP":"",b=[...new Set(e.slice(0,20).map(e=>e.taxonomy).filter(Boolean))];if(b.length>0){const e=document.createElement("div");e.style.cssText="display:flex;flex-wrap:wrap;gap:4px;margin-bottom:8px";for(const n of b.slice(0,5)){const t=document.createElement("span");t.style.cssText="font-size:10px;padding:2px 8px;border-radius:10px;opacity:0.7";const s=document.body.classList.contains("io-black-mode");t.style.background=s?"rgba(143,184,255,0.12)":"rgba(53,92,255,0.08)",t.style.color="var(--sticker-accent)",t.textContent=n,e.appendChild(t)}a.appendChild(e)}const f=document.createElement("div");a.appendChild(f);const d=window.innerWidth<=580?8:10,p=Math.max(1,Math.ceil(e.length/d));let s=1,c=null,h=null,l=null,r=null,i=null;if(e.length>d){c=document.createElement("div"),c.className="ai-search-pager",h=document.createElement("div"),h.className="ai-search-pager-info";const e=document.createElement("div");e.className="ai-search-pager-actions",r=document.createElement("button"),r.type="button",r.className="ai-page-btn",r.textContent="上一页",i=document.createElement("button"),i.type="button",i.className="ai-page-btn",i.textContent="下一页",l=document.createElement("div"),l.className="ai-page-indicator",r.addEventListener("click",function(){v(s-1)}),i.addEventListener("click",function(){v(s+1)}
229),e.appendChild(r),e.appendChild(l),e.appendChild(i),c.appendChild(h),c.appendChild(e),a.appendChild(c)}else{const t=document.createElement("div");t.style.cssText="font-size:11px;color:var(--sticker-text-secondary);margin-top:8px;opacity:0.75",t.textContent=u?u+" · 共 "+e.length+" 条":"共 "+e.length+" 条",a.appendChild(t)}function v(t){s=Math.max(1,Math.min(p,t)),f.innerHTML="";const n=(s-1)*d,o=Math.min(e.length,n+d);for(let i=n;i<o;i++){const t=e[i],s=document.createElement("a");s.className="ai-search-card",s.href=t.url||"#",s.target="_blank",s.rel="noopener";let a="";t.taxonomy&&(a='<span style="font-size:10px;opacity:0.6;margin-left:6px">'+E(t.taxonomy)+(t.term?" / "+E(t.term):"")+"</span>"),s.innerHTML='<div class="ai-search-card-title">'+E(t.title||"未命名")+a+'</div><div class="ai-search-card-desc">'+E(t.description||"")+'</div><div class="ai-search-card-url">'+E(t.url||"")+"</div>",f.appendChild(s)}c&&(h.textContent=u?u+" · 共 "+e.length+" 条":"共 "+e.length+" 条",l.textContent="第 "+s+" / "+p+" 页",r.disabled=s<=1,i.disabled=s>=p)}v(1),m.appendChild(j),m.appendChild(a),o.appendChild(m),_()}function ce(e){ee();const t=document.createElement("div");t.className="ai-msg ai";const s=ne("assistant"),n=document.createElement("div");n.className="ai-msg-body ai-msg-error",n.innerHTML='<i class="fa fa-exclamation-circle"></i> '+E(e),t.appendChild(s),t.appendChild(n),o.appendChild(t),_()}function be(t){Ve.style.display="flex",t&&e.enableThinking?(h.style.display="block",h.textContent=""):h.style.display="none",_()}function f(){Ve.style.display="none",T&&(clearTimeout(T),T=0)}let T=0,Re="",S=0,z=null;function qe(e){if(h.style.display!=="none"){if(Re=String(e??""),T)return;T=window.setTimeout(function(){if(T=0,h.style.display==="none")return;(!z||z.parentNode!==h)&&(h.textContent="",z=document.createTextNode(""),h.appendChild(z),S=0);const e=Re;e.length<S?(z.data=e,S=e.length):e.length>S&&(z.appendData(e.slice(S)),S=e.length),h.scrollTop=h.scrollHeight},120)}}async function Bt(t){try{const o=e.mcpSearchUrl+"?keyword="+encodeURIComponent(t)+"&filePath=webstack.yml",s=await fetch(o,{method:"GET",headers:{Accept:"application/json"}});if(!s.ok)throw new Error("搜索请求失败: "+s.status);const n=await s.json();return Array.isArray(n)?n:n.results||n.data||[]}catch(e){throw console.error("MCP search error:",e),e}}async function $t(t,n,s){try{const a=await fetch(e.mcpUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:Date.now(),method:"tools/call",params:{name:"search_sites",arguments:{query:t,page:n||1,pageSize:s||20,format:"json"}}})});if(!a.ok)throw new Error("MCP 请求失败: "+a.status);const o=await a.json();if(o.error)throw new Error(o.error.message||"MCP 调用错误");const i=o.result&&o.result.content;if(i&&i[0]&&i[0].text)try{return JSON.parse(i[0].text)}catch{return[]}return[]}catch(e){throw console.error("MCP RPC error:",e),e}}async function Vt(t,n){p.push({role:"user",content:t});const r={"Content-Type":"application/json"};e.apiKey&&(r.Authorization="Bearer "+e.apiKey),n||(y=new AbortController,n=y.signal);function d(e){const t=String(e||"").toLowerCase();return t.includes("enable-auto-tool-choice")||t.includes("tool-call-parser")||t.includes("auto tool choice requires")||t.includes('"auto" tool choice requires')||t.includes("tool choice requires")}const u=e.enableMcp&&!Te,o=u?[{type:"function",function:{name:"search_sites",description:"搜索 NOISE导航 收录的网站资源。当用户询问网站推荐、工具、资源时使用此工具搜索站内数据。",parameters:{type:"object",properties:{query:{type:"string",description:"搜索关键词"},page:{type:"number",description:"页码,默认1"},pageSize:{type:"number",description:"每页数量,默认10"}},required:["query"]}}}]:[];async function s(t,s){const O={model:e.model,messages:t,max_tokens:e.maxTokens,temperature:e.temperature,stream:!0};s&&o.length>0&&(O.tools=o);const u=await fetch(e.apiUrl,{method:"POST",headers:r,body:JSON.stringify(O),signal:n});if(!u.ok){if(u.status===429){const t=Et(u),n=await u.text(),e=new Error("请求过于频繁");throw e.code="NDH_RATE_LIMIT",e.status=u.status,e.retryAfterMs=t||15e3,e.detail=n.substring(0,400),e}const t=await u.text();if(s&&u.status===400&&d(t)){const e=new Error("当前服务不支持 Tool Calling");
229throw e.code="NDH_TOOL_CALLING_UNSUPPORTED",e.status=u.status,e.detail=t.substring(0,400),e}throw(u.status===401||u.status===403)&&!e.apiKey?new Error("鉴权失败 ("+u.status+"):该服务商可能需要 API Key。请在设置中补充 Key 后重试。"):new Error("API 请求失败 ("+u.status+"): "+t.substring(0,200))}const E=u.body.getReader(),x=new TextDecoder;let y="",c="",j="",v={},i=null,l=null,C=!1,h=0,m=0,g=null,b="";function w(e){if(!i)return;if(e){i.classList.remove("ai-msg-body-streaming"),i.innerHTML=$e(c),Fe(i),_(!0),m=c.length,g=null;return}if(c.length===m)return;i.classList.add("ai-msg-body-streaming"),(!g||g.parentNode!==i)&&(i.textContent="",g=document.createTextNode(""),i.appendChild(g),m=0),c.length<m?(g.data=c,m=c.length):c.length>m&&(g.appendData(c.slice(m)),m=c.length),_(!1)}for(be(e.enableThinking);!0;){const{done:n,value:o}=await E.read();if(n)break;y+=x.decode(o,{stream:!0});const t=y.split(`
230`);y=t.pop()||"";for(const r of t){const n=r.trim();if(!n||!n.startsWith("data: "))continue;const o=n.slice(6);if(o==="[DONE]")continue;try{const n=JSON.parse(o),t=n.choices&&n.choices[0]&&n.choices[0].delta;if(!t)continue;if(s){if(t.reasoning_content||t.reasoning){const n=t.reasoning_content||t.reasoning||"";j+=n,e.enableThinking&&qe(j)}if(t.tool_calls)for(const e of t.tool_calls){const n=e.index;v[n]||(v[n]={id:"",name:"",arguments:""}),e.id&&(v[n].id=e.id),e.function&&(e.function.name&&(v[n].name+=e.function.name),e.function.arguments&&(v[n].arguments+=e.function.arguments))}t.content&&(c+=t.content,i||(f(),i=a("ai","",!0),i.classList.add("ai-msg-body-streaming"),l=i.closest(".ai-msg"),b=l&&l.dataset?l.dataset.msgId||"":""),h||(h=window.setTimeout(function(){h=0,w(!1)},80)))}else{if(t.reasoning_content||t.reasoning){const n=t.reasoning_content||t.reasoning||"";j+=n,e.enableThinking&&qe(j)}if(t.content){if(C=!1,c+=t.content,i||(f(),i=a("ai","",!0),i.classList.add("ai-msg-body-streaming"),l=i.closest(".ai-msg"),b=l&&l.dataset?l.dataset.msgId||"":""),h)continue;h=window.setTimeout(function(){h=0,w(!1)},80)}}}catch{}}}if(h&&(clearTimeout(h),h=0),!i&&c&&(f(),i=a("ai","",!0),l=i.closest(".ai-msg"),b=l&&l.dataset?l.dataset.msgId||"":""),i&&c&&(w(!0),b)){Ne({id:b,role:"ai",content:c,isMarkdown:!0});const e=l?l.querySelector(".ai-msg-copy"):null;e&&(e.dataset.copy=c)}return c&&p.push({role:"assistant",content:c}),{toolCalls:v,fullContent:c}}let h=[{role:"system",content:e.systemPrompt},...p.slice(-20)];
230if(e.enableLocalSearch||e.enableMcp)try{if(n&&n.aborted)throw new DOMException("Aborted","AbortError");const o=await J(t),i=o&&o.results?o.results:[],a=o&&o.source?o.source:"none";if(i&&i.length>0){K(i,t,a);const n=Math.min(i.length,100),o=i.slice(0,n).map(e=>({title:e.title,description:e.description,url:e.url,taxonomy:e.taxonomy})),r=[{role:"system",content:e.systemPrompt},...p.slice(-20),{role:"system",content:"站内搜索结果(JSON,最多100条):"+JSON.stringify(o)}];await s(r,!1);return}}catch{}async function c(){let n=[],o="none";try{const e=await J(t);n=e.results||[],o=e.source||"none"}catch{}n.length>0&&K(n,t,o);const r=Math.min(n.length,100),i=n.slice(0,r).map(e=>({title:e.title,description:e.description,url:e.url,taxonomy:e.taxonomy})),a=[{role:"system",content:e.systemPrompt},...p.slice(-20)];i.length>0&&a.push({role:"system",content:"站内搜索结果(JSON,最多100条):"+JSON.stringify(i)}),await s(a,!1)}if(!o.length){await c();return}be(e.enableThinking);let i=null;try{i=await s(h,!0)}catch(e){if(e&&e.code==="NDH_TOOL_CALLING_UNSUPPORTED"){Te=!0,Ee||(Ee=!0,a("ai","当前 AI 服务不支持工具调用,已自动降级为「先站内搜索出卡片,再让 AI 总结」。如需工具调用,请换支持 tools 的 OpenAI 兼容接口。",!0,!1)),await c();return}throw e}const l=Object.values(i.toolCalls).filter(e=>e.name);if(l.length>0){{f();for(const t of l)if(t.name==="search_sites")try{const o=JSON.parse(t.arguments),i=o.query||o.keyword||"",{results:n,source:a}=await J(i);n.length>0&&K(n,i,a);const r=Math.min(n.length,100),c=n.slice(0,r).map(e=>({title:e.title,description:e.description,url:e.url,taxonomy:e.taxonomy})),l=JSON.stringify(c);p.push({role:"assistant",content:null,tool_calls:[{id:t.id,type:"function",function:{name:t.name,arguments:t.arguments}}]}),p.push({role:"tool",tool_call_id:t.id,content:l});let d=[{role:"system",content:e.systemPrompt},...p.slice(-20)];await s(d,!1)}catch(e){ce("搜索失败: "+e.message)}}}else i.fullContent||(f(),a("ai","我暂时无法回答,请稍后再试。",!0))}async function dt(e){be(!1);try{const{results:t,source:n}=await J(e);f(),t.length>0?K(t,e,n):a("ai","未找到与「"+e+"」相关的结果,请尝试其他关键词。",!0)}catch(e){f(),ce("搜索失败: "+e.message)}}async function ue(){const t=v.value.trim();if(!t||b)return;if(L()){const e=Date.now(),t=_e(),n=t-e;a("ai","请求过于频繁,请在 "+X(n)+" 秒后再试。",!0);return}b=!0,s.disabled=!1,Z("loading"),v.value="",v.style.height="auto",a("user",t);try{k==="ai"&&U?(y=new AbortController,await Ot(y.signal),Dt(),_t(),await Vt(t,y.signal)):k==="local"||e.enableLocalSearch||e.enableMcp?await dt(t):a("ai","搜索功能未配置。请在 config.toml 中启用本地搜索或 MCP 搜索。",!0)}catch(t){if(f(),t&&(t.name==="AbortError"||String(t.message||"").toLowerCase().includes("abort")))t=null;else if(t&&(t.code==="NDH_RATE_LIMIT"||t.status===429)){const e=t.retryAfterMs||15e3;nt(e)}
230else k==="ai"&&(e.enableLocalSearch||e.enableMcp)?wt("AI 服务响应失败: "+t.message):ce("出错了: "+t.message)}finally{k==="ai"&&(yt(),Tt()),y=null}b=!1,L()||(s.disabled=!1,Z("idle"))}Ft()})()})</script>
230<div id=aiChatPanel class=ai-chat-panel><div class=ai-chat-header><div class=ai-chat-header-left><span class="ai-chat-logo has-image"><img src=../../assets/images/favicon4.png alt=AI></span>
231<span class=ai-chat-title>AI助手</span>
232<span class=ai-mcp-badge id=aiModeBadge title=点击切换搜索模式(AUTO/LOCAL/MCP) style=cursor:pointer><svg width="14" height="14" viewBox="0 0 24 24" fill="none" style="vertical-align:-2px"><path d="M12 2 2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
233AUTO</span></div><div class=ai-chat-header-right><button id=aiChatSettingsBtn class=ai-chat-header-btn title=设置>
234<i class="fa fa-cog"></i>
235</button>
236<button id=aiChatClear class=ai-chat-header-btn title=清空对话>
237<i class="fa fa-trash-o"></i>
238</button>
239<button id=aiChatClose class=ai-chat-header-btn title=关闭>
240<i class="fa fa-times"></i></button></div></div><div id=aiChatSettingsPanel class=ai-chat-settings style=display:none><div class=ai-settings-title>AI 服务商设置</div><div class=ai-settings-desc>仅保存在当前浏览器</div><div class=ai-settings-grid><label class=ai-settings-field><span class=ai-settings-label>服务商</span>
241<select id=aiSettingProvider class=ai-settings-input><option value=custom>自定义</option><option value=openai>OpenAI</option><option value=openrouter>OpenRouter</option><option value=deepseek>DeepSeek</option><option value=moonshot>Moonshot(Kimi)</option><option value=dashscope>Qwen(DashScope)</option></select>
242</label><label class=ai-settings-field><span class=ai-settings-label>API URL</span>
243<input id=aiSettingApiUrl class=ai-settings-input type=url placeholder=https://.../v1/chat/completions>
244</label><label class=ai-settings-field><span class=ai-settings-label>API Key</span>
245<input id=aiSettingApiKey class=ai-settings-input type=password placeholder=sk-...>
246</label><label class=ai-settings-field><span class=ai-settings-label>Model</span>
247<input id=aiSettingModel class=ai-settings-input type=text placeholder="gpt-4o-mini / kimi-k2.5-free ..."></label><div class=ai-settings-row><label class="ai-settings-field ai-settings-field-half"><span class=ai-settings-label>Max Tokens</span>
248<input id=aiSettingMaxTokens class=ai-settings-input type=number min=1 step=1 placeholder=4096>
249</label><label class="ai-settings-field ai-settings-field-half"><span class=ai-settings-label>Temperature</span>
250<input id=aiSettingTemperature class=ai-settings-input type=number min=0 max=2 step=0.1 placeholder=0.7></label></div></div><div class=ai-settings-actions><button id=aiSettingSave class="ai-settings-btn ai-settings-btn-primary" type=button>保存</button>
251<button id=aiSettingReset class=ai-settings-btn type=button>恢复默认</button>
252<button id=aiSettingCancel class=ai-settings-btn type=button>关闭</button></div></div><div id=aiChatMessages class=ai-chat-messages><div class=ai-chat-welcome><div class="ai-welcome-icon has-image"><img src=../../assets/images/favicon4.png style=width:100%;height:100%;border-radius:16px;object-fit:cover></div><div id=aiWelcomeNotice class=ai-welcome-notice style=display:none></div><div class=ai-welcome-title>NOISE AI 助手</div><div class=ai-welcome-text><p>你好!我是NOISE导航的AI助手,可以帮你搜索站内收录的资源</p><p>试试问我:
253• 有什么好用的AI工具?
254• 推荐一些剪辑工具网站</p></div><div class=ai-welcome-tips><span class=ai-tip-chip data-q=有什么好用的AI工具?>AI工具推荐</span><span class=ai-tip-chip data-q=推荐一些剪辑工具网站>剪辑工具</span><span class=ai-tip-chip data-q=搜索运营工具资源>运营工具</span><span class=ai-tip-chip data-q=有哪些影视资源网站?>影视资源</span></div></div></div><div id=aiChatThinking class=ai-chat-thinking style=display:none><div class=ai-thinking-avatar><span class=ai-avatar-label>AI</span></div><div class=ai-thinking-content><div class=ai-thinking-label><i class="fa fa-brain"></i> 正在深度思考...</div><div class=ai-thinking-dots><span></span><span></span><span></span></div><div id=aiThinkingProcess class=ai-thinking-process style=display:none></div></div></div><div class=ai-chat-input-area><div class=ai-chat-input-wrap><textarea id=aiChatInput class=ai-chat-input rows=1 placeholder=输入问题,搜索站内资源... maxlength=500></textarea>
255<button id=aiChatSend class=ai-chat-send title=发送>
256<i class="fa fa-paper-plane"></i></button></div><div class=ai-chat-input-hint><span class=ai-hint-mcp><svg width="12" height="12" viewBox="0 0 24 24" fill="none" style="vertical-align:-1px"><path d="M12 2 2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
256 站内搜索已启用</span>
257<span>Enter 发送 · Shift+Enter 换行</span></div></div><div class=ai-resize-handle title=拖拽调整大小></div></div><footer><div class=footer-inner><div class="footer-text gradient-text"><p>2019 - 2026 | 本站收录值得珍藏的网站,欢迎访问使用</p>©<a href=https://noisedh.cn target=_blank><strong>NOISE导航</strong></a></div><center class=gradient-text><span id=busuanzi_container_site_pv>本站总访问量<span id=busuanzi_value_site_pv></span>次</span></center>
257<script defer src=https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js></script>
257</div></footer></footer></div></div>
257<script defer type=text/javascript src='.//assets/js/jquery.ui.touch-punch.min-0.2.2.js?v=1789212122' id=jqueryui-touch-js></script>
257<script defer type=text/javascript src='.//assets/js/tooltip-extend.js?v=1789212122' id=iplaycode-nav-js></script>
257<script type=text/javascript id=popper-js-extra></script>
257<script defer type=text/javascript src='.//assets/js/bootstrap.min-4.3.1.js?v=1789212122' id=bootstrap-js></script>
257<script defer type=text/javascript src='.//assets/js/theia-sticky-sidebar-1.5.0.js?v=1789212122' id=sidebar-js></script>
257<script defer type=text/javascript src='.//assets/js/APlayer.min.js?v=1789212122' id=APlayer.min-js></script>
257<script defer type=text/javascript src='.//assets/js/Meting.min.js?v=1789212122' id=Meting.min-js></script>
257<script defer type=text/javascript src='.//assets/js/app-mini.js?v=1789212122' id=appmini-js></script>
257<script type=text/javascript>document.addEventListener("DOMContentLoaded",function(){const e=document.getElementById("loading");if(!e)return;e.classList.add("close"),setTimeout(function(){e.remove()},600)})</script>
257<script>function setNightMode(e){const t=e==="1",n=document.documentElement;n.classList.add("theme-switching"),window.requestAnimationFrame(()=>{window.requestAnimationFrame(()=>{n.classList.remove("theme-switching")})}),window.setTimeout(()=>n.classList.remove("theme-switching"),250);const s=document.body;s&&(s.classList.toggle("io-black-mode",t),s.classList.toggle("io-grey-mode",!t)),document.cookie=`night=${e};path=/`,localStorage.setItem("night",e);try{document.querySelectorAll("iframe.embedded-page-frame").forEach(function(e){if(!e||!e.contentWindow)return;e.contentWindow.postMessage({type:"ndh:theme",night:t?"1":"0"},window.location.origin)})}catch{}const o=document.querySelector(".switch-dark-mode");if(o){const e=t?"日间模式":"夜间模式";o.setAttribute("data-original-title",e),o.setAttribute("title",e)}const i=document.querySelector(".mode-ico");i&&(i.classList.toggle("icon-light",t),i.classList.toggle("icon-night",!t))}(function(){const e=localStorage.getItem("night")||(document.cookie.match(/night=([^;]+)/)||["","0"])[1];if(e!==null)setNightMode(e);else{const e=(new Date).getHours();setNightMode(e>22||e<6?"1":"0")}})();function switchNightMode(){const e=localStorage.getItem("night")||"0";setNightMode(e==="0"?"1":"0")}</script>
257<style>html{background-color:#000;color:#fff}.io-black-mode{background-color:#000;color:#fff;transition:none}.io-grey-mode{background-color:#201f1f;color:#000;transition:none}body{will-change:background-color,color}.mode-ico{transition:opacity .1s ease}#component-bg{will-change:auto}#footer-tools{position:fixed!important;z-index:2147483647!important;padding:0;border-radius:0;background:0 0;border:0;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;display:flex;flex-direction:column;align-items:center}#footer-tools .btn{width:40px!important;height:40px!important;line-height:1!important;font-size:1rem!important;border-radius:999px!important;border:2px solid rgba(18,21,33,.18)!important;background:linear-gradient(180deg,rgba(255,245,178,.96),rgba(255,222,141,.92))!important;color:#182039!important;box-shadow:0 6px rgba(17,20,34,.14)!important;transition:transform .18s ease,box-shadow .18s ease,filter .18s ease;margin:0!important;padding:0!important;display:inline-flex;align-items:center;justify-content:center}#footer-tools>.btn{margin-top:8px!important}#footer-tools>.btn:first-child{margin-top:0!important}#footer-tools>.btn.switch-dark-mode{margin-top:4px!important}#footer-tools .btn i,#footer-tools .btn svg{line-height:1}#footer-tools .toggle-section{display:flex!important;flex-direction:column;overflow:hidden;max-height:0;opacity:0;transform:translateY(6px);pointer-events:none;transition:max-height .25s ease,opacity .25s ease,transform .25s ease;margin-top:0!important}#footer-tools .toggle-section.show{max-height:360px;opacity:1;transform:translateY(0);pointer-events:auto;margin-top:8px!important}#footer-tools .toggle-section>.btn{margin:0!important}#footer-tools .toggle-section>.btn+.btn{margin-top:8px!important}#footer-tools #toggleButton.active{filter:saturate(1.12)brightness(1.02);border-color:rgba(33,79,211,.28)!important}#go-to-up{opacity:0;visibility:hidden;transform:translateY(6px);pointer-events:none;transition:opacity .18s ease,transform .18s ease,visibility 0s linear .18s}#go-to-up.is-visible{opacity:1;visibility:visible;transform:translateY(0);pointer-events:auto;transition:opacity .18s ease,transform .18s ease,visibility 0s}#footer-tools .btn:hover{transform:translateY(-2px);filter:saturate(1.05);box-shadow:0 4px rgba(17,20,34,.14)!important}#footer-tools .btn:active{transform:translateY(2px);box-shadow:0 2px rgba(17,20,34,.14)!important}#footer-tools .btn.go-up,#footer-tools #go-to-up{background:linear-gradient(180deg,rgba(214,233,255,.96),rgba(170,210,255,.92))!important}#footer-tools .btn.kefu{background:linear-gradient(180deg,rgba(255,236,198,.94),rgba(255,214,170,.92))!important}#footer-tools .btn.switch-dark-mode{background:linear-gradient(180deg,rgba(228,224,255,.96),rgba(176,168,255,.92))!important}body.io-black-mode #footer-tools{background:0 0;border-color:transparent;box-shadow:none}body.io-black-mode #footer-tools .btn{border-color:rgba(255,255,255,.12)!important;background:linear-gradient(180deg,rgba(255,222,111,.98),rgba(255,174,85,.92))!important;color:#141929!important;box-shadow:0 6px rgba(2,4,12,.28)!important}body.io-black-mode #footer-tools .btn.go-up,body.io-black-mode #footer-tools #go-to-up{background:linear-gradient(180deg,rgba(143,184,255,.92),rgba(108,146,255,.86))!important}body.io-black-mode #footer-tools .btn.kefu{background:linear-gradient(180deg,rgba(255,214,108,.96),rgba(255,180,86,.92))!important}body.io-black-mode #footer-tools .btn.switch-dark-mode{background:linear-gradient(180deg,rgba(196,190,255,.94),rgba(140,132,255,.9))!important}body{--ndh-tooltip-bg:rgba(24, 32, 57, 0.92);--ndh-tooltip-border:rgba(255, 255, 255, 0.12);--ndh-tooltip-color:rgba(255, 255, 255, 0.96);--ndh-tooltip-shadow:0 12px 28px rgba(0, 0, 0, 0.2)}body.io-black-mode{--ndh-tooltip-bg:rgba(20, 24, 34, 0.92);--ndh-tooltip-border:rgba(255, 255, 255, 0.14);--ndh-tooltip-color:rgba(255, 255, 255, 0.92);--ndh-tooltip-shadow:0 14px 34px rgba(0, 0, 0, 0.45)}.tooltip{transition:none!important}.tooltip.fade{transition:none!important}.tooltip-inner{padding:6px 10px;border-radius:10px;background:var(--ndh-tooltip-bg);color:var(--ndh-tooltip-color);border:1px solid var(--ndh-tooltip-border);box-shadow:var(--ndh-tooltip-shadow)}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^=top] .arrow::before{border-top-color:var(--ndh-tooltip-bg)}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{border-right-color:var(--ndh-tooltip-bg)}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^=bottom] .arrow::before{border-bottom-color:var(--ndh-tooltip-bg)}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{border-left-color:var(--ndh-tooltip-bg)}</style></body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.