From 8fbc962f669ee064a3a337e15b430d440b142526 Mon Sep 17 00:00:00 2001 From: cmliu Date: Thu, 12 Dec 2024 04:39:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=91=E5=AE=9A=E5=90=8D=E4=B8=BA'KV'?= =?UTF-8?q?=E7=9A=84KV=E7=A9=BA=E9=97=B4=EF=BC=8C=E5=8D=B3=E5=8F=AF?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E6=B7=BB=E5=8A=A0=E4=BD=A0=E7=9A=84=E8=87=AA?= =?UTF-8?q?=E5=BB=BA=E8=8A=82=E7=82=B9=E9=93=BE=E6=8E=A5=E5=92=8C=E6=9C=BA?= =?UTF-8?q?=E5=9C=BA=E8=AE=A2=E9=98=85=E9=93=BE=E6=8E=A5=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 52 ++++--------- _worker.js | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 226 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index b14eba0..3a3ac1d 100644 --- a/README.md +++ b/README.md @@ -21,15 +21,14 @@ Telegram交流群:[@CMLiussss](https://t.me/CMLiussss),**感谢[Alice Networ - 添加 `TOKEN` 变量,快速订阅访问入口,默认值为: `auto` ,获取订阅器默认节点订阅地址即 `/auto` ,例如 `https://sub.fuck.cloudns.biz/auto` ### 4. 添加你的节点和订阅链接: - - 添加 `LINK` 变量,参数添加你的自建节点链接和机场订阅链接,确保每行一个链接,例如: - ``` - vless://b7a392e2-4ef0-4496-90bc-1c37bb234904@cf.090227.xyz:443?encryption=none&security=tls&sni=edgetunnel-2z2.pages.dev&fp=random&type=ws&host=edgetunnel-2z2.pages.dev&path=%2F%3Fed%3D2048#%E5%8A%A0%E5%85%A5%E6%88%91%E7%9A%84%E9%A2%91%E9%81%93t.me%2FCMLiussss%E8%A7%A3%E9%94%81%E6%9B%B4%E5%A4%9A%E4%BC%98%E9%80%89%E8%8A%82%E7%82%B9 -vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIuWKoOWFpeaIkeeahOmikemBk3QubWUvQ01MaXVzc3Nz6Kej6ZSB5pu05aSa5LyY6YCJ6IqC54K5PuiLseWbvSDlgKvmlabph5Hono3ln44iLA0KICAiYWRkIjogImNmLjA5MDIyNy54eXoiLA0KICAicG9ydCI6ICI4NDQzIiwNCiAgImlkIjogIjAzZmNjNjE4LWI5M2QtNjc5Ni02YWVkLThhMzhjOTc1ZDU4MSIsDQogICJhaWQiOiAiMCIsDQogICJzY3kiOiAiYXV0byIsDQogICJuZXQiOiAid3MiLA0KICAidHlwZSI6ICJub25lIiwNCiAgImhvc3QiOiAicHBmdjJ0bDl2ZW9qZC1tYWlsbGF6eS5wYWdlcy5kZXYiLA0KICAicGF0aCI6ICIvamFkZXIuZnVuOjQ0My9saW5rdndzIiwNCiAgInRscyI6ICJ0bHMiLA0KICAic25pIjogInBwZnYydGw5dmVvamQtbWFpbGxhenkucGFnZXMuZGV2IiwNCiAgImFscG4iOiAiIiwNCiAgImZwIjogIiINCn0= - https://sub.xf.free.hr/auto - https://hy2sub.pages.dev - ``` - - + 1. 绑定名为`KV`的KV空间; + 2. 访问 `https://sub.fuck.cloudns.biz/auto`,添加你的自建节点链接和机场订阅链接,确保每行一个链接,例如: + ``` + vless://b7a392e2-4ef0-4496-90bc-1c37bb234904@cf.090227.xyz:443?encryption=none&security=tls&sni=edgetunnel-2z2.pages.dev&fp=random&type=ws&host=edgetunnel-2z2.pages.dev&path=%2F%3Fed%3D2048#%E5%8A%A0%E5%85%A5%E6%88%91%E7%9A%84%E9%A2%91%E9%81%93t.me%2FCMLiussss%E8%A7%A3%E9%94%81%E6%9B%B4%E5%A4%9A%E4%BC%98%E9%80%89%E8%8A%82%E7%82%B9 + vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIuWKoOWFpeaIkeeahOmikemBk3QubWUvQ01MaXVzc3Nz6Kej6ZSB5pu05aSa5LyY6YCJ6IqC54K5PuiLseWbvSDlgKvmlabph5Hono3ln44iLA0KICAiYWRkIjogImNmLjA5MDIyNy54eXoiLA0KICAicG9ydCI6ICI4NDQzIiwNCiAgImlkIjogIjAzZmNjNjE4LWI5M2QtNjc5Ni02YWVkLThhMzhjOTc1ZDU4MSIsDQogICJhaWQiOiAiMCIsDQogICJzY3kiOiAiYXV0byIsDQogICJuZXQiOiAid3MiLA0KICAidHlwZSI6ICJub25lIiwNCiAgImhvc3QiOiAicHBmdjJ0bDl2ZW9qZC1tYWlsbGF6eS5wYWdlcy5kZXYiLA0KICAicGF0aCI6ICIvamFkZXIuZnVuOjQ0My9saW5rdndzIiwNCiAgInRscyI6ICJ0bHMiLA0KICAic25pIjogInBwZnYydGw5dmVvamQtbWFpbGxhenkucGFnZXMuZGV2IiwNCiAgImFscG4iOiAiIiwNCiAgImZwIjogIiINCn0= + https://sub.xf.free.hr/auto + https://hy2sub.pages.dev + ``` ## Workers 部署方法 ### 1. 部署 Cloudflare Worker: @@ -54,37 +53,18 @@ vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIuWKoOWFpeaIkeeahOmikemBk3QubWUvQ01MaXVz ### 3. 添加你的节点或订阅链接: - -**3.1 修改 MainData 参数示例** - - - 修改 `MainData` 参数添加你的自建节点,例如: - - ```js - const MainData = ` - vless://b7a392e2-4ef0-4496-90bc-1c37bb234904@cf.090227.xyz:443?encryption=none&security=tls&sni=edgetunnel-2z2.pages.dev&fp=random&type=ws&host=edgetunnel-2z2.pages.dev&path=%2F%3Fed%3D2048#%E5%8A%A0%E5%85%A5%E6%88%91%E7%9A%84%E9%A2%91%E9%81%93t.me%2FCMLiussss%E8%A7%A3%E9%94%81%E6%9B%B4%E5%A4%9A%E4%BC%98%E9%80%89%E8%8A%82%E7%82%B9 - vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIuWKoOWFpeaIkeeahOmikemBk3QubWUvQ01MaXVzc3Nz6Kej6ZSB5pu05aSa5LyY6YCJ6IqC54K5PuiLseWbvSDlgKvmlabph5Hono3ln44iLA0KICAiYWRkIjogImNmLjA5MDIyNy54eXoiLA0KICAicG9ydCI6ICI4NDQzIiwNCiAgImlkIjogIjAzZmNjNjE4LWI5M2QtNjc5Ni02YWVkLThhMzhjOTc1ZDU4MSIsDQogICJhaWQiOiAiMCIsDQogICJzY3kiOiAiYXV0byIsDQogICJuZXQiOiAid3MiLA0KICAidHlwZSI6ICJub25lIiwNCiAgImhvc3QiOiAicHBmdjJ0bDl2ZW9qZC1tYWlsbGF6eS5wYWdlcy5kZXYiLA0KICAicGF0aCI6ICIvamFkZXIuZnVuOjQ0My9saW5rdndzIiwNCiAgInRscyI6ICJ0bHMiLA0KICAic25pIjogInBwZnYydGw5dmVvamQtbWFpbGxhenkucGFnZXMuZGV2IiwNCiAgImFscG4iOiAiIiwNCiAgImZwIjogIiINCn0= - ` - ``` -注意!`MainData`参数的特殊引号必须保留,否则代码异常。 - - - - **3.2 修改 urls 参数示例** - - - 修改 `urls` 参数,在脚本中设置 `urls` 变量为 你的订阅链接 的 URL。例如: - - ```js - const urls = [ - 'https://sub.xf.free.hr/auto', - 'https://hy2sub.pages.dev', - ]; - ``` -注意!订阅链接内容必须为`base64`格式。 + 1. 绑定名为`KV`的KV空间; + 2. 访问 `https://sub.cmliussss.workers.dev/auto`,添加你的自建节点链接和机场订阅链接,确保每行一个链接,例如: + ``` + vless://b7a392e2-4ef0-4496-90bc-1c37bb234904@cf.090227.xyz:443?encryption=none&security=tls&sni=edgetunnel-2z2.pages.dev&fp=random&type=ws&host=edgetunnel-2z2.pages.dev&path=%2F%3Fed%3D2048#%E5%8A%A0%E5%85%A5%E6%88%91%E7%9A%84%E9%A2%91%E9%81%93t.me%2FCMLiussss%E8%A7%A3%E9%94%81%E6%9B%B4%E5%A4%9A%E4%BC%98%E9%80%89%E8%8A%82%E7%82%B9 + vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIuWKoOWFpeaIkeeahOmikemBk3QubWUvQ01MaXVzc3Nz6Kej6ZSB5pu05aSa5LyY6YCJ6IqC54K5PuiLseWbvSDlgKvmlabph5Hono3ln44iLA0KICAiYWRkIjogImNmLjA5MDIyNy54eXoiLA0KICAicG9ydCI6ICI4NDQzIiwNCiAgImlkIjogIjAzZmNjNjE4LWI5M2QtNjc5Ni02YWVkLThhMzhjOTc1ZDU4MSIsDQogICJhaWQiOiAiMCIsDQogICJzY3kiOiAiYXV0byIsDQogICJuZXQiOiAid3MiLA0KICAidHlwZSI6ICJub25lIiwNCiAgImhvc3QiOiAicHBmdjJ0bDl2ZW9qZC1tYWlsbGF6eS5wYWdlcy5kZXYiLA0KICAicGF0aCI6ICIvamFkZXIuZnVuOjQ0My9saW5rdndzIiwNCiAgInRscyI6ICJ0bHMiLA0KICAic25pIjogInBwZnYydGw5dmVvamQtbWFpbGxhenkucGFnZXMuZGV2IiwNCiAgImFscG4iOiAiIiwNCiAgImZwIjogIiINCn0= + https://sub.xf.free.hr/auto + https://hy2sub.pages.dev + ``` ## 变量说明 | 变量名 | 示例 | 备注 | |--------|---------|-----| -| LINK | `vless://b7a39...` `vmess://ew0K...` `https://sub...` | 可同时放入多个节点链接与多个订阅链接, 链接之间用换行做间隔 | | TOKEN | `auto` | 快速订阅内置节点的订阅路径地址 /auto | | TGTOKEN | `6894123456:XXXXXXXXXX0qExVsBPUhHDAbXXXXXqWXgBA` | 发送TG通知的机器人token | | TGID | `6946912345` | 接收TG通知的账户数字ID | diff --git a/_worker.js b/_worker.js index 582f915..01cddfd 100644 --- a/_worker.js +++ b/_worker.js @@ -40,9 +40,12 @@ export default { } subconfig = env.SUBCONFIG || subconfig; FileName = env.SUBNAME || FileName; - MainData = env.LINK || MainData; - if(env.LINKSUB) urls = await ADD(env.LINKSUB); - + if (env.KV) { + MainData = await env.KV.get('/LINK.txt') || MainData; + } else { + MainData = env.LINK || MainData; + if (env.LINKSUB) urls = await ADD(env.LINKSUB); + } const currentDate = new Date(); currentDate.setHours(0, 0, 0, 0); const timeTemp = Math.ceil(currentDate.getTime() / 1000); @@ -78,7 +81,12 @@ export default { }, }); } else { - await sendMessage(`#获取订阅 ${FileName}`, request.headers.get('CF-Connecting-IP'), `UA: ${userAgentHeader}\n域名: ${url.hostname}\n入口: ${url.pathname + url.search}`); + if (env.KV && 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'); + } else { + await sendMessage(`#获取订阅 ${FileName}`, request.headers.get('CF-Connecting-IP'), `UA: ${userAgentHeader}\n域名: ${url.hostname}\n入口: ${url.pathname + url.search}`); + } let 订阅格式 = 'base64'; if (userAgent.includes('null') || userAgent.includes('subconverter') || userAgent.includes('nekobox') || userAgent.includes(('CF-Workers-SUB').toLowerCase())){ 订阅格式 = 'base64'; @@ -457,4 +465,202 @@ async function getUrl(request, targetUrl, 追加UA, userAgentHeader) { function isValidBase64(str) { const base64Regex = /^[A-Za-z0-9+/=]+$/; return base64Regex.test(str); +} + +async function KV(request, env, txt = '/ADD.txt') { + const url = new URL(request.url); + try { + // POST请求处理 + if (request.method === "POST") { + if (!env.KV) return new Response("未绑定KV空间", { status: 400 }); + try { + const content = await request.text(); + await env.KV.put(txt, content); + return new Response("保存成功"); + } catch (error) { + console.error('保存KV时发生错误:', error); + return new Response("保存失败: " + error.message, { status: 500 }); + } + } + + // GET请求部分 + let content = ''; + let hasKV = !!env.KV; + + if (hasKV) { + try { + content = await env.KV.get(txt) || ''; + } catch (error) { + console.error('读取KV时发生错误:', error); + content = '读取数据时发生错误: ' + error.message; + } + } + + const html = ` + + + + ${FileName} 订阅编辑 + + + + + + ################################################################
+ Subscribe / sub 订阅地址, 支持 Base64、clash-meta、sing-box 订阅格式
+ ---------------------------------------------------------------
+ 自适应订阅地址:
+ https://${url.hostname}/${mytoken}
+
+ Base64订阅地址:
+ https://${url.hostname}/${mytoken}?b64
+
+ clash订阅地址:
+ https://${url.hostname}/${mytoken}?clash
+
+ singbox订阅地址:
+ https://${url.hostname}/${mytoken}?sb
+
+ surge订阅地址:
+ https://${url.hostname}/${mytoken}?surge
+
+ loon订阅地址:
+ https://${url.hostname}/${mytoken}?loon
+ + ---------------------------------------------------------------
+ ################################################################
+
+ ${FileName} 汇聚订阅编辑: +
+ ${hasKV ? ` + +
+ + + +
+ ` : '

未绑定KV空间

'} +
+
+ ################################################################
+ ${decodeURIComponent(atob('dGVsZWdyYW0lMjAlRTQlQkElQTQlRTYlQjUlODElRTclQkUlQTQlMjAlRTYlOEElODAlRTYlOUMlQUYlRTUlQTQlQTclRTQlQkQlQUMlN0UlRTUlOUMlQTglRTclQkElQkYlRTUlOEYlOTElRTclODklOEMhJTNDYnIlM0UKJTNDYSUyMGhyZWYlM0QlMjdodHRwcyUzQSUyRiUyRnQubWUlMkZDTUxpdXNzc3MlMjclM0VodHRwcyUzQSUyRiUyRnQubWUlMkZDTUxpdXNzc3MlM0MlMkZhJTNFJTNDYnIlM0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJTNDYnIlM0UKZ2l0aHViJTIwJUU5JUExJUI5JUU3JTlCJUFFJUU1JTlDJUIwJUU1JTlEJTgwJTIwU3RhciFTdGFyIVN0YXIhISElM0NiciUzRQolM0NhJTIwaHJlZiUzRCUyN2h0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmNtbGl1JTJGQ0YtV29ya2Vycy1TVUIlMjclM0VodHRwcyUzQSUyRiUyRmdpdGh1Yi5jb20lMkZjbWxpdSUyRkNGLVdvcmtlcnMtU1VCJTNDJTJGYSUzRSUzQ2JyJTNFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSUzQ2JyJTNFCiUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMyUyMw=='))} + + + + + `; + + return new Response(html, { + headers: { "Content-Type": "text/html;charset=utf-8" } + }); + } catch (error) { + console.error('处理请求时发生错误:', error); + return new Response("服务器错误: " + error.message, { + status: 500, + headers: { "Content-Type": "text/plain;charset=utf-8" } + }); + } } \ No newline at end of file