<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Wer Blog</title><description>Ciallo～(∠・ω&lt; )⌒★</description><link>https://blog.isyyo.com/</link><language>zh_CN</language><item><title>极验v3滑动拼图验证码逆向与绕过</title><link>https://blog.isyyo.com/posts/geetest_v3/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/geetest_v3/</guid><description>深入解析极验(Geetest) v3滑动验证码的逆向工程，从加密算法、轨迹模拟到缺口识别的完整破解</description><pubDate>Sun, 17 May 2026 20:24:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;极验验证码（Geetest）是国内使用最广泛的行为验证码之一，其 v3 版本的滑动拼图验证码在各大网站中随处可见。本文将详细介绍其逆向分析和自动化绕过的完整流程。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;免责声明&lt;/strong&gt;：本文仅用于技术研究和学习，请勿用于非法用途。验证码的目的是保护网站安全，请合理使用相关技术。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;整体架构&lt;/h2&gt;
&lt;p&gt;极验 v3 滑动验证的核心流程可以简化为三个关键阶段，每个阶段对应一个 &lt;code&gt;w&lt;/code&gt; 参数：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;初始化&lt;/td&gt;
&lt;td&gt;&lt;code&gt;w1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;携带配置信息，获取加密参数 &lt;code&gt;c&lt;/code&gt; 和 &lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模拟行为&lt;/td&gt;
&lt;td&gt;&lt;code&gt;w2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提交鼠标轨迹、浏览器性能数据等行为信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最终验证&lt;/td&gt;
&lt;td&gt;&lt;code&gt;w3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提交缺口位置、滑动轨迹，获取 &lt;code&gt;validate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这三个 &lt;code&gt;w&lt;/code&gt; 参数是整个逆向的核心，它们都经过多层加密，包括 AES-CBC、RSA 和字符串混淆。&lt;/p&gt;
&lt;p&gt;文中的 &lt;code&gt;gettype.php&lt;/code&gt;、&lt;code&gt;get.php&lt;/code&gt;、&lt;code&gt;ajax.php&lt;/code&gt; 都是极验服务端（&lt;code&gt;api.geetest.com&lt;/code&gt;）的 HTTP API 接口，返回格式为 JSONP。每个接口在协议中承担不同职责：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;接口&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gettype.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;根据 &lt;code&gt;gt&lt;/code&gt; 查询验证码类型配置，返回 JS 文件地址等信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;核心数据接口，用于获取加密参数 &lt;code&gt;c/s&lt;/code&gt;、获取图片素材等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ajax.php&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提交验证结果，提交 &lt;code&gt;w2&lt;/code&gt;（行为数据）和 &lt;code&gt;w3&lt;/code&gt;（最终结果）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;加密体系逆向&lt;/h2&gt;
&lt;h3&gt;1. 自定义 Base64 编码&lt;/h3&gt;
&lt;p&gt;极验使用了一套&lt;strong&gt;非标准的 Base64 编码&lt;/strong&gt;，字符集和位掩码都被修改过：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 极验自定义 Base64 字符集（注意包含括号）
charset = &apos;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()&apos;
pad_char = &apos;.&apos;  # 填充字符也是自定义的

# 位掩码（经过打乱的排列）
masks = [7274496, 9483264, 19220, 235]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编码过程使用 4 个掩码从 24 位数据中提取出 4 个索引值，而非标准的 6 位一组。每 3 个字节被编码为 4 个自定义字符。&lt;/p&gt;
&lt;h3&gt;2. AES-CBC 加密&lt;/h3&gt;
&lt;p&gt;极验使用 AES-CBC 模式，但细节上做了特殊处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;密钥&lt;/strong&gt;：16 位随机字符串，但需要先通过 &lt;code&gt;parse_string_to_wordarray&lt;/code&gt; 函数转换为 32 位整数数组，然后再转为字节&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IV 初始化向量&lt;/strong&gt;：固定为 &lt;code&gt;0000000000000000&lt;/code&gt;（全零）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;填充&lt;/strong&gt;：PKCS7 填充&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;def AES_O(plaintext: str, str_16: str) -&amp;gt; list[int]:
    key_words = parse_string_to_wordarray(str_16)
    key = b&apos;&apos;.join(w.to_bytes(4, &apos;big&apos;) for w in key_words)
    iv = b&apos;0000&apos; * 4  # 固定 IV
    pad_len = 16 - len(plaintext) % 16
    plaintext_padded = plaintext.encode() + bytes([pad_len] * pad_len)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    return list(cipher.encrypt(plaintext_padded))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. RSA 加密&lt;/h3&gt;
