java 動態修改阿里雲域名解析,用於解決家用寬帶公網ip經常變動問題


需要有java、maven、springboot、阿里雲域名使用經驗、以及擁有一個域名

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.binz</groupId>
    <artifactId>update-domain-ip</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>update-domain-ip</name>
    <description>動態綁定ip到域名</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-alidns</artifactId>
            <version>2.0.7</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.1.1</version>
        </dependency>
        
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-http</artifactId>
            <version>5.3.5</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>update-domain-ip</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

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";//域名  改成你的域名
    public static final Map<String,String> 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<Record> 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<String> 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 -jar update-domain-ip.jar 即可,只要外網ip變動了就會改變,這個3分鍾就掃描一次,對於及時性要高一些的,可以提高掃描的頻率
外網都需要通過域名訪問,ip變了也無所謂,反正你只關心域名就行了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM