通过AI助手实现一个nas定时任务更新阿里云域名解析

一.通过AI助手实现一个ip-domain.py的脚本

起一个Python脚本,ip-domain.py;注意已安装Python3.+的运行环境;将下面阿里云相关配置添加,注意这里引用了两个包,requests和alibabacloud_alidns20150109;执行前需要安装一下,然后python ip-domain.py就可以尝试一下效果喽。

这里使用的是通义灵码辅助,虽然给出的提示无法直接执行,但是框架算是有了,然后结合阿里云API的Python版进行调整,最终结果如下:

这里分三个步骤:

①获取本地IP

②获取域名对应阿里云解析

③判断当前解析IP与本地域名IP不一致时,进行更新


# python ip-domain.py

import json
# pip install requests
import requests
from datetime import datetime
# pip install alibabacloud_alidns20150109==3.2.0
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
from alibabacloud_tea_util import models as util_models

# 阿里云相关配置
ALIYUN_ACCESS_KEY = "" # 阿里云查看accessKey
ALIYUN_SECRET_KEY = "" # 阿里云查看secretKey
ALIYUN_REGION_ID = ""  # 替换为您的实际地域ID
ALIYUN_DOMAIN_NAME = "" # 待解析的域名
ALIYUN_SUBDOMAIN = ""  # 带解析的子域名
ALIYUN_RECORD_TYPE = ""  # 解析类型为A记录
ALIYUN_RECORD_LINE = ""  # 默认线路或其他指定线路,默认default
ALIYUN_RECORD_ID = "" #解析记录的ID,可以通过域名列表F12查看

def get_local_ip():
    try:
        response = requests.get("https://api.ipify.org")
        return response.text.strip()
    except requests.exceptions.RequestException as e:
        print(f"Error getting local IP: {e}")
        return None

def get_current_dns_record(client, recordId):
    describe_domain_record_info_request = alidns_20150109_models.DescribeDomainRecordInfoRequest(
            record_id=recordId
        )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        response = client.describe_domain_record_info_with_options(describe_domain_record_info_request, runtime)
        print(f"GET DNS body: {response.body}")
        record_ip = response.body.value
        return record_ip
    except Exception as error:
        # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
        # 错误 message
        print(f"GET DNS error: {error}")
        return None

def update_dns_record(client, recordId, ipAddress, subDomain, recordType):
    request = alidns_20150109_models.UpdateDomainRecordRequest(
            record_id=recordId,
            value=ipAddress,
            rr=subDomain,
            type=recordType
        )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        response = client.update_domain_record_with_options(request, runtime)
        print(f"UPDATE DNS response: {response}")
        return response
    except Exception as error:
        # 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
        # 错误 message
        print(f"UPDATE DNS error: {error}")
        return None

def main():
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    # 初始化AcsClient实例
    config = open_api_models.Config( access_key_id=ALIYUN_ACCESS_KEY, access_key_secret=ALIYUN_SECRET_KEY )
    # Endpoint 请参考 https://api.aliyun.com/product/Alidns
    config.endpoint = f'alidns.cn-hangzhou.aliyuncs.com'
    client = Alidns20150109Client(config)

    local_ip = get_local_ip()
    print(f"{current_time} Local IP: {local_ip}")

    dns_record_ip = get_current_dns_record(client, ALIYUN_RECORD_ID)
    print(f"{current_time} DNS Record IP: {dns_record_ip}")

    if local_ip is not None and local_ip != dns_record_ip:
        update_dns_record(client, ALIYUN_RECORD_ID, local_ip, ALIYUN_SUBDOMAIN, ALIYUN_RECORD_TYPE)
        print(f"{current_time} DNS record updated successfully.")
    else:
        print(f"{current_time} IP addresses match. No update required.")


if __name__ == "__main__":
    main()

 注意关于ALIYUN_RECORD_ID获取

二.找一个任务管理器进行调用,这里使用了nas上任务计划

控制面板,添加任务计划

用户这里选中root,否则需要授权,指定任务名称

制定一个每二十分钟执行一次的定时任务

将准备好的脚步执行语句填写上:

python “/volume1/docker/localip/ip-domain.py” >> “/volume1/docker/localip/log.txt” 2>&1

点击确定,就可以等待执行喽;查看一下执行日志,然后更新啦;

如果此时你家支持外网IP访问的话,就可以使用域名访问自己nas了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值