&lt;p&gt;极验在 v3 中使用 RSA 加密传输 AES 密钥（即 16 位随机字符串）。公钥参数（n 和 e）硬编码在 JavaScript 中，需要从 JSBN 大整数格式中提取：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 从 JS 中提取的 RSA 公钥参数（n 的 37 个分段值）
_GEE_PUB_KEY_N = _parse_jsbn_bigint({
    0: 134982529, 1: 254232810, 2: 164556709, ...
    &quot;t&quot;: 37, &quot;s&quot;: 0,
})
_GEE_RSA_KEY = RSA.construct((_GEE_PUB_KEY_N, 65537))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 字符串混淆算法&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;encrypt_string&lt;/code&gt; 函数是极验对压缩后的轨迹数据做二次混淆的关键函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def encrypt_string(e: str, t: list[int], n: str) -&amp;gt; str:
    s = t[0]  # 系数1
    a = t[2]  # 系数2
    _ = t[4]  # 系数3
    # 根据 c 数组和 s 字符串中的十六进制值
    # 计算插入位置: (s * c² + a * c + _) % len(e)
    # 在字符串中插入字符实现混淆
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;t&lt;/code&gt; 参数就是前面阶段获取的 &lt;code&gt;c&lt;/code&gt; 数组，&lt;code&gt;n&lt;/code&gt; 是 &lt;code&gt;s&lt;/code&gt; 字符串。这相当于一个动态的混淆器，每次验证的混淆方式都不同。&lt;/p&gt;
&lt;h3&gt;5. 简化版 MD5&lt;/h3&gt;
&lt;p&gt;极验使用了一个 MD5 的变体来计算 &lt;code&gt;rp&lt;/code&gt; 参数，但实际效果与标准 MD5 一致：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def simple_md5(message: str) -&amp;gt; str:
    return hashlib.md5(message.encode()).hexdigest()
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据加密流程&lt;/h2&gt;
&lt;p&gt;16 位随机种子 &lt;code&gt;str_16&lt;/code&gt; 是整个加密体系的根密钥：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;str_16 = four_random_chart() * 4  # 例如 &quot;a1b2c3d4e5f6g7h8&quot;
     │
     ├── RSA 加密 → 附加到 w 参数末尾
     │
     └── AES 加密密钥 → 加密 payload
              │
              └── 自定义 Base64 编码 → w 参数主体
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第一阶段：w1 与初始化&lt;/h2&gt;
&lt;p&gt;流程的第一步是获取验证码配置和加密参数：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;获取 &lt;code&gt;gt&lt;/code&gt; 和 &lt;code&gt;challenge&lt;/code&gt;&lt;/strong&gt;：这两个值由业务服务器提供，标识了一个验证码会话&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调用 &lt;code&gt;gettype.php&lt;/code&gt;&lt;/strong&gt;：获取 JS 配置信息，确认验证码类型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构造 &lt;code&gt;w1&lt;/code&gt;&lt;/strong&gt;：将配置信息（gt、challenge、API 地址等）序列化为 JSON，先用 AES 加密，再用自定义 Base64 编码，最后附上 RSA 加密的种子&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调用 &lt;code&gt;get.php&lt;/code&gt;&lt;/strong&gt;：传入 &lt;code&gt;w1&lt;/code&gt;，获取加密参数 &lt;code&gt;c&lt;/code&gt;（数组）和 &lt;code&gt;s&lt;/code&gt;（字符串）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;w1 = get_w1(gt, challenge, str_16)
# w1 = AES_Base64(config_json) + RSA(seed)
# 返回: c = [12, 98, 43, ...], s = &quot;c7c3e211...&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第二阶段：w2 与行为模拟&lt;/h2&gt;
&lt;p&gt;这是最复杂的一个阶段，需要模拟真实用户的行为数据。&lt;/p&gt;
&lt;h3&gt;浏览器性能时间线伪造&lt;/h3&gt;
&lt;p&gt;极验会采集 &lt;code&gt;performance.timing&lt;/code&gt; API 的数据来检测是否为真人操作。我们需要生成一套合理的浏览器加载时间线：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;timing = {
    &quot;navigationStart&quot;: 1700000000000,  # 基准时间
    &quot;fetchStart&quot;: ...,
    &quot;domainLookupStart&quot;: ...,
    &quot;connectStart&quot;: ...,
    &quot;secureConnectionStart&quot;: ...,  # SSL 握手时间
    &quot;requestStart&quot;: ..., &quot;responseStart&quot;: ..., &quot;domInteractive&quot;: ...,
    &quot;loadEventEnd&quot;: ...,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些时间戳需要符合真实的网络延迟规律（DNS 查询 5-15ms，TCP 连接 50-150ms，SSL 30-50ms，DOM 解析 50-200ms 等）。&lt;/p&gt;
&lt;h3&gt;鼠标轨迹模拟&lt;/h3&gt;
&lt;p&gt;在 w2 阶段，需要模拟鼠标从屏幕某个位置移动到滑块按钮的过程。轨迹生成采用&lt;strong&gt;分段缓动算法&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def generate_realistic_trajectory(start_x, start_y, end_x, end_y, start_time):
    # 三个阶段缓动：开始快(0-30%)，中间慢(30-70%)，结束快(70-100%)
    # 加入随机抖动（±0.5px）模拟手抖
    # 随机时间间隔（3-25ms，符合人类反应速度）
    # 到达目标后悬停 50-150ms
    # 点击事件（down → focus → up，80-130ms 的点击时长）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;轨迹数据随后被压缩和混淆处理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;差分编码&lt;/strong&gt;：将绝对坐标转换为相对位移&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;游程编码&lt;/strong&gt;：压缩连续重复的事件类型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;变长编码&lt;/strong&gt;：根据数值大小动态调整编码位数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;符号位分离&lt;/strong&gt;：坐标的符号单独编码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义 Base64&lt;/strong&gt;：最终编码为字符串&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;encrypt_string&lt;/code&gt; 混淆&lt;/strong&gt;：使用 c/s 参数进行二次混淆&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;w2 = get_w2(gt, challenge, c, s, str_16)
# 包含: 时间线、轨迹、首次/末次事件、rp(MD5)、passtime 等
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第三阶段：w3 与最终验证&lt;/h2&gt;
&lt;h3&gt;图片还原&lt;/h3&gt;
&lt;p&gt;极验的滑块图片被分割成了 52 个小块并打乱顺序。还原顺序由一个硬编码的数组 &lt;code&gt;Ut&lt;/code&gt; 定义：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GEETEST_SHUFFLE_UT = [
    39, 38, 48, 49, 41, 40, 46, 47, 35, 34, 50, 51,
    33, 32, 28, 29, 27, 26, 36, 37, 31, 30, 44, 45,
    43, 42, 12, 13, 23, 22, 14, 15, 21, 20, 8, 9,
    25, 24, 6, 7, 3, 2, 0, 1, 11, 10, 4, 5, 19, 18, 16, 17,
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每个小块的大小为 10x80 像素，图片总大小为 260x160 像素。通过这个数组可以将打乱的图片恢复到正常状态。&lt;/p&gt;
&lt;h3&gt;缺口检测&lt;/h3&gt;
&lt;p&gt;有两种方法检测滑块缺口位置：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方法一（首选）：差异检测&lt;/strong&gt;
将还原后的 &lt;code&gt;fullbg&lt;/code&gt;（带缺口完整图）与 &lt;code&gt;bg&lt;/code&gt;（无缺口背景图）做像素级对比，找到差异最大的区域：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diff = cv2.absdiff(fullbg, bg)
diff_gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(diff_gray, 30, 255, cv2.THRESH_BINARY)
# 用 55px 宽度的滑动窗口找到到差异最大的 x 位置
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方法二（备选）：Canny 边缘检测 + 模板匹配&lt;/strong&gt;
对还原后的 fullbg 和滑块图片做边缘检测，然后用模板匹配定位：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fullbg_edge = cv2.Canny(fullbg_gray, 255, 255)
sl_edge = cv2.Canny(sl_gray, 255, 255)
result = cv2.matchTemplate(fullbg_edge, sl_edge, cv2.TM_CCOEFF_NORMED)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;w3 构造&lt;/h3&gt;
&lt;p&gt;得到缺口位置 &lt;code&gt;gap_x&lt;/code&gt; 后，构造最终验证参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;w3 = get_w3(str_16, challenge, gap_x, c, s, gt)
# 包含:
# - userresponse: 根据缺口位置和 challenge 生成的响应
# - 滑动轨迹（easeOutExpo 缓动函数）
# - 浏览器性能时间线
# - rp: MD5(gt + challenge[:32] + passtime)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;userresponse&lt;/code&gt; 的计算方式比较特殊：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def H(t: int, e: str) -&amp;gt; str:
    # t = 缺口位置 gap_x
    # e = challenge（32位字符串）
    # 从 challenge 的后两位解析出一个数值 n
    # 计算目标值 a = round(t) + n
    # 从 challenge 前 30 位字符池中随机选取字符
    # 使用 [1, 2, 5, 10, 50] 的面值组合出 a
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种设计让同样的缺口位置在不同 challenge 下会产生不同的 userresponse，增加了仿造的难度。&lt;/p&gt;
&lt;h2&gt;完整流程总结&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;1. GET https://api.geetest.com/gettype.php   → 查询验证码类型配置
2. GET https://api.geetest.com/get.php        → 传入 w1，获取 c(数组) 和 s(字符串)
3. GET https://api.geetest.com/ajax.php       → 提交 w2（轨迹 + 性能数据）
4. GET https://api.geetest.com/get.php        → 获取 bg, fullbg, slice 图片和新的 challenge
5. 下载图片 → 还原图片 → OpenCV 识别缺口位置 gap_x
6. GET https://api.geetest.com/ajax.php       → 提交 w3，返回 validate 和 seccode
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关键技术要点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;加密协议逆向&lt;/strong&gt;：极验的加密并非标准实现，AES 的密钥需要先做 WordArray 转换，Base64 的字符集和位掩码都是自定义的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;行为仿真&lt;/strong&gt;：模拟真人操作的关键在于细节——鼠标轨迹的抖动、速度变化、点击时长、浏览器性能时间线都需要符合统计规律，不能过于规律&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;图片处理&lt;/strong&gt;：由于图片被分割打乱，必须先还原才能做缺口检测。差异检测法比模板匹配更稳定，因为滑块图片本身带有阴影和渐变&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;动态混淆&lt;/strong&gt;：c 数组和 s 字符串的引入让每次验证的加密参数都不同，即使完全相同的缺口位置也会产生不同的 w3 参数&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q: 为什么绕过了极验还是被风控？&lt;/strong&gt;
A: 可能是行为数据过于规律造成的。检查轨迹生成是否加入了足够的随机性，以及浏览器性能时间线是否合理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 缺口检测不准怎么办？&lt;/strong&gt;
A: 优先使用 fullbg 和 bg 的差异检测（方法一），如果只有 fullbg 而没有 bg，再使用 Canny + 模板匹配（方法二）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 极验 v4 和 v3 有什么区别？&lt;/strong&gt;
A: v4 引入了机器学习模型，增加了设备指纹、行为序列分析等更复杂的检测手段，破解难度大幅提升。&lt;/p&gt;
</content:encoded></item><item><title>天冷了 我的博客也下雪了</title><link>https://blog.isyyo.com/posts/blog_snows/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/blog_snows/</guid><pubDate>Fri, 16 Jan 2026 17:09:00 GMT</pubDate><content:encoded>&lt;p&gt;快过年了。新闻里说，北方大雪，天地素白。我缩在岭南潮湿的冷气里，手指触着键盘，却觉得，我的博客，也正落着一场无声的雪。&lt;/p&gt;
&lt;p&gt;这雪，不是飘逸的风景，而是实实在在的、冻人的冷。它覆盖了最新文章的日期，让那个数字凝固在遥远的过去，像冰封的湖面，看不见一丝活水的涟漪。访客的踪迹渐渐稀疏，最后连零星的脚印也消失了，只剩下一片茫茫的、平坦的寂静。这片属于我的数字旷野，也迎来了它的“严寒”。&lt;/p&gt;
&lt;p&gt;冷，首先是一种空旷的回音。你精心构筑了一个房间，却许久听不到客人的脚步声与交谈声。每一次后台寂寥的数据提示，都像一股穿堂冷风，让人清醒地意识到：这里，只有你自己了。这种冷清，与窗外世界为年节张灯结彩的喧腾暖意，恰好构成刺眼的对比。仿佛所有人都在奔赴一场盛宴，而你，独自守着一片寂静的雪原。&lt;/p&gt;
&lt;p&gt;但更彻骨的冷，源自创作本身。写博客，不像在热闹的市集叫卖，可以借用人声的暖意。它更像在雪地里开辟一条新路。脚下是无人踏过的、松软深厚的积雪，每一步都陷入，都费力。你知道重复前人的脚印最省力，但那等于承认自己思想的懒惰。你不愿抄袭，不愿做那个只会在别人踩实的冰面上滑行的人。于是你只能艰难地、笨拙地，试图在茫茫白雪中，踏出一行属于自己的、歪歪扭扭的足迹。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这需要勇气，更需要耐得住冷。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;素材的贫瘠像冻土，灵感的阻滞像凝冰。常常枯坐半晌，屏幕的光映着脸，也像冷冷的雪光。脑子里不是没有念头，但飘忽如雪片，抓不住，凑不成形。好不容易聚起一点想法，又觉得它太过单薄，不足以抵御这旷野的寒风——即，经不起发布后可能无人问津的冷遇，更经不起自己内心对“意义”的审问。于是，无数半成的文稿，像未及落下便在半空凝结的冰晶，散落在草稿箱里。&lt;/p&gt;
&lt;p&gt;这过程无疑是“冷”的。没有即时的掌声取暖，没有频繁的互动生热，全凭内心那一点对“自我表达必须诚实”的笃信，像怀揣着一小截微弱的火苗，在雪地里蹒跚独行。你看见别人炉火熊熊，也见过许多人为取暖而挤入人堆，说着重复的话。但你搓搓手，呵一口白气，还是选择低下头，继续雕琢自己那块看起来并不起眼的冰——或许，它能透出一点独特的光。&lt;/p&gt;
&lt;p&gt;所以，我的博客下雪了，很冷。但这冷，未必是坏事。&lt;strong&gt;寒冷让人清醒，让人剔除浮夸的热闹，直面表达的初衷。&lt;/strong&gt; 雪覆盖了一切芜杂，只留下最本质的轮廓。在这片白茫茫中，每一次敲击键盘，都更像是一种纯粹的心跳，为了确认思考的存在，而非为了取悦谁的眼眸。&lt;/p&gt;
&lt;p&gt;我知道，春天总会来，雪终会化。到那时，由这严寒孕育出的、缓慢凝结的文字，或许会带着雪水渗入泥土般的清澈，获得一种别样的生机。它们可能不茂盛，但根系扎在自己真实的感受里。&lt;/p&gt;
&lt;p&gt;快过年了。北方大雪，我的博客也在飘雪。我在这个冰冷的、安静的数字角落里，守着一小簇不肯熄灭的火。这很冷，但这份冷，让我感到自己是真实地、清醒地活着，并写作着。&lt;/p&gt;
&lt;p&gt;这，或许就是一个个人站长，在内容寒冬里，所能拥有的最奢侈的温暖。&lt;/p&gt;
</content:encoded></item><item><title>2025，在代码与热爱里慢慢生长</title><link>https://blog.isyyo.com/posts/2025/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/2025/</guid><pubDate>Mon, 12 Jan 2026 01:01:00 GMT</pubDate><content:encoded>&lt;p&gt;2025年的指针悄然翻过，回看这一年的博客痕迹，倒像是一本零散却诚恳的成长手账。有敲代码时的沉浸，有追技术风向时的兴奋，也有偶尔停下来与自己聊聊天的安静。作为一名全栈开发者，这一年的时光，终究是花在了热爱的事情上。&lt;/p&gt;
&lt;p&gt;技术摸索依旧是主线。上半年沉迷于RVC声音克隆的玩法，把自己的声音数字化这个过程特别有趣；下半年则专心折腾静态博客和服务器，从Fuwari搭建到文章排序优化，一点点打磨出更顺眼的模样。还有用1Panel部署哪吒监控、破解TEWA-861G光猫权限这类实操，每解决一个小问题，都像给自己悄悄充了次电。这些或长或短的笔记，与其说是分享，不如说是写给自己的备忘，怕日子一久，就忘了当初怎么从坑里爬出来的。&lt;/p&gt;
&lt;p&gt;AI圈的热闹也让这一年多了不少围观与琢磨的乐趣。从豆包APP下架到智谱开源掀起的风波，那几场行业交锋看得人眼花缭乱。身在行内，一边感慨技术跑得真快，一边也觉得国内AI生态真是鲜活生猛。随手记下的几句感想，也算是给这个每天都在变的领域，留一点自己的脚印。&lt;/p&gt;
&lt;p&gt;代码之外，生活里的小兴趣也没晾着。研究B站主播PK局怎么拿首胜，纯粹是好奇背后的玩法；翻出2021年的朋友圈重新整理，像是跟几年前的自己打了个照面。那些关于对等交换的迷茫、身在主场却活成配角的失落，如今再看，已经淡淡地化开了。生活本来就是这样吧，有硬核的攻坚，也有松软的碎语。&lt;/p&gt;
&lt;p&gt;2025年没什么惊天动地的成果，更像是一步一脚印的日常累积。手里多了几样实在的技能，心里多了几分安定。接下来的一年，打算继续在技术的深水区扑腾，也想多留住一些生活里轻巧的片刻。&lt;/p&gt;
&lt;p&gt;毕竟成长从来急不得，能在喜欢的事情上慢慢扎根、慢慢生长，就已经很好。&lt;/p&gt;
</content:encoded></item><item><title>从豆包手机被封杀到智谱开源掀桌，这些天，我看到了中国AI最精彩的一场攻防战！</title><link>https://blog.isyyo.com/posts/doubao_phone/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/doubao_phone/</guid><pubDate>Sat, 13 Dec 2025 01:08:00 GMT</pubDate><content:encoded>&lt;p&gt;这些天，中国AI圈，发生了一件很有意思的事。不，应该说，是一系列很有意思的事。&lt;/p&gt;
&lt;p&gt;12月1日，字节跳动发布了豆包手机助手。&amp;lt;br&amp;gt;
12月2日，Vx开始封号。&amp;lt;br&amp;gt;
12月3日，豆包被迫下线绿泡泡操作能力。&amp;lt;br&amp;gt;
12月9日，智谱AI宣布开源AutoGLM。&lt;/p&gt;
&lt;p&gt;短短10天。从一款产品的发布，到大厂的围剿，再到另一家公司的“掀桌”式反击。&lt;/p&gt;
&lt;p&gt;说实话，我已经很久没有在中国AI圈看到这么精彩的剧情了。今天，我想把这10天发生的事，完整地挖一遍。不是为了吃瓜。是因为我真的觉得，这件事背后，藏着一些很重要的东西。关于AI的未来，关于入口之争，关于开源与闭源。甚至，关于我们每个人接下来会怎么用手机。&lt;/p&gt;
&lt;h2&gt;豆包手机，横空出世&lt;/h2&gt;
&lt;p&gt;12月1日，字节跳动旗下的豆包团队，发布了一个叫“豆包手机助手”的东西。配合中兴的nubia M153工程样机，一起面向开发者发售。说实话，刚看到这个消息的时候，我还没太当回事。&lt;/p&gt;
&lt;p&gt;毕竟，手机助手这种东西，华为有小艺，小米有小爱，OPPO有小布。不都是喊一嗓子，帮你定个闹钟、查个天气吗？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当我真正看到豆包手机助手的演示视频时，我整个人都不好了。它不只是能帮你定闹钟。它能帮你点外卖。它能帮你订机票。它能帮你在淘宝、京东、拼多多之间比价。它能帮你回复微信消息。它甚至能帮你玩小程序游戏。&lt;/p&gt;
&lt;p&gt;你只需要说一句话，它就自己打开App，自己点击，自己滑动，自己操作。就跟你雇了一个真人助理一样。&lt;/p&gt;
&lt;p&gt;这玩意儿，不是手机助手，这是手机“自动驾驶”啊。&lt;/p&gt;
&lt;p&gt;360的周鸿祎看完之后，发了一条视频，原话是：“美团淘宝的高管们可能要连夜开会了。”我觉得他说得挺对的。&lt;/p&gt;
&lt;p&gt;其实你想想看。过去，你想买一件衣服，你得打开淘宝，看首页推荐，刷信息流，看广告，然后搜索，比价，看看哪款更适合自己，然后加购物车。比如说，我之前帮我前任妈妈挑选产品时就会去大量搜索相关的知识，然后找到最适合她的产品去购买，等到我回过神来，发现自己已经花了大半天时间了。&lt;/p&gt;
&lt;p&gt;现在呢？你只需要说一句：“帮我找一件200块以内的黑色卫衣，在淘宝京东拼多多比个价，最便宜的那个帮我加购物车。”然后，你就可以去干别的了。AI会帮你搞定一切。你甚至都不需要打开淘宝的首页。&lt;/p&gt;
&lt;p&gt;淘宝首页的广告位，没人看了。美团首页的推荐位，没人看了。&lt;/p&gt;
&lt;p&gt;所有超级App花了十几年时间，精心设计的“流量漏斗”，被AI直接绕过去了。&lt;strong&gt;这，才是让大厂们睡不着觉的原因！&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;大厂反击&lt;/h2&gt;
&lt;p&gt;豆包手机发布之后，资本市场先沸腾了。12月2日，中兴通讯直接涨停，成交额超过137亿。那台3499元的工程样机，一度在闲鱼上被炒到了6000多块。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;就在同一天晚上，有用户发现，自己的绿泡泡被封了。提示是：“登录环境异常”。而这些被封号的用户，有一个共同点：他们都在用豆包手机助手，操作绿泡泡。&lt;/p&gt;
&lt;p&gt;消息传出来之后，柱群里一片哗然。有人说，这是“定点打击”。有人说，这是“大厂围剿”的开始。《中国企业家》去问，回应是：“没有什么特别动作。”但行业里的人都懂。这次封号只是第一枪。&lt;/p&gt;
&lt;p&gt;果然，紧接着，淘宝也出手了。有用户发现，用豆包手机助手在淘宝比价的时候，会频繁跳出人机验证。有的直接闪退，有的被强制登出账号。再然后，农业银行、建设银行的App也开始出现针对性的风控措施。在录屏状态下，银行App直接不让用了。&lt;/p&gt;
&lt;p&gt;你看，这就是大厂的反应速度。72小时之内，VX、淘宝、银行，三道防线全部架起来了。&lt;/p&gt;
&lt;p&gt;周鸿祎预测得没错：“大厂绝不会坐视不管，接下来会展开技术攻防战。”&lt;/p&gt;
&lt;p&gt;12月3日晚上，豆包手机助手团队发了一条公告。原话是：“豆包手机助手Pro模式已经下线操作vx的能力。在Nubia M153上被禁止登录的vx账号正陆续解封，请大家等待一段时间并尝试重新登录。”&lt;/p&gt;
&lt;p&gt;说实话，看到这条公告的时候，我是有点失望的。但我也理解。毕竟，微信是什么？是12亿人的社交基础设施。是很多人的数字生命线。豆包再牛，也不能让用户的vx被封吧？这个锅，字节背不起。更何况，豆包手机助手本来就是个“技术预览版”，是给开发者玩的工程机。&lt;/p&gt;
&lt;p&gt;字节从一开始就说了，这不是面向普通消费者的产品。所以，退让，是意料之中的选择。&lt;/p&gt;
&lt;p&gt;但问题是，退让之后呢？AI手机助手这个方向，还能不能走下去？如果每个超级App都像Vx一样，一言不合就封号，那AI助手不就成了一个“孤岛”吗？说白了，你只能在自己的App里玩，出了门就寸步难行。这还叫什么“智能助手”？&lt;/p&gt;
&lt;p&gt;我当时觉得，AI手机可能要凉一阵子了。但我没想到，真正的高潮，还在后面。&lt;/p&gt;
&lt;h2&gt;智谱掀桌，AutoGLM开源&lt;/h2&gt;
&lt;p&gt;12月9日，就在我以为这件事要告一段落的时候，智谱AI投下了一颗重磅炸弹。&lt;/p&gt;
&lt;p&gt;他们宣布，开源AutoGLM。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AutoGLM是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;简单说，它就是智谱版的“豆包手机助手”。一个能像真人一样操作手机的AI Agent。能点外卖，能订机票，能刷抖音，能发微信。&lt;/p&gt;
&lt;p&gt;而且，智谱这次开源的，不是一个阉割版。是完整的核心模型、Phone Use能力框架、工具链，还有覆盖50多个高频中文App的可跑通Demo。&lt;/p&gt;
&lt;p&gt;换句话说，只要你愿意，你现在就可以自己搭建一个“豆包手机助手”。不需要字节的许可，不需要中兴的手机，不需要任何人的授权。技术，完全公开。代码，随便拿。&lt;/p&gt;
&lt;p&gt;智谱在公告里说了一句话，我印象特别深：“这件事只在一家公司做，是不够的。AutoGLM开源的第一层初衷，是把这一层能力变成整个行业可以共同拥有、共同打磨的公共底座。”&lt;/p&gt;
&lt;p&gt;说实话，看到这句话的时候，我鸡皮疙瘩都起来了。&lt;/p&gt;
&lt;p&gt;这是什么意思？意思是：大厂可以围剿豆包，但大厂没办法引到整个开源社区。&lt;/p&gt;
&lt;p&gt;你可以封杀一家公司，但你封不了千千万万个基于开源框架自己搭建的Agent。&lt;strong&gt;这，就叫“掀桌”。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;这场攻防战，到底在争什么？&lt;/h2&gt;
&lt;p&gt;说到这里，我想聊一个更本质的问题。这场攻防战，到底在争什么？&lt;/p&gt;
&lt;p&gt;表面上看，是隐私安全。Vx说，你读取我的聊天记录，不安全。淘宝说，你抓取我的商品数据，不合规。银行说，你在录屏状态下操作，有风险。这些理由，对不对？当然对。&lt;/p&gt;
&lt;p&gt;但真正的原因，显然不止于此。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;真正的原因是：流量入口之争。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其实你想想看，过去十几年，互联网大厂是怎么赚钱的？答案是：&lt;strong&gt;流量！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你打开淘宝，首页有广告位，你刷信息流，又有广告，你搜索商品，还有竞价排名。每一次点击，每一次浏览，都是钱。&lt;/p&gt;
&lt;p&gt;微信也一样。朋友圈广告，小程序广告，公众号广告，视频号广告。12亿用户的注意力，就是腾讯最大的金矿。&lt;/p&gt;
&lt;p&gt;但现在，AI手机助手来了。它可以绕过首页，绕过广告，绕过信息流，直接帮你完成任务。用户的注意力，被AI“截胡”了。大厂能不急吗？&lt;/p&gt;
&lt;p&gt;这不是什么隐私问题。这是断人财路的生死存亡的问题。所以，封号，风控，限制。本质上，都是在保护自己的流量入口。&lt;/p&gt;
&lt;p&gt;但问题是，保护得了吗？技术的潮水，不是一两道防线能挡住的。&lt;/p&gt;
&lt;h2&gt;开源，才是真正的“核武器”&lt;/h2&gt;
&lt;p&gt;说实话，智谱这次开源，让我想起了一句话：“最好的防守，就是进攻。”不对，应该是：“最好的反围剿，就是让技术成为公共品。”&lt;/p&gt;
&lt;p&gt;其实你想想看，历史上那些改变世界的技术，最后都走向了什么？Linux开源了，所以我们今天有了安卓，有了云计算。Stable Diffusion开源了，所以AI绘画才能遍地开花。LLaMA开源了，所以国产大模型才有了追赶的起点。&lt;/p&gt;
&lt;p&gt;每一次开源，都是一次技术民主化。每一次开源，都是对封闭生态的一次冲击。&lt;/p&gt;
&lt;p&gt;智谱这次开源AutoGLM，意义是一样的。它把AI手机助手这个能力，从“大厂核武器”变成了“人人可用的工具”。&lt;/p&gt;
&lt;p&gt;以后，不只是字节能做AI手机。华为能做，小米能做，OPPO能做，甚至你自己，也能做。大厂可以围剿一家公司，但大厂没法围剿整个开源社区。&lt;/p&gt;
&lt;p&gt;说到这里，我突然想起了一个故事。2001年，微软的CEO史蒂夫·鲍尔默，在接受媒体采访时，说了一句后来被载入史册的话：“Linux是一种癌症。”&lt;/p&gt;
&lt;p&gt;他还说，Linux在知识产权上“像癌细胞一样，会附着于它所碰到的一切”。那时候的微软，如日中天。Windows垄断了全球90%以上的电脑操作系统市场。而Linux，只是一群程序员在业余时间捣鼓的开源项目。微软觉得，这玩意儿就是个玩具。&lt;/p&gt;
&lt;p&gt;于是，微软开始了长达十几年的“围剿Linux”行动。专利诉讼，有。资助SCO起诉IBM，有。散布FUD（恐惧、不确定、怀疑），有。能用的手段，全都用上了。&lt;/p&gt;
&lt;p&gt;结果呢？Linux不仅没死。&lt;/p&gt;
&lt;h2&gt;这跟我们有什么关系？&lt;/h2&gt;
&lt;p&gt;说了这么多，你可能会问：这些大厂之间的攻防战，跟我有什么关系？&lt;/p&gt;
&lt;p&gt;其实关系很大。因为这件事的本质，是在决定未来我们怎么用手机。&lt;/p&gt;
&lt;p&gt;其实你想想看。过去十几年，我们用手机的方式是什么？是“打开App”。想买东西，打开淘宝。想点外卖，打开美团。想聊天，打开微信。每一个需求，都对应一个App。&lt;/p&gt;
&lt;p&gt;但未来呢？如果AI手机助手真的普及了，我们用手机的方式可能会变成：“说一句话”。你只需要告诉AI你想干什么，AI就帮你搞定一切。你甚至不需要知道淘宝和京东有什么区别，不需要知道美团和饿了么哪个便宜。AI会帮你比较，帮你选择，帮你下单。&lt;/p&gt;
&lt;p&gt;这意味着什么？意味着App的“界面”不再重要了。意味着“用户注意力”的分配方式，要彻底改变了。意味着过去十几年建立的互联网商业模式，可能要被重写了。这不是危言耸听。这是正在发生的事情。&lt;/p&gt;
&lt;h2&gt;技术的潮水，终究是挡不住的&lt;/h2&gt;
&lt;p&gt;AI手机助手能帮我们做的，是那些重复的、机械的、没有创造性的操作。比价、下单、订票、查天气、设闹钟。这些事情，交给AI就好了。而我们自己呢？应该把时间和精力，留给那些更难、也更值得的事情。比如，去读一本难一点的书。比如，去和朋友聊一场更长的天。比如，去想清楚自己到底想要什么。AI越来越强大，不是为了让我们变得更懒。而是为了让我们有更多的时间和空间，去做那些只有人类才能做的事情。&lt;/p&gt;
&lt;p&gt;这10天，我看到了大厂的围剿，也看到了开源的反击。我看到了技术的力量，也看到了商业的博弈。我看到了24年预测历史，也看到了它在今天的重演。&lt;/p&gt;
&lt;p&gt;当年的微软阻挡不了Linux。今天的大厂，也未必能阻挡AI Agent。&lt;/p&gt;
&lt;p&gt;但最让我感慨的，还是那句话：&lt;strong&gt;技术的潮水，终究是挡不住的。&lt;/strong&gt; 而我们能做的，就是学会在潮水中游泳。24年前，微软说Linux是癌症。24年后，微软说我爱Linux。历史总是惊人的相似。而站在历史正确的一边，从来都不晚。&lt;/p&gt;
</content:encoded></item><item><title>TEWA-861G SUPERADMIN权限获取</title><link>https://blog.isyyo.com/posts/tewa-861g/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/tewa-861g/</guid><pubDate>Thu, 23 Oct 2025 22:38:00 GMT</pubDate><content:encoded>&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;光猫后端其实没有鉴定用户身份，只是在前端通过删除部分菜单来实现用户的区分&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image.Bn1fshrF_ZrY9iG.webp&quot; alt=&quot;&quot; /&gt;
​​​
这是普通用户 user的网络菜单&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-1.DtUVimEd_ZEWpFG.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是超级管理员 superadmin的网络菜单&lt;/p&gt;
&lt;p&gt;那么我们就可以hook该方法，通过普通用户user来进行superadmin的操作&lt;/p&gt;
&lt;h2&gt;方法（EDGE为例）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开调试台（F12），打开“网络”一栏，并刷新页面
&lt;img src=&quot;https://blog.isyyo.com/_astro/image-2.DN5ayg07_Z2pSE1y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ctrl+F搜索&quot;isAdmin&quot;(无需带引号)，并定位到所在文件
&lt;img src=&quot;https://blog.isyyo.com/_astro/image-3.i53BBZ1P_Z18jiYK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右键选择&quot;在源面板中打开“
&lt;img src=&quot;https://blog.isyyo.com/_astro/image-4.CdZbQWSt_mfBkL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再次Ctrl+F查找&quot;isAdmin&quot;，并在 isAdmin代码所属行行前行号打上断点（单击行号）
&lt;img src=&quot;https://blog.isyyo.com/_astro/image-5.DCsW2i1G_ZWRQ7Q.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.isyyo.com/_astro/image-6.BIwI1edd_Z1yOSzc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用你的user账号登陆（账号密码位于你的光猫背面），此时跳转后会显示”已在调试程序中暂停“
&lt;img src=&quot;https://blog.isyyo.com/_astro/image-7.vXmUIBOn_ZKPE1U.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再次定位到&quot;isAdmin&quot;（找不到的Ctrl+F搜索）
在这行下方加入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;return;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-8.CjejUHb7_1a6zWx.webp&quot; alt=&quot;&quot; /&gt;
Ctrl+S保存，F8继续运行&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;BINGO！现在你就获得了SUPERADMIN的权限啦！&lt;/p&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;p&gt;因为网页会定时刷新来检测权限，刷新后会再次来到第5步（如下图），重做5-6步即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-9.CoCmL58c_RiJke.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Fuwari搭建指北</title><link>https://blog.isyyo.com/posts/fuwari_tutorial/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/fuwari_tutorial/</guid><description>想要拥有一个加载速度快、设计优雅的静态博客？Fuwari或许正是你需要的解决方案。</description><pubDate>Wed, 22 Oct 2025 12:59:00 GMT</pubDate><content:encoded>&lt;h2&gt;环境准备&lt;/h2&gt;
&lt;p&gt;在开始之前，请确保你的系统满足以下要求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node.js &amp;gt;= 20&lt;/li&gt;
&lt;li&gt;pnpm &amp;gt;= 9&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;安装 Node.js&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://nodejs.org/&quot;&gt;Node.js 官网&lt;/a&gt;，下载并安装 Node.js LTS 版本&lt;/li&gt;
&lt;li&gt;安装完成后，打开终端，验证安装：&lt;pre&gt;&lt;code&gt;node --version
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;安装 pnpm&lt;/h3&gt;
&lt;p&gt;在终端中执行以下命令安装 pnpm：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g pnpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm --version
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装 Fuwari&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;克隆项目仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/yyhhkya/fuwari.git
cd fuwari
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装依赖：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm install
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动开发服务器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm dev
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现在你可以在浏览器中访问 &lt;code&gt;http://localhost:4321&lt;/code&gt; 查看博客了。&lt;/p&gt;
&lt;h2&gt;配置修改&lt;/h2&gt;
&lt;h3&gt;基本配置&lt;/h3&gt;
&lt;p&gt;主要配置文件位于 &lt;code&gt;src/config.ts&lt;/code&gt;，你需要修改以下内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;网站标题、描述&lt;/li&gt;
&lt;li&gt;作者信息&lt;/li&gt;
&lt;li&gt;社交媒体链接&lt;/li&gt;
&lt;li&gt;评论系统配置&lt;/li&gt;
&lt;li&gt;导航菜单设置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;自定义样式&lt;/h3&gt;
&lt;p&gt;你可以通过修改以下文件来自定义网站样式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;src/styles/variables.styl&lt;/code&gt; - 主题颜色等变量&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/styles/main.css&lt;/code&gt; - 全局样式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;src/styles/markdown.css&lt;/code&gt; - 文章内容样式&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;创建文章&lt;/h3&gt;
&lt;p&gt;使用以下命令创建新文章：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm new-post &amp;lt;文章标题&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文章将在 &lt;code&gt;src/content/posts&lt;/code&gt; 目录下创建，使用 Markdown 格式编写。&lt;/p&gt;
&lt;h3&gt;创建自定义页面&lt;/h3&gt;
&lt;p&gt;使用以下命令创建自定义页面：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm new-page &amp;lt;页面名称&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;页面将在 &lt;code&gt;src/content/spec&lt;/code&gt; 目录下创建，使用 Markdown 格式编写。&lt;/p&gt;
&lt;h2&gt;部署方案&lt;/h2&gt;
&lt;h3&gt;GitHub Pages 部署&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在 GitHub 仓库设置中启用 GitHub Pages&lt;/li&gt;
&lt;li&gt;配置 GitHub Actions 工作流（项目已内置）&lt;/li&gt;
&lt;li&gt;推送代码后会自动构建并部署&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;服务器部署&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;配置 &lt;code&gt;auto-deploy-fuwari/auto-deploy.sh&lt;/code&gt; 脚本中的服务器信息&lt;/li&gt;
&lt;li&gt;在服务器上设置好 nginx 配置&lt;/li&gt;
&lt;li&gt;GitHub Actions 构建完成后会自动部署到服务器&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;功能说明&lt;/h2&gt;
&lt;p&gt;Fuwari 二开版包含以下主要功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎨 明暗主题切换&lt;/li&gt;
&lt;li&gt;🔍 内置搜索功能&lt;/li&gt;
&lt;li&gt;📝 Markdown 和 MDX 支持&lt;/li&gt;
&lt;li&gt;🏷️ 标签和分类系统&lt;/li&gt;
&lt;li&gt;💬 Giscus 评论系统&lt;/li&gt;
&lt;li&gt;📱 响应式设计&lt;/li&gt;
&lt;li&gt;🔝 文章置顶&lt;/li&gt;
&lt;li&gt;🔗 友链管理&lt;/li&gt;
&lt;li&gt;📊 统计代码集成&lt;/li&gt;
&lt;li&gt;🚀 自动部署&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;构建失败怎么办？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查 Node.js 版本是否符合要求&lt;/li&gt;
&lt;li&gt;确保使用 pnpm 安装依赖&lt;/li&gt;
&lt;li&gt;查看 GitHub Actions 日志定位具体错误&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如何修改友链？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编辑 &lt;code&gt;src/friends_data.ts&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;按照已有格式添加或修改友链信息&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如何添加统计代码？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;src/head_data.ts&lt;/code&gt; 中添加统计代码&lt;/li&gt;
&lt;li&gt;支持百度统计、Google Analytics 等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;Fuwari 提供了一个现代化、功能完善的博客解决方案。通过本教程的指引，你应该已经能够成功搭建并运行自己的博客。如果在使用过程中遇到问题，欢迎查阅 &lt;a href=&quot;https://github.com/yyhhkya/fuwari&quot;&gt;项目文档&lt;/a&gt; 或提交 Issue。&lt;/p&gt;
</content:encoded></item><item><title>1Panel部署哪吒监控</title><link>https://blog.isyyo.com/posts/nezha/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/nezha/</guid><pubDate>Tue, 21 Oct 2025 21:26:00 GMT</pubDate><content:encoded>&lt;p&gt;首先先把你的域名解析到Dashboard服务器上。&lt;/p&gt;
&lt;h2&gt;安装哪吒&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image.87RPd7mA_ejMaF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;搜索&lt;code&gt;哪吒&lt;/code&gt;直接安装&lt;/p&gt;
&lt;h2&gt;配置反代&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-1.BPQGNBQ7_Z25hiLl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填好必要配置，启用&lt;code&gt;https&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-2.BOpcbVL4_1FvT8p.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;upstream dashboard {
    keepalive 512;
    server 127.0.0.1:8008;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在该处添加以上代码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-3.BApfhEzH_10J5AD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location ^~ / {
    proxy_pass http://127.0.0.1:8008;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header nz-realip $http_cf_connecting_ip;
    proxy_set_header Connection &quot;upgrade&quot;;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
    proxy_buffer_size 128k;
    proxy_buffers 4 128k;
    proxy_busy_buffers_size 256k;
    proxy_max_temp_file_size 0;
    add_header X-Cache $upstream_cache_status;
    add_header Cache-Control no-cache;
    proxy_ssl_server_name off;
    proxy_ssl_name $proxy_host;
    add_header Strict-Transport-Security &quot;max-age=31536000&quot;;
}

underscores_in_headers on;
set_real_ip_from 0.0.0.0/0; # CDN 回源 IP 地址段
real_ip_header CF-Connecting-IP; # CDN 私有 header，此处为 CloudFlare 默认

# gRPC 服务
location ^~ /proto.NezhaService/ {
    grpc_set_header Host $host;
    grpc_set_header nz-realip $http_CF_Connecting_IP;
    grpc_read_timeout 600s;
    grpc_send_timeout 600s;
    grpc_socket_keepalive on;
    client_max_body_size 10m;
    grpc_buffer_size 4m;
    grpc_pass grpc://dashboard;
}

# WebSocket 服务
location ~* ^/api/v1/ws/(server|terminal|file)(.*)$ {
    proxy_set_header Host $host;
    proxy_set_header nz-realip $http_cf_connecting_ip;
    proxy_set_header Origin https://$host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection &quot;upgrade&quot;;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
    proxy_pass http://127.0.0.1:8008;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在该处添加以上代码&lt;/p&gt;
&lt;h2&gt;哪吒面板配置&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-4.BKgKBUXA_1eQ7ga.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Agent对接地址填写&lt;code&gt;刚刚创建的站点域名:443&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;并启用&lt;code&gt;TLS连接&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;结尾&lt;/h2&gt;
&lt;p&gt;好了，现在Dashboard已经全部配置完成，接下来只需傻瓜式添加你需要监控的服务器即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-5.Dz_iKE1w_1geTE2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>回顾一下2021年9月7日我发的一个朋友圈</title><link>https://blog.isyyo.com/posts/review_20210917/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/review_20210917/</guid><pubDate>Sun, 19 Oct 2025 20:53:00 GMT</pubDate><content:encoded>&lt;p&gt;那夜，我将自己剖开，一字一句地写在朋友圈里。像迷路的人，在黑暗里点起一束微光，不为照亮前路，只为看看自己身在何处。那些关于&quot;对等交换&quot;的困惑，那些身为主角却活成配角的怅惘，在屏幕上凝成一声无声的叹息。&lt;/p&gt;
&lt;p&gt;发出后，手机屏幕便亮起温柔的星霭。那些名字，像夜航途中远远望见的灯塔，一座接一座地亮起回应的光。&quot;好起来啊哥&quot;——话语简单，却像一只温热的手，沉沉地落在我的肩上。&quot;不要在意别人说什么没必要&quot;——这话像一阵清风，试图吹散我心头的雾霭。最触动我的，是那句朴素的真理：&quot;在生活中，每个人都是主角，你是为自己而活不是为别人而活。&quot;&lt;/p&gt;
&lt;p&gt;那时，我将这些话语一一拾起，如同落水者抓住伸来的竹篙。它们是我在情感泥沼中，四面八方抛来的绳索。&lt;/p&gt;
&lt;p&gt;如今，时过境迁。有些重量确实从肩上卸下了。白昼来临，我能更从容地划下边界，更清晰地辨认自己的轮廓。那些温暖的安慰，像春风化雨，润泽了干涸的自我。&lt;/p&gt;
&lt;p&gt;只是，有些战役转入了更深的腹地。&lt;/p&gt;
&lt;p&gt;当暮色四合，世界安静下来，另一种清醒便悄然浮现。这时，我会取出那个小小的白色药盒，打开时发出细微的声响。那片小小的安眠药，是我与黑夜达成的契约，是让喧嚣的思绪暂时停驻的渡船。温水送服，像完成一个虔诚的仪式——我在学习与这份深夜独有的清醒和解，也在学习接受这些小小的、人为的宁静。&lt;/p&gt;
&lt;p&gt;月光如水，照见的不再是纷乱的涟漪，而是一片渐渐平息的湖面。朋友们的箴言，被我悉心收藏，它们是我行囊里的珍宝，给予我前行的底气。但有些路，终究要自己一步一步去丈量。这条认识自己、接纳自己的路途，远比想象中蜿蜒与漫长。&lt;/p&gt;
&lt;p&gt;迷路人的篝火早已熄灭，但我依然在这片原野上行走。带着那些温暖的火种，也带着这份需要借助小小药片才能获得的安眠。每一个平静入睡的夜晚，都是一个小小的胜利；每一次在晨曦中自然醒来，都是一份值得感激的馈赠。天光，总是在人最需要希望的时刻，悄然浸染窗棂。而我，还在学习与自己和睦相处，等待内心真正安宁的那一天。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image.De9QUyND_2jiG31.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-1.7a9ff8Xz_Z2h39sS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>优化文章排序</title><link>https://blog.isyyo.com/posts/optimize_article_sorting/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/optimize_article_sorting/</guid><description>让Fuwari更优雅的排序文章</description><pubDate>Tue, 14 Oct 2025 07:54:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题背景&lt;/h2&gt;
&lt;p&gt;默认情况下，Fuwari 使用简单的日期格式（如 &lt;code&gt;2025-10-14&lt;/code&gt;）来标记文章发布时间。这种格式在同一天发布多篇文章时无法提供精确的排序，因为缺少时间信息。&lt;/p&gt;
&lt;h2&gt;修改 new-post.js&lt;/h2&gt;
&lt;p&gt;默认的 &lt;code&gt;scripts/new-post.js&lt;/code&gt; 脚本只生成日期，我们需要修改它以包含完整的时间信息。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function getDate() {
	const today = new Date();
	const year = today.getFullYear();
	const month = String(today.getMonth() + 1).padStart(2, &quot;0&quot;);
	const day = String(today.getDate()).padStart(2, &quot;0&quot;);
	const hours = String(today.getHours()).padStart(2, &quot;0&quot;);
	const minutes = String(today.getMinutes()).padStart(2, &quot;0&quot;);

	return `${year}-${month}-${day}`;
	return `${year}-${month}-${day}T${hours}:${minutes}:00`;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>使用RVC克隆自己的声音</title><link>https://blog.isyyo.com/posts/rvc/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/rvc/</guid><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;硬件要求&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU&lt;/strong&gt;：推荐使用N卡，显存推荐8G以上。使用GPU训练和推理速度极快。CPU虽然也能用，但速度会非常慢，不适合训练。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：至少16G。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬盘&lt;/strong&gt;：预留20-30GB可用空间，用于存放模型和音频数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软件&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作系统&lt;/strong&gt;：Windows。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI&quot;&gt;&lt;strong&gt;RVC&lt;/strong&gt;&lt;/a&gt;：用于训练模型。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Anjok07/ultimatevocalremovergui&quot;&gt;&lt;strong&gt;UVR&lt;/strong&gt;&lt;/a&gt;：用于分离人声。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;训练你自己的声音模型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据准备（数据集）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;音源要求&lt;/strong&gt;： 准备你想要克隆的声音的音频文件（如你自己的声音），要求：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;格式&lt;/strong&gt;：&lt;code&gt;.wav&lt;/code&gt;（最佳）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量&lt;/strong&gt;： 高清、无损最好。人声清晰，没有背景噪音、没有混响、没有音乐。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内容&lt;/strong&gt;： 如果是说话声音，需要包含多种音调；如果是唱歌，需要包含你的音域。时长10分钟到30分钟的纯净人声即可获得不错的效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;采样率&lt;/strong&gt;： 最好是44100Hz。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何获取干净人声？&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自己录制&lt;/strong&gt;： 使用Audacity等录音软件，在安静的环境下录制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提取干声&lt;/strong&gt;： 如果是从已有歌曲中提取，需要使用&lt;strong&gt;UVR&lt;/strong&gt;将人声和背景音乐分离开。
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;UVR设置&lt;/strong&gt;：
&lt;img src=&quot;https://blog.isyyo.com/_astro/uvr.B6IRfZqE_Z1hwrMa.webp&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;输出文件&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instrumental&lt;/strong&gt;：背景音乐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vocals&lt;/strong&gt;：人声&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据处理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;将所有准备好的&lt;code&gt;.wav&lt;/code&gt;文件放在一个单独的文件夹里，例如&lt;code&gt;./dataset/your_name/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;文件名&lt;strong&gt;不要有中文或特殊符号&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开始训练&lt;/strong&gt;：
运行&lt;code&gt;go-web.bat&lt;/code&gt;。设置好参数后点击&lt;code&gt;一键训练&lt;/code&gt;即可。
&lt;img src=&quot;https://blog.isyyo.com/_astro/rvc.CTp7dp-3_ZXnD36.webp&quot; alt=&quot;&quot; /&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;总训练轮数&lt;/strong&gt;：建议300-500&amp;lt;br&amp;gt;
&lt;em&gt;训练轮数越多，耗时越长，请自行规划好时间。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;使用模型进行声音转换&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/rvc_2.DErBfPAd_Zpfl5V.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;切换至&lt;code&gt;模型推理&lt;/code&gt;，点击&lt;code&gt;刷新&lt;/code&gt;就能看到训练好的模型。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;待处理音频文件路径&lt;/code&gt;填写需要转换的音频文件路径，同样需要为&lt;strong&gt;干净的人声&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这一步很快，一首歌的时间大概仅需10秒左右。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;希望这份教程能帮助你顺利进入RVC的世界！创作时请务必遵守法律法规，尊重他人的声音版权。&lt;/p&gt;
</content:encoded></item><item><title>B站主播PK打首胜的最佳攻略</title><link>https://blog.isyyo.com/posts/bilibili_pk/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/bilibili_pk/</guid><description>掌握B站PK机制，利用双倍积分加成快速升级段位的实用技巧</description><pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在B站直播PK中，想要快速升级段位并获得首胜，掌握正确的策略至关重要。本文将详细介绍如何利用积分加成机制，最大化你的PK收益。&lt;/p&gt;
&lt;h2&gt;核心机制解析&lt;/h2&gt;
&lt;h3&gt;首个礼物双倍加成&lt;/h3&gt;
&lt;p&gt;当主播开始连线PK时，每个观众的&lt;strong&gt;首个礼物&lt;/strong&gt;都会享受&lt;strong&gt;2倍积分加成&lt;/strong&gt;。这是一个非常重要的机制，但需要根据实际情况灵活运用：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;策略选择：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;观察对面&lt;/strong&gt;：如果对面没有送礼物，可以选择完全不送或送中等价值礼物&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免绝杀&lt;/strong&gt;：当两边分数差距过大时，会触发绝杀效果，此时前期投入可能白费&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保守策略&lt;/strong&gt;：开头可以送一些中等价值的礼物测试水温，避免过度投入&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;后半场双倍加成触发&lt;/h3&gt;
&lt;p&gt;除了首个礼物的固定加成外，PK的后半场还会触发一次&lt;strong&gt;不限首个礼物的2倍加成&lt;/strong&gt;。这个加成的触发条件在每局PK中可能有所不同，常见的触发条件包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;投喂达标&lt;/strong&gt;：投喂大于等于10电池&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人数差距&lt;/strong&gt;：投喂人数差一人时触发&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他条件&lt;/strong&gt;：根据不同PK场次可能有其他触发机制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一旦触发，所有礼物都能享受双倍积分，这是获得高积分的关键时机。&lt;/p&gt;
&lt;h2&gt;最佳策略：后半场集中火力&lt;/h2&gt;
&lt;h3&gt;策略核心&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;将所有礼物都集中在后半场投放&lt;/strong&gt;，这样做的好处是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最大化积分收益&lt;/strong&gt;：后半场的双倍加成不限制礼物类型和数量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免前期浪费&lt;/strong&gt;：前期只有首个礼物有加成，后续礼物按原始积分计算&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集中优势&lt;/strong&gt;：在关键时刻形成压倒性优势&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;具体操作步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前期观察&lt;/strong&gt;：PK开始后先观察局势，不要急于投礼物&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;等待时机&lt;/strong&gt;：关注后半场双倍加成的触发信号&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集中投放&lt;/strong&gt;：一旦后半场加成触发，立即投入所有准备好的礼物&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;把握节奏&lt;/strong&gt;：在PK即将结束前的关键时刻发力&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;段位提升技巧&lt;/h2&gt;
&lt;h3&gt;首胜段位分翻倍&lt;/h3&gt;
&lt;p&gt;获得首胜后，段位分会享受&lt;strong&gt;翻倍奖励&lt;/strong&gt;，这是快速升级的关键。结合上述策略，你可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提高首胜概率&lt;/li&gt;
&lt;li&gt;最大化每次胜利的段位收益&lt;/li&gt;
&lt;li&gt;快速突破段位瓶颈&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;长期规划&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;资源管理&lt;/strong&gt;：合理分配礼物预算，不要在单场PK中过度投入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时机选择&lt;/strong&gt;：选择合适的PK场次参与，避开过于激烈的竞争&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;持续学习&lt;/strong&gt;：观察其他高段位玩家的策略，不断优化自己的打法&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;风险控制&lt;/strong&gt;：虽然后半场策略收益更高，但也要注意控制投入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵活应变&lt;/strong&gt;：根据实际PK情况调整策略，不要死板执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理性消费&lt;/strong&gt;：娱乐为主，理性参与，避免过度消费&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过合理利用B站PK的双倍积分机制，特别是将礼物集中在后半场投放，可以显著提高积分效率和首胜概率。配合首胜段位分翻倍的奖励机制，这种策略能够帮助你快速提升段位，在PK中获得更好的体验。&lt;/p&gt;
&lt;p&gt;记住，最重要的是享受直播互动的乐趣，理性参与，适度消费。&lt;/p&gt;
</content:encoded></item><item><title>锐评B站粉丝勋章亲密度升级公告</title><link>https://blog.isyyo.com/posts/bilibili_live_medal/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/bilibili_live_medal/</guid><description>深度解析B站粉丝勋章亲密度升级公告，揭示表面优化背后的商业逻辑与用户体验倒退</description><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;2025年8月11日，B站发布了粉丝勋章亲密度&lt;a href=&quot;https://link.bilibili.com/p/eden/news#/newsdetail?id=4644&quot;&gt;升级公告&lt;/a&gt;，宣布将在9月8日进行全面改版。作为一个长期使用B站的用户，我仔细研读了这份公告，发现了一些值得深思的问题。&lt;/p&gt;
&lt;h2&gt;🔍 表面的&quot;升级&quot;，实质的削弱&lt;/h2&gt;
&lt;h3&gt;等级上限提升的假象&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;看似的进步：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;等级上限从40级提升至120级&lt;/li&gt;
&lt;li&gt;非大航海用户也能突破20级限制&lt;/li&gt;
&lt;li&gt;统一了升级体系&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;实际的影响：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;120级的设定只是数字膨胀，并未带来实质性的体验提升&lt;/li&gt;
&lt;li&gt;大航海用户失去了21-40级的独占性，这对付费用户来说是一种&quot;降权&quot;&lt;/li&gt;
&lt;li&gt;等级的稀缺性和象征意义被稀释&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;亲密度获取的大幅缩水&lt;/h3&gt;
&lt;p&gt;让我们用数据说话，对比新旧规则下的亲密度获取效率：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;行为&lt;/th&gt;
&lt;th&gt;旧规则&lt;/th&gt;
&lt;th&gt;新规则&lt;/th&gt;
&lt;th&gt;削弱幅度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;观看直播(5分钟)&lt;/td&gt;
&lt;td&gt;300亲密度&lt;/td&gt;
&lt;td&gt;6亲密度&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;投币&lt;/td&gt;
&lt;td&gt;100亲密度/硬币&lt;/td&gt;
&lt;td&gt;10亲密度/硬币&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;充电&lt;/td&gt;
&lt;td&gt;500亲密度/B币&lt;/td&gt;
&lt;td&gt;10亲密度/B币&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;礼物&lt;/td&gt;
&lt;td&gt;50亲密度/电池&lt;/td&gt;
&lt;td&gt;1亲密度/电池&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这样的削弱幅度，还能叫&quot;优化&quot;吗？&lt;/p&gt;
&lt;h2&gt;💰 商业逻辑的&quot;精明&quot;算计&lt;/h2&gt;
&lt;h3&gt;延长用户生命周期&lt;/h3&gt;
&lt;p&gt;通过大幅降低亲密度获取效率，B站实现了几个商业目标：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;延长用户达到高等级的时间&lt;/strong&gt;：原本可能几个月达到的等级，现在需要几年&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增加用户粘性&lt;/strong&gt;：120级的&quot;远大目标&quot;让用户有了长期留存的理由&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;细水长流&lt;/strong&gt;：用户需要更长时间才能&quot;毕业&quot;，延长了平台的用户生命周期&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;刺激付费转化&lt;/h3&gt;
&lt;p&gt;虽然取消了21级门槛，但付费用户的优势实际上是&lt;strong&gt;增强&lt;/strong&gt;了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1.5倍亲密度加成&lt;/strong&gt;：在获取效率大幅下降的背景下，这个加成变得更加珍贵&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更高的每日上限&lt;/strong&gt;：舰长25W、提督100W、总督400W的上限差异更加明显&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相对优势扩大&lt;/strong&gt;：免费用户体验下降，付费用户的相对优势反而增加&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🎭 话术包装的&quot;艺术&quot;&lt;/h2&gt;
&lt;p&gt;这份公告最让人&quot;佩服&quot;的是其话术包装技巧：&lt;/p&gt;
&lt;h3&gt;经典话术解析&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&quot;此次改版不会对粉丝勋章的升级速度产生负面影响&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;现实：亲密度获取效率削弱98%&lt;/li&gt;
&lt;li&gt;解释：降低了升级所需亲密度总量&lt;/li&gt;
&lt;li&gt;真相：削弱幅度远大于降低幅度，实际升级速度大幅下降&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&quot;在相同的互动场景下将会获得更快的粉丝勋章升级速度&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这是典型的文字游戏&lt;/li&gt;
&lt;li&gt;通过调整分母（升级所需亲密度）来掩盖分子（获取效率）的大幅削弱&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&quot;观众老爷们&quot;的称呼&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表面恭维，实际上是在&quot;割韭菜&quot;时的客套话&lt;/li&gt;
&lt;li&gt;越是客气的称呼，往往意味着越大的&quot;刀子&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;📊 受影响群体分析&lt;/h2&gt;
&lt;h3&gt;普通用户：受冲击最大&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;影响：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原本通过观看、投币等免费方式升级的路径被大幅削弱&lt;/li&gt;
&lt;li&gt;需要花费数倍时间才能达到相同等级&lt;/li&gt;
&lt;li&gt;互动成本大幅上升，体验明显下降&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;应对策略：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;调整心态，接受&quot;佛系&quot;升级&lt;/li&gt;
&lt;li&gt;重新评估投入产出比&lt;/li&gt;
&lt;li&gt;考虑是否值得继续深度参与&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;大航海用户：喜忧参半&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;失去的：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;21级以上的独占性和优越感&lt;/li&gt;
&lt;li&gt;原有的&quot;特权&quot;标识意义&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;获得的：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在新体系下的相对优势实际增强&lt;/li&gt;
&lt;li&gt;1.5倍加成在削弱背景下更加珍贵&lt;/li&gt;
&lt;li&gt;更高的每日上限成为明显优势&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;主播：需要重新调整策略&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;面临的问题：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于等级设置的功能门槛需要重新考虑&lt;/li&gt;
&lt;li&gt;粉丝升级变慢可能影响互动积极性&lt;/li&gt;
&lt;li&gt;需要重新平衡免费用户和付费用户的体验&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;调整方向：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可能需要降低等级门槛来维持活跃度&lt;/li&gt;
&lt;li&gt;更加重视付费用户的体验和权益&lt;/li&gt;
&lt;li&gt;开发新的互动玩法来弥补升级乐趣的缺失&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;本文基于B站官方公告进行分析，观点仅代表个人立场，欢迎理性讨论。&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>数学期望：从理论到直播盲盒的现实应用</title><link>https://blog.isyyo.com/posts/mathematical_expectations/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/mathematical_expectations/</guid><description>深入浅出地探讨数学期望在直播盲盒中的应用及其现实意义</description><pubDate>Fri, 15 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什么是数学期望？&lt;/h2&gt;
&lt;p&gt;数学期望（Expected Value），简称期望值，是概率论中最重要的概念之一。简单来说，&lt;strong&gt;数学期望就是随机变量所有可能取值的加权平均数，权重就是各个取值的概率&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;基本定义&lt;/h3&gt;
&lt;p&gt;对于离散随机变量 X，如果它可能取值为 x₁, x₂, ..., xₙ，对应的概率分别为 p₁, p₂, ..., pₙ，那么数学期望为：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E(X) = x₁p₁ + x₂p₂ + ... + xₙpₙ&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;直观理解&lt;/h3&gt;
&lt;p&gt;想象你玩一个游戏很多很多次，数学期望就是你平均每次能得到的收益。它不是你某一次的实际收益，而是长期来看的平均收益。&lt;/p&gt;
&lt;h2&gt;简单例子：抛硬币游戏&lt;/h2&gt;
&lt;p&gt;假设有个游戏：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;抛硬币，正面朝上你得到10元&lt;/li&gt;
&lt;li&gt;反面朝上你失去5元&lt;/li&gt;
&lt;li&gt;每次游戏成本2元&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;计算期望收益：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正面概率：1/2，收益：10-2=8元&lt;/li&gt;
&lt;li&gt;反面概率：1/2，收益：-5-2=-7元&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;期望收益 = (1/2)×8 + (1/2)×(-7) = 4-3.5 = 0.5元&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着长期来看，每玩一次这个游戏，你平均能赚0.5元。&lt;/p&gt;
&lt;h2&gt;数学期望与直播平台盲盒的关系&lt;/h2&gt;
&lt;h3&gt;直播盲盒的本质&lt;/h3&gt;
&lt;p&gt;直播平台的盲盒（如各种抽奖、开箱、礼物抽取等）本质上就是一个&lt;strong&gt;概率游戏&lt;/strong&gt;，完全符合数学期望的计算模型。&lt;/p&gt;
&lt;h3&gt;实际案例分析&lt;/h3&gt;
&lt;p&gt;假设某直播平台有个盲盒活动：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;花费100元开一个盲盒&lt;/li&gt;
&lt;li&gt;可能获得的奖品及概率：
&lt;ul&gt;
&lt;li&gt;50%概率：价值20元的小礼品&lt;/li&gt;
&lt;li&gt;30%概率：价值80元的中等礼品&lt;/li&gt;
&lt;li&gt;15%概率：价值200元的高级礼品&lt;/li&gt;
&lt;li&gt;4%概率：价值500元的稀有礼品&lt;/li&gt;
&lt;li&gt;1%概率：价值2000元的超稀有礼品&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;计算期望收益：&lt;/strong&gt;
E(收益) = 0.5×20 + 0.3×80 + 0.15×200 + 0.04×500 + 0.01×2000 - 100
= 10 + 24 + 30 + 20 + 20 - 100
= &lt;strong&gt;104 - 100 = 4元&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;关键洞察&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;表面上看起来公平&lt;/strong&gt;：期望收益为正4元，似乎用户是赚的&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;实际情况复杂&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大多数人（50%）只能得到价值20元的物品，实际亏损80元&lt;/li&gt;
&lt;li&gt;只有极少数人（1%）能获得大奖&lt;/li&gt;
&lt;li&gt;平台通过大量用户的参与来平摊成本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;心理学因素&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人们往往高估小概率高收益事件&lt;/li&gt;
&lt;li&gt;忽视大概率小收益或亏损事件&lt;/li&gt;
&lt;li&gt;&quot;赌徒谬误&quot;让人相信下次会更幸运&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;平台的盈利模式&lt;/h3&gt;
&lt;p&gt;实际上，平台通常会调整概率和奖品价值，使得：
&lt;strong&gt;用户的期望收益 &amp;lt; 参与成本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;比如上面的例子，如果平台将各奖品的实际价值打8折（考虑采购成本、运营成本等），那么：
实际期望收益 = 104×0.8 - 100 = 83.2 - 100 = &lt;strong&gt;-16.8元&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这意味着用户平均每参与一次就亏损16.8元，而平台每次盲盒活动平均盈利16.8元。&lt;/p&gt;
&lt;h2&gt;理性消费的建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算期望值&lt;/strong&gt;：在参与任何概率性消费前，尝试计算真实的期望收益&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;认清本质&lt;/strong&gt;：盲盒本质上是娱乐消费，不是投资&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设定预算&lt;/strong&gt;：把参与盲盒的钱当作娱乐支出，而不是期望盈利&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;避免沉没成本谬误&lt;/strong&gt;：不要因为已经花了很多钱就继续投入&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;数学期望是一个强大的工具，帮助我们理性分析各种概率事件。在直播平台盲盒这类活动中，理解数学期望能让我们：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看清活动的真实收益情况&lt;/li&gt;
&lt;li&gt;避免被表面的高额奖品迷惑&lt;/li&gt;
&lt;li&gt;做出更理性的消费决策&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;记住：&lt;strong&gt;数学不会骗人，但营销会。掌握数学期望，就掌握了理性消费的钥匙。&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>个人博客该何去何从</title><link>https://blog.isyyo.com/posts/where_to_go_for_a_blog/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/where_to_go_for_a_blog/</guid><description>回想AI技术的飞速发展，我人生头一次如此真切地感受到了时代的巨轮滚滚向前</description><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;还记得几年前OpenAI刚刚崭露头角的时候，那时的我们对人工智能还停留在科幻电影的想象中。谁能想到，短短几年时间，AI技术的发展速度竟然如此迅猛，快到让人措手不及。&lt;/p&gt;
&lt;h2&gt;时代的巨轮&lt;/h2&gt;
&lt;p&gt;人生头一次，我真切地感受到了&quot;时代变了&quot;这四个字的分量。&lt;/p&gt;
&lt;p&gt;从2018年GPT-1悄然问世到如今，不过七年光景。回想起来，这七年仿佛经历了一个完整的技术纪元——既漫长得足以改变世界，又短暂得让人措手不及。AI技术的迭代速度让人目不暇接，这种变化的速度让人既兴奋又忐忑。站在2025年回望，那种被时代巨轮推着前进的感觉如此真实，仿佛昨天还在讨论AI是否会取代人类，今天就已经在日常工作中离不开它了。&lt;/p&gt;
&lt;p&gt;记得当初写博客的时候，我们还在为如何优化SEO、如何提高文章质量而苦恼。现在，AI可以在几秒钟内生成一篇结构完整、逻辑清晰的文章。这种对比让人不禁感慨：技术的进步真的是以指数级的速度在发生。&lt;/p&gt;
&lt;h2&gt;被时代抛下的角落&lt;/h2&gt;
&lt;p&gt;有时候我会想，个人博客是不是已经成了这个时代的遗老遗少？&lt;/p&gt;
&lt;p&gt;就像那些还在用胶片相机的摄影师，还在手写信件的文艺青年，我们这些还在坚持写博客的人，是不是也成了某种&quot;活化石&quot;？不是说这有什么不好，只是这种感觉很奇妙——明明昨天还觉得自己走在时代前沿，今天就突然发现自己成了怀旧的代表。&lt;/p&gt;
&lt;p&gt;想想也挺有意思的：当所有人都在追求10秒抓住眼球时，我们还在写长文章；当内容都在追求病毒式传播时，我们还在慢慢思考；当AI能批量生产&quot;爆款&quot;时，我们还在一字一句地敲键盘。&lt;/p&gt;
&lt;p&gt;这种&quot;落伍&quot;，反而让我觉得有种莫名的骄傲。&lt;/p&gt;
&lt;h2&gt;人生头一次的感受&lt;/h2&gt;
&lt;p&gt;这是我人生头一次如此深刻地感受到时代的变迁。不是渐进式的改变，而是断崖式的跃迁。仿佛一夜之间，我们就从一个时代跨越到了另一个时代。&lt;/p&gt;
&lt;p&gt;以前总觉得&quot;沧海桑田&quot;、&quot;时过境迁&quot;这些词离自己很远，现在才明白，原来时代的变化可以如此迅速，快到让人来不及适应。&lt;/p&gt;
&lt;p&gt;那些曾经熟悉的东西——慢慢打字、仔细构思、反复修改——似乎都成了&quot;上个时代&quot;的产物。而我们这些经历过那个时代的人，就像是历史的见证者，既怀念过去，又不得不拥抱未来。&lt;/p&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;站在这个时代的十字路口，我突然明白了什么叫做&quot;身在此山中&quot;。我们正在经历的，也许就是后人会在历史书上读到的那个&quot;伟大的转折时代&quot;。&lt;/p&gt;
&lt;p&gt;个人博客也好，AI工具也罢，它们都只是这个时代变迁的注脚。真正让我震撼的，是我们这一代人有幸见证了人类文明的一次巨大跃迁。&lt;/p&gt;
&lt;p&gt;七年前，谁能想到今天的模样？七年后，又会是什么样子？&lt;/p&gt;
&lt;p&gt;我不知道答案，但我知道，这种不确定性本身，就是这个时代最迷人的地方。&lt;/p&gt;
&lt;p&gt;无论怎样，本站都会一直开下去。也许这就是我对这个时代最朴素的回应——在AI能够模拟一切的时代，坚持做一个真实的人；在算法主导一切的世界里，保留一片属于自己的思考空间。这不是对抗，而是选择。选择慢一点，选择真一点，选择在这个快速变化的世界里，留下一些不变的东西。&lt;/p&gt;
</content:encoded></item><item><title>Fuwari RSS 图片路径修复指北</title><link>https://blog.isyyo.com/posts/fuwari_rss_pictures/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/fuwari_rss_pictures/</guid><pubDate>Mon, 11 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;在使用 Fuwari 博客主题时，你可能会发现 RSS 订阅中的图片无法正常显示。这是因为 Astro 框架在处理图片时会对路径进行转换，导致 RSS 阅读器无法正确加载图片。本指南将详细介绍如何解决这个问题。&lt;/p&gt;
&lt;h2&gt;问题分析&lt;/h2&gt;
&lt;h3&gt;为什么会出现图片显示问题？&lt;/h3&gt;
&lt;p&gt;当你在 Markdown 文件中使用相对路径引用图片时：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![示例图片](./images/example.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Astro 在构建过程中会：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将图片复制到 &lt;code&gt;_astro/&lt;/code&gt; 目录&lt;/li&gt;
&lt;li&gt;重命名文件（添加哈希值）&lt;/li&gt;
&lt;li&gt;可能转换格式（如转为 WebP）&lt;/li&gt;
&lt;li&gt;更新 HTML 中的图片路径&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但在 RSS 生成时，这些转换后的路径对外部 RSS 阅读器来说是无效的。&lt;/p&gt;
&lt;h3&gt;常见的错误表现&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RSS 阅读器中显示破损的图片图标&lt;/li&gt;
&lt;li&gt;图片链接指向相对路径，无法访问&lt;/li&gt;
&lt;li&gt;在 Feedly、Inoreader 等平台上图片不显示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fuwari 的解决方案&lt;/h2&gt;
&lt;h3&gt;核心思路&lt;/h3&gt;
&lt;p&gt;Fuwari 通过以下步骤解决图片路径问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;预加载图片资源&lt;/strong&gt;：使用 Vite 的 &lt;code&gt;import.meta.glob()&lt;/code&gt; 获取所有图片&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解析 HTML 内容&lt;/strong&gt;：将 Markdown 转换为可操作的 DOM 结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能路径替换&lt;/strong&gt;：根据图片类型选择合适的处理方式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成完整 URL&lt;/strong&gt;：确保所有图片都有可访问的绝对路径&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;实现细节&lt;/h3&gt;
&lt;h4&gt;1. 图片资源预加载&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// 使用 glob 模式匹配所有图片文件
const imagesGlob = import.meta.glob&amp;lt;{ default: ImageMetadata }&amp;gt;(
	&quot;/src/content/posts/**/*.{jpeg,jpg,png,gif,webp}&quot;,
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这行代码会创建一个映射表，包含项目中所有的图片文件。&lt;/p&gt;
&lt;h4&gt;2. 内容处理流程&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;export async function GET(context: APIContext) {
	const blog = await getSortedPosts();
	const feed = [];

	for (const post of blog) {
		// 清理内容中的无效字符
		const cleanedContent = stripInvalidXmlChars(content);
		
		// 转换 Markdown 为 HTML
		const body = parser.render(cleanedContent);
		
		// 创建可操作的 DOM 结构
		const html = htmlParser.parse(body);
		
		// 处理所有图片标签
		const images = html.querySelectorAll(&quot;img&quot;);
		// ... 图片处理逻辑
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 智能图片路径处理&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;for (const img of images) {
	const src = img.getAttribute(&quot;src&quot;);
	if (!src) continue;

	if (src.startsWith(&quot;./&quot;)) {
		// 处理相对路径图片
		const prefixRemoved = src.replace(&quot;./&quot;, &quot;&quot;);
		const imagePathPrefix = `/src/content/posts/${post.slug}/${prefixRemoved}`;
		
		const imagePath = await imagesGlob[imagePathPrefix]?.()?.then(
			(res) =&amp;gt; res.default,
		);

		if (imagePath) {
			const optimizedImg = await getImage({ src: imagePath });
			img.setAttribute(
				&quot;src&quot;,
				context.site + optimizedImg.src.replace(&quot;/&quot;, &quot;&quot;),
			);
		}
	} else if (src.startsWith(&quot;/&quot;)) {
		// 处理 public 目录图片
		img.setAttribute(&quot;src&quot;, context.site + src.replace(&quot;/&quot;, &quot;&quot;));
	}
	// HTTP/HTTPS 绝对路径保持不变
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;实际应用场景&lt;/h2&gt;
&lt;h3&gt;博客文章图片&lt;/h3&gt;
&lt;p&gt;如果你的文章结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── my-post/
│   ├── index.md
│   └── images/
│       ├── screenshot.png
│       └── diagram.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;index.md&lt;/code&gt; 中引用图片：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![截图](./images/screenshot.png)
![图表](./images/diagram.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fuwari 会自动处理这些路径，确保在 RSS 中正确显示。&lt;/p&gt;
&lt;h3&gt;Public 目录图片&lt;/h3&gt;
&lt;p&gt;对于放在 &lt;code&gt;public/&lt;/code&gt; 目录下的图片：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![Logo](/logo.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;系统会自动添加网站域名前缀。&lt;/p&gt;
&lt;h2&gt;配置和自定义&lt;/h2&gt;
&lt;h3&gt;支持的图片格式&lt;/h3&gt;
&lt;p&gt;默认支持的格式包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JPEG (.jpeg, .jpg)&lt;/li&gt;
&lt;li&gt;PNG (.png)&lt;/li&gt;
&lt;li&gt;GIF (.gif)&lt;/li&gt;
&lt;li&gt;WebP (.webp)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如需支持其他格式，可以修改 glob 模式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const imagesGlob = import.meta.glob&amp;lt;{ default: ImageMetadata }&amp;gt;(
	&quot;/src/content/posts/**/*.{jpeg,jpg,png,gif,webp,svg,avif}&quot;,
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;网站配置&lt;/h3&gt;
&lt;p&gt;确保在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中正确设置了网站 URL：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default defineConfig({
	site: &apos;https://your-domain.com&apos;,
	// 其他配置...
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;测试和验证&lt;/h2&gt;
&lt;h3&gt;本地测试&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;构建项目：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;pnpm build
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;检查生成的 RSS 文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# 查看 dist/rss.xml 内容
cat dist/rss.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;验证图片 URL 是否为完整的绝对路径。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;在线验证&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;RSS 验证器&lt;/strong&gt;：使用 &lt;a href=&quot;https://validator.w3.org/feed/&quot;&gt;W3C Feed Validator&lt;/a&gt; 检查 RSS 格式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSS 阅读器测试&lt;/strong&gt;：在 Feedly、Inoreader 等平台测试订阅&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器测试&lt;/strong&gt;：直接访问 &lt;code&gt;/rss.xml&lt;/code&gt; 查看内容&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;常见问题解决&lt;/h2&gt;
&lt;h3&gt;图片仍然不显示&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;检查网站 URL 配置是否正确&lt;/li&gt;
&lt;li&gt;确认图片文件确实存在于指定路径&lt;/li&gt;
&lt;li&gt;验证图片格式是否在支持列表中&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;RSS 内容为空&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;检查文章是否有 &lt;code&gt;body&lt;/code&gt; 内容&lt;/li&gt;
&lt;li&gt;确认 Markdown 解析是否正常&lt;/li&gt;
&lt;li&gt;查看控制台是否有错误信息&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;构建时间过长&lt;/h3&gt;
&lt;p&gt;如果项目中图片很多，可以考虑：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;优化图片大小&lt;/li&gt;
&lt;li&gt;使用更高效的图片格式&lt;/li&gt;
&lt;li&gt;实现图片懒加载&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;最佳实践&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;统一图片存储&lt;/strong&gt;：建议将每篇文章的图片放在对应的文章目录下&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合理命名&lt;/strong&gt;：使用有意义的文件名，避免特殊字符&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;格式选择&lt;/strong&gt;：优先使用 WebP 格式以获得更好的压缩率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期测试&lt;/strong&gt;：在发布新内容后及时测试 RSS 订阅&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过以上配置和优化，你的 Fuwari 博客的 RSS 订阅将能够完美显示所有图片内容，为读者提供更好的阅读体验。&lt;/p&gt;
</content:encoded></item><item><title>又迁移了...</title><link>https://blog.isyyo.com/posts/astro/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/astro/</guid><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;是的没错，我又迁移了...&lt;/p&gt;
&lt;p&gt;终究还是回归了纯静态~ 静态就是快啊(╥﹏╥)&lt;/p&gt;
&lt;p&gt;就是不知道这济南联通为啥老是小闪电&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/1755440482354.KNKvDSm3_Z1bAX8X.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>QQ机器人：Docker 一键部署 Koishi + NapCat 指北</title><link>https://blog.isyyo.com/posts/koishi_napcat_guide/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/koishi_napcat_guide/</guid><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;想要拥有一个属于自己的 QQ 机器人吗？本教程将手把手教你使用 Docker Compose 在 Linux 服务器上快速搭建现代化的 QQ 机器人解决方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Koishi&lt;/strong&gt; 是一个跨平台、可扩展、高性能的聊天机器人框架，拥有丰富的插件生态和直观的 Web 控制台。&lt;strong&gt;NapCat&lt;/strong&gt; 则是新一代的 QQ 协议适配器，稳定性和兼容性都非常出色。&lt;/p&gt;
&lt;p&gt;通过本教程，你将学会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🚀 使用 Docker 快速部署 Koishi + NapCat 环境&lt;/li&gt;
&lt;li&gt;⚙️ 完成 QQ 登录和适配器配置&lt;/li&gt;
&lt;li&gt;🔧 安装和管理机器人插件&lt;/li&gt;
&lt;li&gt;📊 使用 Web 控制台监控和管理机器人&lt;/li&gt;
&lt;li&gt;🛠️ 常见问题的排查和解决方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;前置要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Linux 系统（Ubuntu、CentOS、Debian 等）&lt;/li&gt;
&lt;li&gt;已安装 Docker 和 Docker Compose&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装 Docker 和 Docker Compose&lt;/h2&gt;
&lt;p&gt;如果你还没有安装 Docker，可以使用以下命令快速安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 一键脚本安装 Docker 和 Docker Compose
sudo bash &amp;lt;(curl -sSL https://linuxmirrors.cn/docker.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;项目结构&lt;/h2&gt;
&lt;p&gt;首先创建项目目录结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir koishi &amp;amp;&amp;amp; cd koishi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置文件&lt;/h2&gt;
&lt;p&gt;创建 Docker Compose 配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano compose/koishi.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将以下内容复制到文件中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
    napcat:
    container_name: napcat
    image: mlikiowa/napcat-docker:latest
    restart: always
    environment:
        - NAPCAT_UID=${NAPCAT_UID:-1000}
        - NAPCAT_GID=${NAPCAT_GID:-1000}
        - MODE=koishi
    ports:
        - 6099:6099
    volumes:
        - ./napcat/config:/app/napcat/config
        - ./ntqq:/app/.config/QQ
        - ./koishi:/koishi
    networks:
        - koishi_network
    mac_address: &quot;02:42:ac:11:00:02&quot;

    koishi:
    container_name: koishi
    image: koishijs/koishi:latest
    restart: always
    environment:
        - TZ=Asia/Shanghai
    ports:
        - 5140:5140
    volumes:
        - ./ntqq:/app/.config/QQ
        - ./koishi:/koishi
    networks:
        - koishi_network

networks:
    koishi_network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;启动服务&lt;/h2&gt;
&lt;p&gt;使用以下命令启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose -f ./compose/koishi.yml up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置应用侧&lt;/h2&gt;
&lt;h3&gt;NapCat 配置&lt;/h3&gt;
&lt;p&gt;首先配置 NapCat 以连接 QQ：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;访问 NapCat WebUI&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;http://你的服务器IP:6099/webui&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;QQ 登录配置&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 WebUI 中扫码登录你的 QQ 账号&lt;/li&gt;
&lt;li&gt;登录成功后，NapCat 会自动生成配置文件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置 OneBot 适配器&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 NapCat 配置中启用 HTTP 和 WebSocket 服务&lt;/li&gt;
&lt;li&gt;确保端口设置为 &lt;code&gt;6099&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;设置正确的 access_token（可选，用于安全验证）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Koishi 配置&lt;/h3&gt;
&lt;p&gt;接下来配置 Koishi 连接到 NapCat：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;访问 Koishi 控制台&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;http://你的服务器IP:5140&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装 OneBot 适配器&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在插件市场搜索并安装 &lt;code&gt;adapter-onebot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置适配器&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在 Koishi 控制台的「插件配置」中找到 OneBot 适配器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置连接参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;protocol: http
selfId: &quot;你的QQ号&quot;
endpoint: http://napcat:6099
token: &quot;你设置的access_token&quot;  # 如果设置了的话
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启用适配器&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保存配置后启用 OneBot 适配器&lt;/li&gt;
&lt;li&gt;在控制台查看连接状态，确保显示为「已连接」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;测试连接&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;发送测试消息&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在任意 QQ 群或私聊中发送：&lt;code&gt;help&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果机器人有回复，说明配置成功&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查看日志&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看 NapCat 日志
docker logs napcat

# 查看 Koishi 日志
docker logs koishi
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5. 高级配置（可选）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据库配置&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Koishi 默认使用内存数据库&lt;/li&gt;
&lt;li&gt;生产环境建议配置 MySQL 或 PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;插件权限管理&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在控制台配置用户权限&lt;/li&gt;
&lt;li&gt;设置管理员账号&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;常用命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 查看服务状态
docker compose -f ./compose/koishi.yml ps

# 查看日志
docker compose -f ./compose/koishi.yml logs

# 停止服务
docker compose -f ./compose/koishi.yml down

# 重启服务
docker compose -f ./compose/koishi.yml restart
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;端口开放&lt;/strong&gt;：确保服务器防火墙开放了 5140 和 6099 端口&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据持久化&lt;/strong&gt;：配置文件和数据会保存在本地目录中，重启容器不会丢失&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限问题&lt;/strong&gt;：如果遇到权限问题，检查 &lt;code&gt;NAPCAT_UID&lt;/code&gt; 和 &lt;code&gt;NAPCAT_GID&lt;/code&gt; 环境变量&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;故障排除&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;如果容器启动失败，使用 &lt;code&gt;docker-compose logs&lt;/code&gt; 查看详细错误信息&lt;/li&gt;
&lt;li&gt;确保 Docker 服务正在运行：&lt;code&gt;sudo systemctl status docker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;检查端口是否被占用：&lt;code&gt;netstat -tlnp | grep :5140&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过以上步骤，你就成功在 Linux 上搭建了 Koishi + NapCat 环境。现在可以开始配置你的 QQ 机器人并安装各种插件来扩展功能了！&lt;/p&gt;
</content:encoded></item><item><title>旁路由新思路——“互指架构”</title><link>https://blog.isyyo.com/posts/mutual_point_architecture/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/mutual_point_architecture/</guid><pubDate>Sat, 19 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;传统架构缺点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;手动分流麻烦&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每台设备需单独设置网关为旁路由IP，无法自动按规则分流（如仅代理国外流量）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;单点瓶颈&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有流量集中到旁路由，低性能设备（如树莓派）易成为带宽/CPU瓶颈。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;故障难排查&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;旁路由宕机时，依赖它的设备直接断网，且无自动回退机制。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;扩展性差&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;难以支持多旁路由负载均衡或高可用切换（需手动干预）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;IPv6兼容性问题&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若主路由分配IPv6地址，流量可能绕过旁路由，导致代理/过滤失效。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;传统架构跟互指架构优缺点对比&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;对比项&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;传统旁路由架构&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;主旁互指架构&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;流量分流方式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❗ &lt;strong&gt;手动&lt;/strong&gt;（设备单独设网关）&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;自动&lt;/strong&gt;（按IP/MAC/端口智能分流）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NAT问题&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❗ &lt;strong&gt;易嵌套&lt;/strong&gt;（需优化）&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;可避免&lt;/strong&gt;（旁路由禁用NAT）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;性能瓶颈&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❗ &lt;strong&gt;单点压力大&lt;/strong&gt;（所有流量经旁路由）&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;负载均衡&lt;/strong&gt;（可多旁路由分流）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;故障恢复&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❗ &lt;strong&gt;手动切换&lt;/strong&gt;（旁路由宕机需改网关）&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;自动容灾&lt;/strong&gt;（支持VRRP/Keepalived）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;扩展性&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❗ &lt;strong&gt;差&lt;/strong&gt;（难支持多旁路由）&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;强&lt;/strong&gt;（灵活添加策略路由）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IPv6支持&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❗ &lt;strong&gt;兼容性差&lt;/strong&gt;（易绕过旁路由）&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;完善&lt;/strong&gt;（可策略分流IPv6）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;互指架构流量路径&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-uDbh.Cnj2nBoO_Z2sl6bx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;教程&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;想跟相关领域是小白说：你可以退出去了（或者看看下面的参考资料）&lt;/p&gt;
&lt;p&gt;因为互指架构我不太会描述出来☹大佬们一看就懂~&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;旁路由OpenWrt相关配置&lt;/h3&gt;
&lt;p&gt;启动DHCP&lt;/p&gt;
&lt;p&gt;wan口获取主路由iKuai分配的IP，并设置为静态&lt;/p&gt;
&lt;h3&gt;主路由iKuai新增wan2&lt;/h3&gt;
&lt;p&gt;获取旁路由OpenWrt分配的IP，并设置为默认网关&lt;/p&gt;
&lt;h3&gt;主路由iKuai新增国内IP表&lt;/h3&gt;
&lt;p&gt;流控分流➡分流设置➡多线负载➡自定义运营商&lt;/p&gt;
&lt;p&gt;国内IP表：&lt;a href=&quot;https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt&quot;&gt;https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;主路由iKuai新增多线负载&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-KBzK.DL8ZFxbz_9PvpH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;主路由iKuai新增端口分流&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-uoHQ.Df77CT26_XuKnh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;源地址为旁路由OpenWrt的wan口IP&lt;/p&gt;
&lt;h3&gt;大功告成&lt;/h3&gt;
&lt;p&gt;你可以在旁路由上运行任何服务：如ADG、科学上网等&lt;/p&gt;
&lt;p&gt;当旁路由失联时：会自动切换至wan1，避免全局断网&lt;/p&gt;
&lt;p&gt;所以，尽情的造旁路由吧，无论如何都不会断网的（但是iKuai由wan2切换至wan1有1分钟的检测时间）&lt;/p&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1NJ4m1H72V/?share_source=copy_web&amp;amp;vd_source=bbce07b2cb20bee8889e8133f04baf49&quot;&gt;https://www.bilibili.com/video/BV1NJ4m1H72V/?share_source=copy_web&amp;amp;vd_source=bbce07b2cb20bee8889e8133f04baf49&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.right.com.cn/forum/thread-8252571-1-2.html&quot;&gt;https://www.right.com.cn/forum/thread-8252571-1-2.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>🚀 使用Netlify反向代理网站的终极指南 🌐</title><link>https://blog.isyyo.com/posts/netlify_reverse_proxy/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/netlify_reverse_proxy/</guid><pubDate>Sat, 19 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;&lt;strong&gt;📌 什么是反向代理？为什么选择Netlify？&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;反向代理就像是一个&quot;中间人&quot;👔，它站在你的网站和访问者之间，处理所有请求。而Netlify提供了超棒的免费反向代理功能！✨&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么选择Netlify？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;✅ 完全免费计划可用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;⚡ 全球CDN加速&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🔒 自动HTTPS加密&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🛠️ 简单易用的配置&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;🧰 准备工作&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注册Netlify账号&lt;/strong&gt;：&lt;a href=&quot;https://app.netlify.com/signup&quot;&gt;https://app.netlify.com/signup&lt;/a&gt; 📝&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;准备你的网站域名&lt;/strong&gt; 🌍 (可以是现有网站或新项目)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;🛠️ 配置Netlify反向代理&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在项目根目录创建&lt;code&gt;netlify.toml&lt;/code&gt;文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加以下内容：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[[redirects]]
    from = &quot;/*&quot;
    to = &quot;http(s)://{IP}:{PORT}/:splat&quot;
    status = 200
    force = true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;strong&gt;🚦 部署你的反向代理&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将项目推送到GitHub/GitLab/Bitbucket&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在Netlify中导入仓库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击&quot;Deploy site&quot; 🚀&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;🔧 常见问题解决&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;❓ &lt;strong&gt;代理 HTTPS 站点时的证书要求&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;证书链必须完整&lt;/strong&gt;&lt;br /&gt;
Netlify 的反代服务会验证目标站点的证书链。如果证书缺失中间证书（如仅提供域名证书但未包含 CA 中间证书），会导致 TLS 握手失败。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;避免自签名证书&lt;/strong&gt;&lt;br /&gt;
自签名证书或过期证书可能被 Netlify 拒绝。建议使用受信任的 CA（如 Let&apos;s Encrypt、DigiCert）签发的证书。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;❓ &lt;strong&gt;代理后CSS/JS加载失败？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;检查相对路径，改为绝对路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确保代理规则中的&lt;code&gt;:splat&lt;/code&gt;参数正确&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;❓ &lt;strong&gt;如何测试代理是否工作？&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -I https://你的netlify域名.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看返回头中的&lt;code&gt;x-nf-request-id&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;❓ &lt;strong&gt;性能优化建议&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;启用Netlify的&quot;Immutable assets&quot;缓存&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用&lt;code&gt;Cache-Control&lt;/code&gt;头优化静态资源&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;效果图&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-pebJ.D9A-ePT3_j0pv8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 小贴士：Netlify免费版每月有100GB带宽限制，对于大多数中小网站完全够用！&lt;/p&gt;
&lt;p&gt;优选IP：&lt;code&gt;apex-loadbalancer.netlify.com&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>一键DD脚本——快速重装纯净系统的终极解决方案</title><link>https://blog.isyyo.com/posts/reinstall/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/reinstall/</guid><pubDate>Fri, 18 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;什么是DD脚本？&lt;/h3&gt;
&lt;p&gt;DD（Disk Deployment）脚本是一种通过自动化命令实现快速重装系统（如Linux/Windows）的工具。它直接读取网络上的镜像文件并写入硬盘，跳过传统安装步骤，实现极简、高效的系统部署。&lt;/p&gt;
&lt;h3&gt;为什么推荐使用一键DD脚本？&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;纯净无残留&lt;/strong&gt;&lt;br /&gt;
直接替换原有系统，避免厂商预装软件或旧系统残留，确保环境干净。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;支持广泛&lt;/strong&gt;&lt;br /&gt;
兼容主流Linux发行版（CentOS/Debian/Ubuntu等）和Windows系统。&lt;br /&gt;
适用于独立服务器、VPS、虚拟机等场景。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;极速高效&lt;/strong&gt;&lt;br /&gt;
全程自动化操作，10-30分钟完成系统重装，无需人工干预。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自定义灵活&lt;/strong&gt;&lt;br /&gt;
可自由选择镜像源（如官方镜像或优化版镜像），满足个性化需求。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;下载脚本（Linux）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;国外服务器：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh || wget -O reinstall.sh $_
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;国内服务器：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -O https://cnb.cool/bin456789/reinstall/-/git/raw/main/reinstall.sh || wget -O reinstall.sh $_
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;bash reinstall.sh anolis      7|8|23
                    rocky       8|9|10
                    oracle      8|9
                    almalinux   8|9|10
                    opencloudos 8|9|23
                    centos      9|10
                    fedora      41|42
                    nixos       25.05
                    debian      9|10|11|12
                    opensuse    15.6|tumbleweed
                    alpine      3.19|3.20|3.21|3.22
                    openeuler   20.03|22.03|24.03|25.03
                    ubuntu      16.04|18.04|20.04|22.04|24.04|25.04 [--minimal]
                    kali
                    arch
                    gentoo
                    aosc
                    fnos
                    redhat      --img=&quot;http://access.cdn.redhat.com/xxx.qcow2&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;项目地址&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/bin456789/reinstall&quot;&gt;https://github.com/bin456789/reinstall&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>🌈 为你的Halo博客注入色彩：邮件美化模板 教程</title><link>https://blog.isyyo.com/posts/halo_mail_beautification/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/halo_mail_beautification/</guid><pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;厌倦了Halo默认邮件通知的朴素样式？想让你的订阅者、评论者收到更精美、更专业的邮件通知？&lt;/p&gt;
&lt;h3&gt;📦 前提条件&lt;/h3&gt;
&lt;p&gt;安装 &lt;a href=&quot;https://www.halo.run/store/apps/app-rnPqE&quot;&gt;邮件模板管理&lt;/a&gt; 插件，你可以在Halo的应用市场找到它。&lt;/p&gt;
&lt;h3&gt;🎨 效果预览 &amp;amp; 模板&lt;/h3&gt;
&lt;h4&gt;我发布的瞬间收到新评论&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image.BiiIgmcH_ZRyQvg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;源码&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div class=&quot;notification&quot; style=&quot;width: 100%; max-width: 700px; background-color: #ffffff; box-shadow: 0 15px 35px -10px rgba(0, 0, 0, 0.12), 0 10px 20px -8px rgba(0, 0, 0, 0.07); padding: 40px; margin: 0 auto; border-radius: 24px; font-family: &apos;Segoe UI&apos;, Arial, sans-serif; position: relative; overflow: hidden; border: 1px solid #f0f2f5;&quot;&amp;gt;
    &amp;lt;!-- 顶部装饰元素 --&amp;gt;

&amp;lt;style&amp;gt;
    .footer {
    display: none !important; /* 强制隐藏 */
    }
&amp;lt;/style&amp;gt;

&amp;lt;div style=&quot;width: 100%; max-width: 700px; background-color: #ffffff; box-shadow: 0 15px 35px -10px rgba(0, 0, 0, 0.12), 0 10px 20px -8px rgba(0, 0, 0, 0.07); padding: 40px; margin: 0 auto; border-radius: 24px; font-family: &apos;Segoe UI&apos;, Arial, sans-serif; position: relative; overflow: hidden; border: 1px solid #f0f2f5;&quot;&amp;gt;
    &amp;lt;!-- 顶部装饰元素 --&amp;gt;
    &amp;lt;div style=&quot;position: absolute; top: 0; left: 0; right: 0; height: 6px; background: linear-gradient(90deg, #ec4899, #f472b6, #fbcfe8); z-index: 2;&quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;!-- 背景装饰元素 --&amp;gt;
    &amp;lt;div style=&quot;position: absolute; top: -60px; right: -60px; width: 220px; height: 220px; border-radius: 50%; background: linear-gradient(135deg, #fdf2f8, #fce7f3); opacity: 0.4; z-index: 0;&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div style=&quot;position: absolute; bottom: -70px; left: -70px; width: 250px; height: 250px; border-radius: 50%; background: linear-gradient(135deg, #fdf2f8, #fbcfe8); opacity: 0.35; z-index: 0;&quot;&amp;gt;&amp;lt;/div&amp;gt;
    
    &amp;lt;!-- 通知内容 --&amp;gt;
    &amp;lt;div class=&quot;notification-content&quot; style=&quot;position: relative; z-index: 1;&quot;&amp;gt;
        &amp;lt;!-- 头部区域 --&amp;gt;
        &amp;lt;div class=&quot;head&quot; style=&quot;display: flex; align-items: center; margin-bottom: 32px;&quot;&amp;gt;
            &amp;lt;!-- 评论图标 --&amp;gt;
            &amp;lt;div style=&quot;background: linear-gradient(135deg, #ec4899, #f472b6); width: 56px; height: 56px; border-radius: 16px; display: flex; align-items: center; justify-content: center; margin-right: 20px; box-shadow: 0 6px 12px -3px rgba(236, 72, 153, 0.3);&quot;&amp;gt;
                &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;28&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                    &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                &amp;lt;/svg&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;div&amp;gt;
                &amp;lt;p style=&quot;color: #8b92a5; font-size: 14px; margin: 0 0 6px 0; letter-spacing: 0.7px; text-transform: uppercase; font-weight: 500;&quot;&amp;gt;新评论通知&amp;lt;/p&amp;gt;
                &amp;lt;p class=&quot;honorific&quot; th:text=&quot;|${subscriber.displayName} 你好：|&quot; style=&quot;font-size: 22px; font-weight: 600; color: #1f2937; margin: 0; letter-spacing: -0.3px;&quot;&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- 主体内容 --&amp;gt;
        &amp;lt;div class=&quot;body&quot; style=&quot;background: linear-gradient(to bottom right, #fafbfc, #ffffff); padding: 35px; border-radius: 18px; border: 1px solid #eaecf0; box-shadow: 0 6px 16px -4px rgba(0, 0, 0, 0.05); margin-bottom: 30px;&quot;&amp;gt;
            &amp;lt;!-- 评论者信息 --&amp;gt;
            &amp;lt;div style=&quot;background-color: #fdf2f8; border-radius: 14px; padding: 18px; margin-bottom: 25px; display: flex; align-items: center; border-left: 4px solid #ec4899;&quot;&amp;gt;
                &amp;lt;div style=&quot;width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, #ec4899, #f472b6); display: flex; align-items: center; justify-content: center; margin-right: 15px; flex-shrink: 0; overflow: hidden;&quot;&amp;gt;
                    &amp;lt;!-- 用户头像占位符，可替换为实际头像 --&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                        &amp;lt;path d=&quot;M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2&quot;&amp;gt;&amp;lt;/path&amp;gt;
                        &amp;lt;circle cx=&quot;12&quot; cy=&quot;7&quot; r=&quot;4&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                    &amp;lt;/svg&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;p style=&quot;margin: 0 0 5px 0; font-weight: 600; color: #be185d; font-size: 16px;&quot; th:text=&quot;|${commenter} 评论了你的瞬间|&quot;&amp;gt;Sarah 评论了你的瞬间&amp;lt;/p&amp;gt;
                    &amp;lt;p style=&quot;margin: 0; color: #db2777; font-size: 14px; line-height: 1.6;&quot;&amp;gt;
                        刚刚 · 通过网站评论系统
                    &amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 原瞬间内容卡片 --&amp;gt;
            &amp;lt;div style=&quot;background-color: #f9fafb; border: 1px solid #e5e7eb; border-radius: 16px; padding: 0; margin-bottom: 30px; overflow: hidden;&quot;&amp;gt;
                &amp;lt;!-- 瞬间头部 --&amp;gt;
                &amp;lt;div style=&quot;padding: 16px 20px; display: flex; align-items: center; border-bottom: 1px solid #e5e7eb;&quot;&amp;gt;
                    &amp;lt;div style=&quot;width: 36px; height: 36px; border-radius: 50%; background-color: #f3f4f6; display: flex; align-items: center; justify-content: center; margin-right: 12px; overflow: hidden;&quot;&amp;gt;
                        &amp;lt;!-- 用户自己的头像占位符 --&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#9ca3af&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                            &amp;lt;path d=&quot;M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2&quot;&amp;gt;&amp;lt;/path&amp;gt;
                            &amp;lt;circle cx=&quot;12&quot; cy=&quot;7&quot; r=&quot;4&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;p style=&quot;margin: 0; font-weight: 600; color: #374151; font-size: 15px;&quot; th:text=&quot;${subscriber.displayName}&quot;&amp;gt;你的名字&amp;lt;/p&amp;gt;
                        &amp;lt;p style=&quot;margin: 0; color: #6b7280; font-size: 13px;&quot;&amp;gt;原创瞬间&amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;!-- 瞬间内容 --&amp;gt;
                &amp;lt;div style=&quot;padding: 20px;&quot;&amp;gt;
                    &amp;lt;a th:href=&quot;${momentUrl}&quot; target=&quot;_blank&quot; style=&quot;display: block; text-decoration: none; color: #374151; font-size: 15px; line-height: 1.6; margin-bottom: 15px;&quot; th:utext=&quot;${momentHtmlContent}&quot;&amp;gt;
                        这是一段瞬间内容的示例，展示了用户分享的想法或图片。
                    &amp;lt;/a&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 评论内容卡片 --&amp;gt;
            &amp;lt;div style=&quot;margin-bottom: 25px;&quot;&amp;gt;
                &amp;lt;p style=&quot;color: #4b5563; margin-bottom: 15px; line-height: 1.7; font-size: 16px; font-weight: 500;&quot;&amp;gt;
                    以下是评论的具体内容：
                &amp;lt;/p&amp;gt;
                
                &amp;lt;div style=&quot;background-color: #ffffff; border: 1px solid #e5e7eb; border-radius: 16px; padding: 20px; margin-bottom: 20px; position: relative; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);&quot;&amp;gt;
                    &amp;lt;!-- 引用标记 --&amp;gt;
                    &amp;lt;div style=&quot;position: absolute; top: -12px; left: 20px; width: 24px; height: 24px; background-color: #ec4899; border-radius: 50%; display: flex; align-items: center; justify-content: center;&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                            &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/div&amp;gt;
                    
                    &amp;lt;pre class=&quot;content&quot; th:text=&quot;${content}&quot; style=&quot;font-family: &apos;Segoe UI&apos;, Arial, sans-serif; white-space: pre-wrap; word-wrap: break-word; margin: 0; color: #374151; line-height: 1.7; font-size: 16px;&quot;&amp;gt;这是评论内容示例，表达了用户对瞬间的看法和感受。&amp;lt;/pre&amp;gt;
                    
                    &amp;lt;!-- 评论时间和来源 --&amp;gt;
                    &amp;lt;div style=&quot;display: flex; align-items: center; margin-top: 15px; padding-top: 15px; border-top: 1px solid #f3f4f6;&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#9ca3af&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 6px;&quot;&amp;gt;
                            &amp;lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                            &amp;lt;polyline points=&quot;12 6 12 12 16 14&quot;&amp;gt;&amp;lt;/polyline&amp;gt;
                        &amp;lt;/svg&amp;gt;
                        &amp;lt;span style=&quot;color: #9ca3af; font-size: 13px;&quot;&amp;gt;刚刚&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 操作按钮 --&amp;gt;
            &amp;lt;div style=&quot;display: flex; flex-wrap: wrap; gap: 15px; margin: 30px 0 15px 0;&quot;&amp;gt;
                &amp;lt;a th:href=&quot;${site.url} + &apos;/moments&apos;&quot; target=&quot;_blank&quot; style=&quot;flex: 1; min-width: 160px; display: inline-flex; align-items: center; justify-content: center; background: linear-gradient(to right, #ec4899, #f472b6); color: white; padding: 16px 20px; border-radius: 14px; font-weight: 600; text-decoration: none; transition: all 0.3s ease; box-shadow: 0 6px 12px -2px rgba(236, 72, 153, 0.25);&quot; onmouseover=&quot;this.style.transform=&apos;translateY(-3px)&apos;;this.style.boxShadow=&apos;0 8px 16px -2px rgba(236, 72, 153, 0.35)&apos;;&quot; onmouseout=&quot;this.style.transform=&apos;translateY(0)&apos;;this.style.boxShadow=&apos;0 6px 12px -2px rgba(236, 72, 153, 0.25)&apos;;&quot;&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 10px;&quot;&amp;gt;
                        &amp;lt;path d=&quot;M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                    &amp;lt;/svg&amp;gt;
                    回复评论
                &amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- 底部区域 --&amp;gt;
        &amp;lt;div style=&quot;text-align: center; margin-top: 30px; padding-top: 20px; border-top: 1px solid #e5e7eb;&quot;&amp;gt;
            &amp;lt;p style=&quot;color: #9ca3af; font-size: 13px; margin: 5px 0;&quot;&amp;gt;
                * 注意：此邮件由 &amp;lt;a th:href=&quot;${site.url}&quot; th:text=&quot;${site.title}&quot; target=&quot;_blank&quot; style=&quot;color:#fa7e5b;text-decoration:none;&quot;&amp;gt;&amp;lt;/a&amp;gt; 自动发出，请勿回复。&amp;lt;/p&amp;gt;
            &amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h4&gt;有人回复了我&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-JDeh.B5F1HetO_2rB5RA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;源码&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;style&amp;gt;
      .footer {
        display: none !important; /* 强制隐藏 */
      }
    &amp;lt;/style&amp;gt;
    
    &amp;lt;div style=&quot;width: 100%; max-width: 700px; background-color: #ffffff; box-shadow: 0 12px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 15px -6px rgba(0, 0, 0, 0.05); padding: 35px; margin: 0 auto; border-radius: 16px; font-family: &apos;Segoe UI&apos;, Arial, sans-serif; position: relative; overflow: hidden;&quot;&amp;gt;
        &amp;lt;!-- 装饰性背景元素 --&amp;gt;
        &amp;lt;div style=&quot;position: absolute; top: -30px; right: -30px; width: 160px; height: 160px; border-radius: 50%; background: linear-gradient(135deg, #f0f9ff, #e0f2fe); opacity: 0.6; z-index: 0;&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div style=&quot;position: absolute; bottom: -40px; left: -40px; width: 180px; height: 180px; border-radius: 50%; background: linear-gradient(135deg, #f0f7ff, #e0f7fa); opacity: 0.5; z-index: 0;&quot;&amp;gt;&amp;lt;/div&amp;gt;
        
        &amp;lt;!-- 通知内容 --&amp;gt;
        &amp;lt;div class=&quot;notification-content&quot; style=&quot;position: relative; z-index: 1;&quot;&amp;gt;
            &amp;lt;!-- 顶部装饰条 --&amp;gt;
            &amp;lt;div style=&quot;height: 5px; width: 100%; background: linear-gradient(90deg, #0ea5e9, #38bdf8, #7dd3fc); border-radius: 10px; margin-bottom: 25px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 头部问候 --&amp;gt;
            &amp;lt;div class=&quot;head&quot; style=&quot;margin-bottom: 25px; display: flex; align-items: center;&quot;&amp;gt;
                &amp;lt;!-- 通知图标 --&amp;gt;
                &amp;lt;div style=&quot;background-color: #e0f2fe; width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; margin-right: 15px; box-shadow: 0 4px 6px -1px rgba(14, 165, 233, 0.2);&quot;&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#0284c7&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                        &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                    &amp;lt;/svg&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;p class=&quot;honorific&quot; th:text=&quot;|${subscriber.displayName} 你好：|&quot; style=&quot;font-size: 20px; font-weight: 600; color: #0f172a; margin: 0;&quot;&amp;gt;&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 通知主体 --&amp;gt;
            &amp;lt;div class=&quot;body&quot; style=&quot;background: linear-gradient(to right, #f8fafc, #f1f5f9); padding: 25px; border-radius: 14px; border-left: 4px solid #0ea5e9; margin-bottom: 25px; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);&quot;&amp;gt;
                &amp;lt;p style=&quot;color: #334155; font-size: 16px; line-height: 1.7; margin-top: 0; margin-bottom: 15px;&quot;&amp;gt;
                    &amp;lt;span style=&quot;font-weight: 600; color: #0284c7;&quot; th:text=&quot;${replier}&quot;&amp;gt;&amp;lt;/span&amp;gt; 在评论 
                    &amp;lt;a th:href=&quot;${commentSubjectUrl}&quot; target=&quot;_blank&quot; th:text=&quot;|”${isQuoteReply ? quoteContent : commentContent}”|&quot; &amp;gt;&amp;lt;/a&amp;gt;
                    &amp;lt;span&amp;gt;中回复了你，以下是回复的具体内容：&amp;lt;/span&amp;gt;
                &amp;lt;/p&amp;gt;
                
                &amp;lt;!-- 回复内容 --&amp;gt;
                &amp;lt;div style=&quot;position: relative; margin-top: 20px;&quot;&amp;gt;
                    &amp;lt;!-- 装饰性引号 --&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;30&quot; height=&quot;30&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;#cbd5e1&quot; style=&quot;position: absolute; top: -15px; left: -10px; opacity: 0.5;&quot;&amp;gt;
                        &amp;lt;path d=&quot;M14.017 21v-7.391c0-5.704 3.731-9.57 8.983-10.609l.995 2.151c-2.432.917-3.995 3.638-3.995 5.849h4v10h-9.983zm-14.017 0v-7.391c0-5.704 3.748-9.57 9-10.609l.996 2.151c-2.433.917-3.996 3.638-3.996 5.849h3.983v10h-9.983z&quot;/&amp;gt;
                    &amp;lt;/svg&amp;gt;
                    
                    &amp;lt;pre class=&quot;content&quot; th:text=&quot;${content}&quot; style=&quot;background-color: #ffffff; padding: 20px; border-radius: 10px; font-family: inherit; white-space: pre-wrap; word-wrap: break-word; color: #475569; font-size: 15px; line-height: 1.6; margin: 0; border: 1px solid #e2e8f0; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);&quot;&amp;gt;&amp;lt;/pre&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 鼓励回复区域 --&amp;gt;
            &amp;lt;div style=&quot;background-color: #f0f9ff; padding: 20px; border-radius: 12px; margin-top: 25px; border: 1px dashed #bae6fd; transition: all 0.3s ease;&quot; onmouseover=&quot;this.style.backgroundColor=&apos;#e0f2fe&apos;;this.style.transform=&apos;translateY(-3px)&apos;;this.style.boxShadow=&apos;0 6px 12px -3px rgba(14, 165, 233, 0.15)&apos;;&quot; onmouseout=&quot;this.style.backgroundColor=&apos;#f0f9ff&apos;;this.style.transform=&apos;translateY(0)&apos;;this.style.boxShadow=&apos;none&apos;;&quot;&amp;gt;
                &amp;lt;div style=&quot;display: flex; align-items: center; margin-bottom: 15px;&quot;&amp;gt;
                    &amp;lt;div style=&quot;background-color: #bae6fd; width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 12px;&quot;&amp;gt;
                        &amp;lt;span style=&quot;font-size: 18px;&quot;&amp;gt;💬&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;h3 style=&quot;margin: 0; color: #0c4a6e; font-size: 17px; font-weight: 600;&quot;&amp;gt;期待你的回复&amp;lt;/h3&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;p style=&quot;color: #0369a1; font-size: 15px; line-height: 1.6; margin: 0 0 15px 0;&quot;&amp;gt;
                    精彩的对话正在继续！点击下方按钮立即查看并回复这条评论，分享你的想法。
                &amp;lt;/p&amp;gt;
                &amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;
                    &amp;lt;a th:href=&quot;${commentSubjectUrl}&quot; target=&quot;_blank&quot; style=&quot;display: inline-flex; align-items: center; background: linear-gradient(to right, #0284c7, #0ea5e9); color: white; padding: 12px 24px; border-radius: 9999px; font-weight: 600; text-decoration: none; font-size: 15px; transition: all 0.3s ease; box-shadow: 0 4px 6px -1px rgba(14, 165, 233, 0.3);&quot; onmouseover=&quot;this.style.transform=&apos;translateY(-2px)&apos;;this.style.boxShadow=&apos;0 6px 10px -2px rgba(14, 165, 233, 0.4)&apos;;&quot; onmouseout=&quot;this.style.transform=&apos;translateY(0)&apos;;this.style.boxShadow=&apos;0 4px 6px -1px rgba(14, 165, 233, 0.3)&apos;;&quot;&amp;gt;
                        立即回复
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-left: 8px;&quot;&amp;gt;
                            &amp;lt;path d=&quot;M15 15l6-6m0 0l-6-6m6 6H3&quot;&amp;gt;&amp;lt;/path&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/a&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 互动提示 --&amp;gt;
            &amp;lt;div style=&quot;display: flex; align-items: center; margin-top: 30px; padding-top: 20px; border-top: 1px solid #e2e8f0;&quot;&amp;gt;
                &amp;lt;div style=&quot;display: flex; margin-right: 15px;&quot;&amp;gt;
                    &amp;lt;div style=&quot;width: 30px; height: 30px; background-color: #dbeafe; border-radius: 50%; display: flex; align-items: center; justify-content: center; position: relative; z-index: 3; box-shadow: 0 2px 4px rgba(59, 130, 246, 0.2);&quot;&amp;gt;
                        &amp;lt;span style=&quot;font-size: 14px;&quot;&amp;gt;🚀&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div style=&quot;width: 30px; height: 30px; background-color: #c7d2fe; border-radius: 50%; display: flex; align-items: center; justify-content: center; position: relative; z-index: 2; margin-left: -10px; box-shadow: 0 2px 4px rgba(79, 70, 229, 0.2);&quot;&amp;gt;
                        &amp;lt;span style=&quot;font-size: 14px;&quot;&amp;gt;💡&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div style=&quot;width: 30px; height: 30px; background-color: #bfdbfe; border-radius: 50%; display: flex; align-items: center; justify-content: center; position: relative; z-index: 1; margin-left: -10px; box-shadow: 0 2px 4px rgba(59, 130, 246, 0.2);&quot;&amp;gt;
                        &amp;lt;span style=&quot;font-size: 14px;&quot;&amp;gt;✨&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;p style=&quot;color: #64748b; font-size: 14px; margin: 0;&quot;&amp;gt;
                    积极参与讨论，让思想的火花继续闪耀！
                &amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 底部信息 --&amp;gt;
            &amp;lt;div style=&quot;text-align: center; margin-top: 30px; font-size: 13px; color: #94a3b8;&quot;&amp;gt;
                * 注意：此邮件由 &amp;lt;a th:href=&quot;${site.url}&quot; th:text=&quot;${site.title}&quot; target=&quot;_blank&quot; style=&quot;color:#fa7e5b;text-decoration:none;&quot;&amp;gt;&amp;lt;/a&amp;gt; 自动发出，请勿回复。&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h4&gt;我的自定义页面收到新评论&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-IBRP.DFL-DUcF_ZwwoFE.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;源码&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;style&amp;gt;
      .footer {
        display: none !important; /* 强制隐藏 */
      }
    &amp;lt;/style&amp;gt;
    
    &amp;lt;div style=&quot;width: 100%; max-width: 700px; background-color: #ffffff; box-shadow: 0 15px 35px -10px rgba(0, 0, 0, 0.12), 0 10px 20px -8px rgba(0, 0, 0, 0.07); padding: 40px; margin: 0 auto; border-radius: 24px; font-family: &apos;Segoe UI&apos;, Arial, sans-serif; position: relative; overflow: hidden; border: 1px solid #f0f2f5;&quot;&amp;gt;
        &amp;lt;!-- 顶部装饰元素 --&amp;gt;
        &amp;lt;div style=&quot;position: absolute; top: 0; left: 0; right: 0; height: 6px; background: linear-gradient(90deg, #047857, #10b981, #34d399); z-index: 2;&quot;&amp;gt;&amp;lt;/div&amp;gt;
        
        &amp;lt;!-- 背景装饰元素 --&amp;gt;
        &amp;lt;div style=&quot;position: absolute; top: -60px; right: -60px; width: 220px; height: 220px; border-radius: 50%; background: linear-gradient(135deg, #ecfdf5, #d1fae5); opacity: 0.4; z-index: 0;&quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div style=&quot;position: absolute; bottom: -70px; left: -70px; width: 250px; height: 250px; border-radius: 50%; background: linear-gradient(135deg, #ecfdf5, #a7f3d0); opacity: 0.35; z-index: 0;&quot;&amp;gt;&amp;lt;/div&amp;gt;
        
        &amp;lt;!-- 通知内容 --&amp;gt;
        &amp;lt;div class=&quot;notification-content&quot; style=&quot;position: relative; z-index: 1;&quot;&amp;gt;
            &amp;lt;!-- 头部区域 --&amp;gt;
            &amp;lt;div class=&quot;head&quot; style=&quot;display: flex; align-items: center; margin-bottom: 32px;&quot;&amp;gt;
                &amp;lt;!-- 评论图标 --&amp;gt;
                &amp;lt;div style=&quot;background: linear-gradient(135deg, #047857, #10b981); width: 56px; height: 56px; border-radius: 16px; display: flex; align-items: center; justify-content: center; margin-right: 20px; box-shadow: 0 6px 12px -3px rgba(16, 185, 129, 0.3);&quot;&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;28&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                        &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                    &amp;lt;/svg&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;div&amp;gt;
                    &amp;lt;p style=&quot;color: #8b92a5; font-size: 14px; margin: 0 0 6px 0; letter-spacing: 0.7px; text-transform: uppercase; font-weight: 500;&quot;&amp;gt;新评论通知&amp;lt;/p&amp;gt;
                    &amp;lt;p class=&quot;honorific&quot; th:text=&quot;|${subscriber.displayName} 你好：|&quot; style=&quot;font-size: 22px; font-weight: 600; color: #1f2937; margin: 0; letter-spacing: -0.3px;&quot;&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 主体内容 --&amp;gt;
            &amp;lt;div class=&quot;body&quot; style=&quot;background: linear-gradient(to bottom right, #fafbfc, #ffffff); padding: 35px; border-radius: 18px; border: 1px solid #eaecf0; box-shadow: 0 6px 16px -4px rgba(0, 0, 0, 0.05); margin-bottom: 30px;&quot;&amp;gt;
                &amp;lt;!-- 评论者信息 --&amp;gt;
                &amp;lt;div style=&quot;background-color: #ecfdf5; border-radius: 14px; padding: 18px; margin-bottom: 25px; display: flex; align-items: center; border-left: 4px solid #10b981;&quot;&amp;gt;
                    &amp;lt;div style=&quot;width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, #047857, #10b981); display: flex; align-items: center; justify-content: center; margin-right: 15px; flex-shrink: 0; overflow: hidden;&quot;&amp;gt;
                        &amp;lt;!-- 用户头像占位符，可替换为实际头像 --&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                            &amp;lt;path d=&quot;M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2&quot;&amp;gt;&amp;lt;/path&amp;gt;
                            &amp;lt;circle cx=&quot;12&quot; cy=&quot;7&quot; r=&quot;4&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;p style=&quot;margin: 0 0 5px 0; font-weight: 600; color: #065f46; font-size: 16px;&quot;&amp;gt;
                            &amp;lt;span th:text=&quot;${commenter}&quot;&amp;gt;John Doe&amp;lt;/span&amp;gt; 评论了你的页面
                        &amp;lt;/p&amp;gt;
                        &amp;lt;p style=&quot;margin: 0; color: #047857; font-size: 14px; line-height: 1.6;&quot;&amp;gt;
                            刚刚 · 通过网站评论系统
                        &amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;!-- 页面信息卡片 --&amp;gt;
                &amp;lt;div style=&quot;background-color: #f8fafc; border: 1px solid #e2e8f0; border-radius: 16px; padding: 20px; margin-bottom: 25px;&quot;&amp;gt;
                    &amp;lt;div style=&quot;display: flex; align-items: center; margin-bottom: 15px;&quot;&amp;gt;
                        &amp;lt;div style=&quot;width: 36px; height: 36px; border-radius: 8px; background-color: #f1f5f9; display: flex; align-items: center; justify-content: center; margin-right: 12px;&quot;&amp;gt;
                            &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#64748b&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                                &amp;lt;path d=&quot;M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                                &amp;lt;polyline points=&quot;14 2 14 8 20 8&quot;&amp;gt;&amp;lt;/polyline&amp;gt;
                                &amp;lt;line x1=&quot;16&quot; y1=&quot;13&quot; x2=&quot;8&quot; y2=&quot;13&quot;&amp;gt;&amp;lt;/line&amp;gt;
                                &amp;lt;line x1=&quot;16&quot; y1=&quot;17&quot; x2=&quot;8&quot; y2=&quot;17&quot;&amp;gt;&amp;lt;/line&amp;gt;
                                &amp;lt;polyline points=&quot;10 9 9 9 8 9&quot;&amp;gt;&amp;lt;/polyline&amp;gt;
                            &amp;lt;/svg&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div&amp;gt;
                            &amp;lt;p style=&quot;margin: 0; color: #64748b; font-size: 13px;&quot;&amp;gt;评论页面&amp;lt;/p&amp;gt;
                            &amp;lt;a th:href=&quot;${pageUrl}&quot; target=&quot;_blank&quot; th:text=&quot;|《${pageTitle}》|&quot; style=&quot;margin: 0; color: #0f172a; font-size: 16px; font-weight: 600; text-decoration: none; transition: color 0.2s ease;&quot; onmouseover=&quot;this.style.color=&apos;#10b981&apos;&quot; onmouseout=&quot;this.style.color=&apos;#0f172a&apos;&quot;&amp;gt;《如何提高工作效率》&amp;lt;/a&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;!-- 评论内容卡片 --&amp;gt;
                &amp;lt;div style=&quot;margin-bottom: 25px;&quot;&amp;gt;
                    &amp;lt;p style=&quot;color: #4b5563; margin-bottom: 15px; line-height: 1.7; font-size: 16px; font-weight: 500;&quot;&amp;gt;
                        以下是评论的具体内容：
                    &amp;lt;/p&amp;gt;
                    
                    &amp;lt;div style=&quot;background-color: #ffffff; border: 1px solid #e2e8f0; border-radius: 16px; padding: 20px; margin-bottom: 20px; position: relative; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);&quot;&amp;gt;
                        &amp;lt;!-- 引用标记 --&amp;gt;
                        &amp;lt;div style=&quot;position: absolute; top: -12px; left: 20px; width: 24px; height: 24px; background-color: #10b981; border-radius: 50%; display: flex; align-items: center; justify-content: center;&quot;&amp;gt;
                            &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                                &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                            &amp;lt;/svg&amp;gt;
                        &amp;lt;/div&amp;gt;
                        
                        &amp;lt;pre class=&quot;content&quot; th:text=&quot;${content}&quot; style=&quot;font-family: &apos;Segoe UI&apos;, Arial, sans-serif; white-space: pre-wrap; word-wrap: break-word; margin: 0; color: #374151; line-height: 1.7; font-size: 16px;&quot;&amp;gt;这是一条评论内容示例，用户可能对你的文章表达了感谢、提出了问题或分享了自己的观点。评论可能会很长，也可能很短，这里展示了评论的完整内容。&amp;lt;/pre&amp;gt;
                        
                        &amp;lt;!-- 评论时间和来源 --&amp;gt;
                        &amp;lt;div style=&quot;display: flex; align-items: center; margin-top: 15px; padding-top: 15px; border-top: 1px solid #f1f5f9;&quot;&amp;gt;
                            &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#94a3b8&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 6px;&quot;&amp;gt;
                                &amp;lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                                &amp;lt;polyline points=&quot;12 6 12 12 16 14&quot;&amp;gt;&amp;lt;/polyline&amp;gt;
                            &amp;lt;/svg&amp;gt;
                            &amp;lt;span style=&quot;color: #94a3b8; font-size: 13px;&quot;&amp;gt;刚刚&amp;lt;/span&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;!-- 操作按钮 --&amp;gt;
                &amp;lt;div style=&quot;display: flex; flex-wrap: wrap; gap: 15px; margin: 30px 0 15px 0;&quot;&amp;gt;
                    &amp;lt;a th:href=&quot;${pageUrl}&quot; target=&quot;_blank&quot; style=&quot;flex: 1; min-width: 160px; display: inline-flex; align-items: center; justify-content: center; background: linear-gradient(to right, #047857, #10b981); color: white; padding: 16px 20px; border-radius: 14px; font-weight: 600; text-decoration: none; transition: all 0.3s ease; box-shadow: 0 6px 12px -2px rgba(16, 185, 129, 0.25);&quot; onmouseover=&quot;this.style.transform=&apos;translateY(-3px)&apos;;this.style.boxShadow=&apos;0 8px 16px -2px rgba(16, 185, 129, 0.35)&apos;;&quot; onmouseout=&quot;this.style.transform=&apos;translateY(0)&apos;;this.style.boxShadow=&apos;0 6px 12px -2px rgba(16, 185, 129, 0.25)&apos;;&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 10px;&quot;&amp;gt;
                            &amp;lt;path d=&quot;M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                        &amp;lt;/svg&amp;gt;
                        回复评论
                    &amp;lt;/a&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 底部区域 --&amp;gt;
            &amp;lt;div style=&quot;text-align: center; margin-top: 30px; padding-top: 20px; border-top: 1px solid #e2e8f0;&quot;&amp;gt;
                &amp;lt;p style=&quot;color: #94a3b8; font-size: 13px; margin: 5px 0;&quot;&amp;gt;
                    * 注意：此邮件由 &amp;lt;a th:href=&quot;${site.url}&quot; th:text=&quot;${site.title}&quot; target=&quot;_blank&quot; style=&quot;color:#fa7e5b;text-decoration:none;&quot;&amp;gt;&amp;lt;/a&amp;gt; 自动发出，请勿回复。&amp;lt;/p&amp;gt;
                &amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;h4&gt;我的文章收到新评论&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.isyyo.com/_astro/image-OaTH.BAOWJ-cF_Z2uteOt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;源码&amp;lt;/summary&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;style&amp;gt;
      .footer {
        display: none !important; /* 强制隐藏 */
      }
    &amp;lt;/style&amp;gt;
    
    &amp;lt;div style=&quot;width: 100%; max-width: 700px; background-color: #ffffff; box-shadow: 0 15px 35px rgba(0, 0, 0, 0.08); padding: 0; margin: 0 auto; border-radius: 20px; font-family: &apos;SF Pro Display&apos;, -apple-system, BlinkMacSystemFont, &apos;Segoe UI&apos;, Roboto, sans-serif; overflow: hidden; border: 1px solid #f0f2f5;&quot;&amp;gt;
        &amp;lt;!-- 顶部横幅 --&amp;gt;
        &amp;lt;div style=&quot;background: linear-gradient(120deg, #4338ca, #6366f1, #818cf8); padding: 35px 40px; position: relative; overflow: hidden;&quot;&amp;gt;
            &amp;lt;!-- 装饰元素 --&amp;gt;
            &amp;lt;div style=&quot;position: absolute; top: -20px; right: -20px; width: 140px; height: 140px; border-radius: 50%; background: rgba(255, 255, 255, 0.1);&quot;&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;div style=&quot;position: absolute; bottom: -40px; left: -20px; width: 180px; height: 180px; border-radius: 50%; background: rgba(255, 255, 255, 0.08);&quot;&amp;gt;&amp;lt;/div&amp;gt;
            
            &amp;lt;div style=&quot;position: relative; z-index: 2; display: flex; align-items: center;&quot;&amp;gt;
                &amp;lt;div style=&quot;width: 56px; height: 56px; border-radius: 16px; background: rgba(255, 255, 255, 0.2); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); display: flex; align-items: center; justify-content: center; margin-right: 20px; box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);&quot;&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;28&quot; height=&quot;28&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                        &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                    &amp;lt;/svg&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div&amp;gt;
                    &amp;lt;p style=&quot;color: rgba(255, 255, 255, 0.9); font-size: 15px; margin: 0 0 6px 0; letter-spacing: 0.5px; font-weight: 500;&quot;&amp;gt;新评论通知&amp;lt;/p&amp;gt;
                    &amp;lt;p class=&quot;honorific&quot; th:text=&quot;|${subscriber.displayName} 你好：|&quot; style=&quot;font-size: 24px; font-weight: 700; color: white; margin: 0; letter-spacing: -0.3px;&quot;&amp;gt;&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        
        &amp;lt;!-- 主体内容 --&amp;gt;
        &amp;lt;div style=&quot;padding: 40px;&quot;&amp;gt;
            &amp;lt;!-- 通知简介 --&amp;gt;
            &amp;lt;p style=&quot;color: #4b5563; line-height: 1.7; font-size: 17px; margin: 0 0 30px 0; font-weight: 400;&quot;&amp;gt;
                您的文章收到了新的评论，以下是详细信息：
            &amp;lt;/p&amp;gt;
            
            &amp;lt;!-- 文章信息卡片 --&amp;gt;
            &amp;lt;div style=&quot;background-color: #f9fafb; border: 1px solid #e5e7eb; border-radius: 16px; padding: 20px; margin-bottom: 30px; transition: transform 0.2s ease, box-shadow 0.2s ease; position: relative; overflow: hidden;&quot;&amp;gt;
                &amp;lt;!-- 背景装饰 --&amp;gt;
                &amp;lt;div style=&quot;position: absolute; top: -30px; right: -30px; width: 100px; height: 100px; border-radius: 50%; background: linear-gradient(135deg, #e0e7ff, #c7d2fe); opacity: 0.3;&quot;&amp;gt;&amp;lt;/div&amp;gt;
                
                &amp;lt;div style=&quot;position: relative; display: flex; align-items: center;&quot;&amp;gt;
                    &amp;lt;div style=&quot;width: 48px; height: 48px; border-radius: 12px; background: linear-gradient(135deg, #4338ca, #6366f1); display: flex; align-items: center; justify-content: center; margin-right: 16px; flex-shrink: 0; box-shadow: 0 4px 10px rgba(99, 102, 241, 0.2);&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;24&quot; height=&quot;24&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                            &amp;lt;path d=&quot;M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div style=&quot;overflow: hidden; flex: 1;&quot;&amp;gt;
                        &amp;lt;p style=&quot;margin: 0 0 5px 0; font-size: 14px; color: #6b7280; font-weight: 500;&quot;&amp;gt;您的文章&amp;lt;/p&amp;gt;
                        &amp;lt;a th:href=&quot;${postUrl}&quot; target=&quot;_blank&quot; th:text=&quot;|《${postTitle}》|&quot; style=&quot;color: #4338ca; text-decoration: none; font-weight: 600; font-size: 17px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; margin: 0;&quot;&amp;gt;&amp;lt;/a&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div style=&quot;margin-left: 15px; flex-shrink: 0;&quot;&amp;gt;
                        &amp;lt;div style=&quot;display: flex; align-items: center; background-color: #eef2ff; padding: 6px 12px; border-radius: 20px;&quot;&amp;gt;
                            &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#4338ca&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 5px;&quot;&amp;gt;
                                &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                            &amp;lt;/svg&amp;gt;
                            &amp;lt;span style=&quot;color: #4338ca; font-size: 13px; font-weight: 600;&quot;&amp;gt;新评论&amp;lt;/span&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 评论内容区域 --&amp;gt;
            &amp;lt;div style=&quot;margin-bottom: 35px;&quot;&amp;gt;
                &amp;lt;!-- 评论者信息 --&amp;gt;
                &amp;lt;div style=&quot;display: flex; align-items: center; margin-bottom: 16px;&quot;&amp;gt;
                    &amp;lt;div style=&quot;width: 44px; height: 44px; border-radius: 50%; background-color: #f3f4f6; overflow: hidden; margin-right: 14px; display: flex; align-items: center; justify-content: center; border: 2px solid #e5e7eb;&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;22&quot; height=&quot;22&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#6b7280&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                            &amp;lt;path d=&quot;M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2&quot;&amp;gt;&amp;lt;/path&amp;gt;
                            &amp;lt;circle cx=&quot;12&quot; cy=&quot;7&quot; r=&quot;4&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;p style=&quot;margin: 0 0 2px 0; font-weight: 600; color: #1f2937; font-size: 16px;&quot; th:text=&quot;${commenter}&quot;&amp;gt;评论用户名&amp;lt;/p&amp;gt;
                        &amp;lt;p style=&quot;margin: 0; color: #6b7280; font-size: 14px;&quot;&amp;gt;刚刚发表评论&amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;!-- 评论内容卡片 --&amp;gt;
                &amp;lt;div style=&quot;background-color: #ffffff; padding: 25px 30px; border-radius: 16px; border: 1px solid #e5e7eb; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.04); position: relative; margin-left: 22px; margin-bottom: 10px;&quot;&amp;gt;
                    &amp;lt;!-- 连接线 --&amp;gt;
                    &amp;lt;div style=&quot;position: absolute; left: -22px; top: 0px; width: 22px; height: 30px; border-bottom: 2px solid #e5e7eb; border-left: 2px solid #e5e7eb; border-bottom-left-radius: 12px;&quot;&amp;gt;&amp;lt;/div&amp;gt;
                    
                    &amp;lt;!-- 引用标记 --&amp;gt;
                    &amp;lt;div style=&quot;position: absolute; top: -10px; left: 30px; width: 24px; height: 24px; background-color: #6366f1; border-radius: 50%; display: flex; align-items: center; justify-content: center; box-shadow: 0 2px 5px rgba(99, 102, 241, 0.2);&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;12&quot; height=&quot;12&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;white&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                            &amp;lt;path d=&quot;M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/div&amp;gt;
                    
                    &amp;lt;pre class=&quot;content&quot; th:text=&quot;${content}&quot; style=&quot;font-family: inherit; white-space: pre-wrap; word-wrap: break-word; color: #374151; font-size: 16px; line-height: 1.8; margin: 0; padding: 0;&quot;&amp;gt;&amp;lt;/pre&amp;gt;
                &amp;lt;/div&amp;gt;
                
                &amp;lt;!-- 评论时间和标签 --&amp;gt;
                &amp;lt;div style=&quot;display: flex; align-items: center; margin-left: 22px; margin-bottom: 10px;&quot;&amp;gt;
                    &amp;lt;div style=&quot;display: flex; align-items: center; background-color: #f3f4f6; padding: 6px 12px; border-radius: 20px; margin-right: 10px;&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#6b7280&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 5px;&quot;&amp;gt;
                            &amp;lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                            &amp;lt;polyline points=&quot;12 6 12 12 16 14&quot;&amp;gt;&amp;lt;/polyline&amp;gt;
                        &amp;lt;/svg&amp;gt;
                        &amp;lt;span style=&quot;color: #6b7280; font-size: 13px;&quot;&amp;gt;刚刚&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                    
                    &amp;lt;div style=&quot;display: flex; align-items: center; background-color: #f3f4f6; padding: 6px 12px; border-radius: 20px;&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;14&quot; height=&quot;14&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#6b7280&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 5px;&quot;&amp;gt;
                            &amp;lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                            &amp;lt;path d=&quot;M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3&quot;&amp;gt;&amp;lt;/path&amp;gt;
                            &amp;lt;line x1=&quot;12&quot; y1=&quot;17&quot; x2=&quot;12.01&quot; y2=&quot;17&quot;&amp;gt;&amp;lt;/line&amp;gt;
                        &amp;lt;/svg&amp;gt;
                        &amp;lt;span style=&quot;color: #6b7280; font-size: 13px;&quot;&amp;gt;待回复&amp;lt;/span&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 操作按钮 --&amp;gt;
            &amp;lt;div style=&quot;display: flex; gap: 16px; margin-bottom: 35px;&quot;&amp;gt;
                &amp;lt;a th:href=&quot;${postUrl}&quot; target=&quot;_blank&quot; style=&quot;flex: 1; display: inline-flex; align-items: center; justify-content: center; background: linear-gradient(to right, #4338ca, #6366f1); color: white; padding: 16px; border-radius: 14px; font-weight: 600; text-decoration: none; transition: all 0.3s ease; box-shadow: 0 4px 12px rgba(99, 102, 241, 0.2);&quot; onmouseover=&quot;this.style.transform=&apos;translateY(-3px)&apos;;this.style.boxShadow=&apos;0 6px 16px rgba(99, 102, 241, 0.3)&apos;;&quot; onmouseout=&quot;this.style.transform=&apos;translateY(0)&apos;;this.style.boxShadow=&apos;0 4px 12px rgba(99, 102, 241, 0.2)&apos;;&quot;&amp;gt;
                    &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; style=&quot;margin-right: 10px;&quot;&amp;gt;
                        &amp;lt;path d=&quot;M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z&quot;&amp;gt;&amp;lt;/path&amp;gt;
                    &amp;lt;/svg&amp;gt;
                    回复评论
                &amp;lt;/a&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 提示卡片 --&amp;gt;
            &amp;lt;div style=&quot;background-color: #eef2ff; padding: 25px; border-radius: 16px; border-left: 4px solid #6366f1; margin-bottom: 35px; box-shadow: 0 2px 5px rgba(99, 102, 241, 0.08);&quot;&amp;gt;
                &amp;lt;div style=&quot;display: flex; align-items: flex-start;&quot;&amp;gt;
                    &amp;lt;div style=&quot;width: 40px; height: 40px; border-radius: 10px; background-color: rgba(99, 102, 241, 0.15); display: flex; align-items: center; justify-content: center; margin-right: 16px; flex-shrink: 0;&quot;&amp;gt;
                        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;20&quot; height=&quot;20&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;#6366f1&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&amp;gt;
                            &amp;lt;circle cx=&quot;12&quot; cy=&quot;12&quot; r=&quot;10&quot;&amp;gt;&amp;lt;/circle&amp;gt;
                            &amp;lt;line x1=&quot;12&quot; y1=&quot;16&quot; x2=&quot;12&quot; y2=&quot;12&quot;&amp;gt;&amp;lt;/line&amp;gt;
                            &amp;lt;line x1=&quot;12&quot; y1=&quot;8&quot; x2=&quot;12.01&quot; y2=&quot;8&quot;&amp;gt;&amp;lt;/line&amp;gt;
                        &amp;lt;/svg&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div&amp;gt;
                        &amp;lt;p style=&quot;margin: 0 0 8px 0; font-weight: 600; color: #4338ca; font-size: 16px;&quot;&amp;gt;互动小贴士&amp;lt;/p&amp;gt;
                        &amp;lt;p style=&quot;margin: 0; color: #4b5563; font-size: 15px; line-height: 1.7;&quot;&amp;gt;
                            及时回复评论可以提高读者互动率和忠诚度。研究表明，博主回复评论的文章获得的阅读量平均高出30%，并能显著提升读者的回访率。
                        &amp;lt;/p&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            
            &amp;lt;!-- 页脚 --&amp;gt;
            &amp;lt;div style=&quot;margin-top: 40px; padding-top: 25px; border-top: 1px solid #e5e7eb; text-align: center;&quot;&amp;gt;
                &amp;lt;p style=&quot;color: #9ca3af; font-size: 14px; margin: 0 0 8px 0;&quot;&amp;gt;
                    * 注意：此邮件由 &amp;lt;a th:href=&quot;${site.url}&quot; th:text=&quot;${site.title}&quot; target=&quot;_blank&quot; style=&quot;color:#fa7e5b;text-decoration:none;&quot;&amp;gt;&amp;lt;/a&amp;gt; 自动发出，请勿回复。&amp;lt;/p&amp;gt;
                &amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/details&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;本文基于 &lt;a href=&quot;https://www.master-jsx.top/archives/1744346486344%2F&amp;amp;sublevel=293&quot;&gt;小帕鲁的文章&lt;/a&gt; 修改补充&lt;/p&gt;
</content:encoded></item><item><title>Ubuntu SSH暴力破解审查、预防</title><link>https://blog.isyyo.com/posts/exhaustive_attack_defense/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/exhaustive_attack_defense/</guid><pubDate>Sun, 04 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;/var/log/auth.log&lt;/code&gt;是记录身份验证和授权相关事件的日志文件。这个文件通常包含了用户登录尝试（成功或失败）、SSH活动、sudo使用以及PAM（Pluggable Authentication Modules，可插拔认证模块）相关的活动等信息。&lt;/p&gt;
&lt;p&gt;本脚本通过分析log日志检查服务器是否被暴力破解&lt;/p&gt;
&lt;p&gt;已集成一些暴力破解预防手段&lt;/p&gt;
&lt;h2&gt;脚本仓库&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yyhhkya/Exhaustive_attack_defense&quot;&gt;https://github.com/yyhhkya/Exhaustive_attack_defense&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>（稳定）360t7 openwrt-immortalwrt 自用固件</title><link>https://blog.isyyo.com/posts/360t7_openwrt/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/360t7_openwrt/</guid><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;OpenWrt是一个高度模块化、高度自动化的嵌入式Linux系统，主要目标是让普通的路由器通过替换原有固件，能够运行更多的网络应用，让路由器具有更加智能的、可管理的功能。OpenWrt基于Linux内核，拥有强大的网络组件和扩展性，可以支持无线、有线、拨号等多种连接方式，并能与其他OpenWrt设备无缝连接。&lt;/p&gt;
&lt;h2&gt;资源&lt;/h2&gt;
&lt;p&gt;默认整合路由基础功能(pppoe、ipv6、防火墙等)&lt;/p&gt;
&lt;p&gt;下载&amp;amp;云编译仓库：
&lt;a href=&quot;https://github.com/yyhhkya/build-immortalwrt-mt798x&quot;&gt;https://github.com/yyhhkya/build-immortalwrt-mt798x&lt;/a&gt;
下载前务必仔细阅读 &lt;code&gt;README.md&lt;/code&gt;&lt;/p&gt;
</content:encoded></item><item><title>纯净版封装镜像</title><link>https://blog.isyyo.com/posts/windows_iso/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/windows_iso/</guid><pubDate>Sat, 20 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;系统特色&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;采用微软官方原版系统(MSDN)和IT天空ES5S封装方式精心制作而成，Win7集成ESU补丁更新到最新，Win10/11集成最新补丁。全自动无人值守，默认Administrator登录，系统清理了多余示例媒体、帮助文件，Windows Defender、WinRE和部分垃圾文件，功能基本等同完整版，Win10/11移除除应用商店外的UWP程序。&lt;/li&gt;
&lt;li&gt;集成最新的VC++运行库支持文件，确保绿色软件均能正常运行；DirectX9c最终版；Adobe_Flash_Player_v34.0.0.301_去广告版&lt;/li&gt;
&lt;li&gt;自动判断关闭休眠；去除新建快捷方式字样；禁用系统自动更新等&lt;/li&gt;
&lt;li&gt;XP下IE默认为IE8；其他系统的浏览器默认为edge浏览器，主页无锁定，不喜还请自行更改&lt;/li&gt;
&lt;li&gt;集成IT天空万能驱动最新版，系统安装过程中会自动驱动好网卡、usb3.x、Nvme等设备&lt;/li&gt;
&lt;li&gt;屏蔽一部分流氓PE或装机工具的注入行为，防止系统被污染&lt;/li&gt;
&lt;li&gt;Windows7_64位支持UEFI安全启动，支持十代及以上机器安装&lt;/li&gt;
&lt;li&gt;自动判断主板时间是否正确,不正确在进桌面联网后将自动校准&lt;/li&gt;
&lt;li&gt;笔记本专用版以Laptop账户登录,支持11代酷睿及以上笔记本电脑的指纹识别等&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;软件集成说明&lt;/h2&gt;
&lt;p&gt;所有软件都经过了作者的精心设置或净化处理，若非必要，请不要去升级&lt;/p&gt;
&lt;p&gt;软件自选纯净版：进入桌面后倒计时15秒自由选择是否安装，不强制安装&lt;/p&gt;
&lt;p&gt;Windows7_64位集成的专用维护工具：修复UEFI环境[无CSM模式]卡启动LOGO、修复十代酷睿及以上平台A5蓝屏
Windows10_64位集成的专用维护工具：系统版本切换【可切换为家庭版、教育版、企业版、企业G版、专业版、专业教育版、IoT 企业版、企业版多会话、专业单语言版】、注入英特尔11代-13代酷睿VMD存储驱动
Windows11_64位集成的专用维护工具：系统版本切换【可切换为家庭版、教育版、企业版、专业版、专业教育版、IoT 企业版、企业版多会话、专业单语言版】、开始菜单/任务栏样式切换、注入英特尔11代-13代酷睿VMD存储驱动&lt;/p&gt;
&lt;h2&gt;下载地址&lt;/h2&gt;
&lt;p&gt;123云盘：&lt;a href=&quot;https://www.123pan.com/s/UxFfjv-UGeQH.html&quot;&gt;https://www.123pan.com/s/UxFfjv-UGeQH.html&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>备案技巧 根据访客来源屏蔽管局检查</title><link>https://blog.isyyo.com/posts/registration_skills/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/registration_skills/</guid><pubDate>Sat, 03 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;备案过程过于麻烦，像博客不能有评论、友链之类的。&lt;/p&gt;
&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;在备案通过前几分钟，会有一个来自 &lt;code&gt;*.beian.miit.gov.cn&lt;/code&gt; 的访问，由此判断管局审核都是在备案后台打开网站链接进行审核的。以前的备案都是通过管局IP的检测，而来路比IP要容易还可靠。&lt;/p&gt;
&lt;h2&gt;教程&lt;/h2&gt;
&lt;p&gt;Nginx 可使用如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if ($http_referer ~* &quot;beian.miit.gov.cn&quot;) {
    rewrite / /block_beian.html break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后 &lt;code&gt;block_beian.html&lt;/code&gt; 页面要不能有其他内容，还要有备案号。例如，页面就居中“Hello World”，底部居中 &lt;code&gt;备案号&lt;/code&gt; ，完全符合所有要求。&lt;/p&gt;
</content:encoded></item><item><title>Hexo 避坑指南</title><link>https://blog.isyyo.com/posts/hexo_pit_avoidance_guide/</link><guid isPermaLink="true">https://blog.isyyo.com/posts/hexo_pit_avoidance_guide/</guid><pubDate>Tue, 29 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;以下内容均以 Ubuntu 举例。每一步都需要按照我的来做，除非你明白你在做什么。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;首先准备好环境：&lt;code&gt;curl&lt;/code&gt;、&lt;code&gt;Node.js&lt;/code&gt;、&lt;code&gt;Git&lt;/code&gt;。&lt;/p&gt;
&lt;h4&gt;安装 curl&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install curl
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;安装 Node.js&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -

sudo apt-get update

sudo apt-get install -y nodejs
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;安装 Git&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install git
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;安装 Hexo 程序&lt;/h4&gt;
&lt;p&gt;以上步骤都做完后，就可以开始安装&lt;code&gt;Hexo&lt;/code&gt;了。&lt;/p&gt;
&lt;p&gt;npm install -g hexo-cli&lt;/p&gt;
&lt;h4&gt;部署 Hexo&lt;/h4&gt;
&lt;p&gt;根目录新建文件夹&lt;code&gt;Hexo&lt;/code&gt;，然后cd进去。&lt;/p&gt;
&lt;p&gt;//这里不带上 npx 的话会执行不了
npx hexo init &amp;lt;folder&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;folder&lt;/code&gt;为新建的文件夹的名称。&lt;/p&gt;
&lt;p&gt;如果报错了，提示权限不够，那就cd进&lt;code&gt;folder&lt;/code&gt;里面。&lt;/p&gt;
&lt;p&gt;npm install
//进到 &amp;lt;folder&amp;gt; 目录里就能去掉 npx 了
hexo g&lt;/p&gt;
&lt;p&gt;然后把站点路径改成&lt;code&gt;/Hexo/&amp;lt;folder&amp;gt;&lt;/code&gt;，运行目录改成&lt;code&gt;public&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;现在，你就能访问该网站了。&lt;/p&gt;
&lt;h3&gt;安装主题、插件&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;以下操作均要在 /Hexo/&amp;lt;folder&amp;gt; 目录进行&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;我建议先挑选好主题并安装。（根据主题文档操作即可）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后看看有没有什么想要的功能但主题又没有的，然后你就可以去找对应功能的插件并安装。（根据主题文档操作即可）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你是小白，那么我建议你先大致试一下插件的功能，看看插件跟主题兼不兼容。（大佬可跳过这一步）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按照自己的需求更改&lt;code&gt;/Hexo/&amp;lt;folder&amp;gt;&lt;/code&gt;的&lt;code&gt;_config.yml&lt;/code&gt;（Hexo 的配置文件）以及&lt;code&gt;/Hexo/&amp;lt;folder&amp;gt;/themes/主题名字&lt;/code&gt;的&lt;code&gt;_config.yml&lt;/code&gt;（主题的配置文件）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;常用命令&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;最好背下来&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;hexo g&lt;/h4&gt;
&lt;p&gt;编译更改过或新添加的文件&lt;/p&gt;
&lt;h4&gt;hexo g -w&lt;/h4&gt;
&lt;p&gt;当你保存文件时会自动编译&lt;/p&gt;
&lt;h4&gt;hexo g -f&lt;/h4&gt;
&lt;p&gt;重新编译所有文件（包括未修改的）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;此操作类似但不等于 clean &amp;amp; g&lt;br /&gt;
你可以用另一种方法: hexo clean &amp;amp;&amp;amp; hexo g&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;hexo clean&lt;/h4&gt;
&lt;p&gt;删除所有编译出来的文件&lt;/p&gt;
&lt;h4&gt;npm install 插件名/主题名&lt;/h4&gt;
&lt;p&gt;安装插件/主题&lt;/p&gt;
&lt;h4&gt;npm uninstall 插件名/主题名&lt;/h4&gt;
&lt;p&gt;删除插件/主题&lt;/p&gt;
</content:encoded></item></channel></rss>