Cloudflare全自动优选IP自动解析到域名,适用多平台

windows实例

Windows、openwrt、群晖及任意vps都可以,可以通过1条命令指令自动任务,像宝塔面板,1panel等面板可以通过定时任务执行,通常3-6小时一次就行

一、windows使用方法:

1、安装python3,下载安装时勾选设置path环境变量,否则你要手动配置很麻烦.

2、管理员方式运行CMD,输入命令:pip install requests 安装requests,安装成功后即可

3、保存文章下方脚本代码到电脑,最好放在没有中文路径的文件夹下,文件保存为如:cf-ip-hongkong.py

4、修改脚本配置:

  • 获取令牌:api_token在CF域名管理右侧点击获取你的api令牌,点击创建令牌,点击第一个:编辑区域 DNS模板,在下方获取后记得保存,token只显示一次。

  • 获取zone_id:zone_id在域名管理右侧的api区域ID

  • 输入你需要解析到的域名,可以是一级域名或者二级域名,推荐使用二级域名

需修改配置地方:

# Cloudflare API参数
api_token = "XXXXXXXXXXXXX"    # 此处为具备域名DNS修改的token
zone_id = "XXXXXXXXXXXXX"    # 此处为CF域名管理界面右侧的api区域ID
subdomain = "xxx.iizz.us.kg"         # 需要解析到的二级域名,xxx处自定义
ps:配置好以后双击脚本即可,须在科学网络环境下才能执行成功

设置自动运行:
  • 开始菜单运行或者cmd输入:taskschd.msc命令
  • 在任务计划程序创建任务 设置触发器,操作那边导入脚本即可

二、openwrt使用方法

1、登录openwrt,左侧找到-系统——软件包——搜索python3并安装
2、继续搜索pip并安装
3、登录openwrt终端,输入命令pip install requests 安装依赖requests
4、打开openwrt文件管理,将配置好的脚本上传到root文件夹
5、设置权限chmod +x /root/xxx.py xxx.py注意文件名修改为你实际的文件名
6、终端输入python3 你的文件名.py 检验是否成功

设置自动运行须在科学网络环境下才能执行成功

查看python3路径:终端输入which python3,通常目录为/usr/bin/python3
假设5小时运行一次:
0 /5 /usr/bin/python3 /root/youxuan.py #意思为每年,每月,每天,每间隔5小时执行一次脚本


脚本:脚本分为3个

1、cf官方移动延迟低于100M

import requests
import csv

# Cloudflare API参数
api_token = "****"
zone_id = "****"
domain = "****"  # 您的二级域名

# Cloudflare API端点
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

# 请求标头
headers = {
    "Authorization": f"Bearer {api_token}",
    "Content-Type": "application/json"
}

# 删除指定二级域名下的所有 DNS 记录
def delete_all_dns_records():
    response = requests.get(api_url, headers=headers, params={"name": domain})
    if response.status_code == 200:
        result = response.json()
        dns_records = result["result"]
        dns_record_ids = [record["id"] for record in dns_records]

        for record_id in dns_record_ids:
            delete_response = requests.delete(f"{api_url}/{record_id}", headers=headers)
            if delete_response.status_code == 200:
                print(f"已删除 DNS 记录: {record_id}")
            else:
                print(f"删除 DNS 记录时出错:{delete_response.text}")
    else:
        print("获取 DNS 记录时出错:", response.text)

