利用github Actions自动更新cloudflard proxyip
前言
Cloudflare大善人的Workers可以搭建节点,大佬们靠爱发电更新的proxyip一直不稳定,导制很多cloudflare网站打不开。今天闲下来了配置一个自动抓取proxyip然后DDNS更新。
效果演示:

配置教程:
- github创建一个项目,在项目根目录创建 .github/workflows/update-proxy-ip.yml。添加下面代码,代码在最后面。

- 在GitHub仓库的Settings → Secrets中添加:
- CLOUDFLARE_ZONE_ID:应该是类似 a1b2c3d4e5f6g7h8i9j0 的字符串
- CLOUDFLARE_API_TOKEN:以 Bearer 开头的API令牌
- DOMAIN_NAME:完整的域名,如 proxy.example.com

- 手动运行一次,看ip有没有保存到仓库。


- 运行完成无报错,看DDNS更新没有。更新了即成功!

至此结束!不知道cf proxyip用法的自己百度。
最后附上github脚本代码:
name: Update Proxy IP and Cloudflare DNS
on:
schedule:
- cron: '0 */6 * * *' # 每6小时运行一次
workflow_dispatch: # 允许手动触发
permissions:
contents: write # 添加写入权限
jobs:
update-proxy-ip:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }} # 使用GITHUB_TOKEN
- name: Fetch proxy IPs
run: |
curl -s https://raw.githubusercontent.com/leung7963/CF-PROXYIP/main/proxyip.txt -o proxyip.txt
# 检查文件是否包含有效IP
if [ ! -s proxyip.txt ]; then
echo "Error: Failed to fetch proxy IPs"
exit 1
fi
# 提取第一个IP地址
FIRST_IP=$(head -n 1 proxyip.txt | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
if [ -z "$FIRST_IP" ]; then
echo "Error: No valid IP found in the file"
exit 1
fi
echo "First IP: $FIRST_IP"
echo "FIRST_IP=$FIRST_IP" >> $GITHUB_ENV
- name: Commit and push if changed
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
# 检查文件是否有变化
if git diff --quiet; then
echo "No changes to commit"
else
git add proxyip.txt
git commit -m "Update proxy IP list - $(date +'%Y-%m-%d %H:%M:%S')"
git push origin HEAD:main
fi
- name: Update Cloudflare DNS
env:
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ZONE_ID: ${{ secrets.CLOUDFLARE_ZONE_ID }}
DOMAIN_NAME: ${{ secrets.DOMAIN_NAME }}
run: |
# 安装依赖
sudo apt-get update
sudo apt-get install -y jq curl
# 获取当前DNS记录
CURRENT_DNS_RECORDS=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CLOUDFLARE_ZONE_ID/dns_records?type=A&name=$DOMAIN_NAME" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json")
echo "Current DNS records: $CURRENT_DNS_RECORDS"
RECORD_ID=$(echo "$CURRENT_DNS_RECORDS" | jq -r '.result[0].id')
CURRENT_IP=$(echo "$CURRENT_DNS_RECORDS" | jq -r '.result[0].content')
echo "Record ID: $RECORD_ID"
echo "Current IP: $CURRENT_IP"
echo "New IP: $FIRST_IP"
# 如果IP不同则更新
if [ "$CURRENT_IP" != "$FIRST_IP" ] && [ -n "$RECORD_ID" ]; then
echo "Updating DNS record..."
RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CLOUDFLARE_ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"$DOMAIN_NAME\",\"content\":\"$FIRST_IP\",\"ttl\":120,\"proxied\":false}")
echo "Cloudflare response: $RESPONSE"
SUCCESS=$(echo "$RESPONSE" | jq -r '.success')
if [ "$SUCCESS" = "true" ]; then
echo "DNS record updated successfully"
else
echo "Failed to update DNS record"
exit 1
fi
else
echo "IP unchanged or no record found, skipping update"
fi
