<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>V2rayN on echo pale</title><link>https://0251e199.newhugoblog.pages.dev/tags/v2rayn/</link><description>Recent content in V2rayN on echo pale</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Mon, 14 Jul 2025 14:22:13 +0800</lastBuildDate><atom:link href="https://0251e199.newhugoblog.pages.dev/tags/v2rayn/index.xml" rel="self" type="application/rss+xml"/><item><title>使用cloudflare搭建VPN的实战演练及免费节点</title><link>https://0251e199.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://0251e199.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://0251e199.newhugoblog.pages.dev/images/cfvpneg2.webp" alt="Featured image of post 使用cloudflare搭建VPN的实战演练及免费节点" /&gt;&lt;h2 id="本文章为这篇文章的后续并提供免费示例"&gt;本文章为&lt;a class="link" href="https://0251e199.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://0251e199.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://0251e199.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://0251e199.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://0251e199.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://0251e199.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></channel></rss>