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

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

Как обойти Cloudflare Challenge на VFS Global

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

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

Введение

VFS Global — крупнейший оператор визовых центров, использующий Cloudflare Turnstile для защиты форм входа и регистрации от автоматизации. В отличие от стандартных реализаций, VFS Global использует динамические параметры (data, pagedata, action), которые генерируются при каждом взаимодействии с формой.

В этом руководстве мы разберем, как перехватить эти динамические параметры с помощью специального скрипта, решить капчу через API 2Captcha и корректно внедрить токен на страницу с использованием callback-функции.

Параметры задачи

Для обхода Cloudflare Turnstile используется тип задачи TurnstileTask. Для VFS Global критически важно передавать не только sitekey, но и динамические параметры, а также точный User-Agent.

json Copy
{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "TurnstileTaskProxyless",
        "websiteURL": "https://visa.vfsglobal.com/tur/en/fra/login",
        "websiteKey": "0x4AAAAAAAAjq6WYeRDKmebM",
        "data": "dynamic_data_string_here",
        "pagedata": "dynamic_pagedata_string_here",
        "action": "login",
        "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
    }
}

Как найти параметры

websiteURL

Полный адрес страницы с капчей. Например: https://visa.vfsglobal.com/tur/en/fra/login

websiteKey (sitekey)

Публичный ключ Cloudflare Turnstile. Для указанного сайта VFS Global он равен: 0x4AAAAAAAAjq6WYeRDKmebM

Динамические параметры (data, pagedata, action, userAgent)

Эти параметры меняются при каждой загрузке страницы. Чтобы их получить, необходимо внедрить специальный скрипт перехвата в консоль браузера (DevTools) ДО того, как капча загрузится.

Инструкция:

  1. Откройте страницу входа в режиме инкогнито и нажмите F12 (Инструменты разработчика).
  2. Перейдите на вкладку Console (Консоль).
  3. Вставьте следующий скрипт и нажмите Enter. Не обновляйте страницу после этого!
javascript Copy
const i = setInterval(()=>{
    if (window.turnstile) {
        clearInterval(i)
        window.turnstile.render = (a,b) => {
            let p = {
                type: "TurnstileTaskProxyless",
                websiteKey: b.sitekey,
                websiteURL: window.location.href,
                data: b.cData,
                pagedata: b.chlPageData,
                action: b.action,
                userAgent: navigator.userAgent
            }
            console.log(JSON.stringify(p))
            window.tsCallback = b.callback
            return 'foo'
        }
    }
}, 10)
  1. Выполните действие, которое вызывает капчу (например, введите email и пароль и нажмите кнопку входа).
  2. В консоли мгновенно появится JSON-объект с актуальными параметрами. Скопируйте их.
  3. Сразу же отправьте эти параметры в запросе на решение через API. Не обновляйте страницу, иначе параметры станут недействительными.

Примеры кода

Python + requests (Получение токена)

Используется для отправки задачи в API после того, как вы извлекли динамические параметры через консоль.

python Copy
import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

from twocaptcha import TwoCaptcha

api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
solver = TwoCaptcha(api_key)

try:
    result = solver.turnstile(
        sitekey='0x4AAAAAAAAjq6WYeRDKmebM',
        url='https://visa.vfsglobal.com/tur/en/fra/login',
        action='login',
        data='извлеченное_значение_data',
        pagedata='извлеченное_значение_pagedata',
        user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
    )
    print(f"Токен успешно получен: {result['code']}")
    
except Exception as e:
    print(f"Произошла ошибка: {e}")

Python + Selenium (Автоматизация с внедрением)

Адаптированный скрипт на основе предоставленного файла. Использует seleniumbase Driver (undetected-chromedriver) для обхода базовой детекции, перехватывает параметры и внедряет токен через callback-функцию.

python Copy
import time
import chromedriver_autoinstaller_fix
import requests
from seleniumbase import Driver
from selenium.webdriver.common.by import By

chromedriver_autoinstaller_fix.install()

agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
# Подставляем свой userAgent для безголовой версии
driver = Driver(uc=True, headless=False, proxy=False, agent=agent)

url = 'https://visa.vfsglobal.com/tur/en/fra/login'
driver.delete_all_cookies()
# Запускаем драйвер с задержкой, что позволяет обмануть турникет
driver.uc_open_with_reconnect(url, reconnect_time=20)
time.sleep(5)

# Закрываем баннер cookies, если он есть
try:
    driver.find_element(By.CLASS_NAME, "onetrust-close-btn-handler.onetrust-close-btn-ui.banner-close-button.ot-close-icon").click()
    time.sleep(2)
except:
    pass

