一、问题由来
昨天家里停电了,来电后IP地址改变了。但是并没有更新到域名解析数据上。所以感觉之前写的代码有一丝丝的不稳定。
今天重新写一个直接点的。直接查询域名服务器的解析地址,与本地公网IP地址比对,不同后执行修改解析Api自动修改解析地址。
本机环境
Ubuntu 20.04
注意:看本文之前请查看我前两篇文章,本文基于上述两篇文章编写。
获取IP发邮件
个人服务器实现阿里云DDNS(动态域名解析)
二、具体实施
1.阿里云获取解析地址api
根据传入参数获取指定主域名的所有解析记录列表
只需要填写域名即可
在你的服务器上安装此sdk
2.修改代码
首先修改代码删除其他我们不需要的数据,只留下解析IP。
import jsonmy_ip=str(response, encoding='utf-8')c = json.loads(my_ip)onlineIP=c['DomainRecords']['Record'][0]['Value']print(onlineIP)
我们将前面文章内的存储文件通过python的方法读取出来,做对比。
file = open('check_ip.text')#打开存储IP的文件localIP = file.readline().strip('\n')file.close()print(localIP)if onlineIP != localIP:# 对比是否有区别
如果两个文件内的IP地址不一样,则掉用调用阿里云修改解析地址的API进行修改。
整体代码下载
#!/usr/bin/env python3#coding=utf-8import jsonfrom urllib.request import urlopenfrom json import loadfrom aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.acs_exception.exceptions import ClientExceptionfrom aliyunsdkcore.acs_exception.exceptions import ServerExceptionfrom aliyunsdkcore.auth.credentials import AccessKeyCredentialfrom aliyunsdkcore.auth.credentials import StsTokenCredentialfrom aliyunsdkalidns.request.v0109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequestfrom aliyunsdkalidns.request.v0109.UpdateDomainRecordRequest import UpdateDomainRecordRequestcredentials = AccessKeyCredential('your-access-key-id', 'your-access-key-secret')# use STS Token# credentials = StsTokenCredential('<your-access-key-id>', '<your-access-key-secret>', '<your-sts-token>')client = AcsClient(region_id='cn-qingdao', credential=credentials)request = DescribeDomainRecordsRequest()request.set_accept_format('json')request.set_DomainName("你的域名")response = client.do_action_with_exception(request)# python2: print(response)my_ip=str(response, encoding='utf-8')c = json.loads(my_ip)onlineIP=c['DomainRecords']['Record'][0]['Value']print(onlineIP)file = open('check_ip.text')#打开存储IP的文件localIP = file.readline().strip('\n')file.close()print(localIP)if onlineIP != localIP:# 对比是否有区别print("Mismatch")my_ip = load(urlopen('/?format=json'))['ip']credentials = AccessKeyCredential('your-access-key-id', 'your-access-key-secret')# use STS Token# credentials = StsTokenCredential('<your-access-key-id>', '<your-access-key-secret>', '<your-sts-token>')client = AcsClient(region_id='cn-hangzhou', credential=credentials)request = UpdateDomainRecordRequest()request.set_accept_format('json')request.set_RecordId("8888888888")request.set_RR("@")request.set_Type("A")request.set_Value(my_ip)response = client.do_action_with_exception(request)# python2: print(response)print(str(response, encoding='utf-8'))else:print("Match with online")
‘your-access-key-id’, 'your-access-key-secret’记得替换成自己的。
保存在/usr/local/bin/test.py下,写进checkIP.sh文件。
将python3 test.py 写在If上面即可。