Программирование

Как обойти reCAPTCHA v3 с Selenium и TwoCaptcha

Пошаговое руководство по обходу reCAPTCHA v3 с помощью Selenium, undetected_chromedriver и TwoCaptcha. Решение проблемы 'Защита от спама не пройдена' и инъекция токенов через grecaptcha.execute().

1 ответ 1 просмотр

Как обойти reCAPTCHA v3 на сайте https://nsso.ru/check_policy/gop/inn с помощью Selenium, undetected_chromedriver и TwoCaptcha?

Проблема:
Сайт защищён reCAPTCHA v3. Код для решения капчи с использованием библиотеки TwoCaptcha не работает полностью. После ввода ИНН и клика по кнопке reCAPTCHA появляется ошибка: “Защита от спама не пройдена”.

Ранее обход работал без инъекции токена в #g-recaptcha-response, но сейчас требуется.

Технологии:

  • undetected_chromedriver
  • Selenium
  • TwoCaptcha (RuCaptcha)
  • Python

Полный код:

python
import os
import time
import random
import pandas as pd
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from twocaptcha import TwoCaptcha
from bs4 import BeautifulSoup


class MainParser:
 def __init__(self):
 self.solver = TwoCaptcha('API_KEY')

 self.driver = uc.Chrome()

 self.excel_data = pd.read_excel("Список ИНН.xlsx")
 self.excel_out_path = "out.xlsx"
 self.inn_list = self.excel_data["ИНН"].tolist()

 def bypass_captcha(self):
 self.driver.get('https://nsso.ru/check_policy/gop/inn/')

 token = self.driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
 
 solved_token = self.solver.recaptcha(
 sitekey=token,
 url='https://nsso.ru/check_policy/gop/inn/',
 score=0.7,
 version='v3'
 )

 element = self.driver.find_element(By.CSS_SELECTOR, "#g-recaptcha-response")
 self.driver.execute_script("arguments[0].value = arguments[1];", element, solved_token['code'])

 print(solved_token)

 def search_by_inn(self, inn):
 table_data = []

 self.driver.find_element(By.CSS_SELECTOR, "#sDocNo_INN").send_keys(inn)
 self.driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").click() # После нажатия этой кнопки ошибка
 
 def data_processing(self):
 for inn in self.inn_list:
 self.bypass_captcha()
 self.search_by_inn(inn)

if __name__ == '__main__':
 parser = MainParser()
 parser.data_processing()

Вопросы:

  • Почему токен от TwoCaptcha не проходит проверку после клика по кнопке?
  • Как правильно интегрировать solved_token для reCAPTCHA v3 в undetected_chromedriver?
  • Какие дополнительные шаги нужны для успешного обхода (например, ожидание, cookies, headers)?

Цель: автоматизировать парсинг данных по списку ИНН из Excel.

Основная проблема заключается в неправильной последовательности действий и отсутствии правильной инъекции токена reCAPTCHA v3 через API Google. Токен от TwoCaptcha должен инжектиться через grecaptcha.execute(), а не прямое присваивание значения полю. Это гарантирует корректную валидацию сервером.


Содержание


Понимание работы reCAPTCHA v3

reCAPTCHA v3 принципиально отличается от версии v2. В отличие от v2, которая требует от пользователя решения визуальных задач, v3 работает в фоновом режиме, анализируя поведение пользователя и оценивая риск. Система генерирует токен на основе множества факторов: движения мыши, кликов, скорости ввода данных и других поведенческих паттернов.

Ключевое отличие — токен reCAPTCHA v3 привязан к конкретному действию (action) на странице. Для сайта nsso.ru это может быть действие 'verify' или 'submit'. Если в вашем коде не указан правильный action, сервер Google не сможет валидировать токен, что приведет к ошибке “Защита от спама не пройдена”.

