<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>说明书 on tequila sunset</title><link>https://e6b0d3c5.newhugoblog.pages.dev/categories/%E8%AF%B4%E6%98%8E%E4%B9%A6/</link><description>Recent content in 说明书 on tequila sunset</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 19 Apr 2026 15:15:38 +0800</lastBuildDate><atom:link href="https://e6b0d3c5.newhugoblog.pages.dev/categories/%E8%AF%B4%E6%98%8E%E4%B9%A6/index.xml" rel="self" type="application/rss+xml"/><item><title>shadowrocket使用手册（搬运）</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/shadowrocket%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C%E6%90%AC%E8%BF%90/</link><pubDate>Sun, 19 Apr 2026 15:15:38 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/shadowrocket%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C%E6%90%AC%E8%BF%90/</guid><description>&lt;p&gt;&lt;a class="link" href="https://github.com/LOWERTOP/Shadowrocket" title="仓库地址"&#10; target="_blank" rel="noopener"&#10; &gt;&lt;img alt="Shadowrocket" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://socialify.git.ci/LOWERTOP/Shadowrocket/image?custom_description=%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C%0AUser+Manual&amp;description=1&amp;font=Rokkitt&amp;logo=https%3A%2F%2Fraw.githubusercontent.com%2FLOWERTOP%2FShadowrocket-First%2Frefs%2Fheads%2Fmain%2Fimg%2FShadowrocket.png&amp;name=1&amp;pattern=Plus&amp;theme=Light"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;本使用手册以 &lt;strong&gt;&lt;a class="link" href="https://t.me/ShadowrocketApp" target="_blank" rel="noopener"&#10; &gt;Shadowrocket 官方群组&lt;/a&gt;&lt;/strong&gt; 使用的关键词列表文件为基础进行完善更新，包含软件绝大多数功能的介绍和部分常见问题的解答，以期能够帮助用户更好的理解和使用 Shadowrocket 软件。本仓以普通用户的身份对原作者及所有为相关项目做出贡献的人表示由衷的感谢！其他使用需求可尝试查看 &lt;strong&gt;&lt;a class="link" href="https://github.com/LOWERTOP/Shadowrocket-First" target="_blank" rel="noopener"&#10; &gt;配色与配置仓库&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;blockquote class="alert alert-tip"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;💡&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;提示&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://lowertop.github.io/Shadowrocket/lazy_group.conf" title="含策略组版本"&#10; target="_blank" rel="noopener"&#10; &gt;懒人配置&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;lowertop&lt;span style="color:#f92672"&gt;.&lt;/span&gt;github&lt;span style="color:#f92672"&gt;.&lt;/span&gt;io&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Shadowrocket&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;lazy_group&lt;span style="color:#f92672"&gt;.&lt;/span&gt;conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;懒人配置是专为 Shadowrocket 打造的开箱即用的配置文件，首发于 &lt;a class="link" href="https://t.me/ShadowrocketApp" target="_blank" rel="noopener"&#10; &gt;官方群组&lt;/a&gt;。该配置文件优化了各项设置并内置了常用的规则/规则集以及常用的代理分组/策略组，同时包含详细的参数说明，可在纯文本模式下详细查阅，适合几乎任何阶段的用户使用&lt;/p&gt;&#10;&lt;p&gt;本仓与官方群组发布的版本同步更新，&lt;a class="link" href="https://github.com/Johnshall/Shadowrocket-ADBlock-Rules-Forever" target="_blank" rel="noopener"&#10; &gt;Johnshall&lt;/a&gt; 的版本也与本仓保持同步。对新手用户而言更推荐 &lt;a class="link" href="https://t.me/ShadowrocketApp" target="_blank" rel="noopener"&#10; &gt;访问官方群组&lt;/a&gt; 使用离线版本&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h1 id="shadowrocket-使用手册"&gt;&lt;a class="link" href="https://lowertop.github.io/Shadowrocket/" title="发布页面"&#10; target="_blank" rel="noopener"&#10; &gt;Shadowrocket 使用手册&lt;/a&gt;&#10;&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="https://apps.apple.com/us/app/shadowrocket/id932747118" title="AppStore"&#10; target="_blank" rel="noopener"&#10; &gt;&lt;img alt="AppStore" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://shadowlaunch.com/static/appstore.svg"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;blockquote class="alert alert-note"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;📝&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;备注&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://apps.apple.com/us/app/shadowrocket/id932747118" target="_blank" rel="noopener"&#10; &gt;Shadowrocket&lt;/a&gt;&lt;/strong&gt;（常被用户称为 &lt;strong&gt;小火箭&lt;/strong&gt;）是一款由 &lt;strong&gt;&lt;a class="link" href="https://shadowlaunch.com/" target="_blank" rel="noopener"&#10; &gt;Shadow Launch Technology Limited&lt;/a&gt;&lt;/strong&gt; 专为 iOS 设备开发的网络代理工具，同时也支持 Apple TV 等设备，软件自 &lt;strong&gt;&lt;a class="link" href="https://t.me/ShadowrocketNews/1047" target="_blank" rel="noopener"&#10; &gt;2.2.70 (2712)&lt;/a&gt;&lt;/strong&gt; 版本起已正式支持 macOS&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;官方群组：&lt;a class="link" href="https://t.me/ShadowrocketApp" target="_blank" rel="noopener"&#10; &gt;Shadowrocket App&lt;/a&gt;&lt;br&gt;&#10;官方频道：&lt;a class="link" href="https://t.me/ShadowrocketNews" target="_blank" rel="noopener"&#10; &gt;Shadowrocket News&lt;/a&gt;&lt;br&gt;&#10;反馈邮箱：&lt;a class="link" href="mailto:buginapp@gmail.com" &gt;buginapp@gmail.com&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="使用目录"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;使用目录&lt;/a&gt;&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;点击 &lt;strong&gt;目录标题&lt;/strong&gt; 可以快速定位到相关正文&lt;br&gt;&#10;点击正文的 &lt;strong&gt;蓝色标题&lt;/strong&gt; 可以快速回到目录&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%bd%af%e4%bb%b6%e9%a6%96%e9%a1%b5" &gt;首页&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%bf%ab%e9%80%9f%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" &gt;快速使用方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%8a%82%e7%82%b9" &gt;添加节点&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%8d%8f%e8%ae%ae%e7%b1%bb%e5%9e%8b" &gt;协议类型&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9b%b4%e6%96%b0%e8%ae%a2%e9%98%85%e8%8a%82%e7%82%b9" &gt;更新订阅节点&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%8a%82%e7%82%b9%e6%8e%92%e5%ba%8f" &gt;节点排序&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%8a%82%e7%82%b9%e5%88%86%e4%ba%ab%e4%b8%8e%e6%95%b4%e7%90%86" &gt;节点分享与整理&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%ae%a2%e9%98%85%e8%8a%82%e7%82%b9%e7%ad%9b%e9%80%89" &gt;订阅节点筛选&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e9%80%9a%e8%bf%87%e4%bb%a3%e7%90%86%e9%93%be" &gt;代理通过/代理链&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%85%a8%e5%b1%80%e8%b7%af%e7%94%b1" &gt;全局路由&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%bf%9e%e9%80%9a%e6%80%a7%e6%b5%8b%e8%af%95" &gt;连通性测试&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bf%ae%e6%94%b9%e6%b5%8b%e8%af%95%e5%9c%b0%e5%9d%80" &gt;修改测试地址&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%9c%ba%e6%99%af" &gt;场景&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%ae%80%e5%8d%95%e6%a8%a1%e5%bc%8f" &gt;简单模式&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%90%af%e7%94%a8%e5%9b%9e%e9%80%80" &gt;启用回退&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e9%a1%b5%e9%9d%a2" &gt;配置&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%be%91%e9%85%8d%e7%bd%ae" &gt;编辑配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;编辑纯文本&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%a2%84%e8%a7%88%e9%85%8d%e7%bd%ae" &gt;预览配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9b%b4%e6%96%b0%e9%85%8d%e7%bd%ae" &gt;更新配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%87%8d%e6%96%b0%e5%91%bd%e5%90%8d" &gt;重新命名&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%af%bc%e5%87%ba%e9%85%8d%e7%bd%ae" &gt;导出配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%89%a9%e5%b1%95%e9%85%8d%e7%bd%ae" &gt;扩展配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;通用参数&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%9a%90%e5%bc%8f%e5%8f%82%e6%95%b0" &gt;隐式参数&lt;/a&gt;💡&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%a7%84%e5%88%99" &gt;添加规则&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%a7%84%e5%88%99%e4%bc%98%e5%85%88%e7%ba%a7" &gt;规则优先级&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%b1%bb%e5%9e%8b" &gt;规则类型&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%ad%96%e7%95%a5" &gt;规则策略&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%ad%96%e7%95%a5%e6%89%a9%e5%b1%95%e5%8f%82%e6%95%b0" &gt;策略扩展参数&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#app%e5%88%86%e6%b5%81" &gt;APP分流&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9b%b4%e6%96%b0%e8%a7%84%e5%88%99%e9%9b%86" &gt;更新规则集&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%a2%84%e8%a7%88%e8%a7%84%e5%88%99%e9%9b%86" &gt;预览规则集&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bf%ae%e6%94%b9dns" &gt;修改DNS&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#dns-over-proxy" &gt;DNS-over-PROXY&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#no-resolve%e7%9a%84%e4%bd%9c%e7%94%a8" &gt;no-resolve的作用&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84" &gt;代理分组&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84%e7%b1%bb%e5%9e%8b" &gt;代理分组类型&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%9a%90%e8%97%8f%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84" &gt;隐藏代理分组&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1" &gt;负载均衡&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%a7%84%e5%88%99%e9%9b%86url" &gt;规则集URL&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%84%9a%e6%9c%acurl" &gt;脚本URL&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%a4%8d%e5%88%b6%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;复制配置文件&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9b%bf%e6%8d%a2%e7%ad%96%e7%95%a5" &gt;替换策略&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b5%8b%e8%af%95%e8%a7%84%e5%88%99" &gt;测试规则&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#hosts" &gt;Hosts&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#url%e9%87%8d%e5%86%99" &gt;URL重写&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%a4%b4%e9%83%a8%e9%87%8d%e5%86%99" &gt;头部重写&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%ad%a3%e6%96%87%e9%87%8d%e5%86%99" &gt;正文重写&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9c%ac%e5%9c%b0%e6%98%a0%e5%b0%84" &gt;本地映射&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#https%e8%a7%a3%e5%af%86" &gt;HTTPS解密&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%84%9a%e6%9c%ac" &gt;脚本&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%a8%a1%e5%9d%97" &gt;模块&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%be%91%e5%8f%82%e6%95%b0" &gt;编辑参数&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%af%81%e4%b9%a6%e6%a8%a1%e5%9d%97" &gt;证书模块&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%ba%ab%e4%bb%bd%e8%af%81%e4%b9%a6%e5%af%86%e7%a0%81" &gt;身份证书密码&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e5%86%99%e6%9c%ac%e5%9c%b0%e8%8a%82%e7%82%b9" &gt;编写本地节点&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%95%b0%e6%8d%ae%e9%a1%b5%e9%9d%a2" &gt;数据&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e6%97%a5%e5%bf%97" &gt;代理日志&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#dns%e6%97%a5%e5%bf%97" &gt;DNS日志&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#icloud%e8%87%aa%e5%8a%a8%e5%90%8c%e6%ad%a5" &gt;iCloud自动同步&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%8a%82%e7%82%b9%e6%95%b0%e6%8d%ae%e7%ae%a1%e7%90%86" &gt;节点数据管理&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b5%81%e9%87%8f%e7%bb%9f%e8%ae%a1%e4%bf%a1%e6%81%af" &gt;流量统计信息&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%ae%be%e7%bd%ae%e9%a1%b5%e9%9d%a2" &gt;设置&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%bb%b6%e8%bf%9f%e6%b5%8b%e8%af%95%e6%96%b9%e6%b3%95" &gt;延迟测试方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%b0%8f%e7%bb%84%e4%bb%b6" &gt;小组件&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%a2%9c%e8%89%b2" &gt;颜色&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%8c%89%e9%9c%80%e6%b1%82%e8%bf%9e%e6%8e%a5" &gt;按需求连接&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%9a%a7%e9%81%93" &gt;隧道&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%85%bc%e5%ae%b9%e6%a8%a1%e5%bc%8f" &gt;兼容模式&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%89%8d%e7%bd%ae%e4%bb%a3%e7%90%86" &gt;前置代理&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%85%b1%e4%ba%ab" &gt;代理共享&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e7%b1%bb%e5%9e%8b" &gt;代理类型&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%bc%80%e5%90%afudp%e8%bd%ac%e5%8f%91" &gt;开启UDP转发&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%a6%81%e7%94%a8stun" &gt;禁用STUN&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9d%83%e9%99%90" &gt;权限&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%9a%90%e8%97%8fvpn%e5%9b%be%e6%a0%87" &gt;隐藏VPN图标&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#geoip%e6%95%b0%e6%8d%ae%e5%ba%93" &gt;GEOIP数据库&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%87%aa%e5%8a%a8%e6%9b%b4%e6%96%b0" &gt;自动更新&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b8%a9%e5%92%8c%e7%ad%96%e7%95%a5%e6%9c%ba%e5%88%b6" &gt;温和策略机制&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%85%b6%e4%bb%96%e9%97%ae%e9%a2%98" &gt;其他&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%87%aa%e5%8a%a8%e5%88%87%e6%8d%a2%e8%8a%82%e7%82%b9" &gt;自动切换节点&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%ae%a2%e9%98%85%e5%bc%82%e5%b8%b8" &gt;订阅异常&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%8a%82%e7%82%b9%e6%97%97%e5%b8%9c" &gt;节点旗帜&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%8a%82%e7%82%b9%e6%84%9f%e5%8f%b9%e5%8f%b7" &gt;节点感叹号&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%be%ae%e4%bf%a1%e8%bd%ac%e5%9c%88" &gt;微信转圈&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%a8%a1%e5%9d%97%e6%b6%88%e5%a4%b1" &gt;模块消失&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%a8%a1%e5%9d%97%e5%a4%b1%e6%95%88" &gt;模块失效&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#vpn%e8%87%aa%e5%8a%a8%e6%96%ad%e5%bc%80" &gt;VPN自动断开&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%a3%80%e6%b5%8b%e4%bb%a3%e7%90%86" &gt;检测代理&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%af%91%e5%8e%9f%e5%9b%a0" &gt;编译原因&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#url-schemes" &gt;URL-Schemes&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="软件首页"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;软件首页&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 id="快速使用方法"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;快速使用方法&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a class="link" href="#%e8%bd%af%e4%bb%b6%e9%a6%96%e9%a1%b5" &gt;首页&lt;/a&gt; &amp;gt; &lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%8a%82%e7%82%b9" &gt;添加节点&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a class="link" href="#%e8%ae%be%e7%bd%ae%e9%a1%b5%e9%9d%a2" &gt;设置&lt;/a&gt; &amp;gt; &lt;a class="link" href="#%e5%bb%b6%e8%bf%9f%e6%b5%8b%e8%af%95%e6%96%b9%e6%b3%95" &gt;延迟测试方法&lt;/a&gt; &amp;gt; &lt;strong&gt;CONNECT&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a class="link" href="#%e8%bd%af%e4%bb%b6%e9%a6%96%e9%a1%b5" &gt;首页&lt;/a&gt; &amp;gt; &lt;a class="link" href="#%e8%bf%9e%e9%80%9a%e6%80%a7%e6%b5%8b%e8%af%95" &gt;连通性测试&lt;/a&gt; &amp;gt; 选可用节点连接&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首次启动会提示 &lt;strong&gt;安装VPN配置文件&lt;/strong&gt;，请点击 &lt;strong&gt;好&lt;/strong&gt; 和 &lt;strong&gt;允许&lt;/strong&gt; 才能正常使用&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="添加节点"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;添加节点&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 兼容多种服务器订阅格式，以及支持多种 &lt;a class="link" href="#%e5%8d%8f%e8%ae%ae%e7%b1%bb%e5%9e%8b" &gt;代理协议类型&lt;/a&gt; 包括 &lt;a class="link" href="#%e6%b7%bb%e5%8a%a0wireguard%e8%8a%82%e7%82%b9" &gt;WireGuard 节点&lt;/a&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首页 &amp;gt; 左上角 &amp;gt; 扫码添加&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;此操作须开启摄像头权限&lt;/em&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;复制节点链接，如 &lt;code&gt;trojan://*&lt;/code&gt;、&lt;code&gt;vmess://*&lt;/code&gt;、&lt;code&gt;vless://*&lt;/code&gt; 等，打开 Shadowrocket 时会自动识别导入&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;此操作须开启剪贴板读取权限&lt;/em&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首页 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt; &amp;gt; 类型 &lt;code&gt;Subscribe&lt;/code&gt; &amp;gt; URL 栏输入服务器订阅链接 &amp;gt; 保存&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;订阅链接后面加上 &lt;code&gt;#1&lt;/code&gt;、&lt;code&gt;#2&lt;/code&gt;、&lt;code&gt;#3&lt;/code&gt; 等，可以重复添加同一个订阅&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;长按服务器订阅可选 &lt;strong&gt;隐藏&lt;/strong&gt; 功能，启用后该订阅将默认不显示任何节点，该功能等同于在订阅编辑内的 &lt;strong&gt;最大值&lt;/strong&gt; 填写数字 &lt;code&gt;0&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首页 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt;，选择对应节点类型，填写节点配置信息并保存&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Shadowrocket 为了兼容部分其他类型的配置文件，也支持在配置文件中 &lt;a class="link" href="#%e7%bc%96%e5%86%99%e6%9c%ac%e5%9c%b0%e8%8a%82%e7%82%b9" &gt;编写本地节点&lt;/a&gt; 信息，但不要当作 &lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%8a%82%e7%82%b9" &gt;添加节点&lt;/a&gt; 的优先选择&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;若添加或更新订阅时出现异常，请参见 &lt;a class="link" href="#%e8%ae%a2%e9%98%85%e5%bc%82%e5%b8%b8" &gt;订阅异常&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;添加WireGuard节点&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首页 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt; &amp;gt; 类型选择 &lt;code&gt;WireGuard&lt;/code&gt;，填写配置信息&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;复制如下格式的 &lt;code&gt;WireGuard&lt;/code&gt; 配置信息，打开 Shadowrocket 时会自动弹出 &lt;strong&gt;添加对话框&lt;/strong&gt;，点击添加&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Interface&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;PrivateKey&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; xxxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;Address&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;172&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DNS&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;MTU&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1420&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Peer&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;PublicKey&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; xxxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;AllowedIPs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;AllowedIPs&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Endpoint = engage.cloudflareclient.com:2408&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;Reserved = 12,34,56&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果没有自动弹出对话框，可能是因为设置中的 &lt;strong&gt;允许检测剪贴板&lt;/strong&gt; 被关闭了，您可以重新打开，或者点击首页 &lt;strong&gt;连通性测试&lt;/strong&gt; 下方的 &lt;strong&gt;粘贴&lt;/strong&gt; 按钮，手动添加配置信息&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="协议类型"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;协议类型&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;现阶段已支持的协议类型&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Subscribe（订阅）、Shadowsocks、ShadowsocksR、Vmess、VLESS、Relay、Socks5、Socks5 Over TLS、HTTP、HTTPS、HTTP2、Trojan、Hysteria、Hysteria2、AnyTLS、TUIC、Juicity、SSH、WireGuard、Snell v1-3、Mieru、Brook、Lua&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;当前版本支持的协议可在 &lt;strong&gt;首页 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt; &amp;gt; 类型&lt;/strong&gt; 中查看&lt;/p&gt;&#10;&lt;p&gt;各协议节点的纯文本格式参见 &lt;a class="link" href="#%e7%bc%96%e5%86%99%e6%9c%ac%e5%9c%b0%e8%8a%82%e7%82%b9" &gt;编写本地节点&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="更新订阅节点"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;更新订阅节点&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;订阅右滑 &amp;gt; 更新&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击首页的更新订阅按钮🔄&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;设置 &amp;gt; 订阅 &amp;gt; 打开时更新（刷掉后台，重新打开应用程序时会自动更新订阅）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;设置 &amp;gt; 订阅 &amp;gt; 自动后台更新（需在系统 &lt;strong&gt;设置 &amp;gt; 通用 &amp;gt; 后台App刷新&lt;/strong&gt; 中开启对 Shadowrocket 的允许，更新周期可设1-24小时）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Shadowrocket 提供了 &lt;strong&gt;更新订阅&lt;/strong&gt; 的快捷指令，可以实现自动化操作&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;长按屏幕的应用图标 &amp;gt; 更新订阅&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;软件提供 &lt;a class="link" href="#%e8%87%aa%e5%8a%a8%e6%9b%b4%e6%96%b0" &gt;自动更新&lt;/a&gt; 服务&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;若添加或更新订阅时出现异常，请参见 &lt;a class="link" href="#%e8%ae%a2%e9%98%85%e5%bc%82%e5%b8%b8" &gt;订阅异常&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="节点排序"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;节点排序&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;设置 &amp;gt; 订阅 &amp;gt; 根据 &lt;code&gt;Ping&lt;/code&gt; 排序&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;该操作支持节点按照延迟测试后得到的延迟数值进行由低到高的自动排序&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="节点分享与整理"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;节点分享与整理&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;节点分享&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;长按节点 &amp;gt; 拷贝，可以把节点链接分享给其他设备&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;左滑节点 &amp;gt; 二维码，其他设备可以通过扫码添加节点（二维码页面点击右上角的 &lt;strong&gt;分享&lt;/strong&gt; 按钮，可以选择其他形式传送二维码）&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;节点二维码缺乏统一标准。当使用其他代理工具扫码添加某些节点时，可能会丢失部分节点信息，导致不能连接。如果遇到此问题，请仔细检查同一个节点的各项配置信息是否一致&lt;/em&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击节点后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标，滑动至页面底部，有多种分享节点的菜单&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;展开节点列表，点击连通性测试下方的编辑按钮 &lt;code&gt;•••&lt;/code&gt;，勾选需要分享的节点，点击左上角的 &lt;strong&gt;复制&lt;/strong&gt;，可以把多个节点链接同时分享给其他设备&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;节点整理&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;调整顺序&lt;/strong&gt;：点击编辑按钮 &lt;code&gt;•••&lt;/code&gt;，或者长按首页右上角的 &lt;code&gt;➕&lt;/code&gt;，即可进入编辑模式，按住订阅或节点后面的 &lt;code&gt;≡&lt;/code&gt; 图标可以调整订阅或节点之间的上下顺序（本地节点默认置顶位置）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;节点分类&lt;/strong&gt;：非订阅形式添加的节点，默认会归类为 &lt;strong&gt;本地节点&lt;/strong&gt;。如果需要重新对本地节点进行分类，可以使用 &lt;strong&gt;折叠&lt;/strong&gt; 功能。点击编辑按钮 &lt;code&gt;•••&lt;/code&gt;，勾选节点，点击左上角的 &lt;strong&gt;折叠&lt;/strong&gt;，为新分类的节点组命名（&lt;strong&gt;折叠&lt;/strong&gt; 功能可以选择本地节点或者订阅节点）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;删除节点&lt;/strong&gt;：点击编辑按钮 &lt;code&gt;•••&lt;/code&gt;，点击左上角的 &lt;strong&gt;删除&lt;/strong&gt;，可以选择删除全部节点或者删除连通性测试结果中的超时节点&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;滑动菜单&lt;/strong&gt;：向右滑动订阅，可以选择 &lt;strong&gt;测试&lt;/strong&gt; 当前订阅节点的连通性，或者 &lt;strong&gt;更新&lt;/strong&gt; 当前订阅节点。向右滑动节点，点击 &lt;strong&gt;测试&lt;/strong&gt; 可以获取单个节点的连通性测试结果，点击 &lt;strong&gt;复制&lt;/strong&gt;，可以在当前节点列表中新增一个同样配置信息的节点&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="订阅节点筛选"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;订阅节点筛选&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 支持通过脚本或正则表达式对订阅节点进行筛选，从而实现更灵活的节点过滤与管理&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;首页 &amp;gt; 订阅后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 过滤&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;节点筛选&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;保留节点名称含有关键词 A 和 B 的节点：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/(?=.*(A))^(?=.*(B))^.*$/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;保留节点名称含有关键词 A 或 B 的节点：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A&lt;span style="color:#f92672"&gt;|&lt;/span&gt;B&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;排除节点名称含有关键词 A 或 B 的节点：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/^((?!(A|B)).)*$/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;保留节点名称含有关键词 A 并排除含有关键词 B 的节点：&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;/(?=.*(A))^((?!(B)).)*$/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;分组、代理分组中的正则写法与上述【过滤】中使用的命令相同，但需删除前后 &lt;code&gt;/&lt;/code&gt; 符号&lt;/em&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;批量整理&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点订阅筛选功能支持使用脚本代码批量整理和修改相应订阅中节点的功能选项及节点名称&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;批量给节点中的关键词 a 替换成 b：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title&lt;span style="color:#f92672"&gt;.&lt;/span&gt;replace(&lt;span style="color:#e6db74"&gt;/关键词a/&lt;/span&gt;g,&lt;span style="color:#e6db74"&gt;&amp;#39;关键词b&amp;#39;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;批量给节点名称增加 abc 开头的关键词：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;abc&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;批量给节点名称增加 abc 结尾的关键词：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;abc&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;批量开启全部节点的片段：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;reserved&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1,40-60,30-50&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;批量开启全部节点的多路复用：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mux&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;批量设置全部订阅节点的 代理链/链式代理/代理通过，以下两种方式以生效者为准&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;chain&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;订阅名称/节点名称&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$server&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;dialer-proxy&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UUID值&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;其中 &lt;strong&gt;UUID 值&lt;/strong&gt; 可在中转节点或订阅的 JSON 文本中复制，第一种命令的 &lt;strong&gt;订阅名称/节点名称&lt;/strong&gt; 也可以使用 UUID 值&lt;/em&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;当节点名称不包含地区标识，且节点地址有可以分辨地区的关键词时，可以使用以下脚本为节点名称批量添加地区关键词或旗帜标识&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;/节点地址关键词/i&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;test($server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;host)) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;需要添加的关键词或旗帜&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt; $server&lt;span style="color:#f92672"&gt;.&lt;/span&gt;title&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;其他命令&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;该功能也支持更复杂的脚本指令，可以参阅 &lt;a class="link" href="https://github.com/LOWERTOP/Shadowrocket-First#%E7%AD%9B%E9%80%89%E8%AE%A2%E9%98%85%E8%84%9A%E6%9C%AC" target="_blank" rel="noopener"&#10; &gt;此处示例&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="代理通过代理链"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;代理通过/代理链&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当前代理通过另一个代理进行连接，支持多级链式代理，但并非所有协议都支持通过代理链作为落地节点使用。使用代理链方法：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;使用节点 A 连接，点击节点 A 后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标，&lt;strong&gt;代理通过&lt;/strong&gt; 选择节点 B，流量走向：&lt;code&gt;Client &amp;gt; B &amp;gt; A &amp;gt; Web server&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;支持使用分组/代理分组作为中转代理&lt;/li&gt;&#10;&lt;li&gt;支持批量修改订阅节点的代理链，可实现同时部署多个节点的链式代理。具体命令可查看 &lt;a class="link" href="#%e8%ae%a2%e9%98%85%e8%8a%82%e7%82%b9%e7%ad%9b%e9%80%89" &gt;订阅节点筛选 &amp;gt; 批量整理&lt;/a&gt; 中的相关指令&lt;/li&gt;&#10;&lt;li&gt;取消代理通过/代理链：点击开启该功能节点后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标，&lt;strong&gt;代理通过&lt;/strong&gt; 选择右上角的 &lt;strong&gt;取消&lt;/strong&gt; 后保存&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="全局路由"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;全局路由&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;配置&lt;/strong&gt;：流量根据设定规则进行分配，有些通过节点连接，有些则不通过&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;代理&lt;/strong&gt;：全部流量都通过同一个节点连接&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;直连&lt;/strong&gt;：全部流量都不通过节点连接&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;场景&lt;/strong&gt;：根据不同的网络连接类型（Wi-Fi、蜂窝数据）自动切换到预先设置的路由模式，并选择对应的配置文件和节点连接&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="连通性测试"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;连通性测试&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;点击首页的 &lt;strong&gt;连通性测试&lt;/strong&gt;，节点列表将会显示以毫秒（ms）为单位的延迟数字，这是数据包的传输时间，不同的 &lt;strong&gt;延迟测试方法&lt;/strong&gt; 对应不同的计算结果。长按首页的 &lt;strong&gt;连通性测试&lt;/strong&gt;，可以临时调整测试方法，仅对本次测试生效&lt;/p&gt;&#10;&lt;p&gt;设置 &amp;gt; 延迟测试方法&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;TCP&lt;/strong&gt;：建立 &lt;code&gt;TCP&lt;/code&gt; 连接的往返时间&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ICMP&lt;/strong&gt;：发送 &lt;code&gt;ICMP&lt;/code&gt; 回显请求报文和接收 &lt;code&gt;ICMP&lt;/code&gt; 回显应答报文的往返时间&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CONNECT&lt;/strong&gt;：向测试 URL 发送一个 &lt;code&gt;HTTP HEAD&lt;/code&gt; 请求，测量从发送请求到接收响应头部信息的往返时间&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;请优先选择 &lt;code&gt;CONNECT&lt;/code&gt;，因为它更能准确反映节点的连通性。延迟大小与网络上传下载速度没有直接关系，测速请使用其他方法，如：&lt;a class="link" href="https://www.speedtest.net" target="_blank" rel="noopener"&#10; &gt;https://www.speedtest.net&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="修改测试地址"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;修改测试地址&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;用于首页和分组节点的延迟测试&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;设置 &amp;gt; 延迟测试方法 &amp;gt; URL 测试设置&lt;/li&gt;&#10;&lt;li&gt;首页 &amp;gt; 连通性测试后面的圆形图标 &amp;gt; URL 测试设置&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;用于代理分组内节点的延迟测试&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 代理分组 &amp;gt; 编辑或添加包含自动测试类型的分组 &amp;gt; 最下方 URL 栏&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="场景"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;场景&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;场景是根据不同的网络连接类型（Wi-Fi、蜂窝数据）自动切换到预先设置的路由模式，并选择对应的配置文件和节点连接&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;首页 &amp;gt; 全局路由 &amp;gt; 设置的 &lt;strong&gt;场景&lt;/strong&gt; &amp;gt; 添加场景&lt;/li&gt;&#10;&lt;li&gt;为指定的网络连接类型设置对应的路由模式（&lt;strong&gt;配置、直连、代理&lt;/strong&gt;），类型（&lt;strong&gt;节点、分组&lt;/strong&gt;）、配置文件 及 备注&lt;/li&gt;&#10;&lt;li&gt;网络连接类型分别为：Wi-Fi、蜂窝数据、默认。选择Wi-Fi类型时，SSID需填写Wi-Fi名称&lt;/li&gt;&#10;&lt;li&gt;首页 &amp;gt; 全局路由 &amp;gt; 选择 &lt;strong&gt;场景&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;软件支持添加蜂窝数据场景，支持以 &lt;strong&gt;网络接口&lt;/strong&gt; 作为匹配条件&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;默认（留空）代表接口 &lt;code&gt;pdp_ip0&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;当设备启用了多个蜂窝数据网络时，可在 Shadowrocket 的 设置 &amp;gt; 诊断 &amp;gt; 网络 中查看对应的接口信息&lt;/li&gt;&#10;&lt;li&gt;输入格式：&lt;code&gt;pdp_ip1&lt;/code&gt;、&lt;code&gt;pdp_ip2&lt;/code&gt;、&lt;code&gt;pdp_ip3&lt;/code&gt; 等&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;首次添加场景，可能会弹出申请权限的对话框，具体原因请看 &lt;a class="link" href="#%e6%9d%83%e9%99%90" &gt;权限&lt;/a&gt;。当没有允许定位权限时，场景列表的 ✅ 标记不会随着网络类型的切换而自动切换，但这不影响场景功能的正常生效&lt;/p&gt;&#10;&lt;p&gt;设置 &amp;gt; 隧道/按需求连接 中的 &lt;strong&gt;包含所有网络&lt;/strong&gt; 相关选项可能会对场景模式的生效造成影响&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="简单模式"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;简单模式&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;简单模式是一种以相对简单的方式实现自动测试并选择延迟低的节点进行连接的设置模式。简单模式未来或不再维护，其功能已被 &lt;strong&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84" &gt;代理分组&lt;/a&gt;&lt;/strong&gt; 所包含，建议使用 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84" &gt;代理分组&lt;/a&gt; 替代简单模式&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;首页 &amp;gt; 全局路由 &amp;gt; 分组 &amp;gt; 简单模式&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;节点的范围是什么？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当开启简单模式，此时下方会出现分组选项，如果没有继续添加分组的操作，节点范围就是首页全部节点，如果添加分组，范围就变成分组里的节点&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;自动测试的周期是多久？延迟低的判断依据是什么？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;设置 &amp;gt; 延迟测试方法 &amp;gt; URL测试设置&lt;/strong&gt;，这里规定了测试的间隔时间，默认 600s，即表示每 10 分钟自动进行一次节点延迟测试。相邻两次测试结果中最小延迟值的对比，根据公差机制决定是否切换节点，公差越大，触发节点切换的频次越低，默认 0ms，即表示只要后面测试结果的最低延迟节点比前面测试结果的最低延迟节点延迟小就会自动切换&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;切换的节点给什么规则使用？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 内置策略 &lt;code&gt;proxy&lt;/code&gt;，简单模式时自动切换的节点使用于所有指向 &lt;code&gt;proxy&lt;/code&gt; 策略的规则&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;简单模式是自动切换延迟低节点，代理分组的 url-test 类型也是自动切换延迟低节点，两者有何不同？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;代理分组创建后，需要在规则中修改策略指向，而简单模式已经关联 &lt;code&gt;proxy&lt;/code&gt; 策略，节省了修改规则的步骤&lt;br&gt;&#10;&lt;strong&gt;全局路由&lt;/strong&gt; 选择 &lt;strong&gt;代理&lt;/strong&gt; 时将导致所有 &lt;strong&gt;代理分组&lt;/strong&gt; 失效，而简单模式依然能够实现自动切换节点&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;添加分组时的测速开关是什么作用？&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;开启测速，这个分组才允许自动切换节点。不开启测速，这个分组只能手动选择节点&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="启用回退"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;启用回退&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;首页 &amp;gt; 全局路由 &amp;gt; 启用回退&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;启用回退&lt;/strong&gt; 的功能是当节点连接失败时自动切换其他可用节点&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;连接失败3次才会触发回退机制&lt;/li&gt;&#10;&lt;li&gt;节点只满足可用性，不要求是最低延迟节点&lt;/li&gt;&#10;&lt;li&gt;随机切换，不按照节点顺序选择&lt;/li&gt;&#10;&lt;li&gt;策略为 &lt;code&gt;proxy&lt;/code&gt;，节点切换范围就是首页全部节点，如果开启简单模式并选择分组，则范围缩小至分组内节点&lt;/li&gt;&#10;&lt;li&gt;策略为 &lt;strong&gt;非 select 类型&lt;/strong&gt; 的 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84%e7%b1%bb%e5%9e%8b" &gt;分组/代理分组类型&lt;/a&gt;，节点切换范围就是分组或代理分组内节点&lt;/li&gt;&#10;&lt;li&gt;具体切换到哪个节点，请查看 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e6%97%a5%e5%bf%97" &gt;代理日志&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="配置页面"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;配置页面&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 id="配置文件"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;配置文件&lt;/a&gt;&#10;&lt;/h3&gt;&lt;blockquote class="alert alert-note"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;📝&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;备注&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;Shadowrocket 的配置文件是用于快速设置和调整软件的核心功能的重要文件，通常以 &lt;code&gt;*.conf&lt;/code&gt; 格式保存。配置文件还可以在多设备间同步以及分享配置文件给其他用户，以快速部署相同设置、简化用户手动配置的流程。用户可以在配置文件里设置 &lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;通用参数&lt;/a&gt;、&lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%a7%84%e5%88%99" &gt;添加规则&lt;/a&gt;、&lt;a class="link" href="#hosts" &gt;Hosts&lt;/a&gt;、&lt;a class="link" href="#url%e9%87%8d%e5%86%99" &gt;URL重写&lt;/a&gt;、&lt;a class="link" href="#https%e8%a7%a3%e5%af%86" &gt;HTTPS解密&lt;/a&gt;、&lt;a class="link" href="#%e8%84%9a%e6%9c%ac" &gt;脚本&lt;/a&gt;等内容。&lt;a class="link" href="#%e6%a8%a1%e5%9d%97" &gt;模块&lt;/a&gt; 的写法与配置文件相同&lt;br&gt;&#10;同时，Shadowrocket 支持在配置文件中 &lt;a class="link" href="#%e7%bc%96%e5%86%99%e6%9c%ac%e5%9c%b0%e8%8a%82%e7%82%b9" &gt;编写本地节点&lt;/a&gt;，但该操作方式仅是为了兼容部分其他类型的配置文件，不能当作 Shadowrocket &lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%8a%82%e7%82%b9" &gt;添加节点&lt;/a&gt; 的优先选择&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 内置了一个默认配置文件 &lt;code&gt;default.conf&lt;/code&gt;，其中包含了国内外主要网站或服务的分流规则，一般可以满足大多数用户的基本需求。此配置文件的内容跟随应用更新而做不定期的调整。如果在使用过程中错误修改或误删配置文件，可以点击 &lt;strong&gt;配置 &amp;gt; 恢复默认配置&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;添加配置文件方法：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;从 URL 下载配置&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;配置 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt; &amp;gt; 粘贴配置链接 &amp;gt; 下载 &amp;gt; 点击对应的配置文件 &amp;gt; &lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Shadowrocket 兼容使用 &lt;strong&gt;Clash YAML 格式&lt;/strong&gt; 的配置文件。使用含节点信息的标准 Clash 链接可以同时导入配置文件和节点信息&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;从本地存储或云盘导入&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;配置 &amp;gt; 从云导入，点击对应存储路径的配置文件&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;点击配置文件，显示操作菜单（以下选项可能因不同的软件版本而有所不同）：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%be%91%e9%85%8d%e7%bd%ae" &gt;编辑配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;编辑纯文本&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%a2%84%e8%a7%88%e9%85%8d%e7%bd%ae" &gt;预览配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9b%b4%e6%96%b0%e9%85%8d%e7%bd%ae" &gt;更新配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%89%a9%e5%b1%95%e9%85%8d%e7%bd%ae" &gt;扩展配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%87%8d%e6%96%b0%e5%91%bd%e5%90%8d" &gt;重新命名&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%af%bc%e5%87%ba%e9%85%8d%e7%bd%ae" &gt;导出配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标或点击 &lt;strong&gt;&lt;a class="link" href="#%e7%bc%96%e8%be%91%e9%85%8d%e7%bd%ae" &gt;编辑配置&lt;/a&gt;&lt;/strong&gt;，进入编辑菜单（以下选项可能因不同的软件版本而有所不同）：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;通用&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%a7%84%e5%88%99" &gt;规则&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#hosts" &gt;Hosts&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#url%e9%87%8d%e5%86%99" &gt;URL重写&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%a4%b4%e9%83%a8%e9%87%8d%e5%86%99" &gt;头部重写&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%ad%a3%e6%96%87%e9%87%8d%e5%86%99" &gt;正文重写&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9c%ac%e5%9c%b0%e6%98%a0%e5%b0%84" &gt;本地映射&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#https%e8%a7%a3%e5%af%86" &gt;HTTPS解密&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%84%9a%e6%9c%ac" &gt;脚本&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84" &gt;代理分组&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%a7%84%e5%88%99%e9%9b%86url" &gt;规则集URL&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e8%84%9a%e6%9c%acurl" &gt;脚本URL&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e5%a4%8d%e5%88%b6%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;复制&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%9b%bf%e6%8d%a2%e7%ad%96%e7%95%a5" &gt;替换策略&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="#%e6%b5%8b%e8%af%95%e8%a7%84%e5%88%99" &gt;测试规则&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="使用配置"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;使用配置&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;点击 &lt;strong&gt;使用配置&lt;/strong&gt; 可以编译并启用该配置文件。该功能会对该配置使用的远程 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e9%9b%86url" &gt;规则集&lt;/a&gt;、&lt;a class="link" href="#%e8%84%9a%e6%9c%acurl" &gt;脚本&lt;/a&gt; 等远程资源进行更新&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="编辑配置"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;编辑配置&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;使用 UI 交互界面对配置文件的可设置项进行调整。&lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;部分设置或命令&lt;/a&gt; 不提供 UI 编辑界面，如有需要可在 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 中使用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="编辑纯文本"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;编辑纯文本&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;使用纯文本模式对配置文件的可设置项进行调整。&lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;部分设置或命令&lt;/a&gt; 不提供 UI 编辑界面，仅在纯文本模式下可以设置&lt;/p&gt;&#10;&lt;p&gt;配置文件的纯文本编写方法可以参考：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://raw.githubusercontent.com/LOWERTOP/Shadowrocket/main/lazy.conf" target="_blank" rel="noopener"&#10; &gt;懒人配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://raw.githubusercontent.com/LOWERTOP/Shadowrocket/main/lazy_group.conf" target="_blank" rel="noopener"&#10; &gt;懒人配置（含策略组）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="编译配置"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;编译配置&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;点击 &lt;strong&gt;编译配置&lt;/strong&gt; 可以对该配置文件进行重新编译。可以理解为软件将该配置文件重新编辑并转译为符合当前版本规范和逻辑的底层格式。该功能会更新该配置文件所用到的 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e9%9b%86url" &gt;规则集&lt;/a&gt;、&lt;a class="link" href="#%e8%84%9a%e6%9c%acurl" &gt;脚本&lt;/a&gt; 等远程资源。仅当软件版本大于等于特定版本时才具有该选项&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="预览配置"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;预览配置&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;查看配置文件的纯文本格式。该选项仅当配置文件是以远程配置文件的形式添加进来的才会出现&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="更新配置"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;更新配置&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;使用当前配置文件的远程版本对当前文件进行覆盖更新。该选项仅当配置文件是以远程配置文件的形式添加进来时才会出现，该功能一般适用于在远端维护的配置文件或远程配置需要恢复时使用。除更新配置设置外该功能还会同时更新该配置所用的 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e9%9b%86url" &gt;规则集&lt;/a&gt;、&lt;a class="link" href="#%e8%84%9a%e6%9c%acurl" &gt;脚本&lt;/a&gt; 等远程资源，若仅需要更新规则集等远程资源，请使用 &lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt; 功能。软件同时提供自动更新功能，相关说明及其他技巧请点击查看 &lt;a class="link" href="#%e8%87%aa%e5%8a%a8%e6%9b%b4%e6%96%b0" &gt;自动更新&lt;/a&gt; 词条&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;blockquote class="alert alert-caution"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;🚨&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;注意&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;&lt;strong&gt;更新配置会覆盖在本地对配置文件所做的修改，对于在本地修改过的远程配置而言需要谨慎使用此功能&lt;/strong&gt;&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="重新命名"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;重新命名&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;重命名当前配置文件&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="导出配置"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;导出配置&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;将当前配置文件以文件的形式导出&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="扩展配置"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;扩展配置&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;从配置 a 扩展出配置 b，此时默认关系是 b 包含 a，也可以理解为 b 继承了 a 的内容&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;配置 b 优先级高于配置 a，该功能是对配置建立包含关系，以满足同时使用多个配置的需求&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 通用 &amp;gt; 包含配置，可以修改或解除包含关系&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="通用参数"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;通用参数&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;通用参数是 Shadowrocket 的中最重要的功能参数，位于 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中的 &lt;code&gt;[General]&lt;/code&gt; 字段，该字段选项包含具有 UI 界面的设置项和不包含 UI 界面的 &lt;a class="link" href="#%e9%9a%90%e5%bc%8f%e5%8f%82%e6%95%b0" &gt;隐式参数&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;UI 编辑&lt;/strong&gt;：点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 通用&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文本编辑&lt;/strong&gt;：点击配置文件 &amp;gt; 编辑纯文本 &amp;gt; &lt;code&gt;[General]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;配置行的纯文本设置语法格式为 &lt;code&gt;key = value&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;General&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; value&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;旁路系统 &lt;code&gt;bypass-system&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如果禁用此选项，可能会导致一些系统问题，如推送通知延迟&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;跳过代理 &lt;code&gt;skip-proxy&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;跳过代理接口，使用 TUN 接口接管。此选项强制列表中的域名或 IP 的连接范围交由 Shadowrocket &lt;strong&gt;TUN 接口&lt;/strong&gt; 来处理，而不是 Shadowrocket 代理接口。此选项用于提高部分应用程序对于代理环境的兼容性。若开启 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e7%b1%bb%e5%9e%8b" &gt;TUN 模式&lt;/a&gt; 时，将强制使用 TUN 接管所有连接，此处地址列表可以忽略。需要注意，该选项并非将设定的地址使用直连进行连接，仅表示使用 TUN 接口处理&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TUN旁路路由 &lt;code&gt;tun-excluded-routes&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket &lt;strong&gt;TUN 接口&lt;/strong&gt; 只能处理 &lt;strong&gt;TCP 协议&lt;/strong&gt;。使用此选项可以绕过指定的 IP 范围，让其他协议通过&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;DNS覆写 &lt;code&gt;dns-server&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;使用普通 DNS 或加密 DNS（如 &lt;code&gt;doh&lt;/code&gt;、&lt;code&gt;doq&lt;/code&gt;、&lt;code&gt;dot&lt;/code&gt; 等）覆盖默认的系统 DNS。DNS 覆写仅针对直连类域名进行解析，代理类域名将经由代理服务器进行解析。DNS 覆写支持同时添加多个地址，Shadowrocket 采用并行查询的方式进行解析请求，最先返回的结果将被采用。有些 &lt;code&gt;dns over https&lt;/code&gt; 支持 &lt;code&gt;http3&lt;/code&gt;，所以将会尝试查询，如果支持就切换到 &lt;code&gt;http3&lt;/code&gt;，可在 &lt;strong&gt;doh链接&lt;/strong&gt; 后面加上 &lt;code&gt;#no-h3&lt;/code&gt; 关闭。&lt;code&gt;doh&lt;/code&gt; 强制通过 &lt;code&gt;h3&lt;/code&gt; 查询的写法是将 &lt;code&gt;https&lt;/code&gt; 改成 &lt;code&gt;h3&lt;/code&gt;，如&lt;code&gt;h3://dns.alidns.com/dns-query&lt;/code&gt;。其他示例或写法参见：&lt;a class="link" href="#%e4%bf%ae%e6%94%b9dns" &gt;修改DNS&lt;/a&gt;、&lt;a class="link" href="#dns-over-proxy" &gt;DNS-over-PROXY&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;备用DNS &lt;code&gt;fallback-dns-server&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当覆写 DNS 查询失败或查询时间超过2秒，Shadowrocket 会自动回退备用 DNS。如需指定多个 DNS，可用逗号分隔。&lt;code&gt;system&lt;/code&gt; 表示回退到系统 DNS，清空备用 DNS 等于将其设置为 &lt;code&gt;system&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;启用IPv6支持 &lt;code&gt;ipv6&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;false&lt;/code&gt; 表示不启用，&lt;code&gt;true&lt;/code&gt; 表示启用。即使不启用此选项，当本地网络环境支持 IPv6，并且节点域名支持 IPv6 解析，Shadowrocket 也会使用节点的 IPv6 地址进行访问。解决方法是关闭节点域名的 IPv6 解析，或者在配置文件的 &lt;code&gt;[Host]&lt;/code&gt; 项目下为节点域名指定 IP 地址&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;首选IPv6 &lt;code&gt;prefer-ipv6&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;优先向 IPv6 的 DNS 服务器查询 &lt;code&gt;AAAA&lt;/code&gt; 记录，优先使用 &lt;code&gt;AAAA&lt;/code&gt; 记录。&lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;私有IP应答 &lt;code&gt;private-ip-answer&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如果不启用该选项，域名解析返回私有 IP，Shadowrocket 会认为该域名被劫持而强制使用代理&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TUN包含路由 &lt;code&gt;tun-included-routes&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;默认情况下，Shadowrocket 接口会声明自己为默认路由，但由于 Wi-Fi 接口的路由较小，有些流量可能不会通过 Shadowrocket 接口。使用此选项可以添加一个较小的路由表&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;总是真实IP &lt;code&gt;always-real-ip&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;这个选项要求 Shadowrocket 在 &lt;code&gt;TUN&lt;/code&gt; 处理 DNS 请求时返回一个真实的 IP 地址而不是假的IP地址&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;DNS劫持 &lt;code&gt;hijack-dns&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;有些设备或软件总是使用硬编码的 DNS 服务器，例如 Netflix 通过 Google DNS（&lt;code&gt;8.8.8.8&lt;/code&gt; 或 &lt;code&gt;8.8.4.4&lt;/code&gt;）发送请求，您可以使用此选项来劫持查询&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;包含配置 &lt;code&gt;include&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;表示当前配置包含另一个配置的内容，当前配置的优先级高于被包含配置。该选项是对配置建立包含关系，以满足同时使用多个配置的需求&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="隐式参数"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;隐式参数&lt;/a&gt;&#10;&lt;/h3&gt;&lt;blockquote class="alert alert-caution"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;🚨&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;注意&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;&lt;strong&gt;隐式参数是指相关选项仅支持在配置文件 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中的 &lt;code&gt;[General]&lt;/code&gt; 字段进行纯文本设置，不提供 UI 操作选项，属于 &lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;通用参数&lt;/a&gt; 的隐藏属性，建议谨慎设置。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;隐式参数属于 &lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;通用参数&lt;/a&gt;，设置语法格式为 &lt;code&gt;key = value&lt;/code&gt;&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;&lt;code&gt;dns-direct-system&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;直连的域名类规则使用系统 DNS 进行查询。设置为 &lt;code&gt;true&lt;/code&gt; 表示启用，设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;icmp-auto-reply&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;ping 数据包自动回复。设置为 &lt;code&gt;true&lt;/code&gt; 表示启用，设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;always-reject-url-rewrite&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;不开启时，「重写的REJECT策略」默认只有在配置模式下生效。开启后，可以令该策略在其他全局路由模式下都生效。设置为 &lt;code&gt;true&lt;/code&gt; 表示启用，设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;dns-direct-fallback-proxy&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;直连域名解析失败后使用代理。设置为 &lt;code&gt;true&lt;/code&gt; 表示启用，设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;udp-policy-not-supported-behaviour&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当 UDP 流量匹配到规则里不支持 UDP 转发的节点策略时重新选择回退行为，可选行为包括 &lt;code&gt;DIRECT&lt;/code&gt;、&lt;code&gt;REJECT&lt;/code&gt;。&lt;code&gt;DIRECT&lt;/code&gt; 表示直连转发 UDP 流量，&lt;code&gt;REJECT&lt;/code&gt; 表示拒绝转发 UDP 流量&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;stun-response-ip&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;此选项包含两个命令：&lt;code&gt;stun-response-ip&lt;/code&gt; 和 &lt;code&gt;stun-response-ipv6&lt;/code&gt;。该选项允许返回一个虚假的IP地址，如 &lt;code&gt;stun-response-ip=1.1.1.1&lt;/code&gt;、&lt;code&gt;stun-response-ipv6=::1&lt;/code&gt;，目的是防止真实IP地址泄漏，提高 WebRTC 的隐私和安全性。使用此命令将忽略软件设置选项内的 &lt;a class="link" href="#%e7%a6%81%e7%94%a8stun" &gt;禁用STUN&lt;/a&gt; 的启用状态&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;compatibility-mode&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;网络兼容模式&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;compatibility-mode = 0&lt;/code&gt; &amp;gt; 自动/禁用&lt;br&gt;&#10;&lt;code&gt;compatibility-mode = 1&lt;/code&gt; &amp;gt; Proxy with Loopback Address&lt;br&gt;&#10;&lt;code&gt;compatibility-mode = 2&lt;/code&gt; &amp;gt; Proxy Only&lt;br&gt;&#10;&lt;code&gt;compatibility-mode = 3&lt;/code&gt; &amp;gt; TUN Only&lt;br&gt;&#10;&lt;code&gt;compatibility-mode = 4&lt;/code&gt; &amp;gt; Proxy without Loopback Address&lt;br&gt;&#10;&lt;code&gt;compatibility-mode = 5&lt;/code&gt; &amp;gt; No Default Route&lt;/p&gt;&#10;&lt;p&gt;本设置的优先级高于软件设置内的相关选项。当参数的值设定为 &lt;code&gt;3&lt;/code&gt; 时的效果等同于启用 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e7%b1%bb%e5%9e%8b" &gt;Tun模式&lt;/a&gt;：&lt;a class="link" href="#%e8%ae%be%e7%bd%ae%e9%a1%b5%e9%9d%a2" &gt;设置&lt;/a&gt; &amp;gt; 代理 &amp;gt; &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e7%b1%bb%e5%9e%8b" &gt;代理类型&lt;/a&gt; &amp;gt; None。当参数的值设定为 &lt;code&gt;5&lt;/code&gt; 时的效果等同于启用 &lt;a class="link" href="#%e5%85%bc%e5%ae%b9%e6%a8%a1%e5%bc%8f" &gt;兼容模式&lt;/a&gt;：&lt;a class="link" href="#%e8%ae%be%e7%bd%ae%e9%a1%b5%e9%9d%a2" &gt;设置&lt;/a&gt; &amp;gt; 代理 &amp;gt; &lt;a class="link" href="#%e5%85%bc%e5%ae%b9%e6%a8%a1%e5%bc%8f" &gt;兼容模式&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;always-ip-address&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;强制所有域名使用本地 DNS 解析。设置为 &lt;code&gt;true&lt;/code&gt; 表示启用，设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;proxy-dns-server&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;通过该参数来使用特定 DNS 解析所有节点域名。若未设置此参数，节点域名默认使用 &lt;a class="link" href="#%e4%bf%ae%e6%94%b9dns" &gt;dns-server&lt;/a&gt; 进行解析，对于 &lt;a class="link" href="#dns-over-proxy" &gt;DNS-over-PROXY&lt;/a&gt; 则使用系统 DNS 解析&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;close-if-proxy-chain-missing&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;代理链丢失关闭连接。当设置为 &lt;code&gt;true&lt;/code&gt; 时，若 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e9%80%9a%e8%bf%87%e4%bb%a3%e7%90%86%e9%93%be" &gt;代理链&lt;/a&gt; 中的中转节点丢失则 &lt;code&gt;Reject&lt;/code&gt; 代理连接；当设置为 &lt;code&gt;false&lt;/code&gt; 时等同于不设置该命令，即若 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e9%80%9a%e8%bf%87%e4%bb%a3%e7%90%86%e9%93%be" &gt;代理链&lt;/a&gt; 中的中转节点丢失则跳过中转节点直接连接落地节点使用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;ipv6-only-if-no-ipv4-dns&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当设置为 &lt;code&gt;true&lt;/code&gt; 时，如果设备在网络环境中仅获取到 IPv6 的 DNS 而未获取到 IPv4 的 DNS，此时软件将认为网络环境是 &lt;code&gt;IPv6 Only&lt;/code&gt; 网络。设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;block-quic&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;QUIC协议屏蔽策略。支持使用 &lt;code&gt;all-proxy&lt;/code&gt;、&lt;code&gt;all&lt;/code&gt;、&lt;code&gt;always-allow&lt;/code&gt; 对 QUIC 传输层协议进行设置。其中 &lt;code&gt;all-proxy&lt;/code&gt; 表示只对 &lt;strong&gt;走代理的连接&lt;/strong&gt; 阻断 QUIC，直连连接（DIRECT）不会被干预；&lt;code&gt;all&lt;/code&gt; 表示对所有连接（包括直连与代理）都屏蔽 QUIC，这会完全禁止系统中一切 UDP/443 流量；&lt;code&gt;always-allow&lt;/code&gt; 表示始终允许 QUIC，不做任何屏蔽，等同于 &lt;strong&gt;关闭 QUIC 屏蔽&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;use-local-host-item-for-proxy&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本地 HOST 映射对代理生效。在默认情况下，对于代理类的 DNS 解析始终在远端服务器上执行。当设置为 &lt;code&gt;true&lt;/code&gt; 时，若存在本地 DNS 映射，Shadowrocket 将在代理连接中使用映射后的地址，而不是原始的主机名。设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;allow-dns-svcb&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;允许 DNS SVCB 查询。系统可能会执行 SVCB 记录 DNS 查询，而不是标准的 A 记录查询。这会导致无法返回虚拟 IP 地址。因此，默认情况下禁止执行 SVCB 记录查询，以强制系统执行 A 记录查询。设置为 &lt;code&gt;true&lt;/code&gt; 表示启用，设置为 &lt;code&gt;false&lt;/code&gt; 表示不启用&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;Shadowrocket 或还有其他支持的隐式参数，此处可能未能完全列出，若有相关需求请联系 &lt;a class="link" href="mailto:buginapp@gmail.com" &gt;buginapp@gmail.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="添加规则"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;添加规则&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;在 Shadowrocket 中，&amp;ldquo;规则&amp;quot;是指用来决定哪些网络请求应该走代理、哪些请求应该直接连接互联网的规则集合。规则通常是基于用户的需求来配置 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%ad%96%e7%95%a5" &gt;规则策略&lt;/a&gt;，目的是实现对流量的精细控制。软件对规则集的识别不受文件后缀的影响，是以规则集的内容为识别标准&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 规则 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt;，根据需求选择 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%b1%bb%e5%9e%8b" &gt;规则类型&lt;/a&gt; 和 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%ad%96%e7%95%a5" &gt;规则策略&lt;/a&gt;，填写规则内容&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;数据 &amp;gt; 代理 &amp;gt; 启用日志记录，产生网络活动后回到该页面，从最近的日志中查看网络活动记录，点击任一记录查看详情，点击右上角 &lt;code&gt;•••&lt;/code&gt; 选择类型添加规则&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;规则匹配需要着重注意 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e4%bc%98%e5%85%88%e7%ba%a7" &gt;规则的优先级&lt;/a&gt; 顺序&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;规则管理&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;配置 &amp;gt; 配置文件 &amp;gt; 编辑配置 &amp;gt; 规则 &amp;gt; 规则区域右上角 &lt;code&gt;···&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;可选择并批量删除规则&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="规则优先级"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;规则优先级&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;规则的匹配是从上到下逐条匹配的，一旦匹配到某条规则，Shadowrocket 就会停止继续匹配，因此规则的顺序非常重要，优先级高的规则应该放在前面&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;模块中的规则优先于配置文件&lt;/li&gt;&#10;&lt;li&gt;上面的规则优先于下面的规则&lt;/li&gt;&#10;&lt;li&gt;域名类的规则优先于IP类规则&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;此外，规则的优先级在自动编译配置时同时遵循 &lt;strong&gt;显式优先、推断其次、最终兜底&lt;/strong&gt; 的原则。其中可被直接、精确匹配的显式规则（如 &lt;code&gt;DOMAIN&lt;/code&gt;、&lt;code&gt;DOMAIN-SUFFIX&lt;/code&gt;、&lt;code&gt;URL-REGEX&lt;/code&gt; 等）具有最高优先级。而基于地域或数据库判断的推断类规则（如 &lt;code&gt;GeoIP&lt;/code&gt;）会在自动编译过程中被放置在显式规则之后。&lt;code&gt;FINAL&lt;/code&gt; 规则作为兜底项，始终位于整个规则集的最末尾&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="规则类型"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;规则类型&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;DOMAIN-SUFFIX&lt;/strong&gt;：匹配请求域名的后缀&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;DOMAIN-SUFFIX,example.com,DIRECT&lt;/code&gt; 可以匹配到 &lt;code&gt;a.example.com&lt;/code&gt;、&lt;code&gt;a.b.example.com&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;DOMAIN-KEYWORD&lt;/strong&gt;：匹配请求域名的关键词&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;DOMAIN-KEYWORD,exa,DIRECT&lt;/code&gt; 可以匹配到 &lt;code&gt;a.example.com&lt;/code&gt;、&lt;code&gt;a.b.example.com&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;DOMAIN-WILDCARD&lt;/strong&gt;：匹配请求域名，支持使用通配符 &lt;code&gt;*&lt;/code&gt;、&lt;code&gt;?&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;DOMAIN-WILDCARD,a*c.example*.com,DIRECT&lt;/code&gt; 可以匹配到 &lt;code&gt;abc.example123.com、aqwec.example456.com&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;DOMAIN&lt;/strong&gt;：匹配请求的完整域名。当为&lt;code&gt;DOMAIN&lt;/code&gt;、&lt;code&gt;DOMAIN-SUFFIX&lt;/code&gt;、&lt;code&gt;DOMAIN-KEYWORD&lt;/code&gt; 等相似类型分别设置相同的值时，只有其中一种类型会生效&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;DOMAIN,www.example.com,DIRECT&lt;/code&gt; 只能匹配到 &lt;code&gt;www.example.com&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;USER-AGENT&lt;/strong&gt;：匹配用户代理字符串，支持使用通配符 &lt;code&gt;*&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;USER-AGENT,MicroMessenger*,DIRECT&lt;/code&gt; 可以匹配到 &lt;code&gt;MicroMessenger Client&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;URL-REGEX&lt;/strong&gt;：匹配 URL 正则式&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;URL-REGEX,^https?://.+/item.+,REJECT&lt;/code&gt; 可以匹配到 &lt;code&gt;https://www.example.com/item/abc/123&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;IP-CIDR&lt;/strong&gt;：匹配 IPv4 或 IPv6 地址&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;IP-CIDR,192.168.1.0/24,DIRECT&lt;/code&gt; 可以匹配到 IP 段 &lt;code&gt;192.168.1.1～192.168.1.254&lt;/code&gt;。当域名请求遇到IP类规则时，Shadowrocket 会向本地 DNS 服务器发送查询请求，以判断主机 IP 是否匹配规则。若 IP 类规则加 &lt;code&gt;no-resolve&lt;/code&gt;（如：&lt;code&gt;IP-CIDR,172.16.0.0/12,DIRECT,no-resolve&lt;/code&gt;），则域名请求将会跳过此规则，不会触发本地DNS查询&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;IP-ASN&lt;/strong&gt;：匹配 IP 地址隶属的 ASN 编号&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;IP-ASN,56040,DIRECT&lt;/code&gt; 可以匹配到属于 China Mobile Communications Corporation 网络的 IP 地址&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;RULE-SET&lt;/strong&gt;：匹配规则集内容。规则集的组成部分需包含规则类型&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;DOMAIN-SET&lt;/strong&gt;：匹配域名集内容。域名集的组成部分不包含规则类型&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;SCRIPT&lt;/strong&gt;：匹配脚本名称&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;DST-PORT&lt;/strong&gt;：匹配目标主机名的端口号&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;DST-PORT,443,DIRECT&lt;/code&gt; 可以匹配到 443 目标端口&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;GEOIP&lt;/strong&gt;：匹配 IP 数据库&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;GEOIP,CN,DIRECT&lt;/code&gt; 可以匹配到归属地为CN的IP地址&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;FINAL&lt;/strong&gt;：兜底策略&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;FINAL,PROXY&lt;/code&gt; 表示当其他所有规则都匹配不到时才使用 &lt;code&gt;FINAL&lt;/code&gt; 规则的策略&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;AND&lt;/strong&gt;：逻辑规则，与规则&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;AND,((DOMAIN,www.example.com),(DST-PORT,123)),DIRECT&lt;/code&gt; 可以匹配到 &lt;code&gt;www.example.com:123&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;NOT&lt;/strong&gt;：逻辑规则，非规则&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;NOT,((DST-PORT,123)),DIRECT&lt;/code&gt; 可以匹配到除了 &lt;code&gt;123&lt;/code&gt; 端口的其他所有请求&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;OR&lt;/strong&gt;：逻辑规则，或规则&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如 &lt;code&gt;OR,((DST-PORT,123),(DST-PORT,456)),DIRECT&lt;/code&gt; 可以匹配到 &lt;code&gt;123&lt;/code&gt; 或 &lt;code&gt;456&lt;/code&gt; 端口的所有请求&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;PROTOCOL&lt;/strong&gt;：匹配传输协议类型&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;PROTOCOL&lt;/code&gt; 类型不支持单独使用，只能作为子规则类型嵌套于逻辑规则当中。如 &lt;code&gt;AND,((PROTOCOL,UDP),(DST-PORT,443)),REJECT-NO-DROP&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="规则策略"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;规则策略&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;PROXY&lt;/strong&gt;：代理。通过代理服务器转发流量&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;DIRECT&lt;/strong&gt;：直连。连接不经过任何代理服务器&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT&lt;/strong&gt;：拒绝。返回 HTTP 状态码 404，没有内容&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT-DICT&lt;/strong&gt;：拒绝。返回 HTTP 状态码 200，内容为空的JSON对象&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT-ARRAY&lt;/strong&gt;：拒绝。返回 HTTP 状态码 200，内容为空的JSON数组&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT-200&lt;/strong&gt;：拒绝。返回 HTTP 状态码 200，没有内容&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT-IMG&lt;/strong&gt;：拒绝。返回 HTTP 状态码 200，内容为 1 像素 GIF&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT-TINYGIF&lt;/strong&gt;：拒绝。返回HTTP状态码200，内容为 1 像素 GIF&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT-DROP&lt;/strong&gt;：拒绝。丢弃 IP 包&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;REJECT-NO-DROP&lt;/strong&gt;：拒绝。返回 ICMP 端口不可达&lt;/p&gt;&#10;&lt;p&gt;除此之外，规则策略还可以选择 &lt;strong&gt;分组&lt;/strong&gt;、&lt;strong&gt;代理分组&lt;/strong&gt;、&lt;strong&gt;订阅&lt;/strong&gt;、&lt;strong&gt;服务器节点&lt;/strong&gt; 等&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="策略扩展参数"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;策略扩展参数&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;Extended Matching&lt;/strong&gt;：扩展匹配。代表将尝试同时匹配 &lt;code&gt;SNI&lt;/code&gt; 和 &lt;code&gt;HTTP&lt;/code&gt; 主机标头。适用于 &lt;code&gt;DOMAIN&lt;/code&gt;、&lt;code&gt;DOMAIN-SUFFIX&lt;/code&gt;、&lt;code&gt;DOMAIN-KEYWORD&lt;/code&gt; 等域名规则。Shadowrocket 默认支持 &lt;code&gt;extended-matching&lt;/code&gt;，已默认开启 &lt;code&gt;SNI&lt;/code&gt; 匹配&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Pre Matching&lt;/strong&gt;：预匹配功能，可以快速、低开销地拒绝请求。对于使用 REJECT 策略的规则，可以通过 pre-matching 标记启用此功能预匹配。启用此参数的规则将在正常规则匹配过程之前生效，具有最高优先级&lt;/p&gt;&#10;&lt;p&gt;纯文本示例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Rule&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DOMAIN&lt;/span&gt;,ad&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com,&lt;span style="color:#66d9ef"&gt;REJECT&lt;/span&gt;,extended&lt;span style="color:#f92672"&gt;-&lt;/span&gt;matching,pre&lt;span style="color:#f92672"&gt;-&lt;/span&gt;matching&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="app分流"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;APP分流&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;根据不同 App 或特定服务指定分流规则，并使其按照设定的规则执行代理策略&lt;/p&gt;&#10;&lt;p&gt;示例：YouTube App 分流走代理&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;复制 YouTube 的规则集链接&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;raw&lt;span style="color:#f92672"&gt;.&lt;/span&gt;githubusercontent&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;blackmatrix7&lt;span style="color:#f92672"&gt;/&lt;/span&gt;ios_rule_script&lt;span style="color:#f92672"&gt;/&lt;/span&gt;master&lt;span style="color:#f92672"&gt;/&lt;/span&gt;rule&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Shadowrocket&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;YouTube&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;YouTube&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;list&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 规则 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt;，&lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%b1%bb%e5%9e%8b" &gt;规则类型&lt;/a&gt; 选择 &lt;code&gt;RULE-SET&lt;/code&gt;，&lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%ad%96%e7%95%a5" &gt;规则策略&lt;/a&gt; 选择 &lt;code&gt;PROXY&lt;/code&gt;，输入框内粘贴 &lt;strong&gt;规则集链接&lt;/strong&gt;，保存完成（规则策略可以根据需求使用其他选项或节点）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;iOS系统没有常规分应用代理的操作，只能通过 &lt;strong&gt;域名 / ip / ua&lt;/strong&gt; 规则实现app分流效果。可自行抓包，或者订阅 &lt;a class="link" href="https://github.com/blackmatrix7" target="_blank" rel="noopener"&#10; &gt;blackmatrix7&lt;/a&gt; 的 &lt;a class="link" href="https://github.com/blackmatrix7/ios_rule_script/tree/master/rule/Shadowrocket" target="_blank" rel="noopener"&#10; &gt;规则集&lt;/a&gt;。如果引用的链接是域名集，添加规则时，&lt;a class="link" href="#%e8%a7%84%e5%88%99%e7%b1%bb%e5%9e%8b" &gt;规则类型&lt;/a&gt; 请选择 &lt;code&gt;DOMAIN-SET&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="更新规则集"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;更新规则集&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;手动更新：点击 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; &amp;gt; &lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;自动更新：&lt;a class="link" href="#%e8%87%aa%e5%8a%a8%e6%9b%b4%e6%96%b0" &gt;自动更新&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="预览规则集"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;预览规则集&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;点击配置文件 &amp;gt; 编辑配置 &amp;gt; 规则 &amp;gt; 在规则集上左滑 &amp;gt; 预览&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="修改dns"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;修改DNS&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;DNS覆写&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;点击 配置文件 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 通用 &amp;gt; DNS 覆写&lt;/p&gt;&#10;&lt;p&gt;DNS 覆写仅针对直连类域名进行解析，代理类域名将经由代理服务器进行解析。DNS 覆写为并发查询，若填写多个 DNS 服务，则使用最快返回的解析结果。填 &lt;code&gt;system&lt;/code&gt; 表示使用系统 DNS，支持普通 DNS 或加密 DNS（如 DoH、DoQ、DoT 等），也支持使用 &lt;a class="link" href="#dns-over-proxy" &gt;通过代理转发 DNS 查询请求&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;普通 DNS 示例&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;223&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;119&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;29&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;29&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;29&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;加密 DNS 示例&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;DNS-over-HTTPS（DoH）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;alidns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;query&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;DNS-over-HTTP/3（DoH3）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;h3&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;alidns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;query&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;DNS-over-QUIC（DoQ）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;quic&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;223&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;DNS-over-TLS（DoT）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;tls&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;223&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="#dns-over-proxy" &gt;DNS-over-PROXY&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;备用DNS&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当覆写的 DNS 查询失败或查询时间超过2秒后回退备用 DNS 进行查询。如需指定多个 DNS，可用逗号分隔。填写 &lt;code&gt;system&lt;/code&gt; 或者留空表示可回退到系统 DNS&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="dns-over-proxy"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;DNS-over-PROXY&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;通过代理转发 DNS 查询请求&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;proxy&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;支持使用 &lt;strong&gt;默认节点&lt;/strong&gt; 转发 DNS 查询请求，有以下两种写法：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;google&lt;span style="color:#f92672"&gt;/&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;query&lt;span style="color:#75715e"&gt;#proxy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;google&lt;span style="color:#f92672"&gt;/&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;query&lt;span style="color:#75715e"&gt;#proxy=proxy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;proxy=name&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;支持使用 &lt;strong&gt;指定节点&lt;/strong&gt; 转发 DNS 查询请求，需要注意此处的代理名称仅支持 URL 编码，以 &lt;code&gt;香港 01&lt;/code&gt; 示例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;google&lt;span style="color:#f92672"&gt;/&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;query&lt;span style="color:#75715e"&gt;#proxy=%E9%A6%99%E6%B8%AF%2001&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此处指定的节点若填写不规范会自动回退至默认节点&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;ecs=子网范围&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;ecs 参数用于设置 EDNS Client Subnet (ECS)，向 DNS 服务器传递客户端的子网信息。ECS 允许 DNS 服务器根据指定的子网范围（而非实际客户端 IP）来返回最优结果&lt;/p&gt;&#10;&lt;p&gt;示例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;google&lt;span style="color:#f92672"&gt;/&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;query&lt;span style="color:#75715e"&gt;#ecs=120.76.0.0/14|2620:149:af0::10/56&amp;amp;ecs-override=true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;ecs-override=true&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;ecs 参数的强制覆盖。即使客户端的实际 IP 提供了不同的地理位置，查询会强制使用 ecs 指定的子网范围&lt;/p&gt;&#10;&lt;p&gt;示例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;server&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;google&lt;span style="color:#f92672"&gt;/&lt;/span&gt;dns&lt;span style="color:#f92672"&gt;-&lt;/span&gt;query&lt;span style="color:#75715e"&gt;#proxy=name&amp;amp;ecs=1.1.0.0/14|2620:149:af0::10/56&amp;amp;ecs-override=true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="no-resolve的作用"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;no-resolve的作用&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;当域名请求遇到 IP 类规则时，Shadowrocket 会向本地DNS服务器发送查询请求，以判断主机 IP 是否匹配规则&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;若IP类规则加 &lt;code&gt;no-resolve&lt;/code&gt;，则域名请求将会跳过此规则，不触发本地 DNS 查询。如：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;IP&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;CIDR&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;172&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;DIRECT&lt;/span&gt;,no&lt;span style="color:#f92672"&gt;-&lt;/span&gt;resolve&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="代理分组"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;代理分组&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;代理分组&lt;/strong&gt; 也可称之为 &lt;strong&gt;策略组&lt;/strong&gt;，是用来 &lt;strong&gt;灵活管理和切换不同代理节点、自动分流网络请求&lt;/strong&gt; 的一种核心功能。它的作用类似于一个 &lt;strong&gt;智能路由系统&lt;/strong&gt;，可以根据设定的规则将不同的流量导向不同的代理节点或行为。简单来说，它就是一个 &lt;strong&gt;容器&lt;/strong&gt;，里面可以包含多个代理节点或其他代理分组。你可以根据需求通过 &lt;strong&gt;规则 → 代理分组 → 代理节点&lt;/strong&gt; 的路径手动或自动切换。代理分组支持的类型可以查看：&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84%e7%b1%bb%e5%9e%8b" &gt;代理分组类型&lt;/a&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 代理分组 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt;。填写名称，根据需求选择 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84%e7%b1%bb%e5%9e%8b" &gt;代理分组类型&lt;/a&gt;，通过 &lt;strong&gt;正则&lt;/strong&gt; 匹配策略，或者从策略输入框后面的 &lt;code&gt;•••&lt;/code&gt; 手动添加策略，保存&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;策略是规则的组成部分，创建的代理分组只有放到规则里才能发挥作用&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;进入对应规则的详情页，点击策略选项，从列表中选择所需的代理分组，保存&lt;/li&gt;&#10;&lt;li&gt;代理分组中可以包含其他代理分组，形成层级结构，但需要注意各级代理分组的 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84%e7%b1%bb%e5%9e%8b" &gt;类型&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;代理分组内的右上角设有 &lt;strong&gt;测试&lt;/strong&gt; 按钮，点击 &lt;strong&gt;测试&lt;/strong&gt; 可对当前分组内的节点进行延迟测试。测试按钮仅支持对节点进行测试，不支持测试分组内的其他策略&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;代理分组下方设有 &lt;strong&gt;测试并选择最快服务器&lt;/strong&gt; 选项&lt;/li&gt;&#10;&lt;li&gt;该选项开启后，将在手动点击右上角的 &lt;strong&gt;测试&lt;/strong&gt; 后自动选择并使用延迟最低的节点&lt;/li&gt;&#10;&lt;li&gt;该选项的开启或关闭对全部代理分组同时生效&lt;/li&gt;&#10;&lt;li&gt;该选项仅存在于版本号大于等于 &lt;strong&gt;2.2.65 (2604)&lt;/strong&gt; 的软件上&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;代理分组内设有 &lt;strong&gt;订阅&lt;/strong&gt; 开关，开启开关会在下方出现 &lt;strong&gt;服务器节点&lt;/strong&gt; 选项，需要进入选择所需要的订阅&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;开启 &lt;strong&gt;订阅&lt;/strong&gt; 开关并选择所需订阅后，下方 &lt;strong&gt;策略&lt;/strong&gt; 内会出现该订阅的所有节点&lt;/li&gt;&#10;&lt;li&gt;支持同时使用 &lt;a class="link" href="#%e8%ae%a2%e9%98%85%e8%8a%82%e7%82%b9%e7%ad%9b%e9%80%89" &gt;正则表达式&lt;/a&gt; 对节点进行筛选，筛选范围受限于所选择的订阅&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;快捷进入代理分组&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;首页下拉，可以快捷进入代理分组界面&lt;/li&gt;&#10;&lt;li&gt;首页本地节点上方设有指示牌图标，点击该图标可以快捷进入代理分组界面，软件版本需大于等于 &lt;strong&gt;2.2.65 (2614)&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;代理分组其他设置参数&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;interval：测试周期。指定间隔多长时间后需要重新发起测试&lt;/li&gt;&#10;&lt;li&gt;timeout：超时时间。如果测试在超时前未完成，放弃测试&lt;/li&gt;&#10;&lt;li&gt;tolerance：公差。只有当新优胜者的分数高于旧优胜者的分数加上公差时，才会进行线路更换&lt;/li&gt;&#10;&lt;li&gt;url：测试地址。指定要测试的URL&lt;/li&gt;&#10;&lt;li&gt;hidden：&lt;a class="link" href="#%e9%9a%90%e8%97%8f%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84" &gt;隐藏代理分组&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="代理分组类型"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;代理分组类型&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;select&lt;/strong&gt;：允许用户手动选择一个子策略，可以指定其他代理分组或代理服务器。纯文本中设置为 &lt;code&gt;0&lt;/code&gt; 表示第一个策略，&lt;code&gt;1&lt;/code&gt; 表示第二个策略，&lt;code&gt;2&lt;/code&gt; 表示第三个策略，以此类推&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;url-test&lt;/strong&gt;：根据设定的自动测试周期和结果自动切换延迟最低的节点&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;fallback&lt;/strong&gt;：节点不可用时自动切换其他可用节点，可用节点范围被上次自动测试结果所限&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;load-balance&lt;/strong&gt;：不同规则的请求使用分组里的不同节点进行 &lt;a class="link" href="#%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1" &gt;负载均衡&lt;/a&gt;，相同的域名会使用同一个节点&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;random&lt;/strong&gt;：随机使用分组里的不同节点进行连接，相同的域名可能使用不同的节点，该类型也可以用作 &lt;a class="link" href="#%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1" &gt;负载均衡&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;除 &lt;strong&gt;select&lt;/strong&gt; 类型外，其余代理分组类型均基于自动测试机制运行。当连接命中此类分组时，系统将优先使用最近一次测试结果选定的节点，并按照该分组的设定执行下一轮测试&lt;/p&gt;&#10;&lt;p&gt;在两次测试间隔期间，若当前节点状态发生变化（例如节点变为不可用），可能出现仍使用失效节点的情况。对此，可酌情使用 &lt;strong&gt;&lt;a class="link" href="#%e5%90%af%e7%94%a8%e5%9b%9e%e9%80%80" &gt;启用回退&lt;/a&gt;&lt;/strong&gt; 功能，以在节点异常时保障连接可用性。但需要详细阅读回退功能的详细说明&lt;/p&gt;&#10;&lt;p&gt;自动测试类型的代理分组允许用户在界面中临时手动选择了该类分组所包含的节点，但实际连接行为仍受分组自身设置约束，且 UI 中显示的测试结果并不影响该分组在背景中的自动测试，代理分组将继续根据自动测试结果自动发生切换。基于上述特性，&lt;strong&gt;除 select 类型外，不建议在此类代理分组中嵌套包含其他代理分组&lt;/strong&gt;，以避免服务器节点选择逻辑复杂化或出现不符合预期的切换行为&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="隐藏代理分组"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;隐藏代理分组&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;自 &lt;code&gt;Shadowrocket Version 2.2.66 (2649)&lt;/code&gt; 版本开始，新增参数 &lt;code&gt;hidden=1&lt;/code&gt;，可用于在图形界面隐藏不希望展示的代理分组。当 &lt;code&gt;hidden&lt;/code&gt; 设置为数值 &lt;code&gt;1&lt;/code&gt; 时，表示隐藏当前代理分组；当设置为 &lt;code&gt;0&lt;/code&gt; 时表示不隐藏，等同于不设置此参数。该功能仅提供纯文本编辑设置方式，无图形设置界面&lt;/p&gt;&#10;&lt;p&gt;示例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;香港节点&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; url&lt;span style="color:#f92672"&gt;-&lt;/span&gt;test,&lt;span style="color:#66d9ef"&gt;HK&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;HK&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;02&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;HK&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;03&lt;/span&gt;,policy&lt;span style="color:#f92672"&gt;-&lt;/span&gt;select&lt;span style="color:#f92672"&gt;-&lt;/span&gt;name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;HK&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt;,interval&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;600&lt;/span&gt;,tolerance&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;,timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;http&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;www&lt;span style="color:#f92672"&gt;.&lt;/span&gt;gstatic&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;generate_204,hidden&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="负载均衡"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;负载均衡&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84%e7%b1%bb%e5%9e%8b" &gt;代理分组类型&lt;/a&gt; 中的 &lt;code&gt;load-balance&lt;/code&gt;、&lt;code&gt;random&lt;/code&gt; 表示将连接请求随机使用分组里的节点进行连接，能够尽可能将流量平均分配给所有子策略或代理。其中 &lt;code&gt;load-balance&lt;/code&gt; 会将相同的域名使用同一个节点进行连接，&lt;code&gt;random&lt;/code&gt; 会将所有请求使用随机节点进行连接，不区分是否是同一个域名&lt;/p&gt;&#10;&lt;p&gt;使用负载均衡的方法：&lt;/p&gt;&#10;&lt;p&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 代理分组 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt;，类型选择 &lt;code&gt;load-balance&lt;/code&gt; 或者 &lt;code&gt;random&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="规则集url"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;规则集URL&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;配置 &amp;gt; 配置文件 &amp;gt; 编辑配置 &amp;gt; 规则集 URL&lt;/p&gt;&#10;&lt;p&gt;当前使用的所有远程规则资源的展示页面，其后显示的数字为当前成功下载的数量和总共包含的数量。进入后所显示的 ✅ 表示当前规则下载成功，❎ 表示当前规则下载失败。点击相应地址可重新拉取并弹出状态提示，但不会重新编译更新配置文件，点击 &lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;，可以对当前所有 URL 进行更新并重新编译更新配置文件&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="脚本url"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;脚本URL&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;配置 &amp;gt; 配置文件 &amp;gt; 编辑配置 &amp;gt; 脚本 URL&lt;/p&gt;&#10;&lt;p&gt;当前使用的所有远程脚本资源的展示页面，其后显示的数字为当前成功下载的数量和总共包含的数量。进入后所显示的 ✅ 表示当前脚本下载成功，❎ 表示当前脚本下载失败。点击相应地址可重新拉取并弹出状态提示，但不会重新编译更新配置文件，点击 &lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;，可以对当前所有 URL 进行更新并重新编译更新配置文件&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="复制配置文件"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;复制配置文件&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;配置 &amp;gt; 点击配置文件 &amp;gt; 编辑配置 &amp;gt; 复制&lt;/p&gt;&#10;&lt;p&gt;点击该选项可将当前配置生成一份备份并命名为 &lt;code&gt;*-copy.conf&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="替换策略"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;替换策略&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;配置 &amp;gt; 点击配置文件 &amp;gt; 编辑配置 &amp;gt; 替换策略&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;点击查找右侧的 &lt;code&gt;ⓘ&lt;/code&gt; 图标选择准备替换的策略，或输入准备替换的策略&lt;/li&gt;&#10;&lt;li&gt;点击替换右侧的 &lt;code&gt;ⓘ&lt;/code&gt; 图标选择欲替换成的策略，或输入欲替换成的策略&lt;/li&gt;&#10;&lt;li&gt;点击完成后替换完成&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="测试规则"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;测试规则&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;配置 &amp;gt; 测试规则&lt;/p&gt;&#10;&lt;p&gt;配置 &amp;gt; 点击配置文件 &amp;gt; 编辑配置 &amp;gt; 测试规则&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;基于当前配置进行规则策略测试&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="hosts"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;Hosts&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 支持本地自定义 DNS 映射。包含 &lt;strong&gt;本地值&lt;/strong&gt; 和 &lt;strong&gt;DNS服务器&lt;/strong&gt; 两种设定方式。在 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中位于 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 的 &lt;code&gt;[Host]&lt;/code&gt; 字段。在默认情况下，对于代理类的 DNS 解析始终在远端服务器上执行，支持使用 &lt;code&gt;use-local-host-item-for-proxy&lt;/code&gt; 等 &lt;a class="link" href="#%e9%9a%90%e5%bc%8f%e5%8f%82%e6%95%b0" &gt;隐式参数&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;UI 编辑&lt;/strong&gt;：点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; Hosts&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文本编辑&lt;/strong&gt;：点击配置文件 &amp;gt; 编辑纯文本 &amp;gt; &lt;code&gt;[Host]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;编辑示例：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;将特定域名映射到指定 IP 地址，绕过 DNS 解析，直接控制域名到 IP 的对应关系&lt;br&gt;&#10;&lt;code&gt;example.com = 1.2.3.4&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;将特定域名指定特定的 DNS 服务器进行解析&lt;br&gt;&#10;&lt;code&gt;example.com = server:1.2.3.4&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="url重写"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;URL重写&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;修改 HTTP(S) 请求/响应，动态拦截并修改请求的 URL 或内容，在 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中位于 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 的 &lt;code&gt;[URL Rewrite]&lt;/code&gt; 字段。重写类型包含 &lt;code&gt;HEADER&lt;/code&gt;、&lt;code&gt;302&lt;/code&gt;、&lt;code&gt;307&lt;/code&gt; 以及其他支持的代理策略。支持使用 &lt;code&gt;always-reject-url-rewrite&lt;/code&gt; 等 &lt;a class="link" href="#%e9%9a%90%e5%bc%8f%e5%8f%82%e6%95%b0" &gt;隐式参数&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;UI 编辑&lt;/strong&gt;：点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; URL重写&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文本编辑&lt;/strong&gt;：点击配置文件 &amp;gt; 编辑纯文本 &amp;gt; &lt;code&gt;[URL Rewrite]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="头部重写"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;头部重写&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;支持 &lt;strong&gt;请求头/响应头&lt;/strong&gt; 重写功能，即标头重写，包含 &lt;code&gt;del&lt;/code&gt;、&lt;code&gt;add&lt;/code&gt;、&lt;code&gt;replace&lt;/code&gt;、&lt;code&gt;replace-regex&lt;/code&gt; 几种操作。在 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中位于 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 的 &lt;code&gt;[Header Rewrite]&lt;/code&gt; 字段&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;UI 编辑&lt;/strong&gt;：点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 头部重写&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文本编辑&lt;/strong&gt;：点击配置文件 &amp;gt; 编辑纯文本 &amp;gt; &lt;code&gt;[Header Rewrite]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;类型：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;http-request&lt;/code&gt;：作用于请求头&lt;br&gt;&#10;&lt;code&gt;http-response&lt;/code&gt;：作用于响应头&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;行为：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;header-del&lt;/code&gt;：从请求头或响应头中删除指定字段&lt;br&gt;&#10;&lt;code&gt;header-add&lt;/code&gt;：向请求头或响应头中添加字段及其对应的值&lt;br&gt;&#10;&lt;code&gt;header-replace&lt;/code&gt;：在请求头或响应头中替换指定字段的值&lt;br&gt;&#10;&lt;code&gt;header-replace-regex&lt;/code&gt;：使用正则表达式在请求头或响应头中替换字段的值&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;表达式：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;正则表达式用于匹配目标网站的 URL&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;常用字段：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;Content-Type&lt;/code&gt;、&lt;code&gt;User-Agent&lt;/code&gt;、&lt;code&gt;Accept-Language&lt;/code&gt;、&lt;code&gt;Authorization&lt;/code&gt;、&lt;code&gt;Host&lt;/code&gt;、&lt;code&gt;Referer&lt;/code&gt;、&lt;code&gt;Cookie&lt;/code&gt;、&lt;code&gt;X-Forwarded-For&lt;/code&gt;、&lt;code&gt;Location&lt;/code&gt; 等&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="正文重写"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;正文重写&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;支持 &lt;strong&gt;请求体/响应体&lt;/strong&gt; 重写功能，支持使用 &lt;code&gt;jq&lt;/code&gt; 语法。在 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中位于 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 的 &lt;code&gt;[Body Rewrite]&lt;/code&gt; 字段&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;UI 编辑&lt;/strong&gt;：点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 正文重写&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文本编辑&lt;/strong&gt;：点击配置文件 &amp;gt; 编辑纯文本 &amp;gt; &lt;code&gt;[Body Rewrite]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;类型：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;http-request&lt;/code&gt;：作用于请求体&lt;br&gt;&#10;&lt;code&gt;http-response&lt;/code&gt;：作用于响应体&lt;br&gt;&#10;&lt;code&gt;http-request-jq&lt;/code&gt;：使用 &lt;code&gt;jq&lt;/code&gt; 语法处理请求体&lt;br&gt;&#10;&lt;code&gt;http-response-jq&lt;/code&gt;：使用 &lt;code&gt;jq&lt;/code&gt; 语法处理响应体&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;表达式：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;正则表达式用于匹配目标网站的 URL&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="本地映射"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;本地映射&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;支持 &lt;strong&gt;本地映射&lt;/strong&gt; 功能，在 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中位于 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 的 &lt;code&gt;[Map Local]&lt;/code&gt; 字段&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;UI 编辑&lt;/strong&gt;：点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 本地映射&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文本编辑&lt;/strong&gt;：点击配置文件 &amp;gt; 编辑纯文本 &amp;gt; &lt;code&gt;[Map Local]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;类型：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;text&lt;/code&gt;：返回文本类型响应&lt;br&gt;&#10;&lt;code&gt;file&lt;/code&gt;：返回文件类型响应。文件内容不一定是本地文件，支持引用远程文件地址&lt;br&gt;&#10;&lt;code&gt;tiny-gif&lt;/code&gt;：返回一个 1x1 像素的 GIF 图片&lt;br&gt;&#10;&lt;code&gt;base64&lt;/code&gt;：返回 base64 编码数据类型响应&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;表达式：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;正则表达式用于匹配目标网站的 URL&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;数据：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;填写所需返回的数据&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;额外请求头：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;可选返回额外请求头&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="https解密"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;HTTPS解密&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;对正在使用的配置开启 HTTPS 解密才能使包含 MITM 的模块完整生效，不包含 MITM 的模块除外&lt;/p&gt;&#10;&lt;p&gt;打开HTTPS解密方法：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; HTTPS 解密 &amp;gt; 证书 &amp;gt; 生成新的 CA 证书 &amp;gt; 安装证书&lt;/li&gt;&#10;&lt;li&gt;系统设置 &amp;gt; 已下载描述文件 &amp;gt; 安装&lt;/li&gt;&#10;&lt;li&gt;系统设置 &amp;gt; 通用 &amp;gt; 关于本机 &amp;gt; 证书信任设置 &amp;gt; 开启对应 Shadowrocket 证书信任&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;自版本 &lt;code&gt;2.2.81 (3096-3099)&lt;/code&gt; 起支持通过 HTTP/2 协议进行中间人攻击来解密 HTTPS 流量&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; HTTPS 解密 &amp;gt; 通过 HTTP/2 进行中间人攻击（MitM）&lt;/li&gt;&#10;&lt;li&gt;或者在配置文件、模块纯文本模式中的 &lt;code&gt;[MITM]&lt;/code&gt; 字段中使用 &lt;code&gt;h2 = true&lt;/code&gt; 表示启用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;若模块中包含此命令，则会覆盖配置文件中的相关设置&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;HTTPS解密仅对启用此功能的配置文件生效，若切换或更换配置文件需要对新配置文件重新 &lt;a class="link" href="#https%e8%a7%a3%e5%af%86" &gt;开启解密&lt;/a&gt;，为避免重复安装证书可使用 &lt;a class="link" href="#%e8%af%81%e4%b9%a6%e6%a8%a1%e5%9d%97" &gt;证书模块&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;若多终端经 iCloud 使用同一个配置文件，需要使用证书 &lt;code&gt;ⓘ&lt;/code&gt; 图标的复制粘贴功能将同一个证书在多个终端上进行安装信任&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="脚本"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;脚本&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;使用 JavaScript 拓展 Shadowrocket 的功能，在 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 模式中位于 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 的 &lt;code&gt;[Script]&lt;/code&gt; 字段&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;UI 编辑&lt;/strong&gt;：点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 脚本&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;文本编辑&lt;/strong&gt;：点击配置文件 &amp;gt; 编辑纯文本 &amp;gt; &lt;code&gt;[Script]&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;类型：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;http-request&lt;/code&gt;：使用脚本修改 HTTP 请求&lt;br&gt;&#10;&lt;code&gt;http-response&lt;/code&gt;：使用脚本修改 HTTP 响应&lt;br&gt;&#10;&lt;code&gt;event&lt;/code&gt;：在指定事件发生时运行脚本&lt;br&gt;&#10;&lt;code&gt;rule&lt;/code&gt;：使用脚本作为规则使用&lt;br&gt;&#10;&lt;code&gt;dns&lt;/code&gt;：使用脚本作为DNS 解析器&lt;br&gt;&#10;&lt;code&gt;cron&lt;/code&gt;：在指定时间运行脚本&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;引擎：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;auto&lt;/code&gt;：自动选择脚本引擎&lt;br&gt;&#10;&lt;code&gt;jsc&lt;/code&gt;：适用于小型、简单、频繁调用的脚本，例如规则、DNS等&lt;br&gt;&#10;&lt;code&gt;webview&lt;/code&gt;：适用于复杂、高内存需求的脚本，例如解析 MB 级别的 JSON&lt;/p&gt;&#10;&lt;p&gt;若脚本类型为 &lt;code&gt;http-request&lt;/code&gt; 或 &lt;code&gt;http-response&lt;/code&gt;，则在配置 &lt;code&gt;engine=auto&lt;/code&gt; 参数时，系统将默认调用 &lt;code&gt;WebView&lt;/code&gt; 引擎，而非 &lt;code&gt;JSC&lt;/code&gt; 引擎。因此，从使用规范与一致性角度考虑，该参数建议明确指定类型，以确保行为符合预期&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;其他参数：&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;参见软件内的具体选项及释义&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;脚本文本示例如下：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Script&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;script &lt;span style="color:#f92672"&gt;=&lt;/span&gt; type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;rule,script&lt;span style="color:#f92672"&gt;-&lt;/span&gt;path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;rule&lt;span style="color:#f92672"&gt;.&lt;/span&gt;js&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="模块"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;模块&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;模块是指为 Shadowrocket 提供额外功能的插件或者扩展项，一般是以增强或自定义软件的使用体验为出发点。模块的写法与 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 相同，且模块的 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e4%bc%98%e5%85%88%e7%ba%a7" &gt;规则优先级&lt;/a&gt; 高于配置文件。一般情况下，模块仅包含完整配置文件格式中的特定部分，以实现特定的特殊效果且不影响配置文件的其他功能。用户可以在模块里另外设置 &lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;通用参数&lt;/a&gt; 以及添加 &lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%a7%84%e5%88%99" &gt;规则&lt;/a&gt;、&lt;a class="link" href="#hosts" &gt;Hosts&lt;/a&gt;、&lt;a class="link" href="#url%e9%87%8d%e5%86%99" &gt;URL重写&lt;/a&gt;、&lt;a class="link" href="#%e8%af%81%e4%b9%a6%e6%a8%a1%e5%9d%97" &gt;证书内容&lt;/a&gt;、解密主机名、&lt;a class="link" href="#%e8%84%9a%e6%9c%ac" &gt;脚本&lt;/a&gt; 等内容&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;下载远程模块&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;配置 &amp;gt; 模块 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt; &amp;gt; 填写链接 &amp;gt; 下载&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;本地新建模块&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;配置 &amp;gt; 模块 &amp;gt; 新建模块 &amp;gt; 编辑后保存&lt;/p&gt;&#10;&lt;p&gt;模块 &lt;code&gt;[MITM]&lt;/code&gt; 部分需要加 &lt;code&gt;%APPEND%&lt;/code&gt;，表示把内容插入到配置中，不加时会覆盖配置中对应内容，并影响其他模块功能&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;MITM&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hostname &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;APPEND&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;主机名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;模块管理&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;配置 &amp;gt; 模块 &amp;gt; 模块区域右上角 &lt;code&gt;···&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;可以对模块顺序进行重新排序，并可以选择并批量删除/启用/禁用选定的模块&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;对正在使用的配置 &lt;a class="link" href="#https%e8%a7%a3%e5%af%86" &gt;开启 HTTPS 解密&lt;/a&gt; 或使用 &lt;a class="link" href="#%e8%af%81%e4%b9%a6%e6%a8%a1%e5%9d%97" &gt;证书模块&lt;/a&gt;，才能使包含 MITM 的模块完整生效，不包含 MITM 的模块除外&lt;/li&gt;&#10;&lt;li&gt;因模块可能包含不同规则，所以大多数模块仅在 &lt;a class="link" href="#%e5%85%a8%e5%b1%80%e8%b7%af%e7%94%b1%e5%8c%ba%e5%88%ab" &gt;全局路由&lt;/a&gt; 设为配置时生效，不包含规则类的模块除外&lt;/li&gt;&#10;&lt;li&gt;iOS 15 之后，NE的内存限制由 15 MB 增加到了 50 MB，低版本系统可能因内存不足导致 &lt;a class="link" href="#%e6%a8%a1%e5%9d%97%e5%a4%b1%e6%95%88" &gt;模块失效&lt;/a&gt; 或 &lt;a class="link" href="#vpn%e8%87%aa%e5%8a%a8%e6%96%ad%e5%bc%80" &gt;VPN 自动断开&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;若出现以下问题可以查看相应说明：&lt;a class="link" href="#%e6%a8%a1%e5%9d%97%e6%b6%88%e5%a4%b1" &gt;模块消失&lt;/a&gt;、&lt;a class="link" href="#%e6%a8%a1%e5%9d%97%e5%a4%b1%e6%95%88" &gt;模块失效&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="编辑参数"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;编辑参数&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;配置 &amp;gt; 模块 &amp;gt; 点击模块 &amp;gt; 编辑参数 &amp;gt; 按需填写或修改&lt;/p&gt;&#10;&lt;p&gt;Shadowrocket 的 &lt;strong&gt;编辑参数 / 传递参数&lt;/strong&gt; 功能，是用于对请求或响应中的参数进行动态修改的一个高级功能，可用于配合模块中的 &lt;code&gt;URL Rewrite&lt;/code&gt;、&lt;code&gt;Script&lt;/code&gt;、&lt;code&gt;MITM&lt;/code&gt; 等代码使用，目的是实现对网络请求的精准控制与定制化处理。编辑参数所修改或填写的内容不会因为模块更新而丢失，若开启了 iCloud，其自定义参数保存在 &lt;code&gt;iCloud - Shadowrocket - Modules&lt;/code&gt; 内与模块同名的 &lt;code&gt;*.meta&lt;/code&gt; 文件内&lt;/p&gt;&#10;&lt;p&gt;示例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!name=证书模块&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!desc=需要以编辑参数的方式启用并填写完整&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!arguments=证书模块:false, 证书内容:此处粘贴有效的证书内容, 证书密码:此处粘贴有效的证书密码&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!arguments-desc=证书模块：启用并填写证书内容方可生效\n\n证书内容：粘贴自有效证书\n\n证书密码：若默认密码是Shadowrocket则可不动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;MITM&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enable&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{{{&lt;span style="color:#960050;background-color:#1e0010"&gt;证书模块&lt;/span&gt;}}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ca&lt;span style="color:#f92672"&gt;-&lt;/span&gt;passphrase&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{{{&lt;span style="color:#960050;background-color:#1e0010"&gt;证书密码&lt;/span&gt;}}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ca&lt;span style="color:#f92672"&gt;-&lt;/span&gt;p12&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{{{&lt;span style="color:#960050;background-color:#1e0010"&gt;证书内容&lt;/span&gt;}}}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="证书模块"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;证书模块&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;在实际使用软件时如果需要切换或更换 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt;，且原配置已开启过 &lt;a class="link" href="#https%e8%a7%a3%e5%af%86" &gt;HTTPS 解密&lt;/a&gt;，则需要对新的配置文件重新安装并信任证书，才可使解密继续生效。为免除重复安装 CA 证书，可以选择使用证书模块。证书模块是一组手动添加已生效解密证书的模块，由于模块的优先级高于配置文件，可以使解密状态不受更换配置的影响。其原理参见：&lt;a class="link" href="#%e6%a8%a1%e5%9d%97" &gt;模块&lt;/a&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;新建模块：&lt;/p&gt;&#10;&lt;p&gt;软件 &lt;strong&gt;配置 &amp;gt; 模块 &amp;gt; 新建模块&lt;/strong&gt;，复制以下内容并粘贴进去保存备用：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!name=证书（名字可更改）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;MITM&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enable&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 在下方 “ca-passphrase=” 后面粘贴证书密码&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ca&lt;span style="color:#f92672"&gt;-&lt;/span&gt;passphrase&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 在下方 “ca-p12=” 后面粘贴证书内容&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ca&lt;span style="color:#f92672"&gt;-&lt;/span&gt;p12&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击「已安装证书的配置文件」后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; HTTPS 解密 &amp;gt; 证书后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 复制&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;将复制的证书内容粘贴至第一步创建的证书模块内的 &lt;code&gt;ca-p12=&lt;/code&gt; 后面保存&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;证书模块原本可以省略 &lt;code&gt;ca-passphrase&lt;/code&gt; 这行参数。但由于引用的配置文件可能已经包含了证书密码，且证书密码可能不是 &lt;code&gt;Shadowrocket&lt;/code&gt;，为防止出错，因此才增加 &lt;code&gt;ca-passphrase&lt;/code&gt; 参数来覆盖引用的配置文件的证书密码&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="身份证书密码"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;身份证书密码&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 安装 CA 证书时，如果遇到「输入证书 &lt;strong&gt;身份证书&lt;/strong&gt; 的密码」页面，可以尝试输入：Shadowrocket&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="编写本地节点"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;编写本地节点&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 支持在 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; 中编写本地节点，但该操作方式仅是为了兼容部分其他类型的配置文件，不能当作 Shadowrocket &lt;a class="link" href="#%e6%b7%bb%e5%8a%a0%e8%8a%82%e7%82%b9" &gt;添加节点&lt;/a&gt; 的优先选择&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Shadowsocks类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=ss,地址,端口,password=密码,其他参数(如method=aes-256-cfb,obfs=websocket,plugin=none)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Vmess类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=vmess,地址,端口,password=密码,其他参数(如alterId=0,method=auto,obfs=websocket,tfo=1)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;VLESS类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=vless,地址,端口,password=密码,tls=true,其他参数(如obfs=websocket,peer=example.com)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;HTTP/HTTPS/Socks5/Socks5 Over TLS等类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=http,地址,端口,用户,密码&#10;节点名称=https,地址,端口,用户,密码&#10;节点名称=socks5,地址,端口,用户,密码&#10;节点名称=socks5-tls,地址,端口,用户,密码,skip-common-name-verify=true&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Trojan类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=trojan,地址,端口,password=密码,其他参数(如allowInsecure=1,peer=example.com)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Hysteria类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=hysteria,地址,端口,auth=密码,obfsParam=混淆,protocol=协议,udp=1,其他参数(如peer=example.com,alpn=h2,upmbps=100,downmbps=100)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Hysteria2类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=hysteria2,地址,端口,auth=密码,obfsParam=混淆,udp=1,其他参数(如peer=example.com,alpn=h3)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;TUIC类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=tuic,地址,端口,password=密码,udp=1,其他参数(如user=uuid值,peer=example.com,alpn=h2)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Juicity类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=juicity,地址,端口,password=密码,udp=1,其他参数(如user=uuid值,peer=example.com,alpn=h2)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;WireGuard类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=wireguard,地址,端口,privateKey=私钥,publicKey=公钥,ip=子网IP,udp=1,其他参数(如dns=1.1.1.1,mtu=1350,keepalive=40,reserved=1/2/3)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;Snell v2 类型&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点名称=snell,地址,端口,password=密码,udp=1,其他参数(如obfs=http,obfs-host=example.com,obfs-uri=/abc)&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="数据页面"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;数据页面&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 id="代理日志"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;代理日志&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;代理日志&lt;/strong&gt; 记录了网络活动过程中 Shadowrocket 处理请求的具体信息&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;数据 &amp;gt; 代理 &amp;gt; 启用日志记录&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;产生网络活动时，返回 &lt;strong&gt;数据 &amp;gt; 代理&lt;/strong&gt; 页面查看日志文件&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;每条记录包含信息：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;请求 URL&lt;/li&gt;&#10;&lt;li&gt;请求匹配的规则策略&lt;/li&gt;&#10;&lt;li&gt;请求传输协议&lt;/li&gt;&#10;&lt;li&gt;请求发送时间&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;记录显示 &lt;code&gt;MITM&lt;/code&gt;，表示请求域名已启用解密&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击每条记录查看详情，详情页右上角 &lt;code&gt;•••&lt;/code&gt; 可以选择类型添加规则&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;数据 &amp;gt; 代理&lt;/strong&gt; 页面，右上角 &lt;code&gt;•••&lt;/code&gt; 可以手动删除所有日志文件。日志文件页面，右上角 &lt;code&gt;•••&lt;/code&gt; 可以选择导出&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;数据 &amp;gt; 自动删除 &amp;gt; 打开&lt;/strong&gt;，程序会自动删除7天前的日志文件。Shadowrocket 已连接状态，手动删除将保留最新的日志文件，未连接时，手动删除所有&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="dns日志"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;DNS日志&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;DNS 日志&lt;/strong&gt; 记录了网络活动过程中 DNS 服务器处理域名查询请求的具体信息&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;数据 &amp;gt; 代理 &amp;gt; DNS &amp;gt; 启用日志记录&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;产生网络活动时，返回 &lt;strong&gt;数据 &amp;gt; DNS&lt;/strong&gt; 页面查看日志文件&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;每条记录包含信息：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;请求域名&lt;/li&gt;&#10;&lt;li&gt;查询结果&lt;/li&gt;&#10;&lt;li&gt;DNS 响应时间&lt;/li&gt;&#10;&lt;li&gt;处理请求的 DNS&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;旗帜是根据返回IP地址的地理位置信息自动显示&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;覆写 DNS&lt;/strong&gt; 不可用或未返回有效响应时，将回退至 &lt;strong&gt;备用 DNS&lt;/strong&gt; 来查询域名&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;记录信息中如果响应时间超过2秒，意味着系统正在触发回退机制&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="icloud自动同步"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;iCloud自动同步&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 支持将服务器节点、配置文件、模块和脚本文件等数据类型自动同步至 iCloud 云端&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;数据 &amp;gt; iCloud &amp;gt; 自动同步 &amp;gt; 打开&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;设备 &lt;strong&gt;设置 &amp;gt; 账号 &amp;gt; iCloud&lt;/strong&gt;，确保使用 iCloud 的 APP 列表中已经开启 Shadowrocket 和 &lt;strong&gt;iCloud 云盘&lt;/strong&gt; 项目，否则会出现 &lt;strong&gt;iCloud 自动同步失败&lt;/strong&gt; 的提示&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;同步成功时，点击 &lt;strong&gt;iCloud 文件&lt;/strong&gt; 可以看到存储云端的配置文件&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;文件app &amp;gt; iCloud 云盘 &amp;gt; Shadowrocket&lt;/strong&gt;，可以看到存储云端的所有数据。其中的 &lt;strong&gt;shadowrocket.v2.model&lt;/strong&gt; 文件包含服务器节点的配置信息&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;iCloud 服务中断、网络连接问题以及其他复杂原因可能导致 iCloud 同步异常，这种情况建议选择手动删除 iCloud 备份并重新同步数据&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;如果用户删除首页某个节点后发现它又自动恢复，可以尝试以下解决方法：数据 &amp;gt; iCloud，服务器节点下面点击删除 iCloud 备份和同步服务器节点&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;添加的 &lt;strong&gt;场景&lt;/strong&gt; 和 &lt;strong&gt;分组&lt;/strong&gt; 不属于 iCloud 自动同步的数据类型，需要手动备份下载，才能在设备间共享数据&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;blockquote class="alert alert-tip"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;💡&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;提示&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;由于 iCloud 的同步机制存在一定限制，在使用 iCloud 进行多设备数据同步时，建议采用以下方式：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;主设备&lt;/strong&gt;：开启自动同步&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;副设备&lt;/strong&gt;：保持关闭自动同步，仅在需要更新数据时手动执行同步操作&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这种方式可以有效降低多设备同时同步所导致的数据冲突或覆盖问题&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="节点数据管理"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;节点数据管理&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;导出节点&lt;/strong&gt;：将首页的所有节点数据整合成一个 JSON 文件，选择存储在本地或云端，也可以通过其他共享方式传输文件&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;导入节点&lt;/strong&gt;：将存储在本地或云端 JSON 文件中的节点数据解析并添加到首页&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;删除本地节点&lt;/strong&gt;：一键删除首页所有节点数据&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="流量统计信息"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;流量统计信息&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;统计&lt;/strong&gt; 是 Shadowrocket 开启连接后接管设备所有网络传输的流量统计信息&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;数据 &amp;gt; 统计&lt;/li&gt;&#10;&lt;li&gt;统计包含信息：&#10;&lt;ul&gt;&#10;&lt;li&gt;开始时间&lt;/li&gt;&#10;&lt;li&gt;连接时间&lt;/li&gt;&#10;&lt;li&gt;Wi-Fi 和蜂窝数据的上下行流量&lt;/li&gt;&#10;&lt;li&gt;流量分流的柱形图统计&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;默认记录所有流量统计信息。打开 &lt;strong&gt;启用存档&lt;/strong&gt; 将会单独记录每一次连接的流量统计信息，关闭首页连接后可以从 &lt;strong&gt;归档&lt;/strong&gt; 查看&lt;/li&gt;&#10;&lt;li&gt;点击右上角 &lt;code&gt;•••&lt;/code&gt; 可以重置统计信息&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;首页 &lt;strong&gt;订阅&lt;/strong&gt; 支持显示流量统计信息&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;方法一，订阅链接添加响应头：&lt;code&gt;subscription-userinfo: upload=xxx; download=xxx; total=xxx; expire=xxx&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;方法二，在订阅链接指向的纯文本 base64 编码前添加 &lt;code&gt;STATUS=xxx&lt;/code&gt; 或 &lt;code&gt;REMARKS=xxx&lt;/code&gt; 字段，这样订阅名称下方就能显示自定义信息。如果没有添加字段或者隐藏用户代理字符串，可能导致不返回相关统计信息，只显示时间&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="设置页面"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;设置页面&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 id="延迟测试方法"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;延迟测试方法&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;详见词条 &lt;a class="link" href="#%e8%bf%9e%e9%80%9a%e6%80%a7%e6%b5%8b%e8%af%95" &gt;连通性测试&lt;/a&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="小组件"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;小组件&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;设置 &amp;gt; 小组件&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;服务器节点&lt;/strong&gt;：根据需求添加6个常用节点，点击 &lt;strong&gt;Today 小组件&lt;/strong&gt; 右上角的 &lt;code&gt;&amp;gt;&lt;/code&gt; 可以展开查看，方便手动切换节点&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;显示Ping值&lt;/strong&gt;：启用后，长按 &lt;strong&gt;Today小组件&lt;/strong&gt; 中心位置可以测试 &lt;strong&gt;服务器节点&lt;/strong&gt; 连通性并显示延迟数字&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;根据Ping排序&lt;/strong&gt;：启用后，长按 &lt;strong&gt;Today小组件&lt;/strong&gt; 中心位置可以测试 &lt;strong&gt;服务器节点&lt;/strong&gt; 连通性并依延迟大小自动排序&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;添加小组件方法：&lt;/p&gt;&#10;&lt;p&gt;Today 小组件&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;负一屏 &amp;gt; 编辑 &amp;gt; 自定 &amp;gt; 点击 Shadowrocket 旁边的 &lt;strong&gt;添加&lt;/strong&gt; 按钮 &lt;code&gt;➕&lt;/code&gt;。（系统要求低于 iOS 18）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;屏幕小组件&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;长按屏幕 &amp;gt; 左上角 &lt;code&gt;➕&lt;/code&gt; &amp;gt; Shadowrocket，选择合适类型添加。（系统要求≥ iOS 17）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;更新 Shadowrocket 后，如果找不到小组件添加按钮，请尝试重启手机。如果小组件显示 &lt;strong&gt;无法加载&lt;/strong&gt;，请尝试以下方法：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;系统设置 &amp;gt; 通用 &amp;gt; 语言与地区，添加或删除一种其他语言&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="颜色"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;颜色&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;设置 &amp;gt; 颜色&lt;/p&gt;&#10;&lt;p&gt;Shadowrocket 支持自定义设置软件配色方案，可以根据个人喜好调整各个板块的颜色，并可以随时恢复默认颜色。同时支持分享和安装已有配色方案，配色案例参考 &lt;a class="link" href="https://github.com/LOWERTOP/Shadowrocket-First#shadowrocket-%E9%85%8D%E8%89%B2%E6%96%87%E4%BB%B6" target="_blank" rel="noopener"&#10; &gt;此处&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;配色安装方法：复制已知的配色链接，在配置页面点击 &lt;code&gt;➕&lt;/code&gt; 号粘贴安装&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;外观&lt;/strong&gt;：支持匹配系统的自动色彩方案，以及深色、浅色模式&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;传统样式&lt;/strong&gt;：使用传统应用样式&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;颜色&lt;/strong&gt;：自定义设置颜色，编码为 &lt;strong&gt;十六进制颜色编码（Hex Color Code）&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;重设颜色&lt;/strong&gt;：恢复默认配色&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;复制网址&lt;/strong&gt;：复制当前配色的 URL 地址，可用以分享或保存&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;以下为软件配色项目的名称及其中文译名，需要注意因系统限制，部分项目不可自定义&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;NavigationBarColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;导航栏背景色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;NavigationBar2Color&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;导航栏背景色&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;NavigationBarTextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;导航栏文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;NavigationBar2TextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;导航栏文字颜色&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TabBarColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;标签栏背景色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TabBarBorderColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;标签栏边框颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TabBarSelectedColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;标签栏选中项颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TabBarUnselectedColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;标签栏未选中项颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TableBackgroundColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;表格背景颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TableCellBackgroundColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;表格单元格背景颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TableCellSelectedBackgroundColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;表格单元格选中项背景颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TableSeparatorColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;表格分隔线颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TextFieldTextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;文本框文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;PlaceholderColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;占位符颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TextLabelTextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;文本标签文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DetailLabelTextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;详细标签文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;TextLabelDeleteColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;文本标签删除文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HeaderFooterTextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;页眉页脚文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SearchFieldBackgroundColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;搜索框背景颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;IndicatorColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;指示器颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonIconColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮图标颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonNormalColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮正常状态颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonNormal2Color&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮正常状态颜色&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonNormal3Color&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮正常状态颜色&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonHighlightedColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮高亮状态颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonHighlighted2Color&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮高亮状态颜色&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonHighlighted3Color&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮高亮状态颜色&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonDisabledColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮禁用状态颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;ButtonDisabled2Color&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;按钮禁用状态颜色&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;PingSuccessTextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;测试&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Ping成功文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;PingTimeoutTextColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;测试&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Ping超时文字颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DefaultDotColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;默认指示点颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;HUDBackgroundColor&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;弹窗&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;HUD背景颜色&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="按需求连接"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;按需求连接&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;始终开启&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;VPN 保持连接状态。&lt;a class="link" href="#vpn%e8%87%aa%e5%8a%a8%e6%96%ad%e5%bc%80" &gt;意外断开&lt;/a&gt; 或者重启设备，也会自动连接&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;脚本 / 模块 / 解密&lt;/strong&gt; 等需求比较多时建议开启&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;按需求连接&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;根据添加的 &lt;strong&gt;按需求规则&lt;/strong&gt; 自动切换 VPN 状态。默认规则是任意网络类型下保持连接状态，相当于 &lt;strong&gt;始终开启&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;按需求规则：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;当访问列表中的 &lt;strong&gt;域名&lt;/strong&gt; 时，系统会向 Shadowrocket 发送请求，如果响应成功，VPN 自动连接&lt;/li&gt;&#10;&lt;li&gt;网络中指定的 &lt;code&gt;DNS&lt;/code&gt;（通常认为是网络运营商/Wi-Fi路由器提供的 DNS 服务器地址）与列表任一内容相匹配时，VPN 自动连接或断开&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;SSIDS&lt;/code&gt; 填写需要匹配的 Wi-Fi 名称&lt;/li&gt;&#10;&lt;li&gt;VPN 连接行为可以通过 &lt;strong&gt;网络类型 / 域名 / DNS&lt;/strong&gt; 条件触发&lt;/li&gt;&#10;&lt;li&gt;VPN 断开行为可以通过 &lt;strong&gt;网络类型 / DNS&lt;/strong&gt; 条件触发，不能通过 &lt;strong&gt;域名&lt;/strong&gt; 条件触发&lt;/li&gt;&#10;&lt;li&gt;从上到下依次匹配添加的 &lt;strong&gt;按需求规则&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;添加 &lt;strong&gt;按需求规则&lt;/strong&gt; 后，打开 &lt;strong&gt;按需求连接&lt;/strong&gt; 开关，规则才能生效&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;同时打开 &lt;strong&gt;始终开启&lt;/strong&gt; 和 &lt;strong&gt;按需求连接&lt;/strong&gt;，只有 &lt;strong&gt;始终开启&lt;/strong&gt; 选项能够生效&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;按需求连接是系统管理行为，域名通过系统 DNS 触发开启 VPN，如果域名被解析过或者有缓存则可能不会触发，Shadowrocket 只负责按需求规则的配置，是否生效取决于系统行为&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;睡眠时断开&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;当设备进入睡眠状态，VPN 自动断开连接&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Shadowrocket 响应系统发送的睡眠指令才会断开连接，有时候熄屏的系统未必处于睡眠状态&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;显示断开信息&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;显示 VPN 断开连接的通知信息&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="隧道"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;隧道&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;强制路由&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如果开启，这个隧道的路由规则将优先于任何本地自定义的路由，默认是关闭状态&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;包括所有网络&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;启用后系统会通过隧道进行路由所有的网络流量，但为维持预期设备功能所必需的指定系统服务的流量除外&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;包括本地网络&lt;/strong&gt;：如果开启，所有发送到本地网络的流量都将包含在隧道中，如 AirPlay、AirDrop 和 CarPlay 的网络连接&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;包括APNs&lt;/strong&gt;：如果开启，苹果的 Apple Push Notification 推送通知服务（APN）的网络流量将包含在隧道中&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;包括蜂窝服务&lt;/strong&gt;：如果开启，来自蜂窝服务的互联网可路由网络流量（VoLTE、Wi-Fi通话、IMS、MMS、视觉语音信箱等）将包含在隧道中。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="兼容模式"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;兼容模式&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;设置 &amp;gt; 代理 &amp;gt; 兼容模式&lt;/p&gt;&#10;&lt;p&gt;HomeKit 与摄像头建立连接时，会主动将本机 IP 发送给摄像头端逆向连接。部分情况下 iOS 可能并未处理 VPN 开启时的情况，会将 VPN 的内网地址发送给摄像头，导致 RTSP 数据回包无法发回到 iOS 设备上。若当前设备与家庭中枢设备处于同一局域网下且开启代理时，如果出现无法正常使用 &lt;strong&gt;家庭&lt;/strong&gt; 应用查看流式传输的 HomeKit 实况影像时，可以尝试开启此项以提高相应的兼容性。此处的设置是配置文件通用隐式参数中 &lt;code&gt;compatibility-mode&lt;/code&gt; 的一种，开启该选项效果等同于 &lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;配置文件&lt;/a&gt; 内设置 &lt;code&gt;compatibility-mode=5&lt;/code&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="前置代理"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;前置代理&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;设置 &amp;gt; 代理 &amp;gt; 前置代理&lt;/p&gt;&#10;&lt;p&gt;「前置代理」表示所有流量先通过 HTTP/SOCKS5 代理转发，再根据配置规则向节点服务器发送请求&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="代理共享"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;代理共享&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;代理共享指的是将你当前配置的代理设置分享给其他设备使用。通过代理共享，你可以把自己配置好的代理服务器（如Shadowsocks、Vmess等）通过局域网或者热点网络的方式让其他设备也能够通过相同的代理设置访问互联网&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;在局域网条件下&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;A设备：设置 &amp;gt; 代理 &amp;gt; 代理共享 &amp;gt; 启用共享&lt;/li&gt;&#10;&lt;li&gt;B设备：系统设置 &amp;gt; WiFi &amp;gt; WiFi 名称后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; HTTP代理 &amp;gt; 手动输入Shadowrocket「代理共享」的IP和端口&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;使用热点条件下&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;A设备：开启热点&lt;/li&gt;&#10;&lt;li&gt;B设备：连接热点&lt;/li&gt;&#10;&lt;li&gt;然后按照局域网条件下方法进行设置&lt;br&gt;&#10;&lt;strong&gt;此处需要注意下操作顺序，原理是连接设备热点后先形成局域网环境，然后按照局域网条件进行设置&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;当 iOS 设备开启代理共享时，或需保持该设备屏幕常亮或连接充电器，以防意外退出&lt;/li&gt;&#10;&lt;li&gt;如果配置文件开启了 HTTPS 解密，请确保其他设备已安装并信任相同的证书才能正常使用。当其他设备不需要使用解密功能时，可以在 &lt;strong&gt;代理共享&lt;/strong&gt; 页面关闭「HTTPS解密」开关&lt;/li&gt;&#10;&lt;li&gt;使用代理共享时需要对应的 APP 打开系统设置中的 &lt;strong&gt;本地网络&lt;/strong&gt; 开关&lt;/li&gt;&#10;&lt;li&gt;Telegram 可能不被系统代理接管，可单独在应用内添加 SOCKS5 代理&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="代理类型"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;代理类型&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 代理类型：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;设置 &amp;gt; 代理 &amp;gt; 代理类型&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt;：系统代理模式，对于不支持的程序会交给 TUN 接管网络连接&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;None&lt;/strong&gt;：TUN 模式，全部网络请求都将通过 TUN 接口进行处理。效果等同于 &lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;配置文件&lt;/a&gt; 内设置 &lt;code&gt;compatibility-mode=3&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="开启udp转发"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;开启UDP转发&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;设置 &amp;gt; UDP &amp;gt; 启用转发 &amp;gt; 打开&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首页 &amp;gt; 订阅后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; UDP转发 &amp;gt; 打开&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首页 &amp;gt; 节点后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; UDP转发 &amp;gt; 打开&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="禁用stun"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;禁用STUN&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;设置 &amp;gt; UDP &amp;gt; 禁用STUN &amp;gt; 打开&lt;/p&gt;&#10;&lt;p&gt;禁用 STUN（Session Traversal Utilities for NAT） 的意思是完全阻止 WebRTC 通过 STUN 服务器获取公网 IP，从而彻底杜绝 WebRTC IP 泄露的问题&lt;/p&gt;&#10;&lt;p&gt;若在配置文件 &lt;a class="link" href="#%e9%80%9a%e7%94%a8%e5%8f%82%e6%95%b0" &gt;通用参数&lt;/a&gt; 中使用 &lt;code&gt;stun-response-ip&lt;/code&gt; 的相关命令，则此处的开关状态将被忽略&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="权限"&gt;&lt;a class="link" href="#%e6%9d%83%e9%99%90" &gt;权限&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;位置&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;iOS 系统要求必须开启位置权限才可以读取 Wi-Fi 网络的 SSID 名称。在 Shadowrocket 中，此权限仅在需要使用基于连接 Wi-Fi 网络触发特定配置的 &lt;strong&gt;&lt;a class="link" href="#%e5%9c%ba%e6%99%af" &gt;场景&lt;/a&gt;&lt;/strong&gt; 功能时才需要&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;通知&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;开启通知权限才可允许软件发送重要通知或警报，包括：脚本执行结果、订阅更新通知、VPN 断开通知等&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;剪贴板&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;开启剪贴板权限后，Shadowrocket 将在打开应用程序后尝试识别剪贴板中的内容是否是代理服务器的 URL，若是则会提示将其导入到应用。若未启用此权限，Shadowrocket 主页的本地节点上方将出现一个专用的粘贴按钮，以允许手动粘贴和导入剪贴板的内容&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="隐藏vpn图标"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;隐藏VPN图标&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;设置 &amp;gt; 排除路由 0.0.0.0/31 &amp;gt; 打开&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：该选项是利用系统漏洞实现的，打开开关可能会导致网络异常，不推荐开启此项&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="geoip数据库"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;GEOIP数据库&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;设置 &amp;gt; GeoLite2 数据库&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;软件已内置常规 GeoIP 数据库，一般情况下无需设置，若有需要请参考以下设置方式&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;方法一&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;填写 &lt;a class="link" href="https://www.maxmind.com" target="_blank" rel="noopener"&#10; &gt;MaxMind官网&lt;/a&gt; 注册的账户 ID 和密钥，点击下方的 &lt;strong&gt;更新&lt;/strong&gt; 按钮&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;方法二&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;关注 GitHub 的 IP 数据库项目，复制 mmdb 格式的下载链接，粘贴在国家/ASN 对应的 URL 位置，点击 &lt;strong&gt;更新&lt;/strong&gt; 按钮。当点击 &lt;strong&gt;重置&lt;/strong&gt; 时，可以恢复为系统自带的数据库&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/Loyalsoldier/geoip" target="_blank" rel="noopener"&#10; &gt;Loyalsoldier&lt;/a&gt; 的 IP 数据库：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;raw&lt;span style="color:#f92672"&gt;.&lt;/span&gt;githubusercontent&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Loyalsoldier&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;geoip&lt;span style="color:#f92672"&gt;/&lt;/span&gt;release&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Country&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mmdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/Hackl0us/GeoIP2-CN" target="_blank" rel="noopener"&#10; &gt;Hackl0us&lt;/a&gt; 的 IP 数据库：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;github&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Hackl0us&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;GeoIP2&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;CN&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;raw&lt;span style="color:#f92672"&gt;/&lt;/span&gt;release&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Country&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mmdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/Masaiki/GeoIP2-CN" target="_blank" rel="noopener"&#10; &gt;Masaiki&lt;/a&gt; 的 IP 数据库：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;github&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Masaiki&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;GeoIP2&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;CN&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;raw&lt;span style="color:#f92672"&gt;/&lt;/span&gt;release&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Country&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mmdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/P3TERX/GeoLite.mmdb" target="_blank" rel="noopener"&#10; &gt;P3TERX&lt;/a&gt; 的 ASN 数据库：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;https&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;github&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;P3TERX&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;GeoLite&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mmdb&lt;span style="color:#f92672"&gt;/&lt;/span&gt;raw&lt;span style="color:#f92672"&gt;/&lt;/span&gt;download&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;GeoLite2&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;ASN&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mmdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="自动更新"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;自动更新&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;现阶段软件的自动更新包含配置文件自动更新、模块自动更新、服务器订阅自动更新以及 GeoLite2 数据库自动更新。需要在 &lt;strong&gt;系统设置 &amp;gt; 通用 &amp;gt; 后台App刷新&lt;/strong&gt; 中为 Shadowrocket 启用后台刷新。在重新启动设备、杀死应用程序等结束了程序进程或后台的情况下，后台任务将不能自动启动&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;配置&lt;/strong&gt;：根据设置自动 &lt;a class="link" href="#%e6%9b%b4%e6%96%b0%e9%85%8d%e7%bd%ae" &gt;更新配置&lt;/a&gt; 以及当前所用的 &lt;a class="link" href="#%e8%a7%84%e5%88%99%e9%9b%86url" &gt;规则集&lt;/a&gt;、&lt;a class="link" href="#%e8%84%9a%e6%9c%acurl" &gt;脚本&lt;/a&gt; 等远程资源。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自动后台更新：开启后可根据设置自动更新配置文件&lt;/li&gt;&#10;&lt;li&gt;更新提醒：开启后，更新时会弹出相应提醒。需要开启设备推送通知&lt;/li&gt;&#10;&lt;li&gt;更新间隔：单位为 &lt;strong&gt;天&lt;/strong&gt;，可选 1-7 天&lt;/li&gt;&#10;&lt;li&gt;若当前配置文件是不含更新地址的本地配置文件，则自动更新功能仅会更新当前所用的规则集、脚本等远程资源，参见：&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;、&lt;a class="link" href="#%e8%a7%84%e5%88%99%e9%9b%86url" &gt;规则集URL&lt;/a&gt;、&lt;a class="link" href="#%e8%84%9a%e6%9c%acurl" &gt;脚本URL&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;规则集/脚本资源手动更新方法：点击 &lt;a class="link" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" &gt;配置文件&lt;/a&gt; &amp;gt; &lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;需要注意：自动更新配置会覆盖自定义设置，参见 &lt;a class="link" href="#%e6%9b%b4%e6%96%b0%e9%85%8d%e7%bd%ae" &gt;更新配置&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;模块&lt;/strong&gt;：根据设置自动更新远程模块资源&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自动后台更新：开启后可根据设置自动更新模块&lt;/li&gt;&#10;&lt;li&gt;更新提醒：开启后，更新时会弹出相应提醒。需要开启设备推送通知&lt;/li&gt;&#10;&lt;li&gt;更新间隔：单位为 &lt;strong&gt;天&lt;/strong&gt;，可选 1-7 天&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;订阅&lt;/strong&gt;：根据设置自动更新服务器订阅，另外可 &lt;a class="link" href="#%e6%9b%b4%e6%96%b0%e8%ae%a2%e9%98%85%e8%8a%82%e7%82%b9" &gt;参见此处&lt;/a&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自动后台更新：开启后可根据设置自动更新订阅&lt;/li&gt;&#10;&lt;li&gt;更新提醒：开启后，更新时会弹出相应提醒。需要开启设备推送通知&lt;/li&gt;&#10;&lt;li&gt;更新间隔：单位为 &lt;strong&gt;小时&lt;/strong&gt;，可选 1-24 小时&lt;/li&gt;&#10;&lt;li&gt;DNS：使用指定的 HTTPS DNS 来解析订阅链接的域名，点击右侧的 &lt;code&gt;ⓘ&lt;/code&gt; 可以挑选内置的 DNS&lt;/li&gt;&#10;&lt;li&gt;根据 PING 排序：以连通性测试的结果从小到大排列服务器节点&lt;/li&gt;&#10;&lt;li&gt;发送 HWID：开启该开关后，Shadowrocket 将在更新订阅时发送 X-HWID 标头&lt;/li&gt;&#10;&lt;li&gt;显示删除确认：连通性测试结束后，显示是否删除超时节点的对话框&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;GeoLite2 数据库&lt;/strong&gt;：包含自动后台更新选项、更新提醒选项、更新间隔选项，其中更新间隔单位为 &lt;strong&gt;天&lt;/strong&gt;。其他设置 &lt;a class="link" href="#geoip%e6%95%b0%e6%8d%ae%e5%ba%93" &gt;参见此处&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;blockquote class="alert alert-tip"&gt;&#10; &lt;div class="alert-header"&gt;&#10; &lt;span class="alert-icon"&gt;💡&lt;/span&gt;&#10; &lt;span class="alert-title"&gt;提示&lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;div class="alert-body"&gt;&#10; &lt;p&gt;&lt;strong&gt;若当前配置是远程配置，希望定期更新远程资源，且不希望自定义设置被覆盖或丢失时，可参考以下两种方法：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;进入 &lt;a class="link" href="#%e7%bc%96%e8%be%91%e7%ba%af%e6%96%87%e6%9c%ac" &gt;纯文本编辑&lt;/a&gt; 删除或注释掉 &lt;code&gt;update-url = *&lt;/code&gt;，然后再使用自动更新功能&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;使用 &lt;a class="link" href="#%e6%89%a9%e5%b1%95%e9%85%8d%e7%bd%ae" &gt;扩展配置/包含配置&lt;/a&gt; 功能后，再使用自动更新功能&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10; &lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="温和策略机制"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;温和策略机制&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;当使用温和策略机制时，切换策略不会打断之前与之相关的TCP连接，仅会对之后的网络请求使用新的策略进行连接&lt;br&gt;&#10;当不使用该功能机制时，切换策略会打断与该策略相关的旧有 TCP 连接，若继续使用则使用新的策略重新连接&lt;/p&gt;&#10;&lt;p&gt;例如：打断会使旧有策略相关的连接所进行的下载任务中断&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="其他问题"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;其他问题&lt;/a&gt;&#10;&lt;/h2&gt;&lt;h3 id="自动切换节点"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;自动切换节点&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;自动切换延迟低的节点：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;方法一&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;首页 &amp;gt; 全局路由 &amp;gt; 分组 &amp;gt; &lt;a class="link" href="#%e7%ae%80%e5%8d%95%e6%a8%a1%e5%bc%8f" &gt;简单模式&lt;/a&gt; &amp;gt; 打开&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;方法二&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 代理分组 &amp;gt; 右上角 &lt;code&gt;➕&lt;/code&gt; &amp;gt; &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e5%88%86%e7%bb%84%e7%b1%bb%e5%9e%8b" &gt;类型&lt;/a&gt; &lt;code&gt;url-test&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;备注&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;如果节点不稳定，可同时 &lt;a class="link" href="#%e5%90%af%e7%94%a8%e5%9b%9e%e9%80%80" &gt;开启回退&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="订阅异常"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;订阅异常&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;添加/更新订阅时异常的原因：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;forbidden&lt;/strong&gt; 表示订阅被重置或令牌 token 错误&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;not found&lt;/strong&gt; 表示订阅路径或链接信息错误&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;service unavailable&lt;/strong&gt; 表示域名信息错误或域名被运营商屏蔽&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;SSL 错误&lt;/strong&gt; 表示无法建立与该服务器的安全连接&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;添加/更新订阅链接时，如果发生异常，可以尝试的解决方法：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;全局路由选代理，使用另外一个节点来添加/更新订阅链接&lt;/li&gt;&#10;&lt;li&gt;切换网络后再添加/更新订阅链接&lt;/li&gt;&#10;&lt;li&gt;检查订阅链接是否错误或失效&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="节点旗帜"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;节点旗帜&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点优先根据备注名称匹配旗帜，如果匹配不成功，由节点地址解析出 IP，通过数据库判断该IP的国家或地区，然后显示对应的旗帜&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;节点后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 地址栏的图标，可以手动修改旗帜&lt;/li&gt;&#10;&lt;li&gt;订阅后面的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 订阅界面的 &lt;strong&gt;筛选&lt;/strong&gt; 输入框，输入相关脚本能批量修改旗帜，参考：&lt;a class="link" href="#%e8%ae%a2%e9%98%85%e8%8a%82%e7%82%b9%e7%ad%9b%e9%80%89" &gt;订阅节点筛选&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;如果把旗帜的 Emoji 放在节点备注开头，保存时会自动显示对应的旗帜，且不显示开头的 Emoji&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="节点感叹号"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;节点感叹号&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;节点显示感叹号 &lt;code&gt;⚠&lt;/code&gt; 的原因：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;您的节点使用了 TLS，地址是 IP，却没有设 SNI&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这不是正确的服务器设置，但为了可以正常连接，Shadowrocket 会主动开启 &lt;strong&gt;允许不安全&lt;/strong&gt;。&lt;strong&gt;允许不安全&lt;/strong&gt; 将跳过TLS证书验证，这将导致一些安全问题。如果您使用自签名证书，请将证书导入系统并信任它，否则请及时续订服务器端证书，以防止证书过期。在 &lt;code&gt;2.2.23&lt;/code&gt; 等特定版本中，该选项可能默认为关闭状态&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="微信转圈"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;微信转圈&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如果使用 Shadowrocket 时微信一直显示 &lt;strong&gt;连接中/收取中&lt;/strong&gt;，可以尝试的解决方法：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;微信分流走直连&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击配置文件的 &lt;code&gt;ⓘ&lt;/code&gt; 图标 &amp;gt; 通用 &amp;gt; 启用IPv6 &amp;gt; 关闭&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;本质上该问题是由于现阶段某些地区的运营商对 IPv6 的支持不够稳定，或是路由器设置不当，可能会引发微信加载异常的问题&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="模块消失"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;模块消失&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;模块页面已经开启 &lt;strong&gt;保存到 iCloud&lt;/strong&gt;，如果出现模块消失的问题，请检查：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;系统设置 &amp;gt; Apple ID &amp;gt; iCloud &amp;gt; 使用iCloud的APP中，确保Shadowrocket/iCloud云盘已经打开同步&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;文件app &amp;gt; iCloud云盘 &amp;gt; Shadowrocket，确定其中包含 &lt;code&gt;Modules&lt;/code&gt; 和 &lt;code&gt;Script&lt;/code&gt; 两个子文件夹&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;文件app &amp;gt; iCloud云盘 &amp;gt; Shadowrocket &amp;gt; Modules，如果iCloud的本地缓存被清理，此时模块文件是未下载状态，请等待自动下载或手动下载&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="模块失效"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;模块失效&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;ul&gt;&#10;&lt;li&gt;切换配置文件需要重新 &lt;a class="link" href="#https%e8%a7%a3%e5%af%86" &gt;开启解密&lt;/a&gt;，为避免解密失效可使用 &lt;a class="link" href="#%e8%af%81%e4%b9%a6%e6%a8%a1%e5%9d%97" &gt;证书模块&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;若 &lt;a class="link" href="#%e6%a8%a1%e5%9d%97" &gt;模块&lt;/a&gt; 确认有效且解密设置无误时存在模块失效的情况，则可能是加载资源时因内存、网络等原因导致部分内容出现漏编译的情况。尝试对当前配置点击 &lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e9%85%8d%e7%bd%ae" &gt;使用配置&lt;/a&gt; / &lt;a class="link" href="#%e7%bc%96%e8%af%91%e9%85%8d%e7%bd%ae" &gt;编译配置&lt;/a&gt;，以使远程资源进行重新拉取，一般可恢复正常&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="vpn自动断开"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;VPN自动断开&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;因系统版本低于 &lt;code&gt;iOS 15&lt;/code&gt;、处理复杂请求、加解密数据、运行脚本等因素或多种因素相互作用之下可能导致 NE 内存占用过高，从而造成 VPN 自动断开，解决方法：&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;设置 &amp;gt; 按需求连接 &amp;gt; 始终开启 &amp;gt; 启用&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="检测代理"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;检测代理&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如果在使用 Shadowrocket 的时候，遇到某些 APP 提示需关闭代理才能使用，可以在 &lt;strong&gt;Shadowrocket &amp;gt; 设置 &amp;gt; 代理类型 &amp;gt; 选择 None&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;该设置将使用 &lt;a class="link" href="#%e4%bb%a3%e7%90%86%e7%b1%bb%e5%9e%8b" &gt;TUN 模式&lt;/a&gt; 接管代理，能很大程度上缓解上述情况，但对于某些直接检测系统 VPN 状态或使用其他检测手段的 APP 无效&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="编译原因"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;编译原因&lt;/a&gt;&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 2.2.29 之前的版本是使用 Xcode 13.2.1 编译的&lt;/p&gt;&#10;&lt;p&gt;2023年4月份以后，苹果官方要求开发者在提交应用到 App Store 时必须至少使用 Xcode 14 编译，所以 iOS12 以下系统无法使用&lt;/p&gt;&#10;&lt;p&gt;Shadowrocket 在版本 &lt;code&gt;2.2.30&lt;/code&gt; 之后设置最低安装要求 iOS12，然后停止 &lt;code&gt;2.2.29&lt;/code&gt; 版本，iOS 低版本用户可以安装 &lt;code&gt;2.2.28&lt;/code&gt; 版本&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="url-schemes"&gt;&lt;a class="link" href="#%e4%bd%bf%e7%94%a8%e7%9b%ae%e5%bd%95" &gt;URL-Schemes&lt;/a&gt;&#10;&lt;/h3&gt;&lt;p&gt;请使用相应内容直接替换代码中的大括号及其内容&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;Shadowrocket 支持 &lt;code&gt;X-callback-urls&lt;/code&gt;，允许其他应用程序在 Shadowrocket 中触发某些操作&lt;/p&gt;&#10;&lt;p&gt;支持添加 &lt;code&gt;autoclose=true&lt;/code&gt; 查询值，可在动作触发后退出 Shadowrocket&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;启动 VPN 隧道&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;connect&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//o&lt;/span&gt;pen&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;停止 VPN 隧道&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;disconnect&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;close&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;切换 VPN 开关状态&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;toggle&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;连通性测试&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;connectivity&lt;span style="color:#f92672"&gt;-&lt;/span&gt;test&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;使用特定节点&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//se&lt;/span&gt;lect?s&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#960050;background-color:#1e0010"&gt;节点名称&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;添加 订阅/节点&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;add&lt;span style="color:#f92672"&gt;/&lt;/span&gt;{url}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;更新 订阅&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//u&lt;/span&gt;pdate&lt;span style="color:#f92672"&gt;-&lt;/span&gt;subs&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安装/使用 配置&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;config&lt;span style="color:#f92672"&gt;/&lt;/span&gt;add&lt;span style="color:#f92672"&gt;/&lt;/span&gt;{url}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安装/使用 模块&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//ins&lt;/span&gt;tall?module&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{url}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;切换全局路由（代理/配置/直连/场景）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;route&lt;span style="color:#f92672"&gt;/&lt;/span&gt;proxy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;route&lt;span style="color:#f92672"&gt;/&lt;/span&gt;config&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;route&lt;span style="color:#f92672"&gt;/&lt;/span&gt;direct&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;route&lt;span style="color:#f92672"&gt;/&lt;/span&gt;scene&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安装/使用 配色&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;shadowrocket&lt;/span&gt;:&lt;span style="color:#e6db74"&gt;//&lt;/span&gt;color?{&lt;span style="color:#960050;background-color:#1e0010"&gt;配色设置&lt;/span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;</description></item><item><title>白嫖123云盘的流量与速度</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E7%99%BD%E5%AB%96123%E4%BA%91%E7%9B%98%E7%9A%84%E6%B5%81%E9%87%8F%E4%B8%8E%E9%80%9F%E5%BA%A6/</link><pubDate>Wed, 06 Aug 2025 22:16:29 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E7%99%BD%E5%AB%96123%E4%BA%91%E7%9B%98%E7%9A%84%E6%B5%81%E9%87%8F%E4%B8%8E%E9%80%9F%E5%BA%A6/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_21-58-25.png" alt="Featured image of post 白嫖123云盘的流量与速度" /&gt;&lt;p&gt;最近买了一台小米8ud（屏下指纹版）因而在网上上苦求刷机包，可惜大部分资源都被存在了123云盘中，迫不得已，在网上苦求突破123云盘的下载限制，顺便提个速。经过一番折腾，终于成功了，现将方法记录如下：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;本教程部分应用要在VPN环境下下载，建议先开启VPN。&lt;/li&gt;&#10;&lt;li&gt;下载一个可用的浏览器，仅限于Chrome、Edge、Opera、Firefox浏览器，其他浏览器不行。&lt;/li&gt;&#10;&lt;li&gt;下载并安装Tampermonkey插件，地址：&lt;a class="link" href="https://www.tampermonkey.net/" target="_blank" rel="noopener"&#10; &gt;https://www.tampermonkey.net/&lt;/a&gt;&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_21-58-14.png"&gt;&lt;/li&gt;&#10;&lt;li&gt;安装脚本，地址：&lt;a class="link" href="https://greasyfork.org/zh-CN/scripts/519353-123%E4%BA%91%E7%9B%98%E8%A7%A3%E9%94%81" target="_blank" rel="noopener"&#10; &gt;https://greasyfork.org/zh-CN/scripts/519353-123%E4%BA%91%E7%9B%98%E8%A7%A3%E9%94%81&lt;/a&gt;&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_21-57-51.png"&gt;&lt;/li&gt;&#10;&lt;li&gt;安装Motrix下载助手，地址：&lt;a class="link" href="https://github.com/gautamkrishnar/motrix-webextension" target="_blank" rel="noopener"&#10; &gt;https://github.com/gautamkrishnar/motrix-webextension&lt;/a&gt;&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_21-58-25.png"&gt;&lt;/li&gt;&#10;&lt;li&gt;访问Motrix官网，地址：&lt;a class="link" href="https://motrix.app/" target="_blank" rel="noopener"&#10; &gt;https://motrix.app/&lt;/a&gt;&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_21-59-10.png"&gt;&lt;/li&gt;&#10;&lt;li&gt;点击下载，下载合适的Motrix客户端，安装完成后打开。&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_21-59-19.png"&gt;&lt;/li&gt;&#10;&lt;li&gt;单击浏览器中的Tampermonkey图标，选择“123云盘解锁”，然后点击“启用”。&lt;/li&gt;&#10;&lt;li&gt;打开扩展中的开发人员选项，并允许篡改猴执行用户脚本。&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_22-01-59.png"&gt;&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_22-03-53.png"&gt;&lt;/li&gt;&#10;&lt;li&gt;选择扩展中的motrix下载助手，启用它。&lt;/li&gt;&#10;&lt;li&gt;访问123云盘的下载链接，点击保存到云盘。&lt;/li&gt;&#10;&lt;li&gt;打开云盘网页端，选择刚才保存的文件。&lt;/li&gt;&#10;&lt;li&gt;点击右下角的设置面板，启用里面的选项&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/Snipaste_2025-08-06_22-05-48.png"&gt;&lt;/li&gt;&#10;&lt;li&gt;然后点击下载即可&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;这个方法好在不受流量限制，而且不限速，缺点是需要安装几个插件和软件，稍微麻烦一些。&#10;以及每次只能下1GB以内的多文件或随意大小的单文件（单文件可以有随意大小），不能大批量下载。&#10;祝大家下载愉快！我所下到的刷机包回头会分享出来的。&lt;/p&gt;&#10;</description></item><item><title>使用cloudflare搭建VPN的实战演练及免费节点</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E4%BD%BF%E7%94%A8cloudflare%E6%90%AD%E5%BB%BAvpn%E7%9A%84%E5%AE%9E%E6%88%98%E6%BC%94%E7%BB%83/</link><pubDate>Mon, 14 Jul 2025 14:22:13 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E4%BD%BF%E7%94%A8cloudflare%E6%90%AD%E5%BB%BAvpn%E7%9A%84%E5%AE%9E%E6%88%98%E6%BC%94%E7%BB%83/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/cfvpneg2.webp" alt="Featured image of post 使用cloudflare搭建VPN的实战演练及免费节点" /&gt;&lt;h2 id="本文章为这篇文章的后续并提供免费示例"&gt;本文章为&lt;a class="link" href="https://e6b0d3c5.newhugoblog.pages.dev/posts/%e9%80%9a%e8%bf%87cloudflare%e7%9a%84worker%e5%92%8cpages%e6%90%ad%e5%bb%ba%e6%b0%b8%e4%b9%85%e5%85%8d%e8%b4%b9%e7%9a%84vpn/" &gt;这篇文章&lt;/a&gt;的后续，并提供免费示例&#10;&lt;/h2&gt;&lt;p&gt;在成功部署后，我们就可以输入&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;https://example.com/114514&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;来访问我们的网站&#10;此时它应该是这样的：&#10;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/cfvpneg2.webp"&gt;&#10;你们也可以通过&lt;a class="link" href="https://edge.realityme.top/1145141919810" target="_blank" rel="noopener"&#10; &gt;https://edge.realityme.top/1145141919810&lt;/a&gt;来访问我搭建的这个站点&#10;纯公益，不收费（酷炫）&lt;/p&gt;&#10;</description></item><item><title>通过Cloudflare的worker和Pages搭建永久免费的VPN</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E9%80%9A%E8%BF%87cloudflare%E7%9A%84worker%E5%92%8Cpages%E6%90%AD%E5%BB%BA%E6%B0%B8%E4%B9%85%E5%85%8D%E8%B4%B9%E7%9A%84vpn/</link><pubDate>Mon, 14 Jul 2025 09:37:49 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E9%80%9A%E8%BF%87cloudflare%E7%9A%84worker%E5%92%8Cpages%E6%90%AD%E5%BB%BA%E6%B0%B8%E4%B9%85%E5%85%8D%E8%B4%B9%E7%9A%84vpn/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/cf.webp" alt="Featured image of post 通过Cloudflare的worker和Pages搭建永久免费的VPN" /&gt;&lt;p&gt;今天我们主要来说下如果通过 Cloudflare 的 worker 、Pages 搭建永久免费的VPN，真正做到无限流量！&lt;/p&gt;&#10;&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/cfvpn.webp"&gt;&lt;/p&gt;&#10;&lt;h2 id="准备工作"&gt;准备工作&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;首先你需要注册一个免费的 Cloudflare 账号 &lt;a class="link" href="https://dash.cloudflare.com/sign-up" target="_blank" rel="noopener"&#10; &gt;【点击前往】&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;接着你需要准备好开源软件：V2rayN，因为一会要用到 &lt;a class="link" href="https://github.com/2dust/v2rayN" target="_blank" rel="noopener"&#10; &gt;【点击下载】&lt;/a&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;在Cloudflare 上创建worker，并填写下面的代码，这个代码来自CM在【 GitHub 】社区的开源项目，代码已经内置IP优选和代理功能，自带动态的UUID，可以大大减少手动配置过程，非常适合新手和特殊用户。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;创建的worker项目名称最好使用系统默认的，别自定义，以免被系统识别到特殊字符而被屏蔽。&lt;/p&gt;&#10;&lt;h2 id="获取cloudflare-的-worker-开源代码"&gt;获取Cloudflare 的 worker 开源代码&#10;&lt;/h2&gt;&lt;p&gt;加密版：&lt;a class="link" href="https://github.com/cmliu/edgetunnel/blob/main/_worker.js" target="_blank" rel="noopener"&#10; &gt;【点击获取】&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;明文版：直接复制下方的代码即可！&#10;仅限海外用户使用，大陆用户切勿使用（可能违法），别给站长找麻烦！！&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;import { connect } from &amp;#39;cloudflare:sockets&amp;#39;;&#10;&#10;let userID = &amp;#39;&amp;#39;;&#10;let proxyIP = &amp;#39;&amp;#39;;&#10;//let sub = &amp;#39;&amp;#39;;&#10;let subConverter = &amp;#39;SUBAPI.fxxk.dedyn.io&amp;#39;;&#10;let subConfig = &amp;#34;https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/config/ACL4SSR_Online_Mini_MultiMode.ini&amp;#34;;&#10;let subProtocol = &amp;#39;https&amp;#39;;&#10;let subEmoji = &amp;#39;true&amp;#39;;&#10;let socks5Address = &amp;#39;&amp;#39;;&#10;let parsedSocks5Address = {};&#10;let enableSocks = false;&#10;&#10;let fakeUserID;&#10;let fakeHostName;&#10;let noTLS = &amp;#39;false&amp;#39;;&#10;const expire = 4102329600;//2099-12-31&#10;let proxyIPs;&#10;let socks5s;&#10;let go2Socks5s = [&#10; &amp;#39;*ttvnw.net&amp;#39;,&#10; &amp;#39;*tapecontent.net&amp;#39;,&#10; &amp;#39;*cloudatacdn.com&amp;#39;,&#10; &amp;#39;*.loadshare.org&amp;#39;,&#10;];&#10;let addresses = [];&#10;let addressesapi = [];&#10;let addressesnotls = [];&#10;let addressesnotlsapi = [];&#10;let addressescsv = [];&#10;let DLS = 8;&#10;let remarkIndex = 1;//CSV备注所在列偏移量&#10;let FileName = atob(&amp;#39;ZWRnZXR1bm5lbA==&amp;#39;);&#10;let BotToken;&#10;let ChatID;&#10;let proxyhosts = [];&#10;let proxyhostsURL = &amp;#39;&amp;#39;;&#10;let RproxyIP = &amp;#39;false&amp;#39;;&#10;let httpsPorts = [&amp;#34;2053&amp;#34;, &amp;#34;2083&amp;#34;, &amp;#34;2087&amp;#34;, &amp;#34;2096&amp;#34;, &amp;#34;8443&amp;#34;];&#10;let 有效时间 = 7;&#10;let 更新时间 = 3;&#10;let userIDLow;&#10;let userIDTime = &amp;#34;&amp;#34;;&#10;let proxyIPPool = [];&#10;let path = &amp;#39;/?ed=2560&amp;#39;;&#10;let 动态UUID;&#10;let link = [];&#10;let banHosts = [atob(&amp;#39;c3BlZWQuY2xvdWRmbGFyZS5jb20=&amp;#39;)];&#10;export default {&#10; async fetch(request, env, ctx) {&#10; try {&#10; const UA = request.headers.get(&amp;#39;User-Agent&amp;#39;) || &amp;#39;null&amp;#39;;&#10; const userAgent = UA.toLowerCase();&#10; userID = env.UUID || env.uuid || env.PASSWORD || env.pswd || userID;&#10; if (env.KEY || env.TOKEN || (userID &amp;amp;&amp;amp; !isValidUUID(userID))) {&#10; 动态UUID = env.KEY || env.TOKEN || userID;&#10; 有效时间 = Number(env.TIME) || 有效时间;&#10; 更新时间 = Number(env.UPTIME) || 更新时间;&#10; const userIDs = await 生成动态UUID(动态UUID);&#10; userID = userIDs[0];&#10; userIDLow = userIDs[1];&#10; }&#10;&#10; if (!userID) {&#10; return new Response(&amp;#39;请设置你的UUID变量，或尝试重试部署，检查变量是否生效？&amp;#39;, {&#10; status: 404,&#10; headers: {&#10; &amp;#34;Content-Type&amp;#34;: &amp;#34;text/plain;charset=utf-8&amp;#34;,&#10; }&#10; });&#10; }&#10; const currentDate = new Date();&#10; currentDate.setHours(0, 0, 0, 0);&#10; const timestamp = Math.ceil(currentDate.getTime() / 1000);&#10; const fakeUserIDMD5 = await 双重哈希(`${userID}${timestamp}`);&#10; fakeUserID = [&#10; fakeUserIDMD5.slice(0, 8),&#10; fakeUserIDMD5.slice(8, 12),&#10; fakeUserIDMD5.slice(12, 16),&#10; fakeUserIDMD5.slice(16, 20),&#10; fakeUserIDMD5.slice(20)&#10; ].join(&amp;#39;-&amp;#39;);&#10;&#10; fakeHostName = `${fakeUserIDMD5.slice(6, 9)}.${fakeUserIDMD5.slice(13, 19)}`;&#10;&#10; proxyIP = env.PROXYIP || env.proxyip || proxyIP;&#10; proxyIPs = await 整理(proxyIP);&#10; proxyIP = proxyIPs[Math.floor(Math.random() * proxyIPs.length)];&#10;&#10; socks5Address = env.SOCKS5 || socks5Address;&#10; socks5s = await 整理(socks5Address);&#10; socks5Address = socks5s[Math.floor(Math.random() * socks5s.length)];&#10; socks5Address = socks5Address.split(&amp;#39;//&amp;#39;)[1] || socks5Address;&#10; if (env.GO2SOCKS5) go2Socks5s = await 整理(env.GO2SOCKS5);&#10; if (env.CFPORTS) httpsPorts = await 整理(env.CFPORTS);&#10; if (env.BAN) banHosts = await 整理(env.BAN);&#10; if (socks5Address) {&#10; try {&#10; parsedSocks5Address = socks5AddressParser(socks5Address);&#10; RproxyIP = env.RPROXYIP || &amp;#39;false&amp;#39;;&#10; enableSocks = true;&#10; } catch (err) {&#10; let e = err;&#10; console.log(e.toString());&#10; RproxyIP = env.RPROXYIP || !proxyIP ? &amp;#39;true&amp;#39; : &amp;#39;false&amp;#39;;&#10; enableSocks = false;&#10; }&#10; } else {&#10; RproxyIP = env.RPROXYIP || !proxyIP ? &amp;#39;true&amp;#39; : &amp;#39;false&amp;#39;;&#10; }&#10;&#10; const upgradeHeader = request.headers.get(&amp;#39;Upgrade&amp;#39;);&#10; const url = new URL(request.url);&#10; if (!upgradeHeader || upgradeHeader !== &amp;#39;websocket&amp;#39;) {&#10; if (env.ADD) addresses = await 整理(env.ADD);&#10; if (env.ADDAPI) addressesapi = await 整理(env.ADDAPI);&#10; if (env.ADDNOTLS) addressesnotls = await 整理(env.ADDNOTLS);&#10; if (env.ADDNOTLSAPI) addressesnotlsapi = await 整理(env.ADDNOTLSAPI);&#10; if (env.ADDCSV) addressescsv = await 整理(env.ADDCSV);&#10; DLS = Number(env.DLS) || DLS;&#10; remarkIndex = Number(env.CSVREMARK) || remarkIndex;&#10; BotToken = env.TGTOKEN || BotToken;&#10; ChatID = env.TGID || ChatID;&#10; FileName = env.SUBNAME || FileName;&#10; subEmoji = env.SUBEMOJI || env.EMOJI || subEmoji;&#10; if (subEmoji == &amp;#39;0&amp;#39;) subEmoji = &amp;#39;false&amp;#39;;&#10; if (env.LINK) link = await 整理(env.LINK);&#10; let sub = env.SUB || &amp;#39;&amp;#39;;&#10; subConverter = env.SUBAPI || subConverter;&#10; if (subConverter.includes(&amp;#34;http://&amp;#34;)) {&#10; subConverter = subConverter.split(&amp;#34;//&amp;#34;)[1];&#10; subProtocol = &amp;#39;http&amp;#39;;&#10; } else {&#10; subConverter = subConverter.split(&amp;#34;//&amp;#34;)[1] || subConverter;&#10; }&#10; subConfig = env.SUBCONFIG || subConfig;&#10; if (url.searchParams.has(&amp;#39;sub&amp;#39;) &amp;amp;&amp;amp; url.searchParams.get(&amp;#39;sub&amp;#39;) !== &amp;#39;&amp;#39;) sub = url.searchParams.get(&amp;#39;sub&amp;#39;);&#10; if (url.searchParams.has(&amp;#39;notls&amp;#39;)) noTLS = &amp;#39;true&amp;#39;;&#10;&#10; if (url.searchParams.has(&amp;#39;proxyip&amp;#39;)) {&#10; path = `/?ed=2560&amp;amp;proxyip=${url.searchParams.get(&amp;#39;proxyip&amp;#39;)}`;&#10; RproxyIP = &amp;#39;false&amp;#39;;&#10; } else if (url.searchParams.has(&amp;#39;socks5&amp;#39;)) {&#10; path = `/?ed=2560&amp;amp;socks5=${url.searchParams.get(&amp;#39;socks5&amp;#39;)}`;&#10; RproxyIP = &amp;#39;false&amp;#39;;&#10; } else if (url.searchParams.has(&amp;#39;socks&amp;#39;)) {&#10; path = `/?ed=2560&amp;amp;socks5=${url.searchParams.get(&amp;#39;socks&amp;#39;)}`;&#10; RproxyIP = &amp;#39;false&amp;#39;;&#10; }&#10;&#10; const 路径 = url.pathname.toLowerCase();&#10; if (路径 == &amp;#39;/&amp;#39;) {&#10; if (env.URL302) return Response.redirect(env.URL302, 302);&#10; else if (env.URL) return await 代理URL(env.URL, url);&#10; else return new Response(JSON.stringify(request.cf, null, 4), {&#10; status: 200,&#10; headers: {&#10; &amp;#39;content-type&amp;#39;: &amp;#39;application/json&amp;#39;,&#10; },&#10; });&#10; } else if (路径 == `/${fakeUserID}`) {&#10; const fakeConfig = await 生成配置信息(userID, request.headers.get(&amp;#39;Host&amp;#39;), sub, &amp;#39;CF-Workers-SUB&amp;#39;, RproxyIP, url, env);&#10; return new Response(`${fakeConfig}`, { status: 200 });&#10; } else if (url.pathname == `/${动态UUID}/edit` || 路径 == `/${userID}/edit`) {&#10; const html = await KV(request, env);&#10; return html;&#10; } else if (url.pathname == `/${动态UUID}` || 路径 == `/${userID}`) {&#10; await sendMessage(`#获取订阅 ${FileName}`, request.headers.get(&amp;#39;CF-Connecting-IP&amp;#39;), `UA: ${UA}&amp;lt;/tg-spoiler&amp;gt;\n域名: ${url.hostname}\n&amp;lt;tg-spoiler&amp;gt;入口: ${url.pathname + url.search}&amp;lt;/tg-spoiler&amp;gt;`);&#10; const 维列斯Config = await 生成配置信息(userID, request.headers.get(&amp;#39;Host&amp;#39;), sub, UA, RproxyIP, url, env);&#10; const now = Date.now();&#10; //const timestamp = Math.floor(now / 1000);&#10; const today = new Date(now);&#10; today.setHours(0, 0, 0, 0);&#10; const UD = Math.floor(((now - today.getTime()) / 86400000) * 24 * 1099511627776 / 2);&#10; let pagesSum = UD;&#10; let workersSum = UD;&#10; let total = 24 * 1099511627776;&#10;&#10; if (userAgent &amp;amp;&amp;amp; userAgent.includes(&amp;#39;mozilla&amp;#39;)) {&#10; return new Response(`&amp;lt;div style=&amp;#34;font-size:13px;&amp;#34;&amp;gt;${维列斯Config}&amp;lt;/div&amp;gt;`, {&#10; status: 200,&#10; headers: {&#10; &amp;#34;Content-Type&amp;#34;: &amp;#34;text/html;charset=utf-8&amp;#34;,&#10; &amp;#34;Profile-Update-Interval&amp;#34;: &amp;#34;6&amp;#34;,&#10; &amp;#34;Subscription-Userinfo&amp;#34;: `upload=${pagesSum}; download=${workersSum}; total=${total}; expire=${expire}`,&#10; &amp;#34;Cache-Control&amp;#34;: &amp;#34;no-store&amp;#34;,&#10; }&#10; });&#10; } else {&#10; return new Response(`${维列斯Config}`, {&#10; status: 200,&#10; headers: {&#10; &amp;#34;Content-Disposition&amp;#34;: `attachment; filename=${FileName}; filename*=utf-8&amp;#39;&amp;#39;${encodeURIComponent(FileName)}`,&#10; &amp;#34;Content-Type&amp;#34;: &amp;#34;text/plain;charset=utf-8&amp;#34;,&#10; &amp;#34;Profile-Update-Interval&amp;#34;: &amp;#34;6&amp;#34;,&#10; &amp;#34;Subscription-Userinfo&amp;#34;: `upload=${pagesSum}; download=${workersSum}; total=${total}; expire=${expire}`,&#10; }&#10; });&#10; }&#10; } else {&#10; if (env.URL302) return Response.redirect(env.URL302, 302);&#10; else if (env.URL) return await 代理URL(env.URL, url);&#10; else return new Response(&amp;#39;不用怀疑！你UUID就是错的！！！&amp;#39;, { status: 404 });&#10; }&#10; } else {&#10; socks5Address = url.searchParams.get(&amp;#39;socks5&amp;#39;) || socks5Address;&#10; if (new RegExp(&amp;#39;/socks5=&amp;#39;, &amp;#39;i&amp;#39;).test(url.pathname)) socks5Address = url.pathname.split(&amp;#39;5=&amp;#39;)[1];&#10; else if (new RegExp(&amp;#39;/socks://&amp;#39;, &amp;#39;i&amp;#39;).test(url.pathname) || new RegExp(&amp;#39;/socks5://&amp;#39;, &amp;#39;i&amp;#39;).test(url.pathname)) {&#10; socks5Address = url.pathname.split(&amp;#39;://&amp;#39;)[1].split(&amp;#39;#&amp;#39;)[0];&#10; if (socks5Address.includes(&amp;#39;@&amp;#39;)) {&#10; let userPassword = socks5Address.split(&amp;#39;@&amp;#39;)[0];&#10; const base64Regex = /^(?:[A-Z0-9+/]{4})*(?:[A-Z0-9+/]{2}==|[A-Z0-9+/]{3}=)?$/i;&#10; if (base64Regex.test(userPassword) &amp;amp;&amp;amp; !userPassword.includes(&amp;#39;:&amp;#39;)) userPassword = atob(userPassword);&#10; socks5Address = `${userPassword}@${socks5Address.split(&amp;#39;@&amp;#39;)[1]}`;&#10; }&#10; }&#10;&#10; if (socks5Address) {&#10; try {&#10; parsedSocks5Address = socks5AddressParser(socks5Address);&#10; enableSocks = true;&#10; } catch (err) {&#10; let e = err;&#10; console.log(e.toString());&#10; enableSocks = false;&#10; }&#10; } else {&#10; enableSocks = false;&#10; }&#10;&#10; if (url.searchParams.has(&amp;#39;proxyip&amp;#39;)) {&#10; proxyIP = url.searchParams.get(&amp;#39;proxyip&amp;#39;);&#10; enableSocks = false;&#10; } else if (new RegExp(&amp;#39;/proxyip=&amp;#39;, &amp;#39;i&amp;#39;).test(url.pathname)) {&#10; proxyIP = url.pathname.toLowerCase().split(&amp;#39;/proxyip=&amp;#39;)[1];&#10; enableSocks = false;&#10; } else if (new RegExp(&amp;#39;/proxyip.&amp;#39;, &amp;#39;i&amp;#39;).test(url.pathname)) {&#10; proxyIP = `proxyip.${url.pathname.toLowerCase().split(&amp;#34;/proxyip.&amp;#34;)[1]}`;&#10; enableSocks = false;&#10; } else if (new RegExp(&amp;#39;/pyip=&amp;#39;, &amp;#39;i&amp;#39;).test(url.pathname)) {&#10; proxyIP = url.pathname.toLowerCase().split(&amp;#39;/pyip=&amp;#39;)[1];&#10; enableSocks = false;&#10; }&#10;&#10; return await 维列斯OverWSHandler(request);&#10; }&#10; } catch (err) {&#10; let e = err;&#10; return new Response(e.toString());&#10; }&#10; },&#10;};&#10;&#10;async function 维列斯OverWSHandler(request) {&#10;&#10; // @ts-ignore&#10; const webSocketPair = new WebSocketPair();&#10; const [client, webSocket] = Object.values(webSocketPair);&#10;&#10; // 接受 WebSocket 连接&#10; webSocket.accept();&#10;&#10; let address = &amp;#39;&amp;#39;;&#10; let portWithRandomLog = &amp;#39;&amp;#39;;&#10; // 日志函数，用于记录连接信息&#10; const log = (/** @type {string} */ info, /** @type {string | undefined} */ event) =&amp;gt; {&#10; console.log(`[${address}:${portWithRandomLog}] ${info}`, event || &amp;#39;&amp;#39;);&#10; };&#10; // 获取早期数据头部，可能包含了一些初始化数据&#10; const earlyDataHeader = request.headers.get(&amp;#39;sec-websocket-protocol&amp;#39;) || &amp;#39;&amp;#39;;&#10;&#10; // 创建一个可读的 WebSocket 流，用于接收客户端数据&#10; const readableWebSocketStream = makeReadableWebSocketStream(webSocket, earlyDataHeader, log);&#10;&#10; // 用于存储远程 Socket 的包装器&#10; let remoteSocketWapper = {&#10; value: null,&#10; };&#10; // 标记是否为 DNS 查询&#10; let isDns = false;&#10;&#10; // WebSocket 数据流向远程服务器的管道&#10; readableWebSocketStream.pipeTo(new WritableStream({&#10; async write(chunk, controller) {&#10; if (isDns) {&#10; // 如果是 DNS 查询，调用 DNS 处理函数&#10; return await handleDNSQuery(chunk, webSocket, null, log);&#10; }&#10; if (remoteSocketWapper.value) {&#10; // 如果已有远程 Socket，直接写入数据&#10; const writer = remoteSocketWapper.value.writable.getWriter()&#10; await writer.write(chunk);&#10; writer.releaseLock();&#10; return;&#10; }&#10;&#10; // 处理 维列斯 协议头部&#10; const {&#10; hasError,&#10; message,&#10; addressType,&#10; portRemote = 443,&#10; addressRemote = &amp;#39;&amp;#39;,&#10; rawDataIndex,&#10; 维列斯Version = new Uint8Array([0, 0]),&#10; isUDP,&#10; } = process维列斯Header(chunk, userID);&#10; // 设置地址和端口信息，用于日志&#10; address = addressRemote;&#10; portWithRandomLog = `${portRemote}--${Math.random()} ${isUDP ? &amp;#39;udp &amp;#39; : &amp;#39;tcp &amp;#39;} `;&#10; if (hasError) {&#10; // 如果有错误，抛出异常&#10; throw new Error(message);&#10; return;&#10; }&#10; // 如果是 UDP 且端口不是 DNS 端口（53），则关闭连接&#10; if (isUDP) {&#10; if (portRemote === 53) {&#10; isDns = true;&#10; } else {&#10; throw new Error(&amp;#39;UDP 代理仅对 DNS（53 端口）启用&amp;#39;);&#10; return;&#10; }&#10; }&#10; // 构建 维列斯 响应头部&#10; const 维列斯ResponseHeader = new Uint8Array([维列斯Version[0], 0]);&#10; // 获取实际的客户端数据&#10; const rawClientData = chunk.slice(rawDataIndex);&#10;&#10; if (isDns) {&#10; // 如果是 DNS 查询，调用 DNS 处理函数&#10; return handleDNSQuery(rawClientData, webSocket, 维列斯ResponseHeader, log);&#10; }&#10; // 处理 TCP 出站连接&#10; if (!banHosts.includes(addressRemote)) {&#10; log(`处理 TCP 出站连接 ${addressRemote}:${portRemote}`);&#10; handleTCPOutBound(remoteSocketWapper, addressType, addressRemote, portRemote, rawClientData, webSocket, 维列斯ResponseHeader, log);&#10; } else {&#10; throw new Error(`黑名单关闭 TCP 出站连接 ${addressRemote}:${portRemote}`);&#10; }&#10; },&#10; close() {&#10; log(`readableWebSocketStream 已关闭`);&#10; },&#10; abort(reason) {&#10; log(`readableWebSocketStream 已中止`, JSON.stringify(reason));&#10; },&#10; })).catch((err) =&amp;gt; {&#10; log(&amp;#39;readableWebSocketStream 管道错误&amp;#39;, err);&#10; });&#10;&#10; // 返回一个 WebSocket 升级的响应&#10; return new Response(null, {&#10; status: 101,&#10; // @ts-ignore&#10; webSocket: client,&#10; });&#10;}&#10;&#10;async function handleTCPOutBound(remoteSocket, addressType, addressRemote, portRemote, rawClientData, webSocket, 维列斯ResponseHeader, log,) {&#10; async function useSocks5Pattern(address) {&#10; if (go2Socks5s.includes(atob(&amp;#39;YWxsIGlu&amp;#39;)) || go2Socks5s.includes(atob(&amp;#39;Kg==&amp;#39;))) return true;&#10; return go2Socks5s.some(pattern =&amp;gt; {&#10; let regexPattern = pattern.replace(/\*/g, &amp;#39;.*&amp;#39;);&#10; let regex = new RegExp(`^${regexPattern}$`, &amp;#39;i&amp;#39;);&#10; return regex.test(address);&#10; });&#10; }&#10;&#10; async function connectAndWrite(address, port, socks = false) {&#10; log(`connected to ${address}:${port}`);&#10; //if (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(address)) address = `${atob(&amp;#39;d3d3Lg==&amp;#39;)}${address}${atob(&amp;#39;LmlwLjA5MDIyNy54eXo=&amp;#39;)}`;&#10; // 如果指定使用 SOCKS5 代理，则通过 SOCKS5 协议连接；否则直接连接&#10; const tcpSocket = socks ? await socks5Connect(addressType, address, port, log)&#10; : connect({&#10; hostname: address,&#10; port: port,&#10; });&#10; remoteSocket.value = tcpSocket;&#10; //log(`connected to ${address}:${port}`);&#10; const writer = tcpSocket.writable.getWriter();&#10; // 首次写入，通常是 TLS 客户端 Hello 消息&#10; await writer.write(rawClientData);&#10; writer.releaseLock();&#10; return tcpSocket;&#10; }&#10;&#10; /**&#10; * 重试函数：当 Cloudflare 的 TCP Socket 没有传入数据时，我们尝试重定向 IP&#10; * 这可能是因为某些网络问题导致的连接失败&#10; */&#10; async function retry() {&#10; if (enableSocks) {&#10; // 如果启用了 SOCKS5，通过 SOCKS5 代理重试连接&#10; tcpSocket = await connectAndWrite(addressRemote, portRemote, true);&#10; } else {&#10; // 否则，尝试使用预设的代理 IP（如果有）或原始地址重试连接&#10; if (!proxyIP || proxyIP == &amp;#39;&amp;#39;) {&#10; proxyIP = atob(`UFJPWFlJUC50cDEuZnh4ay5kZWR5bi5pbw==`);&#10; } else if (proxyIP.includes(&amp;#39;]:&amp;#39;)) {&#10; portRemote = proxyIP.split(&amp;#39;]:&amp;#39;)[1] || portRemote;&#10; proxyIP = proxyIP.split(&amp;#39;]:&amp;#39;)[0] || proxyIP;&#10; } else if (proxyIP.split(&amp;#39;:&amp;#39;).length === 2) {&#10; portRemote = proxyIP.split(&amp;#39;:&amp;#39;)[1] || portRemote;&#10; proxyIP = proxyIP.split(&amp;#39;:&amp;#39;)[0] || proxyIP;&#10; }&#10; if (proxyIP.includes(&amp;#39;.tp&amp;#39;)) portRemote = proxyIP.split(&amp;#39;.tp&amp;#39;)[1].split(&amp;#39;.&amp;#39;)[0] || portRemote;&#10; tcpSocket = await connectAndWrite(proxyIP || addressRemote, portRemote);&#10; }&#10; // 无论重试是否成功，都要关闭 WebSocket（可能是为了重新建立连接）&#10; tcpSocket.closed.catch(error =&amp;gt; {&#10; console.log(&amp;#39;retry tcpSocket closed error&amp;#39;, error);&#10; }).finally(() =&amp;gt; {&#10; safeCloseWebSocket(webSocket);&#10; })&#10; // 建立从远程 Socket 到 WebSocket 的数据流&#10; remoteSocketToWS(tcpSocket, webSocket, 维列斯ResponseHeader, null, log);&#10; }&#10;&#10; let useSocks = false;&#10; if (go2Socks5s.length &amp;gt; 0 &amp;amp;&amp;amp; enableSocks) useSocks = await useSocks5Pattern(addressRemote);&#10; // 首次尝试连接远程服务器&#10; let tcpSocket = await connectAndWrite(addressRemote, portRemote, useSocks);&#10;&#10; // 当远程 Socket 就绪时，将其传递给 WebSocket&#10; // 建立从远程服务器到 WebSocket 的数据流，用于将远程服务器的响应发送回客户端&#10; // 如果连接失败或无数据，retry 函数将被调用进行重试&#10; remoteSocketToWS(tcpSocket, webSocket, 维列斯ResponseHeader, retry, log);&#10;}&#10;&#10;function makeReadableWebSocketStream(webSocketServer, earlyDataHeader, log) {&#10; // 标记可读流是否已被取消&#10; let readableStreamCancel = false;&#10;&#10; // 创建一个新的可读流&#10; const stream = new ReadableStream({&#10; // 当流开始时的初始化函数&#10; start(controller) {&#10; // 监听 WebSocket 的消息事件&#10; webSocketServer.addEventListener(&amp;#39;message&amp;#39;, (event) =&amp;gt; {&#10; // 如果流已被取消，不再处理新消息&#10; if (readableStreamCancel) {&#10; return;&#10; }&#10; const message = event.data;&#10; // 将消息加入流的队列中&#10; controller.enqueue(message);&#10; });&#10;&#10; // 监听 WebSocket 的关闭事件&#10; // 注意：这个事件意味着客户端关闭了客户端 -&amp;gt; 服务器的流&#10; // 但是，服务器 -&amp;gt; 客户端的流仍然打开，直到在服务器端调用 close()&#10; // WebSocket 协议要求在每个方向上都要发送单独的关闭消息，以完全关闭 Socket&#10; webSocketServer.addEventListener(&amp;#39;close&amp;#39;, () =&amp;gt; {&#10; // 客户端发送了关闭信号，需要关闭服务器端&#10; safeCloseWebSocket(webSocketServer);&#10; // 如果流未被取消，则关闭控制器&#10; if (readableStreamCancel) {&#10; return;&#10; }&#10; controller.close();&#10; });&#10;&#10; // 监听 WebSocket 的错误事件&#10; webSocketServer.addEventListener(&amp;#39;error&amp;#39;, (err) =&amp;gt; {&#10; log(&amp;#39;WebSocket 服务器发生错误&amp;#39;);&#10; // 将错误传递给控制器&#10; controller.error(err);&#10; });&#10;&#10; // 处理 WebSocket 0-RTT（零往返时间）的早期数据&#10; // 0-RTT 允许在完全建立连接之前发送数据，提高了效率&#10; const { earlyData, error } = base64ToArrayBuffer(earlyDataHeader);&#10; if (error) {&#10; // 如果解码早期数据时出错，将错误传递给控制器&#10; controller.error(error);&#10; } else if (earlyData) {&#10; // 如果有早期数据，将其加入流的队列中&#10; controller.enqueue(earlyData);&#10; }&#10; },&#10;&#10; // 当使用者从流中拉取数据时调用&#10; pull(controller) {&#10; // 这里可以实现反压机制&#10; // 如果 WebSocket 可以在流满时停止读取，我们就可以实现反压&#10; // 参考：https://streams.spec.whatwg.org/#example-rs-push-backpressure&#10; },&#10;&#10; // 当流被取消时调用&#10; cancel(reason) {&#10; // 流被取消的几种情况：&#10; // 1. 当管道的 WritableStream 有错误时，这个取消函数会被调用，所以在这里处理 WebSocket 服务器的关闭&#10; // 2. 如果 ReadableStream 被取消，所有 controller.close/enqueue 都需要跳过&#10; // 3. 但是经过测试，即使 ReadableStream 被取消，controller.error 仍然有效&#10; if (readableStreamCancel) {&#10; return;&#10; }&#10; log(`可读流被取消，原因是 ${reason}`);&#10; readableStreamCancel = true;&#10; // 安全地关闭 WebSocket&#10; safeCloseWebSocket(webSocketServer);&#10; }&#10; });&#10;&#10; return stream;&#10;}&#10;&#10;// https://xtls.github.io/development/protocols/维列斯.html&#10;// https://github.com/zizifn/excalidraw-backup/blob/main/v2ray-protocol.excalidraw&#10;&#10;/**&#10; * 解析 维列斯 协议的头部数据&#10; * @param { ArrayBuffer} 维列斯Buffer 维列斯 协议的原始头部数据&#10; * @param {string} userID 用于验证的用户 ID&#10; * @returns {Object} 解析结果，包括是否有错误、错误信息、远程地址信息等&#10; */&#10;function process维列斯Header(维列斯Buffer, userID) {&#10; // 检查数据长度是否足够（至少需要 24 字节）&#10; if (维列斯Buffer.byteLength &amp;lt; 24) {&#10; return {&#10; hasError: true,&#10; message: &amp;#39;invalid data&amp;#39;,&#10; };&#10; }&#10;&#10; // 解析 维列斯 协议版本（第一个字节）&#10; const version = new Uint8Array(维列斯Buffer.slice(0, 1));&#10;&#10; let isValidUser = false;&#10; let isUDP = false;&#10;&#10; // 验证用户 ID（接下来的 16 个字节）&#10; function isUserIDValid(userID, userIDLow, buffer) {&#10; const userIDArray = new Uint8Array(buffer.slice(1, 17));&#10; const userIDString = stringify(userIDArray);&#10; return userIDString === userID || userIDString === userIDLow;&#10; }&#10;&#10; // 使用函数验证&#10; isValidUser = isUserIDValid(userID, userIDLow, 维列斯Buffer);&#10;&#10; // 如果用户 ID 无效，返回错误&#10; if (!isValidUser) {&#10; return {&#10; hasError: true,&#10; message: `invalid user ${(new Uint8Array(维列斯Buffer.slice(1, 17)))}`,&#10; };&#10; }&#10;&#10; // 获取附加选项的长度（第 17 个字节）&#10; const optLength = new Uint8Array(维列斯Buffer.slice(17, 18))[0];&#10; // 暂时跳过附加选项&#10;&#10; // 解析命令（紧跟在选项之后的 1 个字节）&#10; // 0x01: TCP, 0x02: UDP, 0x03: MUX（多路复用）&#10; const command = new Uint8Array(&#10; 维列斯Buffer.slice(18 + optLength, 18 + optLength + 1)&#10; )[0];&#10;&#10; // 0x01 TCP&#10; // 0x02 UDP&#10; // 0x03 MUX&#10; if (command === 1) {&#10; // TCP 命令，不需特殊处理&#10; } else if (command === 2) {&#10; // UDP 命令&#10; isUDP = true;&#10; } else {&#10; // 不支持的命令&#10; return {&#10; hasError: true,&#10; message: `command ${command} is not support, command 01-tcp,02-udp,03-mux`,&#10; };&#10; }&#10;&#10; // 解析远程端口（大端序，2 字节）&#10; const portIndex = 18 + optLength + 1;&#10; const portBuffer = 维列斯Buffer.slice(portIndex, portIndex + 2);&#10; // port is big-Endian in raw data etc 80 == 0x005d&#10; const portRemote = new DataView(portBuffer).getUint16(0);&#10;&#10; // 解析地址类型和地址&#10; let addressIndex = portIndex + 2;&#10; const addressBuffer = new Uint8Array(&#10; 维列斯Buffer.slice(addressIndex, addressIndex + 1)&#10; );&#10;&#10; // 地址类型：1-IPv4(4字节), 2-域名(可变长), 3-IPv6(16字节)&#10; const addressType = addressBuffer[0];&#10; let addressLength = 0;&#10; let addressValueIndex = addressIndex + 1;&#10; let addressValue = &amp;#39;&amp;#39;;&#10;&#10; switch (addressType) {&#10; case 1:&#10; // IPv4 地址&#10; addressLength = 4;&#10; // 将 4 个字节转为点分十进制格式&#10; addressValue = new Uint8Array(&#10; 维列斯Buffer.slice(addressValueIndex, addressValueIndex + addressLength)&#10; ).join(&amp;#39;.&amp;#39;);&#10; break;&#10; case 2:&#10; // 域名&#10; // 第一个字节是域名长度&#10; addressLength = new Uint8Array(&#10; 维列斯Buffer.slice(addressValueIndex, addressValueIndex + 1)&#10; )[0];&#10; addressValueIndex += 1;&#10; // 解码域名&#10; addressValue = new TextDecoder().decode(&#10; 维列斯Buffer.slice(addressValueIndex, addressValueIndex + addressLength)&#10; );&#10; break;&#10; case 3:&#10; // IPv6 地址&#10; addressLength = 16;&#10; const dataView = new DataView(&#10; 维列斯Buffer.slice(addressValueIndex, addressValueIndex + addressLength)&#10; );&#10; // 每 2 字节构成 IPv6 地址的一部分&#10; const ipv6 = [];&#10; for (let i = 0; i &amp;lt; 8; i++) {&#10; ipv6.push(dataView.getUint16(i * 2).toString(16));&#10; }&#10; addressValue = ipv6.join(&amp;#39;:&amp;#39;);&#10; // seems no need add [] for ipv6&#10; break;&#10; default:&#10; // 无效的地址类型&#10; return {&#10; hasError: true,&#10; message: `invild addressType is ${addressType}`,&#10; };&#10; }&#10;&#10; // 确保地址不为空&#10; if (!addressValue) {&#10; return {&#10; hasError: true,&#10; message: `addressValue is empty, addressType is ${addressType}`,&#10; };&#10; }&#10;&#10; // 返回解析结果&#10; return {&#10; hasError: false,&#10; addressRemote: addressValue, // 解析后的远程地址&#10; addressType, // 地址类型&#10; portRemote, // 远程端口&#10; rawDataIndex: addressValueIndex + addressLength, // 原始数据的实际起始位置&#10; 维列斯Version: version, // 维列斯 协议版本&#10; isUDP, // 是否是 UDP 请求&#10; };&#10;}&#10;&#10;async function remoteSocketToWS(remoteSocket, webSocket, 维列斯ResponseHeader, retry, log) {&#10; // 将数据从远程服务器转发到 WebSocket&#10; let remoteChunkCount = 0;&#10; let chunks = [];&#10; /** @type {ArrayBuffer | null} */&#10; let 维列斯Header = 维列斯ResponseHeader;&#10; let hasIncomingData = false; // 检查远程 Socket 是否有传入数据&#10;&#10; // 使用管道将远程 Socket 的可读流连接到一个可写流&#10; await remoteSocket.readable&#10; .pipeTo(&#10; new WritableStream({&#10; start() {&#10; // 初始化时不需要任何操作&#10; },&#10; /**&#10; * 处理每个数据块&#10; * @param {Uint8Array} chunk 数据块&#10; * @param {*} controller 控制器&#10; */&#10; async write(chunk, controller) {&#10; hasIncomingData = true; // 标记已收到数据&#10; // remoteChunkCount++; // 用于流量控制，现在似乎不需要了&#10;&#10; // 检查 WebSocket 是否处于开放状态&#10; if (webSocket.readyState !== WS_READY_STATE_OPEN) {&#10; controller.error(&#10; &amp;#39;webSocket.readyState is not open, maybe close&amp;#39;&#10; );&#10; }&#10;&#10; if (维列斯Header) {&#10; // 如果有 维列斯 响应头部，将其与第一个数据块一起发送&#10; webSocket.send(await new Blob([维列斯Header, chunk]).arrayBuffer());&#10; 维列斯Header = null; // 清空头部，之后不再发送&#10; } else {&#10; // 直接发送数据块&#10; // 以前这里有流量控制代码，限制大量数据的发送速率&#10; // 但现在 Cloudflare 似乎已经修复了这个问题&#10; // if (remoteChunkCount &amp;gt; 20000) {&#10; // // cf one package is 4096 byte(4kb), 4096 * 20000 = 80M&#10; // await delay(1);&#10; // }&#10; webSocket.send(chunk);&#10; }&#10; },&#10; close() {&#10; // 当远程连接的可读流关闭时&#10; log(`remoteConnection!.readable is close with hasIncomingData is ${hasIncomingData}`);&#10; // 不需要主动关闭 WebSocket，因为这可能导致 HTTP ERR_CONTENT_LENGTH_MISMATCH 问题&#10; // 客户端无论如何都会发送关闭事件&#10; // safeCloseWebSocket(webSocket);&#10; },&#10; abort(reason) {&#10; // 当远程连接的可读流中断时&#10; console.error(`remoteConnection!.readable abort`, reason);&#10; },&#10; })&#10; )&#10; .catch((error) =&amp;gt; {&#10; // 捕获并记录任何异常&#10; console.error(&#10; `remoteSocketToWS has exception `,&#10; error.stack || error&#10; );&#10; // 发生错误时安全地关闭 WebSocket&#10; safeCloseWebSocket(webSocket);&#10; });&#10;&#10; // 处理 Cloudflare 连接 Socket 的特殊错误情况&#10; // 1. Socket.closed 将有错误&#10; // 2. Socket.readable 将关闭，但没有任何数据&#10; if (hasIncomingData === false &amp;amp;&amp;amp; retry) {&#10; log(`retry`);&#10; retry(); // 调用重试函数，尝试重新建立连接&#10; }&#10;}&#10;&#10;/**&#10; * 将 Base64 编码的字符串转换为 ArrayBuffer&#10; * &#10; * @param {string} base64Str Base64 编码的输入字符串&#10; * @returns {{ earlyData: ArrayBuffer | undefined, error: Error | null }} 返回解码后的 ArrayBuffer 或错误&#10; */&#10;function base64ToArrayBuffer(base64Str) {&#10; // 如果输入为空，直接返回空结果&#10; if (!base64Str) {&#10; return { earlyData: undefined, error: null };&#10; }&#10; try {&#10; // Go 语言使用了 URL 安全的 Base64 变体（RFC 4648）&#10; // 这种变体使用 &amp;#39;-&amp;#39; 和 &amp;#39;_&amp;#39; 来代替标准 Base64 中的 &amp;#39;+&amp;#39; 和 &amp;#39;/&amp;#39;&#10; // JavaScript 的 atob 函数不直接支持这种变体，所以我们需要先转换&#10; base64Str = base64Str.replace(/-/g, &amp;#39;+&amp;#39;).replace(/_/g, &amp;#39;/&amp;#39;);&#10;&#10; // 使用 atob 函数解码 Base64 字符串&#10; // atob 将 Base64 编码的 ASCII 字符串转换为原始的二进制字符串&#10; const decode = atob(base64Str);&#10;&#10; // 将二进制字符串转换为 Uint8Array&#10; // 这是通过遍历字符串中的每个字符并获取其 Unicode 编码值（0-255）来完成的&#10; const arryBuffer = Uint8Array.from(decode, (c) =&amp;gt; c.charCodeAt(0));&#10;&#10; // 返回 Uint8Array 的底层 ArrayBuffer&#10; // 这是实际的二进制数据，可以用于网络传输或其他二进制操作&#10; return { earlyData: arryBuffer.buffer, error: null };&#10; } catch (error) {&#10; // 如果在任何步骤中出现错误（如非法 Base64 字符），则返回错误&#10; return { earlyData: undefined, error };&#10; }&#10;}&#10;&#10;/**&#10; * 这不是真正的 UUID 验证，而是一个简化的版本&#10; * @param {string} uuid 要验证的 UUID 字符串&#10; * @returns {boolean} 如果字符串匹配 UUID 格式则返回 true，否则返回 false&#10; */&#10;function isValidUUID(uuid) {&#10; // 定义一个正则表达式来匹配 UUID 格式&#10; const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;&#10;&#10; // 使用正则表达式测试 UUID 字符串&#10; return uuidRegex.test(uuid);&#10;}&#10;&#10;// WebSocket 的两个重要状态常量&#10;const WS_READY_STATE_OPEN = 1; // WebSocket 处于开放状态，可以发送和接收消息&#10;const WS_READY_STATE_CLOSING = 2; // WebSocket 正在关闭过程中&#10;&#10;function safeCloseWebSocket(socket) {&#10; try {&#10; // 只有在 WebSocket 处于开放或正在关闭状态时才调用 close()&#10; // 这避免了在已关闭或连接中的 WebSocket 上调用 close()&#10; if (socket.readyState === WS_READY_STATE_OPEN || socket.readyState === WS_READY_STATE_CLOSING) {&#10; socket.close();&#10; }&#10; } catch (error) {&#10; // 记录任何可能发生的错误，虽然按照规范不应该有错误&#10; console.error(&amp;#39;safeCloseWebSocket error&amp;#39;, error);&#10; }&#10;}&#10;&#10;// 预计算 0-255 每个字节的十六进制表示&#10;const byteToHex = [];&#10;for (let i = 0; i &amp;lt; 256; ++i) {&#10; // (i + 256).toString(16) 确保总是得到两位数的十六进制&#10; // .slice(1) 删除前导的 &amp;#34;1&amp;#34;，只保留两位十六进制数&#10; byteToHex.push((i + 256).toString(16).slice(1));&#10;}&#10;&#10;/**&#10; * 快速地将字节数组转换为 UUID 字符串，不进行有效性检查&#10; * 这是一个底层函数，直接操作字节，不做任何验证&#10; * @param {Uint8Array} arr 包含 UUID 字节的数组&#10; * @param {number} offset 数组中 UUID 开始的位置，默认为 0&#10; * @returns {string} UUID 字符串&#10; */&#10;function unsafeStringify(arr, offset = 0) {&#10; // 直接从查找表中获取每个字节的十六进制表示，并拼接成 UUID 格式&#10; // 8-4-4-4-12 的分组是通过精心放置的连字符 &amp;#34;-&amp;#34; 实现的&#10; // toLowerCase() 确保整个 UUID 是小写的&#10; return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + &amp;#34;-&amp;#34; +&#10; byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + &amp;#34;-&amp;#34; +&#10; byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + &amp;#34;-&amp;#34; +&#10; byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + &amp;#34;-&amp;#34; +&#10; byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] +&#10; byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();&#10;}&#10;&#10;/**&#10; * 将字节数组转换为 UUID 字符串，并验证其有效性&#10; * 这是一个安全的函数，它确保返回的 UUID 格式正确&#10; * @param {Uint8Array} arr 包含 UUID 字节的数组&#10; * @param {number} offset 数组中 UUID 开始的位置，默认为 0&#10; * @returns {string} 有效的 UUID 字符串&#10; * @throws {TypeError} 如果生成的 UUID 字符串无效&#10; */&#10;function stringify(arr, offset = 0) {&#10; // 使用不安全的函数快速生成 UUID 字符串&#10; const uuid = unsafeStringify(arr, offset);&#10; // 验证生成的 UUID 是否有效&#10; if (!isValidUUID(uuid)) {&#10; // 原：throw TypeError(&amp;#34;Stringified UUID is invalid&amp;#34;);&#10; throw TypeError(`生成的 UUID 不符合规范 ${uuid}`);&#10; //uuid = userID;&#10; }&#10; return uuid;&#10;}&#10;&#10;/**&#10; * 处理 DNS 查询的函数&#10; * @param {ArrayBuffer} udpChunk - 客户端发送的 DNS 查询数据&#10; * @param {ArrayBuffer} 维列斯ResponseHeader - 维列斯 协议的响应头部数据&#10; * @param {(string)=&amp;gt; void} log - 日志记录函数&#10; */&#10;async function handleDNSQuery(udpChunk, webSocket, 维列斯ResponseHeader, log) {&#10; // 无论客户端发送到哪个 DNS 服务器，我们总是使用硬编码的服务器&#10; // 因为有些 DNS 服务器不支持 DNS over TCP&#10; try {&#10; // 选用 Google 的 DNS 服务器（注：后续可能会改为 Cloudflare 的 1.1.1.1）&#10; const dnsServer = &amp;#39;8.8.4.4&amp;#39;; // 在 Cloudflare 修复连接自身 IP 的 bug 后，将改为 1.1.1.1&#10; const dnsPort = 53; // DNS 服务的标准端口&#10;&#10; let 维列斯Header = 维列斯ResponseHeader; // 保存 维列斯 响应头部，用于后续发送&#10;&#10; // 与指定的 DNS 服务器建立 TCP 连接&#10; const tcpSocket = connect({&#10; hostname: dnsServer,&#10; port: dnsPort,&#10; });&#10;&#10; log(`连接到 ${dnsServer}:${dnsPort}`); // 记录连接信息&#10; const writer = tcpSocket.writable.getWriter();&#10; await writer.write(udpChunk); // 将客户端的 DNS 查询数据发送给 DNS 服务器&#10; writer.releaseLock(); // 释放写入器，允许其他部分使用&#10;&#10; // 将从 DNS 服务器接收到的响应数据通过 WebSocket 发送回客户端&#10; await tcpSocket.readable.pipeTo(new WritableStream({&#10; async write(chunk) {&#10; if (webSocket.readyState === WS_READY_STATE_OPEN) {&#10; if (维列斯Header) {&#10; // 如果有 维列斯 头部，则将其与 DNS 响应数据合并后发送&#10; webSocket.send(await new Blob([维列斯Header, chunk]).arrayBuffer());&#10; 维列斯Header = null; // 头部只发送一次，之后置为 null&#10; } else {&#10; // 否则直接发送 DNS 响应数据&#10; webSocket.send(chunk);&#10; }&#10; }&#10; },&#10; close() {&#10; log(`DNS 服务器(${dnsServer}) TCP 连接已关闭`); // 记录连接关闭信息&#10; },&#10; abort(reason) {&#10; console.error(`DNS 服务器(${dnsServer}) TCP 连接异常中断`, reason); // 记录异常中断原因&#10; },&#10; }));&#10; } catch (error) {&#10; // 捕获并记录任何可能发生的错误&#10; console.error(&#10; `handleDNSQuery 函数发生异常，错误信息: ${error.message}`&#10; );&#10; }&#10;}&#10;&#10;/**&#10; * 建立 SOCKS5 代理连接&#10; * @param {number} addressType 目标地址类型（1: IPv4, 2: 域名, 3: IPv6）&#10; * @param {string} addressRemote 目标地址（可以是 IP 或域名）&#10; * @param {number} portRemote 目标端口&#10; * @param {function} log 日志记录函数&#10; */&#10;async function socks5Connect(addressType, addressRemote, portRemote, log) {&#10; const { username, password, hostname, port } = parsedSocks5Address;&#10; // 连接到 SOCKS5 代理服务器&#10; const socket = connect({&#10; hostname, // SOCKS5 服务器的主机名&#10; port, // SOCKS5 服务器的端口&#10; });&#10;&#10; // 请求头格式（Worker -&amp;gt; SOCKS5 服务器）:&#10; // +----+----------+----------+&#10; // |VER | NMETHODS | METHODS |&#10; // +----+----------+----------+&#10; // | 1 | 1 | 1 to 255 |&#10; // +----+----------+----------+&#10;&#10; // https://en.wikipedia.org/wiki/SOCKS#SOCKS5&#10; // METHODS 字段的含义:&#10; // 0x00 不需要认证&#10; // 0x02 用户名/密码认证 https://datatracker.ietf.org/doc/html/rfc1929&#10; const socksGreeting = new Uint8Array([5, 2, 0, 2]);&#10; // 5: SOCKS5 版本号, 2: 支持的认证方法数, 0和2: 两种认证方法（无认证和用户名/密码）&#10;&#10; const writer = socket.writable.getWriter();&#10;&#10; await writer.write(socksGreeting);&#10; log(&amp;#39;已发送 SOCKS5 问候消息&amp;#39;);&#10;&#10; const reader = socket.readable.getReader();&#10; const encoder = new TextEncoder();&#10; let res = (await reader.read()).value;&#10; // 响应格式（SOCKS5 服务器 -&amp;gt; Worker）:&#10; // +----+--------+&#10; // |VER | METHOD |&#10; // +----+--------+&#10; // | 1 | 1 |&#10; // +----+--------+&#10; if (res[0] !== 0x05) {&#10; log(`SOCKS5 服务器版本错误: 收到 ${res[0]}，期望是 5`);&#10; return;&#10; }&#10; if (res[1] === 0xff) {&#10; log(&amp;#34;服务器不接受任何认证方法&amp;#34;);&#10; return;&#10; }&#10;&#10; // 如果返回 0x0502，表示需要用户名/密码认证&#10; if (res[1] === 0x02) {&#10; log(&amp;#34;SOCKS5 服务器需要认证&amp;#34;);&#10; if (!username || !password) {&#10; log(&amp;#34;请提供用户名和密码&amp;#34;);&#10; return;&#10; }&#10; // 认证请求格式:&#10; // +----+------+----------+------+----------+&#10; // |VER | ULEN | UNAME | PLEN | PASSWD |&#10; // +----+------+----------+------+----------+&#10; // | 1 | 1 | 1 to 255 | 1 | 1 to 255 |&#10; // +----+------+----------+------+----------+&#10; const authRequest = new Uint8Array([&#10; 1, // 认证子协议版本&#10; username.length, // 用户名长度&#10; ...encoder.encode(username), // 用户名&#10; password.length, // 密码长度&#10; ...encoder.encode(password) // 密码&#10; ]);&#10; await writer.write(authRequest);&#10; res = (await reader.read()).value;&#10; // 期望返回 0x0100 表示认证成功&#10; if (res[0] !== 0x01 || res[1] !== 0x00) {&#10; log(&amp;#34;SOCKS5 服务器认证失败&amp;#34;);&#10; return;&#10; }&#10; }&#10;&#10; // 请求数据格式（Worker -&amp;gt; SOCKS5 服务器）:&#10; // +----+-----+-------+------+----------+----------+&#10; // |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |&#10; // +----+-----+-------+------+----------+----------+&#10; // | 1 | 1 | X&amp;#39;00&amp;#39; | 1 | Variable | 2 |&#10; // +----+-----+-------+------+----------+----------+&#10; // ATYP: 地址类型&#10; // 0x01: IPv4 地址&#10; // 0x03: 域名&#10; // 0x04: IPv6 地址&#10; // DST.ADDR: 目标地址&#10; // DST.PORT: 目标端口（网络字节序）&#10;&#10; // addressType&#10; // 1 --&amp;gt; IPv4 地址长度 = 4&#10; // 2 --&amp;gt; 域名&#10; // 3 --&amp;gt; IPv6 地址长度 = 16&#10; let DSTADDR; // DSTADDR = ATYP + DST.ADDR&#10; switch (addressType) {&#10; case 1: // IPv4&#10; DSTADDR = new Uint8Array(&#10; [1, ...addressRemote.split(&amp;#39;.&amp;#39;).map(Number)]&#10; );&#10; break;&#10; case 2: // 域名&#10; DSTADDR = new Uint8Array(&#10; [3, addressRemote.length, ...encoder.encode(addressRemote)]&#10; );&#10; break;&#10; case 3: // IPv6&#10; DSTADDR = new Uint8Array(&#10; [4, ...addressRemote.split(&amp;#39;:&amp;#39;).flatMap(x =&amp;gt; [parseInt(x.slice(0, 2), 16), parseInt(x.slice(2), 16)])]&#10; );&#10; break;&#10; default:&#10; log(`无效的地址类型: ${addressType}`);&#10; return;&#10; }&#10; const socksRequest = new Uint8Array([5, 1, 0, ...DSTADDR, portRemote &amp;gt;&amp;gt; 8, portRemote &amp;amp; 0xff]);&#10; // 5: SOCKS5版本, 1: 表示CONNECT请求, 0: 保留字段&#10; // ...DSTADDR: 目标地址, portRemote &amp;gt;&amp;gt; 8 和 &amp;amp; 0xff: 将端口转为网络字节序&#10; await writer.write(socksRequest);&#10; log(&amp;#39;已发送 SOCKS5 请求&amp;#39;);&#10;&#10; res = (await reader.read()).value;&#10; // 响应格式（SOCKS5 服务器 -&amp;gt; Worker）:&#10; // +----+-----+-------+------+----------+----------+&#10; // |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |&#10; // +----+-----+-------+------+----------+----------+&#10; // | 1 | 1 | X&amp;#39;00&amp;#39; | 1 | Variable | 2 |&#10; // +----+-----+-------+------+----------+----------+&#10; if (res[1] === 0x00) {&#10; log(&amp;#34;SOCKS5 连接已建立&amp;#34;);&#10; } else {&#10; log(&amp;#34;SOCKS5 连接建立失败&amp;#34;);&#10; return;&#10; }&#10; writer.releaseLock();&#10; reader.releaseLock();&#10; return socket;&#10;}&#10;&#10;/**&#10; * SOCKS5 代理地址解析器&#10; * 此函数用于解析 SOCKS5 代理地址字符串，提取出用户名、密码、主机名和端口号&#10; * &#10; * @param {string} address SOCKS5 代理地址，格式可以是：&#10; * - &amp;#34;username:password@hostname:port&amp;#34; （带认证）&#10; * - &amp;#34;hostname:port&amp;#34; （不需认证）&#10; * - &amp;#34;username:password@[ipv6]:port&amp;#34; （IPv6 地址需要用方括号括起来）&#10; */&#10;function socks5AddressParser(address) {&#10; // 使用 &amp;#34;@&amp;#34; 分割地址，分为认证部分和服务器地址部分&#10; // reverse() 是为了处理没有认证信息的情况，确保 latter 总是包含服务器地址&#10; let [latter, former] = address.split(&amp;#34;@&amp;#34;).reverse();&#10; let username, password, hostname, port;&#10;&#10; // 如果存在 former 部分，说明提供了认证信息&#10; if (former) {&#10; const formers = former.split(&amp;#34;:&amp;#34;);&#10; if (formers.length !== 2) {&#10; throw new Error(&amp;#39;无效的 SOCKS 地址格式：认证部分必须是 &amp;#34;username:password&amp;#34; 的形式&amp;#39;);&#10; }&#10; [username, password] = formers;&#10; }&#10;&#10; // 解析服务器地址部分&#10; const latters = latter.split(&amp;#34;:&amp;#34;);&#10; // 从末尾提取端口号（因为 IPv6 地址中也包含冒号）&#10; port = Number(latters.pop());&#10; if (isNaN(port)) {&#10; throw new Error(&amp;#39;无效的 SOCKS 地址格式：端口号必须是数字&amp;#39;);&#10; }&#10;&#10; // 剩余部分就是主机名（可能是域名、IPv4 或 IPv6 地址）&#10; hostname = latters.join(&amp;#34;:&amp;#34;);&#10;&#10; // 处理 IPv6 地址的特殊情况&#10; // IPv6 地址包含多个冒号，所以必须用方括号括起来，如 [2001:db8::1]&#10; const regex = /^\[.*\]$/;&#10; if (hostname.includes(&amp;#34;:&amp;#34;) &amp;amp;&amp;amp; !regex.test(hostname)) {&#10; throw new Error(&amp;#39;无效的 SOCKS 地址格式：IPv6 地址必须用方括号括起来，如 [2001:db8::1]&amp;#39;);&#10; }&#10;&#10; //if (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(hostname)) hostname = `${atob(&amp;#39;d3d3Lg==&amp;#39;)}${hostname}${atob(&amp;#39;LmlwLjA5MDIyNy54eXo=&amp;#39;)}`;&#10; // 返回解析后的结果&#10; return {&#10; username, // 用户名，如果没有则为 undefined&#10; password, // 密码，如果没有则为 undefined&#10; hostname, // 主机名，可以是域名、IPv4 或 IPv6 地址&#10; port, // 端口号，已转换为数字类型&#10; }&#10;}&#10;&#10;/**&#10; * 恢复被伪装的信息&#10; * 这个函数用于将内容中的假用户ID和假主机名替换回真实的值&#10; * &#10; * @param {string} content 需要处理的内容&#10; * @param {string} userID 真实的用户ID&#10; * @param {string} hostName 真实的主机名&#10; * @param {boolean} isBase64 内容是否是Base64编码的&#10; * @returns {string} 恢复真实信息后的内容&#10; */&#10;function 恢复伪装信息(content, userID, hostName, isBase64) {&#10; if (isBase64) content = atob(content); // 如果内容是Base64编码的，先解码&#10;&#10; // 使用正则表达式全局替换（&amp;#39;g&amp;#39;标志）&#10; // 将所有出现的假用户ID和假主机名替换为真实的值&#10; content = content.replace(new RegExp(fakeUserID, &amp;#39;g&amp;#39;), userID)&#10; .replace(new RegExp(fakeHostName, &amp;#39;g&amp;#39;), hostName);&#10;&#10; if (isBase64) content = btoa(content); // 如果原内容是Base64编码的，处理完后再次编码&#10;&#10; return content;&#10;}&#10;&#10;/**&#10; * 双重MD5哈希函数&#10; * 这个函数对输入文本进行两次MD5哈希，增强安全性&#10; * 第二次哈希使用第一次哈希结果的一部分作为输入&#10; * &#10; * @param {string} 文本 要哈希的文本&#10; * @returns {Promise&amp;lt;string&amp;gt;} 双重哈希后的小写十六进制字符串&#10; */&#10;async function 双重哈希(文本) {&#10; const 编码器 = new TextEncoder();&#10;&#10; const 第一次哈希 = await crypto.subtle.digest(&amp;#39;MD5&amp;#39;, 编码器.encode(文本));&#10; const 第一次哈希数组 = Array.from(new Uint8Array(第一次哈希));&#10; const 第一次十六进制 = 第一次哈希数组.map(字节 =&amp;gt; 字节.toString(16).padStart(2, &amp;#39;0&amp;#39;)).join(&amp;#39;&amp;#39;);&#10;&#10; const 第二次哈希 = await crypto.subtle.digest(&amp;#39;MD5&amp;#39;, 编码器.encode(第一次十六进制.slice(7, 27)));&#10; const 第二次哈希数组 = Array.from(new Uint8Array(第二次哈希));&#10; const 第二次十六进制 = 第二次哈希数组.map(字节 =&amp;gt; 字节.toString(16).padStart(2, &amp;#39;0&amp;#39;)).join(&amp;#39;&amp;#39;);&#10;&#10; return 第二次十六进制.toLowerCase();&#10;}&#10;&#10;async function 代理URL(代理网址, 目标网址) {&#10; const 网址列表 = await 整理(代理网址);&#10; const 完整网址 = 网址列表[Math.floor(Math.random() * 网址列表.length)];&#10;&#10; // 解析目标 URL&#10; let 解析后的网址 = new URL(完整网址);&#10; console.log(解析后的网址);&#10; // 提取并可能修改 URL 组件&#10; let 协议 = 解析后的网址.protocol.slice(0, -1) || &amp;#39;https&amp;#39;;&#10; let 主机名 = 解析后的网址.hostname;&#10; let 路径名 = 解析后的网址.pathname;&#10; let 查询参数 = 解析后的网址.search;&#10;&#10; // 处理路径名&#10; if (路径名.charAt(路径名.length - 1) == &amp;#39;/&amp;#39;) {&#10; 路径名 = 路径名.slice(0, -1);&#10; }&#10; 路径名 += 目标网址.pathname;&#10;&#10; // 构建新的 URL&#10; let 新网址 = `${协议}://${主机名}${路径名}${查询参数}`;&#10;&#10; // 反向代理请求&#10; let 响应 = await fetch(新网址);&#10;&#10; // 创建新的响应&#10; let 新响应 = new Response(响应.body, {&#10; status: 响应.status,&#10; statusText: 响应.statusText,&#10; headers: 响应.headers&#10; });&#10;&#10; // 添加自定义头部，包含 URL 信息&#10; //新响应.headers.set(&amp;#39;X-Proxied-By&amp;#39;, &amp;#39;Cloudflare Worker&amp;#39;);&#10; //新响应.headers.set(&amp;#39;X-Original-URL&amp;#39;, 完整网址);&#10; 新响应.headers.set(&amp;#39;X-New-URL&amp;#39;, 新网址);&#10;&#10; return 新响应;&#10;}&#10;&#10;const 啥啥啥_写的这是啥啊 = atob(&amp;#39;ZG14bGMzTT0=&amp;#39;);&#10;function 配置信息(UUID, 域名地址) {&#10; const 协议类型 = atob(啥啥啥_写的这是啥啊);&#10;&#10; const 别名 = FileName;&#10; let 地址 = 域名地址;&#10; let 端口 = 443;&#10;&#10; const 用户ID = UUID;&#10; const 加密方式 = &amp;#39;none&amp;#39;;&#10;&#10; const 传输层协议 = &amp;#39;ws&amp;#39;;&#10; const 伪装域名 = 域名地址;&#10; const 路径 = path;&#10;&#10; let 传输层安全 = [&amp;#39;tls&amp;#39;, true];&#10; const SNI = 域名地址;&#10; const 指纹 = &amp;#39;randomized&amp;#39;;&#10;&#10; if (域名地址.includes(&amp;#39;.workers.dev&amp;#39;)) {&#10; 地址 = atob(&amp;#39;dmlzYS5jbg==&amp;#39;);&#10; 端口 = 80;&#10; 传输层安全 = [&amp;#39;&amp;#39;, false];&#10; }&#10;&#10; const 威图瑞 = `${协议类型}://${用户ID}@${地址}:${端口}\u003f\u0065\u006e\u0063\u0072\u0079` + &amp;#39;p&amp;#39; + `${atob(&amp;#39;dGlvbj0=&amp;#39;) + 加密方式}\u0026\u0073\u0065\u0063\u0075\u0072\u0069\u0074\u0079\u003d${传输层安全[0]}&amp;amp;sni=${SNI}&amp;amp;fp=${指纹}&amp;amp;type=${传输层协议}&amp;amp;host=${伪装域名}&amp;amp;path=${encodeURIComponent(路径)}#${encodeURIComponent(别名)}`;&#10; const 猫猫猫 = `- {name: ${FileName}, server: ${地址}, port: ${端口}, type: ${协议类型}, uuid: ${用户ID}, tls: ${传输层安全[1]}, alpn: [h3], udp: false, sni: ${SNI}, tfo: false, skip-cert-verify: true, servername: ${伪装域名}, client-fingerprint: ${指纹}, network: ${传输层协议}, ws-opts: {path: &amp;#34;${路径}&amp;#34;, headers: {${伪装域名}}}}`;&#10; return [威图瑞, 猫猫猫];&#10;}&#10;&#10;let subParams = [&amp;#39;sub&amp;#39;, &amp;#39;base64&amp;#39;, &amp;#39;b64&amp;#39;, &amp;#39;clash&amp;#39;, &amp;#39;singbox&amp;#39;, &amp;#39;sb&amp;#39;];&#10;const cmad = decodeURIComponent(atob(&amp;#39;dGVsZWdyYW0lMjAlRTQlQkElQTQlRTYlQjUlODElRTclQkUlQTQlMjAlRTYlOEElODAlRTYlOUMlQUYlRTUlQTQlQTclRTQlQkQlQUMlN0UlRTUlOUMlQTglRTclQkElQkYlRTUlOEYlOTElRTclODklOEMhJTNDYnIlM0UKJTNDYSUyMGhyZWYlM0QlMjdodHRwcyUzQSUyRiUyRnQubWUlMkZDTUxpdXNzc3MlMjclM0VodHRwcyUzQSUyRiUyRnQubWUlMkZDTUxpdXNzc3MlM0MlMkZhJTNFJTNDYnIlM0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJTNDYnIlM0UKZ2l0aHViJTIwJUU5JUExJUI5JUU3JTlCJUFFJUU1JTlDJUIwJUU1JTlEJTgwJTIwU3RhciFTdGFyIVN0YXIhISElM0NiciUzRQolM0NhJTIwaHJlZiUzRCUyN2h0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmNtbGl1JTJGZWRnZXR1bm5lbCUyNyUzRWh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmNtbGl1JTJGZWRnZXR1bm5lbCUzQyUyRmElM0UlM0NiciUzRQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0lM0NiciUzRQolMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjMlMjM=&amp;#39;));&#10;/**&#10; * @param {string} userID&#10; * @param {string | null} hostName&#10; * @param {string} sub&#10; * @param {string} UA&#10; * @returns {Promise&amp;lt;string&amp;gt;}&#10; */&#10;async function 生成配置信息(userID, hostName, sub, UA, RproxyIP, _url, env) {&#10; if (sub) {&#10; const match = sub.match(/^(?:https?:\/\/)?([^\/]+)/);&#10; if (match) {&#10; sub = match[1];&#10; }&#10; const subs = await 整理(sub);&#10; if (subs.length &amp;gt; 1) sub = subs[0];&#10; } else {&#10; if (env.KV) {&#10; await 迁移地址列表(env);&#10; const 优选地址列表 = await env.KV.get(&amp;#39;ADD.txt&amp;#39;);&#10; if (优选地址列表) {&#10; const 优选地址数组 = await 整理(优选地址列表);&#10; const 分类地址 = {&#10; 接口地址: new Set(),&#10; 链接地址: new Set(),&#10; 优选地址: new Set()&#10; };&#10;&#10; for (const 元素 of 优选地址数组) {&#10; if (元素.startsWith(&amp;#39;https://&amp;#39;)) {&#10; 分类地址.接口地址.add(元素);&#10; } else if (元素.includes(&amp;#39;://&amp;#39;)) {&#10; 分类地址.链接地址.add(元素);&#10; } else {&#10; 分类地址.优选地址.add(元素);&#10; }&#10; }&#10;&#10; addressesapi = [...分类地址.接口地址];&#10; link = [...分类地址.链接地址];&#10; addresses = [...分类地址.优选地址];&#10; }&#10; }&#10;&#10; if ((addresses.length + addressesapi.length + addressesnotls.length + addressesnotlsapi.length + addressescsv.length) == 0) {&#10; // 定义 Cloudflare IP 范围的 CIDR 列表&#10; let cfips = [&#10; &amp;#39;103.21.244.0/23&amp;#39;,&#10; &amp;#39;104.16.0.0/13&amp;#39;,&#10; &amp;#39;104.24.0.0/14&amp;#39;,&#10; &amp;#39;172.64.0.0/14&amp;#39;,&#10; &amp;#39;103.21.244.0/23&amp;#39;,&#10; &amp;#39;104.16.0.0/14&amp;#39;,&#10; &amp;#39;104.24.0.0/15&amp;#39;,&#10; &amp;#39;141.101.64.0/19&amp;#39;,&#10; &amp;#39;172.64.0.0/14&amp;#39;,&#10; &amp;#39;188.114.96.0/21&amp;#39;,&#10; &amp;#39;190.93.240.0/21&amp;#39;,&#10; ];&#10;&#10; // 生成符合给定 CIDR 范围的随机 IP 地址&#10; function generateRandomIPFromCIDR(cidr) {&#10; const [base, mask] = cidr.split(&amp;#39;/&amp;#39;);&#10; const baseIP = base.split(&amp;#39;.&amp;#39;).map(Number);&#10; const subnetMask = 32 - parseInt(mask, 10);&#10; const maxHosts = Math.pow(2, subnetMask) - 1;&#10; const randomHost = Math.floor(Math.random() * maxHosts);&#10;&#10; const randomIP = baseIP.map((octet, index) =&amp;gt; {&#10; if (index &amp;lt; 2) return octet;&#10; if (index === 2) return (octet &amp;amp; (255 &amp;lt;&amp;lt; (subnetMask - 8))) + ((randomHost &amp;gt;&amp;gt; 8) &amp;amp; 255);&#10; return (octet &amp;amp; (255 &amp;lt;&amp;lt; subnetMask)) + (randomHost &amp;amp; 255);&#10; });&#10;&#10; return randomIP.join(&amp;#39;.&amp;#39;);&#10; }&#10; addresses = addresses.concat(&amp;#39;127.0.0.1:1234#CFnat&amp;#39;);&#10; if (hostName.includes(&amp;#34;.workers.dev&amp;#34;)) {&#10; addressesnotls = addressesnotls.concat(cfips.map(cidr =&amp;gt; generateRandomIPFromCIDR(cidr) + &amp;#39;#CF随机节点&amp;#39;));&#10; } else {&#10; addresses = addresses.concat(cfips.map(cidr =&amp;gt; generateRandomIPFromCIDR(cidr) + &amp;#39;#CF随机节点&amp;#39;));&#10; }&#10; }&#10; }&#10;&#10; const uuid = (_url.pathname == `/${动态UUID}`) ? 动态UUID : userID;&#10; const userAgent = UA.toLowerCase();&#10; const Config = 配置信息(userID, hostName);&#10; const v2ray = Config[0];&#10; const clash = Config[1];&#10; let proxyhost = &amp;#34;&amp;#34;;&#10; if (hostName.includes(&amp;#34;.workers.dev&amp;#34;)) {&#10; if (proxyhostsURL &amp;amp;&amp;amp; (!proxyhosts || proxyhosts.length == 0)) {&#10; try {&#10; const response = await fetch(proxyhostsURL);&#10;&#10; if (!response.ok) {&#10; console.error(&amp;#39;获取地址时出错:&amp;#39;, response.status, response.statusText);&#10; return; // 如果有错误，直接返回&#10; }&#10;&#10; const text = await response.text();&#10; const lines = text.split(&amp;#39;\n&amp;#39;);&#10; // 过滤掉空行或只包含空白字符的行&#10; const nonEmptyLines = lines.filter(line =&amp;gt; line.trim() !== &amp;#39;&amp;#39;);&#10;&#10; proxyhosts = proxyhosts.concat(nonEmptyLines);&#10; } catch (error) {&#10; //console.error(&amp;#39;获取地址时出错:&amp;#39;, error);&#10; }&#10; }&#10; if (proxyhosts.length != 0) proxyhost = proxyhosts[Math.floor(Math.random() * proxyhosts.length)] + &amp;#34;/&amp;#34;;&#10; }&#10;&#10; if (userAgent.includes(&amp;#39;mozilla&amp;#39;) &amp;amp;&amp;amp; !subParams.some(_searchParams =&amp;gt; _url.searchParams.has(_searchParams))) {&#10; const newSocks5s = socks5s.map(socks5Address =&amp;gt; {&#10; if (socks5Address.includes(&amp;#39;@&amp;#39;)) return socks5Address.split(&amp;#39;@&amp;#39;)[1];&#10; else if (socks5Address.includes(&amp;#39;//&amp;#39;)) return socks5Address.split(&amp;#39;//&amp;#39;)[1];&#10; else return socks5Address;&#10; });&#10;&#10; let socks5List = &amp;#39;&amp;#39;;&#10; if (go2Socks5s.length &amp;gt; 0 &amp;amp;&amp;amp; enableSocks) {&#10; socks5List = `${decodeURIComponent(&amp;#39;SOCKS5%EF%BC%88%E7%99%BD%E5%90%8D%E5%8D%95%EF%BC%89%3A%20&amp;#39;)}`;&#10; if (go2Socks5s.includes(atob(&amp;#39;YWxsIGlu&amp;#39;)) || go2Socks5s.includes(atob(&amp;#39;Kg==&amp;#39;))) socks5List += `${decodeURIComponent(&amp;#39;%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F&amp;#39;)}&amp;lt;br&amp;gt;`;&#10; else socks5List += `&amp;lt;br&amp;gt; ${go2Socks5s.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; }&#10;&#10; let 订阅器 = &amp;#39;&amp;lt;br&amp;gt;&amp;#39;;&#10; if (sub) {&#10; if (enableSocks) 订阅器 += `CFCDN（访问方式）: Socks5&amp;lt;br&amp;gt; ${newSocks5s.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;${socks5List}`;&#10; else if (proxyIP &amp;amp;&amp;amp; proxyIP != &amp;#39;&amp;#39;) 订阅器 += `CFCDN（访问方式）: ProxyIP&amp;lt;br&amp;gt; ${proxyIPs.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; else if (RproxyIP == &amp;#39;true&amp;#39;) 订阅器 += `CFCDN（访问方式）: 自动获取ProxyIP&amp;lt;br&amp;gt;`;&#10; else 订阅器 += `CFCDN（访问方式）: 无法访问, 需要您设置 proxyIP/PROXYIP ！！！&amp;lt;br&amp;gt;`&#10; 订阅器 += `&amp;lt;br&amp;gt;SUB（优选订阅生成器）: ${sub}`;&#10; } else {&#10; if (enableSocks) 订阅器 += `CFCDN（访问方式）: Socks5&amp;lt;br&amp;gt; ${newSocks5s.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;${socks5List}`;&#10; else if (proxyIP &amp;amp;&amp;amp; proxyIP != &amp;#39;&amp;#39;) 订阅器 += `CFCDN（访问方式）: ProxyIP&amp;lt;br&amp;gt; ${proxyIPs.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; else 订阅器 += `CFCDN（访问方式）: 无法访问, 需要您设置 proxyIP/PROXYIP ！！！&amp;lt;br&amp;gt;`;&#10; let 判断是否绑定KV空间 = &amp;#39;&amp;#39;;&#10; if (env.KV) 判断是否绑定KV空间 = ` &amp;lt;a href=&amp;#39;${_url.pathname}/edit&amp;#39;&amp;gt;编辑优选列表&amp;lt;/a&amp;gt;`;&#10; 订阅器 += `&amp;lt;br&amp;gt;您的订阅内容由 内置 addresses/ADD* 参数变量提供${判断是否绑定KV空间}&amp;lt;br&amp;gt;`;&#10; if (addresses.length &amp;gt; 0) 订阅器 += `ADD（TLS优选域名&amp;amp;IP）: &amp;lt;br&amp;gt; ${addresses.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; if (addressesnotls.length &amp;gt; 0) 订阅器 += `ADDNOTLS（noTLS优选域名&amp;amp;IP）: &amp;lt;br&amp;gt; ${addressesnotls.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; if (addressesapi.length &amp;gt; 0) 订阅器 += `ADDAPI（TLS优选域名&amp;amp;IP 的 API）: &amp;lt;br&amp;gt; ${addressesapi.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; if (addressesnotlsapi.length &amp;gt; 0) 订阅器 += `ADDNOTLSAPI（noTLS优选域名&amp;amp;IP 的 API）: &amp;lt;br&amp;gt; ${addressesnotlsapi.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; if (addressescsv.length &amp;gt; 0) 订阅器 += `ADDCSV（IPTest测速csv文件 限速 ${DLS} ）: &amp;lt;br&amp;gt; ${addressescsv.join(&amp;#39;&amp;lt;br&amp;gt; &amp;#39;)}&amp;lt;br&amp;gt;`;&#10; }&#10;&#10; if (动态UUID &amp;amp;&amp;amp; _url.pathname !== `/${动态UUID}`) 订阅器 = &amp;#39;&amp;#39;;&#10; else 订阅器 += `&amp;lt;br&amp;gt;SUBAPI（订阅转换后端）: ${subProtocol}://${subConverter}&amp;lt;br&amp;gt;SUBCONFIG（订阅转换配置文件）: ${subConfig}`;&#10; const 动态UUID信息 = (uuid != userID) ? `TOKEN: ${uuid}&amp;lt;br&amp;gt;UUIDNow: ${userID}&amp;lt;br&amp;gt;UUIDLow: ${userIDLow}&amp;lt;br&amp;gt;${userIDTime}TIME（动态UUID有效时间）: ${有效时间} 天&amp;lt;br&amp;gt;UPTIME（动态UUID更新时间）: ${更新时间} 时（北京时间）&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;` : `${userIDTime}`;&#10; const 节点配置页 = `&#10; ################################################################&amp;lt;br&amp;gt;&#10; Subscribe / sub 订阅地址, 点击链接自动 &amp;lt;strong&amp;gt;复制订阅链接&amp;lt;/strong&amp;gt; 并 &amp;lt;strong&amp;gt;生成订阅二维码&amp;lt;/strong&amp;gt; &amp;lt;br&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; 自适应订阅地址:&amp;lt;br&amp;gt;&#10; &amp;lt;a href=&amp;#34;javascript:void(0)&amp;#34; onclick=&amp;#34;copyToClipboard(&amp;#39;https://${proxyhost}${hostName}/${uuid}?sub&amp;#39;,&amp;#39;qrcode_0&amp;#39;)&amp;#34; style=&amp;#34;color:blue;text-decoration:underline;cursor:pointer;&amp;#34;&amp;gt;https://${proxyhost}${hostName}/${uuid}&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;div id=&amp;#34;qrcode_0&amp;#34; style=&amp;#34;margin: 10px 10px 10px 10px;&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#10; Base64订阅地址:&amp;lt;br&amp;gt;&#10; &amp;lt;a href=&amp;#34;javascript:void(0)&amp;#34; onclick=&amp;#34;copyToClipboard(&amp;#39;https://${proxyhost}${hostName}/${uuid}?b64&amp;#39;,&amp;#39;qrcode_1&amp;#39;)&amp;#34; style=&amp;#34;color:blue;text-decoration:underline;cursor:pointer;&amp;#34;&amp;gt;https://${proxyhost}${hostName}/${uuid}?b64&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;div id=&amp;#34;qrcode_1&amp;#34; style=&amp;#34;margin: 10px 10px 10px 10px;&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#10; clash订阅地址:&amp;lt;br&amp;gt;&#10; &amp;lt;a href=&amp;#34;javascript:void(0)&amp;#34; onclick=&amp;#34;copyToClipboard(&amp;#39;https://${proxyhost}${hostName}/${uuid}?clash&amp;#39;,&amp;#39;qrcode_2&amp;#39;)&amp;#34; style=&amp;#34;color:blue;text-decoration:underline;cursor:pointer;&amp;#34;&amp;gt;https://${proxyhost}${hostName}/${uuid}?clash&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;div id=&amp;#34;qrcode_2&amp;#34; style=&amp;#34;margin: 10px 10px 10px 10px;&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#10; singbox订阅地址:&amp;lt;br&amp;gt;&#10; &amp;lt;a href=&amp;#34;javascript:void(0)&amp;#34; onclick=&amp;#34;copyToClipboard(&amp;#39;https://${proxyhost}${hostName}/${uuid}?sb&amp;#39;,&amp;#39;qrcode_3&amp;#39;)&amp;#34; style=&amp;#34;color:blue;text-decoration:underline;cursor:pointer;&amp;#34;&amp;gt;https://${proxyhost}${hostName}/${uuid}?sb&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;div id=&amp;#34;qrcode_3&amp;#34; style=&amp;#34;margin: 10px 10px 10px 10px;&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#10; &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;javascript:void(0);&amp;#34; id=&amp;#34;noticeToggle&amp;#34; onclick=&amp;#34;toggleNotice()&amp;#34;&amp;gt;实用订阅技巧∨&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;div id=&amp;#34;noticeContent&amp;#34; class=&amp;#34;notice-content&amp;#34; style=&amp;#34;display: none;&amp;#34;&amp;gt;&#10; &amp;lt;strong&amp;gt;1.&amp;lt;/strong&amp;gt; 如您使用的是 PassWall、SSR+ 等路由插件，推荐使用 &amp;lt;strong&amp;gt;Base64订阅地址&amp;lt;/strong&amp;gt; 进行订阅；&amp;lt;br&amp;gt;&#10; &amp;lt;br&amp;gt;&#10; &amp;lt;strong&amp;gt;2.&amp;lt;/strong&amp;gt; 快速切换 &amp;lt;a href=&amp;#39;${atob(&amp;#39;aHR0cHM6Ly9naXRodWIuY29tL2NtbGl1L1dvcmtlclZsZXNzMnN1Yg==&amp;#39;)}&amp;#39;&amp;gt;优选订阅生成器&amp;lt;/a&amp;gt; 至：sub.google.com，您可将&amp;#34;?sub=sub.google.com&amp;#34;参数添加到链接末尾，例如：&amp;lt;br&amp;gt;&#10; https://${proxyhost}${hostName}/${uuid}&amp;lt;strong&amp;gt;?sub=sub.google.com&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;br&amp;gt;&#10; &amp;lt;strong&amp;gt;3.&amp;lt;/strong&amp;gt; 快速更换 PROXYIP 至：proxyip.fxxk.dedyn.io:443，您可将&amp;#34;?proxyip=proxyip.fxxk.dedyn.io:443&amp;#34;参数添加到链接末尾，例如：&amp;lt;br&amp;gt;&#10; https://${proxyhost}${hostName}/${uuid}&amp;lt;strong&amp;gt;?proxyip=proxyip.fxxk.dedyn.io:443&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;br&amp;gt;&#10; &amp;lt;strong&amp;gt;4.&amp;lt;/strong&amp;gt; 快速更换 SOCKS5 至：user:password@127.0.0.1:1080，您可将&amp;#34;?socks5=user:password@127.0.0.1:1080&amp;#34;参数添加到链接末尾，例如：&amp;lt;br&amp;gt;&#10; https://${proxyhost}${hostName}/${uuid}&amp;lt;strong&amp;gt;?socks5=user:password@127.0.0.1:1080&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;br&amp;gt;&#10; &amp;lt;strong&amp;gt;5.&amp;lt;/strong&amp;gt; 如需指定多个参数则需要使用&amp;#39;&amp;amp;&amp;#39;做间隔，例如：&amp;lt;br&amp;gt;&#10; https://${proxyhost}${hostName}/${uuid}?sub=sub.google.com&amp;lt;strong&amp;gt;&amp;amp;&amp;lt;/strong&amp;gt;proxyip=proxyip.fxxk.dedyn.io&amp;lt;br&amp;gt;&#10; &amp;lt;/div&amp;gt;&#10; &amp;lt;script src=&amp;#34;https://cdn.jsdelivr.net/npm/@keeex/qrcodejs-kx@1.0.2/qrcode.min.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;&#10; &amp;lt;script&amp;gt;&#10; function copyToClipboard(text, qrcode) {&#10; navigator.clipboard.writeText(text).then(() =&amp;gt; {&#10; alert(&amp;#39;已复制到剪贴板&amp;#39;);&#10; }).catch(err =&amp;gt; {&#10; console.error(&amp;#39;复制失败:&amp;#39;, err);&#10; });&#10; const qrcodeDiv = document.getElementById(qrcode);&#10; qrcodeDiv.innerHTML = &amp;#39;&amp;#39;;&#10; new QRCode(qrcodeDiv, {&#10; text: text,&#10; width: 220, // 调整宽度&#10; height: 220, // 调整高度&#10; colorDark: &amp;#34;#000000&amp;#34;, // 二维码颜色&#10; colorLight: &amp;#34;#ffffff&amp;#34;, // 背景颜色&#10; correctLevel: QRCode.CorrectLevel.Q, // 设置纠错级别&#10; scale: 1 // 调整像素颗粒度&#10; });&#10; }&#10;&#10; function toggleNotice() {&#10; const noticeContent = document.getElementById(&amp;#39;noticeContent&amp;#39;);&#10; const noticeToggle = document.getElementById(&amp;#39;noticeToggle&amp;#39;);&#10; if (noticeContent.style.display === &amp;#39;none&amp;#39;) {&#10; noticeContent.style.display = &amp;#39;block&amp;#39;;&#10; noticeToggle.textContent = &amp;#39;实用订阅技巧∧&amp;#39;;&#10; } else {&#10; noticeContent.style.display = &amp;#39;none&amp;#39;; &#10; noticeToggle.textContent = &amp;#39;实用订阅技巧∨&amp;#39;;&#10; }&#10; }&#10; &amp;lt;/script&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; ################################################################&amp;lt;br&amp;gt;&#10; ${FileName} 配置信息&amp;lt;br&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; ${动态UUID信息}HOST: ${hostName}&amp;lt;br&amp;gt;&#10; UUID: ${userID}&amp;lt;br&amp;gt;&#10; FKID: ${fakeUserID}&amp;lt;br&amp;gt;&#10; UA: ${UA}&amp;lt;br&amp;gt;&#10; ${订阅器}&amp;lt;br&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; ################################################################&amp;lt;br&amp;gt;&#10; v2ray&amp;lt;br&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; &amp;lt;a href=&amp;#34;javascript:void(0)&amp;#34; onclick=&amp;#34;copyToClipboard(&amp;#39;${v2ray}&amp;#39;,&amp;#39;qrcode_v2ray&amp;#39;)&amp;#34; style=&amp;#34;color:blue;text-decoration:underline;cursor:pointer;&amp;#34;&amp;gt;${v2ray}&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;div id=&amp;#34;qrcode_v2ray&amp;#34; style=&amp;#34;margin: 10px 10px 10px 10px;&amp;#34;&amp;gt;&amp;lt;/div&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; ################################################################&amp;lt;br&amp;gt;&#10; clash-meta&amp;lt;br&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; ${clash}&amp;lt;br&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; ################################################################&amp;lt;br&amp;gt;&#10; ${cmad}&#10; `;&#10; return 节点配置页;&#10; } else {&#10; if (typeof fetch != &amp;#39;function&amp;#39;) {&#10; return &amp;#39;Error: fetch is not available in this environment.&amp;#39;;&#10; }&#10;&#10; let newAddressesapi = [];&#10; let newAddressescsv = [];&#10; let newAddressesnotlsapi = [];&#10; let newAddressesnotlscsv = [];&#10;&#10; // 如果是使用默认域名，则改成一个workers的域名，订阅器会加上代理&#10; if (hostName.includes(&amp;#34;.workers.dev&amp;#34;)) {&#10; noTLS = &amp;#39;true&amp;#39;;&#10; fakeHostName = `${fakeHostName}.workers.dev`;&#10; newAddressesnotlsapi = await 整理优选列表(addressesnotlsapi);&#10; newAddressesnotlscsv = await 整理测速结果(&amp;#39;FALSE&amp;#39;);&#10; } else if (hostName.includes(&amp;#34;.pages.dev&amp;#34;)) {&#10; fakeHostName = `${fakeHostName}.pages.dev`;&#10; } else if (hostName.includes(&amp;#34;worker&amp;#34;) || hostName.includes(&amp;#34;notls&amp;#34;) || noTLS == &amp;#39;true&amp;#39;) {&#10; noTLS = &amp;#39;true&amp;#39;;&#10; fakeHostName = `notls${fakeHostName}.net`;&#10; newAddressesnotlsapi = await 整理优选列表(addressesnotlsapi);&#10; newAddressesnotlscsv = await 整理测速结果(&amp;#39;FALSE&amp;#39;);&#10; } else {&#10; fakeHostName = `${fakeHostName}.xyz`&#10; }&#10; console.log(`虚假HOST: ${fakeHostName}`);&#10; let url = `${subProtocol}://${sub}/sub?host=${fakeHostName}&amp;amp;uuid=${fakeUserID + atob(&amp;#39;JmVkZ2V0dW5uZWw9Y21saXUmcHJveHlpcD0=&amp;#39;) + RproxyIP}&amp;amp;path=${encodeURIComponent(path)}`;&#10; let isBase64 = true;&#10;&#10; if (!sub || sub == &amp;#34;&amp;#34;) {&#10; if (hostName.includes(&amp;#39;workers.dev&amp;#39;)) {&#10; if (proxyhostsURL &amp;amp;&amp;amp; (!proxyhosts || proxyhosts.length == 0)) {&#10; try {&#10; const response = await fetch(proxyhostsURL);&#10;&#10; if (!response.ok) {&#10; console.error(&amp;#39;获取地址时出错:&amp;#39;, response.status, response.statusText);&#10; return; // 如果有错误，直接返回&#10; }&#10;&#10; const text = await response.text();&#10; const lines = text.split(&amp;#39;\n&amp;#39;);&#10; // 过滤掉空行或只包含空白字符的行&#10; const nonEmptyLines = lines.filter(line =&amp;gt; line.trim() !== &amp;#39;&amp;#39;);&#10;&#10; proxyhosts = proxyhosts.concat(nonEmptyLines);&#10; } catch (error) {&#10; console.error(&amp;#39;获取地址时出错:&amp;#39;, error);&#10; }&#10; }&#10; // 使用Set对象去重&#10; proxyhosts = [...new Set(proxyhosts)];&#10; }&#10;&#10; newAddressesapi = await 整理优选列表(addressesapi);&#10; newAddressescsv = await 整理测速结果(&amp;#39;TRUE&amp;#39;);&#10; url = `https://${hostName}/${fakeUserID + _url.search}`;&#10; if (hostName.includes(&amp;#34;worker&amp;#34;) || hostName.includes(&amp;#34;notls&amp;#34;) || noTLS == &amp;#39;true&amp;#39;) {&#10; if (_url.search) url += &amp;#39;&amp;amp;notls&amp;#39;;&#10; else url += &amp;#39;?notls&amp;#39;;&#10; }&#10; console.log(`虚假订阅: ${url}`);&#10; }&#10;&#10; if (!userAgent.includes((&amp;#39;CF-Workers-SUB&amp;#39;).toLowerCase())) {&#10; if ((userAgent.includes(&amp;#39;clash&amp;#39;) &amp;amp;&amp;amp; !userAgent.includes(&amp;#39;nekobox&amp;#39;)) || (_url.searchParams.has(&amp;#39;clash&amp;#39;) &amp;amp;&amp;amp; !userAgent.includes(&amp;#39;subconverter&amp;#39;))) {&#10; url = `${subProtocol}://${subConverter}/sub?target=clash&amp;amp;url=${encodeURIComponent(url)}&amp;amp;insert=false&amp;amp;config=${encodeURIComponent(subConfig)}&amp;amp;emoji=${subEmoji}&amp;amp;list=false&amp;amp;tfo=false&amp;amp;scv=true&amp;amp;fdn=false&amp;amp;sort=false&amp;amp;new_name=true`;&#10; isBase64 = false;&#10; } else if (userAgent.includes(&amp;#39;sing-box&amp;#39;) || userAgent.includes(&amp;#39;singbox&amp;#39;) || ((_url.searchParams.has(&amp;#39;singbox&amp;#39;) || _url.searchParams.has(&amp;#39;sb&amp;#39;)) &amp;amp;&amp;amp; !userAgent.includes(&amp;#39;subconverter&amp;#39;))) {&#10; url = `${subProtocol}://${subConverter}/sub?target=singbox&amp;amp;url=${encodeURIComponent(url)}&amp;amp;insert=false&amp;amp;config=${encodeURIComponent(subConfig)}&amp;amp;emoji=${subEmoji}&amp;amp;list=false&amp;amp;tfo=false&amp;amp;scv=true&amp;amp;fdn=false&amp;amp;sort=false&amp;amp;new_name=true`;&#10; isBase64 = false;&#10; }&#10; }&#10;&#10; try {&#10; let content;&#10; if ((!sub || sub == &amp;#34;&amp;#34;) &amp;amp;&amp;amp; isBase64 == true) {&#10; content = await 生成本地订阅(fakeHostName, fakeUserID, noTLS, newAddressesapi, newAddressescsv, newAddressesnotlsapi, newAddressesnotlscsv);&#10; } else {&#10; const response = await fetch(url, {&#10; headers: {&#10; &amp;#39;User-Agent&amp;#39;: UA + atob(&amp;#39;IENGLVdvcmtlcnMtZWRnZXR1bm5lbC9jbWxpdQ==&amp;#39;)&#10; }&#10; });&#10; content = await response.text();&#10; }&#10;&#10; if (_url.pathname == `/${fakeUserID}`) return content;&#10;&#10; return 恢复伪装信息(content, userID, hostName, isBase64);&#10;&#10; } catch (error) {&#10; console.error(&amp;#39;Error fetching content:&amp;#39;, error);&#10; return `Error fetching content: ${error.message}`;&#10; }&#10; }&#10;}&#10;&#10;async function 整理优选列表(api) {&#10; if (!api || api.length === 0) return [];&#10;&#10; let newapi = &amp;#34;&amp;#34;;&#10;&#10; // 创建一个AbortController对象，用于控制fetch请求的取消&#10; const controller = new AbortController();&#10;&#10; const timeout = setTimeout(() =&amp;gt; {&#10; controller.abort(); // 取消所有请求&#10; }, 2000); // 2秒后触发&#10;&#10; try {&#10; // 使用Promise.allSettled等待所有API请求完成，无论成功或失败&#10; // 对api数组进行遍历，对每个API地址发起fetch请求&#10; const responses = await Promise.allSettled(api.map(apiUrl =&amp;gt; fetch(apiUrl, {&#10; method: &amp;#39;get&amp;#39;,&#10; headers: {&#10; &amp;#39;Accept&amp;#39;: &amp;#39;text/html,application/xhtml+xml,application/xml;&amp;#39;,&#10; &amp;#39;User-Agent&amp;#39;: atob(&amp;#39;Q0YtV29ya2Vycy1lZGdldHVubmVsL2NtbGl1&amp;#39;)&#10; },&#10; signal: controller.signal // 将AbortController的信号量添加到fetch请求中，以便于需要时可以取消请求&#10; }).then(response =&amp;gt; response.ok ? response.text() : Promise.reject())));&#10;&#10; // 遍历所有响应&#10; for (const [index, response] of responses.entries()) {&#10; // 检查响应状态是否为&amp;#39;fulfilled&amp;#39;，即请求成功完成&#10; if (response.status === &amp;#39;fulfilled&amp;#39;) {&#10; // 获取响应的内容&#10; const content = await response.value;&#10;&#10; const lines = content.split(/\r?\n/);&#10; let 节点备注 = &amp;#39;&amp;#39;;&#10; let 测速端口 = &amp;#39;443&amp;#39;;&#10;&#10; if (lines[0].split(&amp;#39;,&amp;#39;).length &amp;gt; 3) {&#10; const idMatch = api[index].match(/id=([^&amp;amp;]*)/);&#10; if (idMatch) 节点备注 = idMatch[1];&#10;&#10; const portMatch = api[index].match(/port=([^&amp;amp;]*)/);&#10; if (portMatch) 测速端口 = portMatch[1];&#10;&#10; for (let i = 1; i &amp;lt; lines.length; i++) {&#10; const columns = lines[i].split(&amp;#39;,&amp;#39;)[0];&#10; if (columns) {&#10; newapi += `${columns}:${测速端口}${节点备注 ? `#${节点备注}` : &amp;#39;&amp;#39;}\n`;&#10; if (api[index].includes(&amp;#39;proxyip=true&amp;#39;)) proxyIPPool.push(`${columns}:${测速端口}`);&#10; }&#10; }&#10; } else {&#10; // 验证当前apiUrl是否带有&amp;#39;proxyip=true&amp;#39;&#10; if (api[index].includes(&amp;#39;proxyip=true&amp;#39;)) {&#10; // 如果URL带有&amp;#39;proxyip=true&amp;#39;，则将内容添加到proxyIPPool&#10; proxyIPPool = proxyIPPool.concat((await 整理(content)).map(item =&amp;gt; {&#10; const baseItem = item.split(&amp;#39;#&amp;#39;)[0] || item;&#10; if (baseItem.includes(&amp;#39;:&amp;#39;)) {&#10; const port = baseItem.split(&amp;#39;:&amp;#39;)[1];&#10; if (!httpsPorts.includes(port)) {&#10; return baseItem;&#10; }&#10; } else {&#10; return `${baseItem}:443`;&#10; }&#10; return null; // 不符合条件时返回 null&#10; }).filter(Boolean)); // 过滤掉 null 值&#10; }&#10; // 将内容添加到newapi中&#10; newapi += content + &amp;#39;\n&amp;#39;;&#10; }&#10; }&#10; }&#10; } catch (error) {&#10; console.error(error);&#10; } finally {&#10; // 无论成功或失败，最后都清除设置的超时定时器&#10; clearTimeout(timeout);&#10; }&#10;&#10; const newAddressesapi = await 整理(newapi);&#10;&#10; // 返回处理后的结果&#10; return newAddressesapi;&#10;}&#10;&#10;async function 整理测速结果(tls) {&#10; if (!addressescsv || addressescsv.length === 0) {&#10; return [];&#10; }&#10;&#10; let newAddressescsv = [];&#10;&#10; for (const csvUrl of addressescsv) {&#10; try {&#10; const response = await fetch(csvUrl);&#10;&#10; if (!response.ok) {&#10; console.error(&amp;#39;获取CSV地址时出错:&amp;#39;, response.status, response.statusText);&#10; continue;&#10; }&#10;&#10; const text = await response.text();// 使用正确的字符编码解析文本内容&#10; let lines;&#10; if (text.includes(&amp;#39;\r\n&amp;#39;)) {&#10; lines = text.split(&amp;#39;\r\n&amp;#39;);&#10; } else {&#10; lines = text.split(&amp;#39;\n&amp;#39;);&#10; }&#10;&#10; // 检查CSV头部是否包含必需字段&#10; const header = lines[0].split(&amp;#39;,&amp;#39;);&#10; const tlsIndex = header.indexOf(&amp;#39;TLS&amp;#39;);&#10;&#10; const ipAddressIndex = 0;// IP地址在 CSV 头部的位置&#10; const portIndex = 1;// 端口在 CSV 头部的位置&#10; const dataCenterIndex = tlsIndex + remarkIndex; // 数据中心是 TLS 的后一个字段&#10;&#10; if (tlsIndex === -1) {&#10; console.error(&amp;#39;CSV文件缺少必需的字段&amp;#39;);&#10; continue;&#10; }&#10;&#10; // 从第二行开始遍历CSV行&#10; for (let i = 1; i &amp;lt; lines.length; i++) {&#10; const columns = lines[i].split(&amp;#39;,&amp;#39;);&#10; const speedIndex = columns.length - 1; // 最后一个字段&#10; // 检查TLS是否为&amp;#34;TRUE&amp;#34;且速度大于DLS&#10; if (columns[tlsIndex].toUpperCase() === tls &amp;amp;&amp;amp; parseFloat(columns[speedIndex]) &amp;gt; DLS) {&#10; const ipAddress = columns[ipAddressIndex];&#10; const port = columns[portIndex];&#10; const dataCenter = columns[dataCenterIndex];&#10;&#10; const formattedAddress = `${ipAddress}:${port}#${dataCenter}`;&#10; newAddressescsv.push(formattedAddress);&#10; if (csvUrl.includes(&amp;#39;proxyip=true&amp;#39;) &amp;amp;&amp;amp; columns[tlsIndex].toUpperCase() == &amp;#39;true&amp;#39; &amp;amp;&amp;amp; !httpsPorts.includes(port)) {&#10; // 如果URL带有&amp;#39;proxyip=true&amp;#39;，则将内容添加到proxyIPPool&#10; proxyIPPool.push(`${ipAddress}:${port}`);&#10; }&#10; }&#10; }&#10; } catch (error) {&#10; console.error(&amp;#39;获取CSV地址时出错:&amp;#39;, error);&#10; continue;&#10; }&#10; }&#10;&#10; return newAddressescsv;&#10;}&#10;&#10;function 生成本地订阅(host, UUID, noTLS, newAddressesapi, newAddressescsv, newAddressesnotlsapi, newAddressesnotlscsv) {&#10; const regex = /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[.*\]):?(\d+)?#?(.*)?$/;&#10; addresses = addresses.concat(newAddressesapi);&#10; addresses = addresses.concat(newAddressescsv);&#10; let notlsresponseBody;&#10; if (noTLS == &amp;#39;true&amp;#39;) {&#10; addressesnotls = addressesnotls.concat(newAddressesnotlsapi);&#10; addressesnotls = addressesnotls.concat(newAddressesnotlscsv);&#10; const uniqueAddressesnotls = [...new Set(addressesnotls)];&#10;&#10; notlsresponseBody = uniqueAddressesnotls.map(address =&amp;gt; {&#10; let port = &amp;#34;-1&amp;#34;;&#10; let addressid = address;&#10;&#10; const match = addressid.match(regex);&#10; if (!match) {&#10; if (address.includes(&amp;#39;:&amp;#39;) &amp;amp;&amp;amp; address.includes(&amp;#39;#&amp;#39;)) {&#10; const parts = address.split(&amp;#39;:&amp;#39;);&#10; address = parts[0];&#10; const subParts = parts[1].split(&amp;#39;#&amp;#39;);&#10; port = subParts[0];&#10; addressid = subParts[1];&#10; } else if (address.includes(&amp;#39;:&amp;#39;)) {&#10; const parts = address.split(&amp;#39;:&amp;#39;);&#10; address = parts[0];&#10; port = parts[1];&#10; } else if (address.includes(&amp;#39;#&amp;#39;)) {&#10; const parts = address.split(&amp;#39;#&amp;#39;);&#10; address = parts[0];&#10; addressid = parts[1];&#10; }&#10;&#10; if (addressid.includes(&amp;#39;:&amp;#39;)) {&#10; addressid = addressid.split(&amp;#39;:&amp;#39;)[0];&#10; }&#10; } else {&#10; address = match[1];&#10; port = match[2] || port;&#10; addressid = match[3] || address;&#10; }&#10;&#10; const httpPorts = [&amp;#34;8080&amp;#34;, &amp;#34;8880&amp;#34;, &amp;#34;2052&amp;#34;, &amp;#34;2082&amp;#34;, &amp;#34;2086&amp;#34;, &amp;#34;2095&amp;#34;];&#10; if (!isValidIPv4(address) &amp;amp;&amp;amp; port == &amp;#34;-1&amp;#34;) {&#10; for (let httpPort of httpPorts) {&#10; if (address.includes(httpPort)) {&#10; port = httpPort;&#10; break;&#10; }&#10; }&#10; }&#10; if (port == &amp;#34;-1&amp;#34;) port = &amp;#34;80&amp;#34;;&#10;&#10; let 伪装域名 = host;&#10; let 最终路径 = path;&#10; let 节点备注 = &amp;#39;&amp;#39;;&#10; const 协议类型 = atob(啥啥啥_写的这是啥啊);&#10;&#10; const 维列斯Link = `${协议类型}://${UUID}@${address}:${port + atob(&amp;#39;P2VuY3J5cHRpb249bm9uZSZzZWN1cml0eT0mdHlwZT13cyZob3N0PQ==&amp;#39;) + 伪装域名}&amp;amp;path=${encodeURIComponent(最终路径)}#${encodeURIComponent(addressid + 节点备注)}`;&#10;&#10; return 维列斯Link;&#10;&#10; }).join(&amp;#39;\n&amp;#39;);&#10;&#10; }&#10;&#10; // 使用Set对象去重&#10; const uniqueAddresses = [...new Set(addresses)];&#10;&#10; const responseBody = uniqueAddresses.map(address =&amp;gt; {&#10; let port = &amp;#34;-1&amp;#34;;&#10; let addressid = address;&#10;&#10; const match = addressid.match(regex);&#10; if (!match) {&#10; if (address.includes(&amp;#39;:&amp;#39;) &amp;amp;&amp;amp; address.includes(&amp;#39;#&amp;#39;)) {&#10; const parts = address.split(&amp;#39;:&amp;#39;);&#10; address = parts[0];&#10; const subParts = parts[1].split(&amp;#39;#&amp;#39;);&#10; port = subParts[0];&#10; addressid = subParts[1];&#10; } else if (address.includes(&amp;#39;:&amp;#39;)) {&#10; const parts = address.split(&amp;#39;:&amp;#39;);&#10; address = parts[0];&#10; port = parts[1];&#10; } else if (address.includes(&amp;#39;#&amp;#39;)) {&#10; const parts = address.split(&amp;#39;#&amp;#39;);&#10; address = parts[0];&#10; addressid = parts[1];&#10; }&#10;&#10; if (addressid.includes(&amp;#39;:&amp;#39;)) {&#10; addressid = addressid.split(&amp;#39;:&amp;#39;)[0];&#10; }&#10; } else {&#10; address = match[1];&#10; port = match[2] || port;&#10; addressid = match[3] || address;&#10; }&#10;&#10; if (!isValidIPv4(address) &amp;amp;&amp;amp; port == &amp;#34;-1&amp;#34;) {&#10; for (let httpsPort of httpsPorts) {&#10; if (address.includes(httpsPort)) {&#10; port = httpsPort;&#10; break;&#10; }&#10; }&#10; }&#10; if (port == &amp;#34;-1&amp;#34;) port = &amp;#34;443&amp;#34;;&#10;&#10; let 伪装域名 = host;&#10; let 最终路径 = path;&#10; let 节点备注 = &amp;#39;&amp;#39;;&#10; const matchingProxyIP = proxyIPPool.find(proxyIP =&amp;gt; proxyIP.includes(address));&#10; if (matchingProxyIP) 最终路径 += `&amp;amp;proxyip=${matchingProxyIP}`;&#10;&#10; if (proxyhosts.length &amp;gt; 0 &amp;amp;&amp;amp; (伪装域名.includes(&amp;#39;.workers.dev&amp;#39;))) {&#10; 最终路径 = `/${伪装域名}${最终路径}`;&#10; 伪装域名 = proxyhosts[Math.floor(Math.random() * proxyhosts.length)];&#10; 节点备注 = ` 已启用临时域名中转服务，请尽快绑定自定义域！`;&#10; }&#10;&#10; const 协议类型 = atob(啥啥啥_写的这是啥啊);&#10; const 维列斯Link = `${协议类型}://${UUID}@${address}:${port + atob(&amp;#39;P2VuY3J5cHRpb249bm9uZSZzZWN1cml0eT10bHMmc25pPQ==&amp;#39;) + 伪装域名}&amp;amp;fp=random&amp;amp;type=ws&amp;amp;host=${伪装域名}&amp;amp;path=${encodeURIComponent(最终路径)}#${encodeURIComponent(addressid + 节点备注)}`;&#10;&#10; return 维列斯Link;&#10; }).join(&amp;#39;\n&amp;#39;);&#10;&#10; let base64Response = responseBody; // 重新进行 Base64 编码&#10; if (noTLS == &amp;#39;true&amp;#39;) base64Response += `\n${notlsresponseBody}`;&#10; if (link.length &amp;gt; 0) base64Response += &amp;#39;\n&amp;#39; + link.join(&amp;#39;\n&amp;#39;);&#10; return btoa(base64Response);&#10;}&#10;&#10;async function 整理(内容) {&#10; // 将制表符、双引号、单引号和换行符都替换为逗号&#10; // 然后将连续的多个逗号替换为单个逗号&#10; var 替换后的内容 = 内容.replace(/[ |&amp;#34;&amp;#39;\r\n]+/g, &amp;#39;,&amp;#39;).replace(/,+/g, &amp;#39;,&amp;#39;);&#10;&#10; // 删除开头和结尾的逗号（如果有的话）&#10; if (替换后的内容.charAt(0) == &amp;#39;,&amp;#39;) 替换后的内容 = 替换后的内容.slice(1);&#10; if (替换后的内容.charAt(替换后的内容.length - 1) == &amp;#39;,&amp;#39;) 替换后的内容 = 替换后的内容.slice(0, 替换后的内容.length - 1);&#10;&#10; // 使用逗号分割字符串，得到地址数组&#10; const 地址数组 = 替换后的内容.split(&amp;#39;,&amp;#39;);&#10;&#10; return 地址数组;&#10;}&#10;&#10;async function sendMessage(type, ip, add_data = &amp;#34;&amp;#34;) {&#10; if (!BotToken || !ChatID) return;&#10;&#10; try {&#10; let msg = &amp;#34;&amp;#34;;&#10; const response = await fetch(`http://ip-api.com/json/${ip}?lang=zh-CN`);&#10; if (response.ok) {&#10; const ipInfo = await response.json();&#10; msg = `${type}\nIP: ${ip}\n国家: ${ipInfo.country}\n&amp;lt;tg-spoiler&amp;gt;城市: ${ipInfo.city}\n组织: ${ipInfo.org}\nASN: ${ipInfo.as}\n${add_data}`;&#10; } else {&#10; msg = `${type}\nIP: ${ip}\n&amp;lt;tg-spoiler&amp;gt;${add_data}`;&#10; }&#10;&#10; const url = `https://api.telegram.org/bot${BotToken}/sendMessage?chat_id=${ChatID}&amp;amp;parse_mode=HTML&amp;amp;text=${encodeURIComponent(msg)}`;&#10; return fetch(url, {&#10; method: &amp;#39;GET&amp;#39;,&#10; headers: {&#10; &amp;#39;Accept&amp;#39;: &amp;#39;text/html,application/xhtml+xml,application/xml;&amp;#39;,&#10; &amp;#39;Accept-Encoding&amp;#39;: &amp;#39;gzip, deflate, br&amp;#39;,&#10; &amp;#39;User-Agent&amp;#39;: &amp;#39;Mozilla/5.0 Chrome/90.0.4430.72&amp;#39;&#10; }&#10; });&#10; } catch (error) {&#10; console.error(&amp;#39;Error sending message:&amp;#39;, error);&#10; }&#10;}&#10;&#10;function isValidIPv4(address) {&#10; const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;&#10; return ipv4Regex.test(address);&#10;}&#10;&#10;function 生成动态UUID(密钥) {&#10; const 时区偏移 = 8; // 北京时间相对于UTC的时区偏移+8小时&#10; const 起始日期 = new Date(2007, 6, 7, 更新时间, 0, 0); // 固定起始日期为2007年7月7日的凌晨3点&#10; const 一周的毫秒数 = 1000 * 60 * 60 * 24 * 有效时间;&#10;&#10; function 获取当前周数() {&#10; const 现在 = new Date();&#10; const 调整后的现在 = new Date(现在.getTime() + 时区偏移 * 60 * 60 * 1000);&#10; const 时间差 = Number(调整后的现在) - Number(起始日期);&#10; return Math.ceil(时间差 / 一周的毫秒数);&#10; }&#10;&#10; function 生成UUID(基础字符串) {&#10; const 哈希缓冲区 = new TextEncoder().encode(基础字符串);&#10; return crypto.subtle.digest(&amp;#39;SHA-256&amp;#39;, 哈希缓冲区).then((哈希) =&amp;gt; {&#10; const 哈希数组 = Array.from(new Uint8Array(哈希));&#10; const 十六进制哈希 = 哈希数组.map(b =&amp;gt; b.toString(16).padStart(2, &amp;#39;0&amp;#39;)).join(&amp;#39;&amp;#39;);&#10; return `${十六进制哈希.substr(0, 8)}-${十六进制哈希.substr(8, 4)}-4${十六进制哈希.substr(13, 3)}-${(parseInt(十六进制哈希.substr(16, 2), 16) &amp;amp; 0x3f | 0x80).toString(16)}${十六进制哈希.substr(18, 2)}-${十六进制哈希.substr(20, 12)}`;&#10; });&#10; }&#10;&#10; const 当前周数 = 获取当前周数(); // 获取当前周数&#10; const 结束时间 = new Date(起始日期.getTime() + 当前周数 * 一周的毫秒数);&#10;&#10; // 生成两个 UUID&#10; const 当前UUIDPromise = 生成UUID(密钥 + 当前周数);&#10; const 上一个UUIDPromise = 生成UUID(密钥 + (当前周数 - 1));&#10;&#10; // 格式化到期时间&#10; const 到期时间UTC = new Date(结束时间.getTime() - 时区偏移 * 60 * 60 * 1000); // UTC时间&#10; const 到期时间字符串 = `到期时间(UTC): ${到期时间UTC.toISOString().slice(0, 19).replace(&amp;#39;T&amp;#39;, &amp;#39; &amp;#39;)} (UTC+8): ${结束时间.toISOString().slice(0, 19).replace(&amp;#39;T&amp;#39;, &amp;#39; &amp;#39;)}\n`;&#10;&#10; return Promise.all([当前UUIDPromise, 上一个UUIDPromise, 到期时间字符串]);&#10;}&#10;&#10;async function 迁移地址列表(env, txt = &amp;#39;ADD.txt&amp;#39;) {&#10; const 旧数据 = await env.KV.get(`/${txt}`);&#10; const 新数据 = await env.KV.get(txt);&#10;&#10; if (旧数据 &amp;amp;&amp;amp; !新数据) {&#10; // 写入新位置&#10; await env.KV.put(txt, 旧数据);&#10; // 删除旧数据&#10; await env.KV.delete(`/${txt}`);&#10; return true;&#10; }&#10; return false;&#10;}&#10;&#10;async function KV(request, env, txt = &amp;#39;ADD.txt&amp;#39;) {&#10; try {&#10; // POST请求处理&#10; if (request.method === &amp;#34;POST&amp;#34;) {&#10; if (!env.KV) return new Response(&amp;#34;未绑定KV空间&amp;#34;, { status: 400 });&#10; try {&#10; const content = await request.text();&#10; await env.KV.put(txt, content);&#10; return new Response(&amp;#34;保存成功&amp;#34;);&#10; } catch (error) {&#10; console.error(&amp;#39;保存KV时发生错误:&amp;#39;, error);&#10; return new Response(&amp;#34;保存失败: &amp;#34; + error.message, { status: 500 });&#10; }&#10; }&#10;&#10; // GET请求部分&#10; let content = &amp;#39;&amp;#39;;&#10; let hasKV = !!env.KV;&#10;&#10; if (hasKV) {&#10; try {&#10; content = await env.KV.get(txt) || &amp;#39;&amp;#39;;&#10; } catch (error) {&#10; console.error(&amp;#39;读取KV时发生错误:&amp;#39;, error);&#10; content = &amp;#39;读取数据时发生错误: &amp;#39; + error.message;&#10; }&#10; }&#10;&#10; const html = `&#10; &amp;lt;!DOCTYPE html&amp;gt;&#10; &amp;lt;html&amp;gt;&#10; &amp;lt;head&amp;gt;&#10; &amp;lt;title&amp;gt;优选订阅列表&amp;lt;/title&amp;gt;&#10; &amp;lt;meta charset=&amp;#34;utf-8&amp;#34;&amp;gt;&#10; &amp;lt;meta name=&amp;#34;viewport&amp;#34; content=&amp;#34;width=device-width, initial-scale=1&amp;#34;&amp;gt;&#10; &amp;lt;style&amp;gt;&#10; body {&#10; margin: 0;&#10; padding: 15px; /* 调整padding */&#10; box-sizing: border-box;&#10; font-size: 13px; /* 设置全局字体大小 */&#10; }&#10; .editor-container {&#10; width: 100%;&#10; max-width: 100%;&#10; margin: 0 auto;&#10; }&#10; .editor {&#10; width: 100%;&#10; height: 520px; /* 调整高度 */&#10; margin: 15px 0; /* 调整margin */&#10; padding: 10px; /* 调整padding */&#10; box-sizing: border-box;&#10; border: 1px solid #ccc;&#10; border-radius: 4px;&#10; font-size: 13px;&#10; line-height: 1.5;&#10; overflow-y: auto;&#10; resize: none;&#10; }&#10; .save-container {&#10; margin-top: 8px; /* 调整margin */&#10; display: flex;&#10; align-items: center;&#10; gap: 10px; /* 调整gap */&#10; }&#10; .save-btn, .back-btn {&#10; padding: 6px 15px; /* 调整padding */&#10; color: white;&#10; border: none;&#10; border-radius: 4px;&#10; cursor: pointer;&#10; }&#10; .save-btn {&#10; background: #4CAF50;&#10; }&#10; .save-btn:hover {&#10; background: #45a049;&#10; }&#10; .back-btn {&#10; background: #666;&#10; }&#10; .back-btn:hover {&#10; background: #555;&#10; }&#10; .save-status {&#10; color: #666;&#10; }&#10; .notice-content {&#10; display: none;&#10; margin-top: 10px;&#10; font-size: 13px;&#10; color: #333;&#10; }&#10; &amp;lt;/style&amp;gt;&#10; &amp;lt;/head&amp;gt;&#10; &amp;lt;body&amp;gt;&#10; ################################################################&amp;lt;br&amp;gt;&#10; ${FileName} 优选订阅列表:&amp;lt;br&amp;gt;&#10; ---------------------------------------------------------------&amp;lt;br&amp;gt;&#10; &amp;lt;strong&amp;gt;&amp;lt;a href=&amp;#34;javascript:void(0);&amp;#34; id=&amp;#34;noticeToggle&amp;#34; onclick=&amp;#34;toggleNotice()&amp;#34;&amp;gt;注意事项∨&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;&#10; &amp;lt;div id=&amp;#34;noticeContent&amp;#34; class=&amp;#34;notice-content&amp;#34;&amp;gt;&#10; ${decodeURIComponent(atob(&amp;#39;JTA5JTA5JTA5JTA5JTA5JTNDc3Ryb25nJTNFMS4lM0MlMkZzdHJvbmclM0UlMjBBRERBUEklMjAlRTUlQTYlODIlRTYlOUUlOUMlRTYlOTglQUYlRTUlOEYlOEQlRTQlQkIlQTNJUCVFRiVCQyU4QyVFNSU4RiVBRiVFNCVCRCU5QyVFNCVCOCVCQVBST1hZSVAlRTclOUElODQlRTglQUYlOUQlRUYlQkMlOEMlRTUlOEYlQUYlRTUlQjAlODYlMjIlM0Zwcm94eWlwJTNEdHJ1ZSUyMiVFNSU4RiU4MiVFNiU5NSVCMCVFNiVCNyVCQiVFNSU4QSVBMCVFNSU4OCVCMCVFOSU5MyVCRSVFNiU4RSVBNSVFNiU5QyVBQiVFNSVCMCVCRSVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZtYWluJTJGYWRkcmVzc2VzYXBpLnR4dCUzQ3N0cm9uZyUzRSUzRnByb3h5aXAlM0R0cnVlJTNDJTJGc3Ryb25nJTNFJTNDYnIlM0UlM0NiciUzRQolMDklMDklMDklMDklMDklM0NzdHJvbmclM0UyLiUzQyUyRnN0cm9uZyUzRSUyMEFEREFQSSUyMCVFNSVBNiU4MiVFNiU5RSU5QyVFNiU5OCVBRiUyMCUzQ2ElMjBocmVmJTNEJTI3aHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGWElVMiUyRkNsb3VkZmxhcmVTcGVlZFRlc3QlMjclM0VDbG91ZGZsYXJlU3BlZWRUZXN0JTNDJTJGYSUzRSUyMCVFNyU5QSU4NCUyMGNzdiUyMCVFNyVCQiU5MyVFNiU5RSU5QyVFNiU5NiU4NyVFNCVCQiVCNiVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZtYWluJTJGQ2xvdWRmbGFyZVNwZWVkVGVzdC5jc3YlM0NiciUzRSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCLSUyMCVFNSVBNiU4MiVFOSU5QyU4MCVFNiU4QyU4NyVFNSVBRSU5QTIwNTMlRTclQUIlQUYlRTUlOEYlQTMlRTUlOEYlQUYlRTUlQjAlODYlMjIlM0Zwb3J0JTNEMjA1MyUyMiVFNSU4RiU4MiVFNiU5NSVCMCVFNiVCNyVCQiVFNSU4QSVBMCVFNSU4OCVCMCVFOSU5MyVCRSVFNiU4RSVBNSVFNiU5QyVBQiVFNSVCMCVCRSVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZtYWluJTJGQ2xvdWRmbGFyZVNwZWVkVGVzdC5jc3YlM0NzdHJvbmclM0UlM0Zwb3J0JTNEMjA1MyUzQyUyRnN0cm9uZyUzRSUzQ2JyJTNFJTNDYnIlM0UKJTA5JTA5JTA5JTA5JTA5JTI2bmJzcCUzQiUyNm5ic3AlM0ItJTIwJUU1JUE2JTgyJUU5JTlDJTgwJUU2JThDJTg3JUU1JUFFJTlBJUU4JThBJTgyJUU3JTgyJUI5JUU1JUE0JTg3JUU2JUIzJUE4JUU1JThGJUFGJUU1JUIwJTg2JTIyJTNGaWQlM0RDRiVFNCVCQyU5OCVFOSU4MCU4OSUyMiVFNSU4RiU4MiVFNiU5NSVCMCVFNiVCNyVCQiVFNSU4QSVBMCVFNSU4OCVCMCVFOSU5MyVCRSVFNiU4RSVBNSVFNiU5QyVBQiVFNSVCMCVCRSVFRiVCQyU4QyVFNCVCRSU4QiVFNSVBNiU4MiVFRiVCQyU5QSUzQ2JyJTNFCiUwOSUwOSUwOSUwOSUwOSUyNm5ic3AlM0IlMjZuYnNwJTNCaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGY21saXUlMkZXb3JrZXJWbGVzczJzdWIlMkZtYWluJTJGQ2xvdWRmbGFyZVNwZWVkVGVzdC5jc3YlM0NzdHJvbmclM0UlM0ZpZCUzRENGJUU0JUJDJTk4JUU5JTgwJTg5JTNDJTJGc3Ryb25nJTNFJTNDYnIlM0UlM0NiciUzRQolMDklMDklMDklMDklMDklMjZuYnNwJTNCJTI2bmJzcCUzQi0lMjAlRTUlQTYlODIlRTklOUMlODAlRTYlOEMlODclRTUlQUUlOUElRTUlQTQlOUElRTQlQjglQUElRTUlOEYlODIlRTYlOTUlQjAlRTUlODglOTklRTklOUMlODAlRTglQTYlODElRTQlQkQlQkYlRTclOTQlQTglMjclMjYlMjclRTUlODElOUElRTklOTclQjQlRTklOUElOTQlRUYlQkMlOEMlRTQlQkUlOEIlRTUlQTYlODIlRUYlQkMlOUElM0NiciUzRQolMDklMDklMDklMDklMDklMjZuYnNwJTNCJTI2bmJzcCUzQmh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSUyRmNtbGl1JTJGV29ya2VyVmxlc3Myc3ViJTJGbWFpbiUyRkNsb3VkZmxhcmVTcGVlZFRlc3QuY3N2JTNGaWQlM0RDRiVFNCVCQyU5OCVFOSU4MCU4OSUzQ3N0cm9uZyUzRSUyNiUzQyUyRnN0cm9uZyUzRXBvcnQlM0QyMDUzJTNDYnIlM0U=&amp;#39;))}&#10; &amp;lt;/div&amp;gt;&#10; &amp;lt;div class=&amp;#34;editor-container&amp;#34;&amp;gt;&#10; ${hasKV ? `&#10; &amp;lt;textarea class=&amp;#34;editor&amp;#34; &#10; placeholder=&amp;#34;${decodeURIComponent(atob(&amp;#39;QUREJUU3JUE0JUJBJUU0JUJFJThCJUVGJUJDJTlBCnZpc2EuY24lMjMlRTQlQkMlOTglRTklODAlODklRTUlOUYlOUYlRTUlOTAlOEQKMTI3LjAuMC4xJTNBMTIzNCUyM0NGbmF0CiU1QjI2MDYlM0E0NzAwJTNBJTNBJTVEJTNBMjA1MyUyM0lQdjYKCiVFNiVCMyVBOCVFNiU4NCU4RiVFRiVCQyU5QQolRTYlQUYlOEYlRTglQTElOEMlRTQlQjglODAlRTQlQjglQUElRTUlOUMlQjAlRTUlOUQlODAlRUYlQkMlOEMlRTYlQTAlQkMlRTUlQkMlOEYlRTQlQjglQkElMjAlRTUlOUMlQjAlRTUlOUQlODAlM0ElRTclQUIlQUYlRTUlOEYlQTMlMjMlRTUlQTQlODclRTYlQjMlQTgKSVB2NiVFNSU5QyVCMCVFNSU5RCU4MCVFOSU5QyU4MCVFOCVBNiU4MSVFNyU5NCVBOCVFNCVCOCVBRCVFNiU4QiVBQyVFNSU4RiVCNyVFNiU4QiVBQyVFOCVCNSVCNyVFNiU5RCVBNSVFRiVCQyU4QyVFNSVBNiU4MiVFRiVCQyU5QSU1QjI2MDYlM0E0NzAwJTNBJTNBJTVEJTNBMjA1MwolRTclQUIlQUYlRTUlOEYlQTMlRTQlQjglOEQlRTUlODYlOTklRUYlQkMlOEMlRTklQkIlOTglRTglQUUlQTQlRTQlQjglQkElMjA0NDMlMjAlRTclQUIlQUYlRTUlOEYlQTMlRUYlQkMlOEMlRTUlQTYlODIlRUYlQkMlOUF2aXNhLmNuJTIzJUU0JUJDJTk4JUU5JTgwJTg5JUU1JTlGJTlGJUU1JTkwJThECgoKQUREQVBJJUU3JUE0JUJBJUU0JUJFJThCJUVGJUJDJTlBCmh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSUyRmNtbGl1JTJGV29ya2VyVmxlc3Myc3ViJTJGcmVmcyUyRmhlYWRzJTJGbWFpbiUyRmFkZHJlc3Nlc2FwaS50eHQKCiVFNiVCMyVBOCVFNiU4NCU4RiVFRiVCQyU5QUFEREFQSSVFNyU5QiVCNCVFNiU4RSVBNSVFNiVCNyVCQiVFNSU4QSVBMCVFNyU5QiVCNCVFOSU5MyVCRSVFNSU4RCVCMyVFNSU4RiVBRg==&amp;#39;))}&amp;#34;&#10; id=&amp;#34;content&amp;#34;&amp;gt;${content}&amp;lt;/textarea&amp;gt;&#10; &amp;lt;div class=&amp;#34;save-container&amp;#34;&amp;gt;&#10; &amp;lt;button class=&amp;#34;back-btn&amp;#34; onclick=&amp;#34;goBack()&amp;#34;&amp;gt;返回配置页&amp;lt;/button&amp;gt;&#10; &amp;lt;button class=&amp;#34;save-btn&amp;#34; onclick=&amp;#34;saveContent(this)&amp;#34;&amp;gt;保存&amp;lt;/button&amp;gt;&#10; &amp;lt;span class=&amp;#34;save-status&amp;#34; id=&amp;#34;saveStatus&amp;#34;&amp;gt;&amp;lt;/span&amp;gt;&#10; &amp;lt;/div&amp;gt;&#10; &amp;lt;br&amp;gt;&#10; ################################################################&amp;lt;br&amp;gt;&#10; ${cmad}&#10; ` : &amp;#39;&amp;lt;p&amp;gt;未绑定KV空间&amp;lt;/p&amp;gt;&amp;#39;}&#10; &amp;lt;/div&amp;gt;&#10; &#10; &amp;lt;script&amp;gt;&#10; if (document.querySelector(&amp;#39;.editor&amp;#39;)) {&#10; let timer;&#10; const textarea = document.getElementById(&amp;#39;content&amp;#39;);&#10; const originalContent = textarea.value;&#10; &#10; function goBack() {&#10; const currentUrl = window.location.href;&#10; const parentUrl = currentUrl.substring(0, currentUrl.lastIndexOf(&amp;#39;/&amp;#39;));&#10; window.location.href = parentUrl;&#10; }&#10; &#10; function replaceFullwidthColon() {&#10; const text = textarea.value;&#10; textarea.value = text.replace(/：/g, &amp;#39;:&amp;#39;);&#10; }&#10; &#10; function saveContent(button) {&#10; try {&#10; const updateButtonText = (step) =&amp;gt; {&#10; button.textContent = \`保存中: \${step}\`;&#10; };&#10; // 检测是否为iOS设备&#10; const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);&#10; &#10; // 仅在非iOS设备上执行replaceFullwidthColon&#10; if (!isIOS) {&#10; replaceFullwidthColon();&#10; }&#10; updateButtonText(&amp;#39;开始保存&amp;#39;);&#10; button.disabled = true;&#10; // 获取textarea内容和原始内容&#10; const textarea = document.getElementById(&amp;#39;content&amp;#39;);&#10; if (!textarea) {&#10; throw new Error(&amp;#39;找不到文本编辑区域&amp;#39;);&#10; }&#10; updateButtonText(&amp;#39;获取内容&amp;#39;);&#10; let newContent;&#10; let originalContent;&#10; try {&#10; newContent = textarea.value || &amp;#39;&amp;#39;;&#10; originalContent = textarea.defaultValue || &amp;#39;&amp;#39;;&#10; } catch (e) {&#10; console.error(&amp;#39;获取内容错误:&amp;#39;, e);&#10; throw new Error(&amp;#39;无法获取编辑内容&amp;#39;);&#10; }&#10; updateButtonText(&amp;#39;准备状态更新函数&amp;#39;);&#10; const updateStatus = (message, isError = false) =&amp;gt; {&#10; const statusElem = document.getElementById(&amp;#39;saveStatus&amp;#39;);&#10; if (statusElem) {&#10; statusElem.textContent = message;&#10; statusElem.style.color = isError ? &amp;#39;red&amp;#39; : &amp;#39;#666&amp;#39;;&#10; }&#10; };&#10; updateButtonText(&amp;#39;准备按钮重置函数&amp;#39;);&#10; const resetButton = () =&amp;gt; {&#10; button.textContent = &amp;#39;保存&amp;#39;;&#10; button.disabled = false;&#10; };&#10; if (newContent !== originalContent) {&#10; updateButtonText(&amp;#39;发送保存请求&amp;#39;);&#10; fetch(window.location.href, {&#10; method: &amp;#39;POST&amp;#39;,&#10; body: newContent,&#10; headers: {&#10; &amp;#39;Content-Type&amp;#39;: &amp;#39;text/plain;charset=UTF-8&amp;#39;&#10; },&#10; cache: &amp;#39;no-cache&amp;#39;&#10; })&#10; .then(response =&amp;gt; {&#10; updateButtonText(&amp;#39;检查响应状态&amp;#39;);&#10; if (!response.ok) {&#10; throw new Error(\`HTTP error! status: \${response.status}\`);&#10; }&#10; updateButtonText(&amp;#39;更新保存状态&amp;#39;);&#10; const now = new Date().toLocaleString();&#10; document.title = \`编辑已保存 \${now}\`;&#10; updateStatus(\`已保存 \${now}\`);&#10; })&#10; .catch(error =&amp;gt; {&#10; updateButtonText(&amp;#39;处理错误&amp;#39;);&#10; console.error(&amp;#39;Save error:&amp;#39;, error);&#10; updateStatus(\`保存失败: \${error.message}\`, true);&#10; })&#10; .finally(() =&amp;gt; {&#10; resetButton();&#10; });&#10; } else {&#10; updateButtonText(&amp;#39;检查内容变化&amp;#39;);&#10; updateStatus(&amp;#39;内容未变化&amp;#39;);&#10; resetButton();&#10; }&#10; } catch (error) {&#10; console.error(&amp;#39;保存过程出错:&amp;#39;, error);&#10; button.textContent = &amp;#39;保存&amp;#39;;&#10; button.disabled = false;&#10; const statusElem = document.getElementById(&amp;#39;saveStatus&amp;#39;);&#10; if (statusElem) {&#10; statusElem.textContent = \`错误: \${error.message}\`;&#10; statusElem.style.color = &amp;#39;red&amp;#39;;&#10; }&#10; }&#10; }&#10; &#10; textarea.addEventListener(&amp;#39;blur&amp;#39;, saveContent);&#10; textarea.addEventListener(&amp;#39;input&amp;#39;, () =&amp;gt; {&#10; clearTimeout(timer);&#10; timer = setTimeout(saveContent, 5000);&#10; });&#10; }&#10; &#10; function toggleNotice() {&#10; const noticeContent = document.getElementById(&amp;#39;noticeContent&amp;#39;);&#10; const noticeToggle = document.getElementById(&amp;#39;noticeToggle&amp;#39;);&#10; if (noticeContent.style.display === &amp;#39;none&amp;#39; || noticeContent.style.display === &amp;#39;&amp;#39;) {&#10; noticeContent.style.display = &amp;#39;block&amp;#39;;&#10; noticeToggle.textContent = &amp;#39;注意事项∧&amp;#39;;&#10; } else {&#10; noticeContent.style.display = &amp;#39;none&amp;#39;;&#10; noticeToggle.textContent = &amp;#39;注意事项∨&amp;#39;;&#10; }&#10; }&#10; &#10; // 初始化 noticeContent 的 display 属性&#10; document.addEventListener(&amp;#39;DOMContentLoaded&amp;#39;, () =&amp;gt; {&#10; document.getElementById(&amp;#39;noticeContent&amp;#39;).style.display = &amp;#39;none&amp;#39;;&#10; });&#10; &amp;lt;/script&amp;gt;&#10; &amp;lt;/body&amp;gt;&#10; &amp;lt;/html&amp;gt;&#10; `;&#10;&#10; return new Response(html, {&#10; headers: { &amp;#34;Content-Type&amp;#34;: &amp;#34;text/html;charset=utf-8&amp;#34; }&#10; });&#10; } catch (error) {&#10; console.error(&amp;#39;处理请求时发生错误:&amp;#39;, error);&#10; return new Response(&amp;#34;服务器错误: &amp;#34; + error.message, {&#10; status: 500,&#10; headers: { &amp;#34;Content-Type&amp;#34;: &amp;#34;text/plain;charset=utf-8&amp;#34; }&#10; });&#10; }&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="域名"&gt;域名&#10;&lt;/h2&gt;&lt;p&gt;注册一个免费的域名，可以使用零度前几期介绍的注册方法，来获取你自己的免费域名 &lt;a class="link" href="https://www.freedidi.com/17434.html" target="_blank" rel="noopener"&#10; &gt;【点击前往】&lt;/a&gt;&#10;当然如果你已经有域名那么更好！&#10;有域名就可以添加进自定义域了&lt;/p&gt;&#10;&lt;h2 id="uuid"&gt;UUID&#10;&lt;/h2&gt;&lt;p&gt;在设置中，找到 &lt;em&gt;&lt;strong&gt;变量与机密&lt;/strong&gt;&lt;/em&gt; ，添加一条，标题为&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;UUID&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;值自己随意定，假设值为&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;114514&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="访问"&gt;访问&#10;&lt;/h2&gt;&lt;p&gt;打开浏览器，输入你的自定义域，并在结尾加上&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;/114514&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果前一步的值为其他值，则填入&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;/其他值&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="优选"&gt;优选&#10;&lt;/h2&gt;&lt;p&gt;如果想获得更多的优质节点，那么推荐使用IP优选网站或优选工具进行获取！&lt;a class="link" href="https://www.freedidi.com/10143.html" target="_blank" rel="noopener"&#10; &gt;【点击前往】&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="视频链接"&gt;视频链接&#10;&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://youtu.be/DYGu71OaqGI" target="_blank" rel="noopener"&#10; &gt;https://youtu.be/DYGu71OaqGI&lt;/a&gt;&lt;/p&gt;&#10;</description></item><item><title>关于steam的注册，客户端下载，及更多内容</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E5%85%B3%E4%BA%8Esteam%E7%9A%84%E6%B3%A8%E5%86%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8B%E8%BD%BD%E5%8F%8A%E6%9B%B4%E5%A4%9A%E5%86%85%E5%AE%B9/</link><pubDate>Sat, 21 Jun 2025 22:43:29 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/%E5%85%B3%E4%BA%8Esteam%E7%9A%84%E6%B3%A8%E5%86%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8B%E8%BD%BD%E5%8F%8A%E6%9B%B4%E5%A4%9A%E5%86%85%E5%AE%B9/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/Steam.webp" alt="Featured image of post 关于steam的注册，客户端下载，及更多内容" /&gt;&lt;h1 id="准备工作"&gt;准备工作：&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;一个邮箱（事实上不太推荐QQ邮箱，不过我自己用的就是QQ邮箱，所以无所diao谓）、&lt;/li&gt;&#10;&lt;li&gt;一台电脑（win10/11，mac也行，Linux&amp;hellip;&amp;hellip;也不是不可以，但是我这里不教macOS和Linux的安装方法）（电脑下载电脑客户端用，你要是不玩游戏只是领个别人送的礼物，或者趁促销结束前赶紧买个游戏，那一台手机也可以）&lt;/li&gt;&#10;&lt;li&gt;加速器&#10;&lt;ul&gt;&#10;&lt;li&gt;UU加速器、雷神加速器、迅游加速器皆可免费加速steam，可以使用&lt;/li&gt;&#10;&lt;li&gt;使用VPN的朋友，可以直接使用VPN&lt;/li&gt;&#10;&lt;li&gt;steam++（watt tolkit）也可免费加速&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="安装steam-windows客户端以下简称客户端"&gt;安装steam Windows客户端（以下简称客户端）&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;开启加速器&lt;/li&gt;&#10;&lt;li&gt;打开&lt;a class="link" href="https://store.steampowered.com" target="_blank" rel="noopener"&#10; &gt;steam官网&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;点击右上方的绿色按钮「安装steam」&lt;/li&gt;&#10;&lt;li&gt;点击左侧蓝色大按钮「安装steam」，然后运行浏览器所下载的可执行文件（.exe）&lt;/li&gt;&#10;&lt;li&gt;双击安装包，若弹出用户账户控制界面，选择是，进入安装页面&lt;/li&gt;&#10;&lt;li&gt;一路选择下一步&#10;注：在选定安装路径时，遵循一下要点：&#10;&lt;ul&gt;&#10;&lt;li&gt;路径内无中文字符，包括特殊符号&lt;/li&gt;&#10;&lt;li&gt;建议不要装到C盘（当然只有C盘那就装C盘吧）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;完成，steam自动更新，等待即可&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="注册"&gt;注册&#10;&lt;/h1&gt;&lt;pre&gt;&lt;code&gt;注：此步骤极难（），可寻求他人帮助&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;在客户端窗口打开后，点击登录界面的右下角「创建免费账户」&lt;/li&gt;&#10;&lt;li&gt;填写你的邮箱到上面两行&lt;/li&gt;&#10;&lt;li&gt;进行人机验证&#10;注：此步骤极难（）建议使用手机热点作为WiFi，并保持加速器开启。若失败请多次尝试，或更换加速器节点&lt;/li&gt;&#10;&lt;li&gt;勾选同意条款&lt;/li&gt;&#10;&lt;li&gt;在出现「正在等待您进行验证」的窗口后，打开邮箱，接收到一封来自steam的邮件，点击邮件中的蓝色大按钮「验证我的电子邮件地址」&lt;/li&gt;&#10;&lt;li&gt;想一个好记的名称，用于账户登录，只可使用英文、数字，不可使用中文与特殊字符&lt;/li&gt;&#10;&lt;li&gt;想一个好记的密码，用于登录&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="登录"&gt;登录&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;填写用户名与密码&lt;/li&gt;&#10;&lt;li&gt;检查邮箱，填写验证码&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="安装steam-android客户端"&gt;安装steam Android客户端&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;打开&lt;a class="link" href="https://media.steampowered.com/apps/steam-android/steam-3.10.0.apk" target="_blank" rel="noopener"&#10; &gt;https://media.steampowered.com/apps/steam-android/steam-3.10.0.apk&lt;/a&gt;并下载安装包（.apk）&lt;/li&gt;&#10;&lt;li&gt;点击并安装即可&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="安装steam-ios客户端"&gt;安装steam iOS客户端&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;打开&lt;a class="link" href="https://apps.apple.com/us/app/steam-mobile/id495369748" target="_blank" rel="noopener"&#10; &gt;https://apps.apple.com/us/app/steam-mobile/id495369748&lt;/a&gt;，跳转到app store&lt;/li&gt;&#10;&lt;li&gt;点击「获取」并安装即可&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="更改个人资料名称"&gt;更改个人资料名称&#10;&lt;/h1&gt;&lt;p&gt;如果你嫌初始名称不好听，可通过以下方法更改（此方法无法更改登录名称）&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;点击客户端主页右上角的「管理账户」按钮（从左往右数第三个按钮）&lt;/li&gt;&#10;&lt;li&gt;点击查看我的个人资料&lt;/li&gt;&#10;&lt;li&gt;点击右侧的「编辑个人资料」&lt;/li&gt;&#10;&lt;li&gt;更改个人资料名称&lt;/li&gt;&#10;&lt;/ol&gt;&#10;</description></item><item><title>hexo博客搭建指北</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/hexo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8C%97/</link><pubDate>Sun, 11 May 2025 20:02:30 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/hexo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8C%97/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/hexo.webp" alt="Featured image of post hexo博客搭建指北" /&gt;&lt;h1 id="注教程以windows系统为例"&gt;注：教程以Windows系统为例&#10;&lt;/h1&gt;&lt;h1 id="1-安装nodejs"&gt;1. 安装&lt;a class="link" href="https://nodejs.org/dist/v22.15.0/node-v22.15.0-x64.msi" target="_blank" rel="noopener"&#10; &gt;Node.js&lt;/a&gt;&#10;&lt;/h1&gt;&lt;h1 id="2-安装git"&gt;2. 安装&lt;a class="link" href="https://git-scm.com/downloads/win" target="_blank" rel="noopener"&#10; &gt;git&lt;/a&gt;&#10;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;一直点确定就行，全部按它默认勾的，若要细细配置可参照&lt;a class="link" href="https://www.cnblogs.com/xueweisuoyong/p/11914045.html" target="_blank" rel="noopener"&#10; &gt;这篇文章&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h1 id="3-测试一下管理员运行cmd依次输入"&gt;3. 测试一下，管理员运行cmd，依次输入&#10;&lt;/h1&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;node -v&#10;npm -v&#10;git -v&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;若正常显示版本号即可&lt;/p&gt;&#10;&lt;h1 id="4-下载hexo"&gt;4. 下载hexo&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;新建一个文件夹&lt;/strong&gt;，用来存放blog&lt;/li&gt;&#10;&lt;li&gt;右键，选择&lt;strong&gt;Open git bash here&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;依次输入&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;npm install hexo-cli -g&#10;hexo init blog&#10;cd blog&#10;npm install&#10;hexo server&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="5-简单认识hexo"&gt;5. 简单认识hexo&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;进入自动创建的blog文件夹&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;_config.yml&lt;/strong&gt;，在这个文件内修改博客基础设置&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;blog\source_posts&lt;/strong&gt;，在这个文件夹内修改博客文章&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;themes&lt;/strong&gt;，在这个文件夹内修改主题&lt;/li&gt;&#10;&lt;li&gt;在自动创建的blog文件夹内右键，选择&lt;strong&gt;Open git bash here&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;基础指令：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# 开启服务&#10;hexo s&#10;&#10;# 新建文章&#10;hexo new 文章名&#10;&#10;# 新建草稿&#10;hexo new draft 文章名&#10;&#10;# 发布草稿成为文章&#10;hexo publish 文章名&#10;&#10;# 普通页面&#10;hexo new page 页面名&#10;&#10;# 清空缓存&#10;hexo cl&#10;&#10;# 生成静态页面&#10;hexo g&#10;# 然后访问localhost:4000&#10;&#10;# 部署文章&#10;hexo d&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="6-搭建仓库"&gt;6. 搭建仓库&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;注册/登入&lt;a class="link" href="https://github.com/" target="_blank" rel="noopener"&#10; &gt;Github&lt;/a&gt;（可能无法访问，建议使用&lt;a class="link" href="https://steampp.net/" target="_blank" rel="noopener"&#10; &gt;watt tolkit&lt;/a&gt;）&lt;/li&gt;&#10;&lt;li&gt;点击&lt;strong&gt;Create a new repository&lt;/strong&gt;进入新建仓库页面，仓库名输入：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;你的GitHub用户名.github.io&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;勾选 &lt;strong&gt;Public&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;勾选 &lt;strong&gt;Add a README file&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;拉到下面点击create创建&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="7-生成ssh-keys"&gt;7. 生成SSH Keys&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;进入任意文件夹，右键空白处然后点&lt;strong&gt;Open Git bash here&lt;/strong&gt;,输入&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;ssh-keygen -t rsa -C &amp;#34;你的GitHub注册邮箱&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;敲4次Enter&lt;/li&gt;&#10;&lt;li&gt;进入&lt;strong&gt;C:\Users\用户名&lt;/strong&gt;，在里面进入 &lt;strong&gt;.ssh文件夹&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;打开里面的&lt;strong&gt;id_rsa.pub&lt;/strong&gt;，全选复制里面的代码&lt;/li&gt;&#10;&lt;li&gt;打开github&lt;/li&gt;&#10;&lt;li&gt;进入&lt;strong&gt;用户设置&lt;/strong&gt;，找到&lt;strong&gt;SSH keys&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;新建SSH keys&lt;/strong&gt;，名称随意，在下面&lt;strong&gt;粘贴代码&lt;/strong&gt;，然后&lt;strong&gt;创建&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="8-测试是否成功"&gt;8. 测试是否成功&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;在git bash中输入&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;ssh -T git@github.com&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;回车，然后再输入&lt;strong&gt;yes&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h1 id="9-配置_configyml"&gt;9. 配置_config.yml&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;进入之前的&lt;strong&gt;Blog&lt;/strong&gt;文件夹，打开 &lt;strong&gt;_config.yml&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;拉到最下面将&lt;strong&gt;deploy&lt;/strong&gt;后面的全删掉，复制粘贴这段&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; type: git&#10; repository: &#10; branch: main&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意缩进格式：每行前面都有两个空格不要删，每个冒号后面都有个空格也不要删！&lt;/p&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;去github之前生成的仓库页面，点&lt;strong&gt;code&lt;/strong&gt;，&lt;strong&gt;复制https链接&lt;/strong&gt;，将其粘贴到**repository：**后面，然后保存退出&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="10-安装自动部署发布工具"&gt;10. 安装自动部署发布工具&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;回到博客文件夹，一样git bash&lt;/li&gt;&#10;&lt;li&gt;输入：&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;npm install hexo-deployer-git --save&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;在Blog文件夹右键打开git bash，依次输入&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;hexo g&#10;hexo d&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果是第一次使用git的话会需要配置&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;git config --global user.email&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;user.email即你注册GitHub的邮箱&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;git config --global user.name&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;user.name即你注册GitHub的名字&lt;/p&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;配置完后再输入&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;hexo d&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;，然后在跳出来的窗口内进行登录&#10;接下来我们就成功把本地内容上传到github了&lt;/p&gt;&#10;&lt;h1 id="11上传成功"&gt;11.上传成功&#10;&lt;/h1&gt;&lt;p&gt;上传成功以后，我们就算搭建好了！上自己的网址看看吧&#10;网址是我们之前设的仓库名：&lt;strong&gt;你的GitHub用户名.github.io&lt;/strong&gt;&lt;/p&gt;&#10;</description></item><item><title>LSPatch使用指北</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/lspatch%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/</link><pubDate>Sat, 12 Apr 2025 14:45:15 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/lspatch%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/lspatch.webp" alt="Featured image of post LSPatch使用指北" /&gt;&lt;h1 id="注lspatch支持系统android且需要使用shizuku"&gt;注：LSPatch支持系统：Android，且需要使用Shizuku&#10;&lt;/h1&gt;&lt;h1 id="下载并安装lspatch"&gt;下载并安装LSPatch&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;点击&lt;a class="link" href="https://github.com/LSPosed/LSPatch/releases/download/v0.6/manager-v0.6-398-release.apk" target="_blank" rel="noopener"&#10; &gt;&lt;strong&gt;下载&lt;/strong&gt;&lt;/a&gt;，下载安装包（.apk）&lt;/li&gt;&#10;&lt;li&gt;点击安装包，&lt;strong&gt;安装&lt;/strong&gt;软件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="激活lspatch"&gt;激活LSPatch&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;打开&lt;strong&gt;LSPatch&lt;/strong&gt;，显示&lt;strong&gt;Shizuku服务未连接，部分功能不可用&lt;/strong&gt;，不过没关系，可以先不管它&lt;/li&gt;&#10;&lt;li&gt;点击LSPatch下方第二个图标&lt;strong&gt;管理&lt;/strong&gt;，再点击右下角的&lt;strong&gt;加号&lt;/strong&gt;，此时会提示&lt;strong&gt;选择一个目录来存储已修复的apk&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;选择自己方便调用的文件夹，点击使用此文件夹并给予&lt;strong&gt;存储权限&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;再点击加号，弹出&lt;strong&gt;新建修补&lt;/strong&gt;，我们可从存储目录中选择&lt;strong&gt;安装包&lt;/strong&gt;（.apk）或选择&lt;strong&gt;已安装的应用程序&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;选择好&lt;strong&gt;程序&lt;/strong&gt;和&lt;strong&gt;修补模式&lt;/strong&gt;后即可开始修补&#10;注：推荐&lt;strong&gt;便携模式&lt;/strong&gt;并嵌入提前下载好的对应&lt;strong&gt;Xposed模块&lt;/strong&gt;，模块需要自行寻找，后文会放几个模块供大家练手&lt;/li&gt;&#10;&lt;li&gt;修复过程需要耐心等待一段时间，待修补完成后我们点击安装会提示&lt;strong&gt;Shizuku服务未链接&lt;/strong&gt;，这是因为前面我们刚打开LSPatch时显示的Shizuku服务未连接部分功能不可用，不过没有关系，但是如果想使用Shizuku可以参考&lt;a class="link" href="https://e6b0d3c5.newhugoblog.pages.dev/posts/shizuku%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8c%97/" &gt;这篇文章&lt;/a&gt;&lt;/li&gt;&#10;&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;即可。安装完成后打开该APP，在设置中可以看到模块已嵌入成功（有的模块可能不会在设置里显示）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="提醒事项"&gt;提醒事项&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;用&lt;strong&gt;便携模式&lt;/strong&gt;修补后的APK可&lt;strong&gt;脱离LSPatch框架&lt;/strong&gt;使用，分享给&lt;strong&gt;别的设备&lt;/strong&gt;也可正常使用对应模块。而&lt;strong&gt;本地模式&lt;/strong&gt;修补&lt;strong&gt;无需内置模块&lt;/strong&gt;，但是修补后的应用&lt;strong&gt;需要LSPatch&lt;/strong&gt;保持后台持续运行且需要&lt;strong&gt;Shizuku&lt;/strong&gt;才能正常使用，并且只能在&lt;strong&gt;本机&lt;/strong&gt;上运行，这也是更推荐大家使用&lt;strong&gt;便携模式&lt;/strong&gt;的原因&lt;/li&gt;&#10;&lt;li&gt;若模块在嵌入后&lt;strong&gt;不起作用&lt;/strong&gt;，可能是&lt;strong&gt;模块本体&lt;/strong&gt;的问题，也可能是&lt;strong&gt;安装包&lt;/strong&gt;的问题（这不跟没说一样吗），需自行查找问题&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="关于模块"&gt;关于模块&#10;&lt;/h1&gt;&lt;p&gt;模块通常以&lt;strong&gt;软件&lt;/strong&gt;形式存在，下载后是&lt;strong&gt;安装包&lt;/strong&gt;，需要&lt;strong&gt;安装&lt;/strong&gt;后才能使用&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://modules.lsposed.org/" target="_blank" rel="noopener"&#10; &gt;官方仓库&lt;/a&gt;，里面有大量模块，但是&lt;strong&gt;被墙了&lt;/strong&gt;，可以参考&lt;a class="link" href="https://e6b0d3c5.newhugoblog.pages.dev/posts/clash%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8c%97/" &gt;这篇文章&lt;/a&gt;使用&lt;strong&gt;Clash&lt;/strong&gt;或者其他软件进行&lt;strong&gt;科学上网&lt;/strong&gt;，这里不过多赘述&lt;/li&gt;&#10;&lt;li&gt;模块推荐：&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/Xposed-Modules-Repo/Hook.JiuWu.Xp/releases/download/20240501-3.5.4/HookVip-3.5.4-fix.apk" target="_blank" rel="noopener"&#10; &gt;HookVIP&lt;/a&gt;，目前&lt;strong&gt;最新的3.5.5与3.5.6已经失效&lt;/strong&gt;，只有&lt;strong&gt;3.5.4&lt;/strong&gt;可以正常使用&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/Xposed-Modules-Repo/vn.kwaiching.tao/releases/download/110-24.05.20/V24.05.20.apk" target="_blank" rel="noopener"&#10; &gt;道道道&lt;/a&gt;，功能很简单，&lt;strong&gt;破解一些VPN&lt;/strong&gt;应用会员，但是很好用&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/nining377/dolby_beta/releases/download/v3.5.4/dolby_beta_3.5.4_20220710-release.apk" target="_blank" rel="noopener"&#10; &gt;杜比大喇叭&lt;/a&gt;，一款&lt;strong&gt;网易云音乐&lt;/strong&gt;的音源代理模块。模块工作原理为音源替换而非破解，所以单曲付费与无版权歌曲有几率匹配错误，真心支持歌手请付费！&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Shizuku使用指北</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/shizuku%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/</link><pubDate>Sat, 12 Apr 2025 10:00:39 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/shizuku%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/shizuku.gif" alt="Featured image of post Shizuku使用指北" /&gt;&lt;h1 id="注shizuku支持系统android"&gt;注：Shizuku支持系统：Android&#10;&lt;/h1&gt;&lt;h1 id="下载并安装shizuku"&gt;下载并安装shizuku&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;点击&lt;a class="link" href="https://apt.izzysoft.de/fdroid/repo/moe.shizuku.privileged.api_1049.apk" target="_blank" rel="noopener"&#10; &gt;&lt;strong&gt;下载&lt;/strong&gt;&lt;/a&gt;，下载安装包（.apk）&lt;/li&gt;&#10;&lt;li&gt;点击安装包，&lt;strong&gt;安装&lt;/strong&gt;软件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h1 id="激活shizuku"&gt;激活shizuku&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;打开&lt;strong&gt;开发人员选项&lt;/strong&gt;&#10;通常是进入&lt;strong&gt;关于&lt;/strong&gt;后点击&lt;strong&gt;版本号&lt;/strong&gt;5或7次，可能会要求输入密码，不同品牌可能会有区别，视情况而定&lt;/li&gt;&#10;&lt;li&gt;进入&lt;strong&gt;开发人员选项&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;找到调试一栏中的&lt;strong&gt;USB调试&lt;/strong&gt;和&lt;strong&gt;仅充电模式下允许ADB调试&lt;/strong&gt;（没有仅充电模式下允许ADB调试可以不开），将其开启&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="接下来的步骤会分为两大类请视自己情况而定"&gt;接下来的步骤会分为两大类，请视自己情况而定&#10;&lt;/h2&gt;&lt;p&gt;若在调试一栏中找到&lt;strong&gt;无线调试&lt;/strong&gt;，可以跳转到&lt;a class="link" href="#%e9%80%9a%e8%bf%87%e6%97%a0%e7%ba%bf%e8%b0%83%e8%af%95%e5%90%af%e5%8a%a8" &gt;&lt;strong&gt;下一章节&lt;/strong&gt;&lt;/a&gt;&#10;若没有无线调试，请准备一台搭载&lt;strong&gt;Windows系统的电脑&lt;/strong&gt;并继续往下看&lt;/p&gt;&#10;&lt;h1 id="通过电脑启动无无线调试适用于windows"&gt;通过电脑启动（无无线调试，适用于Windows）&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;下载&lt;a class="link" href="https://googledownloads.cn/android/repository/platform-tools-latest-windows.zip" target="_blank" rel="noopener"&#10; &gt;&lt;strong&gt;ADB调试工具&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;解压缩后将解压出来的文件夹重命名为adb并移动到C盘根目录（非必需，但是推荐这么做）&lt;/li&gt;&#10;&lt;li&gt;进入电脑&lt;strong&gt;设置&lt;/strong&gt;，搜索&lt;strong&gt;高级系统设置&lt;/strong&gt;并进入&lt;/li&gt;&#10;&lt;li&gt;选择&lt;strong&gt;环境变量&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;点击&lt;strong&gt;系统变量&lt;/strong&gt;一栏中的&lt;strong&gt;path&lt;/strong&gt;并双击进行编辑&lt;/li&gt;&#10;&lt;li&gt;点击右侧&lt;strong&gt;新建&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;输入刚才的&lt;strong&gt;文件路径&lt;/strong&gt;（C:\adb）&lt;/li&gt;&#10;&lt;li&gt;然后一路确定，&lt;strong&gt;保存并退出&lt;/strong&gt;&#10;&lt;img alt="adb" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://e6b0d3c5.newhugoblog.pages.dev/images/adb.webp"&gt;&lt;/li&gt;&#10;&lt;li&gt;接下来将手机（或其他设备）连接电脑，&lt;/li&gt;&#10;&lt;li&gt;打开&lt;strong&gt;cmd&lt;/strong&gt;（直接在搜索栏输入并回车），输入adb devices，此时若正确开起了开发人员选项中的USB调试，此时设备上可能会出现&lt;strong&gt;是否允许调试&lt;/strong&gt;的对话框，勾选&lt;strong&gt;总是允许&lt;/strong&gt;，接下来可以在通知中心看到USB调试的信息&lt;/li&gt;&#10;&lt;li&gt;再次在终端中输入adb devices，如无问题将会看到类似如下内容&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;List of devices attached&#10;XXX device&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="12"&gt;&#10;&lt;li&gt;复制以下指令并粘贴到cmd中，如无问题你将会在 Shizuku 中看到已启动成功&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;adb shell sh /sdcard/Android/data/moe.shizuku.privileged.api/start.sh&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="该启动方式适用于未-root-且运行-android-10-及以下版本或者harmonyos的设备很不幸该启动方式需要连接电脑且由于系统限制每次重新启动后都需要再次进行启动步骤"&gt;该启动方式适用于未 root 且运行 Android 10 及以下版本或者HarmonyOS的设备。很不幸，该启动方式需要连接电脑。且由于系统限制，每次重新启动后都需要再次进行启动步骤&#10;&lt;/h2&gt;&lt;h1 id="通过无线调试启动"&gt;通过无线调试启动&#10;&lt;/h1&gt;&lt;ol&gt;&#10;&lt;li&gt;进入开发人员选项中的&lt;strong&gt;无线调试&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;启用&lt;/strong&gt;无线调试&lt;/li&gt;&#10;&lt;li&gt;配对（仅需一次）&#10;&lt;ol&gt;&#10;&lt;li&gt;在 Shizuku 内开始&lt;strong&gt;配对&lt;/strong&gt;&#10;&lt;img alt="shi" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://shizuku.rikka.app/images/start_paring_from_shizuku.webp"&gt;&lt;/li&gt;&#10;&lt;li&gt;点按无线调试中的&lt;strong&gt;使用配对码配对设备&lt;/strong&gt;&#10;&lt;img alt="zu" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://shizuku.rikka.app/images/start_pairing.webp"&gt;&lt;/li&gt;&#10;&lt;li&gt;在Shizuku的&lt;strong&gt;通知&lt;/strong&gt;中&lt;strong&gt;填入配对码&lt;/strong&gt;&#10;&lt;img alt="ku" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://shizuku.rikka.app/images/enter_pairing_code.webp"&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;启动Shizuku&#10;&lt;img alt="shizukucontact" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://shizuku.rikka.app/images/start_shizuku.webp"&gt;&#10;如果无法启动，尝试禁用并启用无线调试&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="通过无线调试启动适用于-android-11-或以上版本这种启动方式无需连接电脑由于系统限制每次重新启动后都需要再次进行启动步骤"&gt;通过无线调试启动适用于 Android 11 或以上版本。这种启动方式无需连接电脑。由于系统限制，每次重新启动后都需要再次进行启动步骤&#10;&lt;/h2&gt;&lt;h1 id="通过-root-启动"&gt;通过 root 启动&#10;&lt;/h1&gt;&lt;p&gt;如果您的设备已经 root，直接启动即可&lt;/p&gt;&#10;&lt;h1 id="常见问题"&gt;常见问题&#10;&lt;/h1&gt;&lt;p&gt;许多厂商对 Android 系统进行了修改，这会造成 Shizuku 无法正常工作。&lt;/p&gt;&#10;&lt;h2 id="通过无线调试启动一直显示正在搜索配对服务"&gt;通过无线调试启动：一直显示“正在搜索配对服务”&#10;&lt;/h2&gt;&lt;p&gt;请允许 Shizuku 在后台运行。&#10;搜索配对服务需要访问本地网络，许多厂商在应用不可见后立刻禁止应用访问网络。您可以在网络上搜索如何在您的设备上允许应用在后台运行。&lt;/p&gt;&#10;&lt;h2 id="通过无线调试启动点击输入配对码后立刻提示失败"&gt;通过无线调试启动：点击“输入配对码”后立刻提示失败&#10;&lt;/h2&gt;&lt;p&gt;MIUI（小米、POCO）&#10;在系统设置的“通知管理”-“通知显示设置”将通知样式切换为“原生样式”。&lt;/p&gt;&#10;&lt;h2 id="通过无线调试启动通过连接电脑启动adb-权限受限"&gt;通过无线调试启动/通过连接电脑启动：adb 权限受限&#10;&lt;/h2&gt;&lt;h3 id="miui小米poco"&gt;MIUI（小米、POCO）&#10;&lt;/h3&gt;&lt;p&gt;在“开发者选项”中开启“USB 调试（安全设置）”。注意，这和“USB 调试”是两个分开的选项。&lt;/p&gt;&#10;&lt;h3 id="colorosoppo--oneplus"&gt;ColorOS（OPPO &amp;amp; OnePlus）&#10;&lt;/h3&gt;&lt;p&gt;在“开发者选项”中关闭“权限监控”。&lt;/p&gt;&#10;&lt;h3 id="flyme魅族"&gt;Flyme（魅族）&#10;&lt;/h3&gt;&lt;p&gt;在“开发者选项”中关闭“Flyme 支付保护”。&lt;/p&gt;&#10;&lt;h2 id="通过无线调试启动通过连接电脑启动shizuku-随机停止"&gt;通过无线调试启动/通过连接电脑启动：Shizuku 随机停止&#10;&lt;/h2&gt;&lt;h3 id="所有设备"&gt;所有设备&#10;&lt;/h3&gt;&lt;p&gt;保证 Shizuku 可以在后台运行。&lt;/p&gt;&#10;&lt;p&gt;不要关闭“USB 调试”及“开发者选项”。&lt;/p&gt;&#10;&lt;p&gt;在“开发者选项”中将 USB 使用模式改为“仅充电”。&lt;/p&gt;&#10;&lt;p&gt;在 Android 8 上的选项是“选择 USB 配置”-“仅充电”。&#10;在 Android 9 及以上版本上选项是“默认 USB 配置”-“不进行数据传输”。&lt;/p&gt;&#10;&lt;p&gt;（Android 11+）启用“停用 adb 授权超时功能”选项&lt;/p&gt;&#10;&lt;h3 id="emui-华为"&gt;EMUI (华为)&#10;&lt;/h3&gt;&lt;p&gt;在“开发者选项”中开启「“仅充电”模式下允许 ADB 调试选项」。&lt;/p&gt;&#10;&lt;h3 id="miui小米poco-1"&gt;MIUI（小米、POCO）&#10;&lt;/h3&gt;&lt;p&gt;不要使用“手机管家”的扫描功能，因为它会禁用开发者选项。&lt;/p&gt;&#10;&lt;h3 id="sony"&gt;Sony&#10;&lt;/h3&gt;&lt;p&gt;不要点击连接 USB 后弹出的对话框，因为这会导致 USB 使用模式发生变化。&lt;/p&gt;&#10;&lt;h2 id="通过-root-启动无法开机启动"&gt;通过 root 启动：无法开机启动&#10;&lt;/h2&gt;&lt;p&gt;请允许 Shizuku 在后台运行。&lt;/p&gt;&#10;</description></item><item><title>Clash使用指北</title><link>https://e6b0d3c5.newhugoblog.pages.dev/posts/clash%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/</link><pubDate>Fri, 04 Apr 2025 19:53:20 +0800</pubDate><guid>https://e6b0d3c5.newhugoblog.pages.dev/posts/clash%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/</guid><description>&lt;img src="https://e6b0d3c5.newhugoblog.pages.dev/images/clashforwindows.webp" alt="Featured image of post Clash使用指北" /&gt;&lt;p&gt;&lt;em&gt;墙国有我，请挡放心&lt;/em&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h1 id="此文档为学习交流而分享建议您在下载后24小时内删除如有版权问题请告知我将第一时间处理请注意使用产生的责任需由使用者自行承担"&gt;此文档为学习交流而分享，建议您在下载后24小时内删除。如有版权问题请告知，我将第一时间处理。请注意，使用产生的责任需由使用者自行承担。&#10;&lt;/h1&gt;&lt;p&gt;&lt;em&gt;尽量使用浏览器打开本文章（如edge），而非微信内置浏览器等&lt;/em&gt;&lt;/p&gt;&#10;&lt;h1 id="注意clash支持系统androidwindowsmacos本教程不涉及"&gt;注意：Clash支持系统：Android，Windows，MacOS（本教程不涉及）&#10;&lt;/h1&gt;&lt;p&gt;iOS及iPadOS可以使用Spectre或者Shadowrocket，以及hidify，请自行去App Store下载。&lt;/p&gt;&#10;&lt;h2 id="windows安装及使用以clash-verge-rev为例"&gt;Windows安装及使用（以Clash Verge Rev为例）：&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://down.clashcn.com/soft/CVR/clashcn.com_Clash.Verge_2.1.2_x64-setup.exe" target="_blank" rel="noopener"&#10; &gt;下载Clash Verge Rev&lt;/a&gt;，双击安装包并安装（若申请管理员权限则允许），步骤如下&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;选择语言（推荐中文简体），点击&lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;点击&lt;strong&gt;下一步&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;点击&lt;strong&gt;下一步&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;点击&lt;strong&gt;安装&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;等待&lt;/li&gt;&#10;&lt;li&gt;点击&lt;strong&gt;下一步&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;点击&lt;strong&gt;完成&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;后续可能会申请两次管理员权限，&lt;strong&gt;允许&lt;/strong&gt;即可&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;导入配置文件&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;若配置文件需从链接下载，则点击左侧&lt;strong&gt;订阅&lt;/strong&gt;，在页面上方&lt;strong&gt;订阅文件链接&lt;/strong&gt;处输入链接，点击右侧&lt;strong&gt;导入&lt;/strong&gt;即可。&lt;/li&gt;&#10;&lt;li&gt;若配置文件在本地，则只需将&lt;strong&gt;文件&lt;/strong&gt;拖拽进&lt;strong&gt;窗口&lt;/strong&gt;即可&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;使用&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;点击左侧&lt;strong&gt;设置&lt;/strong&gt;，点击左列&lt;strong&gt;系统代理&lt;/strong&gt;即可使用，不需要时可直接&lt;strong&gt;关闭系统代理&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;推荐打开：&lt;strong&gt;开机自启&lt;/strong&gt;；&lt;strong&gt;静默启动&lt;/strong&gt;；&lt;strong&gt;局域网链接&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;局域网链接说明：对于部分无法使用clash客户端的设备，可通过这种方式实现曲线救国，具体操作如下：&lt;/li&gt;&#10;&lt;li&gt;点进设置并与电脑链接在同一局域网，点进网络详情，将&lt;strong&gt;http代理&lt;/strong&gt;切换为&lt;strong&gt;手动&lt;/strong&gt;，服务器填写为电脑的内网&lt;strong&gt;IP地址&lt;/strong&gt;，可点击clash设置中&lt;strong&gt;局域网链接&lt;/strong&gt;旁边的有三个连接在一起的方块的&lt;strong&gt;图标&lt;/strong&gt;查看，上面的&lt;strong&gt;IP地址&lt;/strong&gt;即为所要&lt;/li&gt;&#10;&lt;li&gt;端口默认是&lt;strong&gt;7897&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;关闭鉴定&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="android安装及使用"&gt;Android安装及使用&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://down.clashcn.com/soft/clashcn.com_cmfa-2.11.7-meta-universal-release.apk" target="_blank" rel="noopener"&#10; &gt;下载Clash Meta for Android&lt;/a&gt;，点击&lt;strong&gt;安装包&lt;/strong&gt;（文件后缀为apk），安装&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;打开Clash Meta for Android，点击&lt;strong&gt;配置&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击右上角&lt;strong&gt;加号&lt;/strong&gt;，然后导入&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;若配置文件需从链接下载，则点击&lt;strong&gt;从URL导入&lt;/strong&gt;，输入链接后点击右上角&lt;strong&gt;保存按钮&lt;/strong&gt;&lt;/li&gt;&#10;&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;strong&gt;保存按钮&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;回到主页，点击&lt;strong&gt;启动&lt;/strong&gt;，若申请权限则&lt;strong&gt;同意&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;点击&lt;strong&gt;代理&lt;/strong&gt;可选择节点，若想停止只需回到主页，点击&lt;strong&gt;运行中&lt;/strong&gt;（蓝色的图标）即可停止&lt;/p&gt;&#10;&lt;p&gt;部分Android手机在控制中心可以自定义快捷开关，可以将&lt;strong&gt;Clash Meta快捷开关&lt;/strong&gt;添加到控制中心，以方便使用&#10;部分情况下会碰到&lt;strong&gt;无法添加配置文件&lt;/strong&gt;的情况，可以多尝试几次，不排除是服务器或软件的问题&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;文章可能会继续更新以补充使用技巧，文章中所有下载链接来自&lt;a class="link" href="https://clashcn.com/" target="_blank" rel="noopener"&#10; &gt;Clash中文网&lt;/a&gt;&lt;/p&gt;&#10;</description></item></channel></rss>