Skip to content

hatamiarash7/CheckFiltering

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

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.

About

Check domains that filtered in Iran

Topics

Resources

License

Stars

Watchers

Forks

Contributors 4

  •  
  •  
  •  
  •