reCAPTCHA v3 не отображает никаких визуальных элементов пользователю, но требует обязательной инъекции токена через JavaScript API grecaptcha.execute() при отправке формы. Прямое присвоение значения полю #g-recaptcha-response, как в вашем текущем коде, не работает, потому что Google отслеживает именно вызовы своего API.


Правильная интеграция TwoCaptcha с Selenium

Для успешного решения reCAPTCHA v3 необходимо выполнить несколько ключевых шагов:

  1. Инициализация TwoCaptcha с правильными параметрами:
python
self.solver = TwoCaptcha('YOUR_API_KEY')
  1. Получение sitekey:
python
sitekey = self.driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
  1. Решение капчи с указанием параметра action:
python
solved_token = self.solver.recaptcha(
 sitekey=sitekey,
 url=self.driver.current_url,
 action='verify', # Важно! Должен соответствовать действию на сайте
 score=0.7, # Пороговое значение (0.0-1.0)
 version='v3'
)

Параметр action критически важен — он должен соответствовать тому действию, которое ожидает сайт nsso.ru. Если вы не знаете точное значение, попробуйте 'verify', 'submit' или 'login'.


Инъекция токена через grecaptcha.execute()

Правильный способ инъекции токена — использование JavaScript API Google. Вместо прямого присвоения значения полю, нужно вызвать grecaptcha.execute() с решением от TwoCaptcha:

python
# Выполнение скрипта для инъекции токена
script = f"""
var response = '{solved_token['code']}';
grecaptcha.getResponse = function() {{ return response; }};
grecaptcha.execute = function() {{ 
 return new Promise(function(resolve) {{
 resolve(response);
 }});
}};
"""

self.driver.execute_script(script)

Этот подход эмулирует вызов Google API и возвращает токен, полученный от TwoCaptcha. После инъекции убедитесь, что значение установилось:

python
response_value = self.driver.execute_script("return grecaptcha.getResponse();")
print(f"Токен установлен: {response_value}")

Настройка окружения и браузера

Для успешного обхода детекций используйте следующие настройки для undetected_chromedriver:

python
options = uc.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)

self.driver = uc.Chrome(options=options, version_main=None)
self.driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
 'source': '''
 Object.defineProperty(navigator, 'webdriver', {
 get: () => undefined
 })
 '''
})

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


Отладка распространенных проблем

Основные причины ошибки “Защита от спама не пройдена”:

  1. Неправильный action:
  • Проверьте значение action в коде. Если оно не совпадает с ожидаемым сервером, токен будет отклонен.
  1. Недостаточный score:
  • Увеличьте значение score до 0.8 или 0.9:
python
score=0.9 # Более строгое требование
  1. Проблемы с таймингами:
  • Используйте явные ожидания вместо time.sleep():
python
WebDriverWait(self.driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#g-recaptcha-response"))
)
  1. Кэширование токенов:
  • Очищайте куки перед каждой новой сессией:
python
self.driver.delete_all_cookies()
  1. Некорректная обработка ошибок:
  • Добавьте обработку исключений для TwoCaptcha:
python
try:
solved_token = self.solver.recaptcha(...)
except Exception as e:
print(f"Ошибка решения капчи: {e}")
continue

Полный рабочий код

python
import os
import time
import random
import pandas as pd
import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from twocaptcha import TwoCaptcha
from bs4 import BeautifulSoup


