Sunday 10 June 2018

Auto Amulyam - Selenium

Amulyam
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from time import sleep
from pymsgbox import *
import traceback
import requests
import io
import random
import time
import os
import sys
from functools import reduce
# Speech Recognition Imports
from pydub import AudioSegment
import speech_recognition as sr

# Selenium
from selenium.common.exceptions import NoSuchElementException



# Randomization Related
MIN_RAND        = 0.64
MAX_RAND        = 1.27
LONG_MIN_RAND   = 4.78
LONG_MAX_RAND   = 6.1
NUMBER_OF_ITERATIONS = 5
RECAPTCHA_PAGE_URL = "https://www.google.com/recaptcha/api2/demo"

HOUNDIFY_CLIENT_ID = "IzKsCJiiW8nSTZHdTFg0PA=="
HOUNDIFY_CLIENT_KEY = "zLdwMYSaHud27N_V4Y7m_I78sM90ftEVy0p3A041dIkF-kJ8rp1hQJ-sPLPZu5svzPS8SG1LNXCO2rzsPoTItA=="
WIT_AI_KEY="JI5SZWSOEPZQRIZVUDDXNQ7TRYNKYQKS"


DIGITS_DICT = {
    "zero": "0",
    "one": "1",
    "two": "2",
    "three": "3",
    "four": "4",
    "five": "5",
    "six": "6",
    "seven": "7",
    "eight": "8",
    "nine": "9",
    "to": "2",
    "for": "4",
    "sex": "6",
    }
    
