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

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

Как обойти капчу на сайте Discord

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

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

Введение

При автоматизации регистрации или работе с аккаунтами Discord разработчики часто сталкиваются с визуальными капчами. В отличие от стандартных текстовых заданий, эта капча требует от пользователя кликать по определенным объектам на изображении или выбирать правильные картинки.

Автоматизировать такой тип защиты стандартными методами распознавания текста не получится. Нам нужно получить точные координаты объектов и кликнуть по ним. В этой статье разберем практический подход к решению клик-капчи Discord, используя SeleniumBase для управления браузером и API 2Captcha для получения координат.

Что понадобится

Для работы скрипта потребуются следующие библиотеки:

  • seleniumbase (с поддержкой UC-режима для обхода базовых детектов)
  • 2captcha-python (официальная библиотека для работы с API)

Установить их можно одной командой:

bash Copy
pip install seleniumbase 2captcha-python

Также вам потребуется API-ключ от 2Captcha и рабочий резидентский прокси, так как Discord строго блокирует датацентровые IP-адреса.

Логика решения

Процесс решения клик-капчи состоит из нескольких этапов:

  1. Находим элемент с изображением капчи и делаем его скриншот.
  2. Отправляем скриншот в 2Captcha через метод coordinates.
  3. Получаем ответ в формате списка координат (например, x=123,y=456).
  4. Корректируем координаты, добавляя к ним смещение самого элемента на странице.
  5. Кликаем по полученным точкам с помощью ActionChains.
  6. Кликаем по кнопке подтверждения в правом нижнем углу изображения.

Главная сложность здесь — это корректировка координат. API возвращает координаты относительно самого изображения, а Selenium кликает относительно всего окна браузера. Если не добавить смещение (location элемента), клики будут происходить в пустоту.

Разбор кода

Настройка браузера

Для запуска используем SeleniumBase в режиме UC (undetected chromedriver). Обязательно фиксируем размер окна, чтобы координаты всегда были предсказуемыми, и передаем User-Agent и прокси.

python Copy
from seleniumbase import SB

proxy = "your_residential_proxy:port"
agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

with SB(uc=True, headless=False, proxy=proxy, locale_code='en', agent=agent) as sb:
    sb.set_window_size(1282, 842)
    sb.open("https://discord.com/register")

Заполнение формы и вызов капчи

После открытия страницы заполняем поля регистрации и переключаемся в iframe с капчей, чтобы нажать на чекбокс.

python Copy
sb.type('input[name="email"]', "some_post2020_AA@gmail.com")
sb.type('input[name="global_name"]', "Jason_doorilo")
sb.type('input[name="username"]', "Adminbest3030")
sb.type('input[name="password"]', "Adm4512365874512547")

# Заполнение даты рождения
sb.driver.find_element(By.ID, "react-select-2-input").send_keys("10", Keys.ENTER)
sb.find_element(By.ID, "react-select-3-input").send_keys("11", Keys.ENTER)
sb.find_element(By.ID, "react-select-4-input").send_keys("2000", Keys.ENTER)

sb.sleep(7)

# Переход в iframe и клик по чекбоксу
sb.switch_to_frame('iframe[title="Widget containing checkbox for security challenge"]')
sb.click("#checkbox")
sb.reconnect(15)
sb.switch_to_default_content()

Функция решения капчи

Самая важная часть скрипта — функция, которая делает скриншот, отправляет его в API и кликает по координатам.

python Copy
import base64
import os
from io import BytesIO
from selenium.webdriver.common.action_chains import ActionChains
from twocaptcha import TwoCaptcha

def search_and_solve(sb, my_img):
    solver = TwoCaptcha(os.environ["APIKEY"])
    
    # Делаем скриншот и конвертируем в Base64
    screenshot = my_img.screenshot_as_png
    screenshot_bytes = BytesIO(screenshot)
    base64_screenshot = base64.b64encode(screenshot_bytes.getvalue()).decode('utf-8')
    
    # Получаем позицию и размер элемента
    element_position = my_img.location
    size = my_img.size
    
    try:
        print("Solve captcha...")
        # Отправляем картинку в 2Captcha
        result = solver.coordinates(base64_screenshot, lang='en')
    except Exception as e:
        print(e)
        return
        
    print("Captcha solved!")
    
    # Парсим ответ API
    coords_string = result['code'].split(':')[1].split(';')
    coordinates = [[int(val.split('=')[1]) for val in coord.split(',')] for coord in coords_string]
    
    # Корректируем координаты с учетом позиции элемента на странице
    for coord in coordinates:
        coord[0] = coord[0] + element_position['x']
        coord[1] = coord[1] + element_position['y']
        
    # Добавляем координату кнопки подтверждения (правый нижний угол)
    button_coord = [
        element_position['x'] + size['width'] - 30, 
        element_position['y'] + size['height'] - 15
    ]
    coordinates.append(button_coord)
    
    # Кликаем по координатам
    actions = ActionChains(sb.driver)
    print("Coordinates received:", coordinates)
    
    for coord in coordinates:
        actions.move_by_offset(coord[0], coord[1]).click().perform()
        sb.sleep(1) # Пауза между кликами
        actions.reset_actions() # Сброс накопленных действий
        
    sb.sleep(5)

Цикл ожидания прохождения

После клика по чекбоксу капча может появиться не сразу. Используем бесконечный цикл, который ищет изображение капчи и пытается её решить, пока она не исчезнет.

python Copy
while True:
    try:
        sb.sleep(1)
        # Ищем iframe с самим изображением капчи
        my_img = sb.find_element("body > div:nth-child(14) > div:nth-child(1) > iframe")
        print("CAPTCHA VISIBLE!!")
        search_and_solve(sb, my_img)
    except:
        print("CAPTCHA PASSED!!!!")
        break

sb.sleep(2)
# Дальнейший код регистрации...

Важные нюансы

Фиксированный размер окна

В коде используется sb.set_window_size(1282, 842). Это критически важно. Если размер окна будет меняться, смещение элемента (location) также изменится, и скорректированные координаты окажутся неверными.

Сброс ActionChains

В цикле кликов обязательно используется actions.reset_actions(). Если этого не сделать, Selenium будет накапливать смещения, и каждый следующий клик будет уходить всё дальше от нужной точки.

Паузы между действиями

Клик-капча Discord анализирует поведение мыши. Мгновенные клики без задержек выглядят как бот. Пауза в 1 секунду между кликами и 5 секунд перед проверкой результата значительно повышают шансы на успешное прохождение.

Тип капчи

Данный метод отлично решает стандартные клик-капчи (выбор объектов на картинке). Однако он не подходит для капч типа "удерживай и перетащи" (hold and drag), так как там требуется другая механика взаимодействия.

Отчеты о решении

Если капча не прошла, несмотря на правильные координаты, имеет смысл отправить отчет reportIncorrect в API 2Captcha. Это поможет сервису улучшить алгоритмы распознавания для ваших будущих запросов.

Полезные ссылки

Заключение

Прохождение визуальных капч Discord требует точной работы с координатами и правильного учета смещения элементов на странице. Использование метода coordinates от 2Captcha в связке с SeleniumBase и ActionChains позволяет полностью автоматизировать этот процесс. Главное — не забывать фиксировать размер окна, использовать качественные прокси и добавлять человеческие задержки между кликами.