#!/usr/bin/env python3
"""
Amazon Bot - Otomatik Kurulum Scripti
Bu script Amazon Bot'u sıfırdan kurmak için gereken tüm işlemleri otomatik yapar.
"""
import os
import sys
import subprocess
import shutil
import json
import platform
from pathlib import Path
from typing import Dict, List, Optional, Tuple
# Renk kodları
class Colors:
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
MAGENTA = '\033[95m'
CYAN = '\033[96m'
WHITE = '\033[97m'
BOLD = '\033[1m'
END = '\033[0m'
def print_colored(message: str, color: str = Colors.WHITE) -> None:
"""Renkli mesaj yazdır"""
print(f"{color}{message}{Colors.END}")
def print_step(step_num: int, message: str) -> None:
"""Adım numarası ile mesaj yazdır"""
print_colored(f"\n{step_num}. {message}", Colors.CYAN + Colors.BOLD)
def print_success(message: str) -> None:
"""Başarı mesajı yazdır"""
print_colored(f"✅ {message}", Colors.GREEN)
def print_warning(message: str) -> None:
"""Uyarı mesajı yazdır"""
print_colored(f"⚠️ {message}", Colors.YELLOW)
def print_error(message: str) -> None:
"""Hata mesajı yazdır"""
print_colored(f"❌ {message}", Colors.RED)
def print_info(message: str) -> None:
"""Bilgi mesajı yazdır"""
print_colored(f"ℹ️ {message}", Colors.BLUE)
def run_command(command: str, check: bool = True, shell: bool = True) -> Tuple[bool, str]:
"""Komut çalıştır ve sonucu döndür"""
try:
result = subprocess.run(
command,
shell=shell,
capture_output=True,
text=True,
check=check
)
return True, result.stdout.strip()
except subprocess.CalledProcessError as e:
return False, e.stderr.strip()
def check_python_version() -> bool:
"""Python versiyonunu kontrol et"""
print_step(1, "Python versiyonu kontrol ediliyor...")
version = sys.version_info
if version.major == 3 and version.minor >= 8:
print_success(f"Python {version.major}.{version.minor}.{version.micro} uygun")
return True
else:
print_error(f"Python 3.8+ gerekli. Mevcut: {version.major}.{version.minor}.{version.micro}")
print_info("Python'u https://python.org adresinden indirin")
return False
def check_git() -> bool:
"""Git kurulumunu kontrol et"""
print_step(2, "Git kurulumu kontrol ediliyor...")
success, output = run_command("git --version", check=False)
if success:
print_success(f"Git mevcut: {output}")
return True
else:
print_warning("Git bulunamadı")
print_info("Git'i https://git-scm.com adresinden indirin")
return False
def create_virtual_environment() -> bool:
"""Sanal ortam oluştur"""
print_step(3, "Sanal ortam oluşturuluyor...")
venv_path = Path("venv")
if venv_path.exists():
print_warning("Sanal ortam zaten mevcut")
return True
success, output = run_command(f"{sys.executable} -m venv venv")
if success:
print_success("Sanal ortam oluşturuldu")
return True
else:
print_error(f"Sanal ortam oluşturulamadı: {output}")
return False
def get_pip_command() -> str:
"""Platform'a göre pip komutu döndür"""
system = platform.system()
if system == "Windows":
return "venv\\Scripts\\pip"
else:
return "venv/bin/pip"
def get_python_command() -> str:
"""Platform'a göre python komutu döndür"""
system = platform.system()
if system == "Windows":
return "venv\\Scripts\\python"
else:
return "venv/bin/python"
def install_requirements() -> bool:
"""Gereksinimleri yükle"""
print_step(4, "Python paketleri yükleniyor...")
# requirements.txt dosyası var mı kontrol et
if not Path("requirements.txt").exists():
print_error("requirements.txt dosyası bulunamadı")
return False
pip_cmd = get_pip_command()
# Pip'i güncelle
print_info("pip güncelleniyor...")
success, output = run_command(f"{pip_cmd} install --upgrade pip")
if not success:
print_warning(f"pip güncellemesi başarısız: {output}")
# Paketleri yükle
print_info("Paketler yükleniyor...")
success, output = run_command(f"{pip_cmd} install -r requirements.txt")
if success:
print_success("Python paketleri yüklendi")
return True
else:
print_error(f"Paket yükleme başarısız: {output}")
return False
def install_playwright() -> bool:
"""Playwright browser'ını yükle"""
print_step(5, "Playwright browser yükleniyor...")
python_cmd = get_python_command()
# Playwright'i yükle
success, output = run_command(f"{python_cmd} -m playwright install chromium")
if success:
print_success("Playwright chromium yüklendi")
return True
else:
print_error(f"Playwright yükleme başarısız: {output}")
return False
def create_env_file() -> bool:
"""Çevre değişkenleri dosyası oluştur"""
print_step(6, ".env dosyası oluşturuluyor...")
# .env zaten varsa yedekle
env_path = Path(".env")
if env_path.exists():
backup_path = Path(".env.backup")
shutil.copy2(env_path, backup_path)
print_warning(f".env dosyası {backup_path} olarak yedeklendi")
# .env.example'dan kopyala
example_path = Path(".env.example")
if not example_path.exists():
print_error(".env.example dosyası bulunamadı")
return False
shutil.copy2(example_path, env_path)
print_success(".env dosyası oluşturuldu")
return True
def collect_user_input() -> Dict[str, str]:
"""Kullanıcıdan konfigürasyon bilgilerini al"""
print_step(7, "Konfigürasyon bilgileri alınıyor...")
config = {}
print_colored("\n📧 Amazon Hesap Bilgileri", Colors.YELLOW + Colors.BOLD)
config['AMAZON_EMAIL'] = input("Amazon e-posta adresinizi girin: ").strip()
config['AMAZON_PASSWORD'] = input("Amazon şifrenizi girin: ").strip()
print_colored("\n🤖 Bot Ayarları", Colors.YELLOW + Colors.BOLD)
dry_run = input("Test modu (DRY_RUN) aktif olsun mu? [Y/n]: ").strip().lower()
config['DRY_RUN'] = "False" if dry_run == 'n' else "True"
headless = input("Tarayıcı gizli modda (headless) çalışsın mı? [y/N]: ").strip().lower()
config['HEADLESS'] = "True" if headless == 'y' else "False"
loop_wait = input("Döngü aralığı (dakika) [2]: ").strip()
config['LOOP_WAIT_MINUTES'] = loop_wait if loop_wait else "2"
print_colored("\n📧 Gmail API Ayarları (2FA İçin)", Colors.YELLOW + Colors.BOLD)
print_info("2FA (İki Faktörlü Kimlik Doğrulama) olan hesaplar için Gmail API gereklidir")
print_info("Gmail API, Amazon'dan gelen doğrulama kodlarını otomatik okur")
gmail_setup = input("Gmail API kurmak ister misiniz? [Y/n]: ").strip().lower()
if gmail_setup != 'n':
print_info("Gmail API kurulumu için:")
print_info("1. Google Cloud Console'a gidin (console.cloud.google.com)")
print_info("2. Yeni proje oluşturun")
print_info("3. Gmail API'yi aktifleştirin")
print_info("4. OAuth 2.0 credentials oluşturun")
print_info("5. credentials.json dosyasını indirin")
print_info("6. Dosyayı proje klasörüne koyun")
config['GMAIL_ENABLED'] = "True"
config['GMAIL_2FA_ENABLED'] = "True"
print_warning("Gmail API kurulumu manuel olarak tamamlanmalı!")
print_info("Detaylar için INSTALLATION.md dosyasını kontrol edin")
else:
config['GMAIL_ENABLED'] = "False"
config['GMAIL_2FA_ENABLED'] = "False"
print_colored("\n📱 Telegram Ayarları (Opsiyonel)", Colors.YELLOW + Colors.BOLD)
telegram_setup = input("Telegram bildirimi kurmak ister misiniz? [y/N]: ").strip().lower()
if telegram_setup == 'y':
print_info("Telegram bot kurulumu için:")
print_info("1. @BotFather'a gidin")
print_info("2. /newbot komutu ile bot oluşturun")
print_info("3. Token'ı kopyalayın")
config['TELEGRAM_BOT_TOKEN'] = input("Telegram Bot Token: ").strip()
print_info("4. Bot'a bir mesaj gönderin")
print_info("5. https://api.telegram.org/bot<TOKEN>/getUpdates adresini ziyaret edin")
print_info("6. 'chat':{'id':123456} değerini bulun")
config['TELEGRAM_CHAT_ID'] = input("Telegram Chat ID: ").strip()
config['ENABLE_NOTIFICATIONS'] = "True"
else:
config['TELEGRAM_BOT_TOKEN'] = ""
config['TELEGRAM_CHAT_ID'] = ""
config['ENABLE_NOTIFICATIONS'] = "False"
return config
def update_env_file(config: Dict[str, str]) -> bool:
"""Çevre değişkenleri dosyasını güncelle"""
print_step(8, ".env dosyası güncelleniyor...")
env_path = Path(".env")
if not env_path.exists():
print_error(".env dosyası bulunamadı")
return False
# Mevcut .env dosyasını oku
with open(env_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
# Yeni değerleri uygula
updated_lines = []
for line in lines:
line = line.strip()
if '=' in line and not line.startswith('#'):
key = line.split('=')[0]
if key in config:
value = config[key]
# String değerleri tırnak içine al
if key in ['AMAZON_EMAIL', 'AMAZON_PASSWORD', 'TELEGRAM_BOT_TOKEN', 'TELEGRAM_CHAT_ID']:
updated_lines.append(f'{key}="{value}"\n')
else:
updated_lines.append(f'{key}={value}\n')
else:
updated_lines.append(line + '\n')
else:
updated_lines.append(line + '\n')
# Güncellenmiş dosyayı yaz
with open(env_path, 'w', encoding='utf-8') as f:
f.writelines(updated_lines)
print_success(".env dosyası güncellendi")
return True
def setup_gmail_api() -> bool:
"""Gmail API kurulumu kontrol et"""
print_step(9, "Gmail API kurulumu kontrol ediliyor...")
# credentials.json dosyası var mı kontrol et
credentials_path = Path("credentials.json")
if credentials_path.exists():
print_success("credentials.json bulundu")
# setup_gmail_api.py çalıştırma seçeneği sun
python_cmd = get_python_command()
run_setup = input("Gmail API authentication'u şimdi çalıştırmak ister misiniz? [y/N]: ").strip().lower()
if run_setup == 'y':
print_info("Gmail API authentication çalıştırılıyor...")
success, output = run_command(f"{python_cmd} setup_gmail_api.py", check=False)
if success:
print_success("Gmail API authentication tamamlandı")
return True
else:
print_warning(f"Gmail API authentication başarısız: {output}")
print_info("Daha sonra manuel olarak 'python setup_gmail_api.py' çalıştırın")
return True
else:
print_info("Gmail API authentication'u daha sonra manuel olarak çalıştırın")
print_info("Komut: python setup_gmail_api.py")
return True
else:
print_warning("credentials.json dosyası bulunamadı")
print_info("Gmail API kurulumu için:")
print_info("1. Google Cloud Console'a gidin")
print_info("2. Gmail API'yi aktifleştirin")
print_info("3. OAuth 2.0 credentials oluşturun")
print_info("4. credentials.json dosyasını indirin ve buraya koyun")
print_info("5. 'python setup_gmail_api.py' komutunu çalıştırın")
return True
def setup_products_json() -> bool:
"""Ürün listesi dosyasını ayarla"""
print_step(10, "Ürün listesi ayarlanıyor...")
products_path = Path("app/products.json")
if products_path.exists():
print_warning("products.json zaten mevcut, atlanıyor")
return True
# Varsayılan ürün listesi oluştur
default_products = [
{
"asin": "B0F3JWFL56",
"target_price": 299.99,
"name": "Xiaomi TV Box S (Test Ürünü)"
}
]
with open(products_path, 'w', encoding='utf-8') as f:
json.dump(default_products, f, indent=2, ensure_ascii=False)
print_success("products.json oluşturuldu")
print_info("Ürün listesini düzenlemek için app/products.json dosyasını açın")
return True
def test_installation() -> bool:
"""Kurulumu test et"""
print_step(11, "Kurulum test ediliyor...")
python_cmd = get_python_command()
# Basit import testi
test_script = '''
import sys
sys.path.append('.')
try:
from app import config
print("✅ Config import edildi")
from app.utils.logger import get_logger
print("✅ Logger import edildi")
from app.tasks.price_checker import check_product_price
print("✅ Price checker import edildi")
from app.tasks.purchase import purchase_product_with_buynow
print("✅ Purchase import edildi")
# Gmail API test (varsa)
try:
from app.utils.gmail_reader import GmailReader
print("✅ Gmail Reader import edildi")
# Gmail API bağlantısı test et
gmail = GmailReader()
if gmail.is_connected():
print("✅ Gmail API bağlantısı aktif")
else:
print("⚠️ Gmail API bağlantısı yok (normal, credentials gerekli)")
except Exception as e:
print(f"ℹ️ Gmail API test atlandi: {e}")
print("🎉 Tüm modüller başarıyla import edildi!")
except Exception as e:
print(f"❌ Import hatası: {e}")
sys.exit(1)
'''
success, output = run_command(f'{python_cmd} -c "{test_script}"')
if success:
print_success("Import testleri başarılı")
print_colored(output, Colors.GREEN)
return True
else:
print_error(f"Import testleri başarısız: {output}")
return False
def create_run_scripts() -> bool:
"""Çalıştırma scriptleri oluştur"""
print_step(12, "Çalıştırma scriptleri oluşturuluyor...")
system = platform.system()
python_cmd = get_python_command()
if system == "Windows":
# Windows batch dosyası
run_script = f'''@echo off
echo Amazon Bot başlatılıyor...
{python_cmd} -m app.main
pause
'''
with open("run_bot.bat", 'w', encoding='utf-8') as f:
f.write(run_script)
# Test scripti
test_script = f'''@echo off
echo Amazon Bot test ediliyor...
{python_cmd} test_simple.py
pause
'''
with open("test_bot.bat", 'w', encoding='utf-8') as f:
f.write(test_script)
print_success("Windows scriptleri oluşturuldu: run_bot.bat, test_bot.bat")
else:
# Linux/macOS bash dosyası
run_script = f'''#!/bin/bash
echo "Amazon Bot başlatılıyor..."
{python_cmd} -m app.main
'''
with open("run_bot.sh", 'w', encoding='utf-8') as f:
f.write(run_script)
os.chmod("run_bot.sh", 0o755)
# Test scripti
test_script = f'''#!/bin/bash
echo "Amazon Bot test ediliyor..."
{python_cmd} test_simple.py
'''
with open("test_bot.sh", 'w', encoding='utf-8') as f:
f.write(test_script)
os.chmod("test_bot.sh", 0o755)
print_success("Linux/macOS scriptleri oluşturuldu: run_bot.sh, test_bot.sh")
return True
def print_final_instructions() -> None:
"""Son talimatları yazdır"""
print_colored("\n" + "="*60, Colors.GREEN + Colors.BOLD)
print_colored("🎉 AMAZON BOT KURULUMU TAMAMLANDI!", Colors.GREEN + Colors.BOLD)
print_colored("="*60, Colors.GREEN + Colors.BOLD)
print_colored("\n📋 Sonraki Adımlar:", Colors.YELLOW + Colors.BOLD)
print_colored("1. Konfigürasyonu Kontrol Edin:", Colors.CYAN)
print_info(" - .env dosyasını açın ve ayarları kontrol edin")
print_info(" - app/products.json dosyasını düzenleyin")
print_colored("2. İlk Test Yapın:", Colors.CYAN)
system = platform.system()
if system == "Windows":
print_info(" - test_bot.bat dosyasını çalıştırın")
print_info(" - Veya: venv\\Scripts\\python test_simple.py")
else:
print_info(" - ./test_bot.sh dosyasını çalıştırın")
print_info(" - Veya: venv/bin/python test_simple.py")
print_colored("3. Gmail API Kurulumu (2FA İçin):", Colors.CYAN)
if system == "Windows":
print_info(" - venv\\Scripts\\python setup_gmail_api.py")
else:
print_info(" - venv/bin/python setup_gmail_api.py")
print_info(" - credentials.json dosyasını indirin ve buraya koyun")
print_info(" - Detaylar: INSTALLATION.md -> Gmail API Kurulumu")
print_colored("4. Login Test Yapın:", Colors.CYAN)
if system == "Windows":
print_info(" - venv\\Scripts\\python debug_login_flow.py")
else:
print_info(" - venv/bin/python debug_login_flow.py")
print_colored("5. Bot'u Başlatın (Test Modu):", Colors.CYAN)
if system == "Windows":
print_info(" - run_bot.bat dosyasını çalıştırın")
print_info(" - Veya: venv\\Scripts\\python -m app.main")
else:
print_info(" - ./run_bot.sh dosyasını çalıştırın")
print_info(" - Veya: venv/bin/python -m app.main")
print_colored("\n⚠️ Önemli Uyarılar:", Colors.RED + Colors.BOLD)
print_warning("- İlk çalıştırma mutlaka DRY_RUN=True modunda olmalı!")
print_warning("- Gerçek satın alma yapmadan önce test edin!")
print_warning("- Log dosyalarını takip edin!")
print_colored("\n📚 Dokümantasyon:", Colors.BLUE)
print_info("- README.md: Genel kullanım")
print_info("- INSTALLATION.md: Detaylı kurulum")
print_info("- CONFIGURATION.md: Ayar seçenekleri")
print_info("- TROUBLESHOOTING.md: Sorun giderme")
print_colored("\n🎯 Başarılı kurulum! Bot'unuz kullanıma hazır.", Colors.GREEN + Colors.BOLD)
def main() -> None:
"""Ana kurulum fonksiyonu"""
print_colored("🛒 AMAZON BOT - OTOMATİK KURULUM", Colors.MAGENTA + Colors.BOLD)
print_colored("="*50, Colors.MAGENTA)
print_info("Bu script Amazon Bot'u otomatik olarak kuracak")
print_warning("Kurulum yaklaşık 5-10 dakika sürebilir")
input("\nDevam etmek için Enter'a basın...")
# Kurulum adımları
steps = [
("Python versiyonu kontrol", check_python_version),
("Git kurulumu kontrol", check_git),
("Sanal ortam oluşturma", create_virtual_environment),
("Python paketlerini yükleme", install_requirements),
("Playwright browser yükleme", install_playwright),
(".env dosyası oluşturma", create_env_file),
("Kullanıcı girişi alma", lambda: collect_user_input()),
(".env dosyasını güncelleme", lambda: update_env_file(config)),
("Gmail API kurulumu", setup_gmail_api),
("Ürün listesi ayarlama", setup_products_json),
("Kurulum testi", test_installation),
("Çalıştırma scriptleri", create_run_scripts)
]
config = {}
failed_steps = []
for i, (step_name, step_func) in enumerate(steps, 1):
try:
if step_name == "Kullanıcı girişi alma":
config = step_func()
if config:
print_success("Konfigürasyon bilgileri alındı")
else:
failed_steps.append(step_name)
elif step_name == ".env dosyasını güncelleme":
if not step_func():
failed_steps.append(step_name)
else:
if not step_func():
failed_steps.append(step_name)
print_error(f"Adım başarısız: {step_name}")
except KeyboardInterrupt:
print_error("\nKurulum kullanıcı tarafından iptal edildi")
sys.exit(1)
except Exception as e:
print_error(f"Beklenmeyen hata ({step_name}): {e}")
failed_steps.append(step_name)
# Sonuçları göster
if failed_steps:
print_colored(f"\n⚠️ {len(failed_steps)} adım başarısız:", Colors.YELLOW + Colors.BOLD)
for step in failed_steps:
print_error(f"- {step}")
print_info("Başarısız adımları TROUBLESHOOTING.md dosyasından kontrol edin")
else:
print_success("\n✅ Tüm kurulum adımları başarılı!")
print_final_instructions()
if __name__ == "__main__":
main()