$ show JackJuly/linkook
Linkook is a Python CLI tool for OSINT-driven discovery of linked social media accounts and associated emails across multiple platforms. It takes a single username as input, scans a configurable set of websites (defined in a provider.json file), and recursively extracts linked accounts, usernames, and emails from discovered profiles. The tool supports breach checking via HudsonRock's database or Have I Been Pwned, and can export results to a Neo4j-compatible JSON format for graph visualization. The architecture is modular: a Provider class handles URL templates and regex extraction, a SiteScanner performs HTTP requests and keyword-based existence checks, and a ScannerManager manages concurrent scanning via a thread pool with a queue. The code is well-structured, includes unit tests, and demonstrates solid engineering practices with clean separation of concerns, error handling, and logging.
The LLM identified 3 files worth highlighting for reuse:
The Provider class encapsulates all configuration for a single social media platform: URL templates, regex patterns for link/username extraction, keyword-based existence checks, and request parameters. It builds regex patterns from URL templates with proper escaping, supports interpolation of the username placeholder into URLs and payloads, and provides methods for extracting links and usernames from HTML. This is a self-contained, reusable component that could be extracted into a library for any project needing to manage multiple URL-based service configurations.
ScannerManager implements a multi-threaded scan orchestration using a queue and worker threads. It handles graceful shutdown via an exit event, ensures thread-safe updates to shared state with a lock, and dynamically enqueues new tasks when linked accounts are discovered. The pattern is clean and reusable for any batch processing task that requires concurrent execution with dynamic task generation.
Neo4jVisualizer transforms scan results into a Neo4j-compatible JSON format with nodes (User, SocialMediaAccount, Email) and relationships (HAS_ACCOUNT, HAS_EMAIL, CONNECTED_TO). It handles deduplication of nodes, converts sets to lists for JSON serialization, and dynamically extracts usernames from profile URLs using the Provider class. This component is a clean example of exporting relational data to a graph database and could be adapted for other graph export scenarios.