使用阿里云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 ...
随机推荐
- python学习1---列表、矩阵、数组
1.列表与数组区别 numpy数组的所有元素类型是相同的,而列表的元素类型是任意的. 2.numpy数组与矩阵区别 矩阵必须是二维的,数组可以是多维的,matrix是array的一个分支. matri ...
- react+umi+dva+antd中dva的数据流图解
- Python学习笔记,day5
Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...
- 2.go的变量和常量
go的变量和常量 GO的变量: 变量的声明: 先对变量进行声明,在对其赋值 var variableName type variableName = typeValue var number int ...
- java项目---遍历系统文件(1星)
package Demo; import java.io.*; public class TraversalContent { public static void main(String []arg ...
- 关于使用git上传远程仓库的两种情况(新项目与老项目)
具体的git配置与github仓库ssh配置在这里就不再赘述,本次只讲自己之前遇到的两个内容 1.还没有项目,将远程仓库clone下来直接在里边写项目. 2.已有项目,将已有的项目直接添加到建立好的远 ...
- 20164301 Exp5 MSF基础应用
Exp5 MSF基础应用 1. 实践内容 1.1一个主动攻击实践,如ms08_067,smb_delivery(唯一) 1.2 一个针对浏览器的攻击,如ms10_046: 1.3 一个针对客户端的攻击 ...
- 11. IDS (Intrusion detection systems 入侵检测系统 6个)
Snort该网络入侵检测和防御系统擅长于IP网络上的流量分析和数据包记录. 通过协议分析,内容研究和各种预处理器,Snort可以检测到数千个蠕虫,漏洞利用尝试,端口扫描和其他可疑行为. Snort使用 ...
- 【爬虫】如何用python+selenium网页爬虫
一.前提 爬虫网页(只是演示,切勿频繁请求):https://www.kaola.com/ 需要的知识:Python,selenium 库,PyQuery 参考网站:https://selenium- ...
- C#利用首尾時間計算中間時間差
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...