Расширенное руководство: Решение VK капчи
Мы заметили, что наши пользователи всё чаще сталкиваются с капчами, которые не решаются. Чаще всего это происходит из-за ошибок в параметрах. Основными причинами проблем являются плохие прокси, не совпадающий user-agent
, а также неактуальный redirectUri
. Чтобы исключить такие случаи, мы создали рабочий скрипт с подробными комментариями по каждому этапу, он наглядно продемонстрирует все этапы решения капчи.
Стартуем браузер с прокси
Сначала подключаем SeleniumBase и запускаем браузер через прокси. Важно, чтобы этот же прокси вы потом передали в запросе в API 2Captcha.
python
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
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
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
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
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 и получить решение.