<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"><channel><title>LeonXieの小窝</title><link>https://leonxie.cn</link><atom:link href="https://leonxie.cn/rss.xml" rel="self" type="application/rss+xml"/><description>保持热爱，奔赴山海！</description><generator>Halo v2.25.4</generator><language>zh-cn</language><image><url>https://leonxie.cn/upload/sakura-flower.png</url><title>LeonXieの小窝</title><link>https://leonxie.cn</link></image><lastBuildDate>Sat, 25 Jul 2026 10:44:21 GMT</lastBuildDate><item><title><![CDATA[模仿iOS做的Windows剪切板审批工具，原理是什么？]]></title><link>https://leonxie.cn/archives/how-CAC-works</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E6%A8%A1%E4%BB%BFiOS%E5%81%9A%E7%9A%84Windows%E5%89%AA%E5%88%87%E6%9D%BF%E5%AE%A1%E6%89%B9%E5%B7%A5%E5%85%B7%EF%BC%8C%E5%8E%9F%E7%90%86%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F&amp;url=/archives/how-CAC-works" width="1" height="1" alt="" style="opacity:0;">
<p style=""><hyperlink-inline-card target="_blank" href="https://github.com/LeonspaceX/Clipboard-access-control" theme="inline" custom-title="GitHub - LeonspaceX/Clipboard-access-control: 😉 模仿iOS实现的控制剪切板访问行为的程序 · GitHub" custom-description="😉 模仿iOS实现的控制剪切板访问行为的程序. Contribute to LeonspaceX/Clipboard-access-control development by creating an account on GitHub."><a href="https://github.com/LeonspaceX/Clipboard-access-control" target="_blank">https://github.com/LeonspaceX/Clipboard-access-control</a></hyperlink-inline-card></p>
<p style="">项目源代码已上传至github喵，求star qwq。</p>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">想必各位如果用过iOS，一定见过这样的弹窗吧：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-MOcD.png&amp;size=m" width="267px">
</figure>
<p style="">这就是<strong>iOS 16</strong>之后引入的<strong>Paste from Other Apps</strong>机制，会在APP主动获取剪切板内容时弹出审批窗口，算是iOS独树一帜的设计了喵。正好晓夜也在前几天刷到一条<a href="https://www.bilibili.com/video/BV1zWzwYkEtf" target="_blank" rel="">关于Windows剪切板能获取多少隐私</a>的视频，作者使用Flutter编写了一个剪切板读取工具来测试进程到底能获取多少信息，结果发现在Windows上，剪切板基本上是裸奔的....</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-edRo.png&amp;size=m" width="541px">
</figure>
<p style="">所以，为什么Windows不能有类似iOS的机制呢？抱着试一试的心态，晓夜花2天时间vibe出了一个软件——ClipboardAccessCtrl喵！</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-GPPb.png&amp;size=m" width="797px">
</figure>
<p style="">不过，在讲CAC<span style="font-size: 12px">（ClipboardAccessCtrl）</span>的具体细节前，晓夜想先讲讲为什么windows的剪切板api这么“不安全”喵</p>
<h2 style="" id="%E5%8E%86%E5%8F%B2%E5%8C%85%E8%A2%B1">历史包袱</h2>
<p style="">剪切板的雏形，是由Pentti Kanerva提出的"删除缓冲区"，可以临时存放被删除的文本，方便后续恢复喵。到了1973年，clipboard这个词语正式被Pentti Kanerva提出，他将这些操作命名为剪切、复制、粘贴，这些名称也一直沿用至今。1983年，Apple Lisa成为了第一台将"临时储存空间"命名为剪切板的商业系统。很快，Windows也跟进了，Windows 3.0中已经出现了ClipBoard程序。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cyOC.png&amp;size=m" width="439px">
 <figcaption data-placeholder="添加描述" style="width: 439px; max-width: 100%; text-align: center;">Source：互联网</figcaption>
</figure>
<p style="">这时，GetClipboardData的api已经出现，不过在那个时代，没有人会考虑什么权限隔离和审批弹窗，毕竟操作系统才刚刚兴起，开发者能有什么"坏心思"呢。</p>
<p style="">随着计算机软件的蓬勃发展，坏心思也出现了喵。2006年，ZeuS木马通过MITB（中间人攻击的变体，Man in the Browser）和HTML注入窃取网上银行和社交软件的密码，由于寄生在浏览器内部甚至可以绕过HTTPS，直接造成了超过1亿美元的损失，人们开始重视这些隐私，催生了MFA/2FA等保护措施。可是剪切板似乎成为了一个隐私盲区，虽然早期的木马也会顺手窃取剪切板内容，但是直到2017年CryptoShuffler的爆发，人们才意识到这个“任何程序都可以读取的缓冲区”，并不是想象中的那么安全喵。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cWgl.png&amp;size=m" width="2026px">
 <figcaption data-placeholder="添加描述" style="width: 2026px; max-width: 100%; text-align: center;">Source：kaspersky.com</figcaption>
</figure>
<p style="">CryptoShuffler通过篡改剪切板中的比特币钱包地址，让本应该到达对方钱包里的虚拟货币到达了攻击者的钱包中，后来甚至出现了“撞”出头尾相同的钱包地址来进一步降低受害者怀疑的手法喵。</p>
<p style="">不仅是攻击者，商业软件也嗅到了这股气息，既然获取定位需要用户审批，读取其他应用的文件需要root，为什么不试试对剪切板做手脚呢？于是，"分享口令"便出现了，复制一段话，打开目标APP便自动跳转，时至今日依旧存在喵，虽不属于攻击但也足以用恶心用户来描述。</p>
<p style="">Apple意识到了这个问题，在WWDC 2020 Session "What's new in privacy"中首次提到了剪切板访问通知，2年后又扩展成了现在的审批弹窗，随后谷歌在安卓12中也加入了类似机制qwq。那么为什么Windows没有跟进呢喵</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-SUrA.png&amp;size=m" alt="" width="2461px">
 <figcaption data-placeholder="添加描述" style="width: 2461px; max-width: 100%; text-align: center;">Source：维基百科 条目Windows_API</figcaption>
</figure>
<p style="">Windows的剪切板API至今未变，可能还要归功于Windows的设计哲学——<strong>宁可忍受开发者写的烂代码，也绝对不能让程序跑不起来</strong><span style="font-size: 12px"><strong>（photoshop安装程序不能在wine里跑起来也得归功于这个设计哲学喵，具体可以看看</strong></span><a href="https://www.ithome.com/0/914/595.htm" target="_blank" rel=""><span style="font-size: 12px"><strong>这篇文章</strong></span></a><span style="font-size: 12px"><strong>）</strong></span><strong>。</strong>如果为了安全改掉这30多年的设计<s>（技术债）</s>，让旧程序出现疯狂弹窗审批的情况，那很明显不是微软的作风喵，于是——虽然微软的Project Reunion团队公开讨论过要不要重新设计剪切板API，并表示当前的API极其陈旧，但是这件事还是不了了之了。</p>
<p style="">接下来，我们来看看CAC的具体实现吧喵~</p>
<h2 style="" id="%E6%95%B4%E4%BD%93%E6%9E%B6%E6%9E%84">整体架构</h2>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-JOco.png&amp;size=m" width="431px">
</figure>
<p style="">项目分为三个模块，Controller（后文也被称作主程序）、HookHost和NativeDLL，第一个是主要逻辑，负责弹出审批窗口、管理黑白名单和显示日志；第二个负责注入DLL到目标进程；第三个也是最核心的部分，inline hook DLL喵。第二、三个都有两个版本，x86和x64，这样才能覆盖到所有场景喵（因为x64 DLL不能混入x86进程，反之同理）。至于这些具体是什么...我们很快就知道啦</p>
<h2 style="" id="%E6%80%8E%E4%B9%88%E8%AF%BB%E5%8F%96%E5%89%AA%E5%88%87%E6%9D%BF%E5%86%85%E5%AE%B9">怎么读取剪切板内容</h2>
<p style="">既然要制造拦截剪切板用的“盾”，那就必须先知道“矛”是怎么工作的。</p>
<p style="">剪切板读取API位于user32.dll和ole32.dll中，可以直接读取具体内容的只有两个<code>user32!GetClipboardData</code> 和<code>ole32!OleGetClipboard</code> 前者是通用接口，后者是富文本接口，虽然UWP应用也有一个WinRT剪切板API，但是实测最终也会请求到这两个api喵，所以拦截这两个就足够啦！</p>
<p style="">当然，测试的时候我们可以直接用那个B站视频作者写好的矛喵</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-DTXD.png&amp;size=m" width="277px">
</figure>
<p style=""></p>
<h2 style="" id="%E9%82%A3...%E8%AF%A5%E6%80%8E%E4%B9%88%E6%8B%A6%E6%88%AA%E5%91%A2%EF%BC%9F">那...该怎么拦截呢？</h2>
<p style="">“矛”的架构很简单，但是要想制造出一个稳定的“盾”可不容易喵。思路很简单，只需要通过<strong>inline hook</strong>那两个函数就可以了喵。简单说说<strong>inline hook</strong>是什么：它是最简单粗暴的一种hook方式了，直接修改目标函数内存中的机器码，让原函数跳转到自己的hook函数。如果希望调用原函数呢，比如需要审批通过？也很粗暴，只需要把原函数的机器码原样复制一份到一块空闲内存中，再跳转到这个空闲内存中的函数就可以了喵。这就是<strong>Trampoline</strong>(蹦床)。</p>
<p style="">在hook之后，我们把某个软件要请求剪切板的信息传给主程序，等待主程序返回后再决定返回Null/False（模拟剪切板中没有任何内容的结果）还是执行原函数，就可以了喵！</p>
<p style="">虽然我们初版选择了自己手写这些hook代码，但是发现这样维护困难，于是便使用了经典hook库——<a href="https://github.com/TsudaKageyu/minhook" target="_blank" rel="">MinHook</a>。MinHook帮我们处理了Trampoline，就不需要担心复制指令时因为反汇编没做好而不慎从中间截断啦！</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F46a2dcd28e8066381b489d75df18103f.png&amp;size=m" width="2241px">
 <figcaption data-placeholder="添加描述" style="width: 2241px; max-width: 100%; text-align: center;">初版CAC截图</figcaption>
</figure>
<p style="">如果要把这个dll注入到一个进程中，<code>CreateRemoteThread</code>+<code>LoadLibrary</code>就是最简单的手法，可是全局注入呢喵？Windows为我们提供了一个简单的方法——<code>SetWindowsHookEx</code> 。当你用这个方法注册一个全局钩子(比如<code>WH_GETMESSAGE</code>、<code>WH_CBT</code>这类)，并指定一个DLL作为钩子处理函数所在的模块时，Windows会自动把这个DLL注入到所有GUI进程里——这是系统帮你做的，我们就不需要手写<code>CreateRemoteThread</code>那一套了qwq。</p>
<h2 style="" id="%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E4%B8%8E%E4%B8%BB%E7%A8%8B%E5%BA%8F%E9%80%9A%E4%BF%A1%EF%BC%9F">怎样才能与主程序通信？</h2>
<p style="">拦截到了是一回事，但是由于inline hook内不能做太多事（不然会导致崩溃），弹窗和审批还是得到Controller里做。DLL该怎么和Controller通信呢？很简单，Windows也帮我们预留了方法，那就是命名管道喵，格式形如<code>\\.\pipe\YourPipeName</code>。它叫"管道"是因为概念上确实很像——<strong>一端写入数据,另一端读取数据</strong>，数据按顺序流动，跟物理管道运水有不少相似点。而叫"命名"则是因为它<strong>有一个全局唯一的名字</strong>，不同进程只要知道这个名字，就能连接到同一根管道上，不需要像普通(匿名)管道那样必须有父子进程关系才能共享。</p>
<p style="">所以，我们只需要定义一套格式，就可以让DLL和Controller进行通信啦</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-DtPF.png&amp;size=m" width="213px">
 <figcaption data-placeholder="添加描述" style="width: 213px; max-width: 100%; text-align: center;">CAC中的命名管道通信格式</figcaption>
