1. 程式人生 > 實用技巧 >Python實現阿里雲域名DDNS

Python實現阿里雲域名DDNS

前言

  • 通過阿里雲的SDK來新增修改域名解析,檢查本機IP與解析的IP是否一致,若不同則自動修改解析,達到動態解析的目的,主要用於家庭寬頻這些動態IP的地方。

首先

  • IP必須為公網ip

  • 阿里域名

詳細步驟

  • 獲取accessKeyId和accessSecret

可以在阿里雲控制檯個人中心直接獲取。建議使用RAM角色來進行許可權控制,這樣的話安全風險較小。

  • 安裝對應的依賴包

    pip3 install aliyun-python-sdk-core-v3 
    pip3 install aliyun-python-sdk-domain
    pip3 install aliyun-python-sdk-alidns
    pip3 install requests
    //本人使用的是Python3
  • 使用指令碼

    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest
    from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
    import requests
    from urllib.request import urlopen
    import json
    
    ipv4_flag = 1  # 是否開啟ipv4 ddns解析,1為開啟,0為關閉
    ipv6_flag = 0  # 是否開啟ipv6 ddns解析,1為開啟,0為關閉
    accessKeyId = "accessKeyId"  # 將accessKeyId改成自己的accessKeyId
    accessSecret = "accessSecret"  # 將accessSecret改成自己的accessSecret
    domain = "baidu.com"  # 你的主域名
    name_ipv4 = "www"  # 要進行ipv4 ddns解析的子域名
    name_ipv6 = "ipv6.test"  # 要進行ipv6 ddns解析的子域名
    
    
    client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou')
    
    def update(RecordId, RR, Type, Value):  # 修改域名解析記錄
        from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
        request = UpdateDomainRecordRequest()
        request.set_accept_format('json')
        request.set_RecordId(RecordId)
        request.set_RR(RR)
        request.set_Type(Type)
        request.set_Value(Value)
        response = client.do_action_with_exception(request)
    
    
    def add(DomainName, RR, Type, Value):  # 新增新的域名解析記錄
        from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest
        request = AddDomainRecordRequest()
        request.set_accept_format('json')
        request.set_DomainName(DomainName)
        request.set_RR(RR)   
        request.set_Type(Type)
        request.set_Value(Value)
        response = client.do_action_with_exception(request)
    
    
    if ipv4_flag == 1:
        request = DescribeSubDomainRecordsRequest()
        request.set_accept_format('json')
        request.set_DomainName(domain)
        request.set_SubDomain(name_ipv4 + '.' + domain)
        response = client.do_action_with_exception(request)  # 獲取域名解析記錄列表
        domain_list = json.loads(response)  # 將返回的JSON資料轉化為Python能識別的
    
        ip = urlopen('https://api-ipv4.ip.sb/ip').read()  # 使用IP.SB的介面獲取ipv4地址
        ipv4 = str(ip, encoding='utf-8')
        print("獲取到IPv4地址:%s" % ipv4)
    
        if domain_list['TotalCount'] == 0:
            add(domain, name_ipv4, "A", ipv4)
            print("新建域名解析成功")
        elif domain_list['TotalCount'] == 1:
            if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ipv4.strip():
                update(domain_list['DomainRecords']['Record'][0]['RecordId'], name_ipv4, "A", ipv4)
                print("修改域名解析成功")
            else:   
                print("IPv4地址沒變")
        elif domain_list['TotalCount'] > 1:
            from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest
            request = DeleteSubDomainRecordsRequest()
            request.set_accept_format('json')
            request.set_DomainName(domain)   
            request.set_RR(name_ipv4)
            response = client.do_action_with_exception(request)
            add(domain, name_ipv4, "A", ipv4)
            print("修改域名解析成功")
    
    if ipv6_flag == 1:
        request = DescribeSubDomainRecordsRequest()
        request.set_accept_format('json')
        request.set_DomainName(domain)
        request.set_SubDomain(name_ipv6 + '.' + domain)
        response = client.do_action_with_exception(request)  # 獲取域名解析記錄列表
        domain_list = json.loads(response)  # 將返回的JSON資料轉化為Python能識別的
    
        ip = urlopen('https://api-ipv6.ip.sb/ip').read()  # 使用IP.SB的介面獲取ipv6地址
        ipv6 = str(ip, encoding='utf-8')
        print("獲取到IPv6地址:%s" % ipv6)
    
        if domain_list['TotalCount'] == 0:
            add(domain, name_ipv6, "AAAA", ipv6)
            print("新建域名解析成功")
        elif domain_list['TotalCount'] == 1:
            if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ipv6.strip():
                update(domain_list['DomainRecords']['Record'][0]['RecordId'], name_ipv6, "AAAA", ipv6)
                print("修改域名解析成功")
            else:   
                print("IPv6地址沒變")
        elif domain_list['TotalCount'] > 1:
            from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest
            request = DeleteSubDomainRecordsRequest()
            request.set_accept_format('json')
            request.set_DomainName(domain)
            request.set_RR(name_ipv6)   
            response = client.do_action_with_exception(request)
            add(domain, name_ipv6, "AAAA", ipv6)
            print("修改域名解析成功")
    

      

    複製程式碼,然後使用編輯器開啟,按照註釋提示修改並儲存。

  • 執行程式碼

      執行程式碼

  • 設定定時執行程式碼

     設定定時執行,方法自行百度(主要是自己百度出來的沒有成功)
    本人安裝了寶塔面板於是直接在寶塔面板設定定時即可

編輯於:2020-10-22