Эта статья была полезной?
Как обойти 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
pip install playwright 2captcha-python
playwright install chromium
Шаг 2. Инициализация браузера и поиск параметров
Начнём с открытия страницы и ожидания появления виджета. Для отладки используйте видимый режим headless=False.
python
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. Чаще всего сайты используют один из следующих популярных вариантов:
- https://turing.captcha.qcloud.com/TCaptcha.js (Standard / Default)
- https://ca.turing.captcha.qcloud.com/TCaptcha-global.js (Global CDN)
- https://global.captcha.gtimg.com/TCaptcha-global.js (Tencent Global CDN)
- https://captchacdn.tencentcloudcs.com/TCaptcha-global.js (Tencent Cloud CDN)
Если сайт использует кастомный домен, просто скопируйте полный URL скрипта из вкладки Network.
Шаг 3. Отправка задачи в API и получение токенов
Используем официальный Python SDK. Он автоматически создаёт задачу и опрашивает сервер до получения результата.
python
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
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
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
page.click("button[type='submit']")
page.wait_for_load_state("networkidle")
browser.close()
Полный рабочий пример (Python)
python
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 в ваших проектах автоматизации.
Полезные ссылки
- Документация API 2Captcha по Tencent Captcha: https://2captcha.com/api-docs/tencent-captcha
- Асинхронный пример на Python (GitHub): https://github.com/2captcha/2captcha-python/blob/master/examples/async/async_tencent_options.py
- Python SDK 2Captcha на GitHub: https://github.com/2captcha/2captcha-python