CoolFace
Apppublic

agenticverse/AgentNexa

sourceHugging Facemitupdated 3mo agoView on Hugging Face
0likes
dns-resolve.py105 linesDownload Raw Back to scripts
1#!/usr/bin/env python32"""3DNS-over-HTTPS resolver for HF Spaces.4 5HF Spaces containers cannot resolve certain domains (e.g. api.telegram.org,6web.whatsapp.com) via the default DNS resolver. This script resolves key7domains using Cloudflare / Google DoH and writes results to a JSON file8plus /etc/hosts so both Python and Node.js processes benefit.9 10Usage: python3 dns-resolve.py [output-file]11"""12 13import json14import socket15import ssl16import sys17import urllib.request18 19DOH_ENDPOINTS = [20    "https://1.1.1.1/dns-query",21    "https://8.8.8.8/resolve",22    "https://dns.google/resolve",23]24 25DOMAINS = [26    # Telegram Bot API27    "api.telegram.org",28    # Discord gateway / API29    "discord.com",30    "gateway.discord.gg",31    "cdn.discordapp.com",32    # Slack33    "slack.com",34    "api.slack.com",35    # WhatsApp / Baileys36    "web.whatsapp.com",37    "g.whatsapp.net",38    "mmg.whatsapp.net",39    "pps.whatsapp.net",40    "static.whatsapp.net",41    "media.fmed1-1.fna.whatsapp.net",42]43 44 45def resolve_via_doh(domain: str, endpoint: str, timeout: int = 10) -> list[str]:46    url = f"{endpoint}?name={domain}&type=A"47    req = urllib.request.Request(url, headers={"Accept": "application/dns-json"})48    ctx = ssl.create_default_context()49    resp = urllib.request.urlopen(req, timeout=timeout, context=ctx)50    data = json.loads(resp.read().decode())51    return [a["data"] for a in data.get("Answer", []) if a.get("type") == 1]52 53 54def resolve_domain(domain: str) -> list[str]:55    for endpoint in DOH_ENDPOINTS:56        try:57            ips = resolve_via_doh(domain, endpoint)58            if ips:59                return ips60        except Exception:61            continue62    return []63 64 65def main() -> None:66    output_file = sys.argv[1] if len(sys.argv) > 1 else "/tmp/dns-resolved.json"67 68    # If system DNS works for the most-commonly-blocked domain, DoH isn't needed.69    try:70        socket.getaddrinfo("api.telegram.org", 443, socket.AF_INET)71        print("[dns] System DNS works for api.telegram.org — DoH not needed")72        with open(output_file, "w") as f:73            json.dump({}, f)74        return75    except (socket.gaierror, OSError) as e:76        print(f"[dns] System DNS failed ({e}) — using DoH fallback")77 78    results = {}79    for domain in DOMAINS:80        ips = resolve_domain(domain)81        if ips:82            results[domain] = ips[0]83            print(f"[dns] {domain} -> {ips[0]}")84        else:85            print(f"[dns] WARNING: could not resolve {domain}")86 87    with open(output_file, "w") as f:88        json.dump(results, f, indent=2)89 90    if results:91        try:92            with open("/etc/hosts", "a") as f:93                f.write("\n# === HermesFace DoH resolved domains ===\n")94                for domain, ip in results.items():95                    f.write(f"{ip} {domain}\n")96            print(f"[dns] Wrote {len(results)} entries to /etc/hosts")97        except PermissionError:98            print("[dns] WARNING: cannot write /etc/hosts (permission denied)")99 100    print(f"[dns] Resolved {len(results)}/{len(DOMAINS)} domains -> {output_file}")101 102 103if __name__ == "__main__":104    main()105