Skip to main content

Check URLs that filtered (or not) in Iran.

Project description

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

check_filter-2.5.2.tar.gz (12.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

check_filter-2.5.2-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

Details for the file check_filter-2.5.2.tar.gz.

File metadata

  • Download URL: check_filter-2.5.2.tar.gz
  • Upload date:
  • Size: 12.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.13.1 Linux/6.11.0-1018-azure

File hashes

Hashes for check_filter-2.5.2.tar.gz
Algorithm Hash digest
SHA256 faaa7479fe71da506b432a13d3bef17a3ea301190637f51ca9a4c8884303340f
MD5 0f7ba205124f4eabd76243e2b58647e6
BLAKE2b-256 4ce1d81fb804b755b4f614ecaf3759061cddc1222bf96e4120fa493861ea32a3

See more details on using hashes here.

File details

Details for the file check_filter-2.5.2-py3-none-any.whl.

File metadata

  • Download URL: check_filter-2.5.2-py3-none-any.whl
  • Upload date:
  • Size: 12.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.2.1 CPython/3.13.1 Linux/6.11.0-1018-azure

File hashes

Hashes for check_filter-2.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 9697f3d9689eea680ea85b39e9bccf3f5dd0950c24e74af2921e6e47df2a5bff
MD5 272ee7637c82972e0d33225b09a73ca5
BLAKE2b-256 8b0548da2deb4f9c3edca71b9803d57499cdbbce237cfbe4b95ccfecfb95a997

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page