AliDDNS/main.py
2023-02-17 22:59:51 +08:00

126 lines
4.5 KiB
Python

import time
import threading
import json
import requests
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109.DescribeDomainRecordsRequest import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest
class AliDDNS(object):
def __init__(self,
domain, record,
id, secret,
sleep = 600,
ipv4 = True, ipv6 = True,
v4api = "https://ipv4.gh.ink",
v6api = "https://ipv6.gh.ink"):
assert domain.count(".") == 1 and \
not domain.startswith(".") and \
not domain.endswith(".")
self.domain = domain
self.record = record
self.sleep = sleep
self.ipv4 = ipv4
self.ipv6 = ipv6
self.v4api = v4api
self.v6api = v6api
self.__client = AcsClient(id, secret, 'cn-hangzhou')
daemon = threading.Thread(target=self.__daemon, name="Daemon Thread")
daemon.daemon = True
daemon.start()
def __daemon(self):
while True:
self.refresh()
time.sleep(self.sleep)
def refresh(self):
# Get local public ipv4 address
if self.ipv4:
try:
self.__v4 = requests.get(self.v4api).text
except Exception as e:
print("Failed to get local public ipv4 address,", e)
else:
print("Your ipv4 address is:", self.__v4)
describe_v4 = DescribeDomainRecordsRequest()
describe_v4.set_accept_format('json')
describe_v4.set_DomainName(self.domain)
describe_v4.set_RRKeyWord(self.record)
describe_v4.set_TypeKeyWord("A")
describeback_v4 = self.__client.do_action_with_exception(describe_v4)
recordlist_v4 = json.loads(describeback_v4)
recordid_v4 = recordlist_v4['DomainRecords']['Record'][0]['RecordId']
value_v4 = recordlist_v4['DomainRecords']['Record'][0]['Value']
if value_v4 != self.__v4:
print('Your ipv4 address has been changed, update now.')
update_v4 = UpdateDomainRecordRequest()
update_v4.set_accept_format('json')
update_v4.set_RecordId(recordid_v4)
update_v4.set_Value(self.__v4)
update_v4.set_Type("A")
update_v4.set_RR(self.record)
self.__client.do_action_with_exception(update_v4)
print('Your ipv4 record has been updated successfully.')
# Get local public ipv6 address
if self.ipv6:
try:
self.__v6 = requests.get(self.v6api).text
except Exception as e:
print("Failed to get local public ipv4 address,", e)
else:
print("Your ipv6 address is:", self.__v6)
describe_v6 = DescribeDomainRecordsRequest()
describe_v6.set_accept_format('json')
describe_v6.set_DomainName(self.domain)
describe_v6.set_RRKeyWord(self.record)
describe_v6.set_TypeKeyWord("AAAA")
describeback_v6 = self.__client.do_action_with_exception(describe_v6)
recordlist_v6 = json.loads(describeback_v6)
recordid_v6 = recordlist_v6['DomainRecords']['Record'][0]['RecordId']
value_v6 = recordlist_v6['DomainRecords']['Record'][0]['Value']
if value_v6 != self.__v6:
print('Your ipv6 address has been changed, update now.')
update_v6 = UpdateDomainRecordRequest()
update_v6.set_accept_format('json')
update_v6.set_RecordId(recordid_v6)
update_v6.set_Value(self.__v6)
update_v6.set_Type("AAAA")
update_v6.set_RR(self.record)
self.__client.do_action_with_exception(update_v6)
print('Your ipv6 record has been updated successfully.')
if __name__ == "__main__":
dns = AliDDNS("MainDomain.com", "SubDomain", "AccessKey ID", "AccessKey Secret")
while True:
cmd = input()
if cmd == "exit":
break
elif cmd == "refresh":
dns.refresh()
else:
print("Unknown command.")