Массовая проверка доменов на занятость и автоматическая регистрация с помощью Python


Массовая проверка доменов и автоматическая регистрация

Проверка доменного имени на занятость это хорошо, но намного удобнее когда проверка сопровождается автоматической регистрацией. Ведь все ждут, когда упадет очередная пачка дропов, а те кто занимается этим регулярно даже примерно знают время.

Но чаще всего время не точное и упустив минуту - две можно пропустить то доменное имя или несколько доменных имен, которые хотелось бы заполучить. Не исключено, что часть доменов будут перехвачены и выкуплены еще до момента падения, но есть и та доля, которая дропнется и будет зарегистрирована вручную.

Мы же можем сделать так, чтобы программа проверяла доменное имя на занятость постоянно и если домен освободился сразу же его регистрировала.

Итак, как будет работать наш код: читаем домены из файла построчно, проверяем на занятость, если домен занят или стоит больше указанной суммы, переходим к слудующему, если же свободен, регистрирует его. Все зарегистрированные доменные имена будут сохранены в отдельный файл с именем домена и его стоимостью.

Первым делом импортируем библиотеки, если библиотеки не установлены, установите их с помощью pip install название модуля, например pip install pandas:


    import re
    import requests
    import time

Создадим файл в path под названием 1.txt, вы всегда его можете переименовать и дать ему более логиеское имя. Начнем читать файл построчно, кроме этого мы содадим дополнительно несколько переменных, одна из них ключ API доменного регистратора Namesilo, который можно получить в несколько кликов в личном кабинете. Да чут не забыл, мы будем использовать доменный регистратор Namesilo. Для того, чтобы использовать данный код, вам необходимо создать учетную запись у этого доменного регистратра, получить ключ API и положить средства на балланс в личном кабинете, которых должно хватать для регистрации доменов. Для теста можно купить самый дешевый домен используя программу, если хотите удостовериться в том, что код работает.


    f = open('1.txt') # открываем файл
    domain_name = f.readline() # считываем первую строку
    api_key = "указываем ключ API доменного регистратора Namesilo,
    он должен быть заключен в кавычки, как этот текст"
    count = 0 # устанавливаем счетчик для будущего цикла, который будет считать количество проверок

Далее, создадим два файла, в которые будем ложить зарегистрированные домены - в один и домены дороже определнной суммы - в другой. Для создания файлов, открываем их в режиме записи, в таком случае Python создаст файл, если его не существует или же перезапишет, если файл существует. Будьте внимательны, испльзуя автоматическое создание файлов, при каждом запуске кода, такой файл будет перезаписан:


    with open("registered_domains.txt", "w", encoding='utf-8') as file:
        pass
    with open("expensive_domains.txt", "w", encoding='utf-8') as new_file:
        pass

Чтобы объяснить следующий код забежим немного наперед. Создадим функцию, которая будет записывать файл превышающий стоимость домен или зарегистрированнй вами домен и удалять из файла с доменами зарегистрированный домен чтобы избежать повторной проверки:


def registered_or_expensive(file_write_name, file_delete_name, price, answer):
    with open(file_write_name, "a") as file:
        file.write(f'{domain_name} {price} {str(domain_price)}\n')
    print(answer)

    with open(file_delete_name, "r+") as f:
        new_f = f.readlines()
        f.seek(0)
        for line in new_f:
            if domain_name not in line:
                f.write(line)
        f.truncate()

Следующим шагом будет создание цикла, в котором укажем количество итераций (сколько раз нужно проверить каждый домен) - можно указать любое число. Укажем задержку, по времени для того чтобы сократить количество запросов на сервер Namesilo, так как это им может не понравиться. И проверим файл на наличие доменов, в случае отсутствия доменных имен в файле, программа прекратит работу:


while count < 100:
    time.sleep(10)
    # print(count, domain_name)
    if len(domain_name) < 1:
        f.close()
        f = open('1.txt')
        domain_name = f.readline()
        count += 1
        if len(domain_name) < 1:
            f.close()
            print("Файл пустой")
            break

Если файл с доменами не пустой, уберем лишние символы в доменном имени и отправим запрос на проверку занятости домена, получим ответ и преобразуем данные в нужный формат:


    else:
        domain_name = re.sub("^\s+|\n|\r|\s+$", '', domain_name)
        response_url = f'https://www.namesilo.com/api/checkRegisterAvailability \
        ?version=1&type=xml&key={api_key}&domains={domain_name}'
        response = requests.post(response_url).text
        a = response.split()

