Control Panel
Active Accounts 0
Total
0
Working
0
shopee_bot_selenium.py
# Shopee Flash Sale Bot - Selenium Version # Author: GaneMaX.Ai # Requirements: pip install selenium webdriver-manager pandas import os import time import json import random import threading import pandas as pd from datetime import datetime from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from webdriver_manager.chrome import ChromeDriverManager from selenium.common.exceptions import TimeoutException, NoSuchElementException class ShopeeBot: """ Advanced Shopee Flash Sale Bot using Selenium """ def __init__(self, account, proxy=None, headless=False): self.account = account self.proxy = proxy self.headless = headless self.driver = None self.wait = None self.success = False self.order_id = None def setup_driver(self): """Setup Chrome driver with anti-detection measures""" options = Options() # Anti-detection options options.add_argument('--disable-blink-features=AutomationControlled') options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--disable-webgl') options.add_argument('--disable-software-rasterizer') options.add_argument('--disable-features=VizDisplayCompositor') # Random user agent user_agents = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/121.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15' ] options.add_argument(f'user-agent={random.choice(user_agents)}') # Proxy support if self.proxy: options.add_argument(f'--proxy-server={self.proxy}') # Window size randomization window_sizes = [(1920, 1080), (1366, 768), (1536, 864), (1440, 900)] width, height = random.choice(window_sizes) options.add_argument(f'--window-size={width},{height}') # Headless mode if self.headless: options.add_argument('--headless=new') # Initialize driver service = Service(ChromeDriverManager().install()) self.driver = webdriver.Chrome(service=service, options=options) self.wait = WebDriverWait(self.driver, 10) # Remove webdriver property self.driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") def random_delay(self, min_sec=1, max_sec=3): """Random delay to simulate human behavior""" time.sleep(random.uniform(min_sec, max_sec)) def login(self): """Login to Shopee""" try: print(f"[{self.account['nickname']}] Logging in...") # Click login button login_btn = self.wait.until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Masuk')]")) ) login_btn.click() self.random_delay(2, 4) # Enter username username_field = self.wait.until( EC.presence_of_element_located((By.NAME, "loginKey")) ) username_field.clear() for char in self.account['username']: username_field.send_keys(char) time.sleep(random.uniform(0.05, 0.15)) self.random_delay(1, 2) # Enter password password_field = self.driver.find_element(By.NAME, "password") password_field.clear() for char in self.account['password']: password_field.send_keys(char) time.sleep(random.uniform(0.05, 0.15)) self.random_delay(1, 2) # Submit login submit_btn = self.driver.find_element(By.XPATH, "//button[contains(text(), 'Masuk')]") submit_btn.click() # Wait for login to complete time.sleep(5) # Check if login successful if "login" not in self.driver.current_url.lower(): print(f"[{self.account['nickname']}] Login successful") return True else: print(f"[{self.account['nickname']}] Login failed") return False except Exception as e: print(f"[{self.account['nickname']}] Login error: {str(e)}") return False def handle_captcha(self): """Handle captcha if present""" try: captcha_elements = self.driver.find_elements(By.XPATH, "//*[contains(text(), 'captcha') or contains(text(), 'CAPTCHA')]") if captcha_elements: print(f"[{self.account['nickname']}] Captcha detected, waiting...") time.sleep(10) return True except: pass return False def purchase(self, url, quantity): """Execute purchase""" try: print(f"[{self.account['nickname']}] Navigating to product...") self.driver.get(url) self.random_delay(3, 5) # Handle any popups try: close_btn = self.driver.find_element(By.XPATH, "//button[contains(@class, 'close')]") close_btn.click() except: pass # Wait for buy button buy_btn = self.wait.until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Beli Sekarang')]")) ) # Adjust quantity if quantity > 1: try: for _ in range(quantity - 1): plus_btn = self.driver.find_element(By.XPATH, "//button[contains(@class, 'plus')]") plus_btn.click() time.sleep(random.uniform(0.3, 0.7)) except: print(f"[{self.account['nickname']}] Quantity adjustment failed, using default") # Click buy button buy_btn.click() self.random_delay(2, 4) # Wait for checkout page checkout_btn = self.wait.until( EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Checkout')]")) ) # Select shipping if needed try: shipping_options = self.driver.find_elements(By.XPATH, "//input[@type='radio']") if shipping_options: shipping_options[0].click() self.random_delay(1, 2) except: pass # Click checkout checkout_btn.click() self.random_delay(3, 5) # Check for order confirmation if "checkout" in self.driver.current_url.lower() or "order" in self.driver.current_url.lower(): print(f"[{self.account['nickname']}] Purchase successful!") # Try to get order ID try: order_elements = self.driver.find_elements(By.XPATH, "//*[contains(text(), 'Order') or contains(text(), 'Pesanan')]") for el in order_elements: text = el.text if "ORDER" in text.upper() or "PESANAN" in text.upper(): self.order_id = text break except: pass self.success = True return True else: print(f"[{self.account['nickname']}] Purchase may have failed") return False except TimeoutException: print(f"[{self.account['nickname']}] Timeout waiting for elements") return False except Exception as e: print(f"[{self.account['nickname']}] Purchase error: {str(e)}") return False def run(self, url, quantity): """Main execution flow""" try: self.setup_driver() self.driver.get("https://shopee.co.id") self.random_delay(3, 5) if self.login(): self.handle_captcha() result = self.purchase(url, quantity) return result else: return False except Exception as e: print(f"[{self.account['nickname']}] Bot error: {str(e)}") return False finally: if self.driver: time.sleep(random.uniform(1, 3)) self.driver.quit() def get_result(self): """Get execution result""" return { 'success': self.success, 'order_id': self.order_id, 'account': self.account['nickname'], 'timestamp': datetime.now().isoformat() } class BotManager: """Manager for running multiple bots""" def __init__(self): self.threads = [] self.results = [] self.lock = threading.Lock() def worker(self, account, url, quantity, proxy=None): """Worker thread function""" bot = ShopeeBot(account, proxy) result = bot.run(url, quantity) with self.lock: self.results.append({ 'account': account['nickname'], 'success': result, 'timestamp': datetime.now().isoformat() }) def run_batch(self, accounts, url, quantity, proxies=None, max_threads=5): """Run multiple bots simultaneously""" self.results = [] self.threads = [] # Limit threads accounts_to_run = accounts[:max_threads] for i, account in enumerate(accounts_to_run): proxy = proxies[i % len(proxies)] if proxies else None thread = threading.Thread( target=self.worker, args=(account, url, quantity, proxy) ) self.threads.append(thread) thread.start() # Stagger start time.sleep(random.uniform(1, 3)) # Wait for all threads for thread in self.threads: thread.join() return self.results # Example usage if __name__ == "__main__": # Load accounts from file accounts = [ {'nickname': 'Account1', 'username': 'user1@email.com', 'password': 'pass123'}, {'nickname': 'Account2', 'username': 'user2@email.com', 'password': 'pass456'}, ] # Load proxies proxies = [ '192.168.1.1:8080', '203.0.113.5:3128', ] # Bot configuration target_url = "https://shopee.co.id/product-link" quantity = 2 # Run manager manager = BotManager() results = manager.run_batch(accounts, target_url, quantity, proxies, max_threads=3) # Print results success_count = sum(1 for r in results if r['success']) print(f"\n=== Results ===") print(f"Total attempts: {len(results)}") print(f"Successful: {success_count}") print(f"Failed: {len(results) - success_count}") # Save results with open('bot_results.json', 'w') as f: json.dump(results, f, indent=2)
Attempts
0
Success
0
Success Rate
0%
Status
Idle
Active Target
iPhone 16 Pro Max
🏪 Shopee Flash Sale 📦 Stock: 15/1000
Rp 10.000
Flash Sale Starts In
02:30
Activity Log
[10:00:00] System ready