Как использовать 2Captcha для парсинга данных в приложении на Spring Boot?

Как я могу спарсить данные, такие как телефон, со <a href="https://krisha.kz/a/show/676825069" rel="nofollow">страницы</a>, если номер скрыт кнопкой "показать телефон" и защищен с помощью reCAPTCHA V2? Я использую Selenium: сначала закрыл всплывающее окно для новых пользователей, затем нажал кнопку "показать телефон". После этого отправил капчу на API 2Captcha, и она была решена. Однако, несмотря на это, телефон все равно не отображается, и, похоже, капча не была правильно решена. Как я могу решить эту проблему? 

Вот мой код: 
<pre><code class="java">import lombok.extern.log4j.Log4j;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.stereotype.Component;
import ru.shmatov.telegramwebparser.utils.HttpUtils;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
@Log4j
public class CaptchaSolver {

    private final String twoCaptchaApiKey = "API_KEY";
    private WebDriver driver;

    public CaptchaSolver() {
        System.setProperty("webdriver.chrome.driver",
                System.getProperty("user.dir") + "/src/main/resources/chromedriver");
        this.driver = new ChromeDriver();
    }

    public String solveCaptcha(String url) throws IOException, InterruptedException {
        driver.get(url);

        new WebDriverWait(driver, 15).until(
                webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals(
  • 6 января 2025 г. 16:14
Ответы на вопрос 2
Для того чтобы корректно использовать 2Captcha для решения reCAPTCHA V2 и успешно парсить данные со страниц, таких как номера телефонов, необходимо убедиться, что вы правильно настроили и реализовали все этапы. Давайте разберем основные шаги и предложим решения возможных проблем.

### Общий подход

1. **Настройка Selenium**: Убедитесь, что вы правильно конфигурируете Selenium для работы с браузером. В вашем коде видно, что вы используете `ChromeDriver`.

2. **Обработка всплывающих окон**: Как вы заметили, первым делом нужно закрыть всплывающее окно, которое открывается для новых пользователей, это вы делаете корректно.

3. **Нажатие на кнопку "показать телефон"**: Убедитесь, что вы правильно нажимаете на эту кнопку и ожидаете обновления страницы после нажатия.

4. **Отправка запроса к 2Captcha**: Здесь вам нужно корректно собрать данные о капче, затем отправить их в 2Captcha.

5. **Получение ответа от 2Captcha**: После получения решения капчи, используйте его для заполнения поля и отправки формы, если это необходимо.

### Пример кода

Вот модифицированный фрагмент вашего кода с описаниями:

```java
import lombok.extern.log4j.Log4j;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.stereotype.Component;
import ru.shmatov.telegramwebparser.utils.HttpUtils;

import java.io.IOException;

@Component
@Log4j
public class CaptchaSolver {

    private final String twoCaptchaApiKey = "YOUR_API_KEY";
    private WebDriver driver;

    public CaptchaSolver() {
        System.setProperty("webdriver.chrome.driver",
                System.getProperty("user.dir") + "/src/main/resources/chromedriver");
        this.driver = new ChromeDriver();
    }

    public String solveCaptcha(String url) throws IOException, InterruptedException {
        driver.get(url);

        // Закрываем всплывающее окно
        // Здесь необходимо указать селектор для закрытия
        WebDriverWait wait = new WebDriverWait(driver, 15);
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("YOUR_CLOSE_POPUP_SELECTOR"))).click();

        // Запускаем процесс получения капчи
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("YOUR_SHOW_PHONE_BUTTON_SELECTOR"))).click();

        // Ждем, пока капча загрузится
        wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("YOUR_RECAPTCHA_SELECTOR")));

        // Получаем данные капчи
        String siteKey = driver.findElement(By.cssSelector("YOUR_RECAPTCHA_SELECTOR")).getAttribute("data-sitekey");

        // Отправляем капчу на 2Captcha
        String captchaId = HttpUtils.sendCaptchaTo2Captcha(twoCaptchaApiKey, url, siteKey);
        if (captchaId == null) {
            throw new RuntimeException("Failed to submit captcha");
        }

        // Ждем решения капчи
        String solution = HttpUtils.getCaptchaSolutionFrom2Captcha(twoCaptchaApiKey, captchaId);
        if (solution == null) {
            throw new RuntimeException("Failed to solve captcha");
        }

        // Вводим решение в форму (если это необходимо)
        WebElement captchaInput = driver.findElement(By.cssSelector("YOUR_CAPTCHA_INPUT_SELECTOR"));
        captchaInput.sendKeys(solution);

        // Отправляем форму
        driver.findElement(By.cssSelector("YOUR_FORM_SUBMIT_BUTTON_SELECTOR")).click();

        // Ждем, пока телефон появится на странице
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("YOUR_PHONE_NUMBER_SELECTOR")));

        // Получаем номер телефона
        return driver.findElement(By.cssSelector("YOUR_PHONE_NUMBER_SELECTOR")).getText();
    }
}
```

### Важные моменты:

1. **Селекторы**: Убедитесь, что указанные селекторы (например, `YOUR_CLOSE_POPUP_SELECTOR`, `YOUR_SHOW_PHONE_BUTTON_SELECTOR`, `YOUR_RECAPTCHA_SELECTOR`) корректны и соответствуют элементам на странице.

2. **Обработка ожиданий**: Используйте явные ожидания, чтобы дождаться, когда элементы станут доступны для взаимодействия. Это предотвратит ошибки, связанные со слишком быстро выполняемыми действиями.

3. **API 2Captcha**: 
   - `sendCaptchaTo2Captcha`: Метод для отправки капчи, который должен возвращать ID капчи.
   - `getCaptchaSolutionFrom2Captcha`: Метод для получения решения капчи, который должен обрабатывать API 2Captcha, ожидая завершения
Скорее всего сайт не видит, что капча решена. Само простое «вставить токен в #g-recaptcha-response» редко достаточно. Часто нужно действительно вызвать grecaptcha.execute() или повторить тот JS, который сайт вызывается при реальной проверке (например, по клику на «submit»). 

Попробуй понаблюдать в DevTools, что происходит, когда ты вручную разгадываешь капчу: какие сетевые запросы уходят, какие JS-события или функции (onloadCallback, grecaptcha.execute(), onSubmit) вызываются. Затем повтори эти действия в Selenium - не просто пихни токен на страницу, а заставь сайт пройти ровно тот же workflow:
Переключись в нужный iframe (если нужно),
Подставь капча-токен,
Выполни нужные скрипты/клики/сабмиты.
Если сайт использует серверную проверку, то обязательно должен быть запрос с передачей g-recaptcha-response. Без этого сайт даже не узнает, что капча решена. Проверяй, уходит ли он вообще и с каким телом. Обычно этого хватает, чтобы скрытый телефон начал отображаться.
Похожие вопросы