class rebreakcaptcha(object):
 def __init__(self,b):
  self.driver = b
  
 def is_exists_by_xpath(self, xpath):
  try:
   self.driver.find_element_by_xpath(xpath)
  except NoSuchElementException:
   return False
  return True
  
 def get_recaptcha_challenge(self):
  for _ in range(10):
   self.driver.switch_to.default_content()
   # self.b.get(RECAPTCHA_PAGE_URL)
   # Navigate to a ReCaptcha page
   # time.sleep(random.uniform(MIN_RAND, MAX_RAND))
   
   # Get all the iframes on the page
   iframes = self.driver.find_elements_by_css_selector("iframe[title^='recaptcha']")
   # Switch focus to ReCaptcha iframe
   self.driver.switch_to_frame(iframes[0])
   # time.sleep(random.uniform(MIN_RAND, MAX_RAND))
   
   # Verify ReCaptcha checkbox is present
   if not self.is_exists_by_xpath('//div[@class="recaptcha-checkbox-checkmark" and @role="presentation"]'):
    print("[{0}] No element in the frame!!".format(self.current_iteration))
    continue
   
   # Click on ReCaptcha checkbox
   self.driver.find_element_by_xpath('//div[@class="recaptcha-checkbox-checkmark" and @role="presentation"]').click()
   sleep(3)
   # time.sleep(random.uniform(LONG_MIN_RAND, LONG_MAX_RAND))  
   # Check if the ReCaptcha has no challenge
   if self.is_exists_by_xpath('//span[@aria-checked="true"]'):
    print("[{0}] ReCaptcha has no challenge.".format(self.current_iteration))
    return False
   else:
    return True
   
 def get_audio_challenge(self, iframes):
  # Switch to the last iframe (the new one)
  self.driver.switch_to_frame(iframes[-1])
  
  # Check if the audio challenge button is present
  if not self.is_exists_by_xpath('//button[@id="recaptcha-audio-button"]'):
   print("[{0}] No element of audio challenge!!".format(self.current_iteration))
   return False
  if not self.is_exists_by_xpath('//button[@id="recaptcha-audio-button"][@style="display: none;"]'):
   print("[{0}] Clicking on audio challenge".format(self.current_iteration))
   # Click on the audio challenge button
   self.driver.find_element_by_xpath('//button[@id="recaptcha-audio-button"]').click()
   # time.sleep(random.uniform(LONG_MIN_RAND, LONG_MAX_RAND))
   sleep(3)
  else:
   print('Already opened')
 
 def get_challenge_audio(self, url):
  request = requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
  audio_file = io.BytesIO(request.content)
  
  # Convert the audio to a compatible format in memory
  converted_audio = io.BytesIO()
  sound = AudioSegment.from_mp3(audio_file)
  sound.export(converted_audio, format="wav")
  converted_audio.seek(0)
  
  return converted_audio
  
  
 def string_to_digits(self, recognized_string):
  print (''.join([DIGITS_DICT.get(word, "|{}|".format(word)) for word in recognized_string.split(" ")]))
  return ''.join([DIGITS_DICT.get(word, "") for word in recognized_string.split(" ")])
 
 def speech_to_text(self, audio_source):
  # Initialize a new recognizer with the audio in memory as source
  recognizer = sr.Recognizer()
  with sr.AudioFile(audio_source) as source:
   audio = recognizer.record(source) # read the entire audio file

  audio_output = ""
  # recognize speech using Google Speech Recognition
  try:
   audio_output = recognizer.recognize_google(audio)
   print("[{0}] Google Speech Recognition: ".format(self.current_iteration) + audio_output)
   if any(character.isalpha() for character in audio_output):audio_output = ""
    
  except sr.UnknownValueError as e:
   print("[{0}] Google Speech Recognition could not understand audio".format(self.current_iteration))
   audio_output = ""

  except sr.RequestError as e:
   print("[{0}] Could not request results from Google Speech Recognition service; {1}".format(self.current_iteration).format(e))
   audio_output = ""
  try:
   if audio_output=='':
    print("[{0}] Fallback to Houndify!".format(self.current_iteration))
    _=4
    _=None
    if _ :
     audio_output = self.string_to_digits(recognizer.recognize_houndify(audio, client_id=HOUNDIFY_CLIENT_ID, client_key=HOUNDIFY_CLIENT_KEY))
    else:
     print('Witty')
     audio_output = self.string_to_digits(recognizer.recognize_wit(audio, key=WIT_AI_KEY))
    print("[{0}] Houndify: ".format(self.current_iteration) + audio_output)
  except sr.UnknownValueError:
   print("Houndify could not understand audio")
  except sr.RequestError as e:
   print("Could not request results from Houndify service; {0}".format(e))   

  return audio_output

 def solve_audio_challenge(self):
  # Verify audio challenge download button is present
  if not self.is_exists_by_xpath('//a[@class="rc-audiochallenge-tdownload-link"]') and \
    not self.is_exists_by_xpath('//div[@class="rc-text-challenge"]'):
   print("[{0}] No element in audio challenge download link!!".format(self.current_iteration))
   return False
  

  # If text challenge - reload the challenge
  for i in range(5):
   if not self.is_exists_by_xpath('//div[@class="rc-text-challenge"]'):break
   print("[{0}] Got a text challenge! Reloading!".format(self.current_iteration))

   self.driver.find_element_by_id('recaptcha-reload-button').click()
   # time.sleep(random.uniform(MIN_RAND, MAX_RAND))
   sleep(1)

  for i in range(3):
   try:
    # Download the 
    # Get the audio challenge URI from the download link
    print('Gotcha')
    download_object = self.driver.find_element_by_xpath('//a[@class="rc-audiochallenge-tdownload-link"]')
    download_link = download_object.get_attribute('href')
    
    # Get the challenge audio to send to Google
    converted_audio = self.get_challenge_audio(download_link)
    audio_output = self.speech_to_text(converted_audio)
    if not audio_output:raise
    break
   except:
    self.driver.find_element_by_id('recaptcha-reload-button').click()
    # time.sleep(random.uniform(MIN_RAND, MAX_RAND))
    audio_output=''
    sleep(2)
   
  # Send the audio to Google Speech Recognition API and get the output
  

  # Enter the audio challenge solution
  self.driver.find_element_by_id('audio-response').send_keys(audio_output)
  # time.sleep(random.uniform(LONG_MIN_RAND, LONG_MAX_RAND))
  time.sleep(random.uniform(MIN_RAND, MAX_RAND))

  # Click on verify
  self.driver.find_element_by_id('recaptcha-verify-button').click()
  # time.sleep(random.uniform(LONG_MIN_RAND, LONG_MAX_RAND))
  time.sleep(random.uniform(MIN_RAND, MAX_RAND))
  
  return True
   
 def solve(self, current_iteration):
  self.current_iteration = current_iteration + 1
  
  # Get a ReCaptcha Challenge
  if not self.get_recaptcha_challenge():return True
  
  # Switch to page's main frame
  self.driver.switch_to.default_content()
    
  # Get all the iframes on the page again- there is a new one with a challenge
  iframes = self.driver.find_elements_by_css_selector("iframe[title^='recaptcha']")
  
  # Get audio challenge
  self.get_audio_challenge(iframes)
  # Solve the audio challenge
  if not self.solve_audio_challenge():
   return False
  sleep(2)
  
  # Check if there is another audio challenge and solve it too
  for _ in range(10):
   if not (self.is_exists_by_xpath('//div[@class="rc-audiochallenge-error-message"]') and \
    self.is_exists_by_xpath('//div[contains(text(), "Multiple correct solutions required")]') ):break
   print("[{0}] Need to solve more. Let's do this!".format(self.current_iteration))
   self.solve_audio_challenge()
   sleep(2)
   # Switch to the ReCaptcha iframe to verify it is solved
   self.driver.switch_to.default_content() 
   
   self.driver.switch_to_frame(iframes[0])
   
   return self.get_recaptcha_challenge()



  return self.is_exists_by_xpath('//span[@aria-checked="true"]')

