Created
October 25, 2019 07:51
-
-
Save nickfox-taterli/7ce42aedfc6b149ce4dd8951ee026e3e to your computer and use it in GitHub Desktop.
Tencent SCF DDNS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding:utf-8 -*- | |
import base64 | |
import hashlib | |
import hmac | |
import json | |
import random | |
from datetime import datetime | |
from urllib.parse import urlencode | |
from urllib.request import urlopen | |
host = 'cns.api.qcloud.com/v2/index.php' | |
secret_id = 'x' | |
secret_key = 'x' | |
def CNSRequest(action, region=None, dict_arg=None, **kw_arg): | |
params = dict(dict_arg) if dict_arg is not None else {} | |
params.update(kw_arg) | |
# 公共参数 | |
params['Action'] = action | |
if region is not None: | |
params['Region'] = region | |
params['Timestamp'] = int(datetime.timestamp(datetime.now())) | |
params['Nonce'] = random.randint(1, 2 ** 16 - 1) | |
params['SecretId'] = secret_id | |
params['SignatureMethod'] = 'HmacSHA256' | |
params = {str(k): str(v) for k, v in params.items()} | |
# 签名原文字符串 | |
text = 'GET' + host + '?' + '&'.join(k + '=' + v for k, v in sorted(params.items())) | |
# 加密 | |
signature = hmac.new(secret_key.encode(), text.encode(), hashlib.sha256).digest() | |
# base64编码并添加到参数列表中 | |
params['Signature'] = base64.b64encode(signature).decode() | |
# 生成url,参数中可能会有特殊字符,所以需要urlencode | |
url = 'https://' + host + '?' + urlencode(sorted(params.items())) | |
# 发出请求 | |
contents = json.loads(urlopen(url).read().decode('unicode-escape')) | |
# 校验是否成功 | |
if contents['code'] != 0: | |
raise Exception(contents['message']) | |
# 返回数据 | |
return contents['data'] | |
def main_handler(event, context): | |
if event['queryString']['action'] == 'nas': | |
records = CNSRequest('RecordList', domain="x.net")['records'] | |
for record in records: | |
# 找到对应的记录值 | |
if record['name'] == 'nas': | |
# 如果有修改的必要的话 | |
if record['value'] != event["requestContext"]["sourceIp"]: | |
# 在原记录值的基础上修改 | |
CNSRequest('RecordModify', | |
domain="X.net", | |
recordId=record['id'], | |
subDomain=record['name'], | |
recordType=record['type'], | |
recordLine=record['line'], | |
value=event["requestContext"]["sourceIp"], | |
ttl=record['ttl'], | |
mx=record['mx']) | |
# return event["requestContext"]["sourceIp"] | |
return event |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment