Несколько месяцев назад, у меня возникла необходимость написать веб-клиента для покупки доменов, который работает с сервисом GoDaddy.
Точнее, создан был целый сервис, по проверке доступности домена, времени освобождения, планированию к покупке исходя из различных параметров, и самой покупке.
Тут мы рассмотрим именно процедуру проверки и покупки по условию.
У GoDaddy есть отличная документация, но отвратительная поддержка, это нужно сразу понимать, собираясь сотрудничать с ними. Плюс, у них есть еще одна немаловажная проблема, которую нужно учесть - когда у них, свободный домен находится "временно недоступен" либо "в обработке" - его именно в этот момент можно купить у другого регистратора. Причем спокойно.
Проект был сделан на Flask, но я напишу его обычным кодом - я не думаю, что кому то из заинтересовавшихся составит проблем собрать его на Flask`е или FastAPI.
Изначально, список доменов к покупке приходил текстовым файлом, предполагается, что он лежит у :
import json
import request
from pprint import pprint
def spisok_to_dict():
with open("dfb.txt") as f:
global domains
domains = []
for domain in f:
url = domain.strip()
try:
domains.append(url)
except:
domain += domain
В данной функции мы открывали with open("dfb.txt") as f:
текстовый файл с перечислением доменов, далее объявляли глобальную переменную domains
, которая будет списком. Далее через цикл, построчно читаем и добавляем домен в список.
В этом месте у нас есть список, который состоит из доменов к покупке.
Далее, согласно документации, до запроса на покупку, нужно проверить, является ли домен доступным к покупке:
Предполагается, что к этому шагу у Вас есть api_key and secret_key)))
def avail():
api_key = ""
secret_key = ""
headers = {"Authorization": "sso-key {}:{}".format(api_key, secret_key)}
url = "https://api.godaddy.com/v1/domains/available"
global domains
# Берем глобальную переменную
availability_res = requests.post(url, json=domains, headers=headers)
# Отправляем запрос со списком доменов
# У GoDaddy есть ограничение количества запросов, и в таком случае мы получаем код ответа 429
if availability_res.status_code == 429:
# Выводим в консоль
print("превышено число запросов")
for domain in json.loads(availability_res.text)['domains']:
with open("log.txt", 'a', encoding="UTF-8") as f:
# Если домен свободен,
if domain['available']:
d = domain['domain']
a = domain['price']
print (d + " - домен свободен, цена - " + a)
# Выводим результат в консоль
# В моей задаче, стояло жесткое ограничение - покупка только если цена ниже 13.01 долл
if domain['price'] < 13010000:
api_buy(d)
# При соблюдении условия - вызывалась функция покупки, в которую передавался домен
Далее следует уже функция покупки. У меня данные клиента менялись по алгоритму, но я думаю реализация этого не составит никому проблемы.
def api_buy(d):
# SECRET for ote server
api_key = ""
secret_key = ""
headers = {"Authorization": "sso-key {}:{}".format(api_key, secret_key),
"accept": "application/json",
"Content-Type": "application/json"}
# Присваиваем значения переменным
domain_name = d
date_time = ""
address1 = ""
address2 = ""
email = ""
country = ""
city = ""
ip = ""
postal = ""
nf = ""
nl = ""
tel = ""
obl = ""
server = ["ns37.domaincontrol.com", "ns38.domaincontrol.com"]
raw_data = {
"consent": {
"agreedAt": date_time,
"agreedBy": ip,
"agreementKeys": ["DNRA"]
},
"contactAdmin": {
"addressMailing": {
"address1": address1,
"address2": address2,
"city": city,
"country": country,
"postalCode": postal,
"state": obl
},
"email": email,
"nameFirst": nf,
"nameLast": nl,
"phone": tel
},
"contactBilling": {
"addressMailing": {
"address1": address1,
"address2": address2,
"city": city,
"country": country,
"postalCode": postal,
"state": obl
},
"email": email,
"nameFirst": nf,
"nameLast": nl,
"phone": tel
},
"contactRegistrant": {
"addressMailing": {
"address1": address1,
"address2": address2,
"city": city,
"country": country,
"postalCode": postal,
"state": obl
},
"email": email,
"nameFirst": nf,
"nameLast": nl,
"phone": tel
},
"contactTech": {
"addressMailing": {
"address1": address1,
"address2": address2,
"city": city,
"country": country,
"postalCode": postal,
"state": obl
},
"email": email,
"nameFirst": nf,
"nameLast": nl,
"phone": tel
},
"domain": domain_name,
"nameServers": server,
"period": 1,
"privacy": False,
"renewAuto": False
}
data = json.dumps(raw_data)
url = 'https://api.godaddy.com/v1/domains/purchase'
result = requests.post(url, data=data, headers=headers)
# Выводим в консоль
print("\n\n\n======== Request ========")
print("\nHeaders:\n")
pprint(headers)
print("\nBody:\n")
pprint(raw_data)
print(d)
print("\n\n\n======== Response ========")
print(f"\nStatus code: {result.status_code}")
print("\nHeaders:")
pprint(dict(result.headers))
print("\nBody:")
pprint(result.text)
# И обрабатываем результат
if result.status_code == 200:
msg = "ПОКУПКА (успех) - " + "\n" + "\n" + domain_name + " - куплено"
print(msg)
if result.status_code == 429:
print("превышено число запросов")
if result.status_code == 402:
msg = "ПОКУПКА (неуспех)" + "\n" + "\n" + "Недостаточно денег для покупки " + "\n" + domain_name
print(msg)
if result.status_code == 422:
msg = "ПОКУПКА (неуспех)" + "\n" + "\n" + "Недоступен для покупки (ошибка GoDaddy) " + "\n" + domain_name
print(msg)
Теперь нужно вызвать функции поочередно:
def buy_domain():
spisok_to_dict()
avail()