GShellAutomator/Automator/code/qwiklabs/get_google_account.py

202 lines
7.6 KiB
Python

if __name__ == "__main__":
import time
import subprocess
import os
import pyautogui
import sys
import requests
JOIN_BTN = (564, 120)
SIGN_IN_BTN = (140, 360)
EMAIL_TEXTBOX = (340, 115)
STARTLAB_BTN = (110, 200)
CAPTCHA_BTN = (75, 255)
SEARCH_BAR = (385, 60)
# EMAIL_COPY_BTN = (0.3125, 0.7)
# PASSWORD_COPY_BTN = (0.3125, 0.82)
pyautogui.FAILSAFE = False
pyautogui.moveTo(SEARCH_BAR[0], SEARCH_BAR[1])
pyautogui.click()
pyautogui.keyDown('ctrl')
pyautogui.press('a')
pyautogui.keyUp('ctrl')
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(JOIN_BTN[0], JOIN_BTN[1], 3, pyautogui.easeOutQuad)
pyautogui.click(button='left')
time.sleep(5)
# Move to the end of the page
pyautogui.press('pgdn')
pyautogui.press('pgdn')
# print("Moving from sign up to sign in")
# switch to sign in button
pyautogui.moveTo(SIGN_IN_BTN[0], SIGN_IN_BTN[1], 3, pyautogui.easeOutQuad)
pyautogui.click(button='left')
time.sleep(5)
pyautogui.press('pgdn')
# switch to email textbox, the rest is done via kbd
pyautogui.moveTo(EMAIL_TEXTBOX[0], EMAIL_TEXTBOX[1], 3, pyautogui.easeOutQuad)
pyautogui.click(button='left')
time.sleep(2)
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(STARTLAB_BTN[0], 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(CAPTCHA_BTN[0], 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(EMAIL_COPY_BTN[0], 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(PASSWORD_COPY_BTN[0], 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 Qwiklabs account to get it. Launching pyautogui bot to get a new qwiklabs account")
account = socket_request_new_account()
print("[QL_GetAccount] Will use account", account)
subprocess.call(['bash','-c', "/home/user/code/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]')
driver.get("https://www.qwiklabs.com/users/sign_in")
time.sleep(5)
inputText(driver, By.CSS_SELECTOR, "#user_email", account)
inputText(driver, By.CSS_SELECTOR, "#user_password", "hellogoodbye" + '\n')
time.sleep(5)
# in case undetected chromedriver will ever work
# 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")
# # uncover shadow DOM
# shadowRoot = browser_manager.expand_shadow_element(driver, driver.find_element_by_xpath("/html/body/main/div/ql-drawer-container/ql-drawer-content/ql-drawer-container/ql-drawer-content/ql-lab-control-panel"))
# # start lab
# shadowRoot[0].find_element_by_css_selector("#lab-control-button").click()
# # switch to captcha frame
# frame = driver.find_element_by_xpath("/html/body/main/div/ql-drawer-container/ql-drawer-content/ql-drawer-container/ql-drawer-content/ql-lab-control-panel/div/div/div/div/iframe")
# driver.switch_to.frame(frame)
# #click captcha, shouldn't need resolve with undetected chromedriver
# driver.find_element_by_xpath("/html/body/div[2]/div[3]/div[1]/div/div/span/div[1]").click()
try:
panel = driver.find_element_by_xpath('/html/body/main/div/ql-drawer-container/ql-drawer-content/ql-drawer-container/ql-drawer-content/ql-lab-control-panel')
except:
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
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((global_vars.QWACCOUNTSERVER_HOSTNAME_DOCKER, 12345)) #ip
s.send(b"givacc")
account = s.recv(1024).decode("utf-8")
s.close()
return account