class Gui: def __init__(self, width, height): Gui.chrome_gui = Chrome(width, height) Gui.qwiklabs_gui = Qwiklabs(width, height) class Chrome(Gui): SEARCH_BAR_PERCENTAGE = (0.5, 0.1) def __init__(self, width, height): Chrome.SEARCH_BAR=width*Chrome.SEARCH_BAR_PERCENTAGE[0], height*Chrome.SEARCH_BAR_PERCENTAGE[1] def click_searchbar(self): pyautogui.moveTo(Chrome.SEARCH_BAR[0], Chrome.SEARCH_BAR[1]) pyautogui.click() pyautogui.keyDown('ctrl') pyautogui.press('a') pyautogui.keyUp('ctrl') class Qwiklabs(Gui): JOIN_BTN_PERCENTAGE = (0.775, 0.183) SIGN_IN_BTN_PERCENTAGE = (0.2125, 0.73) EMAIL_TEXTBOX_PERCENTAGE = (0.5, 0.73) COURSE_BTN_PERCENTAGE = (0.29, 0.45) STARTLAB_BTN_PERCENTAGE = (0.125, 0.31) CAPTCHA_BTN_PERCENTAGE = (0.075, 0.425) EMAIL_COPY_BTN_PERCENTAGE = (0.3125, 0.7) PASSWORD_COPY_BTN_PERCENTAGE = (0.3125, 0.82) def __init__(self, width, height): Qwiklabs.JOIN_BTN=width*Qwiklabs.JOIN_BTN_PERCENTAGE[0], height*Qwiklabs.JOIN_BTN_PERCENTAGE[1] Qwiklabs.SIGN_IN_BTN=width*Qwiklabs.SIGN_IN_BTN_PERCENTAGE[0], height*Qwiklabs.SIGN_IN_BTN_PERCENTAGE[1] Qwiklabs.EMAIL_TEXTBOX=width*Qwiklabs.EMAIL_TEXTBOX_PERCENTAGE[0], height*Qwiklabs.EMAIL_TEXTBOX_PERCENTAGE[1] Qwiklabs.COURSE_BTN=width*Qwiklabs.COURSE_BTN_PERCENTAGE[0], height*Qwiklabs.COURSE_BTN_PERCENTAGE[1] Qwiklabs.STARTLAB_BTN=width*Qwiklabs.STARTLAB_BTN_PERCENTAGE[0], height*Qwiklabs.STARTLAB_BTN_PERCENTAGE[1] Qwiklabs.CAPTCHA_BTN=width*Qwiklabs.CAPTCHA_BTN_PERCENTAGE[0], height*Qwiklabs.CAPTCHA_BTN_PERCENTAGE[1] Qwiklabs.EMAIL_COPY_BTN=width*Qwiklabs.EMAIL_COPY_BTN_PERCENTAGE[0], height*Qwiklabs.EMAIL_COPY_BTN_PERCENTAGE[1] Qwiklabs.PASSWORD_COPY_BTN=width*Qwiklabs.PASSWORD_COPY_BTN_PERCENTAGE[0], height*Qwiklabs.PASSWORD_COPY_BTN_PERCENTAGE[1] if __name__ == "__main__": import time import subprocess import os import pyautogui import sys import requests pyautogui.FAILSAFE = False screenWidth, screenHeight = pyautogui.size() ui = Gui(screenWidth, screenHeight) # print("[QL_GetGAccount] Screen is {} {}".format(screenWidth, screenHeight)) # print("[QL_GetGAccount] Accessing course on qwiklabs") # Head over to the course on qwiklabs.com Gui.chrome_gui.click_searchbar() pyautogui.write("qwiklabs.com") pyautogui.press('/') pyautogui.write("focuses") pyautogui.press('/') pyautogui.write("2794") pyautogui.press('?') pyautogui.write("parent") pyautogui.press('=') pyautogui.write("catalog") pyautogui.press('enter') time.sleep(15) # print("[QL_GetGAccount] Signing in") pyautogui.moveTo(0,0) # Click join button pyautogui.moveTo(ui.qwiklabs_gui.JOIN_BTN[0], ui.qwiklabs_gui.JOIN_BTN[1], 3, pyautogui.easeOutQuad) pyautogui.click(button='left') time.sleep(5) # Move to the end of the page pyautogui.press('pgdn') # print("Moving from sign up to sign in") # switch to sign in button pyautogui.moveTo(ui.qwiklabs_gui.SIGN_IN_BTN[0], ui.qwiklabs_gui.SIGN_IN_BTN[1], 3, pyautogui.easeOutQuad) pyautogui.click(button='left') time.sleep(5) # switch to email textbox, the rest is done via kbd pyautogui.moveTo(ui.qwiklabs_gui.EMAIL_TEXTBOX[0], ui.qwiklabs_gui.EMAIL_TEXTBOX[1], 3, pyautogui.easeOutQuad) pyautogui.click(button='left') time.sleep(2) # print("[QL_GetGAccount] Inserting credentials") # account; "mopopa1077@5sword.com", "hellogoodbye" # account = ("hemerey688@kibwot.com", "hellogoodbye") account_email = sys.argv[1] account = (account_email, "hellogoodbye") username = account[0] password = account[1] try: first_part = username.split('@')[0] second_part = username.split('@')[1] except: print(False) exit() pyautogui.press('@') pyautogui.press('left') pyautogui.write(first_part, interval=0.2) pyautogui.press('right') pyautogui.write(second_part, interval=0.2) pyautogui.press('\t') pyautogui.write(password, interval=0.2) pyautogui.press('enter') time.sleep(10) # Start course time.sleep(5) # print("[QL_GetGAccount] Starting the course") pyautogui.moveTo(ui.qwiklabs_gui.STARTLAB_BTN[0], ui.qwiklabs_gui.STARTLAB_BTN[1], 3, pyautogui.easeOutQuad) pyautogui.click() # Accept captcha - sometimes they don't even ask for actual verification time.sleep(5) # print("Accepting captcha (not needed really)") pyautogui.moveTo(ui.qwiklabs_gui.CAPTCHA_BTN[0], ui.qwiklabs_gui.CAPTCHA_BTN[1], 3, pyautogui.easeOutQuad) pyautogui.click() time.sleep(20) # Now the lab should be started, we can quit. Creds will be obtained by selenium # bashCommand = "copyq clipboard" # # Copy username to clipboard # time.sleep(20) # # print("Copying email") # pyautogui.moveTo(ui.qwiklabs_gui.EMAIL_COPY_BTN[0], ui.qwiklabs_gui.EMAIL_COPY_BTN[1], 3, pyautogui.easeOutQuad) # pyautogui.click() # g_email = subprocess.check_output(['bash','-c', bashCommand]).decode('utf-8') # # Copy password to clipboard # time.sleep(5) # # print("Copying password") # pyautogui.moveTo(ui.qwiklabs_gui.PASSWORD_COPY_BTN[0], ui.qwiklabs_gui.PASSWORD_COPY_BTN[1], 3, pyautogui.easeOutQuad) # pyautogui.click() # g_password = subprocess.check_output(['bash','-c', bashCommand]).decode('utf-8') # time.sleep(5) # # a possible way of finding out we haven't got the password, therefore the account was probably blocked or there was a connection issue # if '@' in g_email: # print(g_email, g_password) # else: # # account_list.mark_account_for_deletition(account_email) # print(False) def get_google_account(): from utils import global_vars from selenium.webdriver.common.by import By from utils.browser_manager import clickButton, inputText, expand_shadow_element, start_browser import subprocess import json import time if global_vars.TEST_ACCOUNT: print("[QL_GetAccount] Using Test Account {}".format(global_vars.TEST_ACCOUNT) ) driver = start_browser() driver.get(global_vars.TEST_ACCOUNT[2]) return global_vars.TEST_ACCOUNT[0], global_vars.TEST_ACCOUNT[1], global_vars.TEST_ACCOUNT[2], driver else: print("[QL_GetAccount] Getting new google account..." ) #TODO: Handle failure in getting the account if global_vars.TEST_QWIKLABS_ACCOUNT is False: print("[QL_GetAccount] Using TEST Qwiklabs account to get it") account = socket_request_new_account() subprocess.call(['bash','-c', "src/qwiklabs/get_account.sh {} {} ".format(str(global_vars.PROXY), account)]) else: print("[QL_GetAccount] Using Qwiklabs test account") account = global_vars.TEST_QWIKLABS_ACCOUNT driver = start_browser() driver.get("https://www.qwiklabs.com/focuses/2794?catalog_rank=%7B%22rank%22%3A2%2C%22num_filters%22%3A0%2C%22has_search%22%3Atrue%7D&parent=catalog&search_id=12598152") time.sleep(5) clickButton(driver, By.XPATH, '/html/body/div[1]/div[1]/ql-toolbar/div[2]/a[2]') time.sleep(5) inputText(driver, By.CSS_SELECTOR, "#user_email", account) inputText(driver, By.CSS_SELECTOR, "#user_password", "hellogoodbye" + '\n') time.sleep(5) panel = driver.find_element_by_xpath('/html/body/main/div/ql-drawer-container/ql-drawer-content/ql-drawer-container/ql-drawer[1]/ql-lab-control-panel') details = panel.get_attribute('labdetails') details_json = json.loads(details) gshell_link = details_json[0]['href'] email = details_json[1]['value'] password = details_json[2]['value'] print("[QL_GetAccount] Got a Google account, it is", (email, password, gshell_link)) return email, password, gshell_link, driver # Assumes the account server is already running on localhost:12345 def socket_request_new_account(): import socket from utils import global_vars s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((global_vars.QWACCOUNTSERVER_HOSTNAME_DOCKER, 12345)) #ip s.send(b"givacc") account = s.recv(1024).decode("utf-8") s.close() return account