这一篇,讲述了通过 阿里云API 进行动态修改 “域名解析” 服务的方法,附带完整源代码(包括阿里云SDK)可以直接编译运行。

附源码:源码

讨论QQ群: 296538273


1. 前期准备工作


  • 1.1 访问 http://www.aliyun.com 创建AccessKey,如果已经有Key可以不用创建,AccessKey 是调用阿里API接口的一个身份验证。如下图所示:

    1.2 下载SDK
    访问 https://oss.sonatype.org/#nexus-search;gav~com.aliyun~aliyun-java-sdk-*~~~ 可以下载 SDK;
    访问 https://github.com/aliyun/aliyun-openapi-java-sdk/ 下载最新 SDK 源码
    个人感觉下载源码使用比较方便,因为源码里面有各种产品线 API 接口,可以自行提取裁剪,如下图所示:

    其实我们只是用到了其中红色方框中的云解析、域名API,下载我的源码,里面已经提取了响应的API源码。
    1.3 提取所用API源码如下图所示:

    我们只用到了 alidns 和 core 2个库。
    1.4 创建ddns工程如下:

2. 编写代码:


  • 2.1 主要请求的代码在 com.ddns 包的 ddns.java中,具体实现步骤如下:
    1) 首先,我们要知道若要更改自已的域名解析值需要获取到详细的域名解析记录;
    2) 其次,找到我们需要更新的域名解析记录,进行更新操作;
    注意: 阿里云的所有API请求都是标准的 Http 协议。

    // 1. 获取域名解析记录
    
    // 通过查询API接口可以得到 Action
    public static String GetDomainRecords() {Map<String, String> parameters = GetPublicParams();parameters.put("Action", "DescribeDomainRecords");        parameters.put("DomainName", "你的域名.com");return GetRequestStr("GET", SERVER_URL, parameters);
    }
    
    // 查询API文档可知除了 Action, DomainName的可变参数之外,还有一些公共固定参数如下:
    
    // 这些是请求的固定参数
    private static Map<String, String>GetPublicParams() {Map<String, String> parameters = new HashMap<String, String>();// insert paramsparameters.put("Action", "DescribeDomainRecords");        parameters.put("DomainName", DOMAIN_NAME);parameters.put("AccessKeyId", ACCESS_KEY);parameters.put("Format", "JSON");                parameters.put("SignatureMethod", SIG_METHOD);parameters.put("SignatureVersion", SIG_VER);parameters.put("SignatureNonce", UUID.randomUUID().toString());parameters.put("Timestamp", formatIso8601Date(new Date()));        parameters.put("Version", ALIYUN_API_VER);return parameters;
    }
    
    // 获取完整的 Http 请求 url
    
    private static String GetRequestStr(String HttpMethod, String host, Map<String, String> params) {final String SEPARATOR = "&";        // param sort, Upper and Lower not equalString[] sortedKeys = params.keySet().toArray(new String[]{});Arrays.sort(sortedKeys);// create stringToSign strStringBuilder stringToSign = new StringBuilder();stringToSign.append(HttpMethod).append(SEPARATOR);try {stringToSign.append(percentEncode("/")).append(SEPARATOR);} catch (UnsupportedEncodingException e) {e.printStackTrace();}StringBuilder canonicalizedQueryString = new StringBuilder();for(String key : sortedKeys) {// encode key, valuetry {canonicalizedQueryString.append(SEPARATOR).append(percentEncode(key)).append("=").append(percentEncode(params.get(key)));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}// encode canonicalizedQueryStringtry {stringToSign.append(percentEncode(canonicalizedQueryString.toString().substring(1)));} catch (UnsupportedEncodingException e) {e.printStackTrace();}String http_request = new String();StringBuilder httpRequest = new StringBuilder();        try {String signature = GetSignature(stringToSign.toString());httpRequest.append("http://");httpRequest.append(host);httpRequest.append("/?");httpRequest.append(canonicalizedQueryString.toString().substring(1));httpRequest.append("&Signature=");httpRequest.append(percentEncode(signature));} catch (Exception e) {e.printStackTrace();}return httpRequest.toString();
    }
    // 生成阿里签名 [https://help.aliyun.com/document_detail/29747.html?spm=5176.doc29739.6.588.Ntca1z](API%E6%96%87%E6%A1%A3)
    
    // 通过API文档可以查询具体的签名机制
    private static String GetSignature(String stringToSign) {// signature testfinal String ALGORITHM = "HmacSHA1";final String ENCODING = "UTF-8";String key = ACCESS_SECRT + "&";Mac mac = null;byte[] signData = null;try {mac = Mac.getInstance(ALGORITHM);mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));signData = mac.doFinal(stringToSign.getBytes(ENCODING));} catch (Exception e) {e.printStackTrace();}return new String(Base64.encodeBase64(signData));
    }
    // 先调用上述的GetDomainRecords(),再更新指定解析记录
    
    // 更新某一条域名解析记录
    public static String GetUpdateDomainRecord(String RecordID, String RR, String Type, String Value) {Map<String, String> parameters = GetPublicParams();// insert paramsparameters.put("Action", "UpdateDomainRecord");        parameters.put("RecordId", RecordID);parameters.put("RR", RR);parameters.put("Type", Type);parameters.put("Value", Value);return GetRequestStr("GET", SERVER_URL, parameters);
    }

3. 编译代码:


