Эта статья была полезной?
Как обойти 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
{
"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) ДО того, как капча загрузится.
Инструкция:
- Откройте страницу входа в режиме инкогнито и нажмите F12 (Инструменты разработчика).
- Перейдите на вкладку Console (Консоль).
- Вставьте следующий скрипт и нажмите Enter. Не обновляйте страницу после этого!
javascript
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)
- Выполните действие, которое вызывает капчу (например, введите email и пароль и нажмите кнопку входа).
- В консоли мгновенно появится JSON-объект с актуальными параметрами. Скопируйте их.
- Сразу же отправьте эти параметры в запросе на решение через API. Не обновляйте страницу, иначе параметры станут недействительными.
Примеры кода
Python + requests (Получение токена)
Используется для отправки задачи в API после того, как вы извлекли динамические параметры через консоль.
python
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
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
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. |
-
Полезные ссылки
- Песочница для тестирования API: https://2captcha.com/setting#sandbox
- Документация по Cloudflare Turnstile: https://2captcha.com/api-docs/turnstile
- Подробный гайд по отправке отчетов: https://2captcha.com/h/how-to-submit-reports
- Библиотека для Python: https://github.com/2captcha/2captcha-python