</figure>
<h2 style="" id="%E5%8D%B8%E8%BD%BDdll">卸载DLL</h2>
<p style="">安装容易卸载难，卸载DLL也是CAC项目里研究时间最长的一个模块了喵。</p>
<p style="">最初，我们直接使用了<code>UnhookWindowsHookEx</code> ，也就是微软给出的官方解法，但是这样有一个致命问题——何时卸载完全由Windows决定，点击“停止注入”后，DLL还不会被释放，被大量程序占用喵。</p>
<p style="">微软确实给出了后续解法——用WM_NULL广播唤醒。简单来说，Hook是在程序有消息循环时才处理的，WM_NULL就是微软为“没有实际东西，但是必须要跑一遍消息循环”的场景设计的喵。但是实测问题并没有得到缓解。</p>
<p style="">后来，我们又换了新的策略——既然你不肯释放<s>，就强迫你释放喵~❤️</s>我们使用FreeLibraryAndExitThread远程卸载DLL，结果是....几乎所有软件都闪退了，原本20多个后台进程一瞬间只剩下6个。为什么呢？主要有两个缺陷，第一个是我们不能用主控进程里的 GetModuleHandle 得到的 HMODULE，那个值只在主控进程地址空间有效，导致我们用一个无效的值调用函数让目标进程闪退；第二个是容易和正在被hook的进程产生竞争，最终也确实造成了闪退喵。</p>
<p style="">那干脆自己注入，不依赖微软的史山了？也不行。用了WMI 监听新进程、手动注入的方法之后，覆盖面显著降低，很多进程都无法拦截了喵。</p>
<p style="">最后...我们终于找到了一种比较妥帖的混合方案喵：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ZCJE.png&amp;size=m" width="417px">
</figure>
<p style="">这个方法参考了<a href="https://github.com/ramensoftware/windhawk" target="_self" rel="">WindHawk</a>作者的博客，在此表示感谢喵！</p>
<p style="">这个方案解决了上文提到的竞争问题——计数器确保了调用归零后才执行卸载；也解决了HMODULE问题——DLL主动执行卸载；最后，也解决了UnhookWindowsHookEx不生效的问题（通过WM_NULL事件）喵！可以说是最完美的一个方案啦~</p>
<h2 style="" id="%E5%88%A4%E6%96%AD%E5%89%AA%E5%88%87%E6%9D%BF%E6%98%AF%E5%90%A6%E6%9C%AA%E5%8F%98">判断剪切板是否未变</h2>
<p style="">如果同一个程序请求同一份剪切板内容，还需要审批，会不会显得有些麻烦呢？但是如果一个保护隐私的程序还要去读取剪切板，未免有点自相矛盾了喵...不过，Windows也给出了一个较好的解法——<code>GetClipboardSequenceNumber</code> 。这个函数会返回一个编号，这个编号就是检测剪切板是否变更的准确标识，每当剪切板中出现新的内容时数字就+1。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-mIUs.png&amp;size=m" width="1678px">
</figure>
<h2 style="" id="%E6%88%90%E6%9E%9C%E5%B1%95%E7%A4%BA">成果展示</h2>
<p style="">审批界面：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-WvVZ.png&amp;size=m" width="282px">
</figure>
<p style="">审批通过：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-CDXG.png&amp;size=m" width="276px">
</figure>
<p style="">审批不通过：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-JbkY.png&amp;size=m" width="268px">
</figure>
<p style="">成功拦截喵！~</p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">以上就是ClipboardAccessCtrl项目的整体细节啦！希望能对你有所帮助哦！</p>
<p style="">相比实体上的盗窃，隐私盗窃往往显得更加隐蔽——因为隐私是一个无实体的东西，被拿走后，那些秘密看似还保留在自己心里，但实际上已经不再是隐私了...为什么剪切板这么久都变成了隐私盲区？可能恰恰是因为它和"复制粘贴"这个动作太日常、太理所当然了，剪切板大概也还要裸奔很多年。直到下一个CryptoShuffler广泛爆发，或许人们才能意识到这是多么重要，为剪切板打上补丁。可是，这个补丁又能持续多久呢？</p>
<p style=""></p>
<p style="">由于项目代码多数出自AI之手，难免有不少漏洞和问题，期待你的<strong>issue、PR或者fork哦</strong>！我们下次再见啦~</p>
<p style="">ヾ(≧▽≦*)o</p>]]></description><guid isPermaLink="false">/archives/how-CAC-works</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-jTbR.png&amp;size=m" type="image/jpeg" length="353268"/><category>笔记</category><category>实用软件</category><pubDate>Sun, 28 Jun 2026 12:21:02 GMT</pubDate></item><item><title><![CDATA[浅谈某网站中存在的问题🤔]]></title><link>https://leonxie.cn/archives/some-issues-in-a-website</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E6%B5%85%E8%B0%88%E6%9F%90%E7%BD%91%E7%AB%99%E4%B8%AD%E5%AD%98%E5%9C%A8%E7%9A%84%E9%97%AE%E9%A2%98%F0%9F%A4%94&amp;url=/archives/some-issues-in-a-website" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%85%8D%E8%B4%A3%E5%A3%B0%E6%98%8E">免责声明</h2>
<p style=""><strong>本文记录的问题</strong><span style="color: #dc2626"><strong>已向网站方面反馈</strong></span><strong>，相关关键信息及接口路径已进行打码处理。在问题验证过程中，未进行漏洞利用或任何可能造成影响的操作。本文仅作为个人学习记录与反思，旨在避免今后开发中出现类似安全问题，未披露任何可直接复现问题的具体 API 端点、参数或利用方式。</strong><span style="color: #dc2626"><strong>在阅读文章前，您需要保证不会进行任何违法违规操作或测试。因参考本文内容而进行的测试，涉及违法、违规操作的，相关责任由行为人自行承担，作者不对由此产生的任何结果负责。</strong></span></p>
<p style=""><strong>本文部分描述基于个人观察，可能存在理解偏差，</strong><span style="color: #dc2626"><strong>如果您认为本文存在任何不妥之处，欢迎随时与我联系，我将完全配合并进行相应调整。承蒙垂阅，敬请指正。</strong></span></p>
<p style="">截至本文发布时，<strong>相关问题尚未确认修复状态</strong>。</p>
<p style=""><strong>本文基于真实使用中遇到的现象进行抽象和泛化，不指向任何特定系统。</strong></p>
<h2 style="" id="%E5%89%8D%E8%A8%80"><strong>前言</strong></h2>
<p style="">嘛...最近在课上使用某系统的时候，还没登进系统就出现了验证码加载失败的提示，询问周围同学发现都是一样的情况。打开dev tools，发现全都是各种红色的请求（报错）。在等待了许久，经历了无数次刷新后终于成功登录，却看到了一片空白。总算加载出了菜单，点击开始考试，却疯狂弹出(1040, Too many connections)，尝试使用curl手动请求api发现就连判断JWT token无效都需要30s，很明显80多个学生的同时请求超出了系统承受能力，看来只能等一等了。此时距离原定开始考试时间已经过去20分钟，笔者决定研究一下...<s>其实是因为2026年还没写过博客，所以水一篇喵</s></p>
<h2 style="" id="%E6%A6%82%E8%A7%88">概览</h2>
<p style="">查看网页的view-source页面和部分接口的返回，发现这是一个前端基于vue3+Element Plus(目测可能是这个UI库喵)，后端基于python+django rest框架的全栈项目。</p>
<figure data-content-type="image" style="display: flex; flex-direction: column;">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ENvg.png&amp;size=m" alt="image-ENvg.png" width="451px">
</figure>
<figure data-content-type="image" style="display: flex; flex-direction: column;">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-WQOb.png&amp;size=m" alt="image-WQOb.png" width="3840px">
</figure>
<h2 style="" id="%E7%A5%9E%E7%A7%98%E7%9A%84init%E6%8E%A5%E5%8F%A3">神秘的init接口</h2>
<p style="">既然源代码中的title是<span style="font-family: monospace; font-size: medium">页面加载中...</span>，那么配置是从哪里来的呢？页面加载时有半秒的空白，结合刚才服务器爆炸时菜单都无法加载的情况，猜测是从后端获取的。</p>
<p style="">经验证还真是。而且它也是问题最大的接口。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-yYdA.png&amp;size=m" width="1261px">
</figure>
<p style="">我们通过dev tools查看该接口返回，发现了....里面居然返回了sms secert, 服务器机器码等一系列敏感内容....<strong>信息量有点大了喵</strong></p>
<p style=""><strong>为了避免被恶意利用，此处不放图片，也不详细说明可被利用的字段有哪些。</strong></p>
<p style="">其他倒没什么....把sms的所有配置都明文放在前端确实有点危险了喵，而且还是无需身份验证即可请求的接口。</p>
<h2 style="" id="%E8%AF%A1%E5%BC%82%E7%9A%84%E8%B5%84%E6%BA%90%E5%8A%A0%E8%BD%BD%E9%87%8F">诡异的资源加载量</h2>
<p style="">访问首页，看看加载了哪些资源：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Efje.png&amp;size=m" alt="image-Efje.png" width="2319px">
</figure>
<p style="">一直在反复请求校徽文件，首次加载的整体资源大小高达<strong>91.1MB</strong></p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-XKAv.png&amp;size=m" width="2377px">
</figure>
<p style="">嗯....确实有点诡异了，按理来说没必要请求这么多遍，但是我没仔细研究，也不知道是哪里出了问题。可能是避免校徽文件出错吧，我才疏学浅没搞懂这里的意义。</p>
<h2 style="" id="server-time%E6%8E%A5%E5%8F%A3">server time接口</h2>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-OQxE.png&amp;size=m" width="2144px">
</figure>
<p style="">这个接口在考试时每5秒会请求一次，普通情况下只请求一次，或许也是导致系统崩溃的原因之一（但报错是连接池耗尽，大概这不是主要诱因，除非server_time经过数据库），盲<strong>猜是为了通过调整本地时间绕过考试时间限制....但是没看到具体实现。</strong>其实可以在服务器端计时的，感觉这样有点多此一举，不过可能也是系统太高级了我没读懂吧。</p>
<h2 style="" id="%E6%80%A7%E5%88%AB%EF%BC%9A0">性别：0</h2>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-TBRc.png&amp;size=m" width="740px">
</figure>
<p style=""><span style="color: #d1d5db"><s><sup>笑点解析：你怎么知道我是可爱弱受0喵</sup></s></span></p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-oJCs.png&amp;size=m" width="396px">
</figure>
<p style="">后端没有设置性别时就返回0，其实可以搞一个比如<s>请设置性别的默认文本。</s>看了一下设置个人信息的api，gender字段有三种值，0、1、2，分别是0、男、女，返回的并不是文本，所以不应该说默认文本，而是在后端返回0时提示请设置性别。有趣的是，通过更新个人信息api可以把性别设置回0，还是校验一下客户端的请求为妙呀</p>
<h2 style="" id="%E5%90%8D%E5%8D%95%E5%A4%A7%E6%94%BE%E9%80%81">名单大放送</h2>
<p style="">看到一个几百行的examassignment接口返回，那我可要看看是什么了喵。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-SezE.png&amp;size=m" width="1882px">
</figure>
<p style="">名单大放送....还好这个接口需要登录，不然就大事不好了。</p>
<p style="">很明显前端没有用到这些信息，也可能是我眼瞎没看到，但...不管怎么说返回900多行的数据有点多呀</p>
<h2 style="" id="%E5%AE%8C%E5%85%A8%E6%B2%A1%E6%9C%89%E7%AD%9B%E9%80%89%E6%9C%BA%E5%88%B6%E7%9A%84ai%E5%A4%A7%E6%A8%A1%E5%9E%8B">完全没有筛选机制的AI大模型</h2>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-IkEL.png&amp;size=m" width="1564px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rKWS.png&amp;size=m" width="1885px">
</figure>
<p style="">....</p>
<p style="">要不看看你在说啥喵....吓哭了</p>
<p style="">试了一下，基本上没什么人用，所以说什么都会被放到大家常问里。原本大家常问哪里是一些污言秽语，我说了个你好就那里就变成你好了喵。其实这里也不算系统问题，既没有XSS也没有SQL注入，主要是看到了某些逆天学生的逆天行为。</p>
<h2 style="" id="%E6%B2%A1%E6%9C%89%E4%B8%8A%E4%B8%8B%E6%96%87%E7%9A%84ai%E5%A4%A7%E6%A8%A1%E5%9E%8B">没有上下文的AI大模型</h2>
<p style="">这里还有另一个在线AI助手，接入的是deepseek-chat模型，看模型名字推测用的是deepseek官方api。</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-OUHv.png&amp;size=m" width="3186px">
</figure>
<p style="">使用流式请求api，有后端代理，这一点必须点赞。不过没有上下文真是有点可惜</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-uYYj.png&amp;size=m" alt="image-uYYj.png" width="2398px">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rSuW.png&amp;size=m" width="756px">
</figure>
<p style="">可以看到请求体中只有本次发送的消息，就差一步这个AI就能用了呀，有点可惜。</p>
<p style="">不过在正常登录流程中即可获取用于身份识别的 Token，就可以调用本接口自行传递上下文了喵。相关认证细节此处不展开。</p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">最终考试回滚到了纸笔考试，老师也通过机房管理软件关闭了所有电脑。<s><sup>或许还是纸笔考试SLA最高，100%。</sup></s>这个故事告诉我们，<strong>再现代的框架也阻止不了有问题的代码，再精密的前端也挡不住脆弱的后端呀</strong>....望这些漏洞早日被修复，也希望大家在写代码的时候一定一定注意好权限分层和避免不必要的请求呀，祝大家都能写出完美的后端喵！</p>
<p style="">感谢阅读喵</p>]]></description><guid isPermaLink="false">/archives/some-issues-in-a-website</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fthumb-1920-1323685.png&amp;size=m" type="image/jpeg" length="833030"/><category>笔记</category><pubDate>Wed, 28 Jan 2026 03:36:51 GMT</pubDate></item><item><title><![CDATA[想要一个轻量匿名投稿站？使用Sycamore_whisper谢谢喵！]]></title><link>https://leonxie.cn/archives/Sycamore_whisper_deploy</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E6%83%B3%E8%A6%81%E4%B8%80%E4%B8%AA%E8%BD%BB%E9%87%8F%E5%8C%BF%E5%90%8D%E6%8A%95%E7%A8%BF%E7%AB%99%EF%BC%9F%E4%BD%BF%E7%94%A8Sycamore_whisper%E8%B0%A2%E8%B0%A2%E5%96%B5%EF%BC%81&amp;url=/archives/Sycamore_whisper_deploy" width="1" height="1" alt="" style="opacity:0;">
<p style="">*头图来自pixiv 134152139喵</p>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">应该很多学校都有校园墙/表白墙吧，但大多数都是以这样的模式运营的：用户发送投稿到运营者的微信账号，再由运营者审核后发送至朋友圈。</p>
<p style="">这样的模式，我认为虽然容易开始，但是没有真正匿名的感觉，因为无论如何运营者都会知道你是谁。其次，对运营者和用户都有些麻烦：运营者需要定时查看微信消息，再把消息复制到朋友圈发布，如果有图片甚至还要下载到本地，再到朋友圈发送；用户不能随时随地投稿，查看内容也需要打开微信，点开朋友圈。</p>
<p style="">在我们学校的校园墙跑路后，我萌生了搭建一个匿名投稿站的想法，但是市面上又没有很符合我要求的项目，于是...就自己设计了一个！今天我们就来部署一下Sycamore_whisper吧！</p>
<h2 style="" id="%E9%A1%B9%E7%9B%AE%E4%BC%98%E5%8A%BF">项目优势</h2>
<p style="">1、轻量，功能完整</p>
<p style="">2、除了ip哈希会用于速率限制而被储存，不储存<strong>任何</strong>其他用户信息</p>
<p style="">3、开箱即用，无需复杂配置</p>
<p style=""><s>缺点：代码大多数使用AI编写，维护成本较高喵（逃）</s></p>
<p style="">欢迎留下你宝贵的建议，或者参与项目维护喵！谢谢！</p>
<h2 style="" id="%E9%A1%B9%E7%9B%AE%E6%BC%94%E7%A4%BA">项目演示</h2>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-AkUK.png&amp;size=m" width="813px" height="384px" style="display: inline-block"></p>
<p style="">首页</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-fGzF.png&amp;size=m" width="814px" height="385px" style="display: inline-block"></p>
<p style="">投稿</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-xmLn.png&amp;size=m" width="448px" height="414px" style="display: inline-block"></p>
<p style="">评论</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-dCtN.png&amp;size=m" width="729px" height="345px" style="display: inline-block"></p>
<p style="">管理面板</p>
<h2 style="" id="%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87">环境准备</h2>
<p style=""><span style="font-size: 16px"><strong>不知道在哪里购买服务器？推荐</strong></span><a href="https://rainyun.com/Leonxie_" target="_blank" rel=""><strong>雨云</strong></a><span style="font-size: 16px"><strong>，价格可接受，操作方便，开箱即用。</strong></span></p>
<p style="text-align: left"><a href="https://www.leonxie.cn/upload/image-bVRb.png" rel="default" class="fancybox fancybox.image"><span style="font-size: 16px"><strong><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fwww.leonxie.cn%2Fupload%2Fimage-bVRb.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></strong></span></a></p>
<p style="text-align: left">那么话不多说，我们开始吧~</p>
<p style="text-align: left">我们先来配置一下环境吧！首先，让我们在服务器端安装一下python环境。</p>
<pre><code>apt install python3 python3-venv python3-pip screen git</code></pre>
<p style="">接下来，我们在电脑上<a href="https://nodejs.org/zh-cn" target="_blank" rel="">安装一下node.js环境</a></p>
<p style="">安装pnpm</p>
<pre><code>npm install -g pnpm</code></pre>
<p style="">完成~</p>
<h2 style="" id="%E9%83%A8%E7%BD%B2%E5%90%8E%E7%AB%AF">部署后端</h2>
<p style="">那么，我们开始部署后端吧！</p>
<p style="">首先，克隆项目到本地</p>
<pre><code>git clone https://github.com/Sycamore-Whisper/backend &amp;&amp; cd backend</code></pre>
<p style="">创建一个screen，让项目在后台保持运行</p>
<pre><code># 创建screen，api为screen的名字
screen -S api
# 后续回到screen
screen -r api</code></pre>
<p style="">然后，创建一个虚拟环境并激活</p>
<pre><code>python3 -m venv api-venv
source api-venv/bin/activate</code></pre>
<p style="">如果bash前面出现 (环境名) 说明已经进入了虚拟环境</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hRyn.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来，安装项目依赖：</p>
<pre><code>pip install -r requirements.txt</code></pre>
<p style="">如果没有报错的话，就可以运行了！</p>
<p style="">如果遇到编译错误，可能需要安装 Python 开发工具包（如 python3-dev）</p>
<pre><code>python api_server.py</code></pre>
<p style="">成功！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-KkOH.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">注意：此时项目监听的是127.0.0.1的5000端口，如需修改，可以打开api_server.py，滑动到最下方，修改app.run部分：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-HgFE.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来，配置反向代理和SSL证书，这里就不再赘述啦！</p>
<p style="">如果访问/路由看到这个提示，就说明后端已部署完毕！可以开始对接前端进行初始化了！恭喜🎆</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-KkIs.png&amp;size=m" width="943px" height="259px" style="display: inline-block"></p>
<h2 style="" id="%E9%83%A8%E7%BD%B2%E5%89%8D%E7%AB%AF">部署前端</h2>
<p style="">克隆前端项目至本地：</p>
<pre><code>git clone https://github.com/Sycamore-Whisper/frontend &amp;&amp; cd frontend</code></pre>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-zxNs.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">文件夹里有好多文件，我们不用管，径直来到/scr/config.ts：</p>
<p style="">我们主要修改api_config，在这里填入后端地址，注意是开放到公网上的地址，剩下的按需配置：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-xMPX.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">如果前端打算使用https，后端也要使用https！</p>
<p style="">接下来，找到/public/icon.png，将其替换为自己的图标</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-irWI.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">然后是about.md，可以填写markdown格式的内容，会展示在"关于"页面：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-icJZ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">好耶！前端初始化完成，可以执行<code>pnpm install</code>安装依赖，<code>pnpm build</code>来构建静态文件了！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-DWDq.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-sOiv.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">我们把静态文件上传到服务器：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-wmzi.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来配置SPA路由回退，将这些配置加入nginx配置文件：</p>
<pre><code>location / {
    try_files $uri $uri/ /index.html;
}</code></pre>
<h2 style="" id="%E5%88%9D%E5%A7%8B%E5%8C%96">初始化</h2>
<p style="">访问网站，即可来到后端初始化页面~按照图片提示配置：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-LDGm.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">初始化成功，恭喜！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-QJig.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">可以尽情使用啦~感谢使用Sycamore_whisper项目喵！</p>
<p style="">后续可以使用<code>git pull</code>更新项目！</p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">感谢你能读到这里，也恭喜你成功部署了Sycamore_whisper。</p>
<p style="">其实一开始并没有打算单独做一个项目。当时使用了typecho+共享账户的方式搭建了匿名投稿站，但是后来缺乏维护，共享账户也容易被滥用，比如修改密码什么的。后来学长/姐运营的"XXXX匿名投稿bot"跑路了，才又想起来这件事。</p>
<p style="">这个项目...一开始看起来像一个不可能的任务，毕竟我从没有开发过这么复杂的前端，后端也不会多少。但好在有AI辅助，让我3页草稿的设计变为现实，看到这个成品，咱也很开心和有成就感哦！</p>
<p style="">所以...希望你也用的开心哦~</p>
<p style="">如果遇到任何问题，欢迎留言，我会尽力解决！</p>]]></description><guid isPermaLink="false">/archives/Sycamore_whisper_deploy</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2FSnipaste_2025-11-20_22-06-16.jpg&amp;size=m" type="image/jpeg" length="48247"/><category>实用软件</category><pubDate>Thu, 20 Nov 2025 14:03:50 GMT</pubDate></item><item><title><![CDATA[虚拟货币与NFT——这是什么？怎么玩？]]></title><link>https://leonxie.cn/archives/what-is-crypto-currency</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E8%99%9A%E6%8B%9F%E8%B4%A7%E5%B8%81%E4%B8%8ENFT%E2%80%94%E2%80%94%E8%BF%99%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E6%80%8E%E4%B9%88%E7%8E%A9%EF%BC%9F&amp;url=/archives/what-is-crypto-currency" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">Web3时代来临，各种新颖的概念涌入视线。笔者今天就来讲讲虚拟货币和NFT的<strong>概念</strong>吧，顺便讲讲这些东西<strong>怎么玩</strong>。</p>
<p style="">嘛...不过由于篇幅有限，这只是一个简要讲解，很多概念可能没讲的很清楚....如果内容有纰漏或者错误，一定要纠正我！谢谢喵！</p>
<p style=""><span style="font-size: 20px"><strong>本文内容仅为科普介绍与技术演示，绝不构成任何投资建议、财务意见或参与鼓励。</strong></span><span style="font-size: 20px; color: rgb(15, 17, 21)"> 虚拟货币与NFT市场蕴含着极高的风险，请您在充分了解并确认能够承担相应后果的前提下，审慎行事。</span></p>
<h2 style="" id="%E8%99%9A%E6%8B%9F%E8%B4%A7%E5%B8%81%E5%92%8C%E5%B8%B8%E8%A7%84%E8%B4%A7%E5%B8%81%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F">虚拟货币和常规货币的区别？</h2>
<p style="">首先，虚拟货币和纸币、数字人民币这种东西有什么区别呢？为什么非要搞这个？答案就是区块链，也就是分布式账本。普通货币的“转账记录”记录在同一个地方，比如银行或者支付宝。有什么坏处呢？第一是安全性，假设支付宝被入侵（虽然现在看来可能性较小），你的钱可能都没了，记录很容易被修改。第二是隐私。<s>假设你画涩图赚了10万（这什么例子啊QAQ），现在转账回国内银行，肯定马上就会被大调查吧？不仅钱没了，身份还暴露了，要蹲大牢了。</s></p>
<h2 style="" id="%E5%8C%BA%E5%9D%97%E9%93%BE%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">区块链是什么？</h2>
<p style="">区块链的本质，就和它的第二个名字一样，把这些转账记录在每个地方都写一遍，一个地方被修改了别的地方还是正确的，这个错误的支链很快就会被覆盖掉。那怎么确认一个转账呢？需要区块链中的50%以上的区块同意。这也衍生出一个概念，51%攻击，也就是理论上来说，掌握50%以上的算力可以进行，双花（双重花费）攻击，或者阻止交易确认。但由于现在例如BTC（比特币）这样的虚拟货币的区块链都很庞大，所以这种攻击可能得要国家级的力量。那凭什么我要加入这个区块链呢？你要消耗我的资源，用我的设备储存转账信息，我能得到什么呢？</p>
<p style="">先来讲讲比特币。（比特币是去中心化的起源，于2008年由中本聪提出。）比特币是怎么被发行的呢，就和矿工有关系，也就是区块。每个矿工需要计算一道题目，你可以理解为“有奖竞答”。计算出来了就可以加入区块链，会获得一些虚拟货币奖励。比特币就是这样被挖出来的。比特币一共有2100万个，每隔四年给矿工的奖励减少一半，这样比特币就会被慢慢发行了。当然现在题目的难度已经很大了，一般不建议靠自己的力量挖，大概率挖不过别人。</p>
<p style="">那万一矿工挖完就不挖了呢？直接拿钱跑路？不可以。<span style="font-size: 16px; color: rgb(15, 17, 21)">矿工必须遵循网络规则来打包有效的交易，才能使他们挖出的区块被网络接受。如果打包无效交易，整个区块将被其他节点拒绝，奖励也就无效了。此外，持续打包交易还能赚取手续费，所以矿工有动力维护网络正常运行。何乐而不为呢？</span></p>
<p style="">那么刚才的问题就有答案了，之所以我加入区块链，就是因为我可以得到奖励。</p>
<h2 style="" id="%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8C%BA%E5%9D%97%E9%93%BE%E5%8C%BF%E5%90%8D%E6%80%A7%E8%BF%99%E4%B9%88%E5%A5%BD%EF%BC%9F">为什么区块链匿名性这么好？</h2>
<p style="">回到最开始提到的例子，为什么使用虚拟货币我的身份就不会暴露？区块链中有私钥、公钥和收款地址这三个概念，别人给你转账用的是你的<strong>收款地址</strong>，记录在区块链上的是<strong>收款地址</strong>，而证明财产归属就是<strong>私钥</strong>。一个私钥对应一个公钥，公钥可以生成无数个收款地址，导致身份无法被追溯。公钥就像邮箱地址，可以公开告诉所有人，让大家都来扩列。而私钥，也就是邮箱密码绝对不能告诉任何人，否则....就不好啦</p>
<p style="">简单来说，</p>
<ul>
 <li>
  <p style=""><strong>当你要收款时</strong>，你把<strong>收款地址</strong>给别人。</p>
 </li>
 <li>
  <p style=""><strong>当你要花钱时</strong>，你需要用<strong>私钥</strong>对交易进行签名，并将对应的<strong>公钥</strong>和签名一起广播到网络，网络节点用这个公钥来验证签名是否有效，从而确认你对这个地址的资产拥有权。</p>
 </li>
