*bypass - обход
Мы будем использовать библиотеку python Selenium для байпаса google reCaptcha v3. Следуйте пошаговой инструкции, чтобы получить результат.
Для примера мы будем использовать демо-версию Google reCaptcha api.
![](https://habrastorage.org/getpro/habr/upload_files/23e/a24/f8e/23ea24f8e571cd6f728a5c4f77c535a1.png)
Сначала необходимо отключить настройку защиты контента в браузере Chrome.
Для этого зайдите в Настройки в Chrome. И напишите "настройки сайта" в строке поиска.
![](https://habrastorage.org/getpro/habr/upload_files/579/b28/fcf/579b28fcfa7283ea373f133747167791.png)
Перейдите в настройки сайта и найдите "Защищенный контент".
![](https://habrastorage.org/getpro/habr/upload_files/b1b/f4d/226/b1bf4d226355fb41a849f7a7eb8c9d36.png)
Перейдите к защищенному контенту и отключите его.
![](https://habrastorage.org/getpro/habr/upload_files/53f/5dd/177/53f5dd177703701103eba71c031a59d2.png)
Теперь перейдем к части кодирования.
В этой статье мы будем работать с Python 3. Мы будем использовать две библиотеки. Если вы хотите настроить Selenium и узнать, как это сделать - изучите эту статью.
Двигаемся дальше,
Установите библиотеку Beautiful Soup для скрипта.
pip install beautifulsoup4
Откройте файл-скрипт и импортируйте в него упомянутые библиотеки.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from http_request_randomizer.requests.proxy.requestProxy
import RequestProxy
import os, sys
import time,requests
from bs4 import BeautifulSoup
Установите "delayTime" и "audioToTextDelay" в соответствии с вашей скоростью интернета. Установленные значения работают для всех.
delayTime = 2
audioToTextDelay = 10
byPassUrl - это URL, на который вам нужно ориентироваться. Опция используется для выбора драйвера chrome, и ей передаются некоторые аргументы.
filename = ‘1.mp3’
byPassUrl = ‘https://www.google.com/recaptcha/api2/demo'
googleIBMLink = ‘https://speech-to-text-demo.ng.bluemix.net/'
option = webdriver.ChromeOptions()
option.add_argument('--disable-notifications')
option.add_argument("--mute-audio")
Остальная часть кода приведена ниже. Теперь я объясню, как это работает.
Когда скрипт запускается, проверяется поле I'm not a robot.
![](https://habrastorage.org/getpro/habr/upload_files/e12/d17/c9a/e12d17c9ac9a19eb89dea6d3b54ce224.png)
И дальше все появляется (как обычно).
![](https://habrastorage.org/getpro/habr/upload_files/d5c/697/777/d5c6977774d18bc13a138026f5bb89d6.png)
После по скрипту выбирается кнопка аудио внизу слева.
![](https://habrastorage.org/getpro/habr/upload_files/dd6/685/908/dd6685908bab300f25e41726fbac878b.png)
И появляется вот это. После этого загружается аудио с именем "1.mp3".
![](https://habrastorage.org/getpro/habr/upload_files/fbe/93d/778/fbe93d778f0065e5acee02751617e9f3.png)
Это займет несколько секунд, не волнуйтесь. После этого в браузере откроется новая вкладка, которая перейдет от речи watson к конвертеру в текст и загрузит файл.
![](https://habrastorage.org/getpro/habr/upload_files/7f4/c12/c3c/7f4c12c3ce65419fc184616c5322a17b.png)
Как видите, аудиофайл преобразуется в текст. Он копирует текст и вставляет его в текстовое поле.
![](https://habrastorage.org/getpro/habr/upload_files/3b0/8f9/b0d/3b08f9b0d008df2930e0e73dca9435cc.png)
И далее нажимается кнопка "Проверить".
![](https://habrastorage.org/getpro/habr/upload_files/71d/333/ac7/71d333ac7768cfb8d9fc1751716557e2.png)
Вот, смотрите... Проблема решена. Если у вас есть какие-либо проблемы и вопросы, пишите. Я отвечу на них как только смогу.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from http_request_randomizer.requests.proxy.requestProxy
import RequestProxy
import os, sys
import time,requests
from bs4 import BeautifulSoup
delayTime = 2
audioToTextDelay = 10
filename = '1.mp3'
byPassUrl = 'https://www.google.com/recaptcha/api2/demo'
googleIBMLink = 'https://speech-to-text-demo.ng.bluemix.net/'
option = webdriver.ChromeOptions()
option.add_argument('--disable-notifications')
option.add_argument("--mute-audio")
# option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
option.add_argument("user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
def audioToText(mp3Path):
print("1")
driver.execute_script('''window.open("","_blank");''')
driver.switch_to.window(driver.window_handles[1])
print("2")
driver.get(googleIBMLink)
delayTime = 10
# Upload file
time.sleep(1)
print("3")
# Upload file
time.sleep(1)
root = driver.find_element_by_id('root').find_elements_by_class_name('dropzone _container _container_large')
btn = driver.find_element(By.XPATH, '//*[@id="root"]/div/input')
btn.send_keys('C:/Users/AbdulBasit/Documents/google-captcha-bypass/1.mp3')
# Audio to text is processing
time.sleep(delayTime)
#btn.send_keys(path)
print("4")
# Audio to text is processing
time.sleep(audioToTextDelay)
print("5")
text = driver.find_element(By.XPATH, '//*[@id="root"]/div/div[7]/div/div/div').find_elements_by_tag_name('span')
print("5.1")
result = " ".join( [ each.text for each in text ] )
print("6")
driver.close()
driver.switch_to.window(driver.window_handles[0])
print("7")
return result
def saveFile(content,filename):
with open(filename, "wb") as handle:
for data in content.iter_content():
handle.write(data)
driver = webdriver.Chrome(ChromeDriverManager().install(), options=option)
driver.get(byPassUrl)
time.sleep(1)
googleClass = driver.find_elements_by_class_name('g-recaptcha')[0]
time.sleep(2)
outeriframe = googleClass.find_element_by_tag_name('iframe')
time.sleep(1)
outeriframe.click()
time.sleep(2)
allIframesLen = driver.find_elements_by_tag_name('iframe')
time.sleep(1)
audioBtnFound = False
audioBtnIndex = -1
for index in range(len(allIframesLen)):
driver.switch_to.default_content()
iframe = driver.find_elements_by_tag_name('iframe')[index]
driver.switch_to.frame(iframe)
driver.implicitly_wait(delayTime)
try:
audioBtn = driver.find_element_by_id('recaptcha-audio-button') or driver.find_element_by_id('recaptcha-anchor')
audioBtn.click()
audioBtnFound = True
audioBtnIndex = index
break
except Exception as e:
pass
if audioBtnFound:
try:
while True:
href = driver.find_element_by_id('audio-source').get_attribute('src')
response = requests.get(href, stream=True)
saveFile(response,filename)
response = audioToText(os.getcwd() + '/' + filename)
print(response)
driver.switch_to.default_content()
iframe = driver.find_elements_by_tag_name('iframe')[audioBtnIndex]
driver.switch_to.frame(iframe)
inputbtn = driver.find_element_by_id('audio-response')
inputbtn.send_keys(response)
inputbtn.send_keys(Keys.ENTER)
time.sleep(2)
errorMsg = driver.find_elements_by_class_name('rc-audiochallenge-error-message')[0]
if errorMsg.text == "" or errorMsg.value_of_css_property('display') == 'none':
print("Success")
break
except Exception as e:
print(e)
print('Caught. Need to change proxy now')
else:
print('Button not found. This should not happen.')
Всех читателей нашего блога приглашаем ознакомиться с курсами по тестированию от OTUS.