269 lines
12 KiB
Python
269 lines
12 KiB
Python
import os, sys
|
|
import json
|
|
import time
|
|
import logging
|
|
import requests
|
|
import platform
|
|
import argparse
|
|
import datetime
|
|
import subprocess
|
|
from selenium import webdriver
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
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
|
|
|
|
def print_color(message, color):
|
|
colors = {
|
|
'black': '\033[30m',
|
|
'red': '\033[31m',
|
|
'green': '\033[32m',
|
|
'yellow': '\033[33m',
|
|
'blue': '\033[34m',
|
|
'purple': '\033[35m',
|
|
'cyan': '\033[36m',
|
|
'white': '\033[37m'
|
|
}
|
|
end_color = '\033[0m'
|
|
print(f"{colors[color]}{message}{end_color}")
|
|
|
|
def get_login_data():
|
|
username = input("Gebe deine Honeygain Mailadresse ein: ")
|
|
password = input("Gebe dein Honeygain passwort ein: ")
|
|
login_data = {"username": username, "password": password}
|
|
with open('honeygainlogin.json', 'w') as file:
|
|
json.dump(login_data, file)
|
|
return login_data
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-s', '--setup', action='store_true', help='set up Honeygain login credentials')
|
|
args = parser.parse_args()
|
|
|
|
if args.setup:
|
|
login_data = get_login_data()
|
|
write_userdata = input("Möchtest du den Honeypot Claimer nun ausführen? [Y/n] ").lower()
|
|
if write_userdata == "" or write_userdata == "y":
|
|
# continue with the default action
|
|
pass
|
|
elif write_userdata == "n":
|
|
# take alternative action
|
|
print_color("Deine Daten wurden gespeichert...", 'green')
|
|
sys.exit()
|
|
else:
|
|
# handle invalid input
|
|
print_color("Invalid input, please try again.", 'red')
|
|
|
|
# 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]))
|
|
|
|
# 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')
|
|
|
|
# Erstelle ein Aufrufbares Objekt.
|
|
logger = logging.getLogger()
|
|
|
|
# Stelle das Log Level ein
|
|
logger.setLevel(logging.INFO)
|
|
|
|
login_file = os.path.join(script_dir, 'honeygainlogin.json')
|
|
winnings_log = os.path.join(script_dir, 'Winnings.txt')
|
|
|
|
# Lade die Logindaten aus der honeygainlogin.json datei.
|
|
try:
|
|
with open(login_file, 'r') as file:
|
|
login_data = json.load(file)
|
|
except FileNotFoundError:
|
|
print_color("FEHLER! Die honeygainlogin.json konnte nicht gefunden werden.", 'red')
|
|
login_data = {"username": "user@mail.com", "password": "p@ssw0rd"}
|
|
with open(login_file, 'w') as file:
|
|
json.dump(login_data, file)
|
|
quit()
|
|
|
|
if login_data['username'] == 'user@mail.com' or login_data['password'] == 'p@ssw0rd':
|
|
print_color("FEHLER! Bitte gebe deine Logindaten noch in der honeygainlogin.json ein!", 'red')
|
|
write_userdata = input("Möchtest du deine Userdaten jetzt aktualisieren? [Y/n] ").lower()
|
|
if write_userdata == "" or write_userdata == "y":
|
|
# continue with the default action
|
|
get_login_data()
|
|
elif write_userdata == "n":
|
|
# take alternative action
|
|
print_color("Breche vorgang ab...", 'red')
|
|
quit()
|
|
else:
|
|
# handle invalid input
|
|
print_color("Invalid input, please try again.", "red")
|
|
|
|
username = login_data['username']
|
|
password = login_data['password']
|
|
|
|
# Nutze den vorinstallierten Chrome Browser
|
|
if platform.system() == 'Windows':
|
|
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
|
|
|
|
# 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
|
|
chrome_options.add_argument('--no-first-run')
|
|
chrome_options.add_argument('--no-sandbox')
|
|
# Öffnet den Chrome im Headless modus (Ohne Fenster)
|
|
chrome_options.add_argument('--headless')
|
|
|
|
# Erstelle eine Session mit Chrome und den vorher definierten Einstellungen
|
|
driver = webdriver.Chrome(options=chrome_options)
|
|
|
|
"""
|
|
Ö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)
|
|
|
|
# Öffne die Loginseite
|
|
driver.get('https://dashboard.honeygain.com/login')
|
|
try:
|
|
# 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:
|
|
print("Timeout: Failed to load page within 10 seconds")
|
|
driver.quit()
|
|
|
|
# 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)
|
|
|
|
# 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:
|
|
# 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:
|
|
print("Timeout: Failed to load page within 10 seconds")
|
|
driver.quit()
|
|
|
|
# Lasse den Cookie Banner verschwinden.
|
|
cookie_button = driver.find_element(By.XPATH, "//button[contains(., 'Accept selected')]")
|
|
cookie_button.click()
|
|
|
|
# Zunächst überprüfen wir, ob wir schon genug Traffic zum claimen erzeugt haben
|
|
#while True:
|
|
# try:
|
|
# time.sleep(5)
|
|
# traffic = driver.find_element(By.ID, "__lottie_element_2")
|
|
# traffic_element = driver.find_element(By.XPATH, "//span[contains(text(), 'MB')]")
|
|
# traffic_text = traffic_element.text
|
|
# print(f"Es wurde noch nicht genug traffic erzeugt ({traffic_text}) von 15 MB")
|
|
# print('Warte 60 Minuten und versuche es erneut')
|
|
# time.sleep(3600)
|
|
# driver.get(driver.current_url)
|
|
# except:
|
|
# # Element not found, do something else
|
|
# break
|
|
|
|
# Versuche einen Timer ausfindig zu machen
|
|
try:
|
|
# 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)
|
|
|
|
# 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.')
|
|
winningslog = f"Es wurden {winnings_str} Credits ({winnings_in_dollars} $) gewonnen."
|
|
today = datetime.datetime.now().strftime("%d.%m.%Y")
|
|
try:
|
|
with open(winnings_log, 'r+') as file:
|
|
contents = file.read()
|
|
if today not in contents:
|
|
file.write(f"{today} - {winningslog}\n")
|
|
except FileNotFoundError:
|
|
with open(winnings_log, 'w') as file:
|
|
file.write(f"{today} - {winningslog}\n")
|
|
else:
|
|
print('Error:', response.status_code, response.text)
|
|
except TimeoutException:
|
|
# Falls der Timer nicht vorhanden ist, schaue ob der Lucky Port geclaimed werden kann
|
|
try:
|
|
# 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()
|
|
# 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.')
|
|
winningslog = f"Es wurden {winnings_str} Credits ({winnings_in_dollars} $) gewonnen."
|
|
today = datetime.datetime.now().strftime("%d.%m.%Y")
|
|
try:
|
|
with open(winnings_log, 'r+') as file:
|
|
contents = file.read()
|
|
if today not in contents:
|
|
file.write(f"{today} - {winningslog}\n")
|
|
except FileNotFoundError:
|
|
with open(winnings_log, 'w') as file:
|
|
file.write(f"{today} - {winningslog}\n")
|
|
|
|
|
|
except TimeoutException:
|
|
print("The 'Open Lucky Pot' button was not found within 10 seconds. Exiting...")
|
|
|
|
driver.quit() |