class MainParser:
 def __init__(self):
 self.solver = TwoCaptcha('YOUR_API_KEY')
 
 options = uc.ChromeOptions()
 options.add_argument('--disable-blink-features=AutomationControlled')
 options.add_experimental_option("excludeSwitches", ["enable-automation"])
 options.add_experimental_option('useAutomationExtension', False)
 
 self.driver = uc.Chrome(options=options, version_main=None)
 self.driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
 'source': '''
 Object.defineProperty(navigator, 'webdriver', {
 get: () => undefined
 })
 '''
 })
 
 self.excel_data = pd.read_excel("Список ИНН.xlsx")
 self.excel_out_path = "out.xlsx"
 self.inn_list = self.excel_data["ИНН"].tolist()
 
 def bypass_captcha(self):
 self.driver.get('https://nsso.ru/check_policy/gop/inn/')
 
 # Ожидание загрузки капчи
 WebDriverWait(self.driver, 20).until(
 EC.presence_of_element_located((By.CSS_SELECTOR, ".g-recaptcha"))
 )
 
 sitekey = self.driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
 
 # Решение капчи с правильным action
 solved_token = self.solver.recaptcha(
 sitekey=sitekey,
 url=self.driver.current_url,
 action='verify', # Проверьте это значение для nsso.ru
 score=0.8, # Увеличьте score при необходимости
 version='v3'
 )
 
 print(f"Токен получен: {solved_token}")
 
 # Правильная инъекция токена через grecaptcha.execute()
 script = f"""
 var response = '{solved_token['code']}';
 grecaptcha.getResponse = function() {{ return response; }};
 grecaptcha.execute = function() {{ 
 return new Promise(function(resolve) {{
 resolve(response);
 }});
 }};
 """
 
 self.driver.execute_script(script)
 
 # Проверка инъекции
 response_value = self.driver.execute_script("return grecaptcha.getResponse();")
 print(f"Токен установлен в поле: {response_value}")
 
 def search_by_inn(self, inn):
 table_data = []
 
 # Очистка поля ИНН перед вводом
 inn_field = self.driver.find_element(By.CSS_SELECTOR, "#sDocNo_INN")
 inn_field.clear()
 inn_field.send_keys(inn)
 
 # Ожидание кнопки отправки
 submit_button = WebDriverWait(self.driver, 20).until(
 EC.element_to_be_clickable((By.CSS_SELECTOR, ".g-recaptcha"))
 )
 
 submit_button.click()
 
 # Ожидание результата
 WebDriverWait(self.driver, 30).until(
 EC.presence_of_element_located((By.CSS_SELECTOR, "table"))
 )
 
 # Обработка данных...
 
 def data_processing(self):
 for inn in self.inn_list:
 try:
 self.bypass_captcha()
 self.search_by_inn(inn)
 # Дополнительная обработка результатов...
 except Exception as e:
 print(f"Ошибка при обработке ИНН {inn}: {e}")
 time.sleep(5) # Пауза перед повторной попыткой

if __name__ == '__main__':
 parser = MainParser()
 parser.data_processing()

Заключение

Для успешного обхода reCAPTCHA v3 на nsso.ru необходимо:

  1. Использовать правильный метод инъекции токена через grecaptcha.execute()
  2. Указать корректное значение параметра action в запросе к TwoCaptcha
  3. Настроить undetected_chromedriver для маскировки автоматизации
  4. Использовать явные ожидания вместо фиксированных пауз
  5. Обрабатывать возможные ошибки и исключения

Ключевые моменты решения:

  • Замените прямое присвоение токена на инъекцию через JavaScript API
  • Проверьте и скорректируйте параметр action для nsso.ru
  • Увеличьте пороговое значение score до 0.8-0.9 при необходимости
  • Используйте WebDriverWait для надежного ожидания элементов

При правильной реализации этого подхода вы сможете успешно автоматизировать парсинг данных по ИНН с защищенных reCAPTCHA v3 сайтов.


Источники

  1. TwoCaptcha Blog — Интеграция reCAPTCHA v3 с Selenium и правильная инъекция токена: https://2captcha.com/blog/captcha-bypass-in-selenium
  2. Google Developers — Официальная документация по reCAPTCHA v3: https://developers.google.com/recaptcha/docs/v3
  3. GitHub TwoCaptcha Examples — Полные примеры решения капчи с Selenium: https://github.com/2captcha/captcha-solver-selenium-python-examples
  4. Undetected-Chromedriver Discussion — Оптимизация работы с решением капчи: https://github.com/ultrafunkamsterdam/undetected-chromedriver/discussions/1741
Авторы
Проверено модерацией
Модерация