meusov11
@meusov11

Как сделать автоматическую отправку формы по кнопке через Python?

Мне нужен скрипт, который сканирует домены в файле 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()
  • Вопрос задан
  • 248 просмотров
Решения вопроса 1
@duff89
Предложу несколько вариантов:
1) Решить саму капчу с помощью различных сервисов, это недорого
2) После решения капчи происходит POST запрос на адрес (далее примерно): https://www.google.com/recaptcha/api2/userverify?k...
В теле запроса передается решение (большой набор символов). Это я к чему, с помощью selenium-wire можно прослушивать запросы, в официальной документации там даже найдете пример ожидания запроса на определенный url
3)На сайте есть элемент с id="g-recaptcha-response", он пустой изначально, но как только капча будет решена, там появится большой набор символов, это как раз и есть решение капчи. Можно завязать логику на этом
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы