This commit is contained in:
End 2025-12-21 21:55:43 -07:00
parent 1ce576fb39
commit 096145cf2e
No known key found for this signature in database

431
main.py Normal file
View file

@ -0,0 +1,431 @@
import re
import tkinter as tk
from datetime import datetime
from tkinter import messagebox, ttk
from selenium import webdriver
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options as EdgeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions
def detect_and_create_driver():
browsers = [
("Chrome", create_chrome_driver),
("Firefox", create_firefox_driver),
("Edge", create_edge_driver),
]
for browser_name, create_func in browsers:
try:
return create_func(), browser_name
except Exception:
continue
return None, None
def create_chrome_driver():
options = ChromeOptions()
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.page_load_strategy = "eager"
options.add_experimental_option(
"excludeSwitches", ["enable-logging", "enable-automation"]
)
return webdriver.Chrome(options=options)
def create_firefox_driver():
options = FirefoxOptions()
options.set_preference("dom.webnotifications.enabled", False)
options.page_load_strategy = "eager"
return webdriver.Firefox(options=options)
def create_edge_driver():
options = EdgeOptions()
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu")
options.page_load_strategy = "eager"
return webdriver.Edge(options=options)
def parse_number(text):
text = text.lower().replace(",", "").strip()
multipliers = {
"million": 1e6,
"billion": 1e9,
"trillion": 1e12,
"quadrillion": 1e15,
"quintillion": 1e18,
}
for word, mult in multipliers.items():
if word in text:
return float(text.replace(word, "").strip()) * mult
try:
return float(text)
except:
return 0
class Bot:
def __init__(self, driver):
self.driver = driver
self.running = False
self.clicks = 0
self.start_time = None
self.cookie = None
self.cycle = 0
self.last_cps = 0
self.buildings_bought = 0
self.upgrades_bought = 0
def load(self):
self.driver.get("https://ozh.github.io/cookieclicker/")
def ready(self):
try:
c = self.driver.find_element(By.ID, "bigCookie")
if c.size["width"] > 0:
self.cookie = c
return True
except Exception:
pass
return False
def start(self):
self.start_time = datetime.now()
self.running = True
def click(self, times):
for _ in range(times):
try:
self.cookie.click()
self.clicks += 1
except Exception:
try:
self.cookie = self.driver.find_element(By.ID, "bigCookie")
except Exception:
pass
def golden(self):
try:
shimmers = self.driver.find_elements(By.CLASS_NAME, "shimmer")
for s in shimmers:
try:
s.click()
except:
pass
except Exception:
pass
def get_building_info(self):
try:
products = self.driver.find_elements(By.CSS_SELECTOR, ".product.unlocked")
info = []
for p in products:
try:
enabled = "enabled" in p.get_attribute("class")
price_el = p.find_element(By.CLASS_NAME, "price")
price_text = price_el.text
price = parse_number(price_text)
info.append({"element": p, "price": price, "enabled": enabled})
except:
continue
return info
except:
return []
def buy_smart(self, remaining_time):
if remaining_time < 15:
return
buildings = self.get_building_info()
current_cps = self.get_cps_number()
cookies = self.get_cookies()
for b in buildings:
if not b["enabled"]:
continue
price = b["price"]
if price <= 0:
continue
estimated_cps_gain = max(current_cps * 0.1, 1)
if current_cps > 0:
breakeven = price / estimated_cps_gain
else:
breakeven = 5
if remaining_time > 25:
if price < cookies * 0.8:
try:
b["element"].click()
self.buildings_bought += 1
except:
pass
break
elif remaining_time > 20:
if breakeven < remaining_time * 0.5:
try:
b["element"].click()
self.buildings_bought += 1
except:
pass
break
def upgrade(self):
try:
upgrades = self.driver.find_elements(
By.CSS_SELECTOR, "#upgrades .upgrade.enabled"
)
for u in upgrades[:2]:
try:
u.click()
self.upgrades_bought += 1
except:
pass
except Exception:
pass
def buy_cheapest(self, count=1):
try:
for _ in range(count):
products = self.driver.find_elements(
By.CSS_SELECTOR, ".product.unlocked.enabled"
)
if products:
products[0].click()
self.buildings_bought += 1
except Exception:
pass
def get_cookies(self):
try:
text = self.driver.find_element(By.ID, "cookies").text.split("\n")[0]
text = text.replace("cookies", "").strip()
return parse_number(text)
except Exception:
return 0
def get_cps_number(self):
try:
text = self.driver.find_element(By.ID, "cookies").text
if "per second" in text:
cps_text = text.split("per second:")[-1].strip()
self.last_cps = parse_number(cps_text)
return self.last_cps
return self.last_cps
except Exception:
return self.last_cps
def get_cps(self):
try:
text = self.driver.find_element(By.ID, "cookies").text
if "per second" in text:
return text.split("per second:")[-1].strip()
return "0"
except Exception:
return "0"
def elapsed(self):
if self.start_time:
return (datetime.now() - self.start_time).total_seconds()
return 0
def remaining(self):
return max(0, 60 - self.elapsed())
def stop(self):
self.running = False
def close(self):
try:
self.driver.quit()
except Exception:
pass
class GUI:
def __init__(self):
self.root = tk.Tk()
self.root.title("Cookie Speedrun Bot")
self.root.geometry("500x600")
self.bot = None
self.comp = True
self.build()
def build(self):
ttk.Label(
self.root, text="COOKIE SPEEDRUN BOT", font=("Arial", 22, "bold")
).pack(pady=20)
f1 = ttk.Frame(self.root)
f1.pack(pady=10)
self.mode = tk.StringVar(value="COMP")
ttk.Radiobutton(f1, text="Practice", variable=self.mode, value="PRACTICE").pack(
side="left", padx=20
)
ttk.Radiobutton(f1, text="COMPETITION", variable=self.mode, value="COMP").pack(
side="left", padx=20
)
f2 = ttk.Frame(self.root)
f2.pack(pady=10)
self.start_btn = ttk.Button(f2, text="START", command=self.start_bot)
self.start_btn.pack(side="left", padx=10)
self.stop_btn = ttk.Button(
f2, text="STOP", command=self.stop_bot, state="disabled"
)
self.stop_btn.pack(side="left", padx=10)
self.timer = tk.StringVar(value="60")
ttk.Label(
self.root,
textvariable=self.timer,
font=("Arial", 72, "bold"),
foreground="red",
).pack(pady=20)
self.phase = tk.StringVar(value="---")
ttk.Label(
self.root,
textvariable=self.phase,
font=("Arial", 16, "bold"),
foreground="blue",
).pack()
ttk.Separator(self.root).pack(fill="x", pady=20)
self.result = tk.StringVar(value="---")
ttk.Label(self.root, text="FINAL COOKIES:", font=("Arial", 14)).pack()
ttk.Label(
self.root,
textvariable=self.result,
font=("Arial", 32, "bold"),
foreground="green",
).pack(pady=5)
self.cps_var = tk.StringVar(value="CPS: ---")
ttk.Label(self.root, textvariable=self.cps_var, font=("Arial", 14)).pack()
self.clicks_var = tk.StringVar(value="Clicks: ---")
ttk.Label(self.root, textvariable=self.clicks_var, font=("Arial", 14)).pack()
self.buildings_var = tk.StringVar(value="Buildings: --- | Upgrades: ---")
ttk.Label(self.root, textvariable=self.buildings_var, font=("Arial", 10)).pack()
self.status = tk.StringVar(value="Click START")
ttk.Label(self.root, textvariable=self.status, font=("Arial", 10)).pack(pady=20)
def start_bot(self):
self.status.set("Starting browser...")
self.root.update()
driver, browser = detect_and_create_driver()
if not driver:
messagebox.showerror("Error", "No browser!")
return
self.status.set(f"{browser} - PICK LANGUAGE!")
self.comp = self.mode.get() == "COMP"
self.bot = Bot(driver)
self.start_btn.config(state="disabled")
self.stop_btn.config(state="normal")
self.result.set("---")
self.cps_var.set("CPS: ---")
self.clicks_var.set("Clicks: ---")
self.buildings_var.set("Buildings: --- | Upgrades: ---")
self.timer.set("--")
self.phase.set("PICK LANGUAGE")
self.bot.load()
self.wait()
def wait(self):
if not self.bot:
return
if self.bot.ready():
self.bot.start()
self.status.set("GO!")
self.loop()
else:
self.root.after(50, self.wait)
def loop(self):
if not self.bot or not self.bot.running:
return
sec = self.bot.elapsed()
remaining = self.bot.remaining()
self.bot.cycle += 1
if self.bot.cycle % 10 == 0:
left = max(0, 60 - sec)
self.timer.set(f"{int(left)}" if self.comp else f"{int(sec)}")
self.cps_var.set(f"CPS: {self.bot.get_cps()}")
self.buildings_var.set(
f"Buildings: {self.bot.buildings_bought} | Upgrades: {self.bot.upgrades_bought}"
)
if self.comp and sec >= 60:
final = self.bot.get_cookies()
cps = self.bot.get_cps()
clicks = self.bot.clicks
self.result.set(f"{final:,.0f}")
self.cps_var.set(f"CPS: {cps}")
self.clicks_var.set(f"Clicks: {clicks:,}")
self.timer.set("0")
self.phase.set("DONE!")
self.status.set("Competition finished!")
self.bot.stop()
self.start_btn.config(state="normal")
self.stop_btn.config(state="disabled")
return
if remaining > 45:
self.bot.click(300)
self.bot.golden()
self.bot.upgrade()
self.bot.buy_cheapest(3)
self.phase.set("PHASE 1: RUSH BUILD")
elif remaining > 25:
self.bot.click(300)
self.bot.golden()
self.bot.upgrade()
self.bot.buy_smart(remaining)
self.phase.set("PHASE 2: SMART BUY")
# elif remaining > 15:
# self.bot.click(100)
# self.bot.golden()
# self.bot.upgrade()
# self.phase.set("PHASE 3: UPGRADES ONLY")
else:
self.bot.click(600)
self.bot.golden()
self.phase.set("PHASE 3: ACCUMULATE")
self.root.after(1, self.loop)
def stop_bot(self):
if self.bot:
self.bot.stop()
self.bot.close()
self.bot = None
self.status.set("Stopped")
self.timer.set("--")
self.start_btn.config(state="normal")
self.stop_btn.config(state="disabled")
def close(self):
if self.bot:
self.bot.close()
self.root.destroy()
def run(self):
self.root.protocol("WM_DELETE_WINDOW", self.close)
self.root.mainloop()
if __name__ == "__main__":
GUI().run()