<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>羽希</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://kwisma.github.io/</id>
  <link href="https://kwisma.github.io/" rel="alternate"/>
  <link href="https://kwisma.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 羽希</rights>
  <subtitle>梦开始的地方，也是梦结束的地方</subtitle>
  <title>一颗心始于悲哀</title>
  <updated>2026-05-12T17:00:09.389Z</updated>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="自动化" scheme="https://kwisma.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <category term="Minecraft" scheme="https://kwisma.github.io/tags/Minecraft/"/>
    <category term="SFM" scheme="https://kwisma.github.io/tags/SFM/"/>
    <category term="模组" scheme="https://kwisma.github.io/tags/%E6%A8%A1%E7%BB%84/"/>
    <content>
      <![CDATA[<p>超级工厂管理（Super Factory Manager，简称 SFM）是一款强大的 Minecraft 模组，能够通过简单的代码实现复杂的自动化操作。本教程将分享一些常用的自动化代码模板，帮助玩家更高效地管理资源和机器。</p><span id="more"></span><h2 id="灌注机"><a href="#灌注机" class="headerlink" title="灌注机"></a>灌注机</h2><p>批量燃烧物品，全自动熔炼</p><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">name <span class="string">&quot;灌注机自动化&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to <span class="string">&quot;机器&quot;</span>  <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每20个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> fluid:: from <span class="string">&quot;水槽&quot;</span>  <span class="comment">-- 从水槽输入液体</span></span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;机器&quot;</span>  <span class="comment">-- 将液体输出到每台机器</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line">    <span class="built_in">input</span> *phyto* from <span class="string">&quot;肥料箱&quot;</span>  <span class="comment">-- 从肥料箱输入“*phyto*”资源</span></span><br><span class="line">    <span class="built_in">output</span> to each <span class="string">&quot;机器&quot;</span>  <span class="comment">-- 将其输出到每台机器</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line">    <span class="keyword">if</span> insolator has &lt;<span class="number">1</span> *seeds* <span class="keyword">then</span>  <span class="comment">-- 如果机器中少于1个“*seeds*”</span></span><br><span class="line">        <span class="built_in">input</span> *seeds* from <span class="string">&quot;种子箱&quot;</span>  <span class="comment">-- 从主箱子输入“*seeds*”</span></span><br><span class="line">        <span class="built_in">output</span> <span class="number">1</span> to each <span class="string">&quot;机器&quot;</span>  <span class="comment">-- 每台机器输出1个“*seeds*”</span></span><br><span class="line">    <span class="keyword">end</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;机器&quot;</span> slots <span class="number">2</span><span class="number">-5</span>  <span class="comment">-- 从机器的第2到第5槽位输入物品</span></span><br><span class="line">    <span class="built_in">output</span> *seeds* to <span class="string">&quot;种子箱&quot;</span>  <span class="comment">-- 将“*seeds*”输出到主箱子</span></span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;箱子&quot;</span>  <span class="comment">-- 将其余物品输出到chest</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><h2 id="蜂蜜收集"><a href="#蜂蜜收集" class="headerlink" title="蜂蜜收集"></a>蜂蜜收集</h2><p>全自动收集</p><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">name <span class="string">&quot;蜜蜂资源&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span>  <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每20个刻（tick）执行以下操作</span></span><br><span class="line"><span class="comment">-- 基因提取</span></span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;me接口&quot;</span></span><br><span class="line">    <span class="built_in">output</span> *glass_bottle to <span class="string">&quot;蜂箱&quot;</span> slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> *glass_bottle to <span class="string">&quot;装瓶机&quot;</span> slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> *rose_bush to <span class="string">&quot;繁殖箱&quot;</span></span><br><span class="line">    <span class="built_in">output</span> *honey_treat to <span class="string">&quot;孵化机&quot;</span> slots <span class="number">1</span></span><br><span class="line">    <span class="built_in">output</span> *bee_cage to <span class="string">&quot;繁殖箱&quot;</span> slots <span class="number">0</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;繁殖箱&quot;</span>slots <span class="number">5</span></span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;孵化机&quot;</span> slots <span class="number">0</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;离心机&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line">    <span class="built_in">output</span> *gene to <span class="string">&quot;基因检索器&quot;</span></span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;装瓶机&quot;</span> slots <span class="number">11</span></span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line"><span class="comment">-- 养蜜蜂</span></span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;蜂箱&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line">    <span class="built_in">output</span></span><br><span class="line">        *configurable_comb,</span><br><span class="line">        *configurable_honeycomb,</span><br><span class="line">    to <span class="string">&quot;热力离心机&quot;</span> slots <span class="number">1</span></span><br><span class="line">    <span class="built_in">output</span> *gene to <span class="string">&quot;基因检索器&quot;</span></span><br><span class="line">    <span class="built_in">output</span> EXCEPT</span><br><span class="line">        *configurable_comb,</span><br><span class="line">        *configurable_honeycomb,</span><br><span class="line">        *gene,</span><br><span class="line">    to <span class="string">&quot;me接口&quot;</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line"><span class="comment">-- 离心机输出</span></span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;热力离心机&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span></span><br><span class="line">    forget  <span class="comment">-- 清除状态，确保后续操作不受之前步骤影响</span></span><br><span class="line">    <span class="built_in">input</span> fluid:: from <span class="string">&quot;热力离心机&quot;</span></span><br><span class="line">    <span class="built_in">output</span> fluid:: to <span class="string">&quot;me接口&quot;</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><h2 id="裂变燃料"><a href="#裂变燃料" class="headerlink" title="裂变燃料"></a>裂变燃料</h2><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 摆放循序：电解分离器 &gt;  化学灌注器a &gt; 化学氧化机a &gt; 回旋式气液转换机 &gt; 化学灌注器b &gt; 化学溶解室 &gt; 化学灌注器c &gt; 化学氧化机b &gt; 同位素离心机</span></span><br><span class="line">name <span class="string">&quot;裂变燃料&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span> bottom side <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每20个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> fluid:: from <span class="string">&quot;水槽&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;电解分离器&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;回旋式气液转换机&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;加压反应室&quot;</span> bottom side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;me接口&quot;</span></span><br><span class="line">    <span class="built_in">output</span> *fluorite to <span class="string">&quot;化学溶解室&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> *sulfur to <span class="string">&quot;化学氧化机a&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> *yellow_cake_uranium to <span class="string">&quot;化学氧化机b&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> *fluorite_dust to <span class="string">&quot;加压反应室&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> gas:mekanism:sulfur_trioxide from <span class="string">&quot;化学灌注器a&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> gas:mekanism:sulfur_trioxide to <span class="string">&quot;化学灌注器b&quot;</span> bottom side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> gas:mekanism:uranium_hexafluoride from <span class="string">&quot;化学灌注器c&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> gas:mekanism:uranium_hexafluoride to <span class="string">&quot;同位数离心机&quot;</span> bottom side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> gas:mekanism:fissile_fuel from <span class="string">&quot;同位数离心机&quot;</span> front side</span><br><span class="line">    <span class="built_in">output</span> gas:mekanism:fissile_fuel to <span class="string">&quot;化学储罐&quot;</span> bottom side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> pellet_plutonium from <span class="string">&quot;加压反应室&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><h2 id="四级矿产"><a href="#四级矿产" class="headerlink" title="四级矿产"></a>四级矿产</h2><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 机器可无序摆放</span></span><br><span class="line">name <span class="string">&quot;4级矿产&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span> bottom side <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每20个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> fluid:: from <span class="string">&quot;水槽&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;电解分离器&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;回旋式气液转换机&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;化学清洗机&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;电解分离器2&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to each <span class="string">&quot;电解分离器3&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> alltheores:sulfur to <span class="string">&quot;化学氧化机&quot;</span> top side <span class="comment">-- 输入硫磺</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="comment">-- 从右侧抽取氧</span></span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:oxygen from each  <span class="string">&quot;电解分离器&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:oxygen to <span class="string">&quot;化学灌注室a&quot;</span> west side</span><br><span class="line">    forget</span><br><span class="line">    <span class="comment">-- 从右侧抽取二氧化硫</span></span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:sulfur_dioxide from each <span class="string">&quot;化学氧化机&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:sulfur_dioxide to <span class="string">&quot;化学灌注室a&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> chemical:mekanism:sulfur_trioxide  from each <span class="string">&quot;化学灌注室a&quot;</span> north side</span><br><span class="line">    <span class="built_in">output</span> chemical:mekanism:sulfur_trioxide to <span class="string">&quot;化学灌注室b&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:water_vapor from each <span class="string">&quot;回旋式气液转换机&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:water_vapor to <span class="string">&quot;化学灌注室b&quot;</span> west side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:sulfuric_acid from each <span class="string">&quot;化学灌注室b&quot;</span> north side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:sulfuric_acid to <span class="string">&quot;化学溶解室&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> infusion:: from each <span class="string">&quot;化学溶解室&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> infusion:: to <span class="string">&quot;化学清洗机&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> infusion:: from each <span class="string">&quot;化学清洗机&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> infusion:: to <span class="string">&quot;化学结晶室&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;化学结晶室&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;化学压射室&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> fluid:: from each <span class="string">&quot;盐水&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> fluid:: to <span class="string">&quot;电解分离器1&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:chlorine from each <span class="string">&quot;电解分离器1&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:chlorine to <span class="string">&quot;化学灌注室1&quot;</span> west side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:hydrogen from  each <span class="string">&quot;电解分离器2&quot;</span> east side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:hydrogen to <span class="string">&quot;化学灌注室1&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:hydrogen_chloride  from each <span class="string">&quot;化学灌注室1&quot;</span> north side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:hydrogen_chloride to <span class="string">&quot;化学压射室&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;化学压射室&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;提纯工厂&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> slurry:mekanism:oxygen from each <span class="string">&quot;电解分离器3&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> slurry:mekanism:oxygen to <span class="string">&quot;提纯工厂&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;提纯工厂&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;粉碎机&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;粉碎机&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;富集工厂&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;富集工厂&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;熔炼工厂&quot;</span> east side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;熔炼工厂&quot;</span> west side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> east side</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><h2 id="熔炼工厂"><a href="#熔炼工厂" class="headerlink" title="熔炼工厂"></a>熔炼工厂</h2><blockquote><p>沙砾和沙子产物处理</p></blockquote><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 沙砾和沙子产物处理</span></span><br><span class="line">name <span class="string">&quot;熔炼工厂&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span> bottom side <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">input</span> from  <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> minecraft:gravel to each <span class="string">&quot;筛子&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line">    <span class="built_in">output</span> <span class="number">1</span> exdeorum:netherite_mesh to each <span class="string">&quot;筛子&quot;</span> slots <span class="number">1</span></span><br><span class="line">    <span class="built_in">output</span> <span class="number">3</span> exmachinis:diamond_upgrade to each <span class="string">&quot;筛子&quot;</span> slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> minecraft:sand to each <span class="string">&quot;筛子2&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line">    <span class="built_in">output</span> <span class="number">1</span> exdeorum:netherite_mesh to each <span class="string">&quot;筛子2&quot;</span> slots <span class="number">1</span></span><br><span class="line">    <span class="built_in">output</span> <span class="number">3</span> exmachinis:diamond_upgrade to each <span class="string">&quot;筛子2&quot;</span> slots <span class="number">0</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;缓存&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span></span><br><span class="line">        minecraft:gold_ore,</span><br><span class="line">        minecraft:iron_ore,</span><br><span class="line">        alltheores:platinum_ore,</span><br><span class="line">        alltheores:lead_ore,</span><br><span class="line">        minecraft:copper_ore,</span><br><span class="line">        alltheores:aluminum_ore,</span><br><span class="line">        alltheores:silver_ore,</span><br><span class="line">        alltheores:osmium_ore,</span><br><span class="line">        alltheores:tin_ore,</span><br><span class="line">        alltheores:nickel_ore,</span><br><span class="line">        alltheores:zinc_ore,</span><br><span class="line">        alltheores:uranium_ore,</span><br><span class="line">    from <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to each <span class="string">&quot;熔炉&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span></span><br><span class="line">        allthemodium:allthemodium_nugget,</span><br><span class="line">        minecraft:emerald,</span><br><span class="line">        xycraft_world:xychorium_gem_red,</span><br><span class="line">        actuallyadditions:black_quartz,</span><br><span class="line">        minecraft:coal,</span><br><span class="line">        minecraft:flint,</span><br><span class="line">        alltheores:salt,</span><br><span class="line">        alltheores:sulfur,</span><br><span class="line">        forbidden_arcanus:arcane_crystal,</span><br><span class="line">        minecraft:amethyst_shard,</span><br><span class="line">        minecraft:redstone,</span><br><span class="line">        minecraft:blaze_powder,</span><br><span class="line">        minecraft:gunpowder,</span><br><span class="line">        minecraft:sea_pickle,</span><br><span class="line">        minecraft:prismarine_shard,</span><br><span class="line">        minecraft:prismarine_crystals,</span><br><span class="line">        minecraft:kelp,</span><br><span class="line">        alltheores:fluorite,</span><br><span class="line">        xycraft_world:xychorium_gem_dark,</span><br><span class="line">        powah:uraninite,</span><br><span class="line">        xycraft_world:xychorium_gem_light,</span><br><span class="line">        minecraft:cactus,</span><br><span class="line">        ae2:charged_certus_quartz_crystal,</span><br><span class="line">        enderio:grains_of_infinity,</span><br><span class="line">        minecraft:iron_nugget,</span><br><span class="line">        minecraft:diamond,</span><br><span class="line">        ae2:certus_quartz_dust,</span><br><span class="line">        ae2:certus_quartz_crystal,</span><br><span class="line">        xycraft_world:xychorium_gem_blue,</span><br><span class="line">        xycraft_world:xychorium_gem_green,</span><br><span class="line">        minecraft:glowstone_dust,</span><br><span class="line">        minecraft:bone_meal,</span><br><span class="line">        ae2:sky_dust,</span><br><span class="line">        minecraft:lapis_lazuli,</span><br><span class="line">    from <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;熔炉&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><blockquote><p>深板岩</p></blockquote><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">name <span class="string">&quot;深板岩筛矿&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span> bottom side <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">input</span> from  <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> *cobbled_deepslate_9x to each <span class="string">&quot;粉碎&quot;</span> top side</span><br><span class="line"><span class="comment">--    output 1 exdeorum:netherite_mesh to each &quot;筛子&quot; slots 1</span></span><br><span class="line"><span class="comment">--    output 3 exmachinis:diamond_upgrade to each &quot;筛子&quot; slots 0</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> *crushed_deepslate_9x from <span class="string">&quot;粉碎&quot;</span> north side</span><br><span class="line">    <span class="built_in">output</span> *crushed_deepslate_9x to <span class="string">&quot;合成&quot;</span> slots <span class="number">2</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> *crushed_deepslate_7x from <span class="string">&quot;合成&quot;</span> slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> *crushed_deepslate_7x to <span class="string">&quot;合成2&quot;</span> slots <span class="number">2</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> *crushed_deepslate_5x from <span class="string">&quot;合成2&quot;</span> west side slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> *crushed_deepslate_5x to <span class="string">&quot;合成3&quot;</span> slots <span class="number">2</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> *crushed_deepslate_3x from <span class="string">&quot;合成3&quot;</span> slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> *crushed_deepslate_3x to <span class="string">&quot;合成4&quot;</span> slots <span class="number">2</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> *crushed_deepslate_1x from <span class="string">&quot;合成4&quot;</span> slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> *crushed_deepslate_1x to <span class="string">&quot;合成5&quot;</span> slots <span class="number">2</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> *crushed_deepslate from <span class="string">&quot;合成5&quot;</span>  slots <span class="number">0</span></span><br><span class="line">    <span class="built_in">output</span> to each <span class="string">&quot;筛子&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;缓存&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span></span><br><span class="line">        alltheores:tin_ore,</span><br><span class="line">        alltheores:osmium_ore,</span><br><span class="line">        alltheores:silver_ore,</span><br><span class="line">        minecraft:copper_ore,</span><br><span class="line">        alltheores:lead_ore,</span><br><span class="line">        alltheores:platinum_ore,</span><br><span class="line">        minecraft:iron_ore,</span><br><span class="line">        minecraft:gold_ore,</span><br><span class="line">        alltheores:nickel_ore,</span><br><span class="line">        alltheores:uranium_ore,</span><br><span class="line">    from <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to each <span class="string">&quot;熔炉&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span></span><br><span class="line">        minecraft:amethyst_shard,</span><br><span class="line">        minecraft:lapis_lazuli,</span><br><span class="line">    from <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;熔炉&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><blockquote><p>尘土</p></blockquote><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">name <span class="string">&quot;尘土筛矿&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span> bottom side <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">input</span> from  <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> exdeorum:dust to each <span class="string">&quot;筛子&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line"><span class="comment">--    output 1 exdeorum:netherite_mesh to each &quot;筛子&quot; slots 1</span></span><br><span class="line"><span class="comment">--    output 3 exmachinis:diamond_upgrade to each &quot;筛子&quot; slots 0</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;缓存&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><blockquote><p>沙子</p></blockquote><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">name <span class="string">&quot;沙子筛矿&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span> bottom side <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">input</span> from  <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> minecraft:sand to each <span class="string">&quot;筛子&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line"><span class="comment">--    output 1 exdeorum:netherite_mesh to each &quot;筛子&quot; slots 1</span></span><br><span class="line"><span class="comment">--    output 3 exmachinis:diamond_upgrade to each &quot;筛子&quot; slots 0</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;缓存&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure><blockquote><p>沙砾</p></blockquote><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">name <span class="string">&quot;沙砾筛矿&quot;</span>  <span class="comment">-- 定义机器的名称</span></span><br><span class="line"></span><br><span class="line">every <span class="number">1</span> ticks <span class="keyword">do</span>  <span class="comment">-- 每1个刻（tick）执行以下操作</span></span><br><span class="line">    <span class="built_in">input</span> forge_energy:: from <span class="string">&quot;能量&quot;</span> top side  <span class="comment">-- 从顶部立方体输入锻造能量</span></span><br><span class="line">    <span class="built_in">output</span> forge_energy:: to each <span class="string">&quot;机器&quot;</span> bottom side <span class="comment">-- 将能量输出到机器</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">every <span class="number">20</span> ticks <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">input</span> from  <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> minecraft:gravel to each <span class="string">&quot;筛子&quot;</span> slots <span class="number">2</span><span class="number">-10</span></span><br><span class="line"><span class="comment">--    output 1 exdeorum:netherite_mesh to each &quot;筛子&quot; slots 1</span></span><br><span class="line"><span class="comment">--    output 3 exmachinis:diamond_upgrade to each &quot;筛子&quot; slots 0</span></span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;缓存&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span></span><br><span class="line">        minecraft:gold_ore,</span><br><span class="line">        minecraft:iron_ore,</span><br><span class="line">        alltheores:platinum_ore,</span><br><span class="line">        alltheores:lead_ore,</span><br><span class="line">        minecraft:copper_ore,</span><br><span class="line">        alltheores:aluminum_ore,</span><br><span class="line">        alltheores:silver_ore,</span><br><span class="line">        alltheores:osmium_ore,</span><br><span class="line">        alltheores:tin_ore,</span><br><span class="line">        alltheores:nickel_ore,</span><br><span class="line">        alltheores:zinc_ore,</span><br><span class="line">        alltheores:uranium_ore,</span><br><span class="line">    from <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to each <span class="string">&quot;熔炉&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span></span><br><span class="line">        minecraft:coal,</span><br><span class="line">        minecraft:amethyst_shard,</span><br><span class="line">        minecraft:emerald,</span><br><span class="line">        minecraft:diamond,</span><br><span class="line">        minecraft:lapis_lazuli,</span><br><span class="line">    from <span class="string">&quot;处理&quot;</span> top side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line">    forget</span><br><span class="line">    <span class="built_in">input</span> from each <span class="string">&quot;熔炉&quot;</span> bottom side</span><br><span class="line">    <span class="built_in">output</span> to <span class="string">&quot;me接口&quot;</span> top side</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2026/05/10/sfm_automation_guide/</id>
    <link href="https://kwisma.github.io/2026/05/10/sfm_automation_guide/"/>
    <published>2026-05-10T11:28:46.000Z</published>
    <summary>
      <![CDATA[<p>超级工厂管理（Super Factory Manager，简称 SFM）是一款强大的 Minecraft 模组，能够通过简单的代码实现复杂的自动化操作。本教程将分享一些常用的自动化代码模板，帮助玩家更高效地管理资源和机器。</p>]]>
    </summary>
    <title>SFM 自动化代码</title>
    <updated>2026-05-12T17:00:09.389Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="Android" scheme="https://kwisma.github.io/tags/Android/"/>
    <category term="WiFi" scheme="https://kwisma.github.io/tags/WiFi/"/>
    <category term="连接问题" scheme="https://kwisma.github.io/tags/%E8%BF%9E%E6%8E%A5%E9%97%AE%E9%A2%98/"/>
    <category term="captive portal" scheme="https://kwisma.github.io/tags/captive-portal/"/>
    <content>
      <![CDATA[<p>当 Android 设备连接到 WiFi 网络时，系统会进行“网络连通性检测”（captive portal detection），通过向特定 URL 发送 HTTP 请求并检查返回的状态码来判断是否能够正常访问互联网。如果检测失败，系统会在 WiFi 图标上叠加感叹号或叉号，影响使用体验。本文介绍如何自定义或关闭该检测，移除网络图标上的感叹号&#x2F;叉号。</p><span id="more"></span><h2 id="什么是-generate-204"><a href="#什么是-generate-204" class="headerlink" title="什么是 generate_204"></a>什么是 <code>generate_204</code></h2><p><code>generate_204</code> 是 HTTP Status Code <strong>204 No Content</strong> 的空白响应代码服务接口，用于检测网络连通性。当设备向此接口发送请求并收到 204 状态码时，判定网络可用；否则认为需要登录或网络不可用。</p><h2 id="公共-generate-204-服务接口列表"><a href="#公共-generate-204-服务接口列表" class="headerlink" title="公共 generate_204 服务接口列表"></a>公共 <code>generate_204</code> 服务接口列表</h2><p>下表列出了常见厂商和服务提供商的 <code>generate_204</code> 接口（以及部分非 204 返回的测试接口）：</p><table><thead><tr><th>服务提供商</th><th>链接</th><th>HTTP&#x2F;HTTPS</th><th>IP Version</th></tr></thead><tbody><tr><td>华为</td><td><a href="http://connectivitycheck.platform.hicloud.com/generate_204">http://connectivitycheck.platform.hicloud.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4</td></tr><tr><td>荣耀</td><td><a href="http://connectivitycheck.platform.hihonorcloud.com/generate_204">http://connectivitycheck.platform.hihonorcloud.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>小米</td><td><a href="http://connect.rom.miui.com/generate_204">http://connect.rom.miui.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4</td></tr><tr><td>Cloudflare</td><td><a href="https://cp.cloudflare.com/generate_204">https://cp.cloudflare.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Firefox</td><td><a href="http://detectportal.firefox.com/success.txt">http://detectportal.firefox.com/success.txt</a></td><td>200 &#x2F; 200</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="https://clients1.google.com/generate_204">https://clients1.google.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="https://clients2.google.com/generate_204">https://clients2.google.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="https://googleapis.com/generate_204">https://googleapis.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="https://goo.gl/generate_204">https://goo.gl/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="http://google.cn/generate_204">http://google.cn/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="http://google.com.hk/generate_204">http://google.com.hk/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="http://google.com.tw/generate_204">http://google.com.tw/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="http://google.com/generate_204">http://google.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="http://www.gstatic.com/generate_204">http://www.gstatic.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="http://www.youtube.com/generate_204">http://www.youtube.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Google</td><td><a href="http://yt.be/generate_204">http://yt.be/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Microsoft</td><td><a href="http://www.msftconnecttest.com/connecttest.txt">http://www.msftconnecttest.com/connecttest.txt</a></td><td>200 &#x2F; err</td><td>IPv4</td></tr><tr><td>OPPO</td><td><a href="http://conn1.oppomobile.com/generate_204">http://conn1.oppomobile.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>OPPO</td><td><a href="http://conn2.oppomobile.com/generate_204">http://conn2.oppomobile.com/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>Qualcomm</td><td><a href="http://www.qualcomm.cn/generate_204">http://www.qualcomm.cn/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4 &amp; IPv6</td></tr><tr><td>vivo</td><td><a href="http://wifi.vivo.com.cn/generate_204">http://wifi.vivo.com.cn/generate_204</a></td><td>204 &#x2F; 204</td><td>IPv4</td></tr></tbody></table><blockquote><p><strong>说明</strong>：表中 Google 相关多个域名接口仅列出常见示例，实际厂商和服务域名更多。</p></blockquote><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><p>建议根据设备所在地选择延迟最低、支持 <strong>HTTP&#x2F;HTTPS</strong> 双协议栈、且返回 <strong>204</strong> 状态码的接口；部分 Android 版本对协议栈或状态码有严格要求。</p><ul><li>Android 6.x 及以下</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell <span class="string">&quot;settings put global captive_portal_server connect.rom.miui.com&quot;</span></span><br></pre></td></tr></table></figure><ul><li>Android 7.x 及以上（需分别设置 HTTP&#x2F;HTTPS）</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204</span><br></pre></td></tr></table></figure><ul><li>禁用网络连通性检测（移除感叹号&#x2F;叉号）</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell settings put global captive_portal_detection_enabled 0</span><br></pre></td></tr></table></figure><ul><li>启用网络连通性检测</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell settings put global captive_portal_detection_enabled 1</span><br></pre></td></tr></table></figure><ul><li>（可选）设置 NTP 校时服务器地址</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell settings put global ntp_server ntp.ntsc.ac.cn</span><br></pre></td></tr></table></figure><ul><li>查看所有可配置项</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell settings list global</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell getprop</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>：禁用检测后，WiFi 图标不再显示感叹号&#x2F;叉号，但无法自动发现需要登录的门户页面。</p></blockquote><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ol><li>Android Captive Portal 原理与设置详解：<a href="https://www.noisyfox.io/android-captive-portal.html">https://www.noisyfox.io/android-captive-portal.html</a></li></ol>]]>
    </content>
    <id>https://kwisma.github.io/2025/05/11/captive_portal_detection/</id>
    <link href="https://kwisma.github.io/2025/05/11/captive_portal_detection/"/>
    <published>2025-05-11T11:58:00.000Z</published>
    <summary>
      <![CDATA[<p>当 Android 设备连接到 WiFi 网络时，系统会进行“网络连通性检测”（captive portal detection），通过向特定 URL 发送 HTTP 请求并检查返回的状态码来判断是否能够正常访问互联网。如果检测失败，系统会在 WiFi 图标上叠加感叹号或叉号，影响使用体验。本文介绍如何自定义或关闭该检测，移除网络图标上的感叹号&#x2F;叉号。</p>]]>
    </summary>
    <title>类原生 Android 去除 WiFi 网络感叹号/叉号</title>
    <updated>2026-05-12T16:54:58.877Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="GitHub" scheme="https://kwisma.github.io/tags/GitHub/"/>
    <category term="自动化" scheme="https://kwisma.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <category term="GitHub API" scheme="https://kwisma.github.io/tags/GitHub-API/"/>
    <category term="Bash" scheme="https://kwisma.github.io/tags/Bash/"/>
    <content>
      <![CDATA[<p>本项目提供了一个 Bash 脚本，用于将指定目录下的所有文件自动上传到 GitHub Release。它通过 GitHub API 自动创建以日期命名的 Release、删除已存在的同名附件，并上传最新的文件内容。</p><p>该脚本适用于日常任务自动发布、CI&#x2F;CD 管道中的文件归档、版本记录和工具打包等场景，特别适合需要将每日构建结果或更新文件推送到 Release 的使用者。</p><span id="more"></span><h2 id="功能介绍"><a href="#功能介绍" class="headerlink" title="功能介绍"></a>功能介绍</h2><ul><li>自动检测当天的 GitHub Release 是否存在，不存在则创建；</li><li>自动遍历指定目录下的所有文件，逐个上传到 GitHub Release；</li><li>如已存在同名附件，自动删除旧附件再上传；</li><li>上传文件时自动保留原文件名作为 release 附件名。</li></ul><h2 id="使用说明"><a href="#使用说明" class="headerlink" title="使用说明"></a>使用说明</h2><h3 id="1-准备工作"><a href="#1-准备工作" class="headerlink" title="1. 准备工作"></a>1. 准备工作</h3><ul><li>拥有一个 GitHub 仓库；</li><li>生成一个 GitHub Token（需要 <code>repo</code> 权限）；</li><li>安装 <code>jq</code>（用于处理 JSON 数据）：</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install jq</span><br></pre></td></tr></table></figure><h3 id="2-设置上传目录"><a href="#2-设置上传目录" class="headerlink" title="2. 设置上传目录"></a>2. 设置上传目录</h3><p>将你要上传的文件放入 <code>upload/</code> 文件夹（也可修改脚本中的路径）。</p><h3 id="3-代码保存"><a href="#3-代码保存" class="headerlink" title="3. 代码保存"></a>3. 代码保存</h3><p>将如下代码保存至 <code>up.sh</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">token=<span class="string">&quot;你的 GitHub Token&quot;</span></span><br><span class="line">repo=<span class="string">&quot;你的用户名/你的仓库名&quot;</span></span><br><span class="line">upload_dir=<span class="string">&quot;upload&quot;</span>  <span class="comment"># 可根据需要修改</span></span><br><span class="line">tag=$(<span class="built_in">date</span> +<span class="string">&quot;%Y.%m.%d&quot;</span>) <span class="comment">#上传标签</span></span><br><span class="line">upload_dir=<span class="string">&quot;upload&quot;</span> <span class="comment">#上传目录</span></span><br><span class="line">release_body=<span class="string">&quot;&quot;</span> <span class="comment">#上传描述</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;上传文件到 GitHub Release...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取 release 信息（如果不存在会返回 null）</span></span><br><span class="line">release_info=$(curl -s -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">  https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/tags/<span class="variable">$&#123;tag&#125;</span>)</span><br><span class="line"></span><br><span class="line">release_id=$(<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$release_info</span>&quot;</span> | jq -r <span class="string">&#x27;.id&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果 release 不存在，则创建一个</span></span><br><span class="line"><span class="keyword">if</span> [[ <span class="string">&quot;<span class="variable">$release_id</span>&quot;</span> == <span class="string">&quot;null&quot;</span> || -z <span class="string">&quot;<span class="variable">$release_id</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Release 不存在，正在创建 Release...&quot;</span></span><br><span class="line">  release_info=$(curl -s -X POST \</span><br><span class="line">    -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">    -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">    -d <span class="string">&quot;&#123;</span></span><br><span class="line"><span class="string">      \&quot;tag_name\&quot;: \&quot;<span class="variable">$&#123;tag&#125;</span>\&quot;,</span></span><br><span class="line"><span class="string">      \&quot;name\&quot;: \&quot;<span class="variable">$&#123;tag&#125;</span>\&quot;,</span></span><br><span class="line"><span class="string">      \&quot;body\&quot;: \&quot;<span class="variable">$&#123;release_body&#125;</span>\&quot;,</span></span><br><span class="line"><span class="string">      \&quot;draft\&quot;: false,</span></span><br><span class="line"><span class="string">      \&quot;prerelease\&quot;: false</span></span><br><span class="line"><span class="string">    &#125;&quot;</span> \</span><br><span class="line">    https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases)</span><br><span class="line"></span><br><span class="line">  release_id=$(<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$release_info</span>&quot;</span> | jq -r <span class="string">&#x27;.id&#x27;</span>)</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;已创建 Release：ID = <span class="variable">$release_id</span>&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;Release 已存在：ID = <span class="variable">$release_id</span>&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 遍历目录下所有文件上传</span></span><br><span class="line"><span class="keyword">for</span> filepath <span class="keyword">in</span> <span class="string">&quot;<span class="variable">$upload_dir</span>&quot;</span>/*; <span class="keyword">do</span></span><br><span class="line">  filename=$(<span class="built_in">basename</span> <span class="string">&quot;<span class="variable">$filepath</span>&quot;</span>)</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;处理文件：<span class="variable">$filename</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 检查是否已有同名附件</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;检查是否已有名为 <span class="variable">$&#123;filename&#125;</span> 的附件...&quot;</span></span><br><span class="line">  assets=$(curl -s -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">    https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/<span class="variable">$&#123;release_id&#125;</span>/assets)</span><br><span class="line"></span><br><span class="line">  asset_id=$(<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$assets</span>&quot;</span> | jq -r <span class="string">&quot;.[] | select(.name == \&quot;<span class="variable">$&#123;filename&#125;</span>\&quot;) | .id&quot;</span>)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$asset_id</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;发现同名附件（ID: <span class="variable">$asset_id</span>），正在删除...&quot;</span></span><br><span class="line">    curl -s -X DELETE -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">      https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/assets/<span class="variable">$&#123;asset_id&#125;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;已删除旧附件&quot;</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 上传新的附件</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;上传新附件 <span class="variable">$&#123;filename&#125;</span>...&quot;</span></span><br><span class="line">  curl -s -X POST \</span><br><span class="line">    -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">    -H <span class="string">&quot;Content-Type: application/octet-stream&quot;</span> \</span><br><span class="line">    --data-binary @<span class="string">&quot;<span class="variable">$&#123;filepath&#125;</span>&quot;</span> \</span><br><span class="line">    <span class="string">&quot;https://uploads.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/<span class="variable">$&#123;release_id&#125;</span>/assets?name=<span class="variable">$&#123;filename&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;上传完成 ✅&quot;</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h3 id="4-修改脚本配置项"><a href="#4-修改脚本配置项" class="headerlink" title="4. 修改脚本配置项"></a>4. 修改脚本配置项</h3><p>编辑 <code>up.sh</code> 中以下内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">token=<span class="string">&quot;你的 GitHub Token&quot;</span></span><br><span class="line">repo=<span class="string">&quot;你的用户名/你的仓库名&quot;</span></span><br><span class="line">upload_dir=<span class="string">&quot;upload&quot;</span>  <span class="comment"># 可根据需要修改</span></span><br><span class="line">tag=$(<span class="built_in">date</span> +<span class="string">&quot;%Y.%m.%d&quot;</span>) <span class="comment">#上传标签</span></span><br><span class="line">upload_dir=<span class="string">&quot;upload&quot;</span> <span class="comment">#上传目录</span></span><br><span class="line">release_body=<span class="string">&quot;&quot;</span> <span class="comment">#上传描述</span></span><br></pre></td></tr></table></figure><h3 id="5-运行脚本"><a href="#5-运行脚本" class="headerlink" title="5. 运行脚本"></a>5. 运行脚本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash up.sh</span><br></pre></td></tr></table></figure><p>执行后会自动：</p><ul><li>检查或创建当天的 Release；</li><li>删除已存在的同名文件；</li><li>上传新文件至 Release。</li></ul><h2 id="示例输出"><a href="#示例输出" class="headerlink" title="示例输出"></a>示例输出</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">上传文件到 GitHub Release...</span><br><span class="line">Release 不存在，正在创建 Release...</span><br><span class="line">已创建 Release：ID = 12345678</span><br><span class="line">处理文件：example.txt</span><br><span class="line">检查是否已有名为 example.txt 的附件...</span><br><span class="line">上传新附件 example.txt...</span><br><span class="line">上传完成 ✅</span><br></pre></td></tr></table></figure><h2 id="常见用途"><a href="#常见用途" class="headerlink" title="常见用途"></a>常见用途</h2><ul><li>自动发布构建产物（如编译后的程序包）；</li><li>每日归档日志或数据文件；</li><li>备份 CI&#x2F;CD 结果；</li><li>简化 Release 管理流程。</li></ul><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ul><li>默认以 <code>年.月.日</code> 形式自动生成 tag；</li><li>GitHub Release 的单个附件大小限制为 2GB；</li><li>脚本不会递归子目录，仅处理指定目录下的一级文件。</li></ul><h2 id="授权协议"><a href="#授权协议" class="headerlink" title="授权协议"></a>授权协议</h2><p>脚本部分基于 MIT License 开源发布，欢迎自由使用与修改。如需商业部署，请留意 GitHub API 使用条款。</p>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/15/github_release_auto_upload/</id>
    <link href="https://kwisma.github.io/2025/04/15/github_release_auto_upload/"/>
    <published>2025-04-15T06:17:30.000Z</published>
    <summary>
      <![CDATA[<p>本项目提供了一个 Bash 脚本，用于将指定目录下的所有文件自动上传到 GitHub Release。它通过 GitHub API 自动创建以日期命名的 Release、删除已存在的同名附件，并上传最新的文件内容。</p>
<p>该脚本适用于日常任务自动发布、CI&#x2F;CD 管道中的文件归档、版本记录和工具打包等场景，特别适合需要将每日构建结果或更新文件推送到 Release 的使用者。</p>]]>
    </summary>
    <title>GitHub Release 自动上传脚本</title>
    <updated>2026-05-12T16:58:53.265Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="GitHub" scheme="https://kwisma.github.io/tags/GitHub/"/>
    <category term="Release管理" scheme="https://kwisma.github.io/tags/Release%E7%AE%A1%E7%90%86/"/>
    <category term="Bash脚本" scheme="https://kwisma.github.io/tags/Bash%E8%84%9A%E6%9C%AC/"/>
    <category term="自动化" scheme="https://kwisma.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <content>
      <![CDATA[<p>在日常开发过程中，我们常常需要手动维护 GitHub 的 Release、附件资源、Tag 等内容，繁琐且容易出错。为了解决这个问题，我编写了一个脚本，用于自动删除指定的 GitHub Release 附件、对应的 Release 记录以及 Tag 标签，从而提高工作效率，降低误操作的风险。</p><span id="more"></span><h2 id="使用说明"><a href="#使用说明" class="headerlink" title="使用说明"></a>使用说明</h2><h3 id="依赖项"><a href="#依赖项" class="headerlink" title="依赖项"></a>依赖项</h3><ul><li><code>curl</code></li><li><code>jq</code></li><li>GitHub Personal Access Token（需要 <code>repo</code> 权限）</li></ul><h3 id="脚本功能"><a href="#脚本功能" class="headerlink" title="脚本功能"></a>脚本功能</h3><ol><li>根据指定的 tag 获取 release_id；</li><li>查找 release 中名为 <code>${asset_name}</code> 的附件；</li><li>如果找到了，删除该附件；</li><li>删除对应的 release；</li><li>删除 tag。</li></ol><h3 id="使用方式"><a href="#使用方式" class="headerlink" title="使用方式"></a>使用方式</h3><p>将以下代码保存到 <code>delete_github_release.sh</code></p><p>环境变量：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">token=<span class="string">&quot;你的 GitHub Token&quot;</span></span><br><span class="line">repo=<span class="string">&quot;用户名/仓库名&quot;</span></span><br><span class="line">tag=<span class="string">&quot;release 的 tag 名&quot;</span></span><br><span class="line">asset_name=<span class="string">&quot;需要删除的附件名&quot;</span></span><br></pre></td></tr></table></figure><p>删除附件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;正在删除 Release 附件：<span class="variable">$asset_name</span>&quot;</span></span><br><span class="line"></span><br><span class="line">asset_id=$(curl -s -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">  https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/<span class="variable">$&#123;release_id&#125;</span>/assets \</span><br><span class="line">  | jq -r <span class="string">&quot;.[] | select(.name == \&quot;<span class="variable">$&#123;asset_name&#125;</span>\&quot;) | .id&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$asset_id</span>&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">  curl -s -X DELETE \</span><br><span class="line">    -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">    https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/assets/<span class="variable">$&#123;asset_id&#125;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;✅ 已删除附件：<span class="variable">$asset_name</span>&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;⚠️ 未找到附件：<span class="variable">$asset_name</span>&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>删除 <code>release</code> 和 <code>tags</code> 标签</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;正在删除 Release 附件：<span class="variable">$asset_name</span>&quot;</span></span><br><span class="line"></span><br><span class="line">release_id=$(curl -s -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">  https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/tags/<span class="variable">$&#123;tag&#125;</span> | jq -r .<span class="built_in">id</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除 release</span></span><br><span class="line"><span class="keyword">if</span> [[ -n <span class="string">&quot;<span class="variable">$release_id</span>&quot;</span> &amp;&amp; <span class="string">&quot;<span class="variable">$release_id</span>&quot;</span> != <span class="string">&quot;null&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">  curl -s -X DELETE \</span><br><span class="line">    -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">    https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/releases/<span class="variable">$&#123;release_id&#125;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;🗑️ 已删除 Release：<span class="variable">$tag</span>&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;⚠️ 未找到 Release：<span class="variable">$asset_name</span>&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除 tag</span></span><br><span class="line">response_code=$(curl -s -o /dev/null -w <span class="string">&quot;%&#123;http_code&#125;&quot;</span> -X DELETE \</span><br><span class="line">  -H <span class="string">&quot;Authorization: token <span class="variable">$&#123;token&#125;</span>&quot;</span> \</span><br><span class="line">  https://api.github.com/repos/<span class="variable">$&#123;repo&#125;</span>/git/refs/tags/<span class="variable">$&#123;tag&#125;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> [[ <span class="string">&quot;<span class="variable">$response_code</span>&quot;</span> == <span class="string">&quot;204&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;🏷️ 已删除 Tag：<span class="variable">$tag</span>&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;⚠️ 未找到 Tag：<span class="variable">$asset_name</span>&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><p>执行代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash delete_github_release.sh</span><br></pre></td></tr></table></figure><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ul><li>建议先备份 Release 内容，确认无误后再执行脚本；</li><li>GitHub 的 API 请求有频率限制，Token 权限不足也会导致操作失败；</li><li><code>tag</code> 必须已存在，否则无法获取 <code>release_id</code>。</li></ul><h2 id="示例场景"><a href="#示例场景" class="headerlink" title="示例场景"></a>示例场景</h2><p>你在自动化部署项目时，上传了多个 Release 文件，后续需要删除其中某一个旧版本资源，并清理无用的 Release 标签时可以使用本脚本。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>这个脚本可以集成到 CI&#x2F;CD 流程中，也可以单独运行，灵活性高。如果你有更多想法或者改进建议，欢迎交流～</p>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/15/delete_github_release/</id>
    <link href="https://kwisma.github.io/2025/04/15/delete_github_release/"/>
    <published>2025-04-15T05:43:16.000Z</published>
    <summary>
      <![CDATA[<p>在日常开发过程中，我们常常需要手动维护 GitHub 的 Release、附件资源、Tag 等内容，繁琐且容易出错。为了解决这个问题，我编写了一个脚本，用于自动删除指定的 GitHub Release 附件、对应的 Release 记录以及 Tag 标签，从而提高工作效率，降低误操作的风险。</p>]]>
    </summary>
    <title>使用 Bash 脚本批量删除 GitHub Release 附件与标签</title>
    <updated>2026-05-12T16:57:43.337Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="Clash" scheme="https://kwisma.github.io/tags/Clash/"/>
    <category term="Mihomo" scheme="https://kwisma.github.io/tags/Mihomo/"/>
    <category term="YAML" scheme="https://kwisma.github.io/tags/YAML/"/>
    <category term="Nodejs" scheme="https://kwisma.github.io/tags/Nodejs/"/>
    <category term="Proxy-config" scheme="https://kwisma.github.io/tags/Proxy-config/"/>
    <category term="Rule-providers" scheme="https://kwisma.github.io/tags/Rule-providers/"/>
    <category term="Config-cleaner" scheme="https://kwisma.github.io/tags/Config-cleaner/"/>
    <category term="automation" scheme="https://kwisma.github.io/tags/automation/"/>
    <content>
      <![CDATA[<p>在配置如 Clash 等代理工具的 YAML 文件时，经常会出现定义了许多 <code>rule-providers</code>，但在 <code>rules</code> 中实际并未使用的问题。这不仅会导致配置臃肿、维护成本增加，也可能降低配置文件的加载效率。</p><p>为了解决这个问题，本工具可自动读取并分析你的 YAML 配置文件，找出那些 <strong>在 <code>rule-providers</code> 中定义了却没有在 <code>rules</code> 中被引用</strong> 的部分，并输出详细的日志与统计信息，方便你快速清理无用规则。</p><span id="more"></span><h2 id="🎯-功能简介"><a href="#🎯-功能简介" class="headerlink" title="🎯 功能简介"></a>🎯 功能简介</h2><ul><li>✅ 自动分析 <code>config.yaml</code> 中的 <code>rules</code> 和 <code>rule-providers</code></li><li>✅ 精准识别 <code>RULE-SET</code> 类型的规则引用</li><li>✅ 找出未被引用的 <code>rule-providers</code></li><li>✅ 输出详细日志信息与总计统计</li><li>✅ 帮助你优化配置文件，清理无效资源</li></ul><hr><h2 id="📦-安装方法"><a href="#📦-安装方法" class="headerlink" title="📦 安装方法"></a>📦 安装方法</h2><p>你需要先确保本地有 Node.js 环境，然后安装 <code>js-yaml</code> 依赖：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install js-yaml</span><br></pre></td></tr></table></figure><hr><h2 id="🚀-使用方法"><a href="#🚀-使用方法" class="headerlink" title="🚀 使用方法"></a>🚀 使用方法</h2><p>将以下脚本保存为 <code>check-unused-rule-providers.js</code>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> yaml = <span class="built_in">require</span>(<span class="string">&#x27;js-yaml&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 加载 YAML 文件</span></span><br><span class="line"><span class="keyword">const</span> filePath = <span class="string">&#x27;Mihomo.yaml&#x27;</span>;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`📄 正在读取文件: <span class="subst">$&#123;filePath&#125;</span>`</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> fileContent = fs.<span class="title function_">readFileSync</span>(filePath, <span class="string">&#x27;utf8&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> config = yaml.<span class="title function_">load</span>(fileContent);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取 rule-providers</span></span><br><span class="line"><span class="keyword">const</span> ruleProviders = config[<span class="string">&#x27;rule-providers&#x27;</span>] || &#123;&#125;;</span><br><span class="line"><span class="keyword">const</span> providerKeys = <span class="title class_">Object</span>.<span class="title function_">keys</span>(ruleProviders);</span><br><span class="line"><span class="comment">// console.log(&#x27;🔍 发现的 rule-providers:&#x27;);</span></span><br><span class="line">providerKeys.<span class="title function_">forEach</span>(<span class="function"><span class="params">key</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="comment">// console.log(`- $&#123;key&#125;`);</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="comment">// console.log(`总数：$&#123;providerKeys.length&#125;\n`);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 读取并分析 rules</span></span><br><span class="line"><span class="keyword">const</span> rules = config.<span class="property">rules</span> || [];</span><br><span class="line"><span class="comment">// console.log(&#x27;📦 分析 rules 列表:&#x27;);</span></span><br><span class="line">rules.<span class="title function_">forEach</span>(<span class="function">(<span class="params">rule, index</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="comment">// console.log(`$&#123;index + 1&#125;. $&#123;rule&#125;`);</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="comment">// console.log(&#x27;&#x27;);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 提取 rules 中的 RULE-SET 使用情况</span></span><br><span class="line"><span class="keyword">const</span> usedProviders = <span class="keyword">new</span> <span class="title class_">Set</span>();</span><br><span class="line"><span class="keyword">let</span> ruleSetCount = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">rules.<span class="title function_">forEach</span>(<span class="function"><span class="params">rule</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> parts = rule.<span class="title function_">split</span>(<span class="string">&#x27;,&#x27;</span>);</span><br><span class="line">  <span class="keyword">if</span> (parts[<span class="number">0</span>] === <span class="string">&#x27;RULE-SET&#x27;</span> &amp;&amp; parts.<span class="property">length</span> &gt;= <span class="number">2</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> providerName = parts[<span class="number">1</span>].<span class="title function_">trim</span>().<span class="title function_">toLowerCase</span>();</span><br><span class="line">    usedProviders.<span class="title function_">add</span>(providerName);</span><br><span class="line">    ruleSetCount++;</span><br><span class="line">    <span class="comment">// console.log(`✅ 规则使用了 provider: $&#123;providerName&#125;`);</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;);</span><br><span class="line"><span class="comment">// console.log(&#x27;&#x27;);</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 查找未被使用的 rule-providers</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;🧾 检查哪些 rule-providers 没有被使用...&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> unusedProviders = providerKeys.<span class="title function_">filter</span>(<span class="function"><span class="params">p</span> =&gt;</span> !usedProviders.<span class="title function_">has</span>(p.<span class="title function_">toLowerCase</span>()));</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输出结果</span></span><br><span class="line"><span class="keyword">if</span> (unusedProviders.<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;✅ 所有 rule-providers 都已在 rules 中使用。&#x27;</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;⚠️ 未在 rules 中使用的 rule-providers:&#x27;</span>);</span><br><span class="line">  unusedProviders.<span class="title function_">forEach</span>(<span class="function"><span class="params">p</span> =&gt;</span> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`- <span class="subst">$&#123;p&#125;</span>`</span>));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输出统计信息</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;📊 统计信息:&#x27;</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`- rule-providers 总数: <span class="subst">$&#123;providerKeys.length&#125;</span>`</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`- rules 中 RULE-SET 规则数量: <span class="subst">$&#123;ruleSetCount&#125;</span>`</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`- 未使用的 rule-providers 数量: <span class="subst">$&#123;unusedProviders.length&#125;</span>`</span>);</span><br></pre></td></tr></table></figure><p>执行代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node check-unused-rule-providers.js</span><br></pre></td></tr></table></figure><p>默认会读取当前目录下的 <code>config.yaml</code> 文件。</p><p>如果你的配置文件不叫 <code>config.yaml</code>，可修改脚本中的：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> filePath = <span class="string">&#x27;config.yaml&#x27;</span>; <span class="comment">// 改为你的文件名</span></span><br></pre></td></tr></table></figure><hr><h2 id="📄-示例-YAML-结构"><a href="#📄-示例-YAML-结构" class="headerlink" title="📄 示例 YAML 结构"></a>📄 示例 YAML 结构</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">rules:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">RULE-SET,lan,proxy</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">RULE-SET,ads,direct</span></span><br><span class="line"></span><br><span class="line"><span class="attr">rule-providers:</span></span><br><span class="line">  <span class="attr">Lan:</span></span><br><span class="line">    <span class="string">&lt;&lt;:</span> <span class="meta">*classical</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">url</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">./ruleset/Lan.yaml</span></span><br><span class="line">  <span class="attr">Ads:</span></span><br><span class="line">    <span class="string">&lt;&lt;:</span> <span class="meta">*classical</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">url</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">./ruleset/Ads.yaml</span></span><br><span class="line">  <span class="attr">NotUsed:</span></span><br><span class="line">    <span class="string">&lt;&lt;:</span> <span class="meta">*classical</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">url</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">./ruleset/NotUsed.yaml</span></span><br></pre></td></tr></table></figure><hr><h2 id="📤-示例输出结果"><a href="#📤-示例输出结果" class="headerlink" title="📤 示例输出结果"></a>📤 示例输出结果</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">📄 正在读取文件: config.yaml</span><br><span class="line"></span><br><span class="line">🔍 发现的 rule-providers:</span><br><span class="line">- Lan</span><br><span class="line">- Ads</span><br><span class="line">- NotUsed</span><br><span class="line">总数：3</span><br><span class="line"></span><br><span class="line">📦 分析 rules 列表:</span><br><span class="line">1. RULE-SET,lan,proxy</span><br><span class="line">2. RULE-SET,ads,direct</span><br><span class="line"></span><br><span class="line">✅ 规则使用了 provider: lan</span><br><span class="line">✅ 规则使用了 provider: ads</span><br><span class="line"></span><br><span class="line">🧾 检查哪些 rule-providers 没有被使用...</span><br><span class="line"></span><br><span class="line">⚠️ 未在 rules 中使用的 rule-providers:</span><br><span class="line">- NotUsed</span><br><span class="line"></span><br><span class="line">📊 统计信息:</span><br><span class="line">- rule-providers 总数: 3</span><br><span class="line">- rules 中 RULE-SET 规则数量: 2</span><br><span class="line">- 未使用的 rule-providers 数量: 1</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/13/check_unused_rule_providers/</id>
    <link href="https://kwisma.github.io/2025/04/13/check_unused_rule_providers/"/>
    <published>2025-04-13T10:27:09.000Z</published>
    <summary>
      <![CDATA[<p>在配置如 Clash 等代理工具的 YAML 文件时，经常会出现定义了许多 <code>rule-providers</code>，但在 <code>rules</code> 中实际并未使用的问题。这不仅会导致配置臃肿、维护成本增加，也可能降低配置文件的加载效率。</p>
<p>为了解决这个问题，本工具可自动读取并分析你的 YAML 配置文件，找出那些 <strong>在 <code>rule-providers</code> 中定义了却没有在 <code>rules</code> 中被引用</strong> 的部分，并输出详细的日志与统计信息，方便你快速清理无用规则。</p>]]>
    </summary>
    <title>YAML Rule Provider 检查工具</title>
    <updated>2026-05-12T16:57:18.065Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="动漫" scheme="https://kwisma.github.io/categories/%E5%8A%A8%E6%BC%AB/"/>
    <category term="四月是你的谎言" scheme="https://kwisma.github.io/tags/%E5%9B%9B%E6%9C%88%E6%98%AF%E4%BD%A0%E7%9A%84%E8%B0%8E%E8%A8%80/"/>
    <category term="新川直司" scheme="https://kwisma.github.io/tags/%E6%96%B0%E5%B7%9D%E7%9B%B4%E5%8F%B8/"/>
    <category term="成长创伤" scheme="https://kwisma.github.io/tags/%E6%88%90%E9%95%BF%E5%88%9B%E4%BC%A4/"/>
    <category term="生死观" scheme="https://kwisma.github.io/tags/%E7%94%9F%E6%AD%BB%E8%A7%82/"/>
    <content>
      <![CDATA[<blockquote><p>“春天 马上就要来了<br>让我与你相遇的春天 就要来了<br>再也没有你的春天 就要来了”  </p></blockquote><p>当最后的乐谱在焚化炉中化作纷飞的灰蝶，宫园薰用谎言编织的四月永远定格在了公生的黑白琴键里。这部以古典乐为经纬的作品，本质上是一部关于「存在」与「消逝」的盛大安魂曲。本文将解析那些飘落在五线谱间隙的樱花碎片，如何构建出当代青少年亚文化语境下最凄美的生命寓言。</p><span id="more"></span><h2 id="一、色彩暴力的叙事悖论"><a href="#一、色彩暴力的叙事悖论" class="headerlink" title="一、色彩暴力的叙事悖论"></a>一、色彩暴力的叙事悖论</h2><h3 id="1-1-色谱失衡的视觉隐喻"><a href="#1-1-色谱失衡的视觉隐喻" class="headerlink" title="1.1 色谱失衡的视觉隐喻"></a>1.1 色谱失衡的视觉隐喻</h3><ul><li>薰标志性的柠檬黄发饰与苍白面容形成致命反差</li><li>公生黑白世界的破碎与重组（见图1钢琴烤漆面的倒影畸变）</li><li>医院纯白空间对生命力的渐进吞噬（色彩剥离速率与病情发展正相关）</li></ul><h3 id="1-2-声音矩阵的情感解构"><a href="#1-2-声音矩阵的情感解构" class="headerlink" title="1.2 声音矩阵的情感解构"></a>1.2 声音矩阵的情感解构</h3><table><thead><tr><th>乐章类型</th><th>公生感知变化</th><th>薰的生命体征</th></tr></thead><tbody><tr><td>竞赛曲目</td><td>机械性复现 → 声音真空</td><td>伪装健康期</td></tr><tr><td>即兴演奏</td><td>色彩涌现 → 听觉过敏</td><td>病情恶化期</td></tr><tr><td>告别合奏</td><td>全频段通感 → 永恒静默</td><td>临床死亡期</td></tr></tbody></table><h3 id="1-3-色谱战争（数据可视化）"><a href="#1-3-色谱战争（数据可视化）" class="headerlink" title="1.3 色谱战争（数据可视化）"></a>1.3 色谱战争（数据可视化）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">pie</span><br><span class="line">    title 色彩情绪分布</span><br><span class="line">    &quot;柠檬黄（希望）&quot; : 38</span><br><span class="line">    &quot;纯白（死亡）&quot; : 27</span><br><span class="line">    &quot;樱粉（幻觉）&quot; : 19</span><br><span class="line">    &quot;黑白（现实）&quot; : 16</span><br></pre></td></tr></table></figure><hr><h2 id="二、谎言拓扑学：三重叙事迷宫"><a href="#二、谎言拓扑学：三重叙事迷宫" class="headerlink" title="二、谎言拓扑学：三重叙事迷宫"></a>二、谎言拓扑学：三重叙事迷宫</h2><h3 id="2-1-元谎言架构"><a href="#2-1-元谎言架构" class="headerlink" title="2.1 元谎言架构"></a>2.1 元谎言架构</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">A[「讨厌公生」] --&gt; B[「想要合奏」]</span><br><span class="line">B --&gt; C[「手术成功」]</span><br><span class="line">C --&gt; D[「永远春天」]</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">sequenceDiagram</span><br><span class="line">    公生-&gt;&gt;薰: 奏响《爱的忧伤》</span><br><span class="line">    loop 心跳同步</span><br><span class="line">        薰--&gt;&gt;公生: 微笑反馈</span><br><span class="line">        公生--&gt;&gt;薰: 音色震颤</span><br><span class="line">    end</span><br><span class="line">    薰-&gt;&gt;天堂: 琴弓坠地</span><br></pre></td></tr></table></figure><h3 id="2-2-音乐性欺骗"><a href="#2-2-音乐性欺骗" class="headerlink" title="2.2 音乐性欺骗"></a>2.2 音乐性欺骗</h3><ul><li>肖邦《离别曲》的变奏欺骗（B.66-B.71节拍器异常加速）</li><li>公生触键力度与心电图波形的高度拟合（见图2声波-心电叠加分析）</li></ul><h3 id="2-3-爱的微分方程"><a href="#2-3-爱的微分方程" class="headerlink" title="2.3 爱的微分方程"></a>2.3 爱的微分方程</h3><p>$$<br>\frac{\partial Love}{\partial t} &#x3D; -\alpha \cdot Truth + \beta \cdot Lies^{\gamma}<br>$$</p><p><strong>其中</strong>：  </p><ul><li>$\alpha$: 现实腐蚀系数  </li><li>$\beta$: 谎言渗透率  </li><li>$\gamma$: 自我欺骗指数</li></ul><hr><h2 id="三、樱花刑场：物哀美学的现代转译"><a href="#三、樱花刑场：物哀美学的现代转译" class="headerlink" title="三、樱花刑场：物哀美学的现代转译"></a>三、樱花刑场：物哀美学的现代转译</h2><h3 id="3-1-物哀方程式"><a href="#3-1-物哀方程式" class="headerlink" title="3.1 物哀方程式"></a>3.1 物哀方程式</h3><p>$$<br>\lim_{n \to \infty} \left(1 + \frac{1}{n}\right)^n &#x3D; e \quad \Rightarrow \quad \lim_{days \to 14} \left(1 + \frac{1}{life}\right)^{spring} &#x3D; \infty<br>$$</p><h3 id="3-2-季节暴政"><a href="#3-2-季节暴政" class="headerlink" title="3.2 季节暴政"></a>3.2 季节暴政</h3><ul><li>四月樱花祭的集体无意识狂欢</li><li>薰的14岁：樱花花期精确映射（染井吉野樱平均寿命≈角色生存时长）</li></ul><h3 id="3-3-琴键墓志铭"><a href="#3-3-琴键墓志铭" class="headerlink" title="3.3 琴键墓志铭"></a>3.3 琴键墓志铭</h3><blockquote><p>“你驻足于春色中，于那独一无二的春色之中”</p></blockquote><p>当公生在最终演奏中故意错弹升C音，这个被刻意保留的「不协和音」成为最残酷的真相：完美即虚妄，缺憾才是存在的证明。那些被薰篡改的乐谱页码，最终化作逆向生长的年轮，将永远年轻的灵魂封印在永远的四月。</p><hr><h3 id="一、流程图（Flowchart）"><a href="#一、流程图（Flowchart）" class="headerlink" title="一、流程图（Flowchart）"></a>一、流程图（Flowchart）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">graph TD</span><br><span class="line">    A[公生琴声停滞] --&gt; B&#123;触发事件&#125;</span><br><span class="line">    B --&gt;|薰闯入| C[黑白世界破碎]</span><br><span class="line">    B --&gt;|独自练习| D[音色持续灰化]</span><br><span class="line">    C --&gt; E[色彩重新流动]</span><br><span class="line">    D --&gt; F[音乐人格消亡]</span><br><span class="line">    E --&gt; G[樱花葬礼协奏曲]</span><br><span class="line">    F --&gt; G</span><br></pre></td></tr></table></figure><hr><h3 id="二、序列图（Sequence-Diagram）"><a href="#二、序列图（Sequence-Diagram）" class="headerlink" title="二、序列图（Sequence Diagram）"></a>二、序列图（Sequence Diagram）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">sequenceDiagram</span><br><span class="line">    公生-&gt;&gt;薰: 奏响《爱的忧伤》</span><br><span class="line">    loop 心跳同步</span><br><span class="line">        薰--&gt;&gt;公生: 微笑反馈</span><br><span class="line">        Note right of 公生: 琴键震动频率=心跳数</span><br><span class="line">        公生--&gt;&gt;薰: 音色震颤</span><br><span class="line">    end</span><br><span class="line">    薰-&gt;&gt;天堂: 琴弓坠地</span><br><span class="line">    天堂--&gt;&gt;公生: 飘落乐谱碎片</span><br></pre></td></tr></table></figure><hr><h3 id="三、甘特图（Gantt）"><a href="#三、甘特图（Gantt）" class="headerlink" title="三、甘特图（Gantt）"></a>三、甘特图（Gantt）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">gantt</span><br><span class="line">    title 樱花存活倒计时</span><br><span class="line">    dateFormat  YYYY-MM-DD</span><br><span class="line">    axisFormat  %m/%d</span><br><span class="line">    </span><br><span class="line">    section 谎言周期</span><br><span class="line">    健康伪装       :active, 2014-04-01, 2014-08-20</span><br><span class="line">    病情恶化       :crit, 2014-08-21, 2014-12-31</span><br><span class="line">    </span><br><span class="line">    section 音乐轨迹</span><br><span class="line">    公生复健       :2014-04-07, 60d</span><br><span class="line">    双人合奏       :milestone, 2014-06-14, 0d</span><br><span class="line">    最后演出       :milestone, 2014-12-28, 0d</span><br></pre></td></tr></table></figure><hr><h3 id="四、类图（Class-Diagram）"><a href="#四、类图（Class-Diagram）" class="headerlink" title="四、类图（Class Diagram）"></a>四、类图（Class Diagram）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">classDiagram</span><br><span class="line">    class 宫园薰 &#123;</span><br><span class="line">        +String 谎言清单</span><br><span class="line">        +void 修改乐谱()</span><br><span class="line">        +Sound 小提琴音色()</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    class 有马公生 &#123;</span><br><span class="line">        -Color 视觉空间</span><br><span class="line">        +void 触键矫正()</span><br><span class="line">        +void 听觉重构()</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    宫园薰 --&gt; 有马公生 : 施加「色彩污染」</span><br><span class="line">    有马公生 --&gt; 宫园薰 : 反馈「声音坐标」</span><br></pre></td></tr></table></figure><hr><h3 id="五、状态图（State-Diagram）"><a href="#五、状态图（State-Diagram）" class="headerlink" title="五、状态图（State Diagram）"></a>五、状态图（State Diagram）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">stateDiagram-v2</span><br><span class="line">    [*] --&gt; 黑白世界</span><br><span class="line">    黑白世界 --&gt; 色彩渗透: 薰拉响小提琴</span><br><span class="line">    色彩渗透 --&gt; 全色暴走: 合奏成功</span><br><span class="line">    色彩渗透 --&gt; 黑白世界: 演奏中断</span><br><span class="line">    </span><br><span class="line">    state 全色暴走 &#123;</span><br><span class="line">        [*] --&gt; 樱花粉</span><br><span class="line">        樱花粉 --&gt; 柠檬黄</span><br><span class="line">        柠檬黄 --&gt; 医院白</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    全色暴走 --&gt; 永恒灰阶: 薰去世</span><br></pre></td></tr></table></figure><hr><h3 id="六、饼图（Pie-Chart）进阶"><a href="#六、饼图（Pie-Chart）进阶" class="headerlink" title="六、饼图（Pie Chart）进阶"></a>六、饼图（Pie Chart）进阶</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">pie</span><br><span class="line">    title 公生听觉构成（最终章）</span><br><span class="line">    &quot;薰的笑声&quot; : 42</span><br><span class="line">    &quot;手术仪警报&quot; : 23</span><br><span class="line">    &quot;雨声&quot; : 18</span><br><span class="line">    &quot;琴键泛音&quot; : 17</span><br></pre></td></tr></table></figure><hr><h3 id="七、实体关系图（ER-Diagram）"><a href="#七、实体关系图（ER-Diagram）" class="headerlink" title="七、实体关系图（ER Diagram）"></a>七、实体关系图（ER Diagram）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">erDiagram</span><br><span class="line">    Kousei_Arima &#123;</span><br><span class="line">        Kousei Arima</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Kaho_Miyazono &#123;</span><br><span class="line">        Kaho Miyazono</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Tsubaki_Sawabe &#123;</span><br><span class="line">        Tsubaki Sawabe</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Ryota_Watari &#123;</span><br><span class="line">        Ryota Watari</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Kousei_Mother &#123;</span><br><span class="line">        Kousei Mother</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Kousei_Arima ||--|&#123; Kaho_Miyazono : &quot;Romantic Love&quot;</span><br><span class="line">    Kaho_Miyazono ||--|&#123; Kousei_Arima : &quot;Romantic Love&quot;</span><br><span class="line">    Kousei_Arima ||--|&#123; Tsubaki_Sawabe : &quot;Friendship&quot;</span><br><span class="line">    Kousei_Arima ||--|&#123; Ryota_Watari : &quot;Friendship&quot;</span><br><span class="line">    Tsubaki_Sawabe ||--|&#123; Ryota_Watari : &quot;Friendship&quot;</span><br><span class="line">    Kousei_Arima ||--|&#123; Kousei_Mother : &quot;Parental Relationship&quot;</span><br><span class="line">    Kaho_Miyazono ||--|&#123; Kousei_Mother : &quot;Teacher-Student&quot;</span><br></pre></td></tr></table></figure><h4 id="角色及其关系："><a href="#角色及其关系：" class="headerlink" title="角色及其关系："></a>角色及其关系：</h4><ol><li><p><strong>阿知贺海斗（Kousei Arima）</strong> - <strong>男主角</strong></p><ul><li>和 <strong>宫园薰（Kaho Miyazono）</strong> 有浪漫的爱情关系。</li><li>和 <strong>澄田美月（Tsubaki Sawabe）</strong> 有青梅竹马的友情。</li><li>和 <strong>渡亮太（Ryota Watari）</strong> 是朋友。</li><li>和 <strong>有马贤一（Kousei’s Mother）</strong> 具有复杂的父母关系，母亲严苛地要求他。</li></ul></li><li><p><strong>宫园薰（Kaho Miyazono）</strong> - <strong>女主角</strong></p><ul><li>与 <strong>阿知贺海斗</strong> 有浪漫的爱情关系。</li><li>与 <strong>有马贤一（Kousei’s Mother）</strong> 有师生关系。</li></ul></li><li><p><strong>澄田美月（Tsubaki Sawabe）</strong> - <strong>海斗的青梅竹马</strong></p><ul><li>与 <strong>阿知贺海斗</strong> 是朋友，且暗恋海斗。</li><li>与 <strong>渡亮太</strong> 是朋友，喜欢亮太但未被回应。</li></ul></li><li><p><strong>渡亮太（Ryota Watari）</strong> - <strong>海斗的朋友</strong></p><ul><li>与 <strong>阿知贺海斗</strong> 是朋友。</li><li>与 <strong>澄田美月</strong> 是朋友，美月喜欢他。</li></ul></li><li><p><strong>有马贤一（Kousei’s Mother）</strong> - <strong>海斗的母亲</strong></p><ul><li>与 <strong>阿知贺海斗</strong> 有压迫的母子关系。</li><li>与 <strong>宫园薰</strong> 有师生关系，要求薰成为顶级小提琴家。</li></ul></li></ol><hr><h3 id="八、用户旅程图（User-Journey）"><a href="#八、用户旅程图（User-Journey）" class="headerlink" title="八、用户旅程图（User Journey）"></a>八、用户旅程图（User Journey）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">journey</span><br><span class="line">    title 观众泪腺激活路径</span><br><span class="line">    section 初次相遇</span><br><span class="line">      公生弹奏机械音: 5: 困惑</span><br><span class="line">      薰破窗而入: 8: 期待</span><br><span class="line">    section 盛夏谎言</span><br><span class="line">      天台喂鸽场景: 7: 温馨</span><br><span class="line">      医院轮椅对话: 9: 不安</span><br><span class="line">    section 终章引爆</span><br><span class="line">      信件告白: 10: 心碎</span><br><span class="line">      樱花葬礼: 12: 崩溃</span><br></pre></td></tr></table></figure><hr><h3 id="九、需求图（Requirement）"><a href="#九、需求图（Requirement）" class="headerlink" title="九、需求图（Requirement）"></a>九、需求图（Requirement）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line">requirementDiagram</span><br><span class="line"></span><br><span class="line">requirement Musical_Legacy &#123;</span><br><span class="line">    id: R1</span><br><span class="line">    text: &quot;有马公生必须克服钢琴演奏的心理障碍&quot;</span><br><span class="line">    risk: high</span><br><span class="line">    verifymethod: test</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">functionalRequirement Violin_Duet &#123;</span><br><span class="line">    id: R1.1</span><br><span class="line">    text: &quot;宫园薰的小提琴演奏需要与钢琴完美配合&quot;</span><br><span class="line">    risk: low</span><br><span class="line">    verifymethod: inspection</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">performanceRequirement Spring_Concert &#123;</span><br><span class="line">    id: R1.2</span><br><span class="line">    text: &quot;春季音乐会必须达到专业级演出水准&quot;</span><br><span class="line">    risk: medium</span><br><span class="line">    verifymethod: demonstration</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">interfaceRequirement Instrument_Sync &#123;</span><br><span class="line">    id: R1.2.1</span><br><span class="line">    text: &quot;钢琴与小提琴声部需要精确同步&quot;</span><br><span class="line">    risk: medium</span><br><span class="line">    verifymethod: analysis</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">physicalRequirement Stage_Lighting &#123;</span><br><span class="line">    id: R1.2.2</span><br><span class="line">    text: &quot;舞台灯光需要随音乐情绪变化&quot;</span><br><span class="line">    risk: medium</span><br><span class="line">    verifymethod: analysis</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">designConstraint Music_Score &#123;</span><br><span class="line">    id: R1.2.3</span><br><span class="line">    text: &quot;必须使用原版乐谱进行改编&quot;</span><br><span class="line">    risk: medium</span><br><span class="line">    verifymethod: analysis</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">element Final_Performance &#123;</span><br><span class="line">    type: &quot;test suite&quot;</span><br><span class="line">    docRef: concert_hall/schedule</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">element Heart_Score &#123;</span><br><span class="line">    type: &quot;word doc&quot;</span><br><span class="line">    docRef: scores/spring_sonata</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">element Competition_Sim &#123;</span><br><span class="line">    type: simulation</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Final_Performance - satisfies -&gt; Violin_Duet</span><br><span class="line">Musical_Legacy - traces -&gt; Violin_Duet</span><br><span class="line">Musical_Legacy - contains -&gt; Spring_Concert</span><br><span class="line">Spring_Concert - contains -&gt; Instrument_Sync</span><br><span class="line">Instrument_Sync - derives -&gt; Stage_Lighting</span><br><span class="line">Stage_Lighting - refines -&gt; Music_Score</span><br><span class="line">Competition_Sim - verifies -&gt; Stage_Lighting</span><br><span class="line">Musical_Legacy &lt;- copies - Heart_Score</span><br></pre></td></tr></table></figure><p>这个需求图通过以下方式映射原作：</p><ol><li>核心需求围绕公生的音乐重生之旅</li><li>功能需求体现薰与公生的二重奏关系</li><li>性能需求对应重要演出场景</li><li>接口需求展现乐器配合细节</li><li>物理需求包含舞台效果要素</li><li>设计约束强调乐谱的核心地位</li><li>验证元素对应剧中关键事件（比赛模拟、最终演奏等）</li></ol><hr><h3 id="十、Git图（Git-Graph）"><a href="#十、Git图（Git-Graph）" class="headerlink" title="十、Git图（Git Graph）"></a>十、Git图（Git Graph）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">gitGraph</span><br><span class="line">    commit id: &quot;Initial&quot;</span><br><span class="line">    branch feature/kaori</span><br><span class="line">    checkout feature/kaori</span><br><span class="line">    commit id: &quot;First Meet&quot;</span><br><span class="line">    commit id: &quot;Forced Duet&quot;</span><br><span class="line">    checkout main</span><br><span class="line">    merge feature/kaori tag: &quot;Color Invasion&quot;</span><br><span class="line">    commit id: &quot;Key Fracture&quot;</span><br><span class="line">    commit id: &quot;Eternal Gray&quot; tag: &quot;Finale&quot;</span><br></pre></td></tr></table></figure><hr><h3 id="使用技巧"><a href="#使用技巧" class="headerlink" title="使用技巧"></a>使用技巧</h3><ol><li><strong>动态交互</strong>：结合 <code>click</code> 事件实现注释弹出<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">    A[樱花] --&gt;|触发| B(公生眼泪)</span><br><span class="line">    click A callback &quot;樱花存活天数计算&quot;</span><br></pre></td></tr></table></figure></li><li><strong>样式魔改</strong>：通过 <code>style</code> 自定义颜色<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">graph LR</span><br><span class="line">    A[医院]:::death --&gt; B[舞台]</span><br><span class="line">    classDef death fill:#f9f2f4,stroke:#c7254e</span><br></pre></td></tr></table></figure></li><li><strong>多图联动</strong>：用 <code>%%{init}%%</code> 统一主题<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">%%&#123;init: &#123;&#x27;theme&#x27;: &#x27;base&#x27;, &#x27;themeVariables&#x27;: &#123; &#x27;primaryColor&#x27;: &#x27;#ffd700&#x27; &#125;&#125;&#125;%%</span><br><span class="line">pie</span><br><span class="line">    title 生命色谱</span><br><span class="line">    &quot;希望&quot; : 38</span><br><span class="line">    &quot;疼痛&quot; : 62</span><br></pre></td></tr></table></figure></li></ol><hr><p>以下是专门为《樱花落尽的协奏曲——论《四月是你的谎言》的悲剧美学》定制的XY象限图与用户旅程图深度应用方案：</p><hr><h3 id="XY象限图：悲剧坐标系的四维解构"><a href="#XY象限图：悲剧坐标系的四维解构" class="headerlink" title="XY象限图：悲剧坐标系的四维解构"></a>XY象限图：悲剧坐标系的四维解构</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">%%&#123;init: &#123;&#x27;themeVariables&#x27;: &#123; &#x27;primaryColor&#x27;: &#x27;#fff5ee&#x27;&#125;&#125;&#125;%%</span><br><span class="line">quadrantChart</span><br><span class="line">    title 悲剧坐标系四维解构</span><br><span class="line">    x-axis &quot;现实浓度&quot; --&gt; &quot;虚妄浓度&quot;</span><br><span class="line">    y-axis &quot;存在强度&quot; --&gt; &quot;消逝强度&quot;</span><br><span class="line">    </span><br><span class="line">    quadrant-1 &quot;血色浪漫&quot;</span><br><span class="line">    quadrant-2 &quot;真空地带&quot;</span><br><span class="line">    quadrant-3 &quot;死亡白噪&quot;</span><br><span class="line">    quadrant-4 &quot;幽灵回响&quot;</span><br><span class="line">    </span><br><span class="line">    &quot;薰的初登场&quot;: [0.75, 0.75]</span><br><span class="line">    &quot;公生失聪期&quot;: [0.25, 0.75]</span><br><span class="line">    &quot;太平间场景&quot;: [0.25, 0.25]</span><br><span class="line">    &quot;公生最终独奏&quot;: [0.75, 0.25]</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">%%&#123;init: &#123;&#x27;themeVariables&#x27;: &#123;&#x27;quadrant1Text&#x27;: &#x27;#FF69B4&#x27;&#125;&#125;&#125;%%</span><br><span class="line">quadrantChart</span><br><span class="line">    title 观众心理创伤热力图</span><br><span class="line">    x-axis &quot;剧情进度&quot; --&gt; &quot;终章&quot;</span><br><span class="line">    y-axis &quot;泪腺激活度&quot; --&gt; &quot;崩溃阈值&quot;</span><br><span class="line">    </span><br><span class="line">    quadrant-1 &quot;甜蜜陷阱&quot;</span><br><span class="line">    quadrant-2 &quot;慢性疼痛&quot;</span><br><span class="line">    quadrant-3 &quot;延迟伤害&quot;</span><br><span class="line">    quadrant-4 &quot;瞬时暴击&quot;</span><br><span class="line">    </span><br><span class="line">    &quot;天台初遇&quot;: [0.18, 0.75]</span><br><span class="line">    &quot;雨中奔跑&quot;: [0.35, 0.68]</span><br><span class="line">    &quot;手术通知&quot;: [0.72, 0.85]</span><br><span class="line">    &quot;焚谱时刻&quot;: [0.92, 0.95]</span><br></pre></td></tr></table></figure><p><strong>象限解析</strong>：</p><ol><li><strong>血色浪漫（高存在&#x2F;低现实）</strong>：薰强行介入公生世界的瞬间，谎言浓度达峰值</li><li><strong>真空地带（高存在&#x2F;高现实）</strong>：母亲去世后的绝对音准如同刺眼探照灯</li><li><strong>死亡白噪（低存在&#x2F;低现实）</strong>：医院仪器声构建的抽象空间</li><li><strong>幽灵回响（低存在&#x2F;高现实）</strong>：残留琴声在现实世界的量子纠缠</li></ol><hr><h3 id="用户旅程图：眼泪的动力学模型"><a href="#用户旅程图：眼泪的动力学模型" class="headerlink" title="用户旅程图：眼泪的动力学模型"></a>用户旅程图：眼泪的动力学模型</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">journey</span><br><span class="line">    title 观众泪腺激活曲线</span><br><span class="line">    </span><br><span class="line">    section 引力加速段</span><br><span class="line">      天台初遇: 8: 期待</span><br><span class="line">      雨中奔跑: 6: 隐痛</span><br><span class="line">      首次合奏: 9: 震撼</span><br><span class="line">    </span><br><span class="line">    section 洛希极限段</span><br><span class="line">      医院探视: 10: 窒息</span><br><span class="line">      病床乐谱: 12: 心颤</span><br><span class="line">    </span><br><span class="line">    section 黑洞撕裂段</span><br><span class="line">      临终信件: 15: 崩溃</span><br><span class="line">      樱花葬礼: 20: 致盲级泪崩</span><br><span class="line">    </span><br><span class="line">    section 引力波余震</span><br><span class="line">      片尾ED: 18: 延时伤害</span><br><span class="line">      二刷预警: 10: PTSD触发</span><br></pre></td></tr></table></figure><hr><h3 id="复合应用：时空撕裂算法"><a href="#复合应用：时空撕裂算法" class="headerlink" title="复合应用：时空撕裂算法"></a>复合应用：时空撕裂算法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">%%&#123;init: &#123;</span><br><span class="line">  &#x27;theme&#x27;: &#x27;base&#x27;,</span><br><span class="line">  &#x27;themeVariables&#x27;: &#123;</span><br><span class="line">    &#x27;quadrant1Text&#x27;: &#x27;#8b0000&#x27;,</span><br><span class="line">    &#x27;quadrant2Text&#x27;: &#x27;#4b0082&#x27;,</span><br><span class="line">    &#x27;quadrant3Text&#x27;: &#x27;#2f4f4f&#x27;,</span><br><span class="line">    &#x27;quadrant4Text&#x27;: &#x27;#006400&#x27;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;&#125;%%</span><br><span class="line">quadrantChart</span><br><span class="line">    title Algorithm of spacetime fracture</span><br><span class="line">    x-axis Reality Anchor --&gt; Illusion Abyss</span><br><span class="line">    y-axis Life Density --&gt; Death Vacuum</span><br><span class="line">    </span><br><span class="line">    quadrant-1 &quot;谎言奇点 (Lie Singularity)&quot;</span><br><span class="line">    quadrant-2 &quot;记忆坟场 (Memory Graveyard)&quot;</span><br><span class="line">    quadrant-3 &quot;幽灵剧场 (Ghost Theater)&quot;</span><br><span class="line">    quadrant-4 &quot;量子坟茔 (Quantum Tomb)&quot;</span><br><span class="line">    </span><br><span class="line">    &quot;Cherry Blossom Festival&quot;: [0.7, 0.8]</span><br><span class="line">    &quot;Surgical Light&quot;: [0.3, 0.2]</span><br><span class="line">    &quot;Final Duet&quot;: [0.6, 0.4]</span><br><span class="line">    &quot;Blank Score&quot;: [0.9, 0.1]</span><br></pre></td></tr></table></figure><hr><p>这些可视化模型如同公生重构的听觉世界，将抽象的情感创伤转化为可量化的美学参数。当数据点越过泪腺阈值时，学术论文便完成了向情感共振器的终极进化。</p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>在东京都某条不知名街道，真实存在着动画中的藤架公园。每年四月，长椅上总会莫名出现柠檬味糖果。这或许印证了罗兰·巴特所言：「眼泪的存在，是为了证明悲伤不是幻觉」。当春风再次吹散琴谱，我们终于读懂薰的终极谎言——所谓死亡，不过是换乘上开往春天的永恒列车。</p>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/12/Your_Lie_in_April/</id>
    <link href="https://kwisma.github.io/2025/04/12/Your_Lie_in_April/"/>
    <published>2025-04-12T04:30:27.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>“春天 马上就要来了<br>让我与你相遇的春天 就要来了<br>再也没有你的春天 就要来了”  </p>
</blockquote>
<p>当最后的乐谱在焚化炉中化作纷飞的灰蝶，宫园薰用谎言编织的四月永远定格在了公生的黑白琴键里。这部以古典乐为经纬的作品，本质上是一部关于「存在」与「消逝」的盛大安魂曲。本文将解析那些飘落在五线谱间隙的樱花碎片，如何构建出当代青少年亚文化语境下最凄美的生命寓言。</p>]]>
    </summary>
    <title>没有你的四月又来了</title>
    <updated>2026-05-12T17:00:28.737Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="Node.js" scheme="https://kwisma.github.io/tags/Node-js/"/>
    <category term="JSON" scheme="https://kwisma.github.io/tags/JSON/"/>
    <category term="数据处理" scheme="https://kwisma.github.io/tags/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/"/>
    <category term="去重" scheme="https://kwisma.github.io/tags/%E5%8E%BB%E9%87%8D/"/>
    <content>
      <![CDATA[<p>在日常开发中，我们经常需要从大量数据中提取有用的信息，例如从日志或数据文件中提取 IP 和端口。手动处理这些数据既耗时又容易出错，因此编写一个自动化脚本来完成这项任务显得尤为重要。</p><p>本文将介绍一个使用 Node.js 编写的脚本，能够从 JSON 格式的数据文件中提取 IP 和端口，并自动去重，帮助开发者快速整理和分析数据。</p><span id="more"></span><hr><p>假设你有一个文本文件（例如 data.json），每一行是一条 JSON 数据：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://112.170.255.67:50001&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;ip&quot;</span><span class="punctuation">:</span> <span class="string">&quot;112.170.255.67&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="string">&quot;50001&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cloudflare&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;country&quot;</span><span class="punctuation">:</span> <span class="string">&quot;KR&quot;</span><span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://152.70.90.42&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;ip&quot;</span><span class="punctuation">:</span> <span class="string">&quot;152.70.90.42&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="string">&quot;443&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;server&quot;</span><span class="punctuation">:</span> <span class="string">&quot;cloudflare&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;country&quot;</span><span class="punctuation">:</span> <span class="string">&quot;KR&quot;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="Node-js-脚本：extract-ip-port-js（含去重）"><a href="#Node-js-脚本：extract-ip-port-js（含去重）" class="headerlink" title="Node.js 脚本：extract-ip-port.js（含去重）"></a>Node.js 脚本：<code>extract-ip-port.js</code>（含去重）</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> readline = <span class="built_in">require</span>(<span class="string">&#x27;readline&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> inputFile = <span class="string">&#x27;data.json&#x27;</span>;</span><br><span class="line"><span class="keyword">const</span> outputFile = <span class="string">&#x27;ip.txt&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">extractUniqueIPPort</span>(<span class="params">input, output</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> fileStream = fs.<span class="title function_">createReadStream</span>(input);</span><br><span class="line">  <span class="keyword">const</span> rl = readline.<span class="title function_">createInterface</span>(&#123;</span><br><span class="line">    <span class="attr">input</span>: fileStream,</span><br><span class="line">    <span class="attr">crlfDelay</span>: <span class="title class_">Infinity</span></span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> uniqueSet = <span class="keyword">new</span> <span class="title class_">Set</span>();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> <span class="title function_">await</span> (<span class="keyword">const</span> line <span class="keyword">of</span> rl) &#123;</span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> json = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(line);</span><br><span class="line">      <span class="keyword">if</span> (json.<span class="property">ip</span> &amp;&amp; json.<span class="property">port</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> combo = <span class="string">`<span class="subst">$&#123;json.ip&#125;</span> <span class="subst">$&#123;json.port&#125;</span>`</span>;</span><br><span class="line">        uniqueSet.<span class="title function_">add</span>(combo);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`解析失败的行: <span class="subst">$&#123;line&#125;</span>`</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 写入去重后的结果</span></span><br><span class="line">  fs.<span class="title function_">writeFileSync</span>(output, <span class="title class_">Array</span>.<span class="title function_">from</span>(uniqueSet).<span class="title function_">join</span>(<span class="string">&#x27;\n&#x27;</span>), <span class="string">&#x27;utf8&#x27;</span>);</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`去重后的 IP 和端口已保存到 <span class="subst">$&#123;output&#125;</span>`</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">extractUniqueIPPort</span>(inputFile, outputFile);</span><br></pre></td></tr></table></figure><hr><h3 id="🛠-使用说明："><a href="#🛠-使用说明：" class="headerlink" title="🛠 使用说明："></a>🛠 使用说明：</h3><ol><li>将上面的代码保存为 <code>extract-ip-port.js</code>。</li><li>确保 <code>data.txt</code> 文件存在，且每行为一条合法的 JSON。</li><li>执行脚本：</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node extract-ip-port.js</span><br></pre></td></tr></table></figure><hr><p>输出的 <code>ip.txt</code> 中只会包含唯一的 <code>ip port</code> 组合，例如：</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">112.170.255.67 50001</span><br><span class="line">152.70.90.42 443</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/11/extract_ip_port/</id>
    <link href="https://kwisma.github.io/2025/04/11/extract_ip_port/"/>
    <published>2025-04-11T09:59:36.000Z</published>
    <summary>
      <![CDATA[<p>在日常开发中，我们经常需要从大量数据中提取有用的信息，例如从日志或数据文件中提取 IP 和端口。手动处理这些数据既耗时又容易出错，因此编写一个自动化脚本来完成这项任务显得尤为重要。</p>
<p>本文将介绍一个使用 Node.js 编写的脚本，能够从 JSON 格式的数据文件中提取 IP 和端口，并自动去重，帮助开发者快速整理和分析数据。</p>]]>
    </summary>
    <title>提取 IP 和端口的 Node.js 脚本</title>
    <updated>2026-05-12T16:58:38.977Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="自动化" scheme="https://kwisma.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <category term="域名" scheme="https://kwisma.github.io/tags/%E5%9F%9F%E5%90%8D/"/>
    <category term="Node.js" scheme="https://kwisma.github.io/tags/Node-js/"/>
    <category term="脚本开发" scheme="https://kwisma.github.io/tags/%E8%84%9A%E6%9C%AC%E5%BC%80%E5%8F%91/"/>
    <content>
      <![CDATA[<p>在互联网时代，域名是网站的门牌号，一个好的域名不仅能提升品牌形象，还能增加用户的记忆度。然而，随着优质域名资源的逐渐减少，找到一个未被注册的理想域名变得越来越困难。为了简化这一过程，我们可以利用脚本自动生成随机域名并检查其可注册性，从而节省时间和精力。</p><p>本文将介绍如何使用 Node.js 编写一个脚本，生成随机的 5 位字母域名并检查其可注册性，同时将可用的域名动态保存到文件中。这种方法适合需要批量筛选域名的用户，帮助您快速找到心仪的域名。</p><span id="more"></span><p>生成随机的 5 位字母域名（例如，<code>abcde.com</code>），并在无限循环中检查其可注册性，将可注册的域名动态保存到文件中。以下是实现此功能的 Node.js 脚本：</p><ol><li><strong>安装必要的依赖包</strong>：</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install whois fs</span><br></pre></td></tr></table></figure><ol start="2"><li><strong>创建并运行脚本</strong>：</li></ol><p>将以下代码保存为 <code>checkDomains.js</code>，然后在终端中运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node checkDomains.js</span><br></pre></td></tr></table></figure><ol start="3"><li><strong>代码实现</strong>：</li></ol><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> whois = <span class="built_in">require</span>(<span class="string">&#x27;whois&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> util = <span class="built_in">require</span>(<span class="string">&#x27;util&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> queryWhois = util.<span class="title function_">promisify</span>(whois.<span class="property">lookup</span>);</span><br><span class="line"><span class="keyword">const</span> checkedDomains = <span class="keyword">new</span> <span class="title class_">Set</span>();</span><br><span class="line"><span class="keyword">const</span> availableDomainsFile = <span class="string">&#x27;available_domains.txt&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 生成随机的5位字母字符串</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">generateRandomDomain</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> chars = <span class="string">&#x27;abcdefghijklmnopqrstuvwxyz&#x27;</span>;</span><br><span class="line">  <span class="keyword">let</span> domain = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; <span class="number">5</span>; i++) &#123;</span><br><span class="line">    domain += chars[<span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * chars.<span class="property">length</span>)];</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> domain + <span class="string">&#x27;.com&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 检查域名是否可注册</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">checkDomainAvailable</span>(<span class="params">domain</span>) &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> data = <span class="keyword">await</span> <span class="title function_">queryWhois</span>(domain);</span><br><span class="line">    <span class="keyword">if</span> (data &amp;&amp; (data.<span class="title function_">includes</span>(<span class="string">&#x27;No match&#x27;</span>) || data.<span class="title function_">includes</span>(<span class="string">&#x27;NOT FOUND&#x27;</span>))) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`<span class="subst">$&#123;domain&#125;</span> 可注册`</span>);</span><br><span class="line">      fs.<span class="title function_">appendFileSync</span>(availableDomainsFile, domain + <span class="string">&#x27;\n&#x27;</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`<span class="subst">$&#123;domain&#125;</span> 已注册`</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`查询 <span class="subst">$&#123;domain&#125;</span> 时出错: `</span>, err);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 主函数：无限循环生成并检查域名</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">main</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> domain;</span><br><span class="line">    <span class="keyword">do</span> &#123;</span><br><span class="line">      domain = <span class="title function_">generateRandomDomain</span>();</span><br><span class="line">    &#125; <span class="keyword">while</span> (checkedDomains.<span class="title function_">has</span>(domain));</span><br><span class="line"></span><br><span class="line">    checkedDomains.<span class="title function_">add</span>(domain);</span><br><span class="line">    <span class="keyword">await</span> <span class="title function_">checkDomainAvailable</span>(domain);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">main</span>();</span><br></pre></td></tr></table></figure><p><strong>注意事项</strong>：</p><ul><li><p><strong>无限循环</strong>：脚本中的 <code>while (true)</code> 实现了无限循环，持续生成并检查域名。</p></li><li><p><strong>去重处理</strong>：使用 <code>Set</code> 对象 <code>checkedDomains</code> 确保生成的域名不重复。</p></li><li><p><strong>Whois 查询判断</strong>：根据 Whois 查询结果中包含的 <code>&#39;No match&#39;</code> 或 <code>&#39;NOT FOUND&#39;</code> 字样判断域名是否可注册。不同顶级域名的 Whois 信息格式可能不同，需要根据实际情况调整判断逻辑。</p></li><li><p><strong>保存可注册域名</strong>：可注册的域名会被追加保存到 <code>available_domains.txt</code> 文件中。</p></li><li><p><strong>错误处理</strong>：在 Whois 查询过程中，可能会遇到网络问题或其他异常，建议增加错误处理和重试机制。</p></li><li><p><strong>并发控制</strong>：当前实现是串行查询，效率较低。可以使用并发控制库（如 <code>p-limit</code>）来提高查询效率，但需注意 Whois 服务器的访问频率限制，避免被封禁。</p></li><li><p><strong>终止脚本</strong>：由于是无限循环运行，若需要停止脚本，可在终端中使用 <code>Ctrl + C</code>。</p></li></ul><p>希望这段代码和说明能帮助您实现批量查询 Whois 并判断可注册域名的功能。</p>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/10/domain_check_loop/</id>
    <link href="https://kwisma.github.io/2025/04/10/domain_check_loop/"/>
    <published>2025-04-10T12:05:16.000Z</published>
    <summary>
      <![CDATA[<p>在互联网时代，域名是网站的门牌号，一个好的域名不仅能提升品牌形象，还能增加用户的记忆度。然而，随着优质域名资源的逐渐减少，找到一个未被注册的理想域名变得越来越困难。为了简化这一过程，我们可以利用脚本自动生成随机域名并检查其可注册性，从而节省时间和精力。</p>
<p>本文将介绍如何使用 Node.js 编写一个脚本，生成随机的 5 位字母域名并检查其可注册性，同时将可用的域名动态保存到文件中。这种方法适合需要批量筛选域名的用户，帮助您快速找到心仪的域名。</p>]]>
    </summary>
    <title>随机域名</title>
    <updated>2026-05-12T16:57:50.481Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="Node.js" scheme="https://kwisma.github.io/tags/Node-js/"/>
    <category term="Sharp" scheme="https://kwisma.github.io/tags/Sharp/"/>
    <category term="WebP" scheme="https://kwisma.github.io/tags/WebP/"/>
    <category term="图片优化" scheme="https://kwisma.github.io/tags/%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96/"/>
    <category term="PNG" scheme="https://kwisma.github.io/tags/PNG/"/>
    <category term="JPEG" scheme="https://kwisma.github.io/tags/JPEG/"/>
    <content>
      <![CDATA[<p>本文介绍如何使用 Node.js 和 Sharp 库将常见图片格式（如 .jpg、.png、.webp 等）相互转换，以减少图片体积并提升加载速度。</p><span id="more"></span><h2 id="图片转换脚本"><a href="#图片转换脚本" class="headerlink" title="图片转换脚本"></a>图片转换脚本</h2><p>将（如 .jpg、.png、.webp等）图片格式相互转换</p><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>将<a href="#%E6%BA%90%E7%A0%81">源码</a>保存为 webp.js</p><p>安装依赖</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install sharp fs-extra inquirer@8</span><br></pre></td></tr></table></figure><p>执行代码</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node webp.js 输入图片目录</span><br></pre></td></tr></table></figure><h2 id="源码"><a href="#源码" class="headerlink" title="源码"></a>源码</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> sharp = <span class="built_in">require</span>(<span class="string">&#x27;sharp&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs-extra&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">&#x27;path&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> inquirer = <span class="built_in">require</span>(<span class="string">&#x27;inquirer&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// === 配置区域 ===</span></span><br><span class="line"><span class="keyword">const</span> inputDir = path.<span class="title function_">resolve</span>(__dirname, <span class="string">&#x27;input&#x27;</span>);         <span class="comment">// 输入文件夹</span></span><br><span class="line"><span class="keyword">const</span> outputDir = path.<span class="title function_">resolve</span>(__dirname, <span class="string">&#x27;output&#x27;</span>);       <span class="comment">// 输出文件夹</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> supportedFormats = [<span class="string">&#x27;.jpg&#x27;</span>, <span class="string">&#x27;.jpeg&#x27;</span>, <span class="string">&#x27;.png&#x27;</span>, <span class="string">&#x27;.webp&#x27;</span>, <span class="string">&#x27;.svg&#x27;</span>]; <span class="comment">// 支持的格式</span></span><br><span class="line"></span><br><span class="line">fs.<span class="title function_">ensureDirSync</span>(outputDir);</span><br><span class="line"></span><br><span class="line"><span class="comment">// ✅ 仅转换格式（不调整尺寸）</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">convertFormatsOnly</span>(<span class="params">inputDir, outputDir</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> files = <span class="keyword">await</span> fs.<span class="title function_">readdir</span>(inputDir);</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> file <span class="keyword">of</span> files) &#123;</span><br><span class="line">    <span class="keyword">const</span> ext = path.<span class="title function_">extname</span>(file).<span class="title function_">toLowerCase</span>();</span><br><span class="line">    <span class="keyword">if</span> (!supportedFormats.<span class="title function_">includes</span>(ext)) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`跳过不支持的文件: <span class="subst">$&#123;file&#125;</span>`</span>);</span><br><span class="line">      <span class="keyword">continue</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> inputPath = path.<span class="title function_">join</span>(inputDir, file);</span><br><span class="line">    <span class="keyword">const</span> baseFileName = path.<span class="title function_">basename</span>(file, ext);</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`仅转换格式: <span class="subst">$&#123;file&#125;</span>`</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> image = <span class="title function_">sharp</span>(inputPath);</span><br><span class="line">      <span class="keyword">await</span> image.<span class="title function_">clone</span>().<span class="title function_">png</span>().<span class="title function_">toFile</span>(path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>_only.png`</span>));</span><br><span class="line">      <span class="keyword">await</span> image.<span class="title function_">clone</span>().<span class="title function_">webp</span>(&#123; <span class="attr">quality</span>: <span class="number">100</span> &#125;).<span class="title function_">toFile</span>(path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>_only.webp`</span>));</span><br><span class="line">      <span class="keyword">await</span> image.<span class="title function_">clone</span>().<span class="title function_">jpeg</span>(&#123; <span class="attr">quality</span>: <span class="number">100</span> &#125;).<span class="title function_">toFile</span>(path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>_only.jpeg`</span>));</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> (ext === <span class="string">&#x27;.svg&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">await</span> fs.<span class="title function_">copyFile</span>(inputPath, path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>_only.svg`</span>));</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`✅ 完成: <span class="subst">$&#123;file&#125;</span>`</span>);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`❌ 格式转换失败: <span class="subst">$&#123;file&#125;</span>`</span>, err);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// ✅ 调整尺寸 + 转换格式</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">resizeAndConvertImages</span>(<span class="params">inputDir, outputDir, targetSize</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> files = <span class="keyword">await</span> fs.<span class="title function_">readdir</span>(inputDir);</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> file <span class="keyword">of</span> files) &#123;</span><br><span class="line">    <span class="keyword">const</span> ext = path.<span class="title function_">extname</span>(file).<span class="title function_">toLowerCase</span>();</span><br><span class="line">    <span class="keyword">if</span> (!supportedFormats.<span class="title function_">includes</span>(ext)) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`跳过不支持的文件: <span class="subst">$&#123;file&#125;</span>`</span>);</span><br><span class="line">      <span class="keyword">continue</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> inputPath = path.<span class="title function_">join</span>(inputDir, file);</span><br><span class="line">    <span class="keyword">const</span> baseFileName = path.<span class="title function_">basename</span>(file, ext);</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`调整尺寸并转换格式: <span class="subst">$&#123;file&#125;</span>`</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> resizedImage = <span class="title function_">sharp</span>(inputPath)</span><br><span class="line">        .<span class="title function_">resize</span>(targetSize, targetSize, &#123;</span><br><span class="line">          <span class="attr">fit</span>: <span class="string">&#x27;contain&#x27;</span>,</span><br><span class="line">          <span class="attr">background</span>: &#123; <span class="attr">r</span>: <span class="number">255</span>, <span class="attr">g</span>: <span class="number">255</span>, <span class="attr">b</span>: <span class="number">255</span>, <span class="attr">alpha</span>: <span class="number">1</span> &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">      <span class="keyword">await</span> resizedImage.<span class="title function_">clone</span>().<span class="title function_">png</span>().<span class="title function_">toFile</span>(path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>.png`</span>));</span><br><span class="line">      <span class="keyword">await</span> resizedImage.<span class="title function_">clone</span>().<span class="title function_">webp</span>(&#123; <span class="attr">quality</span>: <span class="number">100</span> &#125;).<span class="title function_">toFile</span>(path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>.webp`</span>));</span><br><span class="line">      <span class="keyword">await</span> resizedImage.<span class="title function_">clone</span>().<span class="title function_">jpeg</span>(&#123; <span class="attr">quality</span>: <span class="number">100</span> &#125;).<span class="title function_">toFile</span>(path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>.jpeg`</span>));</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> (ext === <span class="string">&#x27;.svg&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">await</span> resizedImage.<span class="title function_">clone</span>().<span class="title function_">toFile</span>(path.<span class="title function_">join</span>(outputDir, <span class="string">`<span class="subst">$&#123;baseFileName&#125;</span>.svg`</span>));</span><br><span class="line">      &#125;</span><br><span class="line"></span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`✅ 完成: <span class="subst">$&#123;file&#125;</span>`</span>);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`❌ 转换失败: <span class="subst">$&#123;file&#125;</span>`</span>, err);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// ✅ 获取用户输入的尺寸</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">askSize</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> answers = <span class="keyword">await</span> inquirer.<span class="title function_">prompt</span>([</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">type</span>: <span class="string">&#x27;input&#x27;</span>,</span><br><span class="line">      <span class="attr">name</span>: <span class="string">&#x27;size&#x27;</span>,</span><br><span class="line">      <span class="attr">message</span>: <span class="string">&#x27;请输入目标宽高（一个整数，代表宽高都为此值）：&#x27;</span>,</span><br><span class="line">      <span class="attr">default</span>: <span class="number">48</span>, <span class="comment">// ✅ 默认值</span></span><br><span class="line">      <span class="attr">validate</span>: <span class="function"><span class="params">value</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> valid = !<span class="built_in">isNaN</span>(<span class="built_in">parseInt</span>(value)) &amp;&amp; <span class="built_in">parseInt</span>(value) &gt; <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> valid || <span class="string">&#x27;请输入一个正整数&#x27;</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  ]);</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">parseInt</span>(answers.<span class="property">size</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// === 主程序 ===</span></span><br><span class="line">(<span class="title function_">async</span> () =&gt; &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;🔁 开始执行【仅格式转换】...&#x27;</span>);</span><br><span class="line">    <span class="keyword">await</span> <span class="title function_">convertFormatsOnly</span>(inputDir, outputDir);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> targetSize = <span class="keyword">await</span> <span class="title function_">askSize</span>();</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`🔧 设置目标尺寸为 <span class="subst">$&#123;targetSize&#125;</span> x <span class="subst">$&#123;targetSize&#125;</span>`</span>);</span><br><span class="line">    <span class="keyword">await</span> <span class="title function_">resizeAndConvertImages</span>(inputDir, outputDir, targetSize);</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;🎉 所有操作完成！&#x27;</span>);</span><br><span class="line">  &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;处理出错:&#x27;</span>, err);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;)();</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/webp_convert_to/</id>
    <link href="https://kwisma.github.io/2025/04/05/webp_convert_to/"/>
    <published>2025-04-05T14:16:20.000Z</published>
    <summary>
      <![CDATA[<p>本文介绍如何使用 Node.js 和 Sharp 库将常见图片格式（如 .jpg、.png、.webp 等）相互转换，以减少图片体积并提升加载速度。</p>]]>
    </summary>
    <title>图片格式转换为 WebP</title>
    <updated>2026-05-12T17:00:22.137Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="mihomo" scheme="https://kwisma.github.io/tags/mihomo/"/>
    <category term="DNS" scheme="https://kwisma.github.io/tags/DNS/"/>
    <category term="WebRTC" scheme="https://kwisma.github.io/tags/WebRTC/"/>
    <category term="隐私保护" scheme="https://kwisma.github.io/tags/%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4/"/>
    <category term="配置指南" scheme="https://kwisma.github.io/tags/%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/"/>
    <content>
      <![CDATA[<p>在现代互联网中，隐私保护变得越来越重要。DNS 和 WebRTC 泄露是两个常见的隐私风险，它们可能会暴露您的真实 IP 地址和网络活动，即使您使用了代理或 VPN。本文将详细介绍如何通过配置 DNS 和 WebRTC 设置，防止这些泄露，保护您的隐私。</p><span id="more"></span><h2 id="防止-DNS-泄露"><a href="#防止-DNS-泄露" class="headerlink" title="防止 DNS 泄露"></a>防止 DNS 泄露</h2><p>全部dns路由国外,仅包含在<code>RULE-SET:CN,Private</code>的dns路由国内以防止 DNS 泄露，您可以通过以下配置启用增强的 DNS 模块。以下是配置项的简要说明：</p><ul><li><code>enable</code>: 启用 DNS 模块。</li><li><code>cache-algorithm</code>: 缓存算法，默认 <code>arc</code>。</li><li><code>prefer-h3</code>: 优先使用 HTTP&#x2F;3 协议进行 DNS 查询。</li><li><code>use-hosts</code> 和 <code>use-system-hosts</code>: 使用自定义和系统的 hosts 文件条目。</li><li><code>respect-rules</code>: 确保 DNS 查询遵守路由规则。</li><li><code>listen</code>: 设置本地 DNS 服务监听的地址和端口。</li><li><code>ipv6</code>: 启用 IPv6 DNS 解析。</li><li><code>default-nameserver</code>: 配置默认的 DNS 服务器地址。</li><li><code>enhanced-mode</code>: 启用增强模式（<code>redir-host</code> 或 <code>fake-ip</code>）。</li><li><code>fake-ip-range</code>: 配置 fake-ip 地址池。</li><li><code>fake-ip-filter</code>: 配置 fake-ip 的过滤规则。</li><li><code>nameserver</code>: 配置用于 DNS 查询的服务器列表。</li><li><code>proxy-server-nameserver</code>: 配置用于代理节点域名解析的 DNS 服务器。</li><li><code>direct-nameserver</code>: 配置用于直连出口域名解析的 DNS 服务器。</li><li><code>nameserver-policy</code>: 根据规则集为特定域名指定 DNS 服务器。</li></ul><p>以下是示例配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">dns:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># 启用 DNS 模块</span></span><br><span class="line">  <span class="attr">cache-algorithm:</span> <span class="string">arc</span> <span class="comment"># 缓存算法，参数:lru 最近最少使用，arc 自适应替换缓存</span></span><br><span class="line">  <span class="attr">prefer-h3:</span> <span class="literal">false</span> <span class="comment"># DOH 优先使用 http/3</span></span><br><span class="line">  <span class="attr">use-hosts:</span> <span class="literal">true</span> <span class="comment"># 使用配置中的 hosts 文件条目</span></span><br><span class="line">  <span class="attr">use-system-hosts:</span> <span class="literal">true</span> <span class="comment"># 使用系统的 hosts 文件条目</span></span><br><span class="line">  <span class="attr">respect-rules:</span> <span class="literal">true</span> <span class="comment"># dns 连接遵守路由规则，需配置 proxy-server-nameserver, 强烈不建议和 prefer-h3 一起使用</span></span><br><span class="line">  <span class="attr">listen:</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span><span class="string">:1053</span> <span class="comment"># 本地 DNS 监听端口，默认是 1053 端口</span></span><br><span class="line">  <span class="attr">ipv6:</span> <span class="literal">true</span> <span class="comment"># 启用 IPv6 DNS 解析，避免 IPv6 地址的解析请求</span></span><br><span class="line">  <span class="attr">default-nameserver:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">quic://223.5.5.5</span> <span class="comment"># 阿里 DNS 解析 DNS 域名</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">quic://223.6.6.6</span> <span class="comment"># 阿里 DNS 解析 DNS 域名</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;2400:3200::1&quot;</span> <span class="comment"># 阿里 DNS 解析 DNS 域名</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;2400:3200:baba::1&quot;</span> <span class="comment"># 阿里 DNS 解析 DNS 域名</span></span><br><span class="line">  <span class="attr">enhanced-mode:</span> <span class="string">fake-ip</span> <span class="comment"># 启用增强模式 redir-host or fake-ip</span></span><br><span class="line">  <span class="attr">fake-ip-range:</span> <span class="number">198.18</span><span class="number">.0</span><span class="number">.0</span><span class="string">/16</span> <span class="comment"># fake-ip 池设置</span></span><br><span class="line">  <span class="attr">fake-ip-filter-mode:</span> <span class="string">blacklist</span></span><br><span class="line">  <span class="attr">fake-ip-filter:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">RULE-SET:Private,Fakeip_Filter,China</span></span><br><span class="line">  <span class="attr">nameserver-policy:</span></span><br><span class="line">    <span class="string">RULE-SET:Private,China:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;quic://223.5.5.5&quot;</span> <span class="comment"># 阿里 DNS over DOQ</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;quic://223.6.6.6&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;quic://dns.jupitrdns.com&quot;</span> <span class="comment"># JupitrDNS DNS over DOQ</span></span><br><span class="line">  <span class="attr">nameserver:</span> <span class="comment"># 设置多个 DNS 会泄漏不同服务商，不会泄漏 CN，如果在意建议只设置一个</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;quic://dns.adguard-dns.com&quot;</span> <span class="comment"># AdGuard DNS over DOQ</span></span><br><span class="line">  <span class="attr">proxy-server-nameserver:</span> <span class="comment"># 代理节点域名解析服务器，仅用于解析代理节点的域名</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;quic://223.5.5.5&quot;</span> <span class="comment"># 阿里 DNS over DOQ</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;quic://223.6.6.6&quot;</span></span><br><span class="line">  <span class="attr">direct-nameserver:</span> <span class="comment">#  用于直连出口域名解析的 DNS 服务器</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;quic://223.5.5.5&quot;</span> <span class="comment"># 阿里 DNS over DOQ</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&quot;quic://223.6.6.6&quot;</span></span><br><span class="line">  <span class="attr">direct-nameserver-follow-policy:</span> <span class="literal">true</span> <span class="comment"># 是否遵循 nameserver-policy，默认为不遵守，仅当 direct-nameserver 不为空时生效</span></span><br></pre></td></tr></table></figure><h2 id="防止-WebRTC-泄露"><a href="#防止-WebRTC-泄露" class="headerlink" title="防止 WebRTC 泄露"></a>防止 WebRTC 泄露</h2><p>WebRTC 泄露可能会暴露真实的 IP 地址，即使您使用了代理。为了防止 WebRTC 泄露，您需要启用 TUN 模式，确保所有流量都经过代理。以下是配置项的简要说明：</p><ul><li><code>enable</code>: 启用 TUN 模式，用于透明代理。</li><li><code>stack</code>: 指定使用的网络栈，可选值为 <code>system</code>、<code>gvisor</code> 或 <code>mixed</code>。</li><li><code>auto-route</code>: 自动根据流量选择最佳路由。</li><li><code>auto-redirect</code>: 自动配置 iptables&#x2F;nftables 以重定向 TCP 连接。</li><li><code>auto-detect-interface</code>: 自动检测并使用适当的网络接口。</li><li><code>dns-hijack</code>: 劫持指定端口的 DNS 请求，确保 DNS 查询通过代理。</li><li><code>device</code>: 指定 TUN 设备名称，默认为 <code>utun0</code>。</li><li><code>exclude-package</code>: 配置不经过代理的流量包。</li></ul><p>以下是示例配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">tun:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># 启用 TUN 模式，用于透明代理</span></span><br><span class="line">  <span class="attr">stack:</span> <span class="string">gvisor</span> <span class="comment"># 使用空间网络栈处理流量，可用值： system/gvisor/mixed</span></span><br><span class="line">  <span class="attr">auto-route:</span> <span class="literal">true</span> <span class="comment"># 自动根据流量选择最佳路由</span></span><br><span class="line">  <span class="attr">auto-redirect:</span> <span class="literal">false</span> <span class="comment"># 自动配置 iptables/nftables 以重定向 TCP 连接，需要root权限</span></span><br><span class="line">  <span class="attr">auto-detect-interface:</span> <span class="literal">true</span> <span class="comment"># 自动检测并使用适当的网络接口</span></span><br><span class="line">  <span class="attr">dns-hijack:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">any:53</span> <span class="comment"># 劫持所有 53 端口的 DNS 请求</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">tcp://any:53</span> <span class="comment"># 劫持所有 TCP 53 端口的 DNS 请求</span></span><br><span class="line">  <span class="attr">device:</span> <span class="string">utun0</span> <span class="comment"># 指定 TUN 设备名称，默认为 utun0</span></span><br><span class="line">  <span class="attr">exclude-package:</span> [] <span class="comment"># 配置不经过代理的流量包</span></span><br></pre></td></tr></table></figure><p>通过上述配置，您可以有效防止 WebRTC 泄露，保护您的隐私。</p><h2 id="完整配置"><a href="#完整配置" class="headerlink" title="完整配置"></a>完整配置</h2><p>完整配置文件: <a href="https://cdn.jsdelivr.net/gh/Kwisma/MarketNest@main/vpn/mihomo/Mihomo.yaml">点击这里</a></p>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/mihomo_dns_webrtc/</id>
    <link href="https://kwisma.github.io/2025/04/05/mihomo_dns_webrtc/"/>
    <published>2025-04-05T13:38:16.000Z</published>
    <summary>
      <![CDATA[<p>在现代互联网中，隐私保护变得越来越重要。DNS 和 WebRTC 泄露是两个常见的隐私风险，它们可能会暴露您的真实 IP 地址和网络活动，即使您使用了代理或 VPN。本文将详细介绍如何通过配置 DNS 和 WebRTC 设置，防止这些泄露，保护您的隐私。</p>]]>
    </summary>
    <title>防止 DNS 和 WebRTC 泄露的配置指南</title>
    <updated>2026-05-12T16:59:35.077Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="代理" scheme="https://kwisma.github.io/tags/%E4%BB%A3%E7%90%86/"/>
    <category term="mihomo" scheme="https://kwisma.github.io/tags/mihomo/"/>
    <category term="Linux" scheme="https://kwisma.github.io/tags/Linux/"/>
    <category term="配置" scheme="https://kwisma.github.io/tags/%E9%85%8D%E7%BD%AE/"/>
    <content>
      <![CDATA[<p>本文将详细介绍如何在Linux系统上安装和配置mihomo工具，包括设置服务、配置面板以及代理的使用方法，帮助您快速上手。</p><span id="more"></span><h1 id="mihomo-Linux安装"><a href="#mihomo-Linux安装" class="headerlink" title="mihomo Linux安装"></a>mihomo Linux安装</h1><p>下载<a href="https://github.com/MetaCubeX/mihomo/">mihomo</a></p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/MetaCubeX/mihomo/releases/download/v1.19.4/mihomo-linux-amd64-v1.19.4.gz</span><br></pre></td></tr></table></figure><p>解压</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gzip -d mihomo-linux-amd64-v1.19.4.gz</span><br></pre></td></tr></table></figure><p>移动到&#x2F;usr&#x2F;local&#x2F;bin&#x2F;mihomo并重命名</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mv mihomo-linux-amd64 /usr/local/bin/mihomo</span><br></pre></td></tr></table></figure><p>给执行权限</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x /usr/local/bin/mihomo</span><br></pre></td></tr></table></figure><p>设置成服务</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/systemd/system/mihomo.service</span><br></pre></td></tr></table></figure><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=mihomo service</span><br><span class="line">After=network.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=simple</span><br><span class="line">User=root</span><br><span class="line">ExecStart=/usr/local/bin/mihomo</span><br><span class="line">Restart=on-failure # or always, on-abort, etc</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure><p>设置开机自启</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">systemctl daemon-reload</span><br><span class="line">systemctl enable mihomo</span><br></pre></td></tr></table></figure><p>启动</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service mihomo start</span><br></pre></td></tr></table></figure><h2 id="配置面板"><a href="#配置面板" class="headerlink" title="配置面板"></a>配置面板</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd ~/.config/mihomo</span><br></pre></td></tr></table></figure><p>下载配置文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget -U <span class="string">&#x27;clash.meta&#x27;</span> 订阅链接</span><br></pre></td></tr></table></figure><p>下载面板，解压，重命名</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/haishanh/yacd/archive/gh-pages.zip</span><br><span class="line">unzip gh-pages.zip</span><br><span class="line">mv yacd-gh-pages/ dashboard/</span><br></pre></td></tr></table></figure><p>配置面板</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">external-ui: dashboard</span><br></pre></td></tr></table></figure><p>secret: xxxx #设置访问密码</p><p>external-controller: 0.0.0.0:9090  #别忘记在服务器厂商开放端口号</p><p>external-ui: dashboard  #面板路径</p><h2 id="修改系统代理"><a href="#修改系统代理" class="headerlink" title="修改系统代理"></a>修改系统代理</h2><p>设置代理</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/profile</span><br></pre></td></tr></table></figure><p>全局代理(开关版)</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">alias kmihomo=&quot;export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890&quot;</span><br><span class="line">alias gmihomo=&quot;unset  http_proxy  https_proxy  all_proxy&quot;</span><br></pre></td></tr></table></figure><p>开启代理</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kmihomo</span><br></pre></td></tr></table></figure><p>关闭代理</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gmihomo</span><br></pre></td></tr></table></figure><p>全局代理</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">export http_proxy=127.0.0.1:9090</span><br><span class="line">export https_proxy=127.0.0.1:9090</span><br></pre></td></tr></table></figure><p>重载配置文件</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure><p>查看代理是否代理</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">env|grep -i proxy</span><br></pre></td></tr></table></figure><h3 id="其他指令"><a href="#其他指令" class="headerlink" title="其他指令"></a>其他指令</h3><p>查看服务状态</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service mihomo status</span><br></pre></td></tr></table></figure><p>重启服务</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service mihomo restart</span><br></pre></td></tr></table></figure><p>停止服务</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service mihomo stop</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/mihomo_linux_install/</id>
    <link href="https://kwisma.github.io/2025/04/05/mihomo_linux_install/"/>
    <published>2025-04-05T13:13:06.000Z</published>
    <summary>
      <![CDATA[<p>本文将详细介绍如何在Linux系统上安装和配置mihomo工具，包括设置服务、配置面板以及代理的使用方法，帮助您快速上手。</p>]]>
    </summary>
    <title>mihomo安装与配置指南</title>
    <updated>2026-05-12T16:59:40.405Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="代理" scheme="https://kwisma.github.io/tags/%E4%BB%A3%E7%90%86/"/>
    <category term="网络" scheme="https://kwisma.github.io/tags/%E7%BD%91%E7%BB%9C/"/>
    <category term="Hysteria2" scheme="https://kwisma.github.io/tags/Hysteria2/"/>
    <content>
      <![CDATA[<p>Hysteria2 是一款高性能的代理工具，支持 QUIC 协议，能够提供快速、稳定的网络连接。本教程将详细介绍如何安装和配置 Hysteria2，帮助您快速上手并部署到生产环境。</p><span id="more"></span><h2 id="安装脚本"><a href="#安装脚本" class="headerlink" title="安装脚本"></a>安装脚本</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash &lt;(curl -fsSL https://get.hy2.sh/)</span><br></pre></td></tr></table></figure><h2 id="自签证书"><a href="#自签证书" class="headerlink" title="自签证书"></a>自签证书</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl req -x509 -nodes -newkey ec:&lt;(openssl ecparam -name prime256v1) -keyout /etc/hysteria/server.key -out /etc/hysteria/server.crt -subj <span class="string">&quot;/CN=bing.com&quot;</span> -days 36500 &amp;&amp; <span class="built_in">sudo</span> <span class="built_in">chown</span> hysteria /etc/hysteria/server.key &amp;&amp; <span class="built_in">sudo</span> <span class="built_in">chown</span> hysteria /etc/hysteria/server.crt</span><br></pre></td></tr></table></figure><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF &gt; /etc/hysteria/config.yaml</span></span><br><span class="line"><span class="string">listen: :4000 #监听端口</span></span><br><span class="line"><span class="string">tls:</span></span><br><span class="line"><span class="string">  cert: /etc/hysteria/server.crt</span></span><br><span class="line"><span class="string">  key: /etc/hysteria/server.key</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">auth:</span></span><br><span class="line"><span class="string">  type: password</span></span><br><span class="line"><span class="string">  password: 098f01eb-7b21-4ea4-9e5a-02c36392ba58 #设置认证密码</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">masquerade:</span></span><br><span class="line"><span class="string">  type: proxy</span></span><br><span class="line"><span class="string">  proxy:</span></span><br><span class="line"><span class="string">    url: https://bing.com #伪装网址</span></span><br><span class="line"><span class="string">    rewriteHost: true</span></span><br><span class="line"><span class="string">quic:</span></span><br><span class="line"><span class="string">  initStreamReceiveWindow: 8388608</span></span><br><span class="line"><span class="string">  maxStreamReceiveWindow: 8388608</span></span><br><span class="line"><span class="string">  initConnReceiveWindow: 20971520</span></span><br><span class="line"><span class="string">  maxConnReceiveWindow: 20971520</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h2 id="开放端口跳跃"><a href="#开放端口跳跃" class="headerlink" title="开放端口跳跃"></a>开放端口跳跃</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># IPv4</span></span><br><span class="line">iptables -t nat -A PREROUTING -p udp --dport 4000:8000 -j DNAT --to-destination :4000</span><br><span class="line"><span class="comment"># IPv6</span></span><br><span class="line">ip6tables -t nat -A PREROUTING -p udp --dport 4000:8000 -j DNAT --to-destination :4000</span><br></pre></td></tr></table></figure><h2 id="开机自启"><a href="#开机自启" class="headerlink" title="开机自启"></a>开机自启</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> hysteria-server.service</span><br></pre></td></tr></table></figure><h2 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl start hysteria-server.service</span><br></pre></td></tr></table></figure><h2 id="查看状态"><a href="#查看状态" class="headerlink" title="查看状态"></a>查看状态</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl status hysteria-server.service</span><br></pre></td></tr></table></figure><h2 id="重启"><a href="#重启" class="headerlink" title="重启"></a>重启</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart hysteria-server.service</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/hysteria2_script/</id>
    <link href="https://kwisma.github.io/2025/04/05/hysteria2_script/"/>
    <published>2025-04-05T11:28:46.000Z</published>
    <summary>
      <![CDATA[<p>Hysteria2 是一款高性能的代理工具，支持 QUIC 协议，能够提供快速、稳定的网络连接。本教程将详细介绍如何安装和配置 Hysteria2，帮助您快速上手并部署到生产环境。</p>]]>
    </summary>
    <title>hysteria2安装教程</title>
    <updated>2026-05-12T16:59:02.305Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="Linux" scheme="https://kwisma.github.io/tags/Linux/"/>
    <category term="字体" scheme="https://kwisma.github.io/tags/%E5%AD%97%E4%BD%93/"/>
    <category term="中文" scheme="https://kwisma.github.io/tags/%E4%B8%AD%E6%96%87/"/>
    <category term="脚本" scheme="https://kwisma.github.io/tags/%E8%84%9A%E6%9C%AC/"/>
    <category term="fonts" scheme="https://kwisma.github.io/tags/fonts/"/>
    <content>
      <![CDATA[<p>在Linux系统中，默认情况下可能缺少一些常用的中文字体，这会导致在某些场景下显示中文字符时出现乱码或不美观的问题。本文将介绍一个简单的一键安装脚本，帮助您快速配置中文字体，提升系统的显示效果。</p><span id="more"></span><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><p>复制保存到 <code>fonts.sh</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 搜索中文字体软件包描述</span></span><br><span class="line">search_results=$(apt-cache search fonts | grep Chinese)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 提取软件包名称</span></span><br><span class="line">package_names=$(<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$search_results</span>&quot;</span> | awk <span class="string">&#x27;&#123;print $1&#125;&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查当前用户是否为管理员</span></span><br><span class="line"><span class="keyword">if</span> [ $(<span class="built_in">id</span> -u) -eq 0 ]; <span class="keyword">then</span></span><br><span class="line">  apt_cmd=<span class="string">&quot;apt install&quot;</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  apt_cmd=<span class="string">&quot;sudo apt install&quot;</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装匹配的软件包</span></span><br><span class="line"><span class="variable">$apt_cmd</span> -y <span class="variable">$package_names</span></span><br></pre></td></tr></table></figure><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash fonts.sh</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/fonts_linux_install/</id>
    <link href="https://kwisma.github.io/2025/04/05/fonts_linux_install/"/>
    <published>2025-04-05T11:09:48.000Z</published>
    <summary>
      <![CDATA[<p>在Linux系统中，默认情况下可能缺少一些常用的中文字体，这会导致在某些场景下显示中文字符时出现乱码或不美观的问题。本文将介绍一个简单的一键安装脚本，帮助您快速配置中文字体，提升系统的显示效果。</p>]]>
    </summary>
    <title>Linux一键安装中文字体</title>
    <updated>2026-05-12T16:58:47.573Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="自动化" scheme="https://kwisma.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <category term="Cloudflare" scheme="https://kwisma.github.io/tags/Cloudflare/"/>
    <category term="脚本" scheme="https://kwisma.github.io/tags/%E8%84%9A%E6%9C%AC/"/>
    <category term="DNS" scheme="https://kwisma.github.io/tags/DNS/"/>
    <content>
      <![CDATA[<p>在使用 Cloudflare 管理域名时，批量操作 DNS 记录是一项常见需求。本文将介绍如何通过简单的脚本实现批量删除和添加 DNS 记录，帮助您更高效地管理域名解析。</p><span id="more"></span><h2 id="令牌-和-区域ID-获取方法"><a href="#令牌-和-区域ID-获取方法" class="headerlink" title="令牌 和 区域ID 获取方法"></a>令牌 和 区域ID 获取方法</h2><p>CLOUDFLARE_API_TOKEN 获取方式: 右上角头像 &gt; 配置文件 &gt; api令牌 &gt; 创建令牌 &gt; 编辑区域 DNS &gt; 使用模板 &gt; 继续以显示摘要 &gt; 创建令牌 &gt; copy</p><img src="/2025/04/05/cloudflare_add_delete_domain/cf1.webp" class="" title="[cf教程1]"><img src="/2025/04/05/cloudflare_add_delete_domain/cf2.webp" class="" title="[cf教程2]"><img src="/2025/04/05/cloudflare_add_delete_domain/cf3.webp" class="" title="[cf教程3]"><img src="/2025/04/05/cloudflare_add_delete_domain/cf4.webp" class="" title="[cf教程4]"><img src="/2025/04/05/cloudflare_add_delete_domain/cf5.webp" class="" title="[cf教程5]"><img src="/2025/04/05/cloudflare_add_delete_domain/cf6.webp" class="" title="[cf教程6]"><p>ZONE_ID 获取方式：点击域名 &gt; 描述 &gt; API 区域 ID(往下滑动)</p><img src="/2025/04/05/cloudflare_add_delete_domain/dm1.webp" class="" title="[ZONE_ID教程1]"><img src="/2025/04/05/cloudflare_add_delete_domain/dm2.webp" class="" title="[ZONE_ID教程2]"><h2 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i node-fetch</span><br></pre></td></tr></table></figure><h2 id="批量删除dns记录"><a href="#批量删除dns记录" class="headerlink" title="批量删除dns记录"></a>批量删除dns记录</h2><p><strong>修改参数如下即可</strong>：</p><p>const CLOUDFLARE_API_TOKEN &#x3D; ‘令牌’; &#x2F;&#x2F; 你的 Cloudflare API 令牌</p><p>const ZONE_ID &#x3D; ‘区域ID’; &#x2F;&#x2F; 你的 Cloudflare 区域 ID</p><p>&#x2F;&#x2F; 要删除的记录类型和子域名（完整）</p><p>const RECORD_TYPE &#x3D; ‘A’; &#x2F;&#x2F; 比如 ‘A’, ‘CNAME’, ‘TXT’</p><p>const TARGET_NAME &#x3D; ‘sub.mot.ip-ddns.com’; &#x2F;&#x2F; 要删除的完整子域名</p><h3 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fetch = <span class="built_in">require</span>(<span class="string">&#x27;node-fetch&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 替换以下常量为你的实际值</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CLOUDFLARE_API_TOKEN</span> = <span class="string">&#x27;令牌&#x27;</span>; <span class="comment">// 你的 Cloudflare API 令牌</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">ZONE_ID</span> = <span class="string">&#x27;区域ID&#x27;</span>; <span class="comment">// 你的 Cloudflare 区域 ID</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 要删除的记录类型和子域名（完整）</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">RECORD_TYPE</span> = <span class="string">&#x27;A&#x27;</span>; <span class="comment">// 比如 &#x27;A&#x27;, &#x27;CNAME&#x27;, &#x27;TXT&#x27;</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">TARGET_NAME</span> = <span class="string">&#x27;子域名&#x27;</span>; <span class="comment">// 要删除的完整子域名</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Cloudflare API 基础地址</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CLOUDFLARE_API_BASE</span> = <span class="string">`https://api.cloudflare.com/client/v4`</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">listAllDnsRecords</span>(<span class="params">zoneId, type, name</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> allRecords = [];</span><br><span class="line">  <span class="keyword">let</span> page = <span class="number">1</span>;</span><br><span class="line">  <span class="keyword">let</span> totalPages = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">do</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> url = <span class="string">`<span class="subst">$&#123;CLOUDFLARE_API_BASE&#125;</span>/zones/<span class="subst">$&#123;zoneId&#125;</span>/dns_records?type=<span class="subst">$&#123;type&#125;</span>&amp;name=<span class="subst">$&#123;name&#125;</span>&amp;page=<span class="subst">$&#123;page&#125;</span>&amp;per_page=100`</span>;</span><br><span class="line">    <span class="keyword">const</span> res = <span class="keyword">await</span> <span class="title function_">fetch</span>(url, &#123;</span><br><span class="line">      <span class="attr">headers</span>: &#123;</span><br><span class="line">        <span class="title class_">Authorization</span>: <span class="string">`Bearer <span class="subst">$&#123;CLOUDFLARE_API_TOKEN&#125;</span>`</span>,</span><br><span class="line">        <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span>,</span><br><span class="line">      &#125;,</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> data = <span class="keyword">await</span> res.<span class="title function_">json</span>();</span><br><span class="line">    <span class="keyword">if</span> (!data.<span class="property">success</span>) &#123;</span><br><span class="line">      <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">`Failed to list DNS records: <span class="subst">$&#123;<span class="built_in">JSON</span>.stringify(data.errors)&#125;</span>`</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    allRecords.<span class="title function_">push</span>(...data.<span class="property">result</span>);</span><br><span class="line">    totalPages = data.<span class="property">result_info</span>.<span class="property">total_pages</span>;</span><br><span class="line">    page++;</span><br><span class="line">  &#125; <span class="keyword">while</span> (page &lt;= totalPages);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> allRecords;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">main</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`查找 <span class="subst">$&#123;RECORD_TYPE&#125;</span> 类型的记录，名称为 <span class="subst">$&#123;TARGET_NAME&#125;</span>...`</span>);</span><br><span class="line">    <span class="keyword">const</span> records = <span class="keyword">await</span> <span class="title function_">listAllDnsRecords</span>(<span class="variable constant_">ZONE_ID</span>, <span class="variable constant_">RECORD_TYPE</span>, <span class="variable constant_">TARGET_NAME</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (records.<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;没有找到符合条件的 DNS 记录。&#x27;</span>);</span><br><span class="line">      <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`找到 <span class="subst">$&#123;records.length&#125;</span> 条记录，开始删除...`</span>);</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">const</span> record <span class="keyword">of</span> records) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`删除记录 ID: <span class="subst">$&#123;record.id&#125;</span>, 内容: <span class="subst">$&#123;record.content&#125;</span>`</span>);</span><br><span class="line">      <span class="keyword">await</span> <span class="title function_">deleteDnsRecord</span>(<span class="variable constant_">ZONE_ID</span>, record.<span class="property">id</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;删除完成 ✅&#x27;</span>);</span><br><span class="line">  &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;出错啦 ❌&#x27;</span>, err.<span class="property">message</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">deleteDnsRecord</span>(<span class="params">zoneId, recordId</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> url = <span class="string">`<span class="subst">$&#123;CLOUDFLARE_API_BASE&#125;</span>/zones/<span class="subst">$&#123;zoneId&#125;</span>/dns_records/<span class="subst">$&#123;recordId&#125;</span>`</span>;</span><br><span class="line">  <span class="keyword">const</span> res = <span class="keyword">await</span> <span class="title function_">fetch</span>(url, &#123;</span><br><span class="line">    <span class="attr">method</span>: <span class="string">&#x27;DELETE&#x27;</span>,</span><br><span class="line">    <span class="attr">headers</span>: &#123;</span><br><span class="line">      <span class="title class_">Authorization</span>: <span class="string">`Bearer <span class="subst">$&#123;CLOUDFLARE_API_TOKEN&#125;</span>`</span>,</span><br><span class="line">      <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> data = <span class="keyword">await</span> res.<span class="title function_">json</span>();</span><br><span class="line">  <span class="keyword">if</span> (!data.<span class="property">success</span>) &#123;</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">`Failed to delete DNS record: <span class="subst">$&#123;<span class="built_in">JSON</span>.stringify(data.errors)&#125;</span>`</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> data;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">main</span>();</span><br></pre></td></tr></table></figure><h2 id="批量日添加dns记录"><a href="#批量日添加dns记录" class="headerlink" title="批量日添加dns记录"></a>批量日添加dns记录</h2><p><strong>修改参数如下即可</strong>：</p><p>const CLOUDFLARE_API_TOKEN &#x3D; ‘令牌’; &#x2F;&#x2F; 你的 Cloudflare API 令牌</p><p>const ZONE_ID &#x3D; ‘区域ID’; &#x2F;&#x2F; 你的 Cloudflare 区域 ID</p><p>const RECORD_TYPE &#x3D; ‘A’; &#x2F;&#x2F; 或 AAAA</p><p>const DOMAIN &#x3D; ‘sub.mot.ip-ddns.com’; &#x2F;&#x2F; 要添加的完整子域名</p><p>const FILE_PATH &#x3D; ‘.&#x2F;dns.txt’; &#x2F;&#x2F; 数据文件路径，格式为 IP 地址列表，每行一个 IP，支持注释（#开头）和端口（:后面）例如：ip1:port1#注释</p><h3 id="完整代码-1"><a href="#完整代码-1" class="headerlink" title="完整代码"></a>完整代码</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs/promises&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> fetch = <span class="built_in">require</span>(<span class="string">&#x27;node-fetch&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 配置区：根据你的需求修改</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CLOUDFLARE_API_TOKEN</span> = <span class="string">&#x27;令牌&#x27;</span>; <span class="comment">// 你的 Cloudflare API 令牌</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">ZONE_ID</span> = <span class="string">&#x27;区域ID&#x27;</span>; <span class="comment">// 你的 Cloudflare 区域 ID</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">RECORD_TYPE</span> = <span class="string">&#x27;A&#x27;</span>; <span class="comment">// 或 AAAA</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">DOMAIN</span> = <span class="string">&#x27;sub.mot.ip-ddns.com&#x27;</span>; <span class="comment">// 要添加的完整子域名</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">FILE_PATH</span> = <span class="string">&#x27;./dns.txt&#x27;</span>; <span class="comment">// 数据文件路径，格式为 IP 地址列表，每行一个 IP，支持注释（#开头）和端口（:后面）</span></span><br><span class="line"><span class="comment">// 例如：ip1:port1#注释</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Cloudflare API base</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CF_API_BASE</span> = <span class="string">&#x27;https://api.cloudflare.com/client/v4&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 读取并处理 IP 地址</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">readIPsFromFile</span>(<span class="params">path</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> data = <span class="keyword">await</span> fs.<span class="title function_">readFile</span>(path, <span class="string">&#x27;utf-8&#x27;</span>);</span><br><span class="line">  <span class="keyword">const</span> lines = data.<span class="title function_">split</span>(<span class="string">&#x27;\n&#x27;</span>).<span class="title function_">map</span>(<span class="function"><span class="params">line</span> =&gt;</span> line.<span class="title function_">trim</span>()).<span class="title function_">filter</span>(<span class="title class_">Boolean</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> ips = lines.<span class="title function_">map</span>(<span class="function"><span class="params">line</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> [ipPort] = line.<span class="title function_">split</span>(<span class="string">&#x27;#&#x27;</span>);</span><br><span class="line">    <span class="keyword">const</span> [ip] = ipPort.<span class="title function_">split</span>(<span class="string">&#x27;:&#x27;</span>);</span><br><span class="line">    <span class="keyword">return</span> ip;</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> [...<span class="keyword">new</span> <span class="title class_">Set</span>(ips)]; <span class="comment">// 去重</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 添加 DNS 记录</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">addDNSRecord</span>(<span class="params">ip</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">`<span class="subst">$&#123;CF_API_BASE&#125;</span>/zones/<span class="subst">$&#123;ZONE_ID&#125;</span>/dns_records`</span>, &#123;</span><br><span class="line">    <span class="attr">method</span>: <span class="string">&#x27;POST&#x27;</span>,</span><br><span class="line">    <span class="attr">headers</span>: &#123;</span><br><span class="line">      <span class="string">&#x27;Authorization&#x27;</span>: <span class="string">`Bearer <span class="subst">$&#123;CLOUDFLARE_API_TOKEN&#125;</span>`</span>,</span><br><span class="line">      <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">body</span>: <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123;</span><br><span class="line">      <span class="attr">type</span>: <span class="variable constant_">RECORD_TYPE</span>,</span><br><span class="line">      <span class="attr">name</span>: <span class="variable constant_">DOMAIN</span>,</span><br><span class="line">      <span class="attr">content</span>: ip,</span><br><span class="line">      <span class="attr">ttl</span>: <span class="number">1</span>, <span class="comment">// 自动 TTL</span></span><br><span class="line">      <span class="attr">proxied</span>: <span class="literal">false</span> <span class="comment">// 如果你想用 CF 的代理，改成 true</span></span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> result = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line">  <span class="keyword">if</span> (result.<span class="property">success</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`✅ 添加成功: <span class="subst">$&#123;ip&#125;</span>`</span>);</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`❌ 添加失败: <span class="subst">$&#123;ip&#125;</span>`</span>, result.<span class="property">errors</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 主函数</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">main</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> ips = <span class="keyword">await</span> <span class="title function_">readIPsFromFile</span>(<span class="variable constant_">FILE_PATH</span>);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`共读取 <span class="subst">$&#123;ips.length&#125;</span> 个 IP，将添加到 <span class="subst">$&#123;DOMAIN&#125;</span>`</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">const</span> ip <span class="keyword">of</span> ips) &#123;</span><br><span class="line">      <span class="keyword">await</span> <span class="title function_">addDNSRecord</span>(ip);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;🎉 所有记录处理完毕。&#x27;</span>);</span><br><span class="line">  &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;🚨 发生错误:&#x27;</span>, err);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">main</span>();</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/cloudflare_add_delete_domain/</id>
    <link href="https://kwisma.github.io/2025/04/05/cloudflare_add_delete_domain/"/>
    <published>2025-04-05T09:25:39.000Z</published>
    <summary>
      <![CDATA[<p>在使用 Cloudflare 管理域名时，批量操作 DNS 记录是一项常见需求。本文将介绍如何通过简单的脚本实现批量删除和添加 DNS 记录，帮助您更高效地管理域名解析。</p>]]>
    </summary>
    <title>cloudflare 批量脚本</title>
    <updated>2026-05-12T16:57:35.321Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="Cloudflare" scheme="https://kwisma.github.io/tags/Cloudflare/"/>
    <category term="Worker" scheme="https://kwisma.github.io/tags/Worker/"/>
    <category term="Nginx" scheme="https://kwisma.github.io/tags/Nginx/"/>
    <category term="伪装" scheme="https://kwisma.github.io/tags/%E4%BC%AA%E8%A3%85/"/>
    <content>
      <![CDATA[<p>Cloudflare Worker 是一种强大的边缘计算服务，能够通过 JavaScript 编写自定义逻辑来处理请求。本教程将展示如何使用 Cloudflare Worker 模拟 Nginx 的默认页面，以实现伪装效果。</p><span id="more"></span><h2 id="cloudflare-worker-伪装nginx代码"><a href="#cloudflare-worker-伪装nginx代码" class="headerlink" title="cloudflare worker 伪装nginx代码"></a>cloudflare worker 伪装nginx代码</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> html = <span class="string">`</span></span><br><span class="line"><span class="string">&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="string">&lt;html&gt;</span></span><br><span class="line"><span class="string">&lt;head&gt;</span></span><br><span class="line"><span class="string">&lt;title&gt;Welcome to nginx!&lt;/title&gt;</span></span><br><span class="line"><span class="string">&lt;style&gt;</span></span><br><span class="line"><span class="string">html &#123; color-scheme: light dark; &#125;</span></span><br><span class="line"><span class="string">body &#123; width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; &#125;</span></span><br><span class="line"><span class="string">&lt;/style&gt;</span></span><br><span class="line"><span class="string">&lt;/head&gt;</span></span><br><span class="line"><span class="string">&lt;body&gt;</span></span><br><span class="line"><span class="string">&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;</span></span><br><span class="line"><span class="string">&lt;p&gt;If you see this page, the nginx web server is successfully installed and working. Further configuration is required.&lt;/p&gt;</span></span><br><span class="line"><span class="string">&lt;p&gt;For online documentation and support please refer to &lt;a href=&quot;http://nginx.org/&quot;&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;</span></span><br><span class="line"><span class="string">Commercial support is available at &lt;a href=&quot;http://nginx.com/&quot;&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;</span></span><br><span class="line"><span class="string">&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;</span></span><br><span class="line"><span class="string">&lt;/body&gt;</span></span><br><span class="line"><span class="string">&lt;/html&gt;`</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">createCombinedHeaders</span>(<span class="params">request, htmlheaders</span>) &#123;</span><br><span class="line">    <span class="comment">// Create a new Headers object for combining headers</span></span><br><span class="line">    <span class="keyword">const</span> combinedHeaders = <span class="keyword">new</span> <span class="title class_">Headers</span>(htmlheaders.<span class="property">headers</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Add request headers into the combined headers</span></span><br><span class="line">    request.<span class="property">headers</span>.<span class="title function_">forEach</span>(<span class="function">(<span class="params">value, key</span>) =&gt;</span> &#123;</span><br><span class="line">        combinedHeaders.<span class="title function_">set</span>(key, value);</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Return the combined headers along with other response information</span></span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">        <span class="attr">status</span>: htmlheaders.<span class="property">status</span>,</span><br><span class="line">        <span class="attr">method</span>: htmlheaders.<span class="property">method</span>,</span><br><span class="line">        <span class="attr">headers</span>: combinedHeaders,</span><br><span class="line">        <span class="attr">body</span>: htmlheaders.<span class="property">body</span></span><br><span class="line">    &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getSubscriptionUserInfo</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> today = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">    today.<span class="title function_">setHours</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">UD</span> = <span class="title class_">Math</span>.<span class="title function_">floor</span>(((<span class="title class_">Date</span>.<span class="title function_">now</span>() - today.<span class="title function_">getTime</span>()) / <span class="number">86400000</span>) * <span class="number">24</span> * <span class="number">1099511627776</span> / <span class="number">2</span>);</span><br><span class="line">    <span class="keyword">const</span> pagesSum = <span class="variable constant_">UD</span>;</span><br><span class="line">    <span class="keyword">const</span> workersSum = <span class="variable constant_">UD</span>;</span><br><span class="line">    <span class="keyword">const</span> total = <span class="number">24</span> * <span class="number">1099511627776</span>;</span><br><span class="line">    <span class="keyword">const</span> expire = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Date</span>.<span class="title function_">now</span>() / <span class="number">1000</span>) + <span class="number">3600</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`upload=<span class="subst">$&#123;pagesSum&#125;</span>; download=<span class="subst">$&#123;workersSum&#125;</span>; total=<span class="subst">$&#123;total&#125;</span>; expire=<span class="subst">$&#123;expire&#125;</span>`</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">modifyTargetUrl</span>(<span class="params">request, searchParams, targetUrl</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> ((request.<span class="property">headers</span>.<span class="title function_">has</span>(<span class="string">&#x27;clash&#x27;</span>) &amp;&amp; !request.<span class="property">headers</span>.<span class="title function_">has</span>(<span class="string">&#x27;nekobox&#x27;</span>)) ||</span><br><span class="line">        (searchParams.<span class="title function_">has</span>(<span class="string">&#x27;clash&#x27;</span>) &amp;&amp; !request.<span class="property">headers</span>.<span class="title function_">has</span>(<span class="string">&#x27;subconverter&#x27;</span>))) &#123;</span><br><span class="line">        targetUrl += <span class="string">&#x27;?clash&#x27;</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (request.<span class="property">headers</span>.<span class="title function_">has</span>(<span class="string">&#x27;sing-box&#x27;</span>) || request.<span class="property">headers</span>.<span class="title function_">has</span>(<span class="string">&#x27;singbox&#x27;</span>) ||</span><br><span class="line">        ((searchParams.<span class="title function_">has</span>(<span class="string">&#x27;singbox&#x27;</span>) || searchParams.<span class="title function_">has</span>(<span class="string">&#x27;sb&#x27;</span>)) &amp;&amp; !request.<span class="property">headers</span>.<span class="title function_">has</span>(<span class="string">&#x27;subconverter&#x27;</span>))) &#123;</span><br><span class="line">        targetUrl += <span class="string">&#x27;?sb&#x27;</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        targetUrl += <span class="string">&#x27;?sub&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> targetUrl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">    <span class="keyword">async</span> <span class="title function_">fetch</span>(<span class="params">request, env, ctx</span>) &#123;</span><br><span class="line">        <span class="comment">// Ensure the User-Agent header is in lowercase</span></span><br><span class="line">        <span class="keyword">const</span> userAgent = (request.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">&#x27;User-Agent&#x27;</span>) || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line"></span><br><span class="line">        <span class="comment">// Create a new Headers object for the request, and add the lowercase User-Agent</span></span><br><span class="line">        <span class="keyword">const</span> newHeaders = <span class="keyword">new</span> <span class="title class_">Headers</span>(request.<span class="property">headers</span>);</span><br><span class="line">        newHeaders.<span class="title function_">set</span>(<span class="string">&#x27;User-Agent&#x27;</span>, userAgent);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">        <span class="keyword">const</span> path = url.<span class="property">searchParams</span>.<span class="title function_">get</span>(<span class="string">&#x27;token&#x27;</span>);</span><br><span class="line">        <span class="keyword">const</span> path2 = url.<span class="property">searchParams</span>.<span class="title function_">get</span>(<span class="string">&#x27;url&#x27;</span>);</span><br><span class="line">        <span class="keyword">const</span> htmlheaders = &#123;</span><br><span class="line">            <span class="attr">status</span>: <span class="number">200</span>,</span><br><span class="line">            <span class="attr">method</span>: request.<span class="property">method</span>,</span><br><span class="line">            <span class="attr">headers</span>: &#123;</span><br><span class="line">                <span class="string">&quot;Content-Type&quot;</span>: <span class="string">&quot;text/html;charset=utf-8&quot;</span>,</span><br><span class="line">                <span class="string">&quot;Profile-Update-Interval&quot;</span>: <span class="string">&quot;6&quot;</span>,</span><br><span class="line">                <span class="string">&quot;Subscription-Userinfo&quot;</span>: <span class="title function_">getSubscriptionUserInfo</span>(),</span><br><span class="line">                <span class="string">&quot;Cache-Control&quot;</span>: <span class="string">&quot;no-store&quot;</span>,</span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="attr">body</span>: (request.<span class="property">method</span> !== <span class="string">&#x27;GET&#x27;</span> &amp;&amp; request.<span class="property">method</span> !== <span class="string">&#x27;HEAD&#x27;</span>) ? request.<span class="property">body</span> : <span class="literal">null</span></span><br><span class="line">        &#125;;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> combinedHeaders = <span class="title function_">createCombinedHeaders</span>(&#123; ...request, <span class="attr">headers</span>: newHeaders &#125;, htmlheaders);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (!path || !env.<span class="property">URL</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(html, combinedHeaders);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">let</span> targetUrl = <span class="keyword">await</span> env.<span class="property">URL</span>.<span class="title function_">get</span>(path);</span><br><span class="line">        <span class="keyword">if</span> (!targetUrl) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(html, combinedHeaders);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (path2) &#123;</span><br><span class="line">            <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, combinedHeaders);</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(response.<span class="property">body</span>, combinedHeaders);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        targetUrl = <span class="title function_">modifyTargetUrl</span>(request, url.<span class="property">searchParams</span>, targetUrl);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, combinedHeaders);</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(response.<span class="property">body</span>, combinedHeaders);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/nginx_disguise/</id>
    <link href="https://kwisma.github.io/2025/04/05/nginx_disguise/"/>
    <published>2025-04-05T09:18:39.000Z</published>
    <summary>
      <![CDATA[<p>Cloudflare Worker 是一种强大的边缘计算服务，能够通过 JavaScript 编写自定义逻辑来处理请求。本教程将展示如何使用 Cloudflare Worker 模拟 Nginx 的默认页面，以实现伪装效果。</p>]]>
    </summary>
    <title>cf worker 伪装nginx</title>
    <updated>2026-05-12T16:59:46.625Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="代理" scheme="https://kwisma.github.io/tags/%E4%BB%A3%E7%90%86/"/>
    <category term="mihomo" scheme="https://kwisma.github.io/tags/mihomo/"/>
    <category term="Linux" scheme="https://kwisma.github.io/tags/Linux/"/>
    <category term="网络配置" scheme="https://kwisma.github.io/tags/%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE/"/>
    <content>
      <![CDATA[<p>本文介绍了如何在 Linux 系统中添加和管理代理，包括设置系统代理和快速切换代理的操作方法。</p><span id="more"></span><h2 id="系统代理"><a href="#系统代理" class="headerlink" title="系统代理"></a>系统代理</h2><p>1.编辑文件</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim  /etc/profile</span><br></pre></td></tr></table></figure><p>2.在文件最下面写入</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">alias kclash=&quot;export ALL_PROXY=127.0.0.1:7890&quot;</span><br><span class="line">alias gclash=&quot;unset ALL_PROXY&quot;</span><br></pre></td></tr></table></figure><p>3.重载配置</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure><p>4.开启kclash，关闭gclash</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kclash</span><br></pre></td></tr></table></figure><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gclash</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/04/05/proxy_linux/</id>
    <link href="https://kwisma.github.io/2025/04/05/proxy_linux/"/>
    <published>2025-04-05T09:18:39.000Z</published>
    <summary>
      <![CDATA[<p>本文介绍了如何在 Linux 系统中添加和管理代理，包括设置系统代理和快速切换代理的操作方法。</p>]]>
    </summary>
    <title>Linux 添加代理</title>
    <updated>2026-05-12T17:00:00.401Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="脚本" scheme="https://kwisma.github.io/categories/%E8%84%9A%E6%9C%AC/"/>
    <category term="自动化" scheme="https://kwisma.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    <category term="SSL" scheme="https://kwisma.github.io/tags/SSL/"/>
    <category term="HTTPS" scheme="https://kwisma.github.io/tags/HTTPS/"/>
    <category term="Let’s Encrypt" scheme="https://kwisma.github.io/tags/Let%E2%80%99s-Encrypt/"/>
    <content>
      <![CDATA[<p>使用 Let’s Encrypt 免费申请泛域名 SSL 证书，并实现自动续期的快速指令</p><span id="more"></span><h2 id="使用-acme-sh-设置-SSL-证书"><a href="#使用-acme-sh-设置-SSL-证书" class="headerlink" title="使用 acme.sh 设置 SSL 证书"></a>使用 acme.sh 设置 SSL 证书</h2><p>本指南提供了使用 <code>acme.sh</code> 脚本设置 SSL 证书的分步说明，其中 Let’s Encrypt 为默认证书颁发机构 (CA)。它包括用于安装、配置和颁发根域和通配符域证书的命令。</p><h2 id="步骤概述"><a href="#步骤概述" class="headerlink" title="步骤概述"></a>步骤概述</h2><ol><li><strong>安装 acme.sh</strong>：下载并安装 <code>acme.sh</code> 脚本。提供用于接收通知的电子邮件地址。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://get.acme.sh | sh -s email=d342jxc@gmail.com</span><br></pre></td></tr></table></figure><ol start="2"><li><strong>设置默认 CA</strong>：配置 <code>acme.sh</code> 使用 Let’s Encrypt 作为默认 CA。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">acme.sh --set-default-ca --server letsencrypt</span><br></pre></td></tr></table></figure><ol start="3"><li><strong>别名配置</strong>：为<code>acme.sh</code>添加别名，以简化命令使用并重新加载shell配置。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;alias acme.sh=~/.acme.sh/acme.sh&#x27;</span> &gt;&gt; ~/.bashrc</span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure><ol start="4"><li><strong>Cloudflare API 凭证</strong>：添加 Cloudflare API 凭证（<code>CF_Key</code> 和 <code>CF_Email</code>）以启用基于 DNS 的域验证。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> CF_Key=<span class="string">&quot;xxx&quot;</span></span><br><span class="line"><span class="built_in">export</span> CF_Email=<span class="string">&quot;xxx@gmail.com&quot;</span></span><br></pre></td></tr></table></figure><ol start="5"><li><strong>颁发证书</strong>：使用 <code>--issue</code> 命令通过 Cloudflare DNS 验证为根域和通配符子域生成 SSL 证书。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">acme.sh --issue --dns dns_cf -d example.com -d *.example.com</span><br></pre></td></tr></table></figure><ol start="6"><li><strong>安装证书</strong>：将生成的证书安装到指定路径，并为Nginx Web服务器配置重新加载命令。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">acme.sh --install-cert -d <span class="string">&#x27;example.com&#x27;</span> \</span><br><span class="line">--key-file       /etc/nginx/ssl/example.com/example.com.key  \</span><br><span class="line">--fullchain-file /etc/nginx/ssl/example.com/example.com.crt \</span><br><span class="line">--reloadcmd     <span class="string">&quot;service nginx force-reload&quot;</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">acme.sh --install-cert -d <span class="string">&#x27;*.example.com&#x27;</span> \</span><br><span class="line">--key-file       /etc/nginx/ssl/example.com/example.com.key  \</span><br><span class="line">--fullchain-file /etc/nginx/ssl/example.com/example.com.crt \</span><br><span class="line">--reloadcmd     <span class="string">&quot;service nginx force-reload&quot;</span></span><br></pre></td></tr></table></figure><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ul><li>将 <code>xxx</code> 和 <code>xxx@gmail.com</code> 替换为您的实际 Cloudflare API 密钥和电子邮件地址。</li><li>将 <code>example.com</code> 替换为您的实际域名。</li><li>确保密钥和证书文件的指定路径与您的 Nginx 配置相匹配。</li><li><code>--reloadcmd</code> 选项可确保在证书续订后自动重新加载 Nginx。</li></ul><p>此设置可确保根域和所有子域的安全 HTTPS 连接。</p><h2 id="反向代理"><a href="#反向代理" class="headerlink" title="反向代理"></a>反向代理</h2><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">location</span> / &#123;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Range <span class="variable">$http_range</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> If-Range <span class="variable">$http_if_range</span>;</span><br><span class="line">    <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">    <span class="attribute">proxy_pass</span> https://bangumi.tv;</span><br><span class="line">    <span class="comment"># the max size of file to upload</span></span><br><span class="line">    <span class="attribute">client_max_body_size</span> <span class="number">20000m</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="section">location</span><span class="regexp"> ^~</span> /xui &#123;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Range <span class="variable">$http_range</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> If-Range <span class="variable">$http_if_range</span>;</span><br><span class="line">    <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">    <span class="attribute">proxy_pass</span> http://127.0.0.1:1000;</span><br><span class="line">    <span class="comment"># the max size of file to upload</span></span><br><span class="line">    <span class="attribute">client_max_body_size</span> <span class="number">20000m</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="section">location</span><span class="regexp"> ^~</span> /alist &#123;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Forwarded-Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Host <span class="variable">$http_host</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Range <span class="variable">$http_range</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> If-Range <span class="variable">$http_if_range</span>;</span><br><span class="line">    <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">    <span class="attribute">proxy_pass</span> http://127.0.0.1:5244;</span><br><span class="line">    <span class="comment"># the max size of file to upload</span></span><br><span class="line">    <span class="attribute">client_max_body_size</span> <span class="number">20000m</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/03/27/domain_ssl_script/</id>
    <link href="https://kwisma.github.io/2025/03/27/domain_ssl_script/"/>
    <published>2025-03-27T11:18:39.000Z</published>
    <summary>
      <![CDATA[<p>使用 Let’s Encrypt 免费申请泛域名 SSL 证书，并实现自动续期的快速指令</p>]]>
    </summary>
    <title>Let’s Encrypt 免费申请泛域名 SSL 证书</title>
    <updated>2026-05-13T03:37:20.196Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="Linux" scheme="https://kwisma.github.io/tags/Linux/"/>
    <category term="指令" scheme="https://kwisma.github.io/tags/%E6%8C%87%E4%BB%A4/"/>
    <category term="系统优化" scheme="https://kwisma.github.io/tags/%E7%B3%BB%E7%BB%9F%E4%BC%98%E5%8C%96/"/>
    <category term="软件管理" scheme="https://kwisma.github.io/tags/%E8%BD%AF%E4%BB%B6%E7%AE%A1%E7%90%86/"/>
    <category term="KED neno" scheme="https://kwisma.github.io/tags/KED-neno/"/>
    <content>
      <![CDATA[<p>本文总结了 KED 系统中常用的指令，包括软件更新、垃圾清理、代理设置、语言包安装等操作。</p><span id="more"></span><h2 id="更新软件源"><a href="#更新软件源" class="headerlink" title="更新软件源"></a>更新软件源</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> pkcon refresh &amp;&amp; <span class="built_in">sudo</span> pkcon update</span><br></pre></td></tr></table></figure><h2 id="垃圾清理"><a href="#垃圾清理" class="headerlink" title="垃圾清理"></a>垃圾清理</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt autoremove</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get --fix-broken install</span><br></pre></td></tr></table></figure><h2 id="pkcon-取消代理"><a href="#pkcon-取消代理" class="headerlink" title="pkcon 取消代理"></a>pkcon 取消代理</h2><p><a href="https://www.jianshu.com/p/4bd3c3be978f">原文参考地址</a></p><p>原来这个服务把代理藏在一个Sqlite的数据库里，在这里：</p><p>&#x2F;var&#x2F;lib&#x2F;PackageKit&#x2F;transactions.db</p><ul><li>安装数据库可视化工具</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install sqlitebrowser</span><br></pre></td></tr></table></figure><ul><li>编辑数据库</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> sqlitebrowser /var/lib/PackageKit/transactions.db</span><br></pre></td></tr></table></figure><ul><li>删除代理proxy</li><li>最后重启pkcon</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl restart packagekit.service</span><br></pre></td></tr></table></figure><h2 id="修改为root登录"><a href="#修改为root登录" class="headerlink" title="修改为root登录"></a>修改为root登录</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> nano /etc/pam.d/sddm</span><br></pre></td></tr></table></figure><p>将第一个注释，第二个取消注释</p><blockquote><p>#auth    required        pam_succeed_if.so user !&#x3D; root quiet_success<br>   auth    sufficient      pam_succeed_if.so user ingroup nopasswdlogin</p></blockquote><h2 id="安装中文语包和繁体包"><a href="#安装中文语包和繁体包" class="headerlink" title="安装中文语包和繁体包"></a>安装中文语包和繁体包</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get install language-pack-gnome-zh-hans language-pack-kde-zh-hans language-pack-zh-hans language-pack-gnome-zh-hant language-pack-kde-zh-hant language-pack-zh-hant</span><br></pre></td></tr></table></figure><h2 id="fcitx"><a href="#fcitx" class="headerlink" title="fcitx"></a>fcitx</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install fcitx5 fcitx5-chewing fcitx5-chinese-addons fcitx5-rime</span><br></pre></td></tr></table></figure><h2 id="安装语言支持"><a href="#安装语言支持" class="headerlink" title="安装语言支持"></a>安装语言支持</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get install language-selector-gnome</span><br></pre></td></tr></table></figure><h2 id="ui"><a href="#ui" class="headerlink" title="ui"></a>ui</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get install fcitx-ui-qimpanel</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://kwisma.github.io/2025/03/27/ked_neno_commands/</id>
    <link href="https://kwisma.github.io/2025/03/27/ked_neno_commands/"/>
    <published>2025-03-27T11:02:39.000Z</published>
    <summary>
      <![CDATA[<p>本文总结了 KED 系统中常用的指令，包括软件更新、垃圾清理、代理设置、语言包安装等操作。</p>]]>
    </summary>
    <title>KED neno 常用指令</title>
    <updated>2026-05-13T03:37:20.200Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="Alist" scheme="https://kwisma.github.io/tags/Alist/"/>
    <category term="教程" scheme="https://kwisma.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    <category term="网页美化" scheme="https://kwisma.github.io/tags/%E7%BD%91%E9%A1%B5%E7%BE%8E%E5%8C%96/"/>
    <category term="前端开发" scheme="https://kwisma.github.io/tags/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    <content>
      <![CDATA[<p>美化 Alist 网页头部的模板，包含多个功能模块和样式配置，旨在增强页面的视觉效果和交互性</p><span id="more"></span><h2 id="功能"><a href="#功能" class="headerlink" title="功能"></a>功能</h2><ol><li>基础功能的引入</li></ol><p>Polyfill 支持：通过 <code>&lt;script&gt;</code> 标签引入了 <code>polyfill.io</code>，为 <code>String.prototype.replaceAll</code> 提供兼容性支持，确保在旧版浏览器中也能正常运行。</p><p>全局字体：引入了 LXGW WenKai（霞鹜文楷）字体，设置为全局字体，提升页面的美观性和一致性。</p><ol start="2"><li>评论系统和统计功能</li></ol><p>Valine 评论系统：通过引入 <code>Valine.min.js</code>，为页面添加了基于 <code>LeanCloud</code> 的无后端评论功能，方便用户互动。</p><p>不蒜子计数器：通过 <code>busuanzi.pure.mini.js</code>，实现了页面访问量和访客统计功能，动态显示页面的访问数据。</p><ol start="3"><li>图标和音乐播放器</li></ol><p><code>Font6</code> 图标库：引入了 <code>Font Awesome</code> 图标库，提供丰富的图标支持，用于自定义底部和看板娘功能。</p><p>音乐播放器：通过引入 <code>APlayer</code> 和 <code>MetingJS</code>，为页面添加了音乐播放功能，支持多种音乐平台（如网易云音乐），并提供了高度可定制的播放器界面。</p><ol start="4"><li>样式美化</li></ol><p>背景图：为白天和夜间模式分别设置了不同的背景图片，并通过 <code>CSS</code> 实现了背景的固定、覆盖和居中显示。</p><p>透明效果：为主列表、代码块、评论区、侧边栏等多个模块设置了透明背景，分别适配白天和夜间模式，提升页面的层次感。</p><p>毛玻璃效果：为搜索栏和按钮添加了毛玻璃效果（<code>backdrop-filter: blur</code>），增强了视觉体验。</p><p>鼠标指针样式：自定义了鼠标指针样式，为不同的元素（如按钮、输入框、代码块）设置了个性化的光标。</p><ol start="5"><li>动态功能</li></ol><p>看板娘：通过引入 <code>Live2D</code> 模型，为页面添加了一个虚拟角色（看板娘）。代码中设置了模型的大小、对话框位置，并加载了指定的模型和纹理。</p><p>渐变背景：通过 <code>#canvas-basic</code> 元素设置了全屏渐变背景，提升了页面的动态效果。</p><p>隐藏功能：提供了隐藏通知栏、底部版权信息和音乐播放器的选项，用户可以根据需求启用或禁用这些功能。</p><ol start="6"><li>代码注释和扩展性</li></ol><p>图片 API：代码中列出了多个图片 API 的使用示例，用户可以根据需求选择不同的图片来源，用于背景或其他用途。</p><p>注释说明：代码中包含了大量注释，详细说明了每个功能模块的用途和配置方法，方便用户理解和修改。</p><h2 id="alist-头部美化代码"><a href="#alist-头部美化代码" class="headerlink" title="alist 头部美化代码"></a>alist 头部美化代码</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--Alist V3建议添加的，已经默认添加了，如果你的没有建议加上--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://polyfill.io/v3/polyfill.min.js?features=String.prototype.replaceAll&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--引入字体，全局字体使用--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://npm.elemecdn.com/lxgw-wenkai-webfont@1.1.0/lxgwwenkai-regular.css&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--评论系统使用的js--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&#x27;https://unpkg.com/valine/dist/Valine.min.js&#x27;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--不蒜子计数器--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">async</span> <span class="attr">src</span>=<span class="string">&quot;https://busuanzi.icodeq.com/busuanzi.pure.mini.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- Font6，自定义底部使用和看板娘使用的图标和字体文件--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">type</span>=<span class="string">&#x27;text/css&#x27;</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://npm.elemecdn.com/font6pro@6.3.0/css/fontawesome.min.css&quot;</span> <span class="attr">media</span>=<span class="string">&#x27;all&#x27;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">href</span>=<span class="string">&quot;https://npm.elemecdn.com/font6pro@6.3.0/css/all.min.css&quot;</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--音乐播放器所用的文件--&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- require APlayer --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://npm.elemecdn.com/aplayer@1.10.1/dist/APlayer.min.css&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://npm.elemecdn.com/aplayer@1.10.1/dist/APlayer.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- require MetingJS --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://npm.elemecdn.com/meting2@0.0.1/js/Meting.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/* 去除通知栏 右上角 X */</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.notify-render</span> <span class="selector-class">.hope-close-button</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">display</span>: none;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/* 此选项两处CSS 在v3.31.0中已优化 滚动显示 和 右下角设置网格模式尺寸大小 */</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/* 文字超长自动换行 */</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*.name-box .name &#123;</span></span></span><br><span class="line"><span class="comment"><span class="language-css">    white-space: unset !important;</span></span></span><br><span class="line"><span class="comment"><span class="language-css">    overflow: unset !important;</span></span></span><br><span class="line"><span class="comment"><span class="language-css">&#125;*/</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/* 缩略图图片变大 代码中的160px 自己改 现在是注释状态若需要自行解除注释 */</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*.obj-box &gt; div &#123;</span></span></span><br><span class="line"><span class="comment"><span class="language-css">grid-template-columns: repeat(auto-fill, minmax(160px, 1fr))</span></span></span><br><span class="line"><span class="comment"><span class="language-css">&#125;</span></span></span><br><span class="line"><span class="comment"><span class="language-css">.obj-box &gt; div .item-thumbnail&#123;</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  height: 100px;</span></span></span><br><span class="line"><span class="comment"><span class="language-css">&#125;*/</span></span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  图片API用法点进去都会有食用说明的,API来自网络不保证实效性稳定性自己测试</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  樱花：https://www.dmoe.cc</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  夏沫：https://cdn.seovx.com</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  搏天：https://api.btstu.cn/doc/sjbz.php</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  姬长信：https://github.com/insoxin/API</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  小歪：https://api.ixiaowai.cn/</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  保罗：https://api.paugram.com</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  墨天逸：https://api.mtyqx.cn</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  岁月小筑：https://img.xjh.me</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  东方Project：https://img.paulzzh.com</span></span></span><br><span class="line"><span class="comment"><span class="language-css">  */</span></span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天背景图*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">&quot;http://pic.rmb.bdstatic.com/bjh/7569b014a1abafd5481298763300ae1d.png&quot;</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-repeat</span>:no-repeat;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-size</span>:cover;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-attachment</span>:fixed;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-position-x</span>:center;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间背景图*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-dark</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">&quot;http://pic.rmb.bdstatic.com/bjh/ebe942a9de49856f389c65f25a338335.png&quot;</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-repeat</span>:no-repeat;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-size</span>:cover;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-attachment</span>:fixed;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-position-x</span>:center;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*主列表白天模式透明*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.obj-box</span><span class="selector-class">.hope-stack</span><span class="selector-class">.hope-c-dhzjXW</span><span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-igScBhH-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*主列表夜间模式透明*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.obj-box</span><span class="selector-class">.hope-stack</span><span class="selector-class">.hope-c-dhzjXW</span><span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-iigjoxS-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*readme白天模式透明*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-ikSuVsl-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*readme夜间模式透明*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-iiuDLME-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*顶部右上角切换按钮透明*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-ivMHWx-hZistB-cv</span><span class="selector-class">.hope-icon-button</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-ivMHWx-hZistB-cv</span><span class="selector-class">.hope-icon-button</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*右下角侧边栏按钮透明 第一个是白天 第二个是夜间*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-ijgzmFG-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-ijgzmFG-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式代码块透明*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> pre &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.1</span>)<span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-dark</span> pre &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>)<span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*左侧侧边栏目录*/</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-ieGWMbI-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-ieGWMbI-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/* 返回顶部 */</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-c-PJLV-ihVEsOa-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-ihVEsOa-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*正常情况未使用吸附功能*/</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*顶部*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-c-PJLV-ikaMhsQ-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*导航条*/</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-idaeksS-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) !重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-idaeksS-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) !重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/* 吸附到页面顶部 */</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*顶部*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-c-PJLV-icWrYmg-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*导航条*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-c-PJLV-icKsjdm-css</span><span class="selector-pseudo">::after</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-icKsjdm-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) !重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-icKsjdm-css</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) !重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*仅吸附导航栏*/</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*导航条*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-c-PJLV-ifdXShc-css</span><span class="selector-pseudo">::after</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-hrsMRY</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) !重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间模式*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-hrsMRY</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) !重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*底部CSS，.App .table这三个一起的*/</span></span></span><br><span class="line"><span class="language-css"> dibu &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-top</span>: <span class="number">0px</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">bottom</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">margin</span>: <span class="number">0px</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">padding</span>: <span class="number">0px</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-class">.App</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">min-height</span>: <span class="number">85vh</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-class">.table</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">margin</span>: auto;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*去掉底部*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.footer</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">display</span>: none !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*全局字体*/</span></span></span><br><span class="line"><span class="language-css"> * &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">font-family</span>:LXGW WenKai</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css">* &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">font-weight</span>:bold</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-tag">body</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">font-family</span>: LXGW WenKai;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*以下为评论系统专用*/</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/*适配大小契合度*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.newValine</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">width</span>: <span class="built_in">min</span>(<span class="number">96%</span>, <span class="number">940px</span>);</span></span><br><span class="line"><span class="language-css">    <span class="attribute">flex-direction</span>: column;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">row-gap</span>: <span class="built_in">var</span>(--hope-space-<span class="number">2</span>);</span></span><br><span class="line"><span class="language-css">    <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl);</span></span><br><span class="line"><span class="language-css">    <span class="attribute">padding</span>: <span class="built_in">var</span>(--hope-space-<span class="number">2</span>);</span></span><br><span class="line"><span class="language-css">    <span class="attribute">box-shadow</span>: <span class="built_in">var</span>(--hope-shadows-lg);</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*评论区 - 白天模式透明度*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.newValine</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.5</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*评论区 - 夜间模式透明度*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.newValine</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>:<span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">50%</span>) !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="comment">/*输入栏里面跳舞的小人背景图*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.vedit</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-image</span>:<span class="built_in">url</span>(<span class="string">&quot;https://jsd.onmicrosoft.cn/gh/anwen-anyi/imgAnwen/images/OuNiJiang.gif&quot;</span>);</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-size</span>:contain;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-repeat</span>:no-repeat;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-position</span><span class="selector-pseudo">:right</span> <span class="attribute">bottom</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">transition</span>:all <span class="number">0.25s</span> ease-in-out <span class="number">0s</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-tag">textarea</span><span class="selector-id">#comment-textarea</span><span class="selector-pseudo">:focus</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-position-y</span>:<span class="number">120px</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">transition</span>:all <span class="number">0.25s</span> ease-in-out <span class="number">0s</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*渐变背景CSS*/</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-id">#canvas-basic</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">position</span>: fixed;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">display</span>: block;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">height</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">top</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">right</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">bottom</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">left</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">z-index</span>: -<span class="number">999</span>;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*音乐播放器进一步进行隐藏*/</span></span></span><br><span class="line"><span class="language-css"><span class="comment">/* 需要就加不需要就不用加 */</span></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.aplayer</span><span class="selector-class">.aplayer-fixed</span><span class="selector-class">.aplayer-narrow</span> <span class="selector-class">.aplayer-body</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">left</span>: -<span class="number">66px</span> !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"><span class="selector-class">.aplayer</span><span class="selector-class">.aplayer-fixed</span><span class="selector-class">.aplayer-narrow</span> <span class="selector-class">.aplayer-body</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">left</span>: <span class="number">0</span> !重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--看板娘 -自定义大小，隐藏对话框和对话框高度--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">  <span class="selector-id">#waifu</span> <span class="selector-id">#live2d</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">height</span>: <span class="number">350px</span><span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">width</span>: <span class="number">350px</span><span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css">  <span class="selector-id">#waifu-tips</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">top</span>: -<span class="number">60px</span>;</span></span><br><span class="line"><span class="language-css">    <span class="comment">/*display:none !重要;隐藏对话框*/</span></span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--看板娘加载指定模型--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;modelId&#x27;</span>, <span class="string">&#x27;7&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">  <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;modelTexturesId&#x27;</span>, <span class="string">&#x27;3&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--以下四个两个主用两个备用的,选一条使用即可--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--自己选左右--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--&lt;script src=&quot;https://api.itggg.cn/live2dnew/left/index.js&quot;&gt;&lt;/script&gt;--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://api.itggg.cn/live2dnew/right/index.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--备用的，自己选左右--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://luluossfile.lulufind.com/work/teacher_u20221017ce7b5991_1666420843832_19934968_file.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://luluossfile.lulufind.com/work/teacher_u20221017bb6d7454_1666420849979_19584065_file.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式 搜索主体+毛玻璃*/</span></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-iiBaxsN-css</span>&#123;</span></span><br><span class="line"><span class="language-css">   <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">0.2</span>)!重要;</span></span><br><span class="line"><span class="language-css">   <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>)!重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式 搜索栏输入框+毛玻璃*/</span></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-kvTTWD-hYRNAb-variant-filled</span>&#123;</span></span><br><span class="line"><span class="language-css">   <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">0.2</span>)!重要;</span></span><br><span class="line"><span class="language-css">   <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>)!重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*白天模式 搜索按钮+毛玻璃*/</span></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-ikEIIxw-css</span>&#123;</span></span><br><span class="line"><span class="language-css">   <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">0.2</span>)!重要;</span></span><br><span class="line"><span class="language-css">   <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>)!重要;</span></span><br><span class="line"><span class="language-css">   <span class="attribute">padding</span>: <span class="built_in">var</span>(--hope-space-<span class="number">1</span>)!重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间模式搜索主体+毛玻璃*/</span></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-iiBaxsN-css</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">10%</span>)!重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>)!重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间模式搜索栏+毛玻璃*/</span></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-kvTTWD-hYRNAb-variant-filled</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">10%</span>)!重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>)!重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"><span class="comment">/*夜间模式 搜索按钮+毛玻璃*/</span></span></span><br><span class="line"><span class="language-css"><span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-ikEIIxw-css</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">background-color</span>: <span class="built_in">rgb</span>(<span class="number">0</span> <span class="number">0</span> <span class="number">0</span> / <span class="number">10%</span>)!重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>)!重要;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">padding</span>: <span class="built_in">var</span>(--hope-space-<span class="number">1</span>)!重要;</span></span><br><span class="line"><span class="language-css">&#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--较为个性化的鼠标指针样式，可结合个人需要自行修改--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">  <span class="selector-tag">body</span> &#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">cursor</span>: <span class="built_in">url</span>(<span class="string">http://luluossfile.lulufind.com/work/teacher_u20221021b3a89013_1666841028833_10660845_file.cur</span>), default;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css">  <span class="selector-tag">select</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">cursor</span>: <span class="built_in">url</span>(<span class="string">http://luluossfile.lulufind.com/work/teacher_u2021090299b56677_1666842679271_10490748_file.cur</span>), pointer;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css">  <span class="selector-tag">button</span>,<span class="selector-tag">a</span><span class="selector-pseudo">:hover</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">cursor</span>: <span class="built_in">url</span>(<span class="string">http://luluossfile.lulufind.com/work/teacher_u20221017ac9f1124_1666842626270_11086578_file.cur</span>), pointer;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css">  <span class="selector-tag">input</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">cursor</span>:<span class="built_in">url</span>(<span class="string">http://luluossfile.lulufind.com/work/teacher_u2021090299b56677_1666842633386_14976764_file.cur</span>), text;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css">  <span class="selector-tag">textarea</span>,<span class="selector-tag">input</span><span class="selector-pseudo">:focus</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">cursor</span>:<span class="built_in">url</span>(<span class="string">http://luluossfile.lulufind.com/work/teacher_u202210176ba36766_1666842640146_15845280_file.cur</span>), text;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css">  <span class="selector-tag">code</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">cursor</span>: <span class="built_in">url</span>(<span class="string">http://luluossfile.lulufind.com/work/teacher_u20221021b3a89013_1666842646779_15864973_file.cur</span>), default;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css">  pre&gt;<span class="selector-tag">code</span>&#123;</span></span><br><span class="line"><span class="language-css">    <span class="attribute">cursor</span>: <span class="built_in">url</span>(<span class="string">http://luluossfile.lulufind.com/work/teacher_u202210176ba36766_1666842653500_10010236_file.cur</span>), default;</span></span><br><span class="line"><span class="language-css">  &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><CodePen class="h-300px" name="Margin Collapse" id="WqXGpo" user="YunYouJun" tab="html,result" />]]>
    </content>
    <id>https://kwisma.github.io/2025/03/24/alist_html_head/</id>
    <link href="https://kwisma.github.io/2025/03/24/alist_html_head/"/>
    <published>2025-03-24T11:33:39.000Z</published>
    <summary>
      <![CDATA[<p>美化 Alist 网页头部的模板，包含多个功能模块和样式配置，旨在增强页面的视觉效果和交互性</p>]]>
    </summary>
    <title>alist头部美化</title>
    <updated>2026-05-13T08:23:03.916Z</updated>
  </entry>
  <entry>
    <author>
      <name>羽希</name>
    </author>
    <category term="教程" scheme="https://kwisma.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="Alist" scheme="https://kwisma.github.io/tags/Alist/"/>
    <category term="美化" scheme="https://kwisma.github.io/tags/%E7%BE%8E%E5%8C%96/"/>
    <category term="前端" scheme="https://kwisma.github.io/tags/%E5%89%8D%E7%AB%AF/"/>
    <category term="教程" scheme="https://kwisma.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    <content>
      <![CDATA[<p>用于美化 Alist 正文的模板，包含多个功能模块和脚本，增强页面的交互性和视觉效果</p><span id="more"></span><h2 id="功能"><a href="#功能" class="headerlink" title="功能"></a>功能</h2><ol><li>延迟加载容器</li></ol><p>代码的主要内容被包裹在一个 <code>div</code> 容器中，<code>id=&quot;customize&quot;</code>，并通过 <code>style=&quot;display: none;&quot;</code> 隐藏。</p><p>延迟加载的实现通过一个定时器脚本完成，当检测到页面中存在 <code>.footer</code> 元素时，将容器显示出来。这种方式可以优化页面加载性能，确保内容在特定条件下才加载。</p><ol start="2"><li>音乐播放器</li></ol><p>使用了 <code>&lt;meting-js&gt;</code> 标签，这是一个基于 Meting 的音乐播放器组件。</p><p>它支持多种音乐平台（如网易云音乐），并通过属性配置播放器的外观和行为，例如 <code>autoplay=&quot;true&quot;</code> 表示自动播放，<code>theme=&quot;#409EFF&quot;</code> 设置播放器主题颜色。</p><ol start="3"><li>评论模块</li></ol><p>代码中集成了 Valine 评论系统，这是一个基于 LeanCloud 的无后端评论系统。</p><p>通过 <code>new Valine()</code> 初始化评论模块，配置了评论的容器（<code>el: &#39;#vcomments&#39;</code>）、访客统计（<code>visitor: true</code>）以及其他选项（如头像样式和占位符文本）。</p><p>这种设计使得用户可以在页面下方直接留言互动。</p><ol start="4"><li>名言展示</li></ol><p>代码中包含一个名为“一言”的模块，用于展示随机名言。</p><p>名言内容通过 <code>&lt;span id=&quot;hitokoto_text&quot;&gt;</code> 动态填充，并由 <a href="https://v1.hitokoto.cn/">https://v1.hitokoto.cn</a> 提供的 API 实现。</p><p>这种功能为页面增加了趣味性和文化氛围。</p><ol start="5"><li>社交链接和版权信息</li></ol><p>页面底部包含多个社交链接和版权声明：</p><p>包括 QQ 群、邮箱、博客、留言板等链接，使用了 Font Awesome 图标库来美化链接的外观。</p><p>还包含备案信息（如“冀ICP备2222000777号”）和 Alist 项目的版权声明，表明页面的合法性和出处。</p><ol start="6"><li>访问量统计</li></ol><p>代码中集成了 Busuanzi 服务，用于统计页面的访问量和访客数：</p><p><code>&lt;span id=&quot;busuanzi_value_page_pv&quot;&gt;</code> 和 <code>&lt;span id=&quot;busuanzi_value_site_uv&quot;&gt;</code> 等元素会动态显示页面访问量、站点总访问量和访客数。</p><p>这种统计方式适合轻量级的页面分析需求。</p><ol start="7"><li>渐变背景</li></ol><p>代码提供了一个可选的渐变背景效果，通过 Granim.js 实现：</p><p>渐变背景的配置包括多个颜色渐变组合（如 <code>[&#39;#a18cd1&#39;, &#39;#fbc2eb&#39;]</code>），并通过 <code>direction: &#39;left-right&#39;</code> 设置渐变方向。</p><p>这种动态背景可以提升页面的视觉吸引力。</p><ol start="8"><li>鼠标点击效果</li></ol><p>通过引入 <code>maodian.js</code>，页面实现了鼠标点击时的特效，例如显示动态的点击动画。</p><p>这种交互设计可以增加用户的操作反馈，提升用户体验。</p><h2 id="alist-正文美化代码"><a href="#alist-正文美化代码" class="headerlink" title="alist 正文美化代码"></a>alist 正文美化代码</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--延迟加载--&gt;</span></span><br><span class="line"><span class="comment">&lt;!--如果要写自定义内容建议都加到这个延迟加载的范围内--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;customize&quot;</span> <span class="attr">style</span>=<span class="string">&quot;display: none;&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="comment">&lt;!--音乐播放器--&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">meting-js</span> <span class="attr">fixed</span>=<span class="string">&quot;true&quot;</span> <span class="attr">autoplay</span>=<span class="string">&quot;true&quot;</span> <span class="attr">theme</span>=<span class="string">&quot;#409EFF&quot;</span> <span class="attr">list-folded</span>=<span class="string">&quot;true&quot;</span> <span class="attr">server</span>=<span class="string">&quot;netease&quot;</span> <span class="attr">type</span>=<span class="string">&quot;playlist&quot;</span> <span class="attr">id</span>=<span class="string">&quot;2568697963&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">meting-js</span>&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  <span class="comment">&lt;!--评论模块还有下面的script也是--&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">center</span>&gt;</span></span><br><span class="line">   <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;newValine&quot;</span> <span class="attr">id</span>=<span class="string">&quot;vcomments&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">center</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">   <span class="keyword">new</span> <span class="title class_">Valine</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">visitor</span>: <span class="literal">true</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">el</span>: <span class="string">&#x27;#vcomments&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">avatar</span>: <span class="string">&#x27;wavatar&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">appId</span>: <span class="string">&#x27;mqNCZUaZM1z4nPlpFSQBSGH7-gzGzoHsz&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">appKey</span>: <span class="string">&#x27;2umMHA8W4tTcXG2kTqroZ6xS&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="title class_">MasterKey</span>: <span class="string">&#x27;sZBKcqA9XTFpQ7QMKB16UBIY&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">placeholder</span>: <span class="string">&quot;有什么问题欢迎评论区留言~么么哒&quot;</span></span></span><br><span class="line"><span class="language-javascript">   &#125;)</span></span><br><span class="line"><span class="language-javascript">  </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">br</span>/&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">center</span> <span class="attr">class</span>=<span class="string">&quot;dibu&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot; line-height: 20px;font-size: 9pt;font-weight: bold;&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span></span><br><span class="line">                    &quot;</span><br><span class="line">                    <span class="tag">&lt;<span class="name">span</span> <span class="attr">style</span>=<span class="string">&quot;color: rgb(13, 109, 252); font-weight: bold;&quot;</span> <span class="attr">id</span>=<span class="string">&quot;hitokoto&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;#&quot;</span> <span class="attr">id</span>=<span class="string">&quot;hitokoto_text&quot;</span>&gt;</span></span><br><span class="line">                            &quot;人生最大的遗憾,就是在最无能为力的时候遇到一个想要保护一生的人.&quot;</span><br><span class="line">                        <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">span</span>&gt;</span> &quot;</span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">p</span> <span class="attr">style</span>=<span class="string">&quot;margin-left: 10rem;font-size: 8pt;&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">small</span>&gt;</span></span><br><span class="line">                        —— Anwen&#x27;s Cloud</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">small</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;font-size: 13px; font-weight: bold;&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://qm.qq.com/q/Sg5y2WlO00&quot;</span></span></span><br><span class="line"><span class="tag">                        <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fab fa-qq&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#409EFF&quot;</span> <span class="attr">aria-hidden</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                        QQ |</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;mailto:d342jxc@gmail.com&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-duotone fa-envelope-open&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#409EFF&quot;</span> <span class="attr">aria-hidden</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                        邮箱 |</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;#&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-edit&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#409EFF&quot;</span> <span class="attr">aria-hidden</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                        博客 |</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;#&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fas fa-comment-lines&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#409EFF;&quot;</span> <span class="attr">aria-hidden</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                        留言 |</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="comment">&lt;!--后台入口--&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/@manage&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-solid fa-folder-gear&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#409EFF;&quot;</span> <span class="attr">aria-hidden</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                        管理 |</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="comment">&lt;!--版权，请尊重作者--&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://github.com/Xhofe/alist&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-solid fa-copyright&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#409EFF;&quot;</span> <span class="attr">aria-hidden</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                        Alist</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--添加一个访问量--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--添加备案信息--&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://beian.miit.gov.cn/#/Integrated/index&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">i</span> <span class="attr">class</span>=<span class="string">&quot;fa-solid fa-shield-check&quot;</span> <span class="attr">style</span>=<span class="string">&quot;color:#409EFF;&quot;</span> <span class="attr">aria-hidden</span>=<span class="string">&quot;true&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;/<span class="name">i</span>&gt;</span></span><br><span class="line">                        冀ICP备2222000777号</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">center</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!--一言API--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://v1.hitokoto.cn/?encode=js&amp;select=%23hitokoto&quot;</span> <span class="attr">defer</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--延迟加载范围到这里结束--&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--延迟加载配套使用JS--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">let</span> interval = <span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;.footer&quot;</span>)) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;#customize&quot;</span>).<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="built_in">clearInterval</span>(interval);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript">    &#125;, <span class="number">200</span>);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 渐变背景初始化,如果要使用渐变背景把下面的那一行注释去掉即可--&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 下面的几行都是渐变的一套,自定义头部内还有一个关联的自定义CSS --&gt;</span></span><br><span class="line"><span class="comment">&lt;!--&lt;canvas id=&quot;canvas-basic&quot;&gt;&lt;/canvas&gt; --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://npm.elemecdn.com/granim@2.0.0/dist/granim.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"><span class="keyword">var</span> granimInstance = <span class="keyword">new</span> <span class="title class_">Granim</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">element</span>: <span class="string">&#x27;#canvas-basic&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">direction</span>: <span class="string">&#x27;left-right&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">isPausedWhenNotInView</span>: <span class="literal">true</span>,</span></span><br><span class="line"><span class="language-javascript">    states : &#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="string">&quot;default-state&quot;</span>: &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="attr">gradients</span>: [</span></span><br><span class="line"><span class="language-javascript">                [<span class="string">&#x27;#a18cd1&#x27;</span>, <span class="string">&#x27;#fbc2eb&#x27;</span>],</span></span><br><span class="line"><span class="language-javascript">                 [<span class="string">&#x27;#fff1eb&#x27;</span>, <span class="string">&#x27;#ace0f9&#x27;</span>],</span></span><br><span class="line"><span class="language-javascript">                 [<span class="string">&#x27;#d4fc79&#x27;</span>, <span class="string">&#x27;#96e6a1&#x27;</span>],</span></span><br><span class="line"><span class="language-javascript">                 [<span class="string">&#x27;#a1c4fd&#x27;</span>, <span class="string">&#x27;#c2e9fb&#x27;</span>],</span></span><br><span class="line"><span class="language-javascript">                 [<span class="string">&#x27;#a8edea&#x27;</span>, <span class="string">&#x27;#fed6e3&#x27;</span>],</span></span><br><span class="line"><span class="language-javascript">                 [<span class="string">&#x27;#9890e3&#x27;</span>, <span class="string">&#x27;#b1f4cf&#x27;</span>],</span></span><br><span class="line"><span class="language-javascript">                 [<span class="string">&#x27;#a1c4fd&#x27;</span>, <span class="string">&#x27;#c2e9fb&#x27;</span>],</span></span><br><span class="line"><span class="language-javascript">                 [<span class="string">&#x27;#fff1eb&#x27;</span>, <span class="string">&#x27;#ace0f9&#x27;</span>]</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">            ]</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript">    &#125;</span></span><br><span class="line"><span class="language-javascript">&#125;);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!--鼠标点击效果--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://jsd.onmicrosoft.cn/gh/TRHX/CDN-for-itrhx.com@3.0.8/js/maodian.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><CodePen class="h-300px" name="Margin Collapse" id="WqXGpo" user="YunYouJun" tab="html,result" />]]>
    </content>
    <id>https://kwisma.github.io/2025/03/24/alist_html_body/</id>
    <link href="https://kwisma.github.io/2025/03/24/alist_html_body/"/>
    <published>2025-03-24T11:33:33.000Z</published>
    <summary>
      <![CDATA[<p>用于美化 Alist 正文的模板，包含多个功能模块和脚本，增强页面的交互性和视觉效果</p>]]>
    </summary>
    <title>alist自定义美化</title>
    <updated>2026-05-13T08:23:03.908Z</updated>
  </entry>
</feed>
