Обход капчи Turnstile Challenge на Python и Selenium
Сервис 2Captcha помогает автоматически решать капчи Turnstile Challenge. Статья описывает процесс взаимодействия с API.
Материал полезен для python разработчиков, которые работают над проектами, требующими автоматизации задач, связанных с сайтами, защищенными Turnstile Challenge капчей.
Что такое Turnstile Challenge капча?
Turnstile — это Cloudflare капча, которая призвана блокировать ботов и автоматизированные системы. Она является простой в решении для обычных пользователей, но сложной для распознавания ботами и автоматическими системами.
Пример того как выгглядит Turnstile Challenge:
Подготовка к обходу капчи Turnstile
Прежде чем начать обход капчи Turnstile, необходимо подготовить рабочее окружение и инструменты. Для этого нам понадобятся:
- Python и библиотека SeleniumBase для автоматизации веб-браузера.
- 2captcha API ключ для решения капчи.
- Прокси (опционально), если требуется обходить капчу с различных IP-адресов.
Шаги обхода капчи Turnstile
1. Подключение необходимых библиотек и зависимостей:
Перед выполнением обхода капчи Turnstile требуется подключить необходимые библиотеки, такие как json, re, requests, seleniumbase, и time. Эти библиотеки используются для работы с данными в формате JSON, выполнения регулярных выражений, отправки HTTP-запросов, автоматизации браузера и добавления задержек в коде.
import json
import re
import requests
from seleniumbase import Driver
from selenium.webdriver.common.by import By
import time
2 Начало работы скрипта:
Этот шаг включает определение URL сайта, защищенного капчей Turnstile, установку прокси (при необходимости), API ключа 2captcha, установку актуального UserAgent, и настройку веб-драйвера для работы в режиме headless.
proxy = "xxxxxx:xxxxxx@xx.xxx.xxx.xx:xxxx" # YOUR_2CAPTCHA_PROXY
my_key = "your_2captcha_api_key"
# Установка актуального UserAgent
agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
# Настройка веб-драйвера для работы в безголовом режиме
driver = Driver(uc=True, log_cdp=True, headless=True, no_sandbox=True, agent=agent, proxy=False)
# URL сайта, защищенного капчей Turnstile
url = "URL сайта, защищенного капчей Turnstile"
driver.get(url)
time.sleep(5)
3. Перехват параметров капчи Turnstile:
Далее переопределяем метод turnstile.render и console.clear, чтобы выводить необходимые параметры капчи в консоль браузера. Также определяем callback функцию,
которая понадобится для отправки токена.
# Функция для перехвата параметров капчи с помощью JavaScript
def intercept(driver):
driver.execute_script("""
console.clear = () => console.log('Console was cleared')
const i = setInterval(()=>{
if (window.turnstile)
console.log('success!!')
{clearInterval(i)
window.turnstile.render = (a,b) => {
let params = {
sitekey: b.sitekey,
pageurl: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
json: 1
}
console.log('intercepted-params:' + JSON.stringify(params))
window.cfCallback = b.callback
return }
}
},50)
""")
time.sleep(1)
# Получение логов браузера, где будут содержаться перехваченные параметры
logs = driver.get_log("browser")
for log in logs:
if log['level'] == 'INFO':
if "intercepted-params:" in log["message"]:
log_entry = log["message"].encode('utf-8').decode('unicode_escape')
match = re.search(r'"intercepted-params:({.*?})"', log_entry)
json_string = match.group(1)
params = json.loads(json_string)
return params
4. Отправка параметров на сервер 2captcha API:
Получив необходимые параметры капчи, отправляем их на сервер 2captcha с помощью API запроса.
data0 = {"key": my_key,
"method": "turnstile ",
"sitekey": params["sitekey"],
"action": params["action"],
"data": params["data"],
"pagedata": params["pagedata"],
"useragent": params["userAgent"],
"json": 1,
"pageurl": params["pageurl"],
}
response = requests.post(f"https://2captcha.com/in.php?", data=data0)
print("Запрос отправлен", response.text)
s = response.json()["request"]
5. Использование результата решения капчи
После отправки запроса на сервер 2captcha, необходимо дождаться результата решения капчи. Делая запросы к серверу раз в 5-10 секунд , чтобы узнать, решена ли капча. Когда капча успешно решена, API вернёт токен, который нужно передать в callback-функцию скрипта для продолжения выполнения
while True:
solu = requests.get(f"https://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(8)
elif "ERROR" in solu["request"]:
print(solu["request"])
driver.close()
driver.quit()
exit(0)
else:
break
for key, value in solu.items():
print(key, ": ", value)
solu = solu['request']
driver.execute_script(f" cfCallback('{solu}');")
time.sleep(5)
6. Готово! Turnstile пройден и вы можете работать с сайтом дальше.
Полезные ссылки
- Тестовая страница Cloudflare Challenge
- Демо код для Turnstile CAPTCHA
- Python пример кода на GitHub
- JavaScript пример кода на GitHub
Если нужно обойти Cloudflare Turnstile (не Cloudflare Challenge) на любом сайте:
Остались вопросы?
Если после прочтения документации у вас остались вопросы по новому API, будем рады ответить и помочь:
Можно задать вопрос любым способом:
- Отправить письмо на support@2captcha.com
- Skype
- Создать тикет
Мы ценим отзывы и хотим убедиться, что сервис идеально подходит для ваших задач.