赛博菩萨 当日是cloudflare.com啦,目前为止个人使用到最慈善最考虑最稳定的网络服务商。
1.需要准备的内容
2个域名,且必须为两个独立的域名,可以都托管在cloudflare,也可以只托管其中一个。
当然是cloudflare 账号一枚
一个已绑卡的paypal账户或者一张外币卡(信用卡最佳)
2.开始实操 以下内容为两个域名都托管在cloudflare为例,如你和我不一样,请灵活变通。
i. 进入cloudflare后台,假设你需要加速的站点主域名为default1.com,用于Saas回源的域名为testcdn1.xyz。
ii. 修改testcnd1.xyz的A记录解析到你VPS的IP,这里就是你VPS的真实地址。
iii. 然后进入SSL/TLS
-自定义主机名
>回退源
填写你的回源域名testcdn1.xyz。
iiii. 再在上门添加自定义主机名,也就是你要加速的站点域名default.com,
最低TLS版本
:默认(TLS 1.0)
证书类型
: 由Cloudflare提供
验证方式
: TXT验证
点击添加自定义主机名
创建
根据页面显示内容手动添加域名TXT解析
记录,待证书状态和主机名状态都显示绿色有效
即可。
iiiii. 返回Cloudflare控制中心 > 需要加速的站点主域名为default1.com
的DNS配置页面,将default1.com
域名解析CNAME
到testcdn1.xyz
,以辅助完成上述TXT解析验证
。
3.配置CDN优选IP域名,将羊毛进行到底线。 此步骤其实可以忽略,直接google检索cf优选域名,进行选择开源或其他个人维护的CDN域名解析即可。
i.到testcdn1.xyz域名管理页面首页获取区域 ID
,复制记录一下备用。
ii.创建API令牌
,
点击创建令牌
选择 [编辑区域DNS] - 使用模板
权限选择区不改变,选择区域资源,修改为:包括>所有区域
完成点击继续显示摘要
获取API,复制记录一下备用 (API只会显示一次,请妥善保管)。
4.选择一台VPS安装Python i. 连接SSH终端(VPS账号密码就不用我告诉你了吧),按照顺序执行以下命令。
sudo apt install python3-pip
遇到提示[Y/N],全程选择Y
到最后一步,输入Phtyon -v
验证是否安装成功。
ii. 寻找一个你习惯保存文件的目录,例如:/home/下,新建一个Python文件,名称任意(但不能为中文)。
我这里命名为cf-speedtest2domains.py
,也可以在电脑本地建文件再通过工具上传到此目录下。
iii. 插入以下代码,仅需要修改3
个地方,此代码采用开源api接口,代码创作利用ChatGPT进行。
荣幸使用开源大佬cf优选api,https://api.345673.xyz/get_data 。
修改下面源码中的标识部分,分辨为Cloudflare账户API
,和对应域名区域ID
以及你要的优选IP解析的二级域名
,我这里用域名cf.testcdn1.xyz为优选IP的二级域名。
import requests import csv api_token = "1" zone_id = "2" domain = "3" api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" headers = { "Authorization" : f"Bearer {api_token}" , "Content-Type" : "application/json" } def delete_all_dns_records(): response = requests.get(api_url, headers=headers, params={"name" : domain}) if response.status_code == 200: result = response.json() dns_records = result["result" ] dns_record_ids = [record["id" ] for record in dns_records] for record_id in dns_record_ids: delete_response = requests.delete(f"{api_url}/{record_id}" , headers=headers) if delete_response.status_code == 200: print (f"已删除 DNS 记录: {record_id}" ) else : print (f"删除 DNS 记录时出错:{delete_response.text}" ) else : print ("获取 DNS 记录时出错:" , response.text) def fetch_and_filter_ips(): url = "https://api.345673.xyz/get_data" key = "o1zrmHAF" data = {"key" : key} response = requests.post(url, json=data) if response.status_code == 200: result = response.json() if result["code" ] == 200: info = result["info" ] ip_list = [] for category_name, ips in info.items(): for ip_info in ips: delay_str = ip_info["delay" ].replace("ms" , "" ) try: delay = float (delay_str) ip_info["delay" ] = delay ip_info["category" ] = category_name ip_list.append(ip_info) except ValueError: print ("无法转换延迟值为浮点数:{}" .format(ip_info['delay' ])) ip_list.sort(key=lambda x: x["delay" ]) top_3_ips = ip_list[:3] with open('ip.csv' , 'w' , newline='' , encoding='utf-8' ) as csvfile: fieldnames = ["节点类别" , "IP地址" , "线路" , "节点" , "延迟" , "下载速度" , "时间" ] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for ip_info in top_3_ips: writer.writerow({ "节点类别" : ip_info["category" ], "IP地址" : ip_info["ip" ], "线路" : ip_info["line" ], "节点" : ip_info["node" ], "延迟" : ip_info["delay" ], "下载速度" : ip_info["downloadspeed" ], "时间" : ip_info["time" ] }) return [ip_info["ip" ] for ip_info in top_3_ips] else : print ("请求失败,错误信息:{}" .format(result['info' ])) else : print ("请求失败,状态码:{}" .format(response.status_code)) return [] def add_dns_records(ip_addresses): for ip_address in ip_addresses: data = { "type" : "A" , "name" : domain, "content" : ip_address, "ttl" : 1, "proxied" : False } response = requests.post(api_url, headers=headers, json=data) if response.status_code == 200: print (f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下" ) else : print (f"解析IP地址 {ip_address} 时出错:{response.text}" ) def main(): delete_all_dns_records() ip_addresses = fetch_and_filter_ips() if ip_addresses: add_dns_records(ip_addresses) print ("所有操作已完成" ) else : print ("没有符合条件的 IP 地址" ) if __name__ == "__main__" : main()
iiii.回到控制窗口,测试执行以下命令,测试脚本是否可以正常使用。
python3 cf-speedtest2domains.py
一些正常,你会获取到脚本返回日志的提示,一般如下。
已删除 DNS 记录: c540b0f77b320559a9e73bd340bd4ea1 已删除 DNS 记录: bbf0c86c7e50a6e35c05900d193a5846 已删除 DNS 记录: 689f033872587e1f20000d7b01834f4a IP地址 162.159.153.62 已成功解析到 Cloudflare 域名下 IP地址 162.159.152.202 已成功解析到 Cloudflare 域名下 IP地址 162.159.136.54 已成功解析到 Cloudflare 域名下
当你看到以上内容,恭喜你,已经成功编辑好了py脚本。
iiiii.设置自定运行
一般我们可以通过两种方式来实现自动运行,crontab
和 VPS面板的计划任务
crontab
方法代码如下:
crontab -e 0 */6 * * * /usr/lib/python3 /home/cf-speedtest2domains.py
计划任务
方法代码如下:
常用的面板有很多,例如:宝塔、aapanel、1panel,这里不作赘述。
cd /< py文件存放目录 > && python3 < py文件 >cd /home && python3 cf-speedtest2domains.py
这样定时执行就部署完成,也就实现了自动将开源优选ip自动解析到设置的二级域名下(也就是自建优选IP的二级域名)。
5. 修改加速的站点主域名的CNAME解析到CDN优选IP域名。 i.返回Cloudflare控制中心 > 需要加速的站点主域名为default1.com的DNS配置页面。
ii.将default1.com的解析记录修改为优选IP的二级域名,这里按上述为cf.testcdn1.xyz。
如有www,请直接cname到根域名下即可,可以直接设置为cf.testcdn1.xyz。
DONE 简单5步,上车成功,当然也会遇到很多报错,多数是SSL证书及cloudflare后台设置问题。
############################################################################################ 下面附上一些常见错误:
重定向次数过多 提示我们重定向过多,这是因为HTTPS加密的问题,我们进入Cloudflare后台
-SSL/TLS
>概述
将SSL/TLS加密模式改为完全
再次尝试访问
Invalid SSL Certificate或者fail 与SSL证书
有关的,VPS端检查站点是否配置https证书。
新增几个个通用脚本 直接可以使用github上一些开源api,提交,自行修改。
import requests import csv api_token = "*********" zone_id = "*****" subdomain = "*****" api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" headers = { "Authorization" : f"Bearer {api_token}" , "Content-Type" : "application/json" } response = requests.get(api_url, headers=headers, params={"name" : subdomain}) if response.status_code == 200: data = response.json() for record in data['result' ]: record_id = record['id' ] delete_url = f"{api_url}/{record_id}" delete_response = requests.delete(delete_url, headers=headers) if delete_response.status_code == 200: print (f"已成功删除DNS记录:{record['name']} - {record['content']}" ) else : print (f"删除DNS记录时出错:{delete_response.text}" ) url = "https://raw.githubusercontent.com/ymyuuu/IPDB/main/bestcf.txt" save_path = "result.csv" response = requests.get(url) if response.status_code == 200: content = response.text lines = content.split('\n' ) with open(save_path, 'w' , newline='' , encoding='utf-8' ) as csvfile: csv_writer = csv.writer(csvfile) for line in lines: data = line.split() csv_writer.writerow(data) print ("数据已保存到" , save_path) with open(save_path, 'r' , newline='' , encoding='utf-8' ) as csvfile: csv_reader = csv.reader(csvfile) next(csv_reader) for row in csv_reader: ip_address = row[0] api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" data = { "type" : "A" , "name" : subdomain, "content" : ip_address, "ttl" : 1, "proxied" : False } response = requests.post(api_url, headers=headers, json=data) if response.status_code == 200: print (f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下" ) else : print (f"解析IP地址 {ip_address} 时出错:" , response.text) else : print ("无法从URL检索数据" ) else : print ("获取DNS记录时出错:" , response.text)
or
import requests import csv api_token = "****" zone_id = "****" subdomain = "****" api_url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records" headers = { "Authorization" : f"Bearer {api_token}" , "Content-Type" : "application/json" } response = requests.get(api_url, headers=headers, params={"name" : subdomain}) if response.status_code == 200: data = response.json() for record in data['result' ]: record_id = record['id' ] delete_url = f"{api_url}/{record_id}" delete_response = requests.delete(delete_url, headers=headers) if delete_response.status_code == 200: print (f"已成功删除DNS记录:{record['name']} - {record['content']}" ) else : print (f"删除DNS记录时出错:{delete_response.text}" ) url = "https://raw.githubusercontent.com/ymyuuu/IPDB/main/bestproxy.txt" save_path = "result.csv" response = requests.get(url) if response.status_code == 200: content = response.text lines = content.split('\n' ) with open(save_path, 'w' , newline='' , encoding='utf-8' ) as csvfile: csv_writer = csv.writer(csvfile) for line in lines: data = line.split() csv_writer.writerow(data) print ("数据已保存到" , save_path) with open(save_path, 'r' , newline='' , encoding='utf-8' ) as csvfile: csv_reader = csv.reader(csvfile) next(csv_reader, None) for row in csv_reader: if row: ip_address = row[0] data = { "type" : "A" , "name" : subdomain, "content" : ip_address, "ttl" : 1, "proxied" : False } response = requests.post(api_url, headers=headers, json=data) if response.status_code == 200: print (f"IP地址 {ip_address} 已成功解析到 Cloudflare 域名下" ) else : print (f"解析IP地址 {ip_address} 时出错:" , response.text) else : print ("无法从URL检索数据" ) else : print ("获取DNS记录时出错:" , response.text)