背景

有些加速软件,需要频繁更换IP,自动化更新IP的思路是通过填入固定域名,再通过DNS的 API更新域名的IP来实现,更换IP的需求。

1、获得新IP

通过IP列表和 CDN 厂商提供的大文件下载测速功能,获取当前最快的IP。

./CloudflareST -url https://speed.cloudflare.com/__down?bytes=200000000

执行完后,会生成result.csv文件。获取第一个IP

ipAddr=$(sed -n "$((x + 2)),1p" result.csv | awk -F, '{print $1}')

再把这个ipAddr写入专用加速 二级域名里。这样就可以让使用该域名的软件自动保持使用最新最快IP了。

2、用chatgpt写更新DNS的脚本

#!/bin/bash

# 预置变量
tokenid="xxxxxx"
tokenkey="xxxxxxxxxxxxxxxx" 
sub_domain="xxx" #专用的二级域名

./CloudflareST -url https://speed.cloudflare.com/__down?bytes=200000000

#curl https://dnsapi.cn/Domain.List -d "login_token=${tokenid},${tokenkey}&format=json" #返回域名列表,给下面domin_id赋值

domain_id="xxxxxxx"

# 获取已有的 DNS 记录中指定子域名的 IP 地址
response=$(curl -s -X POST https://dnsapi.cn/Record.List -d "login_token=${tokenid},${tokenkey}&format=json&domain_id=${domain_id}&sub_domain=${sub_domain}&record_type=A&offset=0&length=3")
currentIP=$(echo "$response" | jq -r '.records[0].value')
record_id=$(echo "$response" | jq -r '.records[0].id')

# 待更新的新 IP 地址
ipAddr=$(sed -n "$((x + 2)),1p" result.csv | awk -F, '{print $1}')

echo "当前 IP 地址:$currentIP"
echo "待更新 IP 地址:$ipAddr"
pushmessage="this is test msg"

# 比较 IP 地址是否相同,若不同则执行更新操作
if [ "$currentIP" != "$ipAddr" ]; then
    echo "IP 地址不同,开始执行更新操作"
    pushmessage="IP 地址已更新为:$ipAddr"
    # 在此处添加你的更新操作(包含判断成功与否的代码)
    curl -X POST https://dnsapi.cn/Record.Modify -d "login_token=${tokenid},${tokenkey}&format=json&domain_id=${domain_id}&record_id=${record_id}&sub_domain=${sub_domain}&value=$ipAddr&record_type=A&record_line_id=0"
else
    echo "IP 地址相同,无需更新"
    pushmessage="IP 无需更新:$ipAddr"
fi
#如果不需要tg推送,下面全不要 
telegramBotUserId="@userinfid"  #用户ID通过@userinfoid获取
telegramBotToken="bottoken"   #通过botfather获取

echo $pushmessage
message_text=$pushmessage
#解析模式,可选HTML或Markdown
MODE='HTML'
#api接口
URL="https://api.telegram.org/bot${telegramBotToken}/sendMessage"
if [[ -z ${telegramBotToken} ]]; then
   echo "未配置TG推送"
else
   #res=$(timeout 20s curl -s -X POST $URL -d chat_id=${telegramBotUserId}  -d parse_mode=${MODE} -d text="${message_text}")
   res=$(wget -q --timeout=20 -O - --post-data="chat_id=${telegramBotUserId}&parse_mode=${MODE}&text=${message_text}" "$URL")

   if [ $? == 124 ];then
      echo 'TG_api请求超时,请检查网络是否重启完成并是否能够访问TG'
      exit 1
   fi
   resSuccess=$(echo "$res" | jq -r ".ok")
   if [[ $resSuccess = "true" ]]; then
      echo "TG推送成功";
      else
      echo "TG推送失败,请检查TG机器人token和ID";
   fi
fi


验证执行效果:

image-1702729527182

后面,再添加到crond做定时任务,比如要在白天的指定时间点(9点、12点、15点、18点、21点)执行脚本,可以使用 crontab -e 命令编辑 cron 作业表,然后添加以下内容:

0 9,12,15,18,21 * * * /path/to/your/script.sh

注意,使用cron执行时,上面的脚本需要使用绝对路径,或者 cd 到执行目录。