Files
omegle-matrix-bridge/proxy/main.py
2026-04-17 09:49:34 +02:00

183 lines
7.0 KiB
Python

import os
import time
import asyncio
import websockets
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
TARGET_URL = os.getenv("TARGET_URL", "https://omegleweb.io/")
TARGET_WS_URL = os.getenv("TARGET_WS_URL", "wss://omegleweb.io:8443/socket.io/?EIO=4&transport=websocket")
LOCAL_HOST = os.getenv("LOCAL_HOST", "0.0.0.0")
LOCAL_PORT = int(os.getenv("LOCAL_PORT", "8765"))
HEADLESS = os.getenv("HEADLESS", "false").lower() in ("true", "1", "yes")
CF_WAIT_TIME = int(os.getenv("CF_WAIT_TIME", "60"))
SELENIUM_URL = os.getenv("SELENIUM_URL", "http://localhost:4444")
credentials = {
"user_agent": None,
"cookies": None
}
def stealth_js(driver):
driver.execute_script("""
Object.defineProperty(navigator, 'webdriver', {get: () => undefined});
Object.defineProperty(navigator, 'plugins', {get: () => [1, 2, 3, 4, 5]});
Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});
window.chrome = {runtime: {}};
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) => (
parameters.name === 'notifications' ?
Promise.resolve({state: Notification.permission}) :
originalQuery(parameters)
);
Object.defineProperty(navigator, 'permissions', {get: () => window.navigator.permissions});
""")
def extract_credentials():
print("\n" + "="*50)
print("[*] PHASE 1: SELENIUM EXTRACTION")
print("="*50)
print("[*] Launching Chrome browser...")
options = Options()
if HEADLESS:
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-gpu")
options.add_argument("--disable-software-rasterizer")
options.add_argument("--disable-extensions")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--disable-setuid-sandbox")
options.add_argument("--disable-background-networking")
options.add_argument("--disable-default-apps")
options.add_argument("--disable-sync")
options.add_argument("--disable-translate")
options.add_argument("--metrics-recording-only")
options.add_argument("--mute-audio")
options.add_argument("--no-first-run")
options.add_argument("--safebrowsing-disable-auto-update")
options.add_argument("--ignore-certificate-errors")
options.add_argument("--ignore-ssl-errors")
options.add_argument("--user-data-dir=/tmp/chrome-data")
options.add_argument("--disable-features=IsolateOrigins,site-per-process")
driver = webdriver.Remote(
command_executor=SELENIUM_URL + "/wd/hub",
options=options
)
stealth_js(driver)
try:
print("[*] Navigating to OmegleWeb homepage...")
driver.get(TARGET_URL)
wait = WebDriverWait(driver, CF_WAIT_TIME)
wait.until(EC.presence_of_element_located((By.ID, "logo")))
print("[*] Time's up! Extracting the goods...")
user_agent = driver.execute_script("return navigator.userAgent;")
selenium_cookies = driver.get_cookies()
cookie_string = "; ".join([f"{c['name']}={c['value']}" for c in selenium_cookies])
credentials["user_agent"] = user_agent
credentials["cookies"] = cookie_string
print("[+] Extraction successful!")
return True
except Exception as e:
print(f"[!] Extraction failed: {e}")
return False
finally:
print("[*] Closing browser...")
driver.quit()
async def start_bridge():
async def bridge_handler(local_client):
print(f"\n[{datetime.now().strftime('%H:%M:%S')}] [+] Local client connected to the bridge!")
while True:
headers = {
"User-Agent": credentials["user_agent"],
"Cookie": credentials["cookies"]
}
try:
print(f"[*] Attempting tunnel to OmegleWeb...")
async with websockets.connect(TARGET_WS_URL, additional_headers=headers) as target_server:
print("[+] Tunnel established! Relaying messages...")
async def forward_local_to_target():
async for message in local_client:
print(f"[{datetime.now().strftime('%H:%M:%S.%f')[:-3]}] [Local -> Omegle]: {message}")
await target_server.send(message)
async def forward_target_to_local():
async for message in target_server:
print(f"[{datetime.now().strftime('%H:%M:%S.%f')[:-3]}] [Omegle -> Local]: {message}")
await local_client.send(message)
t1 = asyncio.create_task(forward_local_to_target())
t2 = asyncio.create_task(forward_target_to_local())
done, pending = await asyncio.wait(
[t1, t2],
return_when=asyncio.FIRST_COMPLETED
)
for task in pending:
task.cancel()
if t1 in done and t1.exception() is None:
print("[-] Local client disconnected.")
break
print("[-] OmegleWeb connection closed.")
break
except websockets.exceptions.InvalidStatusCode as e:
if e.status_code == 403:
print(f"[!] HTTP 403 Forbidden: Cookies likely expired. Refreshing...")
loop = asyncio.get_running_loop()
success = await loop.run_in_executor(None, extract_credentials)
if not success:
print("[!] Failed to refresh cookies. Retrying in 5s...")
await asyncio.sleep(5)
continue
else:
print(f"[!] Bridge error (Status {e.status_code}): {e}")
break
except websockets.exceptions.ConnectionClosed:
print("[-] OmegleWeb disconnected.")
break
except Exception as e:
print(f"[!] Bridge error: {type(e).__name__}: {e}")
break
print(f"[*] Starting local WebSocket proxy on ws://{LOCAL_HOST}:{LOCAL_PORT}")
async with websockets.serve(bridge_handler, LOCAL_HOST, LOCAL_PORT):
await asyncio.Future()
def main():
if not extract_credentials():
print("[!] Initial extraction failed. Exiting.")
return
print("\n" + "="*50)
print("[*] PHASE 2: LAUNCH THE WEBSOCKET PROXY")
print("="*50)
try:
asyncio.run(start_bridge())
except KeyboardInterrupt:
print("\n[*] Shutting down...")
if __name__ == '__main__':
main()