python配合阿里云域名解析实现DDNS功能

前置工作

  1. 安装阿里模块
pip install aliyun-python-sdk-core-v3 
pip install aliyun-python-sdk-alidns==3.0.1
  1. 阿里云获取 AccessKey

实现代码

import os
import socket
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 = ""
    access_key_secret = ""

    region = ""
    # 时区
    record_type = "A"

    domain = "langzihan.top"
    name_ipv4 = ["p330"]

    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)

    # 实现ddns
    def update_target_dns(self, ip_address):
        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, ip_address)
            else:
                if domain_list['DomainRecords']['Record'][0]['Value'].strip() != ip_address.strip():
                    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, ip_address)


def main():
    root_path = '.'
    log_path = root_path + '/ip_log.log'
    fa = open(log_path, 'a', encoding='utf-8')
    cur_ip = socket.gethostbyname(socket.gethostname())
    if not os.path.isfile(log_path) and fa.read().strip() == '':
        fa.write(cur_ip + '##')
        DnsController().update_target_dns(cur_ip)
        fa.close()
        return 0

    with open(log_path, 'r', encoding='utf-8') as fr:
        old_ip = fr.read().strip('##').split('##')[-1]
        if old_ip != cur_ip or old_ip is None:
            # print('old:', old_ip)
            fa.write(cur_ip + '##')
            DnsController().update_target_dns(cur_ip)

    fa.close()


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我徐先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值