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

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

Как обойти Tencent с использованием Playwright

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

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

Tencent Captcha — это защита на основе токенов, которая часто встречается на сайтах, использующих инфраструктуру Tencent Cloud. Главная особенность этой капчи при автоматизации заключается в том, что для её успешного решения недостаточно просто передать URL страницы. Критически важно указать точный URL скрипта капчи (captchaScript), а после получения ответа корректно внедрить сразу два параметра: ticket и randstr.

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

Что понадобится

  • Python 3.7 или выше
  • Установленный Playwright
  • Аккаунт и API-ключ от 2Captcha
  • URL целевой страницы с Tencent Captcha
  • Опционально: прокси, если сайт чувствителен к IP-адресам дата-центров

Шаг 1. Установка зависимостей

Установите необходимые библиотеки и браузеры Playwright:

bash Copy
pip install playwright 2captcha-python
playwright install chromium

Шаг 2. Инициализация браузера и поиск параметров

Начнём с открытия страницы и ожидания появления виджета. Для отладки используйте видимый режим headless=False.

python Copy
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://example.com/target-page-with-tencent")
    
    # Ожидание появления виджета или iframe Tencent Captcha
    page.wait_for_selector("#tcaptcha_iframe, #tcaptcha_popup, [data-tencent-captcha]")

Для решения нам понадобятся два критически важных параметра: appid и captchaScript.

Как найти appid

Обычно он хранится в атрибуте data-appid контейнера виджета или передаётся в JavaScript-коде инициализации. Также его можно найти во вкладке Network (Сеть) в запросах к captcha.qq.com или ssl.captcha.qq.com как параметр aid или appId.

Как найти captchaScript (ОБЯЗАТЕЛЬНО)

Внимание: Параметр captchaScript является обязательным для корректного решения Tencent Captcha через API. Без указания точного URL скрипта, который использует сайт, эмуляция окружения будет неверной, и капча не решится.

URL скрипта можно найти во вкладке Network, отфильтровав запросы по слову TCaptcha. Чаще всего сайты используют один из следующих популярных вариантов:

  1. https://turing.captcha.qcloud.com/TCaptcha.js (Standard / Default)
  2. https://ca.turing.captcha.qcloud.com/TCaptcha-global.js (Global CDN)
  3. https://global.captcha.gtimg.com/TCaptcha-global.js (Tencent Global CDN)
  4. https://captchacdn.tencentcloudcs.com/TCaptcha-global.js (Tencent Cloud CDN)

Если сайт использует кастомный домен, просто скопируйте полный URL скрипта из вкладки Network.

Шаг 3. Отправка задачи в API и получение токенов

Используем официальный Python SDK. Он автоматически создаёт задачу и опрашивает сервер до получения результата.

python Copy
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('ВАШ_API_КЛЮЧ')

result = solver.tencent(
    appid='2047454578', # Замените на реальный appid
    url='https://example.com/target-page-with-tencent',
    captchaScript='https://turing.captcha.qcloud.com/TCaptcha.js' # Обязательно укажите правильный URL
)

print(f"Результат: {result}")
# Результат содержит 'code' (это ticket) и 'randstr'

Примечание: Если вы предпочитаете асинхронный код, ознакомьтесь с официальным примером использования асинхронных опций в репозитории: async_tencent_options.py (https://github.com/2captcha/2captcha-python/blob/master/examples/async/async_tencent_options.py).

Альтернатива (прямой HTTP-запрос через curl):

bash Copy
curl -X POST https://api.2captcha.com/createTask \
  -H "Content-Type: application/json" \
  -d '{
    "clientKey": "ВАШ_API_КЛЮЧ",
    "task": {
      "type": "TencentCaptchaTaskProxyless",
      "websiteURL": "https://example.com/target-page-with-tencent",
      "appID": "2047454578",
      "captchaScript": "https://turing.captcha.qcloud.com/TCaptcha.js"
    }
  }'

Шаг 4. Внедрение токенов в форму

Tencent Captcha возвращает два значения: ticket (основной токен) и randstr (дополнительная строка для валидации). Оба значения необходимо внедрить на страницу.

Обычно сайты ожидают вызова JavaScript-колбэка, который передаёт эти данные обратно в виджет.

python Copy
ticket = result['code']
randstr = result.get('randstr', '@') # Если randstr нет, иногда используют '@'

page.evaluate(f"""
    // 1. Внедряем токены в скрытые поля формы (если сайт использует классическую отправку)
    const form = document.querySelector('form');
    
    let ticketField = form.querySelector('input[name="ticket"], input[name="tc_token"]');
    if (!ticketField) {{
        ticketField = document.createElement('input');
        ticketField.type = 'hidden';
        ticketField.name = 'ticket';
        form.appendChild(ticketField);
    }}
    ticketField.value = "{ticket}";

    let randstrField = form.querySelector('input[name="randstr"]');
    if (!randstrField) {{
        randstrField = document.createElement('input');
        randstrField.type = 'hidden';
        randstrField.name = 'randstr';
        form.appendChild(randstrField);
    }}
    randstrField.value = "{randstr}";

    // 2. Вызываем callback-функцию (название может отличаться, проверьте код инициализации)
    // Часто это window.TencentCaptchaCallback или аналогичная функция
    if (typeof window.TencentCaptchaCallback === 'function') {{
        window.TencentCaptchaCallback({{
            ticket: "{ticket}",
            randstr: "{randstr}",
            code: 0
        }});
    }}
""")

