家用的动态公网IP在断电以及一段时间后会变化,现在家宽公网IP开网盘以及代理管得越来越严格,已经有检测到被封的案例
上海检测web封停
这让我这种挂种子的PT党(迫真)感到害怕
以前我把国外的免费域名通过Cloudflare的免费动态解析到自己的路由器上,因为国外的免费域名不能备案,怕被查水表(似乎这么久也没挨停机,或许广西比较宽松),为防止万一,在阿里的万网上整了一个几块钱一年的域名来备案解析
看了一圈下来阿里似乎没有提供现成的DDNS动态域名解析,只能自力更生了
参考:使用python实现阿里云动态域名解析DDNS
不过这篇文章有一点过时,里面提到的一些函数已经不可用
于是查阅阿里的SDK说明
云解析API说明
实现思路
1.每天定时查询(例如使用crontab)本机IP,与阿里云DNS的A记录做对比
2.如果不同就更新A记录
代码
import json,requestsfrom aliyunsdkcore.client import AcsClientfrom aliyunsdkcore.acs_exception.exceptions import ClientExceptionfrom aliyunsdkcore.acs_exception.exceptions import ServerExceptionfrom aliyunsdkalidns.request.v0109.UpdateDomainRecordRequest import UpdateDomainRecordRequestfrom aliyunsdkalidns.request.v0109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequestclient = AcsClient('***', '*****', 'cn-hangzhou')request = DescribeSubDomainRecordsRequest()request.set_accept_format('json')request.set_SubDomain("***.***")response = client.do_action_with_exception(request)print(str(response, encoding='utf-8'))old=json.loads(str(response, encoding='utf-8'))old=old["DomainRecords"]["Record"][0]["Value"]now=requests.get("/dyndns/getip")now=now.text.replace("\n", "")if(now!=old):print(old,"需要更新为",now)request = UpdateDomainRecordRequest()request.set_accept_format('json')request.set_RecordId("*****")request.set_RR("dns")request.set_Type("A")request.set_Value(now)response = client.do_action_with_exception(request)print(str(response, encoding='utf-8'))