-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathddns.py
130 lines (118 loc) · 4.26 KB
/
ddns.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
import yaml
import requests
import time
import logging
import sys
logging.basicConfig(level=logging.INFO, stream=sys.stdout,
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
datefmt='%y/%m/%d %H:%M:%S')
# 封装的api请求
# def dnsPOST(url, data):
# params = dict({
# "login_token": login_token,
# "format": "json",
# "lang": "cn",
# }, **data)
# headers = {
# "user-agent": "MJJ DDNS Python/1.0.0 (apiapi@foxmail.com)"
# }
# resp = requests.post(url, headers=headers, data=params)
# if resp.status_code == 200:
# return resp.json()
class DDNS:
def __init__(self):
"""
config里面包含的数据
ID和Token dnspod认证的必须, 格式 iD,Token用逗号隔开
domain 域名
sub_domain 域名前缀
myipAPI 获取公网IP接口
"""
self.config = self.loadConfig()
self.login_token = str(self.config.get("ID")) + \
"," + self.config.get("Token")
self.format = "json"
self.lang = "cn"
self.headers = {
"User-Agent": "ddns V1.0.1 (apiapi@foxmail.com)"}
self.myipApi = self.config.get("myipAPI")
self.data = {
"login_token": self.login_token,
"format": self.format,
"lang": self.lang,
}
self.record_id, self.record_value = self.getRecordInfo()
# 读取本地配置文件
def loadConfig(self):
with open("config.yaml", "r", encoding="utf8") as file:
dnspod = yaml.safe_load(file).get("DNSPOD")
logging.info("读取配置文件成功")
return dnspod
# 获取公网IP
def getMyIP(self):
try:
ip = requests.get(self.myipApi).text
logging.info("你的公网IP是:%s", ip)
except:
logging.info("请求ip失败")
return None
return ip
# 获取更新记录所需要的
def getRecordInfo(self):
recordList = self.getRecordList()
for record in recordList["records"]:
if record.get("name") == self.config.get("sub_domain"):
record_id, record_value = (
record.get("id"), record.get("value"))
logging.info("获取record信息成功,id:%s value:%s",
record_id, record_value)
return (record_id, record_value)
# 更新记录
def updateRecord(self, myip):
url = "https://dnsapi.cn/Record.Modify"
data = self.data.copy()
data.update({
"domain": self.config.get("cionfig"),
"record_id": self.record_id,
"sub_domain": self.config.get("sub_domain"),
"record_type": "A",
"record_line": "默认",
"value": myip,
})
try:
resp = requests.post(url, headers=self.headers, data=data).json()
if resp["status"]["code"] == "1":
logging.info("ddns的ip地址修改为:%s", myip)
except:
logging.warning("由于网络问题, 更新ddns的ip地址失败")
# 获取域名的记录列表
def getRecordList(self):
url = "https://dnsapi.cn/Record.List"
data = self.data.copy()
data.update({
"domain": self.config.get("domain"),
# "sub_domain": self.config.get("sub_domain"),
})
try:
dataJson = requests.post(
url, headers=self.headers, data=data).json()
logging.info("dns域名列表记录获取成功")
except:
logging.info("dns接口获取失败")
return None
return dataJson
# 循环检测IP是否变更, 如果变更就更新
def testingIP(self):
myip = self.getMyIP()
if myip == None:
return
if myip not in self.record_value:
self.updateRecord(myip)
self.record_value = myip
else:
logging.info("ip:%s没有变动, 无需更改", myip)
if __name__ == '__main__':
ddns = DDNS()
while True:
ddns.testingIP()
time.sleep(300)