前言

之前动态域名解析是用的是腾达路由器上集成的第三方动态解析服务花生壳,解析费用一年40元。后来觉得域名前缀不好,想换掉,花生壳需要重新购买新的域名解析费用,增加1条或者2条动态解析无所谓,万一以后增多了,那就不划算了。于是我决定用阿里云的动态解析api。

条件

1.有公网IP

2.主域名备案

如何使用DDNS

1.登录阿里云,获取 AccessKeyIdAccessKeySecret;确定解析的域名例如我的域名是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

利用用阿里云API实现DDNS的更多相关文章

  1. 【阿里云API】 阿里云API调用的若干说明

    阿里云API 为了监控我们使用的一些阿里云产品,需要些一些脚本,定时调用这些脚本来获得相关阿里云产品的信息. ■ 概述 调用阿里云API大约分成两类方法,一个是直接从HTTP协议开始,自己根据阿里云的 ...

  2. 阿里云 API 签名机制的 Python 实现

    在调用阿里云 API 的时候,最让人头疼的就是 API 的签名(Signature)机制,阿里云在通用文档中也有专项说明,但是仅仅有基于 Java 的实现代码示例.所以这里基于 Python 来分析下 ...

  3. 阿里云API网关(11)外网访问 阿里云API网关内定义的API步骤:

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  4. 阿里云API网关(9)常见问题

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  5. 阿里云api调用做简单的cmdb

    阿里云api调用做简单的cmdb 1 步骤 事实上就是调用阿里api.获取可用区,比方cn-hangzhou啊等等.然后在每一个区调用api 取ecs的状态信息,最好写到一个excel里面去.方便排序 ...

  6. Python 调用阿里云 API 收集 ECS 数据

    #!/usr/bin/env python # coding: utf-8 # author: Wang XiaoQiang ''' 功能介绍: 1.调用阿里云API,收集所有区域 ECS 信息 2. ...

  7. 阿里云API网关!

    API 网关(API Gateway)提供高性能.高可用的 API 托管服务,帮助用户对外开放其部署在 ECS.容器服务等阿里云产品上的应用,提供完整的 API 发布.管理.维护生命周期管理.用户只需 ...

  8. 浅析阿里云API网关的产品架构和常见应用场景

    自上世纪60年代计算机网络发展开始,API(Application Programming Interface )随之诞生,API即应用程序接口,是实现系统间衔接的桥梁.时至今日,API市场已经形成了 ...

  9. 利用Python+阿里云实现DDNS(动态域名解析)

    引子我想大家应该都很熟悉DNS了,这回在DNS前面加了一个D又变成了什么呢?这个D就是Dynamic(动态),也就是说,按照传统,一个域名所对应的IP地址应该是定死的,而使用了DDNS后,域名所对应的 ...

随机推荐

  1. 更换JDK

    1.更换JDK 1).卸载原有jdk 检查一下系统中的jdk版本 java -version 显示 java version "1.6.0_24" OpenJDK Runtime ...

  2. 学会这8个优秀 Python 库用于业余项目,将大大减少程序员耗费的精力

    在数据库中即时保存数据:Dataset 当我们想要在不知道最终数据库表长什么样的情况下,快速收集数据并保存到数据库中的时候,Dataset 库将是我们的最佳选择.Dataset 库有一个简单但功能强大 ...

  3. 使用Xdroid进行端口映射,出现adb server version (36) doesn't match this client (39); killing...的解决方案

    第一反应就是adb冲突了,因为Xdroid这个产品看起来就不像是给开发人员用的模拟器,因为不能选择各种版本进行适配,所以肯定自带了一个adb. whereis命令发现果然有两个adb,一个直接是安装在 ...

  4. Hash Map 在java中的解释及示例

    目录 HashMap在java中的应用及示例 HashMap的内部结构 HashMap的性能 同步HashMap HashMap的构造函数 HashMap的时间复杂度 HashMap的方法 1. vo ...

  5. 从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  6. 01-tornado练习-tornado简介

    # coding = utf-8 """ 启动一个tornado的web服务 """ import tornado.web from tor ...

  7. Python大神必须掌握的技能:多继承、super和MRO算法

    本文主要以Python3.x为例讲解Python多继承.super以及MRO算法. 1. Python中的继承 任何面向对象编程语言都会支持继承,Python也不例外.但Python语言却是少数几个支 ...

  8. Git实战指南----跟着haibiscuit学Git(第一篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  9. 【RN - 基础】之React Native常见问题及解决方案

    unable to load script from assets index.android.bundle... 问题原因: 找不到Android项目中的assets文件夹. 解决方案: 1.在An ...

  10. 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...