2026-07-19 20:51:04 +05:00
# pydoh
2026-07-19 20:36:56 +05:00
2026-07-19 20:51:04 +05:00
[](https://github.com/ImSavsis/pydoh/actions/workflows/ci.yml)
[](https://codecov.io/gh/ImSavsis/pydoh)
[](https://pypi.org/project/pydoh/)
[](https://pypi.org/project/pydoh/)
[](https://pypi.org/project/pydoh/)
[](https://github.com/ImSavsis/pydoh/blob/master/LICENSE)
2026-07-19 20:45:54 +05:00
2026-07-19 20:36:56 +05:00
DNS-over-HTTPS резолвер для питона. ноль зависимостей — весь HTTPS через стандартный `http.client` +`ssl` . провайдер/DPI видит только твой HTTPS к cloudflare, а не голые DNS-запросы.
```mermaid
sequenceDiagram
2026-07-19 20:51:04 +05:00
App->>pydoh: resolve("example.com")
pydoh->>Cloudflare: DNS-запрос внутри HTTPS POST
Cloudflare-->>pydoh: ответ внутри HTTPS
pydoh-->>App: ["93.184.216.34"]
2026-07-19 20:36:56 +05:00
```
## установка
```
2026-07-19 20:51:04 +05:00
pip install pydoh
2026-07-19 20:36:56 +05:00
```
## юзать
```python
2026-07-19 20:51:04 +05:00
import pydoh
2026-07-19 20:36:56 +05:00
2026-07-19 20:51:04 +05:00
ips = pydoh.resolve("example.com")
2026-07-19 20:36:56 +05:00
```
или подменить резолвинг вообще везде в питоне одной строкой — `requests` , `aiohttp` , что угодно на сокетах будет резолвить через DoH:
```python
2026-07-19 20:51:04 +05:00
import pydoh
pydoh.patch_socket()
2026-07-19 20:36:56 +05:00
```
## фичи
- zero deps, только stdlib
- fallback между cloudflare / google / quad9 если один упал
- кэш по TTL из ответа
- typed (py.typed), питон 3.10– 3.13
## что не умеет
не проверяет DNSSEC, не поддерживает TCP-фрагментированные DNS-ответы больше одного UDP-пакета.