# Вводим данные для вызова капчи
driver.find_element(By.ID, "mat-input-0").send_keys("alter_shmalter@gmail.com")
time.sleep(1)
driver.find_element(By.ID, "mat-input-1").send_keys("numbers12345")
time.sleep(3)

# Внедряем скрипт перехвата ПЕРЕД тем, как капча загрузится
intercept_script = """
const i = setInterval(()=>{
    if (window.turnstile) {
        clearInterval(i)
        window.turnstile.render = (a,b) => {
            let p = {
                type: "TurnstileTaskProxyless",
                websiteKey: b.sitekey,
                websiteURL: window.location.href,
                data: b.cData,
                pagedata: b.chlPageData,
                action: b.action,
                userAgent: navigator.userAgent
            }
            console.log("CAPTCHA_PARAMS:", JSON.stringify(p))
            window.tsCallback = b.callback
            return 'foo'
        }
    }
}, 10)
"""
driver.execute_script(intercept_script)

# Нажимаем кнопку, которая триггерит капчу (адаптируйте селектор под актуальную версию сайта)
driver.find_element(By.XPATH, "//button[@type='submit']").click()
time.sleep(5)

# Извлекаем параметры из консоли (в реальном скрипте их лучше перехватывать через performance logs)
# Для примера предположим, что мы их уже знаем или извлекли
sitekey = "0x4AAAAAAAAjq6WYeRDKmebM"
user_agent = driver.get_user_agent()

my_key = "YOUR_2CAPTCHA_KEY"

# Отправляем задачу на решение
data = {
    "key": my_key,
    "method": "turnstile",
    "sitekey": sitekey,
    "json": 1,
    "pageurl": url,
    "useragent": user_agent,
    # Добавьте сюда data, pagedata, action, если они требуются для вашей версии сайта
}

response = requests.post("https://api.2captcha.com/in.php", data=data)
print("Отправлено на сервис:", response.text)
s = response.json()["request"]

# Ожидаем результат
time.sleep(15)
while True:
    solu = requests.get(f"https://api.2captcha.com/res.php?key={my_key}&action=get&json=1&id={s}").json()
    if solu["request"] == "CAPCHA_NOT_READY":
        print(solu["request"])
        time.sleep(10)
    elif "ERROR" in solu["request"]:
        print(solu["request"])
        driver.quit()
        exit(0)
    else:
        break

token = solu["request"]
print("Токен получен:", token)

# Внедряем токен с помощью callback-функции, которую мы сохранили в window.tsCallback
driver.execute_script(f"window.tsCallback('{token}');")

# Дополнительно снимаем атрибут disabled с кнопки, если она осталась заблокированной
try:
    el = driver.find_element(By.XPATH, "//button[@type='submit']")
    driver.execute_script("arguments[0].removeAttribute('disabled')", el)
except:
    pass

time.sleep(2)

# Проверка внедрения
resp = driver.execute_script("return turnstile.getResponse();")
print("Ответ turnstile.getResponse():", resp)
print("Ответ вставлен")

time.sleep(10)
driver.quit()

Отчеты о правильности решения

Если сайт отклонил полученный токен, обязательно сообщите об этом через метод reportIncorrect. Это помогает сервису улучшать алгоритмы и возвращает вам средства за неудачную попытку. Если токен успешно прошел проверку, отправьте reportCorrect.

Отправить отчет можно через API:

python Copy
import requests

API_KEY = "YOUR_API_KEY"
TASK_ID = "123456789"

# Отчет о неверном решении
requests.post(
    "https://api.2captcha.com/reportIncorrect",
    json={"clientKey": API_KEY, "taskId": TASK_ID}
)

# Отчет о правильном решении
requests.post(
    "https://api.2captcha.com/reportCorrect",
    json={"clientKey": API_KEY, "taskId": TASK_ID}
)

Подробный гайд по отправке отчетов с примерами для разных языков: https://2captcha.com/h/how-to-submit-reports

Частые ошибки и решения

Ошибка / Проблема Причина Решение
ERROR_CAPTCHA_UNSOLVABLE Отсутствуют или неверны динамические параметры (data, pagedata, action) или User-Agent. Используйте скрипт перехвата для получения актуальных параметров. Убедитесь, что userAgent в задаче точно совпадает с userAgent браузера.
Токен получен, но сайт не пускает Неправильное внедрение токена или истекшее время жизни параметров. Используйте вызов window.tsCallback('токен') сразу после получения решения. Не обновляйте страницу между перехватом параметров и отправкой запроса.
Ошибка при поиске элементов Сайт обновил верстку или защитные механизмы. Проверьте актуальные XPath или CSS-селекторы через DevTools. Увеличьте время ожидания или используйте явные ожидания (WebDriverWait).
ERROR_WRONG_USER_KEY Неверный API-ключ. Проверьте, что вы используете правильный ключ из личного кабинета 2Captcha.