</ul>
<p style="">而私钥那么长，怎么记住呢？现在的钱包都有助记词的功能，也就是把私钥变成一些英文单词，方便记忆。如果哪天不记得私钥了，这些助记词也可以恢复钱包，所以价值和私钥一样。</p>
<p style="">举个例子，助记词可能长这样：</p>
<pre><code>rabbit armor blanket
solar whisper forest
lamp crystal ticket
gate journey bright</code></pre>
<p style=""><s>（这个助记词是乱编的，别去尝试恢复钱包喵）</s></p>
<p style="">到这里，区块链的概念基本上就讲完了！</p>
<h2 style="" id="%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6">智能合约</h2>
<p style="">在了解NFT之前，我们先来聊聊智能合约吧！普通的合同，需要一个第三方来验证，比如法院。而智能合约就是一种“自动执行”的合同，无人可以阻止或者篡改。就像自动售货机，付款之后就会出货，不需要任何人来验证（自动验证）。</p>
<p style="">不同区块链上的合约是用不同的语言编写的，比如以太坊上的智能合约使用Solidity。给大家看看智能合约长啥样：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-TTxI.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><s>（其实我也看不懂Solidity，这个是我发行NFT时OpenSea自动生成的）</s></p>
<h2 style="" id="gas%E8%B4%B9">Gas费</h2>
<p style="">在发行NFT，创建智能合约时，我们会看到他要求我们支付网络费。那为什么要有网络费这个东西呢？很简单，如果用户不需要为算力付钱，自然不会给代码做优化，让矿工白白多花算力，甚至写个恶意代码还能让整个网络卡死。所以，Gas费正是保证网络健康运行的基石之一，也是对矿工的一种补偿。</p>
<h2 style="" id="nft%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">NFT是什么？</h2>
<p style="">了解了智能合约，就可以说说NFT了！NFT，就是基于智能合约的。NFT的全名是非同质化代币，每个都独一无二，不可分割，不像比特币这种同质化代币，你可以买/拥有0.01个，或者把这0.01个转换成别的虚拟货币，而NFT只能拥有整数个，也不能把一个NFT转换成另一个。每个NFT都有一个“Token ID”，智能合约里则记录了NFT的Token ID，谁拥有它，这个NFT长什么样子（指向元数据的链接），版税规则（也就是你如果转卖给别人，创造者会获得特定百分比的虚拟货币）。</p>
<p style="">那NFT有什么用呢？就像一个稀有的艺术品，NFT的价格也可以被炒起来。NFT也被广泛用作礼物或者纪念品，算是一种很独特、很新颖的东西呢！</p>
<p style="">比如这是我们区块链社的NFT纪念品：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F7add42c94f79b1d343dc4ea34d6e2d72_720.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">这是咱给朋友的生日礼物NFT：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-CIJR.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">QwQ！</p>
<p style=""></p>
<p style=""><strong>讲了这么多概念....我们来看看这些东西怎么玩吧！</strong></p>
<h2 style="" id="%E8%99%9A%E6%8B%9F%E8%B4%A7%E5%B8%81%E6%80%8E%E4%B9%88%E7%8E%A9%EF%BC%9F">虚拟货币怎么玩？</h2>
<p style="">虚拟货币本身只要放在钱包里就行了，那怎么买呢？我们一般选择例如OKX这样的交易所。有什么好处呢？由于你在交易所买币的时候货币相当于在内部流动，所以完全不需要手续费！</p>
<p style="">OKX本身的新手引导已经很完善了，所以这里简单讲讲P2P Trading的流程，就不实际演示了吧！</p>
<p style="">买：选择商家-&gt;拿到对方的支付宝/微信账户-&gt;转账-&gt;对方查看支付凭证-&gt;对方放币-&gt;交易结束</p>
<p style="">卖：选择商家-&gt;提供支付账户-&gt;等待对方支付-&gt;检查支付凭证-&gt;放币-&gt;交易结束</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F894c977b590ba527aefd46fde5a57d30_720.png&amp;size=m" width="464px" height="619px" style="display: inline-block"></p>
<h2 style="" id="nft%E6%80%8E%E4%B9%88%E7%8E%A9%EF%BC%9F">NFT怎么玩？</h2>
<p style="">我们来使用<a href="https://opensea.io" target="_blank" rel="">OpenSea</a>创建一个NFT吧！（如果遇到连接已重置问题，懂的都懂喵）</p>
<p style="">首先，点击Link Wallet连接钱包。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-QrwW.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">我们这里连接了MetaMask钱包。一定要现在钱包里备好虚拟货币用于支付Gas费哦~</p>
<p style="">我们来到Studio，点击Create New</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ZbeH.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">Open Collection比较简单，我们就选它吧！</p>
<p style="">接下来，上传Open Collection的封面，输入合约名称、Token标志。注意Chain的选择，笔者建议使用Polygon，Gas费较低。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cOnD.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">需要注意NFT的内容必须是你自己的东西，任何有版权的东西都不要上传，比如你喜欢的IP之类的。</p>
<p style="">点击Publish Contract部署智能合约，会弹出来钱包的确认页面：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-MoMA.png&amp;size=m" width="334px" height="520px" style="display: inline-block"></p>
<p style="">点击确认即可！</p>
<p style="">部署成功！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-MHBV.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">我们继续操作，Collection Details按自己的想法填写就可以了，先看Creator Earning。</p>
<p style="">这里就是刚才提到的版税，笔者建议使用5%！<strong>Recipient Wallet Address</strong>就是版税会到哪里去，输入你的钱包地址即可。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-okLT.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">完成修改后记得点击Publish Changes</p>
<p style="">接下来，添加一个NFT吧！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-IUoP.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">完成后点击Mint，在钱包中确认</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hfOb.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">这样，你的NFT就部署完成了！你可以List For Sale，在市场中列出等待别人购买，也可以Send，发送给其他人作为礼物或者纪念品！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ZliH.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">到这里，我们已经简要了解了虚拟货币和NFT，甚至还从头开始自己创建了一个NFT，很不错吧！</p>
<p style="">不过这只是Web3.0时代的冰山一角，还有很多有趣的玩法可以被发掘。如果你感兴趣，也可以去了解了解哦~希望你们都能体会到Web3.0的乐趣！</p>
<p style="">在最后</p>
<p style=""><strong>虚拟货币有价值，正是因为人们相信其有价值。</strong></p>
<p style="">完</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-zpEe.png&amp;size=m" width="536px" height="347px" style="display: inline-block"></p>]]></description><guid isPermaLink="false">/archives/what-is-crypto-currency</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-zpEe.png&amp;size=m" type="image/jpeg" length="665832"/><category>笔记</category><pubDate>Sat, 1 Nov 2025 05:20:46 GMT</pubDate></item><item><title><![CDATA[Misskey——自建一个去中心化社交平台]]></title><link>https://leonxie.cn/archives/misskey-deploy</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=Misskey%E2%80%94%E2%80%94%E8%87%AA%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%8E%BB%E4%B8%AD%E5%BF%83%E5%8C%96%E7%A4%BE%E4%BA%A4%E5%B9%B3%E5%8F%B0&amp;url=/archives/misskey-deploy" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E6%88%90%E6%9E%9C%E5%B1%95%E7%A4%BA">成果展示</h2>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-DfCQ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rbRR.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-AUpV.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">微博、推特（X.com）这样的社交平台，你或许早已习以为常。在中心化平台上，我们<strong>无法掌控自己的数据</strong>；一旦平台倒闭、变质或被收购，用户只能被动接受。如果我们追求<strong>自托管、去中心化、隐私和自由</strong>，又或者单纯想弄个朋友之间的<strong>私密的</strong>社区，有没有别的选择呢？答案或许是 <strong>Misskey</strong> —— 一个基于 ActivityPub 协议的去中心化开源社交平台。不同于推特，misskey不是单一的服务，而是一个一个实例组成的<strong>分布式网络</strong>，可<strong>自定义程度很高</strong>，最重要的是，你可以<strong>随时删除、导出、转移数据</strong>，可以赋予你真正的<strong>数据主权</strong>。</p>
<p style="">Tips：想要使用Misskey不一定要自建实例。你可以前往<a href="https://misskey-hub.net/cn/servers/" target="_blank" rel="">这里</a>查看Misskey服务器列表，加入自己喜欢的服务器（当然，每个服务器都可以和其他服务器联通，除非关闭了联合）。如果确实有自建需求，且有精力、愿意维护下去，那就继续看下去吧！</p>
<h2 style="" id="%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">准备工作</h2>
<p style=""><strong>必须：</strong></p>
<p style="">1、一台服务器（至少2核、1.5GB空余内存，推荐使用国外以及港澳台服务器）</p>
<p style="">2、一个域名（<strong>选定后一定不要更换！</strong>）</p>
<p style="">3、Docker环境</p>
<p style=""><strong>非必须：</strong></p>
<p style="">1、对象储存OSS</p>
<p style="">2、SMTP发件服务器</p>
<p style="">3、Turnstile、reCATPCHA等人机验证服务</p>
<p style=""><span style="font-size: 16px"><strong>不知道在哪里购买服务器？推荐</strong></span><a href="https://121108.xyz/" target="_blank" rel=""><strong>雨云</strong></a><span style="font-size: 16px"><strong>，价格可接受，操作方便，开箱即用。</strong></span></p>
<p style="text-align: left"><span style="font-size: 16px"><strong><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fwww.leonxie.cn%2Fupload%2Fimage-bVRb.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></strong></span></p>
<p style="text-align: left">我们先为misskey创建一个目录吧，这里以/opt/misskey为例。</p>
<p style="text-align: left"><code>mkdir /opt/misskey</code></p>
<p style="text-align: left"><code>cd /opt/misskey</code></p>
<h2 style="text-align: left" id="%E5%85%8B%E9%9A%86%E4%BB%93%E5%BA%93">克隆仓库</h2>
<p style="">让我们先克隆一下misskey的仓库吧。</p>
<p style=""><code>git clone -b master https://github.com/misskey-dev/misskey.git</code></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-QTuO.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">完成！接下来进入目录，并将工作分支切换到master：</p>
<p style=""><code>cd misskey</code></p>
<p style=""><code>git checkout master</code></p>
<h2 style="" id="%E8%AE%BE%E7%BD%AE">设置</h2>
<p style="">先将仓库中的示例配置复制到正确位置</p>
<pre><code>cp .config/docker_example.yml .config/default.yml
cp .config/docker_example.env .config/docker.env
cp ./compose_example.yml ./compose.yml</code></pre>
<p style="">首先要更改的是compose.yml。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ivnF.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">如果需要mcaptcha、meilisearch，可以选择取消注释，这里不再赘述如何配置。</p>
<p style="">需要注意的是web里面的ports配置，这决定了以后反向代理用什么端口，务必按照自己需求修改，比如我选择3030端口。</p>
<p style="">接下来修改的是config/default.yml。</p>
<p style="">除去注释，首先映入眼帘的是url。还记得准备工作里要求准备的域名吗？请以https://你的域名 的形式替换https://example.tld/，就像这样：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Nmus.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来需要配置的是数据库。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-HOaW.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来是/.config/docker.env</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-JMQk.png&amp;size=m" width="915px" height="605px" style="display: inline-block"></p>
<p style="">很好！配置起来也不算难吧~</p>
<p style="">接下来，我们来构建docker镜像并初始化吧！</p>
<h2 style="" id="%E6%9E%84%E5%BB%BA%E9%95%9C%E5%83%8F%E4%B8%8E%E5%88%9D%E5%A7%8B%E5%8C%96"><strong>构建镜像与初始化</strong></h2>
<p style=""><strong>*经测试，这一步需要消耗大量资源，构建过程中会生产10GB+临时文件，且会占用大量CPU资源，还有可能中途卡住。如果中途日志停滞，请按Ctrl+C停止并再次启动，否则会持续占用资源。构建前如果可行，建议关闭所有其他服务。</strong></p>
<p style="">运行<code>sudo docker compose build</code>开始构建镜像吧。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-XlqI.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">稍安勿躁，如果看到这个界面，就说明构建完成！这里我花了500秒的时间，如果服务器剩余资源较少可能会花费更长时间。</p>
<p style="">好了，构建完镜像后，我们就要来初始化数据库了。</p>
<p style="">执行<code>sudo docker compose run --rm web pnpm run init</code></p>
<p style="">docker会先拉取镜像</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cGIM.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来就是正式初始化数据库，如果出现数据库连接失败的报错，大概率是<strong>1、数据库信息填错了 2、没有构建镜像</strong></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-TOmb.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">不错，初始化结束！<s>这可比构建时间短多了</s></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-lJSD.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">好耶！到这里，你崭新的misskey实例已经基本完成了所有搭建步骤！接下来，我们来做最后的处理吧~</p>
<h2 style="" id="%E8%BF%90%E8%A1%8Cmisskey%E3%80%81%E9%85%8D%E7%BD%AE%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86">运行misskey、配置反向代理</h2>
<p style="">距离看到自己的劳动成果只有几步....</p>
<p style="">执行<code>sudo docker compose up -d</code>吧</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-MLDX.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来，让我们清理一下构建缓存</p>
<p style="">输入<code>docker builder prune</code>，并稍等片刻</p>
<p style="">清理完成</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-bmCd.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">部署结束！不过先别急着观赏成果，我们还要将misskey“绑定”到域名上。</p>
<p style="">以1panel为例（宝塔面板同理），我们创建一个反向代理网站。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Tpkx.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来在域名服务商（nameserver提供商）那里添加一条指向服务器的A记录，比如这样。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-PPOD.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来去面板里申请一个ssl证书，这里不再赘述。</p>
<p style="">配置完成：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-dIXZ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">注意：1panel默认的openresty站点配置会导致联合失败，需这样修改配置：</p>
<p style="">location ^~ /.well-known/acme-challenge {</p>
<p style="">allow all;</p>
<p style="">root /usr/share/nginx/html;</p>
<p style="">}</p>
<h2 style="" id="%E6%9B%B4%E6%96%B0misskey%E7%9A%84%E6%96%B9%E6%B3%95"><strong>更新Misskey的方法</strong></h2>
<pre><code>git stash
git checkout master
git pull
git submodule update --init
git stash pop
sudo docker compose build
sudo docker compose stop &amp;&amp; sudo docker compose up -d</code></pre>
<h2 style="" id="%E5%88%9D%E5%A7%8B%E5%8C%96misskey">初始化misskey</h2>
<p style="">访问域名，来初始化你的misskey实例吧！</p>
<p style="">先填写基本信息</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-kAXn.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">点击"下一个"</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Ytrf.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-AglO.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">按照向导填写即可，我们这里名称填写loveneko，选择小圈子服务器，100人以下，加入Fediverse，并使用我自己的信息作为管理员信息。</p>
<p style="">填写完成后点击使用此设置。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-QdHh.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">辛苦了，设置已完成！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cjHx.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">点击开始，就可以进入实例了！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Pofn.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">到这里，misskey的基本配置就完成了！完全可以开放给朋友使用了~</p>
<h2 style="" id="%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C">基本操作</h2>
<p style="">接下来，进入控制面板，我们来学习一些基本管理操作。</p>
<p style="">点击这里生成邀请码，适用于不开放注册的实例</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hIpv.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">在这里批量上传自定义表情符号，可以在发帖时、聊天时、甚至在昵称中使用</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-HXDm.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">在这里进行服务器常规设置，比如设置名称、简介等</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ZXvd.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">在这里设置SMTP邮件服务器，一般用于发送注册验证邮件和通知邮件</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hQrT.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">在这里设置对象储存，用于储存用户网盘里的文件，如果不配置则使用本地储存</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-LNZp.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">在这里配置人机验证服务，用于注册、登录时验证，推荐使用Turnstile或reCAPTCHA</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rOdX.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-xIVl.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">到这里，你崭新的misskey实例就搭建完成了！<span style="font-size: 16px; color: rgb(60, 72, 88)">恭喜！</span></p>
<p style="">misskey的乐趣不仅在于社还在于其去中心化的设计，可以试试关注别的服务器的用户哦！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-SpwC.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">比如，前往https://你的misskey实例域名/@leonxie@catpost.link，点击关注，就可以在时间线里看到我的帖子了，即使我没有在你的实例注册账户！甚至，你还可以关注其他<span style="font-size: 16px; color: rgb(31, 35, 40)">Mastodon实例的用户！</span></p>
<p style="">作为管理员，还有很多玩法等着探索，misskey的可自定义程度可比推特、微博这类平台高多了。</p>
<p style="">最后还想提醒大家，如果真的要开放注册，还需要量力而为哦，如果服务器撑不住就不好了。杂七杂八的用户进来也可能造成很多问题，比如R18泛滥，所以也务必制定好规则，随时使用你的禁言权限哦。</p>
<p style=""><strong>如果这篇文章帮到了你或者遇到问题，欢迎在评论区留言，这是对我最大的鼓励与支持！谢谢！</strong></p>]]></description><guid isPermaLink="false">/archives/misskey-deploy</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F93df7693-448f-413f-9f1a-8d0cab3e50ae.webp&amp;size=m" type="image/jpeg" length="119866"/><category>实用软件</category><pubDate>Sat, 6 Sep 2025 03:19:45 GMT</pubDate></item><item><title><![CDATA[Miku生日快乐哦！]]></title><link>https://leonxie.cn/archives/miku-18</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=Miku%E7%94%9F%E6%97%A5%E5%BF%AB%E4%B9%90%E5%93%A6%EF%BC%81&amp;url=/archives/miku-18" width="1" height="1" alt="" style="opacity:0;">
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F9a870112993294a05d343f36a71687c3.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">Happy Birthday <a href="https://miku39.sbs" target="_blank" rel="">Hatsune Miku</a>~</p>]]></description><guid isPermaLink="false">/archives/miku-18</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F9a870112993294a05d343f36a71687c3.png&amp;size=m" type="image/jpeg" length="845187"/><pubDate>Sat, 30 Aug 2025 16:11:40 GMT</pubDate></item><item><title><![CDATA[NSFW指南]]></title><link>https://leonxie.cn/archives/misskey-nsfw-guide</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=NSFW%E6%8C%87%E5%8D%97&amp;url=/archives/misskey-nsfw-guide" width="1" height="1" alt="" style="opacity:0;">
<p style=""><strong><u>此文章的适用范围：*.catpost.link</u></strong></p>
<p style=""><strong><u>注意：请勿在*.catpost.link上传R18内容。我们仅允许NSFW（不含R18）内容。来自其他服务器的内容不计在内。</u></strong></p>
<h3 style="" id="%E4%BB%80%E4%B9%88%E6%98%AF-nsfw%EF%BC%9F"><strong>什么是 NSFW？</strong></h3>
<p style="">NSFW 是 <strong>Not safe for work</strong> 的缩写，意思是“在工作场所不适合观看”。</p>
<p style="">虽然单词中指定了“工作场所”，但实际上它适用于<strong>学校、公共交通、公共设施等场所</strong>，这些地方也不适合查看相关内容。</p>
<h3 style="" id="nsfw-%E5%92%8C-r-18-%E7%9A%84%E5%8C%BA%E5%88%AB"><strong>NSFW 和 R-18 的区别</strong></h3>
<p style="">不需要标记为NSFW的图片示例：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Mjqw.png&amp;size=m" width="450px" height="615px" style="display: inline-block"></p>
<p style="">需要标记为NSFW的图片示例：</p>
<p style=""><em>图片包含NSFW内容，请谨慎观看。</em></p>
<p style=""><em>点击</em><a href="https://www.leonxie.cn/upload/image-cXsN.png" target="_blank" rel="nofollow"><em>这里</em></a><em>查看。</em></p>
<p style=""><span style="font-size: 15px; color: rgb(103, 103, 103)">Illustration by </span><a href="https://twitter.com/ixy" target="_blank" rel="noopener noreferrer"><u>Ixy</u></a></p>
<p style=""><strong>NSFW</strong> 指在工作场所或公共场合不适宜的所有内容；
 <br>
 <strong>R-18</strong> 指未成年人不适宜的<strong>性内容</strong>。</p>
