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 => { 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; }