Looking for international version of our service? Go to 2captcha.com

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

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

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

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

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

Введение

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

В этом руководстве мы разберем, как перехватить эти динамические параметры с помощью специального скрипта, решить капчу через API RuCaptcha и корректно внедрить токен на страницу с использованием 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("[email protected]")
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.rucaptcha.com/in.php", data=data)
print("Отправлено на сервис:", response.text)
s = response.json()["request"]

# Ожидаем результат
time.sleep(15)
while True:
    solu = requests.get(f"https://api.rucaptcha.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.rucaptcha.com/reportIncorrect",
    json={"clientKey": API_KEY, "taskId": TASK_ID}
)

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

Подробный гайд по отправке отчетов с примерами для разных языков: https://rucaptcha.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-ключ. Проверьте, что вы используете правильный ключ из личного кабинета RuCaptcha.