<h4 style="" id="%E4%B8%BE%E4%BE%8B%E8%AF%B4%E6%98%8E-r-18%EF%BC%9A">举例说明 R-18：</h4>
<ul>
 <li>
  <p style="">全裸，或接近全裸的状态</p>
 </li>
 <li>
  <p style="">性器官裸露</p>
 </li>
 <li>
  <p style="">性行为或与性行为相关的描绘</p>
 </li>
</ul>
<h4 style="" id="nsfw-%E5%8C%85%E5%90%AB-r-18-%E5%86%85%E5%AE%B9%EF%BC%8C%E5%B9%B6%E9%A2%9D%E5%A4%96%E5%8C%85%E6%8B%AC%EF%BC%9A">NSFW 包含 R-18 内容，并额外包括：</h4>
<ul>
 <li>
  <p style="">大量肌肤裸露</p>
 </li>
 <li>
  <p style="">露出度高的服装，如内衣、泳衣、兔女郎装、胸部或臀部裸露的服装</p>
 </li>
 <li>
  <p style="">紧贴身体的服装，如校服泳衣、橡胶衣服，使身体轮廓或局部清晰可见</p>
 </li>
 <li>
  <p style="">性暗示或与性相关的描绘</p>
 </li>
 <li>
  <p style="">性感服装或姿势</p>
 </li>
 <li>
  <p style="">过多的汗水或皮肤光泽</p>
 </li>
 <li>
  <p style="">排尿或排泄（即使未描绘排泄物）</p>
 </li>
 <li>
  <p style="">极端的特定性癖好</p>
 </li>
 <li>
  <p style="">虽穿着衣物但颜色或形状透视的情况</p>
 </li>
 <li>
  <p style="">透视材质的衬衫、上衣、连衣裙等，使内衣或身体曲线可见</p>
 </li>
 <li>
  <p style="">被水或汗湿透、贴合身体的衣物，使肤色和身体曲线可见</p>
 </li>
 <li>
  <p style="">恐怖或血腥描绘</p>
  <ul>
   <li>
    <p style="">绞刑、水刑等极端折磨</p>
   </li>
   <li>
    <p style="">流血或肉片描绘</p>
   </li>
   <li>
    <p style="">过于真实的僵尸或解剖</p>
   </li>
   <li>
    <p style="">四肢被截断或身体残缺</p>
   </li>
  </ul>
 </li>
</ul>
<h4 style="" id="%E5%85%B3%E4%BA%8E%E5%85%BD%E5%A8%98%E6%88%96%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%A8%98%E7%9A%84-nsfw-%E5%88%A4%E5%AE%9A%EF%BC%9A">关于兽娘或机器人娘的 NSFW 判定：</h4>
<p style=""><strong>兽娘（Kemono）</strong></p>
<ul>
 <li>
  <p style="">被毛覆盖且不显性特征 → 安全</p>
 </li>
 <li>
  <p style="">毛发稀少，显得性感 → 需标 NSFW</p>
 </li>
</ul>
<p style=""><strong>机器人（Robot）</strong></p>
<ul>
 <li>
  <p style="">生体部件：性部位可见 → NSFW</p>
 </li>
 <li>
  <p style="">非生体部件：明确是机器人 → 安全</p>
 </li>
 <li>
  <p style="">如果衣物凸显乳头或阴部线条 → NSFW</p>
 </li>
</ul>
<blockquote>
 <p style="">这些仅为 NSFW 的一部分示例，性或极端内容的范围非常广泛。</p>
</blockquote>
<h3 style="" id="%E5%A6%82%E4%BD%95%E8%AE%BE%E7%BD%AE-nsfw"><strong>如何设置 NSFW</strong></h3>
<p style="">上传文件时，需要给文件设置 <strong>NSFW 标记</strong>。
 <br>
 详细方法请参考官方说明。</p>
<h4 style="" id="nsfw-%E6%A0%87%E8%AE%B0%E9%80%82%E7%94%A8%E4%BA%8E%E5%93%AA%E4%BA%9B%E5%86%85%E5%AE%B9%EF%BC%9F">NSFW 标记适用于哪些内容？</h4>
<ul>
 <li>
  <p style="">图片、视频、音乐及其他所有文件</p>
 </li>
 <li>
  <p style="">文字内容需使用 CW（隐藏内容）功能进行隐藏</p>
 </li>
</ul>
<h4 style="" id="%E5%A6%82%E6%9E%9C%E4%B8%8D%E8%AE%BE%E7%BD%AE-nsfw-%E4%BC%9A%E6%80%8E%E6%A0%B7%EF%BC%9F">如果不设置 NSFW 会怎样？</h4>
<ul>
 <li>
  <p style="">对于应标 NSFW 的内容，如果未设置标记，可能会被没收、静音或冻结账号</p>
 </li>
 <li>
  <p style="">如果未标 NSFW 的内容出现在公开时间线（本地或全球），可能会被删除</p>
 </li>
</ul>
<p style=""></p>]]></description><guid isPermaLink="false">/archives/misskey-nsfw-guide</guid><dc:creator>LeonXie</dc:creator><pubDate>Sun, 24 Aug 2025 09:22:44 GMT</pubDate></item><item><title><![CDATA[记一次折腾Arch Linux]]></title><link>https://leonxie.cn/archives/arch-linux-0816</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E8%AE%B0%E4%B8%80%E6%AC%A1%E6%8A%98%E8%85%BEArch%20Linux&amp;url=/archives/arch-linux-0816" width="1" height="1" alt="" style="opacity:0;">
<p style="">*已弃坑呜呜</p>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">由于身边的大佬全都用上了Arch linux，再加上以前还有一位朋友教过我安装流程，所以有了折腾的兴趣。本来打算在实体机安装，但是不太想破坏笔记本电脑已有的环境（去折腾硬盘分区什么的），也不想破坏家里云的环境（已经部署了一些正在使用的服务），所以最后使用了KVM虚拟机的方式。以下是一些折腾的收获！</p>
<p style=""><mark data-color="#fde047" style="background-color: #fde047; color: inherit">*注：本文不是安装教程，只记录折腾思路</mark></p>
<h2 style="" id="%E6%8A%98%E8%85%BE%E7%BB%93%E6%9E%9C">折腾结果</h2>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-aCkS.png&amp;size=m" width="100%" height="100%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ekZx.png&amp;size=m" width="100%" height="100%">
</figure>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-EMEf.png&amp;size=m" width="100%" height="100%">
</figure>
<h2 style="" id="%E5%9F%BA%E7%A1%80%E2%80%94%E2%80%94%E5%AE%89%E8%A3%85%E5%86%85%E6%A0%B8%26%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83">基础——安装内核&amp;桌面环境</h2>
<p style="">一开始我以为这一部分肯定是最难的，不过折腾下来并不算复杂，跟着网上的教程很轻松就完成了。</p>
<p style="">由于cockpit自带的VNC不支持复制粘贴命令，<s>而我人又比较懒，</s>所以就使用ssh连接到了虚拟机，完成接下来的安装。</p>
<p style="">问了AI，它告诉我官方的安装脚本不如手动安装灵活，所以我就直接进行了手动安装：</p>
<p style="">简略步骤就是</p>
<ol>
 <li>
  <p style="">准备安装介质，进入Live环境</p>
 </li>
 <li>
  <p style="">分区、格式化</p>
 </li>
 <li>
  <p style="">安装基本系统</p>
 </li>
 <li>
  <p style="">生成fstab文件</p>
 </li>
 <li>
  <p style="">Chroot到新系统</p>
 </li>
 <li>
  <p style="">配置新系统，配置用户，安装grub引导及常用软件包</p>
 </li>
 <li>
  <p style="">完成安装</p>
 </li>
