阿里云域名解析python代码,实时更新本地ip到阿里云的域名解析

pip install alibabacloud_alidns20150109==3.1.0

python代码,一分钟获取一次本地ip,先和本地记录校验,发现变化调用阿里云的API
 

# -*- coding: utf-8 -*-
import os
import requests
import sys
from typing import List
from time import sleep
import builtins

def print(*args, **kwargs):
    builtins.print("aliyun:", *args, **kwargs)

from alibabacloud_alidns20150109.client import Client as Alidns20150109Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_alidns20150109 import models as alidns_20150109_models


class DNSUpdater:
    def __init__(self):
        self.client = self.create_client()
        self.ip_file = 'aliyun_last_ip.txt'

    @staticmethod
    def create_client() -> Alidns20150109Client:
        config = open_api_models.Config(
            access_key_id='你的access_key_id',
            access_key_secret='你的access_key_secret'
        )
        config.endpoint = 'alidns.cn-hangzhou.aliyuncs.com'
        return Alidns20150109Client(config)

    @staticmethod
    def get_current_ip() -> str:
        return requests.get("https://api.ipify.org").text

    def read_last_ip(self) -> str:
        try:
            with open(self.ip_file, 'r') as file:
                return file.read().strip()
        except FileNotFoundError:
            return ""

    def write_last_ip(self, ip: str):
        with open(self.ip_file, 'w') as file:
            file.write(ip)

    def update_dns_record(self, domain_name: str, rr: str, ip: str):
        try:
            # 使用DescribeDomainRecords请求来获取当前的RecordId
            describe_request = alidns_20150109_models.DescribeDomainRecordsRequest(
                domain_name=domain_name,
                search_mode='EXACT',
                key_word=rr
            )
            describe_response = self.client.describe_domain_records(describe_request)
            records = describe_response.body.domain_records.record
            if records:
                if records[0].value != ip:
                    record_id = records[0].record_id
                    # 更新DNS记录
                    update_request = alidns_20150109_models.UpdateDomainRecordRequest(
                        record_id=record_id,
                        rr=rr,
                        type='A',
                        value=ip
                    )
                    self.client.update_domain_record(update_request)
                    print(f"DNS记录更新成功: {rr}.{domain_name} -> {ip}")
                    return True
                else:
                    print(f"网页DNS记录为{records[0].value}和本地ip{ip}相同")
                    return True
            else:
                print("未找到指定的DNS记录")
                return False
        except Exception as e:
            print(f"更新DNS记录时发生错误: {e}")
            return False

    def check_and_update_ip(self, domain_name: str, rr: str):
        current_ip = self.get_current_ip()
        last_ip = self.read_last_ip()
        print(f"当前IP: {current_ip}, 上一次IP: {last_ip}")
        if current_ip != last_ip:
            if self.update_dns_record(domain_name, rr, current_ip):
                self.write_last_ip(current_ip)
        else:
            print("IP地址未变更,无需更新DNS记录。")

    @staticmethod
    def main(args: List[str]):
        updater = DNSUpdater()
        # current_ip = updater.get_current_ip()
        # print(f"当前IP: {current_ip}")
        domain_name = '例如baidu.com'  # 更换为您的域名
        rr = 'www'  # 更换为您的子域名前缀,用于更新的记录
        while True:
            updater.check_and_update_ip(domain_name, rr)
            sleep(60)  # 等待60秒


if __name__ == '__main__':
    DNSUpdater.main(sys.argv[1:])

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值