qcloud-dns.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # -*- coding: utf-8 -*-
  2. import sys
  3. import hmac
  4. import time
  5. import random
  6. import hashlib
  7. import binascii
  8. import requests
  9. # @akgnah https://github.com/akgnah
  10. class Client(object):
  11. def __init__(self, secret_id, secret_key, host, uri, **params):
  12. self.secret_id = secret_id
  13. self.secret_key = secret_key
  14. self.host = host
  15. self.uri = uri
  16. self.params = params
  17. if sys.version_info[0] > 2:
  18. self.Py3 = True
  19. self.secret_key = bytes(self.secret_key, 'utf-8')
  20. else:
  21. self.Py3 = False
  22. def public_params(self):
  23. params = {
  24. 'Nonce': random.randint(1, 9999),
  25. 'SecretId': self.secret_id,
  26. 'SignatureMethod': 'HmacSHA1',
  27. 'Timestamp': int(time.time()),
  28. }
  29. params.update(self.params)
  30. return params
  31. def sign(self, params, method='GET'):
  32. params = params.copy()
  33. params.update(self.public_params())
  34. p = {}
  35. for k in params:
  36. if method == 'POST' and str(params[k])[0:1] == '@':
  37. continue
  38. p[k.replace('_', '.')] = params[k]
  39. ps = '&'.join('%s=%s' % (k, p[k]) for k in sorted(p))
  40. msg = '%s%s%s?%s' % (method.upper(), self.host, self.uri, ps)
  41. if self.Py3:
  42. msg = bytes(msg, 'utf-8')
  43. hashed = hmac.new(self.secret_key, msg, hashlib.sha1)
  44. base64 = binascii.b2a_base64(hashed.digest())[:-1]
  45. if self.Py3:
  46. base64 = base64.decode()
  47. params['Signature'] = base64
  48. return params
  49. def send(self, params, method='GET'):
  50. params = self.sign(params, method)
  51. req_host = 'https://{}{}'.format(self.host, self.uri)
  52. if method == 'GET':
  53. resp = requests.get(req_host, params=params)
  54. else:
  55. resp = requests.post(req_host, data=params)
  56. return resp.json()
  57. # View details at https://cloud.tencent.com/document/product/302/4032
  58. class Cns:
  59. def __init__(self, secret_id, secret_key):
  60. host, uri = 'cns.api.qcloud.com', '/v2/index.php'
  61. self.client = Client(secret_id, secret_key, host, uri)
  62. def list(self, domain):
  63. body = {
  64. 'Action': 'RecordList',
  65. 'domain': domain
  66. }
  67. return self.client.send(body)
  68. def create(self, domain, name, _type, value):
  69. body = {
  70. 'Action': 'RecordCreate',
  71. 'domain': domain,
  72. 'subDomain': name,
  73. 'recordType': _type,
  74. 'recordLine': '默认',
  75. 'value': value
  76. }
  77. return self.client.send(body)
  78. def delete(self, domain, _id):
  79. body = {
  80. 'Action': 'RecordDelete',
  81. 'domain': domain,
  82. 'recordId': _id
  83. }
  84. return self.client.send(body)
  85. if __name__ == '__main__':
  86. # Create your secret_id and secret_key at https://console.cloud.tencent.com/cam/capi
  87. secret_id = 'your secret_id'
  88. secret_key = 'your secret_key'
  89. cns = Cns(secret_id, secret_key)
  90. _, option, domain, name, value = sys.argv # pylint: disable=all
  91. if option == 'add':
  92. cns.create(domain, name, 'TXT', value)
  93. elif option == 'delete':
  94. for record in cns.list(domain)['data']['records']:
  95. if record['name'] == name and record['value'] == value:
  96. cns.delete(domain, record['id'])