</ol>
<p style="">成功进入了tty。</p>
<p style="">接下来，就是图形界面的安装了！使用pacman安装完kde、SDDM，就可以进入桌面了。</p>
<h2 style="" id="%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E6%96%B9%E6%A1%88">远程连接方案</h2>
<p style="">由于见到KDE图形界面特别兴奋，再加上VNC不如RDP有那么多功能，我打算找一个更好的方案。<s>这是一个非常错误的决定。</s></p>
<p style="">首先，我想到的是xRDP（实际上KDE已经有了KRDP，但我当时没注意到）。折腾过程遇到的问题是——虚拟机已经启动了一个KDE会话，xRDP连接完之后黑屏。本以为解决掉这个问题就能放心用了，结果一连接——卡的要死！鼠标按一下都要反应好久喵！最重要的是，调分辨率、缩放比例什么的对xRDP也没什么用 太难受了呜呜</p>
<p style="">只好求助AI，AI推荐了修改kvm配置，在5900端口开个SPICE协议，改一下虚拟机显卡配置，再用Remote viewer连接。连上了！然后开心地发现画面不仅是一帧一帧加载出来的，而且宿主机的散热风扇狂转，就像跑了一整天AI似的。很明显，这不是一个可行方案（又或许是我配置有问题，总之最后没搞成）。</p>
<p style="">接下来，我发现了NoMachine方案。只需要在arch虚拟机上开个NoMachine服务器，再用客户端连接就行了。但这个软件操作实在有点迷，最终并没有成功连接！一直报错！</p>
<p style="">是不是ssh隧道（由于我使用笔记本电脑连接，虚拟机在台式机上，NAT转发在无线网卡下不靠谱，所以只得用ssh隧道转发端口）影响的呢？我的想法是使用WirdGuard把两个电脑组进同一个网络环境里。不过配置不太熟练，最后不仅把电脑的网络连接切断了，AI给出的指令还误删了kvm的defalut网络！太可恶了喵！</p>
<p style="">最终经过一系列抢救，终于恢复了虚拟机的网络。到这里也没什么心情搞了，已经搭进去好久时间。我开始考虑简单一点的方案。尝试了Todesk，官方给的软件包版本太低了，不让我连接。然后又尝试向日葵，发现连接完了之后黑屏，原来需要改成X11会话而不是默认的Wayland，到这里我基本上彻底放弃了。</p>
<p style="">不过即使如此，我还是想到了X11转发。只需要在连接方那里安装一个X11服务器，就可以把图形化界面转发到连接方那里了！虽然还是很卡，我也懒得再做优化，这个方案也被弃用了。不过整了个活，做出了这样的奇观：</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fe0ace796eafde8206b04631136235fb2.png&amp;size=m" width="100%" height="100%">
</figure>
<p style="">archdows(大彻大悟)</p>
<p style="">最后，思来想去，或许还是VNC最适合我，毕竟像我这样不会折腾的菜鸡，搞一堆不成功还不如先用默认方案。</p>
<p style=""><s>没想到吧，内容最多的一章节全是失败经验。</s></p>
<h2 style="" id="%E6%A1%8C%E9%9D%A2%E5%A3%81%E7%BA%B8">桌面壁纸</h2>
<p style="">那就来美化KDE吧~</p>
<p style="">想找点二次元壁纸，简单搜索了一下，https://wallhaven.cc/是个不错的选择（不过国内无法直接访问），只要搜人物名字tag就可以出来一大堆。</p>
<h2 style="" id="%E4%B8%BB%E9%A2%98">主题</h2>
<p style="">用什么主题好呢？</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ebRq.png&amp;size=m" alt="image-ebRq.png" width="944px" height="198px">
</figure>
<p style="">那就catppuccin吧，不仅可以美化kde本身，还能美化一下Konsole！太好啦喵！</p>
<p style="">总之非常好用喵~</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fc0831314f68272430029116a301005ef.png&amp;size=m" width="944px" height="526px">
</figure>
<p style="">（图中的是fastfetch 可以用yay安装）</p>
<h2 style="" id="%E4%B8%AD%E6%96%87%E8%BE%93%E5%85%A5%E6%B3%95">中文输入法</h2>
<p style="">输入法的话...咱用了Fcitx 5</p>
<p style="">过程挺顺利的，就是踩了个小坑，Wayland需要一些额外配置，好在Fcitx会弹提示，告诉我该怎么做，不然估计又得折腾一整天（心虚）</p>
<figure style="align-items: start; display: flex; flex-direction: column" data-content-type="image">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fbbd55a075d31a25e2d79e380cebcce06-reco.png&amp;size=m" width="100%" height="100%">
</figure>
<h2 style="" id="%E9%AD%94%E6%B3%95%EF%BC%88%EF%BC%9F">魔法（？</h2>
<p style=""><s>由于魔法猫猫晓夜与猫粮之间隔了一层墙壁，所以使用了“魔⭐法⭐飞⭐跃”</s></p>
<p style="">由于神秘工具只提供deb、rpm包，我打算使用工具转换为arch的包，可惜出了大问题！Arch和Debian里面有些软件包的包名不同，导致安装工具报错依赖缺失，笨笨晓夜也不会修，于是只好转向别的方案——命令行魔法，其实也不赖啦，至少能用了。</p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">这里就是我的全部折腾过程了~回首整个折腾过程，除了在远程连接方案上浪费了太多时间，其实别的都还算轻松，在群友、AI和搜索引擎的帮助下，也没遇到什么难以解决的问题！谢谢你读到这里喵，拜拜~</p>]]></description><guid isPermaLink="false">/archives/arch-linux-0816</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fd170f6ea688b07f0bef24c4e1d4648d2.png&amp;size=m" type="image/jpeg" length="201533"/><category>笔记</category><pubDate>Sun, 17 Aug 2025 07:06:00 GMT</pubDate></item><item><title><![CDATA[【小记】封尘已久的回忆]]></title><link>https://leonxie.cn/archives/OI-and-me</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E3%80%90%E5%B0%8F%E8%AE%B0%E3%80%91%E5%B0%81%E5%B0%98%E5%B7%B2%E4%B9%85%E7%9A%84%E5%9B%9E%E5%BF%86&amp;url=/archives/OI-and-me" width="1" height="1" alt="" style="opacity:0;">
<p style=""><a href="https://www.luogu.com.cn/problem/P7911" target="_self" rel="">https://www.luogu.com.cn/problem/P7911</a></p>
<p style="">一个朋友发来了一道有趣的信奥题，戏虐的说“这题忽略了GFW的影响”。</p>
<p style="">我没有立即回复消息。莫名其妙的熟悉感，驱使我打开尘封一年的 DevC++—— 像翻开旧日记本，知识点早成模糊残影，连 map 用法都要求助 AI 。</p>
<p style=""><span style="font-size: 16px; color: rgba(0, 0, 0, 0.85)">好在题目不算难，不过字符串操作。当我把代码从IDE拷贝进洛谷，按下提交测评。欣喜地等待着编译、测评，那种感觉，那种回忆中的感觉，似乎顺着二进制漫了上来。</span></p>
<p style=""><span style="font-size: 16px; color: rgba(0, 0, 0, 0.85)">当页面蹦出 “你通过了此题！恭喜！”，快感瞬间炸开。</span></p>
<p style=""><span style="font-size: 16px; color: rgba(0, 0, 0, 0.85)">但，那种解出题目的快感，似乎早已无法触及了。</span></p>
<p style=""><span style="font-size: 16px; color: rgba(0, 0, 0, 0.85)">毕竟，最终还是放弃了信奥。</span></p>
<p style=""><span style="font-size: 16px; color: rgba(0, 0, 0, 0.85)">在2024的那个暑假，升入初中的暑假里。</span></p>
<p style=""><span style="font-size: 16px; color: rgba(0, 0, 0, 0.85)"><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-SXgN.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></span></p>
<p style=""><span style="font-size: 16px; color: rgba(0, 0, 0, 0.85)"><s>群友评价大赏：回忆杀好可怕</s></span></p>]]></description><guid isPermaLink="false">/archives/OI-and-me</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-SXgN.png&amp;size=m" type="image/jpeg" length="110460"/><pubDate>Sat, 16 Aug 2025 09:57:31 GMT</pubDate></item><item><title><![CDATA[互联网，是怎么连起来的？一文看懂AS的故事]]></title><link>https://leonxie.cn/archives/internet-explained-0812</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E4%BA%92%E8%81%94%E7%BD%91%EF%BC%8C%E6%98%AF%E6%80%8E%E4%B9%88%E8%BF%9E%E8%B5%B7%E6%9D%A5%E7%9A%84%EF%BC%9F%E4%B8%80%E6%96%87%E7%9C%8B%E6%87%82AS%E7%9A%84%E6%95%85%E4%BA%8B&amp;url=/archives/internet-explained-0812" width="1" height="1" alt="" style="opacity:0;">
<p style="">*头图来自pixiv~ <strong>130062431</strong></p>
<p style=""><s>欣乃ちゃん大好き💓！！！</s></p>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">诶，咱是第一次写这种抽象题材，写的不怎么好还请见谅啦，如果有什么纰漏，请一定要在评论区纠正我！谢谢！</p>
<p style="">最近想给一个朋友解释这些呢，正好对此有一些肤浅的了解，就用自己的语言转述下来了。</p>
<p style=""><strong>声明：为了方便大家理解，在这里所有ASN都用了简单的1、2、3这样的数字来代替，ip并非真实，剧情也均为虚构，所有提到的云服务商和真实世界真实存在的<mark data-color="#fde047" style="background-color: #fde047; color: inherit">没有任何联系</mark>，仅用于举例说明技术原理</strong></p>
<h2 style="" id="%E8%87%AA%E6%B2%BB%E5%9F%9F%E2%80%94%E2%80%94as">自治域——AS</h2>
<p style="">首先科普一下自治域的概念吧！<strong>AS</strong>就是一个自治系统，一个<strong>单独可管理的网络单元</strong>。什么意思呢，比如说阿里云的一个数据中心。<strong>ASN</strong>（<strong>自治系统号</strong>）就是自治系统的身份证号！可以理解为这个大网络区域的编号。</p>
<h2 style="" id="%E5%90%8C%E4%B8%80%E4%B8%AAas%E5%86%85%E7%9A%84%E9%80%9A%E8%AE%AF">同一个AS内的通讯</h2>
<p style="">假设最开始“互联网”只有阿里云（AS1）的30台机器。比如，阿里云AS1内部有一台服务器1.1.1.1，它搭建了网站aliyun.com，处于同一个机房的2.2.2.2想要访问aliyun.com这个网站，由于在同一个自治系统内，<span style="font-size: 16.002px">内部已经有完善的网络连接（光纤、交换机、路由器等）</span>，它们就可以“直接”通信。<span style="font-size: 16.002px">（当然不是物理直连啦，还是要经过内部路由器、交换机转发的！）</span></p>
<p style="">现在，腾讯也开了idc，叫腾讯云（AS2），也有30台机器。这时候，有人使用腾讯云的机器3.3.3.3搭建了一个qq.com。现在只有腾讯云的机器能访问这个网站，阿里云的就不行，2个网络就被隔开了。怎么办呢？</p>
<h2 style="" id="%E5%AF%B9%E7%AD%89%E6%8E%A5%E5%85%A5%E4%B8%8E%E4%B8%8D%E5%AF%B9%E7%AD%89%E6%8E%A5%E5%85%A5">对等接入与不对等接入</h2>
<p style="">为了保证用户体验，腾讯云和阿里云选择了<strong>对等接入（Peering）。</strong><span style="font-size: 16.002px">简单说，就是双方同意（通常不需要互相支付费用），在两个机房之间拉了专用的光纤互联。这样，处在阿里云网络里的客户就能访问腾讯云的服务了，反之亦然。世界连通了！</span></p>
<p style="">既然有对等接入，难道还有<strong>不对等接入</strong>？的确有。我们假设有一个AS3，只有10台机器。这家idc刚起步，没法购买那么多服务器。那凭什么我阿里云，腾讯云要和你拉光纤呢？答案是：给钱。AS3每年给阿里云一些对接费<strong>（Transit Fee） </strong><span style="font-size: 16.002px">阿里云就同意在两者之间拉一根光纤，提供</span><strong>转接服务 （Transit）</strong><span style="font-size: 16.002px">。然后，AS3的用户就可以访问阿里云网络里的资源了。</span></p>
<p style=""><span style="font-size: 16.002px">问题来了：</span>明明只接入了阿里云，为什么腾讯云的网站也能访问了呢？因为腾讯云和阿里云已经做了对等接入，所以路径就变成了这样：</p>
<blockquote>
 <p style="">AS3用户 (<code>7.8.9.10</code>) -&gt; AS3<strong>边界路由器</strong> (<code>8.9.10.11</code>) -&gt; 阿里云<strong>边界路由器</strong> (<code>3.4.5.6</code>) -&gt; (利用阿里云和腾讯云的对等连接) -&gt; 腾讯云<strong>边界路由器</strong> (<code>6.7.8.9</code>) -&gt; 腾讯云服务器 (<code>3.3.3.3</code> <code>qq.com</code>)</p>
</blockquote>
<p style=""><span style="font-size: 16.002px">数据包通过AS3交钱买来的阿里云“通道”，再借助阿里云和腾讯云的免费“互助通道”，最终到达了目的地！这就是 </span><strong>转接(Transit)</strong><span style="font-size: 16.002px"> 的精髓——<strong>花钱买通向整个互联网（或者至少是提供商网络所能到达的地方）的路</strong>。</span></p>
<h2 style="" id="%E7%8E%B0%E5%AE%9E%E4%B8%96%E7%95%8C%EF%BC%8C%E6%9B%B4%E5%A4%8D%E6%9D%82%E7%9A%84%E7%BD%91%E7%BB%9C...">现实世界，更复杂的网络...</h2>
<p style="">后来各个国家，各个idc都有各种自治域，就有各种复杂的转发。服务器可能因为线路不好，而绕很多路（专业一点叫<strong>网络路径迂回、路由绕行</strong>），比如从新加坡到美国到日本到香港再到你所在的中国。有时候晚高峰数据量多还有可能有<strong>丢包，延迟高</strong>等情况<s>（讨厌啊啊啊啊！）</s>，这时候就出现了优质的专用线路——<strong>CN2</strong>（精品ip承载网）。走CN2线路的服务器在晚高峰、大数据量时表现就会更加优异（虽说优质，可是接入CN2还是蛮贵的）。还有<strong>BGP</strong>（边界网关协议，互联网核心路由协议）——针对不同运营商做优化。<span style="font-size: 16.002px">举个例子：某国外服务器，中国电信用户访问它可能丢包严重、速度慢，但中国移动用户访问却异常顺畅。为什么？很可能该服务器运营商部署了 </span><strong>BGP多线接入</strong><span style="font-size: 16.002px">。它的边界路由器通过BGP协议，会告诉电信的网络：“电信用户请走这条A线路”，告诉移动的网络：“移动用户请走那条B线路”。如果那条给电信用的A线路质量很差或者干脆断了<s>（坏掉了~❤️）</s>，而给移动用的B线路还正常，就会出现 </span><strong>“残血服务器”（指线路优化不到位或部分线路故障的便宜服务器）</strong><span style="font-size: 16.002px">，电信用户访问不了，移动用户却能用的现象。</span></p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">唔...到这里，文章就结束了！希望这个简单的故事，能帮你了解更多关于互联网背后的复杂互联世界的知识！下次再遇到国外网站打开的很慢，除了网站本身的问题，<s>就可以放开骂运营商了（bushi）</s>或许又是运营商复杂的路由策略在"作妖"呢~感谢你读到这里！拜拜！</p>]]></description><guid isPermaLink="false">/archives/internet-explained-0812</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-pgWu.png&amp;size=m" type="image/jpeg" length="303168"/><category>笔记</category><pubDate>Wed, 13 Aug 2025 02:03:29 GMT</pubDate></item><item><title><![CDATA[AI模型提供商多？使用New API自建AI模型接口管理与分发系统！]]></title><link>https://leonxie.cn/archives/new-api</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=AI%E6%A8%A1%E5%9E%8B%E6%8F%90%E4%BE%9B%E5%95%86%E5%A4%9A%EF%BC%9F%E4%BD%BF%E7%94%A8New%20API%E8%87%AA%E5%BB%BAAI%E6%A8%A1%E5%9E%8B%E6%8E%A5%E5%8F%A3%E7%AE%A1%E7%90%86%E4%B8%8E%E5%88%86%E5%8F%91%E7%B3%BB%E7%BB%9F%EF%BC%81&amp;url=/archives/new-api" width="1" height="1" alt="" style="opacity:0;">
<p style=""><strong>*封面来自pixiv~ 129898707</strong></p>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">硅基流动、openrouter、火山引擎、gemini....面对众多AI模型提供商，每次调用都需要更改base url或者添加多个模型提供商，而且有些国外提供商甚至不能在国内直连。又或许你有负载均衡这种高级需求。那么有没有一种办法，能解决以上所有的问题呢？New api或许是一个很好的选择。你可能已经在某些地方见过new api的UI了，是的，很多聚合大模型api都是用的它，比如这个：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ODig.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">准备工作</h2>
<p style="">1、一台Linux服务器</p>
<p style=""><span style="font-size: 16px"><strong>不知道在哪里购买服务器？推荐</strong></span><a href="https://121108.xyz/" target="_blank" rel=""><strong>雨云</strong></a><span style="font-size: 16px"><strong>，价格可接受，操作方便，开箱即用。</strong></span></p>
<p style=""><span style="font-size: 16px"><strong><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-bVRb.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></strong></span></p>
<p style="">2、<span style="font-size: 16px">已有</span><strong>docker环境</strong><span style="font-size: 16px">&amp;</span><strong>mysql数据库</strong></p>
<p style=""><span style="font-size: 16px"><mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">（建议使用1panel管理服务器，本文将会使用此面板进行演示）</mark></span></p>
<p style="">3、域名（如果没有影响不大，但笔者认为买一个域名比记忆ip地址划算得多）</p>
<h2 style="" id="%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E5%BA%93">创建数据库</h2>
<p style=""><span style="font-size: 16px">创建一个数据库，填写并记录数据库名，数据库用户名，数据库密码，编码选择</span><strong>utf8mb4</strong><span style="font-size: 16px">，权限选择所有人(%)，单击确定保存。</span></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hMeF.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><span style="font-size: 16px">这里笔者选择的数据库名是newapi_db，用户名是newapi_db，密码是password。</span></p>
<h2 style="" id="%E9%83%A8%E7%BD%B2new-api">部署New api</h2>
<p style="">由于手动部署较繁琐，我们这次就使用官方文档最推荐的方法——Docker Compose来安装吧。</p>
<p style="">首先，创建一个compose文件</p>
<pre><code>nano docker-compose.yaml</code></pre>
<p style="">填入以下内容：</p>
<pre><code>services:
  new-api:
    image: calciumion/new-api:latest
    container_name: new-api
    restart: always
    command: --log-dir /app/logs
    ports:
      - "3000:3000" # 如果3000端口已被占用 修改第一个数字为其他端口号
    volumes:
      - ./data:/data
      - ./logs:/app/logs
    environment:
      - SQL_DSN=newapi_db:password@tcp(mysql:3306)/new-api  # 把 mysql改成你已有的mysql实例的容器名 第一个newapi_db改成你的数据库用户名 password改成你自己数据库的密码 最后一个newapi_db改为你的数据库名
      - REDIS_CONN_STRING=redis://redis
      - TZ=Asia/Shanghai
    depends_on:
      - redis
    networks:
      - 1panel-network # mysql所处在的docker网络，使用1panel的用户不要更改
    healthcheck:
      test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $$2}'"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis:
    image: redis:latest
    container_name: redis
    restart: always
    networks:
      - 1panel-network # mysql所处在的docker网络，使用1panel的用户不要更改

networks:
  1panel-network:  # mysql所处在的docker网络，使用1panel的用户不要更改
    external: true</code></pre>
<p style="">保存文件，我们可以开始启动服务了！</p>
<pre><code># 使用Docker Compose启动服务
sudo docker compose up -d</code></pre>
<p style="">Docker会开始拉取镜像</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-aKpQ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">等到出现<span color="#15803d" style="color: #15803d">Started</span>就说明启动成功，现在可以试试访问你的服务器ip:3000，可以看到系统初始化页面！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-gswx.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">如果访问不了，用sudo docker compose logs -f看看日志，大概率是你数据库信息没填对。</p>
<p style="">如果后续想停止new api<s>并跑路</s>，可以使用这个命令停止运行：</p>
<pre><code># 停止服务
sudo docker compose down</code></pre>
<h2 style="" id="%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D%EF%BC%88%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%EF%BC%89">绑定域名（反向代理）</h2>
<p style="">先别急着初始化——如果想实际使用，还是做一个反向代理，以后使用域名访问比较好</p>
<p style="">像这样反向代理你的new-api服务，如果刚才更改了new-api的服务端口，记得把代理地址后面的端口号修改一下：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-IQkM.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">将域名解析到服务器</p>
<p style=""><a href="https://www.leonxie.cn/upload/image-gIiD.png" rel="default" class="fancybox fancybox.image"><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=https%3A%2F%2Fwww.leonxie.cn%2Fupload%2Fimage-gIiD.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></a></p>
<p style="">我们可以申请一个ssl证书并在刚才的反向代理网站里配置https访问</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Aqzw.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-bRKq.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">访问做了反向代理的域名，应该可以看到和刚才一样的setup页面，那么接下来，我们就来做一下初始化吧！</p>
<h2 style="" id="%E5%88%9D%E5%A7%8B%E5%8C%96">初始化</h2>
<p style="">来到初始化页面，用户名/密码均可以随意设置，不过注意把使用模式改为自用模式。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-iTyH.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">点击初始化系统，几秒后就会跳转到主页</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hgRy.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">点击登录，输入你刚才选择的用户名和密码，就可以来到后台啦！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Vfnt.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E6%B7%BB%E5%8A%A0%E6%A8%A1%E5%9E%8B">添加模型</h2>
<p style="">点击渠道管理，点击添加渠道，我们此处以SiliconFlow为例，其他openai格式的提供商也是同理。</p>
<p style=""></p>
<p style="">名称可以随意填写，重点是密钥，填写从提供商那里获取的api key，比如硅基流动的可以在这里找到</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-IRgJ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">api地址需要从提供商的文档里找，比如硅基流动的是https://api.siliconflow.cn（结尾不要加/或者/v1）</p>
<p style="">接下来是模型配置，选择自定义模型名称，填入提供商提供的模型名称，比如deepseek-ai/DeepSeek-V3，然后单击填入。</p>
<p style="">可以看到新增成功，如果有其他模型也和这个同理，全部添加完成即可。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-pgHx.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">其他设置可以自行研究并修改，笔者在这里不做过多赘述，直接点击提交。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-lrMN.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">不错，接下来来到模型管理，我们点击添加模型。</p>
<p style="">填入模型名称（和刚才在添加渠道里填写的一样），然后点击提交！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-GSVl.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">我们来操练场试试效果吧！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-mcuB.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">可以发现，调用ai很成功~接下来，就可以像以前配置其他提供商的api那样在ai客户端里添加你搭建的new api为提供商了！与之前不同的是，你可以自豪地把API地址换成你自己的域名了~</p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">想必你已经成功部署new api了吧！恭喜！</p>
<p style="">接下来，有很多玩法等着你探索，愿你也能像笔者一样，感受到人工智能的乐趣。</p>
<p style=""><strong>如果这篇文章帮到了你或者遇到问题，欢迎在评论区留言，这是对我最大的鼓励与支持！谢谢！</strong></p>]]></description><guid isPermaLink="false">/archives/new-api</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-nOUy.png&amp;size=m" type="image/jpeg" length="174488"/><category>笔记</category><category>实用软件</category><pubDate>Sun, 10 Aug 2025 12:44:07 GMT</pubDate></item><item><title><![CDATA[想自建对象储存？MinIO可能是最简单的选择]]></title><link>https://leonxie.cn/archives/minio-oss</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E6%83%B3%E8%87%AA%E5%BB%BA%E5%AF%B9%E8%B1%A1%E5%82%A8%E5%AD%98%EF%BC%9FMinIO%E5%8F%AF%E8%83%BD%E6%98%AF%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E9%80%89%E6%8B%A9&amp;url=/archives/minio-oss" width="1" height="1" alt="" style="opacity:0;">
<p style="">*封面来自pixiv~<strong> 128930227</strong></p>
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">如果你想使用市面上已有的公有云服务（比如阿里云OSS、AWS S3）来储存文件，那么肯定会被高昂的费用劝退。而且如果需要备份相册或存放私有文件，数据隐私又会是另一个顾虑。那么，有无能<strong>完全自主掌控数据</strong>且<strong>低成本</strong>的方案呢？我们可以利用现有资源（有剩余储存空间的云服务器、家里云+内网穿透....），自己搭建一个兼容S3协议的对象储存。</p>
<h2 style="" id="%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">准备工作</h2>
<p style="">1、一台服务器（或任何Linux设备）</p>
<p style="">*笔者建议使用带宽较高的服务器，否则使用体验会很差</p>
<p style=""><s>2、手和脑子（废话）</s></p>
<p style=""><span style="color: rgb(60, 72, 88); font-size: 16px"><strong>不知道在哪里购买服务器？推荐</strong></span><a href="https://121108.xyz/" target="_blank" rel=""><strong>雨云</strong></a><span style="color: rgb(60, 72, 88); font-size: 16px"><strong>，价格可接受，操作方便，开箱即用。</strong></span></p>
<h2 style="" id="%E5%BC%80%E5%A7%8B%E9%83%A8%E7%BD%B2minio">开始部署MinIO</h2>
<p style="">MinIO有两种部署方式 Docker部署和二进制文件部署，我比较推荐第二种，因为我认为手动部署比较麻烦、环境比较复杂的项目才需要docker，且docker有时候并不是很稳定。</p>
<p style="">既然如此，我们就开始吧！</p>
<p style="">首先，创建一个目录并进入<mark>（不建议在/root、/var这种系统目录下创建文件夹 你后续很有可能会遇到各种权限问题！！！）</mark>，比如我这里是minio。</p>
<p style="">接下来，wget下载MinIO的二进制文件。</p>
<pre><code>wget https://dl.min.io/server/minio/release/linux-amd64/minio</code></pre>
<p style="">给文件添加运行权限：</p>
<pre><code>chmod +x minio</code></pre>
<p style="">创建一个专用用户<mark>（踩坑提示：不要直接使用root用户）</mark>：</p>
<pre><code>sudo useradd -r -s /bin/false minio-user
sudo chown -R minio-user:minio-user /minio</code></pre>
<p style="">创建一个数据文件夹，比如我这里是/minio/data：</p>
<pre><code>mkdir -p /minio/data
chmod -R 755 /minio/data    # 赋予读写权限
sudo chown -R minio-user:minio-user /minio/data # 确保属主正确</code></pre>
<p style="">尝试运行minio：</p>
<pre><code>./minio server /minio/data --address ":9000" --console-address ":9001"</code></pre>
<p style="">尝试访问你的服务器ip:9001，如果能访问成功，就说明minio能正常运行！不过先别急，要正式投入使用，还需要一些步骤。</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-xFhy.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<h2 style="" id="%E9%85%8D%E7%BD%AE%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1">配置系统服务</h2>
<p style="">使用刚才直接运行的方式，一旦ssh连接断开，程序就不会再运行，也无法做到开机自启。</p>
<p style="">于是，我们使用systemd来配置系统服务。</p>
<p style="">首先，创建一个文件来配置环境变量（<mark>注意修改成你自己需要的配置</mark>）：</p>
<pre><code>sudo tee /etc/default/minio &lt;&lt;EOF
MINIO_ROOT_USER="admin"
MINIO_ROOT_PASSWORD="yourpassword_114514"
MINIO_VOLUMES="/minio/data"
MINIO_OPTS="--address :9000 --console-address :9001"
EOF</code></pre>
<p style="">接下来，创建systemd服务文件：</p>
<pre><code>sudo tee /etc/systemd/system/minio.service &lt;&lt;EOF
[Unit]
Description=MinIO Object Storage
After=network-online.target
Wants=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/minio/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=on-failure
RestartSec=5s
LimitNOFILE=65536
TimeoutStopSec=infinity

