Клод написал Python скрипт, показывающий к каким GGC (Google Global Cache) подключается браузер (или yt-dlp) на ютубе. Использует tcpdump, который мониторит dns запросы.
Он выводит: доменное имя, IP, страна (город), обратное имя, провайдер.
Например:
rr3---sn-ojun55-5q.googlevideo.com 142.251.90.3 Taiwan (Taipei) nctsaa-ad-in-f3.1e100.net Google LLC
При этом, браузер может подключаться к нескольким GGC, но качать только с одного (узнать с какого именно можно только в Wireshark). yt-dlp качает всегда с одного.
Если не показывает страну, экспортируйте бесплатный токен к ipinfo.
Используется ipinfo, т.к. это самый надёжный поставщик локации. Остальные сервисы часто неправильно пишут US.
Из-за tcpdump запускать нужно от root. Не забудьте указать/отредактировать свой сетевой интерфейс. Установите pycountry, чтобы видеть нормальное название стран.
#!/usr/bin/env python3
"""
Показывает GGC (*.googlevideo.com), к которым обращается браузер.
Запуск: sudo ./ggc.py [интерфейс] (по умолчанию warp)
Необязательно: export IPINFO_TOKEN=...
"""
import json
import os
import re
import socket
import subprocess
import sys
import urllib.request
try:
import pycountry # pip install pycountry
except ImportError:
pycountry = None
iface = sys.argv[1] if len(sys.argv) > 1 else "warp"
token = os.environ.get("IPINFO_TOKEN", "")
cmd = ["tcpdump", "-l", "-n", "-s", "0", "-i", iface,
"udp port 53 and udp[10] & 0x80 = 0"]
rx = re.compile(r"\sA\? (\S+\.googlevideo\.com)\.")
host_cache = {} # имя -> готовая строка или None (если не резолвится)
ip_cache = {} # ip -> (страна, город, hostname, org)
def country_name(code):
if pycountry:
c = pycountry.countries.get(alpha_2=code)
if c:
return getattr(c, "common_name", c.name)
return code
def lookup_ip(ip):
if ip in ip_cache:
return ip_cache[ip]
url = f"https://ipinfo.io/{ip}/json"
if token:
url += f"?token={token}"
try:
with urllib.request.urlopen(url, timeout=5) as r:
d = json.load(r)
country = country_name(d.get("country", "?"))
city = d.get("city", "?")
hostname = d.get("hostname", "")
org = re.sub(r"^AS\d+\s+", "", d.get("org", ""))
except Exception:
country, city, hostname, org = "?", "?", "", ""
if not hostname:
try:
hostname = socket.gethostbyaddr(ip)[0]
except Exception:
hostname = ""
res = (country, city, hostname, org)
ip_cache[ip] = res
return res
def lookup_host(host):
if host in host_cache:
return host_cache[host]
try:
ip = socket.getaddrinfo(host, None, socket.AF_INET)[0][4][0]
except Exception:
host_cache[host] = None # NXDOMAIN и прочее: молча пропускаем
return None
country, city, hostname, org = lookup_ip(ip)
parts = [host, ip, f"{country} ({city})", hostname, org]
res = " ".join(p for p in parts if p)
host_cache[host] = res
return res
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL, text=True, bufsize=1)
try:
for line in proc.stdout:
m = rx.search(line)
if not m:
continue
res = lookup_host(m.group(1))
if res:
print(res, flush=True)
except KeyboardInterrupt:
proc.terminate()

