Проверка доменного имени на занятость это хорошо, но намного удобнее когда проверка сопровождается автоматической регистрацией. Ведь все ждут, когда упадет очередная пачка дропов, а те кто занимается этим регулярно даже примерно знают время.
Но чаще всего время не точное и упустив минуту - две можно пропустить то доменное имя или несколько доменных имен, которые хотелось бы заполучить. Не исключено, что часть доменов будут перехвачены и выкуплены еще до момента падения, но есть и та доля, которая дропнется и будет зарегистрирована вручную.
Мы же можем сделать так, чтобы программа проверяла доменное имя на занятость постоянно и если домен освободился сразу же его регистрировала.
Итак, как будет работать наш код: читаем домены из файла построчно, проверяем на занятость, если домен занят или стоит больше указанной суммы, переходим к слудующему, если же свободен, регистрирует его. Все зарегистрированные доменные имена будут сохранены в отдельный файл с именем домена и его стоимостью.
Первым делом импортируем библиотеки, если библиотеки не установлены, установите их с помощью 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()