From e404e658fb3ccb0dc4694b8cb07f1da7111b3c6d Mon Sep 17 00:00:00 2001 From: cmliu Date: Wed, 22 Jan 2025 02:48:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0README.md=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=AE=BF=E5=AE=A2=E8=AE=A2=E9=98=85=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E5=92=8C=E6=B3=A8=E6=84=8F=E4=BA=8B=E9=A1=B9=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=5Fworker.js=EF=BC=8C=E6=B7=BB=E5=8A=A0=E8=AE=BF?= =?UTF-8?q?=E5=AE=A2=E8=AE=A2=E9=98=85=E5=8A=9F=E8=83=BD=E5=8F=8A=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 +++++++++++++++++++++----------- _worker.js | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 6c95188..7c97df0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,15 @@ ![自建汇聚订阅 CF-Workers-SUB](./sub.png) -> 这是一个将多个节点和订阅合并为单一链接的工具,支持自动适配与自定义分流,简化了订阅管理。 +这是一个将多个节点和订阅合并为单一链接的工具,支持自动适配与自定义分流,简化了订阅管理。 + +> [!CAUTION] +> **汇聚订阅非base64订阅时**,会自动生成一个**有效期为24小时的临时订阅**,并提交给**订阅转换后端**来完成订阅转换,可避免您的汇聚订阅地址泄露。 + +> [!WARNING] +> **汇聚订阅非base64订阅时**,如果您的节点数量**十分庞大**,订阅转换后端将需要较长时间才能完成订阅转换,这会导致部分梯子客户端在订阅时提示超时而无法完成订阅(说直白一点就是**汇聚节点池的节点时容易导致Clash订阅超时**)! +> +> 可自行删减订阅节点数量,提高订阅转换效率! ## 🛠 功能特点 1. **节点链接自动转换成base64订阅链接:** 这是最基础的功能,可以将您的节点自动转换为base64格式的订阅链接; @@ -12,7 +20,7 @@ 5. **更多功能等待发掘...** ## 🎬 视频教程 -- **CF-Workers-SUB 视频教程**: https://www.youtube.com/watch?v=w6rRY4FDd58 +- **[自建订阅!CF-Workers-SUB 教你如何将多节点多订阅汇聚合并为一个订阅!](https://youtu.be/w6rRY4FDd58)** ## 🤝 社区支持 - Telegram 交流群: [@CMLiussss](https://t.me/CMLiussss) @@ -89,14 +97,16 @@ ## 📋 变量说明 -| 变量名 | 示例 | 备注 | -|--------|---------|-----| -| TOKEN | `auto` | 快速订阅内置节点的订阅路径地址 /auto | -| TGTOKEN | `6894123456:XXXXXXXXXX0qExVsBPUhHDAbXXXXXqWXgBA` | 发送TG通知的机器人token | -| TGID | `6946912345` | 接收TG通知的账户数字ID | -| SUBNAME | `CF-Workers-SUB` | 订阅名称 | -| SUBAPI | `subapi.fxxk.dedyn.io` | clash、singbox等 订阅转换后端 | -| SUBCONFIG | [https://raw.github.../ACL4SSR_Online_MultiCountry.ini](https://raw.githubusercontent.com/cmliu/ACL4SSR/main/Clash/config/ACL4SSR_Online_MultiCountry.ini) | clash、singbox等 订阅转换配置文件 | +| 变量名 | 示例 | 必填 | 备注 | +|-|-|-|-| +| TOKEN | `auto` | ✅ | 汇聚订阅的订阅配置路径地址,例如:`/auto` | +| GUEST | `test` | ❌ | 汇聚订阅的访客订阅TOKEN,例如:`/sub?token=test` | +| LINK | `vless://b7a39...`,`vmess://ew0K...`,`https://sub...` | ❌ | 可同时放入多个节点链接与多个订阅链接,链接之间用换行做间隔(添加**KV命名空间**后,变量将不会使用)| +| TGTOKEN | `6894123456:XXXXXXXXXX0qExVsBPUhHDAbXXXXXqWXgBA` | ❌ | 发送TG通知的机器人token | +| TGID | `6946912345` | ❌ | 接收TG通知的账户数字ID | +| SUBNAME | `CF-Workers-SUB` | ❌ | 订阅名称 | +| SUBAPI | `subapi.fxxk.dedyn.io` | ❌ | clash、singbox等 订阅转换后端 | +| SUBCONFIG | [https://raw.github.../ACL4SSR_Online_MultiCountry.ini](https://raw.githubusercontent.com/cmliu/ACL4SSR/main/Clash/config/ACL4SSR_Online_MultiCountry.ini) | ❌ | clash、singbox等 订阅转换配置文件 | ## ⚠️ 注意事项 @@ -108,4 +118,4 @@ # 🙏 致谢 -[Alice Networks LTD](https://alicenetworks.net/),[mianayang](https://github.com/mianayang/myself/blob/main/cf-workers/sub/sub.js)、[ACL4SSR](https://github.com/ACL4SSR/ACL4SSR/tree/master/Clash/config)、[肥羊](https://github.com/youshandefeiyang/sub-web-modify) +[Alice Networks LTD](https://alicenetworks.net/),[mianayang](https://github.com/mianayang/myself/blob/main/cf-workers/sub/sub.js)、[ACL4SSR](https://github.com/ACL4SSR/ACL4SSR/tree/master/Clash/config)、[肥羊](https://sub.v1.mk/) diff --git a/_worker.js b/_worker.js index 5475af8..2a09ee2 100644 --- a/_worker.js +++ b/_worker.js @@ -1,7 +1,8 @@ // 部署完成后在网址后面加上这个,获取自建节点和机场聚合节点,/?token=auto或/auto或 -let mytoken = 'auto'; //可以随便取,或者uuid生成,https://1024tools.com/uuid +let mytoken = 'auto'; +let guestToken = ''; //可以随便取,或者uuid生成,https://1024tools.com/uuid let BotToken = ''; //可以为空,或者@BotFather中输入/start,/newbot,并关注机器人 let ChatID = ''; //可以为空,或者@userinfobot中获取,/start let TG = 0; //小白勿动, 开发者专用,1 为推送所有的访问信息,0 为不推送订阅转换后端的访问信息与异常访问 @@ -50,6 +51,9 @@ export default { currentDate.setHours(0, 0, 0, 0); const timeTemp = Math.ceil(currentDate.getTime() / 1000); const fakeToken = await MD5MD5(`${mytoken}${timeTemp}`); + guestToken = env.GUESTTOKEN || env.GUEST || guestToken; + if (!guestToken) guestToken = await MD5MD5(mytoken); + const 访客订阅 = guestToken; //console.log(`${fakeUserID}\n${fakeHostName}`); // 打印fakeID let UD = Math.floor(((timestamp - Date.now()) / timestamp * total * 1099511627776) / 2); @@ -57,7 +61,7 @@ export default { let expire = Math.floor(timestamp / 1000); SUBUpdateTime = env.SUBUPTIME || SUBUpdateTime; - if (!(token == mytoken || token == fakeToken || url.pathname == ("/" + mytoken) || url.pathname.includes("/" + mytoken + "?"))) { + if (!([mytoken, fakeToken, 访客订阅].includes(token) || url.pathname == ("/" + mytoken) || url.pathname.includes("/" + mytoken + "?"))) { if (TG == 1 && url.pathname !== "/" && url.pathname !== "/favicon.ico") await sendMessage(`#异常访问 ${FileName}`, request.headers.get('CF-Connecting-IP'), `UA: ${userAgent}\n域名: ${url.hostname}\n入口: ${url.pathname + url.search}`); if (env.URL302) return Response.redirect(env.URL302, 302); else if (env.URL) return await proxyURL(env.URL, url); @@ -72,7 +76,7 @@ export default { await 迁移地址列表(env, 'LINK.txt'); if (userAgent.includes('mozilla') && !url.search) { await sendMessage(`#编辑订阅 ${FileName}`, request.headers.get('CF-Connecting-IP'), `UA: ${userAgentHeader}\n域名: ${url.hostname}\n入口: ${url.pathname + url.search}`); - return await KV(request, env, 'LINK.txt'); + return await KV(request, env, 'LINK.txt', 访客订阅); } else { MainData = await env.KV.get('LINK.txt') || MainData; } @@ -488,7 +492,7 @@ async function 迁移地址列表(env, txt = 'ADD.txt') { return false; } -async function KV(request, env, txt = 'ADD.txt') { +async function KV(request, env, txt = 'ADD.txt', guest) { const url = new URL(request.url); try { // POST请求处理 @@ -602,6 +606,31 @@ async function KV(request, env, txt = 'ADD.txt') { loon订阅地址:
https://${url.hostname}/${mytoken}?loon
+   查看访客订阅∨
+ ---------------------------------------------------------------
################################################################
订阅转换配置
@@ -760,6 +789,23 @@ async function KV(request, env, txt = 'ADD.txt') { timer = setTimeout(saveContent, 5000); }); } + + function toggleNotice() { + const noticeContent = document.getElementById('noticeContent'); + const noticeToggle = document.getElementById('noticeToggle'); + if (noticeContent.style.display === 'none' || noticeContent.style.display === '') { + noticeContent.style.display = 'block'; + noticeToggle.textContent = '隐藏访客订阅∧'; + } else { + noticeContent.style.display = 'none'; + noticeToggle.textContent = '查看访客订阅∨'; + } + } + + // 初始化 noticeContent 的 display 属性 + document.addEventListener('DOMContentLoaded', () => { + document.getElementById('noticeContent').style.display = 'none'; + });