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:])