kodda session yönetimi eksik hocam, kodun başında eski sevgilimin adını görünce canlı çalıştırmaya üşendim direkt attım claude'a cevabını veriyorum. şaka bir yana ne yapmak istediğinizi detaylandırırsanız yardımcı olayım.
Muhtemel sorunlar ve çözümler:
  1. Chrome'un otomasyon algılaması nedeniyle bazı işlemler engellenebilir
  2. Yeni sekme açma yöntemi düzgün çalışmıyor olabilir
  3. Instagram'ın bot koruması devreye giriyor olabilir


Kullanıcının sorununu çözmek için kodda birkaç önemli değişiklik yaptım:
  1. Chrome'un otomasyon algılamasını engellemek için ek seçenekler ekledim
  2. Yeni sekme açma mantığını düzelttim
  3. Debug modu ekledim
  4. Test fonksiyonu ekledim
  5. Hata kontrollerini iyileştirdim
Ana sorunlar ve çözümleri:
  • Chrome'un bot koruması nedeniyle işlem yapılamaması -> Anti-detection ayarları eklendi
  • Yeni sekmelerde işlem yapılamaması -> Sekme değiştirme ve bekleme süreleri düzeltildi
  • Session yönetimi sorunları -> Daha iyi kontroller eklendi
Ana Sorunlar:
  1. Chrome'un Otomasyon Algılaması: Instagram, Selenium ile kontrol edildiğini algılıyor
  2. Sekme Değiştirme Sorunları: Yeni sekmeler açılıyor ama aktif olmuyor
  3. Bekleme Süreleri: Sayfalar tam yüklenmeden işlem yapılmaya çalışılıyor
Önemli Değişiklikler:

1. Anti-Detection Ayarları:


python
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")

2. JavaScript ile navigator.webdriver'ı kaldırma:


python
self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

3. Yeni Sekme Açma Düzeltmesi:


python
# JavaScript ile açma
self.driver.execute_script("window.open('about:blank', '_blank');")
time.sleep(1)

# Yeni sekmeye geçiş
new_tab = new_handles[-1]
self.driver.switch_to.window(new_tab)

# Instagram'a gitme
self.driver.get("https://www.instagram.com")

4. Test Fonksiyonu:


Yeni bir "Test Et" butonu ekledim. Bu, aktif sekmede işlem yapabildiğinizi kontrol etmenizi sağlar.
Öneriler:
  1. ChromeDriver Sürümü: ChromeDriver'ınızın Chrome sürümünüzle uyumlu olduğundan emin olun
  2. Profil İzinleri: Profile 6'nın doğru izinlere sahip olduğunu kontrol edin
  3. Instagram Giriş: Önce manuel olarak Profile 6'ya giriş yapın
  4. Bekleme Süreleri: Gerekirse time.sleep() sürelerini artırın
Kodu çalıştırmak için:
  1. "Chrome Başlat" butonuna tıklayın
  2. Chrome açıldıktan sonra "Test Et" butonuyla işlem yapabildiğinizi kontrol edin
  3. Ardından "Yeni Sekmeler Aç" butonunu kullanın
Debug modu açıkken tüm işlemler detaylı loglanacak, böylece sorunun tam olarak nerede olduğunu görebilirsiniz.

import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import threading
import psutil
import os
from datetime import datetime
import time
import subprocess

# ===================== AYARLAR =====================
CHROME_PATH = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
USER_DATA_DIR = r"C:\Users\İlayda\AppData\Local\Google\Chrome\User Data"
PROFILE_NAME = "Profile 6"
CHROMEDRIVER_PATH = r"C:\CD\chromedriver.exe"
INSTAGRAM_URL = "https://www.instagram.com/"
DOWNLOAD_XPATH = "/html/body/div[6]/div[1]/div/div[3]/div/div/div/div/div[2]/div/article/div/div[2]/div/div/div[2]/section[1]/span[4]/div/div[1]"
LOG_FILE = os.path.join(os.getcwd(), "instagram_log.txt")
# ===================================================