class Amu:
 def __init__(self,i,b):
  self.b=b
  self.i=i
 def cv(self):
  self.b.execute_script("document.querySelector('form').scrollIntoView();")
  rebreakcaptcha_obj = rebreakcaptcha(b)
  
  counter = 0
  for i in xrange(NUMBER_OF_ITERATIONS):
   if rebreakcaptcha_obj.solve(i):
    print('CV')
    counter += 1
    self.b.switch_to.default_content() 
    return True
   
  self.b.switch_to.default_content()
  return False
 
 def lsl(self,s=1):
  try:
   ls=self.b.execute_script("return +sessionStorage.a")
   if(s):self.b.execute_script("document.forms[0].submit();") 
   for i in range(10):
    if ls!=self.b.execute_script("return +sessionStorage.a"):break
    if(s):sleep(1)
  except Exception as e:
   print('lsl',e)
 
 def login(self,s):
  if self.b.execute_script("return document.querySelector('#profile_part_id.profile_part')"):return
  u=[
  'un'
  ]
  pwd=[
  'pwd'
  ]
  u_=u[s]
  p_=pwd[s]
  self.b.get('http://www.amulyam.in/')
  self.b.execute_script("document.querySelector('#login_email_input_id').value={}".format(u_))
  self.b.execute_script("document.querySelector('#login_pwd_input_id').value='{}'".format(p_))
  self.b.execute_script("document.querySelector('#login_form_submit').click()")
  sleep(2)
  
 
 def loginc(self):
  _='http://www.amulyam.in/daily-login-credits.do'
  if self.b.current_url!=_:self.b.get(_)
  if self.b.execute_script('return document.forms.length'):
   for i in range(10):
    if self.cv() :break
    print('cving')
   self.lsl()
  else:
   print('Done')
 
 def trivia(self):
  _='http://www.amulyam.in/playTrivia.do'
  if 'playTrivia' not in self.b.current_url:self.b.get(_)
  try:
   c=int(self.b.execute_script("return document.querySelector('.question_div span').innerText.split(' ')[0]"))-1
  except:
   c=1
   if self.b.execute_script("return document.querySelectorAll('.amu_add_new a')"):c=25
   if self.b.execute_script("return document.querySelector('.game-completion')"):c=25
  print('Count',c)
  try: 
   for i in range(c,30+c):
    print('No:',i,c+1)
    if c==25 :break
    for j in range(3):
     _="document.getElementsByClassName('jquery-adi light')"
     self.b.execute_script("if ({0}.length){0}[0].remove()".format(_))
     fl=self.b.execute_script('return document.forms.length')
     try:
      c=int(self.b.execute_script("return document.querySelector('.question_div span').innerText.split(' ')[0]"))
     except:c=c
 
     if fl ==0 :
      if 'amulyam' not in self.b.current_url:return
      um='Captcha'
      print(um)
      sleep(3)
      _=self.b.execute_script("if({0}.length) return {0}[0].children[0].href; else return 0".format("document.getElementsByClassName('trivia_ans_options')",random.randrange(5)))
      if(_):self.b.get(_)
     else:
      if self.b.execute_script('return document.forms[0].elements[0].tagName')!="TEXTAREA" and j==0:
       um='Trivia'
       print(um)
       self.lsl()
     
      elif self.b.execute_script('return document.forms[0].elements[0].tagName')=="TEXTAREA":
       um='ReCaptcha'
       print(um)
       for i in range(10):
        if self.cv() :break
        print('cving')
       self.lsl()
    
    
   if self.b.execute_script("return document.querySelectorAll('.amu_add_new a')"):
    cw = self.b.current_window_handle
    self.b.execute_script("for (a of document.querySelectorAll('.amu_add_new a'))a.click()")
    sleep(3)   
    self.b.switch_to_window(self.b.window_handles[1]);self.lsl(0);self.b.close()
    self.b.switch_to_window(self.b.window_handles[1]);self.lsl(0);self.b.close()
    self.b.switch_to_window(cw)
    self.lsl()
 
  except Exception as e:
   self.b.switch_to.default_content()
   self.fexc(e)
 
 def voc(self):
  if 'Voca' not in self.b.current_url:self.b.get('http://www.amulyam.in/vocabulary.do')
  try:
   c=int(self.b.execute_script("return document.querySelector('.question_div span').innerText.split(' ')[1]"))-1
  except:
   c=1
   if self.b.execute_script("return document.querySelectorAll('.amu_add_new a')"):c=15
   if self.b.execute_script("return document.querySelector('.game-completion')"):c=15
  print('Count',c)
  try:
   for i in range(c,20+c):
    print('No:',i,c+1)
    if c==15 :break
    for j in range(4):
     _="document.getElementsByClassName('jquery-adi light')"
     self.b.execute_script("if ({0}.length){0}[0].remove()".format(_))
     fl=self.b.execute_script('return document.forms.length')
     try:
      c=int(self.b.execute_script("return document.querySelector('.question_div span').innerText.split(' ')[0]"))
     except:c=c
     if not fl:
      if 'amulyam' not in self.b.current_url:return
      um='Captcha'
      print(um)
      sleep(3)
      _=self.b.execute_script("if({0}.length) return {0}[0].children[0].href; else return 0".format("document.getElementsByClassName('trivia_ans_options')",random.randrange(5)))
      if(_):self.b.get(_)     
 
     else:
      fl=self.b.execute_script('return document.forms[0].elements.length')
      if fl==2:
       mx='ShowWord'
       print(mx)
       _="document.querySelector('.question_div p')";
       self.b.execute_script("if ({0})sessionStorage.w={0}.innerText".format(_))
       self.lsl()
      elif fl==3 and self.b.execute_script('return document.forms[0].elements[0].tagName')!="TEXTAREA":
       mx='EnterWord'
       print(mx)
       self.b.execute_script("document.querySelector('#submit-word').value=sessionStorage.w;")
       self.lsl()
      elif fl==3:
       mx='Recaptcha'
       print(mx)
       for i in range(10):
        if self.cv() :break
        print('cving')
       self.lsl()    
    
   if self.b.execute_script("return document.querySelectorAll('.amu_add_new a')"):
    cw = self.b.current_window_handle
    self.b.execute_script("for (a of document.querySelectorAll('.amu_add_new a'))a.click()")
    sleep(3)
    self.b.switch_to_window(self.b.window_handles[1]);self.lsl(0);self.b.close();sleep(1)
    self.b.switch_to_window(self.b.window_handles[1]);self.lsl(0);self.b.close();sleep(1)
    self.b.switch_to_window(cw)
    self.lsl()
 
  except Exception as e:
   self.fexc(e)
 
 
 def ad(self):
  _="document.getElementsByClassName('jquery-adi light')[0]"
  self.b.execute_script("if ({0}){0}.remove()".format(_))
 def cwh(self):
  self.b.switch_to_window(self.b.window_handles[-1])


 def fexc(self,e,j=0):
  global m_
  exc_type, exc_obj, exc_tb = sys.exc_info()
  tb = traceback.extract_tb(exc_tb)[-1]
  print('{}\n{} {}'.format(e,tb[2],tb[1]))
  traceback.print_exc()
  print(self.i)
  m_='Won'

 def a(self):
  global m_,bx
  try:
   
    t1 = time.time()
    self.login(self.i)
    self.loginc()
    self.trivia() 
    self.voc()

    t2 = time.time()
    print("Elapsed time:", secondsToStr( t2-t1 ))
    if(m_=='Done'):self.b.get('http://www.amulyam.in/credit-history.do')
    _=(confirm( text=m_, title='Smart', buttons=['OK','Cancel']))
    if _=='OK':self.b.get('http://www.amulyam.in/logout.do')
  except KeyboardInterrupt as e:
   print(e)

 def __repr__(self):
  self.a()
  return ''
 
n=8 
m_='Done'


def secondsToStr(t):
    rediv = lambda ll,b : list(divmod(ll[0],b)) + ll[1:]
    return "%d:%02d:%02d.%03d" % tuple(reduce(rediv,[[t*1000,],1000,60,60]))




from selenium import webdriver
class SessionRemote(webdriver.Remote):
    def start_session(self, desired_capabilities, browser_profile=None):
        # Skip the NEW_SESSION command issued by the original driver
        # and set only some required attributes
        self.w3c = True

   
   



url = 'http://127.0.0.1:51454'
b = SessionRemote(command_executor=url,desired_capabilities={})
b.session_id="2ae2694dc4001f092fe624739c767f6e"
 
 



i1=Amu(0,b)
i1.login(0)
i1.trivia()

No comments:

Post a Comment