[Install]
WantedBy=multi-user.target
EOF</code></pre>
<p style="">进入最后一步！让我们完成最后的设置：</p>
<pre><code># 重载 Systemd 配置
sudo systemctl daemon-reload

# 启动 MinIO
sudo systemctl start minio

# 设置开机自启
sudo systemctl enable minio

# 检查状态
sudo systemctl status minio</code></pre>
<p style="">OK，如果输出的是这样的内容，就说明成功了，恭喜！</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-FFpd.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">再试试访问MinIO控制台，输入你的用户名&amp;密码登录！</p>
<p style="">应该能看到一个License页面，划到最下面点击Acknowledge即可进入后台！</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-pGbv.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">可以点击+ Create Bucket 创建储存桶，不过我们先不着急，毕竟真正要拿来用，还得套个域名呀。</p>
<h2 style="" id="%E7%BB%91%E5%AE%9A%E5%9F%9F%E5%90%8D%EF%BC%88%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%EF%BC%89">绑定域名（反向代理）</h2>
<p style="">为了方便，这里只简单做一下api endpoint的反向代理，如果想让面板也能通过域名访问，可以按同样的方式配置。</p>
<p style=""><mark>笔者十分建议使用1panel、宝塔面板这样的运维工具来配置反向代理，但如果服务器资源有限，或者不想装运维面板，可以去搜搜如何手动配置Nginx反代。</mark></p>
<p style="">我们以1panel为例，其他面板也大同小异。</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Trzv.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">像这样反向代理你的api endpoint。随后添加一条dns解析。</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-gIiD.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">如果是cloudflare，国内使用不建议打开代理，毕竟对象储存讲究的是速度，开了代理就会慢很多。</p>
<p style="">不过，这里为了节省配置ssl证书的时间，就保持了打开的状态。</p>
<p style="">尝试ping你的域名，如果解析生效了，我们就来试一试将对象储存应用到实际场景里吧！</p>
<h2 style="" id="%E5%AE%9E%E8%B7%B5%EF%BC%9A%E5%B0%86minio%E6%8E%A5%E5%85%A5openlist">实践：将MInIO接入openlist</h2>
<p style="">首先，来到MinIO管理页面，创建一个储存桶。</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-HUMK.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">我们可以通过MinIO自带的object browser管理文件，为了方便后续验证是否接入成功，我们可以先传一个文件上去。</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-feTc.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-OlnH.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">不错，来看看openlist那边如何操作吧！</p>
<p style="">添加一个储存，驱动选择“对象储存”</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-viTQ.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">挂载路径可以随意填写，比如我的是MinIO。</p>
<p style="">我们重点需要关注的几个，分别是储存桶、endpoint、访问密钥 id、安全访问密钥、强制路径样式。</p>
<p style="">储存桶，顾名思义，我们填写刚才创建的储存桶的名称，比如我这里是openlist。</p>
<p style="">Endpoint，就是我们刚才做了反向代理的域名，我这里是https://api.nekoqwq.space。</p>
<p style="">访问密钥 id 就是你的MinIO用户名，安全访问密钥就是对应的密码。</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-lqrb.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">需要注意，必须打开强制路径样式开关，否则openlist会访问“储存桶名称.api.nekoqwq.space”，由于我们没有配置泛域名解析，openlist将无法获取到储存桶内的文件。</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-yfrJ.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">点击添加，回到主页看看吧！</p>
<p style="">刚才上传的文件显示在了这里~配置成功！</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-blfk.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<p style="">尝试点击下载吧。</p>
<p style="">可以看到，文件被顺利的下载下来了。到这里，openlist的接入已经完成，恭喜~</p>
<figure data-content-type="image" data-position="left" style="display: flex; flex-direction: column; align-items: start">
 <img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-lJFB.png&amp;size=m" width="100%" height="100%" data-position="left">
</figure>
<h2 style="" id="%E5%B0%BE%E5%A3%B0">尾声</h2>
<p style="">到这里，你的自建对象储存已经搭建完成！恭喜！</p>
<p style="text-align: left"><strong>如果这篇文章帮到了你或者遇到问题，欢迎在评论区留言，这是对我最大的鼓励与支持！谢谢！</strong></p>]]></description><guid isPermaLink="false">/archives/minio-oss</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fac57525d8331c72e18414a7dcdf32016.png&amp;size=m" type="image/jpeg" length="62629"/><category>笔记</category><pubDate>Wed, 6 Aug 2025 04:02:44 GMT</pubDate></item><item><title><![CDATA[欢迎加入QQ群～]]></title><link>https://leonxie.cn/archives/qq-group</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E6%AC%A2%E8%BF%8E%E5%8A%A0%E5%85%A5QQ%E7%BE%A4%EF%BD%9E&amp;url=/archives/qq-group" width="1" height="1" alt="" style="opacity:0;">
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-hWNt.jpeg&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>]]></description><guid isPermaLink="false">/archives/qq-group</guid><dc:creator>LeonXie</dc:creator><pubDate>Sat, 2 Aug 2025 14:59:24 GMT</pubDate></item><item><title><![CDATA[使用Apache Guacamole，让浏览器也能rdp远程桌面连接]]></title><link>https://leonxie.cn/archives/guacamole-webrdp</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E4%BD%BF%E7%94%A8Apache%20Guacamole%EF%BC%8C%E8%AE%A9%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B9%9F%E8%83%BDrdp%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E8%BF%9E%E6%8E%A5&amp;url=/archives/guacamole-webrdp" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">众所<s>不</s>周知，我们连接windows server服务器或者处于同一内网里的其他电脑时，一般都会使用mstsc客户端，手机/移动端则是windows app。然而有时也会遇到不方便安装客户端，或是想要随时随地管理服务器的情况，这时候Apache Guacamole就是一个极好的选择。</p>
<h2 style="" id="%E8%A7%82%E5%89%8D%E5%87%86%E5%A4%87">观前准备</h2>
<p style="">1、一台<strong>大带宽</strong>服务器</p>
<p style="">2、已安装<strong>docker环境</strong>和<strong>mysql数据库</strong></p>
<p style=""><mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">（建议使用1panel管理服务器，本文将会使用此面板进行演示）</mark></p>
<p style="">3、科学上网环境</p>
<p style=""><strong>*如果没有，但需要解决Github在国内连接缓慢的问题，可以尝试使用</strong><a href="https://ghproxy.link/" target="_blank"><strong>Github Proxy</strong></a></p>
<p style="">4、手和脑子</p>
<p style=""><s>5、编不下去了（）</s></p>
<p style=""><span style="font-size: 16px; color: rgb(60, 72, 88)">不知道在哪里购买服务器？推荐</span><a href="https://121108.xyz/" target="_blank" rel="">雨云</a><span style="font-size: 16px; color: rgb(60, 72, 88)">，价格可接受，操作方便，开箱即用。<strong>不论地区选择国内还是国外，一定要注意带宽！！！笔者测试了实际带宽5M的服务器，rdp远程连接时很容易卡住！请一定注意，否则后续用起来会很难受！</strong></span></p>
<h2 style="" id="%E5%88%9B%E5%BB%BA%E5%B9%B6%E5%88%9D%E5%A7%8B%E5%8C%96mysql%E6%95%B0%E6%8D%AE%E5%BA%93">创建并初始化mysql数据库</h2>
<p style="">创建一个数据库，填写并记录数据库名，数据库用户名，数据库密码，编码选择<strong>utf8mb4</strong>，权限选择所有人(%)，单击确定保存。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-GQUP.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">这里笔者选择的数据库名是guacamole_db，用户名是guacamole，密码是GDWzKjaiQHmnx2iA。</p>
<p style="">接下来，我们测试一下mysql数据库是否正常。</p>
<pre><code>mysql -h 127.0.0.1 -P 3306 -u root -p</code></pre>
<p style="">如果提示"Enter Password:"，就输入你的mysql数据库root密码（1panel用户可在下图位置找到）：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-LoeK.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">如果没有提示，出现找不到mysql命令之类的报错，则说明mysql-client没有安装，执行以下命令安装</p>
<pre><code># （Ubuntu/Debian）
sudo apt install mysql-client-core-8.0 </code></pre>
<p style="">安装完成后再次执行刚才的命令即可。</p>
<p style="">来到这个界面则说明连接成功！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-FYmA.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">既然数据库没有问题，我们就可以输入<strong>EXIT;</strong>退出mysql客户端了。</p>
<p style="">在安装Guacamole之前，我们还需要初始化一下数据库，否则后续Guacamole会出现报错。</p>
<p style="">通过<a href="https://github.com/apache/guacamole-client/tree/main/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-mysql/schema" target="_blank" rel="">Github仓库</a>下载“001-create-schema.sql”和“002-create-admin-user.sql”并上传到服务器。</p>
<p style="">接下来，执行这两条命令将初始化所需表单添加到数据库中。</p>
<p style=""><mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">*注意将“guacamole”替换为你自己的用户名，后续如果提示"Enter Password"输入</mark><strong><mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">你刚才选择的密码</mark></strong><mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">而</mark><strong><mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">不是ROOT密码</mark></strong><mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">！</mark></p>
<pre><code>mysql -h 127.0.0.1 -P 3306 -u guacamole -p guacamole_db &lt; 001-create-schema.sql
mysql -h 127.0.0.1 -P 3306 -u guacamole -p guacamole_db &lt; 002-create-admin-user.sql</code></pre>
<p style="">接下来，通过刚才检测数据库的命令重新进入mysql命令行管理界面。</p>
<p style="">执行以下两条命令（<mark data-color="#fef08a" style="background-color: #fef08a; color: inherit">注意将“guacamole_db”替换为你自己的数据库名</mark>）</p>
<pre><code>USE guacamole_db;
SHOW TABLES;</code></pre>
<p style="">显示以下内容则代表初始化成功，恭喜你！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-BbTa.png&amp;size=m" width="317px" height="413px" style="display: inline-block"></p>
<h2 style="" id="%E9%83%A8%E7%BD%B2guacamole">部署guacamole</h2>
<p style="">我们使用docker-compose进行安装。</p>
<p style="">输入</p>
<pre><code>nano docker-compose.yml</code></pre>
<p style="">创建一个docker-compose文件并编辑。</p>
<p style="">输入以下内容，注意按注释要求修改部分内容：</p>
<pre><code>services:
  guacamole:
    image: guacamole/guacamole
    container_name: guacamole
    restart: always
    ports:
      - "8080:8080" # guacamole最终暴露在公网的端口，如要修改，请更改第一个数字
    depends_on:
      - guacd
    environment:
      GUACD_HOSTNAME: guacd
      MYSQL_HOSTNAME: mysql # 你的mysql数据库地址，如果你的mysql不是通过docker部署，应当改为你的宿主机ip（可通过ip addr | grep inet获得）
      MYSQL_DATABASE: guacamole_db # 你刚才记录的的数据库名
      MYSQL_USER: guacamole # 你刚才记录的的数据库用户名
      MYSQL_PASSWORD: GDWzKjaiQHmnx2iA # 你刚才记录的的数据库密码
    volumes:
      - ./guac-config:/etc/guacamole
    networks:
      - 1panel-network # mysql所处在的docker网络，使用1panel的用户不要更改

  guacd:
    image: guacamole/guacd
    container_name: guacd
    restart: always
    networks:
      - 1panel-network # mysql所处在的docker网络，使用1panel的用户不要更改

networks:
  1panel-network: # mysql所处在的docker网络，使用1panel的用户不要更改
    external: true</code></pre>
<p style="">按下Ctrl+O保存，再按Ctrl+X退出。</p>
<p style="">执行<strong>sudo docker compose up -d</strong>开始拉取镜像。</p>
<p style="">后续可通过<strong>sudo docker compose down</strong>停止服务，其他命令笔者不再整理，有需要可以自行查找。</p>
<p style="">恭喜，guacamole部署成功！</p>
<h2 style="" id="%E9%85%8D%E7%BD%AE%E8%B4%A6%E6%88%B7">配置账户</h2>
<p style="">在浏览器输入"http://服务器ip:端口号/guacamole"即可看到登录页。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-yeqz.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">默认用户名、密码为guacadmin、guacadmin。</p>
<p style="">来到首页，点击设置：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rdCs.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">如果想修改用户名或密码，可以前往用户选项卡，创建一个新账户，只需配置以下两个项目，其它全部留空即可：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-DztB.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-jhSJ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">点击保存，退出guacadmin账户并登录你刚才创建的账户，再次回到用户选项卡，删除guacadmin账户即可。</p>
<h2 style="" id="%E9%85%8D%E7%BD%AE%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5">配置远程连接</h2>
<p style="">来到"连接"，选择新建连接：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-rBOp.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">我们修改这几处：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ZGPh.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-WLAI.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">剩余部分按自己需求填写，笔者不再过多赘述。</p>
<p style="">单击保存，返回首页连接你的远程桌面即可！</p>
<p style="">效果展示：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-qKTQ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style=""><span style="font-size: 16px; color: rgb(60, 72, 88)">至此，你应该已经跟着我一起，成功搭建guacamole了，以后可以通过网页连接你的云电脑/服务器/个人电脑了~</span></p>
<p style="">笔者尝试了使用guacamole连接到服务器并游玩视觉小说，效果不是特别好（当然这也因带宽而异）。但笔者尝试发现可以达到日用需求，所以请放心！</p>
<p style="">最后，或许你会有通过反向代理guacamole实现域名访问的想法，不过笔者这里并不推荐这种做法，因为经尝试一层反向代理会降低rdp流畅度。</p>
<p style="">感谢你读到这里！</p>
<p style=""><strong>如果这篇文章帮到了你或者遇到问题，欢迎在评论区留言，这是对我最大的鼓励与支持，谢谢！</strong></p>]]></description><guid isPermaLink="false">/archives/guacamole-webrdp</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fguacamole_login_page.jpg&amp;size=m" type="image/jpeg" length="9287"/><category>实用软件</category><pubDate>Sun, 27 Jul 2025 15:07:32 GMT</pubDate></item><item><title><![CDATA[【笔记】使用docker容器部署一个phira多人游戏服务器]]></title><link>https://leonxie.cn/archives/phira-mp-docker</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E3%80%90%E7%AC%94%E8%AE%B0%E3%80%91%E4%BD%BF%E7%94%A8docker%E5%AE%B9%E5%99%A8%E9%83%A8%E7%BD%B2%E4%B8%80%E4%B8%AAphira%E5%A4%9A%E4%BA%BA%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8&amp;url=/archives/phira-mp-docker" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">玩过Phira的小伙伴们都知道，phira提供的多人游戏服务器mp2.phira.cn:12345并不稳定，所以我们可能会想到自己部署。这个方案确实可行，但从源代码编译phira-mp的方式门槛实在有点高。经过查找，我找到了一种更适合小白的部署方式——使用现成的docker镜像。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-GCGv.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">准备工作</h2>
<p style="">1、一台服务器，推荐2h2g及以上</p>
<p style=""><span style="font-size: 16px; color: rgb(60, 72, 88)">不知道在哪里购买服务器？推荐</span><a href="https://121108.xyz/" target="_blank" rel="">雨云</a><span style="font-size: 16px; color: rgb(60, 72, 88)">，价格相对可接受，有易于管理的后台系统。</span></p>
<p style=""><span style="font-size: 16px; color: rgb(60, 72, 88)">2、Docker环境（前往</span><a href="https://121108.xyz/" target="_blank" rel="">菜鸟教程</a><span style="font-size: 16px; color: rgb(60, 72, 88)">学习安装及</span>镜像加速配置<span style="font-size: 16px; color: rgb(60, 72, 88)">方法）</span></p>
<p style=""><span style="font-size: 16px; color: rgb(60, 72, 88)">3、学会服务器基本操作（</span><a href="https://www.leonxie.cn/archives/website-building-guide#%E8%BF%9E%E6%8E%A5%E6%9C%8D%E5%8A%A1%E5%99%A8" target="_blank" rel=""><span style="font-size: 16px; color: rgb(37, 99, 235)">我不会？</span></a><span style="font-size: 16px; color: rgb(60, 72, 88)">）</span></p>
<h2 style="" id="%E5%88%9B%E5%BB%BAdocker-compose%E6%96%87%E4%BB%B6">创建docker-compose文件</h2>
<p style="">在服务器上新建一个目录phira-mp。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-cQle.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">在本地创建一个docker-compose.yaml文件，并填入以下内容：</p>
<pre><code>services:
  phira_mp:
    container_name: phira_mp
    image: ghcr.io/docker-collection/phira-mp:latest
    ports:
      - "8080:12346"
    restart: unless-stopped</code></pre>
