No description
Find a file
2026-08-18 02:30:56 +05:00
.github/workflows revert: back to pydoh name 2026-07-19 20:51:04 +05:00
docs docs: quickstart, api reference, faq 2026-07-19 23:23:04 +05:00
src/pydoh revert: back to pydoh name 2026-07-19 20:51:04 +05:00
tests revert: back to pydoh name 2026-07-19 20:51:04 +05:00
.gitignore ci: add coverage tracking and badges 2026-07-19 20:45:54 +05:00
LICENSE init: zero-dep dns-over-https resolver 2026-07-19 20:36:56 +05:00
llms.txt revert: back to pydoh name 2026-07-19 20:51:04 +05:00
pyproject.toml revert: back to pydoh name 2026-07-19 20:51:04 +05:00
README.md chore: badges + point profile links at devsavsis 2026-08-18 02:30:56 +05:00

pydoh

CI Coverage pypi downloads versions license

DNS-over-HTTPS резолвер для питона. ноль зависимостей — весь HTTPS через стандартный http.client+ssl. провайдер/DPI видит только твой HTTPS к cloudflare, а не голые DNS-запросы.

sequenceDiagram
    App->>pydoh: resolve("example.com")
    pydoh->>Cloudflare: DNS-запрос внутри HTTPS POST
    Cloudflare-->>pydoh: ответ внутри HTTPS
    pydoh-->>App: ["93.184.216.34"]

установка

pip install pydoh

юзать

import pydoh

ips = pydoh.resolve("example.com")

или подменить резолвинг вообще везде в питоне одной строкой — requests, aiohttp, что угодно на сокетах будет резолвить через DoH:

import pydoh
pydoh.patch_socket()

документация

  • quickstart — установка, базовое использование, свой провайдер
  • api — все функции с параметрами
  • faq — зачем это надо, что делать если cloudflare забанят, законно ли

фичи

  • zero deps, только stdlib
  • fallback между cloudflare / google / quad9 если один упал
  • кэш по TTL из ответа
  • typed (py.typed), питон 3.10–3.13

что не умеет

не проверяет DNSSEC, не поддерживает TCP-фрагментированные DNS-ответы больше одного UDP-пакета.