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使用方法看我另一篇避坑文章

posted @   光和环  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示