Search
Write a publication
Pull to refresh

Пишем на Python клиента для покупки домена с сервисом GoDaddy

Несколько месяцев назад, у меня возникла необходимость написать веб-клиента для покупки доменов, который работает с сервисом 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()
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.