Шаг 5. Отправка формы

После успешного внедрения токенов и срабатывания колбэка форма должна разблокироваться.

python Copy
page.click("button[type='submit']")
page.wait_for_load_state("networkidle")

browser.close()

Полный рабочий пример (Python)

python Copy
from playwright.sync_api import sync_playwright
from twocaptcha import TwoCaptcha

API_KEY = "ВАШ_API_КЛЮЧ"
TARGET_URL = "https://example.com/target-page-with-tencent"
APP_ID = "2047454578" # Замените на реальный
CAPTCHA_SCRIPT = "https://turing.captcha.qcloud.com/TCaptcha.js" # Замените на реальный URL скрипта

def solve_tencent_captcha():
    solver = TwoCaptcha(API_KEY)

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)
        page = browser.new_page()
        
        try:
            page.goto(TARGET_URL)
            page.wait_for_selector("#tcaptcha_iframe, #tcaptcha_popup, [data-appid]", timeout=10000)
            
            print("Отправка задачи в API...")
            
            # Решение капчи с обязательным указанием captchaScript
            result = solver.tencent(
                appid=APP_ID,
                url=TARGET_URL,
                captchaScript=CAPTCHA_SCRIPT
            )
            
            ticket = result['code']
            randstr = result.get('randstr', '@')
            print(f"Токен получен! Ticket: {ticket[:20]}..., Randstr: {randstr}")
            
            # Внедрение токенов и вызов колбэка
            page.evaluate(f"""
                const form = document.querySelector('form') || document.body;
                
                let ticketField = form.querySelector('input[name="ticket"], input[name="tc_token"]');
                if (!ticketField) {{
                    ticketField = document.createElement('input');
                    ticketField.type = 'hidden';
                    ticketField.name = 'ticket';
                    form.appendChild(ticketField);
                }}
                ticketField.value = "{ticket}";

                let randstrField = form.querySelector('input[name="randstr"]');
                if (!randstrField) {{
                    randstrField = document.createElement('input');
                    randstrField.type = 'hidden';
                    randstrField.name = 'randstr';
                    form.appendChild(randstrField);
                }}
                randstrField.value = "{randstr}";

                if (typeof window.TencentCaptchaCallback === 'function') {{
                    window.TencentCaptchaCallback({{
                        ticket: "{ticket}",
                        randstr: "{randstr}",
                        code: 0
                    }});
                }}
            """)
            
            # Попытка отправки формы
            submit_btn = page.locator("button[type='submit'], input[type='submit']").first
            if submit_btn.is_visible():
                submit_btn.click()
                page.wait_for_load_state("networkidle")
                print("Форма успешно отправлена!")
            else:
                print("Кнопка отправки не найдена или форма уже обработана колбэком.")
                
            page.wait_for_timeout(3000) # Пауза для визуальной проверки
            
        except Exception as e:
            print(f"Ошибка: {e}")
        finally:
            browser.close()

if __name__ == "__main__":
    solve_tencent_captcha()

Решение частых проблем

Проблема Причина и решение
Капча не решается или возвращает ошибку поведения Вы не указали параметр captchaScript или указали неверный URL. Это самая частая ошибка. Проверьте вкладку Network и убедитесь, что URL скрипта совпадает с тем, что загружает сайт.
AppID не находится (возвращает None) Виджет загружается внутри динамического iframe. Перейдите во вкладку Network, отфильтруйте по aid или appId и извлеките значение из URL запроса к серверам Tencent.
Форма не отправляется после вставки токена Сайт ожидает вызова специфической callback-функции. Проверьте исходный код страницы (поиск по new TencentCaptcha или TencentCaptchaCallback) и вызовите нужную функцию через page.evaluate, передав объект с ticket и randstr.
Скрипт работает в видимом режиме, но падает в headless Это детекция headless-режима антибот-системой. Используйте библиотеки для маскировки (например, playwright-stealth) или передавайте в API качественные резидентские прокси.

Заключение

Автоматизация прохождения Tencent Captcha в Playwright требует внимания к деталям. В отличие от некоторых других капч, здесь критически важно не только найти appid, но и обязательно передать правильный URL captchaScript. Без этого эмуляция окружения будет неполной, и защита заблокирует решение.

Получив от API пару значений ticket и randstr, необходимо корректно внедрить их как в скрытые поля формы, так и через JavaScript-колбэк, который ожидает конкретный сайт. Следуя этому руководству и внимательно проверяя сетевые запросы целевой страницы, вы сможете надёжно обходить Tencent Captcha в ваших проектах автоматизации.

Полезные ссылки