diff --git a/.gitignore b/.gitignore index e345e14..2368c8b 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,4 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk +config.json diff --git a/dnspod.py b/dnspod.py new file mode 100644 index 0000000..2b40feb --- /dev/null +++ b/dnspod.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +#-*- coding:utf-8 -*- +# DNSPOD API 接口 +import httplib +import urllib +import json + +TOKEN = "yourid,yourkey" # token +PROXY = None # 代理设置 + +_domain_id_list = {} + + +def get_domain_info(domain): # 切割域名 + domain_split = domain.split('.') + domain_split_len = len(domain_split) + maindomain = domain_split[domain_split_len - 2] + '.' + domain_split[domain_split_len - 1] + return maindomain, domain + + +def request(action, params, method='POST'): # 发送请求 + headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"} + API_SITE = "dnsapi.cn" + if PROXY: + conn = httplib.HTTPSConnection(PROXY) + conn.set_tunnel(API_SITE, 443) + else: + conn = httplib.HTTPSConnection(API_SITE) + conn.request(method, '/' + action, urllib.urlencode(params), headers) + response = conn.getresponse() + data = response.read() + conn.close() + if response.status == 200: + return data + else: + return None + + +def get_domain_id(): # 获取域名ID + if len(_domain_id_list) > 0: + return _domain_id_list + else: + params = {'login_token': TOKEN, 'format': 'json'} + data = request('Domain.List', params) + data = json.loads(data) + domainlist = data.get('domains') + for d in domainlist: + _domain_id_list[d.get('name')] = d.get('id') + return _domain_id_list + + +def get_domain_record_id(domain_id, domain_type="A"): # 获取记录ID + params = {'login_token': TOKEN, 'domain_id': domain_id, 'format': 'json'} + data = request('Record.List', params) + data = json.loads(data) + if data.get('code') == '10': + return None + + # print(domain_id, data) + domain = data.get('domain') + if not domain: + return None + domainname = domain.get('name') + record_list = data.get('records') + record = {} + # print record_list[0] + for r in record_list: + # print(r.get('id'), r.get('name'), r.get('type'),r.get('value')) + if r.get('type') == domain_type: + key = r.get('name') != '@' and r.get('name') + '.' + domainname or domainname + record[key] = {'id': int(r.get('id')), 'value': r.get('value'), 'sub': r.get('name')} + return record + + +def update_domain_info(domain, domain_type="A"): # 更新域名信息 + m, sub_m = get_domain_info(domain) + domain_id = get_domain_id().get(m) + record_list = get_domain_record_id(domain_id, domain_type) + # print(record_list) + if record_list == None: + return None + + record_info = record_list.get(sub_m) + if record_info == None: + return None + record_info['did'] = domain_id + return record_info + + +def change_record(domain, value, record_type="A"): # 更改记录 + info = update_domain_info(domain, record_type) + if info == None: + return None + elif info['value'] == value: + return domain, value + params = {'login_token': TOKEN, 'value': value, 'sub_domain': info['sub'], + 'domain_id': info['did'], 'record_id': info['id'], 'record_type': record_type, + 'format': 'json', 'ttl': 600, 'record_line': '默认', } + return request('Record.Modify', params) diff --git a/example.config.json b/example.config.json new file mode 100644 index 0000000..8e6aab5 --- /dev/null +++ b/example.config.json @@ -0,0 +1,14 @@ +{ + "id": "your token id", + "token": "your dnspod token", + "ipv4": [ + "ipv4.your.domain", + "ipv4.yours.domain" + ], + "ipv6": [ + "ipv6.your.domain" + ], + "index4": 0, + "index6": 0, + "proxy": null +} \ No newline at end of file diff --git a/ip.py b/ip.py new file mode 100644 index 0000000..6472f7e --- /dev/null +++ b/ip.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +#-*- coding:utf-8 -*- + +import socket +DEBUG = False + + +def local_v6(i=0): # 本地ipv6地址 + info = socket.getaddrinfo(socket.gethostname(), 0, socket.AF_INET6) + if DEBUG: print(info) + return info[i][4][0] + + +def local_v4(i=0): # 本地ipv4地址 + info = socket.getaddrinfo(socket.gethostname(), 0, socket.AF_INET) + if DEBUG: print(info) + return info[i][-1][0] diff --git a/run.py b/run.py new file mode 100644 index 0000000..9cc94ea --- /dev/null +++ b/run.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +#-*- coding:utf-8 -*- + +import dnspod +import ip +import json + + +def get_config(key=None, file="config.json"): + if not hasattr(get_config, "config"): + try: + with open(file) as configfile: + get_config.config = json.load(configfile) + except: + exit('fail to load config from file: %s' % file) + if key: + return get_config.config.get(key) + else: + return get_config.config + + +def update(): + ipv4 = ip.local_v4(get_config('index4')) + print 'update ipv4 to:', ipv4 + if ipv4 != None: + for domain in get_config('ipv4'): + print dnspod.change_record(domain, ipv4, 'A') + + ipv6 = ip.local_v6(get_config('index6')) + print 'update ipv6 to:', ipv6 + if ipv6 != None: + for domain in get_config('ipv6'): + print dnspod.change_record(domain, ipv6, 'AAAA') + +if __name__ == '__main__': + dnspod.TOKEN = "%s,%s" % (get_config('id'), get_config('token')) + dnspod.PROXY = get_config('proxy') + update()