forked from ddgth/cf2dns
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cf2dns_actions.py
183 lines (167 loc) · 9 KB
/
cf2dns_actions.py
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Mail: tongdongdong@outlook.com
import base64
import hashlib
import hmac
import random
import time
import operator
import json
import urllib.parse
import urllib3
import os
#可以从https://shop.hostmonit.com获取
KEY = os.environ["KEY"] #"o1zrmHAF"
#CM:移动 CU:联通 CT:电信
#修改需要更改的dnspod域名核子域名
DOMAINS = json.loads(os.environ["DOMAINS"]) #{"hostmonit.com": {"@": ["CM","CU","CT"], "shop": ["CM", "CU", "CT"], "stock": ["CM","CU","CT"]},"4096.me": {"@": ["CM","CU","CT"], "vv": ["CM","CU","CT"]}}
#腾讯云后台获取 https://console.cloud.tencent.com/cam/capi
SECRETID = os.environ["SECRETID"] #'AKIDV**********Hfo8CzfjgN'
SECRETKEY = os.environ["SECRETKEY"] #'ZrVs*************gqjOp1zVl'
#默认为普通版本 不用修改
AFFECT_NUM = 1
urllib3.disable_warnings()
class QcloudApi():
def __init__(self):
self.SecretId = SECRETID
self.secretKey = SECRETKEY
def get(self, module, action, **params):
config = {
'Action': action,
'Nonce': random.randint(10000, 99999),
'SecretId': self.SecretId,
'SignatureMethod': 'HmacSHA256',
'Timestamp': int(time.time()),
}
url_base = '{0}.api.qcloud.com/v2/index.php?'.format(module)
params_all = dict(config, **params)
params_sorted = sorted(params_all.items(), key=operator.itemgetter(0))
srcStr = 'GET{0}'.format(url_base) + ''.join("%s=%s&" % (k, v) for k, v in dict(params_sorted).items())[:-1]
signStr = base64.b64encode(hmac.new(bytes(self.secretKey, encoding='utf-8'), bytes(srcStr, encoding='utf-8'), digestmod=hashlib.sha256).digest()).decode('utf-8')
config['Signature'] = signStr
params_last = dict(config, **params)
params_url = urllib.parse.urlencode(params_last)
url = 'https://{0}&'.format(url_base) + params_url
http = urllib3.PoolManager()
r = http.request('GET', url=url, retries=False)
ret = json.loads(r.data.decode('utf-8'))
if ret.get('code', {}) == 0:
return ret
else:
raise Exception(ret)
def get_optimization_ip():
try:
http = urllib3.PoolManager()
headers = headers = {'Content-Type': 'application/json'}
data = {"key": KEY}
data = json.dumps(data).encode()
response = http.request('POST','https://api.hostmonit.com/get_optimization_ip',body=data, headers=headers)
return json.loads(response.data.decode('utf-8'))
except Exception as e:
print(e)
return None
def changeDNS(line, s_info, c_info, domain, sub_domain, qcloud):
global AFFECT_NUM
if line == "CM":
line = "移动"
elif line == "CU":
line = "联通"
elif line == "CT":
line = "电信"
else:
print("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: LINE ERROR")
return
try:
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(0)["ip"]
if cf_ip in str(s_info):
continue
ret = qcloud.get(module='cns', action='RecordModify', domain=domain, recordId=info["recordId"], subDomain=sub_domain, value=cf_ip, recordType='A', recordLine=line)
if(ret["code"] == 0):
print("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:
print("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(0)["ip"]
if cf_ip in str(s_info):
continue
ret = qcloud.get(module='cns', action='RecordCreate', domain=domain, subDomain=sub_domain, value=cf_ip, recordType='A', recordLine=line)
if(ret["code"] == 0):
print("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:
print("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"] )
else:
for info in s_info:
if create_num == 0 or len(c_info) == 0:
break
cf_ip = c_info.pop(0)["ip"]
if cf_ip in str(s_info):
create_num += 1
continue
ret = qcloud.get(module='cns', action='RecordModify', domain=domain, recordId=info["recordId"], subDomain=sub_domain, value=cf_ip, recordType='A', recordLine=line)
if(ret["code"] == 0):
print("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:
print("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:
print("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))
def main(qcloud):
global AFFECT_NUM
if len(DOMAINS) > 0:
try:
cfips = get_optimization_ip()
if cfips == None or cfips["code"] != 200:
print("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():
temp_cf_cmips = cf_cmips.copy()
temp_cf_cuips = cf_cuips.copy()
temp_cf_ctips = cf_ctips.copy()
ret = qcloud.get(module='cns', action='RecordList', domain=domain, length=100, subDomain=sub_domain, recordType="A")
if ret["code"] == 0:
if "Free" in ret["data"]["domain"]["grade"] and AFFECT_NUM > 2:
AFFECT_NUM = 2
cm_info = []
cu_info = []
ct_info = []
for record in ret["data"]["records"]:
if record["line"] == "移动":
info = {}
info["recordId"] = record["id"]
info["value"] = record["value"]
cm_info.append(info)
if record["line"] == "联通":
info = {}
info["recordId"] = record["id"]
info["value"] = record["value"]
cu_info.append(info)
if record["line"] == "电信":
info = {}
info["recordId"] = record["id"]
info["value"] = record["value"]
ct_info.append(info)
for line in lines:
if line == "CM":
changeDNS("CM", cm_info, temp_cf_cmips, domain, sub_domain, qcloud)
elif line == "CU":
changeDNS("CU", cu_info, temp_cf_cuips, domain, sub_domain, qcloud)
elif line == "CT":
changeDNS("CT", ct_info, temp_cf_ctips, domain, sub_domain, qcloud)
except Exception as e:
print("CHANGE DNS ERROR: ----Time: " + str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "----MESSAGE: " + str(e))
if __name__ == '__main__':
qcloud = QcloudApi()
main(qcloud)