123 / app.py
gta5five's picture
Update app.py
5a9ad09 verified
Raw
History Blame Contribute Delete
20.1 kB
import asyncio
import hashlib
import html
import logging
import random
import re
import sqlite3
import string
import time
from datetime import datetime
from typing import Dict, Optional, Tuple
import httpx
# ================= CONFIGURATION =================
DB_FILE = "owl_enterprise.db"
WORKER_BASE_URL = "https://solvedtokens.scenic-quarry-plus.workers.dev"
NUM_WORKERS = 1
TELEGRAM_BOT_TOKEN = "8281589932:AAEWpeB7DhxxWjZxAmYqX4FvxvoyWxFITlU"
TELEGRAM_CHAT_ID = "-1003786783073"
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger(__name__)
# ================= DATABASE =================
class Database:
def __init__(self, db_file: str = DB_FILE):
self.conn = sqlite3.connect(db_file, check_same_thread=False)
self.init_db()
def init_db(self):
c = self.conn.cursor()
c.executescript(
"""
PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;
CREATE TABLE IF NOT EXISTS generated_accounts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
token TEXT NOT NULL,
userid TEXT NOT NULL,
email TEXT,
password TEXT,
remaining_traffic INTEGER DEFAULT 200,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
assigned_to INTEGER,
last_checked TIMESTAMP
);
"""
)
self.conn.commit()
def add_generated_account(self, token: str, userid: str, email: str, password: str, balance: int):
self.conn.execute(
"""
INSERT INTO generated_accounts (token, userid, email, password, remaining_traffic, last_checked)
VALUES (?, ?, ?, ?, ?, ?)
""",
(token, userid, email, password, balance, datetime.now().isoformat()),
)
self.conn.commit()
def count_available_accounts(self) -> int:
c = self.conn.cursor()
c.execute("SELECT COUNT(*) FROM generated_accounts WHERE assigned_to IS NULL")
return c.fetchone()[0]
class CloudWorkerClient:
def __init__(self, base_url: str = WORKER_BASE_URL):
self.base_url = base_url.rstrip("/")
async def add_account(self, account: Dict) -> bool:
payload = {
"token": account.get("token"),
"userid": account.get("userid"),
"email": account.get("email"),
"password": account.get("password"),
"remaining_traffic": int(account.get("balance", 0) or 0),
}
try:
async with httpx.AsyncClient(timeout=25.0, follow_redirects=True) as client:
resp = await client.post(f"{self.base_url}/account", json=payload)
if resp.status_code not in (200, 201):
logger.warning("Cloud save failed: HTTP %s | %s", resp.status_code, resp.text[:300])
return False
data = resp.json() if resp.text else {}
if not data.get("success"):
logger.warning("Cloud save rejected: %s", data)
return False
return True
except Exception as e:
logger.warning("Cloud save request failed: %s", e)
return False
class TelegramNotifier:
def __init__(self, bot_token: str = TELEGRAM_BOT_TOKEN, chat_id: str = TELEGRAM_CHAT_ID):
self.bot_token = bot_token
self.chat_id = str(chat_id)
self.base_url = f"https://api.telegram.org/bot{self.bot_token}"
async def send_success(self, account: Dict) -> bool:
message = (
"✅ <b>ACC GENERATED SUCCESSFULLY</b>\n\n"
f"balance: <code>{html.escape(str(account.get('balance', '')))}</code>\n"
f"token: <code>{html.escape(str(account.get('token', '')))}</code>\n"
f"userid: <code>{html.escape(str(account.get('userid', '')))}</code>\n"
f"email: <code>{html.escape(str(account.get('email', '')))}</code>\n"
f"pass: <code>{html.escape(str(account.get('password', '')))}</code>"
)
payload = {
"chat_id": self.chat_id,
"text": message,
"parse_mode": "HTML",
"disable_web_page_preview": True,
"message_thread_id": 1725,
}
try:
async with httpx.AsyncClient(timeout=20.0, follow_redirects=True) as client:
resp = await client.post(f"{self.base_url}/sendMessage", json=payload)
if resp.status_code != 200:
logger.warning("Telegram notify failed: HTTP %s | %s", resp.status_code, resp.text[:300])
return False
data = resp.json() if resp.text else {}
if not data.get("ok"):
logger.warning("Telegram notify rejected: %s", data)
return False
return True
except Exception as e:
logger.warning("Telegram notify exception: %s", e)
return False
# ================= AUTOMATION (FULL LOAD FLOW) =================
class AsyncOwlProxyAutomation:
def __init__(self):
self.base_url = "https://api.owlproxy.com"
self.mail_api = "https://api.mail.tm"
self.base_headers = {
"accept": "application/json, text/plain, */*",
"accept-language": "en-US,en;q=0.9",
"appversion": "2005400",
"clienttype": "web",
"content-type": "application/json",
"priority": "u=1, i",
"requestsource": "wechat-miniapp",
"sec-ch-ua": '"Chromium";v="142", "Brave";v="142", "Not_A Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"sec-gpc": "1",
"suppliertype": "0",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"origin": "https://proxy.owlproxy.com",
"referer": "https://proxy.owlproxy.com/",
}
self.token: Optional[str] = None
self.userid: Optional[str] = None
self.email: Optional[str] = None
self.mail_token: Optional[str] = None
async def random_delay(self, min_seconds: float = 1.0, max_seconds: float = 3.0):
await asyncio.sleep(random.uniform(min_seconds, max_seconds))
@staticmethod
def parse_json(response: httpx.Response) -> Dict:
try:
return response.json() if response.text else {}
except Exception:
return {}
async def create_temp_email(self, client: httpx.AsyncClient) -> Tuple[bool, Optional[str], Optional[str]]:
try:
domains_resp = await client.get(f"{self.mail_api}/domains")
if domains_resp.status_code == 200:
domains = self.parse_json(domains_resp)
domain = domains["hydra:member"][0]["domain"]
else:
domain = "sharebot.net"
random_string = "".join(random.choices(string.ascii_lowercase + string.digits, k=10))
email = f"{random_string}@{domain}"
password = "".join(random.choices(string.ascii_letters + string.digits, k=12))
account_data = {"address": email, "password": password}
create_resp = await client.post(f"{self.mail_api}/accounts", json=account_data)
if create_resp.status_code not in (200, 201):
return False, None, None
login_resp = await client.post(f"{self.mail_api}/token", json=account_data)
if login_resp.status_code != 200:
return False, None, None
token = self.parse_json(login_resp).get("token")
if not token:
return False, None, None
self.email = email
self.mail_token = token
return True, email, token
except Exception as e:
logger.error("create_temp_email error: %s", e)
return False, None, None
async def request_verification_code(self, client: httpx.AsyncClient, email: str) -> bool:
try:
payload = {"smsType": 2, "mobilePhone": email}
resp = await client.post(f"{self.base_url}/owlproxy/api/sms/smsSend", headers=self.base_headers, json=payload)
data = self.parse_json(resp)
return data.get("code") == 200
except Exception as e:
logger.error("request_verification_code error: %s", e)
return False
async def wait_for_email(self, client: httpx.AsyncClient, timeout: int = 120) -> Optional[str]:
if not self.mail_token:
return None
start_time = time.time()
mail_headers = {"Authorization": f"Bearer {self.mail_token}"}
while time.time() - start_time < timeout:
try:
msg_list_resp = await client.get(f"{self.mail_api}/messages", headers=mail_headers)
if msg_list_resp.status_code == 200:
messages = self.parse_json(msg_list_resp)
members = messages.get("hydra:member", [])
if members:
msg_id = members[0].get("id")
msg_resp = await client.get(f"{self.mail_api}/messages/{msg_id}", headers=mail_headers)
if msg_resp.status_code == 200:
text = self.parse_json(msg_resp).get("text", "")
patterns = [
r"Verification Code:\s*(\d{6})",
r"Code:\s*(\d{6})",
r"\b(\d{6})\b",
]
for pattern in patterns:
match = re.search(pattern, text, re.IGNORECASE)
if match:
return match.group(1)
except Exception as e:
logger.warning("wait_for_email poll error: %s", e)
await asyncio.sleep(3)
return None
async def register_account(self, client: httpx.AsyncClient, email: str, otp: str, password: str) -> bool:
try:
payload = {
"mobilePhone": email,
"loginType": 0,
"verifyCode": otp,
"channel": "web",
"password": hashlib.md5(password.encode()).hexdigest(),
}
resp = await client.post(f"{self.base_url}/owlproxy/api/user/login", headers=self.base_headers, json=payload)
data = self.parse_json(resp)
if data.get("code") != 200:
return False
body = data.get("data", {})
self.token = body.get("token")
self.userid = body.get("userId")
return bool(self.token and self.userid)
except Exception as e:
logger.error("register_account error: %s", e)
return False
async def login_with_password(self, client: httpx.AsyncClient, email: str, password: str) -> bool:
try:
payload = {
"mobilePhone": email,
"loginType": 1,
"password": hashlib.md5(password.encode()).hexdigest(),
"channel": "web",
}
resp = await client.post(f"{self.base_url}/owlproxy/api/user/login", headers=self.base_headers, json=payload)
data = self.parse_json(resp)
if data.get("code") != 200:
return False
body = data.get("data", {})
self.token = body.get("token")
self.userid = body.get("userId")
return bool(self.token and self.userid)
except Exception as e:
logger.error("login_with_password error: %s", e)
return False
async def post_login_sequence(self, client: httpx.AsyncClient) -> bool:
if not self.token or not self.userid:
return False
headers = self.base_headers.copy()
headers["token"] = self.token
headers["userid"] = str(self.userid)
endpoints = [
"/owlproxy/api/user/getUserInfo",
"/owlproxy/api/configure/getCommonConfig",
"/owlproxy/api/newUserGuide/getNewUserGuideConfig_V2",
"/owlproxy/api/vpopDialog/getUserActiveBanner",
"/owlproxy/api/vcDynamicGood/getDynamicProxyRegion",
"/owlproxy/api/vcDynamicGood/queryCurrentTrafficBalance",
"/owlproxy/api/vcDynamicGood/getDynamicProxyHost",
]
for endpoint in endpoints:
try:
await client.get(f"{self.base_url}{endpoint}", headers=headers)
except Exception as e:
logger.warning("post_login endpoint failed (%s): %s", endpoint, e)
await self.random_delay(1, 2)
return True
async def claim_offer_with_retry(self, client: httpx.AsyncClient, guide_id: int = 10003, max_retries: int = 5) -> bool:
if not self.token or not self.userid:
return False
headers = self.base_headers.copy()
headers["token"] = self.token
headers["userid"] = str(self.userid)
for attempt in range(max_retries):
try:
await asyncio.sleep(random.uniform(2, 5) * (attempt + 1))
resp = await client.get(
f"{self.base_url}/owlproxy/api/newUserGuide/getNewUserReceiveTraffic",
headers=headers,
params={"guideId": guide_id},
)
data = self.parse_json(resp)
if data.get("code") == 200:
return True
if data.get("code") == 3316:
await asyncio.sleep((2**attempt) * random.uniform(1, 3))
continue
return False
except Exception as e:
logger.warning("claim attempt %s failed: %s", attempt + 1, e)
await asyncio.sleep(5)
return False
async def query_balance(self, client: httpx.AsyncClient) -> int:
if not self.token or not self.userid:
return 0
headers = self.base_headers.copy()
headers["token"] = self.token
headers["userid"] = str(self.userid)
try:
resp = await client.get(f"{self.base_url}/owlproxy/api/vcDynamicGood/queryCurrentTrafficBalance", headers=headers)
if resp.status_code == 200:
data = self.parse_json(resp)
balance = data.get("data")
if isinstance(balance, int):
return balance
except Exception as e:
logger.warning("query_balance failed: %s", e)
return 200 if self.token else 0
async def run_full_flow(self) -> Optional[Dict]:
try:
async with httpx.AsyncClient(
timeout=30.0,
follow_redirects=True,
verify=False
) as client:
success, email, _ = await self.create_temp_email(client)
if not success or not email:
return None
await self.random_delay(2, 3)
if not await self.request_verification_code(client, email):
return None
await self.random_delay(1, 2)
otp = await self.wait_for_email(client, timeout=120)
if not otp:
return None
await self.random_delay(1, 2)
password = "".join(random.choices(string.ascii_letters + string.digits, k=12))
if not await self.register_account(client, email, otp, password):
return None
await self.random_delay(2, 4)
if not await self.login_with_password(client, email, password):
return None
await self.random_delay(2, 3)
await self.post_login_sequence(client)
await self.random_delay(2, 3)
claim_success = await self.claim_offer_with_retry(client, guide_id=10003, max_retries=5)
balance = await self.query_balance(client)
return {
"email": email,
"password": password,
"userid": str(self.userid),
"token": self.token,
"claim_success": claim_success,
"balance": balance,
}
except Exception as e:
logger.error("run_full_flow fatal: %s", e)
return None
# ================= WORKER LOOP =================
async def refill_worker(worker_id: int, db: Database, cloud: CloudWorkerClient, notifier: TelegramNotifier):
logger.info("Worker %s started", worker_id)
while True:
try:
logger.info("[Worker %s] Generating without proxy (direct connection)", worker_id)
automation = AsyncOwlProxyAutomation()
result = await automation.run_full_flow()
result_dict: Dict = result if isinstance(result, dict) else {}
is_eligible = (
bool(result_dict)
and bool(result_dict.get("token"))
and bool(result_dict.get("userid"))
and bool(result_dict.get("claim_success"))
and int(result_dict.get("balance", 0) or 0) == 200
)
if is_eligible:
saved = await cloud.add_account(result_dict)
if saved:
logger.info(
"[Worker %s] CLOUD SAVED (claim_success + balance=200) -> %s | userid=%s | balance=%s",
worker_id,
result_dict.get("email"),
result_dict.get("userid"),
result_dict.get("balance"),
)
sent = await notifier.send_success(result_dict)
if sent:
logger.info("[Worker %s] Telegram notification sent", worker_id)
else:
logger.warning("[Worker %s] Telegram notification failed", worker_id)
else:
logger.warning("[Worker %s] Eligible account generated but cloud save failed", worker_id)
else:
if result_dict:
logger.warning(
"[Worker %s] Skipped save (claim_success=%s, balance=%s)",
worker_id,
result_dict.get("claim_success"),
result_dict.get("balance"),
)
else:
logger.warning("[Worker %s] Flow failed, retrying...", worker_id)
await asyncio.sleep(5)
except Exception as e:
logger.error("[Worker %s] Fatal loop error: %s", worker_id, e)
await asyncio.sleep(10)
await asyncio.sleep(random.uniform(4, 9))
async def main():
db = Database()
cloud = CloudWorkerClient()
notifier = TelegramNotifier()
print("\n" + "="*40)
print(" OWL PROXY GENERATOR (DIRECT MODE)")
print("="*40)
print(f"Starting continuous generator with {NUM_WORKERS} workers")
print("Workers will use direct connection (no proxies)")
print("Press Ctrl+C to stop\n")
logger.info("Starting continuous generator with %s workers (direct connection)", NUM_WORKERS)
tasks = [asyncio.create_task(refill_worker(i + 1, db, cloud, notifier)) for i in range(NUM_WORKERS)]
await asyncio.gather(*tasks)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info("Stopped by user")