::返回到工程根目录下
cd .
::创建bin文件夹
mkdir bin
::获取所有java文件绝对路径保存到src.list文件中
dir /b/s src\*.java > src.list
::用src.list编译java文件
javac -encoding UTF-8 -sourcepath src -d bin -classpath "lib/*;" @src.list
::运行
java -classpath "bin;lib/*;" com.ddns.ddns

4. 运行结果:


黄色mark的地方是请求结果,红色方框是请求的API,至此获取、更新域名解析成功。

其他: 至于获取公网IP的办法,现在有很多,可以参考dtdns的源码里面有一个网址可以获取公网IP。

附源码:源码

通过阿里云API动态修改域名解析记录相关推荐

  1. 阿里云 SDK 动态IP域名解析

    阿里云提供 aliyun sdk,可以通过申请获得的 <accessKeyId> 和 <accessSecret> 在 sdk 环境下,直接控制相应账号下阿里云的所有产品,例如 ...

  2. ddns 动态解析 - 阿里云api自动解析家用服务器动态ip

    2019独角兽企业重金招聘Python工程师标准>>> 过年回老家办了带宽,大家都知道家用带宽是没有固定ip的一般使用花生壳之类的动态解析域名: 但是花生壳现在不好用,我使用阿里云a ...

  3. 阿里云DDNS动态绑定域名与IP实现远程调试远程办公

    之前申请了公网IP,这样调试接口的时候可以直接远程调试,但因为申请的公网IP会随时变化,所以使用阿里云DDNS服务,随时绑定公网IP,直接域名访问服务. 1.创建阿里云账号和访问密钥(AccessKe ...

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

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

  5. 阿里云域名 动态ip绑定 python方案

    阿里云域名 动态ip绑定 python方案 一.配置config.json 二.代码 三.打包执行 思路:阿里云提供dns域名解析api,查出外网ip,定时更新域名解析. 一.配置config.jso ...

  6. 阿里云DNS动态解析:解决内网服务外网访问

    阿里云DNS动态解析:解决内网服务外网访问 目录 注册阿里云账号获取AccessKeyId,AccessKeySecret并授权 阿里云关于DNS解析的SDK及API文档 代码实现 目录 注册阿里云账 ...

  7. 利用阿里云API为树莓派做DDNS

    引 一直想利用树莓派亲手搭建几种服务器来加深了解,奈何电信光猫每次重启后都会重新分配公网IP. 只能先想办法解决这个最基本的问题,起初的时候没想到该怎么搞.当时手里有一个便宜买的海外虚拟主机,打算让树 ...

  8. 基于Python2.7的阿里云API调用及运维相关

    基于Python2.7的阿里云API调用及运维相关 http://blog.chinaunix.net/uid-17291169-id-5212576.html 公司部分业务放在阿里云上面,虽然阿里云 ...

  9. 阿里云Api网关导入Swagger功能简介

    广告位 Api网关通过导入Swagger文件创建和更新Api的功能已经上线了,更多帅气功能会逐步推出 Api网关目标是让您发布应用更加便捷和安全,让您更直观.便捷的管理和调试您的所有Api接口 欢迎试 ...

最新文章

  1. 一作解读:Microbiome马铃薯疮痂病与土壤微生物组关系新进展
  2. 怎么将jsp中var报错_招聘中不得将全日制作为限制性条件,怎么就不公平了?
  3. 登录状态保持Session/Cookie
  4. CososJS学习笔记(1) 环境配置(填坑版,让你少走弯路!)
  5. ElasticSearch index 剖析
  6. vijos 观光旅游 最小环fl 呆详看
  7. jQuery DataTables
  8. tableau度量值计算_Tableau可视化(雷达图):漫威英雄能力值
  9. 用python爬取中南大学所有教师个人主页的个人简介
  10. 多思计组原理虚拟实验室_多思计算机组成原理虚拟实验室
  11. 计算机毕业设计java+jsp旅游网站(源码+系统+mysql数据库+Lw文档)
  12. 【LEDE】树莓派上玩LEDE终极指南-92-自己编译的LEDE为啥子不能用SSR和KoolProxy?
  13. html鼠标悬停效果加边框,js实现鼠标悬浮给图片加边框的方法
  14. 在电脑上如何直接下载秒拍的视频?
  15. JQuery选择器超级详细
  16. David P.Williams论文系列 SAS图像分辨率与目标检测性能的关系
  17. 整理的金蝶云苍穹初级练习题
  18. 向家坝水电站蓄水第五天老屏山县城没入金沙江-老屏山-水电站
  19. UNIX_C 高级编程七
  20. 使用 Struts 2 实现国际化

热门文章

  1. 解决设备行业尾款回收问题-深思精锐5加密锁-时钟版
  2. NKOI 3124 珍珠吊坠
  3. 致信oa系统服务器ip,致信客户端服务器ip
  4. u盘损坏无法读取怎么恢复数据?
  5. 污水处理程序西门子Wincc+S7-300污水处理大项目 带西门子Wincc上位机+S7-300程序
  6. Java实现字符串的截取和替换
  7. matlab产生方波脉冲和周期性方波信号
  8. JavaScript基础操作——获取元素 id class
  9. 物联网|蓝牙4.0BLE协议栈简介|IAR集成开发环境简介|IAR各版本下载链接|物联网之蓝牙4.0 BLE基础-学习笔记(2)
  10. 为什么汽车的中控屏不能用平板代替?