配置值 去 cloudflare网站的域名管理处查看,因为 aws云主机的ip附件只可以操作Ipv4的记录,所以这个脚本也是针对动态更新Ipv4记录,也就是A记录。


#!/usr/bin/env python
# coding=utf-8
#  更新! 更新! 没有写创建,所以你先要去cloudflare网站创建一个A纪录,
#  API 参考地址
# https://developers.cloudflare.com/api/operations/dns-records-for-a-zone-update-dns-record
import json
import requests
import os
import sys
import datetime
# Cloudflare 配置文件
email = ''
zone_id = ''
api_key = ''
name = ''
ttl = '60'
record_id = ''   # cloudfalre   id


def write_log(line_info):
    t = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    if isinstance(line_info, str):
        with open('log4.txt', 'a', encoding='utf-8') as f:
            f.write(t + ' ' + line_info + ' \n')
        f.close()
    else:
        with open('log4.txt', 'a', encoding='utf-8') as f:
            f.write(t + ' 未知类型数据写入记录,写入失败 ' + ' \n')
        f.close()

def get_internet_ipv4():
    public_url = 'http://ipinfo.io/json'
    res = requests.get(public_url).text
    #print(res)
    resJson = json.loads(res)
    ip = resJson['ip']
    return ip
# 获取ip地址并 测试
ipaddr = get_internet_ipv4()
#print("您当前的外网Ipv4地址是:  ", ipaddr)

headers={
    "Content-Type": "application/json; charset=UTF-8",
    "X-Auth-Email": email,
    "X-Auth-Key": api_key
}
data = {
    "type": "A",
    "name": name,
    "content": ipaddr,
    "ttl": ttl,
    "proxied": False
}
# 获取域名解析详情,判断是否需要更新IP
# GET   https://api.cloudflare.com/client/v4/zones/{zone_identifier}/dns_records/{identifier}
def get_current_ip():
    geturl = 'https://api.cloudflare.com/client/v4/zones/' + zone_id + '/dns_records/' + record_id
    det = requests.get(geturl, headers=headers).text
    #print(det)
    detJson = json.loads(det)
    if (detJson['success']) == True:
        #curr_det_json = detJson['result']
        logtxt = "检查域名解析IP " + detJson['result']['name'] + " ==> " + detJson['result']['content']
        write_log(logtxt)
        #print("域名当前指向IP ", detJson['result']['name'], "=>", detJson['result']['content'])
    else:
        logtxt = "检查域名解析IP 失败 ,请检查网络和配置"
        write_log(logtxt)
        #print("获取域名详细信息失败,请检查网络和配置……")
    return detJson['result']['content']
# 更新dns方法 PUT  # https://api.cloudflare.com/client/v4/zones/{zone_identifier}/dns_records/{identifier}
def update_dns_record():    
    updateurl = 'https://api.cloudflare.com/client/v4/zones/' + zone_id + '/dns_records/' + record_id
    reTxt = requests.put(updateurl, data=json.dumps(data), headers=headers).text
    print(reTxt)
    result = json.loads(reTxt)
    if(result['success']) == False:
        return False
    return True
currentIp = get_current_ip()
if(currentIp == ipaddr):
    print("ip指向正确,不需要更新")
    logtxt = "ip指向正确,取消更新"
    write_log(logtxt)
    #sys.exit(0)
else:
    if update_dns_record():
        print("Ipv4更新成功: ", cfg['name'], "==>", ipaddr)
        logtxt = "域名动态更新成功 " + cfg['name'] + "==>" + ipaddr
        write_log(logtxt)
    else:
        print("很失败,请检查配置参数等等")
        write_log("The script failed, please check config and internet ")
sys.exit(0)


如果需要更新ipv6的地址,需要修改获取IpV6本机地址的函数