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

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

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

前期准备

二、准备

1、公网IP(向运营商申请的动态IP)

2、域名(通过阿里云购买的域名)

3、可以运行python程序的服务器(路由器/电脑/树莓派)

4、安装两个Python-SDK库
# 核心库
pip install aliyun-python-sdk-core
# 域名库
pip install aliyun-python-sdk-alidns

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

python安装

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

利用Python+阿里云实现DDNS(动态域名解析)_第1张图片

阿里云获取 AccessKey

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

利用Python+阿里云实现DDNS(动态域名解析)_第2张图片

创建用户

利用Python+阿里云实现DDNS(动态域名解析)_第3张图片

利用Python+阿里云实现DDNS(动态域名解析)_第4张图片

创建成功

利用Python+阿里云实现DDNS(动态域名解析)_第5张图片

实现逻辑

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)

完整代码如下

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()

利用Python+阿里云实现DDNS(动态域名解析)_第6张图片

最终运行

利用Python+阿里云实现DDNS(动态域名解析)_第7张图片

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

安装python3.7

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

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

在linux上执行python

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

利用Python+阿里云实现DDNS(动态域名解析)_第8张图片

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

利用Python+阿里云实现DDNS(动态域名解析)_第9张图片

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

#! /usr/bin/python3

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

利用Python+阿里云实现DDNS(动态域名解析)_第10张图片

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

上传到服务器上

利用Python+阿里云实现DDNS(动态域名解析)_第11张图片

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

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

利用Python+阿里云实现DDNS(动态域名解析)_第12张图片

步骤;运行测试
root@192:~/python_dns# python3 dns.py 
获取到IPv4地址:xxxxxxxxx
IPv4地址没变
IPv4地址没变
IPv4地址没变
IPv4地址没变
IPv4地址没变

利用Python+阿里云实现DDNS(动态域名解析)_第13张图片

添加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

利用Python+阿里云实现DDNS(动态域名解析)_第14张图片

装。
/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

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

你可能感兴趣的:(自己总结,网络)