Autoclaim_LuckyPot/honeygaingift.py

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()