Расширенное руководство: Решение VK капчи

Расширенное руководство по решению VK капчи:скрипт обхода для опытных разработчиков

Мы заметили, что наши пользователи всё чаще сталкиваются с капчами, которые не решаются. Чаще всего это происходит из-за ошибок в параметрах. Основными причинами проблем являются плохие прокси, не совпадающий user-agent, а также неактуальный redirectUri. Чтобы исключить такие случаи, мы создали рабочий скрипт с подробными комментариями по каждому этапу, он наглядно продемонстрирует все этапы решения капчи.


Стартуем браузер с прокси

Сначала подключаем SeleniumBase и запускаем браузер через прокси. Важно, чтобы этот же прокси вы потом передали в запросе в API 2Captcha.

python Copy
import os

import time

from pprint import pprint

import requests

from selenium.webdriver.common.by import By

from seleniumbase import SB

from actual_proxy import *

url = "https://vk.com/"

proxy = proxy_russia # формат прокси "LOGIN:PASSWORD@ADDRESS:PORT"

login = '1053893238'

my_key = os.environ["APIKEY"]  # ваш ключ 2captcha

agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"

with SB(uc=False, proxy=proxy, locale_code='en') as sb:

    sb.set_window_position(0, 0)

    sb.set_window_size(1000, 800)

    sb.open(url)

На этом шаге мы фиксируем параметры окружения: URL, прокси и user-agent. Всё это потом используется и в браузере, и в API-запросе. Несоответствие значений является причиной большинства ошибок.

В строчке: login = '1053893238' мы присваиваем переменной любой валидный ID_VK для примера.


Переходим к форме авторизации

Далее нужно инициировать появление капчи. Для этого эмулируем обычный вход: нажимаем кнопку «Войти», выбираем способ авторизации, вводим логин и отправляем форму.

python Copy
    sb.click('#START_QR_PAGE > div > div.vkuiPanel__centered > div > button:nth-child(8) > span')

    try:

        sb.click("#ENTER_LOGIN_PAGE > div > form > div.PhoneMaskBuilder-module_phoneMaskBuilder__Xhp8T > div.vkuiSegmentedControl__host.vkuiSegmentedControl__sizeL.vkuiRootComponent__host > div > label:nth-child(3)")

    except:

        time.sleep(10)

    sb.type('input[name="login"]', login)

    sb.click('#ENTER_LOGIN_PAGE > div > form > button.vkuiInternalTappable.vkuiButton__host.vkuiButton__sizeL.vkuiButton__modePrimary.vkuiButton__appearanceAccent.vkuiButton__stretched.vkuiTappable__host.vkuiTappable__hasPointerNone.vkuiClickable__host.vkuiClickable__realClickable.vkuistyles__-focus-visible.vkuiRootComponent__host > span')

    time.sleep(10)

На этом шаге нам важно только одно: чтобы капча отобразилась. Если у вас хорошие прокси, то капча может не отобразиться с первого раза. В таком случае перезапустите скрипт или вручную сделайте несколько попыток входа подряд.


Извлекаем session_token

Когда появляется капча, мы переключаемся внутрь iframe и вытаскиваем session_token. В нашей документации этот параметр не используется, вместо него мы просим отправлять redirectUri, это не является ошибкой, оба параметра мы поддерживаем, но в этом примере мы будем использовать session_token.

python Copy
    frame = sb.find_element(By.TAG_NAME, 'iframe', timeout=30)

    print("Капчу вижу")

    sb.switch_to_frame(frame)

    token_sess = sb.execute_script('return window.init.data.session_token')

    print('token_session:', token_sess)

Этот токен и есть ключ к задаче. Без него мы не сможем корректно решить капчу.


Формируем запрос для 2Captcha

Теперь собираем payload. Здесь важно правильно разобрать прокси на части: логин, пароль, адрес и порт.

python Copy
    print("Wait solution...")

    data = {

        "clientKey": my_key,

        "task": {

            "type": "VKCaptchaTask",

            "userAgent": agent,

            "sessionToken": token_sess,

            "proxyType": "HTTP",

            "proxyAddress": proxy.split('@')[1].split(':')[0],

            "proxyPort": proxy.split('@')[1].split(':')[1],

            "proxyLogin": proxy.split('@')[0].split(':')[0],

            "proxyPassword": proxy.split('@')[0].split(':')[1]

        }

    }

    response = requests.post("https://api.2captcha.com/createTask", json=data).json()

    print(response)

Ответ должен содержать taskId. Это идентификатор, по которому мы потом будем получать результат.


Ждём готовое решение

Далее опрашиваем getTaskResult. Интервал между запросами можно варьировать, в нашем примере это 20 секунд. Рекомендуемый интервал запросов на получение решения - не чаще чем каждые 5 секунд, пока не получите ответ.

python Copy
    if response['errorId'] == 0:

        time.sleep(20)

        data = {

           "clientKey": my_key,

           "taskId": response['taskId']

        }

        result = requests.post(f"https://api.2captcha.com/getTaskResult", json=data).json()

        pprint(result)

Если всё собрано правильно, вы получите объект solution.


В результате у нас получился скрипт, который демонстрирует, как получить капчу ВК, снять с неё параметры, отправить запрос к API и получить решение.

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