Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как автоматически извлекать sitekey капчи для отправки

Грегори Фишер

Технический специалист

Для решения капч через API 2Captcha нужен корректный sitekey. Его можно найти вручную через DevTools, но при автоматизации надёжнее извлекать параметры программно.

В статье покажу рабочие способы автоматического извлечения sitekey для разных типов капч, разберу частые ошибки и дам готовые примеры на Python под требования 2Captcha.


Что такое sitekey и зачем он нужен

Sitekey — публичный идентификатор виджета капчи. Его выдаёт сервис защиты (Google reCAPTCHA, Cloudflare Turnstile и другие) при регистрации сайта.

В экосистеме 2Captcha sitekey нужен для:

  • идентификации целевого сайта при создании задачи,
  • формирования корректного запроса к API,
  • генерации валидного токена решения.

Без правильного sitekey 2Captcha вернёт ошибку ERROR_NO_SITEKEY, либо задача решится, но токен не подойдёт для целевой страницы.

Важно: в API 2Captcha для reCAPTCHA v2/v3 параметр называется googlekey, для Turnstile — sitekey, для GeeTest — gt. Автоматическое извлечение даёт универсальное значение, которое затем маппится на нужный параметр.


Где обычно находится sitekey

В зависимости от реализации, sitekey может быть в разных местах:

  • Атрибут data-sitekey: <div class="g-recaptcha" data-sitekey="6Ld..."> (reCAPTCHA v2/v3)
  • Параметр в iframe: src=".../anchor?k=6Ld..." (reCAPTCHA, Turnstile)
  • JavaScript-объект: window.grecaptcha_config = {sitekey: "6Ld..."} (reCAPTCHA enterprise)
  • Inline-скрипт: var captchaSitekey = "6Ld..."; (кастомные реализации)
  • Атрибут в форме: <input name="cf-turnstile-response" data-sitekey="0x4..."> (Cloudflare Turnstile)

Понимание источников помогает построить устойчивый алгоритм извлечения перед отправкой в 2Captcha.


Способ 1: Извлечение из HTML-атрибутов

Самый частый случай — sitekey в атрибуте data-sitekey.

Python + BeautifulSoup:

python Copy
from bs4 import BeautifulSoup


def extract_sitekey_bs4(html: str) -> str | None:
   soup = BeautifulSoup(html, 'html.parser')
  
   widget = soup.find(attrs={'data-sitekey': True})
   if widget:
       return widget['data-sitekey']
  
   turnstile = soup.find(attrs={'data-sitekey': True})
   if turnstile and 'cf-turnstile' in turnstile.get('class', []):
       return turnstile['data-sitekey']
  
   return None

Способ 2: Поиск через Selenium или Playwright

Когда капча загружается динамически, удобнее использовать браузерную автоматизацию.

Selenium пример:

python Copy
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def extract_sitekey_selenium(driver, timeout=10) -> str | None:
   try:
       widget = WebDriverWait(driver, timeout).until(
           EC.presence_of_element_located((By.CSS_SELECTOR, '[data-sitekey]'))
       )
       return widget.get_attribute('data-sitekey')
   except:
       pass
  
   return extract_sitekey_from_iframe(driver)

Playwright пример:

python Copy
def extract_sitekey_playwright(page) -> str | None:
   page.wait_for_selector('[data-sitekey]', timeout=10000)
  
   sitekey = page.evaluate('''() => {
       const widget = document.querySelector('[data-sitekey]');
       return widget ? widget.dataset.sitekey : null;
   }''')
  
   return sitekey

Способ 3: Извлечение из iframe URL

Некоторые реализации передают sitekey в параметрах URL внутри iframe.

Парсинг параметра k:

python Copy
from urllib.parse import urlparse, parse_qs


def extract_sitekey_from_iframe(driver) -> str | None:
   iframes = driver.find_elements(By.TAG_NAME, 'iframe')
  
   for iframe in iframes:
       src = iframe.get_attribute('src') or ''
       if 'recaptcha' in src or 'turnstile' in src:
           parsed = urlparse(src)
           params = parse_qs(parsed.query)
           if 'k' in params:
               return params['k'][0]
           if 'sitekey' in params:
               return params['sitekey'][0]
  
   return None

Способ 4: Извлечение через JavaScript-объекты

На сложных сайтах конфигурация капчи хранится в глобальных объектах.

Извлечение через execute_script:

python Copy
def extract_sitekey_js(driver) -> str | None:
   scripts = [
       "return window.grecaptcha_config?.sitekey",
       "return window.captchaConfig?.sitekey",
       "return window.captchaConfig?.key",
       "return document.querySelector('[data-sitekey]')?.dataset.sitekey"
   ]
  
   for script in scripts:
       try:
           result = driver.execute_script(script)
           if result and isinstance(result, str) and len(result) > 10:
               return result
       except:
           continue
   return None

Работа с динамически загружаемыми капчами

На SPA-сайтах (React, Vue, Angular) виджет капчи появляется после клика, отправки формы или асинхронного запроса.

Стратегия ожидания:

python Copy
def wait_for_captcha(driver, timeout=30) -> bool:
   selectors = [
       '[data-sitekey]',
       '.g-recaptcha',
       '.cf-turnstile',
       'iframe[src*="recaptcha"]',
       'iframe[src*="challenges.cloudflare.com"]'
   ]
  
   for selector in selectors:
       try:
           WebDriverWait(driver, timeout).until(
               EC.presence_of_element_located((By.CSS_SELECTOR, selector))
           )
           return True
       except:
           continue
   return False