<p style="">注意 - "8080:12346"这一行，这是docker的端口映射，将8080改为你需要对外提供服务的端口。</p>
<p style="">进入phira-mp目录，上传docker-compose.yaml文件</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-DgMm.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1">启动服务</h2>
<pre><code>cd phira-mp</code></pre>
<p style="">来到控制台，进入phira-mp目录</p>
<pre><code>docker compose up -d</code></pre>
<p style="">拉取镜像</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-aTas.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">看到<span fontsize="" color="rgb(22, 101, 52)" style="color: rgb(22, 101, 52)">Started</span>说明拉取成功</p>
<p style="">接下来整理几个常用docker compose命令，方便大家使用</p>
<div style="overflow-x: auto; overflow-y: hidden;">
 <table style="width: 388px">
  <colgroup>
   <col style="width: 129px">
   <col style="width: 259px">
  </colgroup>
  <tbody>
   <tr style="box-sizing: border-box; background-color: rgb(255, 255, 255); border-top: 0.8px solid rgb(226, 226, 227); transition: background-color 0.5s;">
    <th colspan="1" rowspan="1" colwidth="129" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; text-align: left; font-size: 14px; font-weight: 600; color: rgb(103, 103, 108); background-color: rgb(246, 246, 247);">
     <p style=""><strong>操作</strong></p>
    </th>
    <th colspan="1" rowspan="1" colwidth="259" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; text-align: left; font-size: 14px; font-weight: 600; color: rgb(103, 103, 108); background-color: rgb(246, 246, 247);">
     <p style=""><strong>命令</strong></p>
    </th>
   </tr>
   <tr style="box-sizing: border-box; background-color: rgb(255, 255, 255); border-top: 0.8px solid rgb(226, 226, 227); transition: background-color 0.5s;">
    <td colspan="1" rowspan="1" colwidth="129" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; font-size: 14px;">
     <p style="">▶️ 启动服务</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="259" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; font-size: 14px;">
     <p style=""><code>docker compose up -d</code></p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; background-color: rgb(246, 246, 247); border-top: 0.8px solid rgb(226, 226, 227); transition: background-color 0.5s;">
    <td colspan="1" rowspan="1" colwidth="129" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; font-size: 14px;">
     <p style="">⏹️ 停止服务</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="259" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; font-size: 14px;">
     <p style=""><code>docker compose down</code></p>
    </td>
   </tr>
   <tr style="box-sizing: border-box; background-color: rgb(255, 255, 255); border-top: 0.8px solid rgb(226, 226, 227); transition: background-color 0.5s;">
    <td colspan="1" rowspan="1" colwidth="129" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; font-size: 14px;">
     <p style=""><strong>⚙️ </strong>查看日志</p>
    </td>
    <td colspan="1" rowspan="1" colwidth="259" style="box-sizing: border-box; border-color: rgb(226, 226, 227); border-style: solid; border-width: 0.8px; border-image: none 100% / 1 / 0 stretch; padding: 8px 16px; font-size: 14px;">
     <p style=""><code>docker compose logs -f</code></p>
    </td>
   </tr>
  </tbody>
 </table>
</div>
<h2 style="" id="%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AE%BE%E7%BD%AE">客户端设置</h2>
<p style="">来到phira设置，打开多人游戏开关，并将多人游戏服务器中的内容改为你的服务器ip:服务端口，例如：152.32.132.78:11451，如果你有域名，可以使用域名，例如2085.fun:11451</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fb100bb7c7fd585cfb79ad6f8d7b78e95_720.png&amp;size=m" alt="b100bb7c7fd585cfb79ad6f8d7b78e95_720.png" width="100%" height="100%" style="display: inline-block"></p>
<p style="">点击悬浮的多人游戏图标 单击连接即可创建房间并开始游玩！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F0ba82a8a21c33b8ea6efd71b5711fbb2_720.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">现在，你可以尽情与朋友游玩了！</p>
<p style="">这里有一个笔者搭建完成phira服务器，可以使用或参考其为自己的phira服务器添加介绍页（涉及网站部署）：<a href="https://2085.fun" target="_blank" rel="">https://2085.fun</a>（有可能跑路，访问不了就是趋势了）</p>
<p style="">感谢你能读到这里，如果有任何问题欢迎评论区留言，我们下次见~</p>]]></description><guid isPermaLink="false">/archives/phira-mp-docker</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2F2085.png&amp;size=m" type="image/jpeg" length="280027"/><category>笔记</category><category>实用软件</category><pubDate>Wed, 9 Jul 2025 10:40:42 GMT</pubDate></item><item><title><![CDATA[Cloudreve+Frp，搭建一个自己的网盘]]></title><link>https://leonxie.cn/archives/cloudreve-pan</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=Cloudreve%2BFrp%EF%BC%8C%E6%90%AD%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%87%AA%E5%B7%B1%E7%9A%84%E7%BD%91%E7%9B%98&amp;url=/archives/cloudreve-pan" width="1" height="1" alt="" style="opacity:0;">
<h2 style="" id="%E5%89%8D%E8%A8%80">前言</h2>
<p style="">你是否有在公网管理文件的需求，但又不喜欢市面上已有的云盘？本期就来教大家使用一台Windows个人电脑+一台有公网ip的服务器，搭建一个属于自己的网盘。</p>
<p style=""><span fontsize="" color="rgb(239, 68, 68)" style="color: rgb(239, 68, 68)">观前提示：服务器的价格在25￥/月左右，域名的价格有高有低，可以按本教程内的方案注册一个5￥/年的纯数字xyz域名。如果不想花一分钱，也可以选择二级域名+免费frp，请善用</span><a href="https://cn.bing.com" target="_blank" rel=""><span fontsize="" color="rgb(59, 130, 246)" style="color: rgb(59, 130, 246)">搜索引擎</span></a><span fontsize="" color="rgb(239, 68, 68)" style="color: rgb(239, 68, 68)">，本文不做推荐。但为了稳定性我还是建议自己搭建。</span></p>
<h2 style="" id="%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">准备工作</h2>
<p style="">1、Windows电脑</p>
<p style="">2、一台服务器</p>
<p style="">3、Cloudreve（<a href="https://github.com/cloudreve/Cloudreve/releases" target="_blank" rel="">Github Releases</a>）</p>
<p style="">4、frp（<a href="https://github.com/fatedier/frp/releases" target="_blank" rel="">Github Releases</a>）</p>
<p style=""><strong>*Github在国内有连接缓慢的问题，可以尝试使用</strong><a href="https://ghproxy.link/" target="_blank"><strong>Github Proxy</strong></a></p>
<p style=""><strong>注意：Cloudreve请下载带有windows_amd64字样的文件，frp请同时下载windows_amd64和Linux_amd64</strong></p>
<p style="">不知道在哪里购买服务器？推荐<a href="https://121108.xyz" target="_blank" rel="">雨云</a>，价格相对可接受，有易于管理的后台系统。推荐配置：KVM入门版，推荐系统：Debian 12</p>
<p style="">购买时注意服务器带宽，选择大带宽地区，不然传文件会很慢。</p>
<p style=""><strong>Tips：建议购买美国/香港服务器，避免网站备案造成的不便</strong></p>
<h2 style="" id="%E7%BA%AF%E6%95%B0%E5%AD%97xyz%E5%9F%9F%E5%90%8D%E8%B4%AD%E4%B9%B0">纯数字xyz域名购买</h2>
<p style="">如果你已经有一个域名，请跳过这一部分。</p>
<p style="">如果你想要的域名不是纯数字，建议在雨云注册。</p>
<p style="">打开<a href="https://www.spaceship.com/" target="_self" rel="">https://www.spaceship.com/</a>，输入一个纯数字xyz域名，点击Search。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-PDuG.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">如果没有被注册，点击Add to Cart：<strong><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-LWLu.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></strong></p>
<p style="">然后点击View your cart，点击Checkout，按提示注册一个账号。</p>
<p style="">添加一个支付方式，可以直接选择支付宝，添加完成后点击Pay Now即可。</p>
<p style="text-align: center"><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ptix.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">购买完成后，就可以在Domain Manager里看到你的域名了：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-XMrq.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来，可以将域名添加（修改nameserver）到CloudFlare方便管理，具体可以在cloudflare.com查看。</p>
<h2 style="" id="%E5%90%AF%E5%8A%A8cloudreve">启动Cloudreve</h2>
<p style="">找到一个拥有足够剩余空间的分区，解压cloudreve_4.0.0_windows_amd64.zip（或者你下载到的文件名），得到这些文件：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-ynrE.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">删除无用文件，保留cloudreve.exe。</p>
<p style="">打开记事本，输入以下内容：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-xAic.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<pre><code>@echo off
start cloudreve.exe</code></pre>
<p style="">另存为start.bat，注意修改编码和保存类型。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-WVrN.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">接下来，Win+R打开运行窗口，输入<span fontsize="" color="rgb(25, 27, 31)" style="color: rgb(25, 27, 31)">shell:startup打开"启动"文件夹。</span></p>
<p style=""><span fontsize="" color="rgb(25, 27, 31)" style="color: rgb(25, 27, 31)">将start.bat的快捷方式复制到该目录，以后电脑每次启动都会自动运行cloudreve。</span></p>
<p style=""><span fontsize="" color="rgb(25, 27, 31)" style="color: rgb(25, 27, 31)"><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-khbv.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></span></p>
<p style="">接下来，双击start.bat，启动Cloudreve。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-xxgF.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">现在可以输入127.0.0.1:5212打开cloudreve，不过先不要着急注册或登录，我们来配置frp内网穿透。</p>
<h2 style="" id="%E8%BF%9E%E6%8E%A5%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8">连接到服务器</h2>
<p style="">本次教程，我们使用<a href="https://github.com/nxshell/nxshell" target="_blank">NxShell</a>进行演示。</p>
<p style=""><strong>*Github在国内有连接缓慢的问题，可以尝试使用</strong><a href="https://ghproxy.link/" target="_blank"><strong>Github Proxy</strong></a></p>
<p style="">安装并打开软件后，我们点击左上角的加号，会来到这个页面：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Rvat.png&amp;size=m" width="799px" height="460px" style="display: inline-block"></p>
<p style="">按照下图配置：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-UFby.png&amp;size=m" width="908px" height="Infinitypx" style="display: inline-block"></p>
<p style="">当你来到这个页面时，说明你已经成功连接了服务器，恭喜你！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-PfbC.png&amp;size=m" width="797px" height="459px" style="display: inline-block"></p>
<p style=""><strong>*小贴士：NxShell中复制的快捷键是Alt+C，粘贴的快捷键是Alt+V</strong></p>
<h2 style="" id="%E9%85%8D%E7%BD%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AFfrp">配置服务器端frp</h2>
<p style="">解压frp_0.62.1_linux_amd64.tar.gz（或者你下载到的文件名），将frps、frps.toml上传到服务器。</p>
<p style="">修改frps文件权限为777</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-JZWE.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">修改frps.toml，改为以下内容：</p>
<pre><code>[common]
bind_port = 7000 #服务端口
allow_ports = 80 #转发后的端口，内穿成功后通过此端口进行访问</code></pre>
<p style="">回到ssh连接页。</p>
<p style="">为避免ssh连接断开后frps程序退出，可以使用screen命令。</p>
<p style="">安装：</p>
<pre><code>sudo apt install screen  # Debian/Ubuntu
sudo yum install screen  # CentOS</code></pre>
<p style="">创建新会话：</p>
<pre><code>screen -S session_name  # 例如 screen -S myapp</code></pre>
<p style="">执行以下命令启动frps：</p>
<pre><code>./frps -c frps.toml</code></pre>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-srOz.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">配置完成！</p>
<p style="">断开ssh连接后，如果还想查看日志，执行以下命令：</p>
<pre><code>screen -r session_name  # 如 screen -r myapp</code></pre>
<h2 style="" id="%E9%85%8D%E7%BD%AE%E6%9C%AC%E6%9C%BAfrp">配置本机frp</h2>
<p style="">解压frp_0.62.1_windows_amd64.zip（或者你下载到的文件名），仅保留frpc.exe、frpc.toml。</p>
<p style="">修改frpc.toml，注意把serverAddr换成你自己服务器的ip。</p>
<pre><code>serverAddr = "98.142.241.211" #服务器公网IP
serverPort = 7000 #服务端口

