import logging import requests import tempfile import dotenv import os from datetime import datetime from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import TimeoutException from selenium.common.exceptions import NoSuchElementException dotenv.load_dotenv(".env_d3") class StellaD3(): def __init__(self, local_save_dir:str="outputs", local_save:bool=True, show_debug_log:bool=False): try: if show_debug_log: logging.basicConfig(level=logging.DEBUG) self.local_save = local_save if self.local_save: self.local_save_dir = local_save_dir os.makedirs(self.local_save_dir, exist_ok=True) else: self.local_save_dir = None options = Options() options.add_argument("--headless=new") options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"]) options.add_argument('--disable-gpu') options.add_argument('--disable-blink-features=AutomationControlled') self.driver = webdriver.Chrome(options=options) self.driver.get(os.getenv("CONNECTOR_URL")) email_input = WebDriverWait(self.driver, 2).until(EC.visibility_of_element_located((By.ID, "i0116"))) email_input.send_keys(os.getenv("CONNECTOR_ID")) next_button = WebDriverWait(self.driver, 2).until(EC.element_to_be_clickable((By.ID, "idSIButton9"))) next_button.click() password_input = WebDriverWait(self.driver, 2).until(EC.visibility_of_element_located((By.ID, "i0118"))) password_input.send_keys(os.getenv("CONNECTOR_KEY")) next_button = WebDriverWait(self.driver, 2).until(EC.element_to_be_clickable((By.ID, "idSIButton9"))) next_button.click() accept_button = WebDriverWait(self.driver, 2).until(EC.element_to_be_clickable((By.ID, "acceptButton"))) accept_button.click() print('D3 initialized!') except Exception as e: print(f'Error: {e}') quit() def image_generator_d3(self, prompt): self.driver.get(os.getenv("CREATOR_URL")) self.driver.refresh() self.driver.find_element(By.ID, "sb_form_q").send_keys(prompt) self.driver.find_element(By.ID, "create_btn_c").click() output_files = [] if self.local_save: temp_dir = str(self.local_save_dir) temp_dir = os.path.join(temp_dir, datetime.now().strftime("%Y-%m-%d")) os.makedirs(temp_dir, exist_ok=True) else: temp_dir = None try: WebDriverWait(self.driver, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "gil_err_tc"))) raise Exception('GIL_ERR_TC (Prompt Blocked)') except TimeoutException: pass while True: print("GI_REFRESH (Refresh Initiated)") self.driver.refresh() try: WebDriverWait(self.driver, 15).until(EC.presence_of_element_located((By.CLASS_NAME, "img_cont"))) divs = self.driver.find_elements(By.CLASS_NAME, "img_cont") urls = [div.find_element(By.TAG_NAME, "img").get_attribute("src").split("?")[0] for div in divs] print('IMG_CONT (Complete!)') for url in urls: response = requests.get(url) with tempfile.NamedTemporaryFile(delete=False, prefix=f"{self.__class__.__name__}_", suffix=".png", dir=temp_dir) as output: output.write(response.content) output_files.append(output.name) return output_files except TimeoutException: try: img = self.driver.find_element(By.CLASS_NAME, "gir_mmimg") src = img.get_attribute("src").split("?")[0] print('GIR_MMIMG (Complete!)') response = requests.get(src) with tempfile.NamedTemporaryFile(delete=False, prefix=f"{self.__class__.__name__}_", suffix=".png", dir=temp_dir) as output: output.write(response.content) output_files.append(output.name) return output_files except NoSuchElementException: raise Exception('GIL_NOT_FOUND (Element Not Found)') if __name__ == "__main__": print("Import StellaD3 in another file to start using it!")