Полный пример извлечения для 2Captcha:

python Copy
def get_captcha_sitekey_for_2captcha(driver, page_url: str) -> dict:
   result = {
       'sitekey': None,
       'type': None,
       'api_param': None,
       'error': None
   }
  
   if not wait_for_captcha(driver):
       result['error'] = 'CAPTCHA not found'
       return result
  
   sitekey = (
       extract_sitekey_selenium(driver) or
       extract_sitekey_from_iframe(driver) or
       extract_sitekey_js(driver)
   )
  
   if not sitekey:
       result['error'] = 'Sitekey not extracted'
       return result
  
   result['sitekey'] = sitekey
  
   page_source = driver.page_source.lower()
   if 'g-recaptcha' in page_source or 'recaptcha' in page_source:
       result['type'] = 'userrecaptcha'
       result['api_param'] = 'googlekey'
   elif 'cf-turnstile' in page_source or 'challenges.cloudflare.com' in page_source:
       result['type'] = 'turnstile'
       result['api_param'] = 'sitekey'
   elif 'geetest' in page_source:
       result['type'] = 'geetest_v4'
       result['api_param'] = 'gt'
   else:
       result['type'] = 'unknown'
  
   return result

Частые проблемы и решения

1. Капча ещё не загрузилась

Симптом: элемент не найден, поиск возвращает None.
Решение: использовать явные ожидания (WebDriverWait) и проверять несколько селекторов.

2. Капча внутри Shadow DOM

Симптом: виджет есть в DevTools, но не находится через стандартный поиск.
Решение: использовать JavaScript для обхода теневых границ:

python Copy
def find_in_shadow(driver, selector: str):
   return driver.execute_script(f'''
       function searchShadow(root, sel) {{
           const el = root.querySelector(sel);
           if (el) return el;
           for (const node of root.querySelectorAll('*')) {{
               if (node.shadowRoot) {{
                   const found = searchShadow(node.shadowRoot, sel);
                   if (found) return found;
               }}
           }}
           return null;
       }}
       return searchShadow(document, '{selector}');
   ''')

3. Несколько iframe на странице

Симптом: извлекается sitekey не от той капчи.
Решение: фильтровать iframe по домену и параметрам:

python Copy
def is_captcha_iframe(src: str) -> bool:
   captcha_domains = [
       'google.com/recaptcha',
       'recaptcha.net',
       'challenges.cloudflare.com'
   ]
   return any(domain in src for domain in captcha_domains)

4. Sitekey с лишними символами

Симптом: 2Captcha возвращает ERROR_INVALID_SITEKEY.
Решение: очищать значение перед использованием:

python Copy
import re


def clean_sitekey(key: str) -> str | None:
   if not key:
       return None
   cleaned = re.sub(r'[^A-Za-z0-9\-_]', '', key)
   return cleaned if len(cleaned) >= 20 else None

Чеклист перед отправкой в 2Captcha

Перед созданием задачи проверьте:

  • Sitekey извлечён и имеет длину 20,50 символов
  • В sitekey нет пробелов, переносов строк, HTML-сущностей
  • Тип капчи определён корректно (reCAPTCHA v2/v3, Turnstile и так далее)
  • URL страницы указан полностью с протоколом (https://)
  • Для reCAPTCHA используется параметр googlekey, для Turnstile — sitekey
  • Капча полностью загрузилась перед извлечением параметров

Итог

Автоматическое извлечение sitekey — важный этап интеграции с 2Captcha. Правильная реализация ускоряет автоматизацию, снижает ошибки из-за ручного ввода и помогает адаптироваться к изменениям в структуре страницы.

Основные источники sitekey: атрибут data-sitekey в HTML-виджете, параметр k в URL iframe, глобальные JavaScript-объекты, встроенные JSON-конфигурации.

Рекомендации для 2Captcha: используйте явные ожидания для динамического контента, реализуйте несколько методов извлечения с фолбэками, валидируйте sitekey перед отправкой в API, логируйте этапы извлечения для отладки.

После успешного извлечения sitekey и определения типа капчи формируйте задачу для API 2Captcha с корректными параметрами (method, googlekey или sitekey, pageurl, proxy). Это обеспечит стабильное решение капчи в автоматическом режиме.


Полезные ресурсы

Документация и API 2Captcha

  • https://2Captcha/api — официальная документация по REST API, методы создания и получения задач, коды ошибок
  • https://2Captcha/demo — тестовые страницы для проверки извлечения sitekey и отправки задач
  • https://2Captcha/blog — гайды, кейсы и обновления по настройке скриптов

Официальные репозитории

  • https://github.com/2captcha — организация GitHub с SDK, библиотеками и примерами кода для популярных языков

Поддержка 2Captcha

Если возникла проблема, которую не удалось решить:

  1. Проверьте FAQ и статус API: https://2Captcha/support/faq
  2. Убедитесь, что баланс аккаунта положительный
  3. Создайте тикет в поддержку, приложите URL страницы с капчей, полный запрос и ответ API (без API-ключа) и скриншот элемента капчи из DevTools