# 获取优选 IP 数据并筛选延迟最低的 3 个数据
def fetch_and_filter_ips():
    url = "https://api.345673.xyz/get_data"
    key = "o1zrmHAF"
    data = {"key": key}

    response = requests.post(url, json=data)
    if response.status_code == 200:
        result = response.json()
        if result["code"] == 200:
            info = result["info"]

            ip_list = []
            for category_name, ips in info.items():
                for ip_info in ips:
                    delay_str = ip_info["delay"].replace("ms", "")
                    try:
                        delay = float(delay_str)
                        ip_info["delay"] = delay
                        ip_info["category"] = category_name  # 添加 category 信息
                        ip_list.append(ip_info)
                    except ValueError:
                        print("无法转换延迟值为浮点数:{}".format(ip_info['delay']))

            # 按延迟排序并取前 3 个
            ip_list.sort(key=lambda x: x["delay"])
            top_3_ips = ip_list[:3]

            with open('ip.csv', 'w', newline='', encoding='utf-8') as csvfile:
                fieldnames = ["节点类别", "IP地址", "线路", "节点", "延迟", "下载速度", "时间"]
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                writer.writeheader()

                for ip_info in top_3_ips:
                    writer.writerow({
                        "节点类别": ip_info["category"],
                        "IP地址": ip_info["ip"],
                        "线路": ip_info["line"],
                        "节点": ip_info["node"],
                        "延迟": ip_info["delay"],
                        "下载速度": ip_info["downloadspeed"],
                        "时间": ip_info["time"]
                    })

            return [ip_info["ip"] for ip_info in top_3_ips]
        else:
            print("请求失败,错误信息:{}".format(result['info']))
    else:
        print("请求失败,状态码:{}".format(response.status_code))
    return []

