Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.7.0
2.7.1
2 changes: 1 addition & 1 deletion domaintools/_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@

"""

current = "2.7.0"
current = "2.7.1"
8 changes: 6 additions & 2 deletions domaintools/api.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from datetime import datetime, timedelta, timezone
from hashlib import sha1, sha256
from hmac import new as hmac
from pathlib import Path
from typing import Union

import re
import ssl
import yaml


from domaintools.constants import (
Endpoint,
OutputFormat,
Expand Down Expand Up @@ -111,17 +113,19 @@ def __init__(
raise Exception("Proxy URL must be a string. For example: '127.0.0.1:8888'")

def _initialize_specs(self):
package_root = Path(__file__).parent
for spec_name, file_path in SPECS_MAPPING.items():
specs_file_path = f"{package_root}/specs/{file_path}"
try:
with open(file_path, "r", encoding="utf-8") as f:
with open(specs_file_path, "r", encoding="utf-8") as f:
spec_content = yaml.safe_load(f)
if not spec_content:
raise ValueError("Spec file is empty or invalid.")

self.specs[spec_name] = spec_content

except Exception as e:
print(f"Error loading {file_path}: {e}")
print(f"Error loading {specs_file_path}: {e}")

def _get_ssl_default_context(self, verify_ssl: Union[str, bool]):
return (
Expand Down
4 changes: 2 additions & 2 deletions domaintools/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,6 @@ class OutputFormat(Enum):
}

SPECS_MAPPING = {
"iris": "domaintools/specs/iris-openapi.yaml",
# "rttf": "domaintools/specs/feeds-openapi.yaml",
"iris": "iris-openapi.yaml",
# "rttf": "feeds-openapi.yaml",
}
63 changes: 63 additions & 0 deletions tests/fixtures/vcr/test_account_information.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -928,4 +928,67 @@ interactions:
status:
code: 200
message: OK
- request:
body: ''
headers:
accept:
- '*/*'
accept-encoding:
- gzip, deflate
connection:
- keep-alive
host:
- api.domaintools.com
user-agent:
- python-httpx/0.28.1
method: GET
uri: https://api.domaintools.com/v1/account?app_name=python_wrapper&app_version=2.7.1
response:
body:
string: !!binary |
H4sIAAAAAAAAA9WZb4+iMBDGvwuv7hKbKIju7Ve5XEwXRphsaUlb9Izxu9/wxw3J6Ya6yFJfoW3h
N9OHZ9p6DjSYUkkDwes54EmiKmmbyxJ3lQEteUFNAUoLmeYWqevOgrEos2BBAyweqN3qCi6LoNQq
rRJrgtff5wBTGtfdkaHcK10042lYCXpXKGnzncAC6XnBall/uqZcVfraIishugEoKwsfI+L68W9G
id6PbefK8KwJx6qUn6hrRF2bx9H1Ol7HAaHC3xLbeHYpt9COvSw6bNRoiPlQB5rVzXeZXZDD5XDm
cNODXoVDmUFqTPKbuKEr7sYFt0f7K4q2A3FTsJBYBibhgrqwVBUcpbmd7tgNP3LAX/bwl27smEml
IX0EnRQUjIq+ckMvuKSbsSO3SS7Q2FHTv3JR+xfyT8PQKv3N0NHajVrC0UfFNFLxR+wtJqOytEfx
iYlPo5HhwAa4vuPiDxTK5fN4c9WsBFhO7qH0yYMMY3l1jOnXIe6oGjLKrObSzoN6gDdrKCs75kLv
mYVEwwG0AYblWLBTsLJjrvCO+c4rvWjePcFkcMAUZPLtVcJBCfXejGqFpm/+yHdU7T4Pt+D6nXEB
2s6+TpSc8pp6Ywo91c6jqA1IsS+5bTg/XY3FU9GuQzflMlGfJN1McTibpc3HamwGzjDkVYOjOLH2
kO66Z2N7oJT/4CX+HIn/UYVso5fBMai3xjHSeUQRb/v2sYmGHM91Wu92eDrlt5ec8Zzs5Arb6b7u
xqgbJ0klYEy9sbYqUcI3TWngglksri8FS9EkigrS6eFIei411gSNFIuJxpqUGUnNj6A+8d/xAng6
/x3v9TGC+rzq8dpx/x2ftAT2g/BiEv6zqFzZ5v+Gufjs9uUrQYzoRRPOQXPo4fUEtBHMOvt/Lpd/
lU2fImIfAAA=
headers:
access-control-allow-origin:
- '*'
cache-control:
- no-store, no-cache, must-revalidate
content-encoding:
- gzip
content-security-policy:
- 'default-src * data: blob: ''unsafe-eval'' ''unsafe-inline'''
content-type:
- application/json;charset=utf-8
date:
- Fri, 16 Jan 2026 10:15:20 GMT
expires:
- Thu, 19 Nov 1981 08:52:00 GMT
pragma:
- no-cache
set-cookie:
- dtsession=7rartqhtgi8aq8epi8c0j4olodd36g0p3ucihlv816nhhd3j9dm6avgguu7pr133qfcef70lbke1omguugq463qkt83dn7ge6fae3d7;
expires=Sun, 15-Feb-2026 10:15:20 GMT; Max-Age=2592000; path=/; domain=.domaintools.com;
secure; HttpOnly
strict-transport-security:
- max-age=31536000; includeSubDomains
transfer-encoding:
- chunked
vary:
- Accept-Encoding
x-time:
- '138810'
status:
code: 200
message: OK
version: 1
441 changes: 441 additions & 0 deletions tests/fixtures/vcr/test_async_context_manager.yaml

Large diffs are not rendered by default.

441 changes: 441 additions & 0 deletions tests/fixtures/vcr/test_async_iteration.yaml

Large diffs are not rendered by default.

441 changes: 441 additions & 0 deletions tests/fixtures/vcr/test_async_simple_await.yaml

Large diffs are not rendered by default.

63 changes: 63 additions & 0 deletions tests/fixtures/vcr/test_available_api_calls.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -744,4 +744,67 @@ interactions:
status:
code: 200
message: OK
- request:
body: ''
headers:
accept:
- '*/*'
accept-encoding:
- gzip, deflate
connection:
- keep-alive
host:
- api.domaintools.com
user-agent:
- python-httpx/0.28.1
method: GET
uri: https://api.domaintools.com/v1/account?app_name=python_wrapper&app_version=2.7.1
response:
body:
string: !!binary |
H4sIAAAAAAAAA9WZb4+iMBDGvwuv7hKbKIju7Ve5XEwXRphsaUlb9Izxu9/wxw3J6Ya6yFJfoW3h
N9OHZ9p6DjSYUkkDwes54EmiKmmbyxJ3lQEteUFNAUoLmeYWqevOgrEos2BBAyweqN3qCi6LoNQq
rRJrgtff5wBTGtfdkaHcK10042lYCXpXKGnzncAC6XnBall/uqZcVfraIishugEoKwsfI+L68W9G
id6PbefK8KwJx6qUn6jrmro2j6uv4/UmIFT4W2Ibzy7lFtqxl0WHjRoNMR/qQLO6+S6zC3K4HM4c
bnrQqzAeyAxSY5LfxA1dcTcuuD3aX1G0HYibgoXEMjAJF9SFpargKM3tdMdu+JED/rKHv3Rjx0wq
Dekj6KSgYFT0lRt6wSXdjB25TXKBxo6a/pWL2r+QfxqGVulvho7WbtQSjj4qppGKP2JvMRmVpT2K
T0x8Go0MBzbA9R0Xf6BQLp/Hm6tmJcBycg+lTx5kGMurY0y/DnFH1ZBRZjWXdh7UA7xZQ1nZMRd6
zywkGg6gDTAsx4KdgpUdc4V3zHde6UXz7gkmgwOmIJNvrxIOSqj3ZlQrNH3zR76javd5uAXX74wL
0Hb2daLklNfUG1PoqXYeRW1Ain3JbcP56Wosnop2Hbopl4n6JOlmisPZLG0+VmMzcIYhrxocxYm1
h3TXPRvbA6X8By/x50j8jypkG70MjkG9NY6RziOKeNu3j0005Hiu03q3w9Mpv73kjOdkJ1fYTvd1
N0bdOEkqAWPqjbVViRK+aUoDF8xicX0pWIomUVSQTg9H0nOpsSZopFhMNNakzEhqfgT1if+OF8DT
+e94r48R1OdVj9eO++/4pCWwH4QXk/CfReXKNv83zMVnty9fCWJEL5pwDppDD68noI1g1tn/c7n8
A8qKUbxiHwAA
headers:
access-control-allow-origin:
- '*'
cache-control:
- no-store, no-cache, must-revalidate
content-encoding:
- gzip
content-security-policy:
- 'default-src * data: blob: ''unsafe-eval'' ''unsafe-inline'''
content-type:
- application/json;charset=utf-8
date:
- Fri, 16 Jan 2026 10:15:23 GMT
expires:
- Thu, 19 Nov 1981 08:52:00 GMT
pragma:
- no-cache
set-cookie:
- dtsession=4vvi9uld2na1sd68uot58bjd1a1ebni6hho99e8qg2qm7vkrf61uibfr7643nll2tacnnavolvs33cf81rq4chja3fdrvdvchemvukp;
expires=Sun, 15-Feb-2026 10:15:23 GMT; Max-Age=2592000; path=/; domain=.domaintools.com;
secure; HttpOnly
strict-transport-security:
- max-age=31536000; includeSubDomains
transfer-encoding:
- chunked
vary:
- Accept-Encoding
x-time:
- '237116'
status:
code: 200
message: OK
version: 1
130 changes: 130 additions & 0 deletions tests/fixtures/vcr/test_brand_monitor.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1604,4 +1604,134 @@ interactions:
status:
code: 200
message: OK
- request:
body: ''
headers:
accept:
- '*/*'
accept-encoding:
- gzip, deflate
connection:
- keep-alive
host:
- api.domaintools.com
user-agent:
- python-httpx/0.28.1
method: GET
uri: https://api.domaintools.com/v1/account?app_name=python_wrapper&app_version=2.7.1
response:
body:
string: !!binary |
H4sIAAAAAAAAA9WZb4+iMBDGvwuv7hKbKIju7Ve5XEwXRphsacm06Bnjd7/yxw3J6Ya6yFJfoW3h
N9OHZ9p6Dgh0qaSG4PUc8CRRlTTNZYm7SgNJXtimAKWBjLhB23VnQBuUWbCwAwwebLuhCi6LoCSV
VonRwevvc4CpHdfdkaHcKyqa8XZYCbQrlDT5TmCB9nnBall/uqZcVXRtkZUQ3QCUlYGPEXH9+Det
RO/HtnOledaEY1TKT13X5nH2eh2vt4FFhb8ltvHsUm6gHXtZdNhIqC3zoQ40q5vvMrsgh8vhzOGm
B70K44HMIAmT/CZu6Iq7ccHt0f6KoqEpTsFAYhjohAvbhaWq4Cj17XTHbviRA/6yh790Y8dMKoL0
EXSroGBU9JUbesGlvRk7cpPkArUZNf0rF7V/If92GBpF3wwdrd2oJRx9VEwjFX/E3mIyW5b2KD4x
8Wk0MhxYA6c7Lv5AoVw+jzdXzUqA5dY9FJ08yDCWV8eYfh3ijkqQ2cwSl2Ye1AO8maCszJgLvWcW
EoIDkAaG5ViwU7CyY67wjvnOK72o3z3BZHDAFGTy7VXCQQn13szWCrLf/JHvqNp9Hm7B6Z1xAWRm
XydKbvOaemMKPdXOo6gNSLEvuW04P12NxVPRrkM35TJRnyTdTHE4m6XNx2psBs4w5FWDozix9pDu
umdje7Ap/8FL/DkS/6MK2UYvg2NQb41jpPOIIt727WMTDTme67Te7fAo5beXnPGc7OQK2+m+7sZs
N24llYDW9cbaqEQJ3zRFwAUzWFxfCpaiTpQtSKeHI+m51FgTNFIsOhprUmYkNT+C+sR/xwvg6fx3
vNfHCOrzqsdrx/13fNIS2A/Ci0n4z6JyZZr/G+bis9uXrwQxohdNOAfNoYfXE9BGMOvs/7lc/gGI
rvUaYh8AAA==
headers:
access-control-allow-origin:
- '*'
cache-control:
- no-store, no-cache, must-revalidate
content-encoding:
- gzip
content-security-policy:
- 'default-src * data: blob: ''unsafe-eval'' ''unsafe-inline'''
content-type:
- application/json;charset=utf-8
date:
- Fri, 16 Jan 2026 10:15:26 GMT
expires:
- Thu, 19 Nov 1981 08:52:00 GMT
pragma:
- no-cache
set-cookie:
- dtsession=eukftnttsc1363g9b706tc3om1nh6tv9knvi282mp0n3iuh61li4kdrrfha7nr3lnehn9ughvk2hjmrq4mppv94s4k8rnm9nvekl2d3;
expires=Sun, 15-Feb-2026 10:15:26 GMT; Max-Age=2592000; path=/; domain=.domaintools.com;
secure; HttpOnly
strict-transport-security:
- max-age=31536000; includeSubDomains
transfer-encoding:
- chunked
vary:
- Accept-Encoding
x-time:
- '140799'
status:
code: 200
message: OK
- request:
body: ''
headers:
accept:
- '*/*'
accept-encoding:
- gzip, deflate
connection:
- keep-alive
host:
- api.domaintools.com
user-agent:
- python-httpx/0.28.1
method: GET
uri: https://api.domaintools.com/v1/mark-alert?app_name=python_wrapper&app_version=2.7.1&query=google
response:
body:
string: !!binary |
H4sIAAAAAAAAA51X0XLbOAz8Fz1bHCedS1P/yk0fIBKWYFOESlKWnEz+/aDYbtKzY0F91MwuuFqC
5OK1iJg6DgmLzWvxq8d4LDZFzVx7LFaFp5ZysXlYr9erInMGX2yen1cFjtb3Tjj//lwVAYdik2OP
q4JD2bB3l88+b5+LzRZ8kg8HWQjF4/rxqVw/lA9PUh88xpykzGvhuAUKF8BJgbHcCiplyL2g3ld6
W33CgqN8hBMYXMKxk3rzLFq0Bg0UtOAK3QnZsafUoDMBWjShnmHlLMIbCL+XMf3+M+Vi7J+03g8Q
x9JD9YW+mzQLWwyYz4xUpbvabPOi/Xn7YdOReyU0c3cfySFHsJnjiRDxQDgk1Z9iS56w/Ews64iB
K6VVtWzeReh4fJnHN2nJTtTccIsQzj1D8617ApYWImK8MuEreKKM5QEjbclCJg7VdzzUVT++jCP9
2n132/EH8MA7eOnCnt2wPWhrG0gEJtzfw4+uriqFKe9gdL2pNRa+o3dcJZ0KcC0FM2BlyKngyXSR
lToELWBjPdm9pjil3DtipdcQwB8z2dTaTk1xkcmZqQM08K7LjbJ1J3zFHpbAI7kaDQeNlnOPd3Ct
aIYRuY7Q6kkNRe15fWc0UU5txbzXLuE5ocuYrs73vVXSlbNflHem88qiDqZP3eV5ZmDam9Rr0fGw
xMmbJt7Bb4+kbJ5arv5AxloN1kNKBjXQRk64p4DpxgVyRze1tdlGRX0KDkcKtXLnW+jK1AgJgp6R
yrxb4LkwPr8cC5giQaJllNC4zK3Ow7GUm+jq4v3inya8ZWnUBdomTlebFhfgI4OzkDD2SXsjnTIH
OsdTgFki8MKU0yoG+huPvYIsooe/Y0bmLca/Ji5ZMiF3kXbJVNrNSBSscgMyHxZIkaB5ncHu4AfI
tjGSpZX4cZiX3UN0LfSRMvXpnG40M8QOyEmwizych4gWM0geSR1aAhlG8rd/Hp++rcv1+vl5VsYO
EnzcGKY9zqUlTwd5GCFrZ4XWkqOa9uCBIgSLXmYZ6fMxSeB/jHI6IcWDOzuQwpRMRAn9f1646XbL
UmW4SInzr1d7/J3f6v5oLMwypgvhMkHN10/gs5VRdWvFlykInLWV82+8HI/zOorzMcW8T7n8bmEx
8mGtLy0TfcqX6XZKxXPC+y7zNPN/PAbaZ+D03ixZa8GELtCvZrQr7HjGDRz9/fYf9VpfGvWU/AG9
NSX/fHv7D/qrB+i/EQAA
headers:
access-control-allow-origin:
- '*'
cache-control:
- no-store, no-cache, must-revalidate
content-encoding:
- gzip
content-security-policy:
- 'default-src * data: blob: ''unsafe-eval'' ''unsafe-inline'''
content-type:
- application/json;charset=utf-8
date:
- Fri, 16 Jan 2026 10:15:29 GMT
expires:
- Thu, 19 Nov 1981 08:52:00 GMT
pragma:
- no-cache
set-cookie:
- dtsession=aqac2qlp195umionnhha0ipeba7tml45u91fvdpluegq589640e7dg55hr7j19lkje4ehi8ch2vv211lmaj24hnohqt8fkojhad96m4;
expires=Sun, 15-Feb-2026 10:15:29 GMT; Max-Age=2592000; path=/; domain=.domaintools.com;
secure; HttpOnly
strict-transport-security:
- max-age=31536000; includeSubDomains
transfer-encoding:
- chunked
vary:
- Accept-Encoding
x-time:
- '122974'
status:
code: 200
message: OK
version: 1
66 changes: 66 additions & 0 deletions tests/fixtures/vcr/test_dict_like_behaviour.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -852,4 +852,70 @@ interactions:
status:
code: 200
message: OK
- request:
body: ''
headers:
accept:
- '*/*'
accept-encoding:
- gzip, deflate
connection:
- keep-alive
host:
- api.domaintools.com
user-agent:
- python-httpx/0.28.1
method: GET
uri: https://api.domaintools.com/v1/google.com/whois?app_name=python_wrapper&app_version=2.7.1
response:
body:
string: !!binary |
H4sIAAAAAAAAA7VVUXPaOBD+Kzu+l3aKjW1ICH46BnI5ZsB0MGkf6k5GsRWjOVvySaK018l/v5Xt
ggkm1z5chgnJ7urT6ttPn75bkqpScEWt4Dv+nTGlJeHaCqw7IbKcwmIxtXqHjGaCm8pEUqJpimXe
eDyy3bHtXWEZ/VoyBMSw7/o3VXiI4V2ZNtW+641N2B23QCUmlkT+tRScaSFhzhMH00oTvVMG7ZOV
5IxyPaM51fS9FFv2yAxgr0lssGf1RGVH6r7a+yShqPxCZQdYnegEq1NnYJ+fexYnBX2o81WvYeQ5
d6vV3eLWma6WuDaM/JeBwcvAsB343LP2W8GUYdpsWPN5bbtezaekiZCGzpkoCOMQYgcBZNXAnEQU
MV/X1H6DpmI+C8D3BjdX3vBhtlpO5uEDbmR/WEfhoZhI+Pjnah5BVJ0lgKoHp8DJFPVkTrCx/H69
CGCrdRnE/bi/3+/Pi2vGUpjhb2zB9Ye2i8LwN64feKNgMHjn4k/Mp0ZQKK6m8KiqjTsKXBc/TeFx
93VLk3BrlNdGOAhwcBEhgJbqepXs2vjzSTipiRv77fjkEVUJU8E1STTcIr95AMQE8cRljnRr9fsr
rJ2uf78VHNt95zm+e3ONAxpdYY/N2KLqCgTQLWV4Y7hXB/JZQjh3hMziPi3L37oXvb0Afq76n4I/
X3Zpg5f37afgXy46B+++mP8B3r3oEvgvU3Np2aUNfpGa7kVvjxrjGlYyI5z9U92IAI5eflI0FTuO
JhHAfXQSbzQd4Q6o0DX9e0dVE4U/hCyAaDh2mFZHOjeKfuUfcb/tSxuabP9HeGOEB/viauC8kvRf
Sw5fS3onyVkYRbfTAHZcsYzTFD1vvQDxBHpLYT6dhGFjq+hLBHBejzkt8NSlkJrxDKJvStOi7aNp
KZWDLkIlZ4nDqcYojzlSA4WQFBh/QpZqs8NPjV6/lpCIlKoelDklaDJfmGI6iDnARUHhcy12MqHI
ZEky84USs2s0u0Ize7ef50bCS8KxvsBL+mazRPHhyTTO0xzJ+CCqjyogPMX/uNoV+Dhi40AgZRnT
JIe9kHnqGPAPpsu2F58KoPNd+WGfeGQsRve8cd3R8Grs++OYz/E92ElR0l6VHA4d13cHvnvt+z6a
q23H3Hr+8Yw+1OfH1/Q4Vev5+V+00AtvGgkAAA==
headers:
access-control-allow-origin:
- '*'
cache-control:
- no-store, no-cache, must-revalidate
content-encoding:
- gzip
content-security-policy:
- 'default-src * data: blob: ''unsafe-eval'' ''unsafe-inline'''
content-type:
- application/json;charset=utf-8
date:
- Fri, 16 Jan 2026 10:17:21 GMT
expires:
- Thu, 19 Nov 1981 08:52:00 GMT
pragma:
- no-cache
set-cookie:
- dtsession=lv5davjjncsrk0h297s8m01rc0j8gcmcom97u8difooulvofqgsc6k36m50c1cq69sjrrqjbtbc352gogk3m7ffkmoncrr09hdkvvb4;
expires=Sun, 15-Feb-2026 10:17:21 GMT; Max-Age=2592000; path=/; domain=.domaintools.com;
secure; HttpOnly
strict-transport-security:
- max-age=31536000; includeSubDomains
transfer-encoding:
- chunked
vary:
- Accept-Encoding
x-time:
- '27975'
status:
code: 200
message: OK
version: 1
Loading