dropcatch 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dropcatch-0.1.0/PKG-INFO +45 -0
- dropcatch-0.1.0/README.md +35 -0
- dropcatch-0.1.0/dropcatch/__init__.py +4 -0
- dropcatch-0.1.0/dropcatch/nask.py +89 -0
- dropcatch-0.1.0/dropcatch.egg-info/PKG-INFO +45 -0
- dropcatch-0.1.0/dropcatch.egg-info/SOURCES.txt +8 -0
- dropcatch-0.1.0/dropcatch.egg-info/dependency_links.txt +1 -0
- dropcatch-0.1.0/dropcatch.egg-info/top_level.txt +1 -0
- dropcatch-0.1.0/pyproject.toml +19 -0
- dropcatch-0.1.0/setup.cfg +4 -0
dropcatch-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dropcatch
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: NASK (.pl) domain lifecycle tracker and raw WHOIS parser for drop-catching automation.
|
|
5
|
+
Author-email: Rylse Solutions <hello@rylse.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Keywords: dropcatch,nask,dns.pl,whois,domain-sniping,pl-domains,seo
|
|
8
|
+
Requires-Python: >=3.8
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
|
|
11
|
+
# 🎯 dropcatch (alpha) for (NASK / .pl Edition)
|
|
12
|
+
|
|
13
|
+
A specialized, zero-dependency Python utility for monitoring the lifecycle of Polish `.pl` domains directly via the NASK WHOIS registry (`whois.dns.pl`).
|
|
14
|
+
|
|
15
|
+
Built for drop-catchers, SEO professionals, and domain investors who need raw socket connections without third-party API limits.
|
|
16
|
+
|
|
17
|
+
## ⚡ Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install dropcatch
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 🚀 Usage
|
|
24
|
+
dropcatch connects directly to port 43 of the Polish registry, parses the proprietary text format, and computes exact drop windows.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
import dropcatch
|
|
28
|
+
|
|
29
|
+
# Query a .pl domain directly from NASK registry
|
|
30
|
+
domain = dropcatch.query_nask("nask.pl")
|
|
31
|
+
|
|
32
|
+
print(f"Domain: {domain.name}")
|
|
33
|
+
print(f"Status: {domain.status}")
|
|
34
|
+
print(f"Expiration Date: {domain.expiration_date}")
|
|
35
|
+
|
|
36
|
+
# Check if it's currently in the 30-day blind period before deletion
|
|
37
|
+
if domain.is_blocked:
|
|
38
|
+
print(f"Domain is BLOCKED. Will drop around: {domain.estimated_drop_date}")
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Additional domain registries
|
|
42
|
+
Support for additional domain registries will be added over time. If you'd like to support the development of this dropcatch library, feel free to reach out to us via email.
|
|
43
|
+
|
|
44
|
+
## ⚠️ Disclaimer
|
|
45
|
+
This package is provided for informational and monitoring purposes only. Excessive querying may result in your IP being temporarily blocked by the NASK registry rate limiters. Use responsibly and do not hammer the WHOIS servers.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# 🎯 dropcatch (alpha) for (NASK / .pl Edition)
|
|
2
|
+
|
|
3
|
+
A specialized, zero-dependency Python utility for monitoring the lifecycle of Polish `.pl` domains directly via the NASK WHOIS registry (`whois.dns.pl`).
|
|
4
|
+
|
|
5
|
+
Built for drop-catchers, SEO professionals, and domain investors who need raw socket connections without third-party API limits.
|
|
6
|
+
|
|
7
|
+
## ⚡ Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install dropcatch
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 🚀 Usage
|
|
14
|
+
dropcatch connects directly to port 43 of the Polish registry, parses the proprietary text format, and computes exact drop windows.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
import dropcatch
|
|
18
|
+
|
|
19
|
+
# Query a .pl domain directly from NASK registry
|
|
20
|
+
domain = dropcatch.query_nask("nask.pl")
|
|
21
|
+
|
|
22
|
+
print(f"Domain: {domain.name}")
|
|
23
|
+
print(f"Status: {domain.status}")
|
|
24
|
+
print(f"Expiration Date: {domain.expiration_date}")
|
|
25
|
+
|
|
26
|
+
# Check if it's currently in the 30-day blind period before deletion
|
|
27
|
+
if domain.is_blocked:
|
|
28
|
+
print(f"Domain is BLOCKED. Will drop around: {domain.estimated_drop_date}")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Additional domain registries
|
|
32
|
+
Support for additional domain registries will be added over time. If you'd like to support the development of this dropcatch library, feel free to reach out to us via email.
|
|
33
|
+
|
|
34
|
+
## ⚠️ Disclaimer
|
|
35
|
+
This package is provided for informational and monitoring purposes only. Excessive querying may result in your IP being temporarily blocked by the NASK registry rate limiters. Use responsibly and do not hammer the WHOIS servers.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import socket
|
|
2
|
+
import re
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from datetime import datetime, timedelta
|
|
5
|
+
from typing import Optional, Dict, Any
|
|
6
|
+
|
|
7
|
+
NASK_WHOIS_SERVER = "whois.dns.pl"
|
|
8
|
+
NASK_WHOIS_PORT = 43
|
|
9
|
+
TIMEOUT_SECONDS = 5.0
|
|
10
|
+
|
|
11
|
+
LEGAL_DISCLAIMER = "Informational utility. Subject to NASK registry rate limits."
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class PLDomain:
|
|
15
|
+
name: str
|
|
16
|
+
status: str
|
|
17
|
+
expiration_date: Optional[datetime] = None
|
|
18
|
+
created_date: Optional[datetime] = None
|
|
19
|
+
raw_response: str = ""
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def is_blocked(self) -> bool:
|
|
23
|
+
"""NASK sets status to BLOCKED for ~30 days after expiration."""
|
|
24
|
+
return "BLOCKED" in self.status.upper() or "TERMINATED" in self.status.upper()
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def estimated_drop_date(self) -> Optional[datetime]:
|
|
28
|
+
"""
|
|
29
|
+
If a .pl domain is BLOCKED, it usually drops 30 days after expiration.
|
|
30
|
+
Note: Exact hour of deletion varies.
|
|
31
|
+
"""
|
|
32
|
+
if self.expiration_date and self.is_blocked:
|
|
33
|
+
return self.expiration_date + timedelta(days=30)
|
|
34
|
+
return None
|
|
35
|
+
|
|
36
|
+
def summary(self) -> Dict[str, Any]:
|
|
37
|
+
return {
|
|
38
|
+
"domain": self.name,
|
|
39
|
+
"status": self.status,
|
|
40
|
+
"is_blocked": self.is_blocked,
|
|
41
|
+
"expiration_date": self.expiration_date.isoformat() if self.expiration_date else None,
|
|
42
|
+
"estimated_drop_date": self.estimated_drop_date.isoformat() if self.estimated_drop_date else None,
|
|
43
|
+
"disclaimer": LEGAL_DISCLAIMER
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def query_nask(domain: str) -> PLDomain:
|
|
48
|
+
"""
|
|
49
|
+
Connects directly to whois.dns.pl over TCP Port 43 and parses the .pl domain status.
|
|
50
|
+
"""
|
|
51
|
+
if not domain.lower().endswith(".pl"):
|
|
52
|
+
raise ValueError("dropcatch currently only supports .pl domains (NASK registry).")
|
|
53
|
+
|
|
54
|
+
# 1. Connect directly to WHOIS server
|
|
55
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
56
|
+
s.settimeout(TIMEOUT_SECONDS)
|
|
57
|
+
s.connect((NASK_WHOIS_SERVER, NASK_WHOIS_PORT))
|
|
58
|
+
s.send(f"{domain}\r\n".encode("utf-8"))
|
|
59
|
+
|
|
60
|
+
response = b""
|
|
61
|
+
while True:
|
|
62
|
+
data = s.recv(4096)
|
|
63
|
+
if not data:
|
|
64
|
+
break
|
|
65
|
+
response += data
|
|
66
|
+
|
|
67
|
+
raw_text = response.decode("utf-8", errors="replace")
|
|
68
|
+
|
|
69
|
+
# 2. Parse the proprietary NASK format using Regex
|
|
70
|
+
status_match = re.search(r"^\s*status:\s*(.+)$", raw_text, re.IGNORECASE | re.MULTILINE)
|
|
71
|
+
exp_match = re.search(r"^\s*option expiration date:\s*(.+)$", raw_text, re.IGNORECASE | re.MULTILINE)
|
|
72
|
+
|
|
73
|
+
status = status_match.group(1).strip() if status_match else "UNKNOWN / NOT FOUND"
|
|
74
|
+
|
|
75
|
+
expiration_date = None
|
|
76
|
+
if exp_match:
|
|
77
|
+
try:
|
|
78
|
+
# NASK format: 2026.09.29 12:00:00
|
|
79
|
+
date_str = exp_match.group(1).strip()
|
|
80
|
+
expiration_date = datetime.strptime(date_str, "%Y.%m.%d %H:%M:%S")
|
|
81
|
+
except ValueError:
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
return PLDomain(
|
|
85
|
+
name=domain,
|
|
86
|
+
status=status,
|
|
87
|
+
expiration_date=expiration_date,
|
|
88
|
+
raw_response=raw_text
|
|
89
|
+
)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dropcatch
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: NASK (.pl) domain lifecycle tracker and raw WHOIS parser for drop-catching automation.
|
|
5
|
+
Author-email: Rylse Solutions <hello@rylse.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Keywords: dropcatch,nask,dns.pl,whois,domain-sniping,pl-domains,seo
|
|
8
|
+
Requires-Python: >=3.8
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
|
|
11
|
+
# 🎯 dropcatch (alpha) for (NASK / .pl Edition)
|
|
12
|
+
|
|
13
|
+
A specialized, zero-dependency Python utility for monitoring the lifecycle of Polish `.pl` domains directly via the NASK WHOIS registry (`whois.dns.pl`).
|
|
14
|
+
|
|
15
|
+
Built for drop-catchers, SEO professionals, and domain investors who need raw socket connections without third-party API limits.
|
|
16
|
+
|
|
17
|
+
## ⚡ Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
pip install dropcatch
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 🚀 Usage
|
|
24
|
+
dropcatch connects directly to port 43 of the Polish registry, parses the proprietary text format, and computes exact drop windows.
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
import dropcatch
|
|
28
|
+
|
|
29
|
+
# Query a .pl domain directly from NASK registry
|
|
30
|
+
domain = dropcatch.query_nask("nask.pl")
|
|
31
|
+
|
|
32
|
+
print(f"Domain: {domain.name}")
|
|
33
|
+
print(f"Status: {domain.status}")
|
|
34
|
+
print(f"Expiration Date: {domain.expiration_date}")
|
|
35
|
+
|
|
36
|
+
# Check if it's currently in the 30-day blind period before deletion
|
|
37
|
+
if domain.is_blocked:
|
|
38
|
+
print(f"Domain is BLOCKED. Will drop around: {domain.estimated_drop_date}")
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Additional domain registries
|
|
42
|
+
Support for additional domain registries will be added over time. If you'd like to support the development of this dropcatch library, feel free to reach out to us via email.
|
|
43
|
+
|
|
44
|
+
## ⚠️ Disclaimer
|
|
45
|
+
This package is provided for informational and monitoring purposes only. Excessive querying may result in your IP being temporarily blocked by the NASK registry rate limiters. Use responsibly and do not hammer the WHOIS servers.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
dropcatch
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "dropcatch"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "NASK (.pl) domain lifecycle tracker and raw WHOIS parser for drop-catching automation."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
requires-python = ">=3.8"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Rylse Solutions", email = "hello@rylse.com" },
|
|
14
|
+
]
|
|
15
|
+
keywords = ["dropcatch", "nask", "dns.pl", "whois", "domain-sniping", "pl-domains", "seo"]
|
|
16
|
+
|
|
17
|
+
[tool.setuptools.packages.find]
|
|
18
|
+
where = ["."]
|
|
19
|
+
include = ["dropcatch*"]
|