脚本功能介绍

  • 一键添加域名解析
  • 一键修改域名解析
  • 一键删除域名解析

申请 CloudFlare API

前往 https://dash.cloudflare.com/profile/api-tokens 登陆后,右上角选择个人资料,点击创建令牌

为了安全,用自定义令牌,没有用全局令牌。如你非要用全局令牌,请修改脚本 Authorization 全部替换为 X-Auth-Key

获取脚本

wget https://blog.wxlost.com/wp-content/uploads/2022/05/cloudFlare.sh && chmod +x cloudFlare.sh

编辑 cloudFlare.sh 内的参数(API与Email)后.运行脚本 添加/更新 域名的解析

bash cloudFlare.sh 域名

如需删除域名解析,使用参数1即可

bash cloudFlare.sh 域名 1

其他问题

仅在IPV4的机器上测试,没有IPV4+IPV6的环境,故此IPV6环境请注意使用。

2022年11月29日 更新,添加了新的IP4和6的区分,不过未做6的解析过程

官方API文档

脚本开源

#!/usr/bin/env bash
#https://blog.wxlost.com/cloudflare-domain.html

#核心! CloudFlare
Authorization="你的秘钥-如果全局记得替换参数文本" #api
auth_email="你的账号"

#颜色
Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m"
#IP解析
UA_Browser="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36"
local_ipv4=$(curl $useNIC -4 -s --max-time 10 api64.ipify.org)
local_ipv4_asterisk=$(awk -F"." '{print $1"."$2".*.*"}' <<<"${local_ipv4}")
local_ipv6=$(curl $useNIC -6 -s --max-time 20 api64.ipify.org)
local_ipv6_asterisk=$(awk -F":" '{print $1":"$2":"$3":*:*"}' <<<"${local_ipv6}")
#local_isp4=$(curl $useNIC -s -4 --max-time 10 --user-agent "${UA_Browser}" "https://api.ip.sb/geoip/${local_ipv4}" | cut -f1 -d"," | cut -f4 -d '"')
#local_isp6=$(curl $useNIC -s -6 --max-time 10 --user-agent "${UA_Browser}" "https://api.ip.sb/geoip/${local_ipv6}" | cut -f1 -d"," | cut -f4 -d '"')

echo -e "--- 欢迎使用-脚本初始化中-请稍后 ----"
echo -e "https://blog.wxlost.com/cloudflare-domain.html"
ip4=${local_ipv4}
ip6=${local_ipv6}
echo -e "--- 本机IP4:${Green_font_prefix}$ip4${Font_color_suffix} 本机IP6:${Green_font_prefix}$ip6${Font_color_suffix} ----"
record_name="$1"
record_del="$2"
zone_name="${record_name#*.}"

if [ "${record_name}" = '' ]; then
    echo -e "错误: 域名为空!!"
    exit 1
fi
if [ "${record_del}" = '' ]; then
    record_del="0"
fi

function int(){
#获取域ID
zone_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$zone_name" -H "X-Auth-Email: $auth_email" -H "Authorization: $Authorization" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1 )
if [ "${zone_identifier}" = '' ]; then
    echo && echo -e "${Red_font_prefix}域ID 获取失败!${Font_color_suffix}" && exit 0;
fi
#获取域名ID
record_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name" -H "X-Auth-Email: $auth_email" -H "Authorization: $Authorization" -H "Content-Type: application/json"  | grep -Po '(?<="id":")[^"]*')
#获取域名IP
Domain_name_status=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name" -H "X-Auth-Email: $auth_email" -H "Authorization: $Authorization" -H "Content-Type: application/json"  | grep -Po '(?<="content":")[^"]*')
}

function Domain_name_status(){
int
if [ "${record_del}" = '0' ]; then
        if [ "${ip4}" == "${Domain_name_status}" ]; then
        echo -e "${Green_font_prefix}域名已存在!"  && echo -e "域名记录IP4 $Domain_name_status 与本机IP4: $ip4 一致,无需操作!)${Font_color_suffix}"&& echo -e "${Green_font_prefix}如需强制删除: bash xxx.sh xxx.xxx.com 1${Font_color_suffix}" && exit 0;
        fi
    else
    Domain_delete
fi
}

function Domain_go(){
if [ "${record_identifier}" = '' ]; then
    echo -e "${Green_font_prefix}info: 域名首次解析,开始新增解析${Font_color_suffix}"
    Domain_add
    exit 0
    else
    echo -e "${Red_font_prefix}info: 域名存在解析,开始更新解析${Font_color_suffix}"
    Domain_update
    exit 0
fi
}

function Domain_add(){
#添加
result=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records" \
     -H "X-Auth-Email: $auth_email" \
     -H "Authorization: $Authorization" \
     -H "Content-Type: application/json" \
     --data '{"type":"A","name":"'"$record_name"'","content":"'"$ip4"'","ttl":1,"priority":10,"proxied":false}')
int
if [[ $result == *"\"success\":false"* ]]; then
    message="API ADD FAILED. DUMPING RESULTS:\n$result"
    echo -e "$message"
    #exit 1 
else
    message="${Green_font_prefix}域名: ${Font_color_suffix} $record_name 解析为:$Domain_name_status 完成!"
    echo -e "$message"
    exit 0
fi
}

function Domain_update(){
#更新
result=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" \
     -H "X-Auth-Email: $auth_email" \
     -H "Authorization: $Authorization" \
     -H "Content-Type: application/json" \
     --data '{"type":"A","name":"'"$record_name"'","content":"'"$ip4"'","ttl":1,"proxied":false}')
int
if [[ $result == *"\"success\":false"* ]]; then
    message="API UPDATE FAILED. DUMPING RESULTS:\n$result"
    echo -e "$message"
    #exit 1 
else
    message="${Green_font_prefix}域名: ${Font_color_suffix} $record_name 更新解析为:$Domain_name_status 完成!"
    echo -e "$message"
    exit 0
fi
}
function Domain_delete(){
#删除
result=$(curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" \
     -H "X-Auth-Email: $auth_email" \
     -H "Authorization: $Authorization" \
     -H "Content-Type: application/json")

if [[ $result == *"\"success\":false"* ]]; then
    message="API DELETE FAILED. DUMPING RESULTS:\n$result"
    echo -e "$message"
    #exit 1 
    echo -e "发现域名未解析,添加解析..."
else
    message="${Green_font_prefix}域名: ${Font_color_suffix} $record_name $Domain_name_status 删除完成!"
    echo -e "$message"
    exit 0
fi
}

function Domain_list(){
#查询-备用
result=$(curl -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name" \
     -H "X-Auth-Email: $auth_email" \
     -H "Authorization: $Authorization" \
     -H "Content-Type: application/json")

}

#判断式菜单
Domain_name_status
#clear
echo -e " ${Green_font_prefix}CloudFlare api${Font_color_suffix} ${Red_font_prefix}[v1.2]${Font_color_suffix} 域名:${Red_font_prefix}$1${Font_color_suffix} 
--- 欢迎使用 ----
"
Domain_go

# echo -e "待解析域名为${Green_font_prefix} $1 ${Font_color_suffix},本机IP为${Green_font_prefix} $ip4 ${Font_color_suffix},继续吗?${Green_font_prefix}[Y/n]${Font_color_suffix}"
# read -p "(默认: y):" yn
# [[ -z "${yn}" ]] && yn="y"
# if [[ ${yn} == [Yy] ]]; then
# echo -e "开始执行解析操作!"
# Domain_go
# else
# echo && echo "已取消本次操作..." && echo && exit 0;
# fi