抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

简介

利用优选 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 requests
import json

# Cloudflare API 密钥
API_KEY = '本文使用 Global API Key'
# Cloudflare 账户邮箱
EMAIL = '你的 CF 账户邮箱'
# 域名
DOMAIN = '你的域名'
# A 记录名称
RECORD_NAME = '你的 A 记录名称'

# Cloudflare Zone ID
ZONE_ID = '你的域名的 ZONE ID'

# Cloudflare API 请求头
headers = {
'X-Auth-Email': EMAIL,
'X-Auth-Key': API_KEY,
'Content-Type': 'application/json'
}

# 发送请求获取 IP 地址
response = requests.get('https://monitor.gacjie.cn/api/client/get_ip_address')
if response.status_code == 200:
data = response.json()
if data['status']:
# 从返回的数据中选择 delay 最小的 IP 地址
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)


# 获取 DNS

# Cloudflare API 请求头
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)
# print(resJson)

if resJson['result']:
data = resJson
if data['result']:
# 从返回的数据中选择 域名
for record in data['result']:
if record['name'] == RECORD_NAME and record['type'] == 'A':
# 找到匹配的记录,打印其 ID
DNS_ID=record['id']
print("A 记录名称为",RECORD_NAME,"的 ID 为:", record['id'])
break
# print('DNS 请求成功 :', data['result'])
else:
print('DNS 请求失败:', data['msg'])
else:
print('获取 DNS 失败:', response.status_code)

# 设置 DNS
# 构建 API 请求体
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)
# 发送 API 请求
response = requests.request("PUT",url, json=data, headers=headers)

# 处理 API 响应
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 工作流,我们需要进行如下步骤:

  1. 创建仓库,可以选择私有仓库。
  2. 克隆项目到本地,在根目录下创建一个 .github 文件夹,然后在 .github 文件夹里面创建一个 workflows 文件夹。
  3. 在 workflows 文件夹创建一个 yaml 文件,名字随意。
  4. 编写工作流代码:
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:
# push
schedule:
- cron: "*/15 * * * *" # 每 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" # 指定 Python 版本

- name: Install dependencies
run: pip install -r requirements.txt # 如果有依赖,需安装

- name: Execute Python script
run: python update.py # 运行你的 Python 脚本
  1. 把刚刚的 python 脚本放到根目录下,此处我 python 脚本的名字叫 update。
  2. 在根目录新建 requirements.txt 文件,里面写我们需要引用的库,只需要在里面写 requests 就行了。
  3. 推送到 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 requests
import json

# Cloudflare API 密钥
API_KEY = '本文使用 Global API Key'
# Cloudflare 账户邮箱
EMAIL = '你的 CF 账户邮箱'
# 域名
DOMAIN = '你的域名'
# A 记录名称
RECORD_NAME = '你的 A 记录名称'

# Cloudflare Zone ID
ZONE_ID = '你的域名的 ZONE ID'

# Cloudflare API 请求头
headers = {
'X-Auth-Email': EMAIL,
'X-Auth-Key': API_KEY,
'Content-Type': 'application/json'
}

# 发送请求获取 IP 地址
response = requests.get('https://monitor.gacjie.cn/api/client/get_ip_address')
if response.status_code == 200:
data = response.json()
if data['status']:
# 从返回的数据中选择 delay 最小的 IP 地址
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)


# 获取 DNS

# Cloudflare API 请求头
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)
# print(resJson)

if resJson['result']:
data = resJson
if data['result']:
# 从返回的数据中选择 域名
for record in data['result']:
if record['name'] == RECORD_NAME and record['type'] == 'A':
# 找到匹配的记录,打印其 ID
DNS_ID=record['id']
print("A 记录名称为",RECORD_NAME,"的 ID 为:", record['id'])
break
# print('DNS 请求成功 :', data['result'])
else:
print('DNS 请求失败:', data['msg'])
else:
print('获取 DNS 失败:', response.status_code)

# 设置 DNS
# 构建 API 请求体
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)
# 发送 API 请求
response = requests.request("PUT",url, json=data, headers=headers)

# 处理 API 响应
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:
# push
schedule:
- cron: "*/15 * * * *" # 每 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" # 指定 Python 版本

- name: Install dependencies
run: pip install -r requirements.txt # 如果有依赖,需安装

- name: Execute Python script
run: python update.py # 运行你的 Python 脚本

更新日志

2024-03-20

  1. 更新基本内容。

评论