mirror of
https://github.com/NewFuture/DDNS.git
synced 2022-04-19 20:24:44 +00:00
获取本机IP和更新DNS
This commit is contained in:
@@ -137,3 +137,4 @@ $RECYCLE.BIN/
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
config.json
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
}
|
||||
@@ -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]
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user