需要有Java、Maven、Springboot、阿里云域名使用经验阿里云修改域名模板,并拥有域名
pom 文件
4.0.0 com.binz update-domain-ip 0.0.1-SNAPSHOT jar update-domain-ip 动态绑定ip到域名 org.springframework.boot spring-boot-starter-parent 2.3.0.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter com.aliyun aliyun-java-sdk-alidns 2.0.7 com.aliyun aliyun-java-sdk-core 4.1.1 cn.hutool hutool-http 5.3.5 update-domain-ip org.springframework.boot spring-boot-maven-plugin
java代码:UpdateDoaminIpStarted
package com.binz; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.alidns.model.v20150109.DescribeSubDomainRecordsRequest; import com.aliyuncs.alidns.model.v20150109.DescribeSubDomainRecordsResponse; import com.aliyuncs.alidns.model.v20150109.DescribeSubDomainRecordsResponse.Record; import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest; import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import cn.hutool.http.HttpUtil; @EnableScheduling @SpringBootApplication public class UpdateDoaminIpStarted { public static final String ACCESS_KEY_ID = "";//需要去阿里控制台 》 AccessKey管理 获取 public static final String ACCESS_KEY_SECRET = "";//需要去阿里控制台 》 AccessKey管理 获取 public static final String REGION_ID = "cn-hanghou"; public static final String DOMIAN = "baidu.com";//域名 xxxx.com public static final Map UPDATE_DOMIANS;//需要修改的域名 private static String CURRENT_IP = null; private static IAcsClient client = null; static { UPDATE_DOMIANS = new HashMap(); UPDATE_DOMIANS.put("baidu.com", null);//根路径 UPDATE_DOMIANS.put("mobile.baidu.com", null); UPDATE_DOMIANS.put("www.baidu.com", null); try { DefaultProfile.addEndpoint(REGION_ID,REGION_ID, "Alidns","alidns.aliyuncs.com"); } catch (ClientException e) { e.printStackTrace(); } IClientProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET); client = new DefaultAcsClient(profile); } public static Record getSubDomainRecord(String subDomain) { DescribeSubDomainRecordsRequest request = new DescribeSubDomainRecordsRequest(); DescribeSubDomainRecordsResponse response; request.setSubDomain(subDomain); try { response = client.getAcsResponse(request); List domainRecords = response.getDomainRecords(); // {RR=mobile, recordId=4031722341639808, line=default, domainName=baidu.com, return domainRecords.get(0); } catch (Exception e) { e.printStackTrace(); } return null; } private static String pingAndGetIp() { try { Set keySet = UPDATE_DOMIANS.keySet(); Process process = Runtime.getRuntime().exec("ping "+ keySet.toArray()[0]); InputStream inputStream = process.getInputStream(); InputStreamReader reader=new InputStreamReader(inputStream,"gbk"); BufferedReader reader2=new BufferedReader(reader); String readLine =null; int i=0; while((readLine= reader2.readLine())!=null && i== 0) { if(readLine.indexOf("(") != -1){ readLine =readLine.substring(readLine.indexOf("(")+1, readLine.indexOf(")")); break; } } process.destroyForcibly(); return readLine; } catch (IOException e) { e.printStackTrace(); } return null; } public static void updateDomainIp() { String ip = getIp(); if(CURRENT_IP == null) { CURRENT_IP = pingAndGetIp(); } System.out.println("oldIp:"+CURRENT_IP+",newIp:"+ip); if(!ip.equals(CURRENT_IP)) { UpdateDomainRecordRequest request; UpdateDomainRecordResponse response; String aa = ""; for (String updateDomian : UPDATE_DOMIANS.keySet()) { if(UPDATE_DOMIANS.get(updateDomian) == null) { UPDATE_DOMIANS.put(updateDomian, getSubDomainRecord(updateDomian).getRecordId()); } aa = updateDomian.replaceAll(DOMIAN, "").equals("") ? "@" : updateDomian.replaceAll("."+DOMIAN, ""); request = new UpdateDomainRecordRequest(); request.setRecordId(UPDATE_DOMIANS.get(updateDomian)); request.setRR(aa); request.setType("A"); request.setValue(ip); try { response = client.getAcsResponse(request); System.out.println("成功把"+updateDomian+"的域名的ip解析成"+ip+",历史ip为:"+CURRENT_IP); System.out.println(response.getRequestId()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } } } public static String getIp() { String ip = HttpUtil.get("http://ip.3322.net"); return ip; } /** * 3分钟一次 */ @Scheduled(cron = "0 */3 * * * *") public void scheduled() { UpdateDoaminIpStarted.updateDomainIp(); } public static void main(String[] args) { // updateDomainIp();//直接执行 SpringApplication.run(UpdateDoaminIpStarted.class, args); //boot运行方式 } }
maven打包后,在内网运行java -jarupdate-domain-ip.jar即可。 只要外网IP改变,它就会改变。 每 3 分钟扫描一次。 对于时效性要求较高的阿里云修改域名模板,可以提高扫描速度。 频率
外部网络需要通过域名来访问。 IP改变也没关系。 无论如何,你只关心域名。