用Delphi调用阿里云的OpenAPI更新动态域名解析记录
家里一直是电信的宽带,虽然只是200M下行30M上行的平均水平,但是对于平时下载量不大的我来说已经绰绰有余了,很多时候需要从外网访问家里的NAS的资料,但是因为不是固定IP,每次一重启路由器或者每隔几天,家里的IP地址都是变动一下,前阵子一直使用docker安装了一个阿里云的DDNS软件非常好用,突然有一天不更新IP到阿里云的服务器上了,又加上自己的管理软件的服务端是安装到Windows下(用unRaidNAS虚拟了一个WindowsServer),所以干脆想办法把这个功能加到自己的管理服务端软件上,这时候开始祭出我们的工具Delphi。(前几篇文章已经说了如何安装社区版的Delphi和如何在unRaid下虚拟Windows)。
在正式操作之前,首先说明下使用aliyun的DDNS的基本条件。
1、这个也是最最关键的必不可少的一步,就是你家必须要有公网IP,现在很多地方宽带供应商只给内网IP(特别是移动和联通),如果是电信的话,可以打10000号免费开通公网IP功能,至于给不给你开,看各地的政策。反正我家一直是公网IP。
2、你得有个阿里云的域名,如果没有,赶紧去阿里云上去买个,不差钱的可以买个.com、.cn的,如果只是玩玩的可以买个.xyz等超级便宜的域名。至于腾讯云的域名,有两种方法:你可以把域名改为阿里云托管,也可以将下面的代码稍微改动改成腾讯云的。因为我只有阿里云的域名,所以没法测试腾讯云的,这里就不改动了
3、获得阿里云的访问key和访问key的密钥。这个在你登录阿里云后,在头像上点击鼠标左键会弹出来一个菜单,就可以直接看到。这里也给个建议,最好不要用主key和密钥,因为一旦泄露,也就是将你的阿里云的所有权限暴露给别人了,所以可以建立一个子用户key并且给他设置权限只能修改域名解析。
4、提前在阿里云的域名管理上建立一个新的二级域名,虽然可以通过代码添加,但是我觉得自己手工添加会更安全,至少不会让自己的域名列表不经意的多出很多无用的二级域名。
有了前面的几步,现在正是进入主题。代码写起来比较简单,只要根据阿里云的OpenAPI的文档编写就可以,当然你得学会看懂文档。很快我就将所有的代码完成,但是运行的时候一直提示错误,最主要错误就是一直提示签名值错误,这个签名值在我的理解也就是校验值,用来校验你是否有权限访问和修改域名解析。然后慢慢调试,在查看文档和阿里云公开的代码,发现有几个大坑,而在文档上却没有说明,当然也可能和每个编程工具的处理有点小关系,现在将每个大坑一一的说明下:
坑1:做签名值的时候,发现调试出来的签名值很长,几乎是官方计算出来的两到三倍,代码仔细看看没什么打问题,已经按照文档要求使用了URL编码后再进行HMAC_SHA1然后最后再进行BASE64编码,整个过程都没任何问题,而且编码函数经过测试也没问题。文档上也没有任何说明要做其他的编码或者转变。后来发现惊醒HMAC_SHA1编码的时候,一定要生成他的原始二进制数据,而我们正常情况下一般都是生成字符串数据,我了了个去!好了,现在生成的签名值已经和官方的签名值的长度一模一样。
Pascal
var
sSignByte: TBytes;
begin