<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ad_closeNN 的小站</title><description>Ad_closeNN の 小站，时不时会刷新一些野生东西 | ✨ 欢迎友链 ✨</description><link>https://blog.adclosenn.top/</link><language>zh_CN</language><follow_challenge><feedId>250504037866558464</feedId><userId>83370505718413312</userId></follow_challenge><item><title>[置顶] 新域名！</title><link>https://blog.adclosenn.top/posts/new-domain/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/new-domain/</guid><description>获得了一个新域名 *这使我充满了决心</description><pubDate>Thu, 31 Dec 2099 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;.dev 域名&lt;/h1&gt;
&lt;p&gt;:::note[感谢]
感谢 &lt;a href=&quot;https://blog.mckero.com&quot;&gt;MC_Kero blog&lt;/a&gt; 的站长 &lt;a href=&quot;https://github.com/MCKero6423&quot;&gt;MC_Kero&lt;/a&gt; 提供的 &lt;a href=&quot;https://education.github.com/pack&quot;&gt;GitHub Student Developer Pack&lt;/a&gt; 免费&lt;strong&gt;一年域名&lt;/strong&gt;福利！&lt;s&gt;都给我去 Follow 他&lt;/s&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;域名：&lt;code&gt;adclosenn.dev&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;时长：1 年（2025-08-23 13:11:27 UTC -&amp;gt; 2026-08-23 13:11:27 UTC）
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;::github{repo=&quot;MCKero6423/fuwari&quot;}&lt;/p&gt;
&lt;p&gt;目前访问 &lt;a href=&quot;https://adclosenn.dev&quot;&gt;adclosenn.dev&lt;/a&gt; 会直接 302 跳转回 adclosenn.top。&lt;/p&gt;
&lt;h1&gt;.xyz 域名&lt;/h1&gt;
&lt;p&gt;:::warning[注意]
如无特殊指代，阿里云指&lt;a href=&quot;https://wanwang.aliyun.com/domain&quot;&gt;阿里云（国内站）&lt;/a&gt;。
:::
之前在&lt;a href=&quot;https://wanwang.aliyun.com/domain&quot;&gt;阿里云&lt;/a&gt;买了个8位纯数字的 &lt;code&gt;.xyz&lt;/code&gt; 域名，现在买了 &lt;code&gt;.top&lt;/code&gt; 后觉得特亏。一是在阿里云里面买任何域名都需要实名认证（14+），还得填一些实际身份的信息，我了个去，填完这些信息都够我在 Spaceship 买两次域名了，真是够麻烦的。。。&lt;/p&gt;
&lt;h1&gt;.top 域名&lt;/h1&gt;
&lt;p&gt;买域名后直接开始搭博客，真香~如果不出意外的话，这个域名将会一直用下去。&lt;s&gt;毕竟&lt;code&gt;.top&lt;/code&gt;确实便宜&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;付款的时候甚至不用绑国外卡，能直接用支付宝付款，更不用&lt;strong&gt;实名认证&lt;/strong&gt;。另外，Spaceship 的 Web UI 做的是真漂亮、简洁。不过毕竟 Spaceship 是一家 &lt;strong&gt;“ICANN认证的注册商，自2022年以来为客户服务”&lt;/strong&gt; 的初创公司，没有隔壁像 &lt;a href=&quot;https://www.namesilo.com&quot;&gt;Namesilo（2009）&lt;/a&gt;、&lt;a href=&quot;https://www.namecheap.com&quot;&gt;Namecheap（2001）&lt;/a&gt; 等那么老牌，这么现代的 UI 也挺对。&lt;/p&gt;
&lt;h2&gt;信息&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;来源：&lt;a href=&quot;https://www.spaceship.com&quot;&gt;Spaceship&lt;/a&gt; （这是真能省钱）&lt;/li&gt;
&lt;li&gt;域名：&lt;a href=&quot;/&quot;&gt;adclosenn.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;首年花费：7.33 人民币（汇率：1.00 USD = 7.23002 CNY） &lt;img src=&quot;https://blog.adclosenn.top/_astro/domain-adclosenn.top-alipay.CoJVsRl2_dbDeI.webp&quot; alt=&quot;domain-adclosenn.top-alipay.jpg&quot; /&gt;&lt;/li&gt;
&lt;li&gt;次年花费：29.07 人民币 （¥27.63 域名费+¥1.44 ICANN 费）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.alibabacloud.com/zh/whois&quot;&gt;Whois（阿里云国际站）&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Domain Name: adclosenn.top
Registry Domain ID: D20250806G10001G_53477846-top
Registrar WHOIS Server: whois.spaceship.com
Registrar URL: http://www.spaceship.com
Updated Date: 2025-08-06T05:28:21Z
Creation Date: 2025-08-06T04:49:06Z
Registrar Registration Expiration Date: 2026-08-06T04:49:06Z
Registrar: Spaceship, Inc.
Registrar IANA ID: 3862
Reseller:
Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited
Domain Status: addPeriod https://icann.org/epp#addPeriod
Registrant State/Province: Capital Region
Registrant Country: IS
Name Server: malavika.ns.cloudflare.com
Name Server: rustam.ns.cloudflare.com
DNSSEC: unsigned
Registrar Abuse Contact Email: abuse@spaceship.com
Registrar Abuse Contact Phone: +1.16027723958
URL of the ICANN WHOIS Data Problem Reporting System: http://wdprs.internic.net/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;优惠码&lt;/h2&gt;
&lt;p&gt;这次购买使用的是 &lt;code&gt;SPSR86&lt;/code&gt;，省了&lt;strong&gt;1.66 人民币&lt;/strong&gt;（原价￥8.99）。代码来自 &lt;a href=&quot;https://zh-hans.tld-list.com/%E4%BC%98%E6%83%A0%E7%A0%81&quot;&gt;tld-list.com&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;新域名的由来&lt;/h1&gt;
&lt;p&gt;&lt;s&gt;便宜！&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;2025/8/2 - 引导&lt;/h2&gt;
&lt;p&gt;2号晚上，跟着&lt;a href=&quot;https://space.bilibili.com/325903362&quot;&gt;二叉树树&lt;/a&gt;博客搞起了&lt;a href=&quot;https://2x.nz/posts/proxy-tgweb/&quot;&gt;TG反代&lt;/a&gt;。脑餐的是，我并没有把登录页面放在子路径下，而是直接暴露在公网上了。之前并不知道子域名可以被扫出来，所以也没做好防护。因为搭建好后并没什么问题，所以直接去睡觉了。&lt;/p&gt;
&lt;h2&gt;2025/8/3 - 预告&lt;/h2&gt;
&lt;p&gt;早上起来一看发现仍然没问题，TG反代也能正常访问。&lt;/p&gt;
&lt;p&gt;起床打开电脑，输入 TGWeb 反代地址，Chrome 直接开出了个大红。嗯，确实是大红。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/domain-19991230.xyz-chromeabuse-page.DUQRE7nM_ZWk74H.webp&quot; alt=&quot;domain-19991230.xyz-chromeabuse-page&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不过仍然没收到来自任何关于&lt;strong&gt;钓鱼&lt;/strong&gt;、&lt;strong&gt;滥用&lt;/strong&gt;的邮件。&lt;/p&gt;
&lt;p&gt;飞到 &lt;a href=&quot;https://transparencyreport.google.com/safe-browsing/search&quot;&gt;Google Safe Browsing 透明度报告&lt;/a&gt; ，一看检查，发现已经被列入了危险列表。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/domain-19991230.xyz-googlesafe-unsafe.CPG13Ph6_2rqgmF.webp&quot; alt=&quot;domain-19991230.xyz-googlesafe-unsafe&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不过因为是自用的，也就无视风险接着用了。&lt;/p&gt;
&lt;h2&gt;2025/8/4 - 开始&lt;/h2&gt;
&lt;p&gt;2025年8月4日早上醒来，发现 &lt;a href=&quot;https://uptimerobot.com&quot;&gt;UptimeRobot&lt;/a&gt; 给我发了很多封邮件，全都是 DOWN 的（突然 UP 的是因为 DNS 等缓存问题，后续全都是 DOWN） &lt;img src=&quot;https://blog.adclosenn.top/_astro/domain-serverHold-qqmail.CmnolvL9_1rMBdt.webp&quot; alt=&quot;domain-serverHold-qqmail&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我立马就意识到不对劲了。用 &lt;a href=&quot;https://www.itdog.cn&quot;&gt;itdog&lt;/a&gt; 查 NS 记录，发现全都&lt;strong&gt;无解析记录&lt;/strong&gt;。后来 Whois 发现域名居然被 XYZ 注册局 &lt;strong&gt;serverHold&lt;/strong&gt; 了（&lt;a href=&quot;https://www.icann.org/resources/pages/epp-status-codes-2014-06-16-en/#serverHold&quot;&gt;注册局暂停解析&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;马上找到了阿里云开了个工单。阿里云工程师告诉我要自己去 XYZ 注册局的 &lt;a href=&quot;https://gen.xyz/unsuspend&quot;&gt;gen.xyz/unsuspend&lt;/a&gt; 解决。&lt;/p&gt;
&lt;p&gt;由于解决 suspend 需要提供证据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;“ &lt;strong&gt;Please note that domains will only be reviewed and reactivated when requests are filled out completely and domains have been delisted from all blocklists.&lt;/strong&gt; ”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“ &lt;strong&gt;请注意，仅当请求完整填写并且域名已从所有阻止列表中删除后，才会审核并重新激活域名。&lt;/strong&gt; ”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我在 &lt;code&gt;2025/8/7 16:29&lt;/code&gt; 的时候提交部分证据和申请信息到了 &lt;a href=&quot;mailto:xyzabuse@gen.xyz&quot;&gt;xyzabuse@gen.xyz&lt;/a&gt; 。&lt;/p&gt;
&lt;h2&gt;2025/8/5 - 申诉&lt;/h2&gt;
&lt;p&gt;早上一起来，UptimeRobot 仍未发送 UP 通知。再看昨天发给 gen.xyz 的邮件，也没有回复我。索性去 &lt;a href=&quot;https://gen.xyz/unsuspend&quot;&gt;gen.xyz/unsuspend&lt;/a&gt; 解决。&lt;/p&gt;
&lt;p&gt;解决前，我把几个安全机构的 Support 都发了一遍邮件，让他们重新检查。回头再看 Google Safe Browsing 透明度报告，&lt;code&gt;19991230.xyz&lt;/code&gt;及其他除&lt;code&gt;web.&lt;/code&gt;外的域，都已经变为绿色正常。&lt;/p&gt;
&lt;p&gt;16:00 点后，来到 gen.xyz，填了填报告，submit了。而这居然还有坑？&lt;/p&gt;
&lt;p&gt;:::warning[注意]
当时的情况如此，并非等于现在情况。
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;网站看起来是不用登录就能 Submit 的，因为下面让你填 &lt;strong&gt;名字&lt;/strong&gt; 和 &lt;strong&gt;邮箱&lt;/strong&gt;，实际上没登录时，等你 Submit 后会说你未填写用户名和邮箱地址。注册好 XYZ 账号后，再次 Submit 即可成功提交。（吗？&lt;/li&gt;
&lt;li&gt;登录 XYZ 账号后 Submit，会返回 &lt;code&gt;500 Internal Server Error&lt;/code&gt;，&lt;strong&gt;但实际上貌似已成功发送了你的请求&lt;/strong&gt;，真是奇怪。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2025/8/6 - 复活&lt;/h2&gt;
&lt;p&gt;早上再次查看，发现 UptimeRobot 已经发了很多封 UP 邮件。&lt;strong&gt;好耶，域名复活了！&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Tuesday, August 5, 2025 - 20:08 PM

XYZ Anti-Abuse Agent 656322, Staff

Subject: Request for Removal of serverHold Status for Domain 19991230.xyz
Subject / Abuse Type:

Hello Ad_closeNN,

Thank you for your message. This domain has been unsuspended and is now active. This domain was flagged by Spamhaus and has since dropped off due to the site being inactive. Please check Spamhaus DBL after 24 hrs to ensure delisting.

Please note that it will be added to a watch list for any potential violations of our anti-abuse policies, and we will continue to monitor this domain.

Also note, it can take up to 24 hours for the WHOIS information to update.

Please submit a new support ticket at https://gen.xyz/abuse if you have any further evidence or information.

Kind Regards,
XYZ Anti-Abuse Team
xyz_abuse@gen.xyz
M-F 9am-5pm PT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;译文（Google 翻译 &lt;s&gt;生草机&lt;/s&gt;）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2025年8月5日，星期二，晚上8:08

XYZ 反滥用代理 656322，工作人员

主题：请求移除域名 19991230.xyz 的服务器暂停状态
主题/滥用类型：

您好，Ad_closeNN，

感谢您的留言。此域名已解除暂停状态，现已恢复正常。此域名曾被 Spamhaus 标记，由于网站处于非活跃状态，现已下架。请在 24 小时后查看 Spamhaus 的 DBL，以确保将其下架。

请注意，我们将把该域名添加到监视列表中，以查找任何可能违反我们反滥用政策的行为，并持续监控该域名。

另请注意，WHOIS 信息更新可能需要最多 24 小时。

如果您有任何进一步的证据或信息，请访问 https://gen.xyz/abuse 提交新的支持工单。

此致，

XYZ 反滥用团队
xyz_abuse@gen.xyz
周一至周五 上午 9 点至下午 5 点（太平洋时间）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后到了中午，看着旧 &lt;code&gt;.xyz&lt;/code&gt; 域名，因为这个域名被标记过，之后可能也会被持续严格视奸，所以想到了买一个新的域名。于是到 Namesilo、NameCheap、Spaceship 看，发现英文域名+ &lt;code&gt;.top&lt;/code&gt; 比较便宜。Google 一搜优惠代码，真找到了个能用的。于是就以 ￥7.33 拿下了 &lt;code&gt;adclosenn.top&lt;/code&gt; 的首年~~~&lt;/p&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;这件事经历了4天（&lt;strong&gt;8/2&lt;/strong&gt;~&lt;strong&gt;8/6&lt;/strong&gt;），让我体会到了从域名被 &lt;code&gt;serverHold&lt;/code&gt; 到 &lt;code&gt;active&lt;/code&gt; 的过程。&lt;/p&gt;
&lt;p&gt;所以...... 搞反代千万不能把登录等敏感页面直接暴露在公网（推荐自用密码+/xxx） 😡😡😡&lt;/p&gt;
&lt;p&gt;血一般的教训 😡😡😡 我都没想过会 &lt;code&gt;serverHold&lt;/code&gt; 😡😡😡 我真的没想过钓鱼 😡😡😡&lt;/p&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>教你免费获取酷狗音乐歌曲</title><link>https://blog.adclosenn.top/posts/kugou-music-download/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/kugou-music-download/</guid><description>使用 NodeJS 版酷狗概念版API + 送的酷狗概念版VIP 直接通过 URL 获取VIP歌曲，而且还自带歌手元数据！</description><pubDate>Sat, 18 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;:::caution[警告]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;本教程仅供学习交流，下载的音乐文件请于24小时内删除。&lt;/li&gt;
&lt;li&gt;请务必尊重正版，从正常渠道获取音乐资源。&lt;/li&gt;
&lt;li&gt;造成的法律问题请自行承担责任。
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::tip[提示]
教程中的酷狗主要指的是酷狗概念版，并非酷狗官方版。
:::&lt;/p&gt;
&lt;p&gt;由于某些原因，我们有时需要下载一些歌曲。&lt;br /&gt;
如果是&lt;strong&gt;非VIP歌曲&lt;/strong&gt;（即无需开通会员即可听完整首歌、下载需要会员），可以直接去到 &lt;a href=&quot;https://www.kugou.com&quot;&gt;酷狗音乐官网&lt;/a&gt; 对应的歌曲页 ，从 Dev Tools 中获取&lt;strong&gt;128kbps&lt;/strong&gt;、&lt;strong&gt;.mp3&lt;/strong&gt;歌曲的链接： &lt;img src=&quot;https://blog.adclosenn.top/_astro/kugou-music-web-1.BgBlhSO9_2mkqgy.webp&quot; alt=&quot;kugou-music-web-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;并且，从这个链接获取的是&lt;strong&gt;音乐源文件&lt;/strong&gt;，也就是说包含了歌手等数据： &lt;img src=&quot;https://blog.adclosenn.top/_astro/kugou-music-example-details.DOAbkTb-_1Syx2x.webp&quot; alt=&quot;kugou-music-example-details&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是，对于一些VIP歌曲（即无会员时仅可试听）&lt;/strong&gt;，即使购买了会员，一般情况下，在酷狗概念版下载VIP歌曲获得的是类似 &lt;code&gt;xxx.kgm.flac&lt;/code&gt; 格式的文件。&lt;strong&gt;上锁了&lt;/strong&gt;。&lt;br /&gt;
这种文件直接访问 https://legacy.um-react.app ，解锁一下音乐就好了。&lt;/p&gt;
&lt;p&gt;这依然很麻烦。需要先将 &lt;code&gt;xxx.kgm.flac&lt;/code&gt; 重命名为 &lt;code&gt;xxx.kgm&lt;/code&gt; 后才能解锁，对于手机来说总体步骤比较麻烦，且&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一次性解锁一堆文件需要先传输到电脑再一并解锁。&lt;/li&gt;
&lt;li&gt;酷狗概念版没有 PC 端。&lt;/li&gt;
&lt;li&gt;畅听 VIP 无法下载 VIP 歌曲。参见 &lt;a href=&quot;#%E4%B8%A4%E7%A7%8Dvip%E7%9A%84%E4%B8%8D%E5%90%8C%E7%82%B9&quot;&gt;#两种VIP的不同点&lt;/a&gt; 。&lt;/li&gt;
&lt;li&gt;免费的酷狗概念版 VIP 从 API 获取最快。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;用开源酷狗API解析音乐文件URL&lt;/h1&gt;
&lt;h2&gt;后端&lt;/h2&gt;
&lt;p&gt;:::warning[注意]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;请不要信任陌生的后端 API 地址，以免造成数据泄露&lt;/li&gt;
&lt;li&gt;调用时要加上&amp;amp;和随机的字符，以免后端缓存结果。&lt;/li&gt;
&lt;li&gt;需要将环境变量 &lt;code&gt;platform&lt;/code&gt; 改为 &lt;code&gt;lite&lt;/code&gt;（概念版）。参见 https://github.com/MakcRe/KuGouMusicApi#使用接口为概念版
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;::github{repo=&quot;MakcRe/KuGouMusicApi&quot;}&lt;/p&gt;
&lt;p&gt;可将这个 NodeJS 版酷狗 API 的后端搭建在 &lt;a href=&quot;https://vercel.com&quot;&gt;Vercel&lt;/a&gt; 上调用（记得关注 Usage 使用情况）。也可以下载到本地安装依赖然后&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install
set platform=lite
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总之，搭建成功后的后端服务器的根目录应为： &lt;img src=&quot;https://blog.adclosenn.top/_astro/kugou-music-nodejs-api-self-hosting-menu.CfTKQ3nJ_Zd17J0.webp&quot; alt=&quot;kugou-music-nodejs-api-self-hosting-menu&quot; /&gt;&lt;/p&gt;
&lt;p&gt;官方 API 文档： https://kugoumusicapi-docs.4everland.app/#/&lt;/p&gt;
&lt;p&gt;接下来将以 &lt;code&gt;kugou.cl.nz&lt;/code&gt; 作为演示，可以直接在浏览器输入。实际使用请替换为自己的。&lt;/p&gt;
&lt;h2&gt;第一步：登录&lt;/h2&gt;
&lt;p&gt;https://kugoumusicapi-docs.4everland.app/#/?id=登录&lt;br /&gt;
https://kugoumusicapi-docs.4everland.app/#/?id=发送验证码&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;手机号登录&lt;/strong&gt;（推荐）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 发送验证码到 12345678910
https://kugou.cl.nz/captcha/sent?mobile=12345678910&amp;amp;qwertyuiop

#填入获得的验证码
https://kugou.cl.nz/login/cellphone?mobile=12345678910&amp;amp;code=114514&amp;amp;qwertyuiop 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功后将会显示个人信息。&lt;/p&gt;
&lt;h2&gt;第二步：领取VIP&lt;/h2&gt;
&lt;p&gt;https://kugoumusicapi-docs.4everland.app/#/?id=领取-vip（需要登陆，该接口为测试接口仅限概念版使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 需要登录。领取概念版VIP，一次增加三小时，可重复获取8次，最大24h
https://kugou.cl.nz/youth/vip?qwertyuiop

