简介 利用优选 IP 加快 Cloudflare 的访问速度,防止因为 IP 被墙导致的无法访问或者访问缓慢。
原理 通过修改 Cloudflare 的 A 记录 IP 地址,或者 CNAME 域名地址两种方法,我们可以使套了 CF 的网站的访问速度达到正常的水平。
优选 IP 首先我们需要一个优选 IP,本文使用 monitor.gacjie.cn 提供的 API 来获取,也可以通过其他方式获取。
手动更新的情况我们直接访问该网站查看即可。
更新 Cloudflare 域名 DNS 上文说到我们可以更新 A 记录,也可以更新 CNAME,此处我们选择更新 A 记录。
进入网站后修改箭头处的数据。CNAME 的修改也是一样的,只不过前面的 A 记录改成 CNAME。修改完成后保存即可。
你可以选择自己想要修改的网址,此处我修改的是 root 记录。
定时自动更新 要实现定时自动更新,我们可以借助 Cloudflare 的 API 来修改 A 记录。
本文使用 python 代码来更新:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 import requestsimport jsonAPI_KEY = '本文使用 Global API Key' EMAIL = '你的 CF 账户邮箱' DOMAIN = '你的域名' RECORD_NAME = '你的 A 记录名称' ZONE_ID = '你的域名的 ZONE ID' headers = { 'X-Auth-Email' : EMAIL, 'X-Auth-Key' : API_KEY, 'Content-Type' : 'application/json' } response = requests.get('https://monitor.gacjie.cn/api/client/get_ip_address' ) if response.status_code == 200 : data = response.json() if data['status' ]: min_delay_ip = min (data['info' ]['CM' ] + data['info' ]['CU' ] + data['info' ]['CT' ], key=lambda x: x['delay' ]) NEW_IP = min_delay_ip['ip' ] print ('API 请求成功 新 IP:' , NEW_IP) else : print ('API 请求失败:' , data['msg' ]) else : print ('获取 IP 地址失败:' , response.status_code) headers_get = { 'X-Auth-Email' : EMAIL, 'Content-Type' : 'application/json' } url = 'https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records' ; url = url.replace('{ZONE_ID}' , ZONE_ID) response = requests.request("GET" , url, headers=headers) resJson = json.loads(response.text) if resJson['result' ]: data = resJson if data['result' ]: for record in data['result' ]: if record['name' ] == RECORD_NAME and record['type' ] == 'A' : DNS_ID=record['id' ] print ("A 记录名称为" ,RECORD_NAME,"的 ID 为:" , record['id' ]) break else : print ('DNS 请求失败:' , data['msg' ]) else : print ('获取 DNS 失败:' , response.status_code) data = { 'type' : 'A' , 'name' : RECORD_NAME, 'content' : NEW_IP, "proxied" : True } url = 'https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}' url = url.replace('{ZONE_ID}' , ZONE_ID) url = url.replace('{RECORD_ID}' , DNS_ID) response = requests.request("PUT" ,url, json=data, headers=headers) if response.status_code == 200 : print ('A 记录 IP 修改成功!' ) else : print (f'错误:{response.status_code} - {response.text} ' )
其中 API_KEY 可以在如下地址找到:
ZONE_ID 可以在如下地址找到:
这样我们就有了一个基本执行单元了。
然后我们就需要设置定时任务。我们可以在本地或者 VPS 上执行定时任务,不过本文选择托管到 Github 上,并使用 Action 来定时执行任务。
要启用 Github 的 Action 工作流,我们需要进行如下步骤:
创建仓库,可以选择私有仓库。
克隆项目到本地,在根目录下创建一个 .github 文件夹,然后在 .github 文件夹里面创建一个 workflows 文件夹。
在 workflows 文件夹创建一个 yaml 文件,名字随意。
编写工作流代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 name: Update Script on: schedule: - cron: "*/15 * * * *" jobs: update: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.8" - name: Install dependencies run: pip install -r requirements.txt - name: Execute Python script run: python update.py
把刚刚的 python 脚本放到根目录下,此处我 python 脚本的名字叫 update。
在根目录新建 requirements.txt 文件,里面写我们需要引用的库,只需要在里面写 requests 就行了。
推送到 Github。
这样每隔 15 分钟就会更新一次 IP 了。如果你需要修改间隔时间,请搜索 crontab 相关内容,Github 的 cron 和 Linux 的 cron 是一致的。
代码 基本执行单元 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 import requestsimport jsonAPI_KEY = '本文使用 Global API Key' EMAIL = '你的 CF 账户邮箱' DOMAIN = '你的域名' RECORD_NAME = '你的 A 记录名称' ZONE_ID = '你的域名的 ZONE ID' headers = { 'X-Auth-Email' : EMAIL, 'X-Auth-Key' : API_KEY, 'Content-Type' : 'application/json' } response = requests.get('https://monitor.gacjie.cn/api/client/get_ip_address' ) if response.status_code == 200 : data = response.json() if data['status' ]: min_delay_ip = min (data['info' ]['CM' ] + data['info' ]['CU' ] + data['info' ]['CT' ], key=lambda x: x['delay' ]) NEW_IP = min_delay_ip['ip' ] print ('API 请求成功 新 IP:' , NEW_IP) else : print ('API 请求失败:' , data['msg' ]) else : print ('获取 IP 地址失败:' , response.status_code) headers_get = { 'X-Auth-Email' : EMAIL, 'Content-Type' : 'application/json' } url = 'https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records' ; url = url.replace('{ZONE_ID}' , ZONE_ID) response = requests.request("GET" , url, headers=headers) resJson = json.loads(response.text) if resJson['result' ]: data = resJson if data['result' ]: for record in data['result' ]: if record['name' ] == RECORD_NAME and record['type' ] == 'A' : DNS_ID=record['id' ] print ("A 记录名称为" ,RECORD_NAME,"的 ID 为:" , record['id' ]) break else : print ('DNS 请求失败:' , data['msg' ]) else : print ('获取 DNS 失败:' , response.status_code) data = { 'type' : 'A' , 'name' : RECORD_NAME, 'content' : NEW_IP, "proxied" : True } url = 'https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}' url = url.replace('{ZONE_ID}' , ZONE_ID) url = url.replace('{RECORD_ID}' , DNS_ID) response = requests.request("PUT" ,url, json=data, headers=headers) if response.status_code == 200 : print ('A 记录 IP 修改成功!' ) else : print (f'错误:{response.status_code} - {response.text} ' )
Action 工作流脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 name: Update Script on: schedule: - cron: "*/15 * * * *" jobs: update: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.8" - name: Install dependencies run: pip install -r requirements.txt - name: Execute Python script run: python update.py
更新日志