CloudFlare优选IP轮询+解析批量导入（瑕疵方案）

先前的服务器和 CDN 都不打算继续续费使用了，所以前端搬到了 Vercel，后端搬到了另外一台服务器。之前 CloudFlare Partners 方案自选 IP 失效后我就一直没有办法去自选 IP，现在 CloudFlare 可以通过 SaaS 回源优选 IP 了，心底按耐不住的白嫖力量开始隐隐作祟🤣

关于自选 IP 的教程网上有很多，我是看这篇学会的。PayPal 用国内的身份的也可以，只需要绑定银行卡验证，无需扣款。我先是借助CloudflareSpeedTest这个项目测速出了我所在区域的最快速的优选 IP，而 CloudFlare 是支持 A 解析负载均衡的，所以我全部解析上多个 ip 地址也没什么问题。但问题就来了，每一次手动删除修改解析很麻烦，加上测速快点都得十几二十分钟，我在想有没有什么好的方案可以较为快捷的达到我的需求。

查阅了一番 CloudflareSpeedTest 项目的文档后得到了一个【自动更新 Cloudflare 中的域名解析记录为最快 IP（Windows/Linux 脚本 + 手动教程）】的教程，比较可惜的是它只能修改单个解析。不断的试错让我发现似乎通过 api 批量修改解析是个不现实的想法，所以最终我通过以下步骤实现了我的需求：

优选 IP 测速 => 将导出的结果转化为 CloudFlare 可识别的 DNS 导入文本 => 导入到 CloudFlare

那么在第一次导入过后，只需要在每一次命令前加入批量删除 DNS 解析的请求即可～下列附各项功能的实现过程

分析快速导入

CloudFlare 的 DNS 管理面板是这个样的，其中有一个快捷导入 / 导出 DNS 记录的功能。

内容如下

经测试，文本文档只要有部分相同格式即可快速导入解析。

优选结果转换

请根据自己的域名修改脚本为适合你的情况！！！

在 CloudflareSpeedTest 同目录下，新建一个命令提示符脚本。

Copy
@echo off

setlocal EnableDelayedExpansion

REM 获取当前脚本所在目录
set "scriptPath=%~dp0"

REM 设置输入和输出文件路径
set "inputFile=%scriptPath%result.csv"
REM 获取当前用户桌面路径
set "desktopPath=C:\Users\你的用户名\Desktop"

REM 设置输出文件路径
set "outputFile=%desktopPath%\output.txt"

REM 清空输出文件
type nul > "%outputFile%"

REM 在输出文件开头添加 ";; A Records"
echo ;; A Records >> "%outputFile%"

REM 读取 result.csv 文件的每一行（跳过表头）
for /f "usebackq skip=1 tokens=1-6 delims=," %%A in ("%inputFile%") do (
REM 获取每一行中的 IP 地址（第一列）
set "ip=%%A"
REM 在文本文档中添加 "arey.tools.tf. 1 IN A" 和 IP 地址的数据
echo arey.tools.tf. 1 IN A !ip! >> "%outputFile%"
)

本脚本可快速将 Windows 平台下的 CloudflareSpeedTest 输出结果转换为如下图所示的格式，如需其他平台支持，请询问 ChatGPT。

解析批量删除

新建一个 PowerShell 脚本（一般后缀为.ps1），内容如下：

Copy
$API_TOKEN = "<API TOKEN>"
$ZONE_ID = "<ZONE ID>"

$baseUrl = "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records"

$headers = @{
'Authorization' = "Bearer $API_TOKEN"
'Content-Type' = "application/json"
}

$listUrl = $baseUrl + '?per_page=500'
Write-Host $listUrl
$records = Invoke-RestMethod -Uri $listUrl -Method 'GET' -Headers $headers
$records = $records | Select-Object -ExpandProperty result

foreach ($record in $records) {
Write-Host "Deleting $($record.name) that points to $($record.content)"

$deleteUrl = $baseUrl + '/' + $record.id
Invoke-RestMethod -Uri $deleteUrl -Method 'DELETE' -Headers $headers
Write-Host $deleteUrl
}

如果你有其他重要解析，请勿误操作导致有关解析被删除！你可以备份好你的解析在优选进程结束后，在导入前将提前备份好的其他解析文本段加入到 output.txt 中！

API TOKEN 的获取

链接直达：API 令牌

选中需进行有关操作的域名，最终得到 API TOKEN。

ZONE ID 的获取

打开 CloudFlare 域名面板管理页

最后，我们通过如下命令在命令提示符中进行进行 PoweShell 脚本运行的操作。

Copy
powershell.exe -ExecutionPolicy Bypass -File <name>.ps1

稍微整合一下

Copy
@echo off

del result.csv ::删除先前的导出结果
CloudflareST.exe ::进行优选
powershell.exe -ExecutionPolicy Bypass -File <name>.ps1 ::运行脚本删除先前的解析

setlocal EnableDelayedExpansion

REM 获取当前脚本所在目录
set "scriptPath=%~dp0"

REM 设置输入和输出文件路径
set "inputFile=%scriptPath%result.csv"
REM 获取当前用户桌面路径
set "desktopPath=C:\Users\你的用户名\Desktop"

REM 设置输出文件路径
set "outputFile=%desktopPath%\output.txt"

REM 清空输出文件
type nul > "%outputFile%"

REM 在输出文件开头添加 ";; A Records"
echo ;; A Records >> "%outputFile%"

REM 读取 result.csv 文件的每一行（跳过表头）
for /f "usebackq skip=1 tokens=1-6 delims=," %%A in ("%inputFile%") do (
REM 获取每一行中的 IP 地址（第一列）
set "ip=%%A"
REM 在文本文档中添加 "arey.tools.tf. 1 IN A" 和 IP 地址的数据
echo 解析域. 1 IN A !ip! >> "%outputFile%"
)

随后在 DNS 解析面板中导入即可。

电饭锅往你嘴里塞

嫌麻烦直接解析到我的自选这里吧，cname 是arey.tools.tf

不保证好用，反正我是这样用，更新时间不定，一周肯定有一次。你可以进阶一下用服务器 Crontab 来跑，但是我的服务器在海外，自选 ip 指定 url 测速比较影响我的网络情况，所以我只能在自己的电脑上跑了。

此文由 Mix Space 同步更新至 xLog
原始链接为 https://de3ay.com/posts/tech/cloudflare-fastly-ips-import