Эта статья была полезной?
Как автоматически извлекать 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
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
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
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
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
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
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
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
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
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
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
Если возникла проблема, которую не удалось решить:
- Проверьте FAQ и статус API: https://2Captcha/support/faq
- Убедитесь, что баланс аккаунта положительный
- Создайте тикет в поддержку, приложите URL страницы с капчей, полный запрос и ответ API (без API-ключа) и скриншот элемента капчи из DevTools