Получив ответ, проверим его на соответствие, если домен занят, код отправиться читать следующий домен из файла, если же свободен, получит цену и если она меньше 10 долларов (модно указать любую сумму), приступит к регистрации. Если на счету нет средств, будет выведено соответствующее сообщение и код пойдет читать следующее доменное имя (здесь можно прервать выполнение программы, но если будет указана максимальная сумма выше стандартной за домен, к примеру 200 долларов, а у вас на счету будет 199, то сканирование прервется, так как код посчитает, что у вас недостаточно денег на счету, и вы не сможете приобрести доменные имена, которые идут в списке ниже.). Если же средства есть и домен свободен, то будет выведено сообщение о регистрации и домен будет зарегистрирован. Если же во время регистрации возникнет ошибка, вы получите сообщение об ошибке, и код вернется к чтению следующего доменного имени.


        try:
            if "unavailable" in a[2]:
                print(f"Домен {domain_name} занят")
            elif "available" in a[2]:
                print("Домен свободен")
                domain_price = float(re.sub(r'[^0-9.]+', r'', str(a[3])))
                print(domain_name, domain_price)
                if domain_price < 10:
                    print("Пробую купить доменное имя")
                    print(f'Домен стоит: {str(domain_price)} USD')
                    buydomain = requests.post(f"https://www.namesilo.com/api/ \
                    registerDomain?version=1&type=xml&key={api_key}&domain= \
                    {str(domain_name)}&years=1&private=1&auto_renew=1/?rid=d3b8778js")
                    print(buydomain.text)
                    no_money_answer = "Sorry, you do not have enough available \
                    NameSilo account funds for this transaction."
                    success_answer = "Your domain registration was successfully \
                    processed."
                    if no_money_answer in buydomain.text:
                        print("Покупка не удалась, пополните свой балланс")
                    elif success_answer in buydomain.text:
                        registered_or_expensive("registered_domains.txt", "1.txt", \
                        "куплен по цене", "Домен зарегистрирован и сохранен в файл \
                        registered_domains.txt")
                    else:
                        print("Регистрация неуспешна")


                else:
                    print(f'Домен стоит дороже: {str(domain_price)} USD')
                    registered_or_expensive("expensive_domains.txt", "1.txt", \
                    "стоит", "Домен перемешен в файл expensive_domains.txt")

        except:
            print("Неизвестная ошибка")
        finally:
            print("______________________________")
            domain_name = f.readline()
f.close()

Приймите во внимание, что код можно изменить и использовать как удобнее каждому: 1. Записывать данные в файлы или же выводить в таблицу, 2. Подключить прокси и юзерагенты для более длительного использования кода. 3. Задать автоматический запуск в определенное время. 4. Проверять дату по WHOIS и в зависимости от этого сканировать домен или же подождать. 5. Изменить сервис регистрации Если вас интересует доработка или разработка, обращайтесь к администратору в нашем телеграм канале.

И самое важное, помните, что в Python нужно соблюдать отступы или один таб или 4 пробела, код нужно привести к такому виду как он указан на сайте, если при копировании (такое бывает довольно часто) количество отступов изменилось или они пропали вообще.

Не забудьте подписаться на наш телеграм канал@py4seo, будет еще много интересного

Все бэкслеши в конце строк можно удалить и убрать перенос строки, т.е. грубо говоря бэкслеш говорит питону от том, что тут код очень длинный, делаем перенос строки.

А теперь ловите полную версию кода, просим вас не публиковать код без указания источника, спасибо за понимание:



import re
import requests
import time


f = open('1.txt')
domain_name = f.readline()
api_key = "6ac329b820cbaa7ac52a6"
count = 0

with open("registered_domains.txt", "w", encoding='utf-8') as registered_domains:
    pass
with open("expensive_domains.txt", "w", encoding='utf-8') as expensive_domains:
    pass



def registered_or_expensive(file_write_name, file_delete_name, price, answer):
    with open(file_write_name, "a") as file:
        file.write(f'{domain_name} {price} {str(domain_price)}\n')
    print(answer)

    with open(file_delete_name, "r+") as my_file:
        new_f = my_file.readlines()
        my_file.seek(0)
        for line in new_f:
            if domain_name not in line:
                my_file.write(line)
        my_file.truncate()


while count < 100:
    time.sleep(10)
    if len(domain_name) < 1:
        f.close()
        f = open('1.txt')
        domain_name = f.readline()
        count += 1
        if len(domain_name) < 1:
            f.close()
            print("Файл пустой")
            break
    else:
        domain_name = re.sub("^\s+|\n|\r|\s+$", '', domain_name)
        # print(domain_name)
        response_url = f'https://www.namesilo.com/api/checkRegisterAvailability \
        ?version=1&type=xml&key={api_key}&domains={domain_name}'
        response = requests.post(response_url).text
        a = response.split()

        try:
            if "unavailable" in a[2]:
                print(f"Домен {domain_name} занят")
            elif "available" in a[2]:
                print("Домен свободен")
                domain_price = float(re.sub(r'[^0-9.]+', r'', str(a[3])))
                print(domain_name, domain_price)
                if domain_price < 10:
                    print("Пробую купить доменное имя")
                    print(f'Домен стоит: {str(domain_price)} USD')
                    # покупка
                    buydomain = requests.post(f"https://www.namesilo.com/api/ \
                    registerDomain?version=1&type=xml&key={api_key}&domain={str \
                    (domain_name)}&years=1&private=1&auto_renew=1?rid=d3b8778js")
                    print(buydomain.text)
                    no_money_answer = "Sorry, you do not have enough available \
                    NameSilo account funds for this transaction."
                    success_answer = "Your domain registration was successfully
                    \processed."
                    if no_money_answer in buydomain.text:
                        print("Покупка не удалась, пополните свой балланс")
                    elif success_answer in buydomain.text:
                        registered_or_expensive("registered_domains.txt", \
                        "1.txt", "куплен по цене", "Домен зарегистрирован и
                        \сохранен в файл registered_domains.txt")
                    else:
                        print("Регистрация неуспешна")


                else:
                    print(f'Домен стоит дороже: {str(domain_price)} USD')
                    registered_or_expensive("expensive_domains.txt", "1.txt", \
                    "стоит", "Домен перемешен в файл expensive_domains.txt")

        except:
            print("Неизвестная ошибка")
        finally:
            print("______________________________")
            domain_name = f.readline()
f.close()