From ac55be66749fcdfd06b708558fe599a4cee28ce4 Mon Sep 17 00:00:00 2001 From: Pakobbix Date: Wed, 8 Mar 2023 13:24:05 +0100 Subject: [PATCH] resorted imports, fixed platforms to windows/linux (exclude mac), timer will be searched via string not class anymore (class = dynamic), added Winnings api call, added message if luckypot could be claimed, tell how much via api call and JWT Token --- honeygaingift.py | 182 +++++++++++++++++++++++++---------------------- 1 file changed, 95 insertions(+), 87 deletions(-) diff --git a/honeygaingift.py b/honeygaingift.py index b37cfb3..4462ce7 100644 --- a/honeygaingift.py +++ b/honeygaingift.py @@ -1,10 +1,3 @@ -#!/usr/bin/python3 - -import os -import sys -import json -import time -import logging import platform import subprocess from selenium import webdriver @@ -13,142 +6,157 @@ from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.action_chains import ActionChains +import json +import time +import logging +import requests -# Get the directory of the currently executing script +# Hier wird das logging erstmal auf Critical gestellt +logging.basicConfig(level=logging.CRITICAL) + +# Speichere den absoluten Pfad zum Skript. script_dir = os.path.dirname(os.path.realpath(sys.argv[0])) -# now we will Create and configure logger +# Erstelle logdatei & defeniert das format log_file = os.path.join(script_dir, 'claim.log') logging.basicConfig(filename=log_file, format='%(asctime)s %(message)s', datefmt='%d.%m.%Y %H:%M:%S', filemode='w') -# Creates an object +# Erstelle ein Aufrufbares Objekt. logger = logging.getLogger() -# Set logging level +# Stelle das Log Level ein logger.setLevel(logging.INFO) -# Load username and password from JSON file -json_file = os.path.join(script_dir, 'honeygainlogin.json') - -with open(json_file, 'r') as file: +# Lade die Logindaten aus der honeygainlogin.json datei. +with open('honeygainlogin.json', 'r') as file: login_data = json.load(file) username = login_data['username'] password = login_data['password'] -# Set the path to the Chrome binary -# Determine the path to the Chrome binary based on the operating system +# Nutze den vorinstallierten Chrome Browser if platform.system() == 'Windows': - chrome_binary = r'C:\Program Files\Google\Chrome\Application\chrome.exe' -else: - chrome_binary = '/usr/bin/google-chrome' + chrome_binary = r'C:\Program Files\Google\Chrome\Application\chrome.exe' # Chrome EXE die genutzt werden soll in Windows +elif platform.system() == 'Linux': + chrome_binary = '/usr/bin/google-chrome' # Chrome executable die genutzt werden soll in Linux -# Set the Chrome options to use the binary and run in headless mode +# Erstelle Chrome Argumente Variable chrome_options = webdriver.ChromeOptions() +# Verhindert das der Chromedriver log angezeigt wird. chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) chrome_options.binary_location = chrome_binary +# Öffnet den Chrome im Headless modus (Ohne Fenster) chrome_options.add_argument('--headless') -""" -Start the ChromeDriver process with stdout -and stderr redirected to /dev/null or subprocess.DEVNULL -""" -if platform.system() == 'Windows': - devnull = subprocess.DEVNULL -else: - devnull = open('/dev/null', 'w') -process = subprocess.Popen(['/usr/local/bin/chromedriver'], stdout=devnull, stderr=devnull) - -# Create a new Chrome driver using chromedriver and the Chrome options +# Erstelle eine Session mit Chrome und den vorher definierten Einstellungen driver = webdriver.Chrome(options=chrome_options) -# Set the window size to 2560x1440 pixels +""" +Öffne Chrome mit einer Auflösung von 2560x1440 + +Dies ist wichtig, da sonst die info mit dem Jumpcoin über der Login-Mail eingabe hängt und daher nicht klickbar ist. +""" driver.set_window_size(2560, 1440) -# Navigate to the login page +# Öffne die Loginseite driver.get('https://dashboard.honeygain.com/login') - try: - # Wait for the login button - WebDriverWait(driver, 10).until(EC.presence_of_element_located( - (By.XPATH, "//button[contains(., 'Login with email')]")) - ) + # Warte bis der Login Button verfügbar ist. + WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//button[contains(., 'Login with email')]"))) except TimeoutException: - logger.error("Timeout: Failed to load page within 10 seconds") + print("Timeout: Failed to load page within 10 seconds") driver.quit() -# Find username and password fields and enter login credentials +# Suche die Nutzernamen & Passwort felder und fülle diese aus. username_field = driver.find_element(By.ID, 'email') username_field.send_keys(username) password_field = driver.find_element(By.ID, 'password') password_field.send_keys(password) +# Zur Sicherheit ein 3 Sekunden Timer. Damit es nicht zu "bottig" wirkt. time.sleep(3) -# logger.info("Login to Honeygain") - -# Click the login button to submit the form -submit_button = driver.find_element( - By.XPATH, "//button[contains(., 'Login with email')]" - ) +# Drücke den Login Button, scrolle gegebenfalls etwas in dessen Richtung, um sicherzustellen, dass dieser drückbar ist. +submit_button = driver.find_element(By.XPATH, "//button[contains(., 'Login with email')]") driver.execute_script("arguments[0].scrollIntoView(true);", submit_button) submit_button.click() actions = ActionChains(driver) actions.move_to_element(submit_button).click().perform() try: - # Wait for the "Earned today" section to be present on the page - WebDriverWait(driver, 10).until(EC.presence_of_element_located( - (By.XPATH, "//div[contains(text(), 'Total earnings')]")) - ) + # Warte max 10 Sekunden bis der Text "Total earnings" erscheint. + WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[contains(text(), 'Total earnings')]"))) except TimeoutException: - logger.error("Timeout: Failed to load page within 10 seconds") + print("Timeout: Failed to load page within 10 seconds") driver.quit() -# Click on Cookie Banner -cookie_button = driver.find_element( - By.XPATH, "//button[contains(., 'Accept selected')]" - ) +# Lasse den Cookie Banner verschwinden. +cookie_button = driver.find_element(By.XPATH, "//button[contains(., 'Accept selected')]") cookie_button.click() +# Versuche einen Timer ausfindig zu machen try: - timer = WebDriverWait(driver, 10).until( - EC.presence_of_element_located( - (By.CSS_SELECTOR, 'div.sc-cUEOzv.kryQIl.sc-hshgAP.jDPslO'))) + # Warte 10 Sekunden ob ein Timer auftaucht mit dem text "hours" "min" and "sec" + timer = WebDriverWait(driver, 10).until(EC.presence_of_element_located(( + By.XPATH, "//p[contains(., 'hours') and contains(., 'min') and contains(., 'sec')]"))) + # Wenn der Timer aufgetaucht ist, finde die CSS Class und speicher diese als string. + current_time = driver.find_element(By.CSS_SELECTOR, 'p.sc-jOiSOi.jgbyVL').text + # Zeige eine Nachricht mit der noch zu wartenden Zeit + print('Nächster Pot Verfügbar in:', current_time) + # Versuche den JWT Token zu extrahieren: + WebDriverWait(driver, 10).until( + lambda driver: driver.execute_script('return localStorage.getItem("JWT");') is not None) - # If the countdown element is present, get the current time and print it - current_time = driver.find_element( - By.CSS_SELECTOR, 'p.sc-jOiSOi.jgbyVL' - ).text - logger.info("Nächster Pot Verfügbar in: %s", current_time) + # Definiere eine variable mit dem JWT Token inhalt. + jwt_token = driver.execute_script('return localStorage.getItem("JWT");') + + # Nutze den JWT Token um sich für den API call anzumelden + url = 'https://dashboard.honeygain.com/api/v1/contest_winnings' + headers = {'Authorization': f'Bearer {jwt_token}'} + response = requests.get(url, headers=headers) + # Überprüfe den zurückgegebenen Status Code des API Calls + if response.status_code == 200: + # Extrahiere die daten aus der json und nenne die variable "winning_credits" + winnings = response.json()['data']['winning_credits'] + # Konvertiere die Credits in $ + winnings_in_dollars = winnings / 1000 + # Nun konvertieren wir die Credits in integer und dann zurück in einen String, dadurch streichen wir nachkommastellen (5 Credits werden als 5.0 angegeben, aber es gibt keine 0.5 Credits) + winnings_int = int(winnings) + winnings_str = str(winnings_int) + # Zeige eine Nachricht mit den Credits die heute gewonnen wurden. + print('Du hast heute', winnings_str ,'Credits (', winnings_in_dollars, '$) gewonnen.') + else: + print('Error:', response.status_code, response.text) except TimeoutException: - # If the timer element is not present, click on the lucky pot button + # Falls der Timer nicht vorhanden ist, schaue ob der Lucky Port geclaimed werden kann try: - # Wait for the "Open Lucky Pot" button to be present on the page - WebDriverWait(driver, 10).until(EC.presence_of_element_located( - (By.XPATH, "//span[contains(text(), 'Open Lucky Pot')]")) - ) - logger.info('Öffne den Luckypot') - # Find the "Open Lucky Pot" button and click it - lucky_pot_button = driver.find_element( - By.XPATH, - "//span[contains(text(), 'Open Lucky Pot')]/ancestor::button" - ) + # Warte max 10 Sekunden bis der text "Open Lucky Pot" auf der Seite erscheint. + WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//span[contains(text(), 'Open Lucky Pot')]"))) + # Klicke den Lucky Pot button: + lucky_pot_button = driver.find_element(By.XPATH, "//span[contains(text(), 'Open Lucky Pot')]/ancestor::button") lucky_pot_button.click() - logger.info('Glückwunsch! Ich habe für dich gerade den Lucky Pot geöffnet') + # Definiere eine variable mit dem JWT Token inhalt. + jwt_token = driver.execute_script('return localStorage.getItem("JWT");') + + # Nutze den JWT Token um sich für den API call anzumelden + url = 'https://dashboard.honeygain.com/api/v1/contest_winnings' + headers = {'Authorization': f'Bearer {jwt_token}'} + response = requests.get(url, headers=headers) + # Überprüfe den zurückgegebenen Status Code des API Calls + if response.status_code == 200: + # Extrahiere die daten aus der json und nenne die variable "winning_credits" + winnings = response.json()['data']['winning_credits'] + # Konvertiere die Credits in $ + winnings_in_dollars = winnings / 1000 + # Nun konvertieren wir die Credits in integer und dann zurück in einen String, dadurch streichen wir nachkommastellen (5 Credits werden als 5.0 angegeben, aber es gibt keine 0.5 Credits) + winnings_int = int(winnings) + winnings_str = str(winnings_int) + # Zeige eine Nachricht mit den Credits die heute gewonnen wurden. + print('Der LuckyPot wurde erfolgreich geclaimed! Du hast', winnings_str ,'Credits (', winnings_in_dollars, '$) gewonnen.') + except TimeoutException: - logger.error("The 'Open Lucky Pot' button was not found. Exiting...") - driver.quit() - -# Close the browser window -driver.quit() - -process.terminate() - -# Close the /dev/null file on Unix/Linux -if not platform.system() == 'Windows': - devnull.close() + print("The 'Open Lucky Pot' button was not found within 10 seconds. Exiting...")