Bosa / extract_session.py
Speedo0o's picture
Upload 3 files
6ff3b78 verified
Raw
History Blame Contribute Delete
10.5 kB
#!/usr/bin/env python3
"""
WORM-AI💀🔥 SESSION EXTRACTOR - يستخرج جلسة كلاود فلير بعد التخطي
ويحفظها في ملف JSON لاستخدامها لاحقاً.
يدعم وسيط --url لتحديد الهدف.
"""
import os
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
import asyncio
import json
import random
import shutil
import cv2
import numpy as np
import argparse
from pathlib import Path
from playwright.async_api import async_playwright
# ============================================================================
# إعدادات عامة (تؤخذ من الوسائط)
# ============================================================================
base_path = os.path.dirname(os.path.abspath(__file__))
CUSTOM_CHROMIUM_PATH = os.path.join(base_path, "Chromium", "chrome.exe")
OUTPUT_SESSION_FILE = os.path.join(base_path, "session_data.json")
# ============================================================================
# دالة الرؤية البصرية (نفس الكود الأصلي)
# ============================================================================
async def visual_click(page, template_filename="box.png"):
print("[👁️] جاري بدء نظام الرؤية البصرية لحل الكلاود فلير...")
await page.bring_to_front()
template_path = os.path.join(base_path, template_filename)
if not os.path.exists(template_path):
print(f"[❌] خطأ: لا توجد صورة باسم {template_filename} بجوار السكربت!")
return False
template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE)
tH, tW = template.shape[:2]
for attempt in range(1, 7):
print(f"[📸] التقاط وتحليل الشاشة (المحاولة {attempt}/6)...")
await page.wait_for_timeout(2000)
screenshot_bytes = await page.screenshot()
nparr = np.frombuffer(screenshot_bytes, np.uint8)
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
best_match = None
for scale in np.linspace(0.5, 2.5, 25):
width = int(tW * scale)
height = int(tH * scale)
if width <= 10 or height <= 10:
continue
resized_template = cv2.resize(template, (width, height))
if resized_template.shape[0] > gray_img.shape[0] or resized_template.shape[1] > gray_img.shape[1]:
continue
res = cv2.matchTemplate(gray_img, resized_template, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc(res)
if best_match is None or max_val > best_match[0]:
best_match = (max_val, max_loc, scale, width, height)
if best_match and best_match[0] >= 0.70:
max_val, max_loc, best_scale, w, h = best_match
print(f"[🎯] وجدته! نسبة التطابق: {max_val*100:.1f}% | تعديل الحجم: {best_scale:.2f}x")
click_x = int(max_loc[0] + (w / 2))
click_y = int(max_loc[1] + (h / 2))
await page.mouse.move(click_x, click_y, steps=10)
await page.wait_for_timeout(300)
await page.mouse.down()
await page.wait_for_timeout(random.randint(80, 150))
await page.mouse.up()
print("[✅] تم النقر البصري بنجاح وتخطي الحماية!")
return True
print("[⚠️] فشل في العثور على المربع. سيستمر السكربت في المحاولة.")
return False
# ============================================================================
# دالة استخراج بيانات الجلسة بالكامل
# ============================================================================
async def extract_full_session(page, context):
"""ترجع قاموساً يحتوي على الكوكيز، localStorage، sessionStorage، وعنوان URL الحالي، بالإضافة إلى بيانات المتصفح."""
cookies = await context.cookies()
localStorage = await page.evaluate("() => JSON.stringify(window.localStorage)")
localStorage_dict = json.loads(localStorage) if localStorage != "{}" else {}
sessionStorage = await page.evaluate("() => JSON.stringify(window.sessionStorage)")
sessionStorage_dict = json.loads(sessionStorage) if sessionStorage != "{}" else {}
current_url = page.url
# الحصول على User-Agent و Accept-Language من الصفحة
user_agent = await page.evaluate("() => navigator.userAgent")
accept_language = await page.evaluate("() => navigator.language")
# الحصول على Sec-CH-UA (قد لا يكون متاحاً في بعض المتصفحات)
sec_ch_ua = await page.evaluate("() => navigator.userAgentData ? navigator.userAgentData.brands.map(b => `${b.brand};v=${b.version}`).join(', ') : ''")
return {
"cookies": cookies,
"localStorage": localStorage_dict,
"sessionStorage": sessionStorage_dict,
"url": current_url,
"user_agent": user_agent,
"accept_language": accept_language,
"sec_ch_ua": sec_ch_ua,
}
# ============================================================================
# الدالة الرئيسية (معدلة لتقبل --url)
# ============================================================================
async def main(target_url):
# اختيار بروفايل عشوائي (نفس المنطق الأصلي)
profile_folders = [f for f in os.listdir(base_path) if f.isdigit() and os.path.isdir(os.path.join(base_path, f))]
if profile_folders:
chosen_folder = random.choice(profile_folders)
user_data_dir = Path(os.path.join(base_path, chosen_folder))
print(f"[📂] تم اختيار البروفايل رقم: {chosen_folder}")
else:
user_data_dir = Path(os.path.join(base_path, "browser_profile_winprom"))
print("[⚠️] لم يتم العثور على مجلدات، سيتم استخدام المسار الافتراضي.")
user_data_dir.mkdir(exist_ok=True)
async with async_playwright() as p:
real_tz = "UTC"
real_locale = "en-US"
fingerprint_seed = random.randint(100000, 999999)
ANDROID_UA_LIST = [
"Mozilla/5.0 (Linux; Android 15; Pixel 9 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Mobile Safari/537.36"
]
MOBILE_SCREENS = [(360, 780), (375, 812), (390, 844), (412, 915), (414, 896)]
mobile_ua = random.choice(ANDROID_UA_LIST)
mob_w, mob_h = random.choice(MOBILE_SCREENS)
browser_args = [
f"--fingerprint={fingerprint_seed}",
"--fingerprint-platform=linux",
"--fingerprint-brand=Chrome",
"--fingerprint-brand-version=147",
f"--timezone={real_tz}",
f"--lang={real_locale}",
f"--accept-lang={real_locale},en",
f"--user-agent={mobile_ua}",
"--disable-blink-features=AutomationControlled",
"--no-sandbox",
"--disable-dev-shm-usage",
"--disable-infobars",
"--no-first-run",
"--no-default-browser-check",
"--disable-extensions",
"--mute-audio",
"--disable-popup-blocking",
]
context = await p.chromium.launch_persistent_context(
user_data_dir=str(user_data_dir),
executable_path=CUSTOM_CHROMIUM_PATH,
headless=False, # نتركها مرئية للرؤية البصرية
args=browser_args,
no_viewport=False,
viewport={"width": mob_w, "height": mob_h},
is_mobile=True,
has_touch=True,
java_script_enabled=True,
ignore_https_errors=True,
)
page = context.pages[0] if context.pages else await context.new_page()
print(f"\n[🚀] الانتقال إلى {target_url} لحل الحماية...")
try:
await page.goto(target_url, wait_until="domcontentloaded", timeout=60000)
except Exception:
pass
success = await visual_click(page, "box.png")
if success:
print("[⏳] انتظار 5 ثوانٍ بعد تخطي الحماية لضمان تحميل الجلسة بالكامل...")
await page.wait_for_timeout(5000)
else:
print("[⏳] لم يتم حل الحماية بصرياً، لكننا سنحاول استخراج الجلسة الحالية (قد تكون غير مكتملة).")
await page.wait_for_timeout(3000)
print("[📦] جاري استخراج بيانات الجلسة (كوكيز، LocalStorage، SessionStorage)...")
session_data = await extract_full_session(page, context)
with open(OUTPUT_SESSION_FILE, "w", encoding="utf-8") as f:
json.dump(session_data, f, indent=4, ensure_ascii=False)
print(f"[✅] تم حفظ الجلسة بنجاح في: {OUTPUT_SESSION_FILE}")
print(f"[🌐] الرابط الحالي المسجل: {session_data['url']}")
print(f"[🍪] عدد الكوكيز المستخرجة: {len(session_data['cookies'])}")
print(f"[💾] عدد عناصر LocalStorage: {len(session_data['localStorage'])}")
print(f"[⚡] عدد عناصر SessionStorage: {len(session_data['sessionStorage'])}")
print(f"[🌐] User-Agent المستخدم: {session_data.get('user_agent', 'غير معروف')}")
print(f"[🌐] Accept-Language: {session_data.get('accept_language', 'غير معروف')}")
await context.close()
print("[🔚] تم إغلاق المتصفح. انتهت المرحلة الأولى.")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="استخراج جلسة Cloudflare")
parser.add_argument("--url", required=True, help="الرابط المستهدف (مثل https://jnkie.com)")
args = parser.parse_args()
asyncio.run(main(args.url))