Как обойти reCAPTCHA v3 с Selenium и TwoCaptcha
Пошаговое руководство по обходу reCAPTCHA v3 с помощью Selenium, undetected_chromedriver и TwoCaptcha. Решение проблемы 'Защита от спама не пройдена' и инъекция токенов через grecaptcha.execute().
Как обойти 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
Полный код:
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
- Правильная интеграция TwoCaptcha с Selenium
- Инъекция токена через 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 необходимо выполнить несколько ключевых шагов:
- Инициализация TwoCaptcha с правильными параметрами:
self.solver = TwoCaptcha('YOUR_API_KEY')
- Получение sitekey:
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', # Важно! Должен соответствовать действию на сайте
score=0.7, # Пороговое значение (0.0-1.0)
version='v3'
)
Параметр action критически важен — он должен соответствовать тому действию, которое ожидает сайт nsso.ru. Если вы не знаете точное значение, попробуйте 'verify', 'submit' или 'login'.
Инъекция токена через grecaptcha.execute()
Правильный способ инъекции токена — использование JavaScript API Google. Вместо прямого присвоения значения полю, нужно вызвать grecaptcha.execute() с решением от TwoCaptcha:
# Выполнение скрипта для инъекции токена
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. После инъекции убедитесь, что значение установилось:
response_value = self.driver.execute_script("return grecaptcha.getResponse();")
print(f"Токен установлен: {response_value}")
Настройка окружения и браузера
Для успешного обхода детекций используйте следующие настройки для undetected_chromedriver:
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
})
'''
})
Эти настройки маскируют автоматизированное управление браузером, что критически важно для обхода современных антибот-систем.
Отладка распространенных проблем
Основные причины ошибки “Защита от спама не пройдена”:
- Неправильный
action:
- Проверьте значение
actionв коде. Если оно не совпадает с ожидаемым сервером, токен будет отклонен.
- Недостаточный
score:
- Увеличьте значение
scoreдо 0.8 или 0.9:
score=0.9 # Более строгое требование
- Проблемы с таймингами:
- Используйте явные ожидания вместо
time.sleep():
WebDriverWait(self.driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#g-recaptcha-response"))
)
- Кэширование токенов:
- Очищайте куки перед каждой новой сессией:
self.driver.delete_all_cookies()
- Некорректная обработка ошибок:
- Добавьте обработку исключений для TwoCaptcha:
try:
solved_token = self.solver.recaptcha(...)
except Exception as e:
print(f"Ошибка решения капчи: {e}")
continue
Полный рабочий код
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 необходимо:
- Использовать правильный метод инъекции токена через
grecaptcha.execute() - Указать корректное значение параметра
actionв запросе к TwoCaptcha - Настроить
undetected_chromedriverдля маскировки автоматизации - Использовать явные ожидания вместо фиксированных пауз
- Обрабатывать возможные ошибки и исключения
Ключевые моменты решения:
- Замените прямое присвоение токена на инъекцию через JavaScript API
- Проверьте и скорректируйте параметр
actionдля nsso.ru - Увеличьте пороговое значение
scoreдо 0.8-0.9 при необходимости - Используйте WebDriverWait для надежного ожидания элементов
При правильной реализации этого подхода вы сможете успешно автоматизировать парсинг данных по ИНН с защищенных reCAPTCHA v3 сайтов.
Источники
- TwoCaptcha Blog — Интеграция reCAPTCHA v3 с Selenium и правильная инъекция токена: https://2captcha.com/blog/captcha-bypass-in-selenium
- Google Developers — Официальная документация по reCAPTCHA v3: https://developers.google.com/recaptcha/docs/v3
- GitHub TwoCaptcha Examples — Полные примеры решения капчи с Selenium: https://github.com/2captcha/captcha-solver-selenium-python-examples
- Undetected-Chromedriver Discussion — Оптимизация работы с решением капчи: https://github.com/ultrafunkamsterdam/undetected-chromedriver/discussions/1741