class InstagramDownloader:
    def __init__(self, root):
        self.root = root
        self.driver = None
        self.log_file = None
        self.debug_mode = True  # Debug modu ekledik

        self.setup_ui()
        self.setup_log()

    def setup_ui(self):
        self.root.title("Instagram Downloader")
        self.root.geometry("800x600")

        main_frame = ttk.Frame(self.root)
        main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

        control_frame = ttk.Frame(main_frame)
        control_frame.pack(fill=tk.X)

        ttk.Button(control_frame, text="Chrome Başlat", command=self.start_process).pack(side=tk.LEFT)
        ttk.Button(control_frame, text="Chrome Tümünü Kapat", command=self.close_all_chrome).pack(side=tk.LEFT, padx=10)
        
        # Debug modu checkbox
        self.debug_var = tk.BooleanVar(value=True)
        ttk.Checkbutton(control_frame, text="Debug Modu", variable=self.debug_var).pack(side=tk.LEFT, padx=10)

        ttk.Label(control_frame, text="Yeni Sekme Sayısı:").pack(side=tk.LEFT, padx=10)
        self.tab_count_var = tk.IntVar(value=1)
        ttk.Entry(control_frame, width=5, textvariable=self.tab_count_var).pack(side=tk.LEFT)

        ttk.Button(control_frame, text="Yeni Sekmeler Aç", command=self.open_new_tabs).pack(side=tk.LEFT, padx=10)
        ttk.Button(control_frame, text="Test Et", command=self.test_instagram).pack(side=tk.LEFT, padx=10)

        self.status_label = ttk.Label(control_frame, text="Hazır", foreground="blue")
        self.status_label.pack(side=tk.LEFT, padx=10)

        self.log_text = scrolledtext.ScrolledText(main_frame, wrap=tk.WORD)
        self.log_text.pack(fill=tk.BOTH, expand=True)

        ttk.Label(main_frame, text=f"Log dosyası: {LOG_FILE}", foreground="green").pack()

        self.root.protocol("WM_DELETE_WINDOW", self.on_close)

    def setup_log(self):
        try:
            self.log_file = open(LOG_FILE, "a", encoding="utf-8")
            self.write_log(f"\n\n===== Oturum Başladı ({datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) =====")
        except Exception as e:
            messagebox.showerror("Log Hatası", str(e))

    def write_log(self, msg):
        timestamp = datetime.now().strftime("[%H:%M:%S]")
        full_msg = f"{timestamp} {msg}"
        try:
            self.log_text.insert(tk.END, full_msg + "\n")
            self.log_text.see(tk.END)
            self.root.update()  # GUI'yi güncelle
        except:
            pass
        if self.log_file:
            try:
                self.log_file.write(full_msg + "\n")
                self.log_file.flush()
            except:
                pass

    def update_status(self, msg, color="blue"):
        self.status_label.config(text=msg, foreground=color)
        self.root.update()

    def kill_chrome_processes(self):
        """Chrome ve chromedriver süreçlerini temizle"""
        killed = 0
        for proc in psutil.process_iter(['name']):
            try:
                if proc.info['name'] and proc.info['name'].lower() in ('chrome.exe', 'chromedriver.exe'):
                    proc.kill()
                    killed += 1
            except:
                pass
        return killed

    def start_process(self):
        threading.Thread(target=self.run_browser, daemon=True).start()

    def run_browser(self):
        try:
            self.update_status("Chrome başlatılıyor...", "orange")
            self.write_log("Chrome başlatılıyor...")

            # Önce var olan Chrome'ları kapat (opsiyonel)
            if self.debug_var.get():
                killed = self.kill_chrome_processes()
                if killed > 0:
                    self.write_log(f"{killed} Chrome süreci kapatıldı")
                    time.sleep(2)  # Süreçlerin kapanması için bekle

            options = Options()
            options.binary_location = CHROME_PATH
            options.add_argument(f"user-data-dir={USER_DATA_DIR}")
            options.add_argument(f"--profile-directory={PROFILE_NAME}")
            
            # Otomasyon algılamayı engelle
            options.add_experimental_option("excludeSwitches", ["enable-automation"])
            options.add_experimental_option('useAutomationExtension', False)
            options.add_argument("--disable-blink-features=AutomationControlled")
            
            # Ek güvenlik ayarları
            options.add_argument("--no-sandbox")
            options.add_argument("--disable-dev-shm-usage")
            options.add_argument("--disable-gpu")
            options.add_argument("--start-maximized")
            
            # User-Agent ayarla
            options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")

            service = Service(CHROMEDRIVER_PATH)
            
            self.write_log("WebDriver oluşturuluyor...")
            self.driver = webdriver.Chrome(service=service, options=options)
            
            # JavaScript ile navigator.webdriver'ı kaldır
            self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
            
            self.write_log("Chrome başarıyla açıldı!")
            self.update_status("Chrome açıldı", "green")
            
            # Instagram'a git
            self.write_log(f"Instagram'a gidiliyor...")
            self.driver.get(INSTAGRAM_URL)
            
            # Sayfa yüklenmesini bekle
            time.sleep(5)
            
            self.write_log("Instagram sayfası yüklendi")
            self.update_status("Instagram açıldı", "green")

        except Exception as e:
            self.write_log(f"HATA: {str(e)}")
            self.update_status("Hata oluştu!", "red")
            self.driver = None
            messagebox.showerror("Hata", f"Chrome başlatılırken hata oluştu:\n\n{str(e)}")

    def test_instagram(self):
        """Instagram'da test işlemi yap"""
        if not self.driver:
            messagebox.showwarning("Uyarı", "Önce Chrome'u başlatın!")
            return
            
        try:
            self.update_status("Test ediliyor...", "orange")
            
            # Aktif sekmeyi kontrol et
            current_url = self.driver.current_url
            self.write_log(f"Aktif URL: {current_url}")
            
            # Instagram'da değilse git
            if "instagram.com" not in current_url:
                self.driver.get("https://www.instagram.com")
                time.sleep(3)
            
            # Sayfada bir element bul ve tıkla (örnek)
            try:
                # Arama kutusunu bul
                search_box = WebDriverWait(self.driver, 10).until(
                    EC.presence_of_element_located((By.XPATH, "//input[@placeholder='Search']"))
                )
                self.write_log("Arama kutusu bulundu!")
                
                # Arama kutusuna tıkla
                search_box.click()
                time.sleep(1)
                
                # Test metni yaz
                search_box.send_keys("test")
                self.write_log("Test metni yazıldı")
                
                self.update_status("Test başarılı!", "green")
                
            except Exception as e:
                self.write_log(f"Element bulunamadı: {str(e)}")
                # Alternatif: Sayfada herhangi bir tıklanabilir element bul
                try:
                    clickable = self.driver.find_element(By.TAG_NAME, "body")
                    clickable.click()
                    self.write_log("Body elementine tıklandı")
                except:
                    pass
                    
        except Exception as e:
            self.write_log(f"Test hatası: {str(e)}")
            self.update_status("Test başarısız!", "red")

    def open_new_tabs(self):
        """Yeni sekmeler aç ve Instagram'a git"""
        if not self.driver:
            messagebox.showwarning("Uyarı", "Önce Chrome'u başlatın!")
            return
        
        try:
            # Session kontrolü
            self.driver.current_url
        except Exception:
            messagebox.showwarning("Uyarı", "Chrome bağlantısı kopmuş! Tekrar başlatın.")
            self.driver = None
            return

        try:
            count = self.tab_count_var.get()
            if count < 1:
                messagebox.showwarning("Uyarı", "En az 1 sekme açmalısınız.")
                return

            self.update_status(f"{count} sekme açılıyor...", "orange")
            self.write_log(f"{count} yeni sekme açılıyor...")

            # Mevcut sekmeleri kaydet
            original_handles = self.driver.window_handles
            original_count = len(original_handles)
            
            # Ana sekmeye odaklan
            self.driver.switch_to.window(original_handles[0])

            successfully_opened = 0
            
            for i in range(count):
                try:
                    # Yöntem 1: JavaScript ile yeni sekme aç
                    self.driver.execute_script("window.open('about:blank', '_blank');")
                    time.sleep(1)
                    
                    # Yeni sekmeleri kontrol et
                    new_handles = self.driver.window_handles
                    if len(new_handles) > original_count + successfully_opened:
                        # En son açılan sekmeye geç
                        new_tab = new_handles[-1]
                        self.driver.switch_to.window(new_tab)
                        
                        # Instagram'a git
                        self.driver.get("https://www.instagram.com")
                        self.write_log(f"Sekme {i+1} açıldı ve Instagram yüklendi")
                        
                        # Sayfanın yüklenmesini bekle
                        time.sleep(2)
                        
                        # Sayfa başlığını kontrol et
                        title = self.driver.title
                        self.write_log(f"Sekme {i+1} başlığı: {title}")
                        
                        successfully_opened += 1
                    else:
                        self.write_log(f"Sekme {i+1} açılamadı")
                        
                except Exception as e:
                    self.write_log(f"Sekme {i+1} hatası: {str(e)}")

            # İlk sekmeye geri dön
            self.driver.switch_to.window(original_handles[0])
            
            # Sonuçları bildir
            self.write_log(f"Toplam {successfully_opened}/{count} sekme başarıyla açıldı")
            self.update_status(f"{successfully_opened} sekme açıldı", "green" if successfully_opened > 0 else "red")

            # Tüm sekmeleri listele
            if self.debug_var.get():
                self.write_log("Açık sekmeler:")
                for idx, handle in enumerate(self.driver.window_handles):
                    self.driver.switch_to.window(handle)
                    self.write_log(f"  Sekme {idx+1}: {self.driver.title} - {self.driver.current_url}")
                
                # Ana sekmeye dön
                self.driver.switch_to.window(original_handles[0])

        except Exception as e:
            self.write_log(f"Genel hata: {str(e)}")
            self.update_status("Sekme açma hatası!", "red")
            messagebox.showerror("Hata", f"Sekme açılırken hata oluştu:\n{e}")

    def is_chrome_open(self):
        for proc in psutil.process_iter(['name']):
            if proc.info['name'] and proc.info['name'].lower() == 'chrome.exe':
                return True
        return False

    def close_all_chrome(self):
        count = self.kill_chrome_processes()
        self.update_status(f"{count} Chrome işlemi kapatıldı.", "red")
        self.write_log(f"{count} Chrome işlemi kapatıldı")
        self.driver = None

    def on_close(self):
        try:
            if self.driver:
                self.driver.quit()
                self.write_log("WebDriver kapatıldı.")
        except:
            pass

        try:
            if self.log_file:
                self.write_log("Uygulama kapatıldı.")
                self.log_file.close()
        except:
            pass

        self.root.destroy()

# Ana uygulama başlatıcı
if __name__ == "__main__":
    try:
        root = tk.Tk()
        
        # Pencereyi ortala
        w, h = 800, 600
        sw, sh = root.winfo_screenwidth(), root.winfo_screenheight()
        root.geometry(f"{w}x{h}+{(sw - w) // 2}+{(sh - h) // 2}")
        
        app = InstagramDownloader(root)
        root.mainloop()
        
    except Exception as e:
        print(f"Uygulama başlatılırken hata oluştu: {e}")
        messagebox.showerror("Kritik Hata", f"Uygulama başlatılamadı:\n{e}")