Created
September 19, 2019 17:50
-
-
Save msafadieh/d75a5cc6cad20736248988b85971c7ca to your computer and use it in GitHub Desktop.
a very small client for Namecheap API that I needed for automation
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
from xml.etree import ElementTree as ET | |
import requests | |
NAMECHEAP_URL = "https://api.namecheap.com/xml.response" | |
class NamecheapClient: | |
def __init__(self, api_key, api_user, user_name, client_ip): | |
self.api_key = api_key | |
self.api_user = api_user | |
self.user_name = user_name | |
self.client_ip = client_ip | |
@property | |
def base_payload(self): | |
return { | |
"ApiUser": self.api_user, | |
"UserName": self.user_name, | |
"ApiKey": self.api_key, | |
"ClientIp": self.client_ip | |
} | |
def make_request(self, payload): | |
for k, v in self.base_payload.items(): | |
payload[k] = v | |
response = requests.get(NAMECHEAP_URL, params=payload) | |
root = ET.fromstring(response.text) | |
if root.get("Status") != "OK": | |
raise Exception("API Error." + response.text) | |
return root | |
def get_hosts(self, domain, email_type=False): | |
payload = {} | |
payload['Command'] = 'namecheap.domains.dns.getHosts' | |
self.add_domain(domain, payload) | |
root = self.make_request(payload) | |
if root.get("Status") != "OK": | |
raise Exception | |
hosts = [{ | |
"Address": raw_host.get("Address"), | |
"HostName": raw_host.get("Name"), | |
"MXPref": raw_host.get("MXPref"), | |
"RecordType": raw_host.get("Type"), | |
"TTL": raw_host.get("TTL") | |
} for raw_host in root[3][0]] | |
if email_type: | |
hosts.append(root[3][0].get("EmailType")) | |
return hosts | |
def add_domain(self, domain, payload): | |
sld, tld = domain.split(".") | |
payload["TLD"] = tld | |
payload["SLD"] = sld | |
def set_hosts(self, domain, hosts, email_type): | |
payload = {} | |
payload['EmailType'] = email_type | |
payload["Command"] = "namecheap.domains.dns.setHosts" | |
self.add_domain(domain, payload) | |
for index, host in enumerate(hosts, 1): | |
for key, value in host.items(): | |
payload[key + str(index)] = value | |
self.make_request(payload) | |
return True | |
def add_host(self, domain, host): | |
current_hosts = self.get_hosts(domain, True) | |
email_type = current_hosts[-1] | |
new_hosts = current_hosts[:-1] | |
new_hosts.append(host) | |
return self.set_hosts(domain, new_hosts, email_type) | |
def delete_host(self, domain, host_name): | |
current_hosts = self.get_hosts(domain, True) | |
email_type = current_hosts[-1] | |
new_hosts = list(filter(lambda host: host["HostName"] != host_name, current_hosts[:-1])) | |
return self.set_hosts(domain, new_hosts, email_type) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment