🚀 Automated QwenCloud account registration & API key harvester with multi-threading, TUI dashboard, proxy rotation, and Gmail OAuth
Features • Prerequisites • Setup • Usage • How It Works
- ⚡ Multi-threaded — Run N browsers concurrently (
-t N) - 🖥️ TUI Dashboard — Real-time worker status, progress bar, ETA, CPU/Mem
- 👻 Invisible mode — Headed browser on Xvfb virtual display (CF-safe)
- 🔄 Proxy rotation — Each account gets a unique proxy, no reuse
- 📧 Gmail OAuth — Multi-account Gmail token management for email verification
- 🎭 Censor mode — Mask emails and API keys in output (
-c) - 🔄 Auto-resume — Login existing accounts to harvest missed API keys
- 📊 Scenario detection — Auto-detects all page states (signup, login, OTP, dashboard, etc.)
| Requirement | Install |
|---|---|
| Python 3.11+ | python.org |
| Google Chrome | google.com/chrome |
| Xvfb | sudo apt install xvfb |
| Playwright | pip install -r requirements.txt && playwright install chromium |
git clone https://github.com/Vanszs/qwencloud-generator.git
cd qwencloud-generator
pip install -r requirements.txt
playwright install chromiumEdit proxy.txt — one proxy per line:
username:password@host:port
python3 generate_email_list.py yourgmailuser -o email_list.txtThe script needs Gmail API access to read verification emails. Here's how to set it up:
- Go to Google Cloud Console
- Create a new project (any name)
- Go to APIs & Services → Library → search "Gmail API" → Enable
- Go to APIs & Services → Credentials → Create Credentials → OAuth client ID
- Application type: Desktop app → Create
- Download the JSON file (
client_secret_*.json) - Rename it to
client_secret.jsonand place it in this folder
For each base Gmail account you want to use, you need to get an OAuth refresh token:
python3 gmail_auth.pyIf you see accounts: [] — that's normal! You haven't authorized any account yet.
To authorize, generate an OAuth URL for your Gmail:
python3 -c "
from gmail_auth import _default_client
import urllib.parse
client = _default_client()
url = f'https://accounts.google.com/o/oauth2/auth?client_id={client["client_id"]}&redirect_uri=http%3A//localhost%3A8085/callback&scope=https%3A//www.googleapis.com/auth/gmail.readonly&response_type=code&access_type=offline&prompt=consent&login_hint=yourname%40gmail.com'
print(url)
"Replace yourname@gmail.com with your actual Gmail address.
- Open the printed URL in your browser
- Login with that Gmail account
- Click Allow on the consent screen
- You'll be redirected to
http://localhost:8085/callback?code=4/0Abc... - Copy the full URL from the address bar
- Exchange the code:
python3 -c "
from gmail_auth import exchange_code
exchange_code('yourname@gmail.com', '4/0Abc...')
print('Token saved!')
"Replace yourname@gmail.com with the same Gmail, and 4/0Abc... with the code from the URL.
Verify it worked:
python3 gmail_auth.py
# Should show: accounts: ['yourname@gmail.com']Repeat for each Gmail account you want to use.
# Single thread, browser visible
python3 run.py 10
# 5 threads, invisible (Xvfb)
python3 run.py 100 --headless -t 5
# 10 threads with censored output
python3 run.py 400 --headless -t 10 -cpython3 run.py 50 --headless -t 5 --resume| Flag | Description | Default |
|---|---|---|
N |
Target number of successful API keys | 5 |
--headless |
Run via Xvfb (invisible browser) | off |
--resume |
Resume already-registered accounts via login | off |
-t N |
Number of concurrent threads | 1 |
-c |
Censor emails/API keys in output | off |
--log |
Show full subprocess logs | off |
--self |
Run without proxy (use own IP) | off |
--nyx PROXY |
Use rotating proxy | — |
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Email List │───▶│ run.py │───▶│ qwencloud_full.py│
│ (Gmail) │ │ (Orchestrator)│ │ (Browser Auto) │
└─────────────┘ │ -t N threads │ │ - Signup/Login │
│ TUI Dashboard │ │ - OTP verify │
┌─────────────┐ │ Proxy claim │ │ - API key extract│
│ proxy.txt │───▶│ Email claim │ └─────────────────┘
└─────────────┘ └──────────────┘ │
│ ▼
┌──────────────┐ ┌─────────────┐
│ api_keys.txt│◀─────│ accounts.json│
└──────────────┘ └─────────────┘
- Each thread claims a unique email + proxy (thread-safe)
- Spawns
qwencloud_full.pyas subprocess (Playwright is not thread-safe) - Monitors subprocess output for progress updates → TUI
- Parses
__RESULT__JSON from stdout - Saves API keys to
api_keys.txtand account data toaccounts.json
| File | Purpose |
|---|---|
run.py |
Main orchestrator — threading, TUI, proxy/email claiming |
qwencloud_full.py |
Browser automation — signup, login, API key extraction |
gmail_auth.py |
Gmail OAuth multi-account token management |
generate_email_list.py |
Generate Gmail dot-variants |
logger.py |
Colored logging utilities |
tui.py |
Terminal UI dashboard (ANSI escape codes, no dependencies) |
run_hidden.sh |
Xvfb wrapper script |
- Each browser instance gets 1 unique proxy — no reuse
- Gmail dot-variants work as separate QwenCloud accounts
- Stuck processes are killed after 30s of no output
- Total timeout per account: 300s
- Cloudflare requires headed browser (use
--headlesswhich runs Xvfb, not true headless)
MIT — feel free to use, modify, and distribute.
