diff --git a/.env.example b/.env.example
index 1c22053f..7a23bfc8 100644
--- a/.env.example
+++ b/.env.example
@@ -15,4 +15,8 @@ SECURITY_BLACKLIST_LOG_FILE_PATH=""
SECURITY_RATE_LIMIT=""
SECURITY_DELAY_AFTER=""
# Google Analytics
-VITE_GOOGLE_ANALYTICS_ID=""
\ No newline at end of file
+VITE_GOOGLE_ANALYTICS_ID=""
+# CURL API
+VITE_CURL_IPV4_DOMAIN=""
+VITE_CURL_IPV6_DOMAIN=""
+VITE_CURL_IPV64_DOMAIN=""
\ No newline at end of file
diff --git a/README.md b/README.md
index cd98790c..3700d840 100644
--- a/README.md
+++ b/README.md
@@ -105,6 +105,11 @@ You can use the program without adding any environment variables, but if you wan
| `CLOUDFLARE_API` | No | `""` | API Key for Cloudflare, used to obtain AS system information through Cloudflare |
| `MAC_LOOKUP_API_KEY` | No | `""` | API Key for MAC Lookup, used to obtain MAC address information |
| `VITE_GOOGLE_ANALYTICS_ID` | **Yes** | `""` | Google Analytics ID, used to track user behavior |
+| `VITE_CURL_IPV4_DOMAIN` | No | `""` | Provides the IPv4 domain for the CURL API to users |
+| `VITE_CURL_IPV6_DOMAIN` | No | `""` | Provides the IPv6 domain for the CURL API to users |
+| `VITE_CURL_IPV64_DOMAIN` | No | `""` | Provides the dual-stack domain for the CURL API to users |
+
+Note that if any of the CURL series environment variables are missing, the CURL API will not be enabled.
### Using Environment Variables in a Node Environment
diff --git a/README_FR.md b/README_FR.md
index add16303..819f416c 100644
--- a/README_FR.md
+++ b/README_FR.md
@@ -105,6 +105,11 @@ Vous pouvez utiliser le programme sans ajouter de variables d'environnement, mai
| `CLOUDFLARE_API` | Non | `""` | Clé API pour Cloudflare, utilisée pour obtenir des informations sur le système AS via Cloudflare |
| `MAC_LOOKUP_API_KEY` | Non | `""` | Clé API pour MAC Lookup, utilisée pour obtenir des informations sur l'adresse MAC via MAC Lookup |
| `VITE_GOOGLE_ANALYTICS_ID` | **Oui** | `""` | Identifiant Google Analytics, utilisé pour l'analyse des utilisateurs |
+| `VITE_CURL_IPV4_DOMAIN` | Non | `""` | Fournit aux utilisateurs le domaine IPv4 pour l'API CURL |
+| `VITE_CURL_IPV6_DOMAIN` | Non | `""` | Fournit aux utilisateurs le domaine IPv6 pour l'API CURL |
+| `VITE_CURL_IPV64_DOMAIN` | Non | `""` | Fournit aux utilisateurs le domaine à pile double pour l'API CURL |
+
+Il est à noter que si l'une quelconque des variables d'environnement de la série CURL est manquante, l'API CURL ne sera pas activée.
### Utilisation des variables d'environnement dans un environnement Node
diff --git a/README_ZH.md b/README_ZH.md
index 5821f68d..d412db8f 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -105,6 +105,11 @@ docker run -d -p 18966:18966 --name myip --restart always jason5ng32/myip:latest
| `CLOUDFLARE_API` | 否 | `""` | Cloudflare 的 API Key,用于通过 Cloudflare 获取 AS 系统的信息 |
| `MAC_LOOKUP_API_KEY` | 否 | `""` | MAC 查询的 API Key,用于通过 MAC Lookup 获取 MAC 地址的归属信息 |
| `VITE_GOOGLE_ANALYTICS_ID` | **是** | `""` | Google Analytics 的 ID,用于统计访问量 |
+| `VITE_CURL_IPV4_DOMAIN` | 否 | `""` | 为用户提供 CURL API 的 IPv4 域名 |
+| `VITE_CURL_IPV6_DOMAIN` | 否 | `""` | 为用户提供 CURL API 的 IPv6 域名 |
+| `VITE_CURL_IPV64_DOMAIN` | 否 | `""` | 为用户提供 CURL API 的双网络栈域名 |
+
+需要注意的是,如果 CURL 系列的环境变量任意一个缺失,都不会启用 CURL API。
### 在 Node 环境里使用环境变量
diff --git a/common/maxmind-db/GeoLite2-ASN.mmdb b/common/maxmind-db/GeoLite2-ASN.mmdb
index 7a5e21c3..d6180fd6 100644
Binary files a/common/maxmind-db/GeoLite2-ASN.mmdb and b/common/maxmind-db/GeoLite2-ASN.mmdb differ
diff --git a/common/maxmind-db/GeoLite2-City.mmdb b/common/maxmind-db/GeoLite2-City.mmdb
index 5f16aaf5..e1afaebb 100644
Binary files a/common/maxmind-db/GeoLite2-City.mmdb and b/common/maxmind-db/GeoLite2-City.mmdb differ
diff --git a/frontend/App.vue b/frontend/App.vue
index bd540450..e5a6512a 100644
--- a/frontend/App.vue
+++ b/frontend/App.vue
@@ -15,8 +15,8 @@
+
-
@@ -65,6 +65,7 @@ const userPreferences = computed(() => store.userPreferences);
const shouldRefreshEveryThing = computed(() => store.shouldRefreshEveryThing);
const Status = computed(() => store.mountingStatus);
const openedCard = computed(() => store.currentPath.id);
+const curlDomainsHadSet = computed(() => store.curlDomainsHadSet);
// Template 里的 Ref
const navBarRef = ref(null);
@@ -490,14 +491,6 @@ const ShortcutKeys = (isOriginalSite) => {
},
description: t('shortcutKeys.About'),
},
- {
- keys: "x",
- action: () => {
- shellRef.value.openModal();
- trackEvent('ShortCut', 'ShortCut', 'Shell');
- },
- description: t('shortcutKeys.Shell'),
- },
// help
{
keys: "?",
@@ -521,10 +514,25 @@ const ShortcutKeys = (isOriginalSite) => {
},
];
+ const curlAPI = [
+ {
+ keys: "x",
+ action: () => {
+ shellRef.value.openModal();
+ trackEvent('ShortCut', 'ShortCut', 'Shell');
+ },
+ description: t('shortcutKeys.Shell'),
+ },
+ ]
+
if (isOriginalSite) {
shortcutConfig.push(...invisibilitytest);
}
+ if (curlDomainsHadSet.value) {
+ shortcutConfig.push(...curlAPI);
+ }
+
return shortcutConfig;
};
diff --git a/frontend/components/Footer.vue b/frontend/components/Footer.vue
index 0521788e..6991dadf 100644
--- a/frontend/components/Footer.vue
+++ b/frontend/components/Footer.vue
@@ -1,9 +1,9 @@