# 将筛选后的 IP 地址解析到 Cloudflare 域名下
def add_dns_records(ip_addresses):
    for ip_address in ip_addresses:
        data = {
            "type": "A",
            "name": domain,
            "content": ip_address,
            "ttl": 1,
            "proxied": False
        }
        response = requests.post(api_url, headers=headers, json=data)
        if response.status_code == 200:
            print(f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下")
        else:
            print(f"解析IP地址 {ip_address} 时出错:{response.text}")

# 主函数
def main():
    delete_all_dns_records()
    ip_addresses = fetch_and_filter_ips()
    if ip_addresses:
        add_dns_records(ip_addresses)
        print("所有操作已完成")
    else:
        print("没有符合条件的 IP 地址")

if __name__ == "__main__":
    main()

脚本2、CF官方IP

import requests
import csv

# Cloudflare API参数
api_token = "*********"
zone_id = "*****"
subdomain = "*****"  # 您的二级域名

# Cloudflare API端点
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

# 请求标头
headers = {
    "Authorization": f"Bearer {api_token}",
    "Content-Type": "application/json"
}

# 发送GET请求以获取所有指定二级域名下的DNS记录
response = requests.get(api_url, headers=headers, params={"name": subdomain})

# 检查响应状态码
if response.status_code == 200:
    # 解析JSON响应
    data = response.json()

    # 遍历每个DNS记录并删除它们
    for record in data['result']:
        record_id = record['id']

        # 构造删除记录的API端点
        delete_url = f"{api_url}/{record_id}"

        # 发送DELETE请求以删除记录
        delete_response = requests.delete(delete_url, headers=headers)

        # 检查删除记录的响应状态码
        if delete_response.status_code == 200:
            print(f"已成功删除DNS记录:{record['name']} - {record['content']}")
        else:
            print(f"删除DNS记录时出错:{delete_response.text}")

    # 删除完毕后,您可以继续添加新的记录
    # 定义文件URL和保存路径
    url = "https://raw.githubusercontent.com/ymyuuu/IPDB/main/bestcf.txt"
    save_path = "result.csv"

    # 发送GET请求到URL
    response = requests.get(url)

    # 检查请求是否成功(状态码为200)
    if response.status_code == 200:
        # 解码响应内容为文本
        content = response.text

        # 将内容分割成行
        lines = content.split('\n')

        # 以写入模式打开CSV文件
        with open(save_path, 'w', newline='', encoding='utf-8') as csvfile:
            # 创建CSV写入器对象
            csv_writer = csv.writer(csvfile)

            # 遍历每一行
            for line in lines:
                # 通过空格分割行
                data = line.split()

                # 将数据写入CSV文件
                csv_writer.writerow(data)

        print("数据已保存到", save_path)

        # 从CSV文件中读取IP地址并解析到Cloudflare域名下
        with open(save_path, 'r', newline='', encoding='utf-8') as csvfile:
            # 创建CSV读取器对象
            csv_reader = csv.reader(csvfile)

            # 跳过标题行(如果有的话)
            next(csv_reader)

            # 读取每一行数据
            for row in csv_reader:
                ip_address = row[0]  # 假设IP地址在第一列

                # Cloudflare API端点
                api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

                # 请求主体
                data = {
                    "type": "A",
                    "name": subdomain,
                    "content": ip_address,
                    "ttl": 1,  # TTL(生存时间),以秒为单位
                    "proxied": False  # 关闭Cloudflare代理
                }

                # 发送POST请求以创建DNS记录
                response = requests.post(api_url, headers=headers, json=data)

                # 检查响应状态码
                if response.status_code == 200:
                    print(f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下")
                else:
                    print(f"解析IP地址 {ip_address} 时出错:", response.text)
    else:
        print("无法从URL检索数据")
else:
    print("获取DNS记录时出错:", response.text)

脚本3、CF反代IP(香港)30分钟更新一次

import requests
import csv

# Cloudflare API参数
api_token = "****"
zone_id = "****"
subdomain = "****"  # 您的二级域名

# Cloudflare API端点
api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records"

# 请求标头
headers = {
    "Authorization": f"Bearer {api_token}",
    "Content-Type": "application/json"
}

# 发送GET请求以获取所有指定二级域名下的DNS记录
response = requests.get(api_url, headers=headers, params={"name": subdomain})

# 检查响应状态码
if response.status_code == 200:
    # 解析JSON响应
    data = response.json()

    # 遍历每个DNS记录并删除它们
    for record in data['result']:
        record_id = record['id']

        # 构造删除记录的API端点
        delete_url = f"{api_url}/{record_id}"

        # 发送DELETE请求以删除记录
        delete_response = requests.delete(delete_url, headers=headers)

        # 检查删除记录的响应状态码
        if delete_response.status_code == 200:
            print(f"已成功删除DNS记录:{record['name']} - {record['content']}")
        else:
            print(f"删除DNS记录时出错:{delete_response.text}")

    # 删除完毕后,您可以继续添加新的记录
    # 定义文件URL和保存路径
    url = "https://raw.githubusercontent.com/ymyuuu/IPDB/main/bestproxy.txt"
    save_path = "result.csv"

    # 发送GET请求到URL
    response = requests.get(url)

    # 检查请求是否成功(状态码为200)
    if response.status_code == 200:
        # 解码响应内容为文本
        content = response.text

        # 将内容分割成行
        lines = content.split('\n')

        # 以写入模式打开CSV文件
        with open(save_path, 'w', newline='', encoding='utf-8') as csvfile:
            # 创建CSV写入器对象
            csv_writer = csv.writer(csvfile)

            # 遍历每一行
            for line in lines:
                # 通过空格分割行
                data = line.split()

                # 将数据写入CSV文件
                csv_writer.writerow(data)

        print("数据已保存到", save_path)

        # 从CSV文件中读取IP地址并解析到Cloudflare域名下
        with open(save_path, 'r', newline='', encoding='utf-8') as csvfile:
            # 创建CSV读取器对象
            csv_reader = csv.reader(csvfile)

            # 跳过标题行(如果有的话)
            next(csv_reader, None)

            # 读取每一行数据
            for row in csv_reader:
                if row:  # 检查行是否为空
                    ip_address = row[0]  # 假设IP地址在第一列

                    # 请求主体
                    data = {
                        "type": "A",
                        "name": subdomain,
                        "content": ip_address,
                        "ttl": 1,  # TTL(生存时间),以秒为单位
                        "proxied": False  # 关闭 Cloudflare 代理
                    }

                    # 发送POST请求以创建DNS记录
                    response = requests.post(api_url, headers=headers, json=data)

                    # 检查响应状态码
                    if response.status_code == 200:
                        print(f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下")
                    else:
                        print(f"解析IP地址 {ip_address} 时出错:", response.text)
    else:
        print("无法从URL检索数据")
else:
    print("获取DNS记录时出错:", response.text)