使用阿里云Java SDK 实现 DDNS
本代码的实现前提:
1.拥有阿里云域名,且获取了Access Key 及 Access Secret
2.能获取外网IP的页面地址(注意:ip138.com的实际包含ip地址为http://2018.ip138.com/ic.asp)
Maven依赖项:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency> <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency> <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.2</version>
</dependency> <dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-alidns</artifactId>
<version>2.0.6</version>
</dependency> </dependencies>
代码:
package com.phipsoft.aliyun.ddns; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern; 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.DescribeDomainRecordsResponse.Record;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest;
import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile; public class DDNS {
static final String CHARSET_ENCONDING = "utf-8";
static final String KEY_IP_URL = "-url";
static final String KEY_IP_REGEX_PATTERN = "-reg";
static final String KEY_ACCESS_KEY = "-k";
static final String KEY_ACCESS_SECRET = "-s";
static final String KEY_DOMAIN = "-d";
static final String KEY_RR = "-rr"; public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + ((param == null || param.isEmpty())? "" : ("?" + param));
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("contentType", CHARSET_ENCONDING);
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立实际的连接
connection.connect(); in = new BufferedReader(new InputStreamReader(connection.getInputStream(), CHARSET_ENCONDING));
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();
}
}
return result;
} private static final String getInternetIP(String url, String regexPattern) {
String ret = null;
String html = sendGet(url, null);
Pattern pattern = Pattern.compile(regexPattern);
Matcher matcher = pattern.matcher(html);
if(matcher.find()) {
ret = matcher.group(0);
}
return ret;
} private static void updateIP(Map<String, String> config) throws Exception {
String ip = null;
if(config.containsKey(KEY_IP_URL) && config.containsKey(KEY_IP_REGEX_PATTERN)) {
ip = getInternetIP(config.get(KEY_IP_URL), config.get(KEY_IP_REGEX_PATTERN));
}else {
throw new RuntimeException("获取外网ip的参数不足");
}
IClientProfile clientProfile = DefaultProfile.getProfile("cn-hangzhou", config.get(KEY_ACCESS_KEY), config.get(KEY_ACCESS_SECRET));
IAcsClient client = new DefaultAcsClient(clientProfile);
DescribeDomainRecordsRequest request = new DescribeDomainRecordsRequest();
request.setDomainName(config.get(KEY_DOMAIN));
DescribeDomainRecordsResponse response;
boolean flag = false;
response = client.getAcsResponse(request);
for(Record record : response.getDomainRecords()) {
if(record.getRR().equalsIgnoreCase(config.get(KEY_RR))&&record.getType().equalsIgnoreCase("A")) {
String old_ip = record.getValue();
String cur_ip = ip;
flag = true;
if(!old_ip.equals(cur_ip)){
UpdateDomainRecordRequest udr_req = new UpdateDomainRecordRequest();
udr_req.setValue(cur_ip);
udr_req.setType(record.getType());
udr_req.setTTL(record.getTTL());
udr_req.setPriority(record.getPriority());
udr_req.setLine(record.getLine());
udr_req.setRecordId(record.getRecordId());
udr_req.setRR(record.getRR());
UpdateDomainRecordResponse udr_resp = client.getAcsResponse(udr_req);
System.out.println(udr_resp.toString());
}else{
System.out.println("不需要修改");
}
}
}
if(flag == false) {
throw new RuntimeException("无法找到RR="+config.get(KEY_RR));
} } private static Map<String,String> parseArgs(String[] args){
Map<String,String> ret = new HashMap<String, String>();
for(int i=0;i<args.length;) {
if(args[i].startsWith("-")) {
ret.put(args[i], args[i+1]);
i+=2;
}else {
i++;
}
}
return ret;
} /**
* -k xxx -s xxxx -d xxx.cn -rr www -url xxxx -reg (\d+\.){3}\d+
* @param args
*/
public static void main(String[] args) {
try{
Map<String,String> config = parseArgs(args);
updateIP(config);
}catch(Exception e){
System.out.println(e);
}
}
}
以上代码为简化运行环境,参数没做更多正确性检验, 生成可执行jar包, 通过命令行参数即可实现动态域名解析。再放入计划任务,自动更新……
使用阿里云Java SDK 实现 DDNS的更多相关文章
- 通过python将阿里云DNS解析作为DDNS使用
通过python将阿里云DNS解析作为DDNS使用 脚本需要Python2.x运行 安装alidns python sdk sudo pip install aliyun-python-sdk-ali ...
- 阿里云 OCS SDK for NodeJS介绍
阿里云 OCS SDK for NodeJS介绍 阿里云技术团队:熊亮 阿里云 SDK for NodeJS 是为 NodeJS 开发者提供使用阿里云各项服务的统一入口,由阿里云UED团队负责开发维护 ...
- 使用阿里云Python SDK管理ECS安全组
准备工作 本机操作系统:CentOS7 python版本:python2.7.5 还需要准备如下信息: 一个云账号.Access Key ID.Access Key Secret.安全组ID.Regi ...
- 阿里云 .NET SDK Roa 和 Rpc 风格签名
阿里云 .NET SDK Roa 和 Rpc 风格的签名 Demo,适用于自己不想用其提供的SDK,想用自己组装 Roa 和 Rpc 的签名方式. Roa 和 Rpc 的签名方式主要有以下几个不同点: ...
- 快速上手阿里云oss SDK
使用阿里云oss SDK 依赖安装: pip install oss2 pip install aliyun-python-sdk-sts 版本最好是 2.7.5 或以上 如果要开启 crc64 循环 ...
- 揭秘阿里云 RTS SDK 是如何实现直播降低延迟和卡顿
作者:予涛 途坦 这个夏天,没什么能够比一场酣畅淋漓的奥运比赛来的过瘾.但是,在视频平台直播观看比赛也有痛点:"卡顿" 和 "延时".受限于不同地域.复杂的网络 ...
- 阿里云直播SDK - .NET
阿里云sdk:https://develop.aliyun.com/sdk/csharp?spm=5176.doc27234.2.4.QiJb9l Github:https://github.com/ ...
- thinkPHP中怎么使用阿里云的sdk
使用阿里云官方给的方法总会报错 Class 'Home\Controller\DefaultProfile' not found 这样是因为namespace的原因,将aliyun sdk 放在con ...
- 从0开始搭建一个阿里云java部署环境
一.购买服务器 https://www.aliyun.com/daily-act/ecs/activity_selection?spm=5176.8112568.738194.8.674c9ed53Y ...
随机推荐
- 【等价转换】—— min/max 的转换与互相转换
0. min 与 max 的转换 {max(X,Y)=X+Y−min(X,Y)min(X,Y)=X+Y−max(X,Y)min(X,Y)+max(X,Y)=X+Y" role="p ...
- 安装系统后IP配置问题
1.配置静态IP 在/etc/sysconfig/network-script/ifcfg-eth0 文件,网卡管理文件.修改为静态IP.IPADDR.网关.掩码等 同一台机器上的网卡不能配置在同一网 ...
- mysql数据库简单一些简单操作和总结
1. mysql 数据库操作方法: 进入数据库 mysql -uroot -p 退出 quite exit 默认引擎 innodb 查看版本 select verison(); 查看时间 select ...
- adv生成控制器手腕位置倾斜原因以及解决方案
系统默认问题导致手腕倾斜详情描述: 手腕部分默认生成轴向是冲向模板下一层级第一个物体 简单说就是 FK轴向冲向模板中指方向 如图 默认模板没问题是因为 默认模板没有改动情况下系统中指与手腕在一条直 ...
- ubuntu18安装navicat
1.登陆 http://www.navicat.com.cn/download/navicat-for-mysql 页面下载navicat安装包,务必选位置1-64bit ps: 中文版乱码问题严重, ...
- github/gitee使用办法2
打开自己的仓库 git pull 把内容复制过去 git add . 添加所有 查看状态 git status 提交 git commit -m 'XXX' 最后push git push 如果内容本 ...
- robotframework之滚动条
在测试过程中遇到侧边栏以及下拉框中元素超过div长度时,会自动增加滚动条 网上对于robotframework中的滚动条信息只有: Execute Javascript document.docume ...
- 使用kingshard遇到的坑
禁止用mysqldump 连接kingshard, 会导致表锁死 读取NULL值变为文本 通过kingshard连接 select出来的null值变为文本"NULL" kingsh ...
- mvc项目远程发布到windows server服务器
1.安装IIS的时候需要将这两个选项勾选起来 2.确保 管理服务委派 这个选项存在 3.添加委派规则 4.配置IIS管理用户,后续需要用这个用户进行发布连接 5.配置站点的IIS权限 选择刚才在前面设 ...
- Visual Studio安装Visual Assist的办法(兼容VS2010至VS2017)
Visual Assist可以说是一个码代码的高效帮手,有了它,敲起代码速度杠杠的,但是有时候安装破解老是出问题,这一次,我自己尝试了几次,跟着网上的教程做了做,改了改,结合之前安装的经验,最后总算安 ...