[[proxies]]
name = "cloudreve"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5212 #本地要穿透的端口
remotePort = 80 #远程端口（在公网访问的端口）
</code></pre>
<p style="">依照前文步骤创建start-frp.bat，内容为：</p>
<pre><code>@echo off
frpc.exe -c frpc.toml</code></pre>
<p style="">按Cloudreve方式配置开机自启动。</p>
<p style="">启动start-frp.bat，出现这样的文字说明连接成功！</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-EcYs.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-MHPH.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">尝试访问http://98.142.241.211/（你的服务器ip），成功连接。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-fuxG.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<h2 style="" id="%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D">配置域名</h2>
<p style="">将服务器ip解析到你的域名，并打开代理，避免自己配置ssl证书。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-CdwY.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">访问cloudreve.nekoqwq.space（改为你自己的域名），如果出现和上个章节一样的页面，就说明配置成功！</p>
<h2 style="" id="%E9%85%8D%E7%BD%AEcloudreve">配置Cloudreve</h2>
<p style="">到这里，你的自建网盘已经搭建完成，恭喜！！！</p>
<p style="">接下来，只需要注册账号，即可登录网站后台&amp;上传/下载文件。</p>
<p style=""><strong>Tips：Cloudreve首次启动注册的第一个账号自动设为管理员。</strong></p>
<p style="">注册完成后登录，在这里就可以看到管理面板了。</p>
<p style="">由于Cloudreve图形化界面描述已经很详细，笔者在这里就不详细说明每个配置项了，可以自己稍做研究。</p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">到这里，你的私人网盘已经搭建完成！</p>
<p style=""><span style="font-size: 16px; color: rgb(60, 72, 88)">给自己鼓个掌吧，恭喜！</span></p>
<p style="">在最后，笔者想提醒各位，私人网盘建议关闭注册，毕竟文件是存在自己电脑上的，谁也不想什么奇怪的东西尽到自己的硬盘吧。</p>
<p style=""><strong>如果这篇文章帮到了你或者遇到问题，欢迎在评论区留言，这是对我最大的鼓励与支持！谢谢！</strong></p>]]></description><guid isPermaLink="false">/archives/cloudreve-pan</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Ffireworks-1.jpg&amp;size=m" type="image/jpeg" length="63371"/><category>笔记</category><category>实用软件</category><pubDate>Mon, 23 Jun 2025 10:49:46 GMT</pubDate></item><item><title><![CDATA[自用Alist样式]]></title><link>https://leonxie.cn/archives/alist-css</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E8%87%AA%E7%94%A8Alist%E6%A0%B7%E5%BC%8F&amp;url=/archives/alist-css" width="1" height="1" alt="" style="opacity:0;">
<p style="">CSS样式（可以单独写个css文件，也可以使用&lt;style&gt;标签，放入自定义头部）</p>
<pre><code>/* 修改全局字体 */
* {
    font-family: 'LXGW Wenkai Screen', 'LXGW Wenkai', sans-serif;
}
/* 浅色模式大背景 */
.hope-ui-light {
    background-image: url('https://www.leonxie.cn/upload/nekohashizuku.png');
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
    background-attachment: fixed;
}
/* 深色模式大背景 */
.hope-ui-dark {
    background-image: url('https://www.leonxie.cn/upload/fireworks-1.jpg');
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
    background-attachment: fixed;
}
/* 浅色模式文件列表背景 */
.hope-c-PJLV-igScBhH-css {
    background-color: #fff0 !important;
    backdrop-filter: blur(10px);
}
/* 深色模式文件列表背景 */
.hope-c-PJLV-iigjoxS-css {
    background-color: #fff0 !important;
    backdrop-filter: blur(10px);
}
/* 浅色导航栏背景 */
.hope-ui-light .body&gt;.nav {
    background-color: #fff0;
}
/* 深色导航栏背景 */
.hope-ui-dark .body&gt;.nav {
    background-color: #fff0;
}
/* 头部背景 */
#root&gt;.header {
    background-color: #fff0;
    backdrop-filter: blur(5px);
}
/* 浅色模式下侧边栏的背景 */
.hope-ui-light .hope-c-PJLV-ieGWMbI-css {
    background-color: #fff0 !important;
    backdrop-filter: blur(10px);
}
/* 深色模式下侧边栏的背景 */
.hope-ui-dark .hope-c-PJLV-ieGWMbI-css {
    background-color: #fff0 !important;
    backdrop-filter: blur(10px);
}
/* 更多选项菜单（右下角省略号） */
.hope-c-PJLV-ijgzmFG-css {
    background-color: #fff0 !important;
    backdrop-filter: blur(10px);
}
/* 隐藏本地设置菜单中Aria2 RPC链接和密钥选项 */
div.hope-stack.hope-c-dhzjXW.hope-c-PJLV.hope-c-PJLV-ikjnSaO-css&gt;div.hope-form-control.hope-c-dXIoOt.hope-c-PJLV.hope-c-PJLV-ijhzIfm-css[role="group"]:first-child,
div.hope-stack.hope-c-dhzjXW.hope-c-PJLV.hope-c-PJLV-ikjnSaO-css&gt;div.hope-form-control.hope-c-dXIoOt.hope-c-PJLV.hope-c-PJLV-ijhzIfm-css[role="group"]:nth-child(2) {
    display: none;
}
/* 修改“吸附到页面顶部”模式下导航栏的浅色背景 */
.hope-c-PJLV-icKsjdm-css::after {
    background-color: #fff0 !important;
}
/* 修改“吸附到页面顶部”模式下导航栏的深色背景 */
.hope-c-PJLV-icKsjdm-css {
    background-color: #fff0 !important;
}
/* 修改“仅吸附导航栏”模式下导航栏的浅色背景 */
.hope-c-PJLV-ifdXShc-css::after {
    background-color: #fff0 !important;
}
/* 修改“仅吸附导航栏”模式下导航栏的深色背景 */
.hope-c-PJLV-ifdXShc-css {
    background-color: #fff0 !important;
}
/* 修改AList弹窗样式 */
div.hope-notification.hope-c-cIFneQ.hope-c-PJLV.hope-c-PJLV-idwKBiq-css[role="alert"] {
    background-color: #ffffff20;
    backdrop-filter: blur(15px);
}
/* 隐藏“离线下载”和“移除空的子目录”按钮 */
svg[fill="currentColor"][tips="offline_download"],svg[fill="none"][tips="remove_empty_directory"] {
    display: none;
}</code></pre>
<p style="">引用字体CDN（放入自定义头部）</p>
<pre><code>&lt;link href="https://cdn.bootcdn.net/ajax/libs/lxgw-wenkai-screen-webfont/1.7.0/lxgwwenkaiscreen.css" rel="stylesheet"&gt;</code></pre>
<p style="">感谢<a href="https://rainview.net" target="_blank">RainView</a>提供的技术支持！</p>]]></description><guid isPermaLink="false">/archives/alist-css</guid><dc:creator>RainVue</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fmaoyuna.webp&amp;size=m" type="image/jpeg" length="255114"/><category>笔记</category><pubDate>Sat, 7 Jun 2025 09:52:13 GMT</pubDate></item><item><title><![CDATA[「所念皆星河」谨此纪念网站3周年]]></title><link>https://leonxie.cn/archives/3-year-anniversary</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=%E3%80%8C%E6%89%80%E5%BF%B5%E7%9A%86%E6%98%9F%E6%B2%B3%E3%80%8D%E8%B0%A8%E6%AD%A4%E7%BA%AA%E5%BF%B5%E7%BD%91%E7%AB%993%E5%91%A8%E5%B9%B4&amp;url=/archives/3-year-anniversary" width="1" height="1" alt="" style="opacity:0;">
<p style="">Hi，大家好，我是站长LeonXie。</p>
<p style="">不知不觉间，域名leonxie.cn也有三周年历史了，也算是颇有收获吧，就来<strong>简单</strong>讲讲这3年的历程和心得吧。</p>
<p style=""><s>虽然拖了两天才把稿写完</s></p>
<h2 style="" id="%E8%B5%B7%E6%BA%90">起源</h2>
<p style="">其实购买第一个域名，只是一时兴起。那时，我不知道搭建一个网站需要服务器，甚至以为搭网站就和写Word文档一样简单。在2022.06.05 22:07购买leonxie.cn后，我才看到服务器（相对于域名）高昂的价格，域名便闲置了。</p>
<h2 style="" id="%E7%AC%AC%E4%B8%80%E5%8F%B0%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8">第一台云服务器</h2>
<p style="">时间来到<strong>2023年</strong>，当时腾讯云的服务器促销，我便入手了一台<strong>2h2g</strong>的、价格相对可接受的服务器。很可惜，这台服务器一开始也没被我好好利用，我不停地给服务器重装系统、甚至还在上面运行MEMZ（？），可以说是把服务器当成虚拟机来用了。</p>
<h2 style="" id="%E4%BA%91%E7%9B%98%E6%97%B6%E4%BB%A3">云盘时代</h2>
<p style="">终于，我找到了一个相对好的利用方式——<strong>云盘</strong>。我把平时可能需要在外面使用的文件塞进了服务器，并写了一个非常简单的html（如下图），并开始研究windows server如何搭建网站。经过一番搜索，<strong>IIS（Internet Information Services）</strong>映入眼帘。直接用ip访问没问题，可是怎么让服务器“关联”到域名呢？我开始了解到了DNS解析，虽然当初并不理解这是什么，但最后还是把网站建起来了。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-qHlK.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">可惜我使用的是国内服务器，在激动地把域名输进浏览器地址栏后，我看到了域名未备案的提示。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-OilZ.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">于是，我又陆陆续续折腾了一个月，终于成功在工信部把网站备案了。</p>
<p style="">后续我还研究了ssl证书的配置，由于当时不了解其他方法，网站的第一个ssl证书使用的是腾讯云的免费证书。</p>
<h2 style="" id="%E5%B7%A5%E5%85%B7%E5%AE%98%E7%BD%91%E6%97%B6%E4%BB%A3">工具官网时代</h2>
<p style="">熟悉C#开发后并经历了电脑重装系统后，我有了开发一个小工具来备份浏览器数据的想法。正好对这方面有一些了解，一个<s>史山</s>项目就出现了：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-NjWz.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-UCfC.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><s>黑历史啊啊啊啊</s></p>
<p style="">一个合格的工具当然要有官网啦，于是我让<strong>Bing AI</strong>（现在应该叫Microsoft Copilot了）写了一个比较好看的html。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-LGmb.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><s>（题外话：这个点击下载在网页时光机里甚至还能用）</s></p>
<h2 style="" id="%E6%AD%A5%E5%85%A5%E6%AD%A3%E8%BD%A8%E2%80%94%E2%80%94wordpress%E6%97%B6%E4%BB%A3">步入正轨——WordPress时代</h2>
<p style="">得益于Wordpress的宣传力度以及便利性，我想大多数人了解到的第一个博客框架就是Wordpress了吧。正是因为了解到Wordpress，才让我重拾当初搭建个人网站的初心。</p>
<p style="">2024年年初，我跟着知乎上的教程，成功在Windows Server上部署了Wordpress。</p>
<p style="">于是，我的第一个个人博客上线了，当时我选择了<a href="https://docs.fuukei.org/" target="_blank"><strong>Sakurairo主题</strong></a><strong>。</strong></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-Esfu.png&amp;size=m" alt="image-Esfu.png" width="944px" height="379px" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-gxYn.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style="">在Wordpress纪元我也创作了一些令我满意的文章，直到2024年年底。</p>
<h2 style="" id="%E7%BD%91%E7%AB%99%E8%A2%AB%E6%94%BB%E5%87%BB">网站被攻击</h2>
<p style="">是的，存活了1年左右，这个网站终于被攻击了。由于是跟着教程搭建的，mysql数据库没有设置密码，网站直接回到了起点。</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fed6d7a279b876ea759d30e57be7302ad.jpeg&amp;size=m" width="258px" height="559px" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-NoSd.png&amp;size=m" width="423px" height="195px" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-sIUC.png&amp;size=m" width="426px" height="136px" style="display: inline-block"></p>
<h2 style="" id="halo%E6%97%B6%E4%BB%A3">Halo时代</h2>
<p style="">由于数据全部消失，我只能从头开始。</p>
<p style="">同时我也对Windows+Wordpress建站方案的安全性产生了怀疑，于是，Linux建站映入眼帘。</p>
<p style="">原来Linux运维这么方便，第一次见到1panel、BT Panel这样的运维面板的我产生了这样的想法。</p>
<p style="">我又认识了<strong>Halo</strong>这个博客框架，把服务器重装成Linux之后，Halo博客便诞生了：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fhalo.jpg&amp;size=m" alt="halo.jpg" width="100%" height="100%" style="display: inline-block"> 至此，便有了现在的leonxie.cn。</p>
<h2 style="" id="%E7%BB%93%E8%AF%AD">结语</h2>
<p style="">感谢你能看到最后，收获的话，算是让我对这方面稍微有一点点了解了吧，<s>顺便也锻炼了我解决问题的能力</s>：</p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-HVZO.png&amp;size=m" width="460px" height="470px" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fbc4e9c5630a0edddf1c3d539cdac2e93.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-sfnm.png&amp;size=m" width="100%" height="100%" style="display: inline-block"></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-XTUv.png&amp;size=m" width="712px" height="466px" style="display: inline-block"></p>
<p style="">总而言之，也是不虚此行吧。</p>
<p style="">在最后，感谢所有帮助我的朋友，也感谢屏幕前的<strong>你</strong>来支持我！</p>
<p style="">完 <s>2025.06.05</s> 2025.06.07</p>]]></description><guid isPermaLink="false">/archives/3-year-anniversary</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2FIMG_2475.jpeg&amp;size=m" type="image/jpeg" length="41876"/><category>笔记</category><pubDate>Thu, 5 Jun 2025 14:07:00 GMT</pubDate></item><item><title><![CDATA[API——keybd_event()]]></title><link>https://leonxie.cn/archives/keybd_event</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=API%E2%80%94%E2%80%94keybd_event%28%29&amp;url=/archives/keybd_event" width="1" height="1" alt="" style="opacity:0;">
<p style=""><span style="font-size: 17px">今天我们来用API&nbsp; keybd_event()模拟键盘按键。本次我们使用C#作为编程语言。我们通过模拟键盘按键可以实现很多功能，例如：</span></p>
<p style=""><img src="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fimage-SzJk.png&amp;size=m" width="450px" height="602px" style="display: inline-block"></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">那我们先来认识一下keybd_event()吧：</span></p>
<pre><code>[DllImport(&amp;quot;user32.dll&amp;quot;, EntryPoint = &amp;quot;keybd_event&amp;quot;, SetLastError = true)]
public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);</code></pre>
<p style=""><span style="font-size: 17px">先来科普一下：</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">打开任务视图&nbsp; &nbsp; &nbsp; &nbsp; Win + Tab</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">运行&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Win + R</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">文件资源管理器&nbsp; &nbsp; &nbsp; Win + E</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">显示桌面&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Win + D</span></p>
<p style="line-height: 1.69em"></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">Windows徽章键 是&nbsp;Keys.LWin</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">Tab键 是&nbsp;Keys.Tab</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">R, E, D键 分别是&nbsp;Keys.R，&nbsp;Keys.E，&nbsp;Keys.D</span></p>
<p style="line-height: 1.69em"></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">我们来看一下参数：</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">uint dwFlags：0为按下，2为释放</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">uint dwExtraInfo：一般设为0</span></p>
<p style="line-height: 1.69em"></p>
<p style="line-height: 1.69em"><span style="font-size: 17px; color: rgb(24, 25, 28)">好了，上代码：</span></p>
<pre><code>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Task_view
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        [DllImport(&amp;quot;user32.dll&amp;quot;, EntryPoint = &amp;quot;keybd_event&amp;quot;, SetLastError = true)]
        public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
        private void button1_Click(object sender, EventArgs e)
        {
            keybd_event(Keys.LWin,0,0,0);
            keybd_event(Keys.Tab, 0, 0, 0);
            keybd_event(Keys.LWin, 0, 2, 0);
            keybd_event(Keys.Tab, 0, 2, 0);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            keybd_event(Keys.LWin, 0, 0, 0);
            keybd_event(Keys.R, 0, 0, 0);
            keybd_event(Keys.LWin, 0, 2, 0);
            keybd_event(Keys.R, 0, 2, 0);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            keybd_event(Keys.LWin, 0, 0, 0);
            keybd_event(Keys.E, 0, 0, 0);
            keybd_event(Keys.LWin, 0, 2, 0);
            keybd_event(Keys.E, 0, 2, 0);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            keybd_event(Keys.LWin, 0, 0, 0);
            keybd_event(Keys.D, 0, 0, 0);
            keybd_event(Keys.LWin, 0, 2, 0);
            keybd_event(Keys.D, 0, 2, 0);
        }
    }
}</code></pre>
<p style="line-height: 1.69em"><span style="font-size: 17px; color: rgb(24, 25, 28)">备注：Button1,2,3,4就是窗体上的：打开任务视图，运行，文件资源管理器，显示桌面</span></p>
<p style="line-height: 1.69em"></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">是不是很简单？</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">好了那我们今天就到这里啦，下期见！</span></p>]]></description><guid isPermaLink="false">/archives/keybd_event</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fkali%25E5%25AD%2597%25E7%25AC%25A6%25E7%2594%25BB.jpg&amp;size=m" type="image/jpeg" length="16191"/><category>笔记</category><pubDate>Mon, 19 May 2025 12:44:55 GMT</pubDate></item><item><title><![CDATA[drawerror是怎么实现的？]]></title><link>https://leonxie.cn/archives/drawerror</link><description><![CDATA[<img src="https://leonxie.cn/plugins/feed/assets/telemetry.gif?title=drawerror%E6%98%AF%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E7%9A%84%EF%BC%9F&amp;url=/archives/drawerror" width="1" height="1" alt="" style="opacity:0;">
<p style=""><span style="font-size: 17px">鼠标后面跟着出现错误图标，这种效果叫drawerror。今天就来讲讲drawerror是如何实现的。</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">drawerror其实调用了一个WindowsAPI——drawicon，它的效果是在指定位置画出一个图标。drawicon有4个参数，第一个我们先不管他，填NULL就行了。第二第三个参数是xy坐标。第四个参数是图标，一个HICON变量。</span></p>
<p style="line-height: 1.69em"><strong>现在的问题是：我们该如何获取鼠标指针的xy坐标呢？</strong><span style="font-size: 17px">这里我们可以用GetCursorPos配合POINT类型的变量。首先定义POINT变量p，然后再把p的指针传给GetCursorPos，大概是这样：</span></p>
<pre><code>// C++
POINT p;
GetCursorPos(&amp;amp;p);</code></pre>
<p style=""><span style="font-size: 17px">现在p.x就是鼠标的x坐标，p.y就是鼠标的y坐标了。</span></p>
<p style="line-height: 1.69em"><strong>第二个问题：error图标去哪里找呢？</strong></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">Windows预定义了一些图标供我们开发者使用，分别是：</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">IDI_ERROR&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 错误图标</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">IDI_WARNING&nbsp; &nbsp; &nbsp; &nbsp;感叹号</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">IDI_QUESTION&nbsp; &nbsp; &nbsp; 问号</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">IDI_INFORMATION&nbsp; &nbsp; &nbsp; &nbsp;信息图标</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">IDI_APPLICATION &nbsp; &nbsp; &nbsp; &nbsp;默认应用程序图标</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">IDI_SHIELD&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 安全防护罩图标（这个图标有亿些奇怪，DEV-C++直接使用这个会报错，可以写&nbsp; &nbsp; &nbsp; MAKEINTRESOURCE(32518)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ）</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">加载图标就是LoadIcon(0,/*图标的名字*/);</span></p>
<p style="line-height: 1.69em"></p>
<p style="line-height: 1.69em"></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">好了，可以开始敲代码了：</span></p>
<pre><code>#include &lt;bits/stdc++.h&gt;;
#include &lt;windows.h&gt;;
using namespace std;

signed main()
{
	ShowWindow(GetConsoleWindow(),SW_HIDE); // 这个函数没讲过，反正就是隐藏自己的控制台窗口
   POINT p;
	while (1)
	{
		GetCursorPos(&amp;amp;p);
		DrawIcon(GetDC(0),p.x,p.y,LoadIcon(0,IDI_ERROR)); // 这里也可以改成其他图标，不过得改个名字，比如drawinformation之类的
		Sleep(10);
	}
    return 0;
}</code></pre>
<p style=""><strong>当然啦，6个图标肯定不够我们玩，那么还有其他图标吗？</strong></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">答案是：有，在shell32.dll里！</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">那如何调用呢？</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">这里笔者写了一段drawshell32的代码：</span></p>
<pre><code>// 加载shell32.dll，随机获取一种图标，然后画出来
#include &lt;bits/stdc++.h&gt;;
#include &lt;windows.h&gt;;
using namespace std;

signed main()
{
	srand(time(0));
	HINSTANCE hShell = LoadLibrary(&amp;quot;shell32.dll&amp;quot;);
	ShowWindow(GetConsoleWindow(),SW_HIDE);
    POINT p;
	while (1)
	{
		GetCursorPos(&amp;amp;p);
		DrawIcon(GetWindowDC(GetDesktopWindow()),p.x,p.y,LoadIcon(hShell,MAKEINTRESOURCE(rand() % 256)));
		Sleep(10);
	}
    return 0;
}</code></pre>
<p style=""><span style="font-size: 17px; color: rgb(24, 25, 28)">好啦，我们下期再见！</span></p>
<p style=""><span style="font-size: 17px">2022.8.12 更新：</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">在这里补充一下：如果要加载自己的图标可以使用LoadImage</span></p>
<p style="line-height: 1.69em"><span style="font-size: 17px">可以参考:https://blog.csdn.net/hisinwang/article/details/45752089</span></p>
<p style="">2025.5.18 更新：</p>
<p style="">这是我三年级在B站上发布的专栏呢，最近突然看到了，就在博客上也发一下吧~希望你们喜欢！
 <br></p>]]></description><guid isPermaLink="false">/archives/drawerror</guid><dc:creator>LeonXie</dc:creator><enclosure url="https://leonxie.cn/apis/api.storage.halo.run/v1alpha1/thumbnails/-/via-uri?uri=%2Fupload%2Fnekohashizuku.png&amp;size=m" type="image/jpeg" length="355638"/><category>笔记</category><pubDate>Sun, 18 May 2025 10:39:53 GMT</pubDate></item></channel></rss>