利用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