123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
import os
import time
import random
import json
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.chrome.service import Service
# ----------- AYARLAR & XPATH'LER -----------
EXAM_START_URL = "https://panel.evdekiakademi.com/"
GEMINI_URL = "https://gemini.google.com/"
SCREENSHOT_PATH = "question.png"
XPATH_PLUS_BTN = '/html/body/chat-app/main/side-navigation-v2/bard-sidenav-container/bard-sidenav-content/div[2]/div/div[2]/chat-window/div/input-container/div/input-area-v2/div/div/div[2]/div/uploader/div/div/button/mat-icon'
XPATH_UPLOAD_BTN = '/html/body/div[7]/div/div/mat-card/mat-action-list/images-files-uploader/button[1]'
XPATH_FILE_INPUT = "//input[@type='file']"
XPATH_PROMPT_BOX = '/html/body/chat-app/main/side-navigation-v2/bard-sidenav-container/bard-sidenav-content/div[2]/div/div[2]/chat-window/div/input-container/div/input-area-v2/div/div/div[1]/div/div/rich-textarea/div[1]/p'
XPATH_SEND_BTN = '/html/body/chat-app/main/side-navigation-v2/bard-sidenav-container/bard-sidenav-content/div[2]/div/div[2]/chat-window/div/input-container/div/input-area-v2/div/div/div[3]/div/div[2]/button'
XPATH_GEMINI_ANSWER = '//div[contains(@class,"response-content")]//pre'
PROMPT_TEXT = '''
Bu görselde çoktan seçmeli bir soru var. Cevabı sadece şu formatta JSON olarak ver:
{
"cevap": "D"
}
Eğer cevaptan emin değilsen yine de bir şık seç. Lütfen sadece bu JSON formatını kullan, başka hiçbir şey yazma.
'''
def wait_xpath(driver, xpath, timeout=20):
return WebDriverWait(driver, timeout).until(
EC.presence_of_element_located((By.XPATH, xpath))
)
def wait_clickable(driver, xpath, timeout=20):
return WebDriverWait(driver, timeout).until(
EC.element_to_be_clickable((By.XPATH, xpath))
)
def random_delay(a=1, b=3):
time.sleep(random.uniform(a, b))
def main():
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument(r"--user-data-dir=C:\Users\sbatu\AppData\Local\Google\Chrome\User Data")
chrome_options.add_argument(r'--profile-directory=Profile 2')
driver_path = os.path.join(os.getcwd(), "chromedriver.exe")
service = Service(driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
print("[*] Başlangıç sayfası açılıyor. Sınavı manuel aç, soruyu tam görünür yap.")
driver.get(EXAM_START_URL)
while True:
input("[*] Soruyu tam olarak görünür yaptıysan ve ekran görüntüsü alınmasını istiyorsan ENTER'a bas...")
print("[*] Ekran görüntüsü alınıyor...")
driver.save_screenshot(SCREENSHOT_PATH)
print(f"[*] '{SCREENSHOT_PATH}' olarak kaydedildi.")
print("[*] Yeni sekmede Gemini açılıyor...")
driver.execute_script("window.open('');")
driver.switch_to.window(driver.window_handles[-1])
driver.get(GEMINI_URL)
random_delay(5, 8)
print("[*] Artı (+) tuşuna basılıyor...")
plus_btn = wait_clickable(driver, XPATH_PLUS_BTN)
plus_btn.click()
random_delay(1, 2)
print("[*] Dosya yükle butonuna basılıyor...")
upload_btn = wait_clickable(driver, XPATH_UPLOAD_BTN)
upload_btn.click()
random_delay(1, 2)
print("[*] Dosya inputuna ekran görüntüsü gönderiliyor...")
file_input = wait_xpath(driver, XPATH_FILE_INPUT)
abs_path = os.path.abspath(SCREENSHOT_PATH)
file_input.send_keys(abs_path)
random_delay(6, 10)
print("[*] JSON promptu yapıştırılıyor...")
prompt_box = wait_xpath(driver, XPATH_PROMPT_BOX)
prompt_box.click()
prompt_box.send_keys(PROMPT_TEXT)
random_delay(1, 2)
send_btn = wait_clickable(driver, XPATH_SEND_BTN)
send_btn.click()
print("[*] Prompt gönderildi, Gemini cevabı bekleniyor...")
answer_elem = WebDriverWait(driver, 40).until(
EC.presence_of_element_located((By.XPATH, XPATH_GEMINI_ANSWER))
)
answer_text = answer_elem.text.strip()
print(f"[*] Gemini cevabı:\n{answer_text}")
try:
answer_json = json.loads(answer_text)
secilen_sik = answer_json.get("cevap", "").upper()
if secilen_sik not in ["A", "B", "C", "D"]:
raise ValueError("Geçersiz şık")
except Exception:
print("[!] JSON parse hatası veya geçersiz cevap, rastgele şık seçiliyor.")
secilen_sik = random.choice(["A", "B", "C", "D"])
print(f"[*] Seçilen şık: {secilen_sik}")
print("[*] Ana sınav sekmesine dönülüyor...")
driver.switch_to.window(driver.window_handles[0])
random_delay(1, 2)
print("[*] Şıkları arıyor, seçim senin onayına bırakıldı...")
options = driver.find_elements(By.CLASS_NAME, "secenek")
matched = False
for opt in options:
text = opt.text.strip()
if text.startswith(secilen_sik):
opt.click()
matched = True
print(f"[*] '{secilen_sik}' şıkkı seçildi. Onaylamak için kendin tıkla.")
break
if not matched:
print("[!] Şık bulunamadı, manuel seçmen gerekecek.")
print("[*] Yeni soruyu açıp aynı şekilde devam edebilirsin.")
except KeyboardInterrupt:
print("[*] Bot kapatıldı.")
except Exception as e:
print("[!] Hata:", e)
finally:
driver.quit()
if __name__ == "__main__":
main()