You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

486 lines
17 KiB

5 years ago
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import hashlib
import time
import json
import urllib
from urllib import request
class CloudXNS_API():
api_key = None
secret_key = None
debug_log = False
def __init__(self, api_key=None, secret_key=None, debug_log=False):
self.api_key = api_key
self.secret_key = secret_key
self.debug_log = debug_log
def print_debug(self, msg):
if self.debug_log != False:
print(msg)
def json_strtodict(self, json_str):
jsonData = {}
try:
if len(json_str) != 0:
jsonData = json.loads(json_str)
except Exception as e:
self.print_debug(e)
finally:
return jsonData
# 计算api头数据
def get_api_headers(self, URL, BODY):
API_REQUEST_DATE = time.strftime('%a %b %d %H:%M:%S %Y',
time.localtime())
API_HMAC = hashlib.md5((
self.api_key + URL + BODY + API_REQUEST_DATE + self.secret_key).encode()).hexdigest()
headers = {
'Content-Type': 'application/json',
'user-agent': 'CloudXNS-Python/v3',
'API-KEY': self.api_key,
'API-REQUEST-DATE': API_REQUEST_DATE,
'API-HMAC': API_HMAC,
'API-FORMAT': 'json',
}
return headers
def urlopen(self, URL, BODY='', METHOD='GET'):
strdata = ''
try:
req = urllib.request.Request(URL)
req.method = METHOD
if len(BODY) != 0:
req.data = BODY.encode('UTF-8', 'ignore')
resp = urllib.request.urlopen(req)
strdata = resp.read().decode('UTF-8', 'ignore')
except urllib.error.HTTPError as e:
self.print_debug(e)
pass
except urllib.error.URLError as e:
self.print_debug(e)
pass
except Exception as e:
self.print_debug(e)
pass
finally:
return strdata
def urlopen_api(self, URL, BODY, METHOD='GET'):
strdata = ''
try:
req = urllib.request.Request(URL, headers=self.get_api_headers(URL,
BODY))
req.method = METHOD
if len(BODY) != 0:
req.data = BODY.encode('UTF-8', 'ignore')
resp = urllib.request.urlopen(req)
strdata = resp.read().decode('UTF-8', 'ignore')
except urllib.error.HTTPError as e:
self.print_debug(e)
pass
except urllib.error.URLError as e:
self.print_debug(e)
pass
except Exception as e:
self.print_debug(e)
pass
finally:
return strdata
"""
功能 域名列表
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/domain
:return: String
"""
def domain_list(self):
url = 'https://www.cloudxns.net/api2/domain'
body = ''
strdata = self.urlopen_api(url, body)
# json_strtodict
return strdata
"""
功能 主机记录
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/host/:domain_id?offset=:offset&row_num=:row_num
请求参数
参数名称 类型 必填 描述
domain_id Integer 域名ID
offset Integer 记录开始的偏移,第一条记录为 0,依次类推
row_num Integer 要获取的记录的数量,比如获取 30 ,则为 30,最大可取 2000
:return: String
"""
def domain_host_list(self, domain_id, offset=0, row_num=30, hostname=None):
if row_num > 2000:
row_num = 2000
url = 'https://www.cloudxns.net/api2/host/' + str(
domain_id) + '?offset=' + str(offset) + '&row_num=' + str(
row_num)
if hostname != None:
url += '&host_name=' + hostname
body = ''
strdata = self.urlopen_api(url, body)
return strdata
"""
功能 暂停启用解析记录
参数名称 类型 必填 描述
domain_id Integer 域名ID
host_id Integer 主机记录ID
pause_record bool 暂停还是启用
"""
def domain_host_record_pause(self, domain_id, host_id, pause_record=False):
url = 'https://www.cloudxns.net/api2/record/pause'
object_body = {}
object_body['id'] = str(host_id)
object_body['domain_id'] = str(domain_id)
# 0暂停1启用
if pause_record == False:
object_body['status'] = str(0)
else:
object_body['status'] = str(1)
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'POST')
return strdata
"""
功能 删除主机记录
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/host/:id
请求参数
参数名称 类型 必填 描述
host_id Integer 主机记录id
:return: String
"""
def domain_host_delete(self, domain_host_id):
url = 'https://www.cloudxns.net/api2/host/' + str(domain_host_id)
body = ''
strdata = self.urlopen_api(url, body, 'DELETE')
return strdata
"""
功能 获取解析记录列表
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/record/:domain_id?host_id=0&offset=:offset&row_num=:row_num
URL 参数说明
domain_id:域名 id
host_id:主机记录 id( 0 查全部)
offset:记录开始的偏移第一条记录为 0依次类推,默认取 0
row_num:要获取的记录的数量 比如获取 30 则为 30,最大可取 2000
,默认取 30 .
:return:
code int 请求状态详见附件 code 对照表
message String 操作信息提示操作成功或错误信息
total int 总记录条数
offset int 记录开始的偏移
row_num int 要获取的记录的数量
data array 记录列表
record_id: 解析记录 id
host_id:主机记录 id
host主机记录名
line_id线路 ID
line_zh中文名称
line_en英文名称
mx优先级
Value记录值
Type记录类型
Status记录状态(ok 已生效 userstop 暂停)
create_time创建时间
update_time更新时间
"""
def domain_host_record_list(self, domain_id, host_id=0, offset=0,
row_num=30, host_name=None):
if row_num > 2000:
row_num = 2000
#:domain_id?host_id=0&offset=:offset&row_num=:row_numURL
if host_name == None:
url = 'https://www.cloudxns.net/api2/record/' + str(
domain_id) + '?host_id=' + str(host_id) \
+ '&offset=' + str(offset) + '&row_num=' + str(row_num)
else:
url = 'https://www.cloudxns.net/api2/record/' + str(
domain_id) + '?host_name=' + str(host_name) \
+ '&offset=' + str(offset) + '&row_num=' + str(row_num)
body = ''
strdata = self.urlopen_api(url, body)
return strdata
"""
功能 添加解析记录
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/record
请求参数
参数名称 类型 必填 描述
domain_id Integer 域名 id
host_name String 主机记录名称 www, 默认@
value String 记录值, 如IP:8.8.8.8,CNAME:cname.cloudxns.net., MX: mail.cloudxns.net.
type String 记录类型,通过 API 获得记录类型,大写英文,比如:A
mx Integer 优先级,范围 1-100当记录类型是 MX/AX/CNAMEX 时有效并且必选
ttl Integer TTL,范围 60-3600,不同等级域名最小值不同
line_id Integer 线路id,(通过 API 获得记录线路 id)
:return: String
"""
def domain_host_record_add(self, domain_id, host, host_value, record_type,
line_id=1, mx=10, ttl=600):
url = 'https://www.cloudxns.net/api2/record'
object_body = {}
object_body['domain_id'] = domain_id
if host != '@':
object_body['host'] = host
object_body['value'] = host_value
object_body['type'] = record_type
object_body['line_id'] = line_id
if record_type == 'MX' or record_type == 'CNAMEX' or record_type == 'AX':
object_body['mx'] = mx
object_body['ttl'] = ttl
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'POST')
return strdata
"""
功能 添加备记录
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/record/spare
请求参数
参数名称 类型 必填 描述
domain_id Integer 域名 id
host_id Integer 主机记录名称 www, 默认@
record_id Integer 解析记录id
value String 记录值, 如IP:8.8.8.8,CNAME:cname.cloudxns.net., MX: mail.cloudxns.net.
:return: String
"""
def domain_host_record_spare(self, domain_id, host_id, record_id, value):
url = 'https://www.cloudxns.net/api2/record'
object_body = {}
object_body['domain_id'] = domain_id
object_body['host_id'] = host_id
object_body['record_id'] = record_id
object_body['value'] = value
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'POST')
return strdata
"""
功能 更新解析记录
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/record/:id
请求参数
参数名称 类型 必填 描述
record_id Integer 解析记录id
domain_id Integer 域名id
host_name String 主机记录名称 www, 默认@
value String 记录值, 如IP:8.8.8.8,CNAME:cname.cloudxns.net., MX: mail.cloudxns.net.
record_type String 记录类型,通过 API 获得记录类型,大写英文,比如:A
mx Integer 优先级,范围 1-100当记录类型是 MX/AX/CNAMEX 时有效并且必选
ttl Integer TTL,范围 60-3600,不同等级域名最小值不同
line_id Integer 线路 id,(通过 API 获得记录线路 id)
spare_data String 备IP
:return: String
"""
def domain_host_record_update(self, domain_id, record_id, host, host_value,
record_type, line_id=1, mx=10, ttl=600,
bak_ip=None):
url = 'https://www.cloudxns.net/api2/record/' + str(record_id)
object_body = {}
object_body['domain_id'] = domain_id
if host != '@':
object_body['host'] = host
object_body['value'] = host_value
object_body['type'] = record_type
object_body['line_id'] = line_id
if record_type == 'MX' or record_type == 'CNAMEX' or record_type == 'AX':
object_body['mx'] = mx
object_body['ttl'] = ttl
if bak_ip != None:
object_body['bak_ip'] = bak_ip
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'PUT')
return strdata
"""
功能 删除解析记录
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/record/:id/:domain_id
请求参数
参数名称 类型 必填 描述
record_id Integer 解析记录id
domain_id Integer 域名 id
:return: String
"""
def domain_host_record_delete(self, domain_id, host_id):
url = 'https://www.cloudxns.net/api2/record/' + str(
host_id) + '/' + str(domain_id)
body = ''
strdata = self.urlopen_api(url, body, 'DELETE')
return strdata
"""功能是否启用X优化"""
def domain_host_record_x_ai(self, domain_id, host_id, enable=False):
url = 'https://www.cloudxns.net/api2/record/ai'
object_body = {}
object_body['id'] = host_id
object_body['domain_id'] = domain_id
if enable == False:
object_body['status'] = 0
else:
object_body['status'] = 1
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'POST')
return strdata
"""
功能设置DDNS解析
修改 domain 下线路为 line_id默认为 1全网默认
记录类型为 A 的记录值为新的 IP 为空时 API 自动获取客户端 IP
如果 domain 存在但不存在线路为line_id的记录类型为A的解析记录则添加新的解析记录
参数名称 类型 描述
domain string 含主机记录的域名如主机记录为@时 domain cloudxns.net www domain www.cloudxns.net
ip string 记录 IP 8.8.8.8或者多个 IP 值中间用|分割 8.8.8.8|1.1.1.1 ;为空时 IP 值由 API 自动获取客户端 IP
line_id int 线路 id(通过 API 获取)默认值 1全网默认
"""
def domain_host_DDNS(self, domain, ip='', line_id=1):
url = 'https://www.cloudxns.net/api2/ddns'
object_body = {}
object_body['domain'] = domain
if len(ip) != 0:
object_body['ip'] = ip
object_body['line_id'] = line_id
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'POST')
return strdata
"""
功能 添加域名
HTTP 请求方式 POST
URL https://www.cloudxns.net/api2/domain
:return: String
"""
def domain_add(self, domain):
url = 'https://www.cloudxns.net/api2/domain'
object_body = {}
object_body['domain'] = domain
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'POST')
return strdata
"""
功能 删除域名
HTTP 请求方式 DELETE
URL https://www.cloudxns.net/api2/domain
请求参数
参数名称 类型 必填 描述
domain_id Integer 域名ID
:return: String
"""
def domain_delete(self, domain_id):
url = 'https://www.cloudxns.net/api2/domain/' + str(domain_id)
body = ''
strdata = self.urlopen_api(url, body, 'DELETE')
return strdata
# 获取 NS 服务器列表信息
def get_domain_ns(self):
url = 'https://www.cloudxns.net/api2/ns_server'
body = ''
strdata = self.urlopen_api(url, body)
return strdata
# 获取记录类型列表
def get_record_type(self):
url = 'http://www.cloudxns.net/api2/type'
body = ''
strdata = self.urlopen_api(url, body)
return strdata
# 获取线路列表
def get_line(self):
url = 'https://www.cloudxns.net/api2/line'
body = ''
strdata = self.urlopen_api(url, body)
return strdata
# 获取区域列表
def get_line_region(self):
url = 'https://www.cloudxns.net/api2/line/region'
body = ''
strdata = self.urlopen_api(url, body)
return strdata
# 获取 ISP 列表
def get_isp_list(self):
url = 'https://www.cloudxns.net/api2/line/isp'
body = ''
strdata = self.urlopen_api(url, body)
return strdata
"""
功能 获取某域名解析量统计数据
HTTP 请求方式 GET
URL https://www.cloudxns.net/api2/domain_stat/:id
URL 参数说明 Id域名 ID
请求参数
参数名称 类型 必填 描述
host String 主机名查询全部传 all
code String 统计区域 Id 或统 ISP Id查询全部传 all
start_date Date 开始时间 格式yyyy-mm-dd
end_date Date 结束时间 格式yyyy-mm-dd
:return:
"""
def domain_get_domain_stat(self, domain_id, host, code, start_date,
end_date):
url = 'https://www.cloudxns.net/api2/domain_stat/' + str(domain_id)
object_body = {}
object_body['host'] = host
object_body['code'] = code
object_body['start_date'] = start_date
object_body['end_date'] = end_date
body = json.dumps(object_body)
strdata = self.urlopen_api(url, body, 'POST')
return strdata
def http_dns_get(self, domain, client_ip='', ttl='',
http_dns_interface='http://httpdnsv3.ffdns.net'):
if domain == None or len(domain) == 0:
return ''
url = http_dns_interface + '/httpdns?dn=' + str(domain)
if client_ip != None and len(client_ip) != 0:
url += '&cip=' + str(client_ip)
if ttl != None and len(ttl) != 0:
url += '&ttl=' + str(ttl)
strdata = self.urlopen(url)
return strdata
if __name__ == '__main__':
api = CloudXNS_API(api_key='a7fe5ecbb823e7b0c968b2a885a18e98',
secret_key='a5e984dd94e24f60891cc32746b115d7',
debug_log=True)
api.domain_add('test.org')
print(api.domain_list())
# api.domain_host_record_add(216271,'test','127.0.0.1','A',1)
api = CloudXNS_API()
# str=api.http_dns_get('www.test.net')
# dict=api.json_strtodict(str)
# print(str)
pass