Skip to main content

Check Filtering

made-with-python GitHub release Release codecov GitHub PyPI - Python Version Code style: black Ruff Checked with mypy

A command-line tool to check if domains are filtered (blocked) in Iran by analyzing DNS responses.

🔍 How It Works

This tool checks if a domain is blocked by Iranian ISPs by:

  1. Resolving the domain's A record using DNS
  2. Comparing the resolved IP addresses against known blocking IPs used by Iranian ISPs
  3. Reporting whether the domain is blocked or accessible

Note: This tool can only detect DNS-based blocking and does not have the power to detect other types of filtering or network disorders.

✨ Features

  • 🚀 Fast async DNS resolution - Check multiple domains concurrently
  • 📋 Multiple input methods - Single domain, comma-separated list, or file
  • 🎨 Beautiful CLI output - Rich formatted tables with live updates
  • 🔧 Configurable - Custom DNS servers and timeout settings

📋 Requirements

  • Python 3.10+

📦 Installation

From PyPI

pip install check-filter

From Source

git clone https://github.com/hatamiarash7/CheckFiltering.git
cd CheckFiltering
poetry install

You can also download the wheel package from the release page.

🚀 Usage

Command Line Interface

Check a Single Domain

check-filter domain github.com

single

Check Multiple Domains

check-filter domains github.com,google.com,twitter.com

multiple

Check Domains from File

Create a file with domain names (one per line). Lines starting with # are treated as comments:

# Social media
github.com
twitter.com
facebook.com

# Development
gitlab.com
stackoverflow.com

Then run:

check-filter file domains.txt

file

Show Version

check-filter --version
# or
check-filter -v

Show Help

check-filter --help
check-filter domain --help
check-filter domains --help
check-filter file --help

As a Python Library

import asyncio
from check_filter import DomainChecker, FilterStatus

async def main():
    checker = DomainChecker()
    
    # Check a single domain
    result = await checker.acheck("google.com")
    print(f"{result.domain}: {result.status.value}")
    print(f"Blocked: {result.is_blocked}")
    print(f"IPs: {result.ips}")
    
    # Check multiple domains concurrently
    results = await checker.acheck_many([
        "google.com",
        "twitter.com",
        "github.com",
    ])
    
    for result in results:
        status = "🚫 Blocked" if result.is_blocked else "✅ Free"
        print(f"{result.domain}: {status}")

asyncio.run(main())

Custom Configuration

from check_filter import DomainChecker

# Use custom blocked IPs and DNS servers
checker = DomainChecker(
    blocked_ips={"10.10.34.34", "10.10.34.35"},
    nameservers=["8.8.8.8", "8.8.4.4"],
    timeout=10.0,
)

Using CheckResult

from check_filter import CheckResult, FilterStatus

# CheckResult is a dataclass with useful properties
result = await checker.acheck("example.com")

# Access properties
print(result.domain)      # "example.com"
print(result.status)      # FilterStatus.FREE
print(result.is_free)     # True
print(result.is_blocked)  # False
print(result.ips)         # frozenset({'93.184.216.34'})
print(result.error)       # None (or error message if failed)

# Backward compatible tuple unpacking
domain, is_free = result

🛠️ Development

Setup Development Environment

# Clone the repository
git clone https://github.com/hatamiarash7/CheckFiltering.git
cd CheckFiltering

# Install dependencies with dev tools
make install-dev

Available Commands

make help           # Show all available commands
make test           # Run tests
make test-cov       # Run tests with coverage report
make lint           # Run all linters
make lint-fix       # Run linters with auto-fix
make format         # Format code with black and isort
make type-check     # Run type checking with mypy
make check          # Run all checks (format, lint, type-check, test)
make build          # Build package
make clean          # Clean build artifacts

Running Tests

# Run all tests
make test

# Run tests with coverage
make test-cov

# Run fast tests (exclude slow/integration tests)
make test-fast

📄 API Reference

DomainChecker

Main class for checking domain filtering status.

DomainChecker(
    blocked_ips: Set[str] | None = None,  # Custom blocked IPs
    nameservers: list[str] | None = None,  # DNS servers to use
    timeout: float = 5.0,                  # DNS query timeout
)

Methods:

  • acheck(domain: str) -> CheckResult - Check a single domain
  • acheck_many(domains: list[str]) -> list[CheckResult] - Check multiple domains

CheckResult

Dataclass containing the result of a domain check.

Attributes:

  • domain: str - The checked domain
  • status: FilterStatus - The filtering status
  • ips: frozenset[str] - Resolved IP addresses
  • error: str | None - Error message if check failed

Properties:

  • is_blocked: bool - True if domain is blocked
  • is_free: bool - True if domain is not blocked

FilterStatus

Enum with possible filtering statuses:

  • FREE - Domain is accessible
  • BLOCKED - Domain is blocked
  • ERROR - Check failed (timeout, etc.)
  • UNKNOWN - Domain doesn't exist (NXDOMAIN)

💛 Support

Donate with Bitcoin Donate with Ethereum

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch: git checkout -b feature/my-new-feature
  3. Install development dependencies: make install-dev
  4. Make your changes and add tests
  5. Run checks: make check
  6. Commit your changes: git commit -am 'Add some feature'
  7. Push to the branch: git push origin feature/my-new-feature
  8. Submit a pull request

🐛 Issues

Found a bug or have a suggestion? Please open an issue.

📜 License

This project is licensed under the MIT License - see the LICENSE file for details.

Metadata

Release files for check-filter 2.5.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for check-filter 2.5.2
File Size Uploaded
check_filter-2.5.2.tar.gz 12.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for check-filter 2.5.2
File Interpreter ABI Platform
check_filter-2.5.2-py3-none-any.whl Python 3 none any Details

Total release size: 25.3 kB

Release files / check_filter-2.5.2.tar.gz

Download URL check_filter-2.5.2.tar.gz
Size 12.9 kB
Tags Source
SHA-256 checksum
How to use checksums
faaa7479fe71da506b432a13d3bef17a3ea301190637f51ca9a4c8884303340f
BLAKE2b-256 checksum
How to use checksums
4ce1d81fb804b755b4f614ecaf3759061cddc1222bf96e4120fa493861ea32a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.13.1 Linux/6.11.0-1018-azure

Release files / check_filter-2.5.2-py3-none-any.whl

Download URL check_filter-2.5.2-py3-none-any.whl
Size 12.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9697f3d9689eea680ea85b39e9bccf3f5dd0950c24e74af2921e6e47df2a5bff
BLAKE2b-256 checksum
How to use checksums
8b0548da2deb4f9c3edca71b9803d57499cdbbce237cfbe4b95ccfecfb95a997
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.2.1 CPython/3.13.1 Linux/6.11.0-1018-azure

Release history Release notifications | RSS feed

This release

2.5.2 This release

2 release files

2.5.0

2 release files

2.3.4

2 release files

2.3.3

2 release files

2.0.3

2 release files

2.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page