前言
之前動態域名解析是用的是騰達路由器上集成的第三方動態解析服務花生殼,解析費用一年40元。后來覺得域名前綴不好,想換掉,花生殼需要重新購買新的域名解析費用,增加1條或者2條動態解析無所謂,萬一以后增多了,那就不划算了。於是我決定用阿里雲的動態解析api。
條件
1.有公網IP
2.主域名備案
如何使用DDNS
1.登錄阿里雲,獲取 AccessKeyId
與AccessKeySecret
;確定解析的域名例如我的域名是cloud.lichongbing.com
2.為了節省時間和精力,直接把阿里雲ddns的代碼實例拷貝首先用IDEA編譯器快速搭建springboot項目,把代碼放到主程序里就行。確保您已經安裝了Alibaba Cloud SDK for Java,准確的SDK版本號,請參見阿里雲開發工具包(SDK)。
在pom.xml 如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lichongbing</groupId>
<artifactId>ddns</artifactId>
<version>0.0.1</version>
<name>ddns</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-alidns -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-alidns</artifactId>
<version>2.0.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
構建springboot工程目錄結構如下
├── HELP.md
├── dnns.iml
├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── lichongbing
│ │ │ └── dnns
│ │ │ └── DnnsApplication.java
│ │ └── resources
│ │ └── application.properties
│ └── test
│ └── java
│ └── com
│ └── lichongbing
│ └── dnns
│ └── DnnsApplicationTests.java
└── target
├── classes
│ ├── application.properties
│ └── com
│ └── lichongbing
│ └── dnns
│ └── DnnsApplication.class
├── ddns-0.0.1.jar
├── ddns-0.0.1.jar.original
├── generated-sources
│ └── annotations
├── generated-test-sources
│ └── test-annotations
├── maven-archiver
│ └── pom.properties
├── maven-status
│ └── maven-compiler-plugin
│ ├── compile
│ │ └── default-compile
│ │ ├── createdFiles.lst
│ │ └── inputFiles.lst
│ └── testCompile
│ └── default-testCompile
│ ├── createdFiles.lst
│ └── inputFiles.lst
├── surefire-reports
│ ├── TEST-com.lichongbing.dnns.DnnsApplicationTests.xml
│ └── com.lichongbing.dnns.DnnsApplicationTests.txt
└── test-classes
└── com
└── lichongbing
└── dnns
└── DnnsApplicationTests.class
本文操作示例主要以代碼形式體現,具體代碼如下其中四處提示你修改:
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsRequest;
import com.aliyuncs.alidns.model.v20150109.DescribeDomainRecordsResponse;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 動態域名解析
*/
public class DnnsApplication {
/**
* 獲取主域名的所有解析記錄列表
*/
private DescribeDomainRecordsResponse describeDomainRecords(DescribeDomainRecordsRequest request, IAcsClient client){
try {
// 調用SDK發送請求
return client.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
// 發生調用錯誤,拋出運行時異常
throw new RuntimeException();
}
}
/**
* 獲取當前主機公網IP
*/
private String getCurrentHostIP(){
// 這里使用jsonip.com第三方接口獲取本地IP
String jsonip = "https://jsonip.com/";
// 接口返回結果
String result = "";
BufferedReader in = null;
try {
// 使用HttpURLConnection網絡請求第三方接口
URL url = new URL(jsonip);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
in = new BufferedReader(new InputStreamReader(
urlConnection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
}
// 使用finally塊來關閉輸入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
// 正則表達式,提取xxx.xxx.xxx.xxx,將IP地址從接口返回結果中提取出來
String rexp = "(\\d{1,3}\\.){3}\\d{1,3}";
Pattern pat = Pattern.compile(rexp);
Matcher mat = pat.matcher(result);
String res="";
while (mat.find()) {
res=mat.group();
break;
}
return res;
}
/**
* 修改解析記錄
*/
private UpdateDomainRecordResponse updateDomainRecord(UpdateDomainRecordRequest request, IAcsClient client){
try {
// 調用SDK發送請求
return client.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
// 發生調用錯誤,拋出運行時異常
throw new RuntimeException();
}
}
private static void log_print(String functionName, Object result) {
Gson gson = new Gson();
System.out.println("-------------------------------" + functionName + "-------------------------------");
System.out.println(gson.toJson(result));
}
public static void main(String[] args) {
// 設置鑒權參數,初始化客戶端
DefaultProfile profile = DefaultProfile.getProfile(
"cn-chengdu",// 地域ID
"LTAI4Fq6g9sCiESU7y8h9fy3",// 修改成您的AccessKey ID
"2Ap5cT4jucTub95HEw666eDWOSunh4");// 修改成您的AccessKey Secret
IAcsClient client = new DefaultAcsClient(profile);
DnnsApplication ddns = new DnnsApplication();
// 查詢指定二級域名的最新解析記錄
DescribeDomainRecordsRequest describeDomainRecordsRequest = new DescribeDomainRecordsRequest();
// 主域名
describeDomainRecordsRequest.setDomainName("lichongbing.com");// 修改成您的主域名
// 主機記錄
describeDomainRecordsRequest.setRRKeyWord("cloud");// 修改成您的域名前綴,沒有就寫@
// 解析記錄類型
describeDomainRecordsRequest.setType("A");
DescribeDomainRecordsResponse describeDomainRecordsResponse = ddns.describeDomainRecords(describeDomainRecordsRequest, client);
log_print("describeDomainRecords",describeDomainRecordsResponse);
List<DescribeDomainRecordsResponse.Record> domainRecords = describeDomainRecordsResponse.getDomainRecords();
// 最新的一條解析記錄
if(domainRecords.size() != 0 ){
DescribeDomainRecordsResponse.Record record = domainRecords.get(0);
// 記錄ID
String recordId = record.getRecordId();
// 記錄值
String recordsValue = record.getValue();
// 當前主機公網IP
String currentHostIP = ddns.getCurrentHostIP();
System.out.println("-------------------------------當前主機公網IP為:"+currentHostIP+"-------------------------------");
if(!currentHostIP.equals(recordsValue)){
// 修改解析記錄
UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest();
// 主機記錄
updateDomainRecordRequest.setRR("cloud");
// 記錄ID
updateDomainRecordRequest.setRecordId(recordId);
// 將主機記錄值改為當前主機IP
updateDomainRecordRequest.setValue(currentHostIP);
// 解析記錄類型
updateDomainRecordRequest.setType("A");
UpdateDomainRecordResponse updateDomainRecordResponse = ddns.updateDomainRecord(updateDomainRecordRequest, client);
log_print("updateDomainRecord",updateDomainRecordResponse);
}
}
}
}
運行結果
正確運行結果類似如下:
-------------------------------describeDomainRecords-------------------------------
{
"requestId": "6AE588B9-FAFA-45FE-8FBE-CACB196D3539",
"totalCount": 1,
"pageNumber": 1,
"pageSize": 20,
"domainRecords": [
{
"domainName": "lichongbing.com",
"recordId": "1846657850481xxxx",
"rR": "cloud",
"type": "A",
"value": "1.1.1.1",
"tTL": 600,
"line": "default",
"status": "ENABLE",
"locked": false,
"weight": 1
}
]
}
-------------------------------當前主機公網IP為:123.123.123.123-------------------------------
如果ip不一樣就會動態解析
-------------------------------updateDomainRecord-------------------------------
{
"requestId": "08DC052F-7DF7-4451-8214-8489EC15D96A",
"recordId": "1846657850481xxxx"
}
最后打包發布到本地服務器上,編寫啟動腳本和定時命令。
博客原文地址: 利用用阿里雲API實現DDNS