Эта статья была полезной?
Как обойти Rotate Slider капчу на сайте OOCL
Технический специалист
Введение
Rotate Slider капча — это продвинутый метод верификации, при котором пользователю необходимо повернуть изображение, чтобы совместить его с целевым фрагментом. Этот тип капчи активно используется на сайтах вроде OOCL.com для защиты от автоматизированного доступа. Ручное решение значительно замедляет рабочие процессы, но вы можете полностью автоматизировать его с помощью API site_name.
В этом руководстве мы разберем полный цикл обхода: от извлечения изображений из HTML5 Canvas до физического перемещения ползунка с помощью эмуляции мыши.
Параметры задачи
Для решения Rotate Slider капчи можно использовать метод rotate_slider (API V1) или тип задачи RotateSliderTask (API V2). В приведенном ниже рабочем примере используется API V1.
json
{
"method": "rotate_slider",
"key": "YOUR_API_KEY",
"body": "BASE64_MAIN_IMAGE",
"part1": "BASE64_FRAGMENT_IMAGE",
"json": 1
}
Как найти параметры (Извлечение изображений из Canvas)
В отличие от классических капч, изображения для Rotate Slider часто отрисовываются динамически внутри HTML-элементов canvas. Их нельзя просто скачать по прямой ссылке из вкладки Network.
Вместо этого мы извлекаем их напрямую из DOM-дерева с помощью JavaScript метода toDataURL():
- Основное изображение (фон, к которому нужно подстроить фрагмент) обычно находится в первом canvas: document.getElementsByTagName('canvas')[0].
- Изображение фрагмента (поворотная часть) находится во втором canvas: document.getElementsByTagName('canvas')[1].
После получения Data URL необходимо удалить префикс data:image/png;base64,, чтобы отправить в API чистую Base64 строку.
Пример кода (Python + SeleniumBase + PyAutoGUI)
Ниже приведен полный рабочий скрипт для обхода Rotate Slider CAPTCHA на сайте OOCL.com.
Скрипт использует SeleniumBase для управления браузером, извлекает изображения из canvas, отправляет их в API site_name, вычисляет точный угол поворота и использует pyautogui для физической эмуляции перетаскивания ползунка.
python
import base64
import json
import os
import random
import time
from pprint import pprint
import requests
from selenium.webdriver.common.by import By
from seleniumbase import SB
import pyautogui
my_key = "YOUR_API_KEY" # Укажите ваш API-ключ
url = "https://www.oocl.com/eng/ourservices/eservices/cargotracking/Pages/cargotracking.aspx"
# Инициализация браузера с обходом антибот-защит (undetected-chromedriver)
with SB(uc=True, headless=False, proxy=False, locale_code='en') as sb:
sb.set_window_position(0, 0)
sb.set_window_size(800, 800)
sb.uc_open_with_reconnect(url, 15)
print("Enter to site...")
try:
sb.click('button[id="allowAll"]') # Закрываем баннер cookies
except: pass
# Взаимодействие с сайтом для вызова капчи
sb.type("input[id='SEARCH_NUMBER']", "res")
sb.click("a[id='container_btn']")
time.sleep(10)
# Капча открывается в новой вкладке
sb.switch_to_window(sb.driver.window_handles[1])
sb.set_window_position(0, 0)
try:
# 1. Извлечение изображений из canvas
base64_1 = sb.execute_script("return document.getElementsByTagName('canvas')[0].toDataURL()")
base64_2 = sb.execute_script("return document.getElementsByTagName('canvas')[1].toDataURL()")
# Удаляем префикс data:image/png;base64,
base64_1 = base64_1.replace('data:image/png;base64,', '')
base64_2 = base64_2.replace('data:image/png;base64,', '')
print("IMAGES received")
# 2. Отправка изображений в API site_name
data = {
"method": "rotate_slider",
"key": my_key,
"body": base64_1,
"part1": base64_2,
"json": 1
}
response = requests.post(f"https://api.2captcha.com/in.php?", json=data)
print(response.text)
s = response.json()["request"]
# 3. Ожидание решения
time.sleep(7)
while True:
result = requests.post(f"https://api.2captcha.com/res.php?key={my_key}&action=get&json=1&id={s}").json()
if result['request'] == 'CAPCHA_NOT_READY':
print(result['request'])
time.sleep(3)
else:
break
pprint(result)
# 4. Вычисление угла поворота
position = float(result['request']['angle'])
center_x = int(result['request']['center'][0])
center_y = int(result['request']['center'][1])
point_circle = int(result['request']['point_circle'][1])
# Логика определения направления поворота (по или против часовой стрелки)
if (center_x <= 161 and point_circle > center_y) or (center_x > 161 and point_circle <= center_y):
angle = 360 - position
else:
angle = position
print("ANGLE:", angle)
# Коэффициент смещения пикселей (зависит от масштаба экрана, здесь для 125%)
point_stop = angle * 1.12
# 5. Эмуляция перетаскивания ползунка с помощью PyAutoGUI
arr = sb.find_element(By.CLASS_NAME, 'verify-bar-area')
arr_location = arr.location
# Отключаем Selenium, чтобы PyAutoGUI мог управлять мышью без конфликтов
sb.disconnect()
# Вычисляем координаты ползунка на экране
x = arr_location['x'] + 150 # Адаптировано для масштаба 125%
y = arr_location['y'] + 190 # Адаптировано для масштаба 125%
# Физическое перемещение мыши и перетаскивание
pyautogui.moveTo(x, y, duration=random.uniform(0.2, 1.2))
pyautogui.mouseDown(x, y)
pyautogui.moveTo(x + point_stop - 20, y + random.randint(-5, 5), duration=random.uniform(0.3, 1.9))
pyautogui.moveTo(x + point_stop, y + random.randint(-5, 5), duration=random.uniform(0.9, 2.1))
pyautogui.mouseUp()
# Уводим мышь в случайное место для имитации поведения человека
pyautogui.moveTo(random.randint(750, 1200), random.randint(450, 650), duration=random.uniform(0.9, 2.1))
time.sleep(5)
# Возвращаем управление Selenium
sb.connect()
except Exception as e:
print(e)
Обработка ответа и вычисление угла
В успешном ответе API поле request содержит не только базовый angle, но и массивы координат center и point_circle.
Сайты с Rotate Slider часто требуют поворота в строго определенном направлении. Приведенная в коде логика (if (center_x <= 161 ...) анализирует положение фрагмента относительно центра и определяет, нужно ли вычитать угол из 360 градусов, чтобы вращать ползунок в правильную сторону.
Почему используется PyAutoGUI вместо Selenium ActionChains?
Стандартные методы Selenium для перетаскивания элементов часто детектируются антибот-системами при взаимодействии с canvas. Библиотека pyautogui управляет физической мышью на уровне операционной системы, что делает действия неотличимыми от реального пользователя.
Важные нюансы использования PyAutoGUI:
- Браузер должен быть запущен в видимом режиме (headless=False).
- Необходимо учитывать масштабирование экрана (DPI). В приведенном коде коэффициенты (point_stop = angle * 1.12 и смещения x, y) рассчитаны для масштабирования Windows 125%. Если у вас 100% или 150%, эти значения потребуется адаптировать.
- На время работы PyAutoGUI управление Selenium отключается (sb.disconnect()), чтобы избежать конфликтов фокуса и координат.
Отчеты о правильности решения
Если сайт отклонил решение, обязательно сообщите об этом через метод reportIncorrect. Это помогает сервису улучшать алгоритмы и возвращает вам средства. Если решение успешно прошло проверку, отправьте reportCorrect.
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
Частые ошибки и решения
| Ошибка / Проблема | Причина | Решение |
|---|---|---|
| Ползунок перемещается не туда | Неверно рассчитаны координаты из-за масштаба экрана (DPI). | Адаптируйте множители point_stop и смещения x, y под ваш текущий масштаб экрана (100%, 125%, 150%). |
| ERROR_IMAGE_TYPE_NOT_SUPPORTED | Префикс data:image/png;base64, не был удален. | Убедитесь, что вы используете .replace('data:image/png;base64,', '') перед отправкой в API. |
| PyAutoGUI не кликает по ползунку | Конфликт между Selenium и системной мышью. | Убедитесь, что вы вызываете sb.disconnect() перед началом работы PyAutoGUI и sb.connect() после. |
| Ошибка при поиске canvas | Сайт обновил верстку или капча еще не загрузилась. | Увеличьте time.sleep() перед извлечением canvas или используйте явные ожидания появления элементов. |
Полезные ссылки
- Песочница для тестирования API: https://2captcha.com/setting#sandbox
- Документация по Rotate Slider CAPTCHA: https://2captcha.com/api-docs/rotate-captcha
- Подробный гайд по отправке отчетов: https://2captcha.com/h/how-to-submit-reports
- Библиотека для Python: https://github.com/2captcha/2captcha-python