Files
ddns-agent/agent/ip.ts

63 lines
1.4 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';
import { exec } from 'child_process';
import { promisify } from 'util';
const execAsync = promisify(exec);
const curl6 = async (url: string): Promise<string> => {
const { stdout } = await execAsync(`curl -6 -s "${url}"`);
return stdout.trim();
};
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 {
ip = await curl6(baseURLv6);
} catch (error) { }
if (!isIpv6(ip)) {
try {
ip = await curl6('https://ifconfig.co/ip');
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;
}