python版本简易阿里云ddns
为了给macmini改造成nas,以前装了win10用于smb共享,不料总是自动关机,下狠心再次改造,这次用直接用macos希望可以稳定无故障
以前的win使用php做了一个ddns脚本,加入到任务计划中重复执行。macos装php比较费劲索性拿python重做一份。
网上找了好多案例写的太复杂,其实我只要干两件事儿,查询当前ip,然后变更解析到当前ip。
于是我就动手重写个简单的,我用的python3 和阿里云推荐sdk
这里给大家下载地址
pip install alibabacloud_alidns20150109==3.1.0
aliddns.py 代码开始
import os
import sys
from datetime import datetime
from alibabacloud_alidns20150109.client import Client as DNSClient
from alibabacloud_tea_openapi import models as api_models
from alibabacloud_alidns20150109 import models as dns_models
import requests
class DDNS:
domain = 'abc.com' #你的域名
rr = 'www' #主机记录,子域名
def __init__(self) -> None:
pass
def initialization(self):
AccessKeyId = 'xxxxxx' # 阿里云自行获取
AccessKeySecret = 'xxxxxxx' # 阿里云自行获取
api_conf = api_models.Config(access_key_id=AccessKeyId,access_key_secret=AccessKeySecret)
return DNSClient(api_conf)
def getIP(self):
#这里需要自备一个获取ip地址的页面,自编代码来读取页面中的纯ip地址 如 66.220.232.111
#我的页面返回内容是 [123.22.111.66] 形式,所以代码是去掉左右两个[]
return requests.get('一个能获取当前主机ip地址的页面').text[1:-1]
def domain_recored(self,client:DNSClient,domain:str,rr:str):
req = dns_models.DescribeDomainRecordsRequest(direction=None,domain_name=domain,rrkey_word=rr,type='A')
resp = client.describe_domain_records(req)
record = resp.body.domain_records.record[0]
return record
def update_record(self,client:DNSClient,rr,rid,ip):
req = dns_models.UpdateDomainRecordRequest(rr=rr,record_id=rid,value=ip,type='A')
resp = client.update_domain_record(req)
def log(self,message):
cur_date = datetime.now()
path = os.path.dirname(__file__) #macOS不加路径文件会创建在 “/user/用户名/” 下
fname = path+'/'+cur_date.strftime("%Y-%m-%d") + '.log'
message = cur_date.strftime("[%Y-%m-%d %H:%M:%S] ") + message +"\n"
with open(file=fname,mode='a',encoding='utf-8') as file:
file.writelines(message)
file.flush()
file.close()
print(message)
def main(self):
client = self.initialization()
record = self.domain_recored(client,self.domain,self.rr)
ip = self.getIP()
log_str = 'local='+ ip + ' record='+record.value
if ip != record.value:
##ip与记录值不一致,更新记录,写日志
self.update_record(client,self.rr,record.record_id,ip)
record_new = self.domain_recored(client,self.domain,self.rr) # 再次查询确保完成更新,因为是自动定时运行所以没做更新失败的处理
log_str += ' update record '+record_new.value # 这三行都是为了写日志
self.log(log_str) #如果不希望有日志存在可以都删掉
if __name__ == '__main__':
ddns = DDNS()
ddns.main()
命名为alidddns.py完结
如果要使用此代码建议大家在脚本中追加本页面的url,以后阿里云更新了sdk或者我更新了内容可以来这找。
最后需要加入crontab
#添加ddns到mac crontab 每两分钟同步一次
*/2 * * * * /usr/local/bin/python3 /Users/tophalo/ddns/aliddns.py
Crontab使用方法看我另一篇避坑文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现