import cn.hutool.http.HttpRequest;
import cn.hutool.core.codec.Base64;
import cn.hutool.http.HttpUtil;
import jakarta.annotation.PostConstruct;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@Component
public class MyScheduledTask {
// ⚙️ 配置信息(请替换为你的)
private static final String USERNAME = "example";
private static final String PASSWORD = "example";
private static final String HOSTNAME = "example.ddns.net"; // 要更新的域名
// 🌐 API 地址
private static final String UPDATE_URL = "https://dynupdate.no-ip.com/nic/update";
private static final String IP6_CHECK_URL = "https://ipv6.icanhazip.com"; // 获取公网 IPv6
@Scheduled(cron = "0 0 * * * *")
public void updateDNSTask() {
updateDNSUtil();
}
@PostConstruct
public void init(){
updateDNSUtil();
}
public void updateDNSUtil() {
try {
// 1. 获取当前公网 IPv6
Process process = Runtime.getRuntime().exec("curl -6 --max-time 10 "+IP6_CHECK_URL);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String currentIPv6 = reader.readLine();
System.out.println(currentIPv6);
if (currentIPv6 == null || currentIPv6.trim().isEmpty()) {
System.err.println("❌ 无法获取公网 IPv6 地址");
return;
}
System.out.println("🌐 当前公网 IPv6: " + currentIPv6);
// 2. 更新 No-IP AAAA 记录
String result = updateNoIpAAAA(currentIPv6);
System.out.println("✅ 更新结果: " + result);
} catch (Exception e) {
System.err.println("❌ 更新失败: " + e.getMessage());
}
}
/**
* 更新 No-IP 的 AAAA 记录
*/
public static String updateNoIpAAAA(String ipv6) {
// 构造请求 URL: https://dynupdate.no-ip.com/nic/update?hostname=xxx&myip=IPv6
String urlString = UPDATE_URL +
"?hostname=" + URLEncoder.encode(HOSTNAME, StandardCharsets.UTF_8) +
"&myip=" + URLEncoder.encode(ipv6, StandardCharsets.UTF_8);
// 设置认证头:Basic Base64(username:password)
String auth = USERNAME + ":" + PASSWORD;
String encodedAuth = Base64.encode(auth.getBytes(StandardCharsets.UTF_8));
// 使用 Hutool HttpUtil 发送请求
try {
String response = HttpRequest.get(urlString)
.header("Authorization", "Basic " + encodedAuth)
.header("User-Agent", "NoIP-Updater-Java/1.0")
.timeout(10000)
.execute()
.body();
return response != null ? response.trim() : "Unknown response";
} catch (Exception e) {
// 处理异常情况
return "Error: " + e.getMessage();
}
}
}