A full-stack browser automation suite for bulk Epic Games account management — built with Python, botasaurus-driver, and ADB-based mobile IP rotation.
Epic Provisioning Engine is a modular automation platform with three independent operational modes, all controlled through a unified dark-themed GUI dashboard. The system handles the complete Epic Games account lifecycle: registration, free game claiming, and receipt verification — with built-in anti-detection, CAPTCHA pause handling, 2FA resolution via IMAP, and dynamic IP rotation over USB-tethered Android devices.
epic-engine/
├── gui.py # CustomTkinter dashboard — unified control panel
├── create_epic_acc.py # Mode 1: Bulk account registration engine
├── claim_games.py # Mode 2: Free game claim automation
├── check_games.py # Mode 3: IMAP-based receipt verification
├── human_simulator.py # Browser abstraction layer (botasaurus-driver)
├── ip_rotator.py # ADB/Android airplane-mode IP rotation
├── mail_reader.py # Rambler IMAP — Epic 2FA code extractor
├── requirements.txt # Python dependencies
├── accounts/ # Output: registered accounts (DisplayName:Email:Password)
├── game_accounts/<slug>/ # Output: per-game claim & check results
├── logs/ # Session terminal dumps
├── cookies/ & profiles/ # Browser persistence
└── screenshots/ # Debug captures
CustomTkinter-based control panel with live metrics: Network IP (auto-refreshed every 5s), loaded account count, success/fail counters, uptime timer, and ETA estimate. Redirects stdout to an embedded terminal widget. Supports Start / Pause / Resume / Emergency Stop with per-module shared state flags propagated to all three engines simultaneously.
Smart filtering on engine start: already-processed accounts are skipped automatically based on per-mode success file lookups, preventing duplicate work across sessions.
Automates the full Epic Games registration flow end-to-end:
- Date-of-birth page (randomized DOB, 1990–2003 range)
- Email submission via React-compatible JS
InputEventinjection - Registration form: random Turkish first/last name from curated lists, unique display name generation (16 formats, deduplication against existing success file)
- Terms of service acceptance
- Email verification code retrieval via
mail_reader - CAPTCHA detection with human pause (waits for manual solve, then continues automatically)
Retry logic: up to 2 attempts per account with a fresh browser instance per retry. Auto-retry pass runs at the end of the batch for all failures.
Logs into existing accounts and claims a target free game by Epic Store URL:
- Login with React-safe JS value injection (handles special characters via
json.dumps) - Post-login flow: CAPTCHA handling, 2FA code injection (digit-by-digit via
mail_reader), EULA auto-accept, age gate bypass - Game page navigation with modal cleanup loop
- "Get" button click → smart "Place Order" searcher (scans both main DOM and iframes)
- Order confirmation detection (
Thanks for your order!/Ready to install)
Session drop detection (redirect back to /id/login) triggers retry. Already-owned games are marked as success and skipped.
IMAP-based receipt verification without opening a browser. Connects to Rambler accounts, scans the last 15 emails across INBOX, Spam, Junk, and Чеки (Russian "Receipts" folder) for Epic Games invoice keywords (receipt, invoice, order id). Auto-skips already-verified emails within and across sessions using an in-memory set synced to the success file.
Wraps botasaurus-driver with human-behavior primitives:
human_type(): Gaussian-distributed per-character delay (WPM-based), extra pauses on punctuation/spacesclear_and_type(): React-safe input clearing via JS property descriptor override +InputEventdispatchthink_pause(),micro_pause(): randomized wait helpers- Cookie save/load, screenshot capture, element waiting with graceful
Nonereturns - Profile persistence via
botasaurus-driverprofile paths
Controls an ADB-connected Android device (tested on Samsung S24 / Android 11+) using real airplane mode commands:
adb shell cmd connectivity airplane-mode enable/disable
Rotation strategy: aggressive retry loop with escalating airplane-mode hold duration (base 5s + 10s per attempt). Verifies IP change via api.ipify.org before confirming success. Triggers every N accounts (configurable, default: 3). First rotation is forced on system startup.
Connects to imap.rambler.ru:993 (SSL). Records current mail IDs across all folders before the verification email is triggered, then polls only for genuinely new messages — eliminating false positives from old Epic emails. Extracts 6-digit codes via a priority-ordered regex chain covering multiple Epic email HTML layouts.
pip install -r requirements.txtadb.exe is not included in this repository (binary files should not be version-controlled).
Download the Android Platform Tools from the official source:
→ https://developer.android.com/tools/releases/platform-tools
Extract and either place adb in the project root or add it to your system PATH.
USB Debugging must be enabled on your Android device.
Prepare a .txt file with one account per line:
# Create Accounts mode
email@rambler.ru:password
# Claim / Check mode
DisplayName:email@rambler.ru:password
python gui.py- Load account file via 📁 Load Account File
- Select operation mode (Create / Claim / Check)
- For Claim/Check: paste the Epic Store game URL
- Toggle Mobile IP Rotator if ADB device is connected
- Click ▶ START ENGINE
Results are written to:
accounts/successfull_accounts.txt(Create mode)game_accounts/<game-slug>/successfull_accounts.txt(Claim mode)game_accounts/<game-slug>/checked_accounts.txt(Check mode)
| Layer | Technology |
|---|---|
| GUI | Python · CustomTkinter |
| Browser Automation | botasaurus-driver (Chromium) |
| Anti-Detection | Human typing simulation · Gaussian delay · JS React-safe input injection |
| CAPTCHA Handling | Pause-and-resume with visual GUI signal |
| Email / 2FA | Python imaplib · Rambler IMAP SSL |
| IP Rotation | ADB · Android airplane mode · api.ipify.org |
| Concurrency | Python threading (daemon worker thread per session) |
| Persistence | Plain-text account logs · pickle cookies · botasaurus profiles |
React-safe input injection — Standard element.send_keys() fails on React-controlled inputs because React's synthetic event system ignores direct DOM value writes. The engine uses the native HTMLInputElement value setter via Object.getOwnPropertyDescriptor and dispatches input/change/blur events manually, keeping React state in sync.
Stateful skip filtering — On each engine start, already-successful account emails are loaded from the output files into a set and filtered out before the batch begins. This makes runs fully idempotent — safe to stop and restart at any point without duplicate processing.
Escalating airplane-mode rotation — Mobile operators often reassign the same IP on short reconnects. The rotator combats this by holding airplane mode for progressively longer intervals (15s → 25s → 35s...) until a genuinely different IP is confirmed.
Per-module SharedState — Each engine module (create_epic_acc, claim_games, check_games) exposes its own SharedState class with is_running and is_paused flags. The GUI propagates Stop/Pause signals to all three simultaneously, allowing safe interruption at any point in the automation loop without thread killing.
This project is licensed under the MIT License — see the LICENSE file for details.