• 利用Python+阿里云实现DDNS(动态域名解析)


    利用Python+阿里云实现DDNS(动态域名解析)

    因需求公司路由器公网ip不是动态的,需要及时的修改阿里云的域名解析

    前期准备

    二、准备
    
    1、公网IP(向运营商申请的动态IP)
    
    2、域名(通过阿里云购买的域名)
    
    3、可以运行python程序的服务器(路由器/电脑/树莓派)
    
    4、安装两个Python-SDK库
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    # 核心库
    pip install aliyun-python-sdk-core
    # 域名库
    pip install aliyun-python-sdk-alidns
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    aliyunsdkcore.acs_exception.exceptions.ClientException

    如果出现该报错:aliyunsdkcore.acs_exception.exceptions.ClientException: SDK.HttpError (‘Connection aborted.’, ConnectionResetError(104, ‘Connection reset by peer’))

    安装另一个核心库即可,安装代码如下:

    pip install aliyun-python-sdk-core-v3
    
    
    • 1
    • 2

    python安装

    aliyun-python-sdk-core-v3
    aliyun-python-sdk-alidns==2.0.6   #版本自定义
    
    • 1
    • 2

    image-20220907105028906

    阿里云获取 AccessKey

    通过阿里云控制台进入RAM访问控制页面新建子用户,获取 AccessKey ID 和 AccessKey Secret

    image-20220907105426396

    创建用户

    image-20220907105455328

    image-20220907105535627

    创建成功

    image-20220907105556958

    实现逻辑

    1、获取当前IP

    2、存储获取到的IP

    3、比对IP(因为阿里云不允许修改相同的解析,所以需要比对IP是否有变化)

    4、获取解析记录列表

     # 获取公网IP并进行修改
        def Get_IPv4(self):
    
            # 获取IP方法一
            ipv4 = json.load(urlopen('http://jsonip.com'))['ip']
            print("获取到IPv4地址:%s" % ipv4)
    
            # 获取IP方法二,爬取IP地址
            # ipv4 = getip()
    
            request = DescribeSubDomainRecordsRequest()
            request.set_accept_format('json')
            request.set_DomainName(self.domain)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    完整代码如下

    from aliyunsdkcore.client import AcsClient
    from aliyunsdkalidns.request.v20150109.DescribeSubDomainRecordsRequest import DescribeSubDomainRecordsRequest
    from aliyunsdkalidns.request.v20150109.DeleteSubDomainRecordsRequest import DeleteSubDomainRecordsRequest
    from urllib.request import urlopen
    import json
    
    class Dnscontroller:
    
        access_key_id = ""
        #阿里云的新建账户id
        access_key_secret = ""
        
        region = ""
        #时区
        record_type = "A"
    
        domain = ""
        #上面是你的一级域名
        name_ipv4 = ["二级域名1","二级域名2","二级域名3","二级域名4","二级域名5"]
        #上面是你要修改的域名,我们的比较多,然后呢就以数组的方式去挨个修改
    
        def __init__(self):
            self.client = AcsClient(
                self.access_key_id,
                self.access_key_secret,
                self.region
            )
    
        # 添加新的域名解析记录
        def add(self, 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 = self.client.do_action_with_exception(request)
    
        # 修改域名解析记录
        def update(self, 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 = self.client.do_action_with_exception(request)
    
        # 获取公网IP并进行修改
        def Get_IPv4(self):
    
            # 获取IP方法一
            ipv4 = json.load(urlopen('http://jsonip.com'))['ip']
            print("获取到IPv4地址:%s" % ipv4)
    
            # 获取IP方法二,爬取IP地址
            # ipv4 = getip()
    
            request = DescribeSubDomainRecordsRequest()
            request.set_accept_format('json')
            request.set_DomainName(self.domain)
    
            for item in self.name_ipv4:
                request.set_SubDomain(item + '.' + self.domain)
                response = self.client.do_action_with_exception(request)
                domain_list = json.loads(response)
    
                if domain_list['TotalCount'] == 0:
                    self.add(self.domain, item, self.record_type, ipv4)
                    print("新建域名:" + item + ",解析成功")
    
                elif domain_list['TotalCount'] == 1:
                    if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ipv4.strip():
                        self.update(domain_list['DomainRecords']['Record'][0]['RecordId'], item, self.record_type, ipv4)
                        print("修改域名:" + item + ",解析成功")
                    else:
                        print("IPv4地址没变")
    
                elif domain_list['TotalCount'] > 1:
                    # 删除所有解析过的记录,并重新添加新的解析记录
                    request = DeleteSubDomainRecordsRequest()
                    request.set_accept_format('json')
                    request.set_DomainName(self.domain)
                    request.set_RR(item)
                    response = self.client.do_action_with_exception(request)
                    self.add(self.domain, item, self.record_type, ipv4)
                    print("修改域名解析成功")
    
    if __name__ == "__main__":
        Dnscontroller().Get_IPv4()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    image-20220907111254788

    最终运行

    image-20220907111334955

    linux服务器上面添加计划任务定时执行

    安装python3.7

    网上找一下文档这里我就省略到了

    wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
    
    • 1

    在linux上执行python

    步骤1;先查找python的 绝对路径
    使用 which 查询 python3 解释器所在路径
    
    • 1
    • 2

    image-20220907140048715

    安装阿里云DNS依赖
    pip3 install pyyaml
    pip3 install aliyun-python-sdk-core-v3
    pip3 install aliyun-python-sdk-alidns==2.0.6
    
    • 1
    • 2
    • 3

    image-20220907141509199

    修改要运行的 主 python 文件,在第一行增加以下内容

    #! /usr/bin/python3

    • #!这个符号叫做 Shebang 或者 Sha-bang
    • Shebang 通常在 Unix 系统脚本的中 第一行开头 使用
    • 指明 执行这个脚本文件解释程序

    image-20220907140148055

    骤2;先找的python这个文件的路径

    上传到服务器上

    image-20220907140331788

    步骤;给文件一个可以执行权限

    修改 主 python 文件 的文件权限,增加执行权限
    $ chmod +x dns.py

    image-20220907140513767

    步骤;运行测试
    root@192:~/python_dns# python3 dns.py 
    获取到IPv4地址:xxxxxxxxx
    IPv4地址没变
    IPv4地址没变
    IPv4地址没变
    IPv4地址没变
    IPv4地址没变
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20220907141619318

    添加Crontab的使用

    配置计划任务每天执行

    一、Crontab的安装

    1、Debian下面安装Crontab

    apt-get install cron //大部分情况下Debian都已安装。
    /etc/init.d/cron restart //重启Crontab

    二、Crontab使用方法

    1、查看crontab定时执行任务列表

    crontab -l
    1
    2、添加crontab定时执行任务

    crontab -e
    ————————————————

    0 9 * * 1  python3 /root/python_dns/dns.py  > dns.log   #每周一早上9点执行这个python
    
    • 1

    image-20220907151819934

    装。
    /etc/init.d/cron restart //重启Crontab

    二、Crontab使用方法

    1、查看crontab定时执行任务列表

    crontab -l
    1
    2、添加crontab定时执行任务

    crontab -e
    ————————————————

    0 9 * * 1  python3 /root/python_dns/dns.py  > dns.log   #每周一早上9点执行这个python
    
    • 1

    [外链图片转存中…(img-yVBcSUP9-1662623656428)]

  • 相关阅读:
    Openlayer【三】—— 绘制多边形&GeoJson边界绘制
    学习vue笔记一——初识vue
    事件修饰符
    C语言的结构体
    数据库实践 Hw05
    【gpt实践】50个提升工作效率的GPT指令
    丑单2023秋招笔试第二题 我好想逃却到不掉.jpg (C++ DFS)
    k8s集群的CA证书过期处理
    Java:比较两个字符串是否相等
    数据结构之详解【Map和Set】
  • 原文地址:https://blog.csdn.net/tianmingqing0806/article/details/126766229