GShellAutomator/Automator/qwiklabs/get_google_account.py

219 lines
8.3 KiB
Python

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