diff --git a/README.md b/README.md
index acce7e7c..cd98790c 100644
--- a/README.md
+++ b/README.md
@@ -146,9 +146,10 @@ If you're using a proxy for internet access, consider adding this rule to your p
```ini
# IP Testing
-IP-CIDR,1.0.0.1/32,DIRECT,no-resolve
-IP-CIDR6,2606:4700:4700::1111/128,DIRECT,no-resolve
-DOMAIN-SUFFIX,ipify.org,Proxy
+IP-CIDR,1.0.0.1/32,Proxy,no-resolve
+IP-CIDR6,2606:4700:4700::1111/128,Proxy,no-resolve
+DOMAIN,4.ipcheck.ing,DIRECT
+DOMAIN,6.ipcheck.ing,DIRECT
# Rule Testing
DOMAIN,ptest-1.ipcheck.ing,Proxy1
DOMAIN,ptest-2.ipcheck.ing,Proxy2
diff --git a/README_FR.md b/README_FR.md
index 8c85a775..add16303 100644
--- a/README_FR.md
+++ b/README_FR.md
@@ -146,8 +146,10 @@ Si vous utilisez un proxy pour accéder à Internet, envisagez d'ajouter cette r
```ini
# Test d'adresse IP
-IP-CIDR,1.0.0.1/32,DIRECT,no-resolve
-IP-CIDR6,2606:4700:4700::1111/128,DIRECT,no-resolve
+IP-CIDR,1.0.0.1/32,Proxy,no-resolve
+IP-CIDR6,2606:4700:4700::1111/128,Proxy,no-resolve
+DOMAIN,4.ipcheck.ing,DIRECT
+DOMAIN,6.ipcheck.ing,DIRECT
# Rule Testing
DOMAIN,ptest-1.ipcheck.ing,Proxy1
DOMAIN,ptest-2.ipcheck.ing,Proxy2
diff --git a/README_ZH.md b/README_ZH.md
index 771774ae..5821f68d 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -146,9 +146,10 @@ docker run -d -p 18966:18966 \
```ini
# IP Testing
-IP-CIDR,1.0.0.1/32,DIRECT,no-resolve
-IP-CIDR6,2606:4700:4700::1111/128,DIRECT,no-resolve
-DOMAIN-SUFFIX,ipify.org,Proxy
+IP-CIDR,1.0.0.1/32,Proxy,no-resolve
+IP-CIDR6,2606:4700:4700::1111/128,Proxy,no-resolve
+DOMAIN,4.ipcheck.ing,DIRECT
+DOMAIN,6.ipcheck.ing,DIRECT
# Rule Testing
DOMAIN,ptest-1.ipcheck.ing,Proxy1
DOMAIN,ptest-2.ipcheck.ing,Proxy2
diff --git a/frontend/components/IpInfos.vue b/frontend/components/IpInfos.vue
index d4075a95..283f34b4 100644
--- a/frontend/components/IpInfos.vue
+++ b/frontend/components/IpInfos.vue
@@ -196,7 +196,7 @@ import { useI18n } from 'vue-i18n';
import { trackEvent } from '@/utils/use-analytics';
import { isValidIP } from '@/utils/valid-ip.js';
import { transformDataFromIPapi } from '@/utils/transform-ip-data.js';
-import { getIPFromIPIP, getIPFromUpai, getIPFromCloudflare_V4, getIPFromCloudflare_V6, getIPFromGCR, getIPFromIpify_V4, getIPFromIpify_V6 } from '@/utils/getips';
+import { getIPFromIPIP, getIPFromCloudflare_V4, getIPFromCloudflare_V6, getIPFromIPChecking64, getIPFromIPChecking4, getIPFromIPChecking6 } from '@/utils/getips';
const { t } = useI18n();
@@ -247,11 +247,6 @@ const ipDataCards = reactive([
id: "cnsource",
source: "CN Source",
},
- {
- ...createDefaultCard(),
- id: "special",
- source: "Special",
- },
{
...createDefaultCard(),
id: "cloudflare_v4",
@@ -264,20 +259,25 @@ const ipDataCards = reactive([
},
{
...createDefaultCard(),
- id: "ipify_v4",
- source: "IPify IPv4",
+ id: "ipchecking_v64",
+ source: "IPCheck.ing IPv6/4",
},
{
...createDefaultCard(),
- id: "ipify_v6",
- source: "IPify IPv6",
+ id: "ipchecking_v4",
+ source: "IPCheck.ing IPv4",
+ },
+ {
+ ...createDefaultCard(),
+ id: "ipchecking_v6",
+ source: "IPCheck.ing IPv6",
},
]);
// 默认 ASN 信息
const asnInfos = ref({
- "AS15169": {
- "asnName": "Google", "asnOrgName": "GOGL-ARIN", "estimatedUsers": "368891", "IPv4_Pct": "95.35", "IPv6_Pct": "4.65", "HTTP_Pct": "3.16", "HTTPS_Pct": "96.84", "Desktop_Pct": "58.88", "Mobile_Pct": "41.12", "Bot_Pct": "98.46", "Human_Pct": "1.54"
+ "AS888888": {
+ "asnName": "Google", "asnOrgName": "GOGL-ARIN", "estimatedUsers": "888888", "IPv4_Pct": "95.35", "IPv6_Pct": "4.65", "HTTP_Pct": "3.16", "HTTPS_Pct": "96.84", "Desktop_Pct": "58.88", "Mobile_Pct": "41.12", "Bot_Pct": "98.46", "Human_Pct": "1.54"
}
});
@@ -332,11 +332,11 @@ const trackFetchStatus = (status) => {
const checkAllIPs = async () => {
const ipFunctions = [
() => fetchIP(0, getIPFromIPIP),
- () => fetchIP(1, configs.value.originalSite ? getIPFromGCR : getIPFromUpai),
- () => fetchIP(2, getIPFromCloudflare_V4),
- () => fetchIP(3, getIPFromCloudflare_V6),
- () => fetchIP(4, getIPFromIpify_V4),
- () => fetchIP(5, getIPFromIpify_V6),
+ () => fetchIP(1, getIPFromCloudflare_V4),
+ () => fetchIP(2, getIPFromCloudflare_V6),
+ () => fetchIP(3, getIPFromIPChecking64),
+ () => fetchIP(4, getIPFromIPChecking4),
+ () => fetchIP(5, getIPFromIPChecking6),
];
// 限制执行的函数数量为 ipCardsToShow 的长度
@@ -463,19 +463,19 @@ const refreshCard = (card, index) => {
fetchIP(0, getIPFromIPIP);
break;
case 1:
- fetchIP(1, configs.value.originalSite ? getIPFromGCR : getIPFromUpai);
+ fetchIP(1, getIPFromCloudflare_V4);
break;
case 2:
- fetchIP(2, getIPFromCloudflare_V4);
+ fetchIP(2, getIPFromCloudflare_V6);
break;
case 3:
- fetchIP(3, getIPFromCloudflare_V6);
- break;
+ fetchIP(3, getIPFromIPChecking64);
+ break;
case 4:
- fetchIP(4, getIPFromIpify_V4);
+ fetchIP(4, getIPFromIPChecking4);
break;
case 5:
- fetchIP(5, getIPFromIpify_V6);
+ fetchIP(5, getIPFromIPChecking6);
break;
default:
console.error("Undefind Source:");
diff --git a/frontend/components/widgets/Preferences.vue b/frontend/components/widgets/Preferences.vue
index cc885b80..d1707f53 100644
--- a/frontend/components/widgets/Preferences.vue
+++ b/frontend/components/widgets/Preferences.vue
@@ -44,7 +44,7 @@
{{ t('nav.preferences.ipSourcesToCheck') }}
-
+
diff --git a/frontend/style/style.css b/frontend/style/style.css
index 934ace5c..aadc0acb 100644
--- a/frontend/style/style.css
+++ b/frontend/style/style.css
@@ -94,7 +94,7 @@
}
.jn-list-group-item {
- border-bottom: 1px solid rgb(222, 226, 230);
+ border-bottom: 1px dashed rgb(222, 226, 230);
padding: 12px 4px 12px 4px;
display: flex;
margin: 0;
diff --git a/frontend/utils/getips/cloudflare-v6.js b/frontend/utils/getips/cloudflare-v6.js
index 0da118d8..fd1532ea 100644
--- a/frontend/utils/getips/cloudflare-v6.js
+++ b/frontend/utils/getips/cloudflare-v6.js
@@ -25,6 +25,7 @@ const getIPFromCloudflare_V6 = async () => {
};
}
} catch (error) {
+ console.error("Error fetching IP from Cloudflare:", error);
return {
ip: null,
source: "Cloudflare IPv6"
diff --git a/frontend/utils/getips/index.js b/frontend/utils/getips/index.js
index 9f89366d..f5b30f77 100644
--- a/frontend/utils/getips/index.js
+++ b/frontend/utils/getips/index.js
@@ -1,11 +1,8 @@
import { getIPFromIPIP } from "./ipipnet";
-import { getIPFromQQ } from "./qq";
-import { getIPFromUpai } from "./upai";
-import { getIPFromCloudflare_CN } from "./cloudflare-cn";
import { getIPFromCloudflare_V4 } from "./cloudflare-v4";
import { getIPFromCloudflare_V6 } from "./cloudflare-v6";
-import { getIPFromGCR } from "./ipchecking";
-import { getIPFromIpify_V4 } from "./ipify-v4";
-import { getIPFromIpify_V6 } from "./ipify-v6";
+import { getIPFromIPChecking64 } from "./ipchecking64";
+import { getIPFromIPChecking4 } from "./ipchecking4";
+import { getIPFromIPChecking6 } from "./ipchecking6";
-export { getIPFromIPIP, getIPFromQQ, getIPFromUpai, getIPFromCloudflare_CN, getIPFromCloudflare_V4, getIPFromCloudflare_V6, getIPFromGCR, getIPFromIpify_V4, getIPFromIpify_V6};
\ No newline at end of file
+export { getIPFromIPIP, getIPFromCloudflare_V4, getIPFromCloudflare_V6, getIPFromIPChecking64, getIPFromIPChecking4, getIPFromIPChecking6};
\ No newline at end of file
diff --git a/frontend/utils/getips/ipchecking4.js b/frontend/utils/getips/ipchecking4.js
new file mode 100644
index 00000000..b5b12842
--- /dev/null
+++ b/frontend/utils/getips/ipchecking4.js
@@ -0,0 +1,36 @@
+import { isValidIP } from '@/utils/valid-ip.js';
+
+// 从 IPCheck.ing 获取 IPv4 地址
+const getIPFromIPChecking4 = async () => {
+ try {
+ const response = await fetch("https://4.ipcheck.ing/cdn-cgi/trace");
+ const data = await response.text();
+ const lines = data.split("\n");
+ const ipLine = lines.find((line) => line.startsWith("ip="));
+ let ip = "";
+ if (ipLine) {
+ ip = ipLine.split("=")[1];
+ }
+ const source = "IPCheck.ing IPv4";
+ if (isValidIP(ip)) {
+ return {
+ ip: ip,
+ source: source
+ };
+ } else {
+ console.error("Invalid IP from IPCheck.ing IPv4:", ip);
+ return {
+ ip: null,
+ source: source
+ };
+ }
+ } catch (error) {
+ console.error("Error fetching IP from IPCheck.ing IPv4:", error);
+ return {
+ ip: null,
+ source: "IPCheck.ing IPv4"
+ };
+ }
+};
+
+export { getIPFromIPChecking4 };
\ No newline at end of file
diff --git a/frontend/utils/getips/ipchecking6.js b/frontend/utils/getips/ipchecking6.js
new file mode 100644
index 00000000..0d28a49a
--- /dev/null
+++ b/frontend/utils/getips/ipchecking6.js
@@ -0,0 +1,36 @@
+import { isValidIP } from '@/utils/valid-ip.js';
+
+// 从 IPCheck.ing 获取 IPv6 地址
+const getIPFromIPChecking6 = async () => {
+ try {
+ const response = await fetch("https://6.ipcheck.ing/cdn-cgi/trace");
+ const data = await response.text();
+ const lines = data.split("\n");
+ const ipLine = lines.find((line) => line.startsWith("ip="));
+ let ip = "";
+ if (ipLine) {
+ ip = ipLine.split("=")[1];
+ }
+ const source = "IPCheck.ing IPv6";
+ if (isValidIP(ip)) {
+ return {
+ ip: ip,
+ source: source
+ };
+ } else {
+ console.error("Invalid IP from IPCheck.ing IPv6:", ip);
+ return {
+ ip: null,
+ source: source
+ };
+ }
+ } catch (error) {
+ console.error("Error fetching IP from IPCheck.ing IPv6:", error);
+ return {
+ ip: null,
+ source: "IPCheck.ing IPv6"
+ };
+ }
+};
+
+export { getIPFromIPChecking6 };
\ No newline at end of file
diff --git a/frontend/utils/getips/ipchecking64.js b/frontend/utils/getips/ipchecking64.js
new file mode 100644
index 00000000..5d7064f5
--- /dev/null
+++ b/frontend/utils/getips/ipchecking64.js
@@ -0,0 +1,36 @@
+import { isValidIP } from '@/utils/valid-ip.js';
+
+// 从 IPCheck.ing 获取 IPv6 地址
+const getIPFromIPChecking64 = async () => {
+ try {
+ const response = await fetch("https://64.ipcheck.ing/cdn-cgi/trace");
+ const data = await response.text();
+ const lines = data.split("\n");
+ const ipLine = lines.find((line) => line.startsWith("ip="));
+ let ip = "";
+ if (ipLine) {
+ ip = ipLine.split("=")[1];
+ }
+ const source = "IPCheck.ing IPv6/4";
+ if (isValidIP(ip)) {
+ return {
+ ip: ip,
+ source: source
+ };
+ } else {
+ console.error("Invalid IP from IPCheck.ing IPv6/4:", ip);
+ return {
+ ip: null,
+ source: source
+ };
+ }
+ } catch (error) {
+ console.error("Error fetching IP from IPCheck.ing IPv6/4:", error);
+ return {
+ ip: null,
+ source: "IPCheck.ing IPv6/4"
+ };
+ }
+};
+
+export { getIPFromIPChecking64 };
\ No newline at end of file
diff --git a/frontend/utils/getips/ipipnet.js b/frontend/utils/getips/ipipnet.js
index 0c56bcbd..9df4ac80 100644
--- a/frontend/utils/getips/ipipnet.js
+++ b/frontend/utils/getips/ipipnet.js
@@ -1,5 +1,4 @@
-// import { getIPFromQQ } from "./qqvideo";
-import { getIPFromAliCDN } from "./alicdn";
+import { getIPFromUpai } from "./upai";
import { isValidIP } from '@/utils/valid-ip.js';
// 从 IPIP.net 获取 IP 地址
@@ -21,7 +20,7 @@ const getIPFromIPIP = async () => {
console.error("Error fetching IP from IPIP.net:", error);
}
// 故障时尝试从 AliCDN 获取 IP 地址
- const { ip, source } = await getIPFromAliCDN();
+ const { ip, source } = await getIPFromUpai();
return {
ip: ip,
source: source
diff --git a/frontend/utils/masked-info.js b/frontend/utils/masked-info.js
index 66e3bef4..6bc42a5c 100644
--- a/frontend/utils/masked-info.js
+++ b/frontend/utils/masked-info.js
@@ -12,7 +12,7 @@ function maskedInfo(t) {
fakecard.latitude = "37.40599";
fakecard.longitude = "-122.078514";
fakecard.isp = "Google LLC";
- fakecard.asn = "AS15169";
+ fakecard.asn = "AS888888";
fakecard.asnlink = "https://radar.cloudflare.com/AS15169",
fakecard.mapUrl = '/res/defaultMap.webp';
fakecard.mapUrl_dark = '/res/defaultMap_dark.webp';
diff --git a/package.json b/package.json
index 9035bf2b..a0c16ad3 100644
--- a/package.json
+++ b/package.json
@@ -19,10 +19,10 @@
"bootstrap": "^5.3.3",
"bootstrap-icons": "^1.11.3",
"code-inspector-plugin": "^0.16.1",
- "concurrently": "^9.0.0",
+ "concurrently": "^9.0.1",
"country-code-lookup": "^0.1.3",
"dotenv": "^16.4.5",
- "express": "^4.19.2",
+ "express": "^4.21.0",
"express-rate-limit": "^7.4.0",
"express-slow-down": "^2.0.3",
"flag-icons": "^7.2.3",
@@ -31,14 +31,14 @@
"nodemon": "^3.1.4",
"pinia": "^2.2.2",
"svgmap": "^2.11.1",
- "vue": "^3.5.3",
- "vue-i18n": "^9.14.0",
- "vue-router": "^4.4.3",
+ "vue": "^3.5.6",
+ "vue-i18n": "^10.0.1",
+ "vue-router": "^4.4.5",
"whoiser": "^1.18.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.1.3",
- "vite": "^5.4.3",
+ "vite": "^5.4.6",
"vite-plugin-pwa": "^0.20.5"
}
}