uncaptcha2/run.py

163 lines
5.2 KiB
Python

import time
import pyautogui
import speech_recognition as sr
import os
import subprocess
from queryAPI import bing, google, ibm
''' You'll need to update based on the coordinates of your setup '''
FIREFOX_ICON_COORDS = (25, 67) # Location of the Firefox icon on the side toolbar (to left click)
PRIVATE_COORDS = (178, 69) # Location of "Open a new Private Window"
PRIVATE_BROWSER = (800, 443) # A place where the background of the Private Window will be
PRIVATE_COLOR = '#25003E' # The color of the background of the Private Window
SEARCH_COORDS = (417, 142) # Location of the Firefox Search box
REFRESH_COORDS = (181, 137) # Refresh button
GOOGLE_LOCATION = (117, 104) # Location of the Google Icon after navigating to google.com/recaptcha/api2/demo
GOOGLE_COLOR = '#C3D8FC' # Color of the Google Icon
CAPTCHA_COORDS = (154, 531) # Coordinates of the empty CAPTCHA checkbox
CHECK_COORDS = (158, 542) # Location where the green checkmark will be
CHECK_COLOR = '#35B178' # Color of the green checkmark
AUDIO_COORDS = (258, 797) # Location of the Audio button
DOWNLOAD_COORDS = (318, 590) # Location of the Download button
FINAL_COORDS = (315, 534) # Text entry box
VERIFY_COORDS = (406, 647) # Verify button
CLOSE_LOCATION = (1095, 75)
DOWNLOAD_LOCATION = "../Downloads/"
''' END SETUP '''
r = sr.Recognizer()
def runCommand(command):
''' Run a command and get back its output '''
proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
return proc.communicate()[0].split()[0]
def waitFor(coords, color):
''' Wait for a coordinate to become a certain color '''
pyautogui.moveTo(coords)
numWaitedFor = 0
while color != runCommand("eval $(xdotool getmouselocation --shell); xwd -root -silent | convert xwd:- -depth 8 -crop \"1x1+$X+$Y\" txt:- | grep -om1 '#\w\+'"):
time.sleep(.1)
numWaitedFor += 1
if numWaitedFor > 25:
return -1
return 0
def downloadCaptcha():
''' Navigate to demo site, input user info, and download a captcha. '''
print("Opening Firefox")
pyautogui.moveTo(FIREFOX_ICON_COORDS)
pyautogui.rightClick()
time.sleep(.3)
pyautogui.moveTo(PRIVATE_COORDS)
pyautogui.click()
time.sleep(.5)
if waitFor(PRIVATE_BROWSER, PRIVATE_COLOR) == -1: # Wait for browser to load
return -1
print("Visiting Demo Site")
pyautogui.moveTo(SEARCH_COORDS)
pyautogui.click()
pyautogui.typewrite('https://www.google.com/recaptcha/api2/demo')
pyautogui.press('enter')
time.sleep(.5)
# Check if the page is loaded...
pyautogui.moveTo(GOOGLE_LOCATION)
if waitFor(GOOGLE_LOCATION, GOOGLE_COLOR) == -1: # Waiting for site to load
return -1
print("Downloading Captcha")
pyautogui.moveTo(CAPTCHA_COORDS)
pyautogui.click()
time.sleep(4)
pyautogui.moveTo(CHECK_COORDS)
if CHECK_COLOR in runCommand("eval $(xdotool getmouselocation --shell); xwd -root -silent | convert xwd:- -depth 8 -crop \"1x1+$X+$Y\" txt:- | grep -om1 '#\w\+'"):
print ("Already completed captcha.")
return 2
pyautogui.moveTo(AUDIO_COORDS)
pyautogui.click()
time.sleep(2)
pyautogui.moveTo(DOWNLOAD_COORDS)
pyautogui.click()
time.sleep(3)
return 0
def checkCaptcha():
''' Check if we've completed the captcha successfully. '''
pyautogui.moveTo(CHECK_COORDS)
if CHECK_COLOR in runCommand("eval $(xdotool getmouselocation --shell); xwd -root -silent | convert xwd:- -depth 8 -crop \"1x1+$X+$Y\" txt:- | grep -om1 '#\w\+'"):
print ("Successfully completed captcha.")
output = 1
else:
print("An error occured.")
output = 0
pyautogui.moveTo(CLOSE_LOCATION)
pyautogui.click()
return output
def runCap():
try:
print("Removing old files...")
os.system('rm ./audio.wav 2>/dev/null') # These files may be left over from previous runs, and should be removed just in case.
os.system('rm ' + DOWNLOAD_LOCATION + 'audio.mp3 2>/dev/null')
# First, download the file
downloadResult = downloadCaptcha()
if downloadResult == 2:
pyautogui.moveTo(CLOSE_LOCATION)
pyautogui.click()
return 2
elif downloadResult == -1:
pyautogui.moveTo(CLOSE_LOCATION)
pyautogui.click()
return 3
# Convert the file to a format our APIs will understand
print("Converting Captcha...")
os.system("echo 'y' | ffmpeg -i " + DOWNLOAD_LOCATION + "audio.mp3 ./audio.wav 2>/dev/null")
with sr.AudioFile('./audio.wav') as source:
audio = r.record(source)
print("Submitting To Speech to Text:")
determined = google(audio) # Instead of google, you can use ibm or bing here
print(determined)
print("Inputting Answer")
# Input the captcha
pyautogui.moveTo(FINAL_COORDS)
pyautogui.click()
time.sleep(.5)
pyautogui.typewrite(determined, interval=.05)
time.sleep(.5)
pyautogui.moveTo(VERIFY_COORDS)
pyautogui.click()
print("Verifying Answer")
time.sleep(2)
# Check that the captcha is completed
result = checkCaptcha()
return result
except Exception as e:
pyautogui.moveTo(CLOSE_LOCATION)
pyautogui.click()
return 3
if __name__ == '__main__':
success = 0
fail = 0
allowed = 0
# Run this forever and print statistics
while True:
res = runCap()
if res == 1:
success += 1
elif res == 2: # Sometimes google just lets us in
allowed += 1
else:
fail += 1
print("SUCCESSES: " + str(success) + " FAILURES: " + str(fail) + " Allowed: " + str(allowed))
pyautogui.moveTo(CLOSE_LOCATION)
pyautogui.click()