mirror of
https://github.com/lush2020/edgetunnel.git
synced 2026-03-21 08:52:43 +08:00
13
README.md
13
README.md
@@ -1,7 +1,7 @@
|
||||
# 🚀 edgetunnel 2.0
|
||||

|
||||
|
||||
- **edgetunnel 最新教程**:https://www.youtube.com/watch?v=tKe9xUuFODA ***必看内容!必看内容!必看内容!!!***
|
||||
- **Edgetunnel 图文教程**:https://cmliussss.com/p/edt2 ***必看内容!必看内容!必看内容!!!***
|
||||
- **报错 Error 1101 详解**:https://www.youtube.com/watch?v=r4uVTEJptdE
|
||||
|
||||
- Telegram交流群:[@CMLiussss](https://t.me/CMLiussss)
|
||||
@@ -32,7 +32,7 @@
|
||||
- 另外,您也可以选择自行部署 [WorkerVless2sub 订阅生成服务](https://github.com/cmliu/WorkerVless2sub),这样既可以利用订阅生成器的便利。
|
||||
|
||||
## 💡 如何使用?
|
||||
### ⚙️ Workers 部署方法 [视频教程](https://www.youtube.com/watch?v=tKe9xUuFODA&t=191s)
|
||||
### ⚙️ Workers 部署方法
|
||||
|
||||
<details>
|
||||
<summary><code><strong>「 Workers 部署文字教程 」</strong></code></summary>
|
||||
@@ -50,14 +50,13 @@
|
||||
3. 给 Workers绑定 自定义域:
|
||||
- 在 workers控制台的 `触发器`选项卡,下方点击 `添加自定义域`。
|
||||
- 填入你已转入 CF 域名解析服务的次级域名,例如:`vless.google.com`后 点击`添加自定义域`,等待证书生效即可。
|
||||
- **如果你是小白,你现在可以直接起飞,不用再往下看了!!!**
|
||||
|
||||
4. 访问后台:
|
||||
- 访问 `https://vless.google.com/admin` 输入管理员密码即可登录后台。
|
||||
|
||||
</details>
|
||||
|
||||
### 🛠 Pages 上传 部署方法 **最佳推荐!!!** [视频教程](https://www.youtube.com/watch?v=tKe9xUuFODA&t=436s)
|
||||
### 🛠 Pages 上传 部署方法 **最佳推荐!!!** [图文教程](https://cmliussss.com/p/edt2/)
|
||||
|
||||
<details>
|
||||
<summary><code><strong>「 Pages 上传文件部署文字教程 」</strong></code></summary>
|
||||
@@ -78,14 +77,13 @@
|
||||
- 填入你的自定义次级域名,注意不要使用你的根域名,例如:
|
||||
您分配到的域名是 `fuck.cloudns.biz`,则添加自定义域填入 `lizi.fuck.cloudns.biz`即可;
|
||||
- 按照 CF 的要求将返回你的域名DNS服务商,添加 该自定义域 `lizi`的 CNAME记录 `edgetunnel.pages.dev` 后,点击 `激活域`即可。
|
||||
- **如果你是小白,那么你的 pages 绑定`自定义域`之后即可直接起飞,不用再往下看了!!!**
|
||||
|
||||
4. 访问后台:
|
||||
- 访问 `https://lizi.fuck.cloudns.biz/admin` 输入管理员密码即可登录后台。
|
||||
|
||||
</details>
|
||||
|
||||
### 🛠 Pages GitHub 部署方法 [视频教程](https://www.youtube.com/watch?v=tKe9xUuFODA&t=317s)
|
||||
### 🛠 Pages GitHub 部署方法
|
||||
|
||||
<details>
|
||||
<summary><code><strong>「 Pages GitHub 部署文字教程 」</strong></code></summary>
|
||||
@@ -105,7 +103,6 @@
|
||||
- 填入你的自定义次级域名,注意不要使用你的根域名,例如:
|
||||
您分配到的域名是 `fuck.cloudns.biz`,则添加自定义域填入 `lizi.fuck.cloudns.biz`即可;
|
||||
- 按照 CF 的要求将返回你的域名DNS服务商,添加 该自定义域 `lizi`的 CNAME记录 `edgetunnel.pages.dev` 后,点击 `激活域`即可。
|
||||
- **如果你是小白,那么你的 pages 绑定`自定义域`之后即可直接起飞,不用再往下看了!!!**
|
||||
|
||||
4. 访问后台:
|
||||
- 访问 `https://lizi.fuck.cloudns.biz/admin` 输入管理员密码即可登录后台。
|
||||
@@ -126,7 +123,7 @@
|
||||
| GO2SOCKS5 | `blog.cmliussss.com`,`*.ip111.cn`,`*google.com` |❌| 设置`SOCKS5`或`HTTP`变量之后,可设置强制使用socks5访问名单(设置为`*`可作为全局代理) |
|
||||
|
||||
## 🔧 实用技巧
|
||||
该项目部署的节点可通过节点PATH(路径)的方式,使用指定的`PROXYIP`或`SOCKS5`!!!**
|
||||
该项目部署的节点可通过节点PATH(路径)的方式,使用指定的`PROXYIP`或`SOCKS5`!!!
|
||||
|
||||
- 指定 `PROXYIP` 案例
|
||||
```url
|
||||
|
||||
45
_worker.js
45
_worker.js
@@ -122,18 +122,20 @@ export default {
|
||||
} else if (访问路径 === 'admin/cf.json') { // 保存cf.json配置
|
||||
try {
|
||||
const newConfig = await request.json();
|
||||
const CF_JSON = { Email: null, GlobalAPIKey: null, AccountID: null, APIToken: null };
|
||||
const CF_JSON = { Email: null, GlobalAPIKey: null, AccountID: null, APIToken: null, UsageAPI: null };
|
||||
if (!newConfig.init || newConfig.init !== true) {
|
||||
if (newConfig.Email && newConfig.GlobalAPIKey) {
|
||||
CF_JSON.Email = newConfig.Email;
|
||||
CF_JSON.GlobalAPIKey = newConfig.GlobalAPIKey;
|
||||
CF_JSON.AccountID = null;
|
||||
CF_JSON.APIToken = null;
|
||||
CF_JSON.UsageAPI = null;
|
||||
} else if (newConfig.AccountID && newConfig.APIToken) {
|
||||
CF_JSON.Email = null;
|
||||
CF_JSON.GlobalAPIKey = null;
|
||||
CF_JSON.AccountID = newConfig.AccountID;
|
||||
CF_JSON.APIToken = newConfig.APIToken;
|
||||
CF_JSON.UsageAPI = null;
|
||||
} else {
|
||||
return new Response(JSON.stringify({ error: '配置不完整' }), { status: 400, headers: { 'Content-Type': 'application/json;charset=utf-8' } });
|
||||
}
|
||||
@@ -205,7 +207,7 @@ export default {
|
||||
if (config_JSON.CF.Usage.success) {
|
||||
pagesSum = config_JSON.CF.Usage.pages;
|
||||
workersSum = config_JSON.CF.Usage.workers;
|
||||
total = 1024 * 100;
|
||||
total = Number.isFinite(config_JSON.CF.Usage.max) ? (config_JSON.CF.Usage.max / 1000) * 1024 : 1024 * 100;
|
||||
}
|
||||
const responseHeaders = {
|
||||
"content-type": "text/plain; charset=utf-8",
|
||||
@@ -330,7 +332,6 @@ export default {
|
||||
}
|
||||
return new Response(订阅内容, { status: 200, headers: responseHeaders });
|
||||
}
|
||||
return new Response('无效的订阅TOKEN', { status: 403 });
|
||||
} else if (访问路径 === 'locations') {//反代locations列表
|
||||
const cookies = request.headers.get('Cookie') || '';
|
||||
const authCookie = cookies.split(';').find(c => c.trim().startsWith('auth='))?.split('=')[1];
|
||||
@@ -1125,11 +1126,13 @@ async function 读取config_JSON(env, hostname, userID, path, 重置配置 = fal
|
||||
GlobalAPIKey: null,
|
||||
AccountID: null,
|
||||
APIToken: null,
|
||||
UsageAPI: null,
|
||||
Usage: {
|
||||
success: false,
|
||||
pages: 0,
|
||||
workers: 0,
|
||||
total: 0,
|
||||
max: 100000,
|
||||
},
|
||||
}
|
||||
};
|
||||
@@ -1171,20 +1174,31 @@ async function 读取config_JSON(env, hostname, userID, path, 重置配置 = fal
|
||||
console.error(`读取tg.json出错: ${error.message}`);
|
||||
}
|
||||
|
||||
const 初始化CF_JSON = { Email: null, GlobalAPIKey: null, AccountID: null, APIToken: null };
|
||||
config_JSON.CF = { ...初始化CF_JSON, Usage: { success: false, pages: 0, workers: 0, total: 0 } };
|
||||
const 初始化CF_JSON = { Email: null, GlobalAPIKey: null, AccountID: null, APIToken: null, UsageAPI: null };
|
||||
config_JSON.CF = { ...初始化CF_JSON, Usage: { success: false, pages: 0, workers: 0, total: 0, max: 100000 } };
|
||||
try {
|
||||
const CF_TXT = await env.KV.get('cf.json');
|
||||
if (!CF_TXT) {
|
||||
await env.KV.put('cf.json', JSON.stringify(初始化CF_JSON, null, 2));
|
||||
} else {
|
||||
const CF_JSON = JSON.parse(CF_TXT);
|
||||
config_JSON.CF.Email = CF_JSON.Email ? CF_JSON.Email : null;
|
||||
config_JSON.CF.GlobalAPIKey = CF_JSON.GlobalAPIKey ? 掩码敏感信息(CF_JSON.GlobalAPIKey) : null;
|
||||
config_JSON.CF.AccountID = CF_JSON.AccountID ? 掩码敏感信息(CF_JSON.AccountID) : null;
|
||||
config_JSON.CF.APIToken = CF_JSON.APIToken ? 掩码敏感信息(CF_JSON.APIToken) : null;
|
||||
const Usage = await getCloudflareUsage(CF_JSON.Email, CF_JSON.GlobalAPIKey, CF_JSON.AccountID, CF_JSON.APIToken);
|
||||
config_JSON.CF.Usage = Usage;
|
||||
if (CF_JSON.UsageAPI) {
|
||||
try {
|
||||
const response = await fetch(CF_JSON.UsageAPI);
|
||||
const Usage = await response.json();
|
||||
config_JSON.CF.Usage = Usage;
|
||||
} catch (err) {
|
||||
console.error(`请求 CF_JSON.UsageAPI 失败: ${err.message}`);
|
||||
}
|
||||
} else {
|
||||
config_JSON.CF.Email = CF_JSON.Email ? CF_JSON.Email : null;
|
||||
config_JSON.CF.GlobalAPIKey = CF_JSON.GlobalAPIKey ? 掩码敏感信息(CF_JSON.GlobalAPIKey) : null;
|
||||
config_JSON.CF.AccountID = CF_JSON.AccountID ? 掩码敏感信息(CF_JSON.AccountID) : null;
|
||||
config_JSON.CF.APIToken = CF_JSON.APIToken ? 掩码敏感信息(CF_JSON.APIToken) : null;
|
||||
config_JSON.CF.UsageAPI = null;
|
||||
const Usage = await getCloudflareUsage(CF_JSON.Email, CF_JSON.GlobalAPIKey, CF_JSON.AccountID, CF_JSON.APIToken);
|
||||
config_JSON.CF.Usage = Usage;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`读取cf.json出错: ${error.message}`);
|
||||
@@ -1466,7 +1480,7 @@ async function getCloudflareUsage(Email, GlobalAPIKey, AccountID, APIToken) {
|
||||
const cfg = { "Content-Type": "application/json" };
|
||||
|
||||
try {
|
||||
if (!AccountID && (!Email || !GlobalAPIKey)) return { success: false, pages: 0, workers: 0, total: 0 };
|
||||
if (!AccountID && (!Email || !GlobalAPIKey)) return { success: false, pages: 0, workers: 0, total: 0, max: 100000 };
|
||||
|
||||
if (!AccountID) {
|
||||
const r = await fetch(`${API}/accounts`, {
|
||||
@@ -1508,12 +1522,13 @@ async function getCloudflareUsage(Email, GlobalAPIKey, AccountID, APIToken) {
|
||||
const pages = sum(acc.pagesFunctionsInvocationsAdaptiveGroups);
|
||||
const workers = sum(acc.workersInvocationsAdaptive);
|
||||
const total = pages + workers;
|
||||
console.log(`统计结果 - Pages: ${pages}, Workers: ${workers}, 总计: ${total}`);
|
||||
return { success: true, pages, workers, total };
|
||||
const max = 100000;
|
||||
console.log(`统计结果 - Pages: ${pages}, Workers: ${workers}, 总计: ${total}, 上限: 100000`);
|
||||
return { success: true, pages, workers, total, max };
|
||||
|
||||
} catch (error) {
|
||||
console.error('获取使用量错误:', error.message);
|
||||
return { success: false, pages: 0, workers: 0, total: 0 };
|
||||
return { success: false, pages: 0, workers: 0, total: 0, max: 100000 };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user