mirror of
https://github.com/NewFuture/DDNS.git
synced 2022-04-19 20:24:44 +00:00
114 lines
3.1 KiB
Python
114 lines
3.1 KiB
Python
# coding=utf-8
|
|
"""
|
|
Custom Callback API
|
|
自定义回调接口解析操作库
|
|
|
|
@author: 老周部落
|
|
"""
|
|
|
|
from json import loads as jsondecode, dumps as jsonencode
|
|
from logging import debug, info, warning
|
|
from time import time
|
|
|
|
try:
|
|
# python 2
|
|
from httplib import HTTPSConnection, HTTPConnection
|
|
from urlparse import urlparse, parse_qsl
|
|
from urllib import urlencode
|
|
except ImportError:
|
|
# python 3
|
|
from http.client import HTTPSConnection, HTTPConnection
|
|
from urllib.parse import urlencode, urlparse, parse_qsl
|
|
|
|
__author__ = '老周部落'
|
|
|
|
class Config:
|
|
ID = None # 自定义回调 URL
|
|
TOKEN = None # 使用 JSON 编码的 POST 参数
|
|
PROXY = None # 代理设置
|
|
TTL = None
|
|
|
|
def request(method, action, param=None, **params):
|
|
"""
|
|
发送请求数据
|
|
"""
|
|
if param:
|
|
params.update(param)
|
|
|
|
URLObj = urlparse(Config.ID)
|
|
params = dict((k, params[k]) for k in params if params[k] is not None)
|
|
info("%s/%s : %s", URLObj.netloc, action, params)
|
|
|
|
if Config.PROXY:
|
|
if URLObj.netloc == "http":
|
|
conn = HTTPConnection(Config.PROXY)
|
|
else:
|
|
conn = HTTPSConnection(Config.PROXY)
|
|
conn.set_tunnel(URLObj.netloc, URLObj.port)
|
|
else:
|
|
if URLObj.netloc == "http":
|
|
conn = HTTPConnection(URLObj.netloc, URLObj.port)
|
|
else:
|
|
conn = HTTPSConnection(URLObj.netloc, URLObj.port)
|
|
|
|
headers = {}
|
|
|
|
if method == "GET":
|
|
if params:
|
|
action += '?' + urlencode(params)
|
|
params = ""
|
|
else:
|
|
headers["Content-Type"] = "application/x-www-form-urlencoded"
|
|
|
|
params = urlencode(params)
|
|
|
|
conn.request(method, action, params, headers)
|
|
response = conn.getresponse()
|
|
res = response.read().decode('utf8')
|
|
conn.close()
|
|
if response.status < 200 or response.status >= 300:
|
|
warning('%s : error[%d]:%s', action, response.status, res)
|
|
raise Exception(res)
|
|
else:
|
|
debug('%s : result:%s', action, res)
|
|
return res
|
|
|
|
def replace_params(domain, record_type, ip, params):
|
|
"""
|
|
替换定义常量为实际值
|
|
"""
|
|
dict = {"__DOMAIN__": domain, "__RECORDTYPE__": record_type, "__TTL__": Config.TTL, "__TIMESTAMP__": time(), "__IP__": ip}
|
|
for key, value in params.items():
|
|
if dict.get(value):
|
|
params[key] = dict.get(value)
|
|
return params
|
|
|
|
def update_record(domain, value, record_type="A"):
|
|
"""
|
|
更新记录
|
|
"""
|
|
info(">>>>>%s(%s)", domain, record_type)
|
|
|
|
result = {}
|
|
|
|
if not Config.TOKEN: # 此处使用 TOKEN 参数透传 POST 参数所用的 JSON
|
|
method = "GET"
|
|
URLObj = urlparse(Config.ID)
|
|
path = URLObj.path
|
|
query = dict(parse_qsl(URLObj.query))
|
|
params = replace_params(domain, record_type, value, query)
|
|
else:
|
|
method = "POST"
|
|
URLObj = urlparse(Config.ID)
|
|
path = URLObj.path
|
|
params = replace_params(domain, record_type, value, jsondecode(Config.TOKEN))
|
|
|
|
res = request(method, path, params)
|
|
|
|
if res:
|
|
result = "Callback Request Success!\n" + res
|
|
else:
|
|
result = "Callback Request Fail!\n"
|
|
|
|
return result
|