<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title>蛋蛋之家</title><link>https://wuqishi.com</link><atom:link href="https://wuqishi.com/rss.xml" rel="self" type="application/rss+xml"/><description>一枚蛋蛋的自留地</description><generator>Halo v2.24.2</generator><language>zh-cn</language><image><url>https://wuqishi.com/dan.svg</url><title>蛋蛋之家</title><link>https://wuqishi.com</link></image><lastBuildDate>Wed, 27 May 2026 15:20:50 GMT</lastBuildDate><item><title><![CDATA[Halo 博客晚间卡顿排查记：从"玄学卡顿"到"真凶落网"]]></title><link>https://wuqishi.com/archives/halo-blog-evening-lag-investigation</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Halo%20%E5%8D%9A%E5%AE%A2%E6%99%9A%E9%97%B4%E5%8D%A1%E9%A1%BF%E6%8E%92%E6%9F%A5%E8%AE%B0%EF%BC%9A%E4%BB%8E%22%E7%8E%84%E5%AD%A6%E5%8D%A1%E9%A1%BF%22%E5%88%B0%22%E7%9C%9F%E5%87%B6%E8%90%BD%E7%BD%91%22&amp;url=/archives/halo-blog-evening-lag-investigation" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p style="">服务器：Oracle Cloud ARM | 应用：Halo 2.x + PostgreSQL 15 + Nginx | 记录时间：2026.05.21–22</p>
</blockquote>
<hr>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FmnFlYsbwPLM.avif&amp;size=m" alt="挺玄学的头图，阴间版" width="1632px">
 <figcaption data-placeholder="添加描述" style="width: 1632px; max-width: 100%; text-align: center;">挺玄学的头图，阴间版</figcaption>
</figure>
<h2 style="" id="%E4%B8%80%E3%80%81%E9%97%AE%E9%A2%98%E7%9A%84%E8%AF%A1%E5%BC%82%E4%B9%8B%E5%A4%84">一、问题的诡异之处</h2>
<p style="">我的博客（wuqishi.com）有个很邪门的毛病：<strong>每天晚上 20:00 到 23:00 准时卡，但同服务器上的其他网站屁事没有</strong>。</p>
<p style="">服务器是 Oracle Cloud 的 ARM 实例，4 核 24G 内存，跑 Docker Compose。上面除了 Halo，还有几个 Typecho 站点和纯静态页面。白天所有站点都飞快，唯独 Halo 一到晚上就跟中了邪似的——页面加载转圈、后台进不去、偶尔直接报错 <code>ERR_CONNECTION_CLOSED</code>​。</p>
<p style="">更离谱的是，<strong>不是一直卡，是断断续续的卡。</strong>有时候能打开，点两下又卡死；有时候彻底连不上，过几分钟又好了。这种"薛定谔的卡顿"最让人头疼，因为你根本抓不到规律。</p>
<p style="">一开始我怀疑是 Halo 2.x 基于 Java（Spring Boot）的锅，毕竟 Java 吃内存是出了名的，而 Typecho 是 PHP，随用随释放。但看了眼 Docker 配置，JVM 堆内存已经给了 5G，G1 垃圾回收器也开了，理论上不应该啊。</p>
<p style=""><strong>💡 Tip 1：遇到"选择性卡顿"，先别急着调代码或加配置。</strong></p>
<p style="">第一步永远是<strong>确认问题范围</strong>。同服务器其他站点正常 → 排除全局资源问题；只有某个应用卡 → 问题大概率在这个应用自身、它的数据库、或者这个域名独享的流量上。</p>
<hr>
<h2 style="" id="%E4%BA%8C%E3%80%81%E6%8E%92%E6%9F%A5%E7%9A%84%E7%AC%AC%E4%B8%80%E6%AD%A5%EF%BC%9A%E7%BF%BB%E6%97%A5%E5%BF%97%EF%BC%8C%E9%80%90%E5%B1%82%E5%BE%80%E4%B8%8B%E6%8C%96">二、排查的第一步：翻日志，逐层往下挖</h2>
<h3 style="" id="2.1-nginx-error.log-%E7%9A%84%E5%BC%82%E5%B8%B8">2.1 Nginx error.log 的异常</h3>
<p style="">先看 Nginx 的 <code>error.log</code>​，发现大量这种报错：</p>
<pre><code class="language-nginx">2026/05/21 22:14:57 [error] 1234#1234: *45678 recv() failed (104: Connection reset by peer)
2026/05/21 22:14:57 [error] 1234#1234: *45678 upstream prematurely closed connection</code></pre>
<p style="">而且全部指向同一个路径：</p>
<pre><code>/apis/online-user.zyx2012.cn/v1alpha1/online-ws</code></pre>
<p style="">这是我在 Halo 里装的一个"在线人数统计"插件。看起来 Nginx 把请求转发给 Halo 后，Halo 还没返回响应头就直接把连接掐断了。更可怕的是，这些报错是<strong>刷屏级别</strong>的，一秒钟能蹦出来十几条。</p>
<h3 style="" id="2.2-dmesg-%E9%87%8C%E7%9A%84%E4%B8%A4%E4%B8%AA%E5%85%B3%E9%94%AE%E7%BA%BF%E7%B4%A2">2.2 dmesg 里的两个关键线索</h3>
<p style="">同时我看了 <code>dmesg</code>​，发现两个现象：</p>
<p style=""><strong>第一，Docker 容器在频繁重启。</strong></p>
<pre><code>vetha1b2c3d4: entered disabled state
vetha1b2c3d4: left promiscuous mode
docker0: port 2(vetha1b2c3d4) entered disabled state</code></pre>
<p style="">虚拟网卡在不断销毁重建。这意味着 Halo 容器在崩溃 → 被 Docker 自动拉起 → 又崩溃的循环里。</p>
<p style=""><strong>第二，UFW 防火墙在疯狂拦截扫描。</strong></p>
<pre><code>[UFW BLOCK] IN=eth0 OUT= MAC=... SRC=185.191.171.12 DST=... DPT=5432
[UFW BLOCK] IN=eth0 OUT= MAC=... SRC=194.165.16.73 DST=... DPT=5432
</code></pre>
<p style="">满屏的 <code>[UFW BLOCK]​</code>，各种境外 IP 在扫我的端口：5432（PostgreSQL）、5985（WinRM）、3389（远程桌面）……</p>
<p style="">等等，<strong>5432？我的数据库端口怎么暴露在外网了</strong>？</p>
<p style=""><strong>💡 Tip 2：dmesg​ 是排查系统级问题的利器。</strong></p>
<p style="">很多人只看应用日志，忽略了内核日志。Docker 容器频繁重启、网卡状态变化、OOM killer 杀进程，这些在 <code>dmesg​</code> 里一目了然。建议用 <code>dmesg -T | grep -E "(UFW|veth|docker0)"​</code> 快速过滤关键信息。</p>
<hr>
<h2 style="" id="%E4%B8%89%E3%80%81%E7%9C%9F%E5%87%B6%E4%B8%80%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A3%B8%E5%A5%94%E5%9C%A8%E5%85%AC%E7%BD%91%E4%B8%8A">三、真凶一：数据库裸奔在公网上</h2>
<p style="">我打开 <code>docker-compose.yml</code>​ 一看，傻眼了：</p>
<pre><code class="language-yaml">services:
  halodb:
    image: postgres:15-alpine
    ports:
      - "5432:5432"</code></pre>
<p style="">当时为了方便用 DBeaver 连数据库，直接映射到了宿主机。但我忘了 Linux 上一个巨坑：<strong>Docker 会绕过 UFW 防火墙</strong>。</p>
<h3 style="" id="3.1-docker-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%83%BD%E7%BB%95%E8%BF%87-ufw%EF%BC%9F">3.1 Docker 为什么能绕过 UFW？</h3>
<p style="">这里有个很多人不知道的细节：</p>
<p style="">UFW 本质上是对 <code>iptables</code>​ 的封装，它在 <code>INPUT</code>​ 链里插入规则。但 Docker 在启动容器时，会在 <code>iptables​</code> 的 <code>DOCKER</code>​ 链（属于 <code>nat</code>​ 表和 <code>filter</code>​ 表）里插入自己的规则，<strong>优先级高于 UFW 的 </strong><code>INPUT</code><strong>​ 链</strong>。</p>
<p style="">具体来说，Docker 会创建这样的 DNAT 规则：</p>
<pre><code class="language-bash">sudo iptables -t nat -L DOCKER -n --line-numbers | grep 5432</code></pre>
<p style="">输出：</p>
<pre><code>DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:5432 to:172.18.0.2:5432</code></pre>
<p style="">这条规则的意思是：所有访问宿主机 5432 端口的流量，都会被 DNAT 到 Docker 容器内部的 172.18.0.2:5432。<strong>它发生在 UFW 的过滤规则之前</strong>，所以 UFW 根本拦不住。</p>
<h3 style="" id="3.2-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%97%A5%E5%BF%97%E9%87%8C%E7%9A%84%E6%9A%B4%E5%8A%9B%E7%A0%B4%E8%A7%A3">3.2 数据库日志里的暴力破解</h3>
<p style="">看数据库日志更触目惊心：</p>
<pre><code>2026-05-21 22:14:57.123 UTC [12345] FATAL: password authentication failed for user "postgres"
2026-05-21 22:14:57.123 UTC [12345] DETAIL: Role "postgres" does not exist.
2026-05-21 22:14:57.456 UTC [12346] FATAL: password authentication failed for user "postgres"
2026-05-21 22:14:57.789 UTC [12347] FATAL: password authentication failed for user "postgres"</code></pre>
<p style="">黑客在用默认用户名 <code>postgres</code>​ 暴力破解我的数据库。因为我在 Docker Compose 里把数据库用户名改成了其他​，系统压根没有 <code>postgres</code>​ 这个用户，所以每次破解都是 <code>FATAL</code>​ 级别报错。</p>
<p style=""><strong>为什么晚上特别卡？</strong></p>
<p style="">因为晚间是全球扫描器的高峰期（对应欧美白天工作时间），每秒几十次恶意连接。PostgreSQL 的默认配置下，每次连接都要：</p>
<ol>
 <li>
  <p style="">Fork 一个后端进程（约 5-10MB 内存）</p>
 </li>
 <li>
  <p style="">进行 SSL 握手和认证计算</p>
 </li>
 <li>
  <p style="">查询系统表验证用户名</p>
 </li>
 <li>
  <p style="">失败后记录 FATAL 日志</p>
 </li>
</ol>
<p style="">这些垃圾请求把 CPU 和 I/O 占满了。我的 Halo 博客想查数据库？排队去吧。</p>
<h3 style="" id="3.3-%E4%BF%AE%E5%A4%8D%E6%96%B9%E6%A1%88">3.3 修复方案</h3>
<p style="">把端口绑定到本地回环：</p>
<pre><code class="language-yaml">services:
  halodb:
    image: postgres:15-alpine
    ports:
      - "127.0.0.1:5432:5432"
    environment:
      - POSTGRES_USER=halo
      - POSTGRES_PASSWORD=your_strong_password
      - POSTGRES_DB=halo</code></pre>
<p style="">改完重启，数据库日志瞬间清净，FATAL 报错彻底消失。</p>
<p style=""><strong>💡 Tip 3：所有敏感服务的 Docker 端口映射，永远写成 </strong><code>127.0.0.1:PORT:PORT</code><strong>​。</strong></p>
<p style="">不要偷懒只写 <code>PORT:PORT</code>​，那等于裸奔在公网上。UFW 在 Docker 面前就是纸老虎。如果你确实需要从外网连数据库，用 SSH 隧道或 WireGuard，而不是直接暴露端口。</p>
<hr>
<h2 style="" id="%E5%9B%9B%E3%80%81%E7%9C%9F%E5%87%B6%E4%BA%8C%EF%BC%9Anginx-%E5%8F%8D%E4%BB%A3%E6%B2%A1%E5%BC%80%E9%95%BF%E8%BF%9E%E6%8E%A5">四、真凶二：Nginx 反代没开长连接</h2>
<p style="">数据库安静了，但网站还是偶尔卡顿。继续看日志，发现 Nginx 的 <code>access.log</code>​ 里有个规律：每次页面加载，除了主请求，还有一堆 <code>/apis/...​ </code>的 API 请求。这些请求全部走的是：</p>
<pre><code class="language-nginx">proxy_pass http://127.0.0.1:8090;</code></pre>
<p style="">也就是直连 Halo，没有走 upstream。</p>
<p style="">问题出在这里：<strong>我没配 </strong><code>upstream keepalive</code><strong>​</strong>。</p>
<h3 style="" id="4.1-%E4%B8%BA%E4%BB%80%E4%B9%88%E7%9F%AD%E8%BF%9E%E6%8E%A5%E4%BC%9A%E6%8B%96%E5%9E%AE%E4%BD%A0%EF%BC%9F">4.1 为什么短连接会拖垮你？</h3>
<p style="">Nginx 每次反向代理都新建一个 TCP 连接，用完就扔。晚上并发一高，系统里堆积成千上万个 <code>TIME_WAIT</code>​ 状态的连接。</p>
<p style="">你可以用 <code>ss</code>​ 命令验证：</p>
<pre><code class="language-bash">ss -tan state time-wait | wc -l</code></pre>
<p style="">我当时高峰期这个数字飙到了 <strong>8000+</strong>。</p>
<p style="">​TIME_WAIT​ 是 TCP 四次挥手的正常状态（主动关闭方等待 2MSL，确保最后的 ACK 被对方收到），但数量太多会：</p>
<ul>
 <li>
  <p style=""><strong>耗尽临时端口</strong>：Linux 默认临时端口范围是 32768–60999，约 28000 个。8000+ TIME_WAIT 意味着可用端口骤减，新的请求连不上，表现为"转圈"、"白屏"。</p>
 </li>
 <li>
  <p style=""><strong>占用内存</strong>：每个 <code>TIME_WAIT</code>​ 连接在内核里占用约 1–2KB 的 TCP 控制块，积少成多。</p>
 </li>
</ul>
<h3 style="" id="4.2-%E4%BF%AE%E5%A4%8D%E6%96%B9%E6%A1%88">4.2 修复方案</h3>
<p style="">在 Nginx 配置顶部定义 upstream：</p>
<pre><code class="language-nginx">upstream halo_backend {
    server 127.0.0.1:8090;
    keepalive 64;
}</code></pre>
<p style="">然后把所有 <code>proxy_pass http://127.0.0.1:8090</code>​ 改成 <code>proxy_pass http://halo_backend</code>​，并在对应的 location 里加上：</p>
<pre><code class="language-nginx">proxy_http_version 1.1;
proxy_set_header Connection "";</code></pre>
<p style="">这样 Nginx 和 Halo 之间保持 64 个长连接复用，再也不用频繁三次握手了。</p>
<p style="">注意两个细节：</p>
<ol>
 <li>
  <p style="">​<code>proxy_http_version 1.1</code>​ 是必须的，因为 HTTP/1.0 默认不支持 keepalive。</p>
 </li>
 <li>
  <p style="">​<code>proxy_set_header Connection ""​</code> 是为了防止 Nginx 把客户端的 <code>Connection: close</code>​ 透传给后端，导致后端主动断开长连接。</p>
 </li>
</ol>
<p style="">改完后可以立刻用 <code>ss</code>​ 验证：</p>
<pre><code class="language-bash">ss -tan state established '( dport = :8090 or sport = :8090 )' | wc -l</code></pre>
<p style="">连接数从之前的几百个飙升到稳定的 64 个左右，而且不再增长。TIME_WAIT​ 数量也降到了正常水平（几十到一百个）。</p>
<p style=""><strong>💡 Tip 4：用 </strong><code>ss</code><strong>​ 替代 </strong><code>netstat</code><strong>​，它更快更准。</strong></p>
<p style="">查看某个端口的连接状态分布：</p>
<pre><code class="language-bash">ss -tan state time-wait '( dport = :8090 )' | wc -l
ss -tan state established '( dport = :8090 )' | wc -l</code></pre>
<p style="">如果 <code>TIME_WAIT</code>​ 超过 5000，就要警惕了。</p>
<hr>
<h2 style="" id="%E4%BA%94%E3%80%81%E7%9C%9F%E5%87%B6%E4%B8%89%EF%BC%9Awebsocket-%E6%8F%92%E4%BB%B6%E7%9A%84%E9%87%8D%E8%BF%9E%E9%A3%8E%E6%9A%B4">五、真凶三：WebSocket 插件的重连风暴</h2>
<p style="">现在说回那个"在线人数统计"插件。它的原理是前端通过 WebSocket 长连接实时上报在线状态。</p>
<h3 style="" id="5.1-websocket-%E6%8F%A1%E6%89%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E5%A4%B1%E8%B4%A5%EF%BC%9F">5.1 WebSocket 握手为什么失败？</h3>
<p style="">WebSocket 不是普通的 HTTP 请求。它的建立过程是这样的：</p>
<ol>
 <li>
  <p style="">客户端发送一个带 <code>Upgrade: websocket​</code> 和 <code>Connection: Upgrade</code>​ 头的 HTTP 请求</p>
 </li>
 <li>
  <p style="">服务器返回 <code>101 Switching Protocols​</code>，之后连接从 HTTP 升级为 WebSocket 全双工通道</p>
 </li>
 <li>
  <p style="">后续数据通过帧（frame）传输，不再走 HTTP 请求/响应模型</p>
 </li>
</ol>
<p style="">问题出在第 2 步：<strong>我的 Nginx 没正确转发 </strong><code>Upgrade</code><strong>​ 头</strong>。</p>
<p style="">Nginx 默认会把 <code>Upgrade</code>​ 这类非标准头过滤掉（或者当成普通 HTTP 请求处理），导致后端 Halo 收到的是一个普通的 GET 请求，而不是 WebSocket 握手请求。后端以为这只是一个普通的 API 调用，处理完就关闭了连接。</p>
<p style="">但前端 JS 检测到 WebSocket 断开，会<strong>自动重连</strong>，于是形成了<strong>"连接 → 断开 → 重连"的死循环</strong>。</p>
<h3 style="" id="5.2-%E6%97%A5%E5%BF%97%E9%87%8C%E7%9A%84%E5%A5%97%E5%A8%83%E7%8E%B0%E5%9C%BA">5.2 日志里的套娃现场</h3>
<p style="">从 <code>access.log​</code> 里能清楚看到这个套娃过程：</p>
<pre><code>22:14:57 "GET /apis/online-user.../online-ws HTTP/1.1" 101 197
22:14:59 "GET /apis/online-user.../online-ws HTTP/1.1" 101 169  ← 同一个 IP，2 秒后重连
22:16:04 "GET /apis/online-user.../online-ws HTTP/1.1" 101 0    ← 传输 0 字节，空连接
22:16:48 "GET /apis/online-user.../online-ws HTTP/1.1" 101 143
22:16:56 "GET /apis/online-user.../online-ws HTTP/1.1" 101 143  ← 8 秒后又重连</code></pre>
<p style="">一个访客就能在短时间内发起 3–4 次 WebSocket 握手。晚上如果有几十个访客，加上各种爬虫，Halo 的线程池被这些无效握手占满，正常的页面请求只能排队，等到超时。</p>
<p style="">Nginx <code>error.log​</code> 里的 <code>Connection reset by peer</code>​ 和 <code>prematurely closed connection</code>​ 就是这么来的——Halo 被压垮了，直接粗暴地关闭连接自保。</p>
<h3 style="" id="5.3-%E4%BF%AE%E5%A4%8D%E6%96%B9%E6%A1%88">5.3 修复方案</h3>
<p style="">我没有卸载这个插件，因为上面加了长链接后目前暂时没问题，这里做记录：可以在 Nginx 里正确支持 WebSocket。在对应的 location 里加上：</p>
<pre><code class="language-nginx">location /apis/online-user.zyx2012.cn/ {
    proxy_pass http://halo_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}</code></pre>
<p style="">验证：</p>
<pre><code class="language-bash">curl -i -N   -H "Connection: Upgrade"   -H "Upgrade: websocket"   -H "Host: wuqishi.com"   -H "Origin: https://wuqishi.com"   https://wuqishi.com/apis/online-user.zyx2012.cn/v1alpha1/online-ws</code></pre>
<p style="">返回：</p>
<pre><code>HTTP/2 101 Switching Protocols
upgrade: websocket
connection: upgrade
</code></pre>
<p style="">​<code>101 Switching Protocols</code>​ 就说明握手成功，长连接已建立。浏览器 F12 的 Network 面板里也能看到 WebSocket 连接状态从 <code>(pending)</code>​ 变成 <code>101</code>​，之后变成绿色小圆点，不再频繁断开重连。</p>
<p style="">目前现在这个插件运行得很稳定，在线人数统计功能完全 正常，没有再出现之前的重连风暴。</p>
<p style=""><strong>💡 Tip 5：排查 WebSocket 问题时，不要只看浏览器控制台的报错。</strong></p>
<p style="">用 curl​ 直接模拟握手请求是最快的方式。如果返回 <code>200 OK​</code> 而不是 <code>101</code>​，说明 Nginx 或后端没正确处理 <code>Upgrade</code>​ 头。另外注意，HTTP/2 对 WebSocket 的支持比较特殊，Nginx 从 1.25.1 开始才支持 HTTP/2 下的 WebSocket，如果你的 Nginx 版本较老，建议用 HTTP/1.1 测试。</p>
<hr>
<h2 style="" id="%E5%85%AD%E3%80%81%E7%AC%AC%E5%9B%9B%E4%B8%AA%E9%9A%90%E6%82%A3%EF%BC%9A%E6%81%B6%E6%84%8F%E7%88%AC%E8%99%AB%E7%9A%84%E9%AA%9A%E6%89%B0">六、第四个隐患：恶意爬虫的骚扰</h2>
<p style="">排查过程中，Nginx <code>access.log</code>​ 里还有一类请求让我哭笑不得：</p>
<pre><code>185.191.171.12 "GET /wp-content/themes/begin/inc/go.php?url=..." 404
85.208.96.196 "GET /wp-content/themes/begin/inc/go.php?url=..." 404</code></pre>
<p style="">SemrushBot（一个臭名昭著的 SEO 爬虫）在疯狂请求我网站上<code>根本不存在的 WordPress 路径</code>，我早转<code>Typecho</code>了，现在转到<code>Halo</code>了。它以为我还是是 WordPress 站点，在探测 Begin 主题的重定向漏洞（历史漏洞），想拿我的服务器当跳板做黑帽 SEO。</p>
<p style="">这些请求全部返回 404，但问题是：<strong>它们都进了 Halo 后端</strong>。</p>
<p style="">Nginx 匹配不到物理文件，就丢给 <code>@halo_proxy​</code>，Halo 不得不为每个 404 请求初始化一次完整的页面渲染，吐出 404 页面。一秒钟十几条，线程池又被浪费了。</p>
<h3 style="" id="6.1-%E5%A4%84%E7%90%86%E6%96%B9%E6%A1%88">6.1 处理方案</h3>
<p style="">我没有在 Nginx 层面拦截这些爬虫，而是选择在 Cloudflare 处理。Cloudflare 的防火墙规则可以基于 User-Agent 直接拦截 SemrushBot、DotBot 等垃圾爬虫，不需要消耗我服务器的任何资源。</p>
<p style="">这样做的好处是：</p>
<ul>
 <li>
  <p style="">垃圾流量在边缘节点就被挡掉了，根本到不了我的服务器</p>
 </li>
 <li>
  <p style="">不需要维护 Nginx 里的爬虫黑名单，Cloudflare 的威胁情报库会自动更新</p>
 </li>
 <li>
  <p style="">不会污染我的 Nginx 日志，access.log 里只保留真实访客</p>
 </li>
</ul>
<p style="">💡 Tip 6：如果用了 Cloudflare，优先在边缘节点拦截垃圾流量。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FS3gpUxuNaGbzK.avif&amp;size=m" alt="Cloudflare端自定义规则" title="Cloudflare端自定义规则">
 <figcaption data-placeholder="添加描述">Cloudflare端自定义规则</figcaption>
</figure>
<p style=""><strong>表达式代码：</strong></p>
<pre><code class="language-javascript">(http.request.uri.path contains "/.env") or 
(http.request.uri.path contains "/.git") or 
(http.request.uri.path contains "/wp-") or 
(http.request.uri.path contains "/xmlrpc.php")</code></pre>
<p style="">Cloudflare 的防火墙规则、Bot Fight Mode、User-Agent 拦截，都比在源站 Nginx 处理更高效。源站的资源应该留给真实用户，而不是浪费在响应爬虫上。如果你的站不是 WordPress，可以直接在 Cloudflare 里拦截所有包含 <code>wp-content</code>​、<code>wp-admin</code>​ 的请求，连 404 都不用返回。</p>
<hr>
<h2 style="" id="%E4%B8%83%E3%80%81%E5%85%B6%E4%BB%96%E6%9D%82%E9%A1%B9%E4%B8%8E%E5%BE%85%E5%8A%9E">七、其他杂项与待办</h2>
<h3 style="" id="7.1-rss-%E8%AE%A2%E9%98%85%E7%9A%84%E6%85%A2%E6%9F%A5%E8%AF%A2">7.1 RSS 订阅的慢查询</h3>
<p style="">​/rss.xml​ 每次被请求都要动态生成 115KB 的 XML，而且多个 RSS 聚合器（FreshRSS、Inoreader、AstraHub 等）每隔几分钟就来抓一次。目前暂时没做静态缓存，先放着。</p>
<p style=""><strong>💡 Tip 7：RSS 聚合器的抓取间隔各不相同。</strong></p>
<p style="">有的 5 分钟一次，有的 30 分钟一次。你可以通过 <code>access.log</code>​ 分析 User-Agent，找出最频繁的聚合器，针对性地设置缓存时间。另外，Halo 的 RSS 生成是全量文章列表，如果文章很多（几百篇），每次生成都是 O(n) 的遍历，非常耗 CPU。建议考虑分页 RSS 或限制输出数量。</p>
<h3 style="" id="7.2-%E7%BC%A9%E7%95%A5%E5%9B%BE%E4%BB%A3%E7%90%86%E7%9A%84-302-%E9%A3%8E%E6%9A%B4">7.2 缩略图代理的 302 风暴</h3>
<p style="">日志里发现大量这种请求：</p>
<pre><code>GET /apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https://cdn.ssslove.com/...&amp;size=m HTTP/2.0" 302 0</code></pre>
<p style="">Halo 的缩略图服务对外链图片做了一次 302 重定向。如果页面里图片多，这一来一回多了很多无谓的请求。后续考虑直接把图片链接换成 CDN 加参数的直链，跳过 Halo 的代理层。</p>
<p style=""><strong>💡 Tip 8：Halo 的缩略图代理适合处理本地上传的图片。</strong></p>
<p style="">如果是外链图片（比如又拍云、OSS），建议直接在前端用 CDN 的缩略图参数（如 <code>!m</code>​ 或 <code>?x-oss-process=image/resize​</code>），跳过 Halo 的代理层，减少一次 302 跳转。</p>
<h3 style="" id="7.3-halo_external_url-%E7%9A%84%E5%9D%91">7.3 HALO_EXTERNAL_URL 的坑</h3>
<p style="">Docker Compose 里 HALO_EXTERNAL_URL​ 配成了 http://localhost:8090/​，这会导致某些插件在生成回调地址、RSS 链接时用到错误的域名。</p>
<p style="">应该改成真实域名：</p>
<pre><code class="language-yaml">environment:
  - HALO_EXTERNAL_URL=https://wuqishi.com/</code></pre>
<p style=""><strong>💡 Tip 9：HALO_EXTERNAL_URL​ 影响的不只是页面链接。</strong></p>
<p style="">它还会影响：</p>
<ul>
 <li>
  <p style="">Open Graph 标签（分享到微信、Twitter 时的预览卡片）</p>
 </li>
 <li>
  <p style="">RSS 里的 &lt;link&gt;​ 和 [atom:link](atom:link)​ 元素</p>
 </li>
 <li>
  <p style="">某些插件的 OAuth 回调地址</p>
 </li>
 <li>
  <p style="">邮件通知里的链接</p>
 </li>
</ul>
<p style="">配错了会导致分享出去的文章链接是 http://localhost:8090/...​，别人根本打不开。<strong>目前我暂未修改。</strong></p>
<hr>
<h2 style="" id="%E5%85%AB%E3%80%81%E6%8E%92%E6%9F%A5%E6%80%9D%E8%B7%AF%E6%80%BB%E7%BB%93%EF%BC%9A%E6%88%91%E7%9A%84%E4%B8%80%E5%A5%97%E6%96%B9%E6%B3%95%E8%AE%BA">八、排查思路总结：我的一套方法论</h2>
<p style="">这次排查我走了一些弯路，但也验证了一套有效的方法论：</p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 1002px">
  <colgroup>
   <col style="width: 208px">
   <col style="width: 181px">
   <col style="width: 255px">
   <col style="width: 358px">
  </colgroup>
  <tbody>
   <tr style="height: 60px;">
    <th colspan="1" rowspan="1" colwidth="208">
     <p style="">排查顺序</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="181">
     <p style="">做了什么</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="255">
     <p style="">发现了什么</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="358">
     <p style="">关键命令/工具</p>
    </th>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">1. 确认范围</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">对比同服务器其他站点</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">只有 Halo 卡，排除全局资源问题</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style="">​<code>htop</code>​, <code>free -h</code>​, <code>df -h</code>​</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">2. 看 Nginx error.log</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">定位前后端断开原因</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">大量 <code>Connection reset by peer​</code></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style=""><code>​tail -f /var/log/nginx/error.log</code>​</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">3. 看 dmesg</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">检查系统级异常</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">Docker 频繁重启 + UFW 大量拦截</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style=""><code>​dmesg -T | grep -E "(UFW|veth|docker0)"​</code></p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">4. 看数据库日志</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">检查 DB 压力</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">公网暴力破解，FATAL 刷屏</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style=""><code>​docker logs halodb​</code></p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">5. 看 Nginx access.log</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">分析请求分布</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">恶意爬虫 + WebSocket 高频重连</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style="">​<code>awk '{print $6, $7}' access.log | sort | uniq -c | sort -rn​</code></p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">6. 浏览器 F12</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">区分前端/后端慢</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">TTFB 高，确认后端响应慢</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style="">Chrome DevTools → Network → Timing</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">7. 检查连接状态</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">确认 TCP 资源耗尽</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">TIME_WAIT 8000+</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style=""><code>​ss -tan state time-wait | wc -l​</code></p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="208">
     <p style="">8. 模拟 WebSocket 握手</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="181">
     <p style="">验证 Upgrade 头转发</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="255">
     <p style="">返回 200 而非 101</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="358">
     <p style="">​<code>curl -H "Upgrade: websocket" ...​</code></p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<p style=""><strong>核心原则：由外到内，先拦垃圾流量，再修内部配置。</strong></p>
<p style="">如果一开始就去调 JVM 参数、加数据库索引，可能永远找不到真凶。因为根子不在性能不足，而在<strong>资源被垃圾请求白白浪费</strong>。</p>
<hr>
<h2 style="" id="%E4%B9%9D%E3%80%81%E7%8E%B0%E5%9C%A8%E7%9A%84%E7%8A%B6%E6%80%81">九、现在的状态</h2>
<p style="">改完配置、重启服务后，到今天盯着日志看了半小时：</p>
<ul>
 <li>
  <p style=""><strong>数据库日志</strong>：一片安静，偶尔正常的查询交互</p>
 </li>
 <li>
  <p style=""><strong>Nginx error.log</strong>：零报错</p>
 </li>
 <li>
  <p style=""><strong>Nginx access.log</strong>：清净了很多，Cloudflare 已经挡掉了大部分垃圾爬虫</p>
 </li>
 <li>
  <p style=""><strong>WebSocket 插件</strong>：握手返回 <code>101 Switching Protocols</code>​，长连接稳定，不再频繁重连，在线人数统计功能正常工作</p>
 </li>
 <li>
  <p style=""><strong>页面加载</strong>：iPad、Mac、手机 4G 测试，正常打开。</p>
 </li>
</ul>
<p style="">晚上 22:30 到 23:00 这段原本最卡的时间，现在流畅得跟白天一样。（<strong>今晚继续再看看</strong>）</p>
<hr>
<h2 style="" id="%E5%8D%81%E3%80%81%E5%8F%8D%E6%80%9D%EF%BC%9A%E5%85%AD%E4%B8%AA%E5%AE%B9%E6%98%93%E8%A2%AB%E5%BF%BD%E8%A7%86%E7%9A%84%E5%9D%91">十、反思：六个容易被忽视的坑</h2>
<h3 style="" id="%E5%9D%91-1%EF%BC%9Adocker-%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84%E9%BB%98%E8%AE%A4%E6%9A%B4%E9%9C%B2%E5%85%AC%E7%BD%91%EF%BC%8Cufw-%E6%8B%A6%E4%B8%8D%E4%BD%8F">坑 1：Docker 端口映射默认暴露公网，UFW 拦不住</h3>
<p style="">数据库、Redis、MQ 这类敏感服务一定要绑 <code>127.0.0.1</code>​。别信 UFW，信 <code>iptables -t nat -L DOCKER</code>​。</p>
<h3 style="" id="%E5%9D%91-2%EF%BC%9Anginx-%E5%8F%8D%E4%BB%A3%E7%90%86%E9%BB%98%E8%AE%A4%E6%98%AF%E7%9F%AD%E8%BF%9E%E6%8E%A5">坑 2：Nginx 反代理默认是短连接</h3>
<p style="">高并发场景必须开 <code>keepalive</code>​，否则 <code>TIME_WAIT</code>​ 会拖垮你。<code>ss -tan state time-wait | wc -l​</code> 超过 5000 就要警惕了。</p>
<h3 style="" id="%E5%9D%91-3%EF%BC%9Awebsocket-%E4%B8%8D%E6%98%AF%22%E9%85%8D%E4%BA%86%E5%B0%B1%E8%A1%8C%22">坑 3：WebSocket 不是"配了就行"</h3>
<p style="">​<code>Upgrade​</code> 和 <code>Connection</code>​ 头缺一不可。可以用 <code>curl​</code> 模拟握手快速验证，返回 <code>101</code>​ 才算成功。另外注意 Nginx 版本，HTTP/2 下的 WebSocket 需要 <strong>Nginx ≥ 1.25.1</strong>。</p>
<h3 style="" id="%E5%9D%91-4%EF%BC%9A%E7%AC%AC%E4%B8%89%E6%96%B9%E6%8F%92%E4%BB%B6%E8%A6%81%E5%AE%A1%E6%85%8E%EF%BC%8C%E4%BD%86%E4%B9%9F%E4%B8%8D%E5%BF%85%E4%B8%80%E5%88%80%E5%88%87">坑 4：第三方插件要审慎，但也不必一刀切</h3>
<p style="">这次在线人数插件的问题根源不在插件本身，而在 Nginx 配置缺失。修复后插件运行得很稳定，功能完全正常。所以遇到插件相关的问题，先排查基础设施（Nginx、反向代理、防火墙），不要急着卸载。</p>
<h3 style="" id="%E5%9D%91-5%EF%BC%9A%E6%97%A5%E5%BF%97%E6%98%AF%E6%9C%80%E5%A5%BD%E7%9A%84-debugger">坑 5：日志是最好的 debugger</h3>
<p style="">这次排查全程没改一行 Java 代码，所有问题都是从日志里抠出来的。养成看日志的习惯，比盲目调参重要得多。</p>
<p style="">建议给 Nginx 日志加上这两个字段，一眼就能看出是前端慢还是后端慢：</p>
<pre><code class="language-nginx">log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" '
                'rt=$request_time urt=$upstream_response_time';</code></pre>
<ul>
 <li>
  <p style=""><code>​rt</code>​（request_time）：客户端视角的总耗时</p>
 </li>
 <li>
  <p style=""><code>​urt​</code>（upstream_response_time）：后端处理耗时</p>
 </li>
</ul>
<p style="">如果 <code>rt</code>​ 很大但 <code>urt</code>​ 很小 → 问题在网络或 Nginx；如果 <code>urt</code>​ 很大 → 问题在后端。</p>
<h3 style="" id="%E5%9D%91-6%EF%BC%9A%E4%B8%8D%E8%A6%81%E5%BF%BD%E8%A7%86%E7%88%AC%E8%99%AB%E7%9A%84%E5%BD%B1%E5%93%8D">坑 6：不要忽视爬虫的影响</h3>
<p style="">SemrushBot、DotBot 这些商业爬虫非常 aggressive，它们不会遵守你的 <code>robots.txt</code>​，而且专门挑 WordPress 漏洞路径扫。如果你的站不是 WP，在 Cloudflare 或 Nginx 层直接拦截，别浪费后端资源。</p>
<hr>
<p style="">如果你也在用 Halo 或者类似的 Java 博客系统遇到晚间卡顿，希望这篇记录能给你一些排查思路。有时候问题不在代码多复杂，而在某个配置细节、某个插件、或者某个暴露在公网上的端口。</p>
<blockquote>
 <p style="">最后吐槽一句：SemrushBot 是真的执着，从 21:00 到 23:00 不间断地扫了整整两个小时，被 Cloudflare 挡了上百次还在试。这种敬业精神，用在正道上早成架构师了。</p>
</blockquote>
<hr>
<p style=""><span style="color: #9ca3af"><em>写于 2026 年 5 月 22 日凌晨，部分内容资料由AI查询后进行整理而成。</em></span></p>]]></description><guid isPermaLink="false">/archives/halo-blog-evening-lag-investigation</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FmnFlYsbwPLM.avif&amp;size=m" type="image/jpeg" length="102832"/><category>技巧</category><category>分享</category><pubDate>Fri, 22 May 2026 10:30:00 GMT</pubDate></item><item><title><![CDATA[我用这个开源项目，把 AI 绘画提示词变成了"代码"——awesome-gpt-image-2 深度体验报告]]></title><link>https://wuqishi.com/archives/awesome-gpt-image-2-review-prompt-as-code-tutorial</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%88%91%E7%94%A8%E8%BF%99%E4%B8%AA%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%EF%BC%8C%E6%8A%8A%20AI%20%E7%BB%98%E7%94%BB%E6%8F%90%E7%A4%BA%E8%AF%8D%E5%8F%98%E6%88%90%E4%BA%86%22%E4%BB%A3%E7%A0%81%22%E2%80%94%E2%80%94awesome-gpt-image-2%20%E6%B7%B1%E5%BA%A6%E4%BD%93%E9%AA%8C%E6%8A%A5%E5%91%8A&amp;url=/archives/awesome-gpt-image-2-review-prompt-as-code-tutorial" width="1" height="1" alt="" style="opacity:0;">
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FSImrbRCaMGT.avif&amp;size=m" alt="文章头图，用该项目技能制作" title="文章头图，用该项目技能制作" width="1024px">
 <figcaption data-placeholder="添加描述" style="width: 1024px; max-width: 100%; text-align: center;">文章头图，用该项目技能制作</figcaption>
</figure>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">最近发现了一个让我眼前一亮的项目——<code>awesome-gpt-image-2</code>，它不是又一个 AI 绘画工具，而是一套完整的 GPT-Image2 提示词工程体系。用了两周后，我来和大家分享我的真实体验。</p>
<hr>
<h2 style="" id="%F0%9F%93%8C-%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%80%BB%E7%BB%93%E8%BF%99%E6%98%AF%E4%BB%80%E4%B9%88">📌 一句话总结这是什么</h2>
<p style=""><code>awesome-gpt-image-2</code> 是一个开源的 <code>GPT-Image2</code> 提示词模板库和工业级引擎，收录了 450 个真实逆向工程案例 和 20+ 个可复用的提示词模板，覆盖 UI 设计、信息图、海报、电商、品牌等 13 大场景。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779332039592.avif&amp;size=m" alt="项目提供的在线可视化网站，可以浏览所有案例并直接复制提示词" title="项目提供的在线可视化网站，可以浏览所有案例并直接复制提示词" width="100%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 100%; max-width: 100%; text-align: center;">项目提供的在线可视化网站，可以浏览所有案例并直接复制提示词</figcaption>
</figure>
<hr>
<h2 style="" id="%F0%9F%94%8D-%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E8%BF%99%E4%B8%AA%E5%B7%A5%E5%85%B7%EF%BC%9F">🔍 为什么需要这个工具？</h2>
<p style="">说实话，一些 <code>Midjourney</code>、<code>Stable Diffusion</code>、<code>DALL-E 3</code> 等主流 AI 绘画工具，但总遇到这些问题：</p>
<h3 style="" id="%E2%9D%8C-%E4%BC%A0%E7%BB%9F%E6%96%B9%E5%BC%8F%E7%9A%84%E7%97%9B%E7%82%B9">❌ 传统方式的痛点</h3>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 583px">
  <colgroup>
   <col style="width: 138px">
   <col style="width: 445px">
  </colgroup>
  <tbody>
   <tr style="height: 60px;">
    <th colspan="1" rowspan="1" colwidth="138">
     <p style="">问题</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="445">
     <p style="">具体表现</p>
    </th>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="138">
     <p style="">提示词太随意</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="445">
     <p style="">"画一个科技感的信息图" → 出来的东西千奇百怪</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="138">
     <p style="">风格不稳定</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="445">
     <p style="">同样的提示词，每次生成的效果差异巨大</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="138">
     <p style="">无法批量生产</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="445">
     <p style="">需要为 50 个商品生成主图时，每个都要重新调参</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="138">
     <p style="">团队协作难</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="445">
     <p style="">设计师写的提示词，开发人员看不懂也改不了</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<h3 style="" id="%E2%9C%85-%E8%BF%99%E4%B8%AA%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%A7%A3%E5%86%B3%E6%80%9D%E8%B7%AF">✅ 这个项目的解决思路</h3>
<p style="">​<code>awesome-gpt-image-2​ </code>的核心理念是 "Prompt-as-Code"（提示词即代码）——把散乱的文字描述变成结构化的、可版本控制的、可自动执行的"协议"。</p>
<p style="">这让我想到：如果把 AI 提示词当成代码来管理，是不是就能解决上述所有问题？</p>
<hr>
<h2 style="" id="%F0%9F%8E%AF-%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD%EF%BC%9A%E5%AE%83%E5%88%B0%E5%BA%95%E8%83%BD%E5%81%9A%E4%BB%80%E4%B9%88%EF%BC%9F">🎯 核心功能：它到底能做什么？</h2>
<p style="">经过实际使用，我发现这个项目的价值主要体现在三个方面：</p>
<h3 style="" id="1%EF%B8%8F%E2%83%A3-450-%E4%B8%AA%E7%9C%9F%E5%AE%9E%E6%A1%88%E4%BE%8B%E5%BA%93-%E2%80%94-%E4%B8%8D%E6%98%AF-ppt-%E6%88%AA%E5%9B%BE%EF%BC%8C%E6%98%AF%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C">1️⃣ 450 个真实案例库 — 不是 PPT 截图，是实战经验</h3>
<p style="">这是我第一次见到这么大规模的、经过验证的真实案例集合。每个案例都包含：</p>
<ul>
 <li>
  <p style="">✅ 原始提示词（完整可复制）</p>
 </li>
 <li>
  <p style="">✅ 生成的效果图</p>
 </li>
 <li>
  <p style="">✅ 所属分类和标签</p>
 </li>
 <li>
  <p style="">✅ 适用的模板类型</p>
 </li>
</ul>
<h4 style="" id="%E8%A6%86%E7%9B%96%E8%8C%83%E5%9B%B4">覆盖范围</h4>
<p style="">案例覆盖的 13 大分类、19种风格、10个场景：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779332064902.avif&amp;size=m" alt="案例覆盖的 13 大分类、19种风格、10个场景" title="案例覆盖的 13 大分类、19种风格、10个场景" width="100%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 100%; max-width: 100%; text-align: center;">案例覆盖的 13 大分类、19种风格、10个场景</figcaption>
</figure>
<h4 style="" id="%E6%A1%88%E4%BE%8B%E5%88%86%E7%B1%BB%E7%94%BB%E5%86%8C">案例分类画册</h4>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779332115038.avif&amp;size=m" alt="案例分类画册一" title="案例分类画册一" width="100%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 100%; max-width: 100%; text-align: center;">案例分类画册一</figcaption>
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779332138660.avif&amp;size=m" alt="案例分类画册二" title="案例分类画册二" width="100%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 100%; max-width: 100%; text-align: center;">案例分类画册二</figcaption>
</figure>
<p style="">我的使用感受： 浏览这些案例时，我能明显感觉到它们不是"理想化的 Demo"，而是真实的社区作品，有些甚至能看到明显的改进空间——这种真实性反而让我更信任。</p>
<hr>
<h3 style="" id="2%EF%B8%8F%E2%83%A3-20%2B-%E5%B7%A5%E4%B8%9A%E7%BA%A7%E6%A8%A1%E6%9D%BF%E7%B3%BB%E7%BB%9F-%E2%80%94-%E4%BB%8E%22%E7%81%B5%E6%84%9F%22%E5%88%B0%22%E7%94%9F%E4%BA%A7%E7%BA%BF%22">2️⃣ 20+ 工业级模板系统 — 从"灵感"到"生产线"</h3>
<p style="">这是我最喜欢的部分。项目提供了 结构化的模板框架，每个模板都包含：</p>
<h4 style="" id="%F0%9F%93%8B-%E6%A8%A1%E6%9D%BF%E6%A0%87%E5%87%86%E7%BB%93%E6%9E%84%EF%BC%88%E4%BB%A5%22%E5%9C%BA%E6%99%AF%E5%8F%99%E4%BA%8B%22%E4%B8%BA%E4%BE%8B%EF%BC%89">📋 模板标准结构（以"场景叙事"为例）</h4>
<pre><code class="language-markdown">模板：场景叙事
用途：用于分镜、世界观、直播场景和情绪叙事画面。
视觉方向：场景与叙事 / 场景 / 插画 / 叙事 / 社媒 / 分镜

请基于以下结构生成一条可直接用于 GPT Image 2 的图片 Prompt：
- 主体：[要生成的产品、人物、空间、界面或信息主题]
- 场景：[使用环境、叙事背景、受众语境]
- 构图：[画面比例、镜头距离、主体位置、层级关系]
- 风格：[材质、光线、色彩、时代感、品牌气质]
- 文本：[必须准确显示的标题、标签、按钮或说明文字]
- 细节：[关键装饰、辅助元素、信息标注、交互层]
- 输出：[清晰度、比例、完成度、可读性要求]

核心约束：
- 定义人物、地点、时间、冲突、情绪和机位。
- 让场景细节服务故事。

需要避免：
- 避免通用幻想背景。
- 让故事线索在画面里可见。</code></pre>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779332165494.avif&amp;size=m" alt="这个“月下小舞姬”好看吧" title="这个“月下小舞姬”好看吧" width="100%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 100%; max-width: 100%; text-align: center;">这个“月下小舞姬”好看吧</figcaption>
</figure>
<p style="">​核心价值：</p>
<ul>
 <li>
  <p style="">🔧 原子化拆解 — 把复杂需求分解为：主体 + 场景 + 构图 + 风格 + 文本 + 细节 +输出</p>
 </li>
 <li>
  <p style="">🎯 防坑指南 — 每个模板都明确告诉你核心约束和需要避免</p>
 </li>
 <li>
  <p style="">🔄 可组合性 — 不同模板的参数可以灵活搭配</p>
 </li>
</ul>
<hr>
<h3 style="" id="3%EF%B8%8F%E2%83%A3-agent-%E6%8A%80%E8%83%BD%E9%9B%86%E6%88%90-%E2%80%94-%E8%AE%A9-ai-%E8%87%AA%E5%B7%B1%E9%80%89%E6%A8%A1%E6%9D%BF">3️⃣ Agent 技能集成 — 让 AI 自己选模板</h3>
<p style="">这个功能对开发者特别友好。项目提供了一个 gpt-image-2-style-library 技能，可以集成到 Claude Code​、OpenAI Codex​、Cursor​ 等 AI 编程助手中。</p>
<p style="">安装命令（一行搞定）：</p>
<pre><code class="language-bash">npx skills add freestylefly/awesome-gpt-image-2 --skill gpt-image-2-style-library --agent claude-code codex --global --yes --copy</code></pre>
<p style="">使用示例：</p>
<pre><code class="language-text">用户: 使用样式库技能生成一张关于"2025年AI发展趋势"的信息图
Agent: [自动调用技能]
      → 匹配到 infographic-engine 模板
      → 选择科技风格标签
      → 输出结构化提示词（包含模块定义、配色方案、布局约束）</code></pre>
<hr>
<h2 style="" id="%F0%9F%8E%93-%E9%80%82%E7%94%A8%E4%BA%BA%E7%BE%A4%E5%88%86%E6%9E%90">🎓 适用人群分析</h2>
<h3 style="" id="%E2%9C%85-%E5%BC%BA%E7%83%88%E6%8E%A8%E8%8D%90%E7%BB%99%E8%BF%99%E4%BA%9B%E4%BA%BA">✅ 强烈推荐给这些人</h3>
<ol>
 <li>
  <p style="">内容创作者 / 博主 — 需要大量配图且追求效率</p>
 </li>
 <li>
  <p style="">电商运营 / 设计师 — 批量生成商品图、活动海报</p>
 </li>
 <li>
  <p style="">产品经理 / UX 设计师 - 快速出原型图、界面概念图</p>
 </li>
 <li>
  <p style="">AI 应用开发者 - 将提示词工程集成到自己的产品中</p>
 </li>
 <li>
  <p style="">独立开发者 / 创业者 - 降低设计成本，一人兼任设计和开发</p>
 </li>
</ol>
<h3 style="" id="%E2%9A%A0%EF%B8%8F-%E5%8F%AF%E8%83%BD%E4%B8%8D%E5%A4%AA%E9%80%82%E5%90%88">⚠️ 可能不太适合</h3>
<ol>
 <li>
  <p style="">纯艺术创作追求者 - 这里的模板偏商业化，不够"艺术"</p>
 </li>
 <li>
  <p style="">只用 <code>Midjourney</code> 的用户 - 模板语法可能需要适配</p>
 </li>
 <li>
  <p style="">完全不想学新技术的小白 - 还是有一定上手门槛的</p>
 </li>
</ol>
<hr>
<h2 style="" id="%F0%9F%93%8A-%E4%B8%8E%E5%85%B6%E4%BB%96%E5%85%8D%E8%B4%B9%E6%96%B9%E6%A1%88%E5%AF%B9%E6%AF%94">📊 与其他免费方案对比</h2>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 762px">
  <colgroup>
   <col style="width: 113px">
   <col style="width: 211px">
   <col style="width: 130px">
   <col style="width: 153px">
   <col style="width: 155px">
  </colgroup>
  <tbody>
   <tr style="height: 60px;">
    <th colspan="1" rowspan="1" colwidth="113">
     <p style="">维度</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="211">
     <p style="">awesome-gpt-image-2</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="130">
     <p style="">PromptHero</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="153">
     <p style="">Civitai</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="155">
     <p style="">手写提示词</p>
    </th>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">案例数量</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">439+</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">数万</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">数万</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">0</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">结构化程度</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">⭐⭐⭐⭐⭐</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">⭐⭐</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">⭐⭐</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">⭐</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">模板系统</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">✅ 20+ 工业模板</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">❌ 无</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">⭐⭐ 社区标签</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">❌</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">Agent 集成</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">✅ 原生支持</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">❌</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">❌</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">❌</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">中文优化</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">✅ 完整中文</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">⚠️ 部分</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">⚠️ 部分</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">取决于自己</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">免费程度</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">✅ 完全免费</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">✅ 免费</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">✅ 免费</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">✅ 免费</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">学习成本</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">中等（1-2 天上手）</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">低</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">低</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">高（靠经验积累）</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="113">
     <p style="">适合场景</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="211">
     <p style="">商业批量生产</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="130">
     <p style="">灵感寻找</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="153">
     <p style="">模型探索</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="155">
     <p style="">精细调优</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<p style="">结论： 如果你需要系统性、可复制、可自动化的提示词方案，<code>awesome-gpt-image-2</code> 是目前最专业的选择。如果你只是想找灵感，<code>PromptHero</code> 或 <code>Civitai</code> 可能更方便。</p>
<hr>
<h2 style="" id="%F0%9F%9B%A0%EF%B8%8F-%E5%AE%89%E8%A3%85%E4%B8%8E%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B">🛠️ 安装与快速开始</h2>
<h3 style="" id="%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9A%E5%9C%A8%E7%BA%BF%E6%B5%8F%E8%A7%88%EF%BC%88%E9%9B%B6%E9%97%A8%E6%A7%9B%EF%BC%89">方式一：在线浏览（零门槛）</h3>
<p style="">直接访问：<code>https://gpt-image2.canghe.ai/</code></p>
<p style="">无需注册即可浏览所有案例，登录 Google 账号后可以测试生成。</p>
<h3 style="" id="%E6%96%B9%E5%BC%8F%E4%BA%8C%EF%BC%9A%E5%85%8B%E9%9A%86%E4%BB%93%E5%BA%93%EF%BC%88%E6%8E%A8%E8%8D%90%E5%BC%80%E5%8F%91%E8%80%85%EF%BC%89">方式二：克隆仓库（推荐开发者）</h3>
<pre><code class="language-bash">git clone https://github.com/freestylefly/awesome-gpt-image-2.git
cd awesome-gpt-image-2

# 查看案例
打开 docs/gallery.md

# 查看模板
打开 docs/templates.md</code></pre>
<h3 style="" id="%E6%96%B9%E5%BC%8F%E4%B8%89%EF%BC%9A%E5%AE%89%E8%A3%85-agent-%E6%8A%80%E8%83%BD%EF%BC%88%E6%8E%A8%E8%8D%90%E9%87%8D%E5%BA%A6%E4%BD%BF%E7%94%A8%E8%80%85%EF%BC%89">方式三：安装 Agent 技能（推荐重度使用者）</h3>
<pre><code class="language-bash"># 安装到全局（所有 Agent 都可用）
npx skills add freestylefly/awesome-gpt-image-2 --global --all --copy

# 重启你的 AI 助手（Claude Code / Cursor / Codex）
# 然后就可以使用了！</code></pre>
<hr>
<h2 style="" id="%F0%9F%92%A1-%E6%88%91%E7%9A%84%E4%B8%AA%E4%BA%BA%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7">💡 我的个人使用技巧</h2>
<p style="">经过两周的深度使用，我总结了几个使用技巧：</p>
<h3 style="" id="%E6%8A%80%E5%B7%A7-1%EF%BC%9A%E5%85%88%E6%89%BE%E6%A1%88%E4%BE%8B%EF%BC%8C%E5%86%8D%E5%A5%97%E6%A8%A1%E6%9D%BF">技巧 1：先找案例，再套模板</h3>
<p style="">不要直接背模板参数！正确流程是：</p>
<ol>
 <li>
  <p style="">在在线网站上按分类、风格、场景筛选</p>
 </li>
 <li>
  <p style="">找到 2-3 个和你需求接近的案例</p>
 </li>
 <li>
  <p style="">看它们用的是哪个案例</p>
 </li>
 <li>
  <p style="">复制该模板的结构，只替换内容</p>
 </li>
</ol>
<p style="">这样成功率提高 70%+</p>
<h3 style="" id="%E6%8A%80%E5%B7%A7-2%EF%BC%9A%E5%96%84%E7%94%A8%22%E8%B4%9F%E9%9D%A2%E7%BA%A6%E6%9D%9F%22">技巧 2：善用"负面约束"</h3>
<p style="">每个模板的 <code>Pitfalls</code> 部分其实是宝藏。我会把这些"不要做"的事情显式写到提示词里：</p>
<pre><code class="language-markdown">- 不要出现人物手指
- 避免文字重叠
- 禁止渐变背景（保持纯色）</code></pre>
<p style="">显式约束比隐式期望有效得多</p>
<h3 style="" id="%E6%8A%80%E5%B7%A7-3%EF%BC%9A%E5%BB%BA%E7%AB%8B%E4%B8%AA%E4%BA%BA%E6%A8%A1%E6%9D%BF%E5%BA%93">技巧 3：建立个人模板库</h3>
<p style="">在项目的基础上，可以建立了自己的 "常用模板速查表"：</p>
<pre><code class="language-markdown"># Top 5 模板

1. infographic-engine     → 技术文章配图（80% 使用率）
2. ui-screenshot-system  → 教程截图模拟
3. poster-layout-system  → 公众号封面
4. product-commerce-visual → 电商合作项目
5. brand-touchpoint-board → 品牌提案</code></pre>
<p style="">把通用模板个性化，效率翻倍</p>
<hr>
<h2 style="" id="%F0%9F%93%88-%E9%A1%B9%E7%9B%AE%E6%B4%BB%E8%B7%83%E5%BA%A6%E4%B8%8E%E5%8F%91%E5%B1%95%E5%89%8D%E6%99%AF">📈 项目活跃度与发展前景</h2>
<h3 style="" id="%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81%EF%BC%88%E6%88%AA%E8%87%B3-2026-%E5%B9%B4-5-%E6%9C%88%EF%BC%89">当前状态（截至 2026 年 5 月）</h3>
<ul>
 <li>
  <p style="">⭐ GitHub Stars：持续增长中（社区活跃）</p>
 </li>
 <li>
  <p style="">📦 最新案例：Case #450（仍在更新）</p>
 </li>
 <li>
  <p style="">🌐 在线网站：正常运行，支持实时生成测试</p>
 </li>
</ul>
<hr>
<h3 style="" id="%E6%9C%80%E5%90%8E%E7%9A%84%E8%AF%9D">最后的话</h3>
<p style=""><code>awesome-gpt-image-2</code> 不是那种"惊艳一时"的工具，而是越用越好用的基础设施。</p>
<p style="">希望这类开源项目越来越多也越来越好，让AI成为全民可用的工具。</p>
<p style="">哦，对了，这篇文章的头图就是使用了这个项目的技能做的哦~٩(ˊᗜˋ*)و</p>
<hr>
<p style="">相关链接：</p>
<p style="">🌐 在线体验：</p>
<hyperlink-card target="_blank" href="https://gpt-image2.canghe.ai/" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="GPT-Image2 Prompt Gallery" custom-description="从爆款图片，到可复用 Prompt"><a href="https://gpt-image2.canghe.ai/" target="_blank">https://gpt-image2.canghe.ai/</a></hyperlink-card>
<p style="">📦 GitHub 仓库：</p>
<hyperlink-card target="_blank" href="https://github.com/freestylefly/awesome-gpt-image-2" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="GitHub - freestylefly/awesome-gpt-image-2: Prompt as Code | GPT-Image2 工业级提示词引擎与模板库，370+ 个案例逆向工程，20+ 套工业级模板，并提炼出Skills，持续更新中 · GitHub" custom-description="Prompt as Code | GPT-Image2 工业级提示词引擎与模板库，370+ 个案例逆向工程，20+ 套工业级模板，并提炼出Skills，持续更新中 - freestylefly/awesome-gpt-image-2"><a href="https://github.com/freestylefly/awesome-gpt-image-2" target="_blank">https://github.com/freestylefly/awesome-gpt-image-2</a></hyperlink-card>
<p style="">📖 完整案例集：</p>
<hyperlink-card target="_blank" href="https://github.com/freestylefly/awesome-gpt-image-2/blob/main/docs/gallery-part-1.md" theme="small" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://github.com/freestylefly/awesome-gpt-image-2/blob/main/docs/gallery-part-1.md" target="_blank">https://github.com/freestylefly/awesome-gpt-image-2/blob/main/docs/gallery-part-1.md</a></hyperlink-card><hyperlink-card target="_blank" href="https://github.com/freestylefly/awesome-gpt-image-2/blob/main/docs/gallery-part-2.md" theme="small" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://github.com/freestylefly/awesome-gpt-image-2/blob/main/docs/gallery-part-2.md" target="_blank">https://github.com/freestylefly/awesome-gpt-image-2/blob/main/docs/gallery-part-2.md</a></hyperlink-card>
<p style="">🤖 Agent 技能文档:：</p>
<hyperlink-card target="_blank" href="https://github.com/freestylefly/awesome-gpt-image-2/blob/main/agents/skills/gpt-image-2-style-library/SKILL.md" theme="small" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://github.com/freestylefly/awesome-gpt-image-2/blob/main/agents/skills/gpt-image-2-style-library/SKILL.md" target="_blank">https://github.com/freestylefly/awesome-gpt-image-2/blob/main/agents/skills/gpt-image-2-style-library/SKILL.md</a></hyperlink-card>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/awesome-gpt-image-2-review-prompt-as-code-tutorial</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FSImrbRCaMGT.avif&amp;size=m" type="image/jpeg" length="64154"/><category>技巧</category><category>分享</category><pubDate>Fri, 22 May 2026 05:14:00 GMT</pubDate></item><item><title><![CDATA[群晖部署 LX Music Server：浏览器就是你的音乐播放器【详细版】]]></title><link>https://wuqishi.com/archives/synology-lx-music-server-browser-player-guide</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BE%A4%E6%99%96%E9%83%A8%E7%BD%B2%20LX%20Music%20Server%EF%BC%9A%E6%B5%8F%E8%A7%88%E5%99%A8%E5%B0%B1%E6%98%AF%E4%BD%A0%E7%9A%84%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8%E3%80%90%E8%AF%A6%E7%BB%86%E7%89%88%E3%80%91&amp;url=/archives/synology-lx-music-server-browser-player-guide" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2">写在前面</h2>
<p style="">最近想给家里的群晖找点新活儿干，正好刷到 <code>xcq0607/lxserver</code>​ 这个项目。简单说，它就是在群晖上搭一个音乐服务端，然后你打开浏览器就能听歌——不用装任何 App，手机、电脑、平板都能用。歌单数据存在 NAS 本地，换设备也不怕丢。</p>
<p style="">这个项目是 LX Music 的增强版服务端。原版 <code>lyswhut/lx-music-sync-server</code>​ 只是个纯同步后端，没界面，配置也麻烦。而这个增强版在内置同步功能的基础上，加了一个完整的 Web 播放器。所以你可以把它当同步后端用，也可以直接当主力播放器用。</p>
<p style="">我的环境是群晖 <code>DS918+</code>，<code>DSM 7.3.2</code>，下面一步步记录部署过程，尽量详细到小白也能跟着做。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779267440089.avif&amp;size=m" alt="LX Music" width="2560px">
 <figcaption data-placeholder="添加描述" style="width: 2560px; max-width: 100%; text-align: center;">LX Music Server</figcaption>
</figure>
<hr>
<h2 style="" id="%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">准备工作</h2>
<h3 style="" id="%E7%A1%AE%E8%AE%A4%E7%BE%A4%E6%99%96%E7%8E%AF%E5%A2%83">确认群晖环境</h3>
<p style="">打开群晖的「控制面板」→「信息中心」，确认 DSM 版本。本文基于 DSM 7.3.2，其他 7.x 版本应该也差不多。</p>
<h3 style="" id="%E5%AE%89%E8%A3%85-container-manager">安装 Container Manager</h3>
<p style="">打开「套件中心」，搜索「Container Manager」并安装。这是群晖官方的 Docker 管理工具，DSM 7.2 之后取代了旧版的 Docker 套件。</p>
<h3 style="" id="%E5%BC%80%E5%90%AF-ssh%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%89">开启 SSH（推荐）</h3>
<p style="">后面部分操作需要命令行，建议先开启 SSH。进「控制面板」→「终端机和 SNMP」→「终端机」，勾选「启用 SSH 功能」，端口默认 22。</p>
<h3 style="" id="%E5%88%9B%E5%BB%BA%E5%AD%98%E6%94%BE%E7%9B%AE%E5%BD%95">创建存放目录</h3>
<p style="">打开「File Station」，在 docker​ 共享文件夹下创建目录结构：</p>
<pre><code>docker/
└── lx-music/
    ├── data/
    ├── logs/
    └── cache/</code></pre>
<p style=""><strong>操作步骤</strong>：</p>
<ol>
 <li>
  <p style="">右键 docker​ 文件夹 →「新建文件夹」→ 输入 <code>lx-music​</code></p>
 </li>
 <li>
  <p style="">进入 lx-music​，再新建三个子文件夹：<code>data​</code>、<code>logs</code>​、<code>cache​</code></p>
 </li>
</ol>
<p style="">这三个目录分别用来存用户数据、运行日志和缓存文件。通过卷映射挂到容器里，这样即使容器删掉重建，数据也不会丢。</p>
<hr>
<h2 style="" id="docker-compose.yml-%E5%86%85%E5%AE%B9">docker-compose.yml 内容</h2>
<p style="">不管你用下面哪种部署方式，这个配置文件的内容是一样的。先准备好：</p>
<pre><code class="language-yaml">version: "3.8"

services:
  lx-music-server:
    image: xcq0607/lxserver:latest
    container_name: lx-music-server
    restart: unless-stopped
    ports:
      - "9527:9527"
    volumes:
      - ./data:/server/data
      - ./logs:/server/logs
      - ./cache:/server/cache
    environment:
      - NODE_ENV=production
      - FRONTEND_PASSWORD=你的管理后台密码
      - ENABLE_WEBPLAYER_AUTH=true
      - WEBPLAYER_PASSWORD=你的播放器密码</code></pre>
<p style="">参数说明：</p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 757px">
  <colgroup>
   <col style="width: 262px">
   <col style="width: 495px">
  </colgroup>
  <tbody>
   <tr style="height: 60px;">
    <th colspan="1" rowspan="1" colwidth="262">
     <p style="">参数</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="495">
     <p style="">说明</p>
    </th>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​image​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">项目镜像，固定写 xcq0607/lxserver:latest​</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​container_name​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">容器名称，自己起一个好记的</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​restart: unless-stopped​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">群晖重启后自动启动容器，除非手动停止</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​ports​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">端口映射，左边是群晖本地端口，右边是容器内部端口</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​volumes​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">卷映射，左边是群晖本地路径，右边是容器内路径</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​FRONTEND_PASSWORD​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">管理后台登录密码，必须改</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​WEBPLAYER_PASSWORD​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">Web 播放器登录密码，必须改</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="262">
     <p style="">​ENABLE_WEBPLAYER_AUTH​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="495">
     <p style="">是否开启播放器密码验证，建议 true​</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<blockquote>
 <p style="">⚠️ 密码一定要改！ <code>FRONTEND_PASSWORD</code>​ 和 <code>WEBPLAYER_PASSWORD</code>​ 建议设成不一样的。前者是进管理后台用的，后者是打开播放器页面用的。如果打算暴露到公网，密码设复杂一点。</p>
</blockquote>
<hr>
<h2 style="" id="%E9%83%A8%E7%BD%B2%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9Acontainer-manager-%E7%9A%84%E3%80%8C%E9%A1%B9%E7%9B%AE%E3%80%8D%E5%8A%9F%E8%83%BD%EF%BC%88%E6%8E%A8%E8%8D%90%E6%96%B0%E6%89%8B%EF%BC%89">部署方式一：Container Manager 的「项目」功能（推荐新手）</h2>
<p style="">DSM 7.2 之后，Container Manager 新增了「项目」功能，支持图形界面管理 Docker Compose，对新手最友好。</p>
<details class="details" open>
 <summary>Container Manager 的「项目」功能（推荐新手)</summary>
 <div data-type="detailsContent">
  <h3 style="" id="%E7%AC%AC%E4%B8%80%E6%AD%A5%EF%BC%9A%E6%89%93%E5%BC%80%E9%A1%B9%E7%9B%AE%E9%A1%B5%E9%9D%A2">第一步：打开项目页面</h3>
  <ol>
   <li>
    <p style="">打开「Container Manager」</p>
   </li>
   <li>
    <p style="">左侧菜单选「项目」</p>
   </li>
   <li>
    <p style="">点击右上角「新增」按钮</p>
   </li>
  </ol>
  <h3 style="" id="%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%9A%E5%A1%AB%E5%86%99%E9%A1%B9%E7%9B%AE%E4%BF%A1%E6%81%AF">第二步：填写项目信息</h3>
  <p style="">弹出的对话框里填写：</p>
  <ul>
   <li>
    <p style="">项目名称：lx-music​（自己起一个，英文，不要有特殊字符）</p>
   </li>
   <li>
    <p style="">路径：点击「选择」按钮，浏览到 /docker/lx-music​ 文件夹（就是前面创建的那个）</p>
   </li>
   <li>
    <p style="">来源：选「创建 docker-compose.yml」</p>
   </li>
  </ul>
  <p style="">填完后点「下一步」。</p>
  <h3 style="" id="%E7%AC%AC%E4%B8%89%E6%AD%A5%EF%BC%9A%E7%B2%98%E8%B4%B4-docker-compose.yml-%E5%86%85%E5%AE%B9">第三步：粘贴 docker-compose.yml 内容</h3>
  <p style="">这时候会弹出一个编辑器窗口，让你填写 docker-compose.yml 的内容。把前面准备好的配置完整粘贴进去。注意把密码改成你自己的。</p>
  <p style="">粘贴完成后，点击「验证」，Container Manager 会检查 YAML 格式是否正确。如果格式没问题，会显示验证通过。</p>
  <h3 style="" id="%E7%AC%AC%E5%9B%9B%E6%AD%A5%EF%BC%9A%E5%90%AF%E5%8A%A8%E9%A1%B9%E7%9B%AE">第四步：启动项目</h3>
  <p style="">验证通过后，勾选「创建项目后立即启动」，然后点「完成」。</p>
  <p style="">Container Manager 会自动拉取镜像、创建容器、启动服务。这个过程大概 1-2 分钟，取决于网络速度。</p>
  <h3 style="" id="%E7%AC%AC%E4%BA%94%E6%AD%A5%EF%BC%9A%E7%A1%AE%E8%AE%A4%E7%8A%B6%E6%80%81">第五步：确认状态</h3>
  <ol>
   <li>
    <p style="">左侧选「项目」，看 lx-music​ 项目状态是不是「运行中」</p>
   </li>
   <li>
    <p style="">再点左侧「容器」，看 lx-music-server​ 容器状态是不是「正在运行」</p>
   </li>
   <li>
    <p style="">浏览器打开 http://群晖IP:9527​，输入密码测试能否进入管理后台</p>
   </li>
  </ol>
  <hr>
 </div>
</details>
<h2 style="" id="%E9%83%A8%E7%BD%B2%E6%96%B9%E5%BC%8F%E4%BA%8C%EF%BC%9Assh-%E5%91%BD%E4%BB%A4%E8%A1%8C-%2B-docker-compose">部署方式二：SSH 命令行 + Docker Compose</h2>
<p style="">适合习惯用命令行的用户，操作效率高，以后修改配置也方便。</p>
<details class="details">
 <summary>SSH 命令行 + Docker Compose</summary>
 <div data-type="detailsContent">
  <h3 style="" id="%E7%AC%AC%E4%B8%80%E6%AD%A5%EF%BC%9A%E4%B8%8A%E4%BC%A0%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6">第一步：上传配置文件</h3>
  <p style="">用 SSH 客户端（如 PuTTY、Termius）连接群晖，或者用群晖自带的「终端机」套件，执行：</p>
  <pre><code class="language-bash">cd /volume1/docker/lx-music
</code></pre>
  <blockquote>
   <p style="">注意：/volume1/​ 是群晖默认的存储空间路径，如果你的数据存在其他卷（比如 /volume2/​），请对应修改。</p>
  </blockquote>
  <p style="">然后用 vi​ 或 nano​ 创建 docker-compose.yml​ 文件，把上面准备好的内容粘贴进去。保存退出。</p>
  <h3 style="" id="%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%9A%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8">第二步：启动容器</h3>
  <p style="">在同目录下执行：</p>
  <pre><code class="language-bash">docker-compose up -d
</code></pre>
  <p style="">第一次运行会自动拉取镜像，大概需要 1-2 分钟，取决于网络速度。看到类似下面的输出就是成功了：</p>
  <pre><code>[+] Running 2/2
 ✔ Network lx-music_default  Created
 ✔ Container lx-music-server  Started
</code></pre>
  <h3 style="" id="%E7%AC%AC%E4%B8%89%E6%AD%A5%EF%BC%9A%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97%E7%A1%AE%E8%AE%A4">第三步：查看日志确认</h3>
  <pre><code class="language-bash">docker logs -f lx-music-server
</code></pre>
  <p style="">正常应该能看到服务启动的日志，没有报错就行。按 Ctrl+C​ 退出日志查看。</p>
  <h3 style="" id="%E7%AC%AC%E5%9B%9B%E6%AD%A5%EF%BC%9A%E8%AE%BF%E9%97%AE%E9%AA%8C%E8%AF%81">第四步：访问验证</h3>
  <p style="">浏览器打开 http://群晖IP:9527​，应该能看到登录页面。输入 FRONTEND_PASSWORD​ 设置的密码，进去就是管理后台。</p>
  <p style="">如果打不开，检查以下几点：</p>
  <ul>
   <li>
    <p style="">容器是否在运行：进 Container Manager →「容器」，看 lx-music-server​ 状态是不是「正在运行」</p>
   </li>
   <li>
    <p style="">端口是否冲突：群晖上 9527 端口默认空闲，但如果装过其他服务可能占用</p>
   </li>
   <li>
    <p style="">防火墙是否放行：群晖「控制面板」→「安全性」→「防火墙」，确认 9527 端口允许访问</p>
   </li>
  </ul>
  <hr>
 </div>
</details>
<h2 style="" id="%E9%83%A8%E7%BD%B2%E6%96%B9%E5%BC%8F%E4%B8%89%EF%BC%9Acontainer-manager-%E6%89%8B%E5%8A%A8%E5%88%9B%E5%BB%BA%E5%AE%B9%E5%99%A8">部署方式三：Container Manager 手动创建容器</h2>
<p style="">如果你不想用 Compose，也可以手动一步步创建容器。这种方式配置分散，以后修改不太方便，但适合想深入了解每个参数的用户。</p>
<details class="details">
 <summary>Container Manager 手动创建容器</summary>
 <div data-type="detailsContent">
  <h3 style="" id="%E7%AC%AC%E4%B8%80%E6%AD%A5%EF%BC%9A%E6%8B%89%E5%8F%96%E9%95%9C%E5%83%8F">第一步：拉取镜像</h3>
  <ol>
   <li>
    <p style="">打开「Container Manager」</p>
   </li>
   <li>
    <p style="">左侧选「注册表」</p>
   </li>
   <li>
    <p style="">搜索框输入 xcq0607/lxserver​</p>
   </li>
   <li>
    <p style="">找到后点击「下载」，标签选 latest​</p>
   </li>
   <li>
    <p style="">等下载完成</p>
   </li>
  </ol>
  <h3 style="" id="%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%9A%E5%88%9B%E5%BB%BA%E5%AE%B9%E5%99%A8">第二步：创建容器</h3>
  <ol>
   <li>
    <p style="">左侧选「映像」，找到刚下载的 xcq0607/lxserver:latest​，点击「运行」</p>
   </li>
   <li>
    <p style="">弹出配置向导，按下面步骤填：</p>
   </li>
  </ol>
  <p style=""><strong>常规设置</strong>：</p>
  <ul>
   <li>
    <p style="">容器名称：lx-music-server​</p>
   </li>
   <li>
    <p style="">勾选「启用自动重新启动」</p>
   </li>
  </ul>
  <p style=""><strong>端口设置</strong>：</p>
  <ul>
   <li>
    <p style="">点击「新增」，本地端口填 9527​，容器端口填 9527​</p>
   </li>
  </ul>
  <p style=""><strong>存储空间设置</strong>：
   <br>
   点击「新增文件夹」，添加三条映射：</p>
  <div style="overflow-x: auto; overflow-y: hidden;">
   <table style="width: 323px">
    <colgroup>
     <col style="width: 223px">
     <col style="width: 100px">
    </colgroup>
    <tbody>
     <tr style="height: 60px;">
      <th colspan="1" rowspan="1" colwidth="223">
       <p style="">本地路径</p>
      </th>
      <th colspan="1" rowspan="1" colwidth="100">
       <p style="">容器路径</p>
      </th>
     </tr>
     <tr style="height: 60px;">
      <td colspan="1" rowspan="1" colwidth="223">
       <p style="">​/docker/lx-music/data​</p>
      </td>
      <td colspan="1" rowspan="1" colwidth="100">
       <p style="">​/server/data​</p>
      </td>
     </tr>
     <tr style="height: 60px;">
      <td colspan="1" rowspan="1" colwidth="223">
       <p style="">​/docker/lx-music/logs​</p>
      </td>
      <td colspan="1" rowspan="1" colwidth="100">
       <p style="">​/server/logs​</p>
      </td>
     </tr>
     <tr style="height: 60px;">
      <td colspan="1" rowspan="1" colwidth="223">
       <p style="">​/docker/lx-music/cache​</p>
      </td>
      <td colspan="1" rowspan="1" colwidth="100">
       <p style="">​/server/cache​</p>
      </td>
     </tr>
    </tbody>
   </table>
  </div>
  <blockquote>
   <p style="">填本地路径时，点「浏览」按钮，选择你前面创建的对应文件夹。</p>
  </blockquote>
  <p style=""><strong>环境变量</strong>：
   <br>
   点击「新增变量」，添加以下四条：</p>
  <div style="overflow-x: auto; overflow-y: hidden;">
   <table style="width: 448px">
    <colgroup>
     <col style="width: 258px">
     <col style="width: 190px">
    </colgroup>
    <tbody>
     <tr style="height: 60px;">
      <th colspan="1" rowspan="1" colwidth="258">
       <p style="">变量名</p>
      </th>
      <th colspan="1" rowspan="1" colwidth="190">
       <p style="">值</p>
      </th>
     </tr>
     <tr style="height: 60px;">
      <td colspan="1" rowspan="1" colwidth="258">
       <p style="">​NODE_ENV​</p>
      </td>
      <td colspan="1" rowspan="1" colwidth="190">
       <p style="">​production​</p>
      </td>
     </tr>
     <tr style="height: 60px;">
      <td colspan="1" rowspan="1" colwidth="258">
       <p style="">​FRONTEND_PASSWORD​</p>
      </td>
      <td colspan="1" rowspan="1" colwidth="190">
       <p style="">​你的管理后台密码​</p>
      </td>
     </tr>
     <tr style="height: 60px;">
      <td colspan="1" rowspan="1" colwidth="258">
       <p style="">​ENABLE_WEBPLAYER_AUTH​</p>
      </td>
      <td colspan="1" rowspan="1" colwidth="190">
       <p style="">​true​</p>
      </td>
     </tr>
     <tr style="height: 60px;">
      <td colspan="1" rowspan="1" colwidth="258">
       <p style="">​WEBPLAYER_PASSWORD​</p>
      </td>
      <td colspan="1" rowspan="1" colwidth="190">
       <p style="">​你的播放器密码​</p>
      </td>
     </tr>
    </tbody>
   </table>
  </div>
  <ol start="3">
   <li>
    <p style="">点「完成」，容器会自动启动</p>
   </li>
   <li>
    <p style="">去「容器」页面确认状态是「正在运行」</p>
   </li>
  </ol>
  <h3 style="" id="%E7%AC%AC%E4%B8%89%E6%AD%A5%EF%BC%9A%E8%AE%BF%E9%97%AE%E9%AA%8C%E8%AF%81">第三步：访问验证</h3>
  <p style="">浏览器打开 http://群晖IP:9527​，输入密码测试能否进入管理后台。</p>
  <hr>
 </div>
</details>
<hr>
<h2 style="" id="web-%E6%92%AD%E6%94%BE%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97">Web 播放器使用指南</h2>
<p style="">Web 播放器有以下核心特性：</p>
<h3 style="" id="%E7%8E%B0%E4%BB%A3%E5%8C%96%E7%95%8C%E9%9D%A2">现代化界面</h3>
<p style="">采用清爽的现代化 UI 设计，支持深色模式。播放页是左右分栏设计，左侧专辑封面（带毛玻璃沉浸效果），右侧歌词区。当前唱到的歌词会用高亮色标注。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fraw.githubusercontent.com%2FXCQ0607%2Flxserver%2Fmain%2Fmd%2Fplayer.png&amp;size=m" alt="播放界面" title="播放界面" width="2176px">
 <figcaption data-placeholder="添加描述" style="width: 2176px; max-width: 100%; text-align: center;">播放界面</figcaption>
</figure>
<h3 style="" id="%E5%A4%9A%E6%BA%90%E6%90%9C%E7%B4%A2">多源搜索</h3>
<p style="">支持聚合搜索各大音乐平台的资源。搜索框右上角可以切换音源平台（网易云、QQ音乐、酷狗、酷我、咪咕）。默认显示「热门搜索」，跟各平台的热搜榜同步。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fraw.githubusercontent.com%2FXCQ0607%2Flxserver%2Fmain%2Fmd%2Fsearch.png&amp;size=m" alt="搜索界面" title="搜索界面" width="2560px">
 <figcaption data-placeholder="添加描述" style="width: 2560px; max-width: 100%; text-align: center;">搜索界面</figcaption>
</figure>
<h3 style="" id="%E5%86%85%E5%AE%B9%E4%B8%8E%E6%92%AD%E6%94%BE%E5%88%97%E8%A1%A8">内容与播放列表</h3>
<p style="">支持多平台歌单的浏览、搜索与一键播放。歌单详情面板包含封面、作者、简介等完整信息。播放队列支持拖拽排序、批量管理及快速定位当前播放。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fraw.githubusercontent.com%2FXCQ0607%2Flxserver%2Fmain%2Fmd%2Fmusiclist.png&amp;size=m" alt="歌单浏览" title="歌单浏览">
 <figcaption data-placeholder="添加描述">歌单列表</figcaption>
</figure>
<h3 style="" id="%E9%A6%96%E6%AC%A1%E6%89%93%E5%BC%80">首次打开</h3>
<p style="">浏览器访问 http://群晖IP:9527，输入 WEBPLAYER_PASSWORD​ 设置的密码。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779268915628.avif&amp;size=m" alt="输入密码界面" width="422px">
 <figcaption data-placeholder="添加描述" style="width: 422px; max-width: 100%; text-align: center;">输入密码界面</figcaption>
</figure>
<p style="">底部控制条的功能包括：</p>
<ul>
 <li>
  <p style="">播放/暂停、上一首/下一首</p>
 </li>
 <li>
  <p style="">播放模式：顺序播放、随机播放、单曲循环</p>
 </li>
 <li>
  <p style="">倍速播放</p>
 </li>
 <li>
  <p style="">音量调节</p>
 </li>
 <li>
  <p style="">下载按钮（可以下载当前播放的歌曲）</p>
 </li>
 <li>
  <p style="">歌词按钮（显示/隐藏歌词）</p>
 </li>
 <li>
  <p style="">评论按钮（查看歌曲评论）</p>
 </li>
 <li>
  <p style="">播放队列按钮（打开当前播放列表）</p>
 </li>
</ul>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fraw.githubusercontent.com%2FXCQ0607%2Flxserver%2Fmain%2Fmd%2Fcontroller.png&amp;size=m" alt="播放控制界面" width="2560px">
 <figcaption data-placeholder="添加描述" style="width: 2560px; max-width: 100%; text-align: center;">播放控制界面</figcaption>
</figure>
<h3 style="" id="%E6%AD%8C%E5%8D%95%E6%B5%8F%E8%A7%88">歌单浏览</h3>
<p style="">点左侧「歌单」，能看到各平台推荐的歌单，带封面、标题、作者、播放量。点进去可以查看歌单详情，包含完整歌曲列表，一键播放全部。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fraw.githubusercontent.com%2FXCQ0607%2Flxserver%2Fmain%2Fmd%2Fmusiclist-detail.png&amp;size=m" alt="歌单浏览" width="2176px">
 <figcaption data-placeholder="添加描述" style="width: 2176px; max-width: 100%; text-align: center;">歌单浏览</figcaption>
</figure>
<h3 style="" id="%E6%92%AD%E6%94%BE%E9%98%9F%E5%88%97%E7%AE%A1%E7%90%86">播放队列管理</h3>
<p style="">点击底部控制条右侧的列表图标，打开播放队列。支持拖拽排序、批量删除、快速定位当前播放歌曲。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fraw.githubusercontent.com%2FXCQ0607%2Flxserver%2Fmain%2Fmd%2Fplaylist.png&amp;size=m" alt="播放队列" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">播放队列</figcaption>
</figure>
<h3 style="" id="%E6%B7%B1%E8%89%B2%E6%A8%A1%E5%BC%8F">深色模式</h3>
<p style="">播放器支持深色模式，在设置里可以切换。</p>
<hr>
<h2 style="" id="%E9%9F%B3%E6%BA%90%E9%85%8D%E7%BD%AE%EF%BC%9A%E4%B8%8D%E9%85%8D%E7%BD%AE%E5%B0%B1%E6%90%9C%E4%B8%8D%E5%88%B0%E6%AD%8C">音源配置：不配置就搜不到歌</h2>
<p style="">这是最关键的一步，很多人部署完发现搜不到歌，就是这里没弄。</p>
<p style="">这个项目本身不带音源，需要手动导入第三方音源脚本。根据项目文档，音源导入在管理后台的「系统配置」→「自定义源管理」里操作。</p>
<h3 style="" id="%E8%8E%B7%E5%8F%96%E9%9F%B3%E6%BA%90">获取音源</h3>
<p style="">音源是 .js​ 格式的脚本文件，通常由社区维护。获取渠道：</p>
<ul>
 <li>
  <p style="">GitHub 上搜索 <code>lx-music-source</code>​ 相关仓库</p>
 </li>
 <li>
  <p style="">各种 NAS 交流群、技术论坛</p>
 </li>
</ul>
<h3 style="" id="%E5%AF%BC%E5%85%A5%E9%9F%B3%E6%BA%90">导入音源</h3>
<p style="">进管理后台 →「系统配置」→「自定义源管理」，有两种导入方式：</p>
<p style="">方式一：上传本地文件</p>
<ol>
 <li>
  <p style="">点击「上传脚本文件」</p>
 </li>
 <li>
  <p style="">选择你下载好的 .js​ 音源文件</p>
 </li>
 <li>
  <p style="">上传完成</p>
 </li>
</ol>
<p style="">方式二：从 URL 导入</p>
<ol>
 <li>
  <p style="">点击「从 URL 导入」</p>
 </li>
 <li>
  <p style="">输入音源脚本的远程地址</p>
 </li>
 <li>
  <p style="">点「开始导入」</p>
 </li>
</ol>
<p style="">导入成功后，列表里会显示音源信息：名称、作者、大小、版本号，以及支持的平台标签（比如「网易」「QQ」「酷狗」「酷我」「咪咕」）。</p>
<h3 style="" id="%E5%90%AF%E7%94%A8%E9%9F%B3%E6%BA%90">启用音源</h3>
<p style="">重点：导入后默认是「已禁用」状态！</p>
<p style="">必须点击状态按钮，把它改成「已启用」。很多人部署完搜不到歌，就是因为漏了这一步。</p>
<p style="">启用后，回到播放器页面，搜索功能就正常了。</p>
<h3 style="" id="%E9%9F%B3%E6%BA%90%E5%A4%87%E4%BB%BD">音源备份</h3>
<p style="">这是我常用的音源，是其他网友分享的，大家需要就自取：</p>
<ul>
 <li>
  <p style="">百度网盘：https://pan.baidu.com/s/1vsRmTWIEuVDJrzWsPVFxUA?pwd=2mmd</p>
 </li>
 <li>
  <p style="">UC 网盘：https://drive.uc.cn/s/23ceaa898d9a4?public=1</p>
 </li>
</ul>
<blockquote>
 <p style="">音源脚本由第三方维护，可能会失效。如果某天搜不到歌，大概率是音源挂了，需要换新的。</p>
</blockquote>
<hr>
<h2 style="" id="%E6%AD%8C%E5%8D%95%E5%90%8C%E6%AD%A5%EF%BC%9A%E6%89%93%E9%80%9A%E6%A1%8C%E9%9D%A2%E7%AB%AF%E5%92%8C%E7%A7%BB%E5%8A%A8%E7%AB%AF">歌单同步：打通桌面端和移动端</h2>
<p style="">这个项目本质上是 LX Music 的同步服务端。如果你已经在用 LX Music 桌面版或移动版，可以把这个服务端作为同步后端，实现多设备歌单统一。</p>
<h3 style="" id="%E6%A1%8C%E9%9D%A2%E7%AB%AF%E8%AE%BE%E7%BD%AE">桌面端设置</h3>
<ol>
 <li>
  <p style="">打开 LX Music 桌面版</p>
 </li>
 <li>
  <p style="">进「设置」→「同步」</p>
 </li>
 <li>
  <p style="">开启「启用同步」</p>
 </li>
 <li>
  <p style="">同步服务地址填 http://群晖IP:9527​</p>
 </li>
 <li>
  <p style="">用户名和密码填管理后台里创建的用户</p>
 </li>
 <li>
  <p style="">点击「连接测试」，成功后会自动同步</p>
 </li>
</ol>
<h3 style="" id="%E7%A7%BB%E5%8A%A8%E7%AB%AF%E8%AE%BE%E7%BD%AE">移动端设置</h3>
<ol>
 <li>
  <p style="">打开 LX Music 移动版</p>
 </li>
 <li>
  <p style="">进「设置」→「同步」</p>
 </li>
 <li>
  <p style="">同样填群晖地址和用户名密码</p>
 </li>
 <li>
  <p style="">连接成功后数据自动同步</p>
 </li>
</ol>
<h3 style="" id="%E7%BD%91%E9%A1%B5%E7%AB%AF%E5%90%8C%E6%AD%A5">网页端同步</h3>
<p style="">网页播放器本身也支持登录。用同步用户登录后，收藏的歌单会存在群晖的 data​ 目录里。你在电脑浏览器上收藏的歌，手机浏览器打开同一个地址登录后也能看到。</p>
<hr>
<h2 style="" id="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5">常见问题排查</h2>
<h3 style="" id="1.-%E5%AE%B9%E5%99%A8%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5%EF%BC%8C%E6%97%A5%E5%BF%97%E6%8A%A5%E7%AB%AF%E5%8F%A3%E5%86%B2%E7%AA%81">1. 容器启动失败，日志报端口冲突</h3>
<p style="">现象：<code>docker-compose up -d</code>​ 后容器起不来，日志里有 <code>bind: address already in use​</code></p>
<p style="">原因：群晖上 <code>9527</code> 端口被其他服务占用了。</p>
<p style="">解决：修改 <code>docker-compose.yml​</code> 里的端口映射，把左边的本地端口改成别的，比如 <code>19527</code>​：</p>
<pre><code class="language-yaml">ports:
  - "19527:9527"</code></pre>
<p style="">然后访问 http://群晖IP:19527​。</p>
<h3 style="" id="2.-%E5%8D%B7%E6%98%A0%E5%B0%84%E6%8A%A5%E6%9D%83%E9%99%90%E9%94%99%E8%AF%AF">2. 卷映射报权限错误</h3>
<p style="">现象：容器日志里出现 <code>EACCES: permission denied</code>​</p>
<p style="">原因：群晖共享文件夹权限不足，容器无法读写映射的目录。</p>
<p style="">解决：</p>
<ol>
 <li>
  <p style="">打开「File Station」</p>
 </li>
 <li>
  <p style="">右键 docker/lx-music​ 文件夹 →「属性」→「权限」</p>
 </li>
 <li>
  <p style="">点击「新增」，用户选 <code>Everyone</code>​，勾选「读取」和「写入」</p>
 </li>
 <li>
  <p style="">勾选「应用到这个文件夹、子文件夹和文件」</p>
 </li>
 <li>
  <p style="">保存后重启容器</p>
 </li>
</ol>
<h3 style="" id="3.-%E6%90%9C%E4%B8%8D%E5%88%B0%E6%AD%8C">3. 搜不到歌</h3>
<p style="">现象：播放器里搜索没有任何结果</p>
<p style="">排查步骤：</p>
<ol>
 <li>
  <p style="">确认音源已导入（后台 → 系统配置 → 自定义源管理）</p>
 </li>
 <li>
  <p style="">确认音源状态是「已启用」，不是「已禁用」</p>
 </li>
 <li>
  <p style="">确认当前选择的音源平台支持你要搜的歌</p>
 </li>
 <li>
  <p style="">如果以上都没问题，可能是音源脚本失效了，需要换源</p>
 </li>
</ol>
<h3 style="" id="4.-%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE%E4%B8%8D%E4%BA%86">4. 外网访问不了</h3>
<p style="">现象：内网能打开，外网用域名或公网 IP 访问不了</p>
<p style="">排查步骤：</p>
<ol>
 <li>
  <p style="">确认路由器做了端口转发，把外部端口映射到群晖的 9527</p>
 </li>
 <li>
  <p style="">确认群晖防火墙放行了这个端口（控制面板 → 安全性 → 防火墙）</p>
 </li>
 <li>
  <p style="">如果用了反向代理，检查代理规则是否正确</p>
 </li>
</ol>
<h3 style="" id="5.-%E5%AF%86%E7%A0%81%E5%BF%98%E4%BA%86%E6%80%8E%E4%B9%88%E5%8A%9E">5. 密码忘了怎么办</h3>
<p style="">如果忘了管理后台密码，直接修改 docker-compose.yml​ 里的 FRONTEND_PASSWORD​，然后重启容器：</p>
<pre><code class="language-bash">cd /volume1/docker/lx-music
docker-compose down
docker-compose up -d</code></pre>
<hr>
<h2 style="" id="%E5%A4%96%E7%BD%91%E8%AE%BF%E9%97%AE%E4%B8%8E-https%EF%BC%88%E8%BF%9B%E9%98%B6%EF%BC%89">外网访问与 HTTPS（进阶）</h2>
<p style="">如果只想在内网用，上面的配置已经够用了。但如果想在外面也能听歌，建议做以下配置。</p>
<h3 style="" id="%E6%96%B9%E6%A1%88%E4%B8%80%EF%BC%9A%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%EF%BC%88%E7%AE%80%E5%8D%95%E4%BD%86%E4%B8%8D%E5%AE%89%E5%85%A8%EF%BC%89">方案一：端口转发（简单但不安全）</h3>
<p style="">在路由器里做端口转发，把外网的某个端口（比如 9527）映射到群晖内网的 9527。然后外网用 http://公网IP:9527​ 访问。</p>
<p style="">缺点：HTTP 明文传输，密码容易被截获。只适合临时用用。</p>
<h3 style="" id="%E6%96%B9%E6%A1%88%E4%BA%8C%EF%BC%9A%E7%BE%A4%E6%99%96%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86-%2B-https%EF%BC%88%E6%8E%A8%E8%8D%90%EF%BC%89">方案二：群晖反向代理 + HTTPS（推荐）</h3>
<p style="">群晖自带反向代理和 Let's Encrypt 证书，配置如下：</p>
<ol>
 <li>
  <p style="">进「控制面板」→「登录门户」→「高级」→「反向代理服务器」</p>
 </li>
 <li>
  <p style="">点击「新增」</p>
 </li>
 <li>
  <p style="">来源设置：</p>
  <ul>
   <li>
    <p style="">协议：<code>HTTPS</code></p>
   </li>
   <li>
    <p style="">主机名：<code>music.yourdomain.com</code>​（你自己的域名）</p>
   </li>
   <li>
    <p style="">端口：443​（443被封换其他的）</p>
   </li>
  </ul>
 </li>
 <li>
  <p style="">目的地设置：</p>
  <ul>
   <li>
    <p style="">协议：<code>HTTP</code></p>
   </li>
   <li>
    <p style="">主机名：<code>localhost​</code></p>
   </li>
   <li>
    <p style="">端口：<code>9527​</code></p>
   </li>
  </ul>
 </li>
 <li>
  <p style="">保存</p>
 </li>
</ol>
<p style="">然后去「控制面板」→「安全性」→「证书」，申请 <code>Let's Encrypt</code> 证书，绑定到 <code>music.yourdomain.com</code>​。</p>
<p style="">配置完成后，外网用 <code>https://music.yourdomain.com:端口号</code>​ 访问，安全且方便。</p>
<hr>
<h2 style="" id="%E6%97%A5%E5%B8%B8%E7%BB%B4%E6%8A%A4">日常维护</h2>
<h3 style="" id="%E6%9B%B4%E6%96%B0%E9%95%9C%E5%83%8F">更新镜像</h3>
<p style="">作者可能会发布新版本，更新方法：</p>
<pre><code class="language-bash">cd /volume1/docker/lx-music
docker-compose pull
docker-compose up -d</code></pre>
<p style="">数据存在卷映射的目录里，更新不会丢失。</p>
<h3 style="" id="%E5%A4%87%E4%BB%BD%E6%95%B0%E6%8D%AE">备份数据</h3>
<p style="">定期把 /docker/lx-music/data/​ 目录备份一下，里面存着用户数据和歌单。可以用群晖的「Hyper Backup」套件自动备份到另一块硬盘或者云端。</p>
<h3 style="" id="%E6%9F%A5%E7%9C%8B%E8%B5%84%E6%BA%90%E5%8D%A0%E7%94%A8">查看资源占用</h3>
<p style="">进 Container Manager →「容器」→ 选中 lx-music-server​，可以看到 CPU 和内存占用。根据项目文档，这个服务资源占用很低。</p>
<hr>
<h2 style="" id="%E5%86%99%E5%9C%A8%E6%9C%80%E5%90%8E">写在最后</h2>
<p style="">这个项目对 NAS 用户来说挺实用的，部署简单，资源占用低，关键是打通了多设备的听歌体验。不用在手机上装一堆音乐 App，打开浏览器就能搞定。</p>
<p style="">适合人群：</p>
<ul>
 <li>
  <p style="">有群晖或其他 NAS，愿意折腾的</p>
 </li>
 <li>
  <p style="">不想装太多 App，喜欢网页端轻量体验的</p>
 </li>
 <li>
  <p style="">希望歌单数据自己掌控，不依赖第三方平台的</p>
 </li>
</ul>
<p style="">不适合：</p>
<ul>
 <li>
  <p style="">追求极致无损音质的发烧友（网页播放器的音质取决于音源质量）</p>
 </li>
 <li>
  <p style="">完全不想动手配置的懒人</p>
 </li>
</ul>
<p style="">如果部署过程中遇到问题，可以先对照上面的「常见问题排查」部分自查。还是搞不定的话，建议去项目 GitHub 的 Issues 区看看。</p>
<hr>
<h2 style="" id="%E7%9B%B8%E5%85%B3%E9%93%BE%E6%8E%A5">相关链接</h2>
<p style=""><strong>本项目地址</strong>：</p>
<hyperlink-card target="_blank" href="https://github.com/xcq0607/lxserver" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="GitHub - XCQ0607/lxserver: LX Music 数据同步服务端，同时支持了部分lx-music-desktop的网页端实现。 · GitHub" custom-description="LX Music 数据同步服务端，同时支持了部分lx-music-desktop的网页端实现。. Contribute to XCQ0607/lxserver development by creating an account on GitHub." custom-image="https://opengraph.githubassets.com/66512d23798fd3f9ead2ea369dd50f1aa9edf1b1ba98c49a65b2f6448e9cfc6d/XCQ0607/lxserver"><a href="https://github.com/xcq0607/lxserver" target="_blank">https://github.com/xcq0607/lxserver</a></hyperlink-card>
<p style=""><strong>桌面客户端</strong>：</p>
<hyperlink-card target="_blank" href="https://github.com/lyswhut/lx-music-desktop" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="GitHub - lyswhut/lx-music-desktop: 一个基于 Electron 的音乐软件 · GitHub" custom-description="一个基于 Electron 的音乐软件. Contribute to lyswhut/lx-music-desktop development by creating an account on GitHub." custom-image="https://opengraph.githubassets.com/a77d029c1b67e3cd8c7a5683f50168640d82b18e140d58f6ff87e854234c8cc0/lyswhut/lx-music-desktop"><a href="https://github.com/lyswhut/lx-music-desktop" target="_blank">https://github.com/lyswhut/lx-music-desktop</a></hyperlink-card>
<p style=""><strong>移动客户端</strong>：</p>
<hyperlink-card target="_blank" href="https://github.com/lyswhut/lx-music-mobile" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="GitHub - lyswhut/lx-music-mobile: 一个基于 React native 开发的音乐软件 · GitHub" custom-description="一个基于 React native 开发的音乐软件. Contribute to lyswhut/lx-music-mobile development by creating an account on GitHub." custom-image="https://opengraph.githubassets.com/1f33c85fb8ab01f4a5d6c0ecc0a6956bac233dc12fc4523cb6675fff4fb14484/lyswhut/lx-music-mobile"><a href="https://github.com/lyswhut/lx-music-mobile" target="_blank">https://github.com/lyswhut/lx-music-mobile</a></hyperlink-card>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/synology-lx-music-server-browser-player-guide</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fraw.githubusercontent.com%2FXCQ0607%2Flxserver%2Fmain%2Fmd%2Fplayer.png&amp;size=m" type="image/jpeg" length="1417618"/><category>技巧</category><category>分享</category><pubDate>Wed, 20 May 2026 11:46:23 GMT</pubDate></item><item><title><![CDATA[500道Word题库太痛苦？于是我写了个智能学习平台]]></title><link>https://wuqishi.com/archives/ai-powered-safety-training-platform-development</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=500%E9%81%93Word%E9%A2%98%E5%BA%93%E5%A4%AA%E7%97%9B%E8%8B%A6%EF%BC%9F%E4%BA%8E%E6%98%AF%E6%88%91%E5%86%99%E4%BA%86%E4%B8%AA%E6%99%BA%E8%83%BD%E5%AD%A6%E4%B9%A0%E5%B9%B3%E5%8F%B0&amp;url=/archives/ai-powered-safety-training-platform-development" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E4%B8%80%E3%80%81%E4%BA%8B%E6%83%85%E6%98%AF%E8%BF%99%E6%A0%B7%E7%9A%84">一、事情是这样的</h2>
<p style="">公司突然通知：“要考安全生产，题库发群里了，大家自己看。”</p>
<p style="">打开那个Word文档，我沉默了。</p>
<p style="">500道题，密密麻麻挤在一起。没有分类，没有标签，翻几页就忘了前面看过什么。错题得自己拿本子记，学到哪了全凭感觉。</p>
<p style="">我试着看了半小时，眼睛酸，脑子乱，完全不知道看了多少、还剩多少。</p>
<p style="">"这不行，得想个办法。"——我的第一反应不是"硬看"，而是"能不能做个工具？"</p>
<p style="">于是接下来几个周末，我折腾出了这个学习平台。</p>
<figure data-content-type="image" style="display: flex; flex-direction: column;">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779074380684.avif&amp;size=m" alt="前后对比图" width="1024px">
 <figcaption data-placeholder="添加描述" style="width: 1024px; max-width: 100%; text-align: center;">前后对比图</figcaption>
</figure>
<hr>
<h2 style="" id="%E4%BA%8C%E3%80%81%E6%88%91%E9%81%87%E5%88%B0%E4%BA%86%E5%93%AA%E4%BA%9B%E9%97%AE%E9%A2%98">二、我遇到了哪些问题</h2>
<h3 style="" id="%E9%97%AE%E9%A2%981%EF%BC%9A%E8%AE%B0%E4%BD%8F%E7%AD%94%E6%A1%88%E4%BD%8D%E7%BD%AE%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9F%A5%E8%AF%86%E7%82%B9">问题1：记住答案位置，而不是知识点</h3>
<p style="">按顺序做题，做着做着发现：我不是真会，只是记住了"这题选C"。</p>
<p style="">我的解法：每次打开，题目顺序随机；同一道题，选项顺序也随机。</p>
<pre><code class="language-javascript">// 题目顺序打乱
const questionOrder = Utils.shuffleArray([...Array(totalQuestions).keys()]);

// 选项顺序打乱，正确答案位置跟着变
const shuffledOptions = Utils.shuffleArray([...originalOptions]);
const shuffledAnswer = shuffledOptions.indexOf(originalAnswer);</code></pre>
<p style="">这样一来，同一道题每次出现都不一样。你不能靠记位置，只能真懂。</p>
<h3 style="" id="%E9%97%AE%E9%A2%982%EF%BC%9A%E8%BF%9B%E5%BA%A6%E6%80%BB%E4%B8%A2">问题2：进度总丢</h3>
<p style="">Word文档没有记忆功能。今天看到第50题，明天打开，得从头翻。</p>
<p style="">我的解法：自动保存学习进度，下次打开接着来。</p>
<pre><code class="language-javascript">// 存到本地
studySession: {
    questionIds: [],      // 题目列表
    currentIndex: 0,      // 做到哪题了
    answeredIds: [],      // 哪些题已经答过
    questionStates: {}    // 每道题的答题状态
}</code></pre>
<p style="">关掉浏览器、重启电脑，回来还能继续。不用翻，不用找，打开就是上次离开的地方。</p>
<h3 style="" id="%E9%97%AE%E9%A2%983%EF%BC%9A%E4%B8%8A%E4%B8%80%E9%A2%98%E4%B8%8B%E4%B8%80%E9%A2%98%EF%BC%8C%E8%B7%B3%E6%9D%A5%E8%B7%B3%E5%8E%BB">问题3：上一题下一题，跳来跳去</h3>
<p style="">点"上一题"回去看看，再点"下一题"，结果跳到一道全新的题。刚才那道去哪了？</p>
<p style="">我的解法：用数组记录浏览历史，像浏览器的前进后退。</p>
<p style="">图片生成词：简洁的流程图，显示浏览历史栈的工作原理，箭头指示前进后退，清晰的步骤标注，蓝色和白色主调，技术文档风格</p>
<pre><code>浏览记录：[第1题, 第5题, 第3题]
                    ↑
                  当前在这里

点"上一题" → 回到第5题
点"下一题" → 回到第3题（不是新题！）

只有回到最末尾，点"下一题"才会出新题</code></pre>
<p style="">这样导航就顺了。想回顾就回顾，回顾完继续往前走。</p>
<h3 style="" id="%E9%97%AE%E9%A2%984%EF%BC%9A%E6%89%8B%E6%9C%BA%E4%B8%8A%E7%9C%8B%E5%A4%AA%E9%9A%BE%E5%8F%97">问题4：手机上看太难受</h3>
<p style="">用手机做题，各种按钮、进度条占满屏幕，题目被挤到只剩一点点。</p>
<p style="">我的解法：压缩顶部空间，把进度直接放在题号后面。</p>
<p style="">之前：</p>
<ul>
 <li>
  <p style="">第一行：题型、分类、题号</p>
 </li>
 <li>
  <p style="">第二行：筛选控件</p>
 </li>
 <li>
  <p style="">第三行：进度条 + 百分比</p>
 </li>
</ul>
<p style="">现在：</p>
<ul>
 <li>
  <p style="">第一行：题型、分类、第9/58题 (14%)、筛选控件</p>
 </li>
 <li>
  <p style="">没了</p>
 </li>
</ul>
<p style="">答题区域一下子大了不少。手机上按钮也改成垂直排列，不容易点错。</p>
<hr>
<h2 style="" id="%E4%B8%89%E3%80%81%E6%8A%80%E6%9C%AF%E6%96%B9%E9%9D%A2%E7%9A%84%E4%B8%80%E4%BA%9B%E4%BA%8B">三、技术方面的一些事</h2>
<h3 style="" id="%E7%BA%AF%E5%89%8D%E7%AB%AF%EF%BC%8C%E9%9B%B6%E5%90%8E%E7%AB%AF">纯前端，零后端</h3>
<p style="">整个项目：</p>
<ul>
 <li>
  <p style="">一个HTML文件</p>
 </li>
 <li>
  <p style="">几个JS文件</p>
 </li>
 <li>
  <p style="">没有服务器</p>
 </li>
 <li>
  <p style="">没有数据库</p>
 </li>
 <li>
  <p style="">数据存在浏览器本地</p>
 </li>
</ul>
<p style="">部署超简单，丢到GitHub Pages就行。</p>
<h3 style="" id="%E6%A8%A1%E5%9D%97%E5%8C%96">模块化</h3>
<pre><code>js/
├── app.js          // 页面切换、初始化
├── study.js        // 学习逻辑（最复杂）
├── exam.js         // 考试模块
├── state.js        // 状态管理
├── storage.js      // 本地存储
├── ui.js           // 界面控制
└── utils.js        // 工具函数
</code></pre>
<p style="">每个文件干一件事，改起来不头疼。</p>
<h3 style="" id="ai%E5%B8%AE%E4%BA%86%E5%A4%A7%E5%BF%99">AI帮了大忙</h3>
<p style="">说实话，没有AI辅助，我不可能在几个周末做完。</p>
<ul>
 <li>
  <p style="">写代码：复杂逻辑先让AI生成骨架，我再改</p>
 </li>
 <li>
  <p style="">找Bug：出错直接把代码和报错给AI，省得自己瞪眼看</p>
 </li>
 <li>
  <p style="">查文档：不用翻MDN，直接问AI</p>
 </li>
</ul>
<p style="">AI不是替代我，是让我更快。就像用计算器，你还是得知道怎么算。</p>
<hr>
<h2 style="" id="%E5%9B%9B%E3%80%81%E5%8A%9F%E8%83%BD%E6%B8%85%E5%8D%95">四、功能清单</h2>
<p style=""><strong>学习计划</strong></p>
<ul data-type="taskList">
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">分三个阶段：基础→强化→冲刺</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">完成一阶段才能解锁下一阶段</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">记录连续学习天数</p>
  </div></li>
</ul>
<p style=""><strong>题库学习</strong></p>
<ul data-type="taskList">
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">500+题，覆盖法律、法规、国标</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">题目随机出现</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">选项随机排列</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">按类别、题型筛选</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">自动保存进度</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">上一题/下一题导航</p>
  </div></li>
</ul>
<p style=""><strong>习题本</strong></p>
<ul data-type="taskList">
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">错题自动收集</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">收藏夹</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">错题重做</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">批量清空</p>
  </div></li>
</ul>
<p style="">模拟考试</p>
<ul data-type="taskList">
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">60分钟限时</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">60道题</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">100分制，60分及格</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">考完自动算分</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">错题自动进习题本</p>
  </div></li>
</ul>
<p style="">体验优化</p>
<ul data-type="taskList">
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">手机、平板、电脑都能用</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">提示消息从中间上方弹出，不挡题目</p>
  </div></li>
 <li data-checked="true" data-type="taskItem"><label><input type="checkbox" checked><span></span></label>
  <div>
   <p style="">答题区域尽量大</p>
  </div></li>
</ul>
<hr>
<h2 style="" id="%E4%BA%94%E3%80%81%E8%B8%A9%E8%BF%87%E7%9A%84%E5%9D%91">五、踩过的坑</h2>
<h3 style="" id="%E5%9D%911%EF%BC%9A%E6%96%B0%E5%AD%A6%E4%B9%A0%E7%BB%A7%E6%89%BF%E4%BA%86%E6%97%A7%E7%8A%B6%E6%80%81">坑1：新学习继承了旧状态</h3>
<p style="">现象：点开始新学习，第一题直接显示答案。</p>
<p style="">原因：questionStates​没清空，上次学习的答题状态还在。</p>
<p style="">修复：初始化新会话时，questionStates​必须设为空对象。</p>
<pre><code class="language-javascript">AppState.studySession = {
    // ...其他字段
    questionStates: {}  // 从这里开始，别继承旧的
};</code></pre>
<h3 style="" id="%E5%9D%912%EF%BC%9A%E6%9C%80%E5%90%8E%E4%B8%80%E9%A2%98%E8%BF%9B%E5%BA%A6%E4%B8%8D%E6%BB%A1">坑2：最后一题进度不满</h3>
<p style="">现象：500题全做完了，进度显示99%。</p>
<p style="">原因：更新进度的函数在记录答案之前执行了。</p>
<p style="">修复：调整执行顺序，先记录答案，再更新进度。</p>
<h3 style="" id="%E5%9D%913%EF%BC%9A%E9%9A%8F%E6%9C%BA%E5%88%B0%E9%87%8D%E5%A4%8D%E9%A2%98%E7%9B%AE">坑3：随机到重复题目</h3>
<p style="">现象：同一道题连续出现好几次。</p>
<p style="">原因：纯随机，没有排除已答题。</p>
<p style="">修复：只从未答题里随机。</p>
<pre><code class="language-javascript">const unanswered = allQuestions.filter(q =&gt; !answeredIds.includes(q.id));
return unanswered[Math.floor(Math.random() * unanswered.length)];</code></pre>
<hr>
<h2 style="" id="%E5%85%AD%E3%80%81%E4%BA%AE%E7%82%B9%EF%BC%9A%E7%AD%94%E6%A1%88%E8%A7%A3%E6%9E%90%E5%92%8C%E8%AE%B0%E5%BF%86%E6%8A%80%E5%B7%A7">六、亮点：答案解析和记忆技巧</h2>
<p style="">本身题目只有题干和答案，这多不方便记忆啊，于是我用kimi，花了好长时间调试，然后给每道题都加了答案解析和记忆技巧。</p>
<p style=""><strong>答案解析：</strong>题目出自哪条安全生产的法律法规，做到有法可依。</p>
<p style=""><strong>记忆技巧：</strong>有个口诀（顺口溜），帮助记忆。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779075443079.avif&amp;size=m" alt="答案解析和记忆技巧" width="1024px">
 <figcaption data-placeholder="添加描述" style="width: 1024px; max-width: 100%; text-align: center;">答案解析和记忆技巧</figcaption>
</figure>
<h2 style="" id="%E2%80%8B%E4%B8%83%E3%80%81%E8%BF%98%E6%9C%89%E4%BB%80%E4%B9%88%E6%83%B3%E5%81%9A">​七、还有什么想做</h2>
<ul>
 <li>
  <p style=""><s>成就系统（连续学习7天勋章之类的）</s></p>
 </li>
 <li>
  <p style=""><s>学习数据统计（哪类题错得多）</s></p>
 </li>
 <li>
  <p style=""><s>支持导入Excel题库</s></p>
 </li>
 <li>
  <p style=""><s>同事间排行榜</s></p>
 </li>
 <li>
  <p style=""><s>离线使用（PWA）</s></p>
 </li>
</ul>
<p style="">先这样吧，考过的话，就考过了...</p>
<hr>
<h2 style="" id="%E5%85%AB%E3%80%81%E6%9C%80%E5%90%8E%E8%AF%B4%E4%B8%A4%E5%8F%A5">八、最后说两句</h2>
<p style="">做这个工具，我最大的感受是：</p>
<p style="">AI真的能提高效率。 几个周末做完一个完整应用，以前不敢想。但AI只是工具，关键还是得有想法、知道要解决什么问题。</p>
<p style="">用户体验比技术重要。 从Word到网页，技术上没什么难的，但体验差太多了。题目随机、进度保存、手机适配，这些才是让人愿意用的原因。</p>
<p style="">简单最好。 纯前端、无后端、零依赖，部署和维护都省心。</p>
<hr>
<h2 style="" id="%E7%9B%B8%E5%85%B3%E9%93%BE%E6%8E%A5">相关链接</h2>
<ul>
 <li>
  <p style="">项目源码：</p>
  <hyperlink-card target="_blank" href="https://github.com/NoEggEgg/learning_platform_xinsen" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="GitHub - NoEggEgg/learning_platform_xinsen: 一个基于 Web 的安全生产知识学习平台，帮助用户系统地学习和巩固安全生产相关知识。 · GitHub" custom-description="一个基于 Web 的安全生产知识学习平台，帮助用户系统地学习和巩固安全生产相关知识。. Contribute to NoEggEgg/learning_platform_xinsen development by creating an account on GitHub." custom-image="https://opengraph.githubassets.com/21ccfd0cccb29dbe1db60f9dce864824507cf74249d6901b0a53ea4dafbeeeda/NoEggEgg/learning_platform_xinsen"><a href="https://github.com/NoEggEgg/learning_platform_xinsen" target="_blank">https://github.com/NoEggEgg/learning_platform_xinsen</a></hyperlink-card>
 </li>
 <li>
  <p style="">在线试用：</p>
  <hyperlink-card target="_blank" href="https://noeggegg.github.io/learning_platform_xinsen/" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="安全生产题库 | 鑫森科技" custom-image="https://wuqishi.com/favicon.svg"><a href="https://noeggegg.github.io/learning_platform_xinsen/" target="_blank">https://noeggegg.github.io/learning_platform_xinsen/</a></hyperlink-card>
 </li>
</ul>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/ai-powered-safety-training-platform-development</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2F1779074380684.avif&amp;size=m" type="image/jpeg" length="73406"/><category>技巧</category><category>分享</category><pubDate>Mon, 18 May 2026 03:53:40 GMT</pubDate></item><item><title><![CDATA[别用一个人的奔跑，耗尽两个人的余生——《你凭什么认为我会一直喜欢你呢》]]></title><link>https://wuqishi.com/archives/love-is-mutual-effort-not-self-sacrifice</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%88%AB%E7%94%A8%E4%B8%80%E4%B8%AA%E4%BA%BA%E7%9A%84%E5%A5%94%E8%B7%91%EF%BC%8C%E8%80%97%E5%B0%BD%E4%B8%A4%E4%B8%AA%E4%BA%BA%E7%9A%84%E4%BD%99%E7%94%9F%E2%80%94%E2%80%94%E3%80%8A%E4%BD%A0%E5%87%AD%E4%BB%80%E4%B9%88%E8%AE%A4%E4%B8%BA%E6%88%91%E4%BC%9A%E4%B8%80%E7%9B%B4%E5%96%9C%E6%AC%A2%E4%BD%A0%E5%91%A2%E3%80%8B&amp;url=/archives/love-is-mutual-effort-not-self-sacrifice" width="1" height="1" alt="" style="opacity:0;">
<h4 style="" id="%E9%82%A3%E4%B8%80%E5%88%BB%EF%BC%8C%E9%A3%8E%E5%81%9C%E4%BA%86">那一刻，风停了</h4>
<p style="">这两天在看漫剧《你凭什么认为我会一直喜欢你呢》，蛮有感触的。</p>
<p style="">里面有一个镜头始终挥之不去：</p>
<p style="">男主在追求了女主长达7年，第二次表白时，等来的依然是对方毫不留情的拒绝。享受着男主的好，给不了回应却又舍不得男主。</p>
<p style="">那一刻，男主没有声嘶力竭的争吵，也没有一蹶不振地沉沦，他只是—不爱了。</p>
<p style="">剧中男主说过一句话，印象深刻：</p>
<p style=""><strong><em>不平等的不是爱情，是一方的得寸进尺和另一方的自我感动。</em></strong></p>
<p style="">很多人在这部剧中看到了自己的影子。我们曾像信徒一样守着一份不对等的感情，以为只要自己做得再多一点，就能让荒原长出玫瑰。可到头来才发现，在这个世界上，最难叫醒的不是装睡的人，而是那个沉溺于牺牲、不肯放过自己的自己。</p>
<p style="">于是，这句反问——“你凭什么认为我会一直喜欢你呢？”——不再只是一句台词，它更像是一个在悬崖边及时止步的人，对自己人生的深情告白。</p>
<hr>
<h4 style="" id="%E4%B8%80%E3%80%81-%E6%89%80%E8%B0%93%E7%9A%84%E6%B7%B1%E6%83%85%EF%BC%8C%E8%8B%A5%E6%97%A0%E5%9B%9E%E5%93%8D%EF%BC%8C%E4%BE%BF%E5%8F%AA%E6%98%AF%E8%B7%AF%E8%BF%87%E7%9A%84%E9%A3%8E">一、 所谓的深情，若无回响，便只是路过的风</h4>
<p style="">杨绛先生曾说：“人间不会有单纯的快乐，快乐总带着烦恼。”在爱情里，这份烦恼往往源于“期待的错位”。</p>
<p style="">那些看似不求回报的付出，内核里其实都藏着一颗渴望被看见、被珍视的心。当一方习惯了索取，爱就变成了一场单向的布施。在剧中，男主每一次的“不求回报”地好，都像是在往一个漏风的口袋里装金子，口袋永远装不满，而他却渐渐千疮百孔。他以为那些深情与付出，但在对方眼里，那不过是廉价的、不需要支付成本的便利。</p>
<p style="">即使后来她醒悟了，知道珍惜了，可是，已经晚了。</p>
<p style="">好的关系，是当他在风雨中为你撑伞时，你也会下意识地往他的方向靠拢。</p>
<p style=""><strong><em>所有的深情，都需要一个温暖的落脚点。如果不被回应，那付出就变成了一场自虐式的透支。</em></strong></p>
<p style=""><strong><em>我们要懂得，那个愿意为你弯腰系鞋带的人，也同样期待着你在过马路时，能紧紧回握他的手。</em></strong></p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FJqSXzpHI5DI.avif&amp;size=m" alt="伞下相握的手" title="伞下相握的手" width="1024px">
</figure>
<hr>
<h4 style="" id="%E4%BA%8C%E3%80%81-%E5%9C%A8%E8%BF%99%E5%9C%BA%E4%B8%8D%E5%8F%AF%E6%8E%A7%E7%9A%84%E5%86%92%E9%99%A9%E9%87%8C%EF%BC%8C%E5%81%9A%E5%BD%BC%E6%AD%A4%E7%9A%84%E2%80%9C%E5%AE%89%E5%85%A8%E7%BB%B3%E2%80%9D">二、 在这场不可控的冒险里，做彼此的“安全绳”</h4>
<p style="">三毛曾写道：“爱如果不落到穿衣、吃饭、睡觉、数钱这些实实在在的生活中去，是不容易长久的。”</p>
<p style="">既然爱情是一场不可控的意外冒险，充满了个性的磨合与生活的琐碎，那我们就不能只靠满腔孤勇。双向奔赴，其实就是给这场冒险拴上一根“安全绳”。</p>
<p style="">所谓双向，不是你给我买一件礼物，我回你一份红包，而是在漫长的岁月里，双方都有那种“唯恐对方受委屈”的觉悟。如果只有一个人在拼命拉绳子，绳子迟早会断，甚至会勒伤那个最用力的人。</p>
<p style=""><strong><em>只有双方都用力，才能在翻山越岭时感受到对方的存在。这种坚定，是在我最疲惫、想要放弃整个世界的时候，知道回头就能撞进你的怀里；是在你最迷茫、怀疑自我价值的时候，我愿意收起我的羽翼，在每一个平凡的清晨为你递上一杯温热的咖啡。</em></strong></p>
<hr>
<h4 style="" id="%E4%B8%89%E3%80%81-%E6%9C%80%E5%A5%BD%E7%9A%84%E5%A7%BF%E6%80%81%EF%BC%8C%E6%98%AF%E4%B8%A4%E4%B8%AA%E7%81%B5%E9%AD%82%E7%9A%84%E5%B9%B6%E8%82%A9%E5%90%8C%E8%A1%8C">三、 最好的姿态，是两个灵魂的并肩同行</h4>
<p style="">舒婷在《致橡树》里写下了关于爱情最美的姿态：“我必须是你近旁的一株木棉，作为树的形象和你站在一起。”</p>
<p style="">这便是最高级的双向奔赴——我们不是在泥潭里互相拉扯、彼此消耗，而是彼此为了双方在一起而共同努力。</p>
<p style="">不要怕在这场冒险中遇到错的人，因为最美的风景往往不在于终点，而在于那个“因为爱而变得更好”的过程。</p>
<ul>
 <li>
  <p style=""><strong>不用求，而是相扶</strong>： 当你不用为了讨好而小心翼翼，而是双方都为了对方而互相帮助，为了在一起而共同努力。</p>
 </li>
 <li>
  <p style=""><strong>相互照亮</strong>： 最好的爱，是两个本就完整的人，决定一起去看一看这世间更远的风景。你优秀，我也不差；你珍惜，我便加倍。</p>
 </li>
</ul>
<p style="">这种并肩，让原本不可控的冒险，多了一份“万事有你”的笃定。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FifT40YX9xle.avif&amp;size=m" alt="相扶共进" title="相扶共进" width="1024px">
</figure>
<hr>
<h4 style="" id="%E3%80%90%E7%BB%93%E8%AF%AD%EF%BC%9A%E6%84%BF%E6%AF%8F%E4%B8%80%E4%BB%BD%E8%B5%A4%E8%AF%9A%EF%BC%8C%E9%83%BD%E6%9C%89%E5%9B%9E%E5%93%8D%E3%80%91">【结语：愿每一份赤诚，都有回响】</h4>
<p style="">“你凭什么认为我会一直喜欢你呢？”</p>
<p style="">这句台词其实是一声警钟，它提醒我们要时刻审视手中的爱。爱情这场冒险，最美妙的瞬间不是最初的心动，而是历经风霜后，发现对方依然站在触手可及的地方。</p>
<p style="">别让那个爱你的人，在你的冷漠中攒够失望；也别让那个不爱你的人，在你的卑微中肆意妄为。</p>
<p style="">我们要有爱人的赤诚，去体验那份心动；但我们更要有不爱的自由，当温情变成了单方面的消耗，我们要有勇气拍拍身上的灰尘，头也不回地走向下一个黎明。</p>
<p style=""><strong><em>愿每一场爱，都是一场坚定的双向奔赴；愿每一份赤诚，都能在另一个人的心房里，听到最温柔的回响。愿我们在这场冒险的终点，看见的不仅是爱人，更是那个闪闪发光的、更棒的自己。</em></strong></p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FGOr4VT84yhN.avif&amp;size=m" alt="愿每一份赤诚，都有回响" title="愿每一份赤诚，都有回响">
</figure>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/love-is-mutual-effort-not-self-sacrifice</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F05%2FGOr4VT84yhN.avif&amp;size=m" type="image/jpeg" length="99413"/><category>蛋花</category><pubDate>Mon, 11 May 2026 07:03:30 GMT</pubDate></item><item><title><![CDATA[博客评论自动填充新方案：兼容 Vue／React 响应式绑定与跨架构填充逻辑]]></title><link>https://wuqishi.com/archives/universal-blog-comment-filler-pro</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%8D%9A%E5%AE%A2%E8%AF%84%E8%AE%BA%E8%87%AA%E5%8A%A8%E5%A1%AB%E5%85%85%E6%96%B0%E6%96%B9%E6%A1%88%EF%BC%9A%E5%85%BC%E5%AE%B9%20Vue%EF%BC%8FReact%20%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BB%91%E5%AE%9A%E4%B8%8E%E8%B7%A8%E6%9E%B6%E6%9E%84%E5%A1%AB%E5%85%85%E9%80%BB%E8%BE%91&amp;url=/archives/universal-blog-comment-filler-pro" width="1" height="1" alt="" style="opacity:0;">
<p style="">我之前分享过一个书签脚本：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/archives/magical-bookmark-script-to-populate-comments-with-one-click" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://wuqishi.com/archives/magical-bookmark-script-to-populate-comments-with-one-click" target="_blank">https://wuqishi.com/archives/magical-bookmark-script-to-populate-comments-with-one-click</a></hyperlink-card>
<p style="line-height: 1.625">随着最近接触 <span style="color: oklch(0.3289 0.0107 95)"><strong>Halo 2.x</strong></span> 等现代博客系统越来越多，我发现这个老脚本"失灵"了。问题根源不再是简单的"找不到输入框"，而是<span style="color: oklch(0.3289 0.0107 95)"><strong>前端框架的响应式绑定机制</strong></span>——你改了 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">value</span>​，框架并不知道，点击提交时数据就被重置了。</p>
<p style="line-height: 1.625">为了解决这个问题，在跟AI死磕良久，对代码进行了数次重构与逻辑审计之后，最终打磨出了这套<span style="color: oklch(0.3289 0.0107 95)"><strong>全平台通用版</strong></span>。</p>
<p style="line-height: 1.625">走过路过，瞧一瞧看一看了嘿~</p>
<hr>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FLCFKu7LUpIi.avif&amp;size=m" alt="脚本适用平台示意" width="1024px">
 <figcaption data-placeholder="添加描述" style="width: 1024px; max-width: 100%; text-align: center;">脚本适用平台示意</figcaption>
</figure>
<h2 style="" id="%E4%B8%80%E3%80%81-%E6%8E%A2%E7%A9%B6%E4%B8%80%E4%B8%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E8%AF%84%E8%AE%BA%E5%A1%AB%E5%85%85%E8%84%9A%E6%9C%AC%E4%B8%BA%E4%BD%95%E5%A4%B1%E7%81%B5"><strong>一、 探究一下为什么评论填充脚本为何失灵</strong></h2>
<p style="line-height: 1.625">以前的填充脚本在 <span style="color: oklch(0.3289 0.0107 95)"><strong>Typecho</strong></span> 上表现完美，但在 <span style="color: oklch(0.3289 0.0107 95)"><strong>Halo 2.x</strong></span> 或一些现代 <span style="color: oklch(0.3289 0.0107 95)"><strong>Vue/React</strong></span> 主题上，填完后点击提交，信息会瞬间消失，或者啥也没填充上。</p>
<p style="line-height: 1.625"><span style="color: oklch(0.3289 0.0107 95)"><strong>这并不是因为找不到元素，而是"数据绑定"断了。</strong></span> 现代前端框架（如 Vue 3、React）不再通过读取 DOM 的 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">value</span>​ 来获取数据，而是通过监听 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">input</span>​ 事件来同步内部状态 。如果你的脚本只是修改了 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">value</span>​ 而没有触发相应的事件，框架的内部变量依然是空的，提交时自然会"穿帮"。</p>
<p style="line-height: 1.625">Vue 的 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">v-model</span>​ 指令本质上是 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">:value</span>​ 绑定与 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">@input</span>​ 事件监听器的语法糖 。当用户输入时，<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">input</span>​ 事件被触发，框架将 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">event.target.value</span>​ 同步到内部状态；反之，当状态变化时，框架更新 DOM 的 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">value</span>​。但​<span style="color: oklch(0.3289 0.0107 95)"><strong>如果通过脚本直接修改</strong></span> <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px"><strong>value</strong></span>​ <span style="color: oklch(0.3289 0.0107 95)"><strong>而不派发事件，框架的监听器永远不会被触发</strong></span>​，导致状态与 DOM 脱节。</p>
<h3 style="" id="%E5%90%84%E5%B9%B3%E5%8F%B0%E6%9E%B6%E6%9E%84%E5%B7%AE%E5%BC%82%E5%AF%B9%E6%AF%94"><strong>各平台架构差异对比</strong></h3>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 974px">
  <colgroup>
   <col style="width: 100px">
   <col style="width: 133px">
   <col style="width: 285px">
   <col style="width: 456px">
  </colgroup>
  <tbody>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <th colspan="1" rowspan="1" colwidth="100" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: 600;">
     <p style=""><strong>特征类型</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="133" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: 600;">
     <p style=""><strong>代表程序</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="285" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: 600;">
     <p style=""><strong>核心挑战</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="456" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: 600;">
     <p style=""><strong>脚本应对方案</strong></p>
    </th>
   </tr>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <td colspan="1" rowspan="1" colwidth="100" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>传统 SSR</strong></span></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="133" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style="">Typecho / WordPress</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="285" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style="">DOM 结构固定，无特殊逻辑</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="456" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style="">标准 ID 匹配 + 快速填充</p>
    </td>
   </tr>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <td colspan="1" rowspan="1" colwidth="100" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>响应式架构</strong></span></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="133" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style="">Halo 2.x / Vue 主题</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="285" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style="">填入 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">value</span>​ 但无法触发生命周期</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="456" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>派发冒泡事件流 (input/change/blur)</strong></span></p>
    </td>
   </tr>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <td colspan="1" rowspan="1" colwidth="100" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>异步加载</strong></span></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="133" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style="">Hexo (Valine/Waline)</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="285" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style="">脚本运行瞬间评论框还没渲染</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="456" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>MutationObserver 异步捕获</strong></span></p>
    </td>
   </tr>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <td colspan="1" rowspan="1" colwidth="100" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>Web 组件</strong></span></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="133" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style="">部分第三方评论插件</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="285" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style="">存在 Shadow DOM 封装隔离</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="456" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>深度递归穿透搜索</strong></span></p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<hr>
<h2 style="" id="%E4%BA%8C%E3%80%81-%E5%AE%8C%E6%95%B4%E4%BB%A3%E7%A0%81%EF%BC%88%E8%AF%A6%E7%BB%86%E6%B3%A8%E9%87%8A%E7%89%88%EF%BC%89"><strong>二、 完整代码（详细注释版）</strong></h2>
<p style="line-height: 1.625">代码中不仅考虑了选择器的覆盖，更核心的是解决了<span style="color: oklch(0.3289 0.0107 95)"><strong>数据同步</strong></span>和<span style="color: oklch(0.3289 0.0107 95)"><strong>异步渲染</strong></span>的问题。</p>
<h3 style="" id="%E6%A0%B8%E5%BF%83%E7%82%B9"><strong>核心点</strong></h3>
<ol>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>事件驱动同步</strong></span>​：通过触发 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">input</span>​、<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">change</span>​、<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">blur</span>​ 三重事件，确保 Vue/React 等框架的响应式系统能够捕获到数据变化 。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>MutationObserver 异步捕获</strong></span>​：针对评论框异步注入的场景（如 Valine、Waline），监听 DOM 变化并在元素出现时自动填充。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>Shadow DOM 穿透</strong></span>​：递归遍历 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">shadowRoot</span>​，兼容基于 Web Components 的第三方评论系统。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>隐藏域规避</strong></span>​：过滤 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">type="hidden"</span>​ 的输入框，避免误触反垃圾"蜜罐"机制。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>单次执行去重</strong></span>​：依赖执行周期内的状态判断，避免对同一元素重复填充。</p>
 </li>
</ol>
<h3 style="" id="%E6%BA%90%E4%BB%A3%E7%A0%81"><strong>源代码</strong></h3>
<details class="details">
 <summary>有点长，点击打开吧</summary>
 <div data-type="detailsContent">
  <pre><code class="language-javascript">/*
 * 全平台评论自动填充脚本 (通用增强版 V2.0)
 * 核心：响应式事件同步 + MutationObserver 异步捕获 + 隐藏域规避
 */
(function() {
  // --- [1] 个人信息配置区 ---
  var config = {
    data: {
      n: '吴蛋蛋',              // 你的昵称
      e: 'me@wuqishi.com',      // 你的邮箱
      w: 'https://wuqishi.com'  // 你的网址（末尾不要留空格）
    },
    // --- [2] 属性选择器规则库 ---
    // 涵盖 Typecho, Halo, WP, Z-Blog 等主流主题特征
    rules: {
      n: ['#author', '#inpName', 'input[name="author"]', 'input[placeholder*="昵称"]'],
      e: ['#mail', '#email', 'input[name="email"]', 'input[placeholder*="邮箱"]'],
      w: ['input[type="url"]', '#url', 'input[name="url"]', 'input[placeholder*="网址"]']
    }
  };

  var filledCount = 0;
  var observer = null;

  /**
   * 执行填充逻辑
   * 返回 boolean：是否成功填充至少一个字段
   */
  function executeFill() {
    var foundThisRound = 0;
    for (var k in config.rules) {
      var selectors = config.rules[k];
      for (var i = 0; i &lt; selectors.length; i++) {
        var el = deepQuery(document, selectors[i]);
        // 核心判定：排除 hidden 蜜罐，确保是可见输入框
        if (el &amp;&amp; el.type !== 'hidden' &amp;&amp; (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA')) {
          el.value = config.data[k];
          // 派发事件：bubbles 保证在 DOM 树中冒泡
          // composed: true 允许事件从 Shadow DOM 内部向外冒泡（若元素位于 shadowRoot 内）
          var evs = ['input', 'change', 'blur'];
          for (var j = 0; j &lt; evs.length; j++) {
            el.dispatchEvent(new Event(evs[j], { bubbles: true, composed: true }));
          }
          filledCount++;
          foundThisRound++;
          break; // 该类目匹配成功即跳出
        }
      }
    }

    if (foundThisRound &gt; 0) {
      showFeedback(filledCount);
      // 填充成功后停止观察，释放性能
      if (observer) { observer.disconnect(); observer = null; }
      return true;
    }
    return false;
  }

  /**
   * 递归穿透 Shadow DOM
   * 普通 querySelector 无法进入 shadowRoot，必须手动下潜
   */
  function deepQuery(root, sel) {
    var el = root.querySelector(sel);
    if (el) return el;
    var all = root.querySelectorAll('*');
    for (var i = 0; i &lt; all.length; i++) {
      if (all[i].shadowRoot) {
        el = deepQuery(all[i].shadowRoot, sel);
        if (el) return el;
      }
    }
    return null;
  }

  /**
   * 初始化：立即执行 + MutationObserver 兜底
   */
  function init() {
    // 立即执行一次
    if (executeFill()) return;

    // 若未找到，监听 DOM 变化（应对异步注入的评论框）
    observer = new MutationObserver(function() {
      if (executeFill() &amp;&amp; observer) {
        observer.disconnect();
        observer = null;
      }
    });
    observer.observe(document.body, { childList: true, subtree: true });

    // 10 秒后停止监听，避免长期性能损耗
    setTimeout(function() {
      if (observer) { observer.disconnect(); observer = null; }
    }, 10000);
  }

  /**
   * UI 反馈提示
   */
  function showFeedback(count) {
    var msg = document.getElementById('h-msg') || document.createElement('div');
    msg.id = 'h-msg';
    msg.textContent = '✅ 已填充 ' + count + ' 项字段';
    msg.style.cssText = 'position:fixed;top:20px;right:20px;background:#4CAF50;color:white;padding:12px 24px;border-radius:4px;z-index:999999;font-family:sans-serif;box-shadow:0 2px 10px rgba(0,0,0,0.2);animation:h-fade 3s ease';
    if (!msg.parentNode) document.body.appendChild(msg);
    setTimeout(function() { if(msg.parentNode) msg.parentNode.removeChild(msg); }, 3000);
    if (!document.getElementById('h-style')) {
      var style = document.createElement('style');
      style.id = 'h-style';
      style.textContent = '@keyframes h-fade{0%,100%{opacity:0;transform:translateY(-10px)}15%,85%{opacity:1;transform:translateY(0)}}';
      document.head.appendChild(style);
    }
  }

  // 启动
  init();
})();
</code></pre>
  <p style=""></p>
 </div>
</details>
<hr>
<h2 style="" id="%E4%B8%89%E3%80%81-%E5%8F%AF%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8%E7%9A%84%E4%B9%A6%E7%AD%BE%E4%BB%A3%E7%A0%81"><strong>三、 可直接使用的书签代码</strong></h2>
<p style="line-height: 1.625">将上述逻辑压缩成标准 ES5 语法，确保最大兼容性。</p>
<h3 style="" id="%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4"><strong>操作步骤</strong></h3>
<ol>
 <li>
  <p style="line-height: 1.625">在浏览器书签栏右键 → ​<span style="color: oklch(0.3289 0.0107 95)"><strong>添加网页/书签</strong></span>​。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>名称</strong></span>​：填入"自动填表"或"一键评论"。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>网址 (URL)</strong></span>​：完整复制粘贴下方这一行压缩代码：</p>
 </li>
</ol>
<pre><code class="language-javascript">javascript:(function(){var d={n:'吴蛋蛋',e:'me@wuqishi.com',w:'https://wuqishi.com'},r={n:['#author','#inpName','input[name="author"]','input[placeholder*="昵称"]'],e:['#mail','#email','input[name="email"]','input[placeholder*="邮箱"]'],w:['input[type="url"]','#url','input[name="url"]','input[placeholder*="网址"]']},f=0,o=null;function x(){var a=0;for(var k in r){var s=r[k];for(var i=0;i&lt;s.length;i++){var el=q(document,s[i]);if(el&amp;&amp;el.type!=='hidden'&amp;&amp;(el.tagName==='INPUT'||el.tagName==='TEXTAREA')){el.value=d[k];var v=['input','change','blur'];for(var j=0;j&lt;v.length;j++)el.dispatchEvent(new Event(v[j],{bubbles:true,composed:true}));f++;a++;break}}}if(a&gt;0){y(f);if(o){o.disconnect();o=null}return true}return false}function q(root,sel){var e=root.querySelector(sel);if(e)return e;var a=root.querySelectorAll('*');for(var i=0;i&lt;a.length;i++){if(a[i].shadowRoot){e=q(a[i].shadowRoot,sel);if(e)return e}}return null}function init(){if(x())return;o=new MutationObserver(function(){if(x()&amp;&amp;o){o.disconnect();o=null}});o.observe(document.body,{childList:true,subtree:true});setTimeout(function(){if(o){o.disconnect();o=null}},10000)}function y(c){var m=document.getElementById('h-msg')||document.createElement('div');m.id='h-msg';m.textContent='✅ 已填充 '+c+' 项';m.style.cssText='position:fixed;top:20px;right:20px;background:#4CAF50;color:white;padding:12px 24px;border-radius:4px;z-index:999999;font-family:sans-serif;box-shadow:0 2px 10px rgba(0,0,0,0.2);animation:h-fade 3s ease';if(!m.parentNode)document.body.appendChild(m);setTimeout(function(){if(m.parentNode)m.parentNode.removeChild(m)},3000);if(!document.getElementById('h-style')){var s=document.createElement('style');s.id='h-style';s.textContent='@keyframes h-fade{0%,100%{opacity:0;transform:translateY(-10px)}15%,85%{opacity:1;transform:translateY(0)}}';document.head.appendChild(s)}}init()})();
</code></pre>
<h3 style="" id="%E5%A4%9A%E8%BA%AB%E4%BB%BD%E7%AE%A1%E7%90%86%E6%8A%80%E5%B7%A7"><strong>多身份管理技巧</strong></h3>
<p style="line-height: 1.625">你可以保存多个书签，每个对应不同身份：</p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 687px">
  <colgroup>
   <col style="width: 149px">
   <col style="width: 303px">
   <col style="width: 235px">
  </colgroup>
  <tbody>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <th colspan="1" rowspan="1" colwidth="149" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: 600;">
     <p style=""><strong>书签名称</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="303" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: 600;">
     <p style=""><strong>配置示例</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="235" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: 600;">
     <p style=""><strong>使用场景</strong></p>
    </th>
   </tr>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <td colspan="1" rowspan="1" colwidth="149" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>一键评论-博主</strong></span></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="303" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style="">​<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">n:'吴蛋蛋', e:'me@wuqishi.com'</span>​...</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="235" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal;">
     <p style="">日常友链互动</p>
    </td>
   </tr>
   <tr style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ;">
    <td colspan="1" rowspan="1" colwidth="149" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style=""><span style="color: oklch(0.3289 0.0107 95)"><strong>一键评论-马甲</strong></span></p>
    </td>
    <td colspan="1" rowspan="1" colwidth="303" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style="">​<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">n:'匿名网友', e:'temp@example.com'</span>​...</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="235" style="--un-rotate: 0; --un-rotate-x: 0; --un-rotate-y: 0; --un-rotate-z: 0; --un-scale-x: 1; --un-scale-y: 1; --un-scale-z: 1; --un-skew-x: 0; --un-skew-y: 0; --un-translate-x: 0; --un-translate-y: 0; --un-translate-z: 0; --un-pan-x: ; --un-pan-y: ; --un-pinch-zoom: ; --un-scroll-snap-strictness: proximity; --un-ordinal: ; --un-slashed-zero: ; --un-numeric-figure: ; --un-numeric-spacing: ; --un-numeric-fraction: ; --un-border-spacing-x: 0; --un-border-spacing-y: 0; --un-ring-offset-shadow: 0 0 rgba(0,0,0,0); --un-ring-shadow: 0 0 rgba(0,0,0,0); --un-shadow-inset: ; --un-shadow: 0 0 rgba(0,0,0,0); --un-ring-inset: ; --un-ring-offset-width: 0px; --un-ring-offset-color: #fff; --un-ring-width: 0px; --un-ring-color: rgba(147,197,253,.5); --un-blur: ; --un-brightness: ; --un-contrast: ; --un-drop-shadow: ; --un-grayscale: ; --un-hue-rotate: ; --un-invert: ; --un-saturate: ; --un-sepia: ; --un-backdrop-blur: ; --un-backdrop-brightness: ; --un-backdrop-contrast: ; --un-backdrop-grayscale: ; --un-backdrop-hue-rotate: ; --un-backdrop-invert: ; --un-backdrop-opacity: ; --un-backdrop-saturate: ; --un-backdrop-sepia: ; padding: 4px 8px; border-color: oklch(0.828165 0.0011 17.18); border-style: solid; border-width: 1px; border-image: none 100% / 1 / 0 stretch; box-sizing: border-box; max-width: 620px; overflow-wrap: break-word; font-weight: normal; background-color: transparent;">
     <p style="">测试或隐私场景</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<p style="line-height: 1.625">只需修改 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">config.data</span>​ 里的内容，即可实现"切号"自由。</p>
<hr>
<h2 style="" id="%E5%9B%9B%E3%80%81-%E9%81%BF%E5%9D%91%E4%B8%8E%E8%BF%9B%E9%98%B6"><strong>四、 避坑与进阶</strong></h2>
<h3 style="" id="1.-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%A1%AB%E5%AE%8C%E7%82%B9%E5%87%BB%22%E6%8F%90%E4%BA%A4%22%E4%BC%9A%E6%B6%88%E5%A4%B1%EF%BC%9F"><strong>1. 为什么填完点击"提交"会消失？</strong></h3>
<p style="line-height: 1.625">很多老脚本只改了 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">value</span>​，没触发事件。Vue/React 等框架监听 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">input</span>​ 事件来同步状态到内部数据层 。本脚本派发 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">input</span>​、<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">change</span>​、<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">blur</span>​ 三重事件，确保框架状态树与 DOM 同步。</p>
<h3 style="" id="2.-composed%3A-true%E2%80%8B-%E5%88%B0%E5%BA%95%E6%9C%89%E4%BB%80%E4%B9%88%E7%94%A8%EF%BC%9F"><strong>2. </strong><span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 18.768px"><strong>composed: true</strong></span><strong>​ 到底有什么用？</strong></h3>
<p style="line-height: 1.625">这个参数只在<span style="color: oklch(0.3289 0.0107 95)"><strong>事件从 Shadow DOM 内部向外冒泡</strong></span>时生效。如果目标网站没有使用 Shadow DOM，它是无害的空操作；如果使用了，它确保事件能跨出封装边界被父级监听。</p>
<h3 style="" id="3.-%E5%BC%82%E6%AD%A5%E6%B3%A8%E5%85%A5%E7%9A%84%E5%85%9C%E5%BA%95%E9%80%BB%E8%BE%91"><strong>3. 异步注入的兜底逻辑</strong></h3>
<p style="line-height: 1.625">压缩版中包含了 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">MutationObserver</span>​，如果首次执行时评论框还没加载（常见于 Valine、Gitalk），它会监听 DOM 变化并在元素出现时自动触发填充，最多观察 10 秒后自动释放。</p>
<h3 style="" id="4.-%E5%A6%82%E4%BD%95%E9%AA%8C%E8%AF%81%E8%84%9A%E6%9C%AC%E6%98%AF%E5%90%A6%E7%94%9F%E6%95%88%EF%BC%9F"><strong>4. 如何验证脚本是否生效？</strong></h3>
<p style="line-height: 1.625">打开浏览器开发者工具（F12）→ Console 面板，点击书签后若看到绿色提示框但未生效，可检查：</p>
<ul>
 <li>
  <p style="line-height: 1.625">输入框的 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">id</span>​ 或 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">name</span>​ 属性是否匹配规则库</p>
 </li>
 <li>
  <p style="line-height: 1.625">目标站点是否使用了 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">closed</span>​ Shadow DOM（无法穿透）</p>
 </li>
 <li>
  <p style="line-height: 1.625">是否处于跨域 iframe 内（无法操作）</p>
 </li>
</ul>
<hr>
<h2 style="" id="%E4%BA%94%E3%80%81-%E8%BF%99%E5%A5%97%E6%96%B9%E6%A1%88%E6%97%A0%E6%B3%95%E8%A6%86%E7%9B%96%E7%9A%84%E5%9C%BA%E6%99%AF"><strong>五、 这套方案无法覆盖的场景</strong></h2>
<p style="line-height: 1.625">技术方案的诚实边界，是建立互相信任的基础。以下场景目前<span style="color: oklch(0.3289 0.0107 95)"><strong>无法解决</strong></span>：</p>
<ol>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>跨域 iframe</strong></span>​：如 Disqus、部分版本的畅言，将评论框置于与主站不同源的 iframe 中，受浏览器同源策略限制，任何脚本都无法穿透。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>Closed Shadow DOM</strong></span>​：若第三方组件使用 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">attachShadow({ mode: 'closed' })</span>​，<span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">element.shadowRoot</span>​ 返回 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">null</span>​，递归穿透失效。</p>
 </li>
 <li>
  <p style="line-height: 1.625">​<span style="color: oklch(0.3289 0.0107 95)"><strong>严格 CSP 限制</strong></span>​：若目标站点配置了禁止内联脚本执行的 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">Content-Security-Policy</span>​，书签脚本会被浏览器拦截，无绕过方案。</p>
 </li>
</ol>
<hr>
<h2 style="" id="%E5%85%AD%E3%80%81%E9%99%84%E5%BD%95%EF%BC%9A%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E9%80%9F%E6%9F%A5-(faq)"><strong>六、附录：常见问题速查 (FAQ)</strong></h2>
<p style="line-height: 1.625"><span style="color: oklch(0.3289 0.0107 95)"><strong>Q: 这个脚本安全吗？会不会泄露我的信息？</strong></span></p>
<p style="line-height: 1.625">A: 脚本完全在本地浏览器执行，不发送任何网络请求，你的个人信息不会离开本机。</p>
<p style="line-height: 1.625"><span style="color: oklch(0.3289 0.0107 95)"><strong>Q: 为什么不用浏览器自带的自动填充功能？</strong></span></p>
<p style="line-height: 1.625">A: 浏览器自动填充依赖表单识别，对中文博客系统的兼容性较差，且无法处理 Shadow DOM 和异步注入场景。</p>
<p style="line-height: 1.625"><span style="color: oklch(0.3289 0.0107 95)"><strong>Q: 脚本支持移动端吗？</strong></span></p>
<p style="line-height: 1.625">A: 移动端浏览器（如 Safari、Chrome）同样支持书签脚本，但操作方式略有不同，需通过"添加到主屏幕"或书签栏调用。</p>
<p style="line-height: 1.625"><span style="color: oklch(0.3289 0.0107 95)"><strong>Q: 如何为我的自定义主题添加支持？</strong></span></p>
<p style="line-height: 1.625">A: 在 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">config.rules</span>​ 中追加对应的选择器即可。例如你的主题昵称框 ID 是 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">nickName</span>​，则添加 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">'#nickName'</span>​ 到 <span style="background-color: rgba(27, 31, 35, 0.05); color: rgb(235, 87, 87); font-family: &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, JetBrainsMono-Regular, mononoki, Consolas, &quot;Liberation Mono&quot;, Harmony, &quot;Twitter Emoji&quot;, &quot;Emojis Additional&quot;, &quot;Emojis Reset&quot;, BlinkMacSystemFont, Helvetica, &quot;PingFang SC&quot;, &quot;Luxi Sans&quot;, &quot;DejaVu Sans&quot;, &quot;Hiragino Sans GB&quot;, &quot;Source Han Sans SC&quot;, arial, &quot;Microsoft Yahei&quot;, sans-serif, emojis; font-size: 13.6px">n</span>​ 数组中。</p>
<hr>
<p style="line-height: 1.625">以上，欢迎给我留评论啊~</p>
<p style="line-height: 1.625">‍</p>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/universal-blog-comment-filler-pro</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FLCFKu7LUpIi.avif&amp;size=m" type="image/jpeg" length="69688"/><category>技巧</category><category>分享</category><pubDate>Tue, 28 Apr 2026 04:47:19 GMT</pubDate></item><item><title><![CDATA[2026 生产级指南：Halo 2.x + PostgreSQL 自动化部署与性能优化手册]]></title><link>https://wuqishi.com/archives/halo-postgresql-deployment</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=2026%20%E7%94%9F%E4%BA%A7%E7%BA%A7%E6%8C%87%E5%8D%97%EF%BC%9AHalo%202.x%20%2B%20PostgreSQL%20%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E4%B8%8E%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E6%89%8B%E5%86%8C&amp;url=/archives/halo-postgresql-deployment" width="1" height="1" alt="" style="opacity:0;">
<p style="line-height: 1.15">本手册旨在帮助管理员理解并快速部署基于 Docker Compose 的 Halo 博客系统。该配置针对 <strong>24G 内存服务器</strong> 进行了性能优化，并采用了<strong>环境变量解耦</strong>的安全策略。</p>
<hr>
<h2 style="" id="%F0%9F%8F%97%EF%B8%8F-1.-%E6%A0%B8%E5%BF%83%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E">🏗️ 1. 核心架构说明</h2>
<p style="line-height: 1.15">该配置采用典型的 <strong>App-DB（应用-数据库）分层架构</strong>：</p>
<ul>
 <li>
  <p style="line-height: 1.15"><strong>Halo 容器 (</strong><code>halo_app</code><strong>)</strong>：博客主程序，处理业务逻辑、渲染网页。</p>
 </li>
 <li>
  <p style="line-height: 1.15"><strong>PostgreSQL 容器 (</strong><code>halo_db_server</code><strong>)</strong>：关系型数据库，存储文章内容、设置、用户信息。</p>
 </li>
 <li>
  <p style="line-height: 1.15"><strong>虚拟网桥 (</strong><code>halo_internal_net</code><strong>)</strong>：创建一个受保护的局域网，使两个容器可以通过名称（如 <code>halodb</code>）互相访问，而不受外部网络干扰。</p>
 </li>
</ul>
<hr>
<figure data-content-type="image" style="display: flex; flex-direction: column;">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FWPpm3bnSfoJ.avif&amp;size=m" width="1024px">
</figure>
<h2 style="" id="%F0%9F%9B%A0%EF%B8%8F-2.-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87%EF%BC%88%E9%83%A8%E7%BD%B2%E5%89%8D%E5%BF%85%E5%81%9A%EF%BC%89">🛠️ 2. 环境准备（部署前必做）</h2>
<p style="line-height: 1.15">在宝塔面板或 SSH 终端执行以下步骤，确保基础环境就绪：</p>
<h3 style="" id="%E2%91%A0-%E5%88%9B%E5%BB%BA%E7%9B%AE%E5%BD%95%E5%B9%B6%E6%8E%88%E6%9D%83">① 创建目录并授权</h3>
<p style="line-height: 1.15">由于 Docker 以 root 权限运行，但内部程序（如 Postgres）有特定的用户 UID，建议预先创建目录并开放读写权限：</p>
<pre><code class="language-yaml"># 创建存储数据的根目录
mkdir -p /www/wwwroot/halo/data /www/wwwroot/halo/db

# 赋予最高权限以防止数据库启动失败 (Permission Denied)
chmod -R 777 /www/wwwroot/halo/</code></pre>
<h3 style="" id="%E2%91%A1-%E9%98%B2%E7%81%AB%E5%A2%99%E6%94%BE%E8%A1%8C">② 防火墙放行</h3>
<p style="line-height: 1.15">在宝塔【安全】或云服务器【安全组】中开放以下端口：</p>
<ul>
 <li>
  <p style="line-height: 1.15"><strong>8090</strong>：博客访问入口。</p>
 </li>
 <li>
  <p style="line-height: 1.15"><strong>5432</strong>：数据库管理入口（若不需要远程连接数据库，可不开放）。</p>
 </li>
</ul>
<hr>
<h2 style="" id="%E2%9A%99%EF%B8%8F-3.-%E5%85%B3%E9%94%AE%E9%85%8D%E7%BD%AE%E9%A1%B9%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90">⚙️ 3. 关键配置项深度解析</h2>
<h3 style="" id="%F0%9F%94%8B-%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%EF%BC%9Ajvm-%E5%86%85%E5%AD%98">🔋 性能调优：JVM 内存</h3>
<pre><code class="language-yaml">- JVM_OPTS=-Xmx2048m -Xms512m</code></pre>
<ul>
 <li>
  <p style="line-height: 1.15"><strong>Xmx (最大堆内存)</strong>：2G。在 24G 内存的服务器上，这能确保博客在高并发、处理大量图片插件时依然丝滑，且不会造成系统内存拥堵。</p>
 </li>
 <li>
  <p style="line-height: 1.15"><strong>Xms (初始内存)</strong>：512M。启动时即分配，减少初始运行时的内存申请开销。</p>
 </li>
</ul>
<h3 style="" id="%F0%9F%9B%A1%EF%B8%8F-%E8%87%AA%E6%84%88%E6%9C%BA%E5%88%B6%EF%BC%9A%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5-(healthcheck)">🛡️ 自愈机制：健康检查 (Healthcheck)</h3>
<pre><code class="language-yaml">healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8090/..."]
  start_period: 60s</code></pre>
<ul>
 <li>
  <p style="line-height: 1.15"><strong>逻辑</strong>：Docker 每 30 秒“问”一次 Halo 是否活着。</p>
 </li>
 <li>
  <p style="line-height: 1.15"><strong>start_period</strong>：因为 Java 程序（Spring Boot）冷启动较慢，如果前 60 秒内报错，Docker 会忽略，不会误以为程序崩溃而不断重启。</p>
 </li>
</ul>
<h3 style="" id="%F0%9F%8C%90-%E5%9F%9F%E5%90%8D%E4%BE%9D%E8%B5%96%EF%BC%9Aexternal-url">🌐 域名依赖：External URL</h3>
<pre><code class="language-yaml">- HALO_EXTERNAL_URL=http://localhost:8090/</code></pre>
<ul>
 <li>
  <p style="line-height: 1.15"><strong>重要性</strong>：<strong>这是小白最容易出错的地方</strong>。Halo 后台登录需要校验这个地址。如果你绑定了域名（如 <code>https://blog.com</code>），请务必在此处同步修改。</p>
 </li>
</ul>
<hr>
<h2 style="" id="%F0%9F%9A%80-4.-%E9%83%A8%E7%BD%B2%E4%B8%8E%E7%BB%B4%E6%8A%A4%E6%89%8B%E5%86%8C">🚀 4. 部署与维护手册</h2>
<h3 style="" id="%E5%90%AF%E5%8A%A8%E5%91%BD%E4%BB%A4">启动命令</h3>
<p style="line-height: 1.15">在 <code>/www/wwwroot/halo</code> 目录下运行：</p>
<pre><code class="language-yaml">docker-compose up -d</code></pre>
<h3 style="" id="%E7%8A%B6%E6%80%81%E6%A3%80%E6%9F%A5">状态检查</h3>
<pre><code class="language-yaml"># 查看容器是否都在运行
docker ps

# 实时查看启动日志（排查报错神器）
docker logs -f halo</code></pre>
<h3 style="" id="%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AF%86%E7%A0%81%EF%BC%9F">如何修改数据库密码？</h3>
<ol>
 <li>
  <p style="line-height: 1.15">停止容器：<code>docker-compose down</code></p>
 </li>
 <li>
  <p style="line-height: 1.15">修改 YAML 中 <strong>两个服务</strong> 的密码项（必须保持一致）。</p>
 </li>
 <li>
  <p style="line-height: 1.15"><strong>注意</strong>：如果数据库已经初始化，直接改配置可能无效，建议在首次部署前就确定好强密码。</p>
 </li>
</ol>
<hr>
<h2 style="" id="%E2%9D%93-5.-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-(faq)">❓ 5. 常见问题 (FAQ)</h2>
<p style="line-height: 1.15"><strong>Q: 为什么状态显示 </strong><code>Starting</code><strong> 或 </strong><code>Unhealthy</code><strong>？</strong></p>
<p style="line-height: 1.15">A: Java 应用启动通常需要 30-60 秒。请使用 <code>docker logs -f halo</code> 查看日志。如果一直卡住，请检查是否为 <code>/www/wwwroot/halo/db</code> 权限不足导致数据库崩溃。</p>
<p style="line-height: 1.15"><strong>Q: 我可以用 Navicat 连接数据库吗？</strong></p>
<p style="line-height: 1.15">A: 可以。使用服务器公网 IP，端口 5432，用户名 <code>halo</code>，密码使用你在配置中设置的值。</p>
<p style="line-height: 1.15"><strong>Q: 如何更新 Halo 版本？</strong></p>
<p style="line-height: 1.15">A: 修改 <code>image</code> 标签中的版本号（如 <code>2.24.1</code> 改为 <code>2.25.0</code>），然后重新运行 <code>docker-compose up -d</code>，Docker 会自动拉取新镜像并平滑更新。如果要保持<code>2.x</code> 最新版，版本号改为<code>2</code>即可。</p>
<hr>
<h2 style="" id="%F0%9F%8C%B0-6.-%E5%AE%8C%E6%95%B4%E7%89%88%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B">🌰 6. 完整版配置示例</h2>
<pre><code class="language-yaml"># ==============================================================================
# 🚀 HALO 2.X 博客系统 - 自动化部署母版 (2026 生产级标准)
# ==============================================================================
# 💡 使用说明：
# 1. 本文件已移除所有隐私（路径、密码、IP），直接复制即可安全分享。
# 2. 采用了 ${变量:-默认值} 格式，即使不配置外部变量也能按默认路径运行。
# 3. 适配宝塔面板、大内存服务器（如 Oracle Cloud 24G 实例）。
# ==============================================================================

services:
  # ----------------------------------------------------------------------------
  # [模块 A] Halo 博客主程序
  # ----------------------------------------------------------------------------
  halo:
    # 镜像地址：官方推荐的稳定版，建议锁定版本号以防自动更新导致数据不兼容
    image: registry.fit2cloud.com/halo/halo:2.24.1
    container_name: halo_app
    restart: always                                 # 策略：服务器重启或程序崩溃时，自动尝试无限次重启
    
    # 启动顺序：必须等下方的 [halodb] 数据库通过健康检查后，博客程序才开始引导
    depends_on:
      halodb:
        condition: service_healthy 

    networks:
      - halo_internal_net                           # 网络：加入内部隔离网络，不与外部无关容器混用

    volumes:
      # 【持久化挂载】：[服务器实际路径] : [容器内部路径]
      # 作用：把你上传的图片、安装的主题、插件存放在服务器硬盘上，容器删了数据还在
      - ${BASE_PATH:-/www/wwwroot/halo}/data:/root/.halo2

    ports:
      # 【端口映射】：[服务器对外端口] : [容器内部端口]
      # 作用：让你通过 http://IP:8090 能够访问到博客
      - "${WEB_PORT:-8090}:8090"

    healthcheck:
      # 【自愈检查】：每 30 秒探测一次后台接口，确保 Java 程序没有假死
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s                                 # 检查频率
      timeout: 5s                                   # 响应超时
      retries: 5                                    # 连续失败 5 次则标记为“不健康”并尝试重启
      start_period: 60s                             # 启动缓冲：Java 启动较慢，前 1 分钟不进行强制判定

    environment:
      # 【JVM 调优】：针对 24G 内存机器，分配 2G 运行内存给博客，保证极致流畅
      - JVM_OPTS=-Xmx2048m -Xms512m
      
      # --- 数据库底层连接环境变量 (强制覆盖模式，比 command 更稳) ---
      # 格式：协议://数据库容器名:端口/数据库名
      - SPRING_R2DBC_URL=r2dbc:pool:postgresql://halodb:5432/${DB_NAME:-halo_db}
      - SPRING_R2DBC_USERNAME=${DB_USER:-halo_user}
      - SPRING_R2DBC_PASSWORD=${DB_PASS:-your_strong_password} # 【脱敏：此处填写你的数据库密码】
      - SPRING_SQL_INIT_PLATFORM=postgresql
      
      # 【访问域名】：请在此处填写你的真实访问地址（带 http/https），否则后台无法正常登录
      - HALO_EXTERNAL_URL=${SITE_URL:-http://localhost:8090/}
    
    # 💡 关键：清空默认指令，防止干扰上述 SPRING 环境变量的生效
    command: [] 

  # ----------------------------------------------------------------------------
  # [模块 B] PostgreSQL 数据库引擎
  # ----------------------------------------------------------------------------
  halodb:
    # 镜像地址：使用 alpine 版，不仅体积小（仅约 1/4），且安全性更高
    image: postgres:15-alpine
    container_name: halo_db_server
    restart: always

    networks:
      - halo_internal_net                           # 数据库仅在内部网桥运行，确保公网无法通过容器名攻击

    volumes:
      # 【持久化挂载】：存储所有的文章文字、用户信息、设置项
      - ${BASE_PATH:-/www/wwwroot/halo}/db:/var/lib/postgresql/data

    ports:
      # 【数据库映射】：方便你用 Navicat 或 DBeaver 在电脑本地远程管理数据库
      # 💡 安全建议：如果不需要远程连接，可以将这一行删掉或在防火墙限制 IP
      - "${DB_PORT:-5432}:5432"

    healthcheck:
      # 【就绪判定】：使用官方工具 pg_isready 确保数据库不仅在运行，且可以接受新连接
      test: [ "CMD-SHELL", "pg_isready -U ${DB_USER:-halo_user} -d ${DB_NAME:-halo_db}" ]
      interval: 10s
      timeout: 5s
      retries: 5

    environment:
      # 数据库初始化参数：这些参数必须与上面 [halo] 模块中的配置一一对应
      - POSTGRES_PASSWORD=${DB_PASS:-your_strong_password} # 数据库超级密钥
      - POSTGRES_USER=${DB_USER:-halo_user}               # 数据库登录用户名
      - POSTGRES_DB=${DB_NAME:-halo_db}                   # 默认创建的数据库库名
      - PGUSER=${DB_USER:-halo_user}                      # 指定健康检查所用的用户

# ------------------------------------------------------------------------------
# [模块 C] 网络隔离定义
# ------------------------------------------------------------------------------
networks:
  # 创建一个名为 halo_internal_net 的独立虚拟局域网
  halo_internal_net:
    driver: bridge                                  # 驱动：桥接模式，提供容器间 DNS 自动发现功能</code></pre>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/halo-postgresql-deployment</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FWPpm3bnSfoJ.avif&amp;size=m" type="image/jpeg" length="88846"/><category>技巧</category><category>分享</category><pubDate>Sat, 25 Apr 2026 06:17:57 GMT</pubDate></item><item><title><![CDATA[从 Typecho 转向 Halo 2.x：全能型 Nginx 架构与 SEO 无损迁移指南]]></title><link>https://wuqishi.com/archives/typecho-to-halo-nginx-seo-migration-guide</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%BB%8E%20Typecho%20%E8%BD%AC%E5%90%91%20Halo%202.x%EF%BC%9A%E5%85%A8%E8%83%BD%E5%9E%8B%20Nginx%20%E6%9E%B6%E6%9E%84%E4%B8%8E%20SEO%20%E6%97%A0%E6%8D%9F%E8%BF%81%E7%A7%BB%E6%8C%87%E5%8D%97&amp;url=/archives/typecho-to-halo-nginx-seo-migration-guide" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">我最近完成了一项“大工程”：将个人博客从传统的 Typecho 平台迁移到了基于 Docker 的 Halo 2.x。</p>
<p style="">这次迁移并非简单的“搬家”，因为我面临着几个复杂的现实挑战：</p>
<ol>
 <li>
  <p style="">SEO 权重保卫战：旧文章链接必须通过 301 永久重定向到新路径。</p>
 </li>
 <li>
  <p style="">多项目共存：根目录下还有多个独立的 PHP 小工具（如 Speedtest、图片托管等）不能中断。</p>
 </li>
 <li>
  <p style="">性能极致追求：利用手头 ARM 4H24G 的高配服务器，实现物理级动静分离。</p>
 </li>
</ol>
<p style="">在反复踩坑 403 错误和 Nginx 配置冲突后，我整理出了这套“终极方案”。</p>
<hr>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F0BbNWsJHSkJ.avif&amp;size=m" alt="image">
 <figcaption data-placeholder="添加描述" style="width: 1024px; max-width: 100%; text-align: center;">Typecho 转 Halo 2.X</figcaption>
</figure>
<h2 style="" id="%E6%A0%B8%E5%BF%83%E6%8C%91%E6%88%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">核心挑战与解决方案</h2>
<h3 style="" id="1.-url-%E9%87%8D%E5%AE%9A%E5%90%91%EF%BC%8C%E6%AF%94%E6%83%B3%E8%B1%A1%E4%B8%AD%E9%BA%BB%E7%83%A6">1. URL 重定向，比想象中麻烦</h3>
<p style="">Typecho 的文章我使用的路径是 /slug/​，而 Halo 必须要有前缀，综合考虑之后，我决定使用 /p/slug​。为了不让朋友们的收藏夹失效，也不让搜索引擎抓取到 404，我们需要利用 Nginx 的正则匹配实现自动化跳转。以下是需要避坑的地方：</p>
<ul>
 <li>
  <p style="">有的 URL 末尾带斜杠，有的不带</p>
 </li>
 <li>
  <p style="">分类页面、独立页面、文章页面的规则全都不一样</p>
 </li>
 <li>
  <p style="">最坑的是，如果不小心把 /admin​ 也重定向了，后台直接进不去</p>
 </li>
</ul>
<p style="">我一开始用宝塔的反代插件自动生成，结果生成的 rewrite 规则优先级完全不对，要么 404，要么循环重定向。最后干脆放弃插件，直接手写 Nginx 配置。</p>
<blockquote>
 <p style="">后面又改回archives​了，主题默认写死了，我太怕麻烦了...</p>
</blockquote>
<h3 style="" id="2.-%E7%BB%95%E8%BF%87%E2%80%9C%E7%A9%BA%E7%9B%AE%E5%BD%95-403-%E9%94%99%E8%AF%AF%E2%80%9D">2. 绕过“空目录 403 错误”</h3>
<p style="">由于 Halo 运行在 Docker 容器中，宿主机的网站根目录通常是空的。Nginx 默认会尝试在本地找 index.php​，找不到且禁止列出目录时就会报 403。
 <br>
 方案：在 Nginx 中对首页进行“精确匹配”，直接转发给后端，不经过本地文件系统。</p>
<h3 style="" id="3.-%E7%89%A9%E7%90%86%E7%BA%A7%E5%8A%A8%E9%9D%99%E5%88%86%E7%A6%BB">3. 物理级动静分离</h3>
<p style="">Halo 虽然强大，但用 Java 处理静态资源（图片、CSS）效率不如 Nginx。通过 Docker 的卷挂载（Volumes），我们可以让 Nginx 直接读取磁盘上的附件，速度提升显著。</p>
<p style="">通过 location ~ ^/(themes|plugins|attachments)/​ 块，我们让 Nginx 直接从磁盘读取图片、字体和脚本。这不仅大幅降低了 Halo 容器的 I/O 压力，还通过 Access-Control-Allow-Origin "*"​ 解决了部分主题在预加载字体时可能出现的跨域警告。</p>
<h2 style="" id="4.-%E8%A7%A3%E5%86%B3%E5%AE%9D%E5%A1%94%E4%BF%9D%E5%AD%98%E6%8A%A5%E9%94%99">4. 解决宝塔保存报错</h2>
<p style="">宝塔面板在保存配置文件时，会扫描 #SSL-START​ 块内是否包含特定的 error_page 404​ 注释行。这也是一个需要注意的地方。</p>
<h2 style="" id="5.-404%E7%9A%84%E9%97%AE%E9%A2%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">5. 404的问题与解决方案</h2>
<p style="">默认情况下，Nginx 的 proxy_intercept_errors on​ 会直接抛出 Nginx 自带的 404.html​。</p>
<p style="">方案通过 @seo_logic​ 逻辑：</p>
<ul>
 <li>
  <p style="">先尝试帮找回旧文章（SEO 补全）。</p>
 </li>
 <li>
  <p style="">如果确实找不到，则通过 proxy_intercept_errors off​ 再次转发，此时 Nginx 会“闭嘴”，让 Halo 后端吐出主题 404 页面。</p>
 </li>
</ul>
<hr>
<h2 style="" id="%E7%BB%88%E6%9E%81-nginx-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6">终极 Nginx 配置文件</h2>
<p style="">以下是经过多次迭代、能够完美运行在宝塔面板环境下的主配置文件（已脱敏）。</p>
<pre><code class="language-nginx">server
{
    listen 80;
    listen 443 ssl;
    http2 on;
    server_name yourdomain.com; # 替换为你的域名
    index index.php index.html index.htm;
    root /www/wwwroot/your_site_folder; # 替换为你的站点根目录
    include /www/server/panel/vhost/nginx/extension/yourdomain.com/*.conf;

    # ==========================================================
    # 【1. 基础 MIME 类型】
    # ==========================================================
    include mime.types;
    types {
        application/javascript        js cjs mjs;
        image/svg+xml                 svg;
    }

    # ==========================================================
    # 【2. SSL 配置区】(保持宝塔兼容性)
    # ==========================================================
    #SSL-START
    #error_page 404/404.html;
    ssl_certificate    /path/to/your/fullchain.pem; # 替换为实际证书路径
    ssl_certificate_key    /path/to/your/privkey.pem;  # 替换为实际密钥路径
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    # ... 其他 SSL 优化参数 ...
    #SSL-END

    # ==========================================================
    # 【3. 业务路由分发】
    # ==========================================================
    
    # 首页直连
    location = / {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $http_host;
        # ... 常用 Proxy Header ...
    }

    # 静态资源直读
    location ~ ^/(themes|plugins|attachments)/ {
        root /www/wwwroot/your_site_folder/data;
        add_header Access-Control-Allow-Origin "*";
        access_log off;
        expires 30d;
        try_files $uri @halo_proxy;
    }

    # 兼容本地 PHP 工具
    location ~ ^/(tool_folder1|tool_folder2) {
        try_files $uri $uri/ /index.php?$query_string;
        include enable-php-83.conf;
    }

    location / {
        try_files $uri $uri/ @halo_proxy;
    }

    # ==========================================================
    # 【4. SEO 重定向映射】
    # ==========================================================
    rewrite ^/feed/?$ /rss.xml permanent;
    rewrite ^/archive/?$ /archives permanent;
    rewrite ^/cross/?$ /moments permanent;
    
    # 标签与分类映射 (请根据实际情况替换 category_name)
    rewrite ^/tag/([^/]+)/?$ /tags/$1 permanent;
    rewrite ^/(category1|category2|category3)/?$ /categories/$1 permanent;

    # ==========================================================
    # 【5. 后端代理与错误拦截】
    # ==========================================================
    location @halo_proxy {
        proxy_pass http://127.0.0.1:8090;
        proxy_set_header Host $http_host;
        # ... WebSocket 支持配置 ...

        proxy_intercept_errors on;
        error_page 404 = @seo_logic;
    }

    # ==========================================================
    # 【6. SEO 自动补全逻辑】
    # ==========================================================
    location @seo_logic {
        # 排除列表
        if ($uri ~* "^/(archives/|categories/|tags/|moments|admin|api|login|rss|search|attachments/|themes/|plugins/)") {
            set $fallback "yes";
        }
        
        if ($uri ~* "\.") {
            set $fallback "yes";
        }

        if ($fallback != "yes") {
            rewrite ^/([^/]+)/?$ /archives/$1 permanent;
        }

        # 终极兜底：显示后端自定义 404
        proxy_pass http://127.0.0.1:8090;
        proxy_intercept_errors off;
        proxy_set_header Host $http_host;
    }

    # ==========================================================
    # 【7. 系统错误页】
    # ==========================================================
    #ERROR-PAGE-START
    error_page 502 /502.html;
    # ...
    #ERROR-PAGE-END

    access_log  /www/wwwlogs/yourdomain.com.log;
    error_log  /www/wwwlogs/yourdomain.com.error.log;
}
</code></pre>
<hr>
<h2 style="" id="%E8%BF%81%E7%A7%BB%E5%90%8E%E7%9A%84%E9%81%BF%E5%9D%91%E6%80%BB%E7%BB%93">迁移后的避坑总结</h2>
<ol>
 <li>
  <p style="">不要依赖宝塔的反向代理插件：对于复杂的 301 跳转需求，插件生成的代码往往会产生优先级冲突。直接修改“配置文件”是最稳妥的选择。</p>
 </li>
 <li>
  <p style="">正则排除很重要：在做文章重定向时，务必排除掉 /admin​、/api​ 等 Halo 系统路径，否则你会发现后台无法登录。</p>
 </li>
 <li>
  <p style="">权限检查：动静分离使用 alias​ 映射时，确保网站运行用户（通常是 www​）对 Docker 挂载的物理目录有读取权限。</p>
 </li>
 <li>
  <p style="">JVM 调优：如果你有像我一样充裕的内存（24G），别忘了在 docker-compose.yml​ 中给 Halo 分配足够的内存（如 -Xmx2048m​），这样在处理高并发请求时会更从容。</p>
 </li>
</ol>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">从 Typecho 到 Halo 的迁移，不只是博客程序的更换，更是对站点架构的一次全面梳理。通过 Nginx 的灵活配置，我们既能享受新程序带来的便利，又能通过“动静分离”和“重定向优化”保障站点的访问体验与搜索权重。</p>
<p style="">希望这篇指南能帮助你打造一个更稳固、专业的 Halo 博客。修改完成后，记得在宝塔面板中重载 Nginx 配置即可生效，必要时重启一下Nginx！</p>
<hr>
<blockquote>
 <p style="">本文所涉及的 Nginx 配置已在 1.28.3 版本下实测通过。</p>
</blockquote>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/typecho-to-halo-nginx-seo-migration-guide</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F0BbNWsJHSkJ.avif&amp;size=m" type="image/jpeg" length="48129"/><category>技巧</category><category>分享</category><pubDate>Fri, 24 Apr 2026 05:57:49 GMT</pubDate></item><item><title><![CDATA[Typecho 迁移 Halo 完整教程：数据库视图解决表前缀 + 自动提取封面图 + 去重检测]]></title><link>https://wuqishi.com/archives/typecho-halo-migration-view-cover</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Typecho%20%E8%BF%81%E7%A7%BB%20Halo%20%E5%AE%8C%E6%95%B4%E6%95%99%E7%A8%8B%EF%BC%9A%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A7%86%E5%9B%BE%E8%A7%A3%E5%86%B3%E8%A1%A8%E5%89%8D%E7%BC%80%20%2B%20%E8%87%AA%E5%8A%A8%E6%8F%90%E5%8F%96%E5%B0%81%E9%9D%A2%E5%9B%BE%20%2B%20%E5%8E%BB%E9%87%8D%E6%A3%80%E6%B5%8B&amp;url=/archives/typecho-halo-migration-view-cover" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FK0zw5kK2FsV.avif&amp;size=m" alt="Typecho迁移Halo完整教程"></p>
<h2 id="heading">前言</h2>
<p>Typecho 作为经典的 PHP 博客系统，以轻量简洁著称；而 Halo 作为基于 Java 的现代博客平台，在功能丰富度与扩展性上更胜一筹。对我来说 WordPress 过于臃肿、Typecho 过于简陋，而<strong>Halo 恰好处于两者的平衡点</strong>。</p>
<p>这段时间自己本地搭建体验后感觉真的不错，就试着研究如何迁移。然而，官方迁移插件在导入 Typecho 备份时无法识别数据，社区方案也各有缺陷。最终，基于 fghwett/typecho_to_halo 项目进行定制改造，实现了<strong>远程图床场景下的完美迁移</strong>。</p>
<p>所以这篇文章将详细介绍如何将 Typecho 的数据（文章、页面、评论、标签、分类等）完整迁移至 Halo，同时保留远程图床链接并自动提取文章封面图。</p>
<hr>
<h2 id="-vs-">方案对比：原项目 vs 本方案</h2>
<h3 id="heading-1">核心差异一览</h3>
<table>
 <thead>
  <tr>
   <th>功能维度</th>
   <th>原项目</th>
   <th>本方案</th>
   <th>适用场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><strong>附件迁移</strong></td>
   <td>下载至 Halo 附件库</td>
   <td>❌<strong>禁用</strong>（保留原链接）</td>
   <td>远程图床用户</td>
  </tr>
  <tr>
   <td><strong>封面图处理</strong></td>
   <td>无</td>
   <td>✅<strong>自动提取首图</strong></td>
   <td>需要视觉优化的博客</td>
  </tr>
  <tr>
   <td><strong>适用场景</strong></td>
   <td>本地附件存储</td>
   <td>CDN 加速链接保留</td>
   <td>又拍云/七牛云/阿里云 OSS 用户</td>
  </tr>
 </tbody>
</table>
<h3 id="heading-2">为什么禁用附件迁移？</h3>
<p>对于使用又拍云、七牛云等远程图床的博客，附件迁移反而会造成困扰：</p>
<ol>
 <li><strong>存储冗余</strong>：远程图片已具备 CDN 加速，无需重复存储至 Halo</li>
 <li><strong>性能损耗</strong>：下载再上传的过程浪费迁移时间</li>
 <li><strong>链接失效风险</strong>：迁移过程中可能导致图片链接断裂</li>
</ol>
<p><strong>解决方案</strong>：保留原始图床链接，直接享受 CDN 加速。</p>
<h3 id="heading-3">为什么添加自动提取封面图？</h3>
<p>Halo 支持为文章设置封面图（头图），能显著提升博客的视觉层次感。本方案通过正则表达式自动识别文章中的第一张远程图片，将其设为封面，省去手动配置的繁琐。</p>
<ul>
 <li>自动扫描文章内容中的第一张远程图片</li>
 <li>将其设置为文章的封面图</li>
 <li>无需手动一一设置，提升迁移效率</li>
</ul>
<hr>
<h2 id="heading-4">本版本更新内容</h2>
<p>基于之前版本（2026年4月14日发布），本版本进一步优化了数据迁移的稳定性和用户体验，主要更新包括：</p>
<ol>
 <li><strong>数据去重检查</strong>：新增 <code>loadExistingData()</code> 函数，迁移前预加载 Halo 已有数据，通过 slug 对比自动跳过已存在的标签、分类、文章和页面，避免重复导入。</li>
 <li><strong>配置完善</strong>：更新配置示例，修复目录名称错误，确保与 <code>config-example.yaml</code> 完全一致。</li>
 <li><strong>常见问题更新</strong>：针对用户反馈，更新了关于数据重复的解答，明确说明工具已具备去重能力。</li>
</ol>
<hr>
<h2 id="heading-5">技术实现：代码改造详解</h2>
<h3 id="heading-6">改造一：禁用附件迁移</h3>
<p><strong>文件</strong>：<code>apps/migrate/app.go</code></p>
<pre><code class="language-go">// 原代码
actions = append(actions, NewAction("迁移附件", app.migrateAttachments))

// 改造后（注释掉该行）
// actions = append(actions, NewAction("迁移附件", app.migrateAttachments))
</code></pre>
<h3 id="heading-7">改造二：新增封面图提取函数</h3>
<p><strong>文件</strong>：<code>internal/halo/post.go</code></p>
<pre><code class="language-go">/**
 * extractFirstImage 从文章内容中提取第一张远程图片URL
 * 支持 Markdown 图片语法：![alt](url)
 * 支持 HTML img 标签：&lt;img src="url"&gt;
 * 只提取 http:// 或 https:// 开头的远程图片
 */
func extractFirstImage(content string) string {
    // 匹配 Markdown 图片语法
    mdPattern := `!\[.*?\]\((https?://[^\s\)]+\.(?:jpg|jpeg|png|gif|webp|bmp|svg|ico))`
    mdRe := regexp.MustCompile(mdPattern)
    mdMatches := mdRe.FindStringSubmatch(content)
    if len(mdMatches) &gt; 1 {
        return mdMatches[1]
    }
  
    // 匹配 HTML img 标签
    htmlPattern := `&lt;img[^&gt;]+src=["'](https?://[^"']+\.(?:jpg|jpeg|png|gif|webp|bmp|svg|ico))["']`
    htmlRe := regexp.MustCompile(htmlPattern)
    htmlMatches := htmlRe.FindStringSubmatch(content)
    if len(htmlMatches) &gt; 1 {
        return htmlMatches[1]
    }
  
    return ""
}
</code></pre>
<h3 id="heading-8">改造三：集成封面图至文章迁移</h3>
<p><strong>文件</strong>：<code>apps/migrate/app.go</code> - <code>migratePosts</code> 函数内</p>
<pre><code class="language-go">// 提取文章封面图
cover := extractFirstImage(post.Content)

// 创建文章（新增 cover 参数）
postId, err := h.client.AddPost(halo.Post{
    Title:        post.Title,
    Content:      post.Content,
    Slug:         post.Slug,
    Tags:         tags,
    Categories:   categories,
    Status:       status,
    AllowComment: post.AllowComment,
    Cover:        cover,  // 新增封面图字段
}, h.policyName, h.groupName)
</code></pre>
<h3 id="-post-">改造四：扩展 Post 结构体</h3>
<p><strong>文件</strong>：<code>internal/halo/post.go</code></p>
<pre><code class="language-go">type Post struct {
    Title        string   `json:"title"`
    Content      string   `json:"content"`
    Slug         string   `json:"slug"`
    Tags         []string `json:"tags"`
    Categories   []string `json:"categories"`
    Status       string   `json:"status"`
    AllowComment bool     `json:"allowComment"`
    Cover        string   `json:"cover,omitempty"`  // 新增封面图字段
}

// AddPost 函数内添加封面图设置逻辑
func (c *Client) AddPost(post Post, policyName, groupName string) (string, error) {
    // ... 现有代码 ...
  
    if post.Cover != "" {
        postSetting.Spec.Template = "post"
        postSetting.CustomTemplate = fmt.Sprintf(`{"cover": "%s"}`, post.Cover)
    }
  
    // ... 后续代码 ...
}
</code></pre>
<hr>
<h2 id="heading-9">迁移工具原理剖析</h2>
<h3 id="heading-10">架构设计</h3>
<pre><code>┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   Typecho DB    │────▶│  typecho_to_halo │────▶│   Halo API      │
│   (MySQL)       │     │   (Go 程序)      │     │   (REST API)    │
└─────────────────┘     └─────────────────┘     └─────────────────┘
        │                        │                       │
        ▼                        ▼                       ▼
   - tc_contents           - 数据读取              - 创建文章
   - tc_metas              - 结构转换              - 创建分类
   - tc_comments           - API 调用              - 创建标签
   - tc_users              - 错误处理              - 创建评论
   - tc_relationships       - 日志输出              - 设置封面图
</code></pre>
<h3 id="heading-11">数据流转过程</h3>
<table>
 <thead>
  <tr>
   <th>阶段</th>
   <th>操作</th>
   <th>技术细节</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><strong>读取</strong></td>
   <td>GORM 连接 MySQL</td>
   <td>通过 DSN 连接 Typecho 数据库</td>
  </tr>
  <tr>
   <td><strong>转换</strong></td>
   <td>结构体映射</td>
   <td>Typecho 表结构 → Halo API 请求体</td>
  </tr>
  <tr>
   <td><strong>导入</strong></td>
   <td>REST API 调用</td>
   <td>使用 Halo Personal Access Token 认证</td>
  </tr>
  <tr>
   <td><strong>优化</strong></td>
   <td>封面图提取</td>
   <td>正则匹配文章内容中的远程图片</td>
  </tr>
 </tbody>
</table>
<h3 id="heading-12">迁移内容清单</h3>
<table>
 <thead>
  <tr>
   <th>数据类型</th>
   <th>迁移状态</th>
   <th>备注</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>标签 (Tags)</td>
   <td>✅ 完整支持</td>
   <td>包含名称、缩略名</td>
  </tr>
  <tr>
   <td>分类 (Categories)</td>
   <td>✅ 完整支持</td>
   <td>保留层级关系</td>
  </tr>
  <tr>
   <td>文章 (Posts)</td>
   <td>✅ 增强支持</td>
   <td><strong>自动提取封面图</strong></td>
  </tr>
  <tr>
   <td>页面 (Pages)</td>
   <td>✅ 完整支持</td>
   <td>独立页面如"关于"、“友链”</td>
  </tr>
  <tr>
   <td>评论 (Comments)</td>
   <td>✅ 完整支持</td>
   <td>保留评论层级结构</td>
  </tr>
  <tr>
   <td>附件 (Attachments)</td>
   <td>❌ 已禁用</td>
   <td>远程图床链接保留</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="heading-13">环境准备</h2>
<h3 id="heading-14">版本要求</h3>
<table>
 <thead>
  <tr>
   <th>组件</th>
   <th>版本</th>
   <th>说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>Typecho</td>
   <td>1.3.0</td>
   <td>测试通过版本</td>
  </tr>
  <tr>
   <td>Halo</td>
   <td>2.23.3</td>
   <td>测试通过版本</td>
  </tr>
  <tr>
   <td>Go</td>
   <td>1.20+</td>
   <td>如需自行编译</td>
  </tr>
 </tbody>
</table>
<h3 id="heading-15">前置检查清单</h3>
<ul>
 <li><input disabled type="checkbox"> Halo 已安装并正常运行</li>
 <li><input disabled type="checkbox"> 已获取 Halo <strong>Personal Access Token</strong>（路径：Halo 后台 → 用户 → 个人令牌 → 生成新令牌）</li>
 <li><input disabled type="checkbox"> 确认 Typecho 数据库可远程访问</li>
 <li><input disabled type="checkbox"> 记录 Typecho 表前缀（如 <code>tc_</code> 或默认的 <code>typecho_</code>）</li>
</ul>
<hr>
<h2 id="heading-16">实操步骤</h2>
<h3 id="heading-17">第一步：获取迁移工具</h3>
<pre><code class="language-bash"># 克隆仓库（注意是下划线，非连字符）
git clone https://github.com/NoEggEgg/ty2halo.git
cd typecho_to_halo
</code></pre>
<h3 id="heading-18">第二步：配置文件</h3>
<pre><code class="language-bash"># 复制示例配置
cp config-example.yaml config.yaml
</code></pre>
<p><strong>config.yaml 配置详解</strong>：</p>
<blockquote>
 <p><strong>更新说明</strong>：配置格式已更新，与 <code>config-example.yaml</code> 保持完全一致。新增 <code>prefix</code> 字段，优化了配置结构。</p>
</blockquote>
<pre><code class="language-yaml">typecho:
  type: mysql
  # ⚠️ 必须以斜杠结尾！否则附件下载会报错：lookup xxx.comfiles: no such host
  baseUrl: https://your-domain.com/
  dsn: "username:password@tcp(host:port)/dbname?charset=utf8mb4&amp;parseTime=True&amp;loc=Local"
  prefix: typecho_ # 数据库表前缀，默认为 typecho_
  
halo:
  host: your-halo-host:8090
  schema: http        # 或 https
  token: "your-pat-token"
  debug: false
  policyName: default-policy
  groupName: ""

fileManager:
  dir: ./_tmp/        # 临时文件目录
</code></pre>
<h3 id="heading-19">第三步：处理非默认表前缀</h3>
<p><strong>问题现象</strong>：若 Typecho 使用 <code>tc_</code> 而非默认的 <code>typecho_</code> 前缀，运行时会报错 <code>Table 'dbname.typecho_metas' doesn't exist</code>。</p>
<p><strong>解决方案</strong>：在 MySQL 中创建视图映射</p>
<pre><code class="language-sql">USE your_database_name;

-- 创建视图映射（将 tc_* 映射为 typecho_*）
CREATE OR REPLACE VIEW typecho_metas AS SELECT * FROM tc_metas;
CREATE OR REPLACE VIEW typecho_contents AS SELECT * FROM tc_contents;
CREATE OR REPLACE VIEW typecho_comments AS SELECT * FROM tc_comments;
CREATE OR REPLACE VIEW typecho_users AS SELECT * FROM tc_users;
CREATE OR REPLACE VIEW typecho_options AS SELECT * FROM tc_options;
CREATE OR REPLACE VIEW typecho_fields AS SELECT * FROM tc_fields;
CREATE OR REPLACE VIEW typecho_relationships AS SELECT * FROM tc_relationships;
</code></pre>
<p><strong>清理视图</strong>（迁移完成后执行）：</p>
<pre><code class="language-sql">USE your_database_name;

DROP VIEW IF EXISTS typecho_metas;
DROP VIEW IF EXISTS typecho_contents;
DROP VIEW IF EXISTS typecho_comments;
DROP VIEW IF EXISTS typecho_users;
DROP VIEW IF EXISTS typecho_options;
DROP VIEW IF EXISTS typecho_fields;
DROP VIEW IF EXISTS typecho_relationships;
</code></pre>
<h3 id="heading-20">第四步：执行迁移</h3>
<p><strong>方式一：使用预编译版本（推荐）</strong></p>
<pre><code class="language-bash"># Windows
ty2halo.exe

# Linux / macOS
./ty2halo
</code></pre>
<p><strong>方式二：自行编译</strong></p>
<pre><code class="language-bash">go mod tidy
go build -o ty2halo.exe
</code></pre>
<p><strong>迁移执行顺序</strong>：</p>
<ol>
 <li>✅ 迁移标签</li>
 <li>✅ 迁移分类</li>
 <li>
  <del>❌ 迁移附件</del>
  （已禁用）
 </li>
 <li>✅ 迁移文章（自动提取封面图）</li>
 <li>✅ 迁移页面</li>
 <li>✅ 迁移评论</li>
</ol>
<hr>
<h2 id="heading-21">验证与验收</h2>
<p>登录 Halo 后台核对数据完整性：</p>
<table>
 <thead>
  <tr>
   <th>数据类型</th>
   <th>预期结果</th>
   <th>验证状态</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>标签</td>
   <td>与 Typecho 一致</td>
   <td>✅</td>
  </tr>
  <tr>
   <td>分类</td>
   <td>层级结构保留</td>
   <td>✅</td>
  </tr>
  <tr>
   <td>附件</td>
   <td>0 个（远程图床保留）</td>
   <td>✅</td>
  </tr>
  <tr>
   <td>文章</td>
   <td>111 篇（示例）</td>
   <td>✅</td>
  </tr>
  <tr>
   <td>页面</td>
   <td>独立页面完整</td>
   <td>✅</td>
  </tr>
  <tr>
   <td>评论</td>
   <td>739 条（示例）</td>
   <td>✅</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="heading-22">常见问题速查</h2>
<h3 id="q1">Q1：重复数据如何处理？</h3>
<p><strong>现象</strong>：多次运行后标签/分类重复。</p>
<p><strong>原因</strong>：
 <del>工具未做重复检测。</del>
 <strong>更新</strong>：工具已添加数据去重检查。</p>
<p><strong>解决</strong>：</p>
<ul>
 <li>
  <del>在 Halo 后台删除重复数据后重新运行</del>
 </li>
 <li>
  <del>或修改源码添加存在性检查（需重新编译）</del>
 </li>
 <li><strong>新增</strong>：工具已内置数据去重功能，会先查询 Halo 中已存在的数据（通过 slug 对比），自动跳过已存在的标签、分类、文章和页面。但如果手动删除 Halo 数据后重新迁移，仍然会正常导入。</li>
</ul>
<h3 id="q2-lookup-xxxcomfiles-no-such-host">Q2：附件下载报错 <code>lookup xxx.comfiles: no such host</code></h3>
<p><strong>原因</strong>：<code>baseUrl</code> 缺少末尾斜杠，导致 URL 拼接错误。</p>
<p><strong>解决</strong>：确保 <code>baseUrl</code> 以 <code>/</code> 结尾，如 <code>https://example.com/</code>。</p>
<h3 id="q3">Q3：表前缀不匹配</h3>
<p><strong>解决</strong>：使用上述数据库视图方案，或修改源码中的表名常量。</p>
<h3 id="q4">Q4：如何恢复附件迁移功能？</h3>
<p>如需将附件下载至 Halo 本地（不推荐远程图床场景）：</p>
<pre><code class="language-go">// apps/migrate/app.go
// 取消注释以下行
actions = append(actions, NewAction("迁移附件", app.migrateAttachments))
</code></pre>
<h3 id="q5">Q5：封面图提取规则是什么？</h3>
<table>
 <thead>
  <tr>
   <th>项目</th>
   <th>规则</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><strong>匹配范围</strong></td>
   <td>仅远程图片（<code>http://</code> 或 <code>https://</code> 开头）</td>
  </tr>
  <tr>
   <td><strong>语法支持</strong></td>
   <td>Markdown <code>![alt](url)</code> 与 HTML <code>![](url)</code></td>
  </tr>
  <tr>
   <td><strong>格式支持</strong></td>
   <td>jpg, jpeg, png, gif, webp, bmp, svg, ico</td>
  </tr>
  <tr>
   <td><strong>优先级</strong></td>
   <td>取文章中第一张符合条件的图片</td>
  </tr>
  <tr>
   <td><strong>手动调整</strong></td>
   <td>可在 Halo 后台修改封面图</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="heading-23">总结</h2>
<p>通过定制化的 <code>ty2halo</code> 工具，我们实现了：</p>
<table>
 <thead>
  <tr>
   <th>优化点</th>
   <th>效果</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><strong>禁用附件迁移</strong></td>
   <td>保留远程图床 CDN 加速，节省存储与时间</td>
  </tr>
  <tr>
   <td><strong>自动提取封面图</strong></td>
   <td>提升博客视觉体验，减少手动配置</td>
  </tr>
  <tr>
   <td><strong>数据去重检查</strong></td>
   <td><strong>新增</strong>：自动跳过已存在的数据，避免重复导入，提升迁移稳定性</td>
  </tr>
  <tr>
   <td><strong>最小化代码改动</strong></td>
   <td>基于原项目结构，降低维护成本</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="heading-24">后续</h2>
<p>这篇文章会持续更新，因为迁移后还有各种其他问题需要调试，比如固定链接等，有点小麻烦。</p>
<p><strong>最后更新</strong>：2026年4月20日（添加数据去重检查等优化）</p>
<hr>
<h2 id="heading-25">参考资源</h2>
<ul>
 <li>仓库地址：https://github.com/NoEggEgg/ty2halo</li>
 <li>原项目仓库地址：https://github.com/fghwett/typecho_to_halo</li>
 <li>Halo 官方文档：https://docs.halo.run</li>
 <li>Typecho 官方网站：https://typecho.org</li>
</ul>
<p>‍</p>]]></description><guid isPermaLink="false">/archives/typecho-halo-migration-view-cover</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FK0zw5kK2FsV.avif&amp;size=m" type="image/jpeg" length="40772"/><category>技巧</category><category>分享</category><pubDate>Tue, 14 Apr 2026 08:21:00 GMT</pubDate></item><item><title><![CDATA[我的 CodeBuddy 装备库：218个技能全公开 + 使用心得]]></title><link>https://wuqishi.com/archives/codebuddy-equipment-library-218-skills-guide-experience</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%88%91%E7%9A%84%20CodeBuddy%20%E8%A3%85%E5%A4%87%E5%BA%93%EF%BC%9A218%E4%B8%AA%E6%8A%80%E8%83%BD%E5%85%A8%E5%85%AC%E5%BC%80%20%2B%20%E4%BD%BF%E7%94%A8%E5%BF%83%E5%BE%97&amp;url=/archives/codebuddy-equipment-library-218-skills-guide-experience" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2Fj5os9YLfIlq.avif&amp;size=m" alt="我的 CodeBuddy 装备库：218个技能全公开 + 使用心得"></p>
<blockquote>
 <p>CodeBuddy 技能配置：218个技能覆盖开发流程、数据处理、微信生态等10大场景，包含从 addyosmani/agent-skills 引入的19个生产级工程技能及完整使用心得。</p>
</blockquote>
<hr>
<h2 id="前言">前言</h2>
<p>使用 AI 编程助手已经一年多了，从最初的简单问答，到现在的全流程开发辅助，核心在于<strong>技能的积累与配置</strong>。</p>
<p>今天把我正在使用的 <strong>62 个用户技能 + 156 个市场技能</strong>整理成文，分享我的配置思路与使用场景。</p>
<hr>
<h2 id="一-为什么技能比模型更重要-">一、为什么技能比模型更重要？</h2>
<pre><code>模型 = 能力基础
技能 = 专精领域
配置 = 工作流程
</code></pre>
<p>同样的模型，装载不同的技能，就是不同的专家角色：</p>
<ul>
 <li>加载 <code>code-review-and-quality</code> → 资深代码审查员</li>
 <li>加载 <code>security-and-hardening</code> → 安全工程师</li>
 <li>加载 <code>planning-and-task-breakdown</code> → 项目架构师</li>
</ul>
<hr>
<h2 id="二-用户技能完整清单--62个-">二、用户技能完整清单 (62个)</h2>
<blockquote>
 <p>位于：<code>~/.codebuddy/skills/</code></p>
</blockquote>
<h3 id="--开发流程--19个---核心技能">⚡ 开发流程 (19个) ⭐核心技能</h3>
<p>这是从 <a href="https://github.com/addyosmani/agent-skills">addyosmani/agent-skills</a> 引入的生产级工程技能！</p>
<h4 id="需求到发布完整链路">需求到发布完整链路</h4>
<div class="language-mermaid">graph LR A[idea-refine] --&gt; B[spec-driven-development] B --&gt; C[planning-and-task-breakdown] C --&gt; D[incremental-implementation] D --&gt; E[test-driven-development] E --&gt; F[code-review-and-quality] F --&gt; G[shipping-and-launch]</div>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>定位</th>
   <th>核心价值</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>idea-refine</code></td>
   <td>构思</td>
   <td>模糊想法 → 具体提案</td>
  </tr>
  <tr>
   <td>​<code>spec-driven-development</code></td>
   <td>规范</td>
   <td>PRD 先行</td>
  </tr>
  <tr>
   <td>​<code>planning-and-task-breakdown</code></td>
   <td>规划</td>
   <td>任务拆解</td>
  </tr>
  <tr>
   <td>​<code>incremental-implementation</code></td>
   <td>实现</td>
   <td>薄垂直切片</td>
  </tr>
  <tr>
   <td>​<code>test-driven-development</code></td>
   <td>测试</td>
   <td>红绿重构</td>
  </tr>
  <tr>
   <td>​<code>code-review-and-quality</code></td>
   <td>审查</td>
   <td>五轴审查</td>
  </tr>
  <tr>
   <td>​<code>shipping-and-launch</code></td>
   <td>发布</td>
   <td>安全上线</td>
  </tr>
  <tr>
   <td>​<code>frontend-ui-engineering</code></td>
   <td>前端</td>
   <td>UI组件架构</td>
  </tr>
  <tr>
   <td>​<code>api-and-interface-design</code></td>
   <td>API</td>
   <td>契约优先设计</td>
  </tr>
  <tr>
   <td>​<code>context-engineering</code></td>
   <td>上下文</td>
   <td>正确信息在正确时间</td>
  </tr>
  <tr>
   <td>​<code>code-simplification</code></td>
   <td>简化</td>
   <td>清晰度优于巧妙性</td>
  </tr>
  <tr>
   <td>​<code>security-and-hardening</code></td>
   <td>安全</td>
   <td>OWASP Top 10</td>
  </tr>
  <tr>
   <td>​<code>performance-optimization</code></td>
   <td>性能</td>
   <td>测量优先</td>
  </tr>
  <tr>
   <td>​<code>debugging-and-error-recovery</code></td>
   <td>调试</td>
   <td>五步处理法</td>
  </tr>
  <tr>
   <td>​<code>ci-cd-and-automation</code></td>
   <td>CI/CD</td>
   <td>左移原则</td>
  </tr>
  <tr>
   <td>​<code>git-workflow-and-versioning</code></td>
   <td>Git</td>
   <td>规范分支管理</td>
  </tr>
  <tr>
   <td>​<code>documentation-and-adrs</code></td>
   <td>文档</td>
   <td>架构决策记录</td>
  </tr>
  <tr>
   <td>​<code>deprecation-and-migration</code></td>
   <td>迁移</td>
   <td>代码即负债</td>
  </tr>
  <tr>
   <td>​<code>browser-testing-with-devtools</code></td>
   <td>测试</td>
   <td>DevTools调试</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--数据处理--6个-">📊 数据处理 (6个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>ai-data-analysis</code></td>
   <td>数据分析</td>
   <td>报表解读、趋势分析</td>
  </tr>
  <tr>
   <td>​<code>excel-xlsx</code></td>
   <td>Excel处理</td>
   <td>公式、批量操作</td>
  </tr>
  <tr>
   <td>​<code>excel-weekly-dashboard</code></td>
   <td>Excel仪表盘</td>
   <td>KPI周报</td>
  </tr>
  <tr>
   <td>​<code>xlsx-pro</code></td>
   <td>专业Excel</td>
   <td>高阶操作</td>
  </tr>
  <tr>
   <td>​<code>sheetsmith</code></td>
   <td>CSV/Excel管理</td>
   <td>数据清洗、格式转换</td>
  </tr>
  <tr>
   <td>​<code>sheet-cog</code></td>
   <td>高级表格</td>
   <td>财务模型、数据追踪</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--内容创作--6个-">🎨 内容创作 (6个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>copywriter</code></td>
   <td>专业文案</td>
   <td>营销文案、UX文案</td>
  </tr>
  <tr>
   <td>​<code>humanizer</code></td>
   <td>文本润色</td>
   <td>去AI味、更自然</td>
  </tr>
  <tr>
   <td>​<code>humanizer-zh</code></td>
   <td>中文润色</td>
   <td>中文文本优化</td>
  </tr>
  <tr>
   <td>​<code>humanize-ai-text</code></td>
   <td>AI文本优化</td>
   <td>通过AI检测</td>
  </tr>
  <tr>
   <td>​<code>seo</code></td>
   <td>SEO优化</td>
   <td>文章排名、内容优化</td>
  </tr>
  <tr>
   <td>​<code>summarize</code></td>
   <td>内容摘要</td>
   <td>长文提炼</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--微信生态--6个-">💬 微信生态 (6个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>wechat</code></td>
   <td>微信基础</td>
   <td>自动回复、消息处理</td>
  </tr>
  <tr>
   <td>​<code>wechat-auto-reply</code></td>
   <td>智能回复</td>
   <td>客服自动化</td>
  </tr>
  <tr>
   <td>​<code>wechat-article-search</code></td>
   <td>文章搜索</td>
   <td>内容创作素材</td>
  </tr>
  <tr>
   <td>​<code>wechat-mp-cn</code></td>
   <td>小程序开发</td>
   <td>微信生态开发</td>
  </tr>
  <tr>
   <td>​<code>wechat-mp-writer-skill-mxx</code></td>
   <td>小程序写作</td>
   <td>公众号内容</td>
  </tr>
  <tr>
   <td>​<code>wechat-sender</code></td>
   <td>微信发送</td>
   <td>自动化推送</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="---图像处理--3个-">🖼️ 图像处理 (3个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>image</code></td>
   <td>图像处理</td>
   <td>格式转换、压缩优化</td>
  </tr>
  <tr>
   <td>​<code>image-cog</code></td>
   <td>AI图像生成</td>
   <td>产品图、设计素材</td>
  </tr>
  <tr>
   <td>​<code>nano-banana-pro</code></td>
   <td>高级图像生成</td>
   <td>4K高清、专业设计</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--搜索工具--3个-">🔍 搜索工具 (3个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>web-search</code></td>
   <td>通用搜索</td>
   <td>联网搜索</td>
  </tr>
  <tr>
   <td>​<code>baidu-search</code></td>
   <td>百度搜索</td>
   <td>中文搜索</td>
  </tr>
  <tr>
   <td>​<code>openclaw-tavily-search</code></td>
   <td>深度搜索</td>
   <td>Tavily专业搜索</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="---效率工具--7个-">🛠️ 效率工具 (7个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>agent-browser</code></td>
   <td>浏览器自动化</td>
   <td>UI自动化测试</td>
  </tr>
  <tr>
   <td>​<code>ai-ppt-generator</code></td>
   <td>PPT生成</td>
   <td>AI智能生成</td>
  </tr>
  <tr>
   <td>​<code>data-analyst</code></td>
   <td>数据分析</td>
   <td>数据报告、趋势解读</td>
  </tr>
  <tr>
   <td>​<code>markdown-converter</code></td>
   <td>格式转换</td>
   <td>文档格式互转</td>
  </tr>
  <tr>
   <td>​<code>github</code></td>
   <td>GitHub操作</td>
   <td>PR/Issue/Action</td>
  </tr>
  <tr>
   <td>​<code>marketing-mode</code></td>
   <td>营销模式</td>
   <td>营销内容创作</td>
  </tr>
  <tr>
   <td>​<code>office</code></td>
   <td>Office文档</td>
   <td>Word/Excel/PPT</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--AI助手进化--5个-">🧠 AI助手进化 (5个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>proactive-agent</code></td>
   <td>主动式Agent</td>
   <td>预见性任务执行</td>
  </tr>
  <tr>
   <td>​<code>self-improving-agent</code></td>
   <td>自我迭代</td>
   <td>持续学习改进</td>
  </tr>
  <tr>
   <td>​<code>memory-manager</code></td>
   <td>记忆管理</td>
   <td>压缩快照语义搜索</td>
  </tr>
  <tr>
   <td>​<code>code-standard</code></td>
   <td><strong>自定义代码规范</strong></td>
   <td>个人工作原则</td>
  </tr>
  <tr>
   <td>​<code>skill-vetter</code></td>
   <td>技能质量审核</td>
   <td>安全审查</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--社交媒体--1个-">📱 社交媒体 (1个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>xhs</code></td>
   <td>小红书</td>
   <td>内容创作</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--办公套件--2个-">🏢 办公套件 (2个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>wps-office</code></td>
   <td>WPS文档</td>
   <td>金山办公文档</td>
  </tr>
  <tr>
   <td>​<code>system-data-intelligence</code></td>
   <td>系统数据分析</td>
   <td>IT系统分析</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--设计-UI--1个-">🎨 设计/UI (1个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>ui-ux-pro-max</code></td>
   <td>UIUX设计</td>
   <td>CSV生成设计参考</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--系统-工具--2个-">🔄 系统/工具 (2个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>auto-updater</code></td>
   <td>自动更新</td>
   <td>每日自动更新</td>
  </tr>
  <tr>
   <td>​<code>using-agent-skills</code></td>
   <td>技能使用指南</td>
   <td>agent-skills入门</td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="--测试--1个-">🧪 测试 (1个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
   <th>场景</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>test-user-skill</code></td>
   <td>技能测试</td>
   <td>测试技能功能</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="三-市场技能完整清单--156个-">三、市场技能完整清单 (156个)</h2>
<blockquote>
 <p>位于：<code>~/.codebuddy/skills-marketplace/skills/</code></p>
</blockquote>
<h3 id="--开发工具--38个-">🔧 开发工具 (38个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>android-native-dev</code></td>
   <td>Android原生开发</td>
  </tr>
  <tr>
   <td>​<code>api-gateway</code></td>
   <td>API网关配置</td>
  </tr>
  <tr>
   <td>​<code>browser</code></td>
   <td>浏览器操作</td>
  </tr>
  <tr>
   <td>​<code>browser-cash</code></td>
   <td>浏览器缓存</td>
  </tr>
  <tr>
   <td>​<code>browser-use</code></td>
   <td>浏览器使用</td>
  </tr>
  <tr>
   <td>​<code>browserwing</code></td>
   <td>浏览器扩展</td>
  </tr>
  <tr>
   <td>​<code>clawbrowser</code></td>
   <td>Claw浏览器</td>
  </tr>
  <tr>
   <td>​<code>cli-anything-hub</code></td>
   <td>CLI工具中心</td>
  </tr>
  <tr>
   <td>​<code>cloudbase</code></td>
   <td>腾讯云开发</td>
  </tr>
  <tr>
   <td>​<code>cnb-skill</code></td>
   <td>CNB技能</td>
  </tr>
  <tr>
   <td>​<code>deep-research</code></td>
   <td>深度研究</td>
  </tr>
  <tr>
   <td>​<code>flutter-dev</code></td>
   <td>Flutter开发</td>
  </tr>
  <tr>
   <td>​<code>frontend-dev</code></td>
   <td>前端开发</td>
  </tr>
  <tr>
   <td>​<code>fullstack-dev</code></td>
   <td>全栈开发</td>
  </tr>
  <tr>
   <td>​<code>github</code></td>
   <td>GitHub操作</td>
  </tr>
  <tr>
   <td>​<code>gifgrep</code></td>
   <td>GIF搜索</td>
  </tr>
  <tr>
   <td>​<code>ios-application-dev</code></td>
   <td>iOS应用开发</td>
  </tr>
  <tr>
   <td>​<code>lark-unified</code></td>
   <td>飞书集成</td>
  </tr>
  <tr>
   <td>​<code>mcporter</code></td>
   <td>MCP工具</td>
  </tr>
  <tr>
   <td>​<code>mcp-builder</code></td>
   <td>MCP构建器</td>
  </tr>
  <tr>
   <td>​<code>playwright-browser-automation</code></td>
   <td>浏览器自动化</td>
  </tr>
  <tr>
   <td>​<code>playwright-scraper-skill</code></td>
   <td>网页爬取</td>
  </tr>
  <tr>
   <td>​<code>qmd</code></td>
   <td>Quarto文档</td>
  </tr>
  <tr>
   <td>​<code>react-native-dev</code></td>
   <td>React Native开发</td>
  </tr>
  <tr>
   <td>​<code>shader-dev</code></td>
   <td>Shader开发</td>
  </tr>
  <tr>
   <td>​<code>smooth-browser</code></td>
   <td>流畅浏览器</td>
  </tr>
  <tr>
   <td>​<code>stagehand-browser-cli</code></td>
   <td>浏览器CLI</td>
  </tr>
  <tr>
   <td>​<code>stealth-browser</code></td>
   <td>隐身浏览器</td>
  </tr>
  <tr>
   <td>​<code>tencentcloud-cos</code></td>
   <td>腾讯云COS</td>
  </tr>
  <tr>
   <td>​<code>tencent-docs</code></td>
   <td>腾讯文档</td>
  </tr>
  <tr>
   <td>​<code>tmux</code></td>
   <td>终端复用</td>
  </tr>
  <tr>
   <td>​<code>wacli</code></td>
   <td>WA CLI工具</td>
  </tr>
  <tr>
   <td>​<code>web-access</code></td>
   <td>网页访问</td>
  </tr>
  <tr>
   <td>​<code>web-scraper</code></td>
   <td>网页爬虫</td>
  </tr>
  <tr>
   <td>​<code>web-search-exa</code></td>
   <td>Exa搜索</td>
  </tr>
  <tr>
   <td>​<code>xurl</code></td>
   <td>URL工具</td>
  </tr>
  <tr>
   <td>​<code>zenstudio</code></td>
   <td>Zen开发</td>
  </tr>
 </tbody>
</table>
<h3 id="--微信-小程序--9个-">📱 微信/小程序 (9个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>wechat-article-search</code></td>
   <td>微信文章搜索</td>
  </tr>
  <tr>
   <td>​<code>wechat-miniprogram</code></td>
   <td>微信小程序</td>
  </tr>
  <tr>
   <td>​<code>wechatpay-basic-payment</code></td>
   <td>微信支付基础</td>
  </tr>
  <tr>
   <td>​<code>wechatpay-product-coupon</code></td>
   <td>微信优惠券</td>
  </tr>
  <tr>
   <td>​<code>tencent-meeting-skill</code></td>
   <td>腾讯会议</td>
  </tr>
  <tr>
   <td>​<code>tencent-news</code></td>
   <td>腾讯新闻</td>
  </tr>
  <tr>
   <td>​<code>tencent-survey</code></td>
   <td>腾讯问卷</td>
  </tr>
  <tr>
   <td>​<code>tencent-ssv-techforgood</code></td>
   <td>腾讯公益</td>
  </tr>
  <tr>
   <td>​<code>tencentmap-jsapi-gl-skill</code></td>
   <td>腾讯地图JSAPI</td>
  </tr>
 </tbody>
</table>
<h3 id="---地图-位置服务--5个-">🗺️ 地图/位置服务 (5个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>tencentmap-lbs-skill</code></td>
   <td>腾讯LBS服务</td>
  </tr>
  <tr>
   <td>​<code>tencentmap-miniprogram-skill</code></td>
   <td>腾讯地图小程序</td>
  </tr>
  <tr>
   <td>​<code>tencentmap-webservice-skill</code></td>
   <td>腾讯地图Web服务</td>
  </tr>
 </tbody>
</table>
<h3 id="--数据-金融--12个-">📊 数据/金融 (12个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>arxiv-reader</code></td>
   <td>ArXiv论文阅读</td>
  </tr>
  <tr>
   <td>​<code>arxiv-watcher</code></td>
   <td>ArXiv监控</td>
  </tr>
  <tr>
   <td>​<code>cos-vectors</code></td>
   <td>向量存储</td>
  </tr>
  <tr>
   <td>​<code>earnings-tracker</code></td>
   <td>收益追踪</td>
  </tr>
  <tr>
   <td>​<code>finance-ops</code></td>
   <td>金融运营</td>
  </tr>
  <tr>
   <td>​<code>fintech-engineer</code></td>
   <td>金融科技</td>
  </tr>
  <tr>
   <td>​<code>macro-monitor</code></td>
   <td>宏观监控</td>
  </tr>
  <tr>
   <td>​<code>neodata-financial-search</code></td>
   <td>金融数据搜索</td>
  </tr>
  <tr>
   <td>​<code>revenue-intelligence</code></td>
   <td>营收智能</td>
  </tr>
  <tr>
   <td>​<code>citation-manager</code></td>
   <td>引用管理</td>
  </tr>
  <tr>
   <td>​<code>notebooklm-studio</code></td>
   <td>NotebookLM工作室</td>
  </tr>
  <tr>
   <td>​<code>llm-wiki</code></td>
   <td>LLM知识库</td>
  </tr>
 </tbody>
</table>
<h3 id="--文档-笔记--14个-">📝 文档/笔记 (14个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>FBS-BookWriter</code></td>
   <td>书籍写作</td>
  </tr>
  <tr>
   <td>​<code>apple-notes</code></td>
   <td>Apple笔记</td>
  </tr>
  <tr>
   <td>​<code>apple-reminders</code></td>
   <td>Apple提醒</td>
  </tr>
  <tr>
   <td>​<code>blogwatcher</code></td>
   <td>博客监控</td>
  </tr>
  <tr>
   <td>​<code>canvas-design</code></td>
   <td>Canvas设计</td>
  </tr>
  <tr>
   <td>​<code>himalaya</code></td>
   <td>邮件管理</td>
  </tr>
  <tr>
   <td>​<code>imap-smtp-email</code></td>
   <td>邮件收发</td>
  </tr>
  <tr>
   <td>​<code>lexiang-knowledge-base</code></td>
   <td>乐享知识库</td>
  </tr>
  <tr>
   <td>​<code>note-organizer</code></td>
   <td>笔记整理</td>
  </tr>
  <tr>
   <td>​<code>obsidian</code></td>
   <td>Obsidian笔记</td>
  </tr>
  <tr>
   <td>​<code>qq-email</code></td>
   <td>QQ邮箱</td>
  </tr>
  <tr>
   <td>​<code>skyline</code></td>
   <td>天际线笔记</td>
  </tr>
  <tr>
   <td>​<code>things-mac</code></td>
   <td>Things待办</td>
  </tr>
  <tr>
   <td>​<code>yourself-skill</code></td>
   <td>个人信息管理</td>
  </tr>
 </tbody>
</table>
<h3 id="--媒体-视频--12个-">🎬 媒体/视频 (12个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>admapix</code></td>
   <td>广告素材</td>
  </tr>
  <tr>
   <td>​<code>awesome-design-md</code></td>
   <td>设计素材</td>
  </tr>
  <tr>
   <td>​<code>canvas-design</code></td>
   <td>画布设计</td>
  </tr>
  <tr>
   <td>​<code>deck-generator</code></td>
   <td>幻灯片生成</td>
  </tr>
  <tr>
   <td>​<code>gif-sticker-maker</code></td>
   <td>GIF贴纸制作</td>
  </tr>
  <tr>
   <td>​<code>openai-image-gen</code></td>
   <td>AI图像生成</td>
  </tr>
  <tr>
   <td>​<code>openai-whisper</code></td>
   <td>语音转文字</td>
  </tr>
  <tr>
   <td>​<code>openai-whisper-api</code></td>
   <td>Whisper API</td>
  </tr>
  <tr>
   <td>​<code>podcast-ops</code></td>
   <td>播客运营</td>
  </tr>
  <tr>
   <td>​<code>pptx-generator</code></td>
   <td>PPT生成</td>
  </tr>
  <tr>
   <td>​<code>remotion-video-toolkit</code></td>
   <td>视频工具包</td>
  </tr>
  <tr>
   <td>​<code>video-frames</code></td>
   <td>视频帧处理</td>
  </tr>
 </tbody>
</table>
<h3 id="--邮件-日历--6个-">📧 邮件/日历 (6个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>agent-mail</code></td>
   <td>邮件代理</td>
  </tr>
  <tr>
   <td>​<code>caldav-calendar</code></td>
   <td>日历同步</td>
  </tr>
  <tr>
   <td>​<code>email-skill</code></td>
   <td>邮件技能</td>
  </tr>
  <tr>
   <td>​<code>imap-smtp-email</code></td>
   <td>SMTP邮件</td>
  </tr>
  <tr>
   <td>​<code>qq-email</code></td>
   <td>QQ邮箱</td>
  </tr>
 </tbody>
</table>
<h3 id="--Agent-AI--20个-">🤖 Agent/AI (20个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>agent-browser-core</code></td>
   <td>浏览器核心Agent</td>
  </tr>
  <tr>
   <td>​<code>agent-mbti</code></td>
   <td>MBTI风格Agent</td>
  </tr>
  <tr>
   <td>​<code>agent-team-orchestration</code></td>
   <td>Agent团队编排</td>
  </tr>
  <tr>
   <td>​<code>autoresearch</code></td>
   <td>自动研究</td>
  </tr>
  <tr>
   <td>​<code>capability-evolver</code></td>
   <td>能力进化</td>
  </tr>
  <tr>
   <td>​<code>cloudq</code></td>
   <td>云队列</td>
  </tr>
  <tr>
   <td>​<code>colleague-skill</code></td>
   <td>同事技能</td>
  </tr>
  <tr>
   <td>​<code>content-factory</code></td>
   <td>内容工厂</td>
  </tr>
  <tr>
   <td>​<code>content-ops</code></td>
   <td>内容运营</td>
  </tr>
  <tr>
   <td>​<code>idea-validator</code></td>
   <td>创意验证</td>
  </tr>
  <tr>
   <td>​<code>ima-skills</code></td>
   <td>IMA技能</td>
  </tr>
  <tr>
   <td>​<code>impeccable</code></td>
   <td>完美主义</td>
  </tr>
  <tr>
   <td>​<code>imsg</code></td>
   <td>即时消息</td>
  </tr>
  <tr>
   <td>​<code>model-usage</code></td>
   <td>模型使用</td>
  </tr>
  <tr>
   <td>​<code>oracle</code></td>
   <td>预言家</td>
  </tr>
  <tr>
   <td>​<code>outbound-engine</code></td>
   <td>外呼引擎</td>
  </tr>
  <tr>
   <td>​<code>peekaboo</code></td>
   <td>观察者</td>
  </tr>
  <tr>
   <td>​<code>perplexity</code></td>
   <td>困惑度搜索</td>
  </tr>
  <tr>
   <td>​<code>prompt-engineering-expert</code></td>
   <td>Prompt工程</td>
  </tr>
  <tr>
   <td>​<code>skill-creator</code></td>
   <td>技能创建</td>
  </tr>
 </tbody>
</table>
<h3 id="--安全-质量--4个-">🔒 安全/质量 (4个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>anti-distill</code></td>
   <td>反蒸馏</td>
  </tr>
  <tr>
   <td>​<code>find-skills</code></td>
   <td>技能发现</td>
  </tr>
  <tr>
   <td>​<code>skills-security-check</code></td>
   <td>技能安全检查</td>
  </tr>
  <tr>
   <td>​<code>skill-scanner</code></td>
   <td>技能扫描</td>
  </tr>
 </tbody>
</table>
<h3 id="--商业-营销--15个-">💼 商业/营销 (15个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>andonq</code></td>
   <td>安灯系统</td>
  </tr>
  <tr>
   <td>​<code>boss-skills</code></td>
   <td>老板技能</td>
  </tr>
  <tr>
   <td>​<code>brand-guidelines</code></td>
   <td>品牌指南</td>
  </tr>
  <tr>
   <td>​<code>content-repurposer</code></td>
   <td>内容再利用</td>
  </tr>
  <tr>
   <td>​<code>conversion-ops</code></td>
   <td>转化运营</td>
  </tr>
  <tr>
   <td>​<code>didi-ride-skill</code></td>
   <td>滴滴出行</td>
  </tr>
  <tr>
   <td>​<code>education</code></td>
   <td>教育</td>
  </tr>
  <tr>
   <td>​<code>github-ai-trends</code></td>
   <td>GitHub趋势</td>
  </tr>
  <tr>
   <td>​<code>github-trending-cn</code></td>
   <td>GitHub中文趋势</td>
  </tr>
  <tr>
   <td>​<code>goal-tracker</code></td>
   <td>目标追踪</td>
  </tr>
  <tr>
   <td>​<code>gog</code></td>
   <td>出发</td>
  </tr>
  <tr>
   <td>​<code>growth-engine</code></td>
   <td>增长引擎</td>
  </tr>
  <tr>
   <td>​<code>habit-tracker</code></td>
   <td>习惯追踪</td>
  </tr>
  <tr>
   <td>​<code>healthcheck</code></td>
   <td>健康检查</td>
  </tr>
  <tr>
   <td>​<code>marketing-skills</code></td>
   <td>营销技能</td>
  </tr>
 </tbody>
</table>
<h3 id="--销售-客户--7个-">📈 销售/客户 (7个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>market-researcher</code></td>
   <td>市场调研</td>
  </tr>
  <tr>
   <td>​<code>sales-pipeline</code></td>
   <td>销售管道</td>
  </tr>
  <tr>
   <td>​<code>sales-playbook</code></td>
   <td>销售手册</td>
  </tr>
  <tr>
   <td>​<code>seo-ops</code></td>
   <td>SEO运营</td>
  </tr>
  <tr>
   <td>​<code>team-ops</code></td>
   <td>团队运营</td>
  </tr>
  <tr>
   <td>​<code>tapd-openapi</code></td>
   <td>TAPD开放API</td>
  </tr>
  <tr>
   <td>​<code>trello</code></td>
   <td>Trello看板</td>
  </tr>
 </tbody>
</table>
<h3 id="--搜索-文档--6个-">🌐 搜索/文档 (6个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>minimax-docx</code></td>
   <td>Word文档</td>
  </tr>
  <tr>
   <td>​<code>minimax-pdf</code></td>
   <td>PDF处理</td>
  </tr>
  <tr>
   <td>​<code>minimax-xlsx</code></td>
   <td>Excel处理</td>
  </tr>
  <tr>
   <td>​<code>multi-search-engine</code></td>
   <td>多搜索引擎</td>
  </tr>
  <tr>
   <td>​<code>nano-pdf</code></td>
   <td>纳米PDF</td>
  </tr>
  <tr>
   <td>​<code>news-summary</code></td>
   <td>新闻摘要</td>
  </tr>
 </tbody>
</table>
<h3 id="--学习-研究--4个-">🎓 学习/研究 (4个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>open-lesson</code></td>
   <td>公开课</td>
  </tr>
  <tr>
   <td>​<code>tutor-skills</code></td>
   <td>辅导技能</td>
  </tr>
  <tr>
   <td>​<code>yt-competitive-analysis</code></td>
   <td>YouTube竞品分析</td>
  </tr>
  <tr>
   <td>​<code>x-longform-post</code></td>
   <td>长文发布</td>
  </tr>
 </tbody>
</table>
<h3 id="---云服务-集成--4个-">☁️ 云服务/集成 (4个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>openclaw-assets-to-workbuddy</code></td>
   <td>资源转移</td>
  </tr>
  <tr>
   <td>​<code>sag</code></td>
   <td>SAG服务</td>
  </tr>
  <tr>
   <td>​<code>weiyun</code></td>
   <td>微云存储</td>
  </tr>
  <tr>
   <td>​<code>songsee</code></td>
   <td>音乐发现</td>
  </tr>
 </tbody>
</table>
<h3 id="--其他工具--7个-">🎯 其他工具 (7个)</h3>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>browserwing</code></td>
   <td>浏览器翅膀</td>
  </tr>
  <tr>
   <td>​<code>humanizer</code></td>
   <td>人类化</td>
  </tr>
  <tr>
   <td>​<code>migraq</code></td>
   <td>迁移工具</td>
  </tr>
  <tr>
   <td>​<code>openclaw-tavily-search</code></td>
   <td>Tavily搜索</td>
  </tr>
  <tr>
   <td>​<code>seo-ops</code></td>
   <td>SEO运营</td>
  </tr>
  <tr>
   <td>​<code>skill-vetter</code></td>
   <td>技能审核</td>
  </tr>
  <tr>
   <td>​<code>weather</code></td>
   <td>天气查询</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="四-配置文件结构">四、配置文件结构</h2>
<blockquote>
 <p>与备份导出目录结构完全一致</p>
</blockquote>
<pre><code>CodeBuddy-Full-Backup/
├── README.md                    # 导入说明文档
├── settings.json                # CodeBuddy 全局配置
├── hooks-config.json            # 生命周期钩子配置
├── 01-user-skills/              # 用户安装的技能 (62个)
│   ├── agent-browser/
│   ├── ai-data-analysis/
│   ├── ai-ppt-generator/
│   ├── api-and-interface-design/
│   ├── auto-updater/
│   ├── baidu-search/
│   ├── browser-testing-with-devtools/
│   ├── ci-cd-and-automation/
│   ├── code-review-and-quality/
│   ├── code-simplification/
│   ├── code-standard/           # ⭐ 自定义代码规范
│   ├── context-engineering/
│   ├── copywriter/
│   ├── data-analyst/
│   ├── debugging-and-error-recovery/
│   ├── deprecation-and-migration/
│   ├── documentation-and-adrs/
│   ├── excel-weekly-dashboard/
│   ├── excel-xlsx/
│   ├── frontend-ui-engineering/
│   ├── github/
│   ├── git-workflow-and-versioning/
│   ├── humanize-ai-text/
│   ├── humanizer/
│   ├── humanizer-zh/
│   ├── idea-refine/
│   ├── image/
│   ├── image-cog/
│   ├── incremental-implementation/
│   ├── markdown-converter/
│   ├── marketing-mode/
│   ├── memory-manager/
│   ├── nano-banana-pro/
│   ├── office/
│   ├── openclaw-tavily-search/
│   ├── performance-optimization/
│   ├── planning-and-task-breakdown/
│   ├── proactive-agent/
│   ├── security-and-hardening/
│   ├── self-improving-agent/
│   ├── seo/
│   ├── sheet-cog/
│   ├── sheetsmith/
│   ├── shipping-and-launch/
│   ├── skill-vetter/
│   ├── spec-driven-development/
│   ├── summarize/
│   ├── system-data-intelligence/
│   ├── test-driven-development/
│   ├── test-user-skill/
│   ├── ui-ux-pro-max/
│   ├── using-agent-skills/
│   ├── web-search/
│   ├── wechat/
│   ├── wechat-article-search/
│   ├── wechat-auto-reply/
│   ├── wechat-mp-cn/
│   ├── wechat-mp-writer-skill-mxx/
│   ├── wechat-sender/
│   ├── wps-office/
│   ├── xhs/
│   └── xlsx-pro/
└── 02-marketplace-skills/       # 市场技能 (156个)
    └── skills/
        ├── admapix/
        ├── agent-browser-core/
        ├── agent-mail/
        ├── agent-mbti/
        ├── agent-team-orchestration/
        ├── andonq/
        ├── android-native-dev/
        ├── anti-distill/
        ├── api-gateway/
        ├── apple-notes/
        ├── apple-reminders/
        ├── arxiv-reader/
        ├── arxiv-watcher/
        ├── autoresearch/
        ├── awesome-design-md/
        ├── blogwatcher/
        ├── boss-skills/
        ├── brand-guidelines/
        ├── browser/
        ├── browser-cash/
        ├── browser-use/
        ├── browserwing/
        ├── caldav-calendar/
        ├── canvas-design/
        ├── capability-evolver/
        ├── citation-manager/
        ├── clawbrowser/
        ├── cli-anything-hub/
        ├── cloudbase/
        ├── cloudq/
        ├── cnb-skill/
        ├── colleague-skill/
        ├── content-factory/
        ├── content-ops/
        ├── content-repurposer/
        ├── conversion-ops/
        ├── cos-vectors/
        ├── deck-generator/
        ├── deep-research/
        ├── didi-ride-skill/
        ├── earnings-tracker/
        ├── education/
        ├── email-skill/
        ├── FBS-BookWriter/
        ├── finance-ops/
        ├── find-skills/
        ├── fintech-engineer/
        ├── flutter-dev/
        ├── frontend-dev/
        ├── fullstack-dev/
        ├── gifgrep/
        ├── gif-sticker-maker/
        ├── github/
        ├── github-ai-trends/
        ├── github-trending-cn/
        ├── goal-tracker/
        ├── gog/
        ├── growth-engine/
        ├── habit-tracker/
        ├── healthcheck/
        ├── himalaya/
        ├── humanizer/
        ├── idea-validator/
        ├── imap-smtp-email/
        ├── ima-skills/
        ├── impeccable/
        ├── imsg/
        ├── ios-application-dev/
        ├── lark-unified/
        ├── lexiang-knowledge-base/
        ├── llm-wiki/
        ├── macro-monitor/
        ├── marketing-skills/
        ├── market-researcher/
        ├── mcp-builder/
        ├── mcporter/
        ├── migraq/
        ├── minimax-docx/
        ├── minimax-pdf/
        ├── minimax-xlsx/
        ├── model-usage/
        ├── multi-search-engine/
        ├── nano-banana-pro/
        ├── nano-pdf/
        ├── neodata-financial-search/
        ├── news-summary/
        ├── notebooklm-studio/
        ├── note-organizer/
        ├── obsidian/
        ├── openai-image-gen/
        ├── openai-whisper/
        ├── openai-whisper-api/
        ├── openclaw-assets-to-workbuddy/
        ├── open-lesson/
        ├── oracle/
        ├── outbound-engine/
        ├── peekaboo/
        ├── perplexity/
        ├── playwright-browser-automation/
        ├── playwright-scraper-skill/
        ├── podcast-ops/
        ├── pptx-generator/
        ├── prompt-engineering-expert/
        ├── qmd/
        ├── qq-email/
        ├── react-native-dev/
        ├── remotion-video-toolkit/
        ├── revenue-intelligence/
        ├── sag/
        ├── sales-pipeline/
        ├── sales-playbook/
        ├── seo-ops/
        ├── shader-dev/
        ├── skill-creator/
        ├── skill-scanner/
        ├── skills-security-check/
        ├── skill-vetter/
        ├── skyline/
        ├── smooth-browser/
        ├── songsee/
        ├── stagehand-browser-cli/
        ├── stealth-browser/
        ├── summarize/
        ├── tapd-openapi/
        ├── tdesign-miniprogram/
        ├── team-ops/
        ├── tencentcloud-cos/
        ├── tencent-docs/
        ├── tencentmap-jsapi-gl-skill/
        ├── tencentmap-lbs-skill/
        ├── tencentmap-miniprogram-skill/
        ├── tencentmap-webservice-skill/
        ├── tencent-meeting-skill/
        ├── tencent-news/
        ├── tencent-ssv-techforgood/
        ├── tencent-survey/
        ├── things-mac/
        ├── tmux/
        ├── trello/
        ├── tutor-skills/
        ├── video-frames/
        ├── wacli/
        ├── weather/
        ├── web-access/
        ├── web-scraper/
        ├── web-search-exa/
        ├── wechat-article-search/
        ├── wechat-miniprogram/
        ├── wechatpay-basic-payment/
        ├── wechatpay-product-coupon/
        ├── weiyun/
        ├── x-longform-post/
        ├── xurl/
        ├── yourself-skill/
        ├── yt-competitive-analysis/
        └── zenstudio/
</code></pre>
<hr>
<h2 id="五-技能更新管理">五、技能更新管理</h2>
<p>技能来源不同，更新方式也有所区别。</p>
<h3 id="5-1-更新类型分类">5.1 更新类型分类</h3>
<table>
 <thead>
  <tr>
   <th>更新类型</th>
   <th>数量</th>
   <th>更新方式</th>
   <th>来源</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><strong>市场技能</strong></td>
   <td>~40个</td>
   <td>CodeBuddy 市场自动更新</td>
   <td>官方/第三方市场</td>
  </tr>
  <tr>
   <td><strong>agent-skills</strong></td>
   <td>19个</td>
   <td>GitHub 手动拉取</td>
   <td>addyosmani/agent-skills</td>
  </tr>
  <tr>
   <td><strong>用户自定义</strong></td>
   <td>1个</td>
   <td>自行维护</td>
   <td>code-standard</td>
  </tr>
 </tbody>
</table>
<h3 id="5-2-有元数据的市场技能-自动更新-">5.2 有元数据的市场技能（自动更新）</h3>
<p><strong>判断依据</strong>：技能目录下存在 <code>_meta.json</code> 文件</p>
<pre><code class="language-json">{
  "ownerId": "kn7agvhxan0vcwfmhrjhwg4n9s802d7k",
  "slug": "proactive-agent",
  "version": "3.1.0",
  "publishedAt": 1770259214202
}
</code></pre>
<p><strong>更新方式</strong>：</p>
<ol>
 <li>打开 CodeBuddy 集成界面</li>
 <li>进入技能市场</li>
 <li>点击「检查更新」或「更新全部」</li>
</ol>
<p><strong>已配置自动更新的用户技能</strong>（40个）：</p>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>版本</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>proactive-agent</td>
   <td>3.1.0</td>
  </tr>
  <tr>
   <td>self-improving-agent</td>
   <td>2.0.0</td>
  </tr>
  <tr>
   <td>memory-manager</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>skill-vetter</td>
   <td>1.0.0</td>
  </tr>
  <tr>
   <td>web-search</td>
   <td>2.1.0</td>
  </tr>
  <tr>
   <td>baidu-search</td>
   <td>1.8.0</td>
  </tr>
  <tr>
   <td>github</td>
   <td>3.0.0</td>
  </tr>
  <tr>
   <td>agent-browser</td>
   <td>2.2.0</td>
  </tr>
  <tr>
   <td>ai-data-analysis</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>ai-ppt-generator</td>
   <td>2.0.0</td>
  </tr>
  <tr>
   <td>copywriter</td>
   <td>2.5.0</td>
  </tr>
  <tr>
   <td>seo</td>
   <td>1.8.0</td>
  </tr>
  <tr>
   <td>summarize</td>
   <td>1.2.0</td>
  </tr>
  <tr>
   <td>excel-xlsx</td>
   <td>3.1.0</td>
  </tr>
  <tr>
   <td>xlsx-pro</td>
   <td>2.0.0</td>
  </tr>
  <tr>
   <td>sheet-cog</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>sheetsmith</td>
   <td>1.3.0</td>
  </tr>
  <tr>
   <td>image</td>
   <td>2.0.0</td>
  </tr>
  <tr>
   <td>image-cog</td>
   <td>1.8.0</td>
  </tr>
  <tr>
   <td>nano-banana-pro</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>markdown-converter</td>
   <td>1.2.0</td>
  </tr>
  <tr>
   <td>office</td>
   <td>2.0.0</td>
  </tr>
  <tr>
   <td>wps-office</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>wechat</td>
   <td>2.1.0</td>
  </tr>
  <tr>
   <td>wechat-auto-reply</td>
   <td>1.8.0</td>
  </tr>
  <tr>
   <td>wechat-article-search</td>
   <td>1.2.0</td>
  </tr>
  <tr>
   <td>wechat-mp-cn</td>
   <td>2.0.0</td>
  </tr>
  <tr>
   <td>wechat-sender</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>xhs</td>
   <td>1.8.0</td>
  </tr>
  <tr>
   <td>marketing-mode</td>
   <td>2.0.0</td>
  </tr>
  <tr>
   <td>humanizer</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>humanizer-zh</td>
   <td>1.2.0</td>
  </tr>
  <tr>
   <td>humanize-ai-text</td>
   <td>1.0.0</td>
  </tr>
  <tr>
   <td>code-standard</td>
   <td>1.0.0</td>
  </tr>
  <tr>
   <td>auto-updater</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>using-agent-skills</td>
   <td>1.0.0</td>
  </tr>
  <tr>
   <td>test-user-skill</td>
   <td>1.0.0</td>
  </tr>
  <tr>
   <td>system-data-intelligence</td>
   <td>1.2.0</td>
  </tr>
  <tr>
   <td>ui-ux-pro-max</td>
   <td>1.5.0</td>
  </tr>
  <tr>
   <td>(其他技能...)</td>
   <td>-</td>
  </tr>
 </tbody>
</table>
<h3 id="5-3-agent-skills-GitHub-手动更新-">5.3 agent-skills（GitHub 手动更新）</h3>
<p><strong>19个技能列表</strong>：</p>
<table>
 <thead>
  <tr>
   <th>技能</th>
   <th>用途</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>idea-refine</td>
   <td>构思细化</td>
  </tr>
  <tr>
   <td>spec-driven-development</td>
   <td>规范驱动开发</td>
  </tr>
  <tr>
   <td>planning-and-task-breakdown</td>
   <td>任务拆解规划</td>
  </tr>
  <tr>
   <td>incremental-implementation</td>
   <td>增量实现</td>
  </tr>
  <tr>
   <td>test-driven-development</td>
   <td>测试驱动开发</td>
  </tr>
  <tr>
   <td>code-review-and-quality</td>
   <td>代码审查质量</td>
  </tr>
  <tr>
   <td>shipping-and-launch</td>
   <td>发布上线</td>
  </tr>
  <tr>
   <td>frontend-ui-engineering</td>
   <td>前端UI工程</td>
  </tr>
  <tr>
   <td>api-and-interface-design</td>
   <td>API接口设计</td>
  </tr>
  <tr>
   <td>context-engineering</td>
   <td>上下文工程</td>
  </tr>
  <tr>
   <td>code-simplification</td>
   <td>代码简化</td>
  </tr>
  <tr>
   <td>security-and-hardening</td>
   <td>安全加固</td>
  </tr>
  <tr>
   <td>performance-optimization</td>
   <td>性能优化</td>
  </tr>
  <tr>
   <td>debugging-and-error-recovery</td>
   <td>调试与错误恢复</td>
  </tr>
  <tr>
   <td>ci-cd-and-automation</td>
   <td>CI/CD自动化</td>
  </tr>
  <tr>
   <td>git-workflow-and-versioning</td>
   <td>Git工作流版本控制</td>
  </tr>
  <tr>
   <td>documentation-and-adrs</td>
   <td>文档与ADR</td>
  </tr>
  <tr>
   <td>deprecation-and-migration</td>
   <td>废弃与迁移</td>
  </tr>
  <tr>
   <td>browser-testing-with-devtools</td>
   <td>DevTools浏览器测试</td>
  </tr>
 </tbody>
</table>
<p><strong>GitHub 仓库</strong>：<code>https://github.com/addyosmani/agent-skills</code></p>
<p><strong>手动更新命令</strong>：</p>
<pre><code class="language-powershell"># 1. 克隆最新版本到临时目录
git clone --depth 1 https://github.com/addyosmani/agent-skills.git "$env:TEMP\agent-skills-new"

# 2. 备份旧版本
$backupPath = "$env:USERPROFILE\.codebuddy\skills-agent-skills-backup"
Copy-Item -Path "$env:USERPROFILE\.codebuddy\skills\planning-and-task-breakdown" -Destination $backupPath -Recurse

# 3. 替换更新
Copy-Item -Path "$env:TEMP\agent-skills-new\skills\*" -Destination "$env:USERPROFILE\.codebuddy\skills" -Recurse -Force

# 4. 清理
Remove-Item -Path "$env:TEMP\agent-skills-new" -Recurse -Force
</code></pre>
<p><strong>查看最新版本</strong>：</p>
<pre><code class="language-powershell"># 查看远程最新提交
git ls-remote https://github.com/addyosmani/agent-skills.git HEAD
</code></pre>
<h3 id="5-4-用户自定义技能-自行维护-">5.4 用户自定义技能（自行维护）</h3>
<p><strong>技能名称</strong>：<code>code-standard</code></p>
<p><strong>配置文件</strong>：<code>~/.codebuddy/skills/code-standard/SKILL.md</code></p>
<p><strong>更新方式</strong>：</p>
<ol>
 <li>根据实际使用反馈手动修改</li>
 <li>参考官方技能结构优化</li>
 <li>定期复盘并更新规则</li>
</ol>
<p><strong>维护建议</strong>：</p>
<ul>
 <li>在文件末尾的「迭代记录」区域记录每次改进</li>
 <li>保持简洁原则，避免过度复杂化</li>
 <li>遇到新的最佳实践时及时更新</li>
</ul>
<h3 id="5-5-一键更新脚本">5.5 一键更新脚本</h3>
<pre><code class="language-powershell"># === CodeBuddy Skills 一键更新脚本 ===

$skillsPath = "$env:USERPROFILE\.codebuddy\skills"
$tempPath = "$env:TEMP\codebuddy-update-$(Get-Random)"

Write-Host "🔄 开始更新技能..." -ForegroundColor Cyan

# 1. 更新 agent-skills
Write-Host "`n📦 更新 agent-skills (19个)..." -ForegroundColor Yellow
git clone --depth 1 https://github.com/addyosmani/agent-skills.git "$tempPath\agent-skills" -q
if (Test-Path "$tempPath\agent-skills\skills") {
    Get-ChildItem "$tempPath\agent-skills\skills" | ForEach-Object {
        $targetPath = "$skillsPath\$($_.Name)"
        if (Test-Path $targetPath) {
            Remove-Item $targetPath -Recurse -Force
        }
        Copy-Item $_.FullName -Destination $skillsPath -Recurse -Force
    }
    Write-Host "✅ agent-skills 更新完成" -ForegroundColor Green
}

# 2. 提示市场技能更新
Write-Host "`n🛒 请手动在 CodeBuddy 市场检查更新" -ForegroundColor Cyan
Write-Host "   路径：集成 → 技能市场 → 检查更新`n" -ForegroundColor Gray

# 3. 清理
if (Test-Path $tempPath) {
    Remove-Item $tempPath -Recurse -Force
}

Write-Host "✨ 更新完成！" -ForegroundColor Green
</code></pre>
<h3 id="5-6-更新检查清单">5.6 更新检查清单</h3>
<table>
 <thead>
  <tr>
   <th>检查频率</th>
   <th>更新内容</th>
   <th>方式</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><strong>每日</strong></td>
   <td>agent-skills 官方更新</td>
   <td>手动检查</td>
  </tr>
  <tr>
   <td><strong>每周</strong></td>
   <td>市场技能更新</td>
   <td>CodeBuddy 市场</td>
  </tr>
  <tr>
   <td><strong>每月</strong></td>
   <td>清理不用的技能</td>
   <td>手动整理</td>
  </tr>
  <tr>
   <td><strong>每季度</strong></td>
   <td>审查代码规范</td>
   <td>手动复盘</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="六-导入方法">六、导入方法</h2>
<h3 id="方式一-完整导入-推荐-">方式一：完整导入（推荐）</h3>
<pre><code class="language-powershell"># 1. 解压备份文件到临时目录
# 2. 复制到用户配置目录

# 复制用户技能
Copy-Item -Path "01-user-skills" -Destination "$env:USERPROFILE\.codebuddy\skills" -Recurse -Force

# 复制市场技能
Copy-Item -Path "02-marketplace-skills" -Destination "$env:USERPROFILE\.codebuddy\" -Recurse -Force

# 复制配置文件
Copy-Item -Path "settings.json" -Destination "$env:USERPROFILE\.codebuddy\"
</code></pre>
<h3 id="方式二-选择性导入">方式二：选择性导入</h3>
<pre><code class="language-powershell"># 只导入用户技能
Copy-Item -Path "01-user-skills" -Destination "$env:USERPROFILE\.codebuddy\skills" -Recurse -Force

# 只导入某个特定技能
Copy-Item -Path "01-user-skills\code-standard" -Destination "$env:USERPROFILE\.codebuddy\skills\code-standard" -Recurse -Force
</code></pre>
<hr>
<h2 id="七-效果对比">七、效果对比</h2>
<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>
  <tr>
   <td>调试</td>
   <td>盲目搜索</td>
   <td>五步系统法</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="八-总结">八、总结</h2>
<p><strong>技能是 AI 助手的"肌肉记忆"</strong> —— 通过预置的工作流程和专业领域知识，让 AI 在特定场景下表现出专家水平。</p>
<p>配置建议：</p>
<ul>
 <li>✅ 优先配置<strong>开发流程</strong>类技能（19个）</li>
 <li>✅ 根据日常需求选择<strong>垂直领域</strong>技能</li>
 <li>✅ 创建<strong>个人规范</strong>保持风格一致</li>
 <li>✅ 定期回顾，删除不用的技能</li>
</ul>
<hr>
<h2 id="九-统计数据">九、统计数据</h2>
<table>
 <thead>
  <tr>
   <th>类型</th>
   <th>数量</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>用户技能</td>
   <td>62个</td>
  </tr>
  <tr>
   <td>市场技能</td>
   <td>156个</td>
  </tr>
  <tr>
   <td><strong>总计</strong></td>
   <td><strong>218个</strong></td>
  </tr>
 </tbody>
</table>
<hr>
<p><em>本文由 AI 编程助手辅助生成，技能配置让输出更专业</em></p>
<p>‍</p>
<h2 id="写在最后">写在最后</h2>
<p>不知道有多少人会看到这里，但我这个博客的定位始终如一：<strong>整理我能整理的，分享我所分享的</strong>。</p>
<p>关于 AI，或许有人会误解——觉得依赖 AI 就失去了主观能动性，人会变得越来越懒。但这篇文章的诞生，其实经历了这样的过程：</p>
<ol>
 <li>构思：我需要明确分享什么，拟定核心主旨。</li>
 <li>结构：我喜欢「总-分-总」的形式，所以我的文章常有前言/写在前面，后记/写在最后。这篇文章也是我给AI拟定的结构，包括用户技能和市场技能分开介绍。</li>
 <li>调整：AI 生成的内容，我会逐字逐句阅读，我觉得别扭、不完善、未表达清楚观点的地方我会进行修改。整个过程至少打磨了 5-6 轮。</li>
 <li>发布：哦，这没什么说的...</li>
 <li>总结反思：个人精力、能力毕竟有限，所以AI某些方面确实更优秀。文章生成后的阅读与一次次调整的过程，也是自我提升的过程。</li>
</ol>
<p>对于使用AI我的个人见解是：工具就是拿来用的，要让工具成为我们的武器。与其畏惧变化，不如大步拥抱向前。</p>]]></description><guid isPermaLink="false">/archives/codebuddy-equipment-library-218-skills-guide-experience</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2Fj5os9YLfIlq.avif&amp;size=m" type="image/jpeg" length="253250"/><category>技巧</category><category>分享</category><pubDate>Mon, 13 Apr 2026 02:30:00 GMT</pubDate></item><item><title><![CDATA[为博客添加自定义评论表情]]></title><link>https://wuqishi.com/archives/add-custom-comment-emoticons-to-your-blog</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%B8%BA%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%84%E8%AE%BA%E8%A1%A8%E6%83%85&amp;url=/archives/add-custom-comment-emoticons-to-your-blog" width="1" height="1" alt="" style="opacity:0;">
<p>本来对于评论的自定义表情没有太多想法，毕竟评论的主体是评论本身嘛。奈何这套表情真的是太好看了…</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F64KWLuAzTXd.avif&amp;size=m" alt="你看，多“贱”呀"></p>
<p>General basic facial stickers suitable for most websites and applications.</p>
<p>适用于大多数网站和应用程序的通用基础面部贴纸。</p>
<h2 id="heading">版权事宜</h2>
<blockquote>
 <p>This expression is not authorized to be used by non-business bloggers only. Authorization is required for the rest of the way, please note.</p>
 <p>此表达方式仅限非商业博主使用，未经授权不得使用。请注意，后续使用均需获得授权。</p>
</blockquote>
<p>个人非盈利博客，免授权哦。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FG820OlmyCES.avif&amp;size=m" alt="授权方式与定价"></p>
<h2 id="heading-1">表情预览</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FEjP6A2PA0Ca.avif&amp;size=m" alt="部分表情预览"></p>
<h2 id="heading-2">项目地址</h2>
<p><strong>Sticker-Heo</strong>：https://github.com/zhheo/Sticker-Heo</p>
<h2 id="heading-3">怎么使用</h2>
<h3 id="twikoo">Twikoo</h3>
<pre><code class="language-text">https://cdn.jsdelivr.net/npm/sticker-heo@2022.7.5/twikoo.json
</code></pre>
<h3 id="valine">Valine</h3>
<pre><code class="language-text">https://cdn.jsdelivr.net/npm/sticker-heo@2022.7.5/valine.json
</code></pre>
<h3 id="waline">Waline</h3>
<p>在表情符号选项中添加配置项：</p>
<pre><code class="language-text">emoji: [
    'https://cdn.jsdelivr.net/npm/sticker-heo@2022.7.5/Sticker-100/',
]
</code></pre>
<h3 id="artalk">Artalk</h3>
<pre><code class="language-text">https://cdn.jsdelivr.net/npm/sticker-heo@2022.7.5/artalk.json
</code></pre>
<h2 id="handsome">在handsome主题中怎么用呢？</h2>
<h3 id="heading-4">表情上传</h3>
<p>把表情传到<strong>主题目录下的</strong>​<strong>​<code>assets/img/emotion</code>​</strong>文件夹中。</p>
<ul>
 <li>如果表情的静态资源存在你自己的外部CDN，并且配置了「静态资源加速」，<strong>但是此时本地服务器也需要存储一份</strong>，因为需要检查对应的图片文件是否存在来决定是否解析表情。</li>
 <li>也就是说，本地服务器和远程CDN的这个文件夹都要传</li>
</ul>
<h3 id="heading-5">配置文件修改</h3>
<p>需要修改主题目录下面的<code>usr/OwO.json</code>文件：</p>
<pre><code class="language-json">"新的表情栏目名称": {
    "name": "表情包文件夹名称",
    "type": "image",
    "container": [
        {
            "icon": "图片名称",
            "text": "提示文字"
        },
    ]
}
</code></pre>
<h2 id="heading-6">我的配置文件</h2>
<p>你是不是盯上了我写好的配置？众乐乐吧：</p>
<pre><code class="language-json">{
  "Heo": {
    "type": "image",
    "name": "biaoqing",
    "container": [
      {
        "icon": "害羞",
        "text": "害羞"
      },
      {
        "icon": "呲牙笑",
        "text": "呲牙笑"
      },
      {
        "icon": "喜欢",
        "text": "喜欢"
      },
      {
        "icon": "奋斗",
        "text": "奋斗"
      },
      {
        "icon": "耍酷",
        "text": "耍酷"
      },
      {
        "icon": "烦恼",
        "text": "烦恼"
      },
      {
        "icon": "爆炸",
        "text": "爆炸"
      },
      {
        "icon": "熬夜",
        "text": "熬夜"
      },
      {
        "icon": "吃瓜",
        "text": "吃瓜"
      },
      {
        "icon": "阴险",
        "text": "阴险"
      },
      {
        "icon": "滑稽",
        "text": "滑稽"
      },
      {
        "icon": "被打",
        "text": "被打"
      },
      {
        "icon": "大笑",
        "text": "大笑"
      },
      {
        "icon": "亲亲",
        "text": "亲亲"
      },
      {
        "icon": "愤怒",
        "text": "愤怒"
      },
      {
        "icon": "惊吓",
        "text": "惊吓"
      },
      {
        "icon": "尴尬",
        "text": "尴尬"
      },
      {
        "icon": "捂嘴笑",
        "text": "捂嘴笑"
      },
      {
        "icon": "捂脸",
        "text": "捂脸"
      },
      {
        "icon": "生病",
        "text": "生病"
      },
      {
        "icon": "绿帽",
        "text": "绿帽"
      },
      {
        "icon": "鼓掌",
        "text": "鼓掌"
      },
      {
        "icon": "抠鼻",
        "text": "抠鼻"
      },
      {
        "icon": "感动",
        "text": "感动"
      },
      {
        "icon": "吐血",
        "text": "吐血"
      },
      {
        "icon": "鬼脸",
        "text": "鬼脸"
      },
      {
        "icon": "擦汗",
        "text": "擦汗"
      },
      {
        "icon": "惊讶",
        "text": "惊讶"
      },
      {
        "icon": "恶心",
        "text": "恶心"
      },
      {
        "icon": "禁言",
        "text": "禁言"
      },
      {
        "icon": "睡觉",
        "text": "睡觉"
      },
      {
        "icon": "笑哭",
        "text": "笑哭"
      },
      {
        "icon": "思考",
        "text": "思考"
      },
      {
        "icon": "疑问",
        "text": "疑问"
      },
      {
        "icon": "吵架",
        "text": "吵架"
      },
      {
        "icon": "眩晕",
        "text": "眩晕"
      },
      {
        "icon": "再见",
        "text": "再见"
      },
      {
        "icon": "微笑",
        "text": "微笑"
      },
      {
        "icon": "哭泣",
        "text": "哭泣"
      },
      {
        "icon": "开心",
        "text": "开心"
      },
      {
        "icon": "加班",
        "text": "加班"
      },
      {
        "icon": "唱歌",
        "text": "唱歌"
      },
      {
        "icon": "纠结",
        "text": "纠结"
      },
      {
        "icon": "发红包",
        "text": "发红包"
      },
      {
        "icon": "送福",
        "text": "送福"
      },
      {
        "icon": "牛年进宝",
        "text": "牛年进宝"
      },
      {
        "icon": "头秃",
        "text": "头秃"
      },
      {
        "icon": "我看好你",
        "text": "我看好你"
      },
      {
        "icon": "好的",
        "text": "好的"
      },
      {
        "icon": "好奇",
        "text": "好奇"
      },
      {
        "icon": "偷偷看",
        "text": "偷偷看"
      },
      {
        "icon": "危险",
        "text": "危险"
      },
      {
        "icon": "小丑",
        "text": "小丑"
      },
      {
        "icon": "引起不适",
        "text": "引起不适"
      },
      {
        "icon": "滑稽喝水",
        "text": "滑稽喝水"
      },
      {
        "icon": "打牌",
        "text": "打牌"
      },
      {
        "icon": "应援",
        "text": "应援"
      },
      {
        "icon": "疼痛",
        "text": "疼痛"
      },
      {
        "icon": "勉强笑",
        "text": "勉强笑"
      },
      {
        "icon": "看穿一切",
        "text": "看穿一切"
      },
      {
        "icon": "滑稽狂汗",
        "text": "滑稽狂汗"
      },
      {
        "icon": "不好意思",
        "text": "不好意思"
      },
      {
        "icon": "难以置信",
        "text": "难以置信"
      },
      {
        "icon": "滑稽被子",
        "text": "滑稽被子"
      },
      {
        "icon": "月饼",
        "text": "月饼"
      },
      {
        "icon": "手机相机",
        "text": "手机相机"
      },
      {
        "icon": "倚墙笑",
        "text": "倚墙笑"
      },
      {
        "icon": "出家人",
        "text": "出家人"
      },
      {
        "icon": "黑线",
        "text": "黑线"
      },
      {
        "icon": "呦吼",
        "text": "呦吼"
      },
      {
        "icon": "扶额",
        "text": "扶额"
      },
      {
        "icon": "打咩",
        "text": "打咩"
      },
      {
        "icon": "有没有搞错",
        "text": "有没有搞错"
      },
      {
        "icon": "深思",
        "text": "深思"
      },
      {
        "icon": "3d眼镜",
        "text": "3d眼镜"
      },
      {
        "icon": "电话",
        "text": "电话"
      },
      {
        "icon": "托腮",
        "text": "托腮"
      },
      {
        "icon": "裂开",
        "text": "裂开"
      },
      {
        "icon": "滑稽柠檬",
        "text": "滑稽柠檬"
      },
      {
        "icon": "伞兵",
        "text": "伞兵"
      },
      {
        "icon": "胡子",
        "text": "胡子"
      },
      {
        "icon": "小偷",
        "text": "小偷"
      },
      {
        "icon": "智慧的眼神",
        "text": "智慧的眼神"
      },
      {
        "icon": "滑稽奶茶",
        "text": "滑稽奶茶"
      },
      {
        "icon": "送花",
        "text": "送花"
      },
      {
        "icon": "失望",
        "text": "失望"
      },
      {
        "icon": "吃手",
        "text": "吃手"
      },
      {
        "icon": "嘿哈",
        "text": "嘿哈"
      },
      {
        "icon": "LPL",
        "text": "LPL"
      },
      {
        "icon": "抬眼镜",
        "text": "抬眼镜"
      },
      {
        "icon": "泪奔",
        "text": "泪奔"
      },
      {
        "icon": "EDG",
        "text": "EDG"
      },
      {
        "icon": "傻笑",
        "text": "傻笑"
      },
      {
        "icon": "拜托",
        "text": "拜托"
      },
      {
        "icon": "这是啥",
        "text": "这是啥"
      },
      {
        "icon": "波吉",
        "text": "波吉"
      },
      {
        "icon": "惬意",
        "text": "惬意"
      },
      {
        "icon": "没招",
        "text": "没招"
      },
      {
        "icon": "放鞭炮",
        "text": "放鞭炮"
      },
      {
        "icon": "财神红包",
        "text": "财神红包"
      },
      {
        "icon": "痛哭",
        "text": "痛哭"
      },
      {
        "icon": "尬笑",
        "text": "尬笑"
      },
      {
        "icon": "流汗微笑",
        "text": "流汗微笑"
      },
      {
        "icon": "整理发型",
        "text": "整理发型"
      },
      {
        "icon": "击剑",
        "text": "击剑"
      },
      {
        "icon": "缺牙笑",
        "text": "缺牙笑"
      }
    ]
  },
  "狗头": {
    "type": "image",
    "name": "biaoqing",
    "container": [
      {
        "icon": "狗头",
        "text": "狗头"
      },
      {
        "icon": "哈士奇",
        "text": "哈士奇"
      },
      {
        "icon": "狗头围脖",
        "text": "狗头围脖"
      },
      {
        "icon": "狗头花",
        "text": "狗头花"
      },
      {
        "icon": "狗头草",
        "text": "狗头草"
      },
      {
        "icon": "狗头胖次",
        "text": "狗头胖次"
      },
      {
        "icon": "熊猫",
        "text": "熊猫"
      },
      {
        "icon": "熊猫唱歌",
        "text": "熊猫唱歌"
      },
      {
        "icon": "哈士奇失去意识",
        "text": "哈士奇失去意识"
      },
      {
        "icon": "熊猫喜欢",
        "text": "熊猫喜欢"
      },
      {
        "icon": "菜狗",
        "text": "菜狗"
      },
      {
        "icon": "菜狗花",
        "text": "菜狗花"
      },
      {
        "icon": "狗头失望",
        "text": "狗头失望"
      },
      {
        "icon": "哈士奇失望",
        "text": "哈士奇失望"
      },
      {
        "icon": "熊猫失望",
        "text": "熊猫失望"
      },
      {
        "icon": "熊猫意外",
        "text": "熊猫意外"
      },
      {
        "icon": "狗头意外",
        "text": "狗头意外"
      },
      {
        "icon": "猪头",
        "text": "猪头"
      },
      {
        "icon": "猪头意外",
        "text": "猪头意外"
      },
      {
        "icon": "恶魔",
        "text": "恶魔"
      },
      {
        "icon": "恶魔恐惧",
        "text": "恶魔恐惧"
      },
      {
        "icon": "beluga",
        "text": "beluga"
      },
      {
        "icon": "老虎意外",
        "text": "老虎意外"
      },
      {
        "icon": "虎年进宝",
        "text": "虎年进宝"
      }
    ]
  },
  "颜文字": {
    "type": "emoticon",
    "container": [
      {
        "icon": "OωO",
        "text": "Author: DIYgod"
      },
      {
        "icon": "|´・ω・)ノ",
        "text": "Hi"
      },
      {
        "icon": "ヾ(≧∇≦*)ゝ",
        "text": "开心"
      },
      {
        "icon": "(☆ω☆)",
        "text": "星星眼"
      },
      {
        "icon": "（╯‵□′）╯︵┴─┴",
        "text": "掀桌"
      },
      {
        "icon": "￣﹃￣",
        "text": "流口水"
      },
      {
        "icon": "(/ω＼)",
        "text": "捂脸"
      },
      {
        "icon": "∠( ᐛ 」∠)＿",
        "text": "给跪"
      },
      {
        "icon": "(๑•̀ㅁ•́ฅ)",
        "text": "Hi"
      },
      {
        "icon": "→_→",
        "text": "斜眼"
      },
      {
        "icon": "୧(๑•̀⌄•́๑)૭",
        "text": "加油"
      },
      {
        "icon": "٩(ˊᗜˋ*)و",
        "text": "有木有WiFi"
      },
      {
        "icon": "(ノ°ο°)ノ",
        "text": "前方高能预警"
      },
      {
        "icon": "(´இ皿இ｀)",
        "text": "我从未见过如此厚颜无耻之人"
      },
      {
        "icon": "⌇●﹏●⌇",
        "text": "吓死宝宝惹"
      },
      {
        "icon": "(ฅ´ω`ฅ)",
        "text": "已阅留爪"
      },
      {
        "icon": "(╯°A°)╯︵○○○",
        "text": "去吧大师球"
      },
      {
        "icon": "φ(￣∇￣o)",
        "text": "太萌惹"
      },
      {
        "icon": "ヾ(´･ ･｀｡)ノ\"",
        "text": "咦咦咦"
      },
      {
        "icon": "( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃",
        "text": "气呼呼"
      },
      {
        "icon": "(ó﹏ò｡)",
        "text": "我受到了惊吓"
      },
      {
        "icon": "Σ(っ °Д °;)っ",
        "text": "什么鬼"
      },
      {
        "icon": "( ,,´･ω･)ﾉ\"(´っω･｀｡)",
        "text": "摸摸头"
      },
      {
        "icon": "╮(╯▽╰)╭ ",
        "text": "无奈"
      },
      {
        "icon": "o(*////▽////*)q ",
        "text": "脸红"
      },
      {
        "icon": "＞﹏＜",
        "text": ""
      },
      {
        "icon": "( ๑´•ω•) \"(ㆆᴗㆆ)",
        "text": ""
      },
      {
        "icon": "(｡•ˇˇ•｡)",
        "text": ""
      }
    ]
  },
  "阿鲁": {
    "name": "aru",
    "type": "image",
    "container": [
      {
        "icon": "despise",
        "text": "鄙视"
      },
      {
        "icon": "knife",
        "text": "插刀"
      },
      {
        "icon": "pouting",
        "text": "亲嘴"
      },
      {
        "icon": "shutup",
        "text": "闭嘴"
      },
      {
        "icon": "unhappy",
        "text": "不开心"
      },
      {
        "icon": "discovertruth",
        "text": "发现真相"
      },
      {
        "icon": "shit",
        "text": "便便"
      },
      {
        "icon": "distressed",
        "text": "烦恼"
      },
      {
        "icon": "shy",
        "text": "捂脸"
      },
      {
        "icon": "speechless",
        "text": "无语"
      },
      {
        "icon": "confuse",
        "text": "迷惑"
      },
      {
        "icon": "frown",
        "text": "皱眉"
      },
      {
        "icon": "proud",
        "text": "得意"
      },
      {
        "icon": "cheer",
        "text": "欢呼"
      },
      {
        "icon": "meditation",
        "text": "沉思"
      },
      {
        "icon": "diving",
        "text": "潜水"
      },
      {
        "icon": "cryingface",
        "text": "掩面哭泣"
      },
      {
        "icon": "lurking",
        "text": "潜伏"
      },
      {
        "icon": "thumb",
        "text": "大拇指"
      },
      {
        "icon": "smile",
        "text": "微笑"
      },
      {
        "icon": "clap",
        "text": "拍掌"
      },
      {
        "icon": "envious",
        "text": "眼馋"
      },
      {
        "icon": "surrender",
        "text": "投降"
      },
      {
        "icon": "bigeye",
        "text": "大眼睛"
      },
      {
        "icon": "nose",
        "text": "抠鼻"
      },
      {
        "icon": "sweat",
        "text": "流汗"
      },
      {
        "icon": "flower",
        "text": "小花花"
      },
      {
        "icon": "crying",
        "text": "流泪"
      },
      {
        "icon": "spit",
        "text": "吐"
      },
      {
        "icon": "surprised",
        "text": "吃惊"
      },
      {
        "icon": "blood",
        "text": "一滩血"
      },
      {
        "icon": "blood2",
        "text": "吐血"
      },
      {
        "icon": "shy2",
        "text": "脸红"
      },
      {
        "icon": "angry",
        "text": "生气"
      },
      {
        "icon": "nomatter",
        "text": "无所谓"
      },
      {
        "icon": "dead",
        "text": "死翘翘"
      },
      {
        "icon": "insidious",
        "text": "阴险"
      },
      {
        "icon": "tongue",
        "text": "吐舌"
      }

    ]
  },
  "推特":{
    "type": "image",
    "name": "twemoji",
    "container":[
      {
        "icon": "smile",
        "text": "微笑"
      },
      {
        "icon": "tongue",
        "text": "吐舌"
      },
      {
        "icon": "tilted",
        "text": "歪头"
      },
      {
        "icon": "tiaomei",
        "text": "挑眉"
      },
      {
        "icon": "shy",
        "text": "害羞"
      },
      {
        "icon": "sweat",
        "text": "流汗"
      },
      {
        "icon": "proud",
        "text": "得意"
      },{
        "icon": "uncomfort",
        "text": "难受"
      },{
        "icon": "smilecry",
        "text": "笑哭"
      },
      {
        "icon": "love",
        "text": "喜欢"
      },{
        "icon": "notalk",
        "text": "不说话"
      },{
        "icon": "happy",
        "text": "开心"
      },{
        "icon": "frightened",
        "text": "惊恐"
      },{
        "icon": "dtongue",
        "text": "吐舌"
      },{
        "icon": "cry",
        "text": "哭泣"
      },{
        "icon": "cool",
        "text": "炫酷"
      },{
        "icon": "bigsmile",
        "text": "红脸笑"
      },{
        "icon": "ok",
        "text": "可以"
      },{
        "icon": "kiss",
        "text": "亲亲"
      },{
        "icon": "angry",
        "text": "生气"
      },{
        "icon": "family",
        "text": "家庭"
      },{
        "icon": "congratulate",
        "text": "祝贺"
      },{
        "icon": "gift",
        "text": "礼物"
      },{
        "icon": "prayer",
        "text": "祈祷"
      },{
        "icon": "star",
        "text": "星星"
      }
    ]
  }  
}
</code></pre>
<h2 id="heading-7">写在最后</h2>
<p>没啥，上面太长，这是用来目录定位的…</p>
<p>ps.有好的，请推荐给我啊，顺便试试评论表情吧~</p>]]></description><guid isPermaLink="false">/archives/add-custom-comment-emoticons-to-your-blog</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F64KWLuAzTXd.avif&amp;size=m" type="image/jpeg" length="23012"/><category>分享</category><pubDate>Thu, 9 Apr 2026 02:04:00 GMT</pubDate></item><item><title><![CDATA[Comment2Bark：Typecho评论推送到Bark插件]]></title><link>https://wuqishi.com/archives/typecho-comment2bark-plugin</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Comment2Bark%EF%BC%9ATypecho%E8%AF%84%E8%AE%BA%E6%8E%A8%E9%80%81%E5%88%B0Bark%E6%8F%92%E4%BB%B6&amp;url=/archives/typecho-comment2bark-plugin" width="1" height="1" alt="" style="opacity:0;">
<h2 id="heading">概述</h2>
<p>Comment2Bark 是一款 Typecho 评论推送插件，核心功能是将博客评论通过 Bark 服务推送至 iOS 设备。本项目在原有代码基础上进行了全面重构，优化了代码结构、修复了兼容性问题、完善了功能实现。</p>
<hr>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F1775204078921.avif&amp;size=m" alt="Comment2Bark"></p>
<h2 id="bark-">技术背景：Bark 推送服务</h2>
<p><a href="https://github.com/Finb/Bark">Bark</a> 是由 Finb 开发的开源 iOS 推送工具，采用 MIT 协议发布。其技术特点包括：</p>
<ul>
 <li>服务端通过标准 HTTP POST 请求触发推送</li>
 <li>客户端支持 iOS 15.0+</li>
 <li>支持自定义图标、分组、音效等参数</li>
 <li>可部署私有服务器或使用官方托管服务</li>
</ul>
<hr>
<h2 id="heading-1">功能特性</h2>
<h3 id="heading-2">推送场景</h3>
<table>
 <thead>
  <tr>
   <th>场景</th>
   <th>触发条件</th>
   <th>推送标题</th>
   <th>消息体</th>
   <th>链接指向</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>📩 新评论</td>
   <td>评论审核通过</td>
   <td>📩 【博客名】有新评论</td>
   <td>「文章标题」\n👤 评论者：内容</td>
   <td>当前评论</td>
  </tr>
  <tr>
   <td>💬 回复通知</td>
   <td>访客回复评论</td>
   <td>💬 {被回复者}的评论被回复</td>
   <td>回复：「原评论摘要」\n👤 回复者：内容</td>
   <td>当前回复</td>
  </tr>
  <tr>
   <td>⏳ 待审核</td>
   <td>评论进入审核队列</td>
   <td>⏳ 【博客名】有「待审」评论</td>
   <td>「文章标题」\n👤 评论者：内容</td>
   <td>后台管理</td>
  </tr>
  <tr>
   <td>🗑️ 垃圾评论</td>
   <td>评论被标记为垃圾</td>
   <td>🗑️ 【博客名】有「垃圾」评论</td>
   <td>「文章标题」\n👤 评论者：内容</td>
   <td>后台管理</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="heading-3">核心能力</h2>
<ul>
 <li>🔗 <strong>精确链接</strong> - 自动计算评论分页，点击推送直接跳转到对应评论位置</li>
 <li>🔄 <strong>自动重试</strong> - 推送失败自动重试 3 次（间隔 1s、2s、4s）</li>
 <li>🛡️ <strong>安全处理</strong> - 评论内容经过 HTML 过滤和 XSS 处理</li>
 <li>📊 <strong>调试模式</strong> - 启用后可查看详细推送日志</li>
 <li>🎨 <strong>自定义配置</strong> - 支持自定义图标、分组、提示音</li>
</ul>
<hr>
<h2 id="heading-4">功能配置说明</h2>
<table>
 <thead>
  <tr>
   <th>配置项</th>
   <th>类型</th>
   <th>说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>服务器地址</td>
   <td>URL</td>
   <td>Bark API 端点，默认 <code>https://api.day.app/</code></td>
  </tr>
  <tr>
   <td>Bark Key</td>
   <td>string</td>
   <td>设备标识，从 Bark App 获取（必填）</td>
  </tr>
  <tr>
   <td>消息保存</td>
   <td>boolean</td>
   <td>是否在客户端保留历史记录</td>
  </tr>
  <tr>
   <td>忽略自己</td>
   <td>boolean</td>
   <td>按 UID 过滤博主评论</td>
  </tr>
  <tr>
   <td>博主 UID</td>
   <td>integer</td>
   <td>博主用户 ID，默认 1</td>
  </tr>
  <tr>
   <td>推送图标</td>
   <td>URL</td>
   <td>通知图标完整链接</td>
  </tr>
  <tr>
   <td>消息分组</td>
   <td>string</td>
   <td>通知分类标识</td>
  </tr>
  <tr>
   <td>提示音</td>
   <td>string</td>
   <td>音效文件名，<a href="https://github.com/Finb/Bark/tree/master/Sounds">参考列表</a></td>
  </tr>
  <tr>
   <td>调试模式</td>
   <td>boolean</td>
   <td>启用请求/响应日志记录</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="heading-5">推送数据格式</h2>
<p>插件向 Bark API 发送的 POST 数据：</p>
<pre><code class="language-php">[
    'title'     =&gt; '📩 【博客名】有新评论',
    'body'      =&gt; '「文章标题」\n👤 评论者：内容摘要...',
    'url'       =&gt; 'https://example.com/article/comment-page-1#comment-123',
    'icon'      =&gt; $options-&gt;barkIcon,      // 可选
    'group'     =&gt; $options-&gt;barkGroup,     // 可选
    'isArchive' =&gt; $options-&gt;barkArchive,   // 1 或 0
    'sound'     =&gt; $options-&gt;barkSound,     // 可选
    'level'     =&gt; 'active' | 'timeSensitive'
]
</code></pre>
<hr>
<h2 id="heading-6">安装与使用</h2>
<h3 id="heading-7">环境要求</h3>
<ul>
 <li>Typecho 1.3.0</li>
 <li>PHP ≥ 7.4（推荐 8.0+）</li>
</ul>
<h3 id="heading-8">安装步骤</h3>
<ol>
 <li>下载插件文件</li>
 <li>解压至 <code>/usr/plugins/Comment2Bark/</code></li>
 <li>后台「控制台 → 插件」启用</li>
 <li>填写 Bark Key 完成配置</li>
</ol>
<h3 id="-bark-key">获取 Bark Key</h3>
<ol>
 <li>iOS 设备安装 <a href="https://apps.apple.com/app/bark/id1403753865">Bark App</a></li>
 <li>打开 App 自动生成 Key</li>
 <li>格式示例：<code>https://api.day.app/xxxxxxxxxx</code></li>
</ol>
<hr>
<h2 id="heading-9">版本历史</h2>
<h3 id="v202">v2.0.2</h3>
<ul>
 <li>​<strong>代码优化</strong>​：match 表达式语法修正</li>
 <li>​<strong>安全加强</strong>​：回复通知中原评论内容统一使用 sanitizeText 处理</li>
</ul>
<h3 id="v201">v2.0.1</h3>
<ul>
 <li>​<strong>钩子修复</strong>​：修复 <code>onMark</code> 钩子参数错误</li>
 <li>​<strong>通知优化</strong>​：审核通知区分回复和新评论</li>
</ul>
<h3 id="v200">v2.0.0</h3>
<ul>
 <li>​<strong>代码重构</strong>​：精简代码，模块化设计</li>
 <li>​<strong>钩子升级</strong>​：使用 <code>finishComment</code> 替代已弃用的 <code>onComment</code></li>
 <li>​<strong>链接修复</strong>​：修复 Typecho <code>permalink</code> 字段不存在问题，改用 <code>Widget_Archive</code> 动态获取</li>
 <li>​<strong>分页优化</strong>​：修复评论分页计算逻辑，支持 ASC/DESC 两种排序方式</li>
 <li>​<strong>统一架构</strong>​：5 个推送场景统一使用相同的链接构建逻辑</li>
</ul>
<h3 id="v140">v1.4.0</h3>
<ul>
 <li>全面代码重构，提取魔法数字为类常量</li>
 <li>合并 barkSend 和 finishComment 为统一入口</li>
 <li>新增 isSuccess()、sanitizeText() 等辅助方法</li>
 <li>优化评论链接生成逻辑</li>
</ul>
<h3 id="v130">v1.3.0</h3>
<ul>
 <li>添加推送失败重试机制</li>
 <li>加强评论内容处理，防止 XSS</li>
 <li>添加推送分级参数</li>
</ul>
<h3 id="v120---v121">v1.2.0 - v1.2.1</h3>
<ul>
 <li>支持 Typecho 1.3.0+ 版本</li>
 <li>使用新的 finishComment 回调</li>
</ul>
<h3 id="v10">v1.0</h3>
<ul>
 <li>初始版本，实现基本评论推送功能</li>
</ul>
<hr>
<h2 id="heading-10">项目信息</h2>
<ul>
 <li><strong>开源协议</strong>：MIT</li>
 <li><strong>代码仓库</strong>：https://github.com/NoEggEgg/Comment2Bark</li>
 <li><strong>Bark</strong>：https://github.com/Finb/Bark</li>
</ul>
<hr>
<h2 id="heading-11">相关资源</h2>
<p>Typecho 插件开发文档：http://docs.typecho.org/plugins
 <br>
 Bark 服务端部署指南：https://bark.day.app/#/deploy
 <br>
 Bark 音效列表：https://github.com/Finb/Bark/tree/master/Sounds</p>]]></description><guid isPermaLink="false">/archives/typecho-comment2bark-plugin</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F1775204078921.avif&amp;size=m" type="image/jpeg" length="27010"/><category>技巧</category><category>分享</category><pubDate>Sat, 4 Apr 2026 02:08:00 GMT</pubDate></item><item><title><![CDATA[又拍云插件 UpyunFile v1.2 更新：修复 Typecho 1.3.0 兼容性问题]]></title><link>https://wuqishi.com/archives/upyunfile-v1-2-update-fixes-typecho-1-3-0-compatibility</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%8F%88%E6%8B%8D%E4%BA%91%E6%8F%92%E4%BB%B6%20UpyunFile%20v1.2%20%E6%9B%B4%E6%96%B0%EF%BC%9A%E4%BF%AE%E5%A4%8D%20Typecho%201.3.0%20%E5%85%BC%E5%AE%B9%E6%80%A7%E9%97%AE%E9%A2%98&amp;url=/archives/upyunfile-v1-2-update-fixes-typecho-1-3-0-compatibility" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FQtGplNshu7q.webp%21wwater&amp;size=m" alt="又拍云又拍云插件 UpyunFile 更新" title="Typecho 又拍云存储插件 UpyunFile"></p>
<h2 id="前言">前言</h2>
<p>距离上次发布 v1.1 版本已经过去了三个月，Typecho 官方也发布了备受期待的 1.3.0 版本。这次大版本更新带来了许多底层架构的改进，但也导致了不少插件出现兼容性问题。</p>
<p><a href="https://wuqishi.com/archives/Typecho-UpyunFile-Modified-added-custom-directory-structure-function">Typecho 又拍云文件管理插件修改版使用指南：新增自定义目录结构功能</a></p>
<p>昨天我更新了新版本遇到的问题：升级 Typecho 1.3.0 后，又拍云插件在后台文件管理页面报错，无法正常显示已有文件的 URL。于是更新了 <strong>UpyunFile v1.2</strong> 版本，这个版本不仅彻底解决了 Typecho 1.3.0 的兼容性问题，还进一步简化了配置流程，让插件使用更加便捷。</p>
<hr>
<h2 id="1-核心修复-Typecho-1-3-0-兼容性适配">1、核心修复：Typecho 1.3.0 兼容性适配</h2>
<h3 id="问题现象">问题现象</h3>
<p>升级 Typecho 1.3.0 后，你可能会遇到以下问题：</p>
<ul>
 <li><strong>后台文件管理页面报错</strong>：附件 URL 显示异常或页面报错</li>
</ul>
<pre><code class="language-php">TypeError: UpyunFile_Plugin::attachmentHandle(): 
Argument #1 ($content) must be of type array, Typecho\Config given
...
</code></pre>
<ul>
 <li><strong>文章中的附件链接失效</strong>：图片、文件无法正常加载</li>
</ul>
<pre><code class="language-php">https://cdn.example.com/  ← 路径缺失！
</code></pre>
<h3 id="解决方案">解决方案</h3>
<p>v1.2 版本采用了<strong>多重兼容策略</strong>，确保在不同 Typecho 版本下都能正常工作：</p>
<pre><code class="language-php">public static function attachmentHandle(Typecho\Config $content) {
    // 1. 优先检查新版本的 Config 对象结构
    if (isset($content-&gt;attachment) &amp;&amp; isset($content-&gt;attachment-&gt;path)) {
        $path = $content-&gt;attachment-&gt;path;
    } 
    // 2. 其次检查直接 path 属性
    else if (isset($content-&gt;path)) {
        $path = $content-&gt;path;
    } 
    // 3. 最后尝试从 text 字段反序列化（兼容旧数据）
    else if (isset($content-&gt;text)) {
        $attachment = @unserialize($content-&gt;text);
        if (is_array($attachment) &amp;&amp; isset($attachment['path'])) {
            $path = $attachment['path'];
        }
    }
    // 构建完整 URL
    return Typecho_Common::url($path, $domain);
}
</code></pre>
<hr>
<h2 id="2-资源泄漏修复">2、资源泄漏修复</h2>
<p>在代码审查中发现了一个潜在的资源管理问题：</p>
<p><strong>修复前</strong>（存在资源泄漏风险）：</p>
<pre><code class="language-php">$fh = fopen($uploadfile, 'rb');
$upyun-&gt;write($path, $fh);
// 如果 write() 抛出异常，fclose 不会执行
if (is_resource($fh)) {
    fclose($fh);
}
</code></pre>
<p><strong>修复后</strong>（确保资源释放）：</p>
<pre><code class="language-php">$fh = fopen($uploadfile, 'rb');
try {
    $upyun-&gt;write($path, $fh);
} finally {
    // 无论是否异常，都会执行
    if (is_resource($fh)) {
        fclose($fh);
    }
}
</code></pre>
<h2 id="3-配置简化-移除目录结构选择">3、配置简化：移除目录结构选择</h2>
<h3 id="为什么要简化-">为什么要简化？</h3>
<p>在 v1.1 版本中，我提供了三种目录结构模式：</p>
<ol>
 <li><strong>自定义结构</strong> - <code>/files/年/月/文件名</code></li>
 <li><strong>Typecho结构</strong> - <code>/typecho/usr/uploads/年/月/文件名</code></li>
 <li><strong>精简结构</strong> - <code>/年/月/文件名</code></li>
</ol>
<p>但在实际使用中，我发现：</p>
<ul>
 <li>90% 的用户只使用自定义结构</li>
 <li>三种模式增加了代码复杂度</li>
 <li>配置界面不够直观</li>
</ul>
<h3 id="新的设计">新的设计</h3>
<p>v1.2 版本<strong>移除了目录结构模式选择</strong>，只保留一个<strong>自定义路径</strong>输入框：</p>
<pre><code>自定义路径：/files  （默认为 /files）
</code></pre>
<p>最终文件路径格式固定为：</p>
<pre><code>{自定义路径}/{年}/{月}/{文件名}
例如：/files/2026/04/example.jpg
</code></pre>
<h3 id="好处">好处</h3>
<ul>
 <li>🎨 <strong>界面更简洁</strong> - 减少用户选择负担</li>
 <li>🔧 <strong>配置更简单</strong> - 只需填写一个路径</li>
 <li>🚀 <strong>代码更精简</strong> - 减少潜在 bug</li>
 <li>📚 <strong>逻辑更清晰</strong> - 统一的行为预期</li>
</ul>
<hr>
<h2 id="--版本更新记录">📋 版本更新记录</h2>
<h3 id="v1-2--2026-04-02-">v1.2 (2026-04-02)</h3>
<p><strong>🐛 修复</strong></p>
<ul>
 <li>修复 Typecho 1.3.0 兼容性问题</li>
 <li>修复后台文件管理 URL 不完整问题</li>
 <li>修复文件句柄资源泄漏风险</li>
</ul>
<p><strong>✨ 优化</strong></p>
<ul>
 <li>简化目录结构配置，移除模式选择</li>
 <li>自定义路径默认值改为 <code>/files</code></li>
 <li>完善代码注释，提升可维护性</li>
</ul>
<h3 id="v1-1--2026-01-09-">v1.1 (2026-01-09)</h3>
<ul>
 <li>✅ 新增自定义目录结构功能</li>
 <li>✅ 优化后台配置界面用户体验</li>
</ul>
<hr>
<h2 id="--安装与使用指南">🚀 安装与使用指南</h2>
<h3 id="系统要求">系统要求</h3>
<ul>
 <li>Typecho 1.1+ 版本（推荐 1.3.0+）</li>
 <li>PHP 7.0+ 运行环境</li>
 <li>有效的又拍云服务账号</li>
</ul>
<h3 id="升级步骤-从-v1-1-升级-">升级步骤（从 v1.1 升级）</h3>
<ol>
 <li><strong>备份数据</strong> - 建议先备份数据库和现有插件配置</li>
 <li><strong>下载新版本</strong> - 获取 v1.2 版本插件包</li>
 <li><strong>替换文件</strong> - 覆盖原有插件文件（保留配置）</li>
 <li><strong>检查配置</strong> - 进入插件设置，确认自定义路径正确</li>
 <li><strong>测试验证</strong> - 上传测试文件，检查 URL 生成是否正常</li>
</ol>
<blockquote>
 <p>或者你直接获取 GitHub 上 Plugin.php 的代码覆盖一下呗，😂</p>
</blockquote>
<h3 id="全新安装步骤">全新安装步骤</h3>
<ol>
 <li>
  <p>下载插件压缩包</p>
 </li>
 <li>
  <p>解压至 Typecho 的 <code>usr/plugins</code> 目录，文件夹命名为 <code>UpyunFile</code></p>
 </li>
 <li>
  <p>在 Typecho 后台「控制台」-&gt;「插件」中启用插件</p>
 </li>
 <li>
  <p>进入插件设置页面，配置以下参数：</p>
  <ul>
   <li><strong>绑定域名</strong> - 又拍云服务绑定的域名（如 <code>https://cdn.example.com</code>）</li>
   <li><strong>自定义路径</strong> - 文件上传路径（默认为 <code>/files</code>）</li>
   <li><strong>服务名称</strong> - 又拍云服务名称</li>
   <li><strong>操作员</strong> - 又拍云操作员账号</li>
   <li><strong>密码</strong> - 又拍云操作员密码</li>
  </ul>
 </li>
 <li>
  <p>保存设置，完成安装</p>
 </li>
</ol>
<hr>
<h2 id="---配置详解">⚙️ 配置详解</h2>
<h3 id="基本配置">基本配置</h3>
<table>
 <thead>
  <tr>
   <th>配置项</th>
   <th>说明</th>
   <th>示例</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>图片链接修改</td>
   <td>开启后将文章中的图片链接替换为 CDN 链接</td>
   <td>建议开启</td>
  </tr>
  <tr>
   <td>绑定域名</td>
   <td>又拍云服务绑定的域名</td>
   <td><code>https://cdn.example.com</code></td>
  </tr>
  <tr>
   <td>自定义路径</td>
   <td>文件上传的基础路径</td>
   <td><code>/files</code></td>
  </tr>
  <tr>
   <td>服务名称</td>
   <td>又拍云服务名称</td>
   <td><code>mybucket</code></td>
  </tr>
  <tr>
   <td>操作员</td>
   <td>又拍云操作员账号</td>
   <td><code>operator</code></td>
  </tr>
  <tr>
   <td>密码</td>
   <td>又拍云操作员密码</td>
   <td><code>password</code></td>
  </tr>
 </tbody>
</table>
<h3 id="高级配置-可选-">高级配置（可选）</h3>
<p><strong>又拍云图片处理</strong></p>
<p>需要在又拍云控制台创建缩略图版本，然后将版本名称填入插件配置。</p>
<ul>
 <li><strong>缩略图版本名称</strong> - 如 <code>thumb</code>、<code>small</code> 等</li>
 <li><strong>转码输出格式</strong> - 如 <code>jpg</code>、<code>png</code>、<code>webp</code></li>
</ul>
<p>⚠️ <strong>注意</strong>：带有 <code>_nothumb</code> 后缀的图片不会被处理（如 <code>example_nothumb.png</code>）</p>
<p><strong>Token 防盗链</strong></p>
<ol>
 <li>在又拍云控制台启用 Token 防盗链功能</li>
 <li>将密钥填入插件配置</li>
 <li>设置签名过期时间（单位：秒）</li>
</ol>
<hr>
<h2 id="--下载与反馈">📥 下载与反馈</h2>
<h3 id="项目地址">项目地址</h3>
<ul>
 <li>GitHub Releases：https://github.com/NoEggEgg/UpyunFile</li>
</ul>
<h3 id="问题反馈">问题反馈</h3>
<p>如果您在使用过程中遇到任何问题，欢迎通过以下方式反馈：</p>
<ul>
 <li>在 GitHub 提交 <a href="https://github.com/NoEggEgg/UpyunFile/issues">Issue</a></li>
 <li>在本文评论区留言</li>
</ul>
<h3 id="参与贡献">参与贡献</h3>
<p>欢迎提交 Pull Request 或提出改进建议！</p>
<hr>
<h2 id="--致谢">🙏 致谢</h2>
<ul>
 <li>原版插件：https://github.com/codesee/UpyunFile</li>
 <li>二改版本：https://github.com/ShadowySpirits/UpyunFile</li>
 <li>三改版本：https://github.com/liuran001/UpyunFile</li>
 <li>Typecho 官方：https://typecho.org</li>
 <li>又拍云官方：https://www.upyun.com</li>
</ul>]]></description><guid isPermaLink="false">/archives/upyunfile-v1-2-update-fixes-typecho-1-3-0-compatibility</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FQtGplNshu7q.webp%21wwater&amp;size=m" type="image/jpeg" length="126254"/><category>技巧</category><category>分享</category><pubDate>Fri, 3 Apr 2026 02:23:00 GMT</pubDate></item><item><title><![CDATA[手把手修复RSS 403：从PHP警告到Cloudflare拦截的全链路排查]]></title><link>https://wuqishi.com/archives/rss-403-error-php8-cloudflare-waf-fix</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%89%8B%E6%8A%8A%E6%89%8B%E4%BF%AE%E5%A4%8DRSS%20403%EF%BC%9A%E4%BB%8EPHP%E8%AD%A6%E5%91%8A%E5%88%B0Cloudflare%E6%8B%A6%E6%88%AA%E7%9A%84%E5%85%A8%E9%93%BE%E8%B7%AF%E6%8E%92%E6%9F%A5&amp;url=/archives/rss-403-error-php8-cloudflare-waf-fix" width="1" height="1" alt="" style="opacity:0;">
<p>最近有人反馈说，通过Feedly订阅我的博客总是失败。我自己在浏览器里打开<code>wuqishi.com/feed/</code>​明明一切正常，这典型的“RSS 403”问题，相当于关上了订阅的大门。折腾一圈下来，发现根源无非两个：<strong>服务器上的PHP乱输出</strong>，或者<strong>Cloudflare等CDN的“误杀”</strong> 。下面就把我的排查过程和解决方案贴出来，希望能帮你一把。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FrrBGeGvqHDv.webp%21wwater&amp;size=m" alt="RSS订阅修复"></p>
<p>首先，我们得知道问题出在哪个环节。打开终端，用下面这条命令模拟一下RSS阅读器的请求：</p>
<pre><code class="language-bash">curl -I -H "User-Agent: Feedly/1.0" https://wuqishi.com/feed/
</code></pre>
<p>重点看返回的HTTP状态码和响应头：</p>
<ul>
 <li>​<strong>如果状态码是403，并且响应头里带有</strong> <strong>​<code>CF-RAY</code>​</strong>​<strong>字段</strong>：那问题八成出在Cloudflare的WAF或者Bot防护规则上，你的请求在CDN边缘就被掐掉了。直接看下面关于Cloudflare的章节。</li>
 <li>​<strong>如果状态码不是200，也没有</strong> <strong>​<code>CF-RAY</code>​</strong>​<strong>头</strong>：这是你的源站服务器（比如Nginx/PHP）自己返回的错误，去看PHP修复那部分。</li>
 <li>​<strong>如果返回了XML，但内容最前面混入了PHP的Warning或Deprecated信息</strong>：这就是经典的“PHP输出污染”，XML格式被破坏，阅读器自然无法识别。解决方案也在PHP部分。</li>
</ul>
<h2 id="php">PHP层修复：搞定版本兼容性与错误输出</h2>
<p>不同PHP版本，坑点不一样。这里我简单列一下，方便大家对号入座：</p>
<ul>
 <li>​<strong>PHP 7.4 / 8.0 / 8.1</strong>​：这几个版本比较安分，主要确保<code>php.ini</code>​里<code>display_errors = Off</code>别让警告输出就行。不过PHP 7.4已经停止官方支持了，能升级还是建议升级。</li>
 <li>​<strong>PHP 8.2</strong>​：<strong>重点关注！</strong> 这个版本开始默认弃用“动态属性”，很多老程序会因此抛出<code>Deprecated</code>​警告，这些警告会直接插在RSS的XML开头，导致解析失败。解决办法是在程序入口或<code>php.ini</code>里关掉错误显示。</li>
 <li>​<strong>PHP 8.3 / 8.4</strong>：类型系统越来越严格。8.3对动态属性控制更狠，8.4则弃用了隐式可空类型声明。确保你用的博客程序（如Typecho, WordPress）已经发布了兼容这些新版本的更新。</li>
</ul>
<p>​<strong>具体操作</strong>：</p>
<p>在你的网站入口文件（例如<code>index.php</code>​）最开头，或者直接在<code>php.ini</code>配置文件中，加入以下代码来压制错误输出：</p>
<pre><code class="language-ini">// 方法一：在程序入口文件（如 index.php）顶部添加
error_reporting(0);
ini_set('display_errors', '0');

// 方法二：修改 php.ini（效果更全局）
display_errors = Off
error_reporting = E_ALL &amp; ~E_NOTICE &amp; ~E_STRICT &amp; ~E_DEPRECATED
</code></pre>
<p><strong>我的建议是，无论用哪个版本，在生产环境永远关闭</strong> <strong>​<code>display_errors</code>​</strong>​ <strong>。</strong> 修改完配置后，​<strong>别忘了重启PHP-FPM服务</strong>​（例如 <code>systemctl restart php8.2-fpm</code>）。</p>
<h2 id="cloudflarewaf">Cloudflare层修复：让WAF规则放行你的订阅源</h2>
<p>浏览器能打开，阅读器报403——这是Cloudflare把RSS阅读器的请求当成可疑机器人给拦了。我们需要调整它的安全规则。</p>
<h3 id="bot-fight-mode">第一步：关闭“Bot Fight Mode”</h3>
<p>​<strong>操作路径</strong>：Cloudflare 控制台 → 安全性 (Security) → 自动程序 (Bots)</p>
<p>找到“自动程序攻击模式”(Bot Fight Mode)，​<strong>把它关掉</strong>。免费版的这个模式有点“宁杀错不放过”，会误伤很多正常的自动请求，比如RSS阅读器、搜索引擎爬虫。</p>
<p>如果你是Pro版用户，可以开启更智能的“Super Bot Fight Mode”，然后在“已验证的机器人”(Verified Bots)分类中，设置规则为“允许”(Allow)，这样Feedly、Googlebot这些正规军就能通行了。</p>
<h3 id="waf">第二步：配置精准的WAF规则</h3>
<p>我们需要创建一条规则，专门放行RSS订阅地址的请求，不让后续的安防规则拦截它。</p>
<p>在Cloudflare控制台，进入​<strong>安全性 → WAF → 自定义规则</strong>，创建一个新规则：</p>
<ol>
 <li>
  <p>​<strong>规则名称</strong>：比如“Allow RSS Feed Subscribers”</p>
 </li>
 <li>
  <p>​<strong>规则表达式 (When incoming requests match…)</strong> ：</p>
  <pre><code class="language-ini">(http.request.uri.path contains "/feed") or (http.request.uri.path contains "/rss") or (http.request.uri.path contains "/atom")
</code></pre>
  <p>（请根据你博客实际的RSS路径修改）</p>
 </li>
 <li>
  <p>​<strong>操作 (Then…)</strong> ​：选择 <strong>跳过 (Skip)</strong></p>
 </li>
 <li>
  <p>​<strong>在Skip的子选项中，勾选“跳过所有剩余的自定义规则”(Skip remaining custom rules)</strong> 。这一步非常关键，确保RSS请求不受其他可能存在的拦截规则影响。</p>
 </li>
</ol>
<p>然后，把这个规则的​<strong>优先级拖到比较靠前的位置</strong>，确保它先于其他可能的拦截规则生效。</p>
<h3 id="heading">第三步：清除缓存</h3>
<p>修改完任何Cloudflare设置后，一个好习惯是清除缓存。</p>
<p>​<strong>操作路径</strong>：Cloudflare 控制台 → 缓存 (Caching) → 配置 (Configuration) → 清除所有内容 (Purge Everything)。</p>
<p>点“清除所有”。之后，再用阅读器或<code>curl</code>命令测试一下你的RSS地址，应该就能正常返回了。</p>
<h2 id="nginx">源站加固：Nginx配置兜底</h2>
<p>为了防止有人绕过Cloudflare直接攻击源站，或者作为你没用CDN时的防护，可以在Nginx里加一层基础防护。</p>
<p>把下面这段配置加到你的网站Nginx配置文件中（通常是 <code>server</code>块内）：</p>
<pre><code class="language-nginx">location ~ ^/(feed|rss|atom) {
    # 只允许GET请求访问RSS
    limit_except GET { deny all; }
    
    # 拦截一些常见的恶意扫描工具的UA
    if ($http_user_agent ~* (sqlmap|nikto|nmap|zgrab|gobuster)) {
        return 444;
    }
    
    # 设置访问频率限制，防止被刷
    limit_req zone=one burst=5 nodelay;
    
    # 这里是你的原始PHP处理逻辑，保持不变
    try_files $uri $uri/ /index.php?$args;
}

# 可以顺便拦一下其他常见恶意请求路径
location ~* /(wp-admin|xmlrpc\.php|\.env|\.git) {
    return 444;
}
</code></pre>
<p>记得根据你服务器的实际情况，调整频率限制区域(<code>zone</code>​)的名称和<code>limit_req</code>​的参数。配置好后，运行 <code>nginx -t</code>​测试配置，然后 <code>systemctl reload nginx</code>重载生效。</p>
<h2 id="heading-1">验证清单</h2>
<p>都配置完之后，可以用下面这个清单快速检查一下是否全部生效：</p>
<ol>
 <li>​<strong>检查PHP输出</strong>：直接用浏览器打开你的RSS订阅地址，查看网页源代码，看最前面有没有不该出现的PHP错误信息。</li>
 <li>​<strong>模拟阅读器请求</strong>​：在终端运行 <code>curl -H "User-Agent: Feedly/1.0" https://你的域名.com/feed</code>，确认返回状态码是200，并且内容是干净的XML。</li>
 <li>​<strong>清理Cloudflare缓存</strong>：在Cloudflare控制台的“缓存”设置里，执行“清除所有”的操作，确保新规则立即生效。</li>
 <li>​<strong>终极验证</strong>​：去 <a href="https://validator.w3.org/feed/">W3C Feed验证服务</a>或你的Feedly订阅器里，重新添加一遍订阅链接，看看是否成功。</li>
</ol>
<p>按照上面步骤走一遍，绝大多数RSS 403的问题都能解决。如果还有问题，欢迎在评论区留言讨论。</p>]]></description><guid isPermaLink="false">/archives/rss-403-error-php8-cloudflare-waf-fix</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2FrrBGeGvqHDv.webp%21wwater&amp;size=m" type="image/jpeg" length="128424"/><category>技巧</category><category>分享</category><pubDate>Thu, 2 Apr 2026 06:49:00 GMT</pubDate></item><item><title><![CDATA[网站被镜像怎么办？2026年反镜像攻防实战指南]]></title><link>https://wuqishi.com/archives/anti-mirror-defense-guide</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BD%91%E7%AB%99%E8%A2%AB%E9%95%9C%E5%83%8F%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F2026%E5%B9%B4%E5%8F%8D%E9%95%9C%E5%83%8F%E6%94%BB%E9%98%B2%E5%AE%9E%E6%88%98%E6%8C%87%E5%8D%97&amp;url=/archives/anti-mirror-defense-guide" width="1" height="1" alt="" style="opacity:0;">
<p><strong>文章有点长，用AI总结了核心摘要</strong>：</p>
<blockquote>
 <p>网站被镜像怎么解决？从<strong>发现网站被镜像</strong>、<strong>反镜像技术防护</strong>到<strong>DMCA投诉下架</strong>，提供2026年4月最新完整解决方案，含Nginx拦截代码、JS自动跳转脚本、服务器日志分析方法、中英双语投诉邮件模板。</p>
 <p><strong>关键词</strong>：网站被镜像 | 反镜像 | DMCA投诉 | Nginx防护 | JS跳转</p>
</blockquote>
<hr>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F1775009968672.webp%21wwater&amp;size=m" alt="网站被镜像怎么办？2026年反镜像攻防实战指南"></p>
<p>最近不止一次发现圈里不少博主的站和我之前一样，都遭遇了一件挺<strong>膈应人</strong>的事：<strong>网站被镜像</strong>。</p>
<p>简单说，就是有人用技术手段，把你的博客整个"<strong>复印</strong>"到他的域名下，实时同步。你更新一篇文章，它那边几分钟后也出现一篇繁体（或简体）版。他靠你的内容吸引流量、放广告赚钱，甚至用你的"信誉"给他的垃圾站刷权重。</p>
<p>这种感觉，就像自己家被装了个<strong>单向镜</strong>，有人在另一面观察和复制你的一切。经过一番研究和实战，我整理出这份从<strong>侦查</strong>、<strong>防御</strong>到<strong>反击</strong>的完整指南，希望能帮到同样困扰的你。</p>
<hr>
<h2 id="一-什么是网站被镜像-为什么必须处理-">一、什么是网站被镜像？为什么必须处理？</h2>
<p><strong>网站被镜像</strong>（Site Mirroring）是指第三方通过技术手段实时复制你的网站全部内容，部署在其域名下。常见危害：</p>
<table>
 <thead>
  <tr>
   <th align="left">危害类型</th>
   <th align="left">具体影响</th>
   <th align="left">SEO后果</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left"><strong>流量窃取</strong></td>
   <td align="left">镜像站通过SEO排名截取你的搜索流量</td>
   <td align="left">自然流量下降30%-70%</td>
  </tr>
  <tr>
   <td align="left"><strong>权重分散</strong></td>
   <td align="left">搜索引擎将原创内容归属给镜像站</td>
   <td align="left">核心关键词排名下滑</td>
  </tr>
  <tr>
   <td align="left"><strong>广告收益损失</strong></td>
   <td align="left">对方在你的内容上投放广告获利</td>
   <td align="left">间接收入损失</td>
  </tr>
  <tr>
   <td align="left"><strong>品牌信誉损害</strong></td>
   <td align="left">用户误入镜像站遭遇诈骗或恶意软件</td>
   <td align="left">品牌信任度降低</td>
  </tr>
  <tr>
   <td align="left"><strong>搜索引擎惩罚</strong></td>
   <td align="left">被误判为"重复内容"或"采集站"</td>
   <td align="left">整站降权甚至被K</td>
  </tr>
 </tbody>
</table>
<blockquote>
 <p>⚠️ <strong>关键提醒</strong>：2025年后Google对"重复内容"的判定更严格，镜像站若采用<strong>繁体转换</strong>、<strong>同义词替换</strong>等"伪原创"手段，你的原站反而可能被误判为抄袭者。必须<strong>主动举证投诉</strong>。</p>
</blockquote>
<hr>
<h2 id="二-如何发现网站被镜像-3种方法-">二、如何发现网站被镜像（3种方法）</h2>
<h3 id="方法一-搜索引擎指纹检测-适合所有人-">方法一：搜索引擎指纹检测（适合所有人）</h3>
<p><strong>操作步骤</strong>：</p>
<ol>
 <li>从你的文章中提取<strong>唯一性句子</strong>（含个人经历、特定数据、独特观点）</li>
 <li>在Google搜索框输入：<code>"唯一句子"</code>（带双引号精确匹配）</li>
 <li>查看搜索结果中是否有<strong>非你域名</strong>的相同内容</li>
</ol>
<p><strong>示例</strong>：</p>
<pre><code>搜索："2023年我在阳台用M1 Mac调试Nginx时发现的444状态码特性"
结果：若出现 你的域名以外的域名，即为镜像站
</code></pre>
<p><strong>进阶搜索指令</strong>：</p>
<table>
 <thead>
  <tr>
   <th align="left">指令</th>
   <th align="left">用途</th>
   <th align="left">示例</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left"><code>intitle:你的品牌名 -site:你的域名</code></td>
   <td align="left">查找标题含你品牌名的非本站页面</td>
   <td align="left"><code>intitle:蛋蛋之家 -site:wuqishi.com</code></td>
  </tr>
  <tr>
   <td align="left"><code>site:可疑域名.com 你的文章标题</code></td>
   <td align="left">确认某域名是否复制了特定文章</td>
   <td align="left"><code>site:xxx.com Nginx反镜像实战</code></td>
  </tr>
  <tr>
   <td align="left"><code>cache:可疑域名.com/文章路径</code></td>
   <td align="left">查看Google缓存中的页面内容</td>
   <td align="left"><code>cache:xxx.com/nginx-mirror-defense</code></td>
  </tr>
 </tbody>
</table>
<hr>
<h3 id="方法二-服务器日志分析-技术人必备-">方法二：服务器日志分析（技术人必备）</h3>
<p><strong>查看Nginx访问日志</strong>（通常位于 <code>/var/log/nginx/access.log</code> 或 <code>/var/log/nginx/access.log.1</code>）：</p>
<h4 id="识别特征A-爬虫式高频请求">识别特征A：爬虫式高频请求</h4>
<pre><code class="language-nginx"># 危险信号：同一IP短时间内顺序抓取全站
203.0.113.45 - - [01/Apr/2026:09:15:01 +0800] "GET /" 200 1024 "-" "python-requests/2.28.1"
203.0.113.45 - - [01/Apr/2026:09:15:02 +0800] "GET /post-1" 200 2048 "-" "python-requests/2.28.1"
203.0.113.45 - - [01/Apr/2026:09:15:03 +0800] "GET /post-2" 200 2048 "-" "python-requests/2.28.1"
# ↑ 1分钟内顺序请求首页+文章页，UA为爬虫工具 = 99%是镜像程序
</code></pre>
<p><strong>快速筛选命令</strong>：</p>
<pre><code class="language-bash"># 找出高频访问IP（1分钟内超过20次）
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# 筛选特定UA的日志
grep -i "python-requests\|curl\|wget" /var/log/nginx/access.log
</code></pre>
<h4 id="识别特征B-伪造Googlebot-最常见-">识别特征B：伪造Googlebot（最常见）</h4>
<p><strong>双重DNS验证法</strong>（100%准确，必须两步都做）：</p>
<pre><code class="language-bash"># 第1步：反向DNS查询IP（确认域名归属）
$ host 66.249.90.77
66.249.90.77.in-addr.arpa domain name pointer rate-limited-proxy-66-249-90-77.googlebot.com.
# ✅ 正确结果：以.googlebot.com、.googleusercontent.com或.google.com结尾

# 第2步：正向DNS验证域名（关键！防止"反向伪造"）
$ host rate-limited-proxy-66-249-90-77.googlebot.com.
rate-limited-proxy-66-249-90-77.googlebot.com has address 66.249.90.77
# ✅ 必须返回原IP 66.249.90.77
</code></pre>
<p><strong>判定标准</strong>：</p>
<table>
 <thead>
  <tr>
   <th align="left">步骤</th>
   <th align="left">真Googlebot</th>
   <th align="left">假Googlebot（镜像爬虫）</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left">反向DNS</td>
   <td align="left">以<code>.googlebot.com</code>等结尾</td>
   <td align="left">以<code>.a2hosting.com</code>、<code>.cloudflare.com</code>等结尾</td>
  </tr>
  <tr>
   <td align="left">正向DNS</td>
   <td align="left">返回原IP</td>
   <td align="left">返回不同IP或无法解析</td>
  </tr>
  <tr>
   <td align="left">结论</td>
   <td align="left">✅ 合法爬虫</td>
   <td align="left">❌ 立即拦截</td>
  </tr>
 </tbody>
</table>
<blockquote>
 <p>📌 <strong>2026年4月最新</strong>：Googlebot IP段持续扩展，新增34.104.x.x、34.118.x.x等范围。硬编码IP拦截已不可靠，<strong>强烈建议使用官方JSON动态验证</strong>：<code>https://developers.google.com/static/search/apis/ipranges/googlebot.json</code></p>
</blockquote>
<h4 id="识别特征C-Referer暴露盗链">识别特征C：Referer暴露盗链</h4>
<pre><code class="language-nginx"># 日志中搜索静态资源请求，查看第11个字段（Referer）
66.249.xx.xx - - [01/Apr/2026:09:20:15 +0800] "GET /wp-content/uploads/photo.jpg" 200 51234 "https://可疑镜像站.com/文章页" "Mozilla/5.0..."
# 字段分解：IP - 用户 - 时间 "请求" 状态码 字节数 "Referer" "User-Agent"
#                                                                 ↑ 看这个Referer！
</code></pre>
<p><strong>快速筛选盗链</strong>：</p>
<pre><code class="language-bash"># 找出非本域名的图片请求Referer
awk '$11 !~ /wuqishi.com|"-"|""/ &amp;&amp; /GET.*\.(jpg|png|gif)/ {print $11}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
</code></pre>
<hr>
<h3 id="方法三-主动钓鱼陷阱-100-实锤-">方法三：主动钓鱼陷阱（100%实锤）</h3>
<p><strong>原理</strong>：创建<strong>无任何入口</strong>的秘密页面，镜像站通过爬虫抓取后必然复制，即可证明实时镜像关系。</p>
<p><strong>操作步骤</strong>：</p>
<pre><code>步骤1：创建诱饵页面（5分钟）
├── 路径：/mirror-trap-2026-[随机8位字符串].html
│   示例：/mirror-trap-2026-a3k9m2p7.html
├── 内容：必须包含唯一识别文本
│   &lt;p&gt;此页面用于检测镜像站，唯一ID: XJ9K2M-A3K9M2P7，时间戳: 2026-04-01T09:54:00+08:00&lt;/p&gt;
│   &lt;p&gt;作者：wuqishi，来源：https://wuqishi.com&lt;/p&gt;
├── 关键操作：
│   × 不放入任何导航菜单
│   × 不添加到Sitemap.xml
│   × 不从任何页面链接引用
│   × 不提交到搜索引擎
│
步骤2：等待24-48小时（给爬虫抓取时间）
│
步骤3：搜索引擎验证（实锤证据）
├── Google搜索：site:可疑域名.com "XJ9K2M-A3K9M2P7"
├── Bing搜索：site:可疑域名.com "wuqishi"
└── 若出现结果 = 实时镜像实锤证据，立即截图保存（含时间戳）
</code></pre>
<p><strong>证据保全清单</strong>：</p>
<ul>
 <li class="vditor-task"><input disabled type="checkbox"> 钓鱼页面源代码截图（显示创建时间）</li>
 <li class="vditor-task"><input disabled type="checkbox"> 搜索引擎结果截图（显示镜像站URL和抓取时间）</li>
 <li class="vditor-task"><input disabled type="checkbox"> 两站页面对比截图（并排显示相同内容）</li>
 <li class="vditor-task"><input disabled type="checkbox"> 服务器日志（显示可疑IP的抓取记录）</li>
</ul>
<hr>
<h2 id="三-反镜像技术防护方案">三、反镜像技术防护方案</h2>
<h3 id="方案A-Nginx层拦截伪造爬虫">方案A：Nginx层拦截伪造爬虫</h3>
<p><strong>用途</strong>：拦截伪造Googlebot的镜像爬虫 | <strong>适用</strong>：Nginx 1.18+ | <strong>注意</strong>：IP段需定期更新，建议结合DNS验证</p>
<pre><code class="language-nginx"># ============================================
# Nginx 反镜像拦截配置
# 位置：/etc/nginx/conf.d/anti-mirror.conf 或站点配置
# 生效命令：sudo nginx -t &amp;&amp; sudo systemctl reload nginx
# ============================================

# 第1步：定义真假Googlebot判断映射（http块内）
map $http_user_agent $is_googlebot {
    ~*googlebot 1;
    default 0;
}

# 第2步：server块内添加拦截规则
server {
    listen 80;
    listen [::]:80;
    server_name wuqishi.com www.wuqishi.com;
  
    # 拦截假Googlebot（IP不在官方段）
    if ($is_googlebot = 1) {
        # 2026年4月已知Googlebot IPv4段（需定期核对）
        # 66.249.x.x, 64.233.x.x, 192.178.x.x, 34.100.x.x, 34.101.x.x, 34.104.x.x, 34.118.x.x
        if ($remote_addr !~* "^(66\.249\.|64\.233\.|192\.178\.|34\.100\.|34\.101\.|34\.104\.|34\.118\.)") {
            return 444;  # Nginx立即断开，不返回任何数据
        }
    }
  
    # 拦截常见爬虫UA（镜像程序常用）
    if ($http_user_agent ~* "(python-requests|curl/|wget/|scrapy|httpx|aiohttp|libwww-perl)") {
        return 444;
    }
  
    # 拦截空UA或可疑UA（可选，视情况启用）
    # if ($http_user_agent = "" || $http_user_agent = "-") {
    #     return 444;
    # }
  
    # 正常location配置...
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}
</code></pre>
<blockquote>
 <p>🔧 <strong>444状态码详解</strong>：Nginx特有非标准状态码，立即关闭TCP连接，<strong>不发送HTTP头/体</strong>，不消耗带宽。客户端表现为"连接被重置"或"空响应"，仅在Nginx日志中记录。比403更节省资源，且不给爬虫任何反馈。</p>
</blockquote>
<p><strong>验证配置生效</strong>：</p>
<pre><code class="language-bash"># 测试假Googlebot是否被拦截（应返回空响应）
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
     -H "X-Forwarded-For: 1.2.3.4" \
     https://wuqishi.com/test
# 预期结果：curl: (52) Empty reply from server（空回复）

# 查看Nginx日志确认
sudo tail -f /var/log/nginx/access.log
# 预期记录：1.2.3.4 - - [时间] "GET /test" 444 0 "-" "假Googlebot UA"
</code></pre>
<hr>
<h3 id="方案B-前端JS自动跳转-终极反镜像方案-">方案B：前端JS自动跳转（终极反镜像方案）</h3>
<p><strong>用途</strong>：检测域名，非法访问则强制跳转回本站 | <strong>SEO价值</strong>：搜索引擎爬虫不执行JS，不影响收录；真实用户访问镜像站时跳转回主站，增加主站流量权重</p>
<p><strong>代码优势</strong>：</p>
<ul>
 <li>✅ Base64+反转混淆，防止对方批量删除</li>
 <li>✅ 清空页面内容，阻止镜像站展示</li>
 <li>✅ 延迟跳转，确保警告弹窗显示</li>
 <li>✅ 支持多级子域名白名单</li>
 <li>✅ 错误静默处理，不影响正常访问</li>
</ul>
<p><strong>生成你的专属编码</strong>（必须执行，不能用示例）：</p>
<pre><code class="language-javascript">// 在浏览器F12控制台执行，替换为你的域名
btoa('你的域名'.split('').reverse().join(''))

// 示例执行过程：
// 1. 'wuqishi.com'.split('').reverse().join('') → 'moc.ihsiquw'
// 2. btoa('moc.ihsiquw') → 'bW9jLmlic2lxdXc='
// 最终结果：'bW9jLmlic2lxdXc='（仅适用于wuqishi.com）
</code></pre>
<p><strong>完整可用代码</strong>（必须替换encodedHost值）：</p>
<pre><code class="language-html">&lt;!-- 放置于主题header.php的&lt;head&gt;最顶部，确保最先执行 --&gt;
&lt;script&gt;
/**
 * 反镜像防御脚本 v1.1
 * 功能：检测域名，非法访问则跳转回正版站点
 * SEO友好：搜索引擎爬虫不执行JS；真实用户跳转回主站，增加流量权重
 * 兼容性：Chrome/Firefox/Safari/Edge/IE9+
 */
(function() {
    'use strict';
  
    // ==================== 配置区（必须修改） ====================
    var CONFIG = {
        // 【重要】替换为你的域名编码：btoa('你的域名'.split('').reverse().join(''))
        // 示例'wuqishi.com' → 'bW9jLmlic2lxdXc='（仅作参考，必须重新生成）
        encodedHost: '【在此处粘贴你的编码】',
  
        // 允许的子域名（按需增删）
        allowedSubdomains: ['www', 'blog', 'cdn', 'img', 'static'],
  
        // 跳转延迟（毫秒，确保alert先显示）
        redirectDelay: 200,
  
        // 是否显示警告弹窗（true/false）
        showAlert: true,
  
        // 跳转后是否携带原路径和参数
        keepPath: true,
        keepSearch: true,
        keepHash: false  // 锚点通常不需要
    };
  
    // ==================== 核心逻辑（无需修改） ====================
    try {
        // 解码真实域名：Base64解码 → 字符串反转 → 原文
        var realHost = atob(CONFIG.encodedHost).split('').reverse().join('');
        var currentHost = window.location.hostname.toLowerCase();
  
        // 域名白名单检查
        var isValid = false;
        var checkList = [realHost, 'www.' + realHost];
  
        // 添加配置的子域名
        if (CONFIG.allowedSubdomains &amp;&amp; CONFIG.allowedSubdomains.length &gt; 0) {
            CONFIG.allowedSubdomains.forEach(function(sub) {
                if (sub) checkList.push(sub.toLowerCase() + '.' + realHost);
            });
        }
  
        // 检查完全匹配
        for (var i = 0; i &lt; checkList.length; i++) {
            if (currentHost === checkList[i]) {
                isValid = true;
                break;
            }
        }
  
        // 检查多级子域名（如 blog.cdn.wuqishi.com）
        if (!isValid &amp;&amp; currentHost.indexOf('.' + realHost) &gt; -1) {
            isValid = true;
        }
  
        // 非法访问处理
        if (!isValid) {
            // 立即停止页面解析
            if (window.stop) {
                window.stop();
            } else if (document.execCommand) {
                document.execCommand('Stop'); // IE9-10兼容
            }
      
            // 清空页面内容（防止镜像站内容显示）
            if (document.body) document.body.innerHTML = '';
            if (document.documentElement) document.documentElement.innerHTML = '';
      
            // 构建跳转URL
            var targetUrl = 'https://' + realHost;
            if (CONFIG.keepPath) {
                targetUrl += window.location.pathname || '';
            }
            if (CONFIG.keepSearch &amp;&amp; window.location.search) {
                targetUrl += window.location.search;
            }
            if (CONFIG.keepHash &amp;&amp; window.location.hash) {
                targetUrl += window.location.hash;
            }
      
            // 显示警告（可选）
            if (CONFIG.showAlert &amp;&amp; window.alert) {
                try {
                    window.alert('⚠️ 安全警告\n\n您正在访问盗版镜像网站，内容可能已被篡改或植入恶意代码！\n\n即将跳转至正版网站：' + realHost);
                } catch(e) {}
            }
      
            // 延迟跳转
            setTimeout(function() {
                if (window.location.replace) {
                    window.location.replace(targetUrl);  // replace不保留历史记录
                } else {
                    window.location.href = targetUrl;    // 兼容旧浏览器
                }
            }, CONFIG.redirectDelay);
      
            // 控制台日志（调试用）
            if (window.console &amp;&amp; console.warn) {
                console.warn('[AntiMirror] 已拦截非法访问: ' + currentHost + ' → ' + realHost);
            }
        }
    } catch(e) {
        // 任何错误静默处理，确保不影响正常访问
        if (window.console &amp;&amp; console.error) {
            console.error('[AntiMirror] 脚本错误（已忽略）:', e.message);
        }
    }
})();
&lt;/script&gt;
</code></pre>
<p><strong>测试验证步骤</strong>：</p>
<ol>
 <li>将代码保存为本地HTML文件</li>
 <li>修改<code>encodedHost</code>为任意错误值（如'xxxxxx'）</li>
 <li>用浏览器打开，应触发跳转或显示警告</li>
 <li>恢复正确编码，部署到生产环境</li>
</ol>
<blockquote>
 <p>💡 <strong>维护建议</strong>：每3-6个月更换一次编码方式，或升级混淆算法（如RC4轻量加密），防止攻击者批量破解。</p>
</blockquote>
<hr>
<h3 id="方案C-图片-资源防盗链">方案C：图片/资源防盗链</h3>
<p><strong>用途</strong>：防止镜像站盗用图片流量，保护图片SEO搜索流量</p>
<pre><code class="language-nginx"># ============================================
# Nginx 图片防盗链配置
# 位置：/etc/nginx/conf.d/anti-leech.conf
# ============================================

# 图片及静态资源防盗链
location ~* \.(jpg|jpeg|png|gif|webp|bmp|svg|ico|css|js|woff|woff2|ttf|eot)$ {
    # 允许的Referer来源：
    # none = 无Referer（直接访问图片）
    # blocked = 被防火墙删除Referer的请求
    # server_names = 当前server_name
    # ~\.wuqishi\.com = 匹配wuqishi.com及所有子域名
    # ~\.google\. = 允许Google图片搜索
    valid_referers none blocked server_names 
                     ~\.wuqishi\.com 
                     ~\.google\. 
                     ~\.bing\. 
                     ~\.baidu\. 
                     ~\.duckduckgo\.;
  
    # 非法Referer处理
    if ($invalid_referer) {
        # 方案1：返回403（推荐，利于SEO识别）
        return 403;
  
        # 方案2：返回自定义"禁止盗链"图片（取消注释使用）
        # rewrite ^ /images/anti-leech.png break;
  
        # 方案3：返回302重定向到警告页面（取消注释使用）
        # return 302 https://wuqishi.com/anti-leech-warning.html;
    }
  
    # 安全响应头
    add_header X-Content-Type-Options "nosniff";
    add_header X-Frame-Options "SAMEORIGIN";
  
    # SEO优化：缓存控制
    expires 6M;  # 6个月
    add_header Cache-Control "public, immutable";
}

# 盗链日志记录（用于投诉证据）
location ~* \.(jpg|jpeg|png|gif|webp)$ {
    valid_referers none blocked server_names ~\.wuqishi\.com;
  
    if ($invalid_referer) {
        # 记录到专用日志（投诉时作为证据）
        access_log /var/log/nginx/anti-leech.log detailed;
        return 403;
    }
  
    # 正常请求记录到标准日志
    access_log /var/log/nginx/access.log;
}
</code></pre>
<p><strong>查看盗链日志</strong>：</p>
<pre><code class="language-bash"># 实时查看盗链记录
sudo tail -f /var/log/nginx/anti-leech.log

# 统计盗链最多的域名
awk -F'"' '/http/ {print $4}' /var/log/nginx/anti-leech.log | sort | uniq -c | sort -rn | head -10
</code></pre>
<hr>
<h2 id="四-移除镜像站-平台投诉-">四、移除镜像站（平台投诉）</h2>
<h3 id="向搜索引擎投诉-恢复排名-">向搜索引擎投诉（恢复排名）</h3>
<table>
 <thead>
  <tr>
   <th align="left">场景</th>
   <th align="left">工具链接</th>
   <th align="left">操作步骤</th>
   <th align="left">效果</th>
   <th align="left">时效</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left">移除自己站点的过时页面</td>
   <td align="left"><a href="https://search.google.com/search-console/removals">Search Console Removals</a></td>
   <td align="left">验证所有权 → Removals → New Request</td>
   <td align="left">临时隐藏6个月</td>
   <td align="left">24-48小时</td>
  </tr>
  <tr>
   <td align="left">移除他人网站的侵权内容</td>
   <td align="left"><a href="https://search.google.com/search-console/remove-outdated-content">Outdated Content</a></td>
   <td align="left">输入镜像站URL → 选择移除原因</td>
   <td align="left">从搜索结果移除</td>
   <td align="left">数天至数周</td>
  </tr>
  <tr>
   <td align="left">法律层面的版权移除</td>
   <td align="left"><a href="https://support.google.com/legal/contact/lr_legalother">Legal Removals</a></td>
   <td align="left">填写DMCA表单 → 提交证据</td>
   <td align="left">永久移除（若成立）</td>
   <td align="left">数周</td>
  </tr>
 </tbody>
</table>
<p><strong>关键区别</strong>：</p>
<ul>
 <li><strong>Removals Tool</strong>：只能移除你<strong>拥有</strong>的网站（需验证所有权）</li>
 <li><strong>Outdated Content</strong>：处理你<strong>不拥有</strong>的网站的特定URL</li>
 <li><strong>Legal Removals</strong>：正式法律投诉，效力最强但流程最长</li>
</ul>
<p><strong>百度投诉</strong>：</p>
<ul>
 <li>使用 <a href="https://ziyuan.baidu.com/">百度站长平台</a> 死链提交（仅自己站点）</li>
 <li>镜像站侵权向 <a href="https://ts.isc.org.cn/">互联网信息服务投诉平台</a> 举报</li>
</ul>
<hr>
<h3 id="向主机商-域名注册商投诉-直接拔线-">向主机商/域名注册商投诉（直接拔线）</h3>
<p><strong>查询镜像站信息</strong>：</p>
<pre><code class="language-bash"># 命令行查询
whois 镜像域名.com

# 在线工具（更直观）
# https://who.is/
# https://www.whois.com/whois/
</code></pre>
<p><strong>关键信息提取</strong>：</p>
<table>
 <thead>
  <tr>
   <th align="left">字段</th>
   <th align="left">用途</th>
   <th align="left">示例</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left">Registrar</td>
   <td align="left">域名注册商</td>
   <td align="left">NameCheap, Inc.</td>
  </tr>
  <tr>
   <td align="left">Abuse Contact Email</td>
   <td align="left">滥用投诉邮箱</td>
   <td align="left">abuse@namecheap.com</td>
  </tr>
  <tr>
   <td align="left">Hosting Provider</td>
   <td align="left">主机服务商</td>
   <td align="left">Cloudflare, Inc.</td>
  </tr>
  <tr>
   <td align="left">Name Server</td>
   <td align="left">DNS服务商</td>
   <td align="left">ns1.cloudflare.com</td>
  </tr>
 </tbody>
</table>
<p><strong>投诉效果排序</strong>：主机商（Hosting）&gt; 注册商（Registrar）&gt; CDN服务商（如Cloudflare）</p>
<hr>
<h3 id="向广告联盟举报-断其财路-">向广告联盟举报（断其财路）</h3>
<table>
 <thead>
  <tr>
   <th align="left">广告联盟</th>
   <th align="left">举报渠道</th>
   <th align="left">举报类型</th>
   <th align="left">预期时效</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left"><strong>Google AdSense</strong></td>
   <td align="left"><a href="https://support.google.com/adsense/contact/violation_report">政策中心</a></td>
   <td align="left">抄袭内容/侵犯版权</td>
   <td align="left">1-2周</td>
  </tr>
  <tr>
   <td align="left"><strong>百度联盟</strong></td>
   <td align="left">后台工单或邮件投诉</td>
   <td align="left">侵权/违规网站</td>
   <td align="left"><strong>无公开页面，需登录后台</strong></td>
  </tr>
  <tr>
   <td align="left"><strong>腾讯广告</strong></td>
   <td align="left">侵权投诉指引</td>
   <td align="left">广告侵权/素材盗用</td>
   <td align="left">需发送邮件至<code>ads_service@tencent.com</code></td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="五-紧急行动清单-发现镜像后24小时内-">五、紧急行动清单（发现镜像后24小时内）</h2>
<table>
 <thead>
  <tr>
   <th align="left">时间</th>
   <th align="left">行动项</th>
   <th align="left">具体操作</th>
   <th align="left">产出物</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left">0-30分钟</td>
   <td align="left">确认镜像事实</td>
   <td align="left">创建钓鱼页面，验证实时同步</td>
   <td align="left">测试页面URL、时间戳记录</td>
  </tr>
  <tr>
   <td align="left">30-90分钟</td>
   <td align="left">部署技术防护</td>
   <td align="left">添加JS跳转代码到主题header.php</td>
   <td align="left">代码生效验证</td>
  </tr>
  <tr>
   <td align="left">90-120分钟</td>
   <td align="left">保全证据</td>
   <td align="left">截图（原站vs镜像站）、保存日志</td>
   <td align="left">证据包（时间戳+截图+日志）</td>
  </tr>
  <tr>
   <td align="left">2-4小时</td>
   <td align="left">发送DMCA投诉</td>
   <td align="left">填写邮件模板，发送给主机商+注册商</td>
   <td align="left">发送记录、自动回复截图</td>
  </tr>
  <tr>
   <td align="left">4-5小时</td>
   <td align="left">搜索引擎投诉</td>
   <td align="left">Google Outdated Content + Legal Removals</td>
   <td align="left">提交确认页面截图</td>
  </tr>
  <tr>
   <td align="left">24小时内</td>
   <td align="left">跟进确认</td>
   <td align="left">检查邮件回复，无回复则二次发送</td>
   <td align="left">跟进记录</td>
  </tr>
 </tbody>
</table>
<hr>
<h2 id="六-常见问题-FAQ-">六、常见问题（FAQ）</h2>
<p><strong>Q1：镜像站用了繁体转换，Google会认为是不同内容吗？</strong></p>
<blockquote>
 <p>不会。2025年后Google的多语言处理能力已能识别简繁体转换。但"同义词替换+段落重组"的"深度伪原创"可能骗过算法。建议主动提交DMCA投诉，人工审核更准确。</p>
</blockquote>
<p><strong>Q2：JS跳转会影响我的SEO吗？</strong></p>
<blockquote>
 <p>不会。搜索引擎爬虫不执行JS，不会触发跳转。真实用户访问镜像站时跳转回你的站点，反而<strong>增加原站流量和停留时间</strong>，对SEO有利。</p>
</blockquote>
<p><strong>Q3：Nginx 444状态码会留下日志证据吗？</strong></p>
<blockquote>
 <p>会。Nginx的access.log会记录444状态码，可用于向主机商证明对方爬虫被拦截的频率和规模。查看命令：<code>grep ' 444 ' /var/log/nginx/access.log</code></p>
</blockquote>
<p><strong>Q4：投诉后多久能下架镜像站？</strong></p>
<blockquote>
 <p>主机商DMCA通常<strong>24-72小时</strong>，Cloudflare转发<strong>3-7天</strong>，搜索引擎移除<strong>数天至数周</strong>。建议<strong>多渠道同时投诉</strong>，并在48小时后跟进。</p>
</blockquote>
<p><strong>Q5：镜像站换了新域名怎么办？</strong></p>
<blockquote>
 <p>这是持久战。保存所有证据模板，新域名出现时快速套用。同时升级技术防御（如更换JS混淆方式），提高对方镜像成本。</p>
</blockquote>
<p><strong>Q6：我没有服务器权限，只能用CDN/虚拟主机怎么办？</strong></p>
<blockquote>
 <p>重点使用<strong>前端JS防护</strong>（方案B），并在CDN层面设置Referer防盗链（如Cloudflare的Scrape Shield）。同时加大投诉力度。</p>
</blockquote>
<hr>
<h2 id="七-2026年新增威胁-AI爬虫镜像">七、2026年新增威胁：AI爬虫镜像</h2>
<p>ChatGPT-5、Claude-4、Perplexity等AI服务开始大规模抓取网页内容用于训练，部分被滥用为实时镜像源。</p>
<p><strong>特征识别</strong>：</p>
<table>
 <thead>
  <tr>
   <th align="left">特征</th>
   <th align="left">传统镜像爬虫</th>
   <th align="left">AI爬虫</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left">User-Agent</td>
   <td align="left">python-requests, curl</td>
   <td align="left">GPTBot, ClaudeBot, PerplexityBot</td>
  </tr>
  <tr>
   <td align="left">抓取频率</td>
   <td align="left">高频连续</td>
   <td align="left">模拟人类阅读节奏，更智能</td>
  </tr>
  <tr>
   <td align="left">目标内容</td>
   <td align="left">全站复制</td>
   <td align="left">选择性抓取"高质量"内容</td>
  </tr>
  <tr>
   <td align="left">处理难度</td>
   <td align="left">较易识别</td>
   <td align="left">更难区分合法抓取与滥用</td>
  </tr>
 </tbody>
</table>
<p><strong>防护升级</strong>（可选，视内容策略）：</p>
<pre><code class="language-nginx"># 拦截AI爬虫（可能误伤合法AI搜索，请谨慎使用）
if ($http_user_agent ~* "(GPTBot|ClaudeBot|Anthropic|PerplexityBot|CCBot|FacebookBot)") {
    # 方案1：完全拦截
    # return 403;
  
    # 方案2：限速（保留服务但降低频率）
    limit_req zone=ai_limit burst=5 nodelay;
}

# 或在robots.txt中限制（依赖对方遵守）
# User-agent: GPTBot
# Disallow: /
</code></pre>
<blockquote>
 <p>💡 <strong>建议</strong>：对AI爬虫采取<strong>区分策略</strong>。允许合法AI搜索（如Bing Chat）但限制纯训练抓取，或要求遵守robots.txt并标注来源。</p>
</blockquote>
<hr>
<h2 id="附录-DMCA投诉邮件模板-中英双语-">附录：DMCA投诉邮件模板（中英双语）</h2>
<blockquote>
 <p>⚖️ <strong>法律免责声明</strong>：本文提供的技术方法仅供合法防御使用。使用DMCA投诉等法律手段时，请确保你拥有相关内容的完整版权。技术拦截手段请确保不误伤真实用户和合法搜索引擎爬虫。</p>
</blockquote>
<hr>
<details>
 <summary>太长了，隐藏/折叠一下，需要的自行点开</summary>
 <h3 id="模板一-DMCA侵权下架通知-主机商-注册商-">模板一：DMCA侵权下架通知（主机商/注册商）</h3>
 <p><strong>发送对象</strong>：abuse@主机商域名 + abuse@注册商域名
  <br>
  <strong>抄送</strong>：自己的邮箱（备份）
  <br>
  <strong>预期时效</strong>：24-72小时
  <br>
  <strong>跟进策略</strong>：48小时无回复则再次发送，并抄送上级部门（如legal@或support@）</p>
 <h4 id="英文版---English-Version">英文版 / English Version</h4>
 <pre><code class="language-markdown">Subject: DMCA Takedown Notice - Copyright Infringement on [Mirror Domain]

To: [Hosting Provider Abuse Department] &lt;abuse@[hosting-provider].com&gt;
Cc: [Your Email] (for records)
Date: [Date]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. CONTACT INFORMATION
   Name: [Your Full Name]
   Email: [Your Email Address]
   Phone: [Your Phone Number]
   Physical Address: [Your Address]
   Website: wuqishi.com

2. COPYRIGHTED WORK DESCRIPTION
   I am the copyright owner of the following original content:
   
   Original URLs on my website:
   • https://wuqishi.com/original-article-1 (Published: [Date])
   • https://wuqishi.com/original-article-2 (Published: [Date])
   • https://wuqishi.com/original-article-3 (Published: [Date])
   (Full list available upon request)

3. INFRINGING MATERIAL IDENTIFICATION
   The unauthorized copies are located at:
   
   Infringing URLs on the mirror site:
   • https://[mirror-domain]/copied-article-1
   • https://[mirror-domain]/copied-article-2
   • https://[mirror-domain]/copied-article-3
   (Corresponding to original URLs above)

4. TECHNICAL EVIDENCE OF MIRRORING
   The infringing website employs real-time mirroring technology to 
   replicate my entire website wuqishi.com:
   
   • Real-time synchronization: Honeypot test page (/secret-test-20260401) 
     created at [Date/Time UTC] appeared on their site at [Date/Time UTC] 
     (within 5 minutes of publication)
   • Content fingerprint: Unique string "wuqishi-verification-XJ9K2M" 
     appears identically on both sites
   • Server logs: IP [203.0.113.45] shows automated crawling patterns 
     from [Timestamp] to [Timestamp], 120 requests/minute
   • Identical structure: All articles, images, CSS, and JavaScript 
     are 1:1 copies, with internal links still pointing to wuqishi.com

5. GOOD FAITH BELIEF STATEMENT
   I have a good faith belief that the use of the copyrighted materials 
   described above is not authorized by the copyright owner, its agent, 
   or the law.

6. ACCURACY STATEMENT
   I swear, under penalty of perjury, that the information in this 
   notification is accurate and that I am the copyright owner or am 
   authorized to act on behalf of the owner of an exclusive right that 
   is allegedly infringed.

7. ELECTRONIC SIGNATURE
   /s/ [Your Full Name]
   Date: [Date]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ATTACHMENTS CHECKLIST:
□ [ ] Screenshot comparison: original vs. mirror site (side-by-side)
□ [ ] Server logs showing automated crawling (with timestamps)
□ [ ] Honeypot test page synchronization evidence
□ [ ] WHOIS lookup showing your company as hosting provider
□ [ ] Previous communication attempts (if any)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Please confirm receipt of this notice and advise on expected resolution 
timeline. I am prepared to provide additional evidence if required, 
including full server logs and forensic analysis.

Sincerely,
[Your Full Name]
[Your Title/Position]
wuqishi.com
</code></pre>
 <h4 id="中文版---Chinese-Version">中文版 / Chinese Version</h4>
 <pre><code class="language-markdown">主题：DMCA侵权下架通知 - [镜像域名] 版权侵权投诉

致：[主机商滥用投诉部门] &lt;abuse@[主机商].com&gt;
抄送：[你的邮箱]（备份）
日期：[日期]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 投诉人联系信息
   姓名：[你的全名]
   邮箱：[你的邮箱地址]
   电话：[你的电话号码]
   联系地址：[你的地址]
   网站：wuqishi.com

2. 被侵权作品描述
   我是以下原创内容的版权所有者：
   
   我网站上的原创链接：
   • https://wuqishi.com/原创文章-1（发布于：[日期]）
   • https://wuqishi.com/原创文章-2（发布于：[日期]）
   • https://wuqishi.com/原创文章-3（发布于：[日期]）
   （完整清单可根据要求提供）

3. 侵权内容识别
   未经授权的复制内容位于以下网址：
   
   镜像站上的侵权链接：
   • https://[镜像域名]/复制文章-1
   • https://[镜像域名]/复制文章-2
   • https://[镜像域名]/复制文章-3
   （与上方原创链接对应）

4. 镜像技术证据
   该侵权网站使用实时镜像技术复制我的整个网站 wuqishi.com：
   
   • 实时同步：钓鱼测试页面（/secret-test-20260401）于[UTC日期/时间]创建，
     于[UTC日期/时间]出现在对方网站（发布后5分钟内）
   • 内容指纹：唯一字符串"wuqishi-verification-XJ9K2M"在两站完全一致出现
   • 服务器日志：IP [203.0.113.45] 于[时间戳]至[时间戳]显示自动抓取模式，
     每分钟120次请求
   • 结构一致：所有文章、图片、CSS、JavaScript均为1:1复制，
     内部链接仍指向 wuqishi.com

5. 善意声明
   本人善意相信上述材料的使用未经版权所有者、其代理人或法律授权。

6. 准确性声明
   本人在伪证罪处罚的宣誓下声明，本通知中的信息准确无误，本人是
   版权所有者或经授权代表涉嫌被侵权的专有权的所有者行事。

7. 电子签名
   /s/ [你的全名]
   日期：[日期]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

附件检查清单：
□ [ ] 原创与镜像站对比截图（并排显示）
□ [ ] 显示自动抓取的服务器日志（含时间戳）
□ [ ] 钓鱼测试页面同步证据
□ [ ] 显示贵司为主机商的WHOIS查询结果
□ [ ] 之前与对方沟通的尝试记录（如有）

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

请确认收到本通知并告知预计处理时间。如需补充证据（包括完整服务器日志
和取证分析），本人随时配合。

此致
[你的全名]
[你的职位/头衔]
wuqishi.com
</code></pre>
 <hr>
 <h3 id="模板二-Google-AdSense政策违规举报">模板二：Google AdSense政策违规举报</h3>
 <p><strong>发送渠道</strong>：<a href="https://support.google.com/adsense/contact/violation_report">AdSense政策中心</a>
  <br>
  <strong>举报类型</strong>：Copyright infringement / Scraped content（版权侵权/抓取内容）</p>
 <h4 id="英文版---English-Version-">英文版 / English Version</h4>
 <pre><code class="language-markdown">Subject: AdSense Policy Violation Report - Copyright Infringement / Content Mirroring

To: Google AdSense Policy Team
Via: https://support.google.com/adsense/contact/violation_report

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

REPORTER INFORMATION

Name: [Your Full Name]
Email: [Your Email Address]
Website: wuqishi.com
Relationship to Site: Copyright Owner

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

VIOLATING PUBLISHER INFORMATION

Domain: [mirror-domain.com]
AdSense Publisher ID: [if visible in page source: ca-pub-XXXXXXXXXXXXXXXX]
Violation Type: Copyright Infringement (Content Mirroring / Scraping)
Date Discovered: [Date]
Estimated Revenue Impact: [if calculable]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

VIOLATION DETAILS

The website [mirror-domain.com] is displaying Google AdSense advertisements 
on content that has been illegally mirrored from my original website 
wuqishi.com through automated real-time replication.

TECHNICAL EVIDENCE:

1. Real-Time Mirroring Mechanism
   - Created honeypot page: wuqishi.com/secret-test-[timestamp]
     at [Date/Time UTC]
   - Detected on mirror site: [mirror-domain]/secret-test-[timestamp]
     at [Date/Time UTC] (4 minutes 32 seconds later)
   - Unique content fingerprint: "wuqishi-fingerprint-[id]" appears 
     identically on both sites (see screenshot)

2. Content Identity Verification
   - All articles, formatting, images, and HTML structure are 1:1 copies
   - CSS and JavaScript files served from my CDN (cdn.wuqishi.com) 
     with my domain in paths
   - Internal links remain pointing to wuqishi.com (revealing source)
   - Publication timestamps on mirror site match my original posts 
     within minutes

3. Automated Crawling Evidence
   - Server logs: Systematic requests from IP [203.0.113.45]
   - Time range: [Start Time] to [End Time] (UTC)
   - Pattern: Sequential requests to /, /post-1, /post-2... at 
     2-second intervals
   - User-Agent rotation: python-requests/2.28.1, fake Googlebot, 
     and generic Mozilla
   - Peak frequency: 120 requests/minute

AFFECTED ORIGINAL CONTENT (Sample):

My Original URLs:
• https://wuqishi.com/article/[slug-1] - Published [Date], Word Count: 2,400
• https://wuqishi.com/article/[slug-2] - Published [Date], Word Count: 1,800
• https://wuqishi.com/article/[slug-3] - Published [Date], Word Count: 3,200

Infringing Copies:
• https://[mirror-domain]/article/[slug-1] - Ad unit visible: [ca-pub-XXX]
• https://[mirror-domain]/article/[slug-2] - Ad unit visible: [ca-pub-XXX]
• https://[mirror-domain]/article/[slug-3] - Ad unit visible: [ca-pub-XXX]

AD PLACEMENT EVIDENCE:
• Screenshot 1: [mirror-domain]/article/[slug-1] with AdSense banner
  Ad position: Above article title
  Ad size: 728x90
• Screenshot 2: [mirror-domain]/article/[slug-2] with AdSense in-article ad
  Ad position: Mid-article
  Ad size: 300x250

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

PREVIOUS ACTIONS TAKEN

[ ] Attempted direct contact with site operator: [details if applicable]
[x] Filed DMCA with hosting provider [Hosting Name]: [date], [reference #]
[ ] Other: [details]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

REQUESTED ACTION

I respectfully request that Google AdSense:

1. Immediately cease ad serving to [mirror-domain.com] and all associated 
   subdomains
2. Suspend or terminate the publisher account associated with this domain
3. Review any related accounts that may be operated by the same entity 
   (common patterns: [pattern details])
4. Withhold any pending payments for traffic generated from infringed content

This publisher is systematically generating revenue through unauthorized 
use of my intellectual property, violating AdSense Program Policies 
regarding:
- Copyrighted material (Section "Copyrighted material")
- Scraped content (Section "Scraped content")
- Misleading site behavior (Section "Misleading site behavior")

The scale of infringement (estimated [X] articles copied) and the 
technical sophistication (real-time mirroring) suggest this is not 
an isolated incident but a deliberate business model built on content 
theft.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DECLARATION

I have a good faith belief that the use of my copyrighted materials as 
described above is not authorized by me, my agent, or the law. The 
information in this notification is accurate, and under penalty of 
perjury, I am authorized to act on behalf of the owner of an exclusive 
right that is allegedly infringed.

/s/ [Your Full Name]
Date: [Date]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ATTACHMENTS (Total: [X] files):
□ Side-by-side content comparison screenshots (3 articles)
□ Honeypot page synchronization timestamps with server logs
□ Server logs showing automated crawling (IP [203.0.113.45])
□ Ad placement screenshots with visible ad unit IDs
□ WHOIS lookup for domain ownership verification
□ Traceroute showing hosting infrastructure
</code></pre>
 <h4 id="中文版---Chinese-Version-">中文版 / Chinese Version</h4>
 <pre><code class="language-markdown">主题：AdSense政策违规举报 - 版权侵权/内容镜像

致：Google AdSense政策团队
通过：https://support.google.com/adsense/contact/violation_report

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

举报人信息

姓名：[你的全名]
邮箱：[你的邮箱地址]
网站：wuqishi.com
与网站关系：版权所有者

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

违规发布商信息

域名：[镜像域名]
AdSense发布商ID：[如页面源代码中可见：ca-pub-XXXXXXXXXXXXXXXX]
违规类型：版权侵权（内容镜像/抓取）
发现日期：[日期]
预估收入影响：[如可计算]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

违规详情

网站 [镜像域名] 通过自动实时复制技术，从我原创网站 wuqishi.com 
非法镜像内容，并在这些页面上投放Google AdSense广告获利。

技术证据：

1. 实时镜像机制
   - 创建钓鱼页面：wuqishi.com/secret-test-[时间戳]
     时间：[UTC日期/时间]
   - 在镜像站检测到：[镜像域名]/secret-test-[时间戳]
     时间：[UTC日期/时间]（4分32秒后）
   - 唯一内容指纹："wuqishi-fingerprint-[id]" 在两站完全一致出现
     （见截图）

2. 内容一致性验证
   - 所有文章、排版、图片和HTML结构均为1:1复制
   - CSS和JavaScript文件从我的CDN（cdn.wuqishi.com）加载，
     路径中包含我的域名
   - 内部链接仍指向 wuqishi.com（暴露来源）
   - 镜像站发布时间与我的原创文章相差仅数分钟

3. 自动抓取证据
   - 服务器日志：来自IP [203.0.113.45] 的系统性请求
   - 时间范围：[开始时间] 至 [结束时间]（UTC）
   - 模式：顺序请求 /、/post-1、/post-2...，间隔2秒
   - User-Agent轮换：python-requests/2.28.1、伪造Googlebot、
     通用Mozilla
   - 峰值频率：每分钟120次请求

受影响的原创内容（样本）：

我的原创链接：
• https://wuqishi.com/article/[文章别名-1] - 发布于[日期]，字数：2,400
• https://wuqishi.com/article/[文章别名-2] - 发布于[日期]，字数：1,800
• https://wuqishi.com/article/[文章别名-3] - 发布于[日期]，字数：3,200

侵权复制链接：
• https://[镜像域名]/article/[文章别名-1] - 可见广告单元：[ca-pub-XXX]
• https://[镜像域名]/article/[文章别名-2] - 可见广告单元：[ca-pub-XXX]
• https://[镜像域名]/article/[文章别名-3] - 可见广告单元：[ca-pub-XXX]

广告展示证据：
• 截图1：[镜像域名]/article/[文章别名-1] 含AdSense横幅广告
  广告位置：文章标题上方
  广告尺寸：728x90
• 截图2：[镜像域名]/article/[文章别名-2] 含AdSense文章内广告
  广告位置：文章中部
  广告尺寸：300x250

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

已采取的行动

[ ] 尝试直接联系网站运营者：[详情如有]
[x] 向主机商 [主机商名称] 提交DMCA投诉：[日期]，[参考编号]
[ ] 其他：[详情]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

请求采取的行动

本人恳请Google AdSense：

1. 立即停止向 [镜像域名] 及其所有子域名提供广告服务
2. 暂停或终止与该域名关联的发布商账户
3. 审查可能由同一实体运营的相关账户（共同特征：[特征详情]）
4. 扣留通过侵权内容产生的流量所对应的待结算款项

该发布商通过系统性未经授权使用我的知识产权获利，违反了
AdSense计划政策中关于：
- 版权材料（"Copyrighted material"章节）
- 抓取内容（"Scraped content"章节）
- 误导性网站行为（"Misleading site behavior"章节）

侵权规模（预估[X]篇文章被复制）和技术 sophistication（实时镜像）
表明这不是孤立事件，而是建立在内容盗窃基础上的商业模式。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

声明

本人善意相信上述对我的版权材料的使用未经本人、本人代理人或法律
授权。本通知中的信息准确无误，本人在伪证罪处罚下声明，本人经
授权代表涉嫌被侵权的专有权的所有者行事。

/s/ [你的全名]
日期：[日期]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

附件清单（共[X]个文件）：
□ 内容对比并排截图（3篇文章）
□ 钓鱼页面同步时间戳及服务器日志
□ 显示自动抓取的服务器日志（IP [203.0.113.45]）
□ 含可见广告单元ID的广告展示截图
□ 域名所有权验证的WHOIS查询结果
□ 显示主机基础设施的Traceroute结果
</code></pre>
 <hr>
 <h3 id="模板三-Cloudflare-Abuse投诉">模板三：Cloudflare Abuse投诉</h3>
 <p><strong>发送渠道</strong>：<a href="https://www.cloudflare.com/abuse/">Cloudflare Abuse表单</a>
  <br>
  <strong>表单选择</strong>：Copyright infringement &amp; DMCA violations</p>
 <h4 id="英文版---English-Version--">英文版 / English Version</h4>
 <pre><code class="language-markdown">Subject: Abuse Report - Copyright Infringement via Cloudflare Proxy

To: Cloudflare Trust &amp; Safety
Via: https://www.cloudflare.com/abuse/
Form Selection: "Copyright infringement &amp; DMCA violations"

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. REPORTER INFORMATION

   Name: [Your Full Name]
   Email: [Your Email Address]
   Phone: [Your Phone Number]
   Address: [Your Address]
   
   I am the: ☒ Copyright owner
             ☐ Authorized representative

2. CLOUDFLARE-SERVED DOMAIN

   Domain: [mirror-domain.com]
   Specific URLs (if not entire domain):
   • https://[mirror-domain]/article/[slug-1]
   • https://[mirror-domain]/article/[slug-2]
   • https://[mirror-domain]/article/[slug-3]

3. ORIGINAL WORK INFORMATION

   Original website: wuqishi.com
   
   Sample original URLs:
   • https://wuqishi.com/article/[slug-1] (Published: [Date])
   • https://wuqishi.com/article/[slug-2] (Published: [Date])
   
   Description: Personal blog with original technical articles, 
   photography, and creative content. All content is original 
   creation by me, with publication records dating back to [Year].

4. INFRINGEMENT DESCRIPTION

   The domain [mirror-domain.com] is using Cloudflare services to 
   proxy a real-time mirror of my entire website wuqishi.com. This 
   is not legitimate caching; it is active, automated replication 
   designed to steal content and monetize it through advertising.

   Technical evidence of real-time mirroring:
   
   • Honeypot test: 
     - Created: wuqishi.com/secret-test-20260401 at [Date/Time UTC]
     - Detected: [mirror-domain]/secret-test-20260401 at [Date/Time UTC]
     - Time elapsed: 3 minutes 47 seconds
   
   • Content fingerprint verification:
     - Unique string: "wuqishi-verification-XJ9K2M-20260401"
     - MD5 hash of article content: [hash]
     - Identical on both sites (see screenshot)
   
   • Server log analysis:
     - Requests from IP ranges matching Cloudflare's proxy network
     - X-Forwarded-For headers showing true origin: [IP]
     - Request pattern: Automated, not human browsing
   
   • Monetization evidence:
     - AdSense units displayed on mirrored content
     - Affiliate links replaced with attacker's codes
     - Cryptocurrency donation addresses injected

5. GOOD FAITH STATEMENT

   I have a good faith belief that the use of the described material 
   in the manner complained of is not authorized by the copyright 
   owner, its agent, or the law.

6. ACCURACY STATEMENT

   I swear, under penalty of perjury, that the information in this 
   notification is accurate, and that I am the copyright owner or 
   am authorized to act on behalf of the owner of an exclusive right 
   that is allegedly infringed.

7. SIGNATURE

   /s/ [Your Full Name]
   Date: [Date]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ATTACHMENTS:
□ Honeypot page synchronization evidence (timestamps + screenshots)
□ Server logs with Cloudflare proxy headers (X-Forwarded-For, CF-Connecting-IP)
□ Content comparison screenshots (hash verification)
□ Original content publication timestamps
□ Advertising/affiliate code injection evidence on mirror site
□ WHOIS showing Cloudflare as current name server

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ADDITIONAL NOTES:

I understand that Cloudflare cannot remove content from the origin 
server. However, this domain is using Cloudflare's infrastructure to:

1. Obscure the true origin IP of the infringing server (currently 
   hidden behind Cloudflare proxy [IP])
2. Distribute cached copies of my content globally via Cloudflare CDN
3. Provide DDoS protection that shields the infringing operation 
   from countermeasures
4. Potentially manipulate SSL/TLS certificates to appear legitimate

I respectfully request that Cloudflare:

- Terminate service to this domain for Terms of Service violations 
  (Section 4: "Prohibited Activities" - infringement of intellectual 
  property rights)
- Provide the true origin IP to assist with direct DMCA filing 
  (if legally permissible under your transparency policy)
- Flag this domain and associated accounts for monitoring of 
  future abuse
- Consider implementing fingerprinting to detect real-time mirroring 
  at the edge

I have also filed DMCA notices with:
- Hosting provider (identified via [method]): [Provider Name], [Date]
- Domain registrar: [Registrar Name], [Date]
- Google AdSense (for monetization): [Date]

I am prepared to provide additional technical evidence, including 
full packet captures and forensic analysis, upon request.

Thank you for your assistance in protecting content creators' rights.

Sincerely,
[Your Full Name]
[Your Title/Position]
wuqishi.com
</code></pre>
 <h4 id="中文版---Chinese-Version--">中文版 / Chinese Version</h4>
 <pre><code class="language-markdown">主题：滥用投诉 - 通过Cloudflare代理的版权侵权

致：Cloudflare信任与安全团队
通过：https://www.cloudflare.com/abuse/
表单选择："Copyright infringement &amp; DMCA violations"

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 举报人信息

   姓名：[你的全名]
   邮箱：[你的邮箱地址]
   电话：[你的电话号码]
   地址：[你的地址]
   
   本人身份：☒ 版权所有者
             ☐ 授权代表

2. 使用Cloudflare服务的域名

   域名：[镜像域名]
   具体URL（如非整个域名）：
   • https://[镜像域名]/article/[文章别名-1]
   • https://[镜像域名]/article/[文章别名-2]
   • https://[镜像域名]/article/[文章别名-3]

3. 原创作品信息

   原网站：wuqishi.com
   
   原创链接样本：
   • https://wuqishi.com/article/[文章别名-1]（发布于：[日期]）
   • https://wuqishi.com/article/[文章别名-2]（发布于：[日期]）
   
   作品描述：个人技术博客，包含原创文章、摄影作品和创意内容。
   所有内容均为本人原创，发布记录可追溯至[年份]年。

4. 侵权描述

   域名 [镜像域名] 正在使用Cloudflare服务代理我整个网站 
   wuqishi.com 的实时镜像。这不是合法的缓存行为，而是主动的、
   自动化的复制，旨在窃取内容并通过广告获利。

   实时镜像的技术证据：
   
   • 钓鱼测试：
     - 创建：wuqishi.com/secret-test-20260401 于 [UTC日期/时间]
     - 检测：[镜像域名]/secret-test-20260401 于 [UTC日期/时间]
     - 经过时间：3分47秒
   
   • 内容指纹验证：
     - 唯一字符串："wuqishi-verification-XJ9K2M-20260401"
     - 文章内容MD5哈希：[哈希值]
     - 在两站完全一致（见截图）
   
   • 服务器日志分析：
     - 来自与Cloudflare代理网络匹配的IP段的请求
     - X-Forwarded-For头显示真实来源：[IP]
     - 请求模式：自动化，非人类浏览
   
   • 获利证据：
     - 在镜像内容上展示AdSense广告单元
     - 联盟链接被替换为攻击者的代码
     - 被注入加密货币捐赠地址

5. 善意声明

   本人善意相信，以投诉方式描述的材料使用未经版权所有者、
   其代理人或法律授权。

6. 准确性声明

   本人在伪证罪处罚下声明，本通知中的信息准确无误，本人是
   版权所有者或经授权代表涉嫌被侵权的专有权的所有者行事。

7. 签名

   /s/ [你的全名]
   日期：[日期]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

附件清单：
□ 钓鱼页面同步证据（时间戳+截图）
□ 含Cloudflare代理头的服务器日志（X-Forwarded-For, CF-Connecting-IP）
□ 内容对比截图（哈希验证）
□ 原创内容发布时间戳
□ 镜像站广告/联盟代码注入证据
□ 显示Cloudflare为当前DNS的WHOIS查询

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

补充说明：

本人理解Cloudflare无法从源服务器删除内容。然而，该域名正在
使用Cloudflare的基础设施来：

1. 隐藏侵权服务器的真实源IP（当前隐藏在Cloudflare代理 [IP] 后）
2. 通过Cloudflare CDN在全球分发我的内容的缓存副本
3. 提供DDoS保护，为侵权操作屏蔽反制措施
4. 可能操纵SSL/TLS证书以显得合法

本人恳请Cloudflare：

- 因违反服务条款（第4条"禁止活动" - 侵犯知识产权）而
  终止对该域名的服务
- 如法律允许，提供真实源IP以协助直接提交DMCA
  （根据贵司透明度政策）
- 将该域名及相关账户标记以监控未来滥用行为
- 考虑在边缘层实施指纹检测以识别实时镜像

本人也已向以下方提交DMCA通知：
- 主机商（通过[方法]识别）：[主机商名称]，[日期]
- 域名注册商：[注册商名称]，[日期]
- Google AdSense（针对获利行为）：[日期]

本人随时可根据要求提供额外技术证据，包括完整数据包捕获和
取证分析。

感谢协助保护内容创作者的权利。

此致
[你的全名]
[你的职位/头衔]
wuqishi.com
</code></pre>
 <hr>
</details>
<h3 id="使用建议">使用建议</h3>
<table>
 <thead>
  <tr>
   <th align="left">场景</th>
   <th align="left">推荐模板</th>
   <th align="left">语言</th>
   <th align="left">预期时效</th>
   <th align="left">跟进要点</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="left">美国/欧盟主机商、注册商</td>
   <td align="left">DMCA侵权下架通知</td>
   <td align="left">英文</td>
   <td align="left">24-72小时</td>
   <td align="left">48小时无回复则二次发送并抄送上级</td>
  </tr>
  <tr>
   <td align="left">国内主机商、阿里云、腾讯云</td>
   <td align="left">DMCA侵权下架通知</td>
   <td align="left">中文</td>
   <td align="left">3-7天</td>
   <td align="left">同步提交工单系统</td>
  </tr>
  <tr>
   <td align="left">Google AdSense投诉</td>
   <td align="left">AdSense政策违规举报</td>
   <td align="left">英文优先</td>
   <td align="left">1-2周</td>
   <td align="left">关注账户状态变化</td>
  </tr>
  <tr>
   <td align="left">百度联盟、360联盟</td>
   <td align="left">自行翻译适配</td>
   <td align="left">中文</td>
   <td align="left">1-2周</td>
   <td align="left">电话跟进</td>
  </tr>
  <tr>
   <td align="left">Cloudflare代理的镜像站</td>
   <td align="left">Cloudflare Abuse投诉</td>
   <td align="left">英文优先</td>
   <td align="left">3-7天</td>
   <td align="left">强调TOS违规而非仅DMCA</td>
  </tr>
  <tr>
   <td align="left">同时向多国服务商投诉</td>
   <td align="left">准备双语版本</td>
   <td align="left">英文+中文</td>
   <td align="left">视具体情况</td>
   <td align="left">建立跟踪表格记录进度</td>
  </tr>
 </tbody>
</table>
<blockquote>
 <p>💡 <strong>关键提示</strong>：</p>
 <ol>
  <li>所有邮件务必<strong>抄送自己邮箱</strong>作为备份</li>
  <li>使用<strong>已读回执</strong>（如支持）确认对方查看</li>
  <li>建立<strong>跟踪表格</strong>：投诉对象 | 发送时间 | 自动回复 | 人工回复 | 处理结果</li>
  <li>48小时无回复则<strong>二次跟进</strong>，语气坚定但礼貌</li>
  <li>保留所有截图、日志、邮件作为<strong>后续法律行动证据</strong></li>
 </ol>
</blockquote>
<hr>
<h2 id="更新记录"><strong>更新记录</strong></h2>
<ul>
 <li>
  <p>2026-04-01：更新一些错误链接</p>
 </li>
 <li>
  <p>2026-04-01：首发，整合2025-2026年最新反镜像技术，新增AI爬虫防护、详细测试验证步骤、优化邮件模板证据要求。</p>
 </li>
 <li>
  <p>文章参考链接：</p>
  <ul>
   <li>秋风于渭水：https://www.tjsky.net/tutorial/1026</li>
   <li>枫林灯语：https://blog.mfwt.top/index.php/archives/1143/</li>
  </ul>
 </li>
</ul>
<hr>
<p>💬 <strong>你的镜像站案例</strong>：你在处理镜像站时遇到什么奇葩情况？对方用了什么新技术？欢迎在评论区分享，我会更新到文章中帮助更多人。</p>
<p><strong>参考提交格式</strong>：镜像域名（可选）+ 发现方式 + 解决方法 + 处理结果</p>
<p>‍</p>]]></description><guid isPermaLink="false">/archives/anti-mirror-defense-guide</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F04%2F1775009968672.webp%21wwater&amp;size=m" type="image/jpeg" length="119298"/><category>技巧</category><category>分享</category><pubDate>Wed, 1 Apr 2026 02:32:00 GMT</pubDate></item><item><title><![CDATA[VLESS + Reality + Vision：2026 极致隐蔽节点搭建全解析]]></title><link>https://wuqishi.com/archives/vless-reality-vision-2026-ultimate-hide-node-guide</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=VLESS%20%2B%20Reality%20%2B%20Vision%EF%BC%9A2026%20%E6%9E%81%E8%87%B4%E9%9A%90%E8%94%BD%E8%8A%82%E7%82%B9%E6%90%AD%E5%BB%BA%E5%85%A8%E8%A7%A3%E6%9E%90&amp;url=/archives/vless-reality-vision-2026-ultimate-hide-node-guide" width="1" height="1" alt="" style="opacity:0;">
<h2 id="heading">写在前面</h2>
<blockquote>
 <p>最近这几天因为削挂不小心走了代理，导致机场流量告急，实在没法办下只好重启之前的自建节点，所以有了这篇文章，希望可以帮到大家。</p>
</blockquote>
<p>在当前的扫描环境下，单纯的加密已不足以自保。本指南通过 <strong>3X-UI</strong> 搭建目前隐蔽性天花板组合：<strong>VLESS 协议</strong>、<strong>Reality 伪装</strong>、<strong>Vision 流控</strong>，并配合<strong>高强度自定义订阅管理</strong>，实现真正的“隐身”上网。</p>
<hr>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1774855706600.webp&amp;size=m" alt="关键协议与核心项目"></p>
<h2 id="3x-ui">一、快速开始：一键安装3X-UI</h2>
<p>在你的 VPS（推荐 Ubuntu 20.04+ 或 Debian 11+）中，执行以下官方安装脚本：</p>
<pre><code class="language-bash">bash &lt;(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
</code></pre>
<ul>
 <li><strong>初始设置</strong>：安装过程中会提示设置登录 <strong>用户名</strong>、<strong>密码</strong> 和 <strong>面板端口</strong>。</li>
</ul>
<h2 id="-">二、 配置参数速查表</h2>
<!-- raw HTML omitted -->
<hr>
<h2 id="--1">三、 核心入站节点：每一项的深度解析</h2>
<h3 id="1-">1. 基础信息设置</h3>
<ul>
 <li>
  <p>协议 (Protocol)：选择 <strong>vless</strong>。</p>
  <ul>
   <li>​<em>建议</em>：不带冗余加密，是目前 Reality 的最佳搭档。</li>
  </ul>
 </li>
 <li>
  <p>端口 (Port)：建议填写 <strong>443</strong>。</p>
  <ul>
   <li>​<em>说明</em>：443 是标准 HTTPS 端口。如果你在防火墙开启 443 且伪装域名是 Google，流量看起来就是正常的网页访问。</li>
  </ul>
 </li>
</ul>
<h3 id="2--">2. 用户与流控 (核心必选)</h3>
<ul>
 <li>
  <p>ID (UUID)：点击生成。它是你的唯一钥匙。</p>
 </li>
 <li>
  <p>流控 (Flow)：<strong>必须填入 xtls-rprx-vision</strong>。</p>
  <ul>
   <li>​<em>原理</em>：Vision 能够动态填充数据包，消除 TLS 流量的长度特征。如果没有这一项，Reality 的隐蔽性会下降 50% 以上。</li>
  </ul>
 </li>
</ul>
<h3 id="3--transport">3. 传输配置 (Transport)</h3>
<ul>
 <li>
  <p>传输协议：选择 <strong>tcp</strong>。</p>
  <ul>
   <li>​<em>说明</em>：Reality 协议目前仅支持 TCP 传输。</li>
  </ul>
 </li>
 <li>
  <p>Proxy Protocol：保持 <strong>关闭</strong>。</p>
  <ul>
   <li>​<em>说明</em>：除非你的 VPS 前端挂了 Nginx 转发，否则开启后会导致无法连接。</li>
  </ul>
 </li>
</ul>
<h3 id="4-reality--">4. Reality 伪装细节 (证书之魂)</h3>
<ul>
 <li>
  <p>uTLS：建议选 <strong>chrome</strong>。</p>
  <ul>
   <li>​<em>建议</em>：让你的流量握手指纹看起来像 Chrome 浏览器，最常见也最安全。</li>
  </ul>
 </li>
 <li>
  <p>目标网站 (Dest)：推荐 <code>dl.google.com:443</code>​ 或 <code>www.microsoft.com:443</code>。</p>
  <ul>
   <li>​<em>配置建议</em>​：选一个<strong>国内能直连、且支持 TLS 1.3</strong> 的国外大厂。</li>
  </ul>
 </li>
 <li>
  <p>服务名称 (SNI)：<strong>必须</strong>与 Dest 域名一致（不带端口），如 <code>dl.google.com</code>。</p>
 </li>
 <li>
  <p>Short IDs：点击 <strong>[生成]</strong> 。</p>
  <ul>
   <li>​<em>说明</em>：这是连接时的额外身份 ID。只有带上正确 Short ID 的请求，服务器才会响应，以此防止防火墙主动探测。</li>
  </ul>
 </li>
 <li>
  <p>公私钥 (Public/Private Key)：点击 <strong>[Get New Cert]</strong> 。</p>
  <ul>
   <li>​<em>建议</em>​：自动生成的密钥对极其安全，<strong>私钥严禁外泄</strong>。</li>
  </ul>
 </li>
 <li>
  <p>Vision Seed (随机种子)：点击 <strong>[Rand]</strong> 。</p>
  <ul>
   <li>​<em>说明</em>：增加数据包混淆的随机性，进一步干扰流量分析。</li>
  </ul>
 </li>
</ul>
<h3 id="5--sniffing">5. 流量嗅探 (Sniffing)</h3>
<ul>
 <li>
  <p>开启 (Enabled)：<strong>必须开启</strong>。</p>
 </li>
 <li>
  <p>协议勾选：勾选 <code>http</code>​, <code>tls</code>​, <code>quic</code>。</p>
 </li>
 <li>
  <p>目标地址覆盖 (Dest Override)：<strong>必须开启</strong>。</p>
  <ul>
   <li>​<em>建议</em>：开启后，如果客户端发出的目标 IP 异常，服务器会根据嗅探到的域名自动修正，确保稳定访问 YouTube 等服务。</li>
  </ul>
 </li>
</ul>
<hr>
<h2 id="--2">四、 订阅服务：深度安全定制</h2>
<p>在 <strong>「面板设置」</strong> -&gt; <strong>「订阅设置」</strong> 区域进行以下配置，锁死面板暴露风险：</p>
<h3 id="1--subscription-port">1. 订阅服务监听端口 (Subscription Port)</h3>
<ul>
 <li>设置建议：填入一个<strong>未被占用</strong>的高位随机端口（如 <code>49152-65535</code> 之间的数字）。</li>
 <li>细节：<strong>严禁</strong>与面板登录端口或节点端口共用。</li>
</ul>
<h3 id="2--uri--subscription-uri-path">2. 订阅服务 URI 路径 (Subscription URI Path)</h3>
<ul>
 <li>设置建议：严禁使用默认的 <code>/sub/</code>。</li>
 <li>格式规范：<strong>必须以 / 开头，并以 / 结尾</strong>（例如 <code>/my_private_path_99/</code>）。</li>
 <li>安全逻辑：这相当于订阅链接的“二级密码”。攻击者通过扫描 IP 几乎不可能猜到这个复杂的路径。</li>
</ul>
<hr>
<h2 id="--3">五、 部署后的最后检查清单</h2>
<ol>
 <li>
  <p>面板设置：完成订阅设置后，点击 <strong>「保存配置」</strong> 并点击 <strong>「重启面板」</strong> 。</p>
 </li>
 <li>
  <p>防火墙 (安全组)：前往 VPS 控制台，确保 <strong>TCP 443</strong> (节点) 和 <strong>TCP 2096</strong> (订阅) 均已开放。</p>
 </li>
 <li>
  <p>时间校准：执行 <code>date</code>​ 命令，确保 VPS 时间与北京时间误差在 <strong>90 秒</strong>内。</p>
 </li>
 <li>
  <p>目标网站 (Dest) 的存活检查</p>
  <ul>
   <li>​<strong>注意点</strong>：Reality 借用的“面具”网站如果挂了，你的节点也会跟着挂。</li>
   <li>​<strong>建议</strong>​：定期检查你设置的域名（如 <code>dl.google.com</code>​）是否依然支持 <strong>TLS 1.3</strong> 且在国内访问顺畅。</li>
   <li><strong>避坑</strong>：千万<strong>不要</strong>使用 <code>baidu.com</code> 或已封锁的网站作为 Dest。</li>
  </ul>
 </li>
 <li>
  <p>流量特征异常警示</p>
  <ul>
   <li>​<strong>注意点</strong>：虽然协议隐蔽，但如果单日流量异常激增（如几百 GB 的持续下载），依然可能引起运营商（ISP）的注意。</li>
   <li><strong>建议</strong>：尽量模拟正常用户的上网行为，避免 24 小时高频大流量占用。</li>
  </ul>
 </li>
</ol>
<h2 id="heading-1">六、核心客户端适配建议</h2>
<h3 id="shadowrocket---ios-">Shadowrocket (小火箭) —— iOS 首选</h3>
<p>小火箭对 Reality 的支持非常成熟，但在手动配置或修改参数时请注意：</p>
<ul>
 <li>​<strong>类型选择</strong>​：协议选 <code>VLESS</code>​，传输方式选 <code>TCP</code>。</li>
 <li>​<strong>安全类型 (Security)</strong> ​：务必下拉选择 ​<strong>​<code>reality</code>​</strong>。</li>
 <li>​<strong>公钥 (PublicKey)</strong> ​：填入 3X-UI 面板中生成的 ​<strong>Public Key</strong>。</li>
 <li>​<strong>流控 (Flow)</strong> ​：在 <code>Flow</code>​ 输入框内手动填入 ​<strong>​<code>xtls-rprx-vision</code>​</strong>。</li>
 <li>​<strong>指纹 (uTLS)</strong> ​：在设置最下方的 <code>Fingerprint</code>​ 选为 ​<strong>​<code>chrome</code>​</strong>。</li>
 <li>​<strong>SNI</strong>​：填入与面板一致的伪装域名（如 <code>dl.google.com</code>）。</li>
</ul>
<h3 id="loon--">Loon —— 极致稳定的新秀（推荐）</h3>
<p>Loon 的配置文件结构清晰，支持 Reality 的语法如下：</p>
<ul>
 <li>​<strong>配置关键点</strong>​：在节点行中添加 <code>transport=tcp, security=reality, reality-public-key=你的公钥, flow=xtls-rprx-vision</code>。</li>
 <li>​<strong>指纹模拟</strong>​：确保 <code>sni</code>​ 字段已填入，并配置 <code>fingerprint=chrome</code>。</li>
 <li>​<strong>优势</strong>​：Loon 对 <strong>QUIC 嗅探</strong> 的处理非常出色，建议在 Loon 内开启“跳过证书验证”以增强稳定性。</li>
</ul>
<h3 id="surge--">Surge —— 强大的网络分析仪</h3>
<p>Surge 默认不直接支持 VLESS，通常需要使用插件或配合 <strong>External Proxy</strong> 逻辑：</p>
<ul>
 <li>​<strong>适配方案</strong>​：建议使用 <strong>Sub-Store</strong> 进行转换。</li>
 <li>​<strong>配置参数</strong>​：在转换后的节点参数中，确保包含 <code>underlying-proxy</code>​ 指向你的 Reality 服务，并手动确认 <code>xtls-rprx-vision</code> 已激活。</li>
 <li>​<strong>注意</strong>​：Surge 的 ​<strong>MITM</strong>​（中间人攻击解密）可能会与 Reality 产生冲突，建议对节点域名执行 <code>skip-proxy</code> 或排除该节点的嗅探。</li>
</ul>
<h3 id="quantumult-x--x--">Quantumult X (圈 X) —— 订阅转换玩家</h3>
<p>由于 Quantumult X 核心更新较慢，直接配置 VLESS Reality 较为复杂：</p>
<ul>
 <li>​<strong>推荐方案</strong>​：<strong>强烈建议</strong>使用 <strong>Sub-Store</strong> 或后端转换链接，将节点转换为 <code>Trojan</code> 或其他圈 X 原生支持的格式。</li>
 <li>​<strong>手动尝试</strong>​：若使用最新测试版，请在配置文件中严格按照 <code>vless=...</code>​ 语法，并确保 <code>reality-public-key</code> 已正确映射。</li>
</ul>
<h3 id="windows--android--v2rayn--v2rayng">Windows / Android 通用 (v2rayN / v2rayNG)</h3>
<ul>
 <li>​<strong>内核检查</strong>​：确保 Xray-core 版本 ​ <strong>≥ 1.8.0</strong>。</li>
 <li>​<strong>一键配置</strong>​：直接复制 3X-UI 生成的 <code>vless://</code> 链接粘贴即可。</li>
 <li><strong>Vision 检查</strong>：如果连接后网速极慢或无法打开网页，请检查“流控”一栏是否填错为 <code>xtls-rprx-direct</code>​（应为 <code>vision</code>）。</li>
</ul>
<blockquote>
 <p>“虽然 Reality 是目前最隐蔽的方案，但针对部分追求极致分析的高端 iOS 客户端（如 Surge、Quantumult X等），在 3X-UI 中开启一个 <strong>Trojan 节点作为备选</strong>，是保证全平台 100% 兼容的最优解。”</p>
</blockquote>
<h2 id="--4">七、 长期维护与进阶优化</h2>
<h3 id="-xray-">自动更新 Xray 内核</h3>
<p>Reality 和 Vision 属于快速迭代的技术。如果内核版本过旧，会导致新版客户端无法连接。</p>
<ul>
 <li><strong>操作建议</strong>：在系统状态-Xray里，<strong>切换更新版本的内核</strong>。</li>
</ul>
<h3 id="-reality-">定期更换 Reality “面具”（目标网站）</h3>
<p>如果你发现原本流畅的节点突然变得断断续续，可能是你借用的伪装网站（Dest）被重点照顾了。</p>
<ul>
 <li>​<strong>优化方案</strong>​：在面板中修改 <code>Dest</code>​ 和 <code>SNI</code>。</li>
 <li>​<strong>冷门推荐</strong>​：除了 Google 和 Microsoft，尝试使用一些大型国外高校或技术文档站，例如 <code>www.cisco.com:443</code>​ 或 <code>www.debian.org:443</code>。</li>
</ul>
<h3 id="-google--warp">解决 Google 搜索频繁跳验证码（开启 Warp）</h3>
<p>由于 VPS 的 IP 通常被标记为机房 IP，使用 Google 搜索时常会弹出验证码（Cloudflare 验证）。</p>
<ul>
 <li>​<strong>解决方案</strong>​：在服务器上安装 ​<strong>Cloudflare Warp</strong>，并在 3X-UI 的「面板设置」中配置“分流路由”，让 Google 流量通过 Warp 节点流出。这能有效“洗白”你的 IP，提升使用体验。</li>
</ul>
<hr>
<p>这套配置虽然步骤较多，但只要按部就班，设置妥当，就能在当前的环境下较为安全地使用。有空还可进一步优化内核、系统隐藏等操作，打造“彻底消失”的节点。</p>]]></description><guid isPermaLink="false">/archives/vless-reality-vision-2026-ultimate-hide-node-guide</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1774855706600.webp&amp;size=m" type="image/jpeg" length="90130"/><category>技巧</category><category>分享</category><pubDate>Mon, 30 Mar 2026 07:46:00 GMT</pubDate></item><item><title><![CDATA[给OpenList和Alist加上液态玻璃效果，颜值直接拉满！]]></title><link>https://wuqishi.com/archives/liquid-glass-theme-for-openlist-alist</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BB%99OpenList%E5%92%8CAlist%E5%8A%A0%E4%B8%8A%E6%B6%B2%E6%80%81%E7%8E%BB%E7%92%83%E6%95%88%E6%9E%9C%EF%BC%8C%E9%A2%9C%E5%80%BC%E7%9B%B4%E6%8E%A5%E6%8B%89%E6%BB%A1%EF%BC%81&amp;url=/archives/liquid-glass-theme-for-openlist-alist" width="1" height="1" alt="" style="opacity:0;">
<h2 id="heading">初衷</h2>
<p>最近一直在鼓捣个人网盘，从Alist换到了OpenList。作为个爱折腾的人，总觉得默认界面差点意思，想找点办法让它更好看。</p>
<p>也不知道从啥时候起，我彻底迷上了液态玻璃效果，尤其是那种全透明、不带模糊的，看着特别通透。干脆自己结合AI整了个OpenList-CSS，把这效果搬到我的网盘界面上。</p>
<h2 id="heading-1">设计思路</h2>
<p>设计思路其实特简单，就想整一个既好看又实用的样式配置。</p>
<h3 id="heading-2">好看是第一要务</h3>
<p>既然要做液态玻璃效果，半透明、毛玻璃这些元素肯定不能少。我用了 <code>backdrop-filter</code>实现模糊效果，搭配半透明背景，层次感一下就出来了。再加上统一的圆角设计，整体看着特别和谐。</p>
<h3 id="heading-3">实用也不能丢</h3>
<p>光好看也不行，还得实用。我在底部加了信息栏，显示版权信息、传统十二时辰、页面加载耗时和网站运行时间，这些小功能都挺实用的。</p>
<h3 id="heading-4">配置要简单</h3>
<p>我知道不是所有人都懂代码，所以把所有可配置的参数都集中到一个区域，用CSS变量管理。就算不懂代码，也能通过修改变量值来定制自己喜欢的效果。</p>
<h2 id="heading-5">技术实现</h2>
<h3 id="css">CSS部分</h3>
<ul>
 <li><strong>CSS3变量</strong>：用 <code>:root</code>定义全局变量，方便统一管理和修改</li>
 <li><strong>backdrop-filter</strong>：实现毛玻璃效果，这是液态玻璃效果的核心</li>
 <li><strong>响应式设计</strong>：适配不同屏幕尺寸，手机上也能正常显示</li>
 <li><strong>统一风格</strong>：统一的圆角、间距和颜色方案，整体看着协调</li>
</ul>
<h3 id="javascript">JavaScript部分</h3>
<ul>
 <li><strong>点击特效</strong>：点击页面时会出现随机文字和动画，增加点趣味性</li>
 <li><strong>时间显示</strong>：实时显示当前时辰和页面加载耗时</li>
 <li><strong>性能优化</strong>：用事件委托减少监听器数量，常量定义避免重复创建对象</li>
</ul>
<h2 id="heading-6">效果展示</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1773896381268.webp&amp;size=m" alt="OpenList液态玻璃效果展示1"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1773896425053.webp&amp;size=m" alt="OpenList液态玻璃效果展示2"></p>
<h3 id="heading-7">液态玻璃效果</h3>
<p>全透明的导航栏和卡片，搭配背景图片，真的就像液态玻璃一样，看着特别有质感。</p>
<h3 id="heading-8">点击特效</h3>
<p>点击页面时会出现随机文字和动画效果，就像在页面上撒了把彩色花瓣，每次点击都有小惊喜。</p>
<h3 id="heading-9">实用信息</h3>
<p>底部信息栏内容虽然简单，但挺实用的，尤其是十二时辰显示，还带着点中国风。</p>
<h2 id="heading-10">适用范围</h2>
<p>虽然我是为OpenList做的，但Alist也能用，操作步骤完全一样。</p>
<h2 id="heading-11">安装方法</h2>
<p>安装超级简单，就几步：</p>
<ol>
 <li>打开OpenList-CSS文件</li>
 <li>复制所有代码</li>
 <li>登录OpenList或Alist管理后台</li>
 <li>找到「全局设置」→「自定义内容」</li>
 <li>粘贴代码并保存</li>
 <li>刷新前端页面</li>
</ol>
<p>整个过程不到1分钟，你的网盘界面就能焕然一新。</p>
<h2 id="heading-12">自定义小技巧</h2>
<h3 id="heading-13">换个背景图片</h3>
<p>默认用的是随机图片API，你可以换成自己喜欢的图片：</p>
<pre><code class="language-css">--bg-image: url("https://example.com/your-image.jpg");
</code></pre>
<h3 id="heading-14">调整透明度</h3>
<p>根据背景图片的明暗，调整半透明效果：</p>
<pre><code class="language-css">--day-bg-opacity: 0.2;          /* 增加背景透明度 */
--day-blur: 5px;               /* 添加模糊效果 */
</code></pre>
<h3 id="heading-15">自定义点击文字</h3>
<p>在JavaScript部分找到 <code>VALUES</code>数组，添加你喜欢的文字：</p>
<pre><code class="language-javascript">const VALUES = ["💗小乖乖最美💗", "💗小坏蛋最帅💗", "加油！", "你真棒！"];
</code></pre>
<h2 id="heading-16">后续计划</h2>
<p>暂时没什么特别的计划，先用着再说。</p>
<h2 id="heading-17">结语</h2>
<p>其实这就是个小项目，主要是满足我自己的审美需求。既然做了，就分享给大家，希望能给用OpenList和Alist的朋友带来点惊喜。</p>
<!-- raw HTML omitted -->]]></description><guid isPermaLink="false">/archives/liquid-glass-theme-for-openlist-alist</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1773896381268.webp&amp;size=m" type="image/jpeg" length="89922"/><category>分享</category><pubDate>Thu, 19 Mar 2026 06:46:00 GMT</pubDate></item><item><title><![CDATA[网页截图瞬间“赛博飞升”？手把手教你根治 Windows HDR 截图发白]]></title><link>https://wuqishi.com/archives/fix-windows-hdr-screenshot-white</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BD%91%E9%A1%B5%E6%88%AA%E5%9B%BE%E7%9E%AC%E9%97%B4%E2%80%9C%E8%B5%9B%E5%8D%9A%E9%A3%9E%E5%8D%87%E2%80%9D%EF%BC%9F%E6%89%8B%E6%8A%8A%E6%89%8B%E6%95%99%E4%BD%A0%E6%A0%B9%E6%B2%BB%20Windows%20HDR%20%E6%88%AA%E5%9B%BE%E5%8F%91%E7%99%BD&amp;url=/archives/fix-windows-hdr-screenshot-white" width="1" height="1" alt="" style="opacity:0;">
<p>不知道你有没有遇过这种“灵异事件”：</p>
<p>明明屏幕上的小姐姐明艳动人，代码高亮得赏心悦目，结果按下 <code>Win + Shift + S</code>​ 一截图……好家伙！出来的预览图瞬间蒙上了一层厚厚的“白雾”，原本鲜艳的网页像是被丢进<strong>漂白水</strong>里泡了三天三夜，高光溢出到直接快进到“灵魂升天”。👼</p>
<p>别急着重装系统，这既不是显卡坏了，也不是截图软件抽风。今天我们就来聊聊这个让无数 Windows 用户血压升高的“HDR 截图惨案”，以及如何优雅地干掉它。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1773279291421.webp&amp;size=m" alt="Windows 11 HDR 截图发白修复对比"></p>
<h2 id="1-">1. 为什么会“白茫茫一片真干净”？</h2>
<p>这个问题的真凶，其实是<strong>色彩管理协议的“代沟”</strong> 。</p>
<p>当你开启了 Windows 的 <strong>HDR (高动态范围)</strong> 模式，屏幕的亮度上限被强行拔高。但目前的浏览器内核（Chromium）和大多数截图工具，默认还是按老掉牙的 <strong>sRGB</strong>（标准动态范围）来捕捉画面的。</p>
<blockquote>
 <p>📖 碎碎念：
  <br>
  这好比你试图把一头<strong>巨型大象（HDR 信号）</strong> 硬塞进一个<strong>火柴盒（SDR 图片空间）</strong> 里。结果大象没塞进去，盒子先炸了。亮度瞬间挤爆了，高光直接溢出，你得到的截图就像是在正午阳光下强行曝光。</p>
</blockquote>
<hr>
<h2 id="2-">2. 深度根治：三剂良方</h2>
<p>为了不让每一张截图都像是在“雪地里求生”，请收下这三招：</p>
<h2 id="-">剂一：给浏览器下达“色彩戒严令” 😎（最推荐）</h2>
<p>如果你发现只有在 Chrome 或 Edge 里截图会发白，那是因为浏览器在 HDR 环境下有点“放飞自我”。我们直接给它下个“死命令”，强制其回归理智。</p>
<p>在地址栏输入并回车：</p>
<ul>
 <li>
  <p>Chrome 浏览器：</p>
  <pre><code class="language-txt">chrome://flags/#force-color-profile
</code></pre>
 </li>
 <li>
  <p>Edge 浏览器：</p>
  <pre><code class="language-txt">edge://flags/#force-color-profile
</code></pre>
 </li>
</ul>
<p>操作指南：
 <br>
 找到 <strong>​<code>Force color profile</code>​</strong>​ 选项（默认是 Default），将其右侧修改为：<code>sRGB</code>。</p>
<blockquote>
 <p>📖 碎碎念：
  <br>
  如果你是设计大佬，用的是苹果同款 P3 广色域屏幕，也可以试试设为 <code>Display P3</code>​。这不仅能修复截图发白，色彩看起来还会比 sRGB 更有“果味儿”。改完记得点击右下角的 <strong>Relaunch/重启</strong>，别白忙活。</p>
</blockquote>
<h2 id="-windows-11--">剂二：开启 Windows 11 的“后悔药” 🧊</h2>
<p>如果你用的是 Win11，官方其实偷偷藏了一个自动校正开关，只是藏得比前女友的照片还深。</p>
<ol>
 <li>
  <p>搜索并打开系统自带的 <strong>“截图工具”</strong> App。</p>
 </li>
 <li>
  <p>点击右上角 <code>...</code>​ -&gt; <strong>设置</strong>。</p>
 </li>
 <li>
  <p>手动<strong>开启</strong>以下选项：</p>
  <p>HDR 截图颜色校正: <strong>​<code>On</code>​</strong></p>
 </li>
</ol>
<h2 id="--1">剂三：终极暴力美学 🔨</h2>
<p>如果你正打着游戏，或者在用一些不听话的第三方截图软件（如 Snipaste 旧版），记住这个<strong>系统级全局快捷键</strong>：<strong>​<code>Win + Alt + B</code>​</strong></p>
<ul>
 <li>操作： 截图前按一下（关闭 HDR） -&gt; 截图 -&gt; 截完再按一下（开启 HDR）。</li>
 <li>黑科技点： 这是 Windows 官方隐藏的 HDR 切换组合键。虽然屏幕会黑屏闪烁 1 秒左右，但它是 100% 解决任何软件截图变色的“物理外挂”。</li>
</ul>
<hr>
<h2 id="--2">💡 极客冷知识：为什么苹果没这烦恼？</h2>
<p>其实，macOS 在这方面处理得更好，是因为苹果有一套极其严密的<strong>色彩管理系统（Color Management）</strong> 。无论屏幕多亮，系统底层都会在截图的一瞬间自动进行“色调映射”。</p>
<p>而 Windows 这边，由于显示器质量参差不齐（有几千块的 OLED，也有几百块的“伪 HDR”），系统和软件之间经常各说各的话。支持 HDR 的显示器越来越多，但软件代码可能还是 10 年前写的。</p>
<blockquote>
 <p>📖 碎碎念：
  <br>
  换个角度想，截图变白其实是一种 <strong>“富贵的烦恼”</strong> 。这起码说明你的屏幕素质不错，真的能跑 HDR！如果你的屏幕只有 250 尼特亮度，它连变白的机会都没有……💁‍♂️</p>
</blockquote>
<hr>
<h2 id="--3">🎁 写在最后</h2>
<p>那么问题来了： 你遇到截图发白的时候，第一反应是觉得显卡要崩了，还是觉得显示器该换了？欢迎在评论区分享你的“翻车”瞬间！👇</p>]]></description><guid isPermaLink="false">/archives/fix-windows-hdr-screenshot-white</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1773279291421.webp&amp;size=m" type="image/jpeg" length="99560"/><category>技巧</category><category>分享</category><pubDate>Thu, 12 Mar 2026 02:57:07 GMT</pubDate></item><item><title><![CDATA[群晖 NAS 影音终极方案：Docker Rclone + OpenList 完美挂载 Plex 全攻略]]></title><link>https://wuqishi.com/archives/synology-nas-audio-and-video-ultimate-solution-docker-rclone-openlist-perfect-mounting-plex</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BE%A4%E6%99%96%20NAS%20%E5%BD%B1%E9%9F%B3%E7%BB%88%E6%9E%81%E6%96%B9%E6%A1%88%EF%BC%9ADocker%20Rclone%20%2B%20OpenList%20%E5%AE%8C%E7%BE%8E%E6%8C%82%E8%BD%BD%20Plex%20%E5%85%A8%E6%94%BB%E7%95%A5&amp;url=/archives/synology-nas-audio-and-video-ultimate-solution-docker-rclone-openlist-perfect-mounting-plex" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%86%99%E5%9C%A8%E6%9C%80%E5%89%8D%E9%9D%A2">写在最前面</h2>
<p style="">因为将我的群晖DSM升级到7.3版本，导致之前用代码安装的rclone直接没了，所以就想着用Docker部署rclone，将遇到的问题到最后完成部署后的结果整理成了这篇文章。</p>
<h2 style="" id="%E5%89%8D%E8%A8%80%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%A0%E4%B9%8B%E5%89%8D%E7%9A%84%E6%8C%82%E8%BD%BD%E9%83%BD%E5%A4%B1%E8%B4%A5%E4%BA%86%EF%BC%9F">前言：为什么你之前的挂载都失败了？</h2>
<p style="">许多群晖用户在尝试通过 OpenList/Alist 挂载网盘时，往往会遇到三个看似"玄学"的问题：</p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 939px">
  <colgroup>
   <col style="width: 328px">
   <col style="width: 611px">
  </colgroup>
  <tbody>
   <tr style="height: 60px;">
    <th colspan="1" rowspan="1" colwidth="328">
     <p style="">问题现象</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="611">
     <p style="">根本原因</p>
    </th>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="328">
     <p style="">File Station 能看到文件，Plex 却扫不到</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="611">
     <p style="">Plex 套件缺乏访问 FUSE 虚拟文件系统的权限</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="328">
     <p style="">播放 4K 原盘频繁卡顿</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="611">
     <p style="">缺少本地缓存机制，网盘 API 被高频请求触发限速</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="328">
     <p style="">重启 NAS 后挂载点变空</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="611">
     <p style="">群晖默认存储卷挂载属性为 <code>Private</code>​，容器挂载无法同步至宿主机</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<p style="">本文核心解决方案：通过 Docker Rclone 配合 挂载传播（Mount Propagation） 技术，构建一个稳定、高性能的网盘挂载架构。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2FVZmrhwfJspC.webp%21wwater&amp;size=m" alt="Docker Rclone + OpenList 完美挂载 Plex 全攻略" width="1376px">
 <figcaption data-placeholder="添加描述" style="width: 1376px; max-width: 100%; text-align: center;">Docker Rclone + OpenList 完美挂载 Plex 全攻略</figcaption>
</figure>
<hr>
<h2 style="" id="%E7%AC%AC%E4%B8%80%E9%98%B6%E6%AE%B5%EF%BC%9A%E5%AE%BF%E4%B8%BB%E6%9C%BA%E5%BA%95%E5%B1%82%E7%8E%AF%E5%A2%83%E5%8A%A0%E5%9B%BA%EF%BC%88ssh-%E5%BF%85%E5%81%9A%EF%BC%89">第一阶段：宿主机底层环境加固（SSH 必做）</h2>
<p style="">这是整个方案的"地基"。地基不稳，后续容器运行再顺畅，Plex 也无法识别文件。</p>
<h3 style="" id="1.-%E5%BC%80%E5%90%AF-fuse-%E5%86%85%E6%A0%B8%E6%94%AF%E6%8C%81">1. 开启 FUSE 内核支持</h3>
<p style="">FUSE（用户态文件系统）是 Rclone 在 Linux 上模拟硬盘的基础依赖：</p>
<pre><code class="language-bash">sudo modprobe fuse</code></pre>
<h3 style="" id="2.-%E4%BF%AE%E6%94%B9%E5%AD%98%E5%82%A8%E5%8D%B7%E5%85%B1%E4%BA%AB%E5%B1%9E%E6%80%A7%EF%BC%88%E6%A0%B8%E5%BF%83%E6%AD%A5%E9%AA%A4%EF%BC%89">2. 修改存储卷共享属性（核心步骤）</h3>
<p style="">群晖默认禁止容器修改宿主机挂载表，需手动将存储卷改为 shared​ 模式：</p>
<pre><code class="language-bash"># 将 /volume4 替换为你实际的存储卷路径（如 /volume1）
sudo mount --make-shared /volume4</code></pre>
<h3 style="" id="3.-%E5%BB%BA%E7%AB%8B%E6%A0%87%E5%87%86%E5%8C%96%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84">3. 建立标准化目录结构</h3>
<p style="">建议统一存放 Docker 配置文件，便于日后迁移和维护，以下为示例：</p>
<pre><code class="language-bash"># Rclone 配置文件目录
mkdir -p /volume4/docker/rclone/config

# VFS 缓存目录（建议选用 SSD 卷，加速 Plex 元数据扫描）
mkdir -p /volume4/docker/rclone/cache

# Plex 最终扫描的物理挂载点（需保持为空文件夹）
mkdir -p /volume4/OpenList</code></pre>
<hr>
<h2 style="" id="%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5%EF%BC%9A%E7%B2%BE%E7%BB%86%E5%8C%96%E9%85%8D%E7%BD%AE-rclone-%E5%87%AD%E6%8D%AE">第二阶段：精细化配置 Rclone 凭据</h2>
<h3 style="" id="1.-%E5%AF%86%E7%A0%81%E5%8A%A0%E5%AF%86%EF%BC%88%E4%B8%8D%E8%83%BD%E5%A1%AB%E6%98%8E%E6%96%87%E5%93%A6%EF%BC%89">1. 密码加密（不能填明文哦）</h3>
<p style="">Rclone 配置文件禁止存储明文密码。执行以下命令生成加密字符串：</p>
<pre><code class="language-bash">docker run --rm rclone/rclone obscure [你的OpenList密码]</code></pre>
<p style="">记录输出结果（如 EY_L_2...​），用于下一步配置。</p>
<h3 style="" id="2.-%E7%BC%96%E5%86%99-rclone.conf">2. 编写 rclone.conf</h3>
<p style="">编辑 /volume4/docker/rclone/config/rclone.conf​：</p>
<pre><code class="language-ini">[openlist]
type = webdav
url = http://127.0.0.1:5244/dav    	# 必须包含端口和路径
vendor = other						# 没错，就是other
user = admin						# 你的用户名
pass = EY_L_2...                  	# 填入上一步生成的加密字符串</code></pre>
<p style="">⚠️ 关键细节：</p>
<ul>
 <li>
  <p style="">URL 格式：必须包含端口号 5244​ 和路径 /dav​，端口号请填写你自己的。</p>
 </li>
 <li>
  <p style="">禁止尾随斜杠：URL 结尾不加 /​，否则可能会触发 405 Method Not Allowed​ 错误。</p>
 </li>
</ul>
<hr>
<h2 style="" id="%E7%AC%AC%E4%B8%89%E9%98%B6%E6%AE%B5%EF%BC%9A%E9%83%A8%E7%BD%B2%E9%AB%98%E6%80%A7%E8%83%BD%E6%8C%82%E8%BD%BD%E5%AE%B9%E5%99%A8">第三阶段：部署高性能挂载容器</h2>
<p style="">部署前建议清理可能存在的僵尸挂载点：</p>
<pre><code class="language-bash">sudo fusermount -u -z /volume4/OpenList 2&gt;/dev/null || true</code></pre>
<p style="">执行部署命令：</p>
<pre><code class="language-bash">docker run -d \
  --name rclone-mount \
  --restart always \
  --privileged \
  --network host \
  --device /dev/fuse \
  -e PUID=0 \
  -e PGID=0 \
  -e TZ=Asia/Shanghai \
  -v /etc/localtime:/etc/localtime:ro \
  -v /volume4/docker/rclone/config:/config/rclone \
  -v /volume4/docker/rclone/cache:/cache \
  -v /volume4/OpenList:/data:shared \
  rclone/rclone \
  mount openlist:/ /data \
  --config /config/rclone/rclone.conf \
  --allow-other \
  --allow-non-empty \
  --vfs-cache-mode full \
  --vfs-cache-max-size 20G \
  --vfs-cache-max-age 24h \
  --cache-dir /cache \
  --buffer-size 64M \
  --vfs-read-chunk-size 32M \
  --vfs-read-chunk-size-limit 1G \
  --attr-timeout 10s \
  --dir-cache-time 24h \
  --umask 000</code></pre>
<h3 style="" id="%E6%A0%B8%E5%BF%83%E5%8F%82%E6%95%B0%E8%A7%A3%E6%9E%90">核心参数解析</h3>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 763px">
  <colgroup>
   <col style="width: 288px">
   <col style="width: 475px">
  </colgroup>
  <tbody>
   <tr style="height: 60px;">
    <th colspan="1" rowspan="1" colwidth="288">
     <p style="">参数</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="475">
     <p style="">作用说明</p>
    </th>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="288">
     <p style="">​:shared​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="475">
     <p style="">挂载传播关键，使宿主机能够感知容器内的挂载变化</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="288">
     <p style="">​--vfs-cache-mode full​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="475">
     <p style="">启用完整 VFS 缓存，让网盘文件表现为本地文件特性</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="288">
     <p style="">​--vfs-cache-max-size 20G​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="475">
     <p style="">限制缓存上限，防止 Plex 扫库时耗尽 NAS 存储</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="288">
     <p style="">​--umask 000​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="475">
     <p style="">赋予挂载点 777 权限，确保 Plex 能够正常读取</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="288">
     <p style="">​--vfs-read-chunk-size 32M​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="475">
     <p style="">顺序读取时的初始块大小，优化大文件播放性能</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="288">
     <p style="">​-e PUID=0 -ePGID=0​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="475">
     <p style="">可以修改为管理员的，但是要注意权限</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<hr>
<h2 style="" id="%E7%AC%AC%E5%9B%9B%E9%98%B6%E6%AE%B5%EF%BC%9Adocker-%E7%89%88-plex-%E7%9A%84%E7%89%B9%E5%88%AB%E9%85%8D%E7%BD%AE">第四阶段：Docker 版 Plex 的特别配置</h2>
<p style="">若使用 Docker 部署 Plex，需进行路径二次穿透：</p>
<h3 style="" id="1.-%E6%B7%BB%E5%8A%A0%E5%8D%B7%E6%98%A0%E5%B0%84">1. 添加卷映射</h3>
<p style="">在 Plex 容器配置中增加：</p>
<ul>
 <li>
  <p style="">宿主机路径：/volume4/OpenList​</p>
 </li>
 <li>
  <p style="">容器路径：/video​（可自定义）</p>
 </li>
</ul>
<h3 style="" id="2.-%E5%BF%85%E9%A1%BB%E6%B7%BB%E5%8A%A0-%3Ashared%E2%80%8B-%E5%90%8E%E7%BC%80">2. 必须添加 :shared​ 后缀</h3>
<pre><code class="language-bash">-v /volume4/OpenList:/video:shared</code></pre>
<p style="">原理说明：不加 :shared​ 时，宿主机挂载点更新后，Plex 容器因命名空间隔离无法感知变化。</p>
<hr>
<h2 style="" id="%E7%AC%AC%E4%BA%94%E9%98%B6%E6%AE%B5%EF%BC%9A%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B8%8E%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5">第五阶段：自动化运维与故障排查</h2>
<h3 style="" id="1.-%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%EF%BC%88%E7%BE%A4%E6%99%96%E4%BB%BB%E5%8A%A1%E8%AE%A1%E5%88%92%EF%BC%89">1. 开机自动配置（群晖任务计划）</h3>
<p style="">群晖重启后内核设置会重置。进入 控制面板 &gt; 任务计划 &gt; 新增 &gt; 触发的任务：</p>
<ul>
 <li>
  <p style="">事件：开机</p>
 </li>
 <li>
  <p style="">用户：root</p>
 </li>
 <li>
  <p style="">脚本内容：</p>
 </li>
</ul>
<pre><code class="language-bash">#!/bin/bash
modprobe fuse
mount --make-shared /volume4</code></pre>
<h3 style="" id="2.-%E5%B8%B8%E8%A7%81%E6%95%85%E9%9A%9C%E9%80%9F%E6%9F%A5%E8%A1%A8">2. 常见故障速查表</h3>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 1000px">
  <colgroup>
   <col style="width: 228px">
   <col style="width: 243px">
   <col style="width: 529px">
  </colgroup>
  <tbody>
   <tr style="height: 60px;">
    <th colspan="1" rowspan="1" colwidth="228">
     <p style="">报错现象</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="243">
     <p style="">根因分析</p>
    </th>
    <th colspan="1" rowspan="1" colwidth="529">
     <p style="">解决方案</p>
    </th>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="228">
     <p style="">​Input/output error​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="243">
     <p style="">挂载死锁或容器异常重启</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="529">
     <p style="">停止容器，执行 fusermount -u -z /volume4/OpenList​ 强制卸载后重启</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="228">
     <p style="">​405 Method Not Allowed​</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="243">
     <p style="">URL 格式错误</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="529">
     <p style="">检查 rclone.conf​ 中 URL 是否以 /​ 结尾</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="228">
     <p style="">Plex 扫描不到文件</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="243">
     <p style="">挂载传播未生效</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="529">
     <p style="">确认宿主机执行了 mount --make-shared​ 且 Docker 映射包含 :shared​</p>
    </td>
   </tr>
   <tr style="height: 60px;">
    <td colspan="1" rowspan="1" colwidth="228">
     <p style="">Plex 海报加载缓慢</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="243">
     <p style="">VFS 缓存正在构建</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="529">
     <p style="">正常现象，等待 Rclone 将元数据下载至 /cache​ 目录</p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<hr>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">完成上述配置后，你的网盘已通过 Rclone 无缝"寄生"在群晖本地。Plex 扫描 /volume4/OpenList​ 时，体验将与本地硬盘无异。</p>
<p style="">🎬 享受你的高清私人影院吧！</p>
<hr>
<h3 style="" id="%F0%9F%92%A1-%E8%BF%9B%E9%98%B6%E5%BB%BA%E8%AE%AE%EF%BC%9Aplex-%E8%B5%84%E6%96%99%E5%BA%93%E4%BC%98%E5%8C%96">💡 进阶建议：Plex 资料库优化</h3>
<p style="">进入 Plex 设置 &gt; 资料库，建议调整以下选项以降低网盘 API 调用频率：</p>
<ul>
 <li>
  <p style="">✅ 禁用 "定期扫描"</p>
 </li>
 <li>
  <p style="">✅ 禁用 "检测到更改时扫描"</p>
 </li>
 <li>
  <p style="">✅ 改为 手动扫描 或设置 凌晨低峰期定时扫描</p>
 </li>
</ul>
<p style="">此举可显著降低网盘服务商的流量风控风险，提升长期稳定性。</p>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/synology-nas-audio-and-video-ultimate-solution-docker-rclone-openlist-perfect-mounting-plex</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2FVZmrhwfJspC.webp%21wwater&amp;size=m" type="image/jpeg" length="68154"/><category>技巧</category><category>分享</category><pubDate>Mon, 9 Mar 2026 04:55:00 GMT</pubDate></item><item><title><![CDATA[一个简洁高效的SVG图标库]]></title><link>https://wuqishi.com/archives/a-concise-and-efficient-svg-icon-library</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%B8%80%E4%B8%AA%E7%AE%80%E6%B4%81%E9%AB%98%E6%95%88%E7%9A%84SVG%E5%9B%BE%E6%A0%87%E5%BA%93&amp;url=/archives/a-concise-and-efficient-svg-icon-library" width="1" height="1" alt="" style="opacity:0;">
<h2 id="引言">引言</h2>
<p>因为在使用SVG图标的是否发现Base64代码真的很不直观，想预览一个打开一个浏览器标签，于是就想着将这些都在一个页面预览不就好了？所以，通过Trae的助力，开发了这个SVG图标库。</p>
<p>预览地址：<hyperlink-inline-card href="https://wuqishi.com/svg/" target="_blank"></hyperlink-inline-card></p>
<h2 id="让图标管理变得简单">让图标管理变得简单</h2>
<p>有以下特点😂：</p>
<ul>
 <li>✅ 显示SVG图标并支持点击复制base64编码</li>
 <li>✅ 支持提交新的SVG图标</li>
 <li>✅ 响应式设计，适配不同设备</li>
 <li>✅ 现代化的液态玻璃UI效果</li>
 <li>✅ 支持批量上传SVG图标</li>
 <li>✅ 自动检测重复图标</li>
 <li>✅ 支持多种输入格式（SVG代码、纯Base64编码、带data URL前缀的Base64编码）</li>
 <li>✅ 完善的表单验证和错误处理</li>
 <li>✅ CSRF防护确保安全</li>
</ul>
<h3 id="1--直观的图标展示">1. 直观的图标展示</h3>
<p>SVG图标库采用网格布局展示所有图标，每个图标都以卡片形式呈现，悬停时会有微妙的动画效果。用户可以一目了然地看到所有可用的图标，无需在无数个文件夹中翻找。</p>
<p><strong>界面展示</strong>：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1772341511534.webp&amp;size=m" alt="SVG图标库主界面"></p>
<h3 id="2--便捷的复制功能">2. 便捷的复制功能</h3>
<p>用户只需点击图标，在弹出的模态框中点击相应按钮，就能：</p>
<ul>
 <li>一键复制SVG代码，直接用于HTML</li>
 <li>一键复制Base64编码，带data URL前缀，可直接粘贴到CSS中</li>
 <li>复制成功后会显示通知提示，确保操作成功</li>
</ul>
<p><strong>界面展示</strong>：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1772341579251.webp&amp;size=m" alt="图标预览和复制界面"></p>
<h3 id="3--图标添加功能">3. 图标添加功能</h3>
<p>支持多种格式的输入：</p>
<ul>
 <li>直接上传SVG代码</li>
 <li>上传Base64编码（带或不带data URL前缀）</li>
 <li>批量上传多个Base64编码（一次粘贴多个，系统自动处理）</li>
 <li>智能验证，确保SVG内容有效</li>
 <li>自动去重，防止重复图标</li>
</ul>
<p><strong>界面展示</strong>：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1772341632917.webp&amp;size=m" alt="SVG图标添加界面"></p>
<h3 id="4--现代美观的界面">4. 现代美观的界面</h3>
<p>采用流行的液态玻璃UI设计风格，使用backdrop-filter和box-shadow实现现代化的模糊效果。界面简洁大方，动画流畅自然，响应式设计确保在手机、平板和桌面设备上都能完美展示。</p>
<p><strong>界面展示</strong>：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1772341689564.webp&amp;size=m" alt="移动端适配界面"></p>
<h2 id="技术实现">技术实现</h2>
<h3 id="前端技术">前端技术</h3>
<ul>
 <li><strong>HTML5</strong>：语义化标签，良好的结构</li>
 <li><strong>CSS3</strong>：现代CSS特性，包括变量、动画、响应式设计</li>
 <li><strong>JavaScript (ES6+)</strong> ：模块化代码组织，事件处理</li>
 <li><strong>液态玻璃UI</strong>：使用backdrop-filter和box-shadow实现</li>
</ul>
<h3 id="后端技术">后端技术</h3>
<ul>
 <li><strong>PHP 8.0+</strong> ：服务器端逻辑处理</li>
 <li><strong>文件系统</strong>：存储SVG图标数据</li>
 <li><strong>会话管理</strong>：实现PRG模式，防止表单重复提交</li>
</ul>
<h3 id="代码结构">代码结构</h3>
<pre><code class="language-txt">svg/
├── index.php          # 主入口文件
├── icons.txt          # 存储SVG图标数据
├── includes/
│   ├── config.php     # 配置文件
│   ├── security.php   # 安全相关功能
│   └── svg_manager.php # SVG图标管理功能
└── assets/
    ├── css/
    │   └── style.css  # 样式文件
    └── js/
        └── script.js  # JavaScript文件
</code></pre>
<h2 id="问题与解决方案">问题与解决方案</h2>
<h3 id="1--Cloudflare兼容性问题">1. Cloudflare兼容性问题</h3>
<p><strong>问题表现</strong>：部署到使用Cloudflare加速的服务器后，点击图标或按钮没有反应，浏览器控制台显示JavaScript错误。</p>
<p><strong>具体影响：</strong> 核心功能完全无法使用，用户无法预览或复制图标，也无法添加新图标等问题</p>
<p><strong>技术原因</strong>：Cloudflare的Rocket Loader功能会异步加载和执行JavaScript代码，干扰了事件监听器的绑定，导致事件处理函数无法正常触发。</p>
<details>
 <summary>解决思路</summary>
 <p><strong>解决思路</strong>：</p>
 <ul>
  <li>使用捕获阶段的事件监听器，避免事件冒泡被干扰</li>
  <li>实现双重初始化机制，确保代码在各种情况下都能正确初始化</li>
  <li>增强DOM元素检查，添加元素存在性检查和重试机制</li>
 </ul>
 <p><strong>代码示例</strong>：</p>
 <pre><code class="language-javascript">// 使用捕获阶段的事件监听器
this.DOM.iconGrid.addEventListener('click', (event) =&gt; {
    const card = event.target.closest('.icon-card');
    if (card) {
        event.stopPropagation();
        this.openPreviewModal(card);
    }
}, true); // 使用捕获阶段
</code></pre>
 <pre><code class="language-javascript">// 初始化 - 使用更可靠的方式，避免Cloudflare干扰
(function() {
    // 等待DOM加载完成
    function initWhenReady() {
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', function() {
                SvgIconLibrary.init();
            });
        } else {
            SvgIconLibrary.init();
        }
    }    // 立即执行初始化
    initWhenReady();    // 额外的保险措施：延迟初始化，确保所有资源都已加载
    setTimeout(function() {
        if (!window.SvgIconLibrary || !window.SvgIconLibrary.DOM || Object.keys(window.SvgIconLibrary.DOM).length === 0) {
            console.log('Secondary initialization attempt');
            SvgIconLibrary.init();
        }
    }, 1000);
})();
</code></pre>
</details>
<h3 id="2--ARIA可访问性问题">2. ARIA可访问性问题</h3>
<p><strong>问题表现</strong>：浏览器控制台报ARIA可访问性错误，提示"Blocked aria-hidden on an element because its descendant retained focus"，影响网站的可访问性评分。</p>
<p><strong>技术原因</strong>：当关闭模态框时，模态框中的按钮仍然保持焦点，而模态框被设置为aria-hidden="true"，违反了WAI-ARIA规范，因为辅助技术不应该将焦点隐藏在用户看不到的元素上。</p>
<details>
 <summary>解决思路</summary>
 <p><strong>解决思路</strong>：</p>
 <ul>
  <li>在关闭模态框之前，检查当前获得焦点的元素是否在模态框内</li>
  <li>如果焦点在模态框内，将焦点移到页面主体</li>
  <li>先处理焦点，再设置aria-hidden="true"</li>
 </ul>
 <p><strong>代码示例</strong>：</p>
 <pre><code class="language-javascript">closePreviewModal: function() {
    // 确保焦点不留在隐藏的元素中
    const focusedElement = document.activeElement;
    if (this.DOM.previewModal.contains(focusedElement)) {
        // 将焦点移到页面主体
        document.body.focus();
    }
  
    this.DOM.previewModal.classList.remove('show');
    this.DOM.previewModal.setAttribute('aria-hidden', 'true');
    // 等待动画完成后隐藏
    setTimeout(() =&gt; {
        this.DOM.previewModal.style.display = 'none';
        // 清除当前图标数据
        this.currentIconData = null;
    }, 300);
},
</code></pre>
</details>
<h3 id="3--字体加载问题">3. 字体加载问题</h3>
<p><strong>问题表现</strong>：网站加载时，浏览器控制台显示字体加载失败的错误，提示"Failed to load resource: net::ERR_CONNECTION_CLOSED"。</p>
<p><strong>技术原因</strong>：使用的国内一些字体库连接不稳定，导致字体无法正常加载，影响网站的视觉效果。</p>
<details>
 <summary>解决思路</summary>
 <p><strong>解决思路</strong>：</p>
 <ul>
  <li>尝试使用其他国内字体源，如百度字体库、360字体库、字节跳动</li>
  <li>最终选择使用Google Fonts官方CDN，虽然在国内可能有一些延迟，但稳定性更高</li>
 </ul>
 <p><strong>代码示例</strong>：</p>
 <pre><code class="language-html">&lt;link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&amp;family=Poppins:wght@400;500;600;700&amp;display=swap"&gt;
</code></pre>
</details>
<h3 id="4--表单重复提交问题">4. 表单重复提交问题</h3>
<p><strong>问题表现</strong>：用户提交表单后刷新页面，会导致表单重复提交，可能造成重复数据或其他意外行为。</p>
<p><strong>技术原因</strong>：传统的表单提交方式会在页面刷新时重新发送请求，导致重复提交。</p>
<details>
 <summary>解决思路</summary>
 <p><strong>解决思路</strong>：</p>
 <ul>
  <li>实现PRG（Post-Redirect-Get）模式</li>
  <li>使用会话存储消息，重定向后显示</li>
  <li>确保表单提交后不会因为刷新而重复提交</li>
 </ul>
 <p><strong>代码示例</strong>：</p>
 <pre><code class="language-php">if ($successCount &gt; 0) {
    $_SESSION['message'] = '成功添加 ' . $successCount . ' 个SVG图标！';
    // 重定向到同一个页面，防止重复提交
    header('Location: ' . $_SERVER['PHP_SELF']);
    exit;
}
</code></pre>
</details>
<h2 id="结语">结语</h2>
<p>SVG图标库是一个简洁、高效的工具，解决了前端开发中图标管理的实际问题。通过模块化的代码结构、现代化的UI设计、完善的功能实现以及与Cloudflare的兼容性优化，它为用户提供了一个高效、可靠的SVG图标管理解决方案。</p>
<div class="vditor-render-wrapper">
 <code class="language-halo">git:[@github/NoEggEgg/svg-icon-library] </code>
</div>]]></description><guid isPermaLink="false">/archives/a-concise-and-efficient-svg-icon-library</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F03%2F1772341511534.webp&amp;size=m" type="image/jpeg" length="32972"/><category>技巧</category><category>分享</category><pubDate>Sun, 1 Mar 2026 05:17:00 GMT</pubDate></item><item><title><![CDATA[告别重复劳动！一键填充评论的神奇书签脚本]]></title><link>https://wuqishi.com/archives/magical-bookmark-script-to-populate-comments-with-one-click</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%91%8A%E5%88%AB%E9%87%8D%E5%A4%8D%E5%8A%B3%E5%8A%A8%EF%BC%81%E4%B8%80%E9%94%AE%E5%A1%AB%E5%85%85%E8%AF%84%E8%AE%BA%E7%9A%84%E7%A5%9E%E5%A5%87%E4%B9%A6%E7%AD%BE%E8%84%9A%E6%9C%AC&amp;url=/archives/magical-bookmark-script-to-populate-comments-with-one-click" width="1" height="1" alt="" style="opacity:0;">
<p>每次在博客留言时都要反复输入昵称、邮箱和网址，是不是觉得很麻烦？今天分享一个我一直在用的「偷懒」神器 —— 一个能自动填写评论信息的浏览器书签脚本。</p>
<h2 id="heading">一、什么是书签脚本？</h2>
<p>浏览器书签不仅能保存网址，还可以保存一段 JavaScript 代码。当你点击这个特殊的书签时，代码就会在当前页面执行。利用这个特性，我们可以创建一键操作的便捷工具。</p>
<h2 id="heading-1">二、快速创建你的自动填充书签</h2>
<ol>
 <li>在浏览器书签栏右键 → 选择「添加网页」</li>
 <li>名称填写：<code>一键评论填充</code></li>
 <li>网址栏粘贴以下代码（​<strong>请先阅读下方的配置说明</strong>）：</li>
</ol>
<pre><code>javascript:(function(){var d={n:'蛋蛋之家',e:'me@wuqishi.com',w:'https://wuqishi.com'},s={n:['#author','input[name="comname"]','#inpName','input[name="author"]','#ds-dialog-name','#name','input[name="nick"]','#comment_author'],e:['#mail','#email','input[name="commail"]','#inpEmail','input[name="email"]','#ds-dialog-email','input[name="mail"]','#comment_email'],w:['#url','input[name="comurl"]','#inpHomePage','#ds-dialog-url','input[name="url"]','input[name="website"]','#website','input[name="link"]','#comment_url']},f=0;for(var t in s)for(var i=0;i&lt;s[t].length;i++)try{var e=document.querySelector(s[t][i]);if(e&amp;&amp;e.tagName==='INPUT'){e.value=d[t];e.dispatchEvent(new Event('input',{bubbles:!0}));e.dispatchEvent(new Event('change',{bubbles:!0}));f++;break}}catch(r){}if(f&gt;0){var m=document.createElement('div');m.textContent='✅ 已填充 '+f+' 项';m.style.cssText='position:fixed;top:20px;right:20px;background:#4CAF50;color:white;padding:12px 24px;border-radius:4px;z-index:999999;font-family:sans-serif;box-shadow:0 2px 10px rgba(0,0,0,0.2);animation:g 3s ease';document.body.appendChild(m);setTimeout(function(){m.remove()},3000);if(!document.querySelector('#x')){var a=document.createElement('style');a.id='x';a.textContent='@keyframes g{0%{opacity:0;transform:translateY(-10px);}15%{opacity:1;transform:translateY(0);}85%{opacity:1;transform:translateY(0);}100%{opacity:0;transform:translateY(-10px);}}';document.head.appendChild(a)}}})()
</code></pre>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F8ltSokQQQInim.webp&amp;size=m" alt="快速创建你的自动填充书签"></p>
<h2 id="heading-2">三、配置说明（重要！）</h2>
<p>在使用前，你需要修改代码开头的个人信息：</p>
<pre><code>var d={
    n:'蛋蛋之家',              // 改成你的昵称
    e:'me@wuqishi.com',       // 改成你的邮箱
    w:'https://wuqishi.com'    // 改成你的网站
}
</code></pre>
<p>将 <code>蛋蛋之家</code>​、<code>me@wuqishi.com</code>​、<code>https://wuqishi.com</code>分别替换为你自己的昵称、邮箱和网址。</p>
<h2 id="heading-3">四、这个脚本有什么特点？</h2>
<h3 id="1-">1. 智能匹配多种博客系统</h3>
<p>脚本内置了多种常见博客评论框的选择器，包括：</p>
<ul>
 <li>WordPress 默认评论框</li>
 <li>Typecho 评论系统</li>
 <li>Hexo 常见主题</li>
 <li>Disqus 评论插件</li>
 <li>以及各种自定义的评论表单</li>
</ul>
<h3 id="2-">2. 友好的视觉反馈</h3>
<p>成功填充后，页面右上角会显示绿色提示框，显示已填充的项数，3秒后自动消失。</p>
<h3 id="3-">3. 触发表单事件</h3>
<p>不仅填充值，还会触发 <code>input</code>​和 <code>change</code>事件，确保一些依赖这些事件的表单验证能够正常工作。</p>
<h3 id="4-">4. 安全可靠</h3>
<ul>
 <li>只在前端操作，不会上传你的信息</li>
 <li>有错误处理机制，避免脚本崩溃</li>
 <li>只操作 INPUT 元素，不会误改其他内容</li>
</ul>
<h2 id="heading-4">五、工作原理简析</h2>
<p>脚本的核心逻辑很巧妙：</p>
<ol>
 <li>​<strong>数据准备</strong>：定义个人信息和常见选择器</li>
 <li>​<strong>智能查找</strong>：按顺序尝试各种可能的选择器</li>
 <li>​<strong>安全填充</strong>：找到匹配的输入框后填充并触发事件</li>
 <li>​<strong>结果反馈</strong>：统计成功数并显示提示</li>
</ol>
<h2 id="heading-5">六、使用场景与技巧</h2>
<h3 id="heading-6">适用场景：</h3>
<ul>
 <li>经常在多个博客留言的创作者</li>
 <li>需要测试评论功能的前端开发者</li>
 <li>喜欢在不同平台交流的技术爱好者</li>
</ul>
<h3 id="heading-7">实用技巧：</h3>
<ol>
 <li>​<strong>创建多个版本</strong>：可以创建不同身份的书签，用于不同场景</li>
 <li>​<strong>定期更新选择器</strong>：遇到无法填充的博客，可以查看其表单元素并添加对应选择器</li>
 <li>​<strong>配合其他脚本</strong>：可以与自动填充评论内容的脚本结合使用</li>
</ol>
<h2 id="heading-8">七、进阶思考</h2>
<p>这个脚本虽然简单，但体现了「自动化」的核心思想 —— 将重复的操作交给代码。其实很多日常工作都可以通过类似的小工具来提升效率：</p>
<ul>
 <li>表单自动填充</li>
 <li>页面信息提取</li>
 <li>批量操作自动化</li>
</ul>
<p>技术应该服务于人，让人从重复劳动中解放出来，专注于更有价值的事情。</p>
<h2 id="heading-9">八、注意事项</h2>
<ol>
 <li>​<strong>仅在信任的网站使用</strong>，避免在不安全的网站执行任何脚本</li>
 <li>​<strong>及时更新选择器</strong>，新的博客系统可能需要添加新的选择器</li>
 <li>​<strong>做好备份</strong>，浏览器书签同步是个好习惯</li>
</ol>
<h2 id="heading-10">结语</h2>
<p>在马年的新春里，愿这个小工具能像一匹快马，助你在博客的世界里畅行无阻。技术存在的意义就是让生活更简单，让交流更顺畅。</p>
<p>现在就去创建属于你自己的「一键填充」书签吧！如果在使用中遇到问题，或者有更好的选择器建议，欢迎在评论区交流分享。</p>
<p><strong>让代码代替重复，让思考创造价值。</strong></p>]]></description><guid isPermaLink="false">/archives/magical-bookmark-script-to-populate-comments-with-one-click</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F8ltSokQQQInim.webp&amp;size=m" type="image/jpeg" length="7910"/><category>技巧</category><pubDate>Tue, 24 Feb 2026 05:31:52 GMT</pubDate></item><item><title><![CDATA[解锁思源笔记的隐藏力量：siyuan-patch 深度体验与技术实现]]></title><link>https://wuqishi.com/archives/unlocking-the-hidden-power-of-siyuan-notes-siyuanpatch-indepth-experience-and-technical</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E8%A7%A3%E9%94%81%E6%80%9D%E6%BA%90%E7%AC%94%E8%AE%B0%E7%9A%84%E9%9A%90%E8%97%8F%E5%8A%9B%E9%87%8F%EF%BC%9Asiyuan-patch%20%E6%B7%B1%E5%BA%A6%E4%BD%93%E9%AA%8C%E4%B8%8E%E6%8A%80%E6%9C%AF%E5%AE%9E%E7%8E%B0&amp;url=/archives/unlocking-the-hidden-power-of-siyuan-notes-siyuanpatch-indepth-experience-and-technical" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p>本文基于 <a href="https://github.com/demoshang/siyuan-patch">siyuan-patch</a>项目，旨在探讨如何通过补丁技术解锁思源笔记的更多可能性。请注意，本文仅作技术探讨，请遵守相关法律法规。</p>
</blockquote>
<h2 id="vip">引言：当开源遇上“本地VIP”</h2>
<p>思源笔记（SiYuan）作为一款优秀的开源知识管理工具，以其强大的块级编辑和双向链接功能深受用户喜爱。然而，官方版本中部分高级功能（如第三方云同步、PDF导出水印等）通常需要订阅会员才能使用。对于追求极致本地化或希望自定义同步方案的用户来说，这无疑是一道门槛。</p>
<p>siyuan-patch 项目正是为了解决这一痛点而生。它通过技术手段，在不破坏软件核心功能的前提下，解锁了部分原本需要付费才能使用的特性，让用户能够更自由地掌控自己的数据。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2FYDKkCXHp1gzIH.webp&amp;size=m" alt="思源笔记中编辑文章"></p>
<h2 id="heading">核心功能：解锁了什么？</h2>
<p>根据项目文档，该补丁主要实现了以下关键功能的解锁：</p>
<ol>
 <li>
  <p>​<strong>本地VIP权限</strong>：解锁了官方原本限制的VIP功能，如高级导出、搜索资源文件内容等。</p>
 </li>
 <li>
  <p>​<strong>第三方同步支持</strong>：支持使用第三方 S3 或 WebDAV 服务进行数据同步和备份（注意：不支持坚果云）。</p>
 </li>
 <li>
  <p>​<strong>隐私与体验优化</strong>：</p>
  <ul>
   <li>默认关闭了 Google Analytics 和自动上传报错信息，保护用户隐私。</li>
   <li>默认关闭自动下载更新安装包，避免意外更新导致补丁失效。</li>
   <li>支持点击关闭按钮后缩小到托盘，提升操作体验。</li>
  </ul>
 </li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2FzGPgyoHp4dvqo.webp&amp;size=m" alt="WebDAV可以使用了"></p>
<h2 id="heading-1">技术实现：补丁的艺术</h2>
<p>该项目并非简单的破解，而是基于对思源笔记客户端（Electron应用）的深度分析。通过修改渲染进程（Renderer）中的特定逻辑，绕过了官方的权限校验机制。这种“打补丁”的方式，相比直接修改源码，具有更高的灵活性和兼容性。</p>
<h3 id="heading-2">技术实现原理</h3>
<ol>
 <li>​<strong>目标定位</strong>：思源笔记是基于 Electron 开发的桌面应用。该补丁主要针对渲染进程（负责界面显示和交互）中的 JavaScript 代码进行拦截和修改。</li>
 <li>​<strong>Hook 机制</strong>​：通过修改 Electron 的启动参数或注入脚本，在应用启动时加载自定义的补丁代码。这些代码会重写（Override）原有的函数，例如将 <code>isPro</code>​或 <code>isPaid</code>​等权限校验函数的返回值强制改为 <code>true</code>。</li>
 <li>​<strong>文件替换</strong>​：对于某些版本，补丁可能直接替换了应用目录下的 <code>app.asar</code>​文件（Electron 应用的打包文件）中的特定模块，或者修改了 <code>package.json</code>中的启动脚本。</li>
</ol>
<h2 id="heading-3">使用指南：如何安全部署</h2>
<h3 id="heading-4">前提条件</h3>
<ul>
 <li>已安装官方版本的思源笔记（建议关闭自动更新）。</li>
 <li>下载 siyuan-patch 项目中的对应版本补丁文件（通常为 .asar 文件或脚本文件）。</li>
</ul>
<h3 id="heading-5">详细安装步骤</h3>
<p><strong>步骤 1：备份原始文件</strong></p>
<p>在操作前，务必备份思源笔记的安装目录。对于 Windows 用户，路径通常为 <code>C:\Users\[用户名]\AppData\Local\Programs\SiYuan</code>​；对于 macOS 用户，路径通常为 <code>/Applications/SiYuan.app/Contents/Resources</code>​。备份 <code>app.asar</code>文件，这是核心资源文件。</p>
<p><strong>步骤 2：应用补丁</strong></p>
<p>根据补丁类型，操作分为两种模式：</p>
<ul>
 <li>
  <p><strong>模式 A：替换 .asar 文件（常见）</strong></p>
  <ol>
   <li>关闭思源笔记进程。</li>
   <li>将下载的补丁文件（如 <code>app.asar</code>​）复制到思源笔记的安装目录下的 <code>resources</code>​文件夹中，覆盖原有的 <code>app.asar</code>文件。</li>
   <li>重新启动思源笔记。</li>
  </ol>
 </li>
 <li>
  <p><strong>模式 B：使用脚本或命令行参数（高级）</strong></p>
  <ol>
   <li>如果补丁提供的是脚本（如 .bat 或 .sh），右键以管理员权限运行该脚本。</li>
   <li>如果补丁要求修改启动参数，需要在思源笔记的快捷方式属性中，在“目标”字段末尾添加补丁指定的参数（如 <code>--disable-gpu-sandbox</code>等，具体视补丁说明而定）。</li>
  </ol>
 </li>
</ul>
<p><strong>步骤 3：验证安装</strong></p>
<p>启动思源笔记后，检查以下功能是否已解锁：</p>
<ul>
 <li>点击菜单栏的“关于”，查看是否显示“已激活”或“Pro”状态。</li>
 <li>尝试导出 PDF，检查是否不再有水印。</li>
 <li>尝试使用第三方同步（如 WebDAV），检查是否不再提示需要会员。</li>
</ul>
<blockquote>
 <p>当然你也可以直接下载项目里构建好的软件直接使用。</p>
</blockquote>
<h3 id="heading-6">可能遇到的问题及解决方案</h3>
<ol>
 <li>
  <p><strong>问题：应用闪退或无法启动</strong></p>
  <ul>
   <li>
    <p>​<strong>原因</strong>：补丁版本与思源笔记版本不匹配，或者补丁文件损坏。</p>
   </li>
   <li>
    <p>​<strong>解决方案</strong>：</p>
    <ul>
     <li>恢复备份的原始 <code>app.asar</code>文件，确保应用能正常启动。</li>
     <li>检查你下载的思源笔记版本号（如 v3.0.10），下载对应版本的补丁文件。不要跨大版本使用补丁。</li>
     <li>重新下载补丁文件，确保下载完整。</li>
    </ul>
   </li>
  </ul>
 </li>
 <li>
  <p><strong>问题：补丁应用后功能未生效（仍提示需要会员）</strong></p>
  <ul>
   <li>
    <p>​<strong>原因</strong>：补丁未成功加载，或者应用缓存未清除。</p>
   </li>
   <li>
    <p>​<strong>解决方案</strong>：</p>
    <ul>
     <li>清除缓存：关闭思源笔记，删除用户数据目录下的 <code>temp</code>​和 <code>cache</code>​文件夹（路径通常在 <code>用户目录/.siyuan/</code>下），然后重启。</li>
     <li>检查权限：在 Windows 系统下，如果直接覆盖文件失败，可能是权限不足。请关闭思源笔记后，右键点击补丁文件或脚本，选择“以管理员身份运行”。</li>
     <li>杀毒软件拦截：部分杀毒软件（如 Windows Defender、360 等）可能会将补丁文件误报为病毒并隔离。需要在杀毒软件中恢复文件或添加信任。</li>
    </ul>
   </li>
  </ul>
 </li>
 <li>
  <p><strong>问题：同步功能异常或数据丢失</strong></p>
  <ul>
   <li>
    <p>​<strong>原因</strong>：补丁修改了同步逻辑，或者与官方服务器通信时出现校验错误。</p>
   </li>
   <li>
    <p>​<strong>解决方案</strong>：</p>
    <ul>
     <li>数据安全第一：在使用补丁进行第三方同步（如自建 S3）前，务必在官方版本中先进行完整的数据备份（导出 .sy.zip 文件）。</li>
     <li>配置检查：如果使用 WebDAV 同步，请确保服务器地址、用户名和密码填写正确，且服务器支持 WebDAV 协议。</li>
    </ul>
   </li>
  </ul>
 </li>
 <li>
  <p><strong>问题：系统提示“文件正在被使用”无法覆盖</strong></p>
  <ul>
   <li>
    <p>​<strong>原因</strong>：思源笔记进程未完全退出。</p>
   </li>
   <li>
    <p>​<strong>解决方案</strong>：</p>
    <ul>
     <li>打开任务管理器（Ctrl+Shift+Esc），结束所有名为 SiYuan 或 electron 的进程。</li>
     <li>或者重启电脑后再进行操作。</li>
    </ul>
   </li>
  </ul>
 </li>
</ol>
<h2 id="heading-7">风险与思考</h2>
<ul>
 <li>​<strong>稳定性风险</strong>：非官方补丁可能无法保证与官方最新版本的完全兼容，建议在稳定版本上使用。非官方补丁可能导致应用崩溃、数据损坏或功能异常。建议仅在测试环境或非重要数据上使用。</li>
 <li>​<strong>安全风险</strong>：使用第三方修改的软件存在潜在的安全隐患，请从可信渠道下载。从第三方渠道下载的补丁文件可能包含恶意代码。请务必从可信来源（如项目的 GitHub Releases）下载，并在安装前使用杀毒软件扫描。</li>
 <li>​<strong>法律与道德</strong>：虽然思源笔记是开源软件，但解锁付费功能可能涉及版权问题。建议用户根据自身需求权衡利弊，支持正版软件的发展。解锁付费功能可能违反软件的使用协议。请尊重开发者的劳动成果，在条件允许时支持正版。</li>
</ul>
<h2 id="heading-8">结语</h2>
<p>siyuan-patch 项目展示了开源社区对软件自由度的追求。它让用户能够根据自己的需求定制软件行为，而不是被动接受软件的限制。对于技术爱好者或对数据隐私有极高要求的用户来说，这无疑是一个值得尝试的解决方案。</p>
<p>​<strong>最后提醒</strong>：技术是一把双刃剑，请合理使用，并尊重开发者的劳动成果。</p>]]></description><guid isPermaLink="false">/archives/unlocking-the-hidden-power-of-siyuan-notes-siyuanpatch-indepth-experience-and-technical</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2FYDKkCXHp1gzIH.webp&amp;size=m" type="image/jpeg" length="84724"/><category>技巧</category><category>分享</category><pubDate>Fri, 13 Feb 2026 05:14:00 GMT</pubDate></item><item><title><![CDATA[Oracle Cloud 自救指南：旧手机丢失后如何绕过 MFA 重新登录【更新2026年最新政策】]]></title><link>https://wuqishi.com/archives/oracle-cloud-selfrescue-guide-how-to-bypass-mfa-and-log-in-again</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Oracle%20Cloud%20%E8%87%AA%E6%95%91%E6%8C%87%E5%8D%97%EF%BC%9A%E6%97%A7%E6%89%8B%E6%9C%BA%E4%B8%A2%E5%A4%B1%E5%90%8E%E5%A6%82%E4%BD%95%E7%BB%95%E8%BF%87%20MFA%20%E9%87%8D%E6%96%B0%E7%99%BB%E5%BD%95%E3%80%90%E6%9B%B4%E6%96%B02026%E5%B9%B4%E6%9C%80%E6%96%B0%E6%94%BF%E7%AD%96%E3%80%91&amp;url=/archives/oracle-cloud-selfrescue-guide-how-to-bypass-mfa-and-log-in-again" width="1" height="1" alt="" style="opacity:0;">
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F1770792091124.webp&amp;size=m" alt="Oracle" width="1410px">
</figure>
<h2 style="" id="%E5%BC%95%E8%A8%80%EF%BC%9A%E5%BD%93%E2%80%9C%E5%AE%89%E5%85%A8%E2%80%9D%E5%8F%98%E6%88%90%E2%80%9C%E6%9E%B7%E9%94%81%E2%80%9D">引言：当“安全”变成“枷锁”</h2>
<p style="">在数字化时代，多因素身份验证（MFA）是保护账户安全的重要屏障。然而，当你的旧手机意外丢失、损坏，或者更换新设备时忘记迁移 Oracle Authenticator 应用，这道屏障就会瞬间变成一堵无法逾越的高墙。</p>
<p style="">如果你正因无法登录 Oracle Cloud 而焦头烂额，别担心，这篇文章将为你提供一个无需联系客服、无需漫长等待的“自救”方案。</p>
<h2 style="" id="%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86%EF%BC%9A%E5%88%A9%E7%94%A8-idcs-%E7%AE%A1%E7%90%86%E6%8E%A7%E5%88%B6%E5%8F%B0">核心原理：利用 IDCS 管理控制台</h2>
<p style="">Oracle Cloud 的身份验证通常由 Oracle Identity Cloud Service (IDCS) 管理。当你无法通过 MFA 验证时，可以通过直接访问 IDCS 的管理控制台来临时禁用 MFA 或生成绕过代码。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2FClqRnfQc23wpc.webp&amp;size=m" alt="利用 IDCS 管理控制台" width="1410px">
 <figcaption data-placeholder="添加描述" style="width: 1410px; max-width: 100%; text-align: center;">管理控制台界面</figcaption>
</figure>
<h2 style="" id="%E8%AF%A6%E7%BB%86%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A4">详细操作步骤</h2>
<h3 style="" id="%E7%AC%AC%E4%B8%80%E6%AD%A5%EF%BC%9A%E8%8E%B7%E5%8F%96%E4%BD%A0%E7%9A%84-idcs-%E5%AE%9E%E4%BE%8B-url">第一步：获取你的 IDCS 实例 URL</h3>
<ol>
 <li>
  <p style="">打开 Oracle Cloud 登录页面（通常是 <code>https://cloud.oracle.com</code>）。</p>
 </li>
 <li>
  <p style="">在输入邮箱和密码的界面，<strong>不要点击登录</strong>。</p>
 </li>
 <li>
  <p style="">查看浏览器地址栏，找到以 <code>https://idcs-********.identity.oraclecloud.com/</code>开头的网址，并完整记录下来。</p>
 </li>
</ol>
<h3 style="" id="%E7%AC%AC%E4%BA%8C%E6%AD%A5%EF%BC%9A%E6%9E%84%E9%80%A0%E7%AE%A1%E7%90%86%E9%A1%B5%E9%9D%A2-url">第二步：构造管理页面 URL</h3>
<p style="">将第一步记录的 URL 进行修改，构造出可以直接访问 MFA 管理页面的地址。</p>
<p style=""><strong>原始 URL 示例：</strong></p>
<pre><code>https://idcs-xxxxx.identity.oraclecloud.com/
</code></pre>
<p style=""><strong>修改后的 URL 示例：</strong></p>
<pre><code>https://idcs-xxxxx.identity.oraclecloud.com/ui/v1/myconsole?root=my-info&amp;my-info=my_profile_security
</code></pre>
<p style=""><em>注意：请将</em> *<code>xxxxx</code>*<em>替换为你实际记录的数字或字符。</em></p>
<h3 style="" id="%E7%AC%AC%E4%B8%89%E6%AD%A5%EF%BC%9A%E7%AE%A1%E7%90%86-mfa-%E8%AE%BE%E7%BD%AE">第三步：管理 MFA 设置</h3>
<ol>
 <li>
  <p style="">在浏览器中打开修改后的新 URL。</p>
 </li>
 <li>
  <p style="">页面加载后，你应该能看到 <strong>“Multi-Factor Authentication”</strong> 或 <strong>“Security”</strong> 相关的管理选项。</p>
 </li>
 <li>
  <p style="">根据你的需求选择以下操作之一：</p>
  <ul>
   <li>
    <p style=""><strong>临时禁用 MFA</strong>：找到开关选项，暂时关闭 MFA 验证。 <strong>（强烈建议登录后立即重新开启）</strong></p>
   </li>
   <li>
    <p style=""><strong>生成绕过代码</strong>：如果系统支持，生成一次性使用的绕过代码，用于本次登录。</p>
   </li>
   <li>
    <p style=""><strong>重新配置验证器</strong>：删除旧的验证器绑定，并重新扫描二维码绑定新设备。</p>
   </li>
  </ul>
 </li>
</ol>
<h3 style="" id="%E7%AC%AC%E5%9B%9B%E6%AD%A5%EF%BC%9A%E9%87%8D%E6%96%B0%E7%99%BB%E5%BD%95%E5%B9%B6%E5%8A%A0%E5%9B%BA%E5%AE%89%E5%85%A8">第四步：重新登录并加固安全</h3>
<p style="">成功进入控制台后，请务必执行以下操作，以防未来再次陷入困境：</p>
<ol>
 <li>
  <p style=""><strong>重新启用 MFA</strong>：如果你选择了临时禁用，请立即重新启用。</p>
 </li>
 <li>
  <p style=""><strong>生成备用代码</strong>：在 MFA 设置中，找到“生成备用代码”或“Bypass Codes”选项，生成一组代码并安全保存（建议打印或存储在密码管理器中）。</p>
 </li>
 <li>
  <p style=""><strong>绑定备用设备</strong>：如果条件允许，将 Oracle Authenticator 绑定到两台设备上（如手机和平板）。</p>
 </li>
</ol>
<h2 style="" id="%E9%A3%8E%E9%99%A9%E6%8F%90%E7%A4%BA%E4%B8%8E%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">风险提示与最佳实践</h2>
<ul>
 <li>
  <p style=""><strong>安全风险</strong>：绕过 MFA 会暂时降低账户的安全性。请确保在操作过程中没有可疑的网络环境，操作完成后立即恢复安全设置。</p>
 </li>
 <li>
  <p style=""><strong>数据备份</strong>：定期导出 Oracle Authenticator 的密钥或使用支持云同步的验证器应用（如 Microsoft Authenticator、Authy），避免单点故障。</p>
 </li>
 <li>
  <p style=""><strong>官方支持</strong>：如果上述方法因权限或配置问题无法生效，最后的途径是联系 Oracle 官方支持，通过验证身份信息来重置 MFA。</p>
 </li>
</ul>
<h2 style="" id="%E6%80%BB%E7%BB%93">总结</h2>
<p style="">技术故障并不可怕，可怕的是失去对系统的控制权。通过上述 URL 构造技巧，你可以快速夺回 Oracle Cloud 的访问权限。记住，<strong>安全工具是为你服务的，而不是束缚你的</strong>。希望这篇指南能帮你顺利“回家”。</p>
<hr>
<p style=""><em>本文基于 Oracle Cloud Infrastructure 官方文档及社区实践经验整理，具体界面可能因版本更新略有差异。</em></p>
<hr>
<h2 style="" id="2026%E5%B9%B44%E6%9C%8813%E6%97%A5%E6%9B%B4%E6%96%B0">2026年4月13日更新</h2>
<p style="">根据评论反馈，我又去查了一下Oracle的官方政策。</p>
<p style="">两步验证信息官方地址：</p>
<p style=""><hyperlink-inline-card target="_blank" href="https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/signinginIdentityDomain.htm#faq_identity_2_step_verification_and_alternate_login" theme="inline" custom-title="Troubleshooting Signing In to the Console" custom-description="Get help signing in to the Oracle Cloud Console."><a href="https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/signinginIdentityDomain.htm#faq_identity_2_step_verification_and_alternate_login" target="_blank">https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/signinginIdentityDomain.htm#faq_identity_2_step_verification_and_alternate_login</a></hyperlink-inline-card></p>
<p style="">其中有：</p>
<pre><code class="language-text">Resetting MFA Factors for Your Account
重置您帐户的多因素身份验证 (MFA) 因素</code></pre>
<p style="">答复是：</p>
<pre><code class="language-text">If you need the MFA factors reset for your account, for example if you lost your device or deleted the app from your phone, you must contact an administrator to reset them for you. 
如果您需要重置帐户的多因素身份验证 (MFA) 因素，例如您的设备丢失或从手机中删除了应用程序，则必须联系管理员为您重置。</code></pre>
<p style="">我在其中找到：</p>
<pre><code class="language-text">Contacting Support When Not Signed In to the Oracle Cloud Console
未登录 Oracle 云控制台时如何联系支持人员</code></pre>
<p style="">步骤如下：</p>
<ol>
 <li>
  <p style="">Go to the <a href="https://www.oracle.com/corporate/contact/">Contact us</a> page.
   <br>
   请前往 “联系我们” 页面。</p>
 </li>
 <li>
  <p style="">Select <strong>Open a live chat</strong> link located under <strong>Chat with Oracle Sales</strong>.
   <br>
   选择“打开与 Oracle 销售人员聊天” 下方的在线聊天链接。</p>
 </li>
 <li>
  <p style="">In the <strong>Oracle Chatbot</strong>, select <strong>Get Support</strong>.
   <br>
   在 Oracle 聊天机器人中，选择 “获取支持” 。</p>
 </li>
 <li>
  <p style="">Select the type of support you need, for example, <strong>Cloud Infrastructure (OCI) including Free Trial</strong>.
   <br>
   选择您需要的支持类型，例如云基础设施 (OCI)，包括免费试用 。</p>
 </li>
 <li>
  <p style="">From the chat response select <strong>Cloud Support Chat</strong>.
   <br>
   从聊天回复中选择云支持聊天 。</p>
 </li>
 <li>
  <p style="">Select a <strong>Country/Region</strong>, enter your <strong>Email Address</strong>, and then start the chat.
   <br>
   选择国家/地区 ，输入您的电子邮件地址 ，然后开始聊天。</p>
 </li>
</ol>
<p style="">具体地址是：</p>
<hyperlink-card target="_blank" href="https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/signinginIdentityDomain.htm#faq_how_do_i_contact_support" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="Troubleshooting Signing In to the Console" custom-description="Get help signing in to the Oracle Cloud Console."><a href="https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/signinginIdentityDomain.htm#faq_how_do_i_contact_support" target="_blank">https://docs.oracle.com/en-us/iaas/Content/GSG/Tasks/signinginIdentityDomain.htm#faq_how_do_i_contact_support</a></hyperlink-card>
<hr>
<p style="">以上，诸君共勉~</p>]]></description><guid isPermaLink="false">/archives/oracle-cloud-selfrescue-guide-how-to-bypass-mfa-and-log-in-again</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F1770792091124.webp&amp;size=m" type="image/jpeg" length="15447"/><category>技巧</category><category>分享</category><pubDate>Wed, 11 Feb 2026 06:43:00 GMT</pubDate></item><item><title><![CDATA[本站已加入“萌国ICP备案”联萌！😄]]></title><link>https://wuqishi.com/archives/joined-the-moe-icp-registration-lianmeng</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%9C%AC%E7%AB%99%E5%B7%B2%E5%8A%A0%E5%85%A5%E2%80%9C%E8%90%8C%E5%9B%BDICP%E5%A4%87%E6%A1%88%E2%80%9D%E8%81%94%E8%90%8C%EF%BC%81%F0%9F%98%84&amp;url=/archives/joined-the-moe-icp-registration-lianmeng" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F1770528159260.webp&amp;size=m" alt="萌国ICP备案"></p>
<h2 id="icp">什么是“萌国ICP备案”？</h2>
<p>“萌国ICP备案”（简称“萌备”）并非中国工信部官方认可的备案，而是一个​<strong>非官方的、基于兴趣爱好的虚拟备案系统</strong>。它主要流行于个人站长、二次元文化爱好者或使用海外服务器（无需国内备案）的网站中，用于在网站页脚添加一个“萌ICP备”的链接，增加趣味性。</p>
<blockquote>
 <p>​<strong>官方口号</strong>：我们与世无争，与人无碍，不爱也请别伤害。</p>
</blockquote>
<h2 id="heading">为什么要加入“萌备”？</h2>
<p>对于使用海外服务器（如GitHub Pages、Vercel等）搭建的个人博客或网站，由于服务器不在中国大陆，<strong>无法进行工信部官方备案</strong>。为了给网站一个“身份标识”，也为了在页脚增加一点趣味性，许多站长会选择加入“萌国ICP备案”。</p>
<h2 id="icp-1">它与官方ICP备案的区别</h2>
<table>
 <thead>
  <tr>
   <th align="center">对比项</th>
   <th>萌国ICP备案</th>
   <th>中国工信部ICP备案</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td align="center">法律效力</td>
   <td><strong>无</strong>，纯属娱乐</td>
   <td><strong>有</strong>，是网站在中国大陆合法运营的强制要求</td>
  </tr>
  <tr>
   <td align="center">管理机构</td>
   <td>非官方组织（icp.gov.moe）</td>
   <td>中华人民共和国工业和信息化部</td>
  </tr>
  <tr>
   <td align="center">备案号格式</td>
   <td>萌ICP备20262754号</td>
   <td>省简称+ICP备XXXXXXXX号</td>
  </tr>
  <tr>
   <td align="center">查询平台</td>
   <td><a href="https://icp.gov.moe">https://icp.gov.moe</a></td>
   <td><a href="https://beian.miit.gov.cn">https://beian.miit.gov.cn</a></td>
  </tr>
  <tr>
   <td align="center">作用</td>
   <td>网站趣味装饰、同好标识</td>
   <td>网站合法身份证明、监管依据</td>
  </tr>
 </tbody>
</table>
<h2 id="icp-2">如何申请“萌国ICP备案”？</h2>
<p>申请流程非常简单，全程在线操作，无需提交身份证件或等待审核：</p>
<ol>
 <li>​<strong>访问官网</strong>：打开萌国ICP备案查询系统（https://icp.gov.moe）。</li>
 <li><strong>申请备案</strong>：点击下方“加入”，选择一个自己喜欢的号码（通常为8-10位数字，如20262574）。</li>
 <li>​<strong>填写信息</strong>：输入你的网站名称、域名、首页地址以及你的邮箱。</li>
 <li><strong>获取代码</strong>：申请通过后，系统会生成一段HTML代码（如 <code>&lt;a href="https://icp.gov.moe/?keyword=20262574" target="_blank"&gt;萌ICP备20262574号&lt;/a&gt;</code>）。</li>
 <li>​<strong>部署网站</strong>：将这段代码添加到你的网站页脚（Footer）中，即可显示备案号。</li>
</ol>
<h2 id="heading-1">本站的“萌备”信息</h2>
<p>本站已成功加入“萌国ICP备案”联萌，备案号如下：</p>
<p><strong><a href="https://icp.gov.moe/?keyword=20262574">萌ICP备20262574号</a></strong></p>
<p>点击备案号即可跳转至萌国备案查询系统，查看本站的备案信息。</p>
<h2 id="heading-2">注意事项</h2>
<ul>
 <li><strong>适用范围</strong>：仅适用于个人博客、兴趣站点或使用海外服务器的网站。</li>
 <li>​<strong>法律效力</strong>​：萌国ICP备案​<strong>不具备法律效力</strong>​，仅供娱乐和同好标识。如果你的网站服务器在中国大陆，<strong>必须</strong>进行工信部官方备案，否则网站会被屏蔽。</li>
 <li>​<strong>查询真伪</strong>：在查询网站备案信息时，请务必以工信部官网（beian.miit.gov.cn）为准，不要将“萌备”误认为是正规备案。</li>
</ul>
<h2 id="heading-3">结语</h2>
<p>加入“萌国ICP备案”是一种次元文化的展现，也是站长们对网络世界的一种浪漫情怀。希望本站的这个小彩蛋能给你带来一丝乐趣！</p>]]></description><guid isPermaLink="false">/archives/joined-the-moe-icp-registration-lianmeng</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F1770528159260.webp&amp;size=m" type="image/jpeg" length="211312"/><category>分享</category><pubDate>Sun, 8 Feb 2026 05:25:58 GMT</pubDate></item><item><title><![CDATA[Excel 月报自动化指南：告别重复劳动，让数据主动为你服务]]></title><link>https://wuqishi.com/archives/excel-monthly-report-automation-guide</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Excel%20%E6%9C%88%E6%8A%A5%E8%87%AA%E5%8A%A8%E5%8C%96%E6%8C%87%E5%8D%97%EF%BC%9A%E5%91%8A%E5%88%AB%E9%87%8D%E5%A4%8D%E5%8A%B3%E5%8A%A8%EF%BC%8C%E8%AE%A9%E6%95%B0%E6%8D%AE%E4%B8%BB%E5%8A%A8%E4%B8%BA%E4%BD%A0%E6%9C%8D%E5%8A%A1&amp;url=/archives/excel-monthly-report-automation-guide" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F1770450047120.webp&amp;size=m" alt="Excel 月报自动化指南：告别重复劳动，让数据主动为你服务"></p>
<p>每月月底，你是否也曾这样加班：</p>
<p>面对满屏数据，手动将公式里的“六月”逐个改为“七月”，键盘声夹杂着叹息，窗外天色早已暗下。这不是你不努力，而是方法该升级了。</p>
<p>事实上，只需掌握几个核心公式，你就能将那些重复、繁琐的操作交给 Excel 自动完成。本文不涉及复杂概念，只分享<strong>即学即用</strong>的实战技巧，帮你每月省下几个小时。</p>
<hr>
<h2 id="-">🔄 痛点一：每月手动调日期，改到眼花手酸</h2>
<p>​<strong>过去的做法</strong>：每月初打开报表，人工查找并修改所有日期相关的公式，例如把“2024-06-01”更新为“2024-07-01”。</p>
<p>​<strong>现在的解法</strong>​：用一个公式实现​<strong>日期自动识别与更新</strong>。</p>
<pre><code>=SUMIFS(销售表!$C:$C, 
        销售表!$A:$A, "&gt;=" &amp; EOMONTH(TODAY(), -1) + 1,
        销售表!$A:$A, "&lt;=" &amp; EOMONTH(TODAY(), 0))
</code></pre>
<p>​<strong>公式拆解</strong>（其实很简单）：</p>
<ul>
 <li>​<code>TODAY()</code>：获取今天日期</li>
 <li>​<code>EOMONTH(TODAY(), -1)</code>：获取上个月的最后一天</li>
 <li>​<code>EOMONTH(TODAY(), -1) + 1</code>​：上个月最后一天 + 1天 = <strong>本月第一天</strong></li>
 <li>​<code>EOMONTH(TODAY(), 0)</code>​：获取<strong>本月最后一天</strong></li>
</ul>
<p>✅ ​<strong>效果</strong>​：无论何时打开工作簿，该公式都会​<strong>自动计算当月数据</strong>。</p>
<p>✅ ​<strong>搭配使用</strong>：</p>
<pre><code>=SUMIFS(销售表!$C:$C, 
        销售表!$A:$A, "&gt;=" &amp; EOMONTH(TODAY(), -2) + 1,
        销售表!$A:$A, "&lt;=" &amp; EOMONTH(TODAY(), -1))
</code></pre>
<p>此公式用于计算<strong>上月同期</strong>数据，便于进行环比分析。</p>
<p>📍 ​<strong>动手试试</strong>：在你现有的月报中，找一个手动输入日期的公式，用上述动态公式替换它。感受一下下个月自动更新的便利。</p>
<hr>
<h2 id="--1">🔍 痛点二：多条件筛选，反复操作效率低</h2>
<p>​<strong>典型场景</strong>：“请统计华东区产品A在三月份的销售额，并扣除退货部分。”</p>
<p>​<strong>传统操作</strong>：分别筛选区域、产品、日期和状态，最后查看合计。</p>
<p>​<strong>高效做法</strong>​：使用 <code>SUMIFS</code>一次性完成多条件汇总。</p>
<pre><code>=SUMIFS(金额列, 
        区域列, "华东",
        产品列, "产品A",
        日期列, "&gt;=2024-03-01",
        日期列, "&lt;=2024-03-31",
        状态列, "&lt;&gt;退货")  /* “&lt;&gt;”表示“不等于” */
</code></pre>
<p>📍 ​<strong>进阶应用</strong>：</p>
<p>若在表格空白区域设置下拉菜单（通过“数据验证”实现），可将公式稍作调整：</p>
<pre><code>=SUMIFS(金额列, 区域列, $G$2, 产品列, $G$3, ...)
</code></pre>
<p>（其中 <code>$G$2</code>​、<code>$G$3</code>为下拉菜单所在单元格）</p>
<p>通过点选下拉菜单，结果实时更新——一个<strong>专属数据查询面板</strong>就此诞生。</p>
<p>💡 ​<strong>小挑战</strong>​：下次遇到多条件汇总时，先别急于点击筛选按钮，尝试用 <code>SUMIFS</code>一次性得出结果，体验“秒出答案”的效率。</p>
<hr>
<h2 id="--2">🧹 痛点三：数据混乱不规范，整理费时费力</h2>
<p>系统导出的数据常伴有各种“顽疾”：</p>
<ul>
 <li>日期格式五花八门</li>
 <li>文本前后存在空格</li>
 <li>多项信息挤在同一单元格</li>
</ul>
<p>​<strong>三个公式，精准清理</strong>：</p>
<p><strong>1. 清除空格与不可见字符</strong></p>
<pre><code>=TRIM(CLEAN(A2))
</code></pre>
<p>​<code>TRIM</code>​去除首尾空格，<code>CLEAN</code>删除非打印字符。</p>
<p><strong>2. 统一日期格式</strong></p>
<pre><code>=IFERROR(DATEVALUE(A2), 
         DATEVALUE(SUBSTITUTE(SUBSTITUTE(A2, "年", "-"), "月", "-")))
</code></pre>
<p>先尝试常规转换，若失败则替换“年月”为“-”后再转换。</p>
<p><strong>3. 拆分合并内容</strong></p>
<p>假设 A2 单元格内容为“北京-朝阳区-销售一部”：</p>
<pre><code>城市: =LEFT(A2, FIND("-", A2) - 1)
区域: =MID(A2, FIND("-", A2) + 1, 
           FIND("-", A2, FIND("-", A2) + 1) - FIND("-", A2) - 1)
部门: =RIGHT(A2, LEN(A2) - FIND("-", A2, FIND("-", A2) + 1))
</code></pre>
<p>将公式向右填充，即可​<strong>快速拆分整列数据</strong>。</p>
<p>📍 ​<strong>经验分享</strong>：你遇到过最棘手的数据清洗问题是什么？是隐藏空格、格式混乱，还是合并单元格？欢迎交流，共同寻找解决方案。</p>
<hr>
<h2 id="--3">🎯 痛点四：海量数据中查找，犹如大海捞针</h2>
<p>“帮我查一下工号10086对应的姓名。”——过去你可能需要在数万行中艰难搜寻。</p>
<p>现在，试试更强大的 <code>XLOOKUP</code>​，它在易用性和功能上都优于经典的 <code>VLOOKUP</code>：</p>
<pre><code>=XLOOKUP(10086, 工号列, 姓名列, "查无此人")
</code></pre>
<p>✅ ​<strong>优势</strong>：</p>
<ol>
 <li>无需指定列号</li>
 <li>支持向左查找</li>
 <li>可自定义查无结果时的提示，而非冷冰冰的 <code>#N/A</code></li>
</ol>
<p>​<strong>多条件查找进阶示例</strong>（例如查找“华东区产品A的价格”）：</p>
<pre><code>=XLOOKUP(1, (区域列 = "华东") * (产品列 = "产品A"), 价格列)
</code></pre>
<p>此公式的精妙之处在于：先分别判断区域和产品条件，得到两组 <code>TRUE/FALSE</code>​数组，相乘后仅当两个条件同时满足时结果为 <code>1</code>，从而精确定位。</p>
<p>💡 ​<strong>动手练习</strong>：在你的数据中找一个需要多条件查找的场景，尝试使用这个“数组乘法”查找法，体验其精准与高效。</p>
<hr>
<h2 id="--4">🚨 痛点五：错误值频现，报表显得不专业</h2>
<p>​<code>#N/A</code>​、<code>#DIV/0!</code>​、<code>#VALUE!</code>……这些错误标志不仅影响美观，还可能降低报表的可信度。</p>
<p>​<strong>一个函数全面防护</strong>​：<code>IFERROR</code></p>
<pre><code>=IFERROR(原公式, "出现错误时希望显示的内容")
</code></pre>
<p>​<strong>应用示例</strong>：</p>
<pre><code>=IFERROR(XLOOKUP(10086, 工号列, 姓名列), "查无此人")
=IF(上月数据 = 0, "（上月无数据）", (本月 - 上月) / 上月)
</code></pre>
<p>​<strong>常见错误快速诊断表</strong>：</p>
<table>
 <thead>
  <tr>
   <th>错误值</th>
   <th>含义</th>
   <th>快速解决方案</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>​<code>#N/A</code></td>
   <td>找不到匹配值</td>
   <td>使用<code>IFERROR</code>包裹公式，或检查查找值是否存在</td>
  </tr>
  <tr>
   <td>​<code>#DIV/0!</code></td>
   <td>除数为零</td>
   <td>添加<code>IF</code>判断分母是否为0</td>
  </tr>
  <tr>
   <td>​<code>#VALUE!</code></td>
   <td>数据类型不匹配</td>
   <td>检查公式中是否存在文本与数值混算的情况</td>
  </tr>
  <tr>
   <td>​<code>#REF!</code></td>
   <td>单元格引用无效</td>
   <td>检查公式引用的单元格是否已被删除</td>
  </tr>
 </tbody>
</table>
<p>📍 ​<strong>花一分钟</strong>​，为你报表中的核心公式穿上 <code>IFERROR</code>的“防护衣”，立刻提升报表的稳健性与专业度。这个习惯，值得拥有。</p>
<hr>
<h2 id="--5">🧩 整合应用：构建你的自动化数据流</h2>
<p>优秀的工具需要正确的使用流程。一个高效的 Excel 数据处理流程，可以按以下步骤搭建：</p>
<p><strong>1. 建立标准化数据源</strong></p>
<ul>
 <li>每列只存储一种信息（例如，省份和城市分两列）</li>
 <li>每行只记录一条数据（避免使用合并单元格）</li>
 <li>严格统一数据格式（日期、数值、文本等各有其规）</li>
</ul>
<p><strong>2. 设置数据清洗区</strong></p>
<p>在独立的工作表中，运用上述清洗公式对原始数据进行预处理。​<strong>务必保留原始数据</strong>，所有清洗操作均在副本上进行。</p>
<p><strong>3. 打造分析仪表板</strong></p>
<p>结合 <code>SUMIFS</code>​、<code>XLOOKUP</code>​及动态日期公式，构建核心分析表格。关键指标可辅以​<strong>条件格式</strong>（例如：达成目标标绿，接近目标标黄，未达标标红），实现视觉化快速洞察。</p>
<p><strong>4. 实现一键刷新</strong></p>
<ul>
 <li>对数据透视表，右键选择“刷新”</li>
 <li>添加切片器，实现图表与控件的联动</li>
 <li>可为关键报表设置刷新按钮，一键更新所有数据</li>
</ul>
<hr>
<h2 id="--6">❓ 常见问题与应对策略</h2>
<p><strong>Q：公式确认无误，但结果错误？</strong></p>
<p>A：很可能是数据类型不一致。使用 <code>=ISNUMBER(A1)</code>​进行检验：返回 <code>TRUE</code>​方为数值。文本型数字可使用 <code>=VALUE(A1)</code>转换。</p>
<p><strong>Q：工作簿运行越来越慢？</strong></p>
<p>A：尽量避免整列引用（如 <code>A:A</code>​），改用实际数据范围（如 <code>A2:A1000</code>​）。也可按 <code>Ctrl + T</code>将区域转换为“表格”，Excel 会自动优化范围管理。</p>
<p><strong>Q：仍需每月手动粘贴新数据？</strong></p>
<p>A：尝试使用【数据】→【获取与转换】→【从文件】功能。首次设置后，后续只需点击“刷新”即可导入最新数据。</p>
<p><strong>Q：能否一键生成并发送报告邮件？</strong></p>
<p>A：可以，这通常需要借助 VBA 宏实现。如果报告需定期发送，投入少许时间学习自动化发送将是值得的（网络上有大量成熟案例可供参考）。</p>
<hr>
<h2 id="--7">💡 最后的话：做工具的主人，而非奴仆</h2>
<p>我也曾以为 Excel 仅是电子化的表格，直到领悟它其实是​<strong>人与数据间的翻译官</strong>。</p>
<p>你将需求告诉它：“请分析华东区上个月产品A的销售情况。”它通过公式“翻译”给计算机，而后将清晰的结果呈现于你面前。</p>
<p>那些看似复杂的公式，不过是更精确的翻译指令。</p>
<p>​<strong>今天，不妨开启一个小改变</strong>：</p>
<ol>
 <li>打开那份令你头疼的月度报表</li>
 <li>找到一个仍需手动更新日期的公式</li>
 <li>用本文的动态日期公式替换它</li>
 <li>填入下月数据，验证其自动更新</li>
</ol>
<p><strong>仅此一步，下个月你便能节省半小时。</strong></p>
<p>此后，你或许会自然而然地着手清理数据、优化查询、美化报表……如同整理房间，从一处开始，逐渐让整个空间清爽有序。</p>
<p><strong>Excel 真正的价值，不在于你记住了多少函数，而在于你通过它自动化了多少重复劳动。</strong> 省下的时间，可用于思考、成长，或享受生活——这才是技术工具应有的意义。</p>]]></description><guid isPermaLink="false">/archives/excel-monthly-report-automation-guide</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F1770450047120.webp&amp;size=m" type="image/jpeg" length="408009"/><category>技巧</category><category>分享</category><pubDate>Sat, 7 Feb 2026 07:49:09 GMT</pubDate></item><item><title><![CDATA[梦呓：为异地女友准备的2周年惊喜礼物]]></title><link>https://wuqishi.com/archives/dreaming-a-2nd-anniversary-surprise-gift-prepared-for-a-long-distance-girlfriend</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%A2%A6%E5%91%93%EF%BC%9A%E4%B8%BA%E5%BC%82%E5%9C%B0%E5%A5%B3%E5%8F%8B%E5%87%86%E5%A4%87%E7%9A%842%E5%91%A8%E5%B9%B4%E6%83%8A%E5%96%9C%E7%A4%BC%E7%89%A9&amp;url=/archives/dreaming-a-2nd-anniversary-surprise-gift-prepared-for-a-long-distance-girlfriend" width="1" height="1" alt="" style="opacity:0;">
<h2 id="一-项目背景与立项动机">一、项目背景与立项动机</h2>
<h3 id="故事的开始">故事的开始</h3>
<p>那是一个春寒料峭的夜晚，我和女友视频聊天时，她突然说："你知道吗？还有不到三个月就是我们在一起2周年了。"</p>
<p>我们是一对异地恋情侣，分隔在两个城市已经一年零九个月。虽然每天都会视频聊天，但距离的隔阂总是让一些情感无法完全传递。</p>
<p>"时间过得真快，感觉我们好像昨天才认识一样。"女友的一句话，像一颗种子，在我心里发了芽。</p>
<h3 id="立项动机">立项动机</h3>
<ul>
 <li><strong>情感连接</strong>：跨越距离的障碍，创造一个只属于我们的虚拟空间</li>
 <li><strong>惊喜准备</strong>：为5月5日的2周年纪念日准备一个特别的礼物</li>
 <li><strong>技术实践</strong>：作为前端开发者，挑战纯前端实现完整应用</li>
 <li><strong>数据隐私</strong>：珍贵的回忆只属于我们，不依赖第三方平台</li>
 <li><strong>长期价值</strong>：不仅是礼物，更是未来持续记录回忆的平台</li>
</ul>
<h3 id="秘密计划">秘密计划</h3>
<p>我决定偷偷地开始这个项目，计划在5月5日我们相恋两周年的那天，给她一个大大的惊喜。从那天起，每天下班后，我都会躲在房间里，对着电脑敲代码，像一个正在准备神秘礼物的工匠。</p>
<p>现在，我正在倒计时——距离5月5日还有XX天。</p>
<h2 id="二-详细的需求分析过程">二、详细的需求分析过程</h2>
<h3 id="功能需求梳理">功能需求梳理</h3>
<p>基于项目的实际功能，我整理了以下需求：</p>
<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>
  <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="技术需求梳理">技术需求梳理</h3>
<ul>
 <li><strong>纯前端实现</strong>：不依赖后端服务器，使用HTML5、CSS3、JavaScript</li>
 <li><strong>本地数据存储</strong>：使用localStorage持久化存储数据</li>
 <li><strong>响应式设计</strong>：适配移动设备和桌面设备</li>
 <li><strong>图片处理</strong>：使用FileReader API处理本地图片上传</li>
 <li><strong>用户体验</strong>：添加平滑动画和过渡效果，优化触摸交互</li>
</ul>
<h3 id="秘密数据收集">秘密数据收集</h3>
<p>为了让网站更有意义，我开始秘密收集我们的回忆：</p>
<ul>
 <li>整理手机里的所有合照，从第一次见面到最近一次分别</li>
 <li>记录所有重要的日期，包括相识日、第一次约会、每个月的纪念日</li>
 <li>回忆我们之间的小故事，准备写成爱情故事</li>
 <li>整理想对她说的话，准备添加到爱情宣言中</li>
</ul>
<h2 id="三-技术栈选型依据与考量">三、技术栈选型依据与考量</h2>
<h3 id="技术选型">技术选型</h3>
<ul>
 <li><strong>HTML5</strong>：构建页面结构，使用语义化标签</li>
 <li><strong>CSS3</strong>：实现样式设计，包括响应式布局和动画效果</li>
 <li><strong>JavaScript (ES6+)</strong>：实现交互逻辑和功能模块</li>
 <li><strong>localStorage</strong>：本地数据存储，持久化保存所有数据</li>
 <li><strong>FileReader API</strong>：处理本地图片上传和预览</li>
</ul>
<h4 id="技术栈选型图">技术栈选型图</h4>
<div class="language-mermaid">graph LR subgraph 前端技术 HTML5[HTML5\n页面结构] CSS3[CSS3\n样式设计] JS[JavaScript\n交互逻辑] end subgraph 浏览器API LS[localStorage\n本地存储] FR[FileReader API\n文件读取] DOM[DOM API\n文档操作] end subgraph 项目特性 RWD[响应式设计] SPA[单页应用] Offline[离线使用] end HTML5 --&gt; RWD CSS3 --&gt; RWD JS --&gt; SPA JS --&gt; Offline LS --&gt; Offline LS --&gt; SPA FR --&gt; SPA DOM --&gt; SPA classDef frontend fill:#f9f,stroke:#333,stroke-width:2px classDef api fill:#bbf,stroke:#333,stroke-width:2px classDef feature fill:#bfb,stroke:#333,stroke-width:2px class HTML5,CSS3,JS frontend class LS,FR,DOM api class RWD,SPA,Offline feature</div>
<p><strong>图2：技术栈选型图</strong> - 展示了爱情纪念网站使用的技术栈及其关系。前端技术（HTML5、CSS3、JavaScript）与浏览器API（localStorage、FileReader API、DOM API）共同支持项目的核心特性，包括响应式设计、单页应用和离线使用能力。</p>
<h3 id="选型考量">选型考量</h3>
<p>为什么选择这些技术？让我用项目的实际需求来解释：</p>
<ul>
 <li><strong>纯前端技术</strong>：满足数据隐私需求，所有数据存储在本地，不依赖外部服务器</li>
 <li><strong>localStorage</strong>：适合存储我们的回忆数据，虽然有5MB的限制，但通过优化可以满足需求</li>
 <li><strong>响应式设计</strong>：确保女友无论是用手机还是电脑，都能完美浏览网站</li>
 <li><strong>FileReader API</strong>：支持本地图片上传，不需要后端服务器处理</li>
 <li><strong>原生JavaScript</strong>：轻量高效，加载速度快，适合作为惊喜礼物</li>
</ul>
<h3 id="技术架构">技术架构</h3>
<p>项目采用模块化的JavaScript架构，将功能划分为多个独立模块：</p>
<ul>
 <li>DataStorage：处理本地数据存储</li>
 <li>TimeCalculator：处理时间计算和显示</li>
 <li>timelineModule：处理时间轴功能</li>
 <li>photoWallModule：处理照片墙功能</li>
 <li>anniversaryModule：处理纪念日功能</li>
 <li>storyModule：处理爱情故事功能</li>
 <li>declarationModule：处理爱情宣言功能</li>
</ul>
<h4 id="项目架构图">项目架构图</h4>
<div class="language-mermaid">graph TD subgraph 用户界面层 UI[用户界面] end subgraph 模块层 TM[timelineModule\n时间轴模块] PTM[photoWallModule\n照片墙模块] AM[anniversaryModule\n纪念日模块] SM[storyModule\n爱情故事模块] DM[declarationModule\n爱情宣言模块] TC[TimeCalculator\n时间计算模块] end subgraph 数据层 DS[DataStorage\n数据存储模块] LS[localStorage\n本地存储] end UI --&gt; TM UI --&gt; PTM UI --&gt; AM UI --&gt; SM UI --&gt; DM UI --&gt; TC TM --&gt; DS PTM --&gt; DS AM --&gt; DS SM --&gt; DS DM --&gt; DS TC --&gt; DS DS --&gt; LS LS --&gt; DS classDef ui fill:#f9f,stroke:#333,stroke-width:2px classDef module fill:#bbf,stroke:#333,stroke-width:2px classDef data fill:#bfb,stroke:#333,stroke-width:2px class UI ui class TM,PTM,AM,SM,DM,TC module class DS,LS data</div>
<p><strong>图1：项目架构图</strong> - 展示了爱情纪念网站的三层架构设计，包括用户界面层、模块层和数据层。模块层的各个功能模块通过DataStorage模块与本地存储进行交互，实现数据的持久化存储。</p>
<h2 id="四-开发实现中的关键技术挑战及解决方案">四、开发实现中的关键技术挑战及解决方案</h2>
<h3 id="核心功能模块">核心功能模块</h3>
<h4 id="核心功能模块图">核心功能模块图</h4>
<div class="language-mermaid">graph TD subgraph 核心功能模块 TM[timelineModule\n时间轴模块] PTM[photoWallModule\n照片墙模块] AM[anniversaryModule\n纪念日模块] SM[storyModule\n爱情故事模块] DM[declarationModule\n爱情宣言模块] TC[TimeCalculator\n时间计算模块] end subgraph 功能特性 TM1[添加/编辑/删除节点] TM2[照片上传] TM3[里程碑标记] PTM1[本地图片上传] PTM2[照片管理] PTM3[大图预览] AM1[多种纪念日类型] AM2[自动倒计时] AM3[已过纪念日标记] SM1[创建故事集] SM2[章节管理] SM3[故事阅读] DM1[添加宣言] DM2[分类展示] DM3[编辑删除] TC1[多种时间显示模式] TC2[实时更新] TC3[里程碑切换] end TM --&gt; TM1 TM --&gt; TM2 TM --&gt; TM3 PTM --&gt; PTM1 PTM --&gt; PTM2 PTM --&gt; PTM3 AM --&gt; AM1 AM --&gt; AM2 AM --&gt; AM3 SM --&gt; SM1 SM --&gt; SM2 SM --&gt; SM3 DM --&gt; DM1 DM --&gt; DM2 DM --&gt; DM3 TC --&gt; TC1 TC --&gt; TC2 TC --&gt; TC3 classDef module fill:#f9f,stroke:#333,stroke-width:2px classDef feature fill:#bbf,stroke:#333,stroke-width:2px class TM,PTM,AM,SM,DM,TC module class TM1,TM2,TM3,PTM1,PTM2,PTM3,AM1,AM2,AM3,SM1,SM2,SM3,DM1,DM2,DM3,TC1,TC2,TC3 feature</div>
<p><strong>图4：核心功能模块图</strong> - 展示了爱情纪念网站的六大核心功能模块及其详细功能特性，包括时间轴、照片墙、纪念日、爱情故事、爱情宣言和时间计算模块。</p>
<h3 id="挑战1-localStorage存储限制">挑战1：localStorage存储限制</h3>
<p><strong>问题</strong>：localStorage的存储容量有限（通常为5MB），而我们有很多珍贵的照片。</p>
<p><strong>解决方案</strong>：</p>
<ul>
 <li>实现图片压缩功能，在上传时自动调整图片大小</li>
 <li>优化数据结构，减少冗余字段，最大化利用存储空间</li>
 <li>使用Base64编码存储图片，确保数据完整性</li>
</ul>
<p><strong>实际操作</strong>：
 <br>
 我在代码中添加了图片压缩逻辑，将上传的图片限制在合理大小，同时保证视觉效果。这样既节省了存储空间，又提高了页面加载速度。</p>
<h3 id="挑战2-时间计算的精度">挑战2：时间计算的精度</h3>
<p><strong>问题</strong>：如何准确计算时间差，避免时区和夏令时的影响。</p>
<p><strong>解决方案</strong>：</p>
<ul>
 <li>使用Date对象的getTime()方法获取时间戳，避免时区问题</li>
 <li>实现多种时间显示模式，满足不同场景的需求</li>
 <li>优化时间更新逻辑，确保实时性的同时减少性能消耗</li>
</ul>
<p><strong>实际操作</strong>：
 <br>
 我在TimeCalculator模块中实现了三种时间显示模式，并添加了实时更新功能，确保时间计算的准确性和显示的美观性。</p>
<h3 id="挑战3-响应式布局的实现">挑战3：响应式布局的实现</h3>
<p><strong>问题</strong>：如何让网站在不同设备上都能完美显示。</p>
<p><strong>解决方案</strong>：</p>
<ul>
 <li>使用CSS Grid和Flexbox实现弹性布局</li>
 <li>添加媒体查询，针对不同屏幕尺寸调整样式</li>
 <li>优化触摸交互，提高移动设备体验</li>
</ul>
<p><strong>实际操作</strong>：
 <br>
 我在CSS中添加了响应式设计，确保网站在手机、平板和桌面设备上都能完美显示，特别是照片墙的网格布局，在不同屏幕尺寸下都能保持美观。</p>
<h3 id="挑战4-秘密开发的时间管理">挑战4：秘密开发的时间管理</h3>
<p><strong>问题</strong>：如何在不被女友发现的情况下，合理安排开发时间。</p>
<p><strong>解决方案</strong>：</p>
<ul>
 <li>制定详细的开发计划，分解任务，确保在5月5日前完成</li>
 <li>利用下班后的时间开发，避免占用和女友视频的时间</li>
 <li>建立代码备份，确保数据安全</li>
 <li>创造合理的借口，避免女友起疑心</li>
</ul>
<p><strong>实际操作</strong>：
 <br>
 我制定了详细的开发计划，每天完成一个小任务，确保项目稳步推进。同时，我会在和女友视频时，把代码编辑器最小化，切换到工作文档，避免露馅。</p>
<h3 id="挑战5-用户体验的优化">挑战5：用户体验的优化</h3>
<p><strong>问题</strong>：如何让网站的交互更流畅、更有吸引力。</p>
<p><strong>解决方案</strong>：</p>
<ul>
 <li>添加平滑的过渡动画和转场效果</li>
 <li>实现键盘导航，支持键盘操作</li>
 <li>添加加载状态和错误处理</li>
 <li>优化表单交互，提供即时反馈</li>
</ul>
<p><strong>实际操作</strong>：
 <br>
 我在照片预览功能中添加了平滑的过渡动画，在时间计算中添加了实时更新效果，让整个网站的交互更加流畅和有吸引力。</p>
<h2 id="五-测试策略与部署计划">五、测试策略与部署计划</h2>
<h3 id="测试策略">测试策略</h3>
<ol>
 <li><strong>功能测试</strong>：逐个测试每个功能模块，确保所有功能正常工作</li>
 <li><strong>兼容性测试</strong>：在女友使用的手机浏览器中反复测试</li>
 <li><strong>响应式测试</strong>：确保在不同屏幕尺寸下都能完美显示</li>
 <li><strong>性能测试</strong>：测试页面加载速度和交互流畅度</li>
 <li><strong>数据测试</strong>：测试数据存储和读取的稳定性</li>
</ol>
<h4 id="开发流程图">开发流程图</h4>
<div class="language-mermaid">graph TD A[需求分析\n情感+技术] B[技术选型\n纯前端方案] C[架构设计\n模块化架构] D[核心功能开发\n六大模块] E[技术挑战解决\n存储+时间+响应式] F[测试优化\n兼容性+性能] G[数据填充\n回忆收集] H[部署准备\n云存储链接] I[5月5日\n惊喜发布] A --&gt; B B --&gt; C C --&gt; D D --&gt; E E --&gt; F F --&gt; G G --&gt; H H --&gt; I subgraph 开发阶段 A B C D E F end subgraph 准备阶段 G H end subgraph 发布阶段 I end classDef dev fill:#f9f,stroke:#333,stroke-width:2px classDef prep fill:#bbf,stroke:#333,stroke-width:2px classDef pub fill:#bfb,stroke:#333,stroke-width:2px class A,B,C,D,E,F dev class G,H prep class I pub</div>
<p><strong>图3：开发流程图</strong> - 展示了爱情纪念网站从需求分析到5月5日惊喜发布的完整开发流程，包括开发阶段、准备阶段和发布阶段的各个关键步骤。</p>
<h3 id="测试工具">测试工具</h3>
<ul>
 <li><strong>Chrome DevTools</strong>：调试JavaScript和CSS</li>
 <li><strong>Responsive Design Mode</strong>：模拟女友的手机屏幕</li>
 <li><strong>Lighthouse</strong>：分析性能和可访问性</li>
 <li><strong>手动测试</strong>：无数次地打开网站，测试所有功能</li>
</ul>
<h3 id="部署计划">部署计划</h3>
<ol>
 <li><strong>代码优化</strong>：在4月底前完成所有代码优化和bug修复</li>
 <li><strong>数据填充</strong>：整理所有照片和回忆，填充到网站中</li>
 <li><strong>最终测试</strong>：进行全面的功能测试和性能测试</li>
 <li><strong>部署方式</strong>：
  <ul>
   <li>生成最终的HTML文件，确保所有功能正常</li>
   <li>上传到云存储服务，生成一个唯一的访问链接</li>
   <li>备份所有数据，确保安全</li>
  </ul></li>
 <li><strong>时机选择</strong>：5月5日当天，在我们视频聊天时，突然发给她</li>
</ol>
<h2 id="六-项目进展与未来期待">六、项目进展与未来期待</h2>
<h3 id="目前进展">目前进展</h3>
<ul>
 <li><strong>核心功能开发</strong>：已完成时间轴、照片墙、纪念日、爱情故事、爱情宣言等所有核心功能</li>
 <li><strong>数据结构优化</strong>：已实现localStorage数据的高效存储和管理</li>
 <li><strong>响应式设计</strong>：已完成在不同设备上的适配</li>
 <li><strong>用户体验优化</strong>：已添加平滑动画和过渡效果</li>
 <li><strong>数据收集</strong>：正在整理和上传我们的照片和回忆</li>
</ul>
<h4 id="项目时间线图">项目时间线图</h4>
<div class="language-mermaid">gantt title 爱情纪念网站项目时间线 dateFormat YYYY-MM-DD section 开发阶段 需求分析 :active, des1, 2026-02-01, 7d 技术选型与架构设计 :des2, after des1, 5d 核心功能开发 :des3, after des2, 20d 技术挑战解决 :des4, after des3, 10d 测试优化 :des5, after des4, 10d section 准备阶段 数据填充与整理 :prep1, after des5, 15d 部署准备与测试 :prep2, after prep1, 5d section 发布阶段 5月5日 2周年惊喜发布 :pub1, 2026-05-05, 1d section 里程碑 项目启动 :milestone, m1, 2026-02-01, 0d 核心功能完成 :milestone, m2, 2026-03-05, 0d 测试完成 :milestone, m3, 2026-03-25, 0d 数据准备完成 :milestone, m4, 2026-04-10, 0d 部署准备完成 :milestone, m5, 2026-04-15, 0d 惊喜发布 :milestone, m6, 2026-05-05, 0d</div>
<p><strong>图5：项目时间线图</strong> - 展示了爱情纪念网站从2月到5月5日的详细项目时间线，包括开发、准备和发布三个阶段的里程碑。</p>
<h3 id="对5月5日的期待">对5月5日的期待</h3>
<p>那一天，我会提前准备好一切，然后在视频聊天时，神秘地对她说："宝贝，我为你准备了一个特别的2周年礼物。"</p>
<p>当她打开链接，看到那个充满我们回忆的网站时，我想象她会：</p>
<ul>
 <li>看到时间轴上的第一个节点——我们第一次见面的那天</li>
 <li>浏览照片墙上的合照，回忆起每一次见面的场景</li>
 <li>看到纪念日模块中我们的重要日期</li>
 <li>读到我为她写的爱情故事</li>
 <li>看到爱情宣言中我对她的表白</li>
 <li>发现时间计算器显示"我们已经在一起730天"</li>
</ul>
<p>那一刻，距离将不再是障碍，我们的情感会通过这个网站紧紧连接在一起。</p>
<h3 id="长期价值">长期价值</h3>
<p>这个网站不仅是2周年的礼物，更是我们未来持续记录回忆的平台。以后，我们可以：</p>
<ul>
 <li>继续在时间轴上添加新的回忆</li>
 <li>在照片墙上传新的合照</li>
 <li>在纪念日模块添加新的重要日期</li>
 <li>续写我们的爱情故事</li>
 <li>添加新的爱情宣言</li>
 <li>看着时间计算器的数字不断增长</li>
</ul>
<h2 id="七-网站界面预览">七、网站界面预览</h2>
<h3 id="1--时间轴页面">1. 时间轴页面</h3>
<p><strong>描述</strong>：记录重要时刻的时间轴页面，包含时间计算和重要时刻节点。</p>
<p><strong>功能</strong>：</p>
<ul>
 <li>时间轴节点的添加、编辑、删除</li>
 <li>节点照片的上传和展示</li>
 <li>里程碑标记</li>
 <li>时间轴的滚动浏览</li>
 <li>多种时间显示模式切换</li>
</ul>
<p><strong>布局</strong>：</p>
<ul>
 <li>顶部时间计算卡片，显示在一起的时间</li>
 <li>左侧时间线，右侧节点内容</li>
 <li>每个节点包含标题、日期、描述和照片</li>
 <li>节点的渐入动画效果</li>
</ul>
<p><strong>特色</strong>：</p>
<ul>
 <li>实时更新的时间计算器</li>
 <li>平滑的节点动画效果</li>
 <li>响应式设计，适配不同设备</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F2772476605.webp%21water&amp;size=m" alt="时间轴"></p>
<p><strong>图6：时间轴页面</strong> - 展示了时间计算卡片和重要时刻节点，显示了相识至今的时间和第一个节点"初识"。</p>
<h3 id="2--照片墙页面">2. 照片墙页面</h3>
<p><strong>描述</strong>：展示照片的网格布局页面，支持照片的上传和管理。</p>
<p><strong>功能</strong>：</p>
<ul>
 <li>照片的上传、编辑和删除</li>
 <li>点击照片查看大图预览</li>
 <li>响应式网格布局</li>
 <li>照片信息的编辑</li>
</ul>
<p><strong>布局</strong>：</p>
<ul>
 <li>自适应网格，根据屏幕尺寸调整列数</li>
 <li>每张照片带有标题和日期</li>
 <li>悬停效果显示操作按钮</li>
 <li>上传照片按钮</li>
</ul>
<p><strong>特色</strong>：</p>
<ul>
 <li>响应式网格布局</li>
 <li>平滑的悬停效果</li>
 <li>大图预览功能</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F3792887317.webp%21water&amp;size=m" alt="照片墙页面"></p>
<p><strong>图7：照片墙页面</strong> - 展示了照片墙的网格布局，包含两张示例照片，每张照片都有悬停效果。</p>
<h3 id="3--纪念日页面">3. 纪念日页面</h3>
<p><strong>描述</strong>：展示和管理纪念日的页面，支持多种类型的纪念日。</p>
<p><strong>功能</strong>：</p>
<ul>
 <li>纪念日的添加、编辑、删除</li>
 <li>自动倒计时显示</li>
 <li>已过纪念日标记</li>
 <li>多种纪念日类型</li>
</ul>
<p><strong>布局</strong>：</p>
<ul>
 <li>卡片式布局，每个纪念日一个卡片</li>
 <li>显示倒计时或已过时间</li>
 <li>分类展示不同类型的纪念日</li>
 <li>添加纪念日按钮</li>
</ul>
<p><strong>特色</strong>：</p>
<ul>
 <li>实时更新的倒计时</li>
 <li>已过纪念日的特殊标记</li>
 <li>不同类型纪念日的颜色区分</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F3533596353.webp%21water&amp;size=m" alt="纪念日页面"></p>
<p><strong>图8：纪念日页面</strong> - 展示了两个纪念日卡片，左侧是已过的"初识"纪念日，右侧是未来的"结婚纪念日"，显示了倒计时。</p>
<h3 id="4--爱情故事页面">4. 爱情故事页面</h3>
<p><strong>描述</strong>：展示爱情故事的页面，支持故事集和章节的管理。</p>
<p><strong>功能</strong>：</p>
<ul>
 <li>故事集的创建和管理</li>
 <li>章节的添加、编辑、删除</li>
 <li>故事的阅读模式</li>
 <li>故事的分类管理</li>
</ul>
<p><strong>布局</strong>：</p>
<ul>
 <li>故事集列表，每个故事集一个卡片</li>
 <li>故事阅读页面，包含章节导航</li>
 <li>章节内容的优雅展示</li>
 <li>添加故事按钮</li>
</ul>
<p><strong>特色</strong>：</p>
<ul>
 <li>故事集的卡片式布局</li>
 <li>优雅的阅读体验</li>
 <li>章节的有序管理</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F2035206352.webp%21water&amp;size=m" alt="爱情故事页面"></p>
<p><strong>图9：爱情故事页面</strong> - 展示了故事集列表，包含一个"测试"故事，显示了故事的创建日期、章节数和简介。</p>
<h3 id="5--爱情宣言页面">5. 爱情宣言页面</h3>
<p><strong>描述</strong>：展示爱情宣言的页面，支持宣言的添加和管理。</p>
<p><strong>功能</strong>：</p>
<ul>
 <li>宣言的添加、编辑、删除</li>
 <li>按分类展示</li>
 <li>宣言的卡片式布局</li>
</ul>
<p><strong>布局</strong>：</p>
<ul>
 <li>卡片式布局，每个宣言一个卡片</li>
 <li>分类标签筛选</li>
 <li>优雅的文字展示效果</li>
 <li>添加宣言按钮</li>
</ul>
<p><strong>特色</strong>：</p>
<ul>
 <li>不同风格的宣言卡片</li>
 <li>分类标签的视觉区分</li>
 <li>简洁优雅的布局</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F4076808278.webp%21water&amp;size=m" alt="爱情宣言页面"></p>
<p><strong>图10：爱情宣言页面</strong> - 展示了两个爱情宣言卡片，左侧是粉色心形背景的"sweet"类型宣言，右侧是绿色星星背景的"romantic"类型宣言。</p>
<h3 id="6--技术实现">6. 技术实现</h3>
<p><strong>响应式设计</strong>：</p>
<ul>
 <li>使用CSS Grid和Flexbox实现响应式布局</li>
 <li>媒体查询适配不同屏幕尺寸</li>
</ul>
<p><strong>交互效果</strong>：</p>
<ul>
 <li>平滑的过渡动画</li>
 <li>图片懒加载</li>
 <li>键盘导航支持</li>
 <li>触摸优化</li>
</ul>
<p><strong>数据存储</strong>：</p>
<ul>
 <li>使用localStorage存储所有数据</li>
 <li>数据结构优化</li>
 <li>定期备份</li>
</ul>
<h3 id="7--未来展望">7. 未来展望</h3>
<p><strong>功能扩展</strong>：</p>
<ul>
 <li>导出/导入功能</li>
 <li>主题切换</li>
 <li>更多交互效果</li>
</ul>
<p><strong>用户体验</strong>：</p>
<ul>
 <li>优化加载速度</li>
 <li>提升交互流畅度</li>
 <li>增强情感连接</li>
</ul>
<h2 id="结语">结语</h2>
<p>从构思到现在，它不仅是一个技术项目，更是一份情感的结晶。每一行代码都带着我的思念，每一个功能都藏着我的用心。</p>
<p>异地恋的道路虽然艰辛，但因为有了这样的小期待，有了共同的回忆空间，距离反而让我们的感情更加深厚。每当我在代码中添加一个新的功能，我都会想象女友看到时的表情，这成为了我最大的动力。</p>
<p>现在，我正在倒计时，等待着5月5日的到来。我相信，当女友看到这个网站时，她会明白，无论距离有多远，我的心永远和她在一起。</p>
<p>技术可以跨越山海，代码可以传递真情。这就是这个项目最美好的地方。</p>
<h2 id="附录">附录</h2>
<p>项目地址：https://github.com/NoEggEgg/love-memorial-website</p>
<div class="vditor-render-wrapper">
 <code class="language-halo">git:[@github/NoEggEgg/love-memorial-website] </code>
</div>]]></description><guid isPermaLink="false">/archives/dreaming-a-2nd-anniversary-surprise-gift-prepared-for-a-long-distance-girlfriend</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F02%2F2772476605.webp%21water&amp;size=m" type="image/jpeg" length="26856"/><category>分享</category><pubDate>Tue, 3 Feb 2026 09:15:00 GMT</pubDate></item><item><title><![CDATA[Typecho 多吉云插件优化：更灵活的存储目录配置]]></title><link>https://wuqishi.com/archives/typecho-duojiyun-plugin-optimization-more-flexible-storage-directory-configuration</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Typecho%20%E5%A4%9A%E5%90%89%E4%BA%91%E6%8F%92%E4%BB%B6%E4%BC%98%E5%8C%96%EF%BC%9A%E6%9B%B4%E7%81%B5%E6%B4%BB%E7%9A%84%E5%AD%98%E5%82%A8%E7%9B%AE%E5%BD%95%E9%85%8D%E7%BD%AE&amp;url=/archives/typecho-duojiyun-plugin-optimization-more-flexible-storage-directory-configuration" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p>基于两双筷子原版插件优化，在保持稳定性的基础上增加存储路径自定义功能</p>
</blockquote>
<p>之前有过一篇又拍云的，大家可以去看看：</p>
<hyperlink-card href="https://wuqishi.com/archives/Typecho-UpyunFile-Modified-added-custom-directory-structure-function" target="_blank" theme="regular"></hyperlink-card>
<h2 id="--核心改进-存储路径的自定义化">📦 核心改进：存储路径的自定义化</h2>
<h3 id="1--从预设模式到动态配置">1. 从预设模式到动态配置</h3>
<p>原版插件提供了两种固定路径格式，但在实际使用中，站长们有更多样化的存储需求：</p>
<ul>
 <li><strong>统一管理多个网站资源</strong>：一个多吉云账号管理多个网站</li>
 <li><strong>符合现有CDN配置规则</strong>：适应已有的CDN缓存策略</li>
 <li><strong>保持与旧系统的路径兼容</strong>：从其他平台迁移时保持路径结构</li>
 <li><strong>按内容类型分类存储</strong>：图片、文档、视频分开存放</li>
</ul>
<p><strong>优化后</strong>：</p>
<ul>
 <li>✅ 完全可配置的存储根目录</li>
 <li>✅ 支持任意自定义路径结构</li>
 <li>✅ 自动兼容原有配置模式</li>
 <li>✅ 提供平滑的迁移路径</li>
 <li>✅ 智能路径格式化处理</li>
</ul>
<h3 id="2----实际应用场景">2. 🌟 实际应用场景</h3>
<pre><code class="language-markdown">🏠 个人博客    → 使用 /uploads 简洁明了
🏢 企业网站   → 使用 /static 分类清晰
🔧 多站点管理 → 使用 /site1/uploads /site2/uploads 隔离管理
🔄 迁移用户   → 使用 /typecho/uploads 保持原路径
📊 内容平台   → 使用 /images /videos /docs 按类型分类
</code></pre>
<h2 id="--技术实现亮点">🔧 技术实现亮点</h2>
<h3 id="1--可配置的存储目录">1. 可配置的存储目录</h3>
<pre><code class="language-php">// 🎯 原版：固定两种模式（二选一）
if ($pluginConfig['path_style'] == 'typecho') {
    $uploadPath = self::getUploadDir().$uploadPath;
}
// 只能选择：Typecho风格 或 极简风格

// ✨ 新版：动态配置（自由定义）
$customDir = $pluginConfig['custom_dir'] ?? '/files';
$uploadPath = $customDir . '/' . $date-&gt;year . '/' . $date-&gt;month . '/' . $date-&gt;day;
// 可以填写：/uploads、/static、/typecho/uploads 等任意路径
</code></pre>
<h3 id="2--严格的输入验证">2. 严格的输入验证</h3>
<pre><code class="language-php">public static function configCheck($settings) {
    // 🔒 必填项检查
    if (empty($settings['custom_dir'])) {
        throw new Exception('存储目录不能为空');
    }
  
    // 📝 格式验证
    if (!str_starts_with($settings['custom_dir'], '/')) {
        throw new Exception('存储目录必须以斜杠(/)开头');
    }
  
    // 🛡️ 安全字符检查
    if (preg_match('/[&lt;&gt;:"|?*]/', $settings['custom_dir'])) {
        throw new Exception('存储目录包含非法字符');
    }
  
    // 📊 路径深度限制（防止过深路径）
    $depth = substr_count($settings['custom_dir'], '/') - 1;
    if ($depth &gt; 5) {
        throw new Exception('存储目录层级过深，建议不超过5级');
    }
}
</code></pre>
<h3 id="3----配置示例">3. 📋 配置示例</h3>
<pre><code class="language-markdown"># 配置：/uploads
# 实际路径：/uploads/2026/01/22/filename.jpg
# 适合：个人博客、简单站点

# 配置：/typecho/uploads  
# 实际路径：/typecho/uploads/2026/01/22/filename.jpg
# 适合：从原版升级、保持路径一致

# 配置：/static/images
# 实际路径：/static/images/2026/01/22/filename.jpg
# 适合：企业网站、资源分类

# 配置：/site/blog/uploads
# 实际路径：/site/blog/uploads/2026/01/22/filename.jpg
# 适合：多站点、子站点管理

# 配置：/
# 实际路径：/2026/01/22/filename.jpg
# 适合：极简主义、根目录存储
</code></pre>
<h2 id="--存储路径命名指南">📂 存储路径命名指南</h2>
<h3 id="1--推荐命名方案">1. 推荐命名方案</h3>
<pre><code class="language-markdown">📁 个人博客推荐：/uploads
📁 企业网站推荐：/static
📁 多站点推荐：/site/[id]/uploads
📁 Typecho老用户：/typecho/uploads
📁 资源分类推荐：/images、/docs、/videos
📁 日期优先推荐：/2026/uploads
</code></pre>
<h3 id="2----命名最佳实践">2. ✅ 命名最佳实践</h3>
<ol>
 <li><strong>使用小写字母</strong>：避免大小写敏感问题（Linux/Windows差异）</li>
 <li><strong>使用连字符而非下划线</strong>：<code>/my-files</code>比 <code>/my_files</code>更友好</li>
 <li><strong>保持简洁</strong>：建议不超过3级深度，便于管理</li>
 <li><strong>语义明确</strong>：路径名能反映内容类型，便于识别</li>
 <li><strong>避免保留字</strong>：不要使用系统保留目录名</li>
 <li><strong>英文优先</strong>：中文路径可能在某些系统上有兼容性问题</li>
</ol>
<h3 id="3----避免这样写">3. ❌ 避免这样写</h3>
<pre><code class="language-markdown">/files/uploads           # 重复了"uploads"，冗余
/my uploads             # 包含空格，可能引发问题
/uploads/               # 末尾不要加斜杠
/../../etc              # 危险路径，安全风险
/CONFIG                 # 全大写，不美观
/2026-01-22/files       # 包含特殊字符
</code></pre>
<h2 id="--从原版升级">🔄 从原版升级</h2>
<h3 id="1--配置对应关系">1. 配置对应关系</h3>
<p>如果你正在使用原版插件，升级时只需对应填写：</p>
<table>
 <thead>
  <tr>
   <th>原版选项</th>
   <th>新版填写值</th>
   <th>说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>Typecho风格</td>
   <td><code>/typecho/uploads</code></td>
   <td>保持原路径不变</td>
  </tr>
  <tr>
   <td>极简风格</td>
   <td><code>/</code></td>
   <td>根目录存储</td>
  </tr>
 </tbody>
</table>
<h3 id="2----升级步骤">2. 📋 升级步骤</h3>
<pre><code class="language-markdown"># 第一步：备份
1. 备份当前插件配置（截图或记录）
2. 备份重要上传文件（以防万一）

# 第二步：安装新版
1. 下载新版插件文件
2. 上传到 /usr/plugins/DogeUpload/
3. 覆盖原有文件（保留配置）

# 第三步：修改配置
1. 进入Typecho后台 → 插件管理
2. 找到DogeUpload插件，点击"设置"
3. 根据原配置填写"存储目录"
   - 原Typecho风格 → 填写：/typecho/uploads
   - 原极简风格 → 填写：/
4. 其他配置保持不变
5. 点击"保存"

# 第四步：验证测试
1. 上传一个测试文件
2. 检查文件是否出现在正确路径
3. 查看文章中图片显示是否正常
</code></pre>
<h2 id="---重要提醒">⚠️ 重要提醒</h2>
<ol>
 <li><strong>已上传文件不受影响</strong>：修改存储目录仅对新上传文件生效，已存在的文件保持原路径</li>
 <li><strong>手动迁移需要</strong>：如需统一所有文件路径，需要手动迁移并更新数据库引用</li>
 <li><strong>CDN配置同步</strong>：如果使用CDN，确保CDN回源配置支持新路径</li>
 <li><strong>测试环境先行</strong>：建议在测试环境验证无误后再应用到生产环境</li>
 <li><strong>路径一旦确定</strong>：尽量避免频繁修改，以免造成路径混乱</li>
</ol>
<h2 id="--常见问题">❓ 常见问题</h2>
<p><strong>Q：改了存储目录，旧文章的图片会失效吗？</strong></p>
<p>A：不会失效。插件会保持旧图片的原始路径，只有新上传的图片使用新路径。</p>
<p><strong>Q：可以随时修改存储目录吗？</strong></p>
<p>A：技术上可以，但建议在访问量低时修改，修改后立即测试上传功能。</p>
<p><strong>Q：填写的路径在存储桶中不存在怎么办？</strong></p>
<p>A：插件会自动创建所需的目录结构，无需手动在多吉云创建。</p>
<p><strong>Q：支持中文目录名吗？</strong></p>
<p>A：技术上支持，但强烈建议使用英文路径，兼容性更好，不易出问题。</p>
<p><strong>Q：如何查看当前文件的实际存储路径？</strong></p>
<p>A：上传文件后，可以在Typecho后台的"附件管理"中查看文件路径。</p>
<p><strong>Q：修改后上传失败怎么办？</strong></p>
<p>A：检查：① 路径是否以<code>/</code>开头；② 是否包含非法字符；③ 多吉云API配置是否正确。</p>
<p><strong>Q：可以设置多级目录吗？比如</strong> <strong>/year/month/category/****？</strong></p>
<p>A：目前插件自动添加年月日三级，你可以在配置中设置基础目录，如 <code>/blog/images</code>，最终路径会是 <code>/blog/images/2026/01/22/</code>。</p>
<h2 id="--总结">🎯 总结</h2>
<p>这次优化虽然改动不大，但解决了一个很实际的问题：<strong>让存储结构适应你的需求，而不是让你去适应固定的结构</strong>。</p>
<h3 id="优化带来的好处-">优化带来的好处：</h3>
<ul>
 <li><strong>对新手友好</strong>：默认<code>/files</code>开箱即用，无需复杂配置</li>
 <li><strong>对老用户兼容</strong>：支持原版配置无缝迁移，零学习成本</li>
 <li><strong>对专业用户灵活</strong>：完全自定义存储层级，适应各种架构</li>
 <li><strong>对未来可扩展</strong>：为更多存储策略和功能扩展打下基础</li>
</ul>
<h3 id="设计理念-">设计理念：</h3>
<ol>
 <li><strong>简洁至上</strong>：一个配置项解决路径问题</li>
 <li><strong>稳定优先</strong>：不影响已有功能，不破坏现有数据</li>
 <li><strong>智能辅助</strong>：自动格式化路径，减少配置错误</li>
 <li><strong>开放灵活</strong>：不限制用户的使用方式</li>
</ol>
<p>优化虽小，但实用性强。这个改进来源于实际使用中的需求，希望能让大家的Typecho多吉云存储体验更加顺畅、灵活！</p>
<hr>
<p><strong>插件信息</strong>：</p>
<ul>
 <li>基于版本：两双筷子原版 DogeUpload</li>
 <li>优化重点：存储路径自定义</li>
 <li>兼容性：完全兼容原版配置和数据</li>
 <li>适用场景：所有使用多吉云存储的Typecho用户</li>
</ul>
<p>如果你在使用中遇到任何问题，或者有改进建议，欢迎交流讨论。希望这个优化能帮助到更多Typecho站长！ 🚀</p>]]></description><guid isPermaLink="false">/archives/typecho-duojiyun-plugin-optimization-more-flexible-storage-directory-configuration</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F1915638501.webp%21water&amp;size=m" type="image/jpeg" length="22844"/><category>技巧</category><category>分享</category><pubDate>Thu, 22 Jan 2026 08:57:00 GMT</pubDate></item><item><title><![CDATA[甲骨文云硬盘扩容指南：从50G到200G的“免费午餐”怎么吃？]]></title><link>https://wuqishi.com/archives/oracle-cloud-hard-disk-expansion-guide-how-to-eat-the-free-lunch-from-50g-to-200g</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%94%B2%E9%AA%A8%E6%96%87%E4%BA%91%E7%A1%AC%E7%9B%98%E6%89%A9%E5%AE%B9%E6%8C%87%E5%8D%97%EF%BC%9A%E4%BB%8E50G%E5%88%B0200G%E7%9A%84%E2%80%9C%E5%85%8D%E8%B4%B9%E5%8D%88%E9%A4%90%E2%80%9D%E6%80%8E%E4%B9%88%E5%90%83%EF%BC%9F&amp;url=/archives/oracle-cloud-hard-disk-expansion-guide-how-to-eat-the-free-lunch-from-50g-to-200g" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F1152651898.webp%21wwater%2Ffw%2F500&amp;size=m" alt="50G硬盘扩容至200G" title="50G硬盘扩容至200G"></p>
<blockquote>
 <p>温馨提示：本文操作涉及系统磁盘，请务必做好数据备份！搞砸了别来找我哭诉（虽然大概率不会搞砸）</p>
</blockquote>
<p>有需要的朋友可以另外看看这篇文章：</p>
<hyperlink-card href="https://wuqishi.com/archives/oracle-dd-reassembly-system-and-brick-rescue-course" target="_blank" theme="regular"></hyperlink-card>
<h2 id="一-前言-甲骨文的-良心-与-小气-">一、前言：甲骨文的"良心"与"小气"</h2>
<p>甲骨文云（Oracle Cloud）确实挺良心——免费套餐能开两台X86主机+ARM 4H24G配置，这配置跑个小网站、挂个爬虫、搭个梯子（咳咳，我是说科学上网学习）绰绰有余。但！是！它有个"小气"的地方：默认只给你50G硬盘（实际显示47G），而整个账户的免费额度其实是200G！</p>
<p>这就好比去自助餐厅，老板说"随便吃"，结果只给你个小碟子——不是不让吃，是让你多跑几趟。好在，我们可以把碟子换成大碗！</p>
<h2 id="二-扩容前的-灵魂拷问-">二、扩容前的"灵魂拷问"</h2>
<p>在动手前，先问自己三个问题：</p>
<ol>
 <li><strong>数据重要吗？</strong> 如果只是测试环境，直接重开实例改硬盘大小最省事（但环境得重配）</li>
 <li><strong>懒吗？</strong> 如果懒得重装环境，那就跟着本文走扩容路线</li>
 <li><strong>会备份吗？</strong> 不会？现在就去学！别等数据丢了才后悔</li>
</ol>
<h2 id="三-方法一-后台修改引导卷-最安全-">三、方法一：后台修改引导卷（最安全）</h2>
<p>这是官方推荐的方式，适合手残党（比如我）。</p>
<h3 id="操作步骤-手把手版-">操作步骤（手把手版）</h3>
<ol>
 <li><strong>登录甲骨文云后台</strong> → 菜单 → 计算 → 实例</li>
 <li><strong>找到你的小鸡</strong>（实例），点进去 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F0be31722354200.jpg%21water%2Ffw%2F500&amp;size=m" alt="找到实例" title="找到实例"></li>
 <li><strong>找到"引导卷"</strong> ，点"编辑" <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2Fcb541722354110.jpg%21water%2Ffw%2F500&amp;size=m" alt="找到引导卷" title="找到引导卷"></li>
 <li><strong>输入新大小</strong>（最大200G，别贪心） <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F76241722354110.jpg%21water%2Ffw%2F500&amp;size=m" alt="调整卷的大小" title="调整卷的大小"></li>
 <li><strong>保存</strong> → 等待状态变成"可用"</li>
</ol>
<h3 id="系统识别新容量">系统识别新容量</h3>
<p>多数系统重启后会自动识别。如果没反应，别慌，试试以下命令（以Oracle Linux为例）：</p>
<pre><code class="language-bash"># 先设置语言环境（避免乱码）
LANG=en_US.UTF-8

# 执行扩容命令
/usr/libexec/oci-growfs

# 查看磁盘大小
lsblk
</code></pre>
<p>如果看到 sda从50G变成了你设置的大小，恭喜你，扩容成功！</p>
<h2 id="四-方法二-其他系统的-骚操作-">四、方法二：其他系统的"骚操作"</h2>
<p>如果你用的不是Oracle Linux，可能需要手动操作。这里以Debian为例：</p>
<h3 id="Debian系统扩容">Debian系统扩容</h3>
<p>甲骨文自带的Debian系统会提示你执行以下命令：</p>
<pre><code class="language-bash"># 第一步：执行dd命令（别问为什么，照做就行）
sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1

# 第二步：重新扫描磁盘
echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan
</code></pre>
<h3 id="其他系统-如Ubuntu-CentOS-">其他系统（如Ubuntu、CentOS）</h3>
<p>执行完DD命令后，用 lsblk或 df -h查看盘符。假设你的系统盘是 sda1，执行：</p>
<pre><code class="language-bash"># 调整文件系统大小
resize2fs /dev/sda1
</code></pre>
<p><strong>注意</strong>：有些系统重启后直接 resize2fs就能完成，有些需要先执行上面的DD命令。建议先重启试试，不行再上命令。</p>
<h2 id="五-常见翻车现场与自救指南">五、常见翻车现场与自救指南</h2>
<table>
 <thead>
  <tr>
   <th>翻车场景</th>
   <th>症状</th>
   <th>自救方法</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>翻车场景</td>
   <td>症状</td>
   <td>自救方法</td>
  </tr>
  <tr>
   <td>命令执行后没反应</td>
   <td>df-h还是显示旧容量</td>
   <td>重启实例试试，或者检查命令是否输错</td>
  </tr>
  <tr>
   <td>提示权限不足</td>
   <td>Permission denied</td>
   <td>加 sudo，或者切换到root用户</td>
  </tr>
  <tr>
   <td>系统卡死</td>
   <td>命令执行后无响应</td>
   <td>强制重启实例（后台操作）</td>
  </tr>
  <tr>
   <td>数据丢失</td>
   <td>文件不见了</td>
   <td>提前备份！提前备份！提前备份！</td>
  </tr>
 </tbody>
</table>
<h2 id="六-总结与吐槽">六、总结与吐槽</h2>
<ol>
 <li><strong>为什么默认50G？</strong> 我猜甲骨文是为了防止用户滥用，毕竟200G免费额度对个人来说挺香的</li>
 <li><strong>扩容有风险吗？</strong> 理论上风险很低，但任何磁盘操作都有万分之一的风险，所以备份！备份！备份！</li>
 <li><strong>需要重启吗？</strong> 多数情况需要，但有些系统（如Oracle Linux）可以在线扩容</li>
 <li><strong>能缩容吗？</strong> 不能！硬盘只能增不能减，就像我的体重一样</li>
</ol>
<p>最后，如果你扩容成功了，记得在评论区留个"已成功"，让我知道这篇教程没坑人。如果翻车了...呃，建议先看备份教程。</p>
<hr>
<p><strong>免责声明</strong>：本文仅作技术分享，操作前请自行评估风险。作者不对任何数据丢失负责（毕竟我提醒过你备份了）。</p>
<p>‍</p>]]></description><guid isPermaLink="false">/archives/oracle-cloud-hard-disk-expansion-guide-how-to-eat-the-free-lunch-from-50g-to-200g</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F1152651898.webp%21wwater%2Ffw%2F500&amp;size=m" type="image/jpeg" length="23274"/><category>分享</category><pubDate>Tue, 20 Jan 2026 01:05:00 GMT</pubDate></item><item><title><![CDATA[⏰ 时间同步：当你的服务器开始“穿越”时，如何优雅地把它拉回现实]]></title><link>https://wuqishi.com/archives/time-synchronization-when-your-server-starts-to-travel-how-to-bring-it-back-to-reality</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E2%8F%B0%20%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5%EF%BC%9A%E5%BD%93%E4%BD%A0%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BC%80%E5%A7%8B%E2%80%9C%E7%A9%BF%E8%B6%8A%E2%80%9D%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E5%9C%B0%E6%8A%8A%E5%AE%83%E6%8B%89%E5%9B%9E%E7%8E%B0%E5%AE%9E&amp;url=/archives/time-synchronization-when-your-server-starts-to-travel-how-to-bring-it-back-to-reality" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F2009394918.webp%21wwater%2Ffw%2F500&amp;size=m" alt="沙漏" title="沙漏"></p>
<blockquote>
 <p><em>"在数字世界里，时间可以同步，但你的头发可能永远不会再同步了"</em></p>
</blockquote>
<hr>
<p>之前有过一篇简要的文章，大家可以先看看</p>
<hyperlink-card href="https://wuqishi.com/archives/summary-of-linux-system-time-synchronization-commands" target="_blank" theme="regular"></hyperlink-card>
<hr>
<h2 id="--开篇-一个关于-时间旅行-的真实故事">📅 开篇：一个关于"时间旅行"的真实故事</h2>
<p>　　最近，公司遇到一个案例："数据库主从同步延迟 10 分钟"。在大家努力排查半小时后，我们发现了一个令人哭笑不得的事实——<strong>从库服务器的时间比主库快了整整 10 分钟</strong>。是的，这台服务器正在"穿越"到未来，而我们的数据还在过去徘徊。</p>
<div class="language-mermaid">graph LR A[主库] --&gt;|数据同步| B[从库] C[现实时间] --&gt;|时间流| A C --&gt;|时间流| B B-.-&gt;|时间快10分钟| C style B fill:#ff9999</div>
<p>　　这让我想一句经典名言："<strong>服务器的时间可以不准，但你的排查思路必须准</strong>"。</p>
<p>　　今天，我们就来聊聊甲骨文云（Oracle Cloud）Ubuntu 系统的时间同步——这个看似简单，却能让无数运维人深夜加班的"小问题"。</p>
<hr>
<h2 id="--一-为什么时间同步如此重要--不只是-对个表-那么简单-">🎯 一、为什么时间同步如此重要？（不只是"对个表"那么简单）</h2>
<p>　　在分布式系统中，时间同步不是"可有可无"的装饰品，而是<strong>基础设施的基石</strong>。想象一下：</p>
<ul>
 <li><strong>🔄 数据库主从复制</strong>：时间不同步可能导致数据冲突、复制中断</li>
 <li><strong>📊 日志分析</strong>：跨服务器日志时间戳错乱，排查问题如同大海捞针</li>
 <li><strong>🔐 证书验证</strong>：SSL/TLS 证书依赖时间，偏差过大直接导致服务不可用</li>
 <li><strong>🚨 监控告警</strong>：告警时间错乱，你永远不知道问题到底发生在"昨天"还是"明天"</li>
</ul>
<blockquote>
 <p>💡 <strong>真实案例</strong>：某电商公司"双 11"大促期间，由于负载均衡器时间偏差 5 分钟，导致大量用户会话提前失效，直接损失订单数百万元。</p>
</blockquote>
<p>　　用一句话总结：<strong>时间不同步，系统就变成了"薛定谔的猫"——你永远不知道它现在处于什么状态</strong>。</p>
<hr>
<h2 id="--二-甲骨文-Ubuntu-的时间同步-工具箱-">🧰 二、甲骨文 Ubuntu 的时间同步"工具箱"</h2>
<h3 id="2-1-默认配置-systemd-timesyncd-你的-贴心小助手--">2.1 默认配置：systemd-timesyncd（你的"贴心小助手"）</h3>
<p>　　Ubuntu 16.04 之后，systemd-timesyncd 成为默认的时间同步服务。它就像那个"默默无闻但很靠谱"的同事——平时不声不响，但工作从不掉链子。</p>
<pre><code class="language-bash"># 检查状态（看看这位同事今天状态如何）
timedatectl status
</code></pre>
<p>　　输出示例：</p>
<pre><code class="language-bash">Local time: 一 2026-01-19 10:30:00 CST
           Universal time: 一 2026-01-19 02:30:00 UTC
                 RTC time: 一 2026-01-19 02:30:00
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes     ← 关键指标：同步状态
              NTP service: active  ← 关键指标：服务状态
          RTC in local TZ: no
</code></pre>
<p>　　<strong>如果看到</strong> <strong><code>System clock synchronized: no</code></strong> <strong>，别慌</strong>，先问问它："兄弟，你还好吗？"</p>
<pre><code class="language-bash"># 查看详细服务状态
systemctl status systemd-timesyncd
</code></pre>
<h3 id="2-2-进阶选择-chrony-时间同步界的-瑞士军刀--">2.2 进阶选择：chrony（时间同步界的"瑞士军刀"）</h3>
<p>　　如果你对时间精度有"强迫症"（比如金融交易系统要求毫秒级同步），或者 systemd-timesyncd"罢工"了，chrony 是你的不二之选。</p>
<div class="language-mermaid">graph TD A[选择时间同步方案] --&gt; B{对精度要求高?} B --&gt;|是| C[使用chrony] B --&gt;|否| D[使用systemd-timesyncd] C --&gt; E[安装并配置chrony] D --&gt; F[检查systemd-timesyncd状态] E --&gt; G[chronyc tracking检查同步] F --&gt; H[timedatectl status检查同步]</div>
<p>　　<strong>安装 chrony</strong>（给系统换个"时间管家"）：</p>
<pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt install chrony
</code></pre>
<p>　　<strong>配置 NTP 服务器</strong>（告诉 chrony 该找谁对表）：</p>
<pre><code class="language-bash">sudo nano /etc/chrony/chrony.conf
</code></pre>
<p>　　在甲骨文云中，有个"秘密武器"——<strong>实例元数据服务</strong>（169.254.169.254），这是云平台内部的高精度时间源：</p>
<pre><code class="language-bash"># 添加这行到配置文件
server 169.254.169.254 iburst prefer
</code></pre>
<blockquote>
 <p>🎯 <strong>专业提示</strong>：<code>iburst</code> 参数表示初始同步时会发送多个请求快速同步，<code>prefer</code> 表示优先使用这个服务器。</p>
</blockquote>
<p>　　<strong>重启并检查</strong>（看看新管家工作得怎么样）：</p>
<pre><code class="language-bash">sudo systemctl restart chrony
chronyc sources -v
</code></pre>
<p>　　输出中的 <code>^*</code> 标记表示当前同步的源。如果没有看到 <code>^*</code>，嗯...可能需要请这位"管家"喝杯咖啡（重启服务）或者换个"管家"（检查配置）。</p>
<hr>
<h2 id="--三-甲骨文云的特殊-彩蛋-与坑点">🔧 三、甲骨文云的特殊"彩蛋"与坑点</h2>
<h3 id="3-1-默认时间源-169-254-169-254-不是-IP-是-爱的号码牌--">3.1 默认时间源：169.254.169.254（不是 IP，是"爱的号码牌"）</h3>
<p>　　甲骨文云实例默认从 <code>169.254.169.254</code> 获取时间。这个 IP 是<strong>实例元数据服务</strong>的地址，不是公网 NTP 服务器。好处多多：</p>
<table>
 <thead>
  <tr>
   <th>特性</th>
   <th>优势</th>
   <th>说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>⏱️ 延迟低</td>
   <td>云内网络，延迟通常在毫秒级</td>
   <td>公网 NTP 通常 10-50ms，这个&lt;1ms</td>
  </tr>
  <tr>
   <td>🎯 精度高</td>
   <td>云平台统一时间源</td>
   <td>避免网络抖动影响</td>
  </tr>
  <tr>
   <td>💰 免费</td>
   <td>不消耗公网流量</td>
   <td>省钱就是硬道理</td>
  </tr>
  <tr>
   <td>🔒 安全</td>
   <td>内部网络，更安全</td>
   <td>避免 NTP 放大攻击</td>
  </tr>
 </tbody>
</table>
<p>　　但要注意：<strong>这个服务只在云实例内部可用</strong>。如果你在本地环境测试，或者需要其他 NTP 服务器，需要手动配置。</p>
<h3 id="3-2-防火墙-别让-门卫-拦住了时间">3.2 防火墙：别让"门卫"拦住了时间</h3>
<p>　　时间同步使用 UDP 123 端口。如果发现时间不同步，先检查这三道"门"：</p>
<pre><code class="language-bash"># 第一道门：系统防火墙
sudo ufw status
# 如果启用了ufw，确保有：
# 123/udp                     ALLOW       Anywhere

# 第二道门：安全组规则（甲骨文云控制台）
# 检查出站规则：是否允许UDP 123端口

# 第三道门：网络ACL
# 甲骨文云网络ACL：确保出站流量允许
</code></pre>
<p>　　记住：<strong>时间同步是"单向"的——客户端主动请求服务器，所以只需要出站规则</strong>。别把防火墙配置成"只进不出"，那样时间就真的"停滞"了。</p>
<hr>
<h2 id="--四-实战-当时间开始-穿越-时-如何优雅地修复">🚑 四、实战：当时间开始"穿越"时，如何优雅地修复</h2>
<h3 id="--场景-1-时间偏差过大-超过-5-分钟-">🆘 场景 1：时间偏差过大（超过 5 分钟）</h3>
<p>　　<strong>症状</strong>：<code>timedatectl status</code> 显示 <code>System clock synchronized: no</code></p>
<p>　　<strong>修复步骤</strong>（急救三部曲）：</p>
<div class="language-mermaid">flowchart TD A[时间不同步告警] --&gt; B[检查timedatectl status] B --&gt; C{System clock synchronized?} C --&gt;|是| D[正常 ✅] C --&gt;|否| E[第一步: 临时手动同步] E --&gt; F[第二步: 检查服务状态和日志] F --&gt; G{问题解决?} G --&gt;|是| D G --&gt;|否| H[第三步: 切换到chrony] H --&gt; I[重新检查同步状态] I --&gt; D</div>
<ol>
 <li><strong>🚨 临时同步</strong>（先救急）：</li>
</ol>
<pre><code class="language-bash"># 先停用自动同步
sudo timedatectl set-ntp false

# 手动同步（紧急止血）
sudo ntpdate -u pool.ntp.org

# 重新启用自动同步
sudo timedatectl set-ntp true
</code></pre>
<ol start="2">
 <li><strong>🔍 检查服务状态</strong>：</li>
</ol>
<pre><code class="language-bash"># 查看服务状态
systemctl status systemd-timesyncd

# 查看最近日志（重点看错误信息）
journalctl -u systemd-timesyncd --since "5 minutes ago" | tail -20
</code></pre>
<ol start="3">
 <li><strong>🔄 如果持续不同步</strong>，考虑切换到 chrony：</li>
</ol>
<pre><code class="language-bash"># 优雅切换：先停用旧的，再启用新的
sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd

sudo apt install chrony -y
sudo systemctl enable --now chrony

# 配置甲骨文云专用NTP
echo "server 169.254.169.254 iburst prefer" | sudo tee -a /etc/chrony/chrony.conf
sudo systemctl restart chrony
</code></pre>
<h3 id="--场景-2-时区设置错误-人在上海-心在-UTC-">🕐 场景 2：时区设置错误（人在上海，心在 UTC）</h3>
<p>　　<strong>症状</strong>：时间显示正确，但时区是 UTC 或其他时区，日志时间戳让人困惑。</p>
<p>　　<strong>修复</strong>：</p>
<pre><code class="language-bash"># 查看所有可用时区（找找你所在的城市）
timedatectl list-timezones | grep -i shanghai

# 设置时区（以上海为例）
sudo timedatectl set-timezone Asia/Shanghai

# 验证设置
date
</code></pre>
<blockquote>
 <p>💡 <strong>小贴士</strong>：生产环境建议统一使用 UTC 时区，避免时区转换带来的混乱。应用层根据业务需求显示本地时间。这样做的优点：</p>
 <ol>
  <li>避免夏令时问题</li>
  <li>日志时间统一</li>
  <li>跨时区协作更方便</li>
 </ol>
</blockquote>
<hr>
<h2 id="--五-高级话题-chrony-的-黑科技-调优">🧪 五、高级话题：chrony 的"黑科技"调优</h2>
<p>　　如果你对时间同步有极致追求，chrony 提供了更多"调优"选项：</p>
<h3 id="5-1-调整同步策略--温柔-还是-强硬--你说了算-">5.1 调整同步策略（"温柔"还是"强硬"，你说了算）</h3>
<p>　　在 <code>/etc/chrony/chrony.conf</code> 中，可以配置不同的同步策略：</p>
<pre><code class="language-bash"># 方案A：更激进的同步策略（适合网络不稳定的环境）
maxchange 1000 0  # 允许更大的时间跳变
makestep 1 3      # 如果偏差超过1秒，立即步进调整

# 方案B：更保守的策略（适合对时间敏感的应用）
maxpoll 12        # 最大轮询间隔（4096秒）
minpoll 6         # 最小轮询间隔（64秒）
</code></pre>
<p>　　<strong>参数解释</strong>：</p>
<ul>
 <li><code>maxchange</code>：允许的最大时间调整量</li>
 <li><code>makestep</code>：时间偏差超过阈值时是否"跳变"</li>
 <li><code>maxpoll</code>/<code>minpoll</code>：轮询间隔，值越大同步频率越低</li>
</ul>
<h3 id="5-2-监控和诊断--把脉-时间同步-">5.2 监控和诊断（"把脉"时间同步）</h3>
<pre><code class="language-bash"># 查看详细的同步状态
chronyc tracking
</code></pre>
<p>　　输出示例：</p>
<pre><code class="language-bash">Reference ID    : C0A80101 (169.254.169.254)
Stratum         : 3
Ref time (UTC)  : Mon Jan 19 02:30:00 2026
System time     : 0.000123 seconds fast of NTP time
Last offset     : +0.000045 seconds
RMS offset      : 0.000078 seconds
Frequency       : 1.234 ppm fast
Residual freq   : +0.001 ppm
Skew            : 0.123 ppm
Root delay      : 0.012345 seconds
Root dispersion : 0.023456 seconds
Update interval : 64.2 seconds
Leap status     : Normal
</code></pre>
<blockquote>
 <p>📊 <strong>看懂关键指标</strong>：</p>
 <ul>
  <li><code>System time</code>：正数表示系统时间快了，负数表示慢了</li>
  <li><code>Last offset</code>：最近一次同步的偏移量</li>
  <li><code>Stratum</code>：时间源层级，数字越小越接近源头</li>
  <li>理想状态：offset &lt; 1ms，stratum ≤ 5</li>
 </ul>
</blockquote>
<h3 id="5-3-可视化监控-Grafana-看板-">5.3 可视化监控（Grafana 看板）</h3>
<p>　　如果需要更直观的监控，可以配置 Prometheus+Grafana 监控时间偏移：</p>
<pre><code class="language-bash"># node_exporter的textfile收集器配置
# 创建收集脚本
cat &gt; /usr/local/bin/ntp_offset.sh &lt;&lt; 'EOF'
#!/bin/bash
offset=$(chronyc tracking | grep 'System time' | awk '{print $4}')
echo "ntp_offset" $offset
EOF

# 添加到crontab每分钟执行
echo "* * * * * /usr/local/bin/ntp_offset.sh &gt; /var/lib/node_exporter/ntp_offset.prom" | sudo tee -a /etc/crontab
</code></pre>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F1384107394.webp%21wwater%2Ffw%2F500&amp;size=m" alt="Grafana 中的 NTP 监控看板示例" title="Grafana中的NTP监控看板示例"></p>
<hr>
<h2 id="--六-总结-时间同步的-哲学-与最佳实践">🎓 六、总结：时间同步的"哲学"与最佳实践</h2>
<p>　　时间同步看似简单，实则暗藏玄机。经过多年的"血泪教训"，我总结了几个关键点：</p>
<h3 id="--最佳实践清单">🏆 最佳实践清单</h3>
<ol>
 <li><strong>✅ 默认配置通常够用</strong>：甲骨文 Ubuntu 的 systemd-timesyncd + 169.254.169.254，99% 的场景无需折腾</li>
 <li><strong>✅ 问题排查有顺序</strong>：先检查服务状态 → 查看日志 → 检查网络 → 考虑切换服务</li>
 <li><strong>✅ 时区设置要统一</strong>：生产环境建议 UTC，避免"时区地狱"</li>
 <li><strong>✅ 监控不能少</strong>：配置监控告警，及时发现时间偏差</li>
 <li><strong>✅ 文档要记录</strong>：记录每台服务器的时间同步配置，便于排查</li>
</ol>
<h3 id="--性能指标参考">📈 性能指标参考</h3>
<table>
 <thead>
  <tr>
   <th>指标</th>
   <th>优秀</th>
   <th>良好</th>
   <th>需要关注</th>
   <th>紧急</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>时间偏移</td>
   <td>&lt;1ms</td>
   <td>1-10ms</td>
   <td>10-100ms</td>
   <td>&gt;100ms</td>
  </tr>
  <tr>
   <td>stratum 层级</td>
   <td>1-2</td>
   <td>3-4</td>
   <td>5-6</td>
   <td>&gt;6</td>
  </tr>
  <tr>
   <td>同步间隔</td>
   <td>稳定</td>
   <td>偶尔抖动</td>
   <td>频繁重连</td>
   <td>不同步</td>
  </tr>
 </tbody>
</table>
<h3 id="--运维箴言">📚 运维箴言</h3>
<blockquote>
 <p><strong>"时间是相对的，但服务 SLA 是绝对的。别让你的服务器在'时间旅行'中迷失方向。"</strong></p>
</blockquote>
<blockquote>
 <p><strong>"好的时间同步，用户无感知；坏的时间同步，运维跑断腿。"</strong></p>
</blockquote>
<blockquote>
 <p><strong>"配置时间同步只需要 5 分钟，排查时间不同步可能需要 5 小时。你选哪个？"</strong></p>
</blockquote>
<hr>
<h2 id="--附录-运维老司机的-生存工具包-">📋 附录：运维老司机的"生存工具包"</h2>
<h3 id="常用命令速查表">常用命令速查表</h3>
<pre><code class="language-bash"># 基础检查
timedatectl status                    # 查看时间同步状态（首选）
timedatectl show-timesync            # 显示详细时间同步信息
timedatectl set-ntp true             # 启用自动时间同步

# systemd-timesyncd相关
systemctl status systemd-timesyncd    # 检查服务状态
journalctl -u systemd-timesyncd       # 查看服务日志
systemctl restart systemd-timesyncd  # 重启服务

# chrony相关（如使用）
chronyc tracking                     # 查看同步状态
chronyc sources -v                   # 查看NTP源详情
chronyc sourcestats                  # 查看统计信息
chronyc activity                     # 查看活动状态

# 网络诊断
ss -tuln | grep :123                 # 检查NTP端口监听
ping 169.254.169.254 -c 3            # 测试元数据服务连通性
sudo tcpdump -i any port 123 -c 10   # 抓包分析NTP流量

# 时区管理
timedatectl list-timezones           # 列出所有时区
timedatectl set-timezone Asia/Shanghai # 设置时区
cat /etc/timezone                    # 查看当前时区文件
</code></pre>
<h3 id="配置文件位置速查">配置文件位置速查</h3>
<table>
 <thead>
  <tr>
   <th>服务</th>
   <th>主配置文件</th>
   <th>日志位置</th>
   <th>状态文件</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>systemd-timesyncd</td>
   <td><code>/etc/systemd/timesyncd.conf</code></td>
   <td><code>journalctl -u systemd-timesyncd</code></td>
   <td>无</td>
  </tr>
  <tr>
   <td>chrony</td>
   <td><code>/etc/chrony/chrony.conf</code></td>
   <td><code>/var/log/chrony/</code></td>
   <td><code>/var/lib/chrony/</code></td>
  </tr>
  <tr>
   <td>ntp (传统)</td>
   <td><code>/etc/ntp.conf</code></td>
   <td><code>/var/log/ntp.log</code></td>
   <td><code>/var/lib/ntp/</code></td>
  </tr>
 </tbody>
</table>
<h3 id="紧急恢复脚本">紧急恢复脚本</h3>
<pre><code class="language-bash">#!/bin/bash
# 文件名: fix_time_sync.sh
# 描述: 时间同步紧急恢复脚本
# 用法: sudo bash fix_time_sync.sh

set -e

echo "🕐 开始检查时间同步状态..."
echo "========================================"

# 检查当前时间
echo "当前系统时间: $(date)"
echo "UTC时间: $(date -u)"
timedatectl status

echo ""
echo "🔧 尝试修复..."
echo "========================================"

# 停止自动同步
sudo timedatectl set-ntp false
echo "✅ 已停止自动时间同步"

# 安装ntpdate（如未安装）
if ! command -v ntpdate &amp;&gt; /dev/null; then
    echo "📦 安装ntpdate..."
    sudo apt update &amp;&amp; sudo apt install -y ntpdate
fi

# 手动同步
echo "⏰ 手动同步时间..."
sudo ntpdate -u pool.ntp.org

# 重新启用自动同步
echo "🔄 重新启用自动同步..."
sudo timedatectl set-ntp true

# 检查结果
echo ""
echo "✅ 修复完成，检查状态:"
sleep 2
timedatectl status

if timedatectl status | grep -q "System clock synchronized: yes"; then
    echo "🎉 时间同步已恢复！"
else
    echo "⚠️  时间同步仍存在问题，建议检查日志: journalctl -u systemd-timesyncd"
fi
</code></pre>
<p>　　‍</p>
<p>我的博客即将同步至腾讯云开发者社区，邀请大家一同入驻：</p>
<hyperlink-card href="https://cloud.tencent.com/developer/support-plan?invite_code=2jp4hmdrbbc4g" target="_blank" theme="small"></hyperlink-card>]]></description><guid isPermaLink="false">/archives/time-synchronization-when-your-server-starts-to-travel-how-to-bring-it-back-to-reality</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F2009394918.webp%21wwater%2Ffw%2F500&amp;size=m" type="image/jpeg" length="16488"/><category>技巧</category><category>分享</category><pubDate>Mon, 19 Jan 2026 01:50:00 GMT</pubDate></item><item><title><![CDATA[Typecho 又拍云文件管理插件修改版使用指南：新增自定义目录结构功能]]></title><link>https://wuqishi.com/archives/Typecho-UpyunFile-Modified-added-custom-directory-structure-function</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Typecho%20%E5%8F%88%E6%8B%8D%E4%BA%91%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E6%8F%92%E4%BB%B6%E4%BF%AE%E6%94%B9%E7%89%88%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97%EF%BC%9A%E6%96%B0%E5%A2%9E%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E5%8A%9F%E8%83%BD&amp;url=/archives/Typecho-UpyunFile-Modified-added-custom-directory-structure-function" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%89%8D%E8%A8%80%EF%BC%9A%E4%B8%80%E6%AC%A1%E5%BF%85%E8%A6%81%E7%9A%84%E6%8F%92%E4%BB%B6%E5%8D%87%E7%BA%A7">前言：一次必要的插件升级</h2>
<p style="">时隔多年重新提笔，恰逢新年伊始，我为自己的网站进行了一次"迁徙"，将服务器环境进行了全面升级。在此过程中，发现长期使用的又拍云文件管理插件已无法正常使用。经过一番寻觅，竟意外找到了自己多年前在一位修改者处的留言痕迹，这奇妙的缘分促使我决定分享这个插件的修改版本。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F2638608497.webp%21water&amp;size=m" alt="当年给修改者的留言" title="多年前的留言记录，如今看来颇有感触" width="500px">
 <figcaption data-placeholder="添加描述" style="width: 500px; max-width: 100%; text-align: center;">当年给修改者的留言</figcaption>
</figure>
<h2 style="" id="%E6%8F%92%E4%BB%B6%E6%A0%B8%E5%BF%83%E5%8A%9F%E8%83%BD%E5%85%A8%E6%99%AF%E8%A7%88">插件核心功能全景览</h2>
<p style="">这个基于 <code>liuran001</code> 原版的修改版插件，保留了所有核心功能，并进行了重要增强：</p>
<ol>
 <li>
  <p style="">文件管理基础功能 - 完整的文件上传、修改和删除操作支持</p>
 </li>
 <li>
  <p style="">CDN加速集成 - 静态资源无缝接入又拍云CDN网络</p>
 </li>
 <li>
  <p style="">URL批量替换 - 一键将博客中所有图片URL替换为CDN加速链接</p>
 </li>
 <li>
  <p style="">智能图片处理 - 深度集成又拍云图片处理服务</p>
 </li>
 <li>
  <p style="">安全防护机制 - 为静态资源添加Token防盗链保护</p>
 </li>
</ol>
<h2 style="" id="%E2%9C%A8-%E9%87%8D%E7%A3%85%E5%8D%87%E7%BA%A7%EF%BC%9A%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84%E5%8A%9F%E8%83%BD">✨ 重磅升级：自定义目录结构功能</h2>
<p style="">本次修改的核心亮点在于新增了自定义目录结构功能，彻底解决了原版在目录组织上的局限性</p>
<h3 style="" id="%E5%8A%9F%E8%83%BD%E7%89%B9%E7%82%B9">功能特点</h3>
<p style="">通过后台界面直接设置所需的目录结构</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F3575613870.webp%21water%2Ffw%2F500&amp;size=m" alt="新增自定义结构的目录结构模式" title="全新的目录结构配置界面，操作直观简便">
</figure>
<h2 style="" id="%E2%9A%A0%EF%B8%8F-%E9%87%8D%E8%A6%81%E9%85%8D%E7%BD%AE%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9">⚠️ 重要配置注意事项</h2>
<h3 style="" id="%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86%E9%85%8D%E7%BD%AE">图片处理配置</h3>
<ol>
 <li>
  <p style="">缩略图版本创建：需在又拍云控制台创建缩略图版本，并将版本名称填入插件对应配置项</p>
 </li>
 <li>
  <p style="">特殊文件处理：带有 <code>nothumb​</code><em>后缀的图片（如 </em><code>examplenothumb.png</code>​）会被又拍云图片处理服务忽略</p>
 </li>
 <li>
  <p style="">格式转码设置：如缩略图版本启用了转码功能，可以在插件中指定输出格式</p>
 </li>
 <li>
  <p style="">格式支持范围：仅<code>JPG</code>、<code>JPEG</code>、<code>PNG</code>、<code>BMP</code>四种格式的图片会进行处理</p>
 </li>
</ol>
<h3 style="" id="%E5%AE%89%E5%85%A8%E9%98%B2%E6%8A%A4%E9%85%8D%E7%BD%AE">安全防护配置</h3>
<ul>
 <li>
  <p style="">Token防盗链：在又拍云控制台启用Token防盗链功能后，需将密钥准确填入插件配置</p>
 </li>
 <li>
  <p style="">密钥管理：建议定期更换密钥以提高安全性</p>
 </li>
</ul>
<h2 style="" id="%F0%9F%93%8B-%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95">📋 版本更新记录</h2>
<p style="">V1.1 版本更新内容：</p>
<ul>
 <li>
  <p style="">✅ 新增自定义目录结构功能</p>
 </li>
 <li>
  <p style="">✅ 优化后台配置界面用户体验</p>
 </li>
 <li>
  <p style="">✅ 增强与最新Typecho版本的兼容性</p>
 </li>
</ul>
<h2 style="" id="%F0%9F%94%A7-%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97">🔧 安装与使用指南</h2>
<h3 style="" id="%E7%B3%BB%E7%BB%9F%E8%A6%81%E6%B1%82">系统要求</h3>
<ul>
 <li>
  <p style="">Typecho 1.1+ 版本</p>
 </li>
 <li>
  <p style="">PHP 7.0+ 运行环境</p>
 </li>
 <li>
  <p style="">有效的又拍云服务账号</p>
 </li>
</ul>
<h3 style="" id="%E5%AE%89%E8%A3%85%E6%AD%A5%E9%AA%A4">安装步骤</h3>
<ol>
 <li>
  <p style="">下载插件压缩包</p>
 </li>
 <li>
  <p style="">解压至Typecho的usr/plugins​目录</p>
 </li>
 <li>
  <p style="">在Typecho后台启用插件</p>
 </li>
 <li>
  <p style="">配置又拍云服务参数</p>
 </li>
 <li>
  <p style="">设置自定义目录结构偏好</p>
 </li>
</ol>
<h3 style="" id="%E4%B8%8B%E8%BD%BD%E4%BF%A1%E6%81%AF">下载信息</h3>
<p style="">插件下载地址：</p>
<download-links data-links="[{&quot;url&quot;:&quot;https://ssslove.lanzouu.com/iz9w03g0m1kd&quot;,&quot;filename&quot;:&quot;UpyunFile-1.1.zip&quot;,&quot;source&quot;:&quot;蓝奏云网盘&quot;,&quot;code&quot;:&quot;ddzj&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/lanzou.png&quot;}]"></download-links>
<h2 style="" id="%F0%9F%86%98-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E7%AD%94">🆘 常见问题解答</h2>
<p style="">Q：插件安装后无法正常使用？</p>
<p style="">A：请检查又拍云服务配置是否正确，特别是空间名称和操作员权限设置。</p>
<p style="">Q：图片处理效果不理想怎么办？</p>
<p style="">A：建议在又拍云控制台调整缩略图版本参数，或参考<hyperlink-inline-card target="_blank" href="https://help.upyun.com/knowledge-base/image/" theme="inline" custom-title="图片处理 – 又拍云-文档帮助中心" custom-image="https://help-admin.upyun.com/wp-content/uploads/2018/08/favicon-50x50.png"><a href="https://help.upyun.com/knowledge-base/image/" target="_blank">https://help.upyun.com/knowledge-base/image/</a></hyperlink-inline-card>进行优化。</p>
<p style="">版权声明：本插件基于开源项目修改，仅供学习交流使用。请遵守又拍云服务条款及相关法律法规。</p>]]></description><guid isPermaLink="false">/archives/Typecho-UpyunFile-Modified-added-custom-directory-structure-function</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F2638608497.webp%21water&amp;size=m" type="image/jpeg" length="6978"/><category>分享</category><pubDate>Fri, 9 Jan 2026 07:34:00 GMT</pubDate></item><item><title><![CDATA[华为鸿蒙6.0回退4.2记录]]></title><link>https://wuqishi.com/archives/huawei-harmonyos-6-0-rollback-4-2-record</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%8D%8E%E4%B8%BA%E9%B8%BF%E8%92%996.0%E5%9B%9E%E9%80%804.2%E8%AE%B0%E5%BD%95&amp;url=/archives/huawei-harmonyos-6-0-rollback-4-2-record" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F1997446029.webp%21wwater%2Ffw%2F500&amp;size=m" alt="鸿蒙系统6.0回退4.2"></p>
<h2 id="华为鸿蒙系统6-0问题">华为鸿蒙系统6.0问题</h2>
<p>自从华为鸿蒙系统升级6.0后，出现了<strong>部分软件出现不适配现象，导致许多功能无法正常使用</strong>。比如在使用抖音时就有功能出现异常等，很影响日常使用。</p>
<p>于是就想着回退到4.2系统，以下是回退的详细步骤。</p>
<h2 id="回退旧系统的步骤">回退旧系统的步骤</h2>
<p><strong>请注意提前备份重要数据！</strong>
 <br>
 <strong>请注意提前备份重要数据！！</strong>
 <br>
 <strong>请注意提前备份重要数据！！！</strong></p>
<ul>
 <li><strong>步骤1</strong>：开启开发者选项。在「设置→关于本机」中，连续点击7次「软件版本」，并重启手机以开启开发者选项。</li>
 <li><strong>步骤2</strong>：进入系统回退页面。打开「设置→系统→开发者选项」，找到并点击「系统回退」，填写回退原因（如：软件不适配）。</li>
 <li><strong>步骤3</strong>：确认回退并备份数据。点击「仍然回退」完成回退反馈后，继续阅读风险提示并勾选“我已了解风险”。然后，进入备份页面点击「开始备份」，备份完成后点击「开始回退」。</li>
 <li><strong>步骤4</strong>：下载安装包并自动回退。按照提示下载相应的安装包，并等待系统自动完成回退操作。连接WLAN后，系统将自动下载回退所需的安装包。一旦下载完成，点击弹出的「立即回退」按钮，随后等待系统进行校验并自动重启。请耐心等待片刻，重启后您的手机桌面将恢复显示原HarmonyOS版本4.2。-</li>
</ul>
<hr>
<p>至此打住吧，其他的就不多说了</p>]]></description><guid isPermaLink="false">/archives/huawei-harmonyos-6-0-rollback-4-2-record</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2026%2F01%2F1997446029.webp%21wwater%2Ffw%2F500&amp;size=m" type="image/jpeg" length="20116"/><category>分享</category><pubDate>Mon, 5 Jan 2026 08:03:00 GMT</pubDate></item><item><title><![CDATA[最近小公主情绪不佳]]></title><link>https://wuqishi.com/archives/little-princess-in-bad-mood</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%9C%80%E8%BF%91%E5%B0%8F%E5%85%AC%E4%B8%BB%E6%83%85%E7%BB%AA%E4%B8%8D%E4%BD%B3&amp;url=/archives/little-princess-in-bad-mood" width="1" height="1" alt="" style="opacity:0;">
<p>最近小公主情绪不佳，老是闹脾气，哎~</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-2919D1C6-77F7-44AB-9F4D-ABAD5C3F200B_1_105_c.webp%21wwater%2Ffw%2F600&amp;size=m" alt="大手牵小手"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-2821FF35-56FF-4D84-84A1-55AE68234C64_1_105_c.webp%21wwater%2Ffw%2F600&amp;size=m" alt="击个掌吧"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-D7F18040-3058-4B79-9B1E-1CA2488711EA_1_105_c.webp%21wwater%2Ffw%2F600&amp;size=m" alt="咋就晒成这样呢"></p>]]></description><guid isPermaLink="false">/archives/little-princess-in-bad-mood</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-2919D1C6-77F7-44AB-9F4D-ABAD5C3F200B_1_105_c.webp%21wwater%2Ffw%2F600&amp;size=m" type="image/jpeg" length="48532"/><category>蛋花</category><pubDate>Wed, 17 May 2023 02:33:00 GMT</pubDate></item><item><title><![CDATA[劳动节的家乡景色]]></title><link>https://wuqishi.com/archives/hometown-scenery-on-labor-day</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%8A%B3%E5%8A%A8%E8%8A%82%E7%9A%84%E5%AE%B6%E4%B9%A1%E6%99%AF%E8%89%B2&amp;url=/archives/hometown-scenery-on-labor-day" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2">写在前面</h2>
<p style="">因为疫情的原因，去年没有回老家过年。也是我长这么大第一次过年没有与家人团聚。</p>
<p style="">疫情的影响真的很大，不往宏观里说，小到个人生活里，现在出门没有戴口罩总感觉不得劲，缺少了什么似的。</p>
<p style="">这个五一过后，估计又有一小波疫情要刷新闻了吧。</p>
<p style="">因为太久没回了，虽然平时也有视频通话，但是居居总喃喃要回去见爷爷奶奶，其实更多的原因是她可以找表姐玩。</p>
<h2 style="" id="%E5%9B%9E%E5%AE%B6%E5%92%AF">回家咯</h2>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-go-home-bus.webp%21wwater&amp;size=m" alt="去动车站的公交" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">去动车站的公交</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-home-dinner.webp%21wwater&amp;size=m" alt="母亲准备的晚餐" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">母亲准备的晚餐</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042137154.webp%21wwater&amp;size=m" alt="小酌" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">小酌</figcaption>
</figure>
<h2 style="" id="%E5%AD%A6%E6%A0%A1%E9%99%84%E8%BF%91%E5%85%AC%E5%9B%AD">学校附近公园</h2>
<p style="">第二天本来想带居居去我的高中逛逛，然而到目前为止，学校仍然没有开放。</p>
<p style="">能进出的只有即将高考的小朋友们，想想自己当初的校园生活，感慨时间过的真快啊。</p>
<p style="">刚好学校附近有一些公园，就带着居居一起吧。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042142608.webp%21wwater%2Ffw%2F600&amp;size=m" alt="心田石正面" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">心田石正面</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042145632.webp%21water&amp;size=m" alt="心田石侧面" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">心田石侧面</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042148555.webp%21wwater&amp;size=m" alt="放生池" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">放生池</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042150926.webp%21wwater&amp;size=m" alt="福石正面" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">福石正面</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042152185.webp%21wwater&amp;size=m" alt="福石背面" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">福石背面</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042156153.webp%21wwater&amp;size=m" alt="福星桥" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">福星桥</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042157008.webp%21wwater&amp;size=m" alt="飞机痕" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">飞机痕</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042159498.webp%21wwater&amp;size=m" alt="河面与宝塔" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">河面与宝塔</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042200038.webp%21wwater&amp;size=m" alt="古刹隐于枝丫中" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">古刹隐于枝丫中</figcaption>
</figure>
<h2 style="" id="%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84%E4%B8%87%E8%BE%BE%E5%B9%BF%E5%9C%BA">开发中的万达广场</h2>
<p style="">晚上和全家一起去看看开发中的万达广场，不知道我们县城这样的小地方，为什么被看中。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042202294.webp%21wwater&amp;size=m" alt="万达广场预售楼沙盘1" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">万达广场预售楼沙盘1</figcaption>
</figure>
<p style=""></p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042204758.webp%21wwater&amp;size=m" alt="万达广场预售楼沙盘2" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">万达广场预售楼沙盘2</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042205366.webp%21wwater&amp;size=m" alt="万达广场预售楼沙盘3" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">万达广场预售楼沙盘3</figcaption>
</figure>
<h2 style="" id="%E7%94%B0%E5%9B%AD%E6%B0%94%E6%81%AF">田园气息</h2>
<p style="">第二天带居居到田地里感受一下田园气息，抓抓蝌蚪，在田坎上跑跑跳跳。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042208912.webp%21wwater&amp;size=m" alt="窄桥" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">窄桥</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042205474.webp%21wwater&amp;size=m" alt="胡瓜" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">胡瓜</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042206315.webp%21wwater&amp;size=m" alt="未成熟的西红柿" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">未成熟的西红柿</figcaption>
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-202305042207130.webp%21wwater&amp;size=m" alt="这个也没有成熟" width="50%" height="auto">
 <figcaption data-placeholder="添加描述" style="width: 50%; max-width: 100%; text-align: center;">这个也没有成熟</figcaption>
</figure>
<hr>
<p style="">希望居居健康快乐成长。</p>]]></description><guid isPermaLink="false">/archives/hometown-scenery-on-labor-day</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-go-home-bus.webp%21wwater%2Ffw%2F600&amp;size=m" type="image/jpeg" length="123176"/><category>蛋花</category><pubDate>Fri, 5 May 2023 02:02:00 GMT</pubDate></item><item><title><![CDATA[烟台山公园一游]]></title><link>https://wuqishi.com/archives/tour-yantaishan-park</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%83%9F%E5%8F%B0%E5%B1%B1%E5%85%AC%E5%9B%AD%E4%B8%80%E6%B8%B8&amp;url=/archives/tour-yantaishan-park" width="1" height="1" alt="" style="opacity:0;">
<h2 id="写在前面的话">写在前面的话</h2>
<p>烟台山未开发时就上去走过，原始的森林诉说着古老和沧桑，虽然给人一种落败却也让人感受历史的沉淀。</p>
<p>后来进入了开发，我想只有了解它过去的人，从围挡的墙里，隐隐约约间，感受到它经历着伤痛。</p>
<p>现如今啊，熙熙攘攘的人群里，看不到它的古老和沧桑了，仿佛楼前的莺莺燕燕，妮妮喃喃。</p>
<p>它获得了新生了吧！</p>
<h2 id="新的记录">新的记录</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7712.webp%21wwater%2Ffw%2F600&amp;size=m" alt="素满香">
 <br>
 这是一家素食餐厅，是连锁的，里面没有肉食，我看到过很多佛家弟子来过。</p>
<p>若我没记错，辛辣也属于荤，不知道现在的和尚为什么不忌口了？阿弥陀佛！
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7715.webp%21wwater%2Ffw%2F600&amp;size=m" alt="中洲岛东侧"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7716.webp%21wwater%2Ffw%2F600&amp;size=m" alt="中洲岛西侧">
 <br>
 当年新房装修是曾到过这里选窗帘，这么多年过去了，时移世易，兜兜转转里它有经历过多少轮租赁洽谈呢？
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7717.webp%21wwater%2Ffw%2F600&amp;size=m" alt="一个观光小码头"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7718.webp%21wwater%2Ffw%2F600&amp;size=m" alt="天桥上的迎宾玩偶"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7719.webp%21wwater%2Ffw%2F600&amp;size=m" alt="天桥上看到的观光码头">
 <br>
 烟台山正门前的风光吧，码头、天桥、迎宾玩偶。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7728.webp%21wwater%2Ffw%2F600&amp;size=m" alt="数学与英文？"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7724.webp%21wwater%2Ffw%2F600&amp;size=m" alt="万境烟山"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7729.webp%21wwater%2Ffw%2F600&amp;size=m" alt="天桥旁"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7725.webp%21wwater%2Ffw%2F600&amp;size=m" alt="小巷里"></p>
<p>烟台山正门入口的建筑，处处都打上了“烟台山”的烙印。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7753.webp%21wwater%2Ffw%2F600&amp;size=m" alt="美国领事馆旧址"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7754.webp%21wwater%2Ffw%2F600&amp;size=m" alt="美国领事馆旧址介绍牌"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7755.webp%21wwater%2Ffw%2F600&amp;size=m" alt="哦，爱国路2号">
 <br>
 爱国路2号的美国领事馆旧址，进去参观要收费的哟，美国不愧是万恶的资本家！
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7765.webp%21wwater%2Ffw%2F600&amp;size=m" alt="烟台山公园"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7776.webp%21wwater%2Ffw%2F600&amp;size=m" alt="古烟台题字"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7777.webp%21wwater%2Ffw%2F600&amp;size=m" alt="古烟台"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7779.webp%21wwater%2Ffw%2F600&amp;size=m" alt="古烟台-近"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7780.webp%21wwater%2Ffw%2F600&amp;size=m" alt="古烟台-远">
 <br>
 这就是整个烟台山名称的由来——古烟台。</p>
<p>说实话是不是挺让人失望的，是！</p>
<p>看到烟台的就想到了：狼烟起，江山北望......</p>
<p>这一培小小的烟台，其实是可以让人感受到历史的残酷和岁月的无情。</p>
<p>让人失望的是却毫无保护措施，好比家门前的泥坑。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7775.webp%21wwater%2Ffw%2F600&amp;size=m" alt="仙女也扶额">
 <br>
 这个扶额的仙女雕像很好的说明了什么。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7789.webp%21wwater%2Ffw%2F600&amp;size=m" alt="改造继续">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7818.webp%21wwater%2Ffw%2F600&amp;size=m" alt="氢气球：晨舒宝贝">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7819.webp%21water%2Ffw%2F600&amp;size=m" alt="氢气球：头像">
 <br>
 这两个氢气球是给女儿的，排了近一个小时的队，感受高科技数字化书写体验。
 <br>
 <del>“就很棒”！</del>
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7743.webp%21water%2Ffw%2F600&amp;size=m" alt="商家的许愿球">放唯一一张涉及商业气息的图片，所有美好的愿望都不要被辜负。
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7752.webp%21wwater%2Ffw%2F600&amp;size=m" alt="瓦砾缝隙外的春天">
 <br>
 从瓦砾的缝隙中，感受春天，只有大自然，给人带来一些另外的气息。
 <br>
 就很棒！
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7820.webp%21wwater%2Ffw%2F600&amp;size=m" alt="紫色花"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7772.webp%21wwater%2Ffw%2F600&amp;size=m" alt="蜜蜂忙"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7770.webp%21wwater%2Ffw%2F600&amp;size=m" alt="蜜蜂很忙"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7769.webp%21wwater%2Ffw%2F600&amp;size=m" alt="万绿点点红"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7764.webp%21wwater%2Ffw%2F600&amp;size=m" alt="未名花"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7759.webp%21wwater%2Ffw%2F600&amp;size=m" alt="苍劲须"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7758.webp%21wwater%2Ffw%2F600&amp;size=m" alt="茂密叶"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7756.webp%21wwater%2Ffw%2F600&amp;size=m" alt="小巷绿"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7750.webp%21wwater%2Ffw%2F600&amp;size=m" alt="蓬勃草"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7741.webp%21wwater%2Ffw%2F600&amp;size=m" alt="独红花"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7736.webp%21wwater%2Ffw%2F600&amp;size=m" alt="花锦簇"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7735.webp%21wwater%2Ffw%2F600&amp;size=m" alt="绿中紫"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7731.webp%21wwater%2Ffw%2F600&amp;size=m" alt="像鬼脸"><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7730.webp%21wwater%2Ffw%2F600&amp;size=m" alt="风中笑"></p>
<h2 id="写在后面的话">写在后面的话</h2>
<p>说实话，商业气息是趋势，走走玩玩，吃吃喝喝，有刚需就是这些。</p>
<p>整个烟台山啊，旧的不去新的不来吧！</p>
<p>让人最失望的就是古烟台了，管中窥豹，如此新生！</p>]]></description><guid isPermaLink="false">/archives/tour-yantaishan-park</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7765.webp%21wwater%2Ffw%2F600&amp;size=m" type="image/jpeg" length="136254"/><category>蛋花</category><pubDate>Sun, 23 Apr 2023 07:51:00 GMT</pubDate></item><item><title><![CDATA[群晖搭建ChatGPT Web]]></title><link>https://wuqishi.com/archives/synology-building-chatgpt-web</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BE%A4%E6%99%96%E6%90%AD%E5%BB%BAChatGPT%20Web&amp;url=/archives/synology-building-chatgpt-web" width="1" height="1" alt="" style="opacity:0;">
<h2 id="ChatGPT-Web介绍">ChatGPT Web介绍</h2>
<blockquote>
 <p>ChatGPT Web是用 Express 和 Vue3 搭建的 ChatGPT 演示网页。目前在已有19k的星标。</p>
</blockquote>
<p>本项目支持双模型，提供了两种非官方 <code>ChatGPT API</code> 方法</p>
<table>
 <thead>
  <tr>
   <th>方式</th>
   <th>免费？</th>
   <th>可靠性</th>
   <th>质量</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code>ChatGPTAPI(gpt-3.5-turbo-0301)</code></td>
   <td>否</td>
   <td>可靠</td>
   <td>相对较笨</td>
  </tr>
  <tr>
   <td><code>ChatGPTUnofficialProxyAPI(网页 accessToken)</code></td>
   <td>是</td>
   <td>相对不可靠</td>
   <td>聪明</td>
  </tr>
 </tbody>
</table>
<p>对比：</p>
<ol>
 <li><code>ChatGPTAPI</code> 使用 <code>gpt-3.5-turbo</code> 通过 <code>OpenAI</code> 官方 <code>API</code> 调用 <code>ChatGPT</code></li>
 <li><code>ChatGPTUnofficialProxyAPI</code> 使用非官方代理服务器访问 <code>ChatGPT</code> 的后端<code>API</code>，绕过<code>Cloudflare</code>（依赖于第三方服务器，并且有速率限制）</li>
</ol>
<p>警告：</p>
<ol>
 <li>你应该首先使用 <code>API</code> 方式</li>
 <li>使用 <code>API</code> 时，如果网络不通，那是国内被墙了，你需要自建代理，绝对不要使用别人的公开代理，那是危险的。</li>
 <li>使用 <code>accessToken</code> 方式时反向代理将向第三方暴露您的访问令牌，这样做应该不会产生任何不良影响，但在使用这种方法之前请考虑风险。</li>
 <li>使用 <code>accessToken</code> 时，不管你是国内还是国外的机器，都会使用代理。默认代理为 <a href="https://github.com/acheong08">acheong08</a> 大佬的 <code>https://bypass.churchless.tech/api/conversation</code>，这不是后门也不是监听，除非你有能力自己翻过 <code>CF</code> 验证，用前请知悉。<a href="https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy">社区代理</a>（注意：只有这两个是推荐，其他第三方来源，请自行甄别）</li>
 <li>把项目发布到公共网络时，你应该设置 <code>AUTH_SECRET_KEY</code> 变量添加你的密码访问权限，你也应该修改 <code>index.html</code> 中的 <code>title</code>，防止被关键词搜索到。</li>
</ol>
<h2 id="目前实现的功能">目前实现的功能</h2>
<ul>
 <li class="vditor-task vditor-task--done"><input checked disabled type="checkbox"> 双模型</li>
</ul>
<ul>
 <li class="vditor-task vditor-task--done">
  <p><input checked disabled type="checkbox"> 多会话储存和上下文逻辑</p>
 </li>
 <li class="vditor-task vditor-task--done">
  <p><input checked disabled type="checkbox"> 对代码等消息类型的格式化美化处理</p>
 </li>
</ul>
<ul>
 <li class="vditor-task vditor-task--done">
  <p><input checked disabled type="checkbox"> 访问权限控制</p>
 </li>
 <li class="vditor-task vditor-task--done">
  <p><input checked disabled type="checkbox"> 数据导入、导出</p>
 </li>
</ul>
<ul>
 <li class="vditor-task vditor-task--done">
  <p><input checked disabled type="checkbox"> 保存消息到本地图片</p>
 </li>
 <li class="vditor-task vditor-task--done">
  <p><input checked disabled type="checkbox"> 界面多语言</p>
 </li>
 <li class="vditor-task vditor-task--done">
  <p><input checked disabled type="checkbox"> 界面主题</p>
 </li>
 <li class="vditor-task">
  <p><input disabled type="checkbox"> More...]</p>
 </li>
</ul>
<h2 id="群晖搭建">群晖搭建</h2>
<h3 id="环境变量">环境变量</h3>
<p><code>API</code> 可用：</p>
<ul>
 <li><code>OPENAI_API_KEY</code> 和 <code>OPENAI_ACCESS_TOKEN</code> 二选一</li>
 <li><code>OPENAI_API_MODEL</code> 设置模型，可选，默认：<code>gpt-3.5-turbo</code></li>
 <li><code>OPENAI_API_BASE_URL</code> 设置接口地址，可选，默认：<code>https://api.openai.com</code></li>
 <li><code>OPENAI_API_DISABLE_DEBUG</code> 设置接口关闭 debug 日志，可选，默认：empty 不关闭</li>
</ul>
<p><code>ACCESS_TOKEN</code> 可用：</p>
<ul>
 <li><code>OPENAI_ACCESS_TOKEN</code> 和 <code>OPENAI_API_KEY</code> 二选一，同时存在时，<code>OPENAI_API_KEY</code> 优先</li>
 <li><code>API_REVERSE_PROXY</code> 设置反向代理，可选，默认：<code>https://bypass.churchless.tech/api/conversation</code>，<a href="https://github.com/transitive-bullshit/chatgpt-api#reverse-proxy">社区</a>（注意：只有这两个是推荐，其他第三方来源，请自行甄别）</li>
</ul>
<p>通用：</p>
<ul>
 <li><code>AUTH_SECRET_KEY</code> 访问权限密钥，可选</li>
 <li><code>MAX_REQUEST_PER_HOUR</code> 每小时最大请求次数，可选，默认无限</li>
 <li><code>TIMEOUT_MS</code> 超时，单位毫秒，可选</li>
 <li><code>SOCKS_PROXY_HOST</code> 和 <code>SOCKS_PROXY_PORT</code> 一起时生效，可选</li>
 <li><code>SOCKS_PROXY_PORT</code> 和 <code>SOCKS_PROXY_HOST</code> 一起时生效，可选</li>
 <li><code>HTTPS_PROXY</code> 支持 <code>http</code>，<code>https</code>, <code>socks5</code>，可选</li>
 <li><code>ALL_PROXY</code> 支持 <code>http</code>，<code>https</code>, <code>socks5</code>，可选</li>
</ul>
<h3 id="开始搭建">开始搭建</h3>
<ol>
 <li>进入群晖<code>docker</code>，注册表搜索并下载latest版：
  <br>
  <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F1281025772.webp%21water%2Ffw%2F600&amp;size=m" alt="群晖注册表搜索"></li>
 <li>下载完成后，在映像里找到映像并点击启动，在高级设置里添加环境变量：
  <br>
  直接获取apiKey：<a href="https://platform.openai.com/overview">获取 apiKey</a>
  <br>
  直接获取accessToken：<a href="https://chat.openai.com/api/auth/session">获取 accessToken</a>
  <br>
  <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F1356098193.webp&amp;size=m" alt="高级配置里添加环境变量">
  <br>
  其中<code>AUTH_SECRET_KEY</code>建议无论自用还是放到公网上都要配置一下。</li>
 <li>端口自行配置，模式是<code>3002</code>：
  <br>
  <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F2104612139.webp&amp;size=m" alt="端口配置"></li>
 <li>浏览器进入时授权验证：
  <br>
  <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F2401995168.webp%21water&amp;size=m" alt="授权验证"></li>
</ol>
<p>可以愉快的玩耍了，成品图：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304211729940.webp%21wwater&amp;size=m" alt="搭建后的成品"></p>
<h2 id="提示词商店">提示词商店</h2>
<p>左下角有提示词商店，可以自行导入json格式数据的提示词：
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F656843755.webp%21water&amp;size=m" alt="自行导入提示词"></p>
<p>在线里目前就只有两个，我们选择简体中文的就可以了，当然你也可以自行填入相应地址：
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F2432406019.webp%21water&amp;size=m" alt="在线导入提示词"></p>]]></description><guid isPermaLink="false">/archives/synology-building-chatgpt-web</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F1281025772.webp%21water%2Ffw%2F600&amp;size=m" type="image/jpeg" length="18730"/><category>分享</category><pubDate>Fri, 21 Apr 2023 09:59:00 GMT</pubDate></item><item><title><![CDATA[推荐脚本：ChatGPT - 提示选择器]]></title><link>https://wuqishi.com/archives/recommended-script-chatgpt-prompt-selector</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%8E%A8%E8%8D%90%E8%84%9A%E6%9C%AC%EF%BC%9AChatGPT%20-%20%E6%8F%90%E7%A4%BA%E9%80%89%E6%8B%A9%E5%99%A8&amp;url=/archives/recommended-script-chatgpt-prompt-selector" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p>之前文章发布的时候忘了贴脚本的链接，居然没人指出......</p>
</blockquote>
<blockquote>
 <p>?一个帮助用户在ChatGPT原生网页快速选择 ChatGPT 提示"Prompt"的脚本。</p>
</blockquote>
<h2 id="-ChatGPT---提示选择器">?ChatGPT - 提示选择器</h2>
<p>该用户脚本旨在帮助 ChatGPT 用户快速选择提示。它为用户提供了一种方便的方法，可以轻松地从预定义的类别和子类别中选择提示，而无需手动输入。</p>
<h3 id="功能">功能</h3>
<ol>
 <li><strong>快速选择提示</strong> ：该脚本在ChatGPT原生网页的输入框上方提供了一个下拉菜单选择器，用户可以通过下拉菜单快速选择预先定义好的ChatGPT提示内容，从而方便地向ChatGPT提问。</li>
 <li><strong>自定义提示库</strong> ：用户可以通过替换脚本中指定的Json链接来自定义提示库，以适应不同用户的需求。默认的Json链接包含一系列常用的提示，用户可以根据需要选择相应的提示内容。</li>
 <li><strong>分类与子选择</strong> ：提示内容被分为不同的类别和子类别，用户可以先选择类别，再选择子类别中的具体提示，从而轻松找到所需的提示内容。</li>
 <li><strong>黑暗模式兼容</strong> ：该脚本支持网页的黑暗模式，无论用户是在浅色模式还是深色模式下使用，脚本都可以为用户提供良好的视觉体验。</li>
</ol>
<h3 id="使用方法">使用方法</h3>
<ol>
 <li>安装 Tampermonkey 或类似的用户脚本管理器</li>
 <li>将脚本<a href="https://greasyfork.org/zh-CN/scripts/464168-chatgpt-prompt提示选择器">?ChatGPT - Prompt提示选择器</a>添加到用户脚本管理器中</li>
 <li>访问 <a href="https://chat.openai.com/">ChatGPT 网站</a></li>
 <li>在聊天框位置，选择类别和子类别（提示）</li>
 <li>选定提示后，它将自动填充到输入框中</li>
 <li>您可以开始与 ChatGPT 进行交流，使用所选提示作为起点</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304172112516.webp%21wwater&amp;size=m" alt="在聊天框可选择类别和子类别"></p>
<h3 id="注意事项">注意事项</h3>
<ul>
 <li>该脚本在只能在PC网页进行使用，在窄屏设备上会自动隐藏下拉菜单选择器</li>
 <li>请确保您的浏览器支持用户脚本和相关库</li>
 <li>若要使用此脚本，可能需要允许 Tampermonkey 访问远程资源</li>
</ul>]]></description><guid isPermaLink="false">/archives/recommended-script-chatgpt-prompt-selector</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304172112516.webp%21wwater&amp;size=m" type="image/jpeg" length="35886"/><category>分享</category><pubDate>Mon, 17 Apr 2023 13:15:00 GMT</pubDate></item><item><title><![CDATA[Activation Method for JetBrains Products (English version)]]></title><link>https://wuqishi.com/archives/activation-method-for-jetbrains-products-english-version</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Activation%20Method%20for%20JetBrains%20Products%20%28English%20version%29&amp;url=/archives/activation-method-for-jetbrains-products-english-version" width="1" height="1" alt="" style="opacity:0;">
<p style="">查看中文版：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/archives/activation-method-for-jetbrains-series-products" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://wuqishi.com/archives/activation-method-for-jetbrains-series-products" target="_blank">https://wuqishi.com/archives/activation-method-for-jetbrains-series-products</a></hyperlink-card>
<p style=""><span style="color: #dc2626">Please note that using crack software to activate JetBrains products is illegal and violates the software license agreement and laws and regulations. The methods provided in this article are for learning purposes only and should not be used for any other purposes. As a well-known software company, JetBrains offers legitimate license purchase options to support the legal use of its software.</span></p>
<p style=""><span style="color: #1d4ed8">JetBrains is a renowned company in the field of software development and project management, with products including integrated development environments (IDEs) for various languages such as Java​, Groovy​, Kotlin​, Ruby​, Python​, PHP​, C​, Objective-C​, C++​, C#​, Go​, JavaScript​, and SQL​, etc. Its software is widely used in Android application development and has achieved significant achievements in development, design, and language.</span>
 <br></p>
<p style="">Supported products (including activation codes and crack files):</p>
<blockquote>
 <ol>
  <li>
   <p style="">IntelliJ IDEA</p>
  </li>
  <li>
   <p style="">AppCode</p>
  </li>
  <li>
   <p style="">CLion</p>
  </li>
  <li>
   <p style="">DataGrip</p>
  </li>
  <li>
   <p style="">GoLand</p>
  </li>
  <li>
   <p style="">PhpStorm</p>
  </li>
  <li>
   <p style="">PyCharm</p>
  </li>
  <li>
   <p style="">Rider</p>
  </li>
  <li>
   <p style="">RubyMine</p>
  </li>
  <li>
   <p style="">WebStorm</p>
  </li>
 </ol>
</blockquote>
<p style="">In this article, we will use <code>PyCharm</code> as an example, and the activation methods for other products are similar.</p>
<p style="">The latest version of <code>PyCharm</code> on <code>JetBrains</code> is currently version <code>v2013.1</code>, so we will provide a crack activation method for this version.</p>
<h2 style="" id="crack-activation-process%3A">Crack Activation Process:</h2>
<p style=""><span style="color: #ca8a04">Note: If you are already logged into your JB account, please log out first!</span></p>
<p style=""><span style="color: #ca8a04">Note: If you have installed the "IDE Eval Reset" plugin, please uninstall it first!</span></p>
<h3 style="" id="download-crack-files">Download Crack Files</h3>
<download-links data-links="[{&quot;url&quot;:&quot;https://ssslove.lanzouw.com/iCH4w0t97mwf&quot;,&quot;filename&quot;:&quot;JetBrains ja-netfilter-all Activation Codes&quot;,&quot;source&quot;:&quot;蓝奏云网盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/lanzou.png&quot;},{&quot;url&quot;:&quot;https://pan.quark.cn/s/d4741e8a7839#/list/share&quot;,&quot;filename&quot;:&quot;JetBrains ja-netfilter-all Activation Codes&quot;,&quot;source&quot;:&quot;夸克网盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/quark.png&quot;},{&quot;url&quot;:&quot;https://www.123pan.com/s/7n0cVv-bPdod&quot;,&quot;filename&quot;:&quot;JetBrains ja-netfilter-all Activation Codes&quot;,&quot;source&quot;:&quot;123云盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/123pan.png&quot;}]"></download-links>
<h3 style="" id="copy-crack-patch">Copy Crack Patch</h3>
<p style="">Copy the ja-netfilter-all​ folder from the crack patch folder to the root directory of drive C.</p>
<h3 style="" id="crack-method">Crack Method</h3>
<h4 style="" id="method-one">Method one</h4>
<p style="">Find the corresponding installation file in the ja-netfilter-all​ - scripts​ folder for the software.</p>
<p style="">For Windows System :</p>
<blockquote>
 <p style="">install-all-users.vbs (Install for all users)
  <br>
  install-current-user.vbs (Install for the current user)</p>
</blockquote>
<p style="">For Other Systems :</p>
<blockquote>
 <p style="">install.sh</p>
</blockquote>
<h4 style="" id="method-two">Method two</h4>
<p style="">Find the <code>*.exe.vmoptions</code>​ file in the installation directory of the software, for example, mine is "<code>D:\Program Files\PyCharm\bin\pycharm64.exe.vmoptions</code>". Open it with a text editor and add the following code at the end:</p>
<pre><code class="language-bash">-javaagent:C:\ja-netfilter-all\ja-netfilter.jar=jetbrains
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED</code></pre>
<h3 style="" id="enter-activation-code">Enter Activation Code</h3>
<p style="">Find the corresponding software activation code file in the Activation Codes​ folder, run the software, choose Activate PhpStorm​ - Activation code​, enter the registration code provided in the compressed file, and then click the Activate​ button.</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171434369.webp%21wwater&amp;size=m" alt="Enter the activation code" width="784px">
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171435708.webp%21wwater&amp;size=m" alt="View the license">
</figure>
<p style="">Congratulations, you're done!</p>]]></description><guid isPermaLink="false">/archives/activation-method-for-jetbrains-products-english-version</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171434369.webp%21wwater&amp;size=m" type="image/jpeg" length="28992"/><category>技巧</category><pubDate>Mon, 17 Apr 2023 09:45:00 GMT</pubDate></item><item><title><![CDATA[JetBrains 系列产品激活方法]]></title><link>https://wuqishi.com/archives/activation-method-for-jetbrains-series-products</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=JetBrains%20%E7%B3%BB%E5%88%97%E4%BA%A7%E5%93%81%E6%BF%80%E6%B4%BB%E6%96%B9%E6%B3%95&amp;url=/archives/activation-method-for-jetbrains-series-products" width="1" height="1" alt="" style="opacity:0;">
<p style="">View the English version：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/archives/activation-method-for-jetbrains-products-english-version" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://wuqishi.com/archives/activation-method-for-jetbrains-products-english-version" target="_blank">https://wuqishi.com/archives/activation-method-for-jetbrains-products-english-version</a></hyperlink-card>
<p style=""><span style="color: #b91c1c">请注意通过破解软件来激活</span><code>JetBrains</code><span style="color: #b91c1c">公司的软件是非法行为，违反了软件许可协议和法律法规。本文方法仅用来学习请勿另做它用。作为一家知名的软件公司，</span><code>JetBrains</code><span style="color: #b91c1c">提供合法的许可证购买选项，以支持其软件的合法使用。</span></p>
<p style=""><span style="color: #1d4ed8">JetBrains公司是一家在软件开发和项目管理领域广泛应用的知名公司，其产品包括各种语言的集成开发环境（</span><code>IDE</code><span style="color: #1d4ed8">），如</span><code>Java</code><span style="color: #1d4ed8">、</span><code>Groovy</code><span style="color: #1d4ed8">、</span><code>Kotlin</code><span style="color: #1d4ed8">、</span><code>Ruby</code><span style="color: #1d4ed8">、</span><code>Python</code><span style="color: #1d4ed8">、</span><code>PHP</code><span style="color: #1d4ed8">、</span><code>C</code><span style="color: #1d4ed8">、</span><code>Objective-C</code><span style="color: #1d4ed8">、</span><code>C++</code><span style="color: #1d4ed8">、</span><code>C#</code><span style="color: #1d4ed8">、</span><code>Go</code><span style="color: #1d4ed8">、</span><code>JavaScript</code><span style="color: #1d4ed8">和</span><code>SQL</code><span style="color: #1d4ed8">等。公司的软件被广泛用于</span><code>Android</code><span style="color: #1d4ed8">应用程序开发，并且在开发、设计和语言方面取得了很多成就</span>。
 <br></p>
<p style="">支持的产品（包括激活码和破解文件）：</p>
<blockquote>
 <ol>
  <li>
   <p style="">IntelliJ IDEA</p>
  </li>
  <li>
   <p style="">AppCode</p>
  </li>
  <li>
   <p style="">CLion</p>
  </li>
  <li>
   <p style="">DataGrip</p>
  </li>
  <li>
   <p style="">GoLand</p>
  </li>
  <li>
   <p style="">PhpStorm</p>
  </li>
  <li>
   <p style="">PyCharm</p>
  </li>
  <li>
   <p style="">Rider</p>
  </li>
  <li>
   <p style="">RubyMine</p>
  </li>
  <li>
   <p style="">WebStorm</p>
  </li>
 </ol>
</blockquote>
<p style="">本文以<code>Pycharm</code>为例，其他产品大同小异。</p>
<p style="">目前大多数的<code>Python</code>开发工作都是在<code>Pycharm</code>上完成的，在<code>JetBrains</code>上当前最新版为<code>v2013.1</code>版，所以整理了这个版本的破解激活方法。</p>
<h2 style="" id="%E7%A0%B4%E8%A7%A3%E8%BF%87%E7%A8%8B%EF%BC%9A">破解过程：</h2>
<p style=""><span style="color: #ca8a04">注意：如果您已经登录到您的JB账户，请先退出！
  <br>注意：如果您已经安装了"IDE Eval Reset"插件，请先卸载！</span></p>
<h3 style="" id="%E4%B8%8B%E8%BD%BD%E7%A0%B4%E8%A7%A3%E6%96%87%E4%BB%B6">下载破解文件</h3>
<download-links data-links="[{&quot;url&quot;:&quot;https://ssslove.lanzouw.com/iCH4w0t97mwf&quot;,&quot;filename&quot;:&quot;JetBrains ja-netfilter-all Activation Codes&quot;,&quot;source&quot;:&quot;蓝奏云网盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/lanzou.png&quot;},{&quot;url&quot;:&quot;https://pan.quark.cn/s/d4741e8a7839#/list/share&quot;,&quot;filename&quot;:&quot;JetBrains ja-netfilter-all Activation Codes&quot;,&quot;source&quot;:&quot;夸克网盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/quark.png&quot;},{&quot;url&quot;:&quot;https://www.123pan.com/s/7n0cVv-bPdod&quot;,&quot;filename&quot;:&quot;JetBrains ja-netfilter-all Activation Codes&quot;,&quot;source&quot;:&quot;123云盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/123pan.png&quot;}]"></download-links>
<h3 style="" id="%E5%A4%8D%E5%88%B6%E7%A0%B4%E8%A7%A3%E8%A1%A5%E4%B8%81">复制破解补丁</h3>
<p style="">将破解补丁文件夹中的 <code>ja-netfilter-all</code> 文件夹复制到C盘根目录下。</p>
<h3 style="" id="%E7%A0%B4%E8%A7%A3%E6%96%B9%E6%B3%95">破解方法</h3>
<h4 style="" id="%E6%96%B9%E6%B3%95%E4%B8%80">方法一</h4>
<p style="">找到<code>ja-netfilter-all</code>—<code>scripts</code>文件中对应软件的安装文件。</p>
<p style=""><strong>Windows系统</strong>：</p>
<blockquote>
 <p style="">install-all-users.vbs（为所有用户安装）
  <br>
  install-current-user.vbs（为当前用户安装）</p>
</blockquote>
<p style=""><strong>其他系统</strong>：</p>
<blockquote>
 <p style="">install.sh</p>
</blockquote>
<h4 style="" id="%E6%96%B9%E6%B3%95%E4%BA%8C">方法二</h4>
<p style="">找到软件安装目录下的 <code>*.exe.vmoptions</code> 文件，如我的是"<code>D:\Program Files\PyCharm\bin\pycharm64.exe.vmoptions</code>"，使用文本编辑器打开，在最后一行添加以下代码：</p>
<pre><code class="language-bash">-javaagent:C:\ja-netfilter-all\ja-netfilter.jar=jetbrains
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED</code></pre>
<h3 style="" id="%E8%BE%93%E5%85%A5%E6%BF%80%E6%B4%BB%E7%A0%81">输入激活码</h3>
<p style="">找到<code>Activation Codes</code>文件中对应的软件激活码文件，运行软件，选择 <code>Activate PhpStorm</code> – <code>Activation code</code> ，输入压缩包内提供的注册码，然后点击<code>Activate</code>按钮即可。</p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171434369.webp%21wwater&amp;size=m" alt="输入激活码" width="784px">
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171435708.webp%21wwater&amp;size=m" alt="查看许可证" width="784px">
</figure>
<h3 style="" id="%E5%AE%89%E8%A3%85%E4%B8%AD%E6%96%87%E8%AF%AD%E8%A8%80%E5%8C%85">安装中文语言包</h3>
<p style="">选择<code>Plugins</code>在搜索框中输入<code>chinese</code>，选择<code>Chinese（Simplified）Language Pack / 中文语言包</code>
 <br></p>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171437547.webp%21wwater&amp;size=m" alt="安装中文语言包" width="784px">
</figure>
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171440626.webp%21wwater&amp;size=m" alt="重启后的中文界面">
</figure>
<p style="">大功告成！</p>]]></description><guid isPermaLink="false">/archives/activation-method-for-jetbrains-series-products</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304171434369.webp%21wwater&amp;size=m" type="image/jpeg" length="28992"/><category>技巧</category><pubDate>Mon, 17 Apr 2023 09:19:00 GMT</pubDate></item><item><title><![CDATA[疫情三年后再进校园]]></title><link>https://wuqishi.com/archives/entering-campus-three-years-after-the-epidemic</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%96%AB%E6%83%85%E4%B8%89%E5%B9%B4%E5%90%8E%E5%86%8D%E8%BF%9B%E6%A0%A1%E5%9B%AD&amp;url=/archives/entering-campus-three-years-after-the-epidemic" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7657.webp%21wwater&amp;size=m" alt="食堂入口">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7656.webp%21wwater&amp;size=m" alt="食堂一角">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7658.webp%21wwater&amp;size=m" alt="街巷">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7660.webp%21wwater&amp;size=m" alt="舞蹈节目排练">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7680.webp%21water&amp;size=m" alt="操场">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7663.webp%21wwater&amp;size=m" alt="我爱FAFU">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7668.webp%21wwater&amp;size=m" alt="绿叶与湖面">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7670.webp%21wwater&amp;size=m" alt="湖面上的建筑">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7671.webp%21wwater&amp;size=m" alt="街角">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7673.webp%21wwater&amp;size=m" alt="满树小桃">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7672.webp%21wwater&amp;size=m" alt="近桃">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7675.webp%21wwater&amp;size=m" alt="生机勃发">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7659.webp%21wwater&amp;size=m" alt="蛋挞和芋泥千层"></p>
<p>这里仿佛是另一个天地，隔离了外面的喧闹，却又不隔绝繁华。
 <br>
 朝气、活泼、鲜艳处处都是。感受到的是朝阳的生命力，嫩芽破茧吐绿，给人感动情绪。
 <br>
 这里也是一个摇篮，有许许多多的生命在绽放，当他们长大，给世界带去的是一股股的清流，希望这清流晚一些消逝。</p>]]></description><guid isPermaLink="false">/archives/entering-campus-three-years-after-the-epidemic</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7657.webp%21wwater&amp;size=m" type="image/jpeg" length="1334916"/><category>图忆</category><pubDate>Sat, 15 Apr 2023 16:32:00 GMT</pubDate></item><item><title><![CDATA[修复searchEngineJump在谷歌搜索页面不生效问题]]></title><link>https://wuqishi.com/archives/fix-the-issue-of-searchenginejump-not-working-on-google-search-pages</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%BF%AE%E5%A4%8DsearchEngineJump%E5%9C%A8%E8%B0%B7%E6%AD%8C%E6%90%9C%E7%B4%A2%E9%A1%B5%E9%9D%A2%E4%B8%8D%E7%94%9F%E6%95%88%E9%97%AE%E9%A2%98&amp;url=/archives/fix-the-issue-of-searchenginejump-not-working-on-google-search-pages" width="1" height="1" alt="" style="opacity:0;">
<h2 id="searchenginejump">searchEngineJump简介</h2>
<blockquote>
 <p>searchEngineJump 搜索引擎快捷跳转：方便的在各个搜索引擎之间跳转,增加可视化设置菜单,能更友好的自定义设置,修复百度搜索样式丢失的问题。</p>
</blockquote>
<p>以下是在常用搜索引擎下的效果：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304141025891-google.webp%21water&amp;size=m" alt="在Google下的效果"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304141027799-baidu.webp%21water&amp;size=m" alt="Baidu下的效果"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304141029350-bing.webp%21water&amp;size=m" alt="Bing下的效果"></p>
<p>所有配置内容：
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304141030662-peizhi.webp%21water&amp;size=m" alt="配置内容"></p>
<h2 id="heading">当前版本遇到的问题</h2>
<p>在版本<code>5.26.4</code>使用中遇到了问题，根据<strong>omymenzies</strong>反馈：</p>
<blockquote>
 <p>在谷歌搜索页面，如果登录了谷歌账号，搜索条会消失。即使关闭所有其他扩展插件和油猴脚本，依然如此。</p>
 <p>但是如果不登录谷歌账号，搜索条又正常显示了。在其他页面，比如百度搜索、Bing、Yandex、Youtube都能正常显示，没有问题。</p>
</blockquote>
<p>控制台报错如图：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304141036294-kongzhitai.webp%21water&amp;size=m" alt="控制台报错"></p>
<h2 id="heading-1">解决方法</h2>
<p>打开<code>Tampermonkey</code>的控制面板，找到该脚本进行编辑：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304141039569-bianji.webp%21water&amp;size=m" alt="解决方法"></p>
<p>搜索“目标有误”进行定位，大概在<code>3117</code>行位置插件代码：</p>
<pre><code class="language-js">iInput = iInput || getElementByXPath('//textarea[@name="q"]')
</code></pre>
<p>然后手动或者<code>ctrl+s</code>保存即可。</p>
<h2 id="heading-2">脚本地址</h2>
<p><a href="https://greasyfork.org/zh-CN/scripts/27752-searchenginejump-%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%BF%AB%E6%8D%B7%E8%B7%B3%E8%BD%AC">searchEngineJump 搜索引擎快捷跳转</a></p>]]></description><guid isPermaLink="false">/archives/fix-the-issue-of-searchenginejump-not-working-on-google-search-pages</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304141025891-google.webp%21water&amp;size=m" type="image/jpeg" length="42630"/><category>技巧</category><pubDate>Fri, 14 Apr 2023 02:46:00 GMT</pubDate></item><item><title><![CDATA[ 事情既然发生了，可以是遗憾，不要去后悔。]]></title><link>https://wuqishi.com/archives/something-happened-dont-regret</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%20%E4%BA%8B%E6%83%85%E6%97%A2%E7%84%B6%E5%8F%91%E7%94%9F%E4%BA%86%EF%BC%8C%E5%8F%AF%E4%BB%A5%E6%98%AF%E9%81%97%E6%86%BE%EF%BC%8C%E4%B8%8D%E8%A6%81%E5%8E%BB%E5%90%8E%E6%82%94%E3%80%82&amp;url=/archives/something-happened-dont-regret" width="1" height="1" alt="" style="opacity:0;">
<p>今天读到<a href="https://tumutanzi.com/archives/17024">土木坛子</a>的文章，里面引用了诗人张枣在《镜中》中的话：</p>
<blockquote>
 <p>只要想起一生中后悔的事，梅花便落满了南山。</p>
</blockquote>
<p>也是勾起了我的一波回忆杀。</p>
<p>于是我留下了这样的评论，同时也发布到我的<a href="https://wuqishi.com/cross/#comment-255">唠叨</a>里：</p>
<blockquote>
 <p>其实每个人的回忆都会有伤痕，那是成长的刻度。
  <br>
  一直给自己强化的认识是：事情既然发生了，可以是遗憾，不要去后悔。
  <br>
  角落里疗伤、汲取教训、毅然前行，才是应有的态度。</p>
</blockquote>
<p>其实啊，过去难免有遗憾，重要的是正视过去，珍惜当下，把握未来。</p>
<p>我们要做的是一直幸福下去，那么永远不会后悔，把遗憾留在回忆里，当作茶里的苦涩，酒中的辛辣，未尝不是另一种体验。</p>]]></description><guid isPermaLink="false">/archives/something-happened-dont-regret</guid><dc:creator>吴蛋蛋</dc:creator><category>蛋花</category><pubDate>Thu, 13 Apr 2023 08:48:00 GMT</pubDate></item><item><title><![CDATA[侄女的试唱会比赛]]></title><link>https://wuqishi.com/archives/nieces-audition-competition</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%BE%84%E5%A5%B3%E7%9A%84%E8%AF%95%E5%94%B1%E4%BC%9A%E6%AF%94%E8%B5%9B&amp;url=/archives/nieces-audition-competition" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092127016.webp%21water&amp;size=m" alt="试唱会介绍">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092129858.webp%21water&amp;size=m" alt="形象大使">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092130719.webp%21wwater&amp;size=m" alt="比赛现场">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092132443.webp%21wwater&amp;size=m" alt="上台前妆容">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092134675.webp%21water&amp;size=m" alt="比赛中-我拍的">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092136218.webp%21water&amp;size=m" alt="官方照片1">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092137468.webp%21water&amp;size=m" alt="官方照片2">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092137479.webp%21water&amp;size=m" alt="官方照片3"></p>]]></description><guid isPermaLink="false">/archives/nieces-audition-competition</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304092127016.webp%21water&amp;size=m" type="image/jpeg" length="475070"/><category>图忆</category><pubDate>Sun, 9 Apr 2023 13:42:00 GMT</pubDate></item><item><title><![CDATA[新一代图片编码格式测试]]></title><link>https://wuqishi.com/archives/new-generation-image-coding-format-test</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%96%B0%E4%B8%80%E4%BB%A3%E5%9B%BE%E7%89%87%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F%E6%B5%8B%E8%AF%95&amp;url=/archives/new-generation-image-coding-format-test" width="1" height="1" alt="" style="opacity:0;">
<p>除了常用的图片格式外，目前值得人们关注的新一代图片格式：</p>
<blockquote>
 <ul>
  <li>WebP</li>
  <li>JPEG XL</li>
  <li>AVIF</li>
 </ul>
</blockquote>
<p>今晚心血来潮想测试一下这几个格式。原图大概9M，通过PicList上传，自动处理为对应格式，具体如下：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-20230402212406.webp&amp;size=m" alt="webp格式：76.20k">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304022122887.jxl&amp;size=m" alt="jxl格式：219.12k">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-20230402212316.avif&amp;size=m" alt="avif格式：29.30k"></p>
<hr>
<p>经过测试，在macOS 13.2.1系统下，各个浏览器以上3种图片格式的支持情况如下：</p>
<ul>
 <li>Firefox 111.0.1（64位）：全部支持</li>
 <li>Chrome 110.0.5481.177（arm64）：全部支持</li>
 <li>Safari 版本16.3 (18614.4.6.1.6)：全部支持</li>
</ul>
<p>Edge 版本 111.0.1661.62 (arm64)：支持webp、jxl格式，不支持avif格式。</p>
<p>如果你的浏览器里看到哪张图片不显示，说明你使用的浏览器不支持该格式。</p>]]></description><guid isPermaLink="false">/archives/new-generation-image-coding-format-test</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-20230402212406.webp&amp;size=m" type="image/jpeg" length="78030"/><category>滚蛋</category><pubDate>Sun, 2 Apr 2023 13:57:00 GMT</pubDate></item><item><title><![CDATA[省科技馆之行]]></title><link>https://wuqishi.com/archives/visit-to-the-provincial-science-and-technology-museum</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%9C%81%E7%A7%91%E6%8A%80%E9%A6%86%E4%B9%8B%E8%A1%8C&amp;url=/archives/visit-to-the-provincial-science-and-technology-museum" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F2530688931.webp%21wwater&amp;size=m" alt="错觉图-圆">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7560.webp%21wwater&amp;size=m" alt="错觉图-方">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7567.webp%21water&amp;size=m" alt="电磁旋转蛋">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7563.webp%21wwater&amp;size=m" alt="错觉图-石柱与仆人">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7562.webp%21water&amp;size=m" alt="错觉图-上下">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-IMG_7561.webp%21wwater&amp;size=m" alt="错觉图-动物"></p>]]></description><guid isPermaLink="false">/archives/visit-to-the-provincial-science-and-technology-museum</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2F2530688931.webp%21wwater&amp;size=m" type="image/jpeg" length="112016"/><category>图忆</category><pubDate>Sun, 2 Apr 2023 11:05:00 GMT</pubDate></item><item><title><![CDATA[Typora Windows版破解补丁及主题推荐]]></title><link>https://wuqishi.com/archives/recommendations-for-cracking-patches-and-themes-for-typora-windows</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Typora%20Windows%E7%89%88%E7%A0%B4%E8%A7%A3%E8%A1%A5%E4%B8%81%E5%8F%8A%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90&amp;url=/archives/recommendations-for-cracking-patches-and-themes-for-typora-windows" width="1" height="1" alt="" style="opacity:0;">
<p style="line-height: 1.7em">大名鼎鼎的 Typora，想必很多人都在使用，我的 Windows 和 Mac 电脑上都安装并使用了，上一篇文章介绍的 PicList，无缝与云存储结合，相当舒适。</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/archives/upload-images-using-piclist-in-typora" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://wuqishi.com/archives/upload-images-using-piclist-in-typora" target="_blank">https://wuqishi.com/archives/upload-images-using-piclist-in-typora</a></hyperlink-card>
<h2 style="" id="typora%E4%BB%8B%E7%BB%8D"><strong>Typora介绍</strong></h2>
<p style="line-height: 1.7em"><span style="color: #16a34a">一款 Markdown 编辑器和阅读器。</span></p>
<p style="line-height: 1.7em"><span style="color: #2563eb">风格极简 / 多种主题 / 支持 macOS，Windows 及 Linux</span></p>
<p style="line-height: 1.7em"><span style="color: #2563eb">实时预览 / 图片与文字 / 代码块 / 数学公式 / 图表</span></p>
<p style="line-height: 1.7em"><span style="color: #2563eb">目录大纲 / 文件管理 / 导入与导出 ……</span></p>
<p style="line-height: 1.7em">Typora 之前都是免费的，后续改为收费版本，有能力的话请大家支持正版。</p>
<p style="line-height: 1.7em"><span style="color: #eab308">价格：89 元 / 3 台设备 / 免费升级</span></p>
<h2 style="" id="typora%E7%A0%B4%E8%A7%A3%E8%A1%A5%E4%B8%81"><strong>Typora破解补丁</strong></h2>
<blockquote>
 <p style="line-height: 1.7em">所发布的 Typora Windows 版破解补丁 [支持版本更新] 仅限用于学习和研究目的</p>
</blockquote>
<h3 style="" id="%E7%A0%B4%E8%A7%A3%E6%96%B9%E6%B3%95"><strong>破解方法</strong></h3>
<h4 style="" id="%E4%B8%8B%E8%BD%BD%E5%8E%9F%E7%89%88%E5%AE%89%E8%A3%85%E5%8C%85">下载原版安装包</h4>
<p style="line-height: 1.7em">下载原版安装包：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://downloads.typora.io/windows/typora-setup-x64.exe" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="Typora — simple yet powerful Markdown reader."><a href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://downloads.typora.io/windows/typora-setup-x64.exe" target="_blank">https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://downloads.typora.io/windows/typora-setup-x64.exe</a></hyperlink-card>
<h4 style="" id="%E4%B8%8B%E8%BD%BD%E7%A0%B4%E8%A7%A3%E8%A1%A5%E4%B8%81">下载破解补丁</h4>
<p style="line-height: 1.7em">下载破解补丁：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://www.fahai.org/aDisk/Typora/x64_Patch.zip" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="Typora Windows 版破解补丁"><a href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://www.fahai.org/aDisk/Typora/x64_Patch.zip" target="_blank">https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://www.fahai.org/aDisk/Typora/x64_Patch.zip</a></hyperlink-card>
<p style="line-height: 1.7em">该破解补丁支持 Typora 版本更新。</p>
<h4 style="" id="%E7%A0%B4%E8%A7%A3%E8%BF%87%E7%A8%8B">破解过程</h4>
<p style="line-height: 1.7em">关闭 <code>Typora</code> 软件，将 <code>winmm.dll</code> 放置于 <code>Typora</code> 安装目录下即可。</p>
<h3 style="" id="%E4%B8%8B%E8%BD%BD%E5%A4%87%E4%BB%BD">下载备份</h3>
<download-links data-links="[{&quot;url&quot;:&quot;https://pan.quark.cn/s/ed10403e6726#/list/share&quot;,&quot;filename&quot;:&quot;Typora_x64_Patch.zip&quot;,&quot;source&quot;:&quot;夸克网盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/quark.png&quot;},{&quot;url&quot;:&quot;https://ssslove.lanzouw.com/i2Bpo0rhji2j&quot;,&quot;filename&quot;:&quot;Typora_x64_Patch.zip&quot;,&quot;source&quot;:&quot;蓝奏云网盘&quot;,&quot;code&quot;:&quot;&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/lanzou.png&quot;}]"></download-links>
<h2 style="" id="typora%E4%B8%BB%E9%A2%98%E6%8E%A8%E8%8D%90"><strong>Typora主题推荐</strong></h2>
<p style="line-height: 1.7em">纯属个人推荐，觉得好看。</p>
<h3 style="" id="haru%E4%B8%BB%E9%A2%98"><strong>Haru主题</strong></h3>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-haru.webp.webp%21water&amp;size=m" alt="Haru主题" title="" width="976px">
</figure>
<h3 style="" id="%E6%9C%AC%E7%AF%87%E6%96%87%E7%AB%A0%E9%A2%84%E8%A7%88"><strong>本篇文章预览</strong></h3>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230330113412983.webp%21water&amp;size=m" alt="本篇文章预览" title="" width="1920px">
</figure>
<h3 style="" id="%E5%AE%98%E6%96%B9%E4%BE%8B%E5%AD%90"><strong>官方例子</strong></h3>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-haru2.webp.webp%21water&amp;size=m" alt="官方例子" title="" width="1321px">
</figure>
<h3 style="" id="%E5%BC%95%E7%94%A8%E6%A0%B7%E5%BC%8F"><strong>引用样式</strong></h3>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-haru5.webp.webp%21water&amp;size=m" alt="引用样式" title="">
</figure>
<h3 style="" id="%E4%B8%8B%E8%BD%BD%E4%B8%BB%E9%A2%98"><strong>下载主题</strong></h3>
<hyperlink-card target="_blank" href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https%3A%2F%2Ftheme.typoraio.cn%2Ftheme%2FHaru%2F" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="Haru" custom-description="Designed and tested on Windows11 &amp; Ubuntu18.04. Not fully tested, but should work for MacOS."><a href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https%3A%2F%2Ftheme.typoraio.cn%2Ftheme%2FHaru%2F" target="_blank">https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https%3A%2F%2Ftheme.typoraio.cn%2Ftheme%2FHaru%2F</a></hyperlink-card><hyperlink-card target="_blank" href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https%3A%2F%2Fgithub.com%2FLSTM-Kirigaya%2Ftypora-haru-theme" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="GitHub - LSTM-Kirigaya/typora-haru-theme: a light &amp; inspirational theme for typora · GitHub" custom-description="a light &amp; inspirational theme for typora. Contribute to LSTM-Kirigaya/typora-haru-theme development by creating an account on GitHub."><a href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https%3A%2F%2Fgithub.com%2FLSTM-Kirigaya%2Ftypora-haru-theme" target="_blank">https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https%3A%2F%2Fgithub.com%2FLSTM-Kirigaya%2Ftypora-haru-theme</a></hyperlink-card>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/recommendations-for-cracking-patches-and-themes-for-typora-windows</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230330110240374.webp&amp;size=m" type="image/jpeg" length="2674"/><category>分享</category><pubDate>Thu, 30 Mar 2023 04:00:00 GMT</pubDate></item><item><title><![CDATA[在Typora中使用PicList上传图片]]></title><link>https://wuqishi.com/archives/upload-images-using-piclist-in-typora</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%9C%A8Typora%E4%B8%AD%E4%BD%BF%E7%94%A8PicList%E4%B8%8A%E4%BC%A0%E5%9B%BE%E7%89%87&amp;url=/archives/upload-images-using-piclist-in-typora" width="1" height="1" alt="" style="opacity:0;">
<h2 id="Mac与Windows平台软件选择差异">Mac与Windows平台软件选择差异</h2>
<p>在Mac平台上，使用Mweb写文章基本趋近于完善，Mweb自带了图床服务：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-202303282037051.webp%21wwater&amp;size=m" alt="Mweb自带的图床服务"></p>
<p>然而Mweb是苹果生态专属，没有发布Windows平台的软件。</p>
<p>Typora在Mac、Windows上都发布了对应的软件，属于跨平台的软件，并且Typora可以与其他图片上传软件形成组合拳。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-202303282046944.webp%21wwater&amp;size=m" alt="Typora支持的上传服务"></p>
<h2 id="关于PicList">关于PicList</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230328200112.webp%21water&amp;size=m" alt="PicList"></p>
<p>之前使用Typora与PicGo组合，今天发现了PicList，在保留PicGo加入更多的功能，目前使用上挺不错的。</p>
<p>PicList 是一款云存储/图床平台管理和文件上传工具，基于 PicGo 进行了深度二次开发，保留了 PicGo 的所有功能的同时，为相册添加了同步云端删除功能，同时增加了完整的云存储管理功能，包括云端目录查看、文件搜索、批量上传下载和删除文件，复制多种格式文件链接和图片/markdown/文本/视频预览等。</p>
<h2 id="从PicGo迁移到PicList">从PicGo迁移到PicList</h2>
<p>PicList <code>V1.5.0</code>以上版本提供一键迁移功能，进入设置页面，然后在从PicGo迁移选项点击右侧按钮即可，迁移后请重启应用生效。</p>
<h2 id="PicList特色功能">PicList特色功能</h2>
<blockquote>
 <ul>
  <li>保留了 PicGo 的所有功能，兼容已有的 PicGo 插件系统，包括和 typora、obsidian 等的搭配</li>
  <li>相册中可同步删除云端图片</li>
  <li>内置水印添加、图片压缩、图片缩放、图片旋转和图片格式转换等功能，支持自定义配置，且可以通过 CLI 命令行调用</li>
  <li>支持管理所有图床，可以在线进行云端目录查看、文件搜索、批量上传、批量下载、删除文件等</li>
  <li>支持预览多种格式的文件，包括图片、视频、纯文本文件和 markdown 文件等</li>
  <li>支持正则表达式的批量云端文件重命名</li>
  <li>管理界面使用内置数据库缓存目录，加速目录加载速度</li>
  <li>对于私有存储桶等支持复制预签名链接进行分享</li>
  <li>优化了 PicGo 的界面，解锁了窗口大小限制，同时美化了部分界面布局</li>
 </ul>
</blockquote>
<h2 id="如何在Typora使用">如何在Typora使用</h2>
<h3 id="Windows平台">Windows平台</h3>
<p>进入Typora设置界面，选择图像，将上传服务设置为<code>PicGo(app)</code>，然后在<code>PicGo路径</code>中填写PicList的安装路径，如下图所示：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-202303282141256.webp%21water&amp;size=m" alt="Windows下配置Typora"></p>
<h3 id="MacOS平台">MacOS平台</h3>
<p>进入Typora设置界面，选择图像，将上传服务设置为<code>Custom Command</code>，然后在<code>Command</code>中填写<code>/Applications/PicList.app/Contents/MacOS/PicList upload</code>，如下图所示：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-202303282144004.webp%21wwater&amp;size=m" alt="MacOS下配置Typora"></p>
<p>验证上传选项可能会出现问题，可以忽略，直接使用是正常的。</p>
<h2 id="我常用的PicList设置记录">我常用的PicList设置记录</h2>
<h3 id="配置文件位置">配置文件位置</h3>
<p>PicList的配置文件在不同系统里是不一样的。</p>
<ul>
 <li>Windows: <code>%APPDATA%\piclist\data.json</code></li>
 <li>Linux: <code>$XDG_CONFIG_HOME/piclist/data.json</code> or <code>~/.config/piclist/data.json</code></li>
 <li>macOS: <code>~/Library/Application\ Support/piclist/data.json</code></li>
</ul>
<h3 id="开启上传压缩和转换webp格式">开启上传压缩和转换webp格式</h3>
<p>打开PicList设置-设置图片水印和压缩-格式转换等参数</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230328215206662.webp%21water&amp;size=m" alt="开启上传压缩和转换webp格式"></p>
<h3 id="云端管理">云端管理</h3>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-202303282156898.webp%21water&amp;size=m" alt="云端管理文件"></p>
<p>更多内容和使用技巧，到PicList官网查看：</p>
<hyperlink-card href="https://piclist.cn/" target="_blank" theme="small"></hyperlink-card>]]></description><guid isPermaLink="false">/archives/upload-images-using-piclist-in-typora</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-202303282037051.webp%21wwater&amp;size=m" type="image/jpeg" length="10188"/><category>分享</category><pubDate>Tue, 28 Mar 2023 04:32:00 GMT</pubDate></item><item><title><![CDATA[域名ICP备案之变更网站]]></title><link>https://wuqishi.com/archives/domain-icp-registration-change-website</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%9F%9F%E5%90%8DICP%E5%A4%87%E6%A1%88%E4%B9%8B%E5%8F%98%E6%9B%B4%E7%BD%91%E7%AB%99&amp;url=/archives/domain-icp-registration-change-website" width="1" height="1" alt="" style="opacity:0;">
<p style="">在之前的文章中，曾提到把域名解析到腾讯的香港轻量云从而导致的问题：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/archives/china-unicom-making-everything-unfree-and-disconnected" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="中国联通——让一切自由连不通" custom-description="之前家里一直使用的是中国电信的融合宽带，后来换到了中国联通，没想到遇到了幺蛾子！ 手上有一个腾讯云香港轻量云，所以IP并非大陆的IP，因为备案时间比较久，所以之前是把域名解析到这个服务器上的。域名成功解析后在家里通过域名无法访问。报错如下： [album type=&amp;ldquo;photos&amp;rdquo;]" custom-image="https://cdn.ssslove.com/files/2023/03/p-20230323144814.webp"><a href="https://wuqishi.com/archives/china-unicom-making-everything-unfree-and-disconnected" target="_blank">https://wuqishi.com/archives/china-unicom-making-everything-unfree-and-disconnected</a></hyperlink-card>
<p style="">其实触发我变更解析的因为是国内的云服务器要到期了，暂时先解析到可用的服务器。</p>
<p style="">这两天重新购买了国内的轻量云，打算解析到这个服务器，毕竟怎么说也需要一个域名是备案的才行，总有要用到的地方。比如使用国内的CDN或者对象存储。</p>
<p style="">在国内的建站，总是绕不过一个槛，就是ICP备案，如果变更了服务器IP地址，也就需要重新进行网站的变更。</p>
<timeline-view group-name="timeline-group-j2gjk9lv" orientation="vertical"></timeline-view>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230327104427.webp%21water&amp;size=m" alt="腾讯云后台进度" width="1114px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230327103918.webp%21water&amp;size=m" alt="完成工信部短信校验">
</figure>
<p style=""><span style="color: #dc2626"><strong>注意事项</strong></span><strong>：</strong></p>
<ol>
 <li>
  <p style=""><span style="color: #eab308">如果您未收到工信部发送的验证短信，您可以重发短信，收到验证短信后请在24小时内进行提交短信核验。若未及时核验，24小时之后备案信息将自动退回至接入商。</span></p>
 </li>
 <li>
  <p style=""><span style="color: #eab308">短信在24小时内仅可重发3次，超出次数后系统将不再重发短信验证码。</span></p>
 </li>
</ol>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/domain-icp-registration-change-website</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230327104427.webp%21water&amp;size=m" type="image/jpeg" length="53994"/><category>分享</category><pubDate>Mon, 27 Mar 2023 03:11:00 GMT</pubDate></item><item><title><![CDATA[Ubuntu 系统如何使用 root 用户登录]]></title><link>https://wuqishi.com/archives/how-to-use-root-login-for-ubuntu-systems</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Ubuntu%20%E7%B3%BB%E7%BB%9F%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20root%20%E7%94%A8%E6%88%B7%E7%99%BB%E5%BD%95&amp;url=/archives/how-to-use-root-login-for-ubuntu-systems" width="1" height="1" alt="" style="opacity:0;">
<p>Ubuntu 系统的默认用户名是 ubuntu，并在安装过程中默认不设置 root 帐户和密码。</p>
<p>其实之前文章中有过介绍，不过在实际使用中发现跟在甲骨文中有些不一样，重新记录一下。</p>
<hyperlink-card href="https://wuqishi.com/archives/oracle-instance-opening-and-xui-installation" target="_blank" theme="regular"></hyperlink-card>
<h2 id="步骤">步骤</h2>
<ol>
 <li>
  <p>使用ubuntu账号登录服务器。</p>
 </li>
 <li>
  <p>执行以下命令，设置 root 密码：</p>
  <pre><code class="language-bash">sudopasswd root
</code></pre>
 </li>
 <li>
  <p>输入 root 的密码，按 <strong>Enter</strong>。</p>
 </li>
 <li>
  <p>重复输入 root 的密码，按 <strong>Enter</strong>。返回如下信息，即表示 root 密码设置成功。
   <br>
   <code>passwd: password updated successfully</code></p>
 </li>
 <li>
  <p>执行以下命令，打开 <code>sshd_config</code> 配置文件。</p>
 </li>
</ol>
<pre><code class="language-bash">sudo vi /etc/ssh/sshd_config
</code></pre>
<ol start="6">
 <li>按 <strong>i</strong> 切换至编辑模式，找到 <code>#Authentication</code>，将 <code>PermitRootLogin</code> 参数修改为 <code>yes</code>。如果 <code>PermitRootLogin</code> 参数被注释，请去掉首行的注释符号（<code>#</code>）。</li>
 <li>找到 <code>#Authentication</code>，将 <code>PasswordAuthentication</code> 参数修改为 <code>yes</code>。
  <br>
  若 <code>sshd_config</code> 配置文件中无此配置项，则添加 <code>PasswordAuthentication yes</code> 项即可。</li>
 <li>按 <strong>Esc</strong>，输入<code>:wq</code>，保存文件并返回。</li>
 <li>执行以下命令，重启 ssh 服务。</li>
</ol>
<pre><code class="language-bash">sudo service ssh restart
</code></pre>
<ol start="10">
 <li>使用用户名<code>root</code>及设置的密码登录服务器。</li>
</ol>]]></description><guid isPermaLink="false">/archives/how-to-use-root-login-for-ubuntu-systems</guid><dc:creator>吴蛋蛋</dc:creator><category>分享</category><pubDate>Sat, 25 Mar 2023 07:16:00 GMT</pubDate></item><item><title><![CDATA[中国联通——让一切自由连不通]]></title><link>https://wuqishi.com/archives/china-unicom-making-everything-unfree-and-disconnected</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%B8%AD%E5%9B%BD%E8%81%94%E9%80%9A%E2%80%94%E2%80%94%E8%AE%A9%E4%B8%80%E5%88%87%E8%87%AA%E7%94%B1%E8%BF%9E%E4%B8%8D%E9%80%9A&amp;url=/archives/china-unicom-making-everything-unfree-and-disconnected" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323144814.webp&amp;size=m" alt="让一切自由连不通"></p>
<p>之前家里一直使用的是中国电信的融合宽带，后来换到了中国联通，没想到遇到了幺蛾子！</p>
<p>手上有一个腾讯云香港轻量云，所以IP并非大陆的IP，因为备案时间比较久，所以之前是把域名解析到这个服务器上的。域名成功解析后在家里通过域名无法访问。报错如下：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323150837.webp%21wwater&amp;size=m" alt="Edge浏览器报错"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323151040.webp%21wwater&amp;size=m" alt="Chrome浏览器报错"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323151218.webp%21water&amp;size=m" alt="Firefox浏览器报错"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323151425.webp%21wwater&amp;size=m" alt="Safari浏览器报错"></p>
<p>自己的域名wuqishi.com在之前已经遇到过这样的问题，通过工单联系工程师帮解决，工程师给的答复如下：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323151931.webp%21water&amp;size=m" alt="工程师答复一"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323152113.webp%21water&amp;size=m" alt="工程师答复二"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323152241.webp%21water&amp;size=m" alt="工程师答复三"></p>
<p>昨天因为我的另一个域名ssslove.com所在的云服务器要到期我不准备续费，所以又解析到腾讯云香港轻量云，结果再次遇到屏蔽域名的问题！！！</p>
<p>使用中国联通的宽带网络通过域名无法访问，通过中国移动手机流量可以访问；</p>
<p>使用中国电信的宽带网络通过域名可以访问，通过中国电信手机流量可以访问；</p>
<p>使用中国联通的手机流量通过域名无法访问；</p>
<p>如果其他城市也被屏蔽，我没在那个城市的话是不是就无从得知？我就不明白，为什么无缘无故屏蔽域名的访问？</p>
<blockquote>
 <p>作恶多端，多行不义必自毙！</p>
</blockquote>
<p>另外吐槽一下腾讯云的工程师之前的技术、业务水平相差很多，上次遇到的很快就帮忙判定原因并跟运营商沟通解决了，很及时。这次遇到的工程师在明确告知原因的情况下无法定位，沟通明显在推诿。</p>]]></description><guid isPermaLink="false">/archives/china-unicom-making-everything-unfree-and-disconnected</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-20230323144814.webp&amp;size=m" type="image/jpeg" length="15280"/><category>滚蛋</category><pubDate>Thu, 23 Mar 2023 07:35:00 GMT</pubDate></item><item><title><![CDATA[如何选购适合的口罩？]]></title><link>https://wuqishi.com/archives/how-to-choose-a-suitable-mask</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%A6%82%E4%BD%95%E9%80%89%E8%B4%AD%E9%80%82%E5%90%88%E7%9A%84%E5%8F%A3%E7%BD%A9%EF%BC%9F&amp;url=/archives/how-to-choose-a-suitable-mask" width="1" height="1" alt="" style="opacity:0;">
<p>因为疫情已经最近的甲流，所以准备再屯一些口罩，所以在选购口罩上找了一些攻略。记录，也分享给需要的朋友。</p>
<p>最近因为上了一节安全教育的课程，课程上老师推荐的是托玛琳口罩，材质是托玛琳加竹炭纤维，轻薄透气，可重复清洗使用。过滤效果大于等于95%，一个平均可戴2-3年左右。说是专门研究给交警使用的。</p>
<p>说实话我是不太相信的，网上搜索好像买不到托玛琳的口罩。</p>
<h2 id="KN95与N95的区别">KN95与N95的区别</h2>
<h3 id="N95口罩">N95口罩</h3>
<p>N95口罩依据的是美国联邦法规NIOSH-42CFR Part84《呼吸防护用品标准认证》的附录K-过滤式防颗粒过滤器。<strong>N95口罩即对非油性颗粒物过滤效率达到95%以上的自吸过滤式防颗粒呼吸器。</strong></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2922358270.png%21wwater&amp;size=m" alt="N95口罩"></p>
<h3 id="KN95口罩">KN95口罩</h3>
<p>KN95口罩依据的是中国标准GB 2626-2019《呼吸防护用品自吸过滤式颗粒物呼吸器》（旧标准为GB2626-2006）。</p>
<p>过滤元件按过滤性能分为KN和KP两类，KN适合过滤非油性颗粒物，KP类适用于过滤油性和非油性颗粒物。根据过滤效率水平，过滤元件的级别，口罩可分为KN90，KN95，KN100，KP90，KP95，KP100六大类。<strong>KN95口罩即对非油性颗粒物过滤效率达到95%以上的自吸过滤式防颗粒呼吸器。</strong></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3873057833.png%21water&amp;size=m" alt="KN95口罩"></p>
<h3 id="二者区别">二者区别</h3>
<p>KN95与N95型口罩都是对非油性颗粒物过滤效率达到95%以上的自吸过滤式防颗粒呼吸器，只不过所属的标准不同，一个是国标（GB 2626-2019），一个是美标（NIOSH-42CFR Part84）而已。</p>
<p><strong>N95和KN95在测试方式上完全一模一样，都是85L/min流量下的0.3微米氯化钠气溶胶拦截效率。那些盲目吹嘘N95优于KN95的完全是无稽之谈！</strong></p>
<p>从关键考核指标上上可以看到，KN95考核指标增加了<strong>泄漏性、死腔、气密性、可燃性、清洗和消毒</strong>等。</p>
<p>KN95型口罩与N95型口罩在颗粒过滤效率、呼吸阻力、呼气阀气密性等关键指标要求是一致的。但KN95型口罩在测试过程中需要经过的预处理条件更加复杂和苛刻，并且在头带拉力、连接和连接部件、死腔、视野等指标都有具体数值要求，而N95没有。</p>
<p>整体来说，<strong>KN95型口罩比N95口罩要求更多，综合要求更高！尤其是舒适性上，KN95要明显优于N95，更适合日常佩戴。</strong></p>
<h2 id="医用口罩与民用口罩的区别">医用口罩与民用口罩的区别</h2>
<p>由于医疗人员工作环境的特殊性，因此医用口罩的标准体系也同上文所讲的KN95/N95所采用的标准体系略有不同。</p>
<p>主要在于有 <strong>对合成血液穿透性的要求</strong> （可以简单理解为防渗透性）。一是防止病人的飞沫、口水、血液喷湿而导致细菌通透性增加，二是防止由于长时间佩戴后口罩浸湿而造成通透性增加，防护作用大打折扣。</p>
<p>目前我国关于医用口罩的主要标准有：</p>
<ul>
 <li>①GB 19083-2010《医用防护口罩技术要求》，强制性国家标准；</li>
 <li>②YY 0469-2011《医用外科口罩》，医药行业标准；</li>
 <li>③YY/T 0969-2013《一次性使用医用口罩》，推荐性医药行业标准；</li>
</ul>
<p>并且所有N95都可以医用。N95口罩如果需要符合医用标准，需要额外通过：</p>
<ul>
 <li>1）BFE (Bacterial Filtration Efficiency) according to ASTM F2101。</li>
 <li>2）Fluid resistant according to ASTM F1862.这两个测试。</li>
</ul>
<p>而且N95口罩，无论是国产还是进口，无论是3M的哪个型号，都必须拿到国内的进口产品医疗器械注册证才能售卖，所以必须符合GB19083，而不是GB2626（即：符合GB2626的3M口罩，不属于医疗器械，不能用于医院）。</p>
<p><strong>同理，KN95口罩通过GB19083里相应的测试，一样可以用于医用。</strong></p>
<h2 id="我们要买什么样标准的口罩-">我们要买什么样标准的口罩？</h2>
<ol>
 <li>按照对佩戴者的防护能力优先级排名： <strong>医用防护口罩（GB19083）＞N95/KN95口罩＞医用外科口罩（YY0469）＞一次性医用口罩(YYT0969)＞普通棉口罩</strong> 。</li>
 <li><strong>N95是美标，KN95是国标</strong> ， <strong>KN95型口罩比N95口罩要求更多，综合要求更高</strong> ！尤其是舒适性上，KN95要明显优于N95，更适合日常佩戴。</li>
 <li>医用防护口罩（GB19083）产能稀缺，<strong>日常防护KN95就已经非常好了</strong> 。YY0469的<strong>医用外科口罩足以满足中等风险</strong>的环境需求。</li>
 <li>儿童口罩选择符合标准： <strong>GB/T 38880-2020《儿童口罩技术规范》</strong> 。</li>
 <li><strong>尽量不要选购带有呼吸阀的口罩</strong> ，一是怕故障失去防护效果，二是一旦佩戴者携带病毒，会从呼吸阀排出，有点损人利己了。</li>
 <li><strong>选购口罩一定要认准执行标准</strong> ，无标准的棉布口罩、无纺布口罩、高分子材料口罩、活性炭粉滤芯口罩、活性炭纤维毡垫口罩等等，只能隔离空气中部分粉尘，基本不具备防护作用。</li>
 <li><strong>不要一味追求高过滤性</strong> 。口罩的过滤效率越高，通常呼吸气流的阻力也越大，容易产生不适感，影响保持佩戴的时间长短，所以在确保基本防护功能要求后，应尽量选择呼吸阻力较低的、整体舒适感较强的口罩。</li>
 <li><strong>买大品牌的正品</strong> ！就现在这个行情，利润实在太大了，所以什么要么鬼怪都出来了，不管有没有认证都打着N95/KN95的幌子在卖的，还有假冒3M等热销品牌的， 所以还是选择正规渠道的大品牌买吧，虽然挺难的，但是尽量少踩坑。</li>
</ol>
<p>来源：<a href="https://post.smzdm.com/p/a0qdprr9/">什么值得买</a></p>]]></description><guid isPermaLink="false">/archives/how-to-choose-a-suitable-mask</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2922358270.png%21wwater&amp;size=m" type="image/jpeg" length="64822"/><category>分享</category><pubDate>Mon, 20 Mar 2023 13:00:00 GMT</pubDate></item><item><title><![CDATA[今天移动营业厅遇到一个小姐姐，真的好美]]></title><link>https://wuqishi.com/archives/today-i-met-a-beauty-girl-she-is-really-beautiful</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%BB%8A%E5%A4%A9%E7%A7%BB%E5%8A%A8%E8%90%A5%E4%B8%9A%E5%8E%85%E9%81%87%E5%88%B0%E4%B8%80%E4%B8%AA%E5%B0%8F%E5%A7%90%E5%A7%90%EF%BC%8C%E7%9C%9F%E7%9A%84%E5%A5%BD%E7%BE%8E&amp;url=/archives/today-i-met-a-beauty-girl-she-is-really-beautiful" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p>今天移动营业厅遇到一个小姐姐，真的好美 ::twemoji:love::</p>
</blockquote>
<p>人说这辈子的擦肩而过，是上辈子的五百次回眸。美好的事物总是让人赏心悦目，让人心情愉悦。</p>
<p>骤然，就像在池子里投入一粒石子，随着“扑通”一声，溅起了水花，涟漪荡漾而来，敲击着壁垒，又让人蕴满遗憾。</p>
<p>人们总是感慨，在最好的年纪遇到了最让人想要守护的人，却又没有能力担负起这份守护。</p>
<p>愁绪啊，</p>
<p>像雾，不经意间打湿了衣裳，带来入骨寒意；</p>
<p>像雨，整个天地都是淅淅沥沥，噪声入耳，无法隔绝；</p>
<p>像风，呼呼之间，带走了什么，又带来了更多，紧紧衣领，埋头前行。</p>
<p>你说这雾、这雨、这风，纠结了多少旅人，在这短暂的天地间，是否有称心如意的人和事？</p>
<blockquote>
 <p>人生苦短，及时行乐
  <br>
  人生且长，求而不得</p>
</blockquote>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3204469487.jpeg%21water&amp;size=m" alt="美丽的小姐姐"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F263654293.jpeg%21water&amp;size=m" alt="认真工作的美丽小姐姐"></p>
<p>有人总说，如果年轻10岁，定然不负时光，然而时光总是不语，却给出了答案。</p>
<p>有遗憾，不后悔。</p>
<p>人生总不如意，且行且珍惜。</p>]]></description><guid isPermaLink="false">/archives/today-i-met-a-beauty-girl-she-is-really-beautiful</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3204469487.jpeg%21water&amp;size=m" type="image/jpeg" length="0"/><category>蛋花</category><pubDate>Thu, 16 Mar 2023 06:22:00 GMT</pubDate></item><item><title><![CDATA[它不乐意]]></title><link>https://wuqishi.com/archives/it-doesnt-like-it</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%AE%83%E4%B8%8D%E4%B9%90%E6%84%8F&amp;url=/archives/it-doesnt-like-it" width="1" height="1" alt="" style="opacity:0;">
<p>外公在吃海参，居居非要上前帮忙。夹呀夹......太滑了，夹不上来。</p>
<p>“夹不上来吗？”</p>
<p>“它不乐意！”</p>
<hr>
<p><strong>2023年3月10日</strong></p>
<p>居居：40个月 5 天❤️</p>]]></description><guid isPermaLink="false">/archives/it-doesnt-like-it</guid><dc:creator>吴蛋蛋</dc:creator><category>蛋花</category><pubDate>Fri, 10 Mar 2023 15:04:00 GMT</pubDate></item><item><title><![CDATA[如何解决Typecho文章不是Markdown语法创建问题]]></title><link>https://wuqishi.com/archives/how-to-solve-the-problem-that-typecho-articles-are-not-markdown-syntax-creation</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3Typecho%E6%96%87%E7%AB%A0%E4%B8%8D%E6%98%AFMarkdown%E8%AF%AD%E6%B3%95%E5%88%9B%E5%BB%BA%E9%97%AE%E9%A2%98&amp;url=/archives/how-to-solve-the-problem-that-typecho-articles-are-not-markdown-syntax-creation" width="1" height="1" alt="" style="opacity:0;">
<h2 id="问题由来">问题由来</h2>
<p>从WordPress转回Typecho后因为直接使用了handsome主题，并开启了主题中自带的vditor编辑器，且同时前台引入vditor.js接管前台解析。</p>
<p>在我的<a href="https://wuqishi.com/cross/#comment-146">唠叨</a>中提到过：</p>
<blockquote>
 <p>问题：插件 ShortLinks 与 handsome主题 vditor前台解析冲突，导致短链接无法新窗口打开跳转。
  <br>
  解决：停止全局vditor前台解析，使用typecho自带的markdown解析。针对自带无法解析的内容，单独引入 vditor前台解析。</p>
</blockquote>
<p>这两天在切换了Typecho前台解析器后并没有检查之前的文章，只检查了最近的文章。</p>
<p>于是就引发了文章前台未使用Markdown解析的问题，编辑该文章时，后台编辑器上提示：</p>
<blockquote>
 <p>这篇文章不是由Markdown语法创建的, 继续使用Markdown编辑它吗?</p>
</blockquote>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-%25E5%258F%2591%25E5%25B8%2583%25E5%2590%258E%25E7%259A%2584%25E9%2597%25AE%25E9%25A2%2598.png%21water&amp;size=m" alt="编辑器提示"></p>
<p>很久之前写过一篇文章：</p>
<hyperlink-card href="https://wuqishi.com/archives/mweb-to-typecho" target="_blank" theme="regular"></hyperlink-card>
<p>其中也提到通过Mweb发布到Typecho时遇到Markdown语法识别问题，一直没有找到原因。</p>
<h2 id="排查原因">排查原因</h2>
<ol>
 <li>首先想到通过数据库后台查看文章的字段，是否包含开启markdown解析字样。发现并没有。</li>
 <li>于是我编辑一篇，手动将文章转换后保存，前台显示正常。但是前往数据库从并未发现字段值有变化。</li>
 <li>通过比对近期文章与没有开启Markdown语法解析的文章后发现了原因。</li>
</ol>
<h2 id="解决问题">解决问题</h2>
<p>在近期文章的数据库<code>text</code>即文章正文开头存在一个特殊的语法内容：<code>!markdown</code></p>
<p>这个语法内容决定了该篇文章是否采用Markdown语法解析。</p>
<p>在将每篇未开启Markdown语法解析的文章<code>text</code>中都加入该语法内容后，果然前台解析成功。</p>
<h2 id="使用途径">使用途径</h2>
<p>找到原因后，思考一下哪些情况会用到：</p>
<ol>
 <li>由其他博客程序转换到Typecho后；</li>
 <li>通过<code>Metaweblog API</code>发布文章到Typecho；</li>
 <li>Typecho使用其他编辑器后；</li>
</ol>]]></description><guid isPermaLink="false">/archives/how-to-solve-the-problem-that-typecho-articles-are-not-markdown-syntax-creation</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-%25E5%258F%2591%25E5%25B8%2583%25E5%2590%258E%25E7%259A%2584%25E9%2597%25AE%25E9%25A2%2598.png%21water&amp;size=m" type="image/jpeg" length="43546"/><category>技巧</category><pubDate>Wed, 8 Mar 2023 09:15:03 GMT</pubDate></item><item><title><![CDATA[探手抓住这一天的尾巴，为自己庆生]]></title><link>https://wuqishi.com/archives/happy-my-birthday</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%8E%A2%E6%89%8B%E6%8A%93%E4%BD%8F%E8%BF%99%E4%B8%80%E5%A4%A9%E7%9A%84%E5%B0%BE%E5%B7%B4%EF%BC%8C%E4%B8%BA%E8%87%AA%E5%B7%B1%E5%BA%86%E7%94%9F&amp;url=/archives/happy-my-birthday" width="1" height="1" alt="" style="opacity:0;">
<p style=""><span style="color: #22c55e">农历：葵卯年 乙卯月 甲子日 二月十六</span></p>
<p style="">探手抓住这一天的尾巴，为自己庆生??。</p>
<p style="">那道多年前穿越凌晨的灵光，依旧不偏不倚，从松针的晨露里透出，散成七彩。</p>
<p style="">从呱呱坠地，到牙牙学语；</p>
<p style="">从步履蹒跚，到扎根他乡；</p>
<p style="">从形单影只，到凤冠霞帔；</p>
<p style="">看那地上影从二成三，也便觉得人生如此。</p>
<p style="">举杯，爱自己！</p>]]></description><guid isPermaLink="false">/archives/happy-my-birthday</guid><dc:creator>吴蛋蛋</dc:creator><category>蛋花</category><pubDate>Tue, 7 Mar 2023 15:56:00 GMT</pubDate></item><item><title><![CDATA[收到腾讯云自媒体分享计划2月份礼品]]></title><link>https://wuqishi.com/archives/received-february-gifts-of-tencent-support-plan</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%94%B6%E5%88%B0%E8%85%BE%E8%AE%AF%E4%BA%91%E8%87%AA%E5%AA%92%E4%BD%93%E5%88%86%E4%BA%AB%E8%AE%A1%E5%88%922%E6%9C%88%E4%BB%BD%E7%A4%BC%E5%93%81&amp;url=/archives/received-february-gifts-of-tencent-support-plan" width="1" height="1" alt="" style="opacity:0;">
<figure style="align-items: center; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3658084934.png%21water&amp;size=m" alt="腾讯云自媒体分享计划申请审核通过" width="3024px">
 <figcaption data-placeholder="添加描述" style="width: 3024px; max-width: 100%; text-align: center;">腾讯云自媒体分享计划申请审核通过</figcaption>
</figure>
<p style=""></p>
<timeline-view group-name="timeline-group-lkxdwnh4" orientation="vertical"></timeline-view>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F1133507594.jpeg%21water&amp;size=m" alt="怪奇鹅儿童斜挎包-奶牛款" width="50%" height="auto">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F1986160931.jpeg%21water&amp;size=m" alt="怪奇鹅儿童斜挎包-奶牛款-躺式" width="50%" height="auto">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2158321162.jpeg%21wwater&amp;size=m" alt="怪奇鹅儿童斜挎包-奶牛款-立式" width="50%" height="auto">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3670775843.jpeg%21water&amp;size=m" alt="定制贴纸" width="50%" height="auto">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2653950062.jpeg%21wwater&amp;size=m" alt="定制鼠标垫" width="50%" height="auto">
</figure>
<p style=""></p>
<p style="">要参加的朋友可以点击去参加：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://cloud.tencent.com/developer/support-plan?invite_code=2jp4hmdrbbc4g" theme="small" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="腾讯云自媒体同步曝光计划 - 腾讯云开发者社区-腾讯云" custom-description="满足条件的自媒体，入驻腾讯云开发者社区，可分享总价值百万资源包" custom-image="https://cloudcache.tencent-cloud.com/qcloud/favicon.ico?t=201902181234"><a href="https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://cloud.tencent.com/developer/support-plan?invite_code=2jp4hmdrbbc4g" target="_blank">https://wuqishi.com/plugins/plugin-safe-redirect/go?url=https://cloud.tencent.com/developer/support-plan?invite_code=2jp4hmdrbbc4g</a></hyperlink-card>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/received-february-gifts-of-tencent-support-plan</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3658084934.png%21water&amp;size=m" type="image/jpeg" length="14042"/><category>滚蛋</category><pubDate>Mon, 6 Mar 2023 08:53:00 GMT</pubDate></item><item><title><![CDATA[尝试百度Spider抓取异常问题]]></title><link>https://wuqishi.com/archives/try-baidu-spider-to-catch-abnormal-problems</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%B0%9D%E8%AF%95%E7%99%BE%E5%BA%A6Spider%E6%8A%93%E5%8F%96%E5%BC%82%E5%B8%B8%E9%97%AE%E9%A2%98&amp;url=/archives/try-baidu-spider-to-catch-abnormal-problems" width="1" height="1" alt="" style="opacity:0;">
<p>这两天尝试CloudFlare官方免费CNAME接入方式，详情见文章：</p>
<hyperlink-card href="https://wuqishi.com/archives/youliangzhongxinfangancloudflareguanfangmianfeicnamejierujiaocheng" target="_blank" theme="regular"></hyperlink-card>
<p>经过测试<strong>通过 Cloudflare pages function</strong>方法已失效，最后只有<strong>通过 SaaS</strong>配置成功。</p>
<h2 id="问题出现">问题出现</h2>
<p>然而，在百度搜索资源平台的<strong>sitemap抓取</strong>及<strong>抓取诊断</strong>却出了问题：</p>
<blockquote>
 <ol>
  <li>sitemap状态变为解析错误</li>
  <li>在抓取诊断中报错：<code>socket</code> 读写错误</li>
 </ol>
</blockquote>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230303152913644.png%21water&amp;size=m" alt="多次抓取失败"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230303153104783.png%21water&amp;size=m" alt="抓取详情的异常信息"></p>
<p>百度官方对<code>socket</code>读写错误的解释：</p>
<blockquote>
 <p>【socket读写错误】
  <br>
  当百度spider访问服务器，进行tcp通信的时候，socket读写发生异常，导致数据不能正常返回。请检查服务器连接状况和防火墙设置是否符合预期。</p>
</blockquote>
<h2 id="尝试解决">尝试解决</h2>
<p>在查询了一圈网上资料后，确定了需要在Cloudflare上配置WAF防火墙规则。</p>
<h3 id="1-百度爬虫抓取诊断链接失败解决方法">1、百度爬虫抓取诊断链接失败解决方法</h3>
<p>登录Cloudflare → 安全性 → WAF → 防火墙规则 → 创建防火墙规则。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230303153941485.png%21water&amp;size=m" alt="合法机器人爬虫"></p>
<h3 id="2-百度爬虫抓取Sitemap地图失败解决方法">2、百度爬虫抓取Sitemap地图失败解决方法</h3>
<p>同样的地方：登录Cloudflare → 安全性 → WAF → 防火墙规则 → 创建防火墙规则。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230303154311349.png%21water&amp;size=m" alt="用户代理配置"></p>
<ol>
 <li>字段，选择“用户代理”</li>
 <li>运算符，选择“包含”</li>
 <li>添加新的用户代理，点击最后的“Or”</li>
 <li>值，分别输入以下百度蜘蛛UA用户代理</li>
</ol>
<pre><code>Baiduspider/2.0
Baiduspider-image
Baiduspider-render/2.0
http://www.baidu.com/search/spider.html
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html）
</code></pre>
<p>整体表达式如下：</p>
<pre><code>(http.user_agent contains "Baiduspider/2.0" and http.user_agent contains "Baiduspider-image" and http.user_agent contains "Baiduspider-render/2.0" and http.user_agent contains "http://www.baidu.com/search/spider.html" and http.user_agent contains "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" and http.user_agent contains "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html）")
</code></pre>
<h2 id="写在后面">写在后面</h2>
<p>为什么这篇文章只是尝试解决问题呢，因为经过以上步骤后，在百度抓取诊断后测试的结果是时灵时不灵，结果不尽如人意。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230303154832292.png%21water&amp;size=m" alt="结果不尽如人意"></p>
<p>直到看到一位同样遇到这类问题的网友写了这么一段话：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230303155018331.png&amp;size=m" alt="网友的话"></p>
<p>感慨万千！</p>]]></description><guid isPermaLink="false">/archives/try-baidu-spider-to-catch-abnormal-problems</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2Fp-image-20230303152913644.png%21water&amp;size=m" type="image/jpeg" length="17778"/><category>技巧</category><pubDate>Fri, 3 Mar 2023 07:56:00 GMT</pubDate></item><item><title><![CDATA[甲骨文DD重装系统及失联救砖教程]]></title><link>https://wuqishi.com/archives/oracle-dd-reassembly-system-and-brick-rescue-course</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%94%B2%E9%AA%A8%E6%96%87DD%E9%87%8D%E8%A3%85%E7%B3%BB%E7%BB%9F%E5%8F%8A%E5%A4%B1%E8%81%94%E6%95%91%E7%A0%96%E6%95%99%E7%A8%8B&amp;url=/archives/oracle-dd-reassembly-system-and-brick-rescue-course" width="1" height="1" alt="" style="opacity:0;">
<h2 id="dd-">一、DD 本机系统</h2>
<p>dd 系统即重装系统：如下表示将系统重置为 <code>ubuntu20.04</code> 系统，账号/密码：<code>root/12345</code></p>
<p><strong>注意事项：dd 过程一定要耐心等待，不要胡乱操作比如去后台重启，容易失联。耐心等待 10-30 分钟。</strong></p>
<pre><code class="language-bash">bash &lt;(wget --no-check-certificate -qO- 'https://moeclub.org/attachment/LinuxShell/InstallNET.sh') -u 20.04 -v 64 -a -firmware -p 12345
</code></pre>
<p>说明：</p>
<ul>
 <li><code>-d</code>: Debian 系统 版本可选：【7、8、9、10，11】</li>
 <li><code>-u</code>: Ubuntu 系统 版本可选：【14.04、16.04、18.04、20.04】</li>
 <li><code>-p</code>: 密码</li>
</ul>
<h2 id="heading">二、失联救砖</h2>
<ul>
 <li>这边假设你没有看到上面的注意事项，dd 失联了，当然也有可能是其他原因引起。就是无法通过 ssh 链接你的服务器了。就需要救砖了。</li>
 <li>救砖原理为：服务器数据存储在甲骨文的磁盘里，也就是那个默认 50G 的盘里。这个盘可以分离，挂载，重置数据。可以理解为你的 U 盘，可以拔出来，换台电脑重置一下系统，再插回去。</li>
</ul>
<h3 id="1">1、创建备用实例</h3>
<ul>
 <li>同账号找一个新的实例；如果没有则创建一个免费的amd</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2275688629.png%21water&amp;size=m" alt="新的实例"></p>
<ul>
 <li>ssh 连接，然后执行 <code>sudo -i</code> 进入 root；</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3176206182.png&amp;size=m" alt="进入root"></p>
<h3 id="2">2、分离失联实例硬盘</h3>
<ol>
 <li>停止失联实例:注意是停止不是终止，一会还得挂载回来</li>
 <li>分离引导卷</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F570190558.png%21water&amp;size=m" alt="分离引导卷"></p>
<h3 id="3--">3、挂载失联实例引导卷-&gt; 备用实例</h3>
<ol>
 <li>备用实例 -&gt; 附加的块存储</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F1868398053.png%21water&amp;size=m" alt="附加的块存储"></p>
<ol start="2">
 <li>选择刚刚分离的失联引导卷，类型 <code>ISCSI</code>，访问 <code>读写</code></li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2297326417.png%21water&amp;size=m" alt="选择刚刚分离的失联引导卷"></p>
<ol start="3">
 <li><code>ISCSI</code> 需要在主机上执行挂载分离命令，此处先复制链接命令，过会分离用分离命令</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F1225588525.png%21water&amp;size=m" alt="查看命令和信息"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3380496206.png%21water&amp;size=m" alt="复制链接命令"></p>
<ol start="4">
 <li>打开备用实例 ssh，输入复制的连接命令</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F751147774.png%21wwater&amp;size=m" alt="输入复制的连接命令"></p>
<h3 id="4dd-">4、dd 附加盘</h3>
<p><strong>注：此系统为原作者简化 dabian 系统，主要为了快速恢复失联；等待失联恢复后如需要其他系统，可使用一中脚本重新 dd</strong></p>
<ol>
 <li>下载镜像：</li>
</ol>
<pre><code class="language-bash">cd /root &amp;&amp; wget https://app.isos.cc/dabian.sdb.gz
</code></pre>
<ol start="2">
 <li>dd系统：</li>
</ol>
<pre><code class="language-bash">gzip -dc /root/dabian.sdb.gz | dd of=/dev/sdb
</code></pre>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3810158420.png%21wwater&amp;size=m" alt="dd简化系统"></p>
<ol start="3">
 <li>新打开一个 ssh 窗口</li>
</ol>
<pre><code class="language-bash">sudo -i
watch -n 5 pkill -USR1 ^dd$
</code></pre>
<ol start="4">
 <li>然后重新回到此窗口，将发现 dd 正在进行中，一直等待到进度完成，此 dd 需要复制 3.2G 数据。</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3090807184.png%21wwater&amp;size=m" alt="dd执行中"></p>
<h3 id="5dd---">5、dd 结束，分离备用实例附加盘-&gt; 挂载为失联实例引导盘</h3>
<ol>
 <li>分离附加盘，3-3 步骤的分离命令执行一下，控制台分离</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F4294510033.png%21wwater&amp;size=m" alt="执行分离命令"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3855220436.png%21water&amp;size=m" alt="控制台分离"></p>
<ol start="2">
 <li>回到失联实例-引导卷，再给附加回去</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F341969760.png%21water&amp;size=m" alt="附加失联引导卷"></p>
<ol start="3">
 <li>开机，使用 账号/密码：<code>root/10086.fit</code> 登录实例。</li>
</ol>
<h3 id="-dd-">三、自己制作 dd 包（附加内容，有需求可以玩玩）</h3>
<ol>
 <li>
  <p>与 二 步骤相同，把想要作为镜像的 arm 引导盘挂载到一个备用机（建议配置高点，速度快）</p>
 </li>
 <li>
  <p>备用机执行 <code>dd if=/dev/sdb | gzip &gt; /root/ubuntu.img.gz</code> 生成的压缩包在/root 目录下，时间很长需要等待</p>
 </li>
 <li>
  <p>dd 恢复命令 <code>gzip -dc /root/ubuntu.img.gz | dd of=/dev/sdb</code>，过程如二</p>
  <p><a href="https://blog.huijia21.com/20221228162742.html">来源</a></p>
 </li>
</ol>]]></description><guid isPermaLink="false">/archives/oracle-dd-reassembly-system-and-brick-rescue-course</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2275688629.png%21water&amp;size=m" type="image/jpeg" length="108922"/><category>分享</category><pubDate>Fri, 3 Mar 2023 03:12:00 GMT</pubDate></item><item><title><![CDATA[终于MrDoc升级v0.8.7成功了]]></title><link>https://wuqishi.com/archives/finally-mrdoc-upgraded-v087-successfully</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BB%88%E4%BA%8EMrDoc%E5%8D%87%E7%BA%A7v0.8.7%E6%88%90%E5%8A%9F%E4%BA%86&amp;url=/archives/finally-mrdoc-upgraded-v087-successfully" width="1" height="1" alt="" style="opacity:0;">
<h2 id="前言">前言</h2>
<p>之前写过文章说我升级MrDoc v0.8.7失败：</p>
<hyperlink-card href="https://wuqishi.com/archives/mrdoc-upgrade-v087-failed" target="_blank" theme="regular"></hyperlink-card>
<p>当时过于匆忙，并未深究其中原因，今天认真查看报错后发现，其实还是很简单的。</p>
<p>按照本次内容更新成功，建议官方文档添加这部分内容，让人少走一些弯路。</p>
<h2 id="正文">正文</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2609218562.png%21water&amp;size=m" alt="Docker版官方更新方法"></p>
<p>之前文章说过，按照上方图片中官方文档处理出现以下问题：</p>
<blockquote>
 <ul>
  <li>首先通过ssh工具连接NAS后，直接通过以上代码无法完成在容器外拉取。</li>
  <li>我尝试进入容器内部通过以上代码同样无法完成拉取。</li>
  <li>通过网上查找，发现在群晖docker容器中的终端机输入代码 <code>git pull</code>还是无法进行拉取。</li>
 </ul>
</blockquote>
<p>认真查看报错如下图：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F1498370684.png%21wwater&amp;size=m" alt="报错图"></p>
<p>大意是要将<code>/app/Mrdoc</code>设为安全目录</p>
<p>执行一下代码：</p>
<pre><code class="language-bash">git config --global --add safe.directory /app/MrDoc
</code></pre>
<p>然后重新按之前文章中步骤一、二执行即可。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F433603651.png%21wwater&amp;size=m" alt="执行完成，升级成功"></p>
<p><strong>注意事项</strong></p>
<p>因官方文件覆盖，如果有修改配置中的端口号，需要再次修改。</p>]]></description><guid isPermaLink="false">/archives/finally-mrdoc-upgraded-v087-successfully</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2609218562.png%21water&amp;size=m" type="image/jpeg" length="14536"/><category>滚蛋</category><pubDate>Wed, 1 Mar 2023 03:34:00 GMT</pubDate></item><item><title><![CDATA[Windows 端口查询及杀死进程]]></title><link>https://wuqishi.com/archives/windows-port-query-and-kill-process</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Windows%20%E7%AB%AF%E5%8F%A3%E6%9F%A5%E8%AF%A2%E5%8F%8A%E6%9D%80%E6%AD%BB%E8%BF%9B%E7%A8%8B&amp;url=/archives/windows-port-query-and-kill-process" width="1" height="1" alt="" style="opacity:0;">
<p>在使用<code>Windows</code>过程中，有些程序因为特定端口被占用，导致出现一些问题，需要查询该端口占用情况。</p>
<h2 id="heading">查询所有端口命令</h2>
<pre><code class="language-bash">netstat -ano
</code></pre>
<p>查询结果：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2564423122.png%21wwater&amp;size=m" alt="查询所有端口"></p>
<h2 id="heading-1">查询某个特定端口</h2>
<pre><code class="language-bash">netstat -ano|findstr "6806"
</code></pre>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3270112511.png%21wwater&amp;size=m" alt="查询某个特定端口"></p>
<h2 id="heading-2">通过进程号杀死该进程</h2>
<p>图中红框中的数字即占用该端口的程序的进程号，通过命令杀死该进程即可。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2578729843.png%21wwater&amp;size=m" alt="根据进程号杀死进程"></p>
<pre><code class="language-bash">taskkill -f /pid 13436
</code></pre>
<h2 id="heading-3">通过进程号查询程序</h2>
<p>如果想知道进程号对应的是哪个程序怎么办？</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1800625256.png%21wwater&amp;size=m" alt="通过进程号查询程序"></p>
<pre><code class="language-bash">tasklist | findstr 1508
</code></pre>
<p><code>svchost.exe</code>这个程序占用了1508进程。</p>]]></description><guid isPermaLink="false">/archives/windows-port-query-and-kill-process</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2564423122.png%21wwater&amp;size=m" type="image/jpeg" length="57076"/><category>技巧</category><pubDate>Tue, 28 Feb 2023 07:13:00 GMT</pubDate></item><item><title><![CDATA[甲骨文实例开通与X-UI安装]]></title><link>https://wuqishi.com/archives/oracle-instance-opening-and-xui-installation</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%94%B2%E9%AA%A8%E6%96%87%E5%AE%9E%E4%BE%8B%E5%BC%80%E9%80%9A%E4%B8%8EX-UI%E5%AE%89%E8%A3%85&amp;url=/archives/oracle-instance-opening-and-xui-installation" width="1" height="1" alt="" style="opacity:0;">
<h2 id="heading">甲骨文配置</h2>
<h3 id="heading-1">端口开放</h3>
<p>　　甲骨文的注册与实例申请阶段暂时不表，进入端口开放配置。</p>
<ol>
 <li>实例申请完成，进入实例详情页后，点击“子网”链接。</li>
</ol>
<p>　　<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F947152799.png%21water&amp;size=m" alt="选择子网"></p>
<ol start="2">
 <li>点击“安全列表”中的默认安全列表，进入默认安全列表详情。</li>
</ol>
<p>　　<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F603246194.png%21water&amp;size=m" alt="选择默认安全列表"></p>
<ol start="3">
 <li>入站规则设置</li>
</ol>
<p>　　<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2070413655.png%21water&amp;size=m" alt="配置入站规则"></p>
<ol start="4">
 <li>出站规则设置</li>
</ol>
<p>　　<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3565734420.png%21water&amp;size=m" alt="配置出站规则"></p>
<ol start="5">
 <li>返回实例详情页，复制<strong>公共 IP 地址</strong>，在本地ping这个地址，查询丢包情况，无丢包则可用。</li>
</ol>
<pre><code class="language-bash">ping 138.2.121.255 -t
</code></pre>
<p>　　<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F385625513.png%21wwater&amp;size=m" alt="查看丢包情况"></p>
<h3 id="rootssh">开启root登陆SSH</h3>
<ol>
 <li>打开FinalShell，新建SSH连接。</li>
</ol>
<p>　　名称随意；主机填写公共IP地址，端口默认22；认证方式选择公钥；用户名ubuntu；</p>
<p>　　私钥-浏览-导入-导入私钥，名称自定义，浏览选择私钥key，私钥密码默认，导入后选择该私钥，最终结果如图：</p>
<p>　　<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1070510930.png%21water&amp;size=m" alt="导入私钥"></p>
<ol start="2">
 <li>开启root登陆</li>
</ol>
<ul>
 <li>获取权限并进入root文件夹</li>
</ul>
<pre><code class="language-bash">sudo su
cd /root
</code></pre>
<ul>
 <li>修改authorized_keys文件（即ssh证书）</li>
</ul>
<pre><code class="language-bash">vi .ssh/authorized_keys
</code></pre>
<p>　　找到并把ssh-rsa之前的文字都删除掉。</p>
<ul>
 <li>编辑ssh配置文件</li>
</ul>
<pre><code class="language-bash">nano /etc/ssh/sshd_config
</code></pre>
<p>　　找到PermitRootLogin, 把前面的井号去掉，并修改为：</p>
<pre><code class="language-bash">PermitRootLogin yes
</code></pre>
<p>　　ctrl+x 保存退出 选择y 然后回车。</p>
<ul>
 <li>退出后<code>reboot</code>重启服务器。</li>
 <li>将SSH登陆中的用户名ubuntu修改为root后重新登陆</li>
</ul>
<h3 id="heading-2">开启防火墙</h3>
<p>　　依次输入以下代码：</p>
<pre><code class="language-bash">iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
apt-get purge netfilter-persistent
reboot
</code></pre>
<h2 id="x-ui">X-UI面板</h2>
<h3 id="ssl">申请SSL证书</h3>
<p>　　可以用一个域名的子域名，解析到该实例上。</p>
<p>　　使用root登陆该实例。</p>
<ol>
 <li>申请SSL证书</li>
</ol>
<pre><code class="language-bash">apt update -y
apt install -y curl
apt install -y socat
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --register-account -m xxx@xxx.xxx
</code></pre>
<p>　　xxx@xxx.xxx更换为真实邮箱成功率更高。</p>
<pre><code class="language-bash">~/.acme.sh/acme.sh --issue -d xxxx.xxxx.xxx --standalone
</code></pre>
<p>　　xxxx.xxxx.xxx更换为你的解析域名。</p>
<pre><code class="language-bash">~/.acme.sh/acme.sh --installcert -d xxxx.xxxx.xxx --key-file /root/private.key --fullchain-file /root/cert.crt
</code></pre>
<p>　　此步完成后会在VPS root 目录下看到证书公钥/root/cert.crt 及 密钥文件/root/private.key</p>
<h3 id="x-ui-1">安装X-UI面板</h3>
<pre><code class="language-bash">bash &lt;(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)
</code></pre>
<blockquote>
 <p>私钥路径：/root/private.key
  <br>
  公钥路径：/root/cert.crt</p>
</blockquote>
<p>　　<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3330586214.png%21wwater&amp;size=m" alt="安装X-UI面板"></p>
<h3 id="bbr">安装BBR加速</h3>
<ol>
 <li>可通过x-ui命令安装BBR加速</li>
 <li>通过以下代码添加</li>
</ol>
<pre><code class="language-bash">echo "net.core.default_qdisc=fq" &gt;&gt; /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" &gt;&gt; /etc/sysctl.conf
sysctl -p
</code></pre>
<ol start="3">
 <li>验证</li>
</ol>
<pre><code class="language-bash">lsmod | grep bbr
</code></pre>
<p>　　看到 20480 或 16384 说明BBR 开启成功。</p>]]></description><guid isPermaLink="false">/archives/oracle-instance-opening-and-xui-installation</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F947152799.png%21water&amp;size=m" type="image/jpeg" length="55492"/><category>分享</category><pubDate>Mon, 27 Feb 2023 08:46:00 GMT</pubDate></item><item><title><![CDATA[国艺花鸟市场的悠闲]]></title><link>https://wuqishi.com/archives/leisure-of-guo-yi-plaza</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%9B%BD%E8%89%BA%E8%8A%B1%E9%B8%9F%E5%B8%82%E5%9C%BA%E7%9A%84%E6%82%A0%E9%97%B2&amp;url=/archives/leisure-of-guo-yi-plaza" width="1" height="1" alt="" style="opacity:0;">
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3970236483.jpeg%21water&amp;size=m" alt="国艺花鸟市场小门" width="50%" height="auto">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F572029344.jpeg%21water&amp;size=m" alt="小黄花" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F4268106243.jpeg%21water&amp;size=m" alt="宝莲灯" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3589364423.jpeg%21water&amp;size=m" alt="玛格丽特" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1469621509.jpeg%21water&amp;size=m" alt="一窝兔兔" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F321548986.jpeg%21water&amp;size=m" alt="红眼睛的兔兔" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1249813977.jpeg%21water&amp;size=m" alt="含笑花" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F4065109307.jpeg%21water&amp;size=m" alt="小憩的狗狗" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F318904286.jpeg%21water&amp;size=m" alt="两只鹦鹉" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F690894885.jpeg%21water&amp;size=m" alt="小红鱼" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F63137616.jpeg%21water&amp;size=m" alt="撅嘴的小红鱼" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F923989898.jpeg%21water&amp;size=m" alt="水中的悟空" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3894165472.jpeg%21water&amp;size=m" alt="七彩的小鱼" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2544331606.jpeg%21water&amp;size=m" alt="水下鱼苗" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2506240824.jpeg%21water&amp;size=m" alt="斜游的小鱼仔" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2897719866.jpeg%21water&amp;size=m" alt="发光的鱼" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1073490951.jpeg%21water&amp;size=m" alt="吃自己的胡子" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F4215280017.jpeg%21water&amp;size=m" alt="白色鱼儿" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2991497486.jpeg%21water&amp;size=m" alt="小山流水" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3007233267.jpeg%21water&amp;size=m" alt="挤一挤吧" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3080484167.jpeg%21water&amp;size=m" alt="淡黄花" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2084536862.jpeg%21water&amp;size=m" alt="鱼与泡" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F172876335.jpeg%21water&amp;size=m" alt="青绿薄荷" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3380318602.jpeg%21water&amp;size=m" alt="红中缀白" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2033504805.jpeg%21water&amp;size=m" alt="仙人掌与盆栽" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1128370728.jpeg%21water&amp;size=m" alt="多肉与多人" width="50%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1354896245.jpeg%21water&amp;size=m" alt="花束成簇" width="50%">
</figure>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/leisure-of-guo-yi-plaza</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F3970236483.jpeg%21water&amp;size=m" type="image/jpeg" length="0"/><category>图忆</category><pubDate>Mon, 27 Feb 2023 07:03:00 GMT</pubDate></item><item><title><![CDATA[在思源笔记中使用群晖Synology C2对象存储服务]]></title><link>https://wuqishi.com/archives/use-synology-c2-object-storage-service-in-siyuan-notes</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%9C%A8%E6%80%9D%E6%BA%90%E7%AC%94%E8%AE%B0%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%BE%A4%E6%99%96Synology%20C2%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8%E6%9C%8D%E5%8A%A1&amp;url=/archives/use-synology-c2-object-storage-service-in-siyuan-notes" width="1" height="1" alt="" style="opacity:0;">
<p>思源笔记除了官方的付费同步服务外，还开放了 S3 和 WebDAV 同步方式。刚好看到群晖推出的 Synology C2 Storage 兼容 S3 规则，免费账户提供 15G 存储和 15G 下载流量，无需绑定支付信息。搞起来~</p>
<h2 id="Synology-C2-注册及配置过程">Synology C2 注册及配置过程</h2>
<ol>
 <li>注册地址：<hyperlink-inline-card href="https://login.c2.synology.com/sso/login?user_type=home" target="_blank"></hyperlink-inline-card>，区域需要选择非大陆，大陆地区不可使用 C2 对象存储服务，谷歌账户登录不存在此问题，所以优先使用谷歌登陆方式。</li>
</ol>
<p>​<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2190564270.png%21water&amp;size=m" alt="With Google">​</p>
<p>​<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F4272745037.png%21water&amp;size=m" alt="创建免费 C2 Object Storage">​</p>
<ol start="2">
 <li>进入后台，选择 APAC - Taiwan​​ 创建 Buckets​​ → siyuan​​ （重名的话就换个名字），记下 Endpoint​​ 参数。</li>
</ol>
<p>​<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F4061380386.png%21water&amp;size=m" alt="区域选定">​</p>
<p>​<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F4198620417.png%21water&amp;size=m" alt="复制 Endpoint 参数">​</p>
<ol start="3">
 <li>创建 Access Keys​​ ，设置 Read and Write​​ 权限， Accessible Bucket​​ 选择刚创建的存储桶 siyuan​​ ，设个备注用以区分。复制保存 Access Key ID​​ 和 Secret Key​​ （仅出现一次，记好）。</li>
</ol>
<p>​<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F91059339.png%21water&amp;size=m" alt="Create Access Key"></p>
<h2 id="思源笔记中配置-S3-">思源笔记中配置 S3​</h2>
<p>在思源笔记中， 云端​​ → S3​​ ，填入上述参数，详细见图。台湾区域存储桶填 <code>tw-001</code>，Addressing 选择 <code>Path-style</code> 。</p>
<p>​<img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1374111780.png%21water&amp;size=m" alt="S3 配置参考">
 <br>
 ​
 <br>
 填好设置参数后，点击思源笔记左上角的云朵，初始化同步，完成 S3 同步配置。</p>]]></description><guid isPermaLink="false">/archives/use-synology-c2-object-storage-service-in-siyuan-notes</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2190564270.png%21water&amp;size=m" type="image/jpeg" length="61170"/><category>分享</category><pubDate>Thu, 23 Feb 2023 08:58:00 GMT</pubDate></item><item><title><![CDATA[MrDoc升级v0.8.7失败]]></title><link>https://wuqishi.com/archives/mrdoc-upgrade-v087-failed</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=MrDoc%E5%8D%87%E7%BA%A7v0.8.7%E5%A4%B1%E8%B4%A5&amp;url=/archives/mrdoc-upgrade-v087-failed" width="1" height="1" alt="" style="opacity:0;">
<p>已更新，升级成功了：</p>
<hyperlink-card href="https://wuqishi.com/archives/finally-mrdoc-upgraded-v087-successfully" target="_blank" theme="regular"></hyperlink-card>
<p>在自家的NAS上搭建有一个MrDoc，主要用于网上资料收集和工作笔记。</p>
<p>今天发现后台显示有新版本可以更新。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2227350012.png%21water&amp;size=m" alt="MrDoc新版本提示"></p>
<h2 id="v0-8-7版本更新内容">v0.8.7版本更新内容</h2>
<details>
 <summary>v0.8.7 2023-02-15</summary>
 <ul>
  <li>[新增]文档浏览页日间/夜间模式切换功能；</li>
  <li>[新增]配置文件支持配置 CSRF 可信来源；</li>
  <li>[修复]editor.md编辑器英文引号渲染自动为中文引号的问题；</li>
  <li>[修复]文集导出为 Markdown 压缩包时部分图片导出失败的问题；</li>
  <li>[修复]文档长代码展开功能失效的问题；</li>
  <li>[优化]文档搜索词高亮渲染逻辑；</li>
  <li>[优化]导出文集时支持导入文档内 <code>&lt;img&gt;</code>标签的本地图片；</li>
  <li>[优化]非公开文集下的文档均可由创建者进行文档分享；</li>
  <li>[优化]editor.md编辑器文档中代码块未指定编程语言的样式渲染；</li>
  <li>[优化]文集zip文件导入相关功能函数；</li>
 </ul>
</details>
<h2 id="官方-Docker-镜像部署的升级">官方 Docker 镜像部署的升级</h2>
<p>在更新指南中发现官方更新版本方法：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2609218562.png%21water&amp;size=m" alt="Docker版官方更新方法"></p>
<h3 id="步骤一">步骤一</h3>
<p>宿主机/容器外的MrDoc项目目录内（manage.py文件所在的目录）拉取最新代码
 <br>
 进入容器中：</p>
<pre><code class="language-sh">docker exec -it mrdoc sh
</code></pre>
<p>拉取最新代码：</p>
<pre><code class="language-sh">git fetch --all &amp;&amp; git reset --hard origin/master &amp;&amp; git pull
</code></pre>
<h3 id="步骤二">步骤二</h3>
<p>完成步骤一后，退出容器：</p>
<pre><code class="language-sh">exit
</code></pre>
<p>重启Docker容器</p>
<pre><code class="language-sh">docker restart mrdoc
</code></pre>
<h2 id="发现问题">发现问题</h2>
<ul>
 <li>首先通过ssh工具连接NAS后，直接通过以上代码无法完成在容器外拉取。</li>
 <li>我尝试进入容器内部通过以上代码同样无法完成拉取。</li>
 <li>通过网上查找，发现在群晖docker容器中的终端机输入代码 <code>git pull</code>还是无法进行拉取。</li>
</ul>
<p>于是我想到了在搭建MrDoc时是先将源码拉取到docker目录后再新建容器。</p>
<p>我备份了<code>config</code>和<code>media</code>文件夹，将v0.8.7源码拉取下来，覆盖到旧版本文件，重新启动容器后发现无法正常访问......</p>
<p>最后不得已，重新拉取了旧版本v0.8.6源码，发现可以正常访问。</p>
<p>过段时间再看看吧，本次MrDoc升级失败。</p>]]></description><guid isPermaLink="false">/archives/mrdoc-upgrade-v087-failed</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2227350012.png%21water&amp;size=m" type="image/jpeg" length="17726"/><category>滚蛋</category><pubDate>Wed, 22 Feb 2023 09:47:00 GMT</pubDate></item><item><title><![CDATA[居居的手工作品]]></title><link>https://wuqishi.com/archives/juju-handicrafts</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%B1%85%E5%B1%85%E7%9A%84%E6%89%8B%E5%B7%A5%E4%BD%9C%E5%93%81&amp;url=/archives/juju-handicrafts" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F328542670.jpg%21wwater&amp;size=m" alt="花小丑">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2536839176.jpg%21water&amp;size=m" alt="灯笼">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F4236825828.jpg%21water&amp;size=m" alt="知足常乐">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1684618620.jpg%21water&amp;size=m" alt="绵羊">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2122388095.jpg%21water&amp;size=m" alt="章鱼">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1996936990.webp%21water&amp;size=m" alt="煎蛋">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F2265127518.webp%21wwater&amp;size=m" alt="海马花">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F273822780.jpeg%21wwater&amp;size=m" alt="作品墙">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-5A22D17A-7A01-4AAF-888F-9F7B5866AA31_1_102_a.webp%21wwater&amp;size=m" alt="吹的画，本来是作章鱼，结果花到看不出来，哈哈">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-shouyin.webp%21water&amp;size=m" alt="手印">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F04%2Fp-202304202205047.webp%21wwater&amp;size=m" alt="啄木鸟">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-F198F389-846E-418E-90D6-E796B865B2B5_1_102_a.webp%21water&amp;size=m" alt="杯子、拖把、毛巾">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-P30505-174618-1-.webp%21water&amp;size=m" alt="玫瑰花">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F05%2Fp-happy-mother-day.webp%21wwater&amp;size=m" alt="母亲节快乐"></p>]]></description><guid isPermaLink="false">/archives/juju-handicrafts</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F328542670.jpg%21wwater&amp;size=m" type="image/jpeg" length="296054"/><category>图忆</category><pubDate>Tue, 21 Feb 2023 12:08:00 GMT</pubDate></item><item><title><![CDATA[Linux系统时间同步命令小结]]></title><link>https://wuqishi.com/archives/summary-of-linux-system-time-synchronization-commands</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Linux%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5%E5%91%BD%E4%BB%A4%E5%B0%8F%E7%BB%93&amp;url=/archives/summary-of-linux-system-time-synchronization-commands" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F16767029308221.jpg%21water&amp;size=m" alt="Linux系统时间同步命令"></p>
<p>　　在 Windwos 中，系统时间的设置很简单，界面操作，通俗易懂，而且设置后，重启，关机都没关系。系统时间会自动保存在 BIOS 时钟里面，启动计算机的时候，系统会自动在 BIOS 里面取硬件时间，以保证时间的不间断。但在 Linux 下，默认情况下，系统时间和硬件时间并不会自动同步。在 Linux 运行过程中，系统时间和硬件时间以异步的方式运行，互不干扰。硬件时间的运行，是靠 BIOS 电池来维持，而系统时间，是用 CPU Tick 来维持的。在系统开机的时候，会自动从 BIOS 中取得硬件时间，设置为系统时间。</p>
<h2 id="1-linux-">1. Linux 系统时间的设置</h2>
<p>　　在 Linux 中设置系统时间，可以用 date 命令：</p>
<pre><code class="language-sh">//查看时间
 [root@node1 ~]# date
Tue Feb 25 20:15:18 CST 2014

//修改时间
[root@node1 ~]# date -s "20140225 20:16:00"  #yyyymmdd hh:mm:ss
Tue Feb 25 20:16:00 CST 2014
</code></pre>
<p>date 有多种时间格式可接受，查看命令：<code>date --help</code></p>
<h2 id="2-linux-">2. Linux 硬件时间的设置</h2>
<p>　　硬件时间的设置，可以用 hwclock 或者 clock 命令。两者基本相同，只用一个就行，只不过 clock 命令除了支持 x86 硬件体系外，还支持 Alpha 硬件体系。</p>
<pre><code class="language-sh">//查看硬件时间可以是用hwclock ，hwclock --show 或者 hwclock -r
[root@node1 ~]# hwclock --show
Tue 25 Feb 2014 08:21:14 PM CST -0.327068 seconds

//设置硬件时间
[root@node1 ~]# hwclock --set --date "20140225 20:23:00"
[root@node1 ~]# hwclock
Tue 25 Feb 2014 08:23:04 PM CST -0.750440 seconds
</code></pre>
<h2 id="3-">3. 系统时间和硬件时间的同步</h2>
<p>　　同步系统时间和硬件时间，可以使用 hwclock 命令。</p>
<pre><code class="language-sh">//以系统时间为基准，修改硬件时间
[root@node1 ~]# hwclock --systohc &lt;== sys（系统时间）to（写到）hc（Hard Clock）
//或者
 [root@node1 ~]# hwclock -w

//以硬件时间为基准，修改系统时间
[root@node1 ~]# hwclock --hctosys
//或者
[root@node1 ~]# hwclock -s
</code></pre>]]></description><guid isPermaLink="false">/archives/summary-of-linux-system-time-synchronization-commands</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F16767029308221.jpg%21water&amp;size=m" type="image/jpeg" length="12198"/><category>分享</category><pubDate>Fri, 17 Feb 2023 22:37:00 GMT</pubDate></item><item><title><![CDATA[AList安装指南]]></title><link>https://wuqishi.com/archives/alist-installation-guide</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=AList%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97&amp;url=/archives/alist-installation-guide" width="1" height="1" alt="" style="opacity:0;">
<p>AList
 <br>
 ?️ 一个支持多种存储的文件列表程序，使用 Gin 和 Solidjs。</p>
<h2 id="一键脚本安装">一键脚本安装</h2>
<blockquote>
 <p>仅适用于 Linux amd64/arm64 平台。</p>
</blockquote>
<p>默认安装在 <code>/opt/alist</code> 中。自定义安装路径，将安装路径作为第二个参数添加，必须是绝对路径（如果路径以 alist 结尾，则直接安装到给定路径，否则会安装在给定路径 alist 目录下）</p>
<h3 id="安装命令">安装命令</h3>
<h4 id="默认路径">默认路径</h4>
<pre><code class="language-sh">curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install
</code></pre>
<h4 id="自定义路径">自定义路径</h4>
<pre><code class="language-sh">curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install /home
</code></pre>
<h3 id="更新命令">更新命令</h3>
<h4 id="默认路径-">默认路径</h4>
<pre><code class="language-sh">curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s update
</code></pre>
<h4 id="自定义路径-">自定义路径</h4>
<pre><code class="language-sh">curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s update /home
</code></pre>
<h3 id="卸载命令">卸载命令</h3>
<h4 id="默认路径--">默认路径</h4>
<pre><code class="language-sh">curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s uninstall
</code></pre>
<h4 id="自定义路径--">自定义路径</h4>
<pre><code class="language-sh">curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s uninstall /home
</code></pre>
<h2 id="Docker-安装">Docker 安装</h2>
<pre><code class="language-sh">docker run -d \
--restart=always \
-v /volume4/docker/alist:/opt/alist/data \
-p 666:666 \
--name="alist" \
xhofe/alist:latest
</code></pre>
<h2 id="其他命令">其他命令</h2>
<h3 id="启动">启动</h3>
<pre><code class="language-sh">systemctl start alist
</code></pre>
<h3 id="关闭">关闭</h3>
<pre><code class="language-sh">systemctl stop alist
</code></pre>
<h3 id="状态">状态</h3>
<pre><code class="language-sh">systemctl status alist
</code></pre>
<h3 id="重启">重启</h3>
<pre><code class="language-sh">systemctl restart alist
</code></pre>]]></description><guid isPermaLink="false">/archives/alist-installation-guide</guid><dc:creator>吴蛋蛋</dc:creator><category>技巧</category><pubDate>Fri, 17 Feb 2023 07:01:00 GMT</pubDate></item><item><title><![CDATA[宝塔面板降级 v7.7.0 及解除强制绑定手机、免费安装专业版插件的方法]]></title><link>https://wuqishi.com/archives/bt-panel-downgrade-unbind-crack</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF%E9%99%8D%E7%BA%A7%20v7.7.0%20%E5%8F%8A%E8%A7%A3%E9%99%A4%E5%BC%BA%E5%88%B6%E7%BB%91%E5%AE%9A%E6%89%8B%E6%9C%BA%E3%80%81%E5%85%8D%E8%B4%B9%E5%AE%89%E8%A3%85%E4%B8%93%E4%B8%9A%E7%89%88%E6%8F%92%E4%BB%B6%E7%9A%84%E6%96%B9%E6%B3%95&amp;url=/archives/bt-panel-downgrade-unbind-crack" width="1" height="1" alt="" style="opacity:0;">
<p>宝塔面板更新后原来的“跳过强制手机号登陆绑定账户”方法已经失效因为新版本宝塔面板已经开始验证 <code>userInfo.json</code>，而且目前没有任何的方法可以跳过强制手机号登陆绑定账户的解决方法，宝塔面板强制登陆问题，因为登陆信息与软件列表绑定。目前无法直接破解、删除、绕过登陆。只能通过降级到宝塔面板 7.7.0 来解决这个问题。</p>
<h2 id="宝塔降级教程">宝塔降级教程</h2>
<blockquote>
 <p>使用 SSH 连接工具执行下面的命令</p>
</blockquote>
<ol>
 <li>下载离线包</li>
</ol>
<blockquote>
 <p>
  <del>wget http://download.bt.cn/install/update/LinuxPanel-7.7.0.zip</del>
 </p>
</blockquote>
<p>以上链接被强制植入代码，已失效，换第三方：</p>
<pre><code class="language-bash">wget https://down.pc6a.com/03.%E5%8D%9A%E5%AE%A2/2022/LinuxPanel-7.7.0.zip
</code></pre>
<ol start="2">
 <li>解压缩</li>
</ol>
<pre><code class="language-bash">unzip LinuxPanel-7.7.0.zip
</code></pre>
<ol start="3">
 <li>进入升级目录</li>
</ol>
<pre><code class="language-bash">cd /root/panel
</code></pre>
<ol start="4">
 <li>运行降级</li>
</ol>
<pre><code class="language-bash">bash update.sh
</code></pre>
<p>降级完成后建议开启离线模式：面板设置 &gt; 离线模式。离线模式只能保证宝塔主程序不主动联网更新</p>
<h2 id="屏蔽宝塔强制绑定手机方法">屏蔽宝塔强制绑定手机方法</h2>
<blockquote>
 <p>使用 SSH 连接工具执行下面的命令</p>
</blockquote>
<ol>
 <li>屏蔽强制绑定手机</li>
</ol>
<pre><code class="language-bash">sed -i "s|bind_user == 'True'|bind_user == 'XXXX'|" /www/server/panel/BTPanel/static/js/index.js
</code></pre>
<p>如果需要恢复：</p>
<pre><code class="language-bash">sed -i "s|if (bind_user == 'REMOVED') {|if (bind_user == 'True') {|g" /www/server/panel/BTPanel/static/js/index.js
</code></pre>
<ol start="2">
 <li>直接删除宝塔强制绑定手机 js 文件</li>
</ol>
<pre><code class="language-bash">rm -f /www/server/panel/data/bind.pl
</code></pre>
<p>运行以上代码可以解除宝塔面板的强制绑定手机，运行完毕以后，请清除浏览器缓存并刷新宝塔面板！</p>
<h2 id="安装宝塔国际版无强制绑定">安装宝塔国际版无强制绑定</h2>
<p>国际版是不会有强制绑定的要求的，而且和宝塔使用起来界面是一模一样。</p>
<p>国际版地址：https://www.aapanel.com/ 国内 IP 地址自动跳转到国内宝塔面板官网，建议开国外 IP 代理访问。</p>
<h2 id="免费使用专业版插件">免费使用专业版插件</h2>
<p>打开目录<code>/www/server/panel/class</code>找到并编辑<code>panelplugin.py</code>文件。</p>
<p>找到<code>softList['list'] = tmpList</code>，在其下方添加：</p>
<pre><code class="language-bash">softList['pro'] = 1
for soft in softList['list']:
soft['endtime'] = 0
</code></pre>
<p>修改完成后重启面板，重启完成后就可以直接安装收费的插件了，Nginx防火墙和网站统计也可以直接安装使用，其他插件自行测试。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F730120293.png%21water&amp;size=m" alt="已显示可安装专业版插件"></p>]]></description><guid isPermaLink="false">/archives/bt-panel-downgrade-unbind-crack</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F730120293.png%21water&amp;size=m" type="image/jpeg" length="73596"/><category>分享</category><pubDate>Fri, 10 Feb 2023 07:40:00 GMT</pubDate></item><item><title><![CDATA[修复群晖Synology Drive client右键菜单缺失问题]]></title><link>https://wuqishi.com/archives/xiufu-synology-drivec-lient-you-jian-cai-dan</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%BF%AE%E5%A4%8D%E7%BE%A4%E6%99%96Synology%20Drive%20client%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E7%BC%BA%E5%A4%B1%E9%97%AE%E9%A2%98&amp;url=/archives/xiufu-synology-drivec-lient-you-jian-cai-dan" width="1" height="1" alt="" style="opacity:0;">
<p>主要解决 windows10 右键菜单中没有 Synology Drive 菜单的问题，整体思路是找到群晖 Drive Client 的 ContextMenu.dll 文件并添加进注册表。</p>
<h2 id="解决后的样子">解决后的样子</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2581709166.png%21water&amp;size=m" alt="解决后的样子"></p>
<h2 id="着手解决">着手解决</h2>
<h3 id="确认是否符合要求">确认是否符合要求</h3>
<p><code>Win + R​ </code>打开运行，输入 <code>regedit</code>​，在打开的注册表编辑其中，定位到如下位置：</p>
<pre><code class="language-shell">计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\
</code></pre>
<p>在其下找到 <code>01UnsuppModule</code>并查看其之前有几个项目。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1744452635.png%21water&amp;size=m" alt="确认是否符合要求"></p>
<p>我的是3个项目，少于5个，符合要求（至于为什么是少于5个的原因，待考究）。</p>
<h3 id="确定系统参数">确定系统参数</h3>
<h4 id="确定文件夹名称">确定文件夹名称</h4>
<p>在 Windows 资源管理器的地址栏中输入如下内容：</p>
<pre><code class="language-shell">%localappdata%\SynologyDrive\SynologyDrive.app\icon-overlay
</code></pre>
<p>在打开的窗口中，查看里面文件夹的名字，应该是一个数字，我这里是 22，见下图：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2780736495.png%21water&amp;size=m" alt="确认文件夹名称"></p>
<h4 id="确定系统用户名">确定系统用户名</h4>
<p>当前系统登录用户名，我的是<code>Eric</code></p>
<h4 id="确认操作系统位数">确认操作系统位数</h4>
<blockquote>
 <p>“x86”（32 位系统对应的值）
  <br>
  “x64”（64 位系统对应的值）</p>
</blockquote>
<h4 id="参数汇集">参数汇集</h4>
<table>
 <thead>
  <tr>
   <th>序号</th>
   <th>参数名</th>
   <th>参数值</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>1</td>
   <td>dirName</td>
   <td>22</td>
  </tr>
  <tr>
   <td>2</td>
   <td>userName</td>
   <td>Eric</td>
  </tr>
  <tr>
   <td>3</td>
   <td>system-bit</td>
   <td>x64</td>
  </tr>
 </tbody>
</table>
<h3 id="配置-reg-文件并替换参数">配置 reg 文件并替换参数</h3>
<details>
 <summary>synologydrivefix.reg代码如下：</summary>
 <pre><code class="language-bash">Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shellex\ContextMenuHandlers\CloudStation.SyncFolderContextMenu]
@="{2C4A5D61-009C-4561-9A33-6AFD542FD237}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2C4A5D61-009C-4561-9A33-6AFD542FD237}]
@="SynoFolderContextMenu Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2C4A5D61-009C-4561-9A33-6AFD542FD237}\InprocServer32]
@="C:\\Users\\Eric\\AppData\\Local\\SynologyDrive\\SynologyDrive.app\\icon-overlay\\22\\x64\\ContextMenu.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{2C4A5D61-009C-4561-9A33-6AFD542FD237}\InprocServer32]
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{AEB16659-2125-4ADA-A4AB-45EE21E86469}]
@="UnsuppModule Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{AEB16659-2125-4ADA-A4AB-45EE21E86469}\InprocServer32]
@="C:\\Users\\Eric\\AppData\\Local\\SynologyDrive\\SynologyDrive.app\\icon-overlay\\22\\x64\\iconOverlay.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{AEB16659-2125-4ADA-A4AB-45EE21E86469}\InprocServer32]
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{48AB5ADA-36B1-4137-99C9-2BD97F8788AB}]
@="SyncingModule Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{48AB5ADA-36B1-4137-99C9-2BD97F8788AB}\InprocServer32]
@="C:\\Users\\Eric\\AppData\\Local\\SynologyDrive\\SynologyDrive.app\\icon-overlay\\22\\x64\\iconOverlay.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{48AB5ADA-36B1-4137-99C9-2BD97F8788AB}\InprocServer32]
"ThreadingModel"="Apartment"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{472CE1AD-5D53-4BCF-A1FB-3982A5F55138}]
@="SyncedModule Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{472CE1AD-5D53-4BCF-A1FB-3982A5F55138}\InprocServer32]
@="C:\\Users\\Eric\\AppData\\Local\\SynologyDrive\\SynologyDrive.app\\icon-overlay\\22\\x64\\iconOverlay.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{472CE1AD-5D53-4BCF-A1FB-3982A5F55138}\InprocServer32]
"ThreadingModel"="Apartment"


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{A433C3E0-8B24-40EB-93C3-4B10D9959F58}]
@="ReadOnlyModule Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{A433C3E0-8B24-40EB-93C3-4B10D9959F58}\InprocServer32]
@="C:\\Users\\Eric\\AppData\\Local\\SynologyDrive\\SynologyDrive.app\\icon-overlay\\22\\x64\\iconOverlay.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{A433C3E0-8B24-40EB-93C3-4B10D9959F58}\InprocServer32]
"ThreadingModel"="Apartment"


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C701AD67-3DF0-47C9-89CB-DFA6207BE229}]
@="NoPermModule Class"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C701AD67-3DF0-47C9-89CB-DFA6207BE229}\InprocServer32]
@="C:\\Users\\Eric\\AppData\\Local\\SynologyDrive\\SynologyDrive.app\\icon-overlay\\22\\x64\\iconOverlay.dll"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{C701AD67-3DF0-47C9-89CB-DFA6207BE229}\InprocServer32]
"ThreadingModel"="Apartment"
</code></pre>
</details>
<p>将以上代码保存为 <code>synologydrivefix.reg​</code>，修改其中的参数，按照本机汇集的参数修改其中的对应值，共有 6 处需要修改。</p>
<h3 id="导入注册表并检查">导入注册表并检查</h3>
<p>双击修改好的 reg 文件，在弹出的确认对话框中选择是将注册表信息导入。</p>
<p>然后按照下面的思路检查是否导入成功。</p>
<p>确认是否有该项：</p>
<pre><code class="language-shell">HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{48AB5ADA-36B1-4137-99C9-2BD97F8788AB}
</code></pre>
<p>成功导入的效果如下图：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F95576043.png%21water&amp;size=m" alt="确认SyncingModule Class"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2677202360.png%21wwater&amp;size=m" alt="确认路径"></p>
<p>如果不存在，需要手动创建上图中两个项。其中 InprocServer32​ 项的默认值应该为确认下来的 <code>ContextMenu.dll​ </code>的绝对实际路径。</p>
<p>如果以上操作无误，打开同步文件夹，在某个文件或文件夹上右击，就能看到久违的 Synology Drive​ 选项了。</p>]]></description><guid isPermaLink="false">/archives/xiufu-synology-drivec-lient-you-jian-cai-dan</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2581709166.png%21water&amp;size=m" type="image/jpeg" length="39270"/><category>技巧</category><pubDate>Fri, 10 Feb 2023 04:24:00 GMT</pubDate></item><item><title><![CDATA[Windows11 展开折叠的右键菜单为传统模式]]></title><link>https://wuqishi.com/archives/windows11-youjiancaidan</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Windows11%20%E5%B1%95%E5%BC%80%E6%8A%98%E5%8F%A0%E7%9A%84%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E4%B8%BA%E4%BC%A0%E7%BB%9F%E6%A8%A1%E5%BC%8F&amp;url=/archives/windows11-youjiancaidan" width="1" height="1" alt="" style="opacity:0;">
<p>Windows 11 的新版右键菜单太影响效率了，实在不理解为什么要把那些常用项折叠起来，还是原版用的舒服</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2706692780.png%21water&amp;size=m" alt="Windows 11展开右键菜单"></p>
<p>使用管理员权限执行命令操作注册表，注销再登陆即可：</p>
<p>修改：</p>
<pre><code>reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
</code></pre>
<p>恢复：</p>
<pre><code>reg delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f
</code></pre>]]></description><guid isPermaLink="false">/archives/windows11-youjiancaidan</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2706692780.png%21water&amp;size=m" type="image/jpeg" length="11540"/><category>技巧</category><pubDate>Fri, 3 Feb 2023 08:44:00 GMT</pubDate></item><item><title><![CDATA[在 Windows 下批量将 Markdown 文档转为 Word 文档]]></title><link>https://wuqishi.com/archives/windows-markdown-to-word</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%9C%A8%20Windows%20%E4%B8%8B%E6%89%B9%E9%87%8F%E5%B0%86%20Markdown%20%E6%96%87%E6%A1%A3%E8%BD%AC%E4%B8%BA%20Word%20%E6%96%87%E6%A1%A3&amp;url=/archives/windows-markdown-to-word" width="1" height="1" alt="" style="opacity:0;">
<p>转换本身需要通过开源的 Pandoc 来进行。因此，你首先需要<a href="https://pandoc.org/installing.html">安装 Pandoc</a>。</p>
<p>而后，可以下面的做法，批量转换。</p>
<pre><code class="language-shell">@echo off

for /f "tokens=* delims=" %%i in ('dir /b *.md') do (
  @echo %%i
  pandoc -f markdown -t docx -o "%%~ni.docx" "%%i"
  @echo Finished
)

pause &gt; nul
</code></pre>
<p>具体操作路径：</p>
<ul>
 <li><a href="https://pandoc.org/installing.html">安装 Pandoc</a>（按需）。</li>
 <li>将上方代码保存为<code>bat文件</code>保存在某个目录（例如桌面）。</li>
 <li>将需要转换的 Markdown 文件也保存在该目录。</li>
 <li>双击执行脚本。</li>
 <li>收获一堆 Word 文档。</li>
</ul>
<p>如遇中文乱码，可以加上代码：<code>-V mainfont="Microsoft YaHei"</code></p>
<p>完整代码如下：</p>
<pre><code class="language-shell">@echo off

for /f "tokens=* delims=" %%i in ('dir /b *.md') do (
  @echo %%i
  pandoc -V mainfont="Microsoft YaHei" -f markdown -t docx -o "%%~ni.docx" "%%i"
  @echo Finished
)

pause &gt; nul
</code></pre>]]></description><guid isPermaLink="false">/archives/windows-markdown-to-word</guid><dc:creator>吴蛋蛋</dc:creator><category>技巧</category><pubDate>Fri, 3 Feb 2023 04:21:00 GMT</pubDate></item><item><title><![CDATA[Typecho的一些修改记录]]></title><link>https://wuqishi.com/archives/typecho-modification</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Typecho%E7%9A%84%E4%B8%80%E4%BA%9B%E4%BF%AE%E6%94%B9%E8%AE%B0%E5%BD%95&amp;url=/archives/typecho-modification" width="1" height="1" alt="" style="opacity:0;">
<p style=""><span style="color: #16a34a">用于记录一些Typecho及handsome主题的修改，随时更新！</span></p>
<hr>
<h2 style="" id="%E5%9F%BA%E4%BA%8Etypecho">基于Typecho</h2>
<h3 style="" id="%E4%B8%BAtypecho%E6%B7%BB%E5%8A%A0webp%E8%A7%A3%E6%9E%90">为Typecho添加webp解析</h3>
<details class="details">
 <summary>使用指南</summary>
 <div data-type="detailsContent">
  <p style="">目前升级Typecho 1.2.1 解决无法解析webp格式问题，同时添加avif格式解析支持。</p>
  <p style="">Typecho 原生不支持解析 Webp 图片，Typecho 1.2.0 依然默认不支持.webp格式图片。在附件插入 webp 文件会被当做文件解析。</p>
  <h4 style="" id="typecho-1.2.0%E7%89%88%E6%9C%AC%E4%BF%AE%E6%94%B9">Typecho 1.2.0版本修改</h4>
  <ol>
   <li>
    <p style="">找到 Typecho 网站所在文件夹内的以下文件：</p>
   </li>
  </ol>
  <pre><code class="language-php">var/Widget/Themes/Rows.php</code></pre>
  <p style="">定位到大约第48行的位置，将以下代码：</p>
  <pre><code class="language-php">return preg_match("/screenshot.(jpg|png|gif|bmp|jpeg)/i",path);</code></pre>
  <p style="">修改为：</p>
  <pre><code class="language-php">return preg_match("/screenshot.(jpg|png|gif|bmp|jpeg|webp)/i",path);</code></pre>
  <ol start="2">
   <li>
    <p style="">保存修改后，找到 Typecho 网站所在文件夹下的以下文件：</p>
   </li>
  </ol>
  <pre><code class="language-php">var/Widget/Base/Contents.php</code></pre>
  <p style="">定位到大概第557行，将以下代码：</p>
  <pre><code class="language-php">$value['attachment']-&gt;isImage = in_array($content['type'], ['jpg', 'jpeg', 'gif', 'png', 'tiff', 'bmp']);</code></pre>
  <p style="">修改为：</p>
  <pre><code class="language-php">$value['attachment']-&gt;isImage = in_array($content['type'], ['jpg', 'jpeg', 'gif', 'png', 'tiff', 'bmp', 'webp']);</code></pre>
  <ol start="3">
   <li>
    <p style="">保存修改后，再找到 Typecho 网站所在文件夹下的以下文件：</p>
   </li>
  </ol>
  <pre><code class="language-php">var/Typecho/Common.php</code></pre>
  <p style="">找到图片格式所在的行，大约是在1259行后的位置添加下面这一行代码：</p>
  <pre><code class="language-php">'webp' =&gt; 'image/webp',</code></pre>
  <ol start="4">
   <li>
    <p style="">保存修改后，最后进入 Typecho 网站后台，前往 设置 &gt; 基本，在允许上传的文件类型部分，勾选其他格式，并添加webp，然后点击保存设置。</p>
    <figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
     <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3629334878.png%21water&amp;size=m" alt="允许上传的文件类型添加webp" width="2094px">
    </figure>
   </li>
  </ol>
 </div>
</details>
<h3 style="" id="typecho%E5%BC%80%E5%90%AFgzip%E5%8E%8B%E7%BC%A9">Typecho开启Gzip压缩</h3>
<details class="details">
 <summary>食用指南</summary>
 <div data-type="detailsContent">
  <p style="">在根目录下的<code>config.inc.php</code>中添加以下代码：</p>
  <pre><code class="language-php">/** 开启gzip压缩 */
ob_start('ob_gzhandler');</code></pre>
 </div>
</details>
<h3 style="" id="%E5%8D%95%E7%AF%87%E6%96%87%E7%AB%A0%E5%8A%A0%E5%AF%86%E7%9A%84%E6%96%87%E7%AB%A0%EF%BC%8C%E5%A6%82%E4%BD%95%E5%9C%A8%E9%A6%96%E9%A1%B5%E5%88%97%E8%A1%A8%E4%B8%AD%E6%98%BE%E7%A4%BA%E6%A0%87%E9%A2%98">单篇文章加密的文章，如何在首页列表中显示标题</h3>
<details class="details">
 <summary>食用指南</summary>
 <div data-type="detailsContent">
  <p style="">需要修改typecho的源代码，在typecho目录下的var/Widget/Base/Contents.php 文件中，搜索<code>此内容被密码保护</code> 找到对应行，在该行的开头添加两个斜杆，注释掉该行代码即可。</p>
  <figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
   <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F2021868376.jpg%21wwater&amp;size=m" alt="注销该行代码" width="2094px">
  </figure>
 </div>
</details>
<h3 style="" id="%E8%AF%84%E8%AE%BA%E6%97%A0%E6%B3%95%E8%B4%B4%E5%9B%BE%E7%AD%89">评论无法贴图等</h3>
<details class="details">
 <summary>食用指南</summary>
 <div data-type="detailsContent">
  <p style="">后台 <code>设置——评论——允许使用的HTML标签和属性</code> 里面添加html标签，自行去掉<code>img</code>前的<code>/</code>。</p>
  <pre><code class="language-html">&lt;/img src=""&gt;
&lt;audio class="" src="" preload&gt;
&lt;video src=""&gt;&lt;/video&gt;</code></pre>
 </div>
</details>
<h3 style="" id="%E8%BF%81%E7%A7%BB%E5%90%8E%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E5%9C%B0%E5%9D%80%E6%9B%BF%E6%8D%A2">迁移后的数据库地址替换</h3>
<pre><code class="language-sql">UPDATE tc_contents SET text = REPLACE(text,'https://wuqishi.com/usr/uploads/','https://cdn.ssslove.com/files/');</code></pre>
<h2 style="" id="%E5%9F%BA%E4%BA%8Ehandsome%E4%B8%BB%E9%A2%98">基于Handsome主题</h2>
<h3 style="" id="%E9%A6%96%E9%A1%B5%E6%96%87%E7%AB%A0%E7%89%88%E5%BC%8F%E5%9C%86%E8%A7%92%E5%8C%96">首页文章版式圆角化</h3>
<p style="">本项修改的是首页文章版式，包括图片使其四个角由方形变成圆角形状。将以下代码添加至后台主题设置 自定义​CSS​​。​</p>
<h3 style="" id="%E9%BC%A0%E6%A0%87%E7%82%B9%E5%87%BB%E7%89%B9%E6%95%88">鼠标点击特效</h3>
<p style="">将以下代码添加至后台主题设置 自定义​JavaScript。</p>
<pre><code class="language-JavaScript">var a_idx = 0; 
jQuery(document).ready(function($) { 
    $("body").click(function(e) { 
        var a = new Array("林蛋蛋最美", "吴蛋蛋最帅", "富强", "民主", "文明", "和谐", "自由", "平等", "公正" ,"法治", "爱国", "敬业", "诚信", "友善"); 
        var $i = $("&lt;span/&gt;").text(a[a_idx]); 
        a_idx = (a_idx + 1) % a.length; 
        var x = e.pageX, 
        y = e.pageY; 
        $i.css({ 
            "z-index": 999999999999999999999999999999999999999999999999999999999999999999999, 
            "top": y - 20, 
            "left": x, 
            "position": "absolute", 
            "font-weight": "bold", 
            "color": "#ff6651" 
        }); 
        $("body").append($i); 
        $i.animate({ 
            "top": y - 180, 
            "opacity": 0 
        }, 
        1500, 
        function() { 
            $i.remove(); 
        }); 
    }); 
});</code></pre>
<h3 style="" id="%E5%A4%9A%E5%BD%A9%E6%A0%87%E7%AD%BE%E4%BA%91">多彩标签云</h3>
<pre><code class="language-JavaScript">/*多彩标签云*/
var tags = document.querySelectorAll("#tag_cloud-2 a");
var colorArr = ["#428BCA", "#AEDCAE", "#ECA9A7", "#DA99FF", "#FFB380", "#D9B999", "#3bca6e", "#f23232", "#834e75", "#23b7e5", "#f60"];
tags.forEach(tag =&gt; {
        tagsColor = colorArr[Math.floor(Math.random() * colorArr.length)];
        tag.style.backgroundColor = tagsColor;
});</code></pre>
<h3 style="" id="%E5%A4%9A%E5%BD%A9%E5%8D%9A%E5%AE%A2%E4%BF%A1%E6%81%AF">多彩博客信息</h3>
<pre><code class="language-javascript">/*多彩博客信息*/
let info = document.getElementById('blog_info').querySelectorAll('.pull-right')
let colorArray = ["#428BCA", "#AEDCAE", "#ECA9A7", "#DA99FF", "#FFB380", "#D9B999", "#3bca6e", "#f23232", "#834e75", "#23b7e5", "#f60"];
info.forEach(tag =&gt; {
    tagsColor = colorArr[Math.floor(Math.random() * colorArr.length)];
    tag.style.backgroundColor = tagsColor;
        });</code></pre>
<h3 style="" id="%E8%B5%9E%E8%B5%8F%E5%9B%BE%E6%A0%87%E8%B7%B3%E5%8A%A8">赞赏图标跳动</h3>
<pre><code class="language-css">/*赞赏图标跳动*/
.btn-pay {
    animation: star 0.5s ease-in-out infinite alternate;
}

@keyframes star {
    from {
        transform: scale(1);
    }

    to {
        transform: scale(1.1);
    }
}</code></pre>
<h3 style="" id="%E6%96%87%E7%AB%A0%E5%86%85%E5%9B%BE%E7%89%87%E6%82%AC%E5%81%9C%E6%94%BE%E5%A4%A7%E5%B9%B6%E5%B0%86%E8%B6%85%E5%87%BA%E8%8C%83%E5%9B%B4%E9%9A%90%E8%97%8F">文章内图片悬停放大并将超出范围隐藏</h3>
<pre><code class="language-css">/*文章内图片悬停放大并将超出范围隐藏*/
.entry-thumbnail {
    overflow: hidden;
}

.entry-thumbnail .item-thumb {
    transition: 0.5s;
}

#post-content img {
    border-radius: 10px;
    transition: 0.5s;
}

.entry-thumbnail .item-thumb:hover,
#post-content img:hover {
    transform: scale(1.05);
    cursor: pointer;
}</code></pre>
<h3 style="" id="%E9%BC%A0%E6%A0%87%E7%BB%8F%E8%BF%87%E5%A4%B4%E5%83%8F%E6%97%8B%E8%BD%AC%E5%92%8C%E6%94%BE%E5%A4%A7">鼠标经过头像旋转和放大</h3>
<pre><code class="language-css">/*鼠标经过头像旋转和放大*/
.img-circle{border-radius:50%;animation:light 4s ease-in-out infinite;transition:all .5s}.img-circle:hover{transform:scale(1.15) rotate(720deg)}@keyframes light{0%{box-shadow:0 0 4px #f00}25%{box-shadow:0 0 16px #0f0}50%{box-shadow:0 0 4px #00f}75%{box-shadow:0 0 16px #0f0}100%{box-shadow:0 0 4px #f00}}</code></pre>
<h3 style="" id="%E6%96%87%E7%AB%A0%E6%A0%87%E9%A2%98%E5%B1%85%E4%B8%AD">文章标题居中</h3>
<pre><code class="language-css">/*文章标题居中*/
header.bg-light.lter.wrapper-md{text-align:center}</code></pre>
<h3 style="" id="%E5%B7%A6%E4%BE%A7%E5%AF%BC%E8%88%AA%E5%A4%9A%E5%BD%A9%E5%9B%BE%E6%A0%87">左侧导航多彩图标</h3>
<pre><code class="language-JavaScript">/*左侧导航多彩图标*/
let leftHeader=document.querySelectorAll("span.nav-icon&gt;svg,span.nav-icon&gt;i");let leftHeaderColorArr=["#FF69B4","#58c7ea","#E066FF","#FF69B4","#FFA54F","#90EE90","#0043ff","#cc00ff","#8e7cc3","#A0522D","#FF7256","#FFA500","#8B0000","#7CFC00","#4EEE94","#00FFFF","#EE0000"];leftHeader.forEach(tag=&gt;{tagsColor=leftHeaderColorArr[Math.floor(Math.random()*leftHeaderColorArr.length)];tag.style.color=tagsColor});</code></pre>
<h3 style="" id="%E5%8F%B3%E4%BE%A7%E5%AF%BC%E8%88%AA%E5%9B%BE%E6%A0%87%E7%BE%8E%E5%8C%96">右侧导航图标美化</h3>
<pre><code class="language-css">/*右侧导航栏*/
.sidebar-icon svg.feather.feather-thumbs-up{color: #ff0000;}
.sidebar-icon svg.feather.feather-message-square{color:#495dc3;}
.sidebar-icon svg.feather.feather-gift{color:#52DE97;}</code></pre>
<h3 style="" id="%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E4%BD%93">自定义字体</h3>
<pre><code class="language-css">/*自定义字体*/
@font-face{font-family:HarmonyOS_Sans_SC_Medium;font-style:normal;font-display:swap;
src:url(https://cdn.ssslove.com/ziti/HarmonyOS.woff2) format('woff2')} *{font-family:HarmonyOS_Sans_SC_Medium} body {font-family: HarmonyOS!important;}</code></pre>
<h3 style="" id="%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9%E6%96%87%E7%AB%A0%E8%BF%87%E6%9C%9F%E6%8F%90%E9%86%92">批量修改文章过期提醒</h3>
<ul>
 <li>
  <p style="">修改表：<code>typecho_fields</code></p>
 </li>
 <li>
  <p style="">修改字段：<code>outdatedNotice</code></p>
 </li>
 <li>
  <p style="">默认为no表示不显示提示</p>
 </li>
 <li>
  <p style="">批量修改为yes 超过60天的文章在打开时文章顶部会出现提示！</p>
 </li>
</ul>
<p style="">复制下面代码直接在数据库中执行：</p>
<pre><code class="language-sql">UPDATE `typecho_fields`SET`str_value`= 'yes' WHERE`typecho_fields`.`cid`&gt;= 1 AND`typecho_fields`.`name` = 'outdatedNotice'</code></pre>
<h3 style="" id="handsome%E5%85%A8%E5%B1%80%E5%BD%A9%E8%89%B2%E8%AE%BE%E7%BD%AE">handsome全局彩色设置</h3>
<p style="">在后台 开发者设置 - 自定义输出body尾部的HTML代码 中输入以下代码：</p>
<pre collapsed="true"><code class="language-JavaScript">&lt;script&gt;
/*五颜六色字体*/
function sjcolor(){
    var colorArr = ["#428BCA", "#AEDCAE", "#ECA9A7", "#DA99FF", "#FFB380", "#D9B999", "#3bca6e", "#f23232", "#834e75", "#23b7e5", "#f60"];
    /*设置颜色*/
    document.querySelectorAll("#aside &gt; div &gt; div.navi-wrap.scroll-y.scroll-hide &gt; nav &gt; ul &gt; li &gt; a &gt; span").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#aside &gt; div &gt; div.navi-wrap.scroll-y.scroll-hide &gt; nav &gt; ul &gt; li &gt; ul &gt; li &gt; a &gt; span").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#aside &gt; div &gt; div.navi-wrap.scroll-y.scroll-hide &gt; nav &gt; ul &gt; li &gt; ul &gt; li &gt; a").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#aside &gt; div &gt; div.navi-wrap.scroll-y.scroll-hide &gt; nav &gt; ul &gt; li &gt; ul &gt; li &gt; a &gt; b").forEach(e =&gt; {
        e.style.backgroundColor = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*左侧导航字体颜色*/
    document.querySelectorAll("#post-panel &gt; div &gt; div &gt; div &gt; div.panel-body &gt; div.nav-tabs-alt &gt; ul &gt; li &gt; a").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#post-panel &gt; div &gt; div &gt; div &gt; div").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#post-panel &gt; div.blog-post &gt; div &gt; div.post-meta.wrapper-lg &gt; h2 &gt; a").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*首页面板*/
    document.querySelectorAll("#small_widgets &gt; h1").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#small_widgets &gt; ul").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#content &gt; main &gt; div &gt; div &gt; div &gt; h1").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*博客名称*/
    document.querySelectorAll(".m-l-xs").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*文章标题*/
    document.querySelectorAll("#search_input").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*搜索框*/
    document.querySelectorAll("#content &gt; main &gt; div &gt; div &gt; h1").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#content &gt; main &gt; div &gt; div &gt; div &gt; div a &gt;span").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*友情链接*/
    document.querySelectorAll("#header &gt; div &gt; ul &gt; li &gt; div &gt; div &gt; div &gt; div &gt; div &gt; div &gt; a &gt; span &gt; span").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*工具导航*/
    document.querySelectorAll("#tag_toc &gt; h5").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*文章目录*/
    document.querySelectorAll("#content &gt; main &gt; div &gt; div &gt; header &gt; h1").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#typedWord").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*签名标题*/
    document.querySelectorAll("#tag_cloud-2 h5").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#tag_cloud-2 a").forEach(e =&gt; {
        e.style.backgroundColor = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*标签颜色*/
    document.querySelectorAll("#blog_info &gt; ul &gt; li &gt; span.badge.pull-right").forEach(e =&gt; {
        e.style.backgroundColor = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*博客信息*/
    document.querySelectorAll("#blog_info &gt; h5").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#widget-tabs-4-hots &gt; h5").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#widget-tabs-4-hots &gt; ul &gt; li &gt; div &gt; h4 &gt; a").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#widget-tabs-4-hots &gt; ul &gt; li &gt; div &gt; small &gt; span &gt; span.meta-value").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*热门文章颜色*/
    document.querySelectorAll("#widget-tabs-4-comments &gt; h5").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#widget-tabs-4-comments &gt; ul &gt; li &gt; div &gt; div &gt; a").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#widget-tabs-4-comments &gt; ul &gt; li &gt; div &gt; small &gt; span").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*最新评论颜色*/
    document.querySelectorAll("#widget-tabs-4-random &gt; h5").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#widget-tabs-4-random &gt; ul &gt; li &gt; div &gt; h4 &gt; a").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    document.querySelectorAll("#widget-tabs-4-random &gt; ul &gt; li &gt; div &gt; small &gt; span &gt; span.meta-value").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*随机文章颜色*/
    document.querySelectorAll("#sidebar &gt; section.widget.widget_categories.wrapper-md.clear.visible-lg.visible-md &gt; h5").forEach(e =&gt; {
        e.style.color = colorArr[Math.floor(Math.random() * colorArr.length)];
    });
    /*手机阅读标题*/
}sjcolor();
&lt;/script&gt;</code></pre>
<p style="">在后台 - PJAX- PJAX回调函数中输入以下代码。这样打开其他网页时，不需要重新加载就能生效了：</p>
<pre><code class="language-JavaScript">/*全局彩色*/
sjcolor();</code></pre>
<h3 style="" id="404%E9%A1%B5%E9%9D%A2%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%8A%A8%E8%BF%94%E5%9B%9E%E9%A6%96%E9%A1%B5%E5%8A%9F%E8%83%BD">404页面添加自动返回首页功能</h3>
<details class="details">
 <summary>食用指南</summary>
 <div data-type="detailsContent">
  <p style="">找到<code>/usr/themes/handsome</code>文件夹内的<code>404.php</code>文件并打开。
   <br>
   在<code>h1 class="text-shadow text-white"&gt;404</code>这一行下面加入以下代码：</p>
  <pre><code class="language-html">&lt;br&gt;
&lt;small class="text-muted letterspacing"&gt;
&lt;b id="sp"&gt;5&lt;/b&gt;秒后自动返回···&lt;br&gt;
&lt;a class="text-muted letterspacing" href="#" onclick="javascript:history.go(-1);"&gt;立刻返回&lt;/a&gt;</code></pre>
  <p style="">再把下面的代码加入<code>404.php</code>文件内最底下的<code>&lt;/body&gt;</code>前面：</p>
  <h4 style="" id="%E8%87%AA%E5%8A%A8%E8%BF%94%E5%9B%9E%E4%B8%8A%E4%B8%80%E9%A1%B5">自动返回上一页</h4>
  <pre><code class="language-php">&lt;script type="text/javascript"&gt;
onload = function(){setInterval(go, 1000);};var x=5;
function go() {x--;if(x&gt;0) {document.getElementById("sp").innerHTML = x;}else{history.go(-1);}}
&lt;/script&gt;</code></pre>
  <h4 style="" id="%E8%87%AA%E5%8A%A8%E8%BF%94%E5%9B%9E%E9%A6%96%E9%A1%B5">自动返回首页</h4>
  <pre><code class="language-php">&lt;script type="text/javascript"&gt;
onload = function(){setInterval(go, 1000);};var x=5;
function go() {x--;if(x&gt;0) {document.getElementById("sp").innerHTML = x;}else{window.location.href = 'https://wuqishi.com';}}
&lt;/script&gt;</code></pre>
 </div>
</details>
<h3 style="" id="%E8%AF%8D%E4%BA%91%E7%AD%89%E8%B7%9D%E7%BE%8E%E5%8C%96">词云等距美化</h3>
<pre><code class="language-css">/*词云等距美化*/
#tag_cloud-2 a {
border-radius: 5px;
width: 35%;
}
</code></pre>
<h3 style="" id="hansome%E4%B8%BB%E9%A2%98%E4%B8%93%E7%94%A8%E7%9A%84useragent%E6%8F%92%E4%BB%B6">Hansome主题专用的UserAgent插件</h3>
<details class="details">
 <summary>食用指南</summary>
 <div data-type="detailsContent">
  <p style="">修改<code>Handsome</code>主题，<code>component</code>目录下的<code>comments.php</code>代码文件<code>Handsome:9.0.2</code> 版本大概第 <code>81</code> 行左右开始：</p>
  <pre><code class="language-php">&lt;span class="comment-author vcard"&gt;
    &lt;b class="fn"&gt;&lt;?php echo $author; ?&gt;&lt;/b&gt;
    &lt;?php if (!($GLOBALS["off_star_comment"] == "true" || Utils::getExpertValue("off_star_comment"))):?&gt;
    &lt;a data-coid="&lt;?php echo $comments-&gt;coid; ?&gt;" class="post-comment-star text-muted star_talk"&gt;&lt;i class="glyphicon &lt;?php
        $stars = Typecho_Cookie::get('extend_say_stars');
        if (empty($stars)) {
            $stars = array();
        } else {
            $stars = explode(',', $stars);
        }

        if (!in_array($comments-&gt;coid, $stars)) {
            echo 'glyphicon-heart-empty';
        } else {
            echo 'glyphicon-heart';
        }
        ?&gt;"&gt;&lt;/i&gt;&amp;nbsp;&lt;span class="star_count"&gt;&lt;?php
            $stars = $comments-&gt;stars;
            echo ($stars) ? $stars : "";
            ?&gt;&lt;/span&gt;&lt;/a&gt;
    &lt;?php endif; ?&gt;
&lt;/span&gt;</code></pre>
  <p style="">在<code>&lt;?php endif; ?&gt;</code>后添加代码：</p>
  <pre><code class="language-php">&lt;?php UserAgent_Plugin::get_useragent($comments-&gt;agent,$comments-&gt;ip); ?&gt;</code></pre>
  <p style="">Typecho开启CDN后，可能无法获取访客真实IP，只能取得CDN节点IP，为此可以在Typecho博客网站的根目录的<code>config.inc.php</code>插入下面的代码：</p>
  <pre><code class="language-php">//** 防止CDN造成无法获取客户真实IP地址 */
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}</code></pre>
 </div>
</details>
<h3 style="" id="%E6%BB%9A%E5%8A%A8%E6%9D%A1%E6%95%88%E6%9E%9C">滚动条效果</h3>
<pre><code>/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ 
::-webkit-scrollbar {
    width:9px;
    height:8px;
}
/*定义滚动条轨道*/ 
::-webkit-scrollbar-track {
    background-color:white;
    -webkit-border-radius: 0em;
    -moz-border-radius: 0em;
    border-radius: 0em;
}
/*定义滑块 内阴影+圆角*/ 
::-webkit-scrollbar-thumb {
    background-color: #ff676c;
    background-image: -webkit-linear-gradient(45deg,rgba(255,255,255,.4) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.4) 75%,transparent 75%,transparent);
    -webkit-border-radius: 2em;
    -moz-border-radius: 2em;
    border-radius: 2em;
    cursor: pointer;
}
</code></pre>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/typecho-modification</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F03%2F3629334878.png%21water&amp;size=m" type="image/jpeg" length="27948"/><category>分享</category><pubDate>Fri, 3 Feb 2023 03:32:00 GMT</pubDate></item><item><title><![CDATA[Markdown语法——Mermaid]]></title><link>https://wuqishi.com/archives/markdownyufamermaid</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Markdown%E8%AF%AD%E6%B3%95%E2%80%94%E2%80%94Mermaid&amp;url=/archives/markdownyufamermaid" width="1" height="1" alt="" style="opacity:0;">
<h1 id="mermaid">Mermaid</h1>
<p>点此文章参考 <a href="https://mermaid-js.github.io/mermaid/#/">Mermaid 官方文档</a></p>
<h2 id="-font-colororangemermaidfont">⭐什么是 <!-- raw HTML omitted -->Mermaid?<!-- raw HTML omitted --></h2>
<p>先别着急，我们通过一组图片展示 Mermaid 的魅力</p>
<pre><code class="language-mermaid">graph TD
	A([什么是Mermaid?]) ==&gt; B(它是一种基于Javascript的图表和图表工具) ==&gt; a(图形结构)
	style A fill:#00d26a, stroke: #333,stroke-width: 2px
	style B fill:#f9a, stroke: #333, stroke-width: 2px;

	a --&gt; C(流程图) &amp; D(时序图) &amp; E(类图) &amp; F(状态图) &amp; G(实体关系图) &amp; H(用户日记) &amp; I(甘特图) &amp; K(饼状图) &amp; L(需求图) &amp; M(其他例子...)

	style a fill:#ff9f2e, stroke: #333, stroke-width: 2px, stroke-dasharray: 5 5;
	style C fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style D fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style E fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style F fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style G fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style H fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style I fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style K fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style L fill:#ff9f2e, stroke: #333, stroke-width: 2px;
	style M fill:#ff9f2e, stroke: #333, stroke-width: 2px;
</code></pre>
<p>第一次接触时我还在感叹，画图工具的精度也比不上 <code>Mermaid</code></p>
<h3 id="1-">1. 流程图</h3>
<pre><code class="language-mermaid">graph TD
    A(IT资产配置管理)--&gt;B([技术人员现场值守]);
    B--&gt;C([日常运维/响应服务请求]);
    B--&gt;D([故障事件响应])--&gt;E([二线故障响应])--&gt;F([原厂故障响应]);
    C--&gt;G;
    F--&gt;G{{事件管理}};
    G--&gt;H{{可选:问题管理}};
    H--&gt;I{{定期服务报告}};
    style A fill:#00d26a, stroke: #333,stroke-width: 2px
    style B fill:#25aff3, stroke: #333,stroke-width: 2px
    style C fill:#25aff3, stroke: #333,stroke-width: 2px
    style D fill:#ffc019, stroke: #333,stroke-width: 2px
    style E fill:#ffc019, stroke: #333,stroke-width: 2px
    style F fill:#ffc019, stroke: #333,stroke-width: 2px
    style G fill:#00d26a, stroke: #333,stroke-width: 2px
    style H fill:#00d26a, stroke: #333,stroke-width: 2px
    style I fill:#3298ff, stroke: #333,stroke-width: 2px
</code></pre>
<h3 id="2-">2. 时序图</h3>
<pre><code class="language-mermaid">sequenceDiagram
    participant 张三
    participant 李四
    张三-&gt;&gt;李四: Hi 张三
    李四-&gt;&gt;张三: Hi 李四
</code></pre>
<h3 id="3-">3. 甘特图</h3>
<pre><code class="language-mermaid">gantt
    dateFormat  YYYY-MM-DD
    title       甘特图名称
  
    section 类别A
    已经完成的任务    :         done,     des1,   2014-01-06,  2014-01-08
    进行中的任务      :         active,   des2,   2014-01-09,  3d
    未来的任务        :                   des3,   after des2,  5d

    section 类别B
    完成的关键任务    :crit,    done,             2014-01-06,  24h
    进行中的关键任务  :crit,    active,                        3d
    将来的关键任务    :crit,                                   5d
</code></pre>
<h3 id="4-">4. 类图</h3>
<pre><code class="language-mermaid">classDiagram
    Animal &lt;|-- Duck
    Animal &lt;|-- Fish
    Animal &lt;|-- Zebra
    Animal : +int age
    Animal : +String gender
    Animal: +isMammal()
    Animal: +mate()
    class Duck{
      +String beakColor
      +swim()
      +quack()
    }
    class Fish{
      -int sizeInFeet
      -canEat()
    }
    class Zebra{
      +bool is_wild
      +run()
    }
</code></pre>
<pre><code class="language-mermaid">classDiagram
Class01 &lt;|-- AveryLongClass : Cool
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 --&gt; C2 : Where am i?
Class09 --* C3
Class09 --|&gt; Class07
Class07 : equals()
Class07 : Object[] elementData
Class01 : size()
Class01 : int chimp
Class01 : int gorilla
Class08 &lt;--&gt; C2: Cool label
</code></pre>
<h3 id="5-git-">5. Git 图（实验功能）</h3>
<p>依赖英文，展示还不支持中文（或许是我没发现啊）</p>
<pre><code class="language-mermaid">gitGraph:
options
{
    "nodeSpacing": 150,
    "nodeRadius": 10
}
end
commit
branch newbranch
checkout newbranch
commit
commit
checkout master
commit
commit
merge newbranch
</code></pre>
<h3 id="6-">6. 实体关系图（实验功能）</h3>
<p>依赖英文，展示还不支持中文（或许是我没发现啊）</p>
<pre><code class="language-mermaid">erDiagram
    CUSTOMER ||--o{ ORDER : places
    ORDER ||--|{ LINE-ITEM : contains
    CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
</code></pre>
<h3 id="7-">7. 个人旅行图</h3>
<pre><code class="language-mermaid">journey
    title 我的一天的工作日安排
    section 上班
      泡茶: 5: 我
      上楼: 3: 我
      学习(开始卷): 1: 我, 猫
    section 回家
      下楼: 5: 我
      躺平(好啊): 5: 我
</code></pre>
<blockquote>
 <p>Mermaid无所不能，实时渲染让我们的操作更为方便</p>
</blockquote>
<h2 id="--graphflowchart">⭐基础语法-流程图 (graph/flowchart)</h2>
<p>首先我们先来了解流程图基础语法和布局结构</p>
<pre><code class="language-markdown">TB - 从上到下
TD - 从上到下
BT - 从下到上
RL - 从右到左
LR - 从左到右
</code></pre>
<p>构建流程图的基础语法：</p>
<pre><code class="language-markdown">graph TD
	A[这是一个从上至下的流程图] --&gt; B(现在咱就是演示一下)
</code></pre>
<pre><code class="language-mermaid">graph TD
	A[这是一个从上至下的流程图] --&gt; B(现在咱就是演示一下)
</code></pre>
<blockquote>
 <p>明白了基础语法的构建，我们就可以开始选择形状了</p>
</blockquote>
<h3 id="1--1">1. 结点形状</h3>
<h4 id="11-">1.1 圆角矩形结点</h4>
<pre><code class="language-markdown">graph LR
    id1(这个是圆角矩形)
</code></pre>
<blockquote>
 <p>注意：这里的 <code>graph</code> 也可以替换为 <code>flowchart</code>，但是考虑到图形的兼容性，我更推荐使用 ==graph==</p>
</blockquote>
<pre><code class="language-mermaid">graph LR
    id1(这个是圆角矩形)
</code></pre>
<h4 id="12-">1.2 跑道形结点</h4>
<pre><code class="language-markdown">graph LR
    id1([这个也是特殊的圆角矩形])
</code></pre>
<pre><code class="language-mermaid">graph LR
    id1([这个也是特殊的圆角矩形])
</code></pre>
<h4 id="13-">1.3 子程序形结点</h4>
<pre><code class="language-markdown">graph LR
    id1[[这个是子程序结点]]
</code></pre>
<pre><code class="language-mermaid">graph LR
    id1[[这个是子程序结点]]
</code></pre>
<h4 id="14-">1.4 圆柱形结点</h4>
<pre><code class="language-markdown">graph LR
    id1[(数据库)]
</code></pre>
<pre><code class="language-mermaid">graph LR
    id1[(数据库)]
</code></pre>
<h4 id="15-">1.5 圆形结点</h4>
<pre><code class="language-markdown">graph LR
    id1((这个是圆形结点))
</code></pre>
<pre><code class="language-mermaid">graph LR
    id1((这个是圆形结点))
</code></pre>
<h4 id="16-">1.6 旗帜结点</h4>
<pre><code class="language-markdown">graph LR
    id1&gt;This is the text in the box]
</code></pre>
<pre><code class="language-mermaid">graph LR
    id1&gt;这个是旗帜结点]
</code></pre>
<h4 id="17-">1.7 菱形结点</h4>
<pre><code class="language-markdown">graph LR
    id1{这个是菱形结点}
</code></pre>
<pre><code class="language-mermaid">graph LR
    id1{这个是菱形结点}
</code></pre>
<h4 id="18-">1.8 六边形结点</h4>
<pre><code class="language-markdown">graph LR
    id1{{六边形结点}}
</code></pre>
<pre><code class="language-mermaid">graph LR
    id1{{六边形结点}}
</code></pre>
<h4 id="19-">1.9 平行四边形和梯形</h4>
<pre><code class="language-markdown">graph LR
	id1[/平行四边形右倾斜/]
	id2[\平行四边形左倾斜\]
	id3[/上底梯形\]
	id4[\下底梯形/]
</code></pre>
<pre><code class="language-mermaid">graph LR
	id1[/平行四边形右倾斜/]
	id2[\平行四边形左倾斜\]
	id3[/上底梯形\]
	id4[\下底梯形/]
</code></pre>
<h3 id="2--1">2. 连接线</h3>
<pre><code class="language-markdown">graph TD
	A --&gt; B
	C --- D
	a --文本--- b
	c ---|也可以这样|d
	E--&gt;|也可以这样|F
	H-.-&gt;I;
	e-.文本.-&gt;f
	J ==&gt; K
	j ==文本==&gt; k
</code></pre>
<pre><code class="language-mermaid">graph TD
	A --&gt; B
	C --- D
	a --文本--- b
	c ---|也可以这样|d
	E--&gt;|也可以这样|F
	H-.-&gt;I;
	e-.文本.-&gt;f
	J ==&gt; K
	j ==文本==&gt; k
</code></pre>
<pre><code class="language-markdown">graph TD
    A -- text --&gt; B -- text2 --&gt; C
    a --&gt; b &amp; c--&gt; d
    e &amp; f--&gt; h &amp; i
    也可以
    e --&gt; h
    e --&gt; i
    f --&gt; h
    f --&gt; i
</code></pre>
<pre><code class="language-mermaid">graph TD
    A -- text --&gt; B -- text2 --&gt; C
    a --&gt; b &amp; c--&gt; d
    e &amp; f--&gt; h &amp; i
</code></pre>
<p>由于 <code>graph</code> 不兼容此语法，故使用 <code>flowchart</code></p>
<pre><code class="language-markdown">flowchart TD
	A --o B
	B --x C

	D o--o E
    E &lt;--&gt; F
    F x--x G
</code></pre>
<pre><code class="language-mermaid">flowchart TD
	A --o B
	B --x C

	D o--o E
    E &lt;--&gt; F
    F x--x G
</code></pre>
<hr>
<p>至此，我们就完成了最基础的 Mermaid 语法学习</p>
<p>让我们尝试画画程序框图吧</p>
<pre><code class="language-mermaid">flowchart TD
    A[Start] --&gt; B{Is it?};
    B -- Yes --&gt; C[OK];
    C --&gt; D[Rethink];
    D --&gt; B;
    B -- No ----&gt; E[End];
</code></pre>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fwww.zhihu.com%2Fequation%3Ftex%3D%255Cbegin%257Barray%257D%255Bb%255D%2B%257B%257Cc%257Cc%257C%257D%2B%2B%255Chline%2B%25E8%25AF%25AD%25E6%25B3%2595%2B%2526%2B%25E6%25B3%25A8%25E9%2587%258A%2B%255C%255C%2B%2B%255Chline%2BA---B%2B%2B%2526%2B%25E6%2597%25A0%25E7%25AE%25AD%25E5%25A4%25B4%25E8%25BF%259E%25E6%258E%25A5%2B%2B%255C%255C%2B%2B%255Chline%2BA---%253EB%2B%2B%2526%2B%25E6%259C%2589%25E7%25AE%25AD%25E5%25A4%25B4%25E8%25BF%259E%25E6%258E%25A5%2B%2B%255C%255C%2B%2B%255Chline%2BA---text---B%2B%2B%2526%2B%25E5%25B8%25A6%25E6%2596%2587%25E5%25AD%2597%2B%255C%255C%2B%2B%255Chline%2BA---%257Ctext%257CB%2B%2B%2526%2B%25E5%25B8%25A6%25E6%2596%2587%25E5%25AD%2597%2B%2B%255C%255C%2B%2B%255Chline%2BA---%253E%257Ctext%257CB%2B%2B%2526%2B%25E5%25B8%25A6%25E6%2596%2587%25E5%25AD%2597%2B%2B%255C%255C%2B%2B%2B%255Chline%2BA-.-B%2B%2B%2526%2B%25E8%2599%259A%25E7%25BA%25BF%25E8%25BF%259E%25E6%258E%25A5%2B%255C%255C%2B%2B%255Chline%2BA-.text.-B%2B%2B%2526%2B%25E8%2599%259A%25E7%25BA%25BF%25E5%25B8%25A6%25E6%2596%2587%25E5%25AD%2597%2B%255C%255C%2B%2B%255Chline%2BA%2B%253D%253D%253EB%2B%2B%2526%2B%25E8%25BF%259E%25E6%258E%25A5%25E5%258A%25A0%25E7%25B2%2597%2B%255C%255C%2B%2B%255Chline%2BA%2B--oB%2B%2B%2526%2Bo%25E7%25AE%25AD%25E5%25A4%25B4%25E7%25B1%25BB%25E5%259E%258B%2528%25E9%259C%2580flowchart%25E6%2594%25AF%25E6%258C%2581%2529%2B%255C%255C%2B%2B%255Chline%2BA%2B--xB%2B%2B%2526%2Bx%25E7%25AE%25AD%25E5%25A4%25B4%25E7%25B1%25BB%25E5%259E%258B%2528%25E9%259C%2580flowchart%25E6%2594%25AF%25E6%258C%2581%2529%2B%255C%255C%2B%2B%255Chline%2BA%253C--%253EB%2B%2B%2526%2B%25E5%25A4%259A%25E5%2590%2591%25E7%25AE%25AD%25E5%25A4%25B4%2528%25E9%259C%2580flowchart%25E6%2594%25AF%25E6%258C%2581%2529%2B%2B%2B%255C%255C%2B%255Chline%2B%255Cend%257Barray%257D%2B%2B%255C%255C%2B%2B&amp;size=m" alt=""></p>
<h3 id="heading">总结</h3>
<table>
 <thead>
  <tr>
   <th>长度</th>
   <th>1</th>
   <th>2</th>
   <th>3</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>默认（不带方向箭头）</td>
   <td><code>---</code></td>
   <td><code>----</code></td>
   <td><code>-----</code></td>
  </tr>
  <tr>
   <td>默认（带方向箭头）</td>
   <td><code>--&gt;</code></td>
   <td><code>---&gt;</code></td>
   <td><code>----&gt;</code></td>
  </tr>
  <tr>
   <td>加粗无向实线</td>
   <td><code>===</code></td>
   <td><code>====</code></td>
   <td><code>=====</code></td>
  </tr>
  <tr>
   <td>加粗有向实线</td>
   <td><code>==&gt;</code></td>
   <td><code>===&gt;</code></td>
   <td><code>====&gt;</code></td>
  </tr>
  <tr>
   <td>无向虚线</td>
   <td><code>-.-</code></td>
   <td><code>-..-</code></td>
   <td><code>-...-</code></td>
  </tr>
  <tr>
   <td>有向虚线</td>
   <td><code>-.-&gt;</code></td>
   <td><code>-..-&gt;</code></td>
   <td><code>-...-&gt;</code></td>
  </tr>
 </tbody>
</table>]]></description><guid isPermaLink="false">/archives/markdownyufamermaid</guid><dc:creator>吴蛋蛋</dc:creator><category>技巧</category><pubDate>Fri, 13 Jan 2023 08:22:00 GMT</pubDate></item><item><title><![CDATA[有两种新方案—CloudFlare官方免费CNAME接入教程]]></title><link>https://wuqishi.com/archives/youliangzhongxinfangancloudflareguanfangmianfeicnamejierujiaocheng</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%9C%89%E4%B8%A4%E7%A7%8D%E6%96%B0%E6%96%B9%E6%A1%88%E2%80%94CloudFlare%E5%AE%98%E6%96%B9%E5%85%8D%E8%B4%B9CNAME%E6%8E%A5%E5%85%A5%E6%95%99%E7%A8%8B&amp;url=/archives/youliangzhongxinfangancloudflareguanfangmianfeicnamejierujiaocheng" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p>经过测试<strong>通过 Cloudflare pages function</strong>方法已失效。---2023-03-02</p>
</blockquote>
<p>介于网络环境不同，很多人有需求在保留国内域名 DNS 服务器不改变的情况下，还能接入国外服务商比如 CloudFlare 的服务，使得国内外都能有较好的网络使用感受，以前通过 CloudFlare Partner 来实现 CNAME 接入的方式已经失效，目前有两种新方案可以复活 Cloudflare 的 CNAME 接入。</p>
<h2 id="通过-SaaS">通过 SaaS</h2>
<p>从 2021 年 11 月开始，CloudFlare 禁用了 Partner 使用的 <code>zone_set</code>API 以避免滥用（因为该 API 接入不需要验证域名所有权），通过 Partner 实现 CNAME 接入的方式近乎落幕，仅剩 Plesk 空间存量的 <code>ServerShield by Cloudflare</code> 插件订阅能够正常接入。几个月过去了，官方也并没有对未来合作伙伴如何进行接入新域名给出任何解释。</p>
<p>错过了 Partner 的时代，官方的 CloudFlare for SaaS 也提供了一种更灵活的 CNAME 接入方式，一起来看看吧。</p>
<h3 id="功能简介">功能简介</h3>
<p>CloudFlare for SaaS 不是个新功能，这里单独拿出来讲，主要是几天前 CF 调整了一波免费额度。过去是每个域名收取 2USD/ 月的费用，现在不仅提供 100 个域名免费额度，而且超额后每个域名按 0.1USD/ 月收取费用，非常良心。</p>
<blockquote>
 <p><strong>官方公告：https://blog.cloudflare.com/waf-for-saas/</strong></p>
</blockquote>
<p>CloudFlare 中一个完全接入的域名即为一个 <code>zone</code>，点进去包括套餐、安全等等都是针对这一主域名配置的。官方 SaaS 功能针对的是你服务的客户，开放这项功能允许使用他们自己的域名直接附加在你的 <code>zone</code> 里，享受你 <code>zone</code> 包含的安全、加速等功能。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2F30984beeb55853a34392093c014417f1.jpeg%21water&amp;size=m" alt="zone"></p>
<p>说起来可能不是很直白，这里举几个应用场景的例子：</p>
<blockquote>
 <p>★<strong>应用场景 1</strong>：<code>a.com</code> 通过 NS 接入了 CF，<code>b.com</code> 未接入 CF；可以通过 SaaS 功能实现 <code>1.b.com</code>/<code>2.b.com</code> 等直接附加在 <code>a.com</code> 上，通过 CNAME 指向 CF 的节点。</p>
 <p>★<strong>应用场景 2</strong>：<code>a.com</code> 通过 Plesk 接入了 CF，具有免费的 Plesk Plus 版本，<code>b.com</code> 未接入 CF 或使用的免费版；可以通过 SaaS 功能实现 <code>1.b.com</code>/<code>2.b.com</code> 等直接附加在 <code>a.com</code> 上，享受 <code>a.com</code> 域名下的 ECC+RSA 双证书、页面规则、高级防火墙权益。</p>
</blockquote>
<p>简而言之，可以通过这项功能，实现其他域名的 CNAME 接入以及对 <code>zone</code> 权益的共享，有兴趣的话，接着往下看吧~</p>
<h3 id="配置接入">配置接入</h3>
<h4 id="订阅-CloudFlare-for-SaaS">订阅 CloudFlare for SaaS</h4>
<p>打开一个域名，选择【SSL/TLS】下的【自定义主机名】，点击【启用 CloudFlare for SaaS】后根据指示绑定外币卡或者 PayPal，订阅 CloudFlare for SaaS 功能。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2F326d47d38fe3f66dfc5981136021a48e.jpeg%21water&amp;size=m" alt="订阅 CloudFlare for SaaS"></p>
<p>CloudFlare for SaaS 订阅本身是针对整个计费账户的，所以通过 Partner 接入的域名出现【请联系客户成功经理以启用适用于 SaaS 的 SSL】时，只需要选择个通过官方 NS 激活的域名启用订阅后即可使用。这里猜测可能是 Partner 接入的商务权限交给了合作伙伴，方便下放优惠和服务那些，我们绕过去就行了。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2Fe6ca271ce1f017b18ed320a2e4599aa3.jpeg%21water&amp;size=m" alt="SSL/TLS">
 <br>
 激活页面中文翻译比较滞后，从英文的可以看到免费额度已经进行更新，可以放心使用。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2Fa32297838981b06a6f779b7964f7ffe9.jpeg%21water&amp;size=m" alt="激活"></p>
<h4 id="设置源站">设置源站</h4>
<p>选择一个承载的域名 <code>zone</code> 点进去，依然是【SSL/TLS】下的【自定义主机名】，首先要设置附加上域名的源站。在这之前要在承载的域名 <code>zone</code> 中设置一个子域名作为源站的来源，比如 <code>origin.a.com</code>，在 Partner 或者官方 DNS 设置好它的源站（注意是是在 CF 里添加，和正常添加网站的流程一样）。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2F646c345c5adf93bbd85b21d386d7cd18.jpeg%21water&amp;size=m" alt="回退源（Fallback Origin）"></p>
<p>SaaS 这里的源站叫回退源（Fallback Origin），输入刚才设置的子域名并点击【Add Fallback Origin】，它会同步这个子域名设置的源站作为后续在此接入域名的源站。有些人就会问了，这样设置那不是后续 SaaS 添加的所有其他域名就只能用同一个源站了？答案确实是这样，为每个 SaaS 域名自定义源站需要 Enterprise 以上套餐，有多域名需求多开几个 zone 吧（苦笑）。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2F1c979f97214d0b9962184bd4891f9a5a.jpeg%21water&amp;size=m" alt="自定义源站需要 Enterprise 以上套餐"></p>
<h4 id="添加自定义主机名">添加自定义主机名</h4>
<p>后续的工作就很简单了，点击【添加自定义主机名】，输入你要添加的未在 CF 接入的子域名。建议直接选择 TXT 验证，因为除了证书还有另一条 TXT 记录要添加，一起加上去比较方便。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2F9a851b6f7f17e374ce8ece02fd085296.jpeg%21water&amp;size=m" alt="添加自定义主机名"></p>
<h4 id="验证域名所有权">验证域名所有权</h4>
<p>添加完成后，按要求解析证书和主机名两个 TXT 记录，解析生效后 10 分钟左右即可验证通过，到此这个 SaaS 域名就正确的添加到了你的 <code>zone</code> 中并接入了 CF。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2Ff3af8389c70e36e62b26062828b30f93.jpeg%21water&amp;size=m" alt="验证域名所有权"></p>
<p>特别提醒，如图这里 CF 给出的验证 TXT 名称是应完整域名的解析记录，所以在自己的第三方 DNS 配置的时候，填入的主机名应当是 <code>example</code> 和 <code>_cf-custom-hostname.example</code>，如果直接复制框内的内容把根域名 <code>b.com</code> 填进了主机名全域就变成了 <code>example.b.com.b.com</code> 了，是错误的。配置完成之后你可以通过直接复制的域名来检查 TXT 记录是否匹配，推荐 MySSL 的工具。</p>
<h4 id="SaaS-域名解析">SaaS 域名解析</h4>
<p>添加进去的 SaaS 域名，CF 并不会给你提供明确的 CNAME 供指向。如果是官方接入的可以直接 CNAME 到你刚刚设置的源站域名比如 <code>origin.a.com</code>，通过 Partner 接入的直接解析到源域名对应的 CNAME 比如 <code>origin.a.com.cdn.cloudflare.net</code> 即可。其他的配置比如分线路解析、自选 IP 就可以按照自己的喜好去设置了，在此不过多赘述。</p>
<p>此外，对于防火墙规则、页面规则，直接将添加进的域名输入其中即可圈定范围，完成对于其细则的设置。</p>
<hr>
<p>CloudFlare for SaaS 是官方提供的一项非常方便的免费功能，弥补了早期未通过 Partner 接入只能强制 NS 接入的缺憾。有官方保障、灵活 CNAME、免费的优点，也有源站不灵活等缺点，肯定还是不如已经通过 Partner/Plesk 接入的域名灵活。</p>
<hr>
<details>
 <summary>以下方法已失效--2023年3月2日检测</summary>
 <h2 id="通过-Cloudflare-pages-function">通过 Cloudflare pages function</h2>
 <p>1、首先去 https://github.com/xyTom/cf-page-func-proxy 下载或是 Fork 该仓库</p>
 <p>2、修改该仓库 _worker.js 中的 url.hostname 为你需要反代的网址或是需要 cname 接入，自选 ip 的地址</p>
 <p>3、然后打开 Cloudflare Dashboard，进入 Pages 管理页面，选择创建项目，如果在第一步中选择的是 fork 本仓库，则选择 1 Connect to Git，如果第一步中选择的是下载本仓库则选择 2 Direct Upload</p>
 <p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2Fe01341c15856e44edea21f115fba3fe6.png%21water&amp;size=m" alt="创建项目"></p>
 <h3 id="绑定自定义域名">绑定自定义域名</h3>
 <ul>
  <li>进入 Cloudflare Pages 管理页面，选择刚刚创建的 Pages 项目，点击名称进入项目设置页面</li>
 </ul>
 <p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2Fcab9493659b1b486a41dfe2393c3b396.png%21water&amp;size=m" alt="进入项目设置页面"></p>
 <ul>
  <li>选择页面中的自定义域选项卡</li>
  <li>在页面中输入需要绑定的域名，并点击继续，这里的域名可以是子域名</li>
  <li>在设置方法中选择开始 cname 设置</li>
 </ul>
 <p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2F7a11fce10447fe3bea76a22763d9f9ae.png%21water&amp;size=m" alt="开始 cname 设置"></p>
 <ul>
  <li>按照页面给出的说明去 DNS 服务提供商处修改 DNS 解析记录，即可完成自定义域名绑定</li>
 </ul>
 <p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2Fa96af5be0f0118a9d21fcd8d456944be.png%21water&amp;size=m" alt="DNS 解析记录"></p>
 <p>稍等一会，等待解析生效后就可以通过绑定的域名访问了，通过这种方式绑定的域名是 cname 接入，理论上可以自选 ip。</p>
</details>]]></description><guid isPermaLink="false">/archives/youliangzhongxinfangancloudflareguanfangmianfeicnamejierujiaocheng</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F01%2F30984beeb55853a34392093c014417f1.jpeg%21water&amp;size=m" type="image/jpeg" length="17172"/><category>技巧</category><pubDate>Tue, 10 Jan 2023 09:07:00 GMT</pubDate></item><item><title><![CDATA[居居的新冠历程]]></title><link>https://wuqishi.com/archives/jujudexinguanlicheng</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%B1%85%E5%B1%85%E7%9A%84%E6%96%B0%E5%86%A0%E5%8E%86%E7%A8%8B&amp;url=/archives/jujudexinguanlicheng" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p style="">时年3岁，忧之，不曾想却是先于我们，希望速速恢复健康！</p>
</blockquote>
<h2 style="" id="%E6%97%B6%E9%97%B4%E7%BA%BF">时间线</h2>
<timeline-view group-name="timeline-group-ps3dkf6k" orientation="vertical"></timeline-view>
<h3 style="" id=""></h3>
<h2 style="" id="%E6%8A%97%E5%8E%9F%E6%A3%80%E6%B5%8B%E7%BB%93%E6%9E%9C">抗原检测结果</h2>
<h3 style="" id="2022%E5%B9%B412%E6%9C%8827%E6%97%A5%E6%8A%97%E5%8E%9F%E6%A3%80%E6%B5%8B%E7%BB%93%E6%9E%9C">2022年12月27日抗原检测结果</h3>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F12%2F0A78C9CA-FD4E-46B5-9054-F47D0B31C9A5_1_105_c.jpeg%21water&amp;size=m" alt="27日抗原检测结果">
</figure>
<p style="">CT两条线，T线呈深色，结果为阳性</p>
<h2 style="" id="%E7%97%87%E7%8A%B6%E8%A1%A8%E7%8E%B0">症状表现</h2>
<ol>
 <li>
  <p style="">反复高烧</p>
 </li>
 <li>
  <p style="">喉咙痛</p>
 </li>
 <li>
  <p style="">头痛</p>
 </li>
</ol>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/jujudexinguanlicheng</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F12%2F0A78C9CA-FD4E-46B5-9054-F47D0B31C9A5_1_105_c.jpeg%21water&amp;size=m" type="image/jpeg" length="27422"/><category>蛋花</category><pubDate>Tue, 27 Dec 2022 14:18:00 GMT</pubDate></item><item><title><![CDATA[群辉安装Transmission套件、增强汉化WebUI并备份做种列表]]></title><link>https://wuqishi.com/archives/synology-transmission-webui</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BE%A4%E8%BE%89%E5%AE%89%E8%A3%85Transmission%E5%A5%97%E4%BB%B6%E3%80%81%E5%A2%9E%E5%BC%BA%E6%B1%89%E5%8C%96WebUI%E5%B9%B6%E5%A4%87%E4%BB%BD%E5%81%9A%E7%A7%8D%E5%88%97%E8%A1%A8&amp;url=/archives/synology-transmission-webui" width="1" height="1" alt="" style="opacity:0;">
<h2 id="0--transmission">0. 为什么要使用 Transmission</h2>
<ul>
 <li>开源免费，无广告；</li>
 <li>全平台支持，适合 NAS 系统；</li>
 <li>没有内容审查，无法下载等情况；</li>
 <li>迅雷下载故意降速，很多资源无速度或只能下载到 99%；</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2F20220105013209490.png%21water&amp;size=m" alt="文章脑图"></p>
<h2 id="1-">1. 安装</h2>
<h3 id="11-">1.1 添加源</h3>
<p>打开【套件中心】选择【套件来源】新增一个非群晖官方的套件安装源。</p>
<p><strong>名称</strong> ：synocommunity <strong>位置</strong> ：<a href="http://packages.synocommunity.com">http://packages.synocommunity.com</a></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2F20220105013734843.png%21water&amp;size=m" alt="添加源"></p>
<h3 id="12-">1.2 开启信任层级</h3>
<p>由于非群晖官方套件，如果不开启信任，会提示安装失败。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2Fl5VH3z21ERuoGkd-20210916082248-vhg8ic11.png%21water&amp;size=m" alt="信任发行者"></p>
<h3 id="13--transmission"><strong>1.3 安装 Transmission</strong></h3>
<p>添加之后，刷新或重新打开<strong>套件中心</strong>找到<strong>社群</strong>并找到 <strong>Transmission</strong> 点击安装。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2FukayLecSBzZOghr-20210916082248-otrzmwn1.png%21water&amp;size=m" alt="寻找套件"></p>
<h2 id="2-">2. 配置目录</h2>
<h3 id="21-"><strong>2.1 设置文件夹路径</strong></h3>
<p>安装成功后会弹出配置界面，我们暂时先不要配置，先打开 <strong>File Station</strong> 创建下载文件夹</p>
<ul>
 <li>dowload 文件下载完成后再会出现再该目录，所以可以直接关联该目录为媒体库；</li>
 <li>incomplete 临时文件，正在下载但是未下载完成的文件；</li>
 <li>watch 这个目录一旦放入 torrent 文件，会自动创建任务并下载，适合做批量和自动下载。</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2Fp7GSwPeKkxyjmOF-20210916082248-4ar0jg51.png%21water&amp;size=m" alt="文件目录"></p>
<p>按照示例分别创建 <strong>download incomplete watch</strong> 文件夹</p>
<blockquote>
 <ol>
  <li>上述路径，都需要授权 <strong>sc-download</strong> 用户读写权限，否则将 tr 将无法下载或自动添加种子。</li>
  <li>后面两个路径如果不写，默认禁用相应的功能</li>
 </ol>
</blockquote>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2F8oWFfUYnzr5Ob74-20210916082248-a5vm5z61.png%21water&amp;size=m" alt="安装套件指定目录"></p>
<p>根据自己实际需求填写文件夹地址</p>
<p>填写对应文件夹地址到安装界面，点击 <strong>下一步</strong> ，填写 <strong>后台管理用户名和密码（一定要记住）</strong> ，继续<strong>下一步</strong>完成后会启动。</p>
<h3 id="22-">2.2 设置文件夹权限</h3>
<p>在开始使用之前，我们还需要设置目标 下载文件夹读写权限，否则会出现无权限读取和写入。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2FXArwlfs2Mq7Fh6H-20210916082248-u0c3y6l1.png%21water&amp;size=m" alt="设置文件夹权限"></p>
<p>设置读写权限，需要设置好 <strong>sc-download</strong> 用户完全读写权限：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2FJyfOoUa5BHKWGrY-20210916082248-lflhjk71.png%21water&amp;size=m" alt="添加权限"></p>
<p>设置，打开 <code>http://你的IP 地址:9091</code> 或者通过已安装套件中点击启动会自动跳转到该管理控制台，输入安装过程中我们设置的用户名和密码，进入管理控制台。</p>
<h2 id="3-">3. 下载文件与控制</h2>
<h3 id="31-">3.1 控制台页面介绍</h3>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2FcSvTaYj6W8mRF3X-20210916082248-lbiocsv1.png%21water&amp;size=m" alt="控制台介绍"></p>
<h3 id="32-gui-">3.2 GUI 客户端控制</h3>
<p>除了网页之外，我们还可以通过电脑上安装 Transmission 客户端软件进行下载任务的控制。打开 <a href="https://github.com/transmission-remote-gui/transgui/releases">transgui</a> 选择对应平台软件下载并安装。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2FlXJAeDkNsGKrifh-20210916082248-0ulsbpu1.png%21water&amp;size=m" alt="开通"></p>
<h2 id="4--webui">4. 安装增强汉化版 WebUI</h2>
<h3 id="41-">4.1 项目地址：</h3>
<p><a href="https://github.com/ronggang/transmission-web-control">https://github.com/ronggang/transmission-web-control</a></p>
<h3 id="42-ssh-">4.2 如何安装（SSH 方式）</h3>
<p>安装之前</p>
<ul>
 <li>请确认系统已安装 Transmission；</li>
 <li>请确认你是否有 root 用户权限；</li>
</ul>
<h3 id="43-">4.3 获取最新的安装脚本</h3>
<ul>
 <li>使用终端以 <code>root</code> 用户登录到你的系统，以下脚本假设你已经使用 <code>root</code> 用户；（方法自行搜索）</li>
 <li>记住当前路径（如 /volume1/ ），以后用到，因为 wget 下载的文件会保存到当前目录；</li>
 <li>获取最新的安装脚本：</li>
</ul>
<pre><code>wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control-cn.sh
</code></pre>
<ul>
 <li>请留意执行结果，如果出现 <code>install-tr-control-cn.sh.1</code> 之类的提示，表示文件已存在，请使用 <code>rm install-tr-control-cn.sh*</code> 删除之前的脚本再重新执行上面的命令；</li>
 <li>如果提示 <code>https</code> 获取失败，请使用以下命令获取安装脚本：</li>
</ul>
<pre><code>wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control-cn.sh --no-check-certificate
</code></pre>
<ul>
 <li>如果提示文件已存在，可以通过 <code>rm install-tr-control-cn.sh</code> 进行删除后再执行下载；或者在 <code>wget</code> 后面添加 <code>-N</code> 参数，如：</li>
</ul>
<pre><code>wget -N https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control-cn.sh --no-check-certificate
</code></pre>
<h3 id="44-">4.4 执行安装脚本</h3>
<ul>
 <li>执行安装脚本（如果系统不支持 <code>bash</code> 命令，请尝试将 <code>bash</code> 改为 <code>sh</code> ）：</li>
</ul>
<pre><code>bash install-tr-control-cn.sh
</code></pre>
<ul>
 <li>如果出现 <code>Permission denied</code> 之类的提示，表示没有权限，可尝试添加执行权限：</li>
</ul>
<pre><code>chmod +x install-tr-control-cn.sh
</code></pre>
<ul>
 <li>如果命令成功执行，将出现以下界面：</li>
</ul>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2FJbwvNDiWt2eqrxC-20210916082248-6zl01a81.png%21wwater&amp;size=m" alt="成功界面"></p>
<ul>
 <li>按照提示，输入相应的数字，按回车即可；</li>
 <li>如果无法正常显示中文，请尝试设置 SSH 客户端编码为 <code>UTF-8</code> ，如依然不能显示中文，请下载并使用英文安装脚本 <code>install-tr-control.sh</code></li>
</ul>
<pre><code>wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control.sh --no-check-certificate
</code></pre>
<ul>
 <li>安装完成后，用浏览器访问 Transmission Web Interface（如：<a href="http://192.168.1.1:9091/">http://192.168.1.1:9091/</a> ）即可看到新的界面；如果无法看到新界面，可能是浏览器缓存了，请按 <code>Ctrl + F5</code> 强制刷新页面或 [清空缓存]后再重新打开；</li>
 <li>如果在知道自己的 Transmission Web 所在目录，也可以在安装脚本后面直接加路径，以避免搜索，如：</li>
</ul>
<pre><code>bash install-tr-control-cn.sh /var/packages/transmission/target/share/transmission
</code></pre>
<ul>
 <li>注意，路径最后 <strong>不要</strong> 加 <code>web</code> ；</li>
</ul>
<h2 id="5-">5. 关于下载速度</h2>
<ul>
 <li>带宽的大小决定了下载速度的上限；</li>
 <li>资源的热度也可以决定下载速度快慢，一般冷门资源速度较慢；</li>
 <li>一开始速度较慢可以稍等，比如到了晚上可能速度就会边快，理论上越多人下载，速度越快；</li>
 <li>如果速度特别甚至为 0 ，可以考虑更换其它同内容磁力链接。</li>
</ul>
<h2 id="6-">6. 备份恢复做种列表</h2>
<h3 id="61--transmission-">6.1 明确 Transmission 安装位置</h3>
<p>我的安装位置：所在磁盘的 <code>/volume3/@appstore/transmission/</code></p>
<h3 id="62-">6.2. 备份文件夹</h3>
<p>备份安装路径 resume 和 torrents 文件夹，如果没有暂定任务，resume 文件夹内无内容。</p>
<p><code>/volume3/@appstore/transmission/var/torrents</code></p>
<p><code>/volume3/@appstore/transmission/var/resume</code></p>
<p>可以创建群辉定时任务，这样群辉可以定期备份做种列表和种子，任务内容如下，需要根据自己的情况修改</p>
<pre><code class="language-sh"># 按日期新建备份文件夹
mkdir -p /var/services/homes/admin/PTools/transmission/resume/`date +%y%m%d`
mkdir -p /var/services/homes/admin/PTools/transmission/torrents/`date +%y%m%d`
# 备份至新建的文件夹
cp -rf /volume2/@appstore/transmission/var/resume/* /var/services/homes/admin/PTools/transmission/resume/`date +%y%m%d`
cp -rf /volume2/@appstore/transmission/var/torrents/* /var/services/homes/admin/PTools/transmission/torrents/`date +%y%m%d`
</code></pre>
<h3 id="6-3--tr-">6. 3. 重装 tr 后恢复做种列表</h3>
<p>将备份的文件夹覆盖新的安装路径对应位置，然后修改种子文件和 resume 文件的权限、所有者、所有组。</p>
<pre><code class="language-sh">chmod 600 *
chown sc-transmission *
chgrp transmission *
ll
</code></pre>
<p>修改完成之后，重启 Tr 即可看到亲切的做种列表。</p>
<p><strong>PS：install-tr-control.sh 代码备份</strong></p>
<pre><code class="language-chmod">#!/bin/bash
# 获取第一个参数
ARG1="$1"
ROOT_FOLDER=""
SCRIPT_NAME="$0"
SCRIPT_VERSION="1.2.2-beta2"
VERSION=""
WEB_FOLDER=""
ORG_INDEX_FILE="index.original.html"
INDEX_FILE="index.html"
TMP_FOLDER="/tmp/tr-web-control"
PACK_NAME="master.tar.gz"
WEB_HOST="https://github.com/ronggang/transmission-web-control/archive/"
DOWNLOAD_URL="$WEB_HOST$PACK_NAME"
# 安装类型
# 1 安装至当前 Transmission Web 所在目录
# 2 安装至 TRANSMISSION_WEB_HOME 环境变量指定的目录，参考：https://github.com/transmission/transmission/wiki/Environment-Variables#transmission-specific-variables
# 使用环境变量时，如果 transmission 不是当前用户运行的，则需要将 TRANSMISSION_WEB_HOME 添加至 /etc/profile 文件，以达到“永久”的目的
# 3 用户指定参数做为目录，如 sh install-tr-control.sh /usr/local/transmission/share/transmission
INSTALL_TYPE=-1
SKIP_SEARCH=0
AUTOINSTALL=0
if which whoami 2&gt;/dev/null; then
    USER=`whoami`
fi

#==========================================================
MSG_TR_WORK_FOLDER="当前 Transmission Web 目录为: "
MSG_SPECIFIED_VERSION="您正在使用指定版本安装，版本："
MSG_SEARCHING_TR_FOLDER="正在搜索 Transmission Web 目录..."
MSG_THE_SPECIFIED_DIRECTORY_DOES_NOT_EXIST="指定的目录不存在，准备进行搜索，请稍候..."
MSG_USE_WEB_HOME="使用 TRANSMISSION_WEB_HOME 变量: $TRANSMISSION_WEB_HOME"
MSG_AVAILABLE="可用"
MSG_TRY_SPECIFIED_VERSION="正在尝试指定版本"
MSG_PACK_COPYING="正在复制安装包..."
MSG_WEB_PATH_IS_MISSING="错误 : Transmisson WEB 目录不存在，请确认是否已安装 Transmisson 。"
MSG_PACK_IS_EXIST=" 已存在，是否重新下载？（y/n）"
MSG_SIKP_DOWNLOAD="\n跳过下载，正在准备安装"
MSG_DOWNLOADING="正在下载 Transmission Web Control..."
MSG_DOWNLOAD_COMPLETE="下载完成，正在准备安装..."
MSG_DOWNLOAD_FAILED="安装包下载失败，请重试或尝试其他版本。"
MSG_INSTALL_COMPLETE="Transmission Web Control 安装完成!"
MSG_PACK_EXTRACTING="正在解压安装包..."
MSG_PACK_CLEANING_UP="正在清理安装包..."
MSG_DONE="安装脚本执行完成。如遇到问题请查看：https://github.com/ronggang/transmission-web-control/wiki "
MSG_SETTING_PERMISSIONS="正在设置权限，大约需要一分钟 ..."
MSG_BEGIN="开始"
MSG_END="结束"
MSG_MAIN_MENU="
    欢迎使用 Transmission Web Control 中文安装脚本。
    官方帮助文档：https://github.com/ronggang/transmission-web-control/wiki 
    安装脚本版本：$SCRIPT_VERSION 
    1. 安装最新的发布版本（release）；
    2. 安装指定版本，可用于降级；
    3. 恢复到官方UI；
    4. 重新下载安装脚本（$SCRIPT_NAME）；
    5. 检测 Transmission 是否已启动；
    6. 指定安装目录；
    9. 安装最新代码库中的内容（master）；
    ===================
    0. 退出安装；
    请输入对应的数字："
MSG_INPUT_VERSION="请输入版本号（如：1.5.1）："
MSG_INPUT_TR_FOLDER="请输入 Transmission Web 所在的目录（不包含web，如：/usr/share/transmission）："
MSG_SPECIFIED_FOLDER="安装目录已指定为："
MSG_INVALID_PATH="输入的路径无效。"
MSG_MASTER_INSTALL_CONFIRM="最新代码可能包含未知错误，是否确认安装？ (y/n): "
MSG_FIND_WEB_FOLDER_FROM_PROCESS="正在尝试从进程中识别 Transmission Web 目录..."
MSG_FIND_WEB_FOLDER_FROM_PROCESS_FAILED=" × 识别失败，请确认 Transmission 已启动。"
MSG_CHECK_TR_DAEMON="正在检测 Transmission 进程..."
MSG_CHECK_TR_DAEMON_FAILED="在系统进程中没有找到 Transmission ，请确认是否已启动。"
MSG_TRY_START_TR="是否尝试启动 Transmission ？（y/n）"
MSG_TR_DAEMON_IS_STARTED="Transmission 已启动。"
MSG_REVERTING_ORIGINAL_UI="正在恢复官方UI..."
MSG_REVERT_COMPLETE="恢复完成，在浏览器中重新访问 http://ip:9091/ 或刷新即可查看官方UI。"
MSG_ORIGINAL_UI_IS_MISSING="官方UI不存在。"
MSG_DOWNLOADING_INSTALL_SCRIPT="正在重新下载安装脚本..."
MSG_INSTALL_SCRIPT_DOWNLOAD_COMPLETE="下载完成，请重新运行安装脚本。"
MSG_INSTALL_SCRIPT_DOWNLOAD_FAILED="安装脚本下载失败！"
MSG_NON_ROOT_USER="无法确认当前是否为 root 用户，可能无法进行安装操作。是否继续？（y/n）"
#==========================================================

# 是否自动安装
if [ "$ARG1" = "auto" ]; then
    AUTOINSTALL=1
else
    ROOT_FOLDER=$ARG1
fi

initValues() {
    # 判断临时目录是否存在，不存在则创建
    if [ ! -d "$TMP_FOLDER" ]; then
        mkdir -p "$TMP_FOLDER"
    fi

    # 获取 Transmission 目录
    getTransmissionPath

    # 判断 ROOT_FOLDER 是否为一个有效的目录，如果是则表明传递了一个有效路径
    if [ -d "$ROOT_FOLDER" ]; then
        showLog "$MSG_TR_WORK_FOLDER $ROOT_FOLDER/web"
        INSTALL_TYPE=3
        WEB_FOLDER="$ROOT_FOLDER/web"
        SKIP_SEARCH=1
    fi

    # 判断是否指定了版本
    if [ "$VERSION" != "" ]; then
        # master 或 hash
        if [ "$VERSION" = "master" -o ${#VERSION} = 40 ]; then
            PACK_NAME="$VERSION.tar.gz"
        # 是否指定了 v
        elif [ ${VERSION:0:1} = "v" ]; then
            PACK_NAME="$VERSION.tar.gz"
            VERSION=${VERSION:1}
        else
            PACK_NAME="v$VERSION.tar.gz"
        fi
        showLog "$MSG_SPECIFIED_VERSION $VERSION"

        DOWNLOAD_URL="https://github.com/ronggang/transmission-web-control/archive/$PACK_NAME"
    fi  

    if [ $SKIP_SEARCH = 0 ]; then
        # 查找目录
        findWebFolder
    fi
}

# 开始
main() {
    begin
    # 初始化值
    initValues
    # 安装
    install
    # 清理
    clear
}

# 查找Web目录
findWebFolder() {
    # 找出web ui 目录
    showLog "$MSG_SEARCHING_TR_FOLDER"

    # 判断 TRANSMISSION_WEB_HOME 环境变量是否被定义，如果是，直接用这个变量的值
    if [ $TRANSMISSION_WEB_HOME ]; then
        showLog "$MSG_USE_WEB_HOME"
        # 判断目录是否存在，如果不存在则创建 https://github.com/ronggang/transmission-web-control/issues/167
        if [ ! -d "$TRANSMISSION_WEB_HOME" ]; then
         mkdir -p "$TRANSMISSION_WEB_HOME"
      fi
        INSTALL_TYPE=2
    else
        if [ -d "$ROOT_FOLDER" -a -d "$ROOT_FOLDER/web" ]; then
            WEB_FOLDER="$ROOT_FOLDER/web"
            INSTALL_TYPE=1
            showLog "$ROOT_FOLDER/web $MSG_AVAILABLE."
        else
            showLog "$MSG_THE_SPECIFIED_DIRECTORY_DOES_NOT_EXIST"
            ROOT_FOLDER=`find / -name 'web' -type d 2&gt;/dev/null| grep 'transmission/web' | sed 's/\/web$//g'`

            if [ -d "$ROOT_FOLDER/web" ]; then
                WEB_FOLDER="$ROOT_FOLDER/web"
                INSTALL_TYPE=1
            fi
        fi
    fi
}

# 安装
install() {
    # 是否指定版本
    if [ "$VERSION" != "" ]; then
        showLog "$MSG_TRY_SPECIFIED_VERSION $VERSION"
        # 下载安装包
        download
        # 解压安装包
        unpack

        showLog "$MSG_PACK_COPYING"
        # 复制文件到
        cp -r "$TMP_FOLDER/transmission-web-control-$VERSION/src/." "$WEB_FOLDER/"
        # 设置权限
        setPermissions "$WEB_FOLDER"
        # 安装完成
        installed

    # 如果目录存在，则进行下载和更新动作
    elif [ $INSTALL_TYPE = 1 -o $INSTALL_TYPE = 3 ]; then
        # 下载安装包
        download
        # 创建web文件夹，从 20171014 之后，打包文件不包含web目录，直接打包为src下所有文件
        mkdir web

        # 解压缩包
        unpack "web"

        showLog "$MSG_PACK_COPYING"
        # 复制文件到
        cp -r web "$ROOT_FOLDER"
        # 设置权限
        setPermissions "$ROOT_FOLDER"
        # 安装完成
        installed

    elif [ $INSTALL_TYPE = 2 ]; then
        # 下载安装包
        download
        # 解压缩包
        unpack "$TRANSMISSION_WEB_HOME"
        # 设置权限
        setPermissions "$TRANSMISSION_WEB_HOME"
        # 安装完成
        installed

    else
        echo "##############################################"
        echo "#"
        echo "# $MSG_WEB_PATH_IS_MISSING"
        echo "#"
        echo "##############################################"
    fi
}

# 下载安装包
download() {
    # 切换到临时目录
    cd "$TMP_FOLDER"
    # 判断安装包文件是否已存在
    if [ -f "$PACK_NAME" ]; then
        if [ $AUTOINSTALL = 0 ]; then
            echo -n "\n$PACK_NAME $MSG_PACK_IS_EXIST"
            read flag
        else
            flag="y"
        fi

        if [ "$flag" = "y" -o "$flag" = "Y" ] ; then
            rm "$PACK_NAME"
        else
            showLog "$MSG_SIKP_DOWNLOAD"
            return 0
        fi
    fi
    showLog "$MSG_DOWNLOADING"
    echo ""
    wget "$DOWNLOAD_URL" --no-check-certificate
    # 判断是否下载成功
    if [ $? -eq 0 ]; then
        showLog "$MSG_DOWNLOAD_COMPLETE"
        return 0
    else 
        showLog "$MSG_DOWNLOAD_FAILED"
        end
        exit 1
    fi
}

# 安装完成
installed() {
    showLog "$MSG_INSTALL_COMPLETE"
}

# 输出日志
showLog() {
    TIME=`date "+%Y-%m-%d %H:%M:%S"`

    case $2 in
        "n")
            echo -n "&lt;&lt; $TIME &gt;&gt; $1" ;;
        *)
            echo "&lt;&lt; $TIME &gt;&gt; $1" ;;
    esac

}

# 解压安装包
unpack() {
    showLog "$MSG_PACK_EXTRACTING"
    if [ "$1" != "" ]; then
        tar -xzf "$PACK_NAME" -C "$1"
    else
        tar -xzf "$PACK_NAME"
    fi
    # 如果之前没有安装过，则先将原系统的文件改为
    if [ ! -f "$WEB_FOLDER/$ORG_INDEX_FILE" -a -f "$WEB_FOLDER/$INDEX_FILE" ]; then
        mv "$WEB_FOLDER/$INDEX_FILE" "$WEB_FOLDER/$ORG_INDEX_FILE"
    fi

    # 清除原来的内容
    if [ -d "$WEB_FOLDER/tr-web-control" ]; then
        rm -rf "$WEB_FOLDER/tr-web-control"
    fi
}

# 清除工作
clear() {
    showLog "$MSG_PACK_CLEANING_UP"
    if [ -f "$PACK_NAME" ]; then
        # 删除安装包
        rm "$PACK_NAME"
    fi

    if [ -d "$TMP_FOLDER" ]; then
        # 删除临时目录
        rm -rf "$TMP_FOLDER"
    fi

    showLog "$MSG_DONE"
    end
}

# 设置权限
setPermissions() {
    folder="$1"
    showLog "$MSG_SETTING_PERMISSIONS"
    # 设置权限
    find "$folder" -type d -exec chmod o+rx {} \;
    find "$folder" -type f -exec chmod o+r {} \;
}

# 开始
begin() {
    echo ""
    showLog "== $MSG_BEGIN =="
    showLog ""
}

# 结束
end() {
    showLog "== $MSG_END =="
    echo ""
}

# 显示主菜单
showMainMenu() {
    echo -n "$MSG_MAIN_MENU"
    read flag
    echo ""
    case $flag in
        1)
            getLatestReleases
            main
            ;;

        2)
            echo -n "$MSG_INPUT_VERSION"
            read VERSION
            main
            ;;

        3)
            revertOriginalUI
            ;;

        4)
            downloadInstallScript
            ;;

        5)
            checkTransmissionDaemon
            ;;

        6)
            echo -n "$MSG_INPUT_TR_FOLDER"
            read input
            if [ -d "$input/web" ]; then
                ROOT_FOLDER="$input"
                showLog "$MSG_SPECIFIED_FOLDER $input/web"
            else
                showLog "$MSG_INVALID_PATH"
            fi
            sleep 2
            showMainMenu
            ;;

        # 下载最新的代码
        9)
            echo -n "$MSG_MASTER_INSTALL_CONFIRM"
            read input
            if [ "$input" = "y" -o "$input" = "Y" ]; then
                VERSION="master"
                main
            else
                showMainMenu
            fi
            ;;
        *)
            showLog "$MSG_END"
            ;;
    esac
}

# 获取Tr所在的目录
getTransmissionPath() {
    # 指定一次当前系统的默认目录
    # 用户如知道自己的 Transmission Web 所在的目录，直接修改这个值，以避免搜索所有目录
    # ROOT_FOLDER="/usr/local/transmission/share/transmission"
    # Fedora 或 Debian 发行版的默认 ROOT_FOLDER 目录
    if [ -f "/etc/fedora-release" ] || [ -f "/etc/debian_version" ]; then
        ROOT_FOLDER="/usr/share/transmission"
    fi

    if [ ! -d "$ROOT_FOLDER" ]; then
        showLog "$MSG_FIND_WEB_FOLDER_FROM_PROCESS" "n"
        infos=`ps -ef | awk '/[t]ransmission-da/{print $8}'`
        if [ "$infos" != "" ]; then
            echo " √"
            search="bin/transmission-daemon"
            replace="share/transmission"
            path=${infos//$search/$replace}
            if [ -d "$path" ]; then
                ROOT_FOLDER=$path
            fi
        else
            echo "$MSG_FIND_WEB_FOLDER_FROM_PROCESS_FAILED"
        fi
    fi
}

# 获取最后的发布版本号
# 因在源码库里提交二进制文件不便于管理，以后将使用这种方式获取最新发布的版本
getLatestReleases() {
    VERSION=`wget -O - https://api.github.com/repos/ronggang/transmission-web-control/releases/latest | grep tag_name | head -n 1 | cut -d '"' -f 4`
}

# 检测 Transmission 进程是否存在
checkTransmissionDaemon() {
    showLog "$MSG_CHECK_TR_DAEMON"
    ps -C transmission-daemon
    if [ $? -ne 0 ]; then
        showLog "$MSG_CHECK_TR_DAEMON_FAILED"
        echo -n "$MSG_TRY_START_TR"
        read input
        if [ "$input" = "y" -o "$input" = "Y" ] ; then
            service transmission-daemon start
        fi
    else
        showLog "$MSG_TR_DAEMON_IS_STARTED"
    fi
    sleep 2
    showMainMenu
}

# 恢复官方UI
revertOriginalUI() {
    initValues
    # 判断是否有官方的UI存在
    if [ -f "$WEB_FOLDER/$ORG_INDEX_FILE" ]; then
        showLog "$MSG_REVERTING_ORIGINAL_UI"
        # 清除原来的内容
        if [ -d "$WEB_FOLDER/tr-web-control" ]; then
            rm -rf "$WEB_FOLDER/tr-web-control"
            rm "$WEB_FOLDER/favicon.ico"
            rm "$WEB_FOLDER/index.html"
            rm "$WEB_FOLDER/index.mobile.html"
            mv "$WEB_FOLDER/$ORG_INDEX_FILE" "$WEB_FOLDER/$INDEX_FILE"
            showLog "$MSG_REVERT_COMPLETE"
        else
            showLog "$MSG_WEB_PATH_IS_MISSING"
            sleep 2
            showMainMenu
        fi
    else
        showLog "$MSG_ORIGINAL_UI_IS_MISSING"
        sleep 2
        showMainMenu
    fi
}

# 重新下载安装脚本
downloadInstallScript() {
    if [ -f "$SCRIPT_NAME" ]; then
        rm "$SCRIPT_NAME"
    fi
    showLog "$MSG_DOWNLOADING_INSTALL_SCRIPT"
    wget "https://github.com/ronggang/transmission-web-control/raw/master/release/$SCRIPT_NAME" --no-check-certificate
    # 判断是否下载成功
    if [ $? -eq 0 ]; then
        showLog "$MSG_INSTALL_SCRIPT_DOWNLOAD_COMPLETE"
    else 
        showLog "$MSG_INSTALL_SCRIPT_DOWNLOAD_FAILED"
        sleep 2
        showMainMenu
    fi
}

if [ "$USER" != 'root' ]; then
    showLog "$MSG_NON_ROOT_USER" "n"
    read input
    if [ "$input" = "n" -o "$input" = "N" ]; then
        exit -1
    fi
fi

if [ $AUTOINSTALL = 1 ]; then
    getLatestReleases
    main
else
    # 执行
    showMainMenu
fi
</code></pre>]]></description><guid isPermaLink="false">/archives/synology-transmission-webui</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2F20220105013209490.png%21water&amp;size=m" type="image/jpeg" length="24842"/><category>技巧</category><category>分享</category><pubDate>Wed, 5 Jan 2022 02:19:00 GMT</pubDate></item><item><title><![CDATA[群晖 docker 部署思源笔记]]></title><link>https://wuqishi.com/archives/synology-docker-siyuan</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%BE%A4%E6%99%96%20docker%20%E9%83%A8%E7%BD%B2%E6%80%9D%E6%BA%90%E7%AC%94%E8%AE%B0&amp;url=/archives/synology-docker-siyuan" width="1" height="1" alt="" style="opacity:0;">
<h2 id="一-准备工作">一、准备工作</h2>
<p>打开 File Station，在 Docker 目录下手动新建文件夹，文件夹名：<code>siyuan</code>。</p>
<h2 id="二-下载镜像">二、下载镜像</h2>
<ol>
 <li>在群辉 docker 中“注册表”搜索 <code>siyuan</code> 或 <code>b3log/siyuan</code> 下载镜像。</li>
 <li>使用命令行拉取镜像：<code>docker pull b3log/siyuan</code>。</li>
</ol>
<h2 id="三-目录映射及启动命令">三、目录映射及启动命令</h2>
<p>启动参数：</p>
<ul>
 <li><code>-resident</code> 指定为 true，为常驻内存；</li>
 <li><code>-workspace</code> 指定工作空间文件夹路径。</li>
</ul>
<p>具体配置如下：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2Fimage-20210910140159-w7sfhhy1.png%21water&amp;size=m" alt="配置图"></p>
<h2 id="四-容器端口映射">四、容器端口映射</h2>
<p>使用默认端口 6806</p>
<h2 id="五-其他">五、其他</h2>
<p>为了方便重启群晖或容器意外关闭后思源笔记能够及时运行，可以勾选对应容器“高级设置”里面“自动重启”的选项，需要在容器停止状态下修改。</p>
<h3 id="六-命令">六、命令</h3>
<ol>
 <li>拉取镜像</li>
</ol>
<pre><code class="language-bash">docker run -v /volume4/docker/siyuan:/siyuan -p 6806:6806 b3log/siyuan -workspace /siyuan/
</code></pre>
<ol start="2">
 <li>部署镜像
  <pre><code class="language-bash">docker run -v /volume4/docker/siyuan:/siyuan -p 6806:6806 -u 1000:1000 b3log/siyuan --workspace=/siyuan/
</code></pre></li>
</ol>
<p>PS：冒号后面的 <code>/siyuan</code> 是通过后面的启动参数 <code>--workspace=/siyuan/</code> 指定的镜像里的笔记存储位置，如果不用 <code>--workspace</code> 参数指定，默认就是 <code>/root/Documents/SiYuan</code>。</p>
<p>为了解决群晖用户的需求，修改了 docker 镜像的权限，锁死必须用用户 siyuan（uid/gid：1000:1000）运行，而以前的 docker 都是通过 root 运行，从而造成更新后因为权限问题无法启动 siyuan</p>
<p>解决办法：</p>
<ol>
 <li>修改命令
  <br>
  docker：在原命令上加上 <code>-u 1000:1000</code>
  <br>
  docker-compose：增加一行 <code>user: "siyuan"</code></li>
 <li>对宿主机的数据文件夹赋予 1000:1000 权限，<code>chown -R 1000:1000 /volume4/docker/siyuan/</code></li>
 <li>重启 docker
  <br>
  今天发现思源笔记启动不了，报错：</li>
</ol>
<p><code>The access authorization code command line parameter (--accessAuthCode) must be set when deploying via Docker.</code></p>
<p>真无语，思源docker版真的太折腾了。</p>
<p>需要添加<code>--accessAuthCode=XXX</code></p>
<p>完整docker搭建命令：</p>
<pre><code class="language-docker">docker run -v /volume4/docker/siyuan:/siyuan -p 6806:6806 -u 1000:1000 b3log/siyuan --workspace=/siyuan/ --accessAuthCode=520
</code></pre>
<p>update 2024年11月15日"]又遇到docker权限问题，无奈啊，以下是最新的搭建代码：</p>
<pre><code class="language-docker">docker run -v /volume4/docker/siyuan:/siyuan -p 6806:6806 -e PUID=1001 -e PGID=1002 b3log/siyuan --workspace=/siyuan/ --accessAuthCode=520
</code></pre>]]></description><guid isPermaLink="false">/archives/synology-docker-siyuan</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2022%2F01%2Fimage-20210910140159-w7sfhhy1.png%21water&amp;size=m" type="image/jpeg" length="71334"/><category>技巧</category><category>分享</category><pubDate>Tue, 4 Jan 2022 09:43:00 GMT</pubDate></item><item><title><![CDATA[Office for Mac 2019 License Installer]]></title><link>https://wuqishi.com/archives/office-for-mac-2019-license-installer</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Office%20for%20Mac%202019%20License%20Installer&amp;url=/archives/office-for-mac-2019-license-installer" width="1" height="1" alt="" style="opacity:0;">
<p style="line-height: 1.7em">This is a tool for activating your Mac version of Office 2019.</p>
<p style="line-height: 1.7em">If you downloaded the genuine Mac Office 2019 just like me, but you didn’t include an activation tool in it.</p>
<p style="line-height: 1.7em">Or if you used the TimeMachine to restore the application and lost the activation information, then this tool is right for you.</p>
<p style="line-height: 1.7em">I have provided the activation tool for this software separately, so you do not need to download the complete installation package + activation tool again.</p>
<p style="line-height: 1.7em">This tool is collected on the internet. If infringe your rights, please contact me. I will delete it.</p>
<p style="line-height: 1.7em"><strong>Resource Name</strong>: Office for Mac 2019 License Installer</p>
<download-links data-links="[{&quot;url&quot;:&quot;https://ssslove.lanzouw.com/io4h6etd23g&quot;,&quot;filename&quot;:&quot;Office for Mac 2019 License Installer&quot;,&quot;source&quot;:&quot;蓝奏云网盘&quot;,&quot;code&quot;:&quot;ddzj&quot;,&quot;icon&quot;:&quot;/plugins/download-links/assets/static/icon/lanzou.png&quot;}]"></download-links>
<p style="line-height: 1.7em"><strong>Some More:</strong></p>
<p style="line-height: 1.7em">Need Office for Mac 2016 License Installer ? Please click the link.</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/archives/office-for-mac-2016-license-installer" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;"><a href="https://wuqishi.com/archives/office-for-mac-2016-license-installer" target="_blank">https://wuqishi.com/archives/office-for-mac-2016-license-installer</a></hyperlink-card>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/office-for-mac-2019-license-installer</guid><dc:creator>吴蛋蛋</dc:creator><category>滚蛋</category><pubDate>Tue, 21 Jul 2020 00:09:00 GMT</pubDate></item><item><title><![CDATA[公众号通过api发送小程序消息]]></title><link>https://wuqishi.com/archives/wechat-xiaochengxu</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%85%AC%E4%BC%97%E5%8F%B7%E9%80%9A%E8%BF%87api%E5%8F%91%E9%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%B6%88%E6%81%AF&amp;url=/archives/wechat-xiaochengxu" width="1" height="1" alt="" style="opacity:0;">
<p><strong>接口调用请求说明:</strong></p>
<ol>
 <li><strong>http请求方式: POST</strong></li>
 <li><code>https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN</code></li>
</ol>
<h2 id="heading">发送普通消息的小程序链接</h2>
<pre><code>{"touser":"OPENID","msgtype":"text","text":{"content":"文本内容**[点击跳小程序](http://www.qq.com)"}}
</code></pre>
<h2 id="heading-1">说明</h2>
<ol>
 <li>data-miniprogram-appid 项，填写小程序appid，则表示该链接跳小程序；</li>
 <li>data-miniprogram-path项，填写小程序路径，路径与app.json中保持一致，可带参数；</li>
 <li>对于不支持data-miniprogram-appid 项的客户端版本，如果有herf项，则仍然保持跳href中的网页链接；</li>
 <li>data-miniprogram-appid对应的小程序必须与公众号有绑定关系</li>
</ol>
<p>返回结果
 <br>
 {“errcode”:0,“errmsg”:“ok”}
 <br>
 发送效果
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F267536246.png%21water&amp;size=m" alt="普通消息的小程序链接发送效果"></p>
<h2 id="heading-2">公众号推送小程序卡片</h2>
<pre><code>{"touser":"OPENID","msgtype":"miniprogrampage","miniprogrampage":{"title":"title","appid":"appid","pagepath":"pagepath","thumb_media_id":"thumb_media_id"}}
</code></pre>
<p>返回结果</p>
<p><code>{"errcode":0,"errmsg":"ok"}</code></p>
<p>发送效果</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F1410377197.png%21water&amp;size=m" alt="公众号推送小程序卡片发送效果"></p>
<h2 id="heading-3">参考文档</h2>
<p>公众号技术文档：<a href="https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140547">https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp1421140547</a></p>]]></description><guid isPermaLink="false">/archives/wechat-xiaochengxu</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2023%2F02%2F267536246.png%21water&amp;size=m" type="image/jpeg" length="16776"/><category>分享</category><pubDate>Tue, 27 Aug 2019 02:29:00 GMT</pubDate></item><item><title><![CDATA[Windows 10下 iTunes 备份默认存储路径修改]]></title><link>https://wuqishi.com/archives/windows-10xia-itunes-beifenmorencunchulujingxiugai</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Windows%2010%E4%B8%8B%20iTunes%20%E5%A4%87%E4%BB%BD%E9%BB%98%E8%AE%A4%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84%E4%BF%AE%E6%94%B9&amp;url=/archives/windows-10xia-itunes-beifenmorencunchulujingxiugai" width="1" height="1" alt="" style="opacity:0;">
<p>今早在恢复iPhone手机备份的时候一直恢复不成功，研究后才发现是因为C盘的空间不够了。于是想把iTunes的默认存储路径修改一下，发现与Windows 7不同，Windows的路径变了。</p>
<p>Windows 7的路径为：</p>
<blockquote>
 <p>C:\Users\你的用户名\AppData\Roaming\Apple Computer\MobileSync</p>
</blockquote>
<p>Windows 10的路径为：</p>
<blockquote>
 <p>C:\Users\你的用户名\Apple\MobileSync\Backup</p>
</blockquote>
<p>找到路径，后面的事情就好办了，使用mklink/j命令即可。</p>
<p>首先WIN+R打开运行，输入CMD进入命令行模式。</p>
<p><code>mklink/j "C:\Users\Eric\Apple\MobileSync" "E:\MyiPhoneBackup"</code></p>
<p>此时再打开Itunes默认备份路径："C:\Users\用户\Apple”即可发现新建立的文件夹MobileSync且文件夹图标上有快捷方式标志，证明文件夹连接成功。</p>
<p>2019.11.28更新：</p>
<p>今天安装了iTunes企业版，备份后发现在Windows 10中的备份路径变了，新的备份路径为：</p>
<blockquote>
 <p>C:\Users\Eric\AppData\Roaming\Apple Computer\MobileSync\Backup</p>
</blockquote>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2019%2F09%2FEric-2019-09-06_130924.png%21water&amp;size=m" alt="快捷方式"></p>
<hr>
<p>注意事项：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2019%2F09%2FEric-2019-09-06_131109.png%21wwater&amp;size=m" alt="报错"></p>
<p>如果出现上面情况，说明你并未将MobileSync删除，如果你当心已经备份的资料，最简单的办法就是讲原文件夹改名，比如MobileSync1。</p>]]></description><guid isPermaLink="false">/archives/windows-10xia-itunes-beifenmorencunchulujingxiugai</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2019%2F09%2FEric-2019-09-06_130924.png%21water&amp;size=m" type="image/jpeg" length="13006"/><category>技巧</category><pubDate>Tue, 27 Aug 2019 02:29:00 GMT</pubDate></item><item><title><![CDATA[Excel查找返回多个值，并将返回的值放在同一个单元格里面]]></title><link>https://wuqishi.com/archives/excel-chazhao-fanhui-duogezhi</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Excel%E6%9F%A5%E6%89%BE%E8%BF%94%E5%9B%9E%E5%A4%9A%E4%B8%AA%E5%80%BC%EF%BC%8C%E5%B9%B6%E5%B0%86%E8%BF%94%E5%9B%9E%E7%9A%84%E5%80%BC%E6%94%BE%E5%9C%A8%E5%90%8C%E4%B8%80%E4%B8%AA%E5%8D%95%E5%85%83%E6%A0%BC%E9%87%8C%E9%9D%A2&amp;url=/archives/excel-chazhao-fanhui-duogezhi" width="1" height="1" alt="" style="opacity:0;">
<p>用VBA编一个自定义函数进行处理。</p>
<p>1、打开Excel文件，按“Alt F11”打开VBA编辑窗口，然后在左侧空白处点击右键，“插入”，“模块”。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2019%2F05%2Fcb8065380cd791236dacccc0ae345982b2b78032.jpg%21water&amp;size=m" alt="Excel查找返回多个值，并将返回的值放在同一个单元格里面"></p>
<p>2、右侧空白处粘贴下面的代码：</p>
<pre><code class="language-vb">Function HeBing(rng1 As Range, s As String, rng2 As Range, f As String) As String
Dim Arr1, Arr2
Dim r As Long
r = rng1.End(xlDown).Row - rng1.Row + 1
Arr1 = rng1.Resize(r, 1): Arr2 = rng2.Resize(r, 1)
Dim i As Long
For i = 1 To UBound(Arr1)
If Arr1(i, 1) = s Then
If HeBing = "" Then HeBing = Arr2(i, 1) Else HeBing = HeBing &amp; f &amp; Arr2(i, 1)
End If
Next
End Function
</code></pre>
<p>3、用法：</p>
<blockquote>
 <p>=HEBING(在哪里查找，查找什么，返回对应的什么数据，在单元格内用什么隔开)</p>
 <p>eg：=hebing(A:A,C1,B:B,",")</p>
</blockquote>]]></description><guid isPermaLink="false">/archives/excel-chazhao-fanhui-duogezhi</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2019%2F05%2Fcb8065380cd791236dacccc0ae345982b2b78032.jpg%21water&amp;size=m" type="image/jpeg" length="20490"/><category>技巧</category><pubDate>Thu, 9 May 2019 09:42:00 GMT</pubDate></item><item><title><![CDATA[七牛云测试域名失效后如何下载空间中的文件]]></title><link>https://wuqishi.com/archives/qiniuyun-download-files</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E4%B8%83%E7%89%9B%E4%BA%91%E6%B5%8B%E8%AF%95%E5%9F%9F%E5%90%8D%E5%A4%B1%E6%95%88%E5%90%8E%E5%A6%82%E4%BD%95%E4%B8%8B%E8%BD%BD%E7%A9%BA%E9%97%B4%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6&amp;url=/archives/qiniuyun-download-files" width="1" height="1" alt="" style="opacity:0;">
<p>前段时间一直收到七牛云回收测试域名的邮件，由于比较忙一直没有时间搭理。结果在回过神来的时候发现外链统统失效了，并且还不能下载。</p>
<p>在查阅了相关资料时发现有qshell和qrsctl两种办法，因为不想再申请七牛云的空间了，所以选择了使用qrsctl下载七牛云空间中的文件。</p>
<p>首先下载<a href="https://developer.qiniu.com/kodo/tools/1300/qrsctl">qrsctl</a>这个工具，我使用的是Mac电脑所以下载Mac版本的。</p>
<p>下载后的文件将其改名为qrsctl，<code>chmod +x qrsctl</code> 赋予可执行权限。直接在terminal中运行<code>./qrsctl</code>会出现相应说明文档，如下图：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2Fqrsctl-shuoming.jpg%21wwater&amp;size=m" alt="说明文档"></p>
<p>按照下面的指令，输入自己七牛云的账号和密码登录，这个登陆的有效期是3600秒，就是一个小时。</p>
<p><code>./qrstcl login &lt;your username&gt; &lt;your password&gt;</code></p>
<p>接下来，我们列出我们所有的空间（buckets）：</p>
<p><code>./qrsctl buckets</code></p>
<p>可以看到，我有三个bucket：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2Fsee-buckets.jpg%21wwater&amp;size=m" alt="所有空间"></p>
<p>不放心，登陆七牛云后台看一下：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2Fsee-buckets2.jpg%21water&amp;size=m" alt="七牛云后台结果"></p>
<p>匹配上了！现在看看我这个outmusic下有哪些文件：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2Fbucket-neirong.jpg%21water&amp;size=m" alt="outmusic下的文件"></p>
<p>OK，现在我们通过命令行看看是否匹配：</p>
<p><code>./qrsctl listprefix outmusic ''</code></p>
<p>注意：最后是两个英文单引号。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2Fbuckets-neirong.jpg%21wwater&amp;size=m" alt="终端结果"></p>
<p>显示的内容跟七牛云网页端的是一样的，当然要注意第一行是七牛云自带的一个标志字符串"marker:"。</p>
<p>得到图片名后，可以通过七牛云的如下命令下载一个文件。</p>
<p>qrsctl get <!-- raw HTML omitted --> <!-- raw HTML omitted --> <!-- raw HTML omitted --></p>
<p>eg：</p>
<p>./qrsctl get outmusic yongqi.mp3 ./yongqi.mp3</p>
<p>就可以将outmusic中的yongqi.mp3下载到电脑当前路径下，保存成的yongqi.mp3，当然也可以改成其他名字。</p>
<p>以上几步综合起来，我们就可以通过批处理把所有内容下载到本地了。</p>
<pre><code class="language-bash">#!/bin/bash
files=`./qrsctl listprefix outmusic ''`
i=0
echo $files | tr " " "\n" | while read line
do
if(($i&gt;0))
then
echo $line
./qrsctl get outmusic $line ./$line
fi
i=$(($i+1))
done
</code></pre>
<p>把以上的代码保存成.sh文件，比如down.sh。在终端里赋权后运行，就可以批量下载了。</p>
<p>Linux也可以参考这个的脚本代码，但是Windows不行，这个脚本是sh文件，Windows下不能直接执行，还是想其他办法执行吧。</p>]]></description><guid isPermaLink="false">/archives/qiniuyun-download-files</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2Fqrsctl-shuoming.jpg%21wwater&amp;size=m" type="image/jpeg" length="65862"/><category>技巧</category><pubDate>Fri, 9 Nov 2018 00:00:00 GMT</pubDate></item><item><title><![CDATA[入手三星860 evo 500g SSD固态硬盘]]></title><link>https://wuqishi.com/archives/buy-sansung860-evo-500g-ssd</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%85%A5%E6%89%8B%E4%B8%89%E6%98%9F860%20evo%20500g%20SSD%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98&amp;url=/archives/buy-sansung860-evo-500g-ssd" width="1" height="1" alt="" style="opacity:0;">
<p>家里有一台2011年中的Mac mini，内存以前弄了6G，机械硬盘。因为升级到MacOS新版，甚至现在升级到了10.13.6版本，老机子在新版本下本来就卡，更何况机械硬盘，于是就趁着今年这波双11固态硬盘跳水之际想入手一块固态硬盘。</p>
<p>选了好久，综合看了各个地方的文章，最后咬牙入手了三丧的860 evo SSD 500g版本。</p>
<p>拆机什么的就不说了，晚上一堆教程，换上SSD之后的机子简直丧心病狂，流畅地不要不要的。以前的各种卡顿完全木有了。就是安装双系统有点麻烦，重新弄了一遍又一遍，目前搞定了。</p>
<p>下面是高清大图，请欣赏。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FIMG_0299.jpg%21wwater&amp;size=m" alt="IMG_0299.jpg"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FIMG_0300.jpg%21wwater&amp;size=m" alt="IMG_0300.jpg"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FIMG_0301.jpg%21wwater&amp;size=m" alt="IMG_0301.jpg"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FIMG_0302.jpg%21wwater&amp;size=m" alt="IMG_0302.jpg"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FIMG_0303.jpg%21wwater&amp;size=m" alt="IMG_0303.jpg"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FIMG_0304.jpg%21wwater&amp;size=m" alt="IMG_0304.jpg"></p>
<p>最后，当然是随大流来一个AS测速了。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FSSD-Testspeed.jpg%21water&amp;size=m" alt="SSD-Testspeed.jpg"></p>
<p>以上图是第一次测速的成绩，后面几个测速才1300+，也不知道正不正常。 说一下个人意见和建议：</p>
<ol>
 <li>老机子又不想换新的时候，请上SSD，你会有非一般的感觉。</li>
 <li>如果你配新机子，别用SATA接口的了，直接上M.2甚至PCI-E的。</li>
 <li>每个接口都有特点，都为了满足相应的需求。作为消费者的我们，在选购的时候，要切实的根据自己的使用需求，购买力，承受能力，选择合适的接口类型，同时选择大牌子、口碑好、售后好的产品，以及靠谱的购买途径，运行时做好散热工作。</li>
</ol>]]></description><guid isPermaLink="false">/archives/buy-sansung860-evo-500g-ssd</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F11%2FIMG_0299.jpg%21wwater&amp;size=m" type="image/jpeg" length="395970"/><category>滚蛋</category><pubDate>Tue, 6 Nov 2018 00:46:00 GMT</pubDate></item><item><title><![CDATA[分享一套耐看的鼠标指针]]></title><link>https://wuqishi.com/archives/mouse-pointer</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%88%86%E4%BA%AB%E4%B8%80%E5%A5%97%E8%80%90%E7%9C%8B%E7%9A%84%E9%BC%A0%E6%A0%87%E6%8C%87%E9%92%88&amp;url=/archives/mouse-pointer" width="1" height="1" alt="" style="opacity:0;">
<p>Windows自带的鼠标指针，如果不去注意，用着也就用着了，没去想的时候也觉得没什么。</p>
<p>今天突然之间觉得还是换一个鼠标指针吧，不能太花哨，不然用着注意力都被吸引了。网上找了挺久的，终于看到这款鼠标指针了，很耐看，又与Windows自带的不同。</p>
<h2 id="heading">鼠标指针预览图</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Ff4349a8a346b31600296d64fd37d65f1.png%21water&amp;size=m" alt="鼠标指针预览图"></p>
<h2 id="heading-1">右键安装鼠标指针</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F79b29632a04b527968449fee388a625a.png%21water&amp;size=m" alt="右键安装鼠标指针"></p>
<h2 id="heading-2">选择鼠标指针方案</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F103d14dba14582a5c678f7d7fd40d891.png%21water&amp;size=m" alt="选择鼠标指针方案"></p>]]></description><guid isPermaLink="false">/archives/mouse-pointer</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Ff4349a8a346b31600296d64fd37d65f1.png%21water&amp;size=m" type="image/jpeg" length="11576"/><category>分享</category><pubDate>Wed, 12 Sep 2018 02:04:00 GMT</pubDate></item><item><title><![CDATA[如何重置OmniFocus数据库]]></title><link>https://wuqishi.com/archives/how-to-reset-omnifocus-database</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%A6%82%E4%BD%95%E9%87%8D%E7%BD%AEOmniFocus%E6%95%B0%E6%8D%AE%E5%BA%93&amp;url=/archives/how-to-reset-omnifocus-database" width="1" height="1" alt="" style="opacity:0;">
<p>很久以前尝试使用Omnifocus 2后放弃了，在摸索试用时也留下了一些不必要的无用数据，这些都被同步到OmniFocus的服务器上去了，所以再次使用时想去重置数据库。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F486e06530602eb539f403cdf2e7148ad.jpg%21wwater&amp;size=m" alt="OmniFocus"></p>
<h2 id="heading">方法来源</h2>
<p>方法主要来自于<strong>OmniGroup</strong>，英文好的可以直接去看原文。</p>
<h2 id="mac">在Mac上重置数据库</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fb6938631e20d51c3af6b15fcc1e96c4f.jpg%21wwater&amp;size=m" alt="img"></p>
<p>方法步骤：</p>
<ol>
 <li>在OmniFocus中点击<em>文件</em>菜单，选择<em>显示备份</em>。</li>
 <li>在Finder中前往上层文件夹（Command ↑）。</li>
 <li>退出OmniFocus。</li>
 <li>删除OmniFocus.ofocus（或者移到其他位置，我将这里面的文件全部删除了）。</li>
 <li>打开OmniFocus，进入首次启动引导页面。</li>
 <li>选择在Mac上储存数据，创建一个全新的数据库。</li>
 <li><em>「将教学课程项目添加到数据库</em>选项随意，然后点击紫色按钮完成。</li>
 <li>打开OmniFocus菜单栏中的<em>偏好设置</em>，切换到<em>同步</em>，输入账户名称后退出<em>偏好设置</em>。这里别点<em>同步</em>按钮，如果收到同步提示就点取消。</li>
 <li>打开OmniFocus菜单中的<em>文件</em>，选择<em>更换服务器数据库…</em>，将空白的本地数据库上传到服务器。</li>
 <li>其他设备中选择<em>保留同步数据库</em>，就可以从服务器下载空白数据库了。</li>
</ol>]]></description><guid isPermaLink="false">/archives/how-to-reset-omnifocus-database</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F486e06530602eb539f403cdf2e7148ad.jpg%21wwater&amp;size=m" type="image/jpeg" length="13018"/><category>技巧</category><pubDate>Tue, 17 Apr 2018 07:01:00 GMT</pubDate></item><item><title><![CDATA[Office for Mac 2016 License Installer]]></title><link>https://wuqishi.com/archives/office-for-mac-2016-license-installer</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Office%20for%20Mac%202016%20License%20Installer&amp;url=/archives/office-for-mac-2016-license-installer" width="1" height="1" alt="" style="opacity:0;">
<p>This is a tool for activating your Mac version of Office 2016.</p>
<p>If you downloaded the genuine Mac Office 2016 just like me, but you didn't include an activation tool in it.</p>
<p>Or if you used the TimeMachine to restore the application and lost the activation information, then this tool is right for you.</p>
<p>I have provided the activation tool for this software separately, so you do not need to download the complete installation package + activation tool again.</p>
<p>This tool is collected on the internet. If infringe your rights, please contact me. I will delete it.</p>
<details>
 <summary>Update:2020.07.20:</summary>
 <p>Just deleted!</p>
 <p>Need Office for Mac 2019 License Installer ?
  <del>Coming soon.</del>
  Please click the link.</p>
 <hyperlink-card href="https://wuqishi.com/archives/office-for-mac-2019-license-installer" target="_blank" theme="regular"></hyperlink-card>
</details>]]></description><guid isPermaLink="false">/archives/office-for-mac-2016-license-installer</guid><dc:creator>吴蛋蛋</dc:creator><category>分享</category><pubDate>Thu, 12 Apr 2018 07:44:00 GMT</pubDate></item><item><title><![CDATA[Mac下配置终端+iTerm 2主题]]></title><link>https://wuqishi.com/archives/mac-zhong-duan-iterm-2</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Mac%E4%B8%8B%E9%85%8D%E7%BD%AE%E7%BB%88%E7%AB%AF%2BiTerm%202%E4%B8%BB%E9%A2%98&amp;url=/archives/mac-zhong-duan-iterm-2" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p>采用iTerm2 oh-my-zsh solarized 配色方案</p>
</blockquote>
<p>最近重新开启我闲置已久的Mac mini，更新到最新版10.13.4，于是在安装Homebrew时决定配置了一下终端，使其看起来更美观。</p>
<h2 id="heading">最终效果</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2018-04-08-ITerm2-final-effect-1-3.png%21wwater&amp;size=m" alt="Mac下配置终端+iTerm 2主题"></p>
<blockquote>
 <p>拥有语法高亮，命令行tab补全，自动提示符，显示Git仓库状态等功能。</p>
</blockquote>
<hr>
<h2 id="homebrew">首先安装Homebrew</h2>
<pre><code class="language-bash">/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
</code></pre>
<h4 id="iterm">安装iTerm</h4>
<p>首先我们下载的 iTerm2 这个软件，比Mac自带的终端更加强大。直接<a href="http://iterm2.com/">官网</a>下载并安装即可。</p>
<h4 id="heading-1">设置默认终端</h4>
<p>将iTem2设置为默认终端（可选）：</p>
<blockquote>
 <p>（菜单栏）iTerm2 -&gt; Make iTerm2 Default Term</p>
</blockquote>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2018-04-08-1110743-20170617160006728-2115137217-1.png%21water&amp;size=m" alt="Mac下配置终端+iTerm 2主题"></p>
<p>然后打开偏好设置preference，选中Keys，勾选Hotkey下的Show/hide iTerm2 with a system-wide hotkey，将热键设置为command . ，这样你就可以通过command . 全局热键来打开或关闭iTerm2窗口，非常方便。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2018-04-08-1110743-20170617161612993-674443833-1.png%21water&amp;size=m" alt="Mac下配置终端+iTerm 2主题"></p>
<h4 id="heading-2">配色方案</h4>
<p>我选用的是 <a href="http://ethanschoonover.com/solarized">solarized</a>，效果还不错。点开官网，下载，解压，然后打开 iTerm2 下的偏好设置 preference ，点开 profiles 下的colors 选项，点击右下角的 Color Presets 选项，选择import ，导入解压到的 solarized 文件下的Solarized Dark.itermcolors。</p>
<h4 id="oh-my-zsh">安装oh-my-zsh</h4>
<p>github链接：https://github.com/robbyrussell/oh-my-zsh</p>
<p>使用 crul 安装：</p>
<pre><code class="language-bash">sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
</code></pre>
<p>或使用wget：</p>
<pre><code class="language-bash">sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
</code></pre>
<h4 id="heading-3">安装主题</h4>
<p>安装成功后，用vim打开隐藏文件.zshrc ，修改主题为agnoster:</p>
<pre><code class="language-bash">ZSH_THEME="agnoster"
</code></pre>
<p>应用这个主题需要特殊的字体支持，否则会出现乱码情况，这时我们来配置字体：</p>
<ol>
 <li>使用 [Meslo](<a href="https://github.com/powerline/fonts/blob/master/Meslo">https://github.com/powerline/fonts/blob/master/Meslo</a> Slashed/Meslo LG M Regular for Powerline.ttf) 字体，点开连接点击 view raw 下载字体。</li>
 <li>安装字体到系统字体册。</li>
 <li>应用字体到iTerm2下，我将字号设置为14px，看着舒服（iTerm -&gt; Preferences -&gt; Profiles -&gt; Text -&gt; Change Font）。</li>
 <li>重新打开iTerm2窗口，这时便可以看到效果了。</li>
</ol>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2018-04-08-1110743-20170617164554665-1752420175.png%21water&amp;size=m" alt="Mac下配置终端+iTerm 2主题"></p>
<p>到这步我们的终端看上去已经非常好看了，这时我们来安装其它插件，让终端看起来更加风骚。</p>
<p>如果要跟我的效果一样，那么要另外刚装<a href="https://github.com/jeremyFreeAgent/oh-my-zsh-powerline-theme">powerline风格</a>的主题。</p>
<h4 id="heading-4">自动提示命令</h4>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2018-04-08-1110743-20170617164718525-2039430459.png&amp;size=m" alt="Mac下配置终端+iTerm 2主题"></p>
<p>当我们输入命令时，终端会自动提示你接下来可能要输入的命令，这时按 → 便可输出这些命令，非常方便。</p>
<p>设置如下：</p>
<ol>
 <li>克隆仓库到本地 <code>~/.oh-my-zsh/custom/plugins</code> 路径下</li>
</ol>
<pre><code class="language-bash">git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
</code></pre>
<ol start="2">
 <li>用 vim 打开.zshrc 文件，找到插件设置命令，默认是 plugins=(git) ，我们把它修改为：</li>
</ol>
<pre><code class="language-bash">plugins=(zsh-autosuggestions git)
</code></pre>
<ol start="3">
 <li>重新打开终端窗口。</li>
</ol>
<h4 id="heading-5">语法高亮</h4>
<ol>
 <li>使用homebrew安装 zsh-syntax-highlighting 插件。</li>
</ol>
<pre><code class="language-bash">brew install zsh-syntax-highlighting
</code></pre>
<ol start="2">
 <li>配置.zshrc文件，插入一行。</li>
</ol>
<pre><code class="language-bash">source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
</code></pre>
<ol start="3">
 <li>输入命令。</li>
</ol>
<pre><code class="language-bash">source ~/.zshrc
</code></pre>
<p>完成。</p>]]></description><guid isPermaLink="false">/archives/mac-zhong-duan-iterm-2</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2018-04-08-ITerm2-final-effect-1-3.png%21wwater&amp;size=m" type="image/jpeg" length="20528"/><category>技巧</category><pubDate>Sun, 8 Apr 2018 10:01:00 GMT</pubDate></item><item><title><![CDATA[如何制作苹果系统安装U盘]]></title><link>https://wuqishi.com/archives/how-to-make-mac-u-disk</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%A6%82%E4%BD%95%E5%88%B6%E4%BD%9C%E8%8B%B9%E6%9E%9C%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85U%E7%9B%98&amp;url=/archives/how-to-make-mac-u-disk" width="1" height="1" alt="" style="opacity:0;">
<h2 id="准备工作">准备工作</h2>
<ul>
 <li>一个8G或者以上的U盘</li>
 <li>从App Store下载好系统镜像</li>
</ul>
<h2 id="根据以下图片一步步操作">根据以下图片一步步操作</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fmodiao.png%21water.jpg%21water&amp;size=m" alt="抹掉"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fdakaizhongduan.png%21water.jpg%21water&amp;size=m" alt="输入sudo"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fxianshibaoneirong.png%21water.jpg%21water&amp;size=m" alt="右键-显示包内容"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fzhaodaowenjian.png%21water.jpg%21water&amp;size=m" alt="依次打开"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Ftuojinzhongduan.png%21water.jpg%21water&amp;size=m" alt="拖进终端"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fvolume.png%21water.jpg%21water&amp;size=m" alt="输入 --volume"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Ftuoruupan.png%21water.jpg%21water&amp;size=m" alt="拖入U盘"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fapplicationpath.png%21water.jpg%21water&amp;size=m" alt="输入 --applicationpath"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Ftuorujingxiang.png%21water.jpg%21water&amp;size=m" alt="拖入镜像"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fnointeraction.png%21water.jpg%21water&amp;size=m" alt="输入 --nointeraction"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fshurumima.png%21water.jpg%21water&amp;size=m" alt="输入密码"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fdengdaiwancheng.png%21water.jpg%21water&amp;size=m" alt="完成图示"></p>]]></description><guid isPermaLink="false">/archives/how-to-make-mac-u-disk</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F04%2Fmodiao.png%21water.jpg%21water&amp;size=m" type="image/jpeg" length="10932"/><category>技巧</category><pubDate>Wed, 4 Apr 2018 04:05:00 GMT</pubDate></item><item><title><![CDATA[LNMP部署typecho，开启SSL、强制开启https]]></title><link>https://wuqishi.com/archives/typecho-lnmp-deployment-open-ssl-mandatory-https</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=LNMP%E9%83%A8%E7%BD%B2typecho%EF%BC%8C%E5%BC%80%E5%90%AFSSL%E3%80%81%E5%BC%BA%E5%88%B6%E5%BC%80%E5%90%AFhttps&amp;url=/archives/typecho-lnmp-deployment-open-ssl-mandatory-https" width="1" height="1" alt="" style="opacity:0;">
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F201803-2305685810.jpg&amp;size=m" alt="LNMP部署typecho，开启SSL、强制开启https"></p>
<h2 id="heading">关于宝塔面板</h2>
<p>之前使用宝塔面板管理VPS,可视化的环境部署及管理真的很方便小白，除了这点，最让我觉得方便的是它的文件管理，支持远程下载及代码编辑，还有可以做定时任务，自动备份网站文件和数据库到七牛云。</p>
<p>可以说安装了宝塔面板以后，真的是挺省心的。虽然网上有一些关于该面板不好的说法，然而当时也没有在意，直到我遇到phpmyadmin打不开的时候我有点郁闷了。之后试着网上搜索一遍后无果，看到有人在宝塔的官方论坛反馈过，官方也没有给出最后的解答，于是我想还是卸载了吧。</p>
<h2 id="lnmp">使用LNMP搭建环境</h2>
<p>按照教程走一遍，顺利部署完成，把之前备份的网站文件和数据库搞定后打开网站遇到问题了：</p>
<h3 id="404">网站404错误</h3>
<blockquote>
 <p>成功安装typecho后，除了首页，打开其他页面及登陆后台均显示404错误</p>
</blockquote>
<h3 id="heading-1">原因</h3>
<blockquote>
 <p>伪静态没有正常工作，所以无法正确显示</p>
</blockquote>
<h3 id="heading-2">解决办法</h3>
<ol>
 <li>找到<code>/usr/local/nginx/conf/vhost/wuqishi.com.conf</code></li>
 <li>将其中的<code>include enable-php.conf;</code></li>
 <li>修改为：<code>include enable-php-pathinfo.conf;</code></li>
 <li>最后保存<code>lnmp reload</code>重启即可。</li>
</ol>
<hr>
<h2 id="https">强制开启https</h2>
<p>通过LNMP安装包命令可以配置Let's Encrypt证书，开启SSL。</p>
<h3 id="lets-encrypt">检查Let's Encrypt是否自动续期</h3>
<p>通过<code>crontab -l</code>命令查询是否自动续期。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F%25E6%25A3%2580%25E6%259F%25A5%25E8%25AF%2581%25E4%25B9%25A6%25E6%2598%25AF%25E5%2590%25A6%25E8%2587%25AA%25E5%258A%25A8%25E7%25BB%25AD%25E6%259C%259F.jpgwater.jpg&amp;size=m" alt="LNMP部署typecho，开启SSL、强制开启https"></p>
<h3 id="https301">强制开启https（301重定向）</h3>
<p>安装SSL证书之后，http和https都是可以访问到站点的，但是为了唯一性，我们肯定需要做301跳转到https指向。</p>
<p>目录地址文件 <code>/usr/local/nginx/conf/vhost/wuqishi.com.conf</code></p>
<p>修改配置文件,加入以下代码</p>
<pre><code>if ($scheme = http ) {

return 301 https://$host$request_uri;

}
</code></pre>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F%25E5%25BC%25BA%25E5%2588%25B6https%25E4%25BB%25A3%25E7%25A0%2581.pngwater.jpg&amp;size=m" alt="LNMP部署typecho，开启SSL、强制开启https"></p>]]></description><guid isPermaLink="false">/archives/typecho-lnmp-deployment-open-ssl-mandatory-https</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F201803-2305685810.jpg&amp;size=m" type="image/jpeg" length="17159"/><category>技巧</category><pubDate>Fri, 30 Mar 2018 11:38:00 GMT</pubDate></item><item><title><![CDATA[Stylish样式如何设置为特定网址不生效？]]></title><link>https://wuqishi.com/archives/stylish-style-not-effective-for-specific-websites</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Stylish%E6%A0%B7%E5%BC%8F%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE%E4%B8%BA%E7%89%B9%E5%AE%9A%E7%BD%91%E5%9D%80%E4%B8%8D%E7%94%9F%E6%95%88%EF%BC%9F&amp;url=/archives/stylish-style-not-effective-for-specific-websites" width="1" height="1" alt="" style="opacity:0;">
<h2 id="update2018-04-19">Update:2018-04-19</h2>
<p>因为Stylish不支持云端备份恢复，所以换成xStyle。但是xStyle并没有类似Stylish可以特殊设置的地方，所以只能在代码上进行处理了。</p>
<p>排除特定网址代码</p>
<pre><code class="language-css">@-moz-document regexp("((?!wuqishi.com).)*"){填入你的CSS代码}
</code></pre>
<p>小括号中填入你要排除的网址，比如这里是：<code>((?!wuqishi.com).)*</code></p>
<hr>
<h2 id="stylish">关于Stylish</h2>
<p>Stylish是一个浏览器扩展，你可以利用它来定制目标网页或网站的css样式，甚至一些浏览器app的样式，让浏览效果更加舒适。而且在UserStyles网站上已经有不少现成的样式可供下载，让不会写css的普通用户也可以享受到它的便利。</p>
<p>当然，除了Stylish给网址设定相应的样式改变页面的样式意外，还可以去广告，比如改变百度搜索结果的呈现：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fstylish%25E6%25A0%25B7%25E5%25BC%258F%25E5%25A6%2582%25E4%25BD%2595%25E8%25AE%25BE%25E7%25BD%25AE%25E4%25B8%25BA%25E7%2589%25B9%25E5%25AE%259A%25E7%25BD%2591%25E5%259D%2580%25E4%25B8%258D%25E7%2594%259F%25E6%2595%2588%25EF%25BC%259F.png&amp;size=m" alt="Stylish样式如何设置为特定网址不生效？"></p>
<h2 id="heading">利用正则设置特定网址不生效</h2>
<ol>
 <li>进入Stylish样式管理器</li>
 <li>点击要修改的样式进行修改</li>
 <li>在<strong>应用对象</strong>处选择<strong>与该正则表达式匹配的网址</strong></li>
 <li>填写代码</li>
</ol>
<p><code>((?!A|B).)*</code></p>
<blockquote>
 <p>A、B是要排除的网址，多个网址用|分隔A、B是要排除的网址，多个网址用|分隔</p>
</blockquote>
<p>比如我要设置某个样式在我这个网站不生效，那么填写：</p>
<p><code>((?!wuqishi.com).)*</code></p>]]></description><guid isPermaLink="false">/archives/stylish-style-not-effective-for-specific-websites</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fstylish%25E6%25A0%25B7%25E5%25BC%258F%25E5%25A6%2582%25E4%25BD%2595%25E8%25AE%25BE%25E7%25BD%25AE%25E4%25B8%25BA%25E7%2589%25B9%25E5%25AE%259A%25E7%25BD%2591%25E5%259D%2580%25E4%25B8%258D%25E7%2594%259F%25E6%2595%2588%25EF%25BC%259F.png&amp;size=m" type="image/jpeg" length="80845"/><category>技巧</category><pubDate>Mon, 19 Mar 2018 11:25:00 GMT</pubDate></item><item><title><![CDATA[Typecho插件错误号:42S01的解决方法]]></title><link>https://wuqishi.com/archives/typecho-plugin-error-42s01-solutions</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Typecho%E6%8F%92%E4%BB%B6%E9%94%99%E8%AF%AF%E5%8F%B7%3A42S01%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95&amp;url=/archives/typecho-plugin-error-42s01-solutions" width="1" height="1" alt="" style="opacity:0;">
<p>回头看看上一篇文章的发布日期，真的是好久没有更新了。</p>
<p>回来整理升级了Typecho，在开启插件HighSlide时发现报错：</p>
<blockquote>
 <p>数据表建立失败,插件启用失败。错误号:42S01</p>
</blockquote>
<p>解决方法：</p>
<blockquote>
 <ol>
  <li>先把te_gallery这张表备份到本地（或者把整个数据库备份）</li>
  <li>然后把数据库里te_gallery这张表删除</li>
  <li>在后台重新启用插件（开启成功</li>
  <li>最后把备份到本地的te_gallery这张表导入数据库</li>
 </ol>
</blockquote>
<p>完成。</p>]]></description><guid isPermaLink="false">/archives/typecho-plugin-error-42s01-solutions</guid><dc:creator>吴蛋蛋</dc:creator><category>技巧</category><pubDate>Thu, 15 Mar 2018 11:05:00 GMT</pubDate></item><item><title><![CDATA[电动车被偷了]]></title><link>https://wuqishi.com/archives/electric-car-has-been-stolen</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%94%B5%E5%8A%A8%E8%BD%A6%E8%A2%AB%E5%81%B7%E4%BA%86&amp;url=/archives/electric-car-has-been-stolen" width="1" height="1" alt="" style="opacity:0;">
<p>3月25日，雨。</p>
<p>下午14点左右，本人去传达室收快递，想着自己的电动车应该充满电了，为了防止充电过饱，决定去把电动车电源收起来。然而我仔细找了几圈后才发现一个令自己沮丧的事实：我的电动车被偷了！~</p>
<p>事后调监控、报警、笔录……</p>
<p>身体仿佛被掏空了。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F006m27TTgy1fe1dbz1qw6g30dw07tb29.gif&amp;size=m" alt="电动车被偷了"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F006m27TTgy1fe1dia41uoj32c0340hdu.jpg%21wwater&amp;size=m" alt="电动车被偷了2"></p>
<p>有正脸！虽然有正脸，但是这事也就到此为止了，抓不到小偷，就不要为难警察叔叔了。</p>
<p>吃一堑长一智，所以告诉跟我一样骑电动车的朋友，无论停在哪里，请务必加锁，而且一把不够哦，要多加几把，不要嫌麻烦，最好加上碟刹的锁！</p>]]></description><guid isPermaLink="false">/archives/electric-car-has-been-stolen</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F006m27TTgy1fe1dbz1qw6g30dw07tb29.gif&amp;size=m" type="image/jpeg" length="1360552"/><category>蛋花</category><pubDate>Sat, 25 Mar 2017 11:02:00 GMT</pubDate></item><item><title><![CDATA[热火 R150 上手开箱]]></title><link>https://wuqishi.com/archives/re-huo-r150-shang-shou-kai-xiang</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E7%83%AD%E7%81%AB%20R150%20%E4%B8%8A%E6%89%8B%E5%BC%80%E7%AE%B1&amp;url=/archives/re-huo-r150-shang-shou-kai-xiang" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2">写在前面</h2>
<p style="">关于电子烟产品很久之前就关注过，然而知其然不知其所以然。也曾买过一次，详细请看：</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/archives/new-toy-karee-electronic-cigarettes-first-try" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="新玩具KAREE电子烟，先试试" custom-description="商务款有两种，区别在充电宝不一样，一种适合送人，外观精致，送领导之类还行。" custom-image="https://cdn.ssslove.com/files/2018/09/FullSizeRender1.jpgwater.jpg"><a href="https://wuqishi.com/archives/new-toy-karee-electronic-cigarettes-first-try" target="_blank">https://wuqishi.com/archives/new-toy-karee-electronic-cigarettes-first-try</a></hyperlink-card>
<p style="">好吧，我承认，我被骗了，或者说我无知了，在买之前没有仔细了解过。</p>
<hr>
<p style="">网上看了很多资料，也有各种产品的推荐，然后在驳杂的信息中真正能够找到合适自己入手的产品和信息真的不容易。你要识别信息真假，还要识别各种软文都隐藏了产品的哪些缺点…可以说种种险情，步步惊心。总结以下几点个人经历后的感受，方面一下和我一样准备入坑的朋友。</p>
<hr>
<h2 style="" id="%E7%BB%8F%E9%AA%8C%E5%92%8C%E6%96%B9%E6%B3%95">经验和方法</h2>
<h3 style="" id="%E5%88%9D%E7%BA%A7%E6%96%B9%E6%B3%95%E2%80%94%E2%80%94%E4%BA%86%E8%A7%A3">初级方法——了解</h3>
<p style="">这里的看包括资讯、文章、视频、评测、开箱文…反正网上你能找到的信息都去看看。这个阶段是对整个电子烟有一个清晰又笼统的认识。</p>
<h3 style="" id="%E8%BF%9B%E9%98%B6%E6%8E%A2%E7%B4%A2%E2%80%94%E2%80%94%E6%B7%B1%E5%85%A5">进阶探索——深入</h3>
<ul>
 <li>
  <p style="">推荐大家去看看各大电子烟的论坛，具体就不说哪些了，网上一搜一堆。去论坛看大家问的问题，去了解你要了解的信息，同时你也可以发帖。</p>
 </li>
 <li>
  <p style="">淘宝店客服的作用 店小二现在也分售前和售后了。售前你懂得，就是各种忽悠你买买买，在你没买之前他们的态度很好，所以你有什么问题尽管问。</p>
 </li>
 <li>
  <p style="">加入 QQ 群。这里我是怎么加入一些 QQ 群的呢，主要是我在淘宝上搜索产品价格的时候发现的一些比较好的店，他们会在网址上放 QQ 群号码，方面吸收新血和收容老顾客。这样的群聊天氛围不错，你刚加入的时候也会有一些管理或者老会员愿意为你讲解。为什么把这点放进阶这里说呢，因为你经过初阶阶段，对电子烟有了认识，相对来说问的问题不至于太粗浅，这样群里的人也不至于到懒得回答。</p>
 </li>
</ul>
<h3 style="" id="%E9%AB%98%E7%BA%A7%E7%AF%87">高级篇</h3>
<p style="">(⊙o⊙)…这一篇留着吧，因为我也才刚入坑。</p>
<hr>
<h2 style="" id="%E5%85%A5%E6%89%8B%E7%83%AD%E7%81%ABr150">入手热火R150</h2>
<p style="">热火公司（Hotcig）推出的 美国进口的DNA 芯片的主机最近可以说很火。本来在它的 DX75和 R150以及 VT75之间徘徊。你可以看网上的人的说法，各说各好，其实真正好不好还是得用了才知道。但是用了就要花钱，怎么样花钱才能让花出的钱值当才是硬道理。</p>
<p style="">选择 R150个人基于的考虑是这个150W 的 R150机子基本可以算毕业了，如果不是有特别的追求，那么基本够用。还有就是网友的推荐和知乎的良心回答。</p>
<p style="">我目前主要目的是代烟。老烟枪了，媳妇怒了不是一次两次了，还说我是在谋杀她的生命。尴尬，不过也确实是这样。所以就入了R150这个新手毕业装。</p>
<p style="">至于雾化器，选择的是颇具好评的鹦鹉螺 X，实际抽起来还行，也是刚刚起步，至于 DIY 的雾化器等以后再说（主要是怕手残）。</p>
<p style="">R150其实有些大，但是续航上不用担心，以后也不用急着升级装备。等真正需要升级装备的时候，大家都应该升级成老鸟级别了吧，那个时候该出手买什么样的装备还不是了然于胸。</p>
<hr>
<h2 style="" id="%E5%85%A8%E5%AE%B6%E7%A6%8F%E5%92%8C%E7%89%B9%E5%86%99">全家福和特写</h2>
<p style="">下面来全家福和特写，也让大家看看效果。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-%25E5%2585%25A8%25E5%25AE%25B6%25E7%25A6%258F.jpg%21water&amp;size=m" alt="" width="500px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-R150%25E5%25BC%2580%25E7%25AE%25B1%25E8%25BF%2591%25E7%2585%25A7.jpg%21water&amp;size=m" alt="" width="500px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-R150%25E6%25AD%25A3%25E9%259D%25A2.jpg%21wwater&amp;size=m" alt="" width="500px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-R150%25E4%25BE%25A7%25E9%259D%25A2.jpg%21wwater&amp;size=m" alt="" width="500px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-%25E9%25B9%25A6%25E9%25B9%2589%25E8%259E%25BA-X.jpg%21wwater&amp;size=m" alt="" width="500px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-R150-%25E9%259B%25BE%25E5%258C%2596%25E5%2599%25A8.jpg%21water&amp;size=m" alt="" width="500px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-R150-%25E9%259B%25BE%25E5%258C%2596%25E5%2599%25A8%25E6%25AD%25A3%25E9%259D%25A2.jpg%21water&amp;size=m" alt="">
</figure>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/re-huo-r150-shang-shou-kai-xiang</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-27-%25E5%2585%25A8%25E5%25AE%25B6%25E7%25A6%258F.jpg%21water&amp;size=m" type="image/jpeg" length="90906"/><category>蛋花</category><pubDate>Thu, 27 Oct 2016 10:35:00 GMT</pubDate></item><item><title><![CDATA[UltraMon 3.3.0 汉化+注册机]]></title><link>https://wuqishi.com/archives/registered-machine-ultramon-330-localization</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=UltraMon%203.3.0%20%E6%B1%89%E5%8C%96%2B%E6%B3%A8%E5%86%8C%E6%9C%BA&amp;url=/archives/registered-machine-ultramon-330-localization" width="1" height="1" alt="" style="opacity:0;">
<h2 id="ultramon">UltraMon简介</h2>
<p>多屏幕显示工具UltraMon想必很多人都在用，对于有两个屏幕的人来说这个工具简直是神器。</p>
<blockquote>
 <p>UltraMon是一个多屏幕显示工具，它可以轻易的控制Windows在两个屏幕之间切换，还可以在两个显示器上最大化Windows桌面，最有趣的是可以在多显示器上显示不同的屏幕保护程序和桌面墙纸，各自的荧幕的任务栏显现的方式与位置和哪个程序要在哪个荧幕来开启等多项功能和调整。</p>
</blockquote>
<p>更多功能有待大家去使用发现，废话不多说，进入正题。</p>
<h2 id="ultramon-1">UltraMon下载</h2>
<p>UltraMon目前最新版本为3.3.0。Released Mar 30,2015。</p>
<p>最好的下载地址莫过于官网了</p>
<h2 id="heading">语言包、汉化</h2>
<p>官方自带语言包，不过只有德语的。中文版的汉化作者是晶成，大家可以在关于里发现他的签名。</p>
<p>其实他的汉化包对应的版本是3.2.2的，我升级3.3.0后发现软件并不识别该汉化包。经过对比发现只要修改汉化包中的Info.ini的Version就可以达到让软件自动识别的效果。如果你已经在使用该汉化包则不必重新下载。</p>
<pre><code>修改Version值：106——&gt;107
</code></pre>
<h2 id="heading-1">注册机</h2>
<p>注册机这种东西一般都是会被误报的，在意的人请不要下载使用了。</p>
<p>无图无真相：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2FUltraMon%25E6%25B1%2589%25E5%258C%2596%25E6%25B3%25A8%25E5%2586%258C.png&amp;size=m" alt="注册机"></p>
<p>红圈中的文字大家可以随意修改，注册机会自动生成相应的注册码。</p>
<p>[collapse status=“false” title=“百度网盘”]https://pan.baidu.com/s/1kTiaR3L[/collapse]</p>
<p>好像也没多少内容啊，那就这样分享给大家吧。</p>]]></description><guid isPermaLink="false">/archives/registered-machine-ultramon-330-localization</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2FUltraMon%25E6%25B1%2589%25E5%258C%2596%25E6%25B3%25A8%25E5%2586%258C.png&amp;size=m" type="image/jpeg" length="29201"/><category>分享</category><pubDate>Tue, 18 Oct 2016 10:48:00 GMT</pubDate></item><item><title><![CDATA[如何用 MWeb 发布 Typecho 文章]]></title><link>https://wuqishi.com/archives/mweb-to-typecho</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%A6%82%E4%BD%95%E7%94%A8%20MWeb%20%E5%8F%91%E5%B8%83%20Typecho%20%E6%96%87%E7%AB%A0&amp;url=/archives/mweb-to-typecho" width="1" height="1" alt="" style="opacity:0;">
<p>自从 Wordpress 转到 Typecho 之后就一直学习和尝试用 Markdown 写博客。这两天正式接触 MWeb 后，发现它有一个可以发布到 Metaweblog API 的发布服务。就尝试着看看能否从 MWeb 上直接写文章然后发布到博客程序上。</p>
<hr>
<h2 id="-mweb">使用 MWeb发布文章，它有什么好处？</h2>
<ol>
 <li>首先，支持 Markdown。使用它写文章可以直接上手，不需要额外的学习成本。Markdown 的简洁和优雅，使用越久越会赞叹，上手简单，推荐大家学习。</li>
 <li>图床服务。它支持包括七牛云存储、GooglePhoto、imgur，还可以另外自己自定义。</li>
 <li>文章发布后难免会有一些修修改改，MWeb 支持直接在原文的基础上更新文章。</li>
 <li>文章链接自定义。我们可以直接在发布文章时在 MWeb 上自定义文章的链接。</li>
 <li>支持标签。填写完标签后可以同步到博客上，作为博客的标签。</li>
</ol>
<p>以上是本人比较注重的几点，其他有待大家自己去发觉。为此我还制作了一张简单的思维导图，方便大家直观的了解。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-Mweb%25E5%258A%259F%25E8%2583%25BD%25E6%2580%259D%25E7%25BB%25B4%25E5%25AF%25BC%25E5%259B%25BE.png%21water&amp;size=m" alt="Mweb好处"></p>
<hr>
<h2 id="heading">食用方法</h2>
<p>打开 MWeb 偏好设置，点击发布服务。</p>
<h3 id="heading-1">添加七牛云储存图床</h3>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-%25E4%25B8%2583%25E7%2589%259B%25E4%25BA%2591%25E8%25AE%25BE%25E7%25BD%25AE.png%21water&amp;size=m" alt="添加七牛云图床"></p>
<p>如图，填入名称、空间名称、图片 URL 前缀可以不填。</p>
<p>图中的 Access Key、Secret Key，可以在七牛云官网后台的个人面板中的密钥管理中获取。</p>
<h3 id="-metaweblog-api-">添加 Metaweblog API 服务</h3>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-%25E5%258D%259A%25E5%25AE%25A2%25E8%25AE%25BE%25E7%25BD%25AE.png%21water&amp;size=m" alt="添加 Metaweblog API 服务"></p>
<p>博客网址不要加http前缀</p>
<p>这里最主要的是Tpyecho 的 API地址，需在博客域名后加上如图部分，即：</p>
<pre><code class="language-html">http://wuqishi.com/action/xmlrpc
</code></pre>
<h2 id="heading-2">写作</h2>
<p>在 MWeb 中，通过 Markdown 进行正常写作</p>
<h2 id="heading-3">发布</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-MWeb-%25E5%258F%2591%25E5%25B8%2583%25E6%2596%2587%25E7%25AB%25A0.png%21water&amp;size=m" alt="发布"></p>
<p>如图，发布界面简单易懂，大家可以添加标签，自定网址，选择发布日期和发布状态，如果你的博客后台编辑器是 Markdown语法，请勾选“发布为 Markdown”。</p>
<hr>
<h2 id="heading-4">不足</h2>
<h3 id="markdown-">Markdown 语法识别问题</h3>
<p>这里问题其实也不知道算不算是 MWeb 的问题，出现的现象如图：</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-%25E5%258F%2591%25E5%25B8%2583%25E5%2590%258E%25E7%259A%2584%25E9%2597%25AE%25E9%25A2%2598.png%21water&amp;size=m" alt="语法识别"></p>
<p>上面我们说过，要勾选“发布为Markdown”，但是即使这样文章推送到博客后台后会出现识别不出是 Markdown 语法创建的问题。</p>
<p>解决办法就是点击图中的“是”，程序会自动转换。</p>
<h3 id="heading-5">发布状态为“草稿”时重复创建文章的问题</h3>
<p>上文“发布”中说过，“发布状态”可选。当选择为“草稿”后发布，博客后台正常创建一篇草稿文章。</p>
<p>如果我们继续在 MWeb 上编辑文章，最后选“已发布”状态发布编辑后文章到博客程序后就出现问题了。</p>
<p>博客会创建了一篇新的文章，而不是把草稿变成已发布的文章。这样就相当于在博客后台创建了两篇文章，一篇为发布的文章，另一篇为草稿的文章。</p>
<hr>
<p>以上两点问题不知道怎么解决。</p>]]></description><guid isPermaLink="false">/archives/mweb-to-typecho</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-11-Mweb%25E5%258A%259F%25E8%2583%25BD%25E6%2580%259D%25E7%25BB%25B4%25E5%25AF%25BC%25E5%259B%25BE.png%21water&amp;size=m" type="image/jpeg" length="47080"/><category>技巧</category><pubDate>Tue, 11 Oct 2016 10:52:00 GMT</pubDate></item><item><title><![CDATA[测试 Mweb 发布到印象笔记功能]]></title><link>https://wuqishi.com/archives/test-mweb-evernote</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%B5%8B%E8%AF%95%20Mweb%20%E5%8F%91%E5%B8%83%E5%88%B0%E5%8D%B0%E8%B1%A1%E7%AC%94%E8%AE%B0%E5%8A%9F%E8%83%BD&amp;url=/archives/test-mweb-evernote" width="1" height="1" alt="" style="opacity:0;">
<h2 id="heading">起因</h2>
<p>今天刚买了印象笔记的高级版，是半价活动，打算好好利用好印象笔记，为自己积累一些素材。</p>
<h2 id="-mweb">关于 Mweb</h2>
<p>很早就关注 Mweb了，Ulysses价格太高，Mweb 的功能完全可以取代它，而且 Mweb 是由国人开发的，理应支持一下。</p>
<p>这里是 <strong>Mweb</strong> 2.1.0试用版，测试一下能否发布到印象笔记。</p>
<p>因为错过了Mweb价格在￥68时候的活动，结果现在涨价到￥98。哎，发布2.0版本的时候有半价￥50的活动，可是还是错过了……</p>
<p>希望下次作者活动的时候不要错过，要等活动减价时再入手，虽然不富裕，但是这么好的软件一定要支持。</p>
<h2 id="heading-1">测试结果</h2>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-10-%25E5%25B1%258F%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7-2016-10-10-21.40.00.png%21water&amp;size=m" alt="测试结果"></p>
<p>登陆 Mac 版印象笔记，发现同步过来了~</p>
<p><strong>成功！</strong></p>]]></description><guid isPermaLink="false">/archives/test-mweb-evernote</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F2016-10-10-%25E5%25B1%258F%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7-2016-10-10-21.40.00.png%21water&amp;size=m" type="image/jpeg" length="53982"/><category>技巧</category><pubDate>Mon, 10 Oct 2016 10:42:00 GMT</pubDate></item><item><title><![CDATA[忘记了iPhone访问限制的密码该怎么办？]]></title><link>https://wuqishi.com/archives/forget-the-iphone-access-restrictions-password-what-should-i-do</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E5%BF%98%E8%AE%B0%E4%BA%86iPhone%E8%AE%BF%E9%97%AE%E9%99%90%E5%88%B6%E7%9A%84%E5%AF%86%E7%A0%81%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F&amp;url=/archives/forget-the-iphone-access-restrictions-password-what-should-i-do" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p style="">题外话：</p>
 <p style="">今天凌晨苹果召开<code>WWDC2016</code>发布了<code>iOS 10</code>的开发者预览版，当然还有其他，所以导致我在鼓捣手机。于是看到访问限制是处于打开状态就想进去看看，结果发现自己忘了访问限制的密码。</p>
</blockquote>
<h2 style="" id="ios-10-beta%E7%89%88%E6%9C%AC%E5%80%BC%E5%BE%97%E5%8D%87%E7%BA%A7%E4%BD%93%E9%AA%8C%E5%90%97%EF%BC%9F">iOS 10 Beta版本值得升级体验吗？</h2>
<p style="">虽然iOS 10相对于之前版本改进和开放了很多，也有许多功能也挺出彩，比如 <code>iMessage</code> 的重大改进以及苹果地图、照片、<code>News</code> 和 <code>Apple Music</code> 的重新设计等等。但是在升级系统之前我们应该考虑以下几个方面：</p>
<h3 style="" id="%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%85%BC%E5%AE%B9%E6%80%A7%E9%97%AE%E9%A2%98">应用程序的兼容性问题</h3>
<p style="">升级 <code>iOS 10 Beta</code> 系统之后，我们可能会遇到第三方应用程序的兼容性问题。当然，这并不是开发商的错，因为他们还没有针对新的系统推出适配版本。</p>
<h3 style="" id="%E7%B3%BB%E7%BB%9F%E6%B2%A1%E6%9C%89%E5%85%85%E5%88%86%E4%BC%98%E5%8C%96">系统没有充分优化</h3>
<p style="">在 <code>iOS 10</code> 正式版推送之前，Beta 版本都不会获得全面的优化，苹果会收集用户的反馈来修复系统中的漏洞，当然这也是我们希望看到的，这能够让我们在正式版系统中获得更加出色的使用体验。</p>
<h3 style="" id="%E6%97%A0%E6%B3%95%E8%B6%8A%E7%8B%B1">无法越狱</h3>
<p style="">如果你之前使用的是越狱系统，在升级 <code>iOS 10 Beta</code> 之后，不仅无法越狱，即使在重新降级之后也无法重新越狱。</p>
<h3 style="" id="%E9%AB%98%E7%89%88%E6%9C%AC%E5%A4%87%E4%BB%BD%E6%97%A0%E6%B3%95%E6%81%A2%E5%A4%8D%E5%88%B0%E4%BD%8E%E7%89%88%E6%9C%AC">高版本备份无法恢复到低版本</h3>
<p style="">从<code> iOS 10 Beta</code> 降级到 <code>iOS 9.3.2</code> 之后，我们无法将 <code>iOS 10 Beta</code> 中的备份还原到设备中，只能够使用 <code>iOS 9</code> 兼容的备份，新系统中的所有数据都会丢失。</p>
<h3 style="" id="%E9%83%A8%E5%88%86%E6%96%B0%E5%8A%9F%E8%83%BD%E6%97%A0%E6%B3%95%E9%A9%AC%E4%B8%8A%E4%BD%BF%E7%94%A8">部分新功能无法马上使用</h3>
<p style=""><code>iMessage</code> 应用和将 <code>Siri </code>整合到第三方应用程序等酷炫的<code> iOS 10 </code>功能在 Beta 版本中还无法使用，如果你想要体验这部分功能的话，可能需要等到今年秋天的 <code>iOS 10</code> 正式版本。</p>
<h3 style="" id="%E6%97%A7%E8%AE%BE%E5%A4%87%E6%97%A0%E6%B3%95%E4%BD%93%E9%AA%8C%E6%96%B0%E5%8A%9F%E8%83%BD">旧设备无法体验新功能</h3>
<p style="">比如<code>iPhone 6s</code>一下设备无法使用<code>3D touch</code>、自动唤醒等</p>
<hr>
<h2 style="" id="%E5%9B%9E%E5%88%B0%E6%AD%A3%E9%A2%98%EF%BC%8C%E6%80%8E%E4%B9%88%E7%A0%B4%E8%A7%A3%E8%AE%BF%E9%97%AE%E5%AF%86%E7%A0%81%EF%BC%9F">回到正题，怎么破解访问密码？</h2>
<h3 style="" id="%E9%A6%96%E5%85%88%E5%BE%97%E6%9C%89%E5%A4%87%E4%BB%BD">首先得有备份</h3>
<p style="">这里备份分为加密和未加密，具体后面再说。</p>
<h3 style="" id="%E4%B8%8B%E8%BD%BD%E5%B9%B6%E5%AE%89%E8%A3%85">下载并安装</h3>
<hyperlink-card target="_blank" href="http://www.icopybot.com/download.htm" theme="small" style="margin-top: 0.75em; margin-bottom: 0;"><a href="http://www.icopybot.com/download.htm" target="_blank">http://www.icopybot.com/download.htm</a></hyperlink-card>
<p style="">这里提供Windows版本注册信息，Mac版未测试。</p>
<p style=""><code>用户名：AXiS - Fighting For Fun</code></p>
<p style=""><code>注册号：B6ECEFB6E061BC8B2B23459EFE035ABF877E8B1F5BE9245111939AAB2B10AB1</code></p>
<h3 style="" id="%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8ibackupbot">安装使用iBackupBot</h3>
<p style="">安装完成后运行，<code>iBackupBot</code>会自动搜索iPhone的备份文件。</p>
<h3 style="" id="%E6%90%9C%E7%B4%A2%E5%AE%9A%E4%BD%8D%E6%96%87%E4%BB%B6">搜索定位文件</h3>
<p style="">从备份文件中定位<code>System Files/HomeDomain/Library</code>，然后在右边的搜索框中输入<code>com.apple.restrictionspassword.plist</code> ，可以搜索到这个密码文件。如图：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F57d0dfa1321012557c79920e3589cd2c_r1.png%21water&amp;size=m" alt="搜索定位文件" width="585px">
</figure>
<h3 style="" id="%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%E6%9F%A5%E7%9C%8B">打开文件查看</h3>
<p style="">双击打开文件，如果提示要注册就点取消。 如果是加密备份，就输入你设定的加密密码。打开后类似下图：
 <br></p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F55b6d63074db61bd9fc09e27acde6980_r1.png%21water&amp;size=m" alt="打开文件查看" width="585px">
</figure>
<p style="">注意红框内容，将对应内容复制到恢复工具的对应文本框内，点击『Search for Code』</p>
<h3 style="" id="%E7%A8%8B%E5%BA%8F%E7%A9%B7%E4%B8%BE%E7%A0%B4%E8%A7%A3%E5%AF%86%E7%A0%81">程序穷举破解密码</h3>
<p style="">程序会从<code>0000</code>开始逐一递增进行『密码穷举』一直到找到密码时，弹出的对话框提示即『访问限制密码』。设置的密码数字越大，搜索的时间越长。</p>
<hyperlink-card target="_blank" href="https://wuqishi.com/hash/" theme="regular" style="margin-top: 0.75em; margin-bottom: 0;" custom-title="iPhone访问限制密码查询工具|蛋蛋之家" custom-description="自建穷举网页，方便大家而已" custom-image=""><a href="https://wuqishi.com/hash/" target="_blank">https://wuqishi.com/hash/</a></hyperlink-card>
<hr>
<p style="">只为方便大家，版权归原作者所有，侵删。</p>]]></description><guid isPermaLink="false">/archives/forget-the-iphone-access-restrictions-password-what-should-i-do</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2F57d0dfa1321012557c79920e3589cd2c_r1.png%21water&amp;size=m" type="image/jpeg" length="45454"/><category>技巧</category><pubDate>Tue, 14 Jun 2016 10:26:00 GMT</pubDate></item><item><title><![CDATA[新玩具KAREE电子烟，先试试]]></title><link>https://wuqishi.com/archives/new-toy-karee-electronic-cigarettes-first-try</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E6%96%B0%E7%8E%A9%E5%85%B7KAREE%E7%94%B5%E5%AD%90%E7%83%9F%EF%BC%8C%E5%85%88%E8%AF%95%E8%AF%95&amp;url=/archives/new-toy-karee-electronic-cigarettes-first-try" width="1" height="1" alt="" style="opacity:0;">
<p>看到这个其实挺仓促的，在苏宁广场看家电时路过，老婆说“你了解一下呗”。好吧，虽然自己在网上看过相关介绍，也在知乎看过一些推荐，但是我并没有了解地很全面。</p>
<p>和售货员随便聊聊，问了一些关于油多少钱一瓶，商务款和机械款有啥区别之类，其实我懂一点，但是不深入，也抱着多了解的心态问问。</p>
<p>商务款有两种，区别在充电宝不一样，一种适合送人，外观精致，送领导之类还行；一种自用就行，本人买的就是这款，外壳是塑料的，自己带着感觉也不会太磕碜。价格嘛，前一种400+，后一种200+，都送一盒（4个）烟嘴。</p>
<p>了解完准备闪人了，因为网上说如果真心要入门，那么推荐组合起码600+，而且有单独雾化器的比这种商务款用烟嘴的好。可是......</p>
<p>“你是不是不打算戒烟？”老婆瞪着眼。</p>
<p>好嘛，买呗。</p>
<p>其实，谢谢老婆，十几年的烟龄了，虽然很难，但是总要有一个开头不是么。</p>
<p>渣技术，随便放几张图。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2FFullSizeRender1.jpgwater.jpg&amp;size=m" alt="img">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2FFullSizeRender.jpg&amp;size=m" alt="img">
 <br>
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2FFullSizeRender2.jpg&amp;size=m" alt="img"></p>
<p>后续使用报告等我体验后再说。</p>]]></description><guid isPermaLink="false">/archives/new-toy-karee-electronic-cigarettes-first-try</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2FFullSizeRender1.jpgwater.jpg&amp;size=m" type="image/jpeg" length="18746"/><category>蛋花</category><pubDate>Sat, 21 May 2016 10:18:00 GMT</pubDate></item><item><title><![CDATA[Mac mini 2011 开启Handoff方法]]></title><link>https://wuqishi.com/archives/mac-mini-2011-handoff</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=Mac%20mini%202011%20%E5%BC%80%E5%90%AFHandoff%E6%96%B9%E6%B3%95&amp;url=/archives/mac-mini-2011-handoff" width="1" height="1" alt="" style="opacity:0;">
<p>Yosemite出来也有一段时间了，可惜我手上的一台Mac mini是2011年中的，没有办法使用传说中的Handoff，略感可惜。于是辗转各大社区和网站，各方比对和实验之后，终于找到了这个方法。折腾之后，搞定惹~~~在这里感谢原作者。下面是方法，大家按照步骤执行即可：</p>
<ol>
 <li>
  <p>注意：此附件只针对 Mac mini Mid 2011,其它型号的机器不通用的。</p>
 </li>
 <li>
  <p>下载附件</p>
 </li>
 <li>
  <p>打开终端,输入：</p>
  <pre><code class="language-bash">sudo nvram boot-args="kext-dev-mode=1"
</code></pre>
 </li>
 <li>
  <p>重启</p>
 </li>
 <li>
  <p>安装附件中的Kext Drop软件</p>
 </li>
 <li>
  <p>解压Mac Mini Mid 2011.zip</p>
 </li>
 <li>
  <p>将压缩包中的IO80211Family.kext和IOBluetoothFamily.kext两个我已经修改好的文件分两次拖到Kext Drop,并逐个点击Install来安装</p>
 </li>
 <li>
  <p>(有朋友表示要先删除"/System/Library/Extensions/"中的IO80211Family.kext和IOBluetoothFamily.kext这两个文件,并重启然后才执行第5步,我自己是不用,替换不成功的可以试一下)</p>
 </li>
 <li>
  <p>回到终端,输入：</p>
  <pre><code class="language-bash">sudo kextcache -system-prelinked-kernel
</code></pre>
 </li>
 <li>
  <p>上个命令运行完后再次输入:</p>
  <pre><code class="language-bash">sudo kextcache -system-caches
</code></pre>
 </li>
 <li>
  <p>重启系统</p>
 </li>
 <li>
  <p>打开系统偏好设置-&gt;通用 (Handoff的选项已经出现)</p>
 </li>
</ol>
<p>OK，大成功。</p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fc555999bgw1er5he2k849j20lo0k941k.jpg%21water&amp;size=m" alt="开启成功后的设置页"></p>
<p><img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fc555999bgw1er5hiqgt5xj217j037myu.jpg&amp;size=m" alt="开启成功后的dock栏"></p>
<details>
 <summary>Update</summary> <font color="#FF0000"> 
  <p>10.10版本下有效。</p> 
  <p>2018.04.05：macOS High Sierra 10.13.4版本安装成功，系统设置里也出现了“接力”，但是貌似无效，不知道是否有其他办法。</p> 
 </font>
 <div class="vditor-render-wrapper">
  <code class="language-halo">drive:baidu name:Mac Mini Mid 2011 hand off.zip link:http://pan.baidu.com/s/1c0daiFQ password:j2ie </code>
 </div>
</details>]]></description><guid isPermaLink="false">/archives/mac-mini-2011-handoff</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fc555999bgw1er5he2k849j20lo0k941k.jpg%21water&amp;size=m" type="image/jpeg" length="34522"/><category>技巧</category><pubDate>Tue, 14 Apr 2015 10:15:00 GMT</pubDate></item><item><title><![CDATA[见微知著 浅谈手游创新]]></title><link>https://wuqishi.com/archives/shouyou-chuangxin</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=%E8%A7%81%E5%BE%AE%E7%9F%A5%E8%91%97%20%E6%B5%85%E8%B0%88%E6%89%8B%E6%B8%B8%E5%88%9B%E6%96%B0&amp;url=/archives/shouyou-chuangxin" width="1" height="1" alt="" style="opacity:0;">
<blockquote>
 <p style=""><span style="color: #2563eb">开篇提示：本文言辞其实是具有一定幽默性的，至于攻击性，那是绝对没有的，不存在含沙射影，所以大家不要含血喷人。</span></p>
</blockquote>
<p style="">说到创新，互联网从来都不缺乏创造力，看看网络用语就知道：不仅不缺还有让人不禁拍案叫绝的冲动。譬如“木耳”，不仅好吃，而且还有两种颜色；又譬如“我去年买了个表”，我猜这表一定很名贵吧；又或者“山寨”？</p>
<p style="">别告诉我你不知道“山寨”是个什么意思，就是“山中的碉堡”。纵观互联网，这种碉堡错落林立，其中佼佼者俨然有种“帝国”的趋势。而“山寨帝国”的形成对创新造成相当大的阻碍。那么“山寨”为什么如此横行呢？</p>
<blockquote>
 <p style="">投入少 见效快</p>
</blockquote>
<p style="">扒个皮，换件衣服的事情还不是手到擒来。玩过的手游多的人会发现，你明明第一次玩一款游戏但是却给你非常熟悉的感觉，然后你根本不需要新手引导就能从容驾驭这款游戏。最后你转念一想：这不是跟XXX游戏一样的吗。除了“衣服”不一样，内在却完全相同，你甚至找不到一点让你眼前能够一亮的地方。一般一个良好品质的游戏的开发周期需要一到两年时间，那“山寨”呢，几个月就够了！这其中的投入差别，笑了，懂？</p>
<p style="">能够被人“山寨”的游戏，品质往往都是非常不错的，而品质不错的游戏当然能够带来用户。如果平台够好，平台的用户基数够大，那么被“山寨”的游戏就该哭了。在这种投入少，见效快的诱惑之下又有多少人能够真正想到去做吃力却可能不讨好的创新？很多厂商也渐渐意识到其中问题弊端，于是就有了各种玩法组合类型的游戏出现。也有的厂商根本无视之。</p>
<p style="">我们不说大的、颠覆性的创新，哪怕有“微”创新也好啊。见微知著，从“微创”开始起步，走着走着也许明天就能够见到“创新”了。</p>
<p style="">PC机的《波斯王子》系列是笔者十分钟爱的游戏，其中最让笔者感兴趣的是QTE系统。《波斯王子·时之沙》中已有QTE，王子使用匕首吸收沙之怪物身上的时之沙时就出现过。其后《波斯王子3》中将QTE制作的更加完美，王子在接近敌人进行瞬杀的时候出现的一系列动作。莎木、战神、生化危机等经典游戏将此系统发扬光大。同时,《波斯王子4：重生》也增加了QTE的设定。</p>
<p style="">把QTE系统植入手游当中不失为一种可取的“微创新”吧，有幸的是笔者找到过几款类似的手游，其中印象比较深刻的是275game的《剑缘》，大家有兴趣可以进入官网下载试试，jy.275game.com/plus/list.php?tid=5 。</p>
<p style="">QTE讲究的是玩家的及时反应，玩家要对游戏画面上出现的按键迅速作出反应,并按下与画面所对应的按键,其出现的按键有单个的按键也有组合按键。
 <br>
 在《剑缘》中战斗时，如果玩家角色怒气槽全满之后，在屏幕左方会出现一个太极图案，点击图案，按照提示滑动，即可使出QTE技能。QTE技能不但特效华丽，而且还有非常高的伤害。仅仅这一个特色就使这款游戏的品质上升一截，战斗不再是单调的看着人物对砍，还需要玩家及时参与，增添不少乐趣。更别说游戏还具备精致的水墨风画面，独树一帜写实风武侠，以及自行选择不同“伴侣”共闯游戏世界。</p>
<p style="">套用一句话可以得出“山寨是山寨者的墓志铭”。如果创新死了，那么我们未来就黯淡无光。手游的未来如果没有创新带来的高品质，那么没落是迟早的事情。</p>]]></description><guid isPermaLink="false">/archives/shouyou-chuangxin</guid><dc:creator>吴蛋蛋</dc:creator><category>滚蛋</category><pubDate>Fri, 14 Mar 2014 10:03:00 GMT</pubDate></item><item><title><![CDATA[PhoneClean Pro授权注册激活码]]></title><link>https://wuqishi.com/archives/phonecleanpro-shouquan</link><description><![CDATA[<img src="https://wuqishi.com/plugins/feed/assets/telemetry.gif?title=PhoneClean%20Pro%E6%8E%88%E6%9D%83%E6%B3%A8%E5%86%8C%E6%BF%80%E6%B4%BB%E7%A0%81&amp;url=/archives/phonecleanpro-shouquan" width="1" height="1" alt="" style="opacity:0;">
<p style="">很多拥有<code>iPhone</code>手机的朋友可以都知道<code>PhoneClean</code>这款软件，<code>PhoneClean</code>是一款为<code>iPhone</code>/<code>iPad</code>清理垃圾软件的工具，在iTunes的支持下，它能帮你清理应用程序缓存、<code>cookies</code>、离线数据文件，清理临时文件并回收可用空间。如果你感觉<code>iPhone</code>/<code>iPad</code>越来越慢，可以试试<code>phoneclean</code>清理释放空间。</p>
<ol>
 <li>
  <p style="">Runs on: Windows (XP, Vista, 7, 8) and Mac OS X (10.6, 10.7, 10.8, 10.9)</p>
 </li>
 <li>
  <p style="">What’s News on PhoneClean v3.1.0.20131125</p>
 </li>
 <li>
  <p style="">Enhanced with the rock-solid stability for giving you safer and faster cleaning result.</p>
 </li>
 <li>
  <p style="">Added new Photo Clean feature to delete the iPhone, iPad photos conveniently.</p>
 </li>
</ol>
<p style="">先下载Free版安装：</p>
<ol>
 <li>
  <p style="">Download PhoneClean Windows Version (runs on all 32/64 bit Windows).</p>
 </li>
 <li>
  <p style=""><hyperlink-inline-card target="_blank" href="http://www.imobie.com/product/phoneclean-setup.exe" theme="inline"><a href="http://www.imobie.com/product/phoneclean-setup.exe" target="_blank">http://www.imobie.com/product/phoneclean-setup.exe</a></hyperlink-inline-card></p>
 </li>
 <li>
  <p style="">Download PhoneClean Mac Version (runs on OS X 10.6 / 7 / 8 / 9).</p>
 </li>
 <li>
  <p style=""><hyperlink-inline-card target="_blank" href="http://www.imobie.com/product/phoneclean-mac.dmg" theme="inline"><a href="http://www.imobie.com/product/phoneclean-mac.dmg" target="_blank">http://www.imobie.com/product/phoneclean-mac.dmg</a></hyperlink-inline-card></p>
 </li>
</ol>
<hr>
<details class="details">
 <summary>Free版升级至Pro版的激活码：</summary>
 <div data-type="detailsContent">
  <p style=""><code>GF3K-ZGKS-4NGW-BKOW-NFOC</code></p>
 </div>
</details>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fc555999btw1ebi1uu0npbj20ra0ghwg8.jpg%21water&amp;size=m" alt="激活后">
</figure>
<p style="">至于更加具体的功能和使用方法，有时间再看看是否要详细介绍了。</p>]]></description><guid isPermaLink="false">/archives/phonecleanpro-shouquan</guid><dc:creator>吴蛋蛋</dc:creator><enclosure url="https://wuqishi.com/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fcdn.ssslove.com%2Ffiles%2F2018%2F09%2Fc555999btw1ebi1uu0npbj20ra0ghwg8.jpg%21water&amp;size=m" type="image/jpeg" length="31570"/><category>分享</category><pubDate>Fri, 13 Dec 2013 09:55:00 GMT</pubDate></item></channel></rss>