How to Import All Holehe Modules for Programmatic Use: A Complete Guide
Use import_submodules from holehe.core to dynamically load every site-checking module under holehe.modules into a dictionary, then extract callable functions with get_functions.
Holehe is an open-source OSINT tool that checks email addresses against hundreds of websites to uncover registered accounts. While the command-line interface handles most use cases, advanced integrations require programmatic access to its modular architecture. This guide shows you how to import all Holehe modules at once using the library's built-in helper functions.
Understanding Holehe's Module Structure
Holehe organizes each site-specific check as a separate Python module nested under the holehe.modules package. Rather than manually importing dozens of individual modules, the codebase provides a dynamic loader that discovers and imports everything automatically.
The loading mechanism resides in holehe/core.py at lines 37-47, where the import_submodules function implements the discovery logic using importlib and pkgutil.walk_packages.
Importing All Modules with import_submodules
The import_submodules helper walks the entire package tree and returns a dictionary keyed by fully-qualified module names.
from holehe.core import import_submodules
# Dynamically import every submodule under holehe.modules
all_modules = import_submodules("holehe.modules")
print(f"Loaded {len(all_modules)} modules")
# Keys look like: 'holehe.modules.social_media.instagram', etc.
This single call handles nested packages (like social_media/, shopping/, programming/) without requiring manual path enumeration.
Extracting Callable Check Functions
Each imported module defines an async function whose name matches the final path component—facebook, instagram, twitter, and so on. To convert the raw module dictionary into a list of callable checks, use get_functions:
from holehe.core import import_submodules, get_functions
# Minimal args object mimicking CLI flags
class Args:
nopasswordrecovery = False # Set True to exclude password-recovery modules
# nocolor = False
# onlyused = False
all_modules = import_submodules("holehe.modules")
site_checks = get_functions(all_modules, Args())
print(f"Found {len(site_checks)} callable checks")
get_functions respects your runtime configuration:
nopasswordrecovery=Truefilters out modules that only check password recovery endpoints- Additional flags align with CLI behavior as implemented in
holehe/core.pylines 105-108
Running Checks Programmatically
Every extracted function is an async coroutine accepting three parameters: email, httpx.AsyncClient, and results list.
import asyncio
import httpx
from holehe.core import import_submodules, get_functions
class Args:
nopasswordrecovery = False
async def check_email(email: str):
"""Run all Holehe checks against an email address."""
client = httpx.AsyncClient()
results = []
# Load modules and extract functions
all_modules = import_submodules("holehe.modules")
checks = get_functions(all_modules, Args())
# Execute all checks concurrently
await asyncio.gather(*[
check(email, client, results) for check in checks
])
await client.aclose()
return results
# Run and inspect output
email = "target@example.com"
output = asyncio.run(check_email(email))
for entry in output:
print(f"{entry['name']}: {entry['exists']} (rate: {entry.get('rateLimit', 'N/A')})")
Output dictionaries follow Holehe's standard schema with fields like name, exists, emailrecovery, phoneNumber, and others.
Synchronous Execution Pattern
If your codebase requires synchronous execution, wrap the async logic in asyncio.run() or use an event loop explicitly—do not call coroutines directly:
import asyncio
from holehe.core import import_submodules, get_functions
def run_holehe_sync(email: str):
"""Synchronous wrapper for Holehe checks."""
async def _inner():
client = httpx.AsyncClient()
results = []
modules = import_submodules("holehe.modules")
checks = get_functions(modules, Args())
for check in checks[:5]: # Limit to first 5 for demo
await check(email, client, results)
await client.aclose()
return results
return asyncio.run(_inner())
Key Source Files Reference
| File | Purpose |
|---|---|
holehe/core.py |
Defines import_submodules (lines 37-47), get_functions, and CLI entry point (lines 105-108) |
holehe/modules/__init__.py |
Package marker enabling the holehe.modules namespace |
holehe/modules/social_media/facebook.py |
Example site module implementing async def facebook(...) |
holehe/localuseragent.py |
Default User-Agent string consumed by all modules |
holehe/instruments.py |
Progress bar utilities for bulk operations |
Summary
- Use
import_submodulesfromholehe.coreto load every module underholehe.modulesdynamically - Pass
"holehe.modules"as the package name to traverse the complete tree - Extract callables with
get_functions, providing an args object for CLI-compatible filtering - Execute asynchronously since all site checks are defined as coroutines
- Structure results as a shared list passed into each check function, following Holehe's internal pattern
Frequently Asked Questions
Can I import specific modules instead of everything?
Yes—standard Python imports work: from holehe.modules.social_media import instagram. However, you lose the automatic discovery that import_submodules provides. For selective loading without the helper, manually construct the import path and use importlib.import_module().
Why are all Holehe check functions asynchronous?
Each check performs HTTP requests to external services. Async execution allows concurrent network I/O without threading overhead. The httpx.AsyncClient parameter enables connection pooling and proper session management across hundreds of requests.
How do I exclude specific site modules from loading?
The get_functions helper accepts runtime flags via an args object. Set nopasswordrecovery=True to filter modules. For custom exclusion logic, post-process the all_modules dictionary before calling get_functions, or subclass the args object with additional boolean attributes.
What Holehe version introduced import_submodules?
import_submodules and get_functions have been core utilities since early releases, as visible in the repository's holehe/core.py. These helpers power the CLI's own module loading, ensuring API stability for programmatic use.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →