Skip to content

环境安装:

shell
pip install aliyun-python-sdk-core-v3 aliyun-python-sdk-alidns==2.0.6 pyyaml

这个版本是 1.0 的阿里云 sdk 版本

实现代码如下:

python
import json  
import yaml  
import sys  
from aliyunsdkcore.client import AcsClient  
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest  
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest  
from aliyunsdkalidns.request.v20150109.AddDomainRecordRequest import AddDomainRecordRequest  
# from aliyunsdkcore.auth.credentials import AccessKeyCredential  


<NolebasePageProperties />




  
  
def AliAccessKey(id, Secret, region):  
    try:  
        client = AcsClient(id, Secret, region)  
        return client  
    except Exception as e:  
        print("验证aliyun key失败")  
        print(e)  
        sys.exit(-1)  
  
  
def read_yaml(filename):  
    try:  
        yaml_file = open(filename, "rb")  
        yaml_data = yaml.safe_load(yaml_file)  
        yaml_file.close()  
        return yaml_data  
    except Exception as e:  
        print("读取配置文件错误")  
        print(e)  
        sys.exit(-1)  
  
def AddMultipleDomainRecords(client, yaml_data):  
    try:  
        # 遍历多个RR  
        for rr in yaml_data['UserData']['RR']:  
            # 获取对应的 RecordId            # RecordId = GetDNSRecordId(yaml_data, client, yaml_data['UserData']['DomainName'], rr)            # 更新记录  
            AddDomainRecord(client, yaml_data, rr)  
    except Exception as e:  
        print("批量添加域名解析失败")  
        print(e)  
  
  
def AddDomainRecord(client, yaml_data, rr):  
    try:  
        request = AddDomainRecordRequest()  
        request.set_accept_format('json')  
  
        if 'Auto_Lines' == yaml_data['UserData']['UpdateDomain']:  
            DomainValue = sys.argv[1]  
        else:  
            DomainValue = yaml_data['UserData']['UpdateDomain']  
        request.set_DomainName("openctia.site")  
        # request.set_Value(DomainValue)  
        request.set_Type(yaml_data['UserData']['DomainType'])  
        request.set_RR(rr)  
        request.set_Value(DomainValue)  
        # request.set_RecordId(RecordId)  
        response = client.do_action_with_exception(request)  
        print(f"添加主机 {rr} 的域名解析成功")  
        print(  
            f"域名: {yaml_data['UserData']['DomainName']} 主机: {rr} 记录类型: {yaml_data['UserData']['DomainType']} 记录值: {DomainValue}")  
    except Exception as e:  
        print(f"添加主机 {rr} 的域名解析失败")  
        print(e)  
  
  
def UpdateMultipleDomainRecords(client, yaml_data):  
    try:  
        # 遍历多个RR  
        for rr in yaml_data['UserData']['RR']:  
            # 获取对应的 RecordId            RecordId = GetDNSRecordId(yaml_data, client, yaml_data['UserData']['DomainName'], rr)  
            # 更新记录  
            UpdateDomainRecord(client, yaml_data, RecordId, rr)  
    except Exception as e:  
        print("批量更新域名解析失败")  
        print(e)  
  
  
def GetDNSRecordId(yaml_data, client, DomainName, rr):  
    try:  
        request = DescribeDomainRecordsRequest()  
        request.set_accept_format('json')  
        request.set_DomainName(DomainName)  
        request.set_PageSize(500)  
        response = client.do_action_with_exception(request)  
        json_data = json.loads(str(response, encoding='utf-8'))  
        # print(json_data)  
        for Record in json_data['DomainRecords']['Record']:  
            # print(Record['RR'])  
            if rr == Record['RR']:  
                return Record['RecordId']  
    except Exception as e:  
        print(f"获取主机 {rr} 的 RecordId 失败")  
        print(e)  
        sys.exit(-1)  
  
  
def UpdateDomainRecord(client, yaml_data, RecordId, rr):  
    try:  
        request = UpdateDomainRecordRequest()  
        request.set_accept_format('json')  
  
        if 'Auto_Lines' == yaml_data['UserData']['UpdateDomain']:  
            DomainValue = sys.argv[1]  
        else:  
            DomainValue = yaml_data['UserData']['UpdateDomain']  
  
        request.set_Value(DomainValue)  
        request.set_Type(yaml_data['UserData']['DomainType'])  
        request.set_RR(rr)  
        request.set_RecordId(RecordId)  
        response = client.do_action_with_exception(request)  
        print(f"更新主机 {rr} 的域名解析成功")  
        print(  
            f"域名: {yaml_data['UserData']['DomainName']} 主机: {rr} 记录类型: {yaml_data['UserData']['DomainType']} 记录值: {DomainValue}")  
    except Exception as e:  
        print(f"更新主机 {rr} 的域名解析失败")  
        print(e)  
  
  
def main():  
    yaml_data = read_yaml('./conf.yaml')  
    client = AliAccessKey(yaml_data['AliyunData']['AccessKey_ID'], yaml_data['AliyunData']['Access_Key_Secret'],  
                          yaml_data['AliyunData']['region_id'])  
    # UpdateMultipleDomainRecords(client, yaml_data)  
    AddMultipleDomainRecords(client, yaml_data)  
  
  
if __name__ == "__main__":  
    main()

Yaml 文件配置如下:

yaml
# 阿里云信息,从阿里云获取填写即可  
AliyunData:  
  # 阿里云的AccessKey_ID , Access_Key_Secret , region_id  
  # 获取方法,参考文档: https://help.aliyun.com/knowledge_detail/38738.html  
  AccessKey_ID: 'ID'  
  Access_Key_Secret: 'Key'  
  region_id: "cn-shanghai"  
  
# DNS解析信息  
UserData:  
  # 需要修改的域名  
  DomainName: 'openctia.site'  
  # 解析的主机  
#  RR: ['jump','mc','plan','office','answer','hicoding','nebulacoding',  
#       'mail','www','@','mfa','code','person','forum','emqx','board','panel','manager',  
#       'os','picture','photo','pdf','doc','cloud','box','registry','bookmark',  
#       'pad','paste','dns','draw','waf','team','sync','cicd','ssh','ebook','blog',  
#       'auth','home','gist','file','note','flow','git']  
  RR : ['jump','mc']  
#  RR: [ 'manager','os','picture','photo','pdf','doc','cloud','box','registry','bookmark',  
#        'pad','paste','dns','draw','waf','team','sync','cicd','ssh','ebook','blog',  
#        'auth','home','gist','file','note','flow','git' ]  
  # 解析的记录  
  DomainType: 'A'  
  # 解析更新的值,如果填写 Auto_Lines ,则从命令行获取  
  UpdateDomain: '106.14.168.42'  
  
#  Value: '47.100.174.11'  
  #UpdateDomain: '127.0.0.1'

实现结果如下:

贡献者

文件历史