generated from template/slidev-template
59 lines
1.3 KiB
TypeScript
59 lines
1.3 KiB
TypeScript
const baseURLv4 = 'https://4.ipw.cn/';
|
|
const baseURLv6 = 'https://6.ipw.cn/';
|
|
// ipv6
|
|
// curl -6 ifconfig.co
|
|
// curl -6 icanhazip.com
|
|
|
|
// ipv4
|
|
// https://api.ipify.org/?format=text
|
|
// https://ipinfo.io/ip
|
|
import { app } from './app.ts';
|
|
|
|
app.route({
|
|
path: 'ip',
|
|
key: 'v4',
|
|
description: '获取当前公网IPv4地址',
|
|
}).define(async (ctx) => {
|
|
const response = await fetch(baseURLv4);
|
|
const ip = (await response.text()).trim();
|
|
if (!isIpv4(ip)) {
|
|
ctx.throw?.('获取地址失败');
|
|
}
|
|
ctx.body = { ip };
|
|
}).addTo(app);
|
|
|
|
app.route({
|
|
path: 'ip',
|
|
key: 'v6',
|
|
description: '获取当前公网IPv6地址',
|
|
}).define(async (ctx) => {
|
|
let ip = ''
|
|
try {
|
|
const response = await fetch(baseURLv6);
|
|
ip = (await response.text()).trim();
|
|
} catch (error) {
|
|
|
|
}
|
|
if (!isIpv6(ip)) {
|
|
try {
|
|
const response2 = await fetch('https://ifconfig.co/ip');
|
|
ip = (await response2.text()).trim();
|
|
console.log('尝试第二个接口获取IPv6地址:', ip);
|
|
} catch (error) { }
|
|
}
|
|
if (!isIpv6(ip)) {
|
|
ctx.throw?.('获取地址失败');
|
|
}
|
|
ctx.body = { ip };
|
|
}).addTo(app);
|
|
|
|
|
|
export const isIpv6 = (ip: string): boolean => {
|
|
return ip.includes(':');
|
|
}
|
|
|
|
export const isIpv4 = (ip: string): boolean => {
|
|
return ip.split('.').length === 4;
|
|
}
|
|
|