-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
314 additions
and
259 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,186 +3,186 @@ | |
# Mail: [email protected] | ||
import random | ||
import time | ||
import os | ||
import requests | ||
from dns.qCloud import QcloudApiv3 # QcloudApiv3 DNSPod 的 API 更新了... | ||
from dns.qCloud import QcloudApiv3 # QcloudApiv3 DNSPod 的 API 更新了 By github@z0z0r4 | ||
from dns.aliyun import AliApi | ||
from dns.huawei import HuaWeiApi | ||
import logging | ||
from log import Logger | ||
import traceback | ||
import json | ||
|
||
log_cf2dns = logging.basicConfig(filename='cf2dns.log', | ||
format='%(asctime)s - %(levelname)s - %(message)s', | ||
level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S") | ||
|
||
|
||
def log_error(msg: str): | ||
logging.error(msg) | ||
print( | ||
f'[Error] [{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}] {msg}') | ||
|
||
|
||
def log_info(msg: str): | ||
logging.info(msg) | ||
print( | ||
f'[INFO] [{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}] {msg}') | ||
|
||
|
||
default_conf = { | ||
"cf_api_key": "o1zrmHAF", | ||
"domains": {"hostxxnit.com": | ||
{"@": ["CM", "CU", "CT"], | ||
"shop": ["CM", "CU", "CT"], | ||
"stock": ["CM", "CU", "CT"]}, | ||
"xxxx.me": {"@": ["CM", "CU", "CT"], | ||
"vv": ["CM", "CU", "CT"]} | ||
}, | ||
"affect_num": 2, | ||
"dns_server": 1, | ||
"region_hw": "", | ||
"region_ali": "", | ||
"ttl": 600, | ||
"record_type": "A", | ||
"secret_id": "", | ||
"secret_key": "" | ||
} | ||
|
||
# 添加配置文件 | ||
if not os.path.exists("config.json"): | ||
with open("config.json", "w") as f: | ||
json.dump(default_conf, f) | ||
log_error("已初始化配置文件,请修改 config.json") | ||
exit() | ||
else: | ||
with open("config.json") as f: | ||
conf = json.load(f) | ||
log_info("成功加载 config.json") | ||
|
||
# 可以从 https://shop.hostmonit.com 获取 | ||
KEY = conf["cf_api_key"] | ||
#可以从https://shop.hostmonit.com获取 | ||
KEY = "o1zrmHAF" | ||
|
||
# CM:移动 CU:联通 CT:电信 AB:境外 DEF:默认 | ||
# 修改需要更改的 DNSPod域名和子域名 | ||
DOMAINS = conf["domains"] | ||
#CM:移动 CU:联通 CT:电信 AB:境外 DEF:默认 | ||
#修改需要更改的dnspod域名和子域名 | ||
DOMAINS = { | ||
"hostxxnit.com": {"@": ["CM","CU","CT"], "shop": ["CM", "CU", "CT"], "stock": ["CM","CU","CT"]}, | ||
"484848.xyz": {"@": ["CM","CU","CT"], "shop": ["CM","CU","CT"]} | ||
} | ||
|
||
# 解析生效条数 免费的DNSPod相同线路最多支持2条解析 | ||
AFFECT_NUM = conf["affect_num"] | ||
#解析生效条数 免费的DNSPod相同线路最多支持2条解析 | ||
AFFECT_NUM = 2 | ||
|
||
# DNS服务商 如果使用DNSPod改为1 如果使用阿里云解析改成2 如果使用华为云解析改成3 | ||
DNS_SERVER = conf["dns_server"] | ||
#DNS服务商 如果使用DNSPod改为1 如果使用阿里云解析改成2 如果使用华为云解析改成3 | ||
DNS_SERVER = 1 | ||
|
||
# 如果使用华为云解析 需要从API凭证-项目列表中获取 | ||
REGION_HW = conf["region_hw"] | ||
#如果使用华为云解析 需要从API凭证-项目列表中获取 | ||
REGION_HW = 'cn-east-3' | ||
|
||
# 如果使用阿里云解析 REGION出现错误再修改 默认不需要修改 https://help.aliyun.com/document_detail/198326.html | ||
REGION_ALI = conf["region_ali"] | ||
#如果使用阿里云解析 REGION出现错误再修改 默认不需要修改 https://help.aliyun.com/document_detail/198326.html | ||
REGION_ALI = 'cn-hongkong' | ||
|
||
# 解析生效时间,默认为600秒 如果不是DNS付费版用户 不要修改!!! | ||
TTL = conf["ttl"] | ||
#解析生效时间,默认为600秒 如果不是DNS付费版用户 不要修改!!! | ||
TTL = 600 | ||
|
||
# A为筛选出IPv4的IP AAAA为筛选出IPv6的IP | ||
RECORD_TYPE = conf["record_type"] | ||
#v4为筛选出IPv4的IP v6为筛选出IPv6的IP | ||
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 | ||
SECRETID = conf["secret_id"] | ||
SECRETKEY = conf["secret_key"] | ||
#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 | ||
SECRETID = 'WTTCWxxxxxxxxxxxxxxxxxxxxx84O0V' | ||
SECRETKEY = 'GXkG6D4X1Nxxxxxxxxxxxxxxxxxxxxx4lRg6lT' | ||
|
||
log_cf2dns = Logger('cf2dns.log', level='debug') | ||
|
||
def get_optimization_ip(): | ||
try: | ||
response = requests.post('https://api.hostmonit.com/get_optimization_ip', json={ | ||
"key": KEY, "type": "v4" if RECORD_TYPE == "A" else "v6"}, headers={'Content-Type': 'application/json'}) | ||
headers = headers = {'Content-Type': 'application/json'} | ||
data = {"key": KEY, "type": TYPE} | ||
response = requests.post('https://api.hostmonit.com/get_optimization_ip', json=data, headers=headers) | ||
if response.status_code == 200: | ||
resp_json = response.json() | ||
if resp_json["code"] == 200: | ||
return resp_json | ||
return response.json() | ||
else: | ||
log_error(f'获取 Cloudflare IP 失败 {response.status_code}') | ||
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: | ||
traceback.print_exc() | ||
log_error(f"获取 Cloudflare IP 失败 {str(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 | ||
|
||
def changeDNS(line, c_info, domain, sub_domain, cloud): | ||
global AFFECT_NUM, RECORD_TYPE | ||
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 | ||
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"] | ||
cloud.create_record( | ||
domain, sub_domain, cf_ip, RECORD_TYPE, line, TTL) | ||
log_info( | ||
f'CREATE DNS SUCCESS - DOMAIN: {domain} SUBDOMAIN: {sub_domain} RECORDLINE: {line} VALUE: {cf_ip}') | ||
create_num = AFFECT_NUM - len(s_info) | ||
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"] ) | ||
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"] ) | ||
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: | ||
traceback.print_exc() | ||
log_error(f'CHANGE DNS ERROR - MESSAGE: {str(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, RECORD_TYPE | ||
global AFFECT_NUM, TYPE | ||
if TYPE == 'v6': | ||
recordType = "AAAA" | ||
else: | ||
recordType = "A" | ||
if len(DOMAINS) > 0: | ||
try: | ||
cfips = get_optimization_ip() | ||
if cfips == None: | ||
log_error(f'GET CLOUDFLARE IP ERROR') | ||
if cfips == None or cfips["code"] != 200: | ||
log_cf2dns.logger.error("GET CLOUDFLARE IP ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(cfips["info"])) | ||
return | ||
cf_cmips = cfips["info"]["CM"] | ||
cf_cuips = cfips["info"]["CU"] | ||
cf_ctips = cfips["info"]["CT"] | ||
for domain, sub_domains in DOMAINS.items(): | ||
for sub_domain, lines in sub_domains.items(): | ||
# 删除对应 recordType 的解析 | ||
ret = cloud.get_record(domain, 20, sub_domain, RECORD_TYPE) | ||
if ret["code"] == 0: | ||
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_ctips.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) | ||
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 | ||
cm_info = [] | ||
cu_info = [] | ||
ct_info = [] | ||
ab_info = [] | ||
def_info = [] | ||
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_info( | ||
f'DELETE DNS SUCCESS - DOMAIN: {domain} SUBDOMAIN: {sub_domain} RECORDLINE: {record["line"]}') | ||
else: | ||
traceback.print_exc() | ||
log_error( | ||
f'DELETE DNS ERROR - DOMAIN: {domain} SUBDOMAIN: {sub_domain} RECORDLINE: {record["line"]} MESSAGE: {retMsg["message"]}') | ||
|
||
# 重新创建对应 recordType 的 record | ||
ret = cloud.get_record( | ||
domain, 100, sub_domain, RECORD_TYPE) | ||
|
||
if DNS_SERVER == 1 and "DP_Free" in ret["data"]["domain"]["grade"] and AFFECT_NUM > 2: | ||
AFFECT_NUM = 2 | ||
|
||
for line in lines: | ||
if line == "CM": | ||
changeDNS("CM", cf_cmips, | ||
domain, sub_domain, cloud) | ||
elif line == "CU": | ||
changeDNS("CU", cf_cuips, | ||
domain, sub_domain, cloud) | ||
elif line == "CT": | ||
changeDNS("CT", cf_ctips, | ||
domain, sub_domain, cloud) | ||
elif line == "AB": | ||
changeDNS("AB", cf_ctips, | ||
domain, sub_domain, cloud) | ||
elif line == "DEF": | ||
changeDNS("DEF", cf_ctips, | ||
domain, sub_domain, cloud) | ||
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_error(f'CHANGE DNS ERROR - MESSAGE: {str(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: | ||
|
@@ -191,4 +191,4 @@ def main(cloud): | |
cloud = AliApi(SECRETID, SECRETKEY, REGION_ALI) | ||
elif DNS_SERVER == 3: | ||
cloud = HuaWeiApi(SECRETID, SECRETKEY, REGION_HW) | ||
main(cloud) | ||
main(cloud) |
Oops, something went wrong.