Мне нужен скрипт, который сканирует домены в файле domain.txt. После сканирования скрипт должен:
1. Открывать сервис safebrowsing (https://safebrowsing.google.com/safebrowsing/report_error/?hl=en);
2. В "URL" указать домен из файла domain.txt по порядку;
3. В "Additional details: (Optional)" скрипт должен указывать текст:
text text text text text
4. Далее скрипт должен ждать, пока пользователь пройдет вручную проверку reCAPTCHA (I'm not a robot) от Google и самостоятельно нажать кнопку "Submit report". После этого нас должно перенаправить на "https://www.google.com/safebrowsing/static/submit_success.html?hl=en" в случае, если нас перенаправило на адрес "https://www.google.com/safebrowsing/static/submit_success.html?hl=en" после нажатия кнопки "Submit report", то это означает, что репорт отправился успешно.
Теперь нам нужно снова открыть новую вкладку сервиса safebrowsing (https://safebrowsing.google.com/safebrowsing/report_error/?hl=en) и повторить то же самое для нового домена из списка domain.txt.
Вопрос: Как мне сделать так, чтобы после ручного ввода капчи пользователем скрипт автоматически нажимал кнопку "Submit report"? Я пробовал по ID, стилю, полной вставке кода, по чекбоксу зеленой галочки после ее решения, но ничего не помогает. В итоге я написал функцию time.sleep(15), которая ждет 15 секунд, чтобы пользователь успел ввести капчу. Это неправильно, скрипт должен сам нажимать кнопку "Submit report" после решения капчи пользователем.
import logging
import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
logging.basicConfig(level=logging.INFO, format='[%(levelname)s] %(message)s')
def submit_report(driver, domain):
# Открываем страницу для отправки отчета
driver.get('https://safebrowsing.google.com/safebrowsing/report_error/?hl=en')
# Вводим домен в поле "URL"
url_field = driver.find_element(By.ID, 'url')
url_field.clear()
url_field.send_keys(domain)
# Вводим текст в поле "Additional details: (Optional)"
additional_details_field = driver.find_element(By.ID, 'dq')
additional_details_text = '''text text text text text text'''
additional_details_field.clear()
additional_details_field.send_keys(additional_details_text)
# Ожидаем решения Google reCAPTCHA
WebDriverWait(driver, 300).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe[src^="https://www.google.com/recaptcha/api2/anchor"]')))
# Ждем, пока пользователь решает капчу
time.sleep(15) # Приостановка выполнения программы на 25 секунд
# Кликаем по кнопке "Submit Report" с помощью JavaScript
submit_button = driver.find_element(By.CSS_SELECTOR, 'input[value="Submit Report"]')
driver.execute_script("arguments[0].click();", submit_button)
# Ожидаем перехода на страницу успешной отправки отчета
try:
WebDriverWait(driver, 10).until(EC.url_contains('submit_success'))
# Проверяем, был ли успешно отправлен отчет
if 'submit_success' in driver.current_url:
logging.info(f'Report for {domain} sent successfully')
return True
except TimeoutException:
logging.warning(f'Timeout while waiting for report submission for {domain}.')
return False
# Открываем файл с доменами
with open('domain.txt', 'r') as f:
domains = f.read().splitlines()
# Опции для ChromeDriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
# Устанавливаем путь к ChromeDriver
service = webdriver.chrome.service.Service(ChromeDriverManager().install())
# Открываем браузер
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
index = 0 # Индекс текущего домена
max_attempts = 3 # Максимальное количество попыток отправки отчета
# Открываем файл successful.txt для записи
with open('successful.txt', 'a') as successful_domains_file:
while index < len(domains):
domain = domains[index]
attempts = 0 # Счетчик попыток отправки отчета
while attempts < max_attempts:
success = submit_report(driver, domain)
if success:
# Записываем успешно отправленный домен в successful.txt
successful_domains_file.write(f'{domain} - успешно отправлен отчет ({time.strftime("%Y-%m-%d %H:%M:%S")})\n')
break # Успешно отправлено, переходим к следующему домену
else:
attempts += 1
logging.warning(f'Retrying report submission for {domain} (attempt {attempts})...')
if attempts >= max_attempts:
logging.error(f'Failed to submit report for {domain} after {max_attempts} attempts.')
index += 1 # Переходим к следующему домену
finally:
# Закрываем браузер после работы скрипта
driver.quit()