领取完毕后为 {&quot;error_msg&quot;:&quot;今天次数已用光&quot;,&quot;data&quot;:&quot;&quot;,&quot;status&quot;:0,&quot;error_code&quot;:30002}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第三步：搜索音乐&lt;/h2&gt;
&lt;p&gt;https://kugoumusicapi-docs.4everland.app/#/?id=综合搜索&lt;/p&gt;
&lt;p&gt;目的是为了获取音乐哈希值 &lt;code&gt;FileHash&lt;/code&gt;。如果有 &lt;code&gt;FileHash&lt;/code&gt; 的话可以直接前往 &lt;a href=&quot;#%E7%AC%AC%E5%9B%9B%E6%AD%A5%E4%B8%8B%E8%BD%BD%E9%9F%B3%E4%B9%90&quot;&gt;#第四步：下载音乐&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 无需登录。无需取消缓存。返回 JSON。
# 可以搜歌词，也可以输入完整的音乐名，和在客户端搜索基本一致。一般大众音乐排在第一位。
# 以搜索歌词为例，源歌曲为 ARI HICKS - Kiss Me, Kill Me：So Tell Me What You&apos;re Waiting For
https://kugou.cl.nz/search/complex?keywords=So%20Tell%20Me%20What%20You%27re%20Waiting%20For
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将会返回：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;data&quot;: {
    &quot;correctiontip&quot;: &quot;&quot;,
    &quot;correctionforce&quot;: 0,
    &quot;lists&quot;: [
      {
        &quot;allowerr&quot;: 0,
        &quot;isshareresult&quot;: 0,
        &quot;sectag_info&quot;: {
          &quot;is_sectag&quot;: 0
        },
        &quot;istagresult&quot;: 0,
        &quot;total&quot;: 42,
        &quot;istag&quot;: 0,
        &quot;lists&quot;: [
          {
            &quot;SQFileHash&quot;: &quot;243D9A6F6918879FAD2DAD37570B0FE3&quot;,
            &quot;PublishTime&quot;: &quot;&quot;,
            &quot;Audioid&quot;: 83208546,
            &quot;SuperDuration&quot;: 0,
            &quot;OldCpy&quot;: 0,
            &quot;PublishAge&quot;: 255,
            &quot;HQBitrate&quot;: 320,
            &quot;PayType&quot;: 3,
            &quot;TagContent&quot;: &quot;评论过万&quot;,
            &quot;Accompany&quot;: 1,
            &quot;SingerName&quot;: &quot;ARI HICKS&quot;, // 歌手名
            &quot;HQPrivilege&quot;: 10,
            &quot;TopicRemark&quot;: &quot;&quot;,
            &quot;OriOtherName&quot;: &quot;&quot;,
            &quot;ShowingFlag&quot;: 0,
            &quot;Source&quot;: &quot;&quot;,
            &quot;SQFileSize&quot;: 22060693,
            &quot;AlbumAux&quot;: &quot;&quot;,
            &quot;HQDuration&quot;: 182,
            &quot;Image&quot;: &quot;http://imge.kugou.com/stdmusic/{size}/20221103/20221103054712785952.jpg&quot;,
            &quot;HQPayType&quot;: 3,
            &quot;HeatLevel&quot;: 5,
            &quot;M4aSize&quot;: 0,
            &quot;trans_param&quot;: {
              &quot;ogg_128_hash&quot;: &quot;A38E084A07325BCD0DD037F8145FA349&quot;,
              &quot;classmap&quot;: {
                &quot;attr0&quot;: 234881032
              },
              &quot;language&quot;: &quot;英语&quot;,
              &quot;cpy_attr0&quot;: 58735744,
              &quot;musicpack_advance&quot;: 1,
              &quot;ogg_128_filesize&quot;: 2229498,
              &quot;display_rate&quot;: 0,
              &quot;union_cover&quot;: &quot;http://imge.kugou.com/stdmusic/{size}/20221103/20221103054712785952.jpg&quot;,
              &quot;qualitymap&quot;: {
                &quot;attr0&quot;: 2134884468,
                &quot;attr1&quot;: 136511488
              },
              &quot;ogg_320_filesize&quot;: 8233880,
              &quot;ogg_320_hash&quot;: &quot;215E60CC931F0D02115735C082DCF590&quot;,
              &quot;cid&quot;: 116911077,
              &quot;cpy_grade&quot;: 5,
              &quot;display&quot;: 0,
              &quot;ipmap&quot;: {
                &quot;attr0&quot;: 8606716928
              },
              &quot;hash_offset&quot;: {
                &quot;clip_hash&quot;: &quot;9D099E09E3C7F057019305F0775A3ABA&quot;,
                &quot;start_byte&quot;: 0,
                &quot;end_ms&quot;: 60000,
                &quot;end_byte&quot;: 960181,
                &quot;file_type&quot;: 0,
                &quot;start_ms&quot;: 0,
                &quot;offset_hash&quot;: &quot;87DB3C1A71394DD3D96BDF08E9477790&quot;
              },
              &quot;hash_multitrack&quot;: &quot;8849F7DF7102CC5973C665C130EB2AED&quot;,
              &quot;pay_block_tpl&quot;: 1,
              &quot;cpy_level&quot;: 1
            },
            &quot;SQPkgPrice&quot;: 1,
            &quot;UploaderContent&quot;: &quot;&quot;,
            &quot;FoldType&quot;: 0,
            &quot;FileSize&quot;: 2925136,
            &quot;IsOriginal&quot;: 1, // 是否为原版，1为原版
            &quot;FileHash&quot;: &quot;0FD4158049ABCF692DA7E4D1C1AA963A&quot;, // 音乐哈希
            &quot;Grp&quot;: [],
            &quot;ID&quot;: &quot;276107671&quot;,
            &quot;isPrepublish&quot;: 0,
            &quot;MvTrac&quot;: 3,
            &quot;vvid&quot;: &quot;&quot;,
            &quot;Type&quot;: &quot;audio&quot;,
            &quot;Bitrate&quot;: 128,
            &quot;SQPrice&quot;: 200,
            &quot;ASQPrivilege&quot;: 10,
            &quot;ExtName&quot;: &quot;mp3&quot;,
            &quot;PkgPrice&quot;: 1,
            &quot;AlbumPrivilege&quot;: 10,
            &quot;AlbumID&quot;: &quot;39450255&quot;,
            &quot;AlbumName&quot;: &quot;Kiss Me, Kill Me&quot;,
            &quot;Category&quot;: 1,
            &quot;SuperExtName&quot;: &quot;&quot;,
            &quot;mvdata&quot;: [
              {
                &quot;typ&quot;: 0,
                &quot;trk&quot;: &quot;3&quot;,
                &quot;hash&quot;: &quot;CAC0D33EE16A332FD8B2F8C3FB243856&quot;,
                &quot;id&quot;: &quot;10184904&quot;
              }
            ],
            &quot;OtherName&quot;: &quot;&quot;,
            &quot;SongName&quot;: &quot;Kiss Me, Kill Me&quot;,
            &quot;Res&quot;: {
              &quot;PkgPrice&quot;: 1,
              &quot;Privilege&quot;: 10,
              &quot;PayType&quot;: 3,
              &quot;Price&quot;: 200,
              &quot;FailProcess&quot;: 4
            },
            &quot;AudioCdn&quot;: 0,
            &quot;SourceID&quot;: 0,
            &quot;SQDuration&quot;: 182,
            &quot;HQFileSize&quot;: 7312454,
            &quot;MixSongID&quot;: &quot;276107671&quot;,
            &quot;Singers&quot;: [
              {
                &quot;name&quot;: &quot;ARI HICKS&quot;,
                &quot;ip_id&quot;: 0,
                &quot;id&quot;: 7279057
              }
            ],
            &quot;SQPayType&quot;: 3,
            &quot;SuperBitrate&quot;: 0,
            &quot;MvHash&quot;: &quot;CAC0D33EE16A332FD8B2F8C3FB243856&quot;,
            &quot;HQPrice&quot;: 200,
            &quot;Suffix&quot;: &quot;&quot;,
            &quot;HQFailProcess&quot;: 4,
            &quot;HasAlbum&quot;: 1,
            &quot;ResDuration&quot;: 182,
            &quot;ResBitrate&quot;: 1670,
            &quot;HiFiQuality&quot;: 3,
            &quot;ResFileHash&quot;: &quot;CD2CB994A5D61FABA86F258731CECF5E&quot;,
            &quot;SingerId&quot;: [7279057],
            &quot;HQExtName&quot;: &quot;mp3&quot;,
            &quot;SongLabel&quot;: &quot;&quot;,
            &quot;MatchFlag&quot;: 65536,
            &quot;Scid&quot;: 83208546,
            &quot;SuperFileHash&quot;: &quot;&quot;,
            &quot;QualityLevel&quot;: 3,
            &quot;OriSongName&quot;: &quot;Kiss Me, Kill Me&quot;, // 原始音乐名
            &quot;MvType&quot;: 2,
            &quot;mvTotal&quot;: 0,
            &quot;SuperFileSize&quot;: 0,
            &quot;FailProcess&quot;: 4,
            &quot;SQExtName&quot;: &quot;flac&quot;,
            &quot;SQBitrate&quot;: 965,
            &quot;RankId&quot;: 0,
            &quot;PublishDate&quot;: &quot;2020-10-30&quot;,
            &quot;HQFileHash&quot;: &quot;639FC7A5F9B7DA787D546B97BCA83BE6&quot;,
            &quot;TopicUrl&quot;: &quot;&quot;,
            &quot;Auxiliary&quot;: &quot;歌词 : So tell me what you&apos;re waiting for Don&apos;t you wanna be the one who stays alive A feeling that you can&apos;t ignore Me creeping up inside Oh why do I love a little bit of kiss me kill me cry Oh I oh I love a little bit of kiss me kill me die &quot;, // 搜索中关键词的来源
            &quot;TagDetails&quot;: [
              {
                &quot;content&quot;: &quot;评论过万&quot;, // 标识符
                &quot;version&quot;: 1,
                &quot;type&quot;: 5
              }
            ],
            &quot;Privilege&quot;: 10,
            &quot;PrepublishInfo&quot;: {
              &quot;ReserveCount&quot;: 0,
              &quot;DisplayTime&quot;: &quot;&quot;,
              &quot;Id&quot;: 0,
              &quot;PublishTime&quot;: &quot;&quot;
            },
            &quot;HQPkgPrice&quot;: 1,
            &quot;OwnerCount&quot;: 93047,
            &quot;Uploader&quot;: &quot;&quot;,
            &quot;Duration&quot;: 182,
            &quot;SQFailProcess&quot;: 4,
            &quot;TopID&quot;: 0,
            &quot;A320Privilege&quot;: 10,
            &quot;FileName&quot;: &quot;ARI HICKS - Kiss Me, Kill Me&quot;, // 音乐文件名
            &quot;ResFileSize&quot;: 38168107,
            &quot;SQPrivilege&quot;: 10,
            &quot;Price&quot;: 200,
            &quot;recommend_type&quot;: 0,
            &quot;Publish&quot;: 1
          },
          // 更多结果
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，我们需要的 &lt;code&gt;FileHash&lt;/code&gt; 为 &lt;code&gt;0FD4158049ABCF692DA7E4D1C1AA963A&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;第四步：下载音乐&lt;/h2&gt;
&lt;p&gt;https://kugoumusicapi-docs.4everland.app/#/?id=获取音乐-url&lt;/p&gt;
&lt;p&gt;:::important[重要]
如果获取的是 VIP 歌曲，即未开通会员仅可试听的音乐，需要酷狗概念版VIP。参考 &lt;a href=&quot;#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E9%A2%86%E5%8F%96vip&quot;&gt;#第二步：领取VIP&lt;/a&gt; 。&lt;br /&gt;
强制获取需要概念版VIP的歌曲URL，将会提示 &lt;code&gt;{&quot;errcode&quot;:20028,&quot;status&quot;:0,&quot;error&quot;:&quot;本次请求需要验证&quot;}&lt;/code&gt;。
:::&lt;/p&gt;
&lt;p&gt;下载音乐需要用到 &lt;a href=&quot;#%E7%AC%AC%E4%B8%89%E6%AD%A5%E6%90%9C%E7%B4%A2%E9%9F%B3%E4%B9%90&quot;&gt;#第三步：搜索音乐&lt;/a&gt; 的 &lt;code&gt;FileHash&lt;/code&gt; 和音质（可选，不指定将获取最低音质）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用&lt;/strong&gt;的&lt;strong&gt;部分&lt;/strong&gt;音质 &lt;code&gt;quality&lt;/code&gt;：
&lt;code&gt;128&lt;/code&gt;：128kbps &lt;code&gt;.mp3&lt;/code&gt; 格式，&lt;strong&gt;标准&lt;/strong&gt;
&lt;code&gt;320&lt;/code&gt;：320kbps &lt;code&gt;.mp3&lt;/code&gt; 格式，&lt;strong&gt;高品&lt;/strong&gt;
&lt;code&gt;flac&lt;/code&gt;：&lt;code&gt;.flac&lt;/code&gt; 格式，&lt;strong&gt;无损&lt;/strong&gt;，&lt;strong&gt;无加密&lt;/strong&gt;
&lt;code&gt;high&lt;/code&gt;：&lt;code&gt;.flac&lt;/code&gt; 格式，&lt;strong&gt;Hi-Res&lt;/strong&gt;，&lt;strong&gt;无加密&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：部分歌曲没有对应的高音质（如无 Hi-Res 的音乐依然请求 &amp;amp;quality=high），返回的音乐 URL 将为 128kbps 的 .mp3 音乐&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# hash 为第三步获取的 FileHash。不必取消缓存。
# hash=0FD4158049ABCF692DA7E4D1C1AA963A，quality=high（Hi-Res）
https://kugou.cl.nz/song/url?hash=0FD4158049ABCF692DA7E4D1C1AA963A&amp;amp;quality=high
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将会返回：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;extName&quot;: &quot;flac&quot;, // 音频文件的扩展名
  &quot;classmap&quot;: {
    &quot;attr0&quot;: 234881032
  },
  &quot;status&quot;: 1,
  &quot;volume&quot;: -8.4,
  &quot;std_hash_time&quot;: 182778,
  &quot;backupUrl&quot;: [
    &quot;http://fs.youthandroid.kugou.com/202510181811/474420aee993e180059c8251e69abd37/v3/cd2cb994a5d61faba86f258731cecf5e/yp/full/ap3116_us1416117396_mi336d5ebc5436534e61d16e63ddfca327_pi411_mx0_quhigh_s3753791114.flac&quot; // 最终音乐源文件
  ],
  &quot;url&quot;: [
    &quot;http://fs.youthandroid2.kugou.com/202510181811/08d7aef6a8e7368c33746fe52d707702/v3/cd2cb994a5d61faba86f258731cecf5e/yp/full/ap3116_us1416117396_mi336d5ebc5436534e61d16e63ddfca327_pi411_mx0_quhigh_s3753791114.flac&quot;,
    &quot;http://fs.youthandroid.kugou.com/202510181811/474420aee993e180059c8251e69abd37/v3/cd2cb994a5d61faba86f258731cecf5e/yp/full/ap3116_us1416117396_mi336d5ebc5436534e61d16e63ddfca327_pi411_mx0_quhigh_s3753791114.flac&quot;
  ],
  &quot;std_hash&quot;: &quot;0FD4158049ABCF692DA7E4D1C1AA963A&quot;,
  &quot;tracker_through&quot;: {
    &quot;identity_block&quot;: 0,
    &quot;cpy_grade&quot;: 5,
    &quot;musicpack_advance&quot;: 1,
    &quot;all_quality_free&quot;: 0,
    &quot;cpy_level&quot;: 1
  },
  &quot;trans_param&quot;: {
    &quot;display_rate&quot;: 0,
    &quot;display&quot;: 0,
    &quot;ogg_128_hash&quot;: &quot;A38E084A07325BCD0DD037F8145FA349&quot;,
    &quot;qualitymap&quot;: {
      &quot;attr0&quot;: 2134884468,
      &quot;attr1&quot;: 136511488
    },
    &quot;pay_block_tpl&quot;: 1,
    &quot;union_cover&quot;: &quot;http://imge.kugou.com/stdmusic/{size}/20221103/20221103054712785952.jpg&quot;,
    &quot;language&quot;: &quot;英语&quot;,
    &quot;hash_multitrack&quot;: &quot;8849F7DF7102CC5973C665C130EB2AED&quot;,
    &quot;cpy_attr0&quot;: 58735744,
    &quot;ipmap&quot;: {
      &quot;attr0&quot;: 8606716928
    },
    &quot;ogg_320_hash&quot;: &quot;215E60CC931F0D02115735C082DCF590&quot;,
    &quot;classmap&quot;: {
      &quot;attr0&quot;: 234881032
    },
    &quot;ogg_128_filesize&quot;: 2229498,
    &quot;ogg_320_filesize&quot;: 8233880
  },
  &quot;fileHead&quot;: 100,
  &quot;auth_through&quot;: [],
  &quot;timeLength&quot;: 182,
  &quot;bitRate&quot;: 1671000, // 音频文件比特率
  &quot;priv_status&quot;: 1,
  &quot;volume_peak&quot;: 0.1,
  &quot;volume_gain&quot;: 0,
  &quot;q&quot;: 0,
  &quot;fileName&quot;: &quot;002Y3LRz3yuT7N_000ifoEu1gY44L.flac&quot;, // 音乐文件名，出现这种需要以第三步中搜索的音乐中的 FileName 为准
  &quot;fileSize&quot;: 38168107,
  &quot;hash&quot;: &quot;CD2CB994A5D61FABA86F258731CECF5E&quot; // 此音频文件的哈希值
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中 &lt;code&gt;backupUrl&lt;/code&gt; 中的&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://fs.youthandroid.kugou.com/202510181811/474420aee993e180059c8251e69abd37/v3/cd2cb994a5d61faba86f258731cecf5e/yp/full/ap3116_us1416117396_mi336d5ebc5436534e61d16e63ddfca327_pi411_mx0_quhigh_s3753791114.flac
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即为我们需要的音频源文件。&lt;br /&gt;
下载到的音频文件不是我们想要的，可以在 &lt;a href=&quot;#%E7%AC%AC%E4%B8%89%E6%AD%A5%E6%90%9C%E7%B4%A2%E9%9F%B3%E4%B9%90&quot;&gt;#第三步：搜索音乐&lt;/a&gt; 中找到 &lt;code&gt;FileName&lt;/code&gt;，再与第四步中 &lt;code&gt;extName&lt;/code&gt; 结合即可。&lt;br /&gt;
可以看到，下载下来的音频是有歌手名的源文件： &lt;img src=&quot;https://blog.adclosenn.top/_astro/kugou-music-example-details-2.GZqIgYgD_17YMum.webp&quot; alt=&quot;kugou-music-example-details-2&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;两种VIP的不同点&lt;/h1&gt;
&lt;p&gt;酷狗概念版中有2种不同的VIP等级之分。分别是&lt;strong&gt;概念版VIP&lt;/strong&gt;和&lt;strong&gt;畅听VIP&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;下载VIP歌曲&lt;/th&gt;
&lt;th&gt;播放 Hi-Res 音质音乐&lt;/th&gt;
&lt;th&gt;可通过签到获得&lt;/th&gt;
&lt;th&gt;每次最大下载数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;概念版 VIP&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;畅听 VIP&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.adclosenn.top/_astro/kugou-music-lite-app-vippage.DVAFmzQw_Z1b96B7.webp&quot; alt=&quot;kugou-music-lite-app-vippage&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>使用 CF Workers 搭建 Vless/Trojan 节点并优化</title><link>https://blog.adclosenn.top/posts/cloudflare-workers-proxy/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/cloudflare-workers-proxy/</guid><description>CM大佬的 EdgeTunnel 暂时没了。没事，我们还有勇哥。</description><pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;:::caution[警告]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;本教程仅供学习交流，请在当地法律允许的情况下使用。&lt;/li&gt;
&lt;li&gt;Cloudflare 已在其 &lt;a href=&quot;https://www.cloudflare.com/terms/&quot;&gt;Self-Serve Subscription Agreement | Cloudflare&lt;/a&gt; 中规定：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;(j) use the Services to provide a virtual private network or other similar proxy services.
--- Google Translate:
(j) 使用服务提供虚拟专用网络或其他类似的代理服务。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::tip[提示]
&lt;a href=&quot;https://github.com/cmliu/edgetunnel&quot;&gt;CMLiu/EdgeTunnel&lt;/a&gt; 依然可用，只需使用未混淆的 &lt;code&gt;_worker.js&lt;/code&gt; 文件作为 Worker 运行文件即可，无 1101。本教程使用勇哥的 Worker 代码作为演示。
:::&lt;/p&gt;
&lt;h1&gt;需求&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;一个域名（免费/付费）&lt;/li&gt;
&lt;li&gt;一个 &lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;Cloudflare&lt;/a&gt; 账号&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;关于域名&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;付费的 &lt;code&gt;.xyz&lt;/code&gt; &lt;code&gt;.top&lt;/code&gt; 或 &lt;code&gt;.com&lt;/code&gt; 等域名即可。必须要托管至 Cloudflare。&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;dpdns.org&lt;/code&gt; 域名获取方式参见：&lt;a href=&quot;https://www.google.com/search?q=%E6%B3%A8%E5%86%8C+dpdns.org&amp;amp;oq=%E6%B3%A8%E5%86%8C+dpdns.org&quot;&gt;注册 dpdns.org - Google 搜索&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;搭建节点&lt;/h1&gt;
&lt;p&gt;:::important[重要]
这里介绍 Vless 版节点搭建。&lt;br /&gt;
Vless 版的节点和 Trojan 版的节点部署方法类似，只是换了一个 &lt;code&gt;_worker.js&lt;/code&gt; 文件。需要使用 Trojan 版的可以去勇哥仓库 https://github.com/yonggekkk/Cloudflare-vless-trojan/tree/main/Trojan_workers_pages 找到 Trojan 版 Worker 代码。
:::&lt;/p&gt;
&lt;h2&gt;创建 Worker&lt;/h2&gt;
&lt;p&gt;打开 &lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;Cloudflare Dashboard&lt;/a&gt;，点击右下角的 &lt;strong&gt;计算 (Workers)&lt;/strong&gt;，在新的页面点击 &lt;strong&gt;创建应用程序&lt;/strong&gt;。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/cf-workers-menu.CMt5uhqJ_tmgKn.webp&quot; alt=&quot;cf-workers-menu&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择 &lt;strong&gt;从 Hello World! 开始&lt;/strong&gt; 右边的 &lt;strong&gt;开始使用&lt;/strong&gt; 按钮：&lt;img src=&quot;https://blog.adclosenn.top/_astro/cf-worker-template-from-helloworld.BQWvZVEN_Z1ipJSv.webp&quot; alt=&quot;cf-worker-template-from-helloworld&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随便取一个 Worker 名字，但是最好不要包括下面的关键词，否则可能会报错 1101。&lt;strong&gt;一般以默认分配的名称作为 Worker 名称即可&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vpn&lt;/li&gt;
&lt;li&gt;vless&lt;/li&gt;
&lt;li&gt;trojan&lt;/li&gt;
&lt;li&gt;edgetunnel&lt;/li&gt;
&lt;li&gt;bpb&lt;/li&gt;
&lt;li&gt;proxy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;点击 &lt;strong&gt;部署&lt;/strong&gt; 按钮。&lt;/p&gt;
&lt;h2&gt;编辑 Worker&lt;/h2&gt;
&lt;p&gt;访问 https://raw.githubusercontent.com/yonggekkk/Cloudflare-vless-trojan/refs/heads/main/Vless_workers_pages/_worker%E6%B7%B7%E6%B7%86.js 并复制整个内容。&lt;/p&gt;
&lt;p&gt;返回 Cloudflare Dashboard，点击刚刚创建的 Worker，在控制面板中点击 &lt;strong&gt;编辑代码&lt;/strong&gt;： &lt;img src=&quot;https://blog.adclosenn.top/_astro/cf-workers-editcode-visit-botton.BFWbKkb3_Z1a9jOP.webp&quot; alt=&quot;cf-workers-editcode-visit-botton&quot; /&gt;&lt;/p&gt;
&lt;p&gt;把从上面链接复制来的内容粘贴到 Worker 代码编辑器中。&lt;/p&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://www.uuidgenerator.net/version4&quot;&gt;Online UUID Generator Tool&lt;/a&gt;，点击 &lt;strong&gt;Copy&lt;/strong&gt; 按钮，把你的 UUID v4 复制下来。&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;let userID = &quot;86c50e3a-5b87-49dd-bd20-03c7f2735e40&quot;; //可以把86c50e3a-5b87-49dd-bd20-03c7f2735e40改为你自定义的uuid
const proxyIPs = [&quot;&quot;]; //&quot;&quot;之间填写proxyip，留空将无法访问CF网站
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把这个代码中的 &lt;code&gt;86c50e3a-5b87-49dd-bd20-03c7f2735e40&lt;/code&gt; 替换为你的 UUID&lt;br /&gt;
&lt;code&gt;proxyIPs&lt;/code&gt; 可从 https://t.me/CMLiussss_channel/84 中随便选一个使用。推荐使用 &lt;code&gt;ProxyIP.US.CMLiussss.net&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;配置完成后大概类似于这样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let userID = &quot;20a4537b-8da9-4bd4-b666-6e29a62345f7&quot;;    
const proxyIPs = [&quot;ProxyIP.US.CMLiussss.net&quot;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.adclosenn.top/_astro/cf-worker-proxy-editor-edited.W5GpThZO_1zBw0A.webp&quot; alt=&quot;cf-worker-proxy-editor-edited&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认无误后就点击右上角 &lt;strong&gt;部署&lt;/strong&gt; 按钮部署你的 Worker 代码。&lt;br /&gt;
显示 &lt;strong&gt;版本已保存&lt;/strong&gt; 说明部署成功。&lt;/p&gt;
&lt;p&gt;关于 &lt;strong&gt;域和路由-自定义域&lt;/strong&gt; 绑定自定义域名，这里不赘述了。&lt;/p&gt;
&lt;h2&gt;访问 Worker&lt;/h2&gt;
&lt;p&gt;如果是自定义域名，使用 &lt;code&gt;https://自定义域名/你的UUID&lt;/code&gt; 访问你的 Worker。&lt;br /&gt;
如果未绑定域名，点击 Worker Dashboard 的 &lt;strong&gt;访问&lt;/strong&gt; 按钮后在地址栏加入 &lt;code&gt;/你的UUID&lt;/code&gt; 回车进入后台。&lt;br /&gt;
在后台可以查看节点地址。&lt;/p&gt;
&lt;p&gt;如果你使用 V2rayN，可点击 &lt;strong&gt;点击复制链接&lt;/strong&gt;，然后 Ctrl+V 粘贴到 V2rayN 中。&lt;br /&gt;
为了追求速度、延迟、IP地区，可以使用优选后的 Cloudflare Anycast IP 地址。具体方法就是将 &lt;strong&gt;地址 (address)&lt;/strong&gt; 一行从 &lt;code&gt;www.visa.sg&lt;/code&gt; 改为 &lt;code&gt;cf.090227.xyz&lt;/code&gt;。这样IP的地区就会为&lt;strong&gt;新加坡&lt;/strong&gt;或&lt;strong&gt;日本&lt;/strong&gt;，而且真连接延迟会降低： &lt;img src=&quot;https://blog.adclosenn.top/_astro/v2rayn-cf-workers-proxy.0pbV4oiG_Z22tOjM.webp&quot; alt=&quot;v2rayn-cf-workers-proxy&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;编写 Clash 规则&lt;/h1&gt;
&lt;p&gt;:::tip[提示]
编写 Clash YAML 配置文件，应用分流规则。&lt;strong&gt;使用 V2rayN 代理工具的可以跳过了。&lt;/strong&gt;
:::&lt;/p&gt;
&lt;p&gt;如果你要使用优选IP，如 &lt;code&gt;cf.090227.xyz&lt;/code&gt;，需要先编辑一下 vless 链接：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vless://20a4537b-8da9-4bd4-b666-6e29a62345f7@www.visa.com.sg:8443?encryption=none&amp;amp;security=tls&amp;amp;type=ws&amp;amp;host=xxx.dpdns.org&amp;amp;sni=xxx.dpdns.org&amp;amp;fp=random&amp;amp;path=%2F%3Fed%3D2560#xxx.dpdns.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vless://20a4537b-8da9-4bd4-b666-6e29a62345f7@cf.090227.xyz:8443?encryption=none&amp;amp;security=tls&amp;amp;type=ws&amp;amp;host=xxx.dpdns.org&amp;amp;sni=xxx.dpdns.org&amp;amp;fp=random&amp;amp;path=%2F%3Fed%3D2560#xxx.dpdns.org
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后访问 https://sub.cmliussss.com 填上你的 Vless 单链接（如果优选请填改后的 Vless 单链接），然后点击 &lt;strong&gt;生成订阅链接&lt;/strong&gt;。之后导入生成好的链接进 Clash Verge 等客户端使用即可。&lt;/p&gt;
&lt;p&gt;如果你需要防止 DNS 泄露，这里有一些资料，但不保证一定能用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://linux.do/t/topic/155075&quot;&gt;【究极体！】真正防止 DNS 泄露的 Clash 小白式完美配置文件，安全+自由+流畅！ - 开发调优, Lv1 - LINUX DO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=50iVDmqzDW8&quot;&gt;【进阶•DNS代理篇】最完美的DNS解决方案？通过代理DNS请求获取正确的ip，杜绝DNS泄露和DNS污染，解决透明代理下fake-ip存在的问题，开启sniffing流量嗅探亦可解决污染问题 - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=fqREM6b25SY&quot;&gt;【进阶•DNS泄漏篇】竟能提速降延迟！再也不用担心DNS污染了！90%以上的人都存在DNS泄露！会有什么安全问题？如何解决代理中的DNS泄漏问题？以及WebRTC绕过代理泄漏本机真实IP，看完就知道了 - YouTube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过自己更改的防泄漏 DNS 配置，如果不是部署在直链环境下，就不要通过链接更新了，防止你的订阅链接将你更改的配置文件覆盖。推荐把更改后的配置文件上传到 Cloudflare R2 存储桶，然后获得一个公开的直链给 Clash 用。&lt;/p&gt;
</content:encoded></item><item><title>在 CF Workers 上运行 Discord 机器人</title><link>https://blog.adclosenn.top/posts/cloudflare-discord-bot/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/cloudflare-discord-bot/</guid><description>通过 Cloudflare Workers，你甚至可以运行一个 Discord 机器人，而且完全免费！</description><pubDate>Sat, 06 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;:::tip[提示]
&lt;s&gt;赛博菩萨&lt;/s&gt; Cloudflare Workers 不仅能运行 Discord 机器人，还能运行 Telegram 机器人。
:::&lt;/p&gt;
&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;众所周知，我们运行一个 Discord 机器人，可以通过 Python 第三方库 &lt;a href=&quot;https://pypi.org/project/discord.py/&quot;&gt;discord.py&lt;/a&gt; 来运行 Discord Bot。&lt;br /&gt;
这听起来需要一个能一直运行的 Linux/Windows 服务器。但其实我们还能利用 Cloudflare Workers 来运行自己的机器人，而且还&lt;strong&gt;大概率&lt;/strong&gt;不会被 Cloudflare 封号，因为 Discord 官方自己都放了&lt;a href=&quot;https://github.com/discord/cloudflare-sample-app&quot;&gt;样例&lt;/a&gt;：&lt;/p&gt;
&lt;p&gt;::github{repo=discord/cloudflare-sample-app}&lt;/p&gt;
&lt;h1&gt;需求&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;一个 &lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;Cloudflare&lt;/a&gt; 账号&lt;/li&gt;
&lt;li&gt;一个 &lt;a href=&quot;https://discord.com&quot;&gt;Discord&lt;/a&gt; 账号&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;（非必须）一个 &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; 账号&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;创建 Discord 机器人&lt;/h1&gt;
&lt;p&gt;登录好 Discord 账号后，打开 https://discord.com/developers/applications ，点击右上角的 &lt;strong&gt;New Application&lt;/strong&gt;，写下你 Bot 的名称，然后勾选协议，再点击蓝色按钮 &lt;strong&gt;Create&lt;/strong&gt;： &lt;img src=&quot;https://blog.adclosenn.top/_astro/discord-create-an-application.DaytAE4J_79xsd.webp&quot; alt=&quot;discord-create-an-application&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你&lt;a href=&quot;/posts/captcha/&quot;&gt;是人类&lt;/a&gt;，那么应该会顺利过完人机验证，创建一个新的 Discord Bot。在 &lt;strong&gt;General Information&lt;/strong&gt; 页中，你可以添加 Bot 的头像、横幅、介绍、昵称等信息。&lt;/p&gt;
&lt;h1&gt;获取 Discord 机器人相关信息&lt;/h1&gt;
&lt;p&gt;:::caution[警告]
请务必将以下信息放置于安全的地方，且不要泄露 Token。
:::&lt;/p&gt;
&lt;h2&gt;DISCORD_APPLICATION_ID&lt;/h2&gt;
&lt;p&gt;在默认页面 &lt;strong&gt;General Information&lt;/strong&gt; 中，找到 &lt;code&gt;Application ID&lt;/code&gt;，点击 &lt;strong&gt;Copy&lt;/strong&gt; 按钮，粘贴到安全的地方。&lt;/p&gt;
&lt;h2&gt;DISCORD_PUBLIC_KEY&lt;/h2&gt;
&lt;p&gt;在默认页面 &lt;strong&gt;General Information&lt;/strong&gt; 中，找到 &lt;code&gt;Public Key&lt;/code&gt;，点击 &lt;strong&gt;Copy&lt;/strong&gt; 按钮，粘贴到安全的地方。&lt;/p&gt;
&lt;h2&gt;DISCORD_TOKEN&lt;/h2&gt;
&lt;p&gt;在左侧选择 &lt;strong&gt;Bot&lt;/strong&gt;，在页面内点击 &lt;strong&gt;Reset Token&lt;/strong&gt; 按钮，将 Token 粘贴到安全的地方： &lt;img src=&quot;https://blog.adclosenn.top/_astro/discord-reset-token.qk5aIMSz_ZOsBLr.webp&quot; alt=&quot;discord-reset-token&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;配置 Discord 机器人设置&lt;/h1&gt;
&lt;p&gt;:::warning[注意]
这个方案会让&lt;strong&gt;所有人&lt;/strong&gt;都可以把你的机器人安装到他们的服务器。前提是你的服务器内要有别人。
:::
在左侧选择 &lt;strong&gt;Installation&lt;/strong&gt;，在下方 Guild Install 配置成如图所示的权限： &lt;img src=&quot;https://blog.adclosenn.top/_astro/discord-bot-installation-guild-install.CISgviGV_Z1sMuVL.webp&quot; alt=&quot;discord-bot-installation-guild-install&quot; /&gt;&lt;/p&gt;
&lt;p&gt;配置完毕后点击上方 Install Link 中，右侧的 &lt;strong&gt;Copy&lt;/strong&gt; 按钮，在浏览器内访问。&lt;br /&gt;
在接下来的页面中选择 &lt;strong&gt;添加至服务器&lt;/strong&gt;，然后选中一个服务器，点击 &lt;strong&gt;继续&lt;/strong&gt;，点击 &lt;strong&gt;授权&lt;/strong&gt;： &lt;img src=&quot;https://blog.adclosenn.top/_astro/discord-invite-bot.Dr6jebV-_23K6pg.webp&quot; alt=&quot;discord-invite-bot&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当你的机器人出现在你所选的服务器中，那么代表你成功了。&lt;/p&gt;
&lt;h1&gt;配置 Cloudflare Worker&lt;/h1&gt;
&lt;p&gt;:::note[笔记]
这里以 &lt;a href=&quot;https://developers.cloudflare.com/workers/get-started/guide/&quot;&gt;Cloudflare Wrangler&lt;/a&gt; 操作 Worker 文件。如果需要上传到 GitHub，并用 Actions 提交 Worker 文件，请参考 &lt;a href=&quot;https://discord.com/developers/docs/tutorials/hosting-on-cloudflare-workers#deployment&quot;&gt;Deployment - Hosting a Reddit API Discord app on Cloudflare Workers&lt;/a&gt; 。
:::&lt;/p&gt;
&lt;p&gt;点击链接下载最新的官方样例代码库： &lt;a href=&quot;https://github.com/discord/cloudflare-sample-app/archive/refs/heads/main.zip&quot;&gt;https://github.com/discord/cloudflare-sample-app/archive/refs/heads/main.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;解压这个 &lt;code&gt;.zip&lt;/code&gt; 压缩包到一个地方，然后安装依赖：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果能用 &lt;code&gt;npx wrangler&lt;/code&gt;，那就说明安装成功了： &lt;img src=&quot;https://blog.adclosenn.top/_astro/windows-terminal-pnpm-install-discord-bot-successful.D1P0p9u8_2feEOi.webp&quot; alt=&quot;windows-terminal-pnpm-install-discord-bot-successful&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在文件夹根目录下有一个文件 &lt;code&gt;wrangler.toml&lt;/code&gt;，打开它可以编辑你的 Worker 名字：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name = &quot;awwbot&quot; &amp;lt;- 更改这个即可更改 Worker 的名字（不是更改 Discord 机器人的名字）
main = &quot;./src/server.js&quot;
compatibility_date=&quot;2023-05-18&quot;

# [secrets]
# DISCORD_TOKEN
# DISCORD_PUBLIC_KEY
# DISCORD_APPLICATION_ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，我们需要将 Bot 的机密信息上传到 Cloudflare。
依次执行以下三个命令，值为之前在 &lt;a href=&quot;#%E8%8E%B7%E5%8F%96-discord-%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%9B%B8%E5%85%B3%E4%BF%A1%E6%81%AF&quot;&gt;#获取 Discord 机器人相关信息&lt;/a&gt; 获取的三个信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npx wrangler secret put DISCORD_APPLICATION_ID

npx wrangler secret put DISCORD_PUBLIC_KEY

npx wrangler secret put DISCORD_TOKEN
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你没有创建这个 Worker，Wrangler 会让你选择&lt;strong&gt;是否创建名为xxx的 Worker&lt;/strong&gt;，这时输入y即可。&lt;/p&gt;
&lt;p&gt;当三个密钥上传成功后，Worker 设置应该是如图所示的： &lt;img src=&quot;https://blog.adclosenn.top/_astro/cloudflare-worker-discord-bot-vars-and-secrets.Db3jQare_Z2oTU56.webp&quot; alt=&quot;cloudflare-worker-discord-bot-vars-and-secrets&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不过，目前只上传了机密，并没有上传 Worker 主文件。所以会显示 &quot;&lt;strong&gt;There is nothing here yet&lt;/strong&gt;&quot;。&lt;br /&gt;
在终端输入以下命令可将本地 Worker 文件上传到 Cloudflare Workers：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm run publish
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正确的结果应为如下&lt;strong&gt;类似&lt;/strong&gt;输出，&lt;code&gt;WARNING&lt;/code&gt; 可以不用理：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; ⛅️ wrangler 4.34.0
───────────────────
Total Upload: 23.34 KiB / gzip: 6.27 KiB
Worker Startup Time: 2 ms
Uploaded awwbot-testerererer (7.46 sec)
▲ [WARNING] Worker has workers.dev disabled, but &apos;workers_dev&apos; is not in the config.

  Using fallback value &apos;workers_dev = true&apos;.


Deployed awwbot-testerererer triggers (5.40 sec)
  https://awwbot-testerererer.1709301095.workers.dev
Current Version ID: bbc5f582-58a9-4e30-94e1-d2a14952efa0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时再访问 Worker，会出现类似 &lt;code&gt;👋 1413847154543427594&lt;/code&gt; 的输出。这就说明 &lt;strong&gt;Worker 配置成功了&lt;/strong&gt;。&lt;/p&gt;
&lt;h1&gt;其他配置&lt;/h1&gt;
&lt;p&gt;除此之外，还需要配置 Discord 的 Endpoint URL，将 Discord 和 Cloudflare Worker 打通：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;回到 Discord Developer，选择你的机器人。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;General Information&lt;/strong&gt; 中，找到 &lt;strong&gt;Interactions Endpoint URL&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;将&lt;strong&gt;你部署的 Cloudflare Worker 的链接&lt;/strong&gt;填进去，如图所示（实际请替换为自己的）： &lt;img src=&quot;https://blog.adclosenn.top/_astro/discord-interactions-endpoint-url.BQW9e3zI_ZJtlny.webp&quot; alt=&quot;discord-interactions-endpoint-url&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Save Changes&lt;/strong&gt; 按钮，保存更改。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;还有还有，你还需要向 Discord 注册机器人的命令。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;回到文件夹根目录，把 &lt;code&gt;example.dev.vars&lt;/code&gt; 重命名为 &lt;code&gt;.dev.vars&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;打开这个文件，填入之前获取的三个信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;DISCORD_APPLICATION_ID: &quot;..&quot;
DISCORD_PUBLIC_KEY: &quot;..&quot;
DISCORD_TOKEN: &quot;.. &amp;lt;- 记得补上这个缺失的引号！这是 Discord 官方漏的
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;https://github.com/discord/cloudflare-sample-app/blob/main/example.dev.vars#L3&lt;br /&gt;
:::caution[警告：别怪我没提醒你]
这个文件 &lt;code&gt;.dev.vars&lt;/code&gt; 请勿上传至 GitHub 的&lt;strong&gt;公开&lt;/strong&gt;存储库，否则会面临 TOKEN 泄露的风险！
:::
3. 保存那个文件，然后在终端输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm run register
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;当出现 &lt;code&gt;Registered all commands&lt;/code&gt; 时代表注册命令成功。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;回到 Discord，乱点一下你的机器人，比如添加 APP 然后添加到自己什么的，或者发送一条消息给它，总之触发了 &lt;strong&gt;{/}&lt;/strong&gt; 这个代表成功了：&lt;img src=&quot;https://blog.adclosenn.top/_astro/discord-bot-supports-commands.BRs162V5_19YtrJ.webp&quot; alt=&quot;discord-bot-supports-commands&quot; /&gt;&lt;/p&gt;
&lt;p&gt;可能会显示离线，但是如果命令能用就代表能用了。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/discord-bot-channel-cln-bot-test.DT-Ncq1Z_Z1Fp0j7.webp&quot; alt=&quot;discord-bot-channel-cln-bot-test&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;关于今后...&lt;/h1&gt;
&lt;p&gt;关于配置更多的命令，&lt;code&gt;.src/&lt;/code&gt;中的 &lt;code&gt;commands.js&lt;/code&gt; &lt;code&gt;register.js&lt;/code&gt; &lt;code&gt;server.js&lt;/code&gt; 是重要的，不会配置的问 AI 就好了。这就纯纯复制粘贴和 AI。&lt;/p&gt;
</content:encoded></item><item><title>为 Astro 加上在新标签页打开链接的功能</title><link>https://blog.adclosenn.top/posts/newtab_link/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/newtab_link/</guid><description>原版 Astro（包括 Fuwari） 中，打开外部链接是在当前页面打开，而非在新标签页打开。这个插件完美适配了这个需求，让我们的链接可以在新的标签页打开。</description><pubDate>Sun, 31 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;看标题可能不明白在说什么。但是如果我放出这两个链接让你点，你应该知道是什么意思。&lt;/p&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://www.bing.com&quot;&amp;gt;打开必应&amp;lt;/a&amp;gt;   |   &amp;lt;a href=&quot;https://www.bing.com&quot; target=&quot;_blank&quot;&amp;gt;在新标签页打开必应&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;可以看到，第一个按钮是在&lt;strong&gt;当前页面&lt;/strong&gt;打开必应，而第二个是在&lt;strong&gt;新标签页&lt;/strong&gt;打开必应。如果你用的是手机，那这两种在外观上看不出很大的区别（手机版 Chrome 点击第二个按钮会表现为右上角的标签页个数+1）。但是如果你用的是电脑浏览器，那就很容易看出区别了： &lt;img src=&quot;https://blog.adclosenn.top/_astro/chrome-newtab-blogbing.CWKZ_2HI_Z1k5vKH.webp&quot; alt=&quot;chrome-newtab-blogbing&quot; /&gt;&lt;br /&gt;
浏览器开了一个新标签页用于访问必应，这就是我们想要的，因为 Astro 的打开行为是第一个按钮（在本页打开）。下面是这两个按钮的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;https://www.bing.com&quot;&amp;gt;打开必应&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a href=&quot;https://www.bing.com&quot; target=&quot;_blank&quot;&amp;gt;在新标签页打开必应&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;仔细观察，会发现第二个按钮的代码多了一个 `target=&quot;_blank&quot;。这个就是控制这个链接的打开方式，如果不写 target 就是默认为当前页面打开，&lt;strong&gt;Astro 就是这样&lt;/strong&gt;。 &lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/a#target&quot;&gt;&amp;lt;a&amp;gt;：锚元素#target - MDN - Mozilla&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设想一下，看的教程需要我们打开一个链接操作，但是点了之后，链接就立马在本页打开，教程就被那个链接的新页面覆盖，看不到了。那这时候你要么鼠标中键开链接（快速用新标签页打开链接），要么右键开。不过，还是挺麻烦的吧。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以我们需要：&lt;strong&gt;让我们的链接通过新标签页打开，而非在当前页面打开&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当然，你自己在文章里写 &lt;code&gt;&amp;lt;a href=&quot;https://xxx.com&quot; target=&quot;_blank&quot;&amp;gt;xxx&amp;lt;/a&amp;gt;&lt;/code&gt; 也是一样的效果，但谁又会有这么多时间去写这么一长串的a元素呢？&lt;/p&gt;
&lt;h1&gt;使用插件 rehype-external-links&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;rehypejs/rehype-external-links&quot;}&lt;/p&gt;
&lt;p&gt;:::note[笔记]
即使这个插件的官方 npm 文档 &lt;a href=&quot;https://www.npmjs.com/package/rehype-external-links?activeTab=readme#when-should-i-use-this&quot;&gt;When should I use this?&lt;/a&gt; 中描述的样例和我们的需求有着天壤之别，但没关系，它的功能已经包含了我们需要的东西。
:::&lt;/p&gt;
&lt;h2&gt;安装插件&lt;/h2&gt;
&lt;p&gt;假如你的项目使用的包管理器是 pnpm，那就用 pnpm 的命令安装。npm 同理。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm i rehype-external-links
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;npm i rehype-external-links
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装成功后你的 &lt;code&gt;package.json&lt;/code&gt; 中会新增一个类似于 &lt;code&gt;&quot;rehype-external-links&quot;: &quot;^3.0.0&quot;,&lt;/code&gt; 的行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &quot;rehype-components&quot;: &quot;^0.3.0&quot;,
    &quot;rehype-external-links&quot;: &quot;^3.0.0&quot;,
    &quot;rehype-katex&quot;: &quot;^7.0.1&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置插件&lt;/h2&gt;
&lt;p&gt;在根目录的 &lt;code&gt;astro.config.mjs&lt;/code&gt; 文件内加入以下&lt;strong&gt;5行&lt;/strong&gt;代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import sitemap from &quot;@astrojs/sitemap&quot;;
import svelte from &quot;@astrojs/svelte&quot;;
import tailwind from &quot;@astrojs/tailwind&quot;;
import { pluginCollapsibleSections } from &quot;@expressive-code/plugin-collapsible-sections&quot;;
import { pluginLineNumbers } from &quot;@expressive-code/plugin-line-numbers&quot;;
import swup from &quot;@swup/astro&quot;;
import expressiveCode from &quot;astro-expressive-code&quot;;
import icon from &quot;astro-icon&quot;;
import { defineConfig } from &quot;astro/config&quot;;
import rehypeAutolinkHeadings from &quot;rehype-autolink-headings&quot;;
import rehypeComponents from &quot;rehype-components&quot;; /* Render the custom directive content */
import rehypeKatex from &quot;rehype-katex&quot;;
import rehypeSlug from &quot;rehype-slug&quot;;
import remarkDirective from &quot;remark-directive&quot;; /* Handle directives */
import remarkGithubAdmonitionsToDirectives from &quot;remark-github-admonitions-to-directives&quot;;
import remarkMath from &quot;remark-math&quot;;
import remarkSectionize from &quot;remark-sectionize&quot;;
import { expressiveCodeConfig } from &quot;./src/config.ts&quot;;
import { pluginLanguageBadge } from &quot;./src/plugins/expressive-code/language-badge.ts&quot;;
import { AdmonitionComponent } from &quot;./src/plugins/rehype-component-admonition.mjs&quot;;
import { GithubCardComponent } from &quot;./src/plugins/rehype-component-github-card.mjs&quot;;
import { parseDirectiveNode } from &quot;./src/plugins/remark-directive-rehype.js&quot;;
import { remarkExcerpt } from &quot;./src/plugins/remark-excerpt.js&quot;;
import { remarkReadingTime } from &quot;./src/plugins/remark-reading-time.mjs&quot;;
import { pluginCustomCopyButton } from &quot;./src/plugins/expressive-code/custom-copy-button.js&quot;;
import rehypeExternalLinks from &apos;rehype-external-links&apos;;

// https://astro.build/config
export default defineConfig({
	site: &quot;https://adclosenn.top&quot;,
	base: &quot;/&quot;,
	trailingSlash: &quot;always&quot;,
	integrations: [
		tailwind({
			nesting: true,
		}),
		swup({
			theme: false,
			animationClass: &quot;transition-swup-&quot;, // see https://swup.js.org/options/#animationselector
			// the default value `transition-` cause transition delay
			// when the Tailwind class `transition-all` is used
			containers: [&quot;main&quot;, &quot;#toc&quot;],
			smoothScrolling: true,
			cache: true,
			preload: true,
			accessibility: true,
			updateHead: true,
			updateBodyClass: false,
			globalInstance: true,
		}),
		icon({
			include: {
				&quot;preprocess: vitePreprocess(),&quot;: [&quot;*&quot;],
				&quot;fa6-brands&quot;: [&quot;*&quot;],
				&quot;fa6-regular&quot;: [&quot;*&quot;],
				&quot;fa6-solid&quot;: [&quot;*&quot;],
			},
		}),
		expressiveCode({
			themes: [expressiveCodeConfig.theme, expressiveCodeConfig.theme],
			plugins: [
				pluginCollapsibleSections(),
				pluginLineNumbers(),
				pluginLanguageBadge(),
				pluginCustomCopyButton()
			],
			defaultProps: {
				wrap: true,
				overridesByLang: {
					&apos;shellsession&apos;: {
						showLineNumbers: false,
					},
				},
			},
			styleOverrides: {
				codeBackground: &quot;var(--codeblock-bg)&quot;,
				borderRadius: &quot;0.75rem&quot;,
				borderColor: &quot;none&quot;,
				codeFontSize: &quot;0.875rem&quot;,
				codeFontFamily: &quot;&apos;Cascadia Mono&apos;, &apos;JetBrains Mono&apos;&quot;,
				codeLineHeight: &quot;1.5rem&quot;,
				frames: {
					editorBackground: &quot;var(--codeblock-bg)&quot;,
					terminalBackground: &quot;var(--codeblock-bg)&quot;,
					terminalTitlebarBackground: &quot;var(--codeblock-topbar-bg)&quot;,
					editorTabBarBackground: &quot;var(--codeblock-topbar-bg)&quot;,
					editorActiveTabBackground: &quot;none&quot;,
					editorActiveTabIndicatorBottomColor: &quot;var(--primary)&quot;,
					editorActiveTabIndicatorTopColor: &quot;none&quot;,
					editorTabBarBorderBottomColor: &quot;var(--codeblock-topbar-bg)&quot;,
					terminalTitlebarBorderBottomColor: &quot;none&quot;
				},
				textMarkers: {
					delHue: 0,
					insHue: 180,
					markHue: 250
				}
			},
			frames: {
				showCopyToClipboardButton: false,
			}
		}),
        svelte(),
		sitemap(),
	],
	markdown: {
		remarkPlugins: [
			remarkMath,
			remarkReadingTime,
			remarkExcerpt,
			remarkGithubAdmonitionsToDirectives,
			remarkDirective,
			remarkSectionize,
			parseDirectiveNode,
		],
		rehypePlugins: [
			rehypeKatex,
			rehypeSlug,
			[
				rehypeComponents,
				{
					components: {
						github: GithubCardComponent,
						note: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;note&quot;),
						tip: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;tip&quot;),
						important: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;important&quot;),
						caution: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;caution&quot;),
						warning: (x, y) =&amp;gt; AdmonitionComponent(x, y, &quot;warning&quot;),
					},
				},
			],
			[
				rehypeExternalLinks,
				{
				target: &apos;_blank&apos;,
				},
			],
			[
				rehypeAutolinkHeadings,
				{
					behavior: &quot;append&quot;,
					properties: {
						className: [&quot;anchor&quot;],
					},
					content: {
						type: &quot;element&quot;,
						tagName: &quot;span&quot;,
						properties: {
							className: [&quot;anchor-icon&quot;],
							&quot;data-pagefind-ignore&quot;: true,
						},
						children: [
							{
								type: &quot;text&quot;,
								value: &quot;#&quot;,
							},
						],
					},
				},
			],
		],
	},
	vite: {
		build: {
			rollupOptions: {
				onwarn(warning, warn) {
					// temporarily suppress this warning
					if (
						warning.message.includes(&quot;is dynamically imported by&quot;) &amp;amp;&amp;amp;
						warning.message.includes(&quot;but also statically imported by&quot;)
					) {
						return;
					}
					warn(warning);
				},
			},
		},
	},
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，插件的配置就完成了。随便找个&lt;strong&gt;文章内链接&lt;/strong&gt;点击，应该会在&lt;strong&gt;新标签页&lt;/strong&gt;打开，而非原来的在当页打开。&lt;/p&gt;
</content:encoded></item><item><title>将 Giscus 评论插件添加到博客</title><link>https://blog.adclosenn.top/posts/giscus/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/giscus/</guid><description>博客没有评论区？来试试 Giscus 吧！</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;如果你的静态博客没有评论区，又不想自己搭建一个评论系统，那么 Giscus 就是一个不错的选择。&lt;br /&gt;
接下来就手把手教你添加这个&lt;a href=&quot;https://giscus.app/client.js&quot;&gt;插&lt;/a&gt;件并配置它。&lt;/p&gt;
&lt;p&gt;:::warning[注意]
接下来的教程将以 Astro 网站为例子。由于 Giscus 使用 JavaScript 脚本，所以大多数博客网站都能顺利接入。&lt;br /&gt;
如果你用的博客是 &lt;a href=&quot;https://astro.build&quot;&gt;Astro&lt;/a&gt; 或以它为架构的 &lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt;，那么这篇文章或许 99% 适合。
:::&lt;/p&gt;
&lt;h1&gt;需求&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;一个 &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; 账号。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;配置 Giscus&lt;/h1&gt;
&lt;h2&gt;在博客仓库存放评论&lt;/h2&gt;
&lt;p&gt;:::warning[注意]
如果你博客是&lt;strong&gt;开源的&lt;/strong&gt;（选择这种方法&lt;strong&gt;必须&lt;/strong&gt;要开源！如果&lt;strong&gt;不想开源&lt;/strong&gt;可以选择存放评论于 &lt;a href=&quot;#%E5%9C%A8%E4%B8%93%E7%94%A8%E4%BB%93%E5%BA%93%E5%AD%98%E6%94%BE%E8%AF%84%E8%AE%BA&quot;&gt;#在专用仓库存放评论&lt;/a&gt; ），那么我更推荐你直接跟下面这个步骤配置使用前的安装，这么做是为了&lt;strong&gt;更好地集中管理关于博客的东西&lt;/strong&gt;。&lt;br /&gt;
当然，如果你想分开来存放，把&lt;strong&gt;博客源代码&lt;/strong&gt;和&lt;strong&gt;评论区的内容&lt;/strong&gt;分开，那么请选择使用第二种方法，然后这里的内容可以不用看了，可以前往 &lt;a href=&quot;#%E5%9C%A8%E4%B8%93%E7%94%A8%E4%BB%93%E5%BA%93%E5%AD%98%E6%94%BE%E8%AF%84%E8%AE%BA&quot;&gt;#在专用仓库存放评论&lt;/a&gt; 查看对应的方法。
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 GitHub 上你博客的仓库地址，点击顶部 &lt;strong&gt;Settings&lt;/strong&gt;（设置），拉到 &lt;strong&gt;Features&lt;/strong&gt;（功能），选择 &lt;strong&gt;Discussions&lt;/strong&gt; 前面的小方格，点击一下，打开 Discussions 功能。等到出现一个小勾即代表开启了 Discussions 讨论功能。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/github-settings-features-discussions.gQzwQXXs_Z2fe9ke.webp&quot; alt=&quot;github-settings-features-discussions&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击打开 https://github.com/apps/giscus ，选择带色按钮 Install ，将其安装在你的 GitHub 个人账户中（如果你博客仓库在别的组织，请选择安装到&lt;strong&gt;组织&lt;/strong&gt;）。&lt;/li&gt;
&lt;li&gt;安装完毕，可以跳到 &lt;a href=&quot;#%E8%8E%B7%E5%8F%96%E4%B8%93%E7%94%A8%E4%BB%A3%E7%A0%81&quot;&gt;#获取专用代码&lt;/a&gt; 查看需要插入的 JS 代码了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;在专用仓库存放评论&lt;/h2&gt;
&lt;p&gt;:::tip[提示]
这是个通用的方法，你依然可以将其设置为你博客评论存放的仓库，即使你的博客是开源的；但是如果你的博客不开源，那么请务必使用这个方法。&lt;br /&gt;
注意：使用这种方法并不能&lt;strong&gt;更好地集中管理关于博客的东西&lt;/strong&gt;，但是能防止某些脑残人物的评论污染了你的主仓库。
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 https://github.com/new ，创建一个新的仓库。&lt;/li&gt;
&lt;li&gt;在新仓库内，点击顶部 &lt;strong&gt;Settings&lt;/strong&gt;（设置），拉到 &lt;strong&gt;Features&lt;/strong&gt;（功能），选择 &lt;strong&gt;Discussions&lt;/strong&gt; 前面的小方格，点击一下，打开 Discussions 功能。等到出现一个小勾即代表开启了 Discussions 讨论功能。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/github-settings-features-discussions.gQzwQXXs_Z2fe9ke.webp&quot; alt=&quot;github-settings-features-discussions&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击打开 https://github.com/apps/giscus ，选择带色按钮 Install ，将其安装在你的 GitHub 个人账户中（如果你博客仓库在别的组织，请选择安装到&lt;strong&gt;组织&lt;/strong&gt;）。&lt;/li&gt;
&lt;li&gt;安装完毕。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;获取专用代码&lt;/h2&gt;
&lt;p&gt;打开 https://giscus.app/zh-CN ，在其页面进行必要的配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语言：如果你的博客不搞 i18n 国际化，那我推荐选择 &lt;strong&gt;简体中文&lt;/strong&gt;（博客使用的语言）。反之推荐选择 &lt;strong&gt;English&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;仓库：如果你选择上面第一种方案（在博客仓库内），那么就填写&lt;strong&gt;你博客仓库地址&lt;/strong&gt;（以 &lt;code&gt;用户名/仓库名&lt;/code&gt; 形式填写，填你自己的。比如 &lt;code&gt;Ad-closeNN/blog-fuwari&lt;/code&gt;）。如果是新的专用仓库，那么就填写&lt;strong&gt;新的专用仓库地址&lt;/strong&gt;，格式同理。成功了为如图所示： &lt;img src=&quot;https://blog.adclosenn.top/_astro/giscus-repo-successful.BjdmaWFV_ZJkbQf.webp&quot; alt=&quot;giscus-repo-successful&quot; /&gt;&lt;/li&gt;
&lt;li&gt;页面 ↔️ discussion 映射关系：这个有说法。如果你博客没有很多重复标题的页面，&lt;strong&gt;且不更换文章标题&lt;/strong&gt;，推荐选择 &lt;strong&gt;Discussion 的标题包含页面的 &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;&lt;/strong&gt;，这将会以 &lt;code&gt;页面标题 -或/或其他分隔符 网站名&lt;/code&gt; 为 title 开一个新讨论。如： &lt;img src=&quot;https://blog.adclosenn.top/_astro/github-giscus-conversation.DaJHHXWe_Z1XDlvo.webp&quot; alt=&quot;github-giscus-conversation&quot; /&gt; 其他如 &lt;code&gt;pathname&lt;/code&gt;，将会把 &lt;code&gt;/post/xxx&lt;/code&gt; 显示出来。但是显示效果（特别是中文路径）可能没那么好？&lt;br /&gt;
参考&amp;amp;图片原出处： https://www.2x.nz/posts/you-is-me-huh/ &lt;img src=&quot;https://www.2x.nz/assets/images/2025-08-12-15-45-18-image.png&quot; alt=&quot;image.png&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Discussion 分类：推荐选择 &lt;strong&gt;General&lt;/strong&gt;。如果你只想让访客在博客发布评论，就选择 &lt;strong&gt;Announcements&lt;/strong&gt;。这样即使能在 GitHub 看到评论，也无法直接在 GitHub 回复，必须在博客的评论区内回复。没啥用，不如 *&lt;em&gt;General&lt;/em&gt;。&lt;/li&gt;
&lt;li&gt;特性：推荐启用 &lt;code&gt;启用主帖子上的反应（reaction）&lt;/code&gt; &lt;code&gt;将评论框放在评论上方&lt;/code&gt; &lt;code&gt;懒加载评论&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;其他无关紧要的请自行配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置完成后，将会获得一串&lt;strong&gt;独特的&lt;/strong&gt; JavaScript 代码（例如下面的）。将其复制下来：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;https://giscus.app/client.js&quot;
        data-repo=&quot;Ad-closeNN/blog-friends&quot;
        data-repo-id=&quot;R_kgDOPb5ZJw&quot;
        data-category=&quot;Announcements&quot;
        data-category-id=&quot;DIC_kwDOPb5ZJ84CuPmR&quot;
        data-mapping=&quot;title&quot;
        data-strict=&quot;0&quot;
        data-reactions-enabled=&quot;1&quot;
        data-emit-metadata=&quot;0&quot;
        data-input-position=&quot;top&quot;
        data-theme=&quot;preferred_color_scheme&quot;
        data-lang=&quot;zh-CN&quot;
        data-loading=&quot;lazy&quot;
        crossorigin=&quot;anonymous&quot;
        async&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;插入代码&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;src/pages/posts/[..slug].astro&lt;/code&gt;，在最下方的 &lt;code&gt;&amp;lt;/MainGridLayout&amp;gt;&lt;/code&gt; 的上面插入你在 Giscus 复制的 JavaScript 代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        &amp;lt;a href={entry.data.prevSlug ? getPostUrlBySlug(entry.data.prevSlug) : &quot;#&quot;}
           class:list={[&quot;w-full font-bold overflow-hidden active:scale-95&quot;, {&quot;pointer-events-none&quot;: !entry.data.prevSlug}]}&amp;gt;
            {entry.data.prevSlug &amp;amp;&amp;amp; &amp;lt;div class=&quot;btn-card rounded-2xl w-full h-[3.75rem] max-w-full px-4 flex items-center !justify-end gap-4&quot;&amp;gt;
                &amp;lt;div class=&quot;overflow-hidden transition overflow-ellipsis whitespace-nowrap max-w-[calc(100%_-_3rem)] text-black/75 dark:text-white/75&quot;&amp;gt;
                    {entry.data.prevTitle}
                &amp;lt;/div&amp;gt;
                &amp;lt;Icon name=&quot;material-symbols:chevron-right-rounded&quot; class=&quot;text-[2rem] text-[var(--primary)]&quot; /&amp;gt;
            &amp;lt;/div&amp;gt;}
        &amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;
    
    &amp;lt;!-- 上面是你的其他原本的代码 --&amp;gt;
    &amp;lt;!-- 评论区在这 --&amp;gt;
    &amp;lt;script src=&quot;https://giscus.app/client.js&quot;
            data-repo=&quot;Ad-closeNN/blog-friends&quot;
            data-repo-id=&quot;R_kgDOPb5ZJw&quot;
            data-category=&quot;General&quot;
            data-category-id=&quot;DIC_kwDOPb5ZJ84CuPmR&quot;
            data-mapping=&quot;title&quot;
            data-strict=&quot;0&quot;
            data-reactions-enabled=&quot;1&quot;
            data-emit-metadata=&quot;0&quot;
            data-input-position=&quot;top&quot;
            data-theme=&quot;preferred_color_scheme&quot;
            data-lang=&quot;zh-CN&quot;
            data-loading=&quot;lazy&quot;
            crossorigin=&quot;anonymous&quot;
            async&amp;gt;
    &amp;lt;/script&amp;gt;
&amp;lt;/MainGridLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;放在这个文件 &lt;code&gt;src/posts/[..slug].astro&lt;/code&gt; 内，仅仅只有 /posts/ 下的文章拥有评论区。&lt;br /&gt;
如果你需要在特定的页面（比如 /about/ ）中使用 Giscus，仅需打开和 Markdown 同名的文件（如 /about/ 的 Markdown 文件是 &lt;code&gt;about.md&lt;/code&gt;）如 &lt;code&gt;src/pages/about.astro&lt;/code&gt;，用刚才的方法插入 Giscus 代码即可&lt;strong&gt;实现特定页面拥有 Giscus 评论区&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--- 
import { getEntry, render } from &quot;astro:content&quot;;
import Markdown from &quot;@components/misc/Markdown.astro&quot;;
import I18nKey from &quot;../i18n/i18nKey&quot;;
import { i18n } from &quot;../i18n/translation&quot;;
import MainGridLayout from &quot;../layouts/MainGridLayout.astro&quot;;

const aboutPost = await getEntry(&quot;spec&quot;, &quot;about&quot;);

if (!aboutPost) {
	throw new Error(&quot;About page content not found&quot;);
}

const { Content } = await render(aboutPost);
---
&amp;lt;MainGridLayout title={i18n(I18nKey.about)} description=&quot;关于&quot;&amp;gt;
    &amp;lt;div class=&quot;flex w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32&quot;&amp;gt;
        &amp;lt;div class=&quot;card-base z-10 px-9 py-6 relative w-full &quot;&amp;gt;
            &amp;lt;Markdown class=&quot;mt-2&quot;&amp;gt;
                &amp;lt;Content /&amp;gt;
            &amp;lt;/Markdown&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;br&amp;gt;
    &amp;lt;!-- 评论区 --&amp;gt;
    &amp;lt;script src=&quot;https://giscus.app/client.js&quot;
        data-repo=&quot;Ad-closeNN/blog-friends&quot;
        data-repo-id=&quot;R_kgDOPb5ZJw&quot;
        data-category=&quot;General&quot;
        data-category-id=&quot;DIC_kwDOPb5ZJ84CuPmR&quot;
        data-mapping=&quot;title&quot;
        data-strict=&quot;0&quot;
        data-reactions-enabled=&quot;1&quot;
        data-emit-metadata=&quot;0&quot;
        data-input-position=&quot;top&quot;
        data-theme=&quot;preferred_color_scheme&quot;
        data-lang=&quot;zh-CN&quot;
        data-loading=&quot;lazy&quot;
        crossorigin=&quot;anonymous&quot;
        async&amp;gt;
&amp;lt;/script&amp;gt;
&amp;lt;/MainGridLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置网站源 Origin&lt;/h2&gt;
&lt;p&gt;参考：https://github.com/giscus/giscus/blob/main/ADVANCED-USAGE.md#origins&lt;/p&gt;
&lt;p&gt;如果你的博客是开源的，那么有些人可能会直接 Fork 你的博客仓库，转为自己用。&lt;br /&gt;
这时候如果那人不会配置评论区，那么有意思的来了，他发的评论会&lt;strong&gt;直接到达你 Giscus 配置的仓库&lt;/strong&gt;，而不是在他仓库。&lt;/p&gt;
&lt;p&gt;所以我们可以配置一个 &lt;code&gt;giscus.json&lt;/code&gt; 在你 &lt;strong&gt;Giscus 设置的仓库&lt;/strong&gt; 的根目录（如我在上面 &lt;a href=&quot;#%E5%9C%A8%E4%B8%93%E7%94%A8%E4%BB%93%E5%BA%93%E5%AD%98%E6%94%BE%E8%AF%84%E8%AE%BA&quot;&gt;#在专用仓库存放评论&lt;/a&gt; 中设定了仓库为 &lt;code&gt;Ad-closeNN/blog-friends&lt;/code&gt;，那就去到这个仓库），新建一个文件 &lt;code&gt;giscus.json&lt;/code&gt;，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;origins&quot;: [&quot;https://adclosenn.top&quot;] // 这个域名填你自己的
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning[注意]
&lt;code&gt;origins&lt;/code&gt; 里面&lt;strong&gt;不推荐&lt;/strong&gt;填写 localhost 等本地地址，这样会导致别人把博客 Fork 在本地&lt;strong&gt;依然能发表评论&lt;/strong&gt;到你仓库。
如果你确认这个风险，那么可以直接填 &lt;code&gt;本地地址&lt;/code&gt; + &lt;code&gt;端口&lt;/code&gt;，比如 Astro 的本地地址为 &lt;code&gt;localhost&lt;/code&gt;，端口为 &lt;code&gt;4321&lt;/code&gt;，那么填写 &lt;code&gt;http://localhost:4321&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;origins&quot;: [&quot;https://adclosenn.top&quot;, &quot;http://localhost:4321&quot;]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;配置好后，本地开发环境(localhost) 和除你设定之外的域名将会直接被 Giscus 切断评论区的连接： &lt;img src=&quot;https://blog.adclosenn.top/_astro/chrome-github-deny-connection.TY0jaOGc_1C0w6q.webp&quot; alt=&quot;chrome-github-deny-connection&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;反垃圾评论&lt;/h1&gt;
&lt;p&gt;一般来说不会有人无缘无故就对你的文章评论区发布&lt;strong&gt;脑残&lt;/strong&gt;、&lt;strong&gt;降智&lt;/strong&gt;、&lt;strong&gt;虚假&lt;/strong&gt;的评论，因为 Giscus 的评论需要通过 GitHub 授权登录才能发布，所以这算是一个初级发布门槛。&lt;/p&gt;
&lt;p&gt;如果真的有，那么确实很不幸了。你可以通过&lt;strong&gt;删评论&lt;/strong&gt;的方法解决。&lt;br /&gt;
也可以通过 &lt;a href=&quot;https://www.2x.nz/posts/giscus-akismet#pei-zhi-akismet&quot;&gt;配置 Akismet&lt;/a&gt; 等来实现自动化反垃圾评论。但是 Akismet 的效果据说十分鸡肋。&lt;/p&gt;
</content:encoded></item><item><title>恢复 Chrome 对 Manifest V2 的支持</title><link>https://blog.adclosenn.top/posts/chrome-manifestv2-block/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/chrome-manifestv2-block/</guid><description>2025 年 7 月 24 日：Chrome 会在所有位置停用 Manifest V2 扩展，所以某些扩展要怎么恢复？</description><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;:::tip[提示]
本文「扩展」=「扩展程序」= 「插件」。&lt;br /&gt;
参考：https://blog.hentioe.dev/posts/continue-using-chrome-manifest-v2.html
:::&lt;/p&gt;
&lt;p&gt;今天打开电脑，发现 Chrome 它阻止了一个扩展（如上图）。
查了一下，发现是 Google Chrome 已经永久停止了对 Manifest V2 扩展的支持，而且是已经计划了近4年的项目。在 2025年7月终于要落下帷幕&lt;strong&gt;了&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn#january_2022_chrome_web_store_-_no_new_public_unlisted_extensions&quot;&gt;2022 年 1 月：Chrome 应用商店停止接受新的 Manifest V2 扩展程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn#june_2022_chrome_web_store_-_no_new_private_extensions&quot;&gt;2022 年 6 月：Chrome 应用商店已停止接受将公开范围设置为“专用”的新 Manifest V2 扩展程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn#june_3rd_2024_the_manifest_v2_phase-out_begins&quot;&gt;2024 年 6 月 3 日：Chrome 开始逐步淘汰 Manifest V2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn#october_9th_2024_an_update_on_manifest_v2_phase-out&quot;&gt;2024 年 10 月 9 日：Chrome 扩展页面会向使用 Manifest V2 扩展程序的所有用户显示警告横幅&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn#march_31st_2025_manifest_v2_is_disabled_with_the_option_to_re-enable_extensions&quot;&gt;2025 年 3 月 31 日：停用 Manifest V2，但仍可以选择重新启用扩展程序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline?hl=zh-cn#jul_24th_2025_manifest_v2_is_disabled_everywhere&quot;&gt;2025 年 7 月 24 日：在所有位置停用 Manifest V2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;吗？&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;解决方案&lt;/h1&gt;
&lt;h2&gt;通过 chrome://flags 关闭&lt;/h2&gt;
&lt;p&gt;:::warning[注意]
目前并不能确认 Chrome 139.0.7258.128 之后的版本是否能继续使用此方法。但可以确定的是，稳定版 139.0.7258.128 能继续使用 Flags 控制开关。
&lt;img src=&quot;https://blog.adclosenn.top/_astro/chrome-139.0.7258.128-about.BWrpTjkV_BcOCk.webp&quot; alt=&quot;chrome-139.0.7258.128-about&quot; /&gt;
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;地址栏输入 &lt;code&gt;chrome://flags/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;搜索 &lt;code&gt;temporary-unexpire-flags-m137&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将这个条目设置为 &lt;code&gt;Enabled&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;重启浏览器。&lt;/li&gt;
&lt;li&gt;搜索 &lt;code&gt;extension-manifest-v2-deprecation-disabled&lt;/code&gt;，将其设置为 &lt;code&gt;Disabled&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;搜索 &lt;code&gt;extension-manifest-v2-deprecation-unsupported&lt;/code&gt;，将其设置为 &lt;code&gt;Disabled&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;重启浏览器，即可启用旧版扩展。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;添加启动参数&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.adclosenn.top/_astro/windows-chrome-lnk-panel.Blw5noGw_GFA1o.webp&quot; alt=&quot;windows-chrome-lnk-panel&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关闭 Chrome。&lt;/li&gt;
&lt;li&gt;打开 Chrome 的快捷方式属性。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;目标&lt;/strong&gt; 后加上一个&lt;strong&gt;空格&lt;/strong&gt;和 &lt;code&gt;--disable-features=ExtensionManifestV2Unsupported,ExtensionManifestV2Disabled&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;确定&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;再次双击 Chrome 快捷方式，打开 Chrome，即可启用旧版扩展（&lt;strong&gt;暂时保留&lt;/strong&gt; 按钮将会出现）。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/chrome-ext-force-custom-font-2.By5Y1VIj_b3v25.webp&quot; alt=&quot;chrome-ext-force-custom-font-2&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;换浏览器&lt;/h2&gt;
&lt;h3&gt;FireFox&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.firefox.com/zh-CN/&quot;&gt;FireFox - 火狐&lt;/a&gt; 。它并&lt;strong&gt;不&lt;/strong&gt;基于 Chromium ：&lt;a href=&quot;https://www.firefox.com/zh-CN/more/faq/&quot;&gt;FireFox 常见问题&lt;/a&gt; 。并且它将会 &lt;a href=&quot;https://blog.mozilla.org/addons/2024/03/13/manifest-v3-manifest-v2-march-2024-update/&quot;&gt;继续支持 Manifest V2 扩展&lt;/a&gt; 。~FireFox 这招太狠了~&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;h2&gt;Microsoft Edge&lt;/h2&gt;
&lt;p&gt;好吧，微软也放弃了其新 Edge 对 Manifest V2 的支持，强制关闭时间&lt;strong&gt;待定&lt;/strong&gt;：&lt;a href=&quot;https://learn.microsoft.com/zh-cn/microsoft-edge/extensions/developer-guide/manifest-v3&quot;&gt;迁移到清单 V3 的概述和时间线 - Microsoft Edge Developer documentation | Microsoft Learn&lt;/a&gt; 。&lt;/p&gt;
</content:encoded></item><item><title>hCaptcha “强兼” reCaptcha？</title><link>https://blog.adclosenn.top/posts/hcaptcha-recaptchacompat/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/hcaptcha-recaptchacompat/</guid><description>一次出3个 hCaptcha？瞧瞧你干的好事！</description><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;强兼 Google reCaptcha 失败？&lt;/h1&gt;
&lt;p&gt;如你所见，这是 hCaptcha 无法验证的样子。当然，如果你在一个页面同时放上 &lt;a href=&quot;https://developers.google.com/recaptcha?hl=zh-cn&quot;&gt;Google reCaptcha&lt;/a&gt;（我的是 v2）和 &lt;a href=&quot;https://www.hcaptcha.com&quot;&gt;hCaptcha&lt;/a&gt;，那么聪明的 hCaptcha 会 &lt;a href=&quot;https://docs.hcaptcha.com/configuration&quot;&gt;开始兼容它&lt;/a&gt; 。
&lt;img src=&quot;https://blog.adclosenn.top/_astro/hcaptcha-recaptchacompat-origin.1dlG2Qb3_1s3mYj.webp&quot; alt=&quot;hcaptcha-recaptchacompat-origin&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;译文：&lt;/strong&gt;&lt;br /&gt;
&lt;img src=&quot;https://blog.adclosenn.top/_astro/hcaptcha-recaptchacompat-translated.C8eUGA40_1E8DU8.webp&quot; alt=&quot;hcaptcha-recaptchacompat-translated&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;/posts/captcha/&quot;&gt;posts/captcha/&lt;/a&gt;&lt;br /&gt;
而开启后却是这样的：
&lt;img src=&quot;https://blog.adclosenn.top/_astro/hcaptcha-three-boxes.Ce2eiGfL_JVJEz.webp&quot; alt=&quot;hcaptcha-three-boxes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;没错，出现了 3 个 hCaptcha 框。而且出现的位置就在 reCaptcha 的位置。哇，强兼失败？&lt;/p&gt;
&lt;p&gt;byd 太气人了这。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;解决方法&lt;/h1&gt;
&lt;p&gt;将 hCaptcha 的脚本请求 URL 加上 &lt;code&gt;?recaptchacompat=off&lt;/code&gt; 即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script 
    src=&quot;https://hcaptcha.com/1/api.js?recaptchacompat=off&quot; async defer&amp;gt;
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>自定义 Astro 的 Frontmatter</title><link>https://blog.adclosenn.top/posts/custom-frontmatter/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/custom-frontmatter/</guid><description>如果你想要在 Astro 的 Makdown Frontmatter 中自定义参数，布尔值或字符串，实现直接开关或更改某样组件，可以这样做</description><pubDate>Wed, 13 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;如果你用的博客是 &lt;a href=&quot;https://astro.build&quot;&gt;Astro&lt;/a&gt; 或以它为架构的 &lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt;，那么这篇文章或许适合。&lt;/p&gt;
&lt;p&gt;这篇文章的目的是 &lt;strong&gt;在 Markdown 文件的顶端加入一个自定义的类似 &lt;code&gt;draft: true&lt;/code&gt; 这类变量控制器&lt;/strong&gt;，可以运用它对某些组件进行更改，包括关闭、更改。例如，当你在 fuwari 中的 Markdown 顶端定义一个内置参数 &lt;code&gt;image&lt;/code&gt;，你可以通过写 &lt;code&gt;image: &quot;../assets/images/custom-frontmatter-cover.svg&quot;&lt;/code&gt; 来让这篇文章在&lt;strong&gt;博客主页&lt;/strong&gt;获得一个图片（而不定义就只有一个 &lt;code&gt;&amp;gt;&lt;/code&gt; 的按钮）： &lt;img src=&quot;https://blog.adclosenn.top/_astro/frontmatter-image-example.B28LJ3Bq_1iS3ib.webp&quot; alt=&quot;frontmatter-image-example&quot; /&gt;&lt;/p&gt;
&lt;p&gt;就是说：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--- # 这里是 Frontmatter 的开头
image: /a/example.png # 官方自带的：这是原来有的这个 image:
customcover: /a/eexxaammppllee.png  # 自己添加的：这是在如 /posts/custom-frontmatter/ 显示的文章头图
showcover: false # 自己添加的：这是控制 是否使用 image: 定义的图片作为文章头图，默认就是会用 image: 定义的图片作为头图
--- # 这里是 Frontmatter 的结尾
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你足够细心，你会发现文章 &lt;a href=&quot;/posts/captcha/&quot;&gt;你是人类吗？&lt;/a&gt; 的图片在&lt;strong&gt;博客主页&lt;/strong&gt;和&lt;strong&gt;文章内部&lt;/strong&gt;是不同的。这也用到了自定义 Frontmatter，自己定义了不同的地方该显示什么图片。&lt;/p&gt;
&lt;h1&gt;定义 Frontmatter&lt;/h1&gt;
&lt;p&gt;:::tip[提示]
如果你使用的也是 Astro Fuwari，那么这些操作理应是&lt;strong&gt;相同&lt;/strong&gt;且&lt;strong&gt;可用&lt;/strong&gt;的。
:::&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;src/content/config.ts&lt;/code&gt; 文件，在 &lt;code&gt;const postsCollection = defineCollection({&lt;/code&gt; 部分，参考已有的示例定义一个&lt;strong&gt;不重名&lt;/strong&gt;的参数，以下是本站的：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;boolen&lt;/strong&gt;：布尔值。可以通过 &lt;code&gt;true&lt;/code&gt; 和 &lt;code&gt;false&lt;/code&gt; 控制。&lt;br /&gt;
&lt;strong&gt;string&lt;/strong&gt;：字符串。填写的是一串文本。&lt;/p&gt;
&lt;p&gt;最后面括号中的 &lt;code&gt;true&lt;/code&gt; 指的是如果 Markdown 文件顶端的 Frontmatter 里&lt;strong&gt;没有&lt;/strong&gt;这个参数，就默认为 &lt;code&gt;true&lt;/code&gt;。&lt;code&gt;string&lt;/code&gt; 也同理。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const postsCollection = defineCollection({
	schema: z.object({
		title: z.string(),
		published: z.date(),
		updated: z.date().optional(),
		draft: z.boolean().optional().default(false),
		description: z.string().optional().default(&quot;&quot;),
		image: z.string().optional().default(&quot;&quot;),
		tags: z.array(z.string()).optional().default([]),
		category: z.string().optional().nullable().default(&quot;&quot;),
		showcover: z.boolean().optional().default(true),
		customcover: z.string().optional().default(&quot;&quot;),

		lang: z.string().optional().default(&quot;&quot;),

		/* For internal use */
		prevTitle: z.string().default(&quot;&quot;),
		prevSlug: z.string().default(&quot;&quot;),
		nextTitle: z.string().default(&quot;&quot;),
		nextSlug: z.string().default(&quot;&quot;),
	}),
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;配置 Frontmatter（样例）&lt;/h1&gt;
&lt;h2&gt;关闭文章头图&lt;/h2&gt;
&lt;p&gt;默认你使用 &lt;code&gt;image&lt;/code&gt; 定义了一张图片，那么这张图片将会同时显示在&lt;strong&gt;博客主页&lt;/strong&gt;和 &lt;strong&gt;文章内部（那个大大的图片，位于文章之首）&lt;/strong&gt;。&lt;br /&gt;
如不需要使用&lt;strong&gt;博客主页&lt;/strong&gt;那张图片作为文章内部的照片，我们可以&lt;strong&gt;关闭文章内部的头图显示，只剩下文章正文和文章的图片，而博客主页那个卡片右边的图片依然显示&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;src/pages/posts/[...slug].astro&lt;/code&gt;，（这个可选：在&lt;strong&gt;第二处&lt;/strong&gt; &lt;code&gt;---&lt;/code&gt; 上面加入 &lt;code&gt;const 随便一个不重复名字 = entry.data.你在#定义 Frontmatter定义的参数。&lt;/code&gt; ，本站是 &lt;code&gt;showcover = enrty.data.showcover;&lt;/code&gt;）&lt;br /&gt;
找到 &lt;code&gt;{entry.data.image &amp;amp;&amp;amp;&lt;/code&gt;，将其改为 &lt;code&gt;{entry.data.showcover &amp;amp;&amp;amp; entry.data.image &amp;amp;&amp;amp;&lt;/code&gt;。如图所示：&lt;/p&gt;
&lt;p&gt;:::warning[注意]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果你做了上面的可选步骤（定义了一个变量），那么可以将其改为 &lt;code&gt;{变量名 &amp;amp;&amp;amp; entry.data.image &amp;amp;&amp;amp;&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果你&lt;strong&gt;没有使用&lt;/strong&gt;在 &lt;a href=&quot;#%E5%AE%9A%E4%B9%89-frontmatter&quot;&gt;#定义 Frontmatter&lt;/a&gt; 中的本站自定义的参数，这里就无法使用 entry.data.showcover。
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;            {entry.data.showcover &amp;amp;&amp;amp; entry.data.image &amp;amp;&amp;amp;
                &amp;lt;ImageWrapper id=&quot;post-cover&quot; src={entry.data.image} basePath={path.join(&quot;content/posts/&quot;, getDir(entry.id))} class=&quot;mb-8 rounded-xl banner-container onload-animation&quot;/&amp;gt;
            }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;自定义文章内部头图&lt;/h2&gt;
&lt;p&gt;你也看到了，本文在博客主页和本页的头图不一样。这是自定义了头图 &lt;code&gt;customcover: ../assets/images/custom-frontmatter-customcover.svg&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;打开 &lt;code&gt;src/pages/posts/[...slug].astro&lt;/code&gt;，（这个可选：在&lt;strong&gt;第二处&lt;/strong&gt; &lt;code&gt;---&lt;/code&gt; 上面加入 &lt;code&gt;const 随便一个不重复名字 = entry.data.你在#定义 Frontmatter定义的参数。&lt;/code&gt;，本站是 &lt;code&gt;const customcover = entry.data.customcover;&lt;/code&gt;）&lt;br /&gt;
找到 &lt;code&gt;{entry.data.image &amp;amp;&amp;amp;&lt;/code&gt; 开头的元素，在其下面添加一个和其&lt;strong&gt;一模一样&lt;/strong&gt;的元素。如图所示：&lt;/p&gt;
&lt;p&gt;:::warning[注意]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果你做了上面的可选步骤（定义了一个变量），那么可以将其改为 &lt;code&gt;{变量名 &amp;amp;&amp;amp;&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果你&lt;strong&gt;没有使用&lt;/strong&gt;在 &lt;a href=&quot;#%E5%AE%9A%E4%B9%89-frontmatter&quot;&gt;#定义 Frontmatter&lt;/a&gt; 中的本站自定义的参数，这里就无法使用 entry.data.customcover。
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;            {entry.data.showcover &amp;amp;&amp;amp; entry.data.image &amp;amp;&amp;amp;
                &amp;lt;ImageWrapper id=&quot;post-cover&quot; src={entry.data.image} basePath={path.join(&quot;content/posts/&quot;, getDir(entry.id))} class=&quot;mb-8 rounded-xl banner-container onload-animation&quot;/&amp;gt;
            }
            
            &amp;lt;!-- 自制内部头图 customcover--&amp;gt;
            {entry.data.customcover &amp;amp;&amp;amp;
                &amp;lt;ImageWrapper id=&quot;post-cover&quot; src={entry.data.customcover} basePath={path.join(&quot;content/posts/&quot;, getDir(entry.id))} class=&quot;mb-8 rounded-xl banner-container onload-animation&quot;/&amp;gt;
            }
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h1&gt;附加：本站 [...slug].astro 文件&lt;/h1&gt;
&lt;p&gt;:::CAUTION[不要照抄，除非你知道自己在做什么]
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import path from &quot;node:path&quot;;
import License from &quot;@components/misc/License.astro&quot;;
import Markdown from &quot;@components/misc/Markdown.astro&quot;;
import I18nKey from &quot;@i18n/i18nKey&quot;;
import { i18n } from &quot;@i18n/translation&quot;;
import MainGridLayout from &quot;@layouts/MainGridLayout.astro&quot;;
import { getSortedPosts } from &quot;@utils/content-utils&quot;;
import { getDir, getPostUrlBySlug } from &quot;@utils/url-utils&quot;;
import { Icon } from &quot;astro-icon/components&quot;;
import { licenseConfig } from &quot;src/config&quot;;
import ImageWrapper from &quot;../../components/misc/ImageWrapper.astro&quot;;
import PostMetadata from &quot;../../components/PostMeta.astro&quot;;
import { profileConfig, siteConfig } from &quot;../../config&quot;;
import { formatDateToYYYYMMDD } from &quot;../../utils/date-utils&quot;;

export async function getStaticPaths() {
	const blogEntries = await getSortedPosts();
	return blogEntries.map((entry) =&amp;gt; ({
		params: { slug: entry.slug },
		props: { entry },
	}));
}

const { entry } = Astro.props;
const { Content, headings } = await entry.render();

const { remarkPluginFrontmatter } = await entry.render();

const jsonLd = {
	&quot;@context&quot;: &quot;https://schema.org&quot;,
	&quot;@type&quot;: &quot;BlogPosting&quot;,
	headline: entry.data.title,
	description: entry.data.description || entry.data.title,
	keywords: entry.data.tags,
	author: {
		&quot;@type&quot;: &quot;Person&quot;,
		name: profileConfig.name,
		url: Astro.site,
	},
	datePublished: formatDateToYYYYMMDD(entry.data.published),
	inLanguage: entry.data.lang
		? entry.data.lang.replace(&quot;_&quot;, &quot;-&quot;)
		: siteConfig.lang.replace(&quot;_&quot;, &quot;-&quot;),
	// TODO include cover image here
};

// 获取头图 boolean，无需设置 true
const showcover = entry.data.showcover;

// 获取自定义的头图（Markdown 内部）
const customcover = entry.data.customcover;

---
&amp;lt;MainGridLayout banner={entry.data.image} title={entry.data.title} description={entry.data.description} lang={entry.data.lang} setOGTypeArticle={true} headings={headings}&amp;gt;
    &amp;lt;script is:inline slot=&quot;head&quot; type=&quot;application/ld+json&quot; set:html={JSON.stringify(jsonLd)}&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;div class=&quot;flex w-full rounded-[var(--radius-large)] overflow-hidden relative mb-4&quot;&amp;gt;
        &amp;lt;div id=&quot;post-container&quot; class:list={[&quot;card-base z-10 px-6 md:px-9 pt-6 pb-4 relative w-full &quot;,
            {}
        ]}&amp;gt;
            &amp;lt;!-- word count and reading time --&amp;gt;
            &amp;lt;div class=&quot;flex flex-row text-black/30 dark:text-white/30 gap-5 mb-3 transition onload-animation&quot;&amp;gt;
                &amp;lt;div class=&quot;flex flex-row items-center&quot;&amp;gt;
                    &amp;lt;div class=&quot;transition h-6 w-6 rounded-md bg-black/5 dark:bg-white/10 text-black/50 dark:text-white/50 flex items-center justify-center mr-2&quot;&amp;gt;
                        &amp;lt;Icon name=&quot;material-symbols:notes-rounded&quot;&amp;gt;&amp;lt;/Icon&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;text-sm&quot;&amp;gt;{remarkPluginFrontmatter.words} {&quot; &quot; + i18n(I18nKey.wordsCount)}&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;flex flex-row items-center&quot;&amp;gt;
                    &amp;lt;div class=&quot;transition h-6 w-6 rounded-md bg-black/5 dark:bg-white/10 text-black/50 dark:text-white/50 flex items-center justify-center mr-2&quot;&amp;gt;
                        &amp;lt;Icon name=&quot;material-symbols:schedule-outline-rounded&quot;&amp;gt;&amp;lt;/Icon&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;text-sm&quot;&amp;gt;
                        {remarkPluginFrontmatter.minutes} {&quot; &quot; + i18n(remarkPluginFrontmatter.minutes === 1 ? I18nKey.minuteCount : I18nKey.minutesCount)}
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;!-- title --&amp;gt;
            &amp;lt;div class=&quot;relative onload-animation&quot;&amp;gt;
                &amp;lt;div
                    data-pagefind-body data-pagefind-weight=&quot;10&quot; data-pagefind-meta=&quot;title&quot;
                    class=&quot;transition w-full block font-bold mb-3
                    text-3xl md:text-[2.25rem]/[2.75rem]
                    text-black/90 dark:text-white/90
                    md:before:w-1 before:h-5 before:rounded-md before:bg-[var(--primary)]
                    before:absolute before:top-[0.75rem] before:left-[-1.125rem]
                &quot;&amp;gt;
                    {entry.data.title}
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

            &amp;lt;!-- metadata --&amp;gt;
            &amp;lt;div class=&quot;onload-animation&quot;&amp;gt;
                &amp;lt;PostMetadata
                        class=&quot;mb-5&quot;
                        published={entry.data.published}
                        updated={entry.data.updated}
                        tags={entry.data.tags}
                        category={entry.data.category}
                &amp;gt;&amp;lt;/PostMetadata&amp;gt;
                {!entry.data.image &amp;amp;&amp;amp; &amp;lt;div class=&quot;border-[var(--line-divider)] border-dashed border-b-[1px] mb-5&quot;&amp;gt;&amp;lt;/div&amp;gt;}
            &amp;lt;/div&amp;gt;

            &amp;lt;!-- always show cover as long as it has one --&amp;gt;
            &amp;lt;!-- 使用自制 showcover 控制器控制头图的出现 --&amp;gt;
            {showcover &amp;amp;&amp;amp; entry.data.image &amp;amp;&amp;amp;
                &amp;lt;ImageWrapper id=&quot;post-cover&quot; src={entry.data.image} basePath={path.join(&quot;content/posts/&quot;, getDir(entry.id))} class=&quot;mb-8 rounded-xl banner-container onload-animation&quot;/&amp;gt;
            }
            
            &amp;lt;!-- 自制内部头图 customcover--&amp;gt;
            {customcover &amp;amp;&amp;amp;
                &amp;lt;ImageWrapper id=&quot;post-cover&quot; src={entry.data.customcover} basePath={path.join(&quot;content/posts/&quot;, getDir(entry.id))} class=&quot;mb-8 rounded-xl banner-container onload-animation&quot;/&amp;gt;
            }

            &amp;lt;!-- 头图调试代码
            &amp;lt;pre&amp;gt;
            showcover（变量）: {showcover} (type: {typeof showcover})
            entry.data.showcover: {entry.data.showcover} (type: {typeof entry.data.showcover})
            &amp;lt;/pre&amp;gt;
            --&amp;gt;

            &amp;lt;Markdown class=&quot;mb-6 markdown-content onload-animation&quot;&amp;gt;
                &amp;lt;Content /&amp;gt;
            &amp;lt;/Markdown&amp;gt;

            {licenseConfig.enable &amp;amp;&amp;amp; &amp;lt;License title={entry.data.title} slug={entry.slug} pubDate={entry.data.published} class=&quot;mb-6 rounded-xl license-container onload-animation&quot;&amp;gt;&amp;lt;/License&amp;gt;}

        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&quot;flex flex-col md:flex-row justify-between mb-4 gap-4 overflow-hidden w-full&quot;&amp;gt;
        &amp;lt;a href={entry.data.nextSlug ? getPostUrlBySlug(entry.data.nextSlug) : &quot;#&quot;}
           class:list={[&quot;w-full font-bold overflow-hidden active:scale-95&quot;, {&quot;pointer-events-none&quot;: !entry.data.nextSlug}]}&amp;gt;
            {entry.data.nextSlug &amp;amp;&amp;amp; &amp;lt;div class=&quot;btn-card rounded-2xl w-full h-[3.75rem] max-w-full px-4 flex items-center !justify-start gap-4&quot; &amp;gt;
                &amp;lt;Icon name=&quot;material-symbols:chevron-left-rounded&quot; class=&quot;text-[2rem] text-[var(--primary)]&quot; /&amp;gt;
                &amp;lt;div class=&quot;overflow-hidden transition overflow-ellipsis whitespace-nowrap max-w-[calc(100%_-_3rem)] text-black/75 dark:text-white/75&quot;&amp;gt;
                    {entry.data.nextTitle}
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;}
        &amp;lt;/a&amp;gt;

        &amp;lt;a href={entry.data.prevSlug ? getPostUrlBySlug(entry.data.prevSlug) : &quot;#&quot;}
           class:list={[&quot;w-full font-bold overflow-hidden active:scale-95&quot;, {&quot;pointer-events-none&quot;: !entry.data.prevSlug}]}&amp;gt;
            {entry.data.prevSlug &amp;amp;&amp;amp; &amp;lt;div class=&quot;btn-card rounded-2xl w-full h-[3.75rem] max-w-full px-4 flex items-center !justify-end gap-4&quot;&amp;gt;
                &amp;lt;div class=&quot;overflow-hidden transition overflow-ellipsis whitespace-nowrap max-w-[calc(100%_-_3rem)] text-black/75 dark:text-white/75&quot;&amp;gt;
                    {entry.data.prevTitle}
                &amp;lt;/div&amp;gt;
                &amp;lt;Icon name=&quot;material-symbols:chevron-right-rounded&quot; class=&quot;text-[2rem] text-[var(--primary)]&quot; /&amp;gt;
            &amp;lt;/div&amp;gt;}
        &amp;lt;/a&amp;gt;
    &amp;lt;/div&amp;gt;

&amp;lt;/MainGridLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>你是人类吗？</title><link>https://blog.adclosenn.top/posts/captcha/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/captcha/</guid><description>我的 Captcha 还蛮多的，欢迎你们来这里玩，玩累了就直接刷新，没问题的~</description><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;head&amp;gt;
&amp;lt;!-- Google reCaptcha v2--&amp;gt;
&amp;lt;!-- &amp;lt;script src=&quot;https://www.google.com/recaptcha/api.js&quot; async defer&amp;gt;&amp;lt;/script&amp;gt; --&amp;gt;
&amp;lt;script src=&quot;https://recaptcha.net/recaptcha/api.js&quot; async defer&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- Cloudflare Turnstile --&amp;gt;
&amp;lt;script src=&quot;https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback&quot; defer async&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- hCaptcha --&amp;gt;
&amp;lt;script src=&quot;https://hcaptcha.com/1/api.js?recaptchacompat=off&amp;amp;hl=zh&quot; async defer&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;&lt;/p&gt;
&lt;p&gt;你好~
我的 Captcha 还蛮多的，欢迎你们来这里玩，玩累了就直接刷新，没问题的~&lt;/p&gt;
&lt;h1&gt;Google reCaptcha V2&lt;/h1&gt;
&lt;h2&gt;休闲版（不保证）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div class=&quot;g-recaptcha&quot; data-sitekey=&quot;6LerBqQrAAAAAJm_8-H-wq25iSKxprYEW8G_XYhi&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;挑战版（不保证）&lt;/h2&gt;
&lt;p&gt;&amp;lt;div class=&quot;g-recaptcha&quot; data-sitekey=&quot;6LcQFKQrAAAAAFg294vepQULbQX11BXa0NTt-21h&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Cloudflare Turnstile&lt;/h1&gt;
&lt;p&gt;&amp;lt;div id=&quot;example-container&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script is:inline&amp;gt;
function onloadTurnstileCallback() {
// 确保 turnstile 对象已加载
if (typeof turnstile !== &apos;undefined&apos;) {
turnstile.render(&apos;#example-container&apos;, {
// 重要：将下面的 sitekey 替换为你自己的
sitekey: &apos;0x4AAAAAABq8mQb4rm0Y4ir5&apos;, // 这是一个用于测试的 key
callback: function(token) {
console.log(&lt;code&gt;挑战成功，获取到的 token 是: ${token}&lt;/code&gt;);
// 在这里你可以将 token 发送到后端进行验证
},
});
}
}
&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;hCaptcha&lt;/h1&gt;
&lt;h2&gt;简单模式&lt;/h2&gt;
&lt;p&gt;&amp;lt;div class=&quot;h-captcha&quot; style=&quot;margin: 0; display: inline-block;&quot; data-sitekey=&quot;96520da8-ea64-4416-bbcc-f1bc1602bcc4&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;h2&gt;困难模式&lt;/h2&gt;
&lt;p&gt;&amp;lt;div class=&quot;h-captcha&quot; style=&quot;margin: 0; display: inline-block;&quot; data-sitekey=&quot;2bca1990-f990-4430-987a-5b7a1522e26e&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h1&gt;Arkose Labs FunCAPTCHA&lt;/h1&gt;
&lt;p&gt;&amp;lt;iframe src=&quot;https://iframe.arkoselabs.com/3EE79F8D-13A6-474B-9278-448EA19F79B3/index.html&quot; width=&quot;700&quot; height=&quot;500&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>教你免费获得一个企业域名邮箱</title><link>https://blog.adclosenn.top/posts/domain-email/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/domain-email/</guid><description>通过阿里云免费企业邮箱获得一个类似于 admin@github.com 类型的域名邮箱，可以接收也能发送邮件</description><pubDate>Mon, 11 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;自从你上网冲浪接触邮箱以来，你或多或少都会见过这种邮箱：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;noreply@github.com&lt;/li&gt;
&lt;li&gt;notifications@github.com&lt;/li&gt;
&lt;li&gt;microsoft-noreply@microsoft.com&lt;/li&gt;
&lt;li&gt;noreply@steampowered.com&lt;/li&gt;
&lt;li&gt;account-security-noreply@accountprotection.microsoft.com&lt;/li&gt;
&lt;li&gt;等如类似 xxx@qq.com, xxx@bilibili.com&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些邮箱都是&lt;strong&gt;企业或组织自己域名&lt;/strong&gt;的邮箱，可以很清楚地体现出这封邮件来自哪个企业/组织。&lt;br /&gt;
那么，当我们普通人获得了一个域名，也能用这种自己域名的邮箱吗？答案是能的，可以用阿里云或网易的&lt;strong&gt;免费企业邮箱&lt;/strong&gt;，全免费，能用 IMAP/POP 和 SMTP 服务器给第三方邮箱客户端使用。&lt;/p&gt;
&lt;p&gt;:::warning[注意]
本篇教程讲的获取邮箱的方法为&lt;strong&gt;阿里云国内站&lt;/strong&gt;，如果需要使用&lt;strong&gt;网易&lt;/strong&gt;的免费企业邮箱，请移步至 &lt;a href=&quot;https://2x.nz/posts/163-free-domain-email/&quot;&gt;2x.nz/posts/163-free-domain-email/&lt;/a&gt;
:::&lt;/p&gt;
&lt;h1&gt;限制&lt;/h1&gt;
&lt;p&gt;推荐查看 &lt;a href=&quot;https://help.aliyun.com/document_detail/439236.html&quot;&gt;普通账号常见参数 - 阿里云&lt;/a&gt; 。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单账号可存储总邮件数：200 万封。&lt;/li&gt;
&lt;li&gt;单账号个人网盘空间：5 GB。&lt;/li&gt;
&lt;li&gt;每日最大发件数：&lt;strong&gt;未考察&lt;/strong&gt;，可能是一个域名用户(a@b.com) 200 封/天；可能是一个域名(*@b.com) 200 封/天。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;需求&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;一个&lt;strong&gt;已实名&lt;/strong&gt;的 &lt;a href=&quot;https://www.aliyun.com&quot;&gt;阿里云&lt;/a&gt; 账号（不实名无法购买：&lt;code&gt;您还未实名认证，请务必先前往本页面右上角个人中心进行实名认证。&lt;/code&gt;）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阿里云仅支持 14 岁以上通过&lt;strong&gt;扫描支付宝二维码&lt;/strong&gt;、&lt;strong&gt;支付宝扫描脸部&lt;/strong&gt;、&lt;strong&gt;上传身份证正反面照片&lt;/strong&gt;进行实名认证。&lt;/li&gt;
&lt;li&gt;以下信息来自 &lt;a href=&quot;https://help.aliyun.com/zh/account/user-guide/individual-identities?spm=a2c4g.11186623.help-menu-35469.d_2_0_2_1.6fcc689dZlafVI&quot;&gt;阿里云&lt;/a&gt; ：&lt;/li&gt;
&lt;li&gt;通过支付宝账号进行实名认证并不会自动将该支付宝账号与阿里云账号绑定用于支付。如果您希望在阿里云上使用支付宝进行支付，您仍需要手动将阿里云账号与您的支付宝账号进行绑定。&lt;/li&gt;
&lt;li&gt;绑定用于支付的支付宝账号可以是实名认证时使用的支付宝账号，也可以是其他支付宝账号。&lt;/li&gt;
&lt;li&gt;阿里云App仅支持个人支付宝授权认证。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个域名，可以为&lt;strong&gt;不是从阿里云购买&lt;/strong&gt;的域名（如 Spaceship、Namesilo），实测 &lt;code&gt;dpdns.org&lt;/code&gt; 域名也可以使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一个能接收验证码的手机号。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;开通企业邮服务&lt;/h1&gt;
&lt;h2&gt;订购服务&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://exmail.aliyun.com/free&quot;&gt;阿里邮箱&lt;/a&gt; ，滑到下面点击 &lt;strong&gt;立即抢购&lt;/strong&gt;，将会跳转到阿里云，如果阿里云未登录请登录。&lt;/li&gt;
&lt;li&gt;在订购页面选择必要配置，完成后点击 &lt;strong&gt;立即购买&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;选择 &lt;strong&gt;已有域名&lt;/strong&gt;，填入自己的域名，填完后往空白处点一下。&lt;code&gt;dpdns.org&lt;/code&gt; 也可以用。&lt;/li&gt;
&lt;li&gt;购买时长选择 &lt;strong&gt;5年&lt;/strong&gt;。
&lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-order-panel-1.BIZGry7I_2ksP3O.webp&quot; alt=&quot;aliyun-email-order-panel-1&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果你要纯免费，请&lt;strong&gt;不要&lt;/strong&gt;勾选 &lt;strong&gt;邮件推送&lt;/strong&gt;（默认未勾选）。阅读完 &lt;strong&gt;企业邮箱免费版 服务协议&lt;/strong&gt; 后，勾选它，并点击 &lt;strong&gt;去支付&lt;/strong&gt;。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-order-panel-2.DOqFxzhd_Z1Gkw7O.webp&quot; alt=&quot;aliyun-email-order-panel-2&quot; /&gt;&lt;/li&gt;
&lt;li&gt;无需添加支付方式，点击右下角 &lt;strong&gt;支付&lt;/strong&gt; 即可。&lt;/li&gt;
&lt;li&gt;如果看到这个页面，代表你&lt;strong&gt;成功&lt;/strong&gt;地开通了企业邮服务。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-order-successfully.C5TXn1Xq_1ycxL5.webp&quot; alt=&quot;aliyun-email-order-successfully&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;设置前置配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在下方 &lt;strong&gt;使用须知&lt;/strong&gt; 中找到 &lt;strong&gt;进入管理控制台&lt;/strong&gt;，点击进入。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-readme.BmC1FrhY_Z1X2wPB.webp&quot; alt=&quot;aliyun-email-ordered-readme&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击刚刚填写的域名 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-product-list.DscV1k4O_ZEq8jU.webp&quot; alt=&quot;aliyun-email-product-list&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;设置解析&lt;/strong&gt;，将阿里云给出的 MX 等记录填入你的域名 DNS 提供商（我的是 Cloudflare）。完成后等待 DNS 记录的传播，然后点击 &lt;strong&gt;检查域名解析&lt;/strong&gt;，如果出来的是绿色的&lt;strong&gt;解析已生效&lt;/strong&gt;，证明你的 DNS 记录添加成功。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-domain-record-verify.Dis2PJTO_ZS45SA.webp&quot; alt=&quot;aliyun-email-domain-record-verify&quot; /&gt; &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-setrecord-successfully.BFw8gDt7_tPVjQ.webp&quot; alt=&quot;aliyun-email-setrecord-successfully&quot; /&gt;&lt;/li&gt;
&lt;li&gt;接着在 &lt;strong&gt;重置密码&lt;/strong&gt; 处设置一个管理员登录密码。&lt;strong&gt;密码长度8-64位，须同时包含大写、小写字母、数字、特殊字符中的任意三种，不能含有账号&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;复制 &lt;strong&gt;基本信息/管理员账号&lt;/strong&gt; 的地址，为 postmaster@你的域名。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;设置邮箱配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;点击进入 &amp;lt;a href=&quot;https://qiye.aliyun.com&quot; target=&quot;_blank&quot;&amp;gt;阿里邮箱登录入口&amp;lt;/a&amp;gt; ，用户名为刚才复制的管理员账号，密码为 &lt;a href=&quot;#%E8%AE%BE%E7%BD%AE%E5%89%8D%E7%BD%AE%E9%85%8D%E7%BD%AE&quot;&gt;#设置前置配置&lt;/a&gt; 中第 4 步创建的密码。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-postmaster-login.D8cSA-le_Z6lG0A.webp&quot; alt=&quot;aliyun-email-postmaster-login&quot; /&gt;&lt;/li&gt;
&lt;li&gt;如果遇到&lt;strong&gt;需要绑定手机号&lt;/strong&gt;，请绑定。&lt;/li&gt;
&lt;li&gt;成功后会来到这个界面。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-postmaster-admin-panel-menu.DlAAWNrb_Z1oH0Td.webp&quot; alt=&quot;aliyun-email-postmaster-admin-panel-menu&quot; /&gt;&lt;/li&gt;
&lt;li&gt;来到左侧菜单，展开 &lt;strong&gt;组织与用户&lt;/strong&gt;，点击 &lt;strong&gt;员工账号管理&lt;/strong&gt;，填写用户信息。设置好后点击 &lt;strong&gt;保存&lt;/strong&gt; ：
&lt;ul&gt;
&lt;li&gt;姓名：随便填。&lt;/li&gt;
&lt;li&gt;默认邮件地址：填写你想用的名字。例如，我想用 &lt;code&gt;i@adclosenn.top&lt;/code&gt; 收发邮件，那么 &lt;strong&gt;默认邮件地址&lt;/strong&gt; 就应填写 &lt;code&gt;i&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;安全手机：可以不填。&lt;/li&gt;
&lt;li&gt;开启POP3/SMTP服务：如果你需要使用第三方邮箱客户端（如 QQ邮箱、163邮箱、Gmail、Outlook），请&lt;strong&gt;勾选&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;开启IMAP/SMTP服务：如果你需要使用第三方邮箱客户端（如 QQ邮箱、163邮箱、Gmail、Outlook），请&lt;strong&gt;勾选&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;初次登录修改密码：&lt;strong&gt;不建议&lt;/strong&gt;开启。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;来到左侧菜单，展开 &lt;strong&gt;企业定制&lt;/strong&gt;，点击 &lt;strong&gt;域名管理&lt;/strong&gt;，点击上方 &lt;strong&gt;检查MX解析&lt;/strong&gt;，查看最下面的 &lt;strong&gt;TXT记录(DKIM)&lt;/strong&gt;，如果验证是&lt;strong&gt;失败&lt;/strong&gt;，则去 DNS 提供商内填写 TXT 记录信息。成功后会如图所示。如果之前曾经设置过其他邮箱提供商的 DNS 记录，需要删除原有的 DNS 记录，以避免产生冲突。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/aliyun-email-mxcheck.enE-oEPu_Fuktt.webp&quot; alt=&quot;aliyun-email-mxcheck.png&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;使用企业邮箱&lt;/h1&gt;
&lt;h2&gt;直接使用邮箱&lt;/h2&gt;
&lt;p&gt;如果你希望直接使用阿里邮箱首发短信，&lt;strong&gt;而不是&lt;/strong&gt;通过QQ邮箱、163邮箱、Gmail等第三方客户端代收发邮件，那么可以直接点击右上角的 &lt;strong&gt;退出登录&lt;/strong&gt; 退出 postmaster 账户。&lt;br /&gt;
打开 &amp;lt;a href=&quot;https://qiye.aliyun.com/alimail/auth/login&quot; target=&quot;_blank&quot;&amp;gt;qiye.aliyun.com/alimail/auth/login&amp;lt;/a&amp;gt; ，登录你刚刚创建好的用户，然后收发邮件。&lt;/p&gt;
</content:encoded></item><item><title>进行 Folo 订阅源认证</title><link>https://blog.adclosenn.top/posts/folo_verify/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/folo_verify/</guid><description>Folo（Follow）是一个 RSS 订阅源合集软件，用它可以快速浏览新鲜事，也可以认证自己的 RSS 订阅源</description><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;:::tip[提示]
Folo 也就是之前的 Follow，只不过改名成了 Folo。
:::&lt;/p&gt;
&lt;p&gt;如你所见，这是 Folo 的订阅源认证卡片，代表着这个 RSS 订阅源未经认证（没有与&lt;strong&gt;订阅源提供者&lt;/strong&gt;的 Folo 账户进行绑定）。&lt;br /&gt;
所以我们现在的目标是 &lt;strong&gt;将订阅源与自己的 Folo 账户绑定，认证这个订阅源&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;以下&lt;strong&gt;会有 3 种认证方式&lt;/strong&gt;可选：&lt;strong&gt;纯文本&lt;/strong&gt;、&lt;strong&gt;描述&lt;/strong&gt;、&lt;strong&gt;RSS 标签&lt;/strong&gt;，请根据自己的博客框架或 RSS 生成器选择。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RSS 标签&lt;/strong&gt; 这种方法适用于悄无声息地认证。&lt;br /&gt;
&lt;strong&gt;纯文本&lt;/strong&gt; 这种方法适合大部分博客。&lt;/p&gt;
&lt;p&gt;本站使用 &lt;a href=&quot;#rss-%E6%A0%87%E7%AD%BE&quot;&gt;RSS 标签&lt;/a&gt; 方法进行订阅源认证：&lt;a href=&quot;https://blog.adclosenn.top/rss.xml&quot;&gt;rss.xml&lt;/a&gt; 。&lt;/p&gt;
&lt;h1&gt;纯文本认证&lt;/h1&gt;
&lt;p&gt;这种方法极其简单，你只需要发一篇文章到你的博客或者其他平台即可。本质上就是通过读取你的 RSS 订阅文件，查看里面是否有 Folo 给出的文本。所以认证文本&lt;strong&gt;必须&lt;/strong&gt;要可在 RSS 订阅文件找到。&lt;br /&gt;
&lt;a href=&quot;https://blog.adclosenn.top/rss.xml&quot;&gt;https://blog.adclosenn.top/rss.xml&lt;/a&gt; 这个是本站的 RSS 订阅源地址，你可以在最下面的 Footer 处找到。&lt;/p&gt;
&lt;p&gt;你需要将类似如这串文本（可在 Folo 中复制）粘贴到你的文章中（不要使用我的，每个人的都不一样）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;This message is used to verify that this feed (feedId:177350379949135872) belongs to me (userId:83370505718413312). Join me in enjoying the next generation information browser https://folo.is.
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;描述认证&lt;/h1&gt;
&lt;p&gt;也就是 Folo 认证卡片中的中间那个。&lt;br /&gt;
这个方法需要把认证语句添加到 RSS 生成器的 &lt;code&gt;&amp;lt;description&amp;gt;&amp;lt;/description&amp;gt;&lt;/code&gt; 处。&lt;br /&gt;
如果你使用的和本站相同框架 &lt;a href=&quot;https://astro.build&quot;&gt;Astro&lt;/a&gt; ，那么可以到 &lt;code&gt;src/config.ts&lt;/code&gt;，在 &lt;code&gt;subtitle&lt;/code&gt; 添加认证语句。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const siteConfig: SiteConfig = {
	title: &quot;Ad_closeNN 的小站&quot;,
	subtitle: &quot;Ad_closeNN の 小站，时不时会刷新一些野生东西 | ✨ 欢迎友链，天天开心！ ✨ | feedId:177350379949135872+userId:83370505718413312&quot;,
	lang: &quot;zh_CN&quot;, // Language code, e.g. &apos;en&apos;, &apos;zh-CN&apos;, &apos;ja&apos;, etc.
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note[代码来源]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	return rss({
		title: siteConfig.title,
		description: siteConfig.subtitle || &apos;No description&apos;,
		site: context.site,
		items: feed,
        ...
    })
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h1&gt;RSS 标签&lt;/h1&gt;
&lt;p&gt;如果你使用的和本站相同框架 &lt;a href=&quot;https://astro.build&quot;&gt;Astro&lt;/a&gt; ，那么可以到 &lt;code&gt;src/config.ts&lt;/code&gt; 中的第 6 行，在 &lt;code&gt;&amp;lt;/language&amp;gt;&lt;/code&gt; 后添加 &lt;code&gt;&amp;lt;follow_challenge&amp;gt;&amp;lt;/follow_challenge&amp;gt;&lt;/code&gt; 进行认证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	return rss({
		title: siteConfig.title,
		description: siteConfig.subtitle || &apos;No description&apos;,
		site: context.site,
		items: feed,
		customData: `&amp;lt;language&amp;gt;${siteConfig.lang}&amp;lt;/language&amp;gt;&amp;lt;follow_challenge&amp;gt;&amp;lt;feedId&amp;gt;177350379949135872&amp;lt;/feedId&amp;gt;&amp;lt;userId&amp;gt;83370505718413312&amp;lt;/userId&amp;gt;&amp;lt;/follow_challenge&amp;gt;`,
	});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.adclosenn.top/_astro/folo-rss-verify-panel-xmlformat.CVIoG5Uj_rDmOf.webp&quot; alt=&quot;folo-rss-verify-panel-xmlformat&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;结束&lt;/h1&gt;
&lt;p&gt;写完并 push，等网站部署完毕后，点击 Folo 右下加的 &lt;strong&gt;验证&lt;/strong&gt; 按钮，如果通过即为&lt;strong&gt;验证成功&lt;/strong&gt;，恭喜你。&lt;/p&gt;
</content:encoded></item><item><title>PCL Intelligence 主页说明书</title><link>https://blog.adclosenn.top/posts/pcl-intelligence-homepage/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/pcl-intelligence-homepage/</guid><description>在 PCL 启动器上面询问大模型？当然可以~</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;!-- 小破站防盗链？Referrer 为 localhost 的时候 403 Forbidden --&amp;gt;
&amp;lt;meta name=&quot;referrer&quot; content=&quot;no-referrer&quot;&amp;gt;&lt;/p&gt;
&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;:::CAUTION[警告]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本项目仅供学习交流，请在遵守当地法律法规的情况下使用。中国大陆用户请勿输入政治敏感等违法内容。&lt;/li&gt;
&lt;li&gt;项目仍在开发中，可能会出现不稳定的现象。
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;截图：
&lt;img src=&quot;https://blog.adclosenn.top/_astro/pcl-intelligence-home-page.CO5Qxkx5_Z9ajnE.webp&quot; alt=&quot;pcl-intelligence-home-page&quot; /&gt;&lt;/p&gt;
&lt;p&gt;感谢 &lt;a href=&quot;https://github.com/Light-Beacon/HomepageBuilder&quot;&gt;@Light-Beacon/HomepageBuilder&lt;/a&gt; 的主页构建器，使得大模型输出的 Markdown 得以构建并输出为 XAML 文件。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Light-Beacon/HomepageBuilder&quot;}&lt;/p&gt;
&lt;h1&gt;需求&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;一个 &lt;a href=&quot;https://vercel.com/signup&quot;&gt;Vercel&lt;/a&gt; 账号：用于部署主页后端。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aistudio.google.com/apikey&quot;&gt;Google AI Studio API 密钥&lt;/a&gt;（香港地区不支持访问 Google AI Studio）：用于请求模型。
&lt;ul&gt;
&lt;li&gt;如需请求&lt;strong&gt;单个 API Key&lt;/strong&gt;，&lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt; 仅可&lt;strong&gt;每天&lt;/strong&gt;调用 250 次；&lt;strong&gt;Gemini 2.5 Pro&lt;/strong&gt; 仅可&lt;strong&gt;每天&lt;/strong&gt;调用 100 次。&lt;/li&gt;
&lt;li&gt;如需请求&lt;strong&gt;多个 API Key&lt;/strong&gt; 用于后续的 &lt;strong&gt;&lt;a href=&quot;#%E4%BB%80%E4%B9%88%E6%98%AF%E5%A4%9A-api-key-%E6%A8%A1%E5%BC%8F&quot;&gt;多 API Key 模式&lt;/a&gt;&lt;/strong&gt;，请从&lt;a href=&quot;https://console.cloud.google.com/projectcreate&quot;&gt;https://console.cloud.google.com/projectcreate&lt;/a&gt; 创建多个项目，后在 AI Studio 中创建 API Key。遇到问题请自行 Google。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一个 &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; 账号：用于 Fork 项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;部署&lt;/h1&gt;
&lt;p&gt;:::CAUTION[警告]&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;目前仅对 Vercel 平台和 Gemini 模型进行适配，如需使用自己的服务器与其他模型，请自行修改对应文件。&lt;/li&gt;
&lt;li&gt;请务必按照以下指示部署你的 PCL Intelligence 主页，不当的操作可能会导致你的 API Key 被&lt;strong&gt;泄露&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;请关注 Vercel Usage 使用情况（位于 &lt;a href=&quot;https://vercel.com&quot;&gt;Vercel 主菜单&lt;/a&gt; 左侧），需重点关注 &lt;code&gt;Fluid Active CPU&lt;/code&gt; 和 &lt;code&gt;Edge Requests&lt;/code&gt; 使用量。不要用超了。更多 Usage Limit 请查看主菜单横条上的 &lt;code&gt;Usage&lt;/code&gt; 选项。
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::warning[注意]
现在有&lt;strong&gt;两个&lt;/strong&gt;部署方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果你需要使用 &lt;strong&gt;&lt;a href=&quot;#%E4%BB%80%E4%B9%88%E6%98%AF%E5%A4%9A-api-key-%E6%A8%A1%E5%BC%8F&quot;&gt;多 API Key 模式&lt;/a&gt;&lt;/strong&gt;，请看 &lt;strong&gt;&lt;a href=&quot;#%E5%A4%9A-api-key-%E6%A8%A1%E5%BC%8F&quot;&gt;#多 API Key 模式&lt;/a&gt;&lt;/strong&gt; 。&lt;/li&gt;
&lt;li&gt;（推荐轻度使用）如果你需要使用 &lt;strong&gt;单 API Key 模式&lt;/strong&gt; &lt;em&gt;（一切请求只通过一个 Key 调用）&lt;/em&gt; ，请看 &lt;strong&gt;&lt;a href=&quot;#%E5%8D%95-api-key-%E6%A8%A1%E5%BC%8F%E6%8E%A8%E8%8D%90%E8%BD%BB%E5%BA%A6%E4%BD%BF%E7%94%A8&quot;&gt;#单 API Key 模式&lt;/a&gt;&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单点，&lt;br /&gt;
如果你是轻度&lt;strong&gt;单人使用&lt;/strong&gt;，推荐使用 &lt;strong&gt;&lt;a href=&quot;#%E5%8D%95-api-key-%E6%A8%A1%E5%BC%8F%E6%8E%A8%E8%8D%90%E8%BD%BB%E5%BA%A6%E4%BD%BF%E7%94%A8&quot;&gt;#单 API Key 模式&lt;/a&gt;&lt;/strong&gt;。&lt;br /&gt;
如果你是&lt;strong&gt;重度&lt;/strong&gt;或&lt;strong&gt;多人使用&lt;/strong&gt;，推荐使用 &lt;strong&gt;&lt;a href=&quot;#%E4%BB%80%E4%B9%88%E6%98%AF%E5%A4%9A-api-key-%E6%A8%A1%E5%BC%8F&quot;&gt;多 API Key 模式&lt;/a&gt;&lt;/strong&gt;，请看 &lt;strong&gt;&lt;a href=&quot;#%E5%A4%9A-api-key-%E6%A8%A1%E5%BC%8F&quot;&gt;#多 API Key 模式&lt;/a&gt;&lt;/strong&gt;，但请注意不要用超 Vercel 限制。
:::&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个是前置步骤&lt;/strong&gt;：
::github{repo=&quot;Ad-closeNN/PCL-Intelligence-Homepage&quot;}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;来到 GitHub 仓库 &lt;a href=&quot;https://github.com/Ad-closeNN/PCL-Intelligence-Homepage&quot;&gt;@Ad-closeNN/PCL-Intelligence-Homepage&lt;/a&gt; 或 &lt;a href=&quot;https://github.com/Ad-closeNN/PCL-Intelligence-Homepage/fork&quot;&gt;点此&lt;/a&gt; Fork 仓库。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;多 API Key 模式&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;将 GitHub 仓库的可见性改为 &lt;strong&gt;私密&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;在仓库顶端点击 &lt;strong&gt;Settings&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;滑至底部，点击 &lt;strong&gt;Leave fork network&lt;/strong&gt; 按钮并确认操作。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/github-leave-fork-network.DVjBoOTv_2l2H6r.webp&quot; alt=&quot;Leave fork network&quot; /&gt;&lt;/li&gt;
&lt;li&gt;等待10至30秒，使 Fork 后的仓库脱离 Fork 网络。&lt;/li&gt;
&lt;li&gt;刷新页面，待 &lt;strong&gt;Danger Zone&lt;/strong&gt; 里的 &lt;strong&gt;Change visibility&lt;/strong&gt; 按钮可用后，点击 &lt;strong&gt;Change visibility&lt;/strong&gt; 按钮并确认操作。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/github-change-visibility.Bh_A6oMJ_1HpSoM.webp&quot; alt=&quot;Change visibility&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;更改 &lt;code&gt;config/api_key&lt;/code&gt; 文件，删掉原有内容，把从 &lt;a href=&quot;#%E9%9C%80%E6%B1%82&quot;&gt;Google AI Studio&lt;/a&gt; 申请的 API Key 以 &lt;strong&gt;一行一个 Key&lt;/strong&gt; 的格式填入。&lt;/li&gt;
&lt;li&gt;使用 Vercel 部署：&lt;a href=&quot;https://vercel.com/new&quot;&gt;Create New Project&lt;/a&gt;&lt;br /&gt;
需要填写相关变量:
&lt;ul&gt;
&lt;li&gt;填写获取 API Key 的方法：
&lt;ul&gt;
&lt;li&gt;Env Name: &lt;code&gt;mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Env Value: &lt;code&gt;local&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;填写请求地址（在 PCL 主页需要通过&lt;strong&gt;点击一个按钮&lt;/strong&gt;来向&lt;strong&gt;你所部署的服务器&lt;/strong&gt;发送一个请求，所以这个 &lt;code&gt;请求地址&lt;/code&gt; 需要填写部署好的链接）:
&lt;ul&gt;
&lt;li&gt;Env Name: &lt;code&gt;link&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Env Value：域名或 IP 地址，&lt;strong&gt;必须以 http 开头&lt;/strong&gt;
:::TIP[提示]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;如果不知道怎么填写 &lt;code&gt;link&lt;/code&gt;，请按照下列指示操作：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;先不填这个变量 &lt;code&gt;link&lt;/code&gt;。但是上面 &lt;code&gt;mode&lt;/code&gt; &lt;strong&gt;需要填&lt;/strong&gt;，填完&lt;strong&gt;直接部署&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;部署完成后建议&lt;strong&gt;绑定自定义域名&lt;/strong&gt;。也可以尝试做&lt;strong&gt;Vercel 优选&lt;/strong&gt;（非必须）。&lt;/li&gt;
&lt;li&gt;来到 Vercel 项目的 &lt;strong&gt;Settings&lt;/strong&gt;，在左侧菜单选择 &lt;strong&gt;Environment Variables&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Key&lt;/code&gt; 填入 &lt;code&gt;link&lt;/code&gt;；&lt;code&gt;Value&lt;/code&gt; 填入 &lt;strong&gt;部署后的链接（优先选有绑定好的自定义域名）&lt;/strong&gt;（如&lt;code&gt;https:/url.pcl-community.org&lt;/code&gt; 或 &lt;code&gt;https://pih.vercel.app&lt;/code&gt;）&lt;strong&gt;必须带上协议！&lt;/strong&gt; 如 &lt;code&gt;http://&lt;/code&gt; 和 &lt;code&gt;https://&lt;/code&gt;。&lt;br /&gt;
关于 &lt;code&gt;link&lt;/code&gt; 能填什么，例如说，我在 &lt;strong&gt;Domains&lt;/strong&gt; 内绑定了几个域名，只有以 &lt;code&gt;.vercel.app&lt;/code&gt; 结尾的地址是 Vercel 给的，其他剩下的域名是自己的（不包括 &lt;code&gt;pclc.cc&lt;/code&gt;），所以变量 &lt;code&gt;link&lt;/code&gt; 就为&lt;strong&gt;除 &lt;code&gt;vercel.app&lt;/code&gt; 之外的域名&lt;/strong&gt;，如 &lt;strong&gt;pclai.adclosenn.top&lt;/strong&gt;。如果你不在海外，就不要选带 &lt;code&gt;vercel.app&lt;/code&gt; 的域名了。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/vercel-pcl-intelligence-homepage-domains-panel.DDvdkdU4_ZgzxlW.webp&quot; alt=&quot;vercel-pcl-intelligence-homepage-domains-panel&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Save&lt;/code&gt; 按钮，保存变量。&lt;/li&gt;
&lt;li&gt;点击右下角弹出的 &lt;code&gt;Redeploy&lt;/code&gt; 按钮，重新部署 &lt;img src=&quot;https://blog.adclosenn.top/_astro/vercel-redeploy.B6Lgpbic_27ApMx.webp&quot; alt=&quot;Redeploy&quot; /&gt;
:::&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;部署完成后，就可以把链接填在 PCL 的&lt;strong&gt;自定义主页-联网获取&lt;/strong&gt;了。&lt;strong&gt;不要&lt;/strong&gt;填我的，要填你部署后用的链接。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/pcl-settings-homepage-online.ChEbk1FU_Z1RbNEr.webp&quot; alt=&quot;pcl-settings-homepage-online&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;单 API Key 模式（推荐轻度使用）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用 Vercel 部署：&lt;a href=&quot;https://vercel.com/new&quot;&gt;Create New Project&lt;/a&gt;&lt;br /&gt;
需要填写相关变量:
&lt;ul&gt;
&lt;li&gt;填写 API Key：
&lt;ul&gt;
&lt;li&gt;Env Name: &lt;code&gt;api_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Env Value: &lt;code&gt;你的单个 API Key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;填写请求地址（在 PCL 主页需要通过&lt;strong&gt;点击一个按钮&lt;/strong&gt;来向&lt;strong&gt;你所部署的服务器&lt;/strong&gt;发送一个请求，所以这个 &lt;code&gt;请求地址&lt;/code&gt; 需要填写部署好的链接）:
&lt;ul&gt;
&lt;li&gt;Env Name: &lt;code&gt;link&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Env Value：域名或 IP 地址，&lt;strong&gt;必须以 http 开头&lt;/strong&gt;
:::TIP[提示]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;如果不知道怎么填写 &lt;code&gt;link&lt;/code&gt;，请返回查看 &lt;a href=&quot;#%E5%A6%82%E6%9E%9C%E4%B8%8D%E7%9F%A5%E9%81%93%E6%80%8E%E4%B9%88%E5%A1%AB%E5%86%99-link%E8%AF%B7%E6%8C%89%E7%85%A7%E4%B8%8B%E5%88%97%E6%8C%87%E7%A4%BA%E6%93%8D%E4%BD%9C&quot;&gt;#如果不知道怎么填写 &lt;code&gt;link&lt;/code&gt; 请按照下列指示操作&lt;/a&gt;，无需填写 &lt;code&gt;mode&lt;/code&gt;！&lt;/h3&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;部署完成后，就可以把链接填在 PCL 的&lt;strong&gt;自定义主页-联网获取&lt;/strong&gt;了。&lt;strong&gt;不要&lt;/strong&gt;填我的，要填你部署后用的链接。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/pcl-settings-homepage-online.ChEbk1FU_Z1RbNEr.webp&quot; alt=&quot;pcl-settings-homepage-online&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;p&gt;:::TIP[提示]
如果你把 &lt;code&gt;api_key&lt;/code&gt; 和 &lt;code&gt;mode&lt;/code&gt; 都填了，其使用的顺序为 &lt;code&gt;mode&lt;/code&gt;&amp;gt;&lt;code&gt;api_key&lt;/code&gt;（也就是优先使用多个 API Key）。&lt;br /&gt;
如果你什么都不填，或者 &lt;code&gt;mode&lt;/code&gt; 填的不是 &lt;code&gt;local&lt;/code&gt; 或 以&lt;code&gt;http&lt;/code&gt;开头的链接，会报 &lt;strong&gt;500 内部服务器错误&lt;/strong&gt;。
:::&lt;/p&gt;
&lt;h1&gt;解答&lt;/h1&gt;
&lt;h2&gt;什么是“多 API Key 模式”？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;#%E9%9C%80%E6%B1%82&quot;&gt;返回 #需求&lt;/a&gt; | &lt;a href=&quot;#%E9%83%A8%E7%BD%B2&quot;&gt;返回 #部署&lt;/a&gt;&lt;br /&gt;
Google Gemini API 有速率限制，详情可以查看这张图片，或直接去 &lt;a href=&quot;https://ai.google.dev/gemini-api/docs/rate-limits&quot;&gt;官网&lt;/a&gt; 查询：&lt;/p&gt;
&lt;p&gt;:::TIP[提示]
&lt;strong&gt;Free Tier&lt;/strong&gt;：免费层级&lt;br /&gt;
&lt;strong&gt;RPM&lt;/strong&gt;（&lt;strong&gt;R&lt;/strong&gt;equests &lt;strong&gt;P&lt;/strong&gt;er &lt;strong&gt;M&lt;/strong&gt;inute）：每分钟&lt;strong&gt;请求数&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;TPM&lt;/strong&gt;（&lt;strong&gt;T&lt;/strong&gt;oken &lt;strong&gt;P&lt;/strong&gt;er &lt;strong&gt;M&lt;/strong&gt;inute） ：每分钟&lt;strong&gt;输入数&lt;/strong&gt;（令牌数）&lt;br /&gt;
&lt;strong&gt;RPD&lt;/strong&gt;（&lt;strong&gt;R&lt;/strong&gt;equests &lt;strong&gt;P&lt;/strong&gt;er &lt;strong&gt;D&lt;/strong&gt;ay）：每日&lt;strong&gt;请求数&lt;/strong&gt;
:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i0.hdslb.com/bfs/new_dyn/c5ece227ed85f47003badc39d232a7293493090681686120.png&quot; alt=&quot;GOOGLE_API_Limit&quot; /&gt;&lt;/p&gt;
&lt;p&gt;单 API Key 每天只能用 &lt;strong&gt;Gemini 2.5 Flash&lt;/strong&gt; 250 次。而&lt;strong&gt;每个&lt;/strong&gt; API Key 是&lt;strong&gt;单独计算&lt;/strong&gt;请求数量的，所以当我们把多个 API Key 一起用的时候就可以请求 &lt;code&gt;250*n&lt;/code&gt; 次（取决于模型 &lt;strong&gt;RPD&lt;/strong&gt; 和 Key &lt;strong&gt;数量&lt;/strong&gt;）。&lt;/p&gt;
</content:encoded></item><item><title>什么？Telegram 能直连了？</title><link>https://blog.adclosenn.top/posts/directly-connect-telegram/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/directly-connect-telegram/</guid><description>2025/8/8 早上，Telegram 竟可在国内被访问，不过现在失效了（悲）</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Telegram 能直连了？&lt;/h1&gt;
&lt;h3&gt;目前已被墙&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://t.me/zaihuapd/34943&quot;&gt;t.me/zaihuapd/34943&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;今早部分地区 GFW 放松了对 Telegram DC5 的封锁

根据多位 TG 用户测试，目前 Telegram DC5 可以在部分地区直接连接，而无需通过任何代理。

这可能是 Telegram 所在 IP 进行变更，GFW 未及时更新响应导致。

请问各位所在地区是否可以直连？

群友补充：DC5 数据中心和官网都很绿

群友目前反馈，已经无法直连
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note[笔记]
仅 DC5（数据中心） 用户（包括手机号+86）可直连
&lt;img src=&quot;https://blog.adclosenn.top/_astro/telegram-dc-list.x3x_Qin0_ZJcF99.webp&quot; alt=&quot;telegram-dc-list&quot; /&gt;
:::&lt;/p&gt;
&lt;p&gt;8月8日早上 6:40 &lt;strong&gt;之前&lt;/strong&gt;，GFW 放开了对 Telegram 的限制。不幸的是，仅仅几小时的 9:30 左右，GFW 已再次封禁 Telegram 的访问。 &lt;s&gt;默哀&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;除此之外&lt;/h2&gt;
&lt;p&gt;另外，再扯一个 Cloudflare Warp，它具有国内直连节点。概率连上后，Google 将会显示国内 Cloudflare Warp IP。&lt;/p&gt;
&lt;h1&gt;合影留念&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Telegram &lt;strong&gt;China&lt;/strong&gt; IP： &lt;img src=&quot;https://blog.adclosenn.top/_astro/telegram-devices-panel.DQrglH4O_E2M2D.webp&quot; alt=&quot;telegram-devices-panel&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Telegram &lt;strong&gt;中国上海市&lt;/strong&gt; IP：（错误的定位） &lt;img src=&quot;https://blog.adclosenn.top/_astro/telegram-devices-panel-shanghai-ip.CvWtP605_Z19tLa3.webp&quot; alt=&quot;telegram-devices-panel-shanghai-ip&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;Google &lt;strong&gt;广西&lt;/strong&gt; IP（Cloudflare Warp）： &lt;img src=&quot;https://blog.adclosenn.top/_astro/google-guangxi-ip.CU9PLysB_Z14gDu6.webp&quot; alt=&quot;google-guangxi-ip&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Google &lt;strong&gt;中国浙江省杭州市&lt;/strong&gt; IP（错误的定位，Cloudflare Warp）： &lt;img src=&quot;https://blog.adclosenn.top/_astro/google-zhejiang-hangzhou-ip.DLaYqEbF_ZevMrF.webp&quot; alt=&quot;google-zhejiang-hangzhou-ip&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>手把手自托管 Umami</title><link>https://blog.adclosenn.top/posts/umami/</link><guid isPermaLink="true">https://blog.adclosenn.top/posts/umami/</guid><description>Umami 是一个精美的网站统计分析工具，我们可以自托管它以解除官方限制</description><pubDate>Thu, 07 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;自行托管 Umami&lt;/h1&gt;
&lt;h2&gt;什么是 Umami&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://umami.is&quot;&gt;Umami&lt;/a&gt; 是一个&lt;a href=&quot;https://github.com/umami-software/umami&quot;&gt;开源的&lt;/a&gt;的网站统计工具。与 &lt;a href=&quot;https://developers.google.com/analytics&quot;&gt;Google Analytics&lt;/a&gt; 类似，但比 Google Analytics 的网页 UI 更简洁、精美。&lt;/p&gt;
&lt;h2&gt;为什么要自托管&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://umami.is&quot;&gt;Umami&lt;/a&gt; 可搭配 &lt;a href=&quot;https://cloud.umami.is/signup&quot;&gt;Umami Cloud&lt;/a&gt; 托管 Umami App。但是这种方式相比自托管有诸多限制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;事件：100,000 次/月&lt;/li&gt;
&lt;li&gt;被分析的网站：3 个/账号&lt;/li&gt;
&lt;li&gt;数据保留：6 个月&lt;/li&gt;
&lt;li&gt;有限的 API 访问&lt;/li&gt;
&lt;li&gt;...更多可在 &lt;a href=&quot;https://umami.is/pricing&quot;&gt;umami/pricing&lt;/a&gt; 中查看&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一个托管平台账号（任选其一）。本教程以 &lt;a href=&quot;https://www.netlify.com&quot;&gt;Netlify&lt;/a&gt; 为托管平台演示。
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.netlify.com&quot;&gt;Netlify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vercel.com&quot;&gt;Vercel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cloudflare.com&quot;&gt;Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://render.com&quot;&gt;Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://railway.app&quot;&gt;Railway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;...等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一个 &lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; 账号。&lt;/li&gt;
&lt;li&gt;一个数据库。本教程以 &lt;a href=&quot;https://neon.com&quot;&gt;Neon&lt;/a&gt; 为数据库演示。
:::warning[注意]
Neon 仍有使用限制：&lt;a href=&quot;https://neon.com/pricing&quot;&gt;https://neon.com/pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;500 MB 存储空间
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;自托管&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;来到 &lt;a href=&quot;https://console.neon.tech/signup&quot;&gt;Neon/signup&lt;/a&gt; 注册一个账号（注册过的直接去到 &lt;a href=&quot;https://console.neon.tech&quot;&gt;console.neon.tech&lt;/a&gt; ）。&lt;/li&gt;
&lt;li&gt;注册后来到 &lt;a href=&quot;https://console.neon.tech&quot;&gt;console.neon.tech&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Create Project&lt;/strong&gt; 按钮。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/neon-noproject-create-project.DUlrTMe6_1KL4A5.webp&quot; alt=&quot;neon-noproject-create-project&quot; /&gt;&lt;/li&gt;
&lt;li&gt;取一个项目名字，填到 &lt;strong&gt;Project name&lt;/strong&gt;。&lt;strong&gt;Cloud service provider&lt;/strong&gt; 和 &lt;strong&gt;Region&lt;/strong&gt; 随便选一个即可。然后点击 &lt;strong&gt;Create&lt;/strong&gt; 按钮创建项目。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/neon-create-project-menu.0hyLvnFw_Zz4rpk.webp&quot; alt=&quot;neon-create-project-menu&quot; /&gt;&lt;/li&gt;
&lt;li&gt;在项目的 &lt;strong&gt;Dashboard&lt;/strong&gt; 内点击右上角的 &lt;strong&gt;Connect&lt;/strong&gt; 按钮，在 Connect 页面下方点击 &lt;strong&gt;Show password&lt;/strong&gt;，将 &lt;code&gt;psql &apos;&lt;/code&gt; 后，末尾 &lt;code&gt;&apos;&lt;/code&gt; 前的内容复制下来。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/neon-connect-to-your-database.BGEthgVj_duRlv.webp&quot; alt=&quot;neon-connect-to-your-database&quot; /&gt;&lt;/li&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://github.com/umami-software/umami/fork&quot;&gt;@umami-software/umami&lt;/a&gt; ，将 umami 仓库 fork 到你的账户下。&lt;/li&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://app.netlify.com/start&quot;&gt;Netlify/start&lt;/a&gt;，在 &lt;strong&gt;Let’s deploy your project with…&lt;/strong&gt; 里选择 &lt;strong&gt;GitHub&lt;/strong&gt; 并授权到你的 GitHub 账户。&lt;/li&gt;
&lt;li&gt;选择刚刚 fork 的 umami 仓库 &lt;img src=&quot;https://blog.adclosenn.top/_astro/netlify-deploy-menu-umami.CTqGmFOH_Z1xH0Sh.webp&quot; alt=&quot;netlify-deploy-menu-umami&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project name&lt;/strong&gt; 随便填，&lt;strong&gt;Build Command&lt;/strong&gt; 请填写 &lt;code&gt;yarn run build&lt;/code&gt;（而不是系统给的 &lt;code&gt;pnpm run build-app&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;往下找到 &lt;strong&gt;Environment variables&lt;/strong&gt;，点击 &lt;strong&gt;Add environment variables&lt;/strong&gt;，选择 &lt;strong&gt;Add ket/value pairs&lt;/strong&gt;。&lt;code&gt;Key&lt;/code&gt; 中填写 &lt;code&gt;DATABASE_URL&lt;/code&gt;，&lt;code&gt;Value&lt;/code&gt; 填写在 &lt;a href=&quot;https://console.neon.tech/&quot;&gt;Neon Console&lt;/a&gt; （步骤5）中复制的链接。填写完毕后点击 &lt;strong&gt;Deploy umami&lt;/strong&gt; 按钮来部署。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/netlify-create-project-detail.CqHR_ssb_Z1sR7qQ.webp&quot; alt=&quot;netlify-create-project-detail&quot; /&gt;&lt;/li&gt;
&lt;li&gt;如果有自定义域名可以绑定自定义域名，优选等一些列步骤。这里就不多赘述了。&lt;/li&gt;
&lt;li&gt;访问部署好的 Umami 网页，第一次进入需要输入&lt;strong&gt;默认&lt;/strong&gt;账号和密码。登录 Umami 后台成功后请尽快修改密码。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Username&lt;/strong&gt;：&lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;/strong&gt;：&lt;code&gt;umami&lt;/code&gt;
&lt;img src=&quot;https://blog.adclosenn.top/_astro/umami-login-panel.BrwIWxVi_Z1NLvGI.webp&quot; alt=&quot;umami-login-panel&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;登录成功后，可以在右上角切换&lt;strong&gt;显示语言&lt;/strong&gt;。 &lt;img src=&quot;https://blog.adclosenn.top/_astro/umami-language-panel.DkA-Hw29_ZLmDlV.webp&quot; alt=&quot;umami-language-panel&quot; /&gt;&lt;/li&gt;
&lt;li&gt;至此，你已成功自托管一个 Umami 网站统计工具。恭喜你。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;注意事项&lt;/h1&gt;
&lt;p&gt;:::caution[提示]&lt;/p&gt;
&lt;h3&gt;[非必须]&lt;/h3&gt;
&lt;p&gt;Umami 对于从台湾地区传来的请求，默认展示为 &lt;strong&gt;ROC Flag + 台湾&lt;/strong&gt;。如需更改，请手动更改 Umami 文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/public/datamaps.world.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/public/images/country/tw.png&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/public/intl/country/zh-CN.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/public/intl/country/zh-TW.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>