Fari

阿里云api实现ipv6的ddns

创建python的虚拟环境

# 创建一个虚拟环境python3 -m venv ipv6_py_env# 激活虚拟环境source ipv6_py_env/bin/activate

获取ipv6地址的脚本

ifconfig | grep -A 10 wlp2s0 | grep 'inet6' | awk '{print $2}' | sed '/fe80/ d'

将上述脚本使用python封装

res = sp.run("ifconfig | grep -A 10 wlp2s0 | grep 'inet6' | awk '{print $2}' | sed '/fe80/ d'", shell=True, capture_output=True, encoding="utf8")ipv6_addrs = res.stdout.split()  # ipv6地址可能有多个,随便用一个即可

完整的python代码(修改自参考中的示例代码)

# -*- coding: utf-8 -*-import osimport sysimport timeimport subprocessfrom loguru import logger as loglog.add("auto_refresh.log")from typing import Listfrom alibabacloud_alidns20150109.client import Client as Alidns20150109Clientfrom alibabacloud_tea_openapi import models as open_api_modelsfrom alibabacloud_alidns20150109 import models as alidns_20150109_modelsfrom alibabacloud_tea_util import models as util_modelsfrom alibabacloud_tea_util.client import Client as UtilClientclass Refresh:    def __init__(self):        pass    @staticmethod    def create_client(        access_key_id: str,        access_key_secret: str,    ) -> Alidns20150109Client:        """        使用AK&SK初始化账号Client        @param access_key_id:        @param access_key_secret:        @return: Client        @throws Exception        """        config = open_api_models.Config(            access_key_id=access_key_id,            access_key_secret=access_key_secret        )        # Endpoint 请参考 https://api.aliyun.com/product/Alidns        config.endpoint = f'alidns.cn-hangzhou.aliyuncs.com'        return Alidns20150109Client(config)    @staticmethod    def update_dns(        new_ip: str    ) -> bool:        # 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。        # 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例使用环境变量获取 AccessKey 的方式进行调用,仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html        client = Refresh.create_client("your-ALIBABA_CLOUD_ACCESS_KEY_ID", "your-ALIBABA_CLOUD_ACCESS_KEY_SECRET")        # record_id 可以通过 DescribeDomainRecords 接口拿到, 见 https://next.api.aliyun.com/api/Alidns/2015-01-09/DescribeDomainRecords        update_domain_record_request = alidns_20150109_models.UpdateDomainRecordRequest(            record_id='879766660467119104',            rr='ipv6',            type='AAAA',            value=new_ip        )        runtime = util_models.RuntimeOptions()        try:            # 复制代码运行请自行打印 API 的返回值            client.update_domain_record_with_options(update_domain_record_request, runtime)            return True        except Exception as error:            if "The DNS record already exists" in error.message:                # 说明该条记录已经存在,则无需更新                return True            log.error(error.message)            # 诊断地址            log.error(error.data.get("Recommend"))            UtilClient.assert_as_string(error.message)            return False        return Falseif __name__ == '__main__':    # 检测当前ip是否和上次更新的ip一直,如果不一致则更新dns    pre_ip, cur_ip = None, None    while True:        try:            res = subprocess.run("ifconfig | grep -A 10 wlp2s0 | grep 'inet6' | awk '{print $2}' | sed '/fe80/ d'", shell=True, capture_output=True, encoding="utf8")            if not (res and res.stdout and res.stdout.split()):                raise Exception(f"empty ipv6 address, {res and res.stdout}")        except Exception as e:            log.error(f"get ip error, {e}")            time.sleep(30)            continue        ipv6_addrs = res.stdout.split()        if pre_ip in ipv6_addrs:            time.sleep(1)            continue        else:            cur_ip = ipv6_addrs[-1]            updated = Refresh.update_dns(cur_ip)            if updated:                log.info(f"updated dns, pre: {pre_ip}, new: {cur_ip}")                pre_ip = cur_ip                time.sleep(30)                continue            else:                log.error("update dns fail")                time.sleep(30)                continue

最后执行该文件即可

python auto_refresh_dns.py

参考:

https://next.api.aliyun.com/api/Alidns/2015-01-09/UpdateDomainRecord

上面的api需要传入 RecordId,可以通过下面的api获取

https://next.api.aliyun.com/api/Alidns/2015-01-09/DescribeDomainRecords

ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET 在阿里云控制台可查看

Tags: