支持同时解析到多个域名解析商

This commit is contained in:
D:/Program Files/Git/jaz
2024-11-07 21:12:36 +08:00
parent 9bd88fdfe7
commit 2aead411d3
8 changed files with 326 additions and 220 deletions

View File

@@ -8,14 +8,21 @@
★ 本工具主要是将网站域名动态解析到获取到的优选ip上目前支持阿里云DNS、DNSPod、华为云DNS、NameSilo
### VPS789.com提供CF优选IP接口
1、支持对CF优选IP的三网实时监测延迟、丢包率支持查看24小时、一个月的监测数据。
<br>
2、支持对CF优选IP的下载速度进行测试
### CF优选IP接口(VPS789.com提供)
3、基于CloudFlareST工具生成一个优选IP池vps789的优选IP每天定时淘汰1/3网络不好的IP从优选IP池补充到vps789中继续监测。通过持续补充优选IP和IP优胜略汰机制保证vps789上的IP都是优中选优。
**CF优选IP机制说明**
4、vps789优选IP监控页面地址https://vps789.com/cfip
基于CloudFlareST工具生成一个[初选IP池]vps789固定24小时监测200-500个IP。每天根据网络情况综合评估淘汰1/3网络较差的IP然后从[初选IP池]补充到vps789中继续监测。**通过持续补充优选IP和IP优胜略汰机制保证vps789上的IP都是优中选优。**
2、支持对cloudFlare IP进行延迟、丢包率、下载速度、晚高峰网络状态等多个维度的筛选
3、vps789优选IP监控页面地址https://vps789.com/cfip
4、VPS789优选IP动态获取接口https://vps789.com/public/sum/cfIpApi
<br>
### 使用方法
@@ -27,9 +34,7 @@
pip install -r requirements.txt
```
1. 登录DNS解析平台,获取 SecretId、SecretKey。
如果使用阿里云DNS注意需要添加DNS控制权限**AliyunDNSFullAccess**
如果使用NameSilo只用填SecretKey即可。
1. 登录DNS解析平台获取 SecretId、SecretKey。如果使用NameSilo只用填SecretKey即可。
2. 将脚本下载到本地修改start.py中的SecretId、SecretKey
@@ -39,8 +44,16 @@ pip install -r requirements.txt
4. 运行程序如果能够正常运行可以选择cron定时执行(建议1个小时执行一次)
```python
python start.py
#域名解析在阿里云DNS
python cfipToAliDns.py
#域名解析在DnsPod
python cfipToDnsPod.py
#域名解析在华为云DNS
python cfipToHwDns.py
#域名解析在NameSilo
python cfipToNameSilo.py
```
<br>
### 鸣谢
感谢以下项目提供技术支撑与实现思路

37
cfipToAliDns.py Normal file
View File

@@ -0,0 +1,37 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import time
import requests
from dns.aliyun import AliApi
from dns.core import Core
from log import Logger
import traceback
#CM:移动 CU:联通 CT:电信 AB:境外 DEF:默认
#需要动态解析到Cf优选ip的域名和子域名
DOMAINS = {
"vps789.com": {"@": ["CM","CU","CT"],"www": ["CM","CU","CT"]},
"vpsxxx777.com": {"@": ["CM","CU","CT"]}
}
#解析生效条数
AFFECT_NUM = 2
#如果使用阿里云解析 REGION出现错误再修改 默认不需要修改 https://help.aliyun.com/document_detail/198326.html
REGION_ALI = 'cn-hongkong'
#解析生效时间默认为600秒
TTL = 600
#阿里云后台获取 https://help.aliyun.com/document_detail/53045.html 注意需要添加DNS控制权限 AliyunDNSFullAccess
SECRETID = 'LTAIxxxxxxxxxxxxxxxxxxxWcRDH'
SECRETKEY = 'LOitxxxxxxxxxxxxxxxxxxxzcGR'
if __name__ == '__main__':
config = {'DOMAINS':DOMAINS,"AFFECT_NUM":AFFECT_NUM,"TTL":TTL,"DNS_SERVER":2}
cloud = AliApi(SECRETID, SECRETKEY,REGION_ALI)
core = Core(cloud,config)
core.main()

34
cfipToDnsPod.py Normal file
View File

@@ -0,0 +1,34 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import time
import requests
from dns.qCloud import QcloudApiv3 # QcloudApiv3 DNSPod 的 API 更新了 By github@z0z0r4
from dns.core import Core
from log import Logger
import traceback
#CM:移动 CU:联通 CT:电信 AB:境外 DEF:默认
#需要动态解析到Cf优选ip的域名和子域名
DOMAINS = {
"vps789.com": {"@": ["CM","CU","CT"],"www": ["CM","CU","CT"]},
"vpsxxx777.com": {"@": ["CM","CU","CT"]}
}
#解析生效条数
#免费的DNSPod相同线路最多支持2条解析
AFFECT_NUM = 2
#解析生效时间默认为600秒 如果不是DNS付费版用户 不要修改!!!
TTL = 600
#腾讯云后台获取 https://console.cloud.tencent.com/cam/capi
SECRETID = 'LTAI5txxxxxxxxxxxxxxxxxcRDH'
SECRETKEY = 'LOixxxxxxxxxxxxxxxxx4mzcGR'
if __name__ == '__main__':
config = {'DOMAINS':DOMAINS,"AFFECT_NUM":AFFECT_NUM,"TTL":TTL,"DNS_SERVER":1}
cloud = QcloudApiv3(SECRETID, SECRETKEY)
core = Core(cloud,config)
core.main()

36
cfipToHwDns.py Normal file
View File

@@ -0,0 +1,36 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import time
import requests
from dns.huawei import HuaWeiApi
from dns.core import Core
from log import Logger
import traceback
#CM:移动 CU:联通 CT:电信 AB:境外 DEF:默认
#需要动态解析到Cf优选ip的域名和子域名
DOMAINS = {
"vps789.com": {"@": ["CM","CU","CT"],"www": ["CM","CU","CT"]},
"vpsxxx777.com": {"@": ["CM","CU","CT"]}
}
#解析生效条数
AFFECT_NUM = 2
#如果使用华为云解析 需要从API凭证-项目列表中获取
REGION_HW = 'cn-east-3'
#解析生效时间默认为600秒
TTL = 600
#华为云后台获取 https://support.huaweicloud.com/devg-apisign/api-sign-provide-aksk.html
SECRETID = 'LTxxxxxxxxxxxxxxWcRDH'
SECRETKEY = 'LOitxxxxxxxxxxxxxxxxxxmzcGR'
if __name__ == '__main__':
config = {'DOMAINS':DOMAINS,"AFFECT_NUM":AFFECT_NUM,"TTL":TTL,"DNS_SERVER":3}
cloud = HuaWeiApi(SECRETID, SECRETKEY, REGION_HW)
core = Core(cloud,config)
core.main()

32
cfipToNameSilo.py Normal file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import time
import requests
from dns.nameSilo import NameSiloClient
from dns.core import Core
from log import Logger
import traceback
#CM:移动 CU:联通 CT:电信 AB:境外 DEF:默认
#需要动态解析到Cf优选ip的域名和子域名#NameSilo不支持多线解析只能选DEF默认线路
DOMAINS = {
"vps789.com": {"@": ["DEF"],"www":["DEF"]},
"vpsxxx777.com": {"@": ["DEF"]},
}
#解析生效条数
AFFECT_NUM = 2
#解析生效时间NameSilo最少为3600
TTL = 3600
#NameSilo后台获取 https://www.namesilo.com/account/api-manager NameSilo只用填SECRETKEY即可
SECRETKEY = '72xxxxxxxxxxxxa332'
if __name__ == '__main__':
config = {'DOMAINS':DOMAINS,"AFFECT_NUM":AFFECT_NUM,"TTL":TTL,"DNS_SERVER":4}
cloud = NameSiloClient(SECRETKEY)
core = Core(cloud,config)
core.main()

163
dns/core.py Normal file
View File

@@ -0,0 +1,163 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import time
import requests
from dns.qCloud import QcloudApiv3 # QcloudApiv3 DNSPod 的 API 更新了 By github@z0z0r4
from dns.aliyun import AliApi
from dns.huawei import HuaWeiApi
from dns.nameSilo import NameSiloClient
from log import Logger
import traceback
class Core():
log_cf2dns = Logger('cf2dns.log', level='debug')
def __init__(self, cloud,config):
self.cloud = cloud
self.config = config
def get_optimization_ip(self):
try:
headers = headers = {'Content-Type': 'application/json'}
data = {}
response = requests.post('https://vps789.com/public/sum/cfIpApi', json=data, headers=headers)
if response.status_code == 200:
self.log_cf2dns.logger.info("GET OPTIMIZATION IP SUCCESS" )
return response.json()
else:
self.log_cf2dns.logger.error("GET OPTIMIZATION IP ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: REQUEST STATUS CODE IS NOT 200")
return None
except Exception as e:
self.log_cf2dns.logger.error("GETs OPTIMIZATION IP ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))
return None
#s_info已存在的ipc_info 最新的优选cfip
def changeDNS(self,line, s_info, c_info, domain, sub_domain):
recordType = "A"
lines = {"CM": "移动", "CU": "联通", "CT": "电信", "AB": "境外", "DEF": "默认"}
line = lines[line]
print(s_info)
print(c_info)
try:
create_num = self.config['AFFECT_NUM'] - len(s_info)
# 如果线路能解析的ip已满就用cfip一个一个去替换原来的ip解析
if create_num == 0:
for info in s_info:
if len(c_info) == 0:
break
cf_ip = c_info.pop(random.randint(0,len(c_info)-1))["ip"]
if cf_ip in str(s_info):
continue
ret = self.cloud.change_record(domain, info["recordId"], sub_domain, cf_ip, recordType, line, self.config['TTL'])
if(self.config['DNS_SERVER'] != 1 or ret["code"] == 0):
self.log_cf2dns.logger.info("CHANGE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip )
else:
self.log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip + "----MESSAGE: " + ret["message"] )
# 如果线路还可以解析更多的ip就添加cfip解析直到用完
elif create_num > 0:
for i in range(create_num):
if len(c_info) == 0:
break
cf_ip = c_info.pop(random.randint(0,len(c_info)-1))["ip"]
if cf_ip in str(s_info):
continue
ret = self.cloud.create_record(domain, sub_domain, cf_ip, recordType, line, self.config['TTL'])
if(self.config['DNS_SERVER'] != 1 or ret["code"] == 0):
self.log_cf2dns.logger.info("CREATE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----VALUE: " + cf_ip )
else:
self.log_cf2dns.logger.error("CREATE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip + "----MESSAGE: " + ret["message"] )
# 如果线路能解析的ip已超出配额就用cfip一个一个去替换原来的ip解析
else:
for info in s_info:
if create_num == 0 or len(c_info) == 0:
break
cf_ip = c_info.pop(random.randint(0,len(c_info)-1))["ip"]
if cf_ip in str(s_info):
create_num += 1
continue
ret = self.cloud.change_record(domain, info["recordId"], sub_domain, cf_ip, recordType, line, self.config['TTL'])
if(self.config['DNS_SERVER'] != 1 or ret["code"] == 0):
self.log_cf2dns.logger.info("CHANGE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip )
else:
self.log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip + "----MESSAGE: " + ret["message"] )
create_num += 1
except Exception as e:
self.log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))
def main(self):
recordType = "A"
if len(self.config['DOMAINS']) > 0:
try:
cfips = self.get_optimization_ip()
if cfips == None or cfips["code"] != 0:
self.log_cf2dns.logger.error("GET CLOUDFLARE IP ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(cfips["data"]))
return
cf_cmips = cfips["data"]["CM"]
cf_cuips = cfips["data"]["CU"]
cf_ctips = cfips["data"]["CT"]
cf_defips = cfips["data"]["AllAvg"]
for domain, sub_domains in self.config['DOMAINS'].items():
for sub_domain, lines in sub_domains.items():
if self.config['DNS_SERVER'] == 4 and len(lines)!=1:
self.log_cf2dns.logger.info("域名解析为NameSilo时线路只能填DEF")
return
#下面5个数组存的是不同线路最新获取的优选IP列表
temp_cf_cmips = cf_cmips.copy()
temp_cf_cuips = cf_cuips.copy()
temp_cf_ctips = cf_ctips.copy()
temp_cf_abips = cf_ctips.copy()
temp_cf_defips = cf_defips.copy()
if self.config['DNS_SERVER'] == 1:
ret = self.cloud.get_record(domain, 20, sub_domain, "CNAME")
if ret["code"] == 0:
for record in ret["data"]["records"]:
if record["line"] == "移动" or record["line"] == "联通" or record["line"] == "电信":
retMsg = self.cloud.del_record(domain, record["id"])
if(retMsg["code"] == 0):
self.log_cf2dns.logger.info("DELETE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+record["line"] )
else:
self.log_cf2dns.logger.error("DELETE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+record["line"] + "----MESSAGE: " + retMsg["message"] )
ret = self.cloud.get_record(domain, 100, sub_domain, recordType)
# ret["code"] == 0 就是self.config['DNS_SERVER'] == 1
if self.config['DNS_SERVER'] != 1 or ret["code"] == 0 :
if self.config['DNS_SERVER'] == 1 and "Free" in ret["data"]["domain"]["grade"] and self.config['AFFECT_NUM'] > 2:
self.config['AFFECT_NUM'] = 2
#下面5个数组存的是已存在的DNS解析列表
cm_info = []
cu_info = []
ct_info = []
ab_info = []
def_info = []
for record in ret["data"]["records"]:
info = {}
info["recordId"] = record["id"]
info["value"] = record["value"]
if record["line"] == "移动":
cm_info.append(info)
elif record["line"] == "联通":
cu_info.append(info)
elif record["line"] == "电信":
ct_info.append(info)
elif record["line"] == "境外":
ab_info.append(info)
elif record["line"] == "默认":
def_info.append(info)
for line in lines:
if line == "CM":
self.changeDNS("CM", cm_info, temp_cf_cmips, domain, sub_domain)
elif line == "CU":
self.changeDNS("CU", cu_info, temp_cf_cuips, domain, sub_domain)
elif line == "CT":
self.changeDNS("CT", ct_info, temp_cf_ctips, domain, sub_domain)
elif line == "AB":
self.changeDNS("AB", ab_info, temp_cf_abips, domain, sub_domain)
elif line == "DEF":
self.changeDNS("DEF", def_info, temp_cf_defips, domain, sub_domain)
except Exception as e:
traceback.print_exc()
self.log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))

View File

@@ -20,6 +20,8 @@ class NameSiloClient:
response = requests.get(url)
response_body = response.json()
if response.status_code == 200:
if response_body["reply"]["code"] !=300:
raise Exception('namesilo接口错误:'+response_body["reply"]["detail"])
res={}
res["code"]=0
res["data"]={}

211
start.py
View File

@@ -1,211 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random
import time
import requests
from dns.qCloud import QcloudApiv3 # QcloudApiv3 DNSPod 的 API 更新了 By github@z0z0r4
from dns.aliyun import AliApi
from dns.huawei import HuaWeiApi
from dns.nameSilo import NameSiloClient
from log import Logger
import traceback
#CM:移动 CU:联通 CT:电信 AB:境外 DEF:默认
#修改需要更改的dnspod域名和子域名
#NameSilo不支持多线解析只能选DEF默认线路
DOMAINS = {
"quanxxxhost.com": {"@": ["CM","CU","CT"]}
}
#解析生效条数
#免费的DNSPod相同线路最多支持2条解析
AFFECT_NUM = 2
#DNS解析服务商 DNSPod-1 阿里云-2 如华为云-3 NameSilo-4
DNS_SERVER = 4
#如果使用华为云解析 需要从API凭证-项目列表中获取
REGION_HW = 'cn-east-3'
#如果使用阿里云解析 REGION出现错误再修改 默认不需要修改 https://help.aliyun.com/document_detail/198326.html
REGION_ALI = 'cn-hongkong'
#解析生效时间默认为600秒 如果不是DNS付费版用户 不要修改!!!
#如果是NameSilo解析最小为3600
TTL = 600
#v4为筛选出IPv4的IP v6为筛选出IPv6的IP
#目前仅支持v4
TYPE = 'v4'
#API 密钥
#腾讯云后台获取 https://console.cloud.tencent.com/cam/capi
#阿里云后台获取 https://help.aliyun.com/document_detail/53045.html?spm=a2c4g.11186623.2.11.2c6a2fbdh13O53 注意需要添加DNS控制权限 AliyunDNSFullAccess
#华为云后台获取 https://support.huaweicloud.com/devg-apisign/api-sign-provide-aksk.html
#NameSilo后台获取 https://www.namesilo.com/account/api-manager NameSilo只用填SECRETKEY即可
SECRETID = 'LTAI5xxxxxxxxxYWRedp9Y'
SECRETKEY = '7288bxxxxxxxxx23a332'
log_cf2dns = Logger('cf2dns.log', level='debug')
def get_optimization_ip():
try:
headers = headers = {'Content-Type': 'application/json'}
data = {}
response = requests.post('https://vps789.com/public/sum/cfIpApi', json=data, headers=headers)
if response.status_code == 200:
return response.json()
else:
log_cf2dns.logger.error("CHANGE OPTIMIZATION IP ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: REQUEST STATUS CODE IS NOT 200")
return None
except Exception as e:
log_cf2dns.logger.error("CHANGE OPTIMIZATION IP ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))
return None
#s_info已存在的ipc_info 最新的优选cfip
def changeDNS(line, s_info, c_info, domain, sub_domain, cloud):
global AFFECT_NUM, TYPE
if TYPE == 'v6':
recordType = "AAAA"
else:
recordType = "A"
lines = {"CM": "移动", "CU": "联通", "CT": "电信", "AB": "境外", "DEF": "默认"}
line = lines[line]
try:
create_num = AFFECT_NUM - len(s_info)
# 如果线路能解析的ip已满就用cfip一个一个去替换原来的ip解析
if create_num == 0:
for info in s_info:
if len(c_info) == 0:
break
cf_ip = c_info.pop(random.randint(0,len(c_info)-1))["ip"]
if cf_ip in str(s_info):
continue
ret = cloud.change_record(domain, info["recordId"], sub_domain, cf_ip, recordType, line, TTL)
if(DNS_SERVER != 1 or ret["code"] == 0):
log_cf2dns.logger.info("CHANGE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip )
else:
log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip + "----MESSAGE: " + ret["message"] )
# 如果线路还可以解析更多的ip就添加cfip解析直到用完
elif create_num > 0:
for i in range(create_num):
if len(c_info) == 0:
break
cf_ip = c_info.pop(random.randint(0,len(c_info)-1))["ip"]
if cf_ip in str(s_info):
continue
ret = cloud.create_record(domain, sub_domain, cf_ip, recordType, line, TTL)
if(DNS_SERVER != 1 or ret["code"] == 0):
log_cf2dns.logger.info("CREATE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----VALUE: " + cf_ip )
else:
log_cf2dns.logger.error("CREATE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip + "----MESSAGE: " + ret["message"] )
# 如果线路能解析的ip已超出配额就用cfip一个一个去替换原来的ip解析
else:
for info in s_info:
if create_num == 0 or len(c_info) == 0:
break
cf_ip = c_info.pop(random.randint(0,len(c_info)-1))["ip"]
if cf_ip in str(s_info):
create_num += 1
continue
ret = cloud.change_record(domain, info["recordId"], sub_domain, cf_ip, recordType, line, TTL)
if(DNS_SERVER != 1 or ret["code"] == 0):
log_cf2dns.logger.info("CHANGE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip )
else:
log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+line+"----RECORDID: " + str(info["recordId"]) + "----VALUE: " + cf_ip + "----MESSAGE: " + ret["message"] )
create_num += 1
except Exception as e:
log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))
def main(cloud):
global AFFECT_NUM, TYPE
if TYPE == 'v6':
recordType = "AAAA"
else:
recordType = "A"
if len(DOMAINS) > 0:
try:
cfips = get_optimization_ip()
if cfips == None or cfips["code"] != 0:
log_cf2dns.logger.error("GET CLOUDFLARE IP ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(cfips["data"]))
return
cf_cmips = cfips["data"]["CM"]
cf_cuips = cfips["data"]["CU"]
cf_ctips = cfips["data"]["CT"]
cf_defips = cfips["data"]["AllAvg"]
for domain, sub_domains in DOMAINS.items():
for sub_domain, lines in sub_domains.items():
if DNS_SERVER == 4 and len(lines)!=1:
log_cf2dns.logger.info("域名解析为NameSilo时线路只能填DEF")
return
#下面5个数组存的是不同线路最新获取的优选IP列表
temp_cf_cmips = cf_cmips.copy()
temp_cf_cuips = cf_cuips.copy()
temp_cf_ctips = cf_ctips.copy()
temp_cf_abips = cf_ctips.copy()
temp_cf_defips = cf_defips.copy()
if DNS_SERVER == 1:
ret = cloud.get_record(domain, 20, sub_domain, "CNAME")
if ret["code"] == 0:
for record in ret["data"]["records"]:
if record["line"] == "移动" or record["line"] == "联通" or record["line"] == "电信":
retMsg = cloud.del_record(domain, record["id"])
if(retMsg["code"] == 0):
log_cf2dns.logger.info("DELETE DNS SUCCESS: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+record["line"] )
else:
log_cf2dns.logger.error("DELETE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----DOMAIN: " + domain + "----SUBDOMAIN: " + sub_domain + "----RECORDLINE: "+record["line"] + "----MESSAGE: " + retMsg["message"] )
ret = cloud.get_record(domain, 100, sub_domain, recordType)
# ret["code"] == 0 就是DNS_SERVER == 1
if DNS_SERVER != 1 or ret["code"] == 0 :
if DNS_SERVER == 1 and "Free" in ret["data"]["domain"]["grade"] and AFFECT_NUM > 2:
AFFECT_NUM = 2
#下面5个数组存的是已存在的DNS解析列表
cm_info = []
cu_info = []
ct_info = []
ab_info = []
def_info = []
for record in ret["data"]["records"]:
info = {}
info["recordId"] = record["id"]
info["value"] = record["value"]
if record["line"] == "移动":
cm_info.append(info)
elif record["line"] == "联通":
cu_info.append(info)
elif record["line"] == "电信":
ct_info.append(info)
elif record["line"] == "境外":
ab_info.append(info)
elif record["line"] == "默认":
def_info.append(info)
for line in lines:
if line == "CM":
changeDNS("CM", cm_info, temp_cf_cmips, domain, sub_domain, cloud)
elif line == "CU":
changeDNS("CU", cu_info, temp_cf_cuips, domain, sub_domain, cloud)
elif line == "CT":
changeDNS("CT", ct_info, temp_cf_ctips, domain, sub_domain, cloud)
elif line == "AB":
changeDNS("AB", ab_info, temp_cf_abips, domain, sub_domain, cloud)
elif line == "DEF":
changeDNS("DEF", def_info, temp_cf_defips, domain, sub_domain, cloud)
except Exception as e:
traceback.print_exc()
log_cf2dns.logger.error("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))
if __name__ == '__main__':
if DNS_SERVER == 1:
cloud = QcloudApiv3(SECRETID, SECRETKEY)
elif DNS_SERVER == 2:
cloud = AliApi(SECRETID, SECRETKEY, REGION_ALI)
elif DNS_SERVER == 3:
cloud = HuaWeiApi(SECRETID, SECRETKEY, REGION_HW)
elif DNS_SERVER == 4:
cloud = NameSiloClient(SECRETKEY)
main(cloud)