LINUX.ORG.RU

Посмотреть к каким GGC подключается браузер на ютубе

 ,


0

0

Клод написал 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()


Последнее исправление: netrium (всего исправлений: 1)
Ответ на: комментарий от BruteForce

Чтобы узнать, сколько людей готовы на своём компе запускать скачаный из инета скрипт под root'ом :)

mky ★★★★★
()

При этом, браузер может подключаться к нескольким GGC, но качать только с одного (узнать с какого именно можно только в Wireshark)

В браузере может прыгать по разным *.googlevideo.com при воспроизведении одного видео, с какого именно прекрасно видно во вкладке сеть инструментов для разработчика.

yandrey ★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария