rustenium-identity 0.1.14

A versatile stealth overlay for rustenium
Documentation
import json
from http.server import BaseHTTPRequestHandler, HTTPServer

HINTS = ("Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Arch, "
         "Sec-CH-UA-Bitness, Sec-CH-UA-Model, Sec-CH-UA-Full-Version, "
         "Sec-CH-UA-Full-Version-List, Sec-CH-UA-Platform-Version")

PAGE = """<html><body><div id=o>pending</div><script>
(async () => {
  const r = await fetch('/echo', { cache: 'no-store' });
  const headers = await r.json();
  let js = {};
  try { js = await navigator.userAgentData.getHighEntropyValues(
    ['architecture','bitness','model','platform','platformVersion','uaFullVersion','fullVersionList']); } catch (e) { js = {err: String(e)}; }
  document.getElementById('o').textContent = 'CH' + JSON.stringify({ headers, js });
})();
</script></body></html>"""

class H(BaseHTTPRequestHandler):
    def log_message(self, *a):
        pass

    def do_GET(self):
        if self.path.startswith('/echo'):
            body = json.dumps({k: v for k, v in self.headers.items()
                               if k.lower().startswith('sec-ch') or k.lower() in ('user-agent', 'accept-language')}).encode()
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Accept-CH', HINTS)
            self.send_header('Content-Length', str(len(body)))
            self.end_headers()
            self.wfile.write(body)
            return
        body = PAGE.encode()
        self.send_response(200)
        self.send_header('Content-Type', 'text/html')
        self.send_header('Accept-CH', HINTS)
        self.send_header('Critical-CH', HINTS)
        self.send_header('Content-Length', str(len(body)))
        self.end_headers()
        self.wfile.write(body)

HTTPServer(('127.0.0.1', 8761), H).serve_forever()