bangunx commited on
Commit
c7daaca
Β·
1 Parent(s): 444cd18

πŸš€ Initial commit: Complete modular OSINT tool with Gradio interface

Browse files

✨ Features:
- Modular architecture with clean separation of concerns
- Gradio web interface for username searching
- Async search engine with 400+ website support
- Multiple export formats (JSON, CSV, HTML)
- CLI interface for automation
- Environment configuration with UV
- Comprehensive documentation and tests

πŸ”§ Technical:
- Python async/await for performance
- Rate limiting and error handling
- NSFW filtering options
- Real-time search statistics
- Responsive web design

πŸ“Š Ready for Hugging Face Spaces deployment

.env.example ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Environment Configuration
2
+ DEBUG=False
3
+ LOG_LEVEL=INFO
4
+ MAX_CONCURRENT_REQUESTS=10
5
+ REQUEST_TIMEOUT=10
6
+ USER_AGENT=SherlockOSINT/1.0.0
7
+
8
+ # Web Interface Configuration
9
+ GRADIO_SERVER_NAME=0.0.0.0
10
+ GRADIO_SERVER_PORT=7860
11
+ GRADIO_SHARE=False
12
+
13
+ # Output Configuration
14
+ SAVE_RESULTS=True
15
+ OUTPUT_DIRECTORY=./results
.gitignore ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+ MANIFEST
23
+
24
+ # Virtual environments
25
+ .env
26
+ .venv
27
+ env/
28
+ venv/
29
+ ENV/
30
+ env.bak/
31
+ venv.bak/
32
+
33
+ # IDE
34
+ .vscode/
35
+ .idea/
36
+ *.swp
37
+ *.swo
38
+ *~
39
+
40
+ # OS
41
+ .DS_Store
42
+ .DS_Store?
43
+ ._*
44
+ .Spotlight-V100
45
+ .Trashes
46
+ ehthumbs.db
47
+ Thumbs.db
48
+
49
+ # Project specific
50
+ results/
51
+ *.log
52
+ *.pid
53
+
54
+ # UV
55
+ .uv/
README.md CHANGED
@@ -1,12 +1,81 @@
1
  ---
2
- title: Sherlock
3
- emoji: πŸ“‰
4
- colorFrom: yellow
5
- colorTo: green
6
  sdk: gradio
7
- sdk_version: 5.46.0
8
  app_file: app.py
9
  pinned: false
 
 
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Sherlock OSINT Tool
3
+ emoji: πŸ”
4
+ colorFrom: blue
5
+ colorTo: purple
6
  sdk: gradio
7
+ sdk_version: 4.44.0
8
  app_file: app.py
9
  pinned: false
10
+ license: mit
11
+ short_description: Modular OSINT tool for username searching across multiple platforms
12
  ---
13
 
14
+ # πŸ” Sherlock OSINT Tool
15
+
16
+ A powerful, modular OSINT (Open Source Intelligence) tool for username searching across multiple platforms. Built with Python and Gradio for a beautiful web interface.
17
+
18
+ ## ✨ Features
19
+
20
+ - **🌐 Multi-Platform Search**: Search usernames across 400+ websites
21
+ - **🎯 Modular Architecture**: Clean, maintainable code structure
22
+ - **πŸ–₯️ Beautiful Interface**: Modern Gradio-based web interface
23
+ - **⚑ Async Performance**: Fast concurrent searches with throttling
24
+ - **πŸ“Š Detailed Reports**: Export results in JSON, CSV, or HTML formats
25
+ - **πŸ›‘οΈ NSFW Filtering**: Optional adult content website filtering
26
+ - **πŸ“ˆ Real-time Stats**: Live search statistics and progress tracking
27
+
28
+ ## πŸš€ How to Use
29
+
30
+ 1. **Enter Username**: Type the username you want to search for
31
+ 2. **Select Websites** (Optional): Choose specific websites or leave empty for all
32
+ 3. **Configure Options**:
33
+ - Include NSFW sites (if needed)
34
+ - Choose export format (JSON, CSV, HTML)
35
+ 4. **Click Search**: Start the search process
36
+ 5. **View Results**: See claimed accounts, available usernames, and errors
37
+
38
+ ## πŸ”§ Configuration
39
+
40
+ The tool automatically loads website configurations and provides:
41
+ - **400+ websites** for username searching
42
+ - **Rate limiting** to respect server resources
43
+ - **Error handling** for robust operation
44
+ - **Multiple export formats** for analysis
45
+
46
+ ## πŸ”’ Security & Ethics
47
+
48
+ - **⚠️ Disclaimer**: This tool is for educational and research purposes only
49
+ - **πŸ“‹ Terms of Service**: Respect website terms of service and privacy policies
50
+ - **πŸ›‘οΈ Rate Limiting**: Built-in throttling to prevent overwhelming servers
51
+ - **πŸ” Privacy**: No data is stored or transmitted to external services
52
+ - **βš–οΈ Legal Use**: Use responsibly and in compliance with local laws
53
+
54
+ ## πŸ› οΈ Technical Details
55
+
56
+ - **Backend**: Python with async/await for performance
57
+ - **Frontend**: Gradio for beautiful web interface
58
+ - **Architecture**: Modular design with separate components
59
+ - **Dependencies**: Modern Python packages with UV management
60
+ - **Export**: Multiple formats (JSON, CSV, HTML)
61
+
62
+ ## πŸ“Š Example Results
63
+
64
+ The tool provides detailed information about each website:
65
+ - **Status**: Claimed, Available, Error, or Timeout
66
+ - **Response Time**: How fast each site responded
67
+ - **Direct Links**: Clickable URLs to check results
68
+ - **Error Messages**: Detailed error information when available
69
+
70
+ ## 🎯 Use Cases
71
+
72
+ - **Brand Protection**: Check if your brand name is available
73
+ - **Username Research**: Find where usernames are taken
74
+ - **OSINT Investigations**: Gather intelligence on usernames
75
+ - **Social Media Planning**: Plan username strategy across platforms
76
+
77
+ ---
78
+
79
+ **Happy OSINT hunting! πŸ”**
80
+
81
+ *Built with ❀️ using Python, Gradio, and modern web technologies.*
USAGE.md ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # πŸš€ Sherlock OSINT Tool - Quick Start Guide
2
+
3
+ ## πŸ“‹ What's Been Created
4
+
5
+ I've successfully created a **modular OSINT tool** for username searching with the following features:
6
+
7
+ ### πŸ—οΈ Modular Structure
8
+ ```
9
+ sherlock/
10
+ β”œβ”€β”€ src/sherlock/ # Main source code
11
+ β”‚ β”œβ”€β”€ core/ # Core OSINT functionality
12
+ β”‚ β”‚ └── search_engine.py # Async search engine
13
+ β”‚ β”œβ”€β”€ web/ # Web interface
14
+ β”‚ β”‚ └── gradio_interface.py # Gradio web UI
15
+ β”‚ β”œβ”€β”€ config/ # Configuration management
16
+ β”‚ β”‚ β”œβ”€β”€ settings.py # Environment settings
17
+ β”‚ β”‚ └── website_config.py # Website configurations
18
+ β”‚ β”œβ”€β”€ utils/ # Utilities
19
+ β”‚ β”‚ └── output.py # Export functions
20
+ β”‚ β”œβ”€β”€ cli.py # Command line interface
21
+ β”‚ └── main.py # Main entry point
22
+ β”œβ”€β”€ data.json # 414 website configurations
23
+ β”œβ”€β”€ app.py # Web app entry point
24
+ β”œβ”€β”€ pyproject.toml # UV project config
25
+ β”œβ”€β”€ requirements.txt # Dependencies
26
+ β”œβ”€β”€ setup.py # Setup script
27
+ β”œβ”€β”€ test_sherlock.py # Test suite
28
+ └── README.md # Documentation
29
+ ```
30
+
31
+ ### ✨ Key Features
32
+
33
+ 1. **🌐 Multi-Platform Search**: Search across 414+ websites
34
+ 2. **🎯 Modular Architecture**: Clean, maintainable code structure
35
+ 3. **πŸ–₯️ Gradio Web Interface**: Beautiful, responsive web UI
36
+ 4. **⚑ Async Performance**: Fast concurrent searches with throttling
37
+ 5. **πŸ“Š Export Options**: JSON, CSV, HTML report formats
38
+ 6. **πŸ”§ Environment Configuration**: UV-based dependency management
39
+ 7. **πŸ›‘οΈ NSFW Filtering**: Optional adult content filtering
40
+ 8. **πŸ“± CLI Interface**: Command-line usage option
41
+
42
+ ## πŸš€ Quick Start
43
+
44
+ ### 1. Install UV (if not already installed)
45
+ ```bash
46
+ curl -LsSf https://astral.sh/uv/install.sh | sh
47
+ ```
48
+
49
+ ### 2. Set up environment
50
+ ```bash
51
+ cd /home/ubuntu/PROJECT/sherlock
52
+ uv sync
53
+ ```
54
+
55
+ ### 3. Run the web interface
56
+ ```bash
57
+ uv run python app.py
58
+ ```
59
+
60
+ ### 4. Access the tool
61
+ Open your browser and go to: `http://localhost:7860`
62
+
63
+ ## 🎯 Usage Examples
64
+
65
+ ### Web Interface
66
+ 1. Enter username (e.g., "john_doe")
67
+ 2. Select specific websites (optional)
68
+ 3. Choose export format
69
+ 4. Click "Search Username"
70
+ 5. View results and export files
71
+
72
+ ### Command Line
73
+ ```bash
74
+ # Search all websites
75
+ uv run python -m sherlock.cli john_doe
76
+
77
+ # Search specific websites
78
+ uv run python -m sherlock.cli test_user --websites GitHub Twitter Instagram
79
+
80
+ # Include NSFW sites and export HTML
81
+ uv run python -m sherlock.cli sample_user --include-nsfw --export html
82
+
83
+ # List all available websites
84
+ uv run python -m sherlock.cli --list-websites
85
+ ```
86
+
87
+ ## πŸ”§ Configuration
88
+
89
+ Copy `.env.example` to `.env` and customize:
90
+
91
+ ```bash
92
+ cp .env.example .env
93
+ ```
94
+
95
+ Key settings:
96
+ - `MAX_CONCURRENT_REQUESTS=10` - Concurrent request limit
97
+ - `REQUEST_TIMEOUT=10` - Request timeout in seconds
98
+ - `GRADIO_SERVER_PORT=7860` - Web interface port
99
+ - `INCLUDE_NSFW=False` - Include adult content sites
100
+
101
+ ## πŸ“Š Export Formats
102
+
103
+ ### JSON Export
104
+ ```json
105
+ {
106
+ "username": "test_user",
107
+ "timestamp": "2024-01-01T12:00:00",
108
+ "total_websites": 100,
109
+ "claimed_count": 15,
110
+ "available_count": 80,
111
+ "results": [...]
112
+ }
113
+ ```
114
+
115
+ ### HTML Report
116
+ Beautiful HTML report with:
117
+ - Summary statistics
118
+ - Color-coded results
119
+ - Clickable links
120
+ - Responsive design
121
+
122
+ ## πŸ§ͺ Testing
123
+
124
+ Run the test suite:
125
+ ```bash
126
+ uv run python test_sherlock.py
127
+ ```
128
+
129
+ Or simple structure test:
130
+ ```bash
131
+ python3 simple_test.py
132
+ ```
133
+
134
+ ## πŸ› οΈ Development
135
+
136
+ ### Adding New Websites
137
+ Edit `data.json` to add new website configurations:
138
+
139
+ ```json
140
+ {
141
+ "NewWebsite": {
142
+ "errorType": "status_code",
143
+ "url": "https://newwebsite.com/user/{}",
144
+ "urlMain": "https://newwebsite.com/",
145
+ "username_claimed": "test_user"
146
+ }
147
+ }
148
+ ```
149
+
150
+ ### Running Development Server
151
+ ```bash
152
+ # With debug mode
153
+ DEBUG=True uv run python app.py
154
+
155
+ # With custom port
156
+ GRADIO_SERVER_PORT=8080 uv run python app.py
157
+ ```
158
+
159
+ ## πŸ”’ Security & Ethics
160
+
161
+ - **⚠️ Disclaimer**: Educational and research purposes only
162
+ - **πŸ“‹ Terms of Service**: Respect website terms and privacy policies
163
+ - **πŸ›‘οΈ Rate Limiting**: Built-in throttling to prevent server overload
164
+ - **πŸ” Privacy**: No data stored or transmitted externally
165
+ - **βš–οΈ Legal Use**: Use responsibly and legally
166
+
167
+ ## πŸŽ‰ Success!
168
+
169
+ Your modular OSINT tool is ready! The structure is:
170
+
171
+ βœ… **Modular** - Clean separation of concerns
172
+ βœ… **Scalable** - Easy to add new features
173
+ βœ… **User-friendly** - Both web and CLI interfaces
174
+ βœ… **Configurable** - Environment-based settings
175
+ βœ… **Well-documented** - Comprehensive documentation
176
+ βœ… **Tested** - Test suite included
177
+
178
+ **Happy OSINT hunting! πŸ”**
app.py ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Sherlock OSINT Tool - Main Application
3
+ A modular OSINT tool for username searching across multiple platforms.
4
+ """
5
+
6
+ import sys
7
+ import os
8
+ from pathlib import Path
9
+
10
+ # Add src to path for imports
11
+ sys.path.insert(0, str(Path(__file__).parent / "src"))
12
+
13
+ from sherlock.web.gradio_interface import SherlockGradioInterface
14
+ from sherlock.config.settings import settings
15
+
16
+
17
+ def main():
18
+ """Main function to launch the Sherlock OSINT tool."""
19
+ print("πŸ” Starting Sherlock OSINT Tool...")
20
+ print(f"πŸ“Š Configuration:")
21
+ print(f" - Debug Mode: {settings.debug}")
22
+ print(f" - Max Concurrent Requests: {settings.max_concurrent_requests}")
23
+ print(f" - Request Timeout: {settings.request_timeout}s")
24
+ print(f" - Server: {settings.gradio_server_name}:{settings.gradio_server_port}")
25
+ print(f" - Share: {settings.gradio_share}")
26
+ print()
27
+
28
+ try:
29
+ # Create and launch interface
30
+ interface = SherlockGradioInterface()
31
+
32
+ # For Hugging Face Spaces, use default settings
33
+ interface.launch(
34
+ server_name="0.0.0.0",
35
+ server_port=7860,
36
+ share=False,
37
+ debug=False
38
+ )
39
+
40
+ except KeyboardInterrupt:
41
+ print("\nπŸ‘‹ Sherlock OSINT Tool stopped by user")
42
+ except Exception as e:
43
+ print(f"❌ Error starting Sherlock OSINT Tool: {e}")
44
+ sys.exit(1)
45
+
46
+
47
+ if __name__ == "__main__":
48
+ main()
data.json ADDED
@@ -0,0 +1,2844 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "data.schema.json",
3
+ "1337x": {
4
+ "errorMsg": [
5
+ "<title>Error something went wrong.</title>",
6
+ "<head><title>404 Not Found</title></head>"
7
+ ],
8
+ "errorType": "message",
9
+ "regexCheck": "^[A-Za-z0-9]{4,12}$",
10
+ "url": "https://www.1337x.to/user/{}/",
11
+ "urlMain": "https://www.1337x.to/",
12
+ "username_claimed": "FitGirl"
13
+ },
14
+ "2Dimensions": {
15
+ "errorType": "status_code",
16
+ "url": "https://2Dimensions.com/a/{}",
17
+ "urlMain": "https://2Dimensions.com/",
18
+ "username_claimed": "blue"
19
+ },
20
+ "7Cups": {
21
+ "errorType": "status_code",
22
+ "url": "https://www.7cups.com/@{}",
23
+ "urlMain": "https://www.7cups.com/",
24
+ "username_claimed": "blue"
25
+ },
26
+ "9GAG": {
27
+ "errorType": "status_code",
28
+ "url": "https://www.9gag.com/u/{}",
29
+ "urlMain": "https://www.9gag.com/",
30
+ "username_claimed": "blue"
31
+ },
32
+ "APClips": {
33
+ "errorMsg": "Amateur Porn Content Creators",
34
+ "errorType": "message",
35
+ "isNSFW": true,
36
+ "url": "https://apclips.com/{}",
37
+ "urlMain": "https://apclips.com/",
38
+ "username_claimed": "onlybbyraq"
39
+ },
40
+ "About.me": {
41
+ "errorType": "status_code",
42
+ "url": "https://about.me/{}",
43
+ "urlMain": "https://about.me/",
44
+ "username_claimed": "blue"
45
+ },
46
+ "Academia.edu": {
47
+ "errorType": "status_code",
48
+ "regexCheck": "^[^.]*$",
49
+ "url": "https://independent.academia.edu/{}",
50
+ "urlMain": "https://www.academia.edu/",
51
+ "username_claimed": "blue"
52
+ },
53
+ "AdmireMe.Vip": {
54
+ "errorMsg": "Page Not Found",
55
+ "errorType": "message",
56
+ "isNSFW": true,
57
+ "url": "https://admireme.vip/{}",
58
+ "urlMain": "https://admireme.vip/",
59
+ "username_claimed": "DemiDevil"
60
+ },
61
+ "Airbit": {
62
+ "errorType": "status_code",
63
+ "url": "https://airbit.com/{}",
64
+ "urlMain": "https://airbit.com/",
65
+ "username_claimed": "airbit"
66
+ },
67
+ "Airliners": {
68
+ "errorType": "status_code",
69
+ "url": "https://www.airliners.net/user/{}/profile/photos",
70
+ "urlMain": "https://www.airliners.net/",
71
+ "username_claimed": "yushinlin"
72
+ },
73
+ "All Things Worn": {
74
+ "errorMsg": "Sell Used Panties",
75
+ "errorType": "message",
76
+ "isNSFW": true,
77
+ "url": "https://www.allthingsworn.com/profile/{}",
78
+ "urlMain": "https://www.allthingsworn.com",
79
+ "username_claimed": "pink"
80
+ },
81
+ "AllMyLinks": {
82
+ "errorMsg": "Not Found",
83
+ "errorType": "message",
84
+ "regexCheck": "^[a-z0-9][a-z0-9-]{2,32}$",
85
+ "url": "https://allmylinks.com/{}",
86
+ "urlMain": "https://allmylinks.com/",
87
+ "username_claimed": "blue"
88
+ },
89
+ "AniWorld": {
90
+ "errorMsg": "Dieses Profil ist nicht verf\u00fcgbar",
91
+ "errorType": "message",
92
+ "url": "https://aniworld.to/user/profil/{}",
93
+ "urlMain": "https://aniworld.to/",
94
+ "username_claimed": "blue"
95
+ },
96
+ "Anilist": {
97
+ "errorType": "status_code",
98
+ "regexCheck": "^[A-Za-z0-9]{2,20}$",
99
+ "request_method": "POST",
100
+ "request_payload": {
101
+ "query": "query($name:String){User(name:$name){id}}",
102
+ "variables": {
103
+ "name": "{}"
104
+ }
105
+ },
106
+ "url": "https://anilist.co/user/{}/",
107
+ "urlMain": "https://anilist.co/",
108
+ "urlProbe": "https://graphql.anilist.co/",
109
+ "username_claimed": "Josh"
110
+ },
111
+ "Apple Developer": {
112
+ "errorType": "status_code",
113
+ "url": "https://developer.apple.com/forums/profile/{}",
114
+ "urlMain": "https://developer.apple.com",
115
+ "username_claimed": "lio24d"
116
+ },
117
+ "Apple Discussions": {
118
+ "errorMsg": "The page you tried was not found. You may have used an outdated link or may have typed the address (URL) incorrectly.",
119
+ "errorType": "message",
120
+ "url": "https://discussions.apple.com/profile/{}",
121
+ "urlMain": "https://discussions.apple.com",
122
+ "username_claimed": "jason"
123
+ },
124
+ "Archive of Our Own": {
125
+ "errorType": "status_code",
126
+ "regexCheck": "^[^.]*?$",
127
+ "url": "https://archiveofourown.org/users/{}",
128
+ "urlMain": "https://archiveofourown.org/",
129
+ "username_claimed": "test"
130
+ },
131
+ "Archive.org": {
132
+ "__comment__": "'The resource could not be found' relates to archive downtime",
133
+ "errorMsg": [
134
+ "could not fetch an account with user item identifier",
135
+ "The resource could not be found",
136
+ "Internet Archive services are temporarily offline"
137
+ ],
138
+ "errorType": "message",
139
+ "url": "https://archive.org/details/@{}",
140
+ "urlMain": "https://archive.org",
141
+ "urlProbe": "https://archive.org/details/@{}?noscript=true",
142
+ "username_claimed": "blue"
143
+ },
144
+ "ArtStation": {
145
+ "errorType": "status_code",
146
+ "url": "https://www.artstation.com/{}",
147
+ "urlMain": "https://www.artstation.com/",
148
+ "username_claimed": "Blue"
149
+ },
150
+ "Asciinema": {
151
+ "errorType": "status_code",
152
+ "url": "https://asciinema.org/~{}",
153
+ "urlMain": "https://asciinema.org",
154
+ "username_claimed": "red"
155
+ },
156
+ "Ask Fedora": {
157
+ "errorType": "status_code",
158
+ "url": "https://ask.fedoraproject.org/u/{}",
159
+ "urlMain": "https://ask.fedoraproject.org/",
160
+ "username_claimed": "red"
161
+ },
162
+ "Atcoder": {
163
+ "errorType": "status_code",
164
+ "url": "https://atcoder.jp/users/{}",
165
+ "urlMain": "https://atcoder.jp/",
166
+ "username_claimed": "ksun48"
167
+ },
168
+ "Audiojungle": {
169
+ "errorType": "status_code",
170
+ "regexCheck": "^[a-zA-Z0-9_]+$",
171
+ "url": "https://audiojungle.net/user/{}",
172
+ "urlMain": "https://audiojungle.net/",
173
+ "username_claimed": "blue"
174
+ },
175
+ "Autofrage": {
176
+ "errorType": "status_code",
177
+ "url": "https://www.autofrage.net/nutzer/{}",
178
+ "urlMain": "https://www.autofrage.net/",
179
+ "username_claimed": "autofrage"
180
+ },
181
+ "Avizo": {
182
+ "errorType": "response_url",
183
+ "errorUrl": "https://www.avizo.cz/",
184
+ "url": "https://www.avizo.cz/{}/",
185
+ "urlMain": "https://www.avizo.cz/",
186
+ "username_claimed": "blue"
187
+ },
188
+ "BOOTH": {
189
+ "errorType": "response_url",
190
+ "errorUrl": "https://booth.pm/",
191
+ "regexCheck": "^[\\w@-]+?$",
192
+ "url": "https://{}.booth.pm/",
193
+ "urlMain": "https://booth.pm/",
194
+ "username_claimed": "blue"
195
+ },
196
+ "Bandcamp": {
197
+ "errorType": "status_code",
198
+ "url": "https://www.bandcamp.com/{}",
199
+ "urlMain": "https://www.bandcamp.com/",
200
+ "username_claimed": "blue"
201
+ },
202
+ "Bazar.cz": {
203
+ "errorType": "response_url",
204
+ "errorUrl": "https://www.bazar.cz/error404.aspx",
205
+ "url": "https://www.bazar.cz/{}/",
206
+ "urlMain": "https://www.bazar.cz/",
207
+ "username_claimed": "pianina"
208
+ },
209
+ "Behance": {
210
+ "errorType": "status_code",
211
+ "url": "https://www.behance.net/{}",
212
+ "urlMain": "https://www.behance.net/",
213
+ "username_claimed": "blue"
214
+ },
215
+ "Bezuzyteczna": {
216
+ "errorType": "status_code",
217
+ "url": "https://bezuzyteczna.pl/uzytkownicy/{}",
218
+ "urlMain": "https://bezuzyteczna.pl",
219
+ "username_claimed": "Jackson"
220
+ },
221
+ "BiggerPockets": {
222
+ "errorType": "status_code",
223
+ "url": "https://www.biggerpockets.com/users/{}",
224
+ "urlMain": "https://www.biggerpockets.com/",
225
+ "username_claimed": "blue"
226
+ },
227
+ "BioHacking": {
228
+ "errorType": "status_code",
229
+ "url": "https://forum.dangerousthings.com/u/{}",
230
+ "urlMain": "https://forum.dangerousthings.com/",
231
+ "username_claimed": "blue"
232
+ },
233
+ "BitBucket": {
234
+ "errorType": "status_code",
235
+ "regexCheck": "^[a-zA-Z0-9-_]{1,30}$",
236
+ "url": "https://bitbucket.org/{}/",
237
+ "urlMain": "https://bitbucket.org/",
238
+ "username_claimed": "white"
239
+ },
240
+ "Bitwarden Forum": {
241
+ "errorType": "status_code",
242
+ "regexCheck": "^(?![.-])[a-zA-Z0-9_.-]{3,20}$",
243
+ "url": "https://community.bitwarden.com/u/{}/summary",
244
+ "urlMain": "https://bitwarden.com/",
245
+ "username_claimed": "blue"
246
+ },
247
+ "Blipfoto": {
248
+ "errorType": "status_code",
249
+ "url": "https://www.blipfoto.com/{}",
250
+ "urlMain": "https://www.blipfoto.com/",
251
+ "username_claimed": "blue"
252
+ },
253
+ "Blitz Tactics": {
254
+ "errorType": "status_code",
255
+ "url": "https://blitztactics.com/{}",
256
+ "urlMain": "https://blitztactics.com/",
257
+ "username_claimed": "Lance5500"
258
+ },
259
+ "Blogger": {
260
+ "errorType": "status_code",
261
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
262
+ "url": "https://{}.blogspot.com",
263
+ "urlMain": "https://www.blogger.com/",
264
+ "username_claimed": "blue"
265
+ },
266
+ "Bluesky": {
267
+ "errorType": "status_code",
268
+ "url": "https://bsky.app/profile/{}.bsky.social",
269
+ "urlProbe": "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor={}.bsky.social",
270
+ "urlMain": "https://bsky.app/",
271
+ "username_claimed": "mcuban"
272
+ },
273
+ "BoardGameGeek": {
274
+ "errorType": "message",
275
+ "regexCheck": "^[a-zA-Z0-9_]*$",
276
+ "errorMsg": "User not found",
277
+ "url": "https://boardgamegeek.com/user/{}",
278
+ "urlMain": "https://boardgamegeek.com",
279
+ "username_claimed": "blue"
280
+ },
281
+ "BongaCams": {
282
+ "errorType": "status_code",
283
+ "isNSFW": true,
284
+ "url": "https://pt.bongacams.com/profile/{}",
285
+ "urlMain": "https://pt.bongacams.com",
286
+ "username_claimed": "asuna-black"
287
+ },
288
+ "Bookcrossing": {
289
+ "errorType": "status_code",
290
+ "url": "https://www.bookcrossing.com/mybookshelf/{}/",
291
+ "urlMain": "https://www.bookcrossing.com/",
292
+ "username_claimed": "blue"
293
+ },
294
+ "BraveCommunity": {
295
+ "errorType": "status_code",
296
+ "url": "https://community.brave.com/u/{}/",
297
+ "urlMain": "https://community.brave.com/",
298
+ "username_claimed": "blue"
299
+ },
300
+ "BugCrowd": {
301
+ "errorType": "status_code",
302
+ "url": "https://bugcrowd.com/{}",
303
+ "urlMain": "https://bugcrowd.com/",
304
+ "username_claimed": "ppfeister"
305
+ },
306
+ "BuyMeACoffee": {
307
+ "errorType": "status_code",
308
+ "regexCheck": "[a-zA-Z0-9]{3,15}",
309
+ "url": "https://buymeacoff.ee/{}",
310
+ "urlMain": "https://www.buymeacoffee.com/",
311
+ "urlProbe": "https://www.buymeacoffee.com/{}",
312
+ "username_claimed": "red"
313
+ },
314
+ "BuzzFeed": {
315
+ "errorType": "status_code",
316
+ "url": "https://buzzfeed.com/{}",
317
+ "urlMain": "https://buzzfeed.com/",
318
+ "username_claimed": "blue"
319
+ },
320
+ "CGTrader": {
321
+ "errorType": "status_code",
322
+ "regexCheck": "^[^.]*?$",
323
+ "url": "https://www.cgtrader.com/{}",
324
+ "urlMain": "https://www.cgtrader.com",
325
+ "username_claimed": "blue"
326
+ },
327
+ "CNET": {
328
+ "errorType": "status_code",
329
+ "regexCheck": "^[a-z].*$",
330
+ "url": "https://www.cnet.com/profiles/{}/",
331
+ "urlMain": "https://www.cnet.com/",
332
+ "username_claimed": "melliott"
333
+ },
334
+ "CSSBattle": {
335
+ "errorType": "status_code",
336
+ "url": "https://cssbattle.dev/player/{}",
337
+ "urlMain": "https://cssbattle.dev",
338
+ "username_claimed": "beo"
339
+ },
340
+ "CTAN": {
341
+ "errorType": "status_code",
342
+ "url": "https://ctan.org/author/{}",
343
+ "urlMain": "https://ctan.org/",
344
+ "username_claimed": "briggs"
345
+ },
346
+ "Caddy Community": {
347
+ "errorType": "status_code",
348
+ "url": "https://caddy.community/u/{}/summary",
349
+ "urlMain": "https://caddy.community/",
350
+ "username_claimed": "taako_magnusen"
351
+ },
352
+ "Car Talk Community": {
353
+ "errorType": "status_code",
354
+ "url": "https://community.cartalk.com/u/{}/summary",
355
+ "urlMain": "https://community.cartalk.com/",
356
+ "username_claimed": "always_fixing"
357
+ },
358
+ "Carbonmade": {
359
+ "errorType": "response_url",
360
+ "errorUrl": "https://carbonmade.com/fourohfour?domain={}.carbonmade.com",
361
+ "regexCheck": "^[\\w@-]+?$",
362
+ "url": "https://{}.carbonmade.com",
363
+ "urlMain": "https://carbonmade.com/",
364
+ "username_claimed": "jenny"
365
+ },
366
+ "Career.habr": {
367
+ "errorMsg": "<h1>\u041e\u0448\u0438\u0431\u043a\u0430 404</h1>",
368
+ "errorType": "message",
369
+ "url": "https://career.habr.com/{}",
370
+ "urlMain": "https://career.habr.com/",
371
+ "username_claimed": "blue"
372
+ },
373
+ "CashApp": {
374
+ "errorType": "status_code",
375
+ "url": "https://cash.app/${}",
376
+ "urlMain": "https://cash.app",
377
+ "username_claimed": "hotdiggitydog"
378
+ },
379
+ "Championat": {
380
+ "errorType": "status_code",
381
+ "url": "https://www.championat.com/user/{}",
382
+ "urlMain": "https://www.championat.com/",
383
+ "username_claimed": "blue"
384
+ },
385
+ "Chaos": {
386
+ "errorType": "status_code",
387
+ "url": "https://chaos.social/@{}",
388
+ "urlMain": "https://chaos.social/",
389
+ "username_claimed": "ordnung"
390
+ },
391
+ "Chatujme.cz": {
392
+ "errorMsg": "Neexistujic\u00ed profil",
393
+ "errorType": "message",
394
+ "regexCheck": "^[a-zA-Z][a-zA-Z1-9_-]*$",
395
+ "url": "https://profil.chatujme.cz/{}",
396
+ "urlMain": "https://chatujme.cz/",
397
+ "username_claimed": "david"
398
+ },
399
+ "ChaturBate": {
400
+ "errorType": "status_code",
401
+ "isNSFW": true,
402
+ "url": "https://chaturbate.com/{}",
403
+ "urlMain": "https://chaturbate.com",
404
+ "username_claimed": "cute18cute"
405
+ },
406
+ "Chess": {
407
+ "errorMsg": "Username is valid",
408
+ "errorType": "message",
409
+ "regexCheck": "^[a-z1-9]{3,25}$",
410
+ "url": "https://www.chess.com/member/{}",
411
+ "urlMain": "https://www.chess.com/",
412
+ "urlProbe": "https://www.chess.com/callback/user/valid?username={}",
413
+ "username_claimed": "blue"
414
+ },
415
+ "Choice Community": {
416
+ "errorType": "status_code",
417
+ "url": "https://choice.community/u/{}/summary",
418
+ "urlMain": "https://choice.community/",
419
+ "username_claimed": "gordon"
420
+ },
421
+ "Clapper": {
422
+ "errorType": "status_code",
423
+ "url": "https://clapperapp.com/{}",
424
+ "urlMain": "https://clapperapp.com/",
425
+ "username_claimed": "blue"
426
+ },
427
+ "CloudflareCommunity": {
428
+ "errorType": "status_code",
429
+ "url": "https://community.cloudflare.com/u/{}",
430
+ "urlMain": "https://community.cloudflare.com/",
431
+ "username_claimed": "blue"
432
+ },
433
+ "Clozemaster": {
434
+ "errorMsg": "Oh no! Player not found.",
435
+ "errorType": "message",
436
+ "url": "https://www.clozemaster.com/players/{}",
437
+ "urlMain": "https://www.clozemaster.com",
438
+ "username_claimed": "green"
439
+ },
440
+ "Clubhouse": {
441
+ "errorType": "status_code",
442
+ "url": "https://www.clubhouse.com/@{}",
443
+ "urlMain": "https://www.clubhouse.com",
444
+ "username_claimed": "waniathar"
445
+ },
446
+ "Code Snippet Wiki": {
447
+ "errorMsg": "This user has not filled out their profile page yet",
448
+ "errorType": "message",
449
+ "url": "https://codesnippets.fandom.com/wiki/User:{}",
450
+ "urlMain": "https://codesnippets.fandom.com",
451
+ "username_claimed": "bob"
452
+ },
453
+ "Codeberg": {
454
+ "errorType": "status_code",
455
+ "url": "https://codeberg.org/{}",
456
+ "urlMain": "https://codeberg.org/",
457
+ "username_claimed": "blue"
458
+ },
459
+ "Codecademy": {
460
+ "errorMsg": "This profile could not be found",
461
+ "errorType": "message",
462
+ "url": "https://www.codecademy.com/profiles/{}",
463
+ "urlMain": "https://www.codecademy.com/",
464
+ "username_claimed": "blue"
465
+ },
466
+ "Codechef": {
467
+ "errorType": "response_url",
468
+ "errorUrl": "https://www.codechef.com/",
469
+ "url": "https://www.codechef.com/users/{}",
470
+ "urlMain": "https://www.codechef.com/",
471
+ "username_claimed": "blue"
472
+ },
473
+ "Codeforces": {
474
+ "errorType": "status_code",
475
+ "url": "https://codeforces.com/profile/{}",
476
+ "urlMain": "https://codeforces.com/",
477
+ "urlProbe": "https://codeforces.com/api/user.info?handles={}",
478
+ "username_claimed": "tourist"
479
+ },
480
+ "Codepen": {
481
+ "errorType": "status_code",
482
+ "url": "https://codepen.io/{}",
483
+ "urlMain": "https://codepen.io/",
484
+ "username_claimed": "blue"
485
+ },
486
+ "Coders Rank": {
487
+ "errorMsg": "not a registered member",
488
+ "errorType": "message",
489
+ "regexCheck": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$",
490
+ "url": "https://profile.codersrank.io/user/{}/",
491
+ "urlMain": "https://codersrank.io/",
492
+ "username_claimed": "rootkit7628"
493
+ },
494
+ "Coderwall": {
495
+ "errorType": "status_code",
496
+ "url": "https://coderwall.com/{}",
497
+ "urlMain": "https://coderwall.com",
498
+ "username_claimed": "hacker"
499
+ },
500
+ "Codewars": {
501
+ "errorType": "status_code",
502
+ "url": "https://www.codewars.com/users/{}",
503
+ "urlMain": "https://www.codewars.com",
504
+ "username_claimed": "example"
505
+ },
506
+ "Coinvote": {
507
+ "errorType": "status_code",
508
+ "url": "https://coinvote.cc/profile/{}",
509
+ "urlMain": "https://coinvote.cc/",
510
+ "username_claimed": "blue"
511
+ },
512
+ "ColourLovers": {
513
+ "errorType": "status_code",
514
+ "url": "https://www.colourlovers.com/lover/{}",
515
+ "urlMain": "https://www.colourlovers.com/",
516
+ "username_claimed": "blue"
517
+ },
518
+ "Contently": {
519
+ "errorType": "response_url",
520
+ "errorUrl": "https://contently.com",
521
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
522
+ "url": "https://{}.contently.com/",
523
+ "urlMain": "https://contently.com/",
524
+ "username_claimed": "jordanteicher"
525
+ },
526
+ "Coroflot": {
527
+ "errorType": "status_code",
528
+ "url": "https://www.coroflot.com/{}",
529
+ "urlMain": "https://coroflot.com/",
530
+ "username_claimed": "blue"
531
+ },
532
+ "Cracked": {
533
+ "errorType": "response_url",
534
+ "errorUrl": "https://www.cracked.com/",
535
+ "url": "https://www.cracked.com/members/{}/",
536
+ "urlMain": "https://www.cracked.com/",
537
+ "username_claimed": "blue"
538
+ },
539
+ "Crevado": {
540
+ "errorType": "status_code",
541
+ "regexCheck": "^[\\w@-]+?$",
542
+ "url": "https://{}.crevado.com",
543
+ "urlMain": "https://crevado.com/",
544
+ "username_claimed": "blue"
545
+ },
546
+ "Crowdin": {
547
+ "errorType": "status_code",
548
+ "regexCheck": "^[a-zA-Z0-9._-]{2,255}$",
549
+ "url": "https://crowdin.com/profile/{}",
550
+ "urlMain": "https://crowdin.com/",
551
+ "username_claimed": "blue"
552
+ },
553
+ "Cryptomator Forum": {
554
+ "errorType": "status_code",
555
+ "url": "https://community.cryptomator.org/u/{}",
556
+ "urlMain": "https://community.cryptomator.org/",
557
+ "username_claimed": "michael"
558
+ },
559
+ "Cults3D": {
560
+ "errorMsg": "Oh dear, this page is not working!",
561
+ "errorType": "message",
562
+ "url": "https://cults3d.com/en/users/{}/creations",
563
+ "urlMain": "https://cults3d.com/en",
564
+ "username_claimed": "brown"
565
+ },
566
+ "CyberDefenders": {
567
+ "errorMsg": "<title>Blue Team Training for SOC analysts and DFIR - CyberDefenders</title>",
568
+ "errorType": "message",
569
+ "regexCheck": "^[^\\/:*?\"<>|@]{3,50}$",
570
+ "request_method": "GET",
571
+ "url": "https://cyberdefenders.org/p/{}",
572
+ "urlMain": "https://cyberdefenders.org/",
573
+ "username_claimed": "mlohn"
574
+ },
575
+ "DEV Community": {
576
+ "errorType": "status_code",
577
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
578
+ "url": "https://dev.to/{}",
579
+ "urlMain": "https://dev.to/",
580
+ "username_claimed": "blue"
581
+ },
582
+ "DMOJ": {
583
+ "errorMsg": "No such user",
584
+ "errorType": "message",
585
+ "url": "https://dmoj.ca/user/{}",
586
+ "urlMain": "https://dmoj.ca/",
587
+ "username_claimed": "junferno"
588
+ },
589
+ "DailyMotion": {
590
+ "errorType": "status_code",
591
+ "url": "https://www.dailymotion.com/{}",
592
+ "urlMain": "https://www.dailymotion.com/",
593
+ "username_claimed": "blue"
594
+ },
595
+ "Dealabs": {
596
+ "errorMsg": "La page que vous essayez",
597
+ "errorType": "message",
598
+ "regexCheck": "[a-z0-9]{4,16}",
599
+ "url": "https://www.dealabs.com/profile/{}",
600
+ "urlMain": "https://www.dealabs.com/",
601
+ "username_claimed": "blue"
602
+ },
603
+ "DeviantART": {
604
+ "errorType": "status_code",
605
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
606
+ "url": "https://{}.deviantart.com",
607
+ "urlMain": "https://deviantart.com",
608
+ "username_claimed": "blue"
609
+ },
610
+ "DigitalSpy": {
611
+ "errorMsg": "The page you were looking for could not be found.",
612
+ "errorType": "message",
613
+ "url": "https://forums.digitalspy.com/profile/{}",
614
+ "urlMain": "https://forums.digitalspy.com/",
615
+ "username_claimed": "blue",
616
+ "regexCheck": "^\\w{3,20}$"
617
+ },
618
+ "Discogs": {
619
+ "errorType": "status_code",
620
+ "url": "https://www.discogs.com/user/{}",
621
+ "urlMain": "https://www.discogs.com/",
622
+ "username_claimed": "blue"
623
+ },
624
+ "Discord": {
625
+ "errorType": "message",
626
+ "url": "https://discord.com",
627
+ "urlMain": "https://discord.com/",
628
+ "urlProbe": "https://discord.com/api/v9/unique-username/username-attempt-unauthed",
629
+ "errorMsg": [
630
+ "{\"taken\":false}",
631
+ "The resource is being rate limited"
632
+ ],
633
+ "request_method": "POST",
634
+ "request_payload": {
635
+ "username": "{}"
636
+ },
637
+ "headers": {
638
+ "Content-Type": "application/json"
639
+ },
640
+ "username_claimed": "blue"
641
+ },
642
+ "Discuss.Elastic.co": {
643
+ "errorType": "status_code",
644
+ "url": "https://discuss.elastic.co/u/{}",
645
+ "urlMain": "https://discuss.elastic.co/",
646
+ "username_claimed": "blue"
647
+ },
648
+ "Disqus": {
649
+ "errorType": "status_code",
650
+ "url": "https://disqus.com/{}",
651
+ "urlMain": "https://disqus.com/",
652
+ "username_claimed": "blue"
653
+ },
654
+ "Docker Hub": {
655
+ "errorType": "status_code",
656
+ "url": "https://hub.docker.com/u/{}/",
657
+ "urlMain": "https://hub.docker.com/",
658
+ "urlProbe": "https://hub.docker.com/v2/users/{}/",
659
+ "username_claimed": "blue"
660
+ },
661
+ "Dribbble": {
662
+ "errorMsg": "Whoops, that page is gone.",
663
+ "errorType": "message",
664
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
665
+ "url": "https://dribbble.com/{}",
666
+ "urlMain": "https://dribbble.com/",
667
+ "username_claimed": "blue"
668
+ },
669
+ "Duolingo": {
670
+ "errorMsg": "{\"users\":[]}",
671
+ "errorType": "message",
672
+
673
+ "url": "https://www.duolingo.com/profile/{}",
674
+ "urlMain": "https://duolingo.com/",
675
+ "urlProbe": "https://www.duolingo.com/2017-06-30/users?username={}",
676
+ "username_claimed": "blue"
677
+ },
678
+ "Eintracht Frankfurt Forum": {
679
+ "errorType": "status_code",
680
+ "regexCheck": "^[^.]*?$",
681
+ "url": "https://community.eintracht.de/fans/{}",
682
+ "urlMain": "https://community.eintracht.de/",
683
+ "username_claimed": "mmammu"
684
+ },
685
+ "Empretienda AR": {
686
+ "__comment__": "Note that Error Connecting responses may be indicative of unclaimed handles",
687
+ "errorType": "status_code",
688
+ "url": "https://{}.empretienda.com.ar",
689
+ "urlMain": "https://empretienda.com",
690
+ "username_claimed": "camalote"
691
+ },
692
+ "Envato Forum": {
693
+ "errorType": "status_code",
694
+ "url": "https://forums.envato.com/u/{}",
695
+ "urlMain": "https://forums.envato.com/",
696
+ "username_claimed": "enabled"
697
+ },
698
+ "Erome": {
699
+ "errorType": "status_code",
700
+ "isNSFW": true,
701
+ "url": "https://www.erome.com/{}",
702
+ "urlMain": "https://www.erome.com/",
703
+ "username_claimed": "bob"
704
+ },
705
+ "Exposure": {
706
+ "errorType": "status_code",
707
+ "regexCheck": "^[a-zA-Z0-9-]{1,63}$",
708
+ "url": "https://{}.exposure.co/",
709
+ "urlMain": "https://exposure.co/",
710
+ "username_claimed": "jonasjacobsson"
711
+ },
712
+ "exophase": {
713
+ "errorType": "status_code",
714
+ "url": "https://www.exophase.com/user/{}/",
715
+ "urlMain": "https://www.exophase.com/",
716
+ "username_claimed": "blue"
717
+ },
718
+ "EyeEm": {
719
+ "errorType": "status_code",
720
+ "url": "https://www.eyeem.com/u/{}",
721
+ "urlMain": "https://www.eyeem.com/",
722
+ "username_claimed": "blue"
723
+ },
724
+ "F3.cool": {
725
+ "errorType": "status_code",
726
+ "url": "https://f3.cool/{}/",
727
+ "urlMain": "https://f3.cool/",
728
+ "username_claimed": "blue"
729
+ },
730
+ "Fameswap": {
731
+ "errorType": "status_code",
732
+ "url": "https://fameswap.com/user/{}",
733
+ "urlMain": "https://fameswap.com/",
734
+ "username_claimed": "fameswap"
735
+ },
736
+ "Fandom": {
737
+ "errorType": "status_code",
738
+ "url": "https://www.fandom.com/u/{}",
739
+ "urlMain": "https://www.fandom.com/",
740
+ "username_claimed": "Jungypoo"
741
+ },
742
+ "Fanpop": {
743
+ "errorType": "response_url",
744
+ "errorUrl": "https://www.fanpop.com/",
745
+ "url": "https://www.fanpop.com/fans/{}",
746
+ "urlMain": "https://www.fanpop.com/",
747
+ "username_claimed": "blue"
748
+ },
749
+ "Finanzfrage": {
750
+ "errorType": "status_code",
751
+ "url": "https://www.finanzfrage.net/nutzer/{}",
752
+ "urlMain": "https://www.finanzfrage.net/",
753
+ "username_claimed": "finanzfrage"
754
+ },
755
+ "Flickr": {
756
+ "errorType": "status_code",
757
+ "url": "https://www.flickr.com/people/{}",
758
+ "urlMain": "https://www.flickr.com/",
759
+ "username_claimed": "blue"
760
+ },
761
+ "Flightradar24": {
762
+ "errorType": "status_code",
763
+ "regexCheck": "^[a-zA-Z0-9_]{3,20}$",
764
+ "url": "https://my.flightradar24.com/{}",
765
+ "urlMain": "https://www.flightradar24.com/",
766
+ "username_claimed": "jebbrooks"
767
+ },
768
+ "Flipboard": {
769
+ "errorType": "status_code",
770
+ "regexCheck": "^([a-zA-Z0-9_]){1,15}$",
771
+ "url": "https://flipboard.com/@{}",
772
+ "urlMain": "https://flipboard.com/",
773
+ "username_claimed": "blue"
774
+ },
775
+ "Football": {
776
+ "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d",
777
+ "errorType": "message",
778
+ "url": "https://www.rusfootball.info/user/{}/",
779
+ "urlMain": "https://www.rusfootball.info/",
780
+ "username_claimed": "solo87"
781
+ },
782
+ "FortniteTracker": {
783
+ "errorType": "status_code",
784
+ "url": "https://fortnitetracker.com/profile/all/{}",
785
+ "urlMain": "https://fortnitetracker.com/challenges",
786
+ "username_claimed": "blue"
787
+ },
788
+ "Forum Ophilia": {
789
+ "errorMsg": "that user does not exist",
790
+ "errorType": "message",
791
+ "isNSFW": true,
792
+ "url": "https://www.forumophilia.com/profile.php?mode=viewprofile&u={}",
793
+ "urlMain": "https://www.forumophilia.com/",
794
+ "username_claimed": "bob"
795
+ },
796
+ "Fosstodon": {
797
+ "errorType": "status_code",
798
+ "regexCheck": "^[a-zA-Z0-9_]{1,30}$",
799
+ "url": "https://fosstodon.org/@{}",
800
+ "urlMain": "https://fosstodon.org/",
801
+ "username_claimed": "blue"
802
+ },
803
+ "Framapiaf": {
804
+ "errorType": "status_code",
805
+ "regexCheck": "^[a-zA-Z0-9_]{1,30}$",
806
+ "url": "https://framapiaf.org/@{}",
807
+ "urlMain": "https://framapiaf.org",
808
+ "username_claimed": "pylapp"
809
+ },
810
+ "Freelance.habr": {
811
+ "errorMsg": "<div class=\"icon_user_locked\"></div>",
812
+ "errorType": "message",
813
+ "regexCheck": "^((?!\\.).)*$",
814
+ "url": "https://freelance.habr.com/freelancers/{}",
815
+ "urlMain": "https://freelance.habr.com/",
816
+ "username_claimed": "adam"
817
+ },
818
+ "Freelancer": {
819
+ "errorMsg": "\"users\":{}",
820
+ "errorType": "message",
821
+ "url": "https://www.freelancer.com/u/{}",
822
+ "urlMain": "https://www.freelancer.com/",
823
+ "urlProbe": "https://www.freelancer.com/api/users/0.1/users?usernames%5B%5D={}&compact=true",
824
+ "username_claimed": "red0xff"
825
+ },
826
+ "Freesound": {
827
+ "errorType": "status_code",
828
+ "url": "https://freesound.org/people/{}/",
829
+ "urlMain": "https://freesound.org/",
830
+ "username_claimed": "blue"
831
+ },
832
+ "GNOME VCS": {
833
+ "errorType": "response_url",
834
+ "errorUrl": "https://gitlab.gnome.org/{}",
835
+ "regexCheck": "^(?!-)[a-zA-Z0-9_.-]{2,255}(?<!\\.)$",
836
+ "url": "https://gitlab.gnome.org/{}",
837
+ "urlMain": "https://gitlab.gnome.org/",
838
+ "username_claimed": "adam"
839
+ },
840
+ "GaiaOnline": {
841
+ "errorMsg": "No user ID specified or user does not exist",
842
+ "errorType": "message",
843
+ "url": "https://www.gaiaonline.com/profiles/{}",
844
+ "urlMain": "https://www.gaiaonline.com/",
845
+ "username_claimed": "adam"
846
+ },
847
+ "Gamespot": {
848
+ "errorType": "status_code",
849
+ "url": "https://www.gamespot.com/profile/{}/",
850
+ "urlMain": "https://www.gamespot.com/",
851
+ "username_claimed": "blue"
852
+ },
853
+ "GeeksforGeeks": {
854
+ "errorType": "status_code",
855
+ "url": "https://auth.geeksforgeeks.org/user/{}",
856
+ "urlMain": "https://www.geeksforgeeks.org/",
857
+ "username_claimed": "adam"
858
+ },
859
+ "Genius (Artists)": {
860
+ "errorType": "status_code",
861
+ "regexCheck": "^[a-zA-Z0-9]{5,50}$",
862
+ "url": "https://genius.com/artists/{}",
863
+ "urlMain": "https://genius.com/",
864
+ "username_claimed": "genius"
865
+ },
866
+ "Genius (Users)": {
867
+ "errorType": "status_code",
868
+ "regexCheck": "^[a-zA-Z0-9]*?$",
869
+ "url": "https://genius.com/{}",
870
+ "urlMain": "https://genius.com/",
871
+ "username_claimed": "genius"
872
+ },
873
+ "Gesundheitsfrage": {
874
+ "errorType": "status_code",
875
+ "url": "https://www.gesundheitsfrage.net/nutzer/{}",
876
+ "urlMain": "https://www.gesundheitsfrage.net/",
877
+ "username_claimed": "gutefrage"
878
+ },
879
+ "GetMyUni": {
880
+ "errorType": "status_code",
881
+ "url": "https://www.getmyuni.com/user/{}",
882
+ "urlMain": "https://getmyuni.com/",
883
+ "username_claimed": "Upneet.Grover17"
884
+ },
885
+ "Giant Bomb": {
886
+ "errorType": "status_code",
887
+ "url": "https://www.giantbomb.com/profile/{}/",
888
+ "urlMain": "https://www.giantbomb.com/",
889
+ "username_claimed": "bob"
890
+ },
891
+ "Giphy": {
892
+ "errorType": "message",
893
+ "errorMsg": "<title> GIFs - Find &amp; Share on GIPHY</title>",
894
+ "url": "https://giphy.com/{}",
895
+ "urlMain": "https://giphy.com/",
896
+ "username_claimed": "red"
897
+ },
898
+ "GitBook": {
899
+ "errorType": "status_code",
900
+ "regexCheck": "^[\\w@-]+?$",
901
+ "url": "https://{}.gitbook.io/",
902
+ "urlMain": "https://gitbook.com/",
903
+ "username_claimed": "gitbook"
904
+ },
905
+ "GitHub": {
906
+ "errorType": "status_code",
907
+ "regexCheck": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$",
908
+ "url": "https://www.github.com/{}",
909
+ "urlMain": "https://www.github.com/",
910
+ "username_claimed": "blue"
911
+ },
912
+ "GitLab": {
913
+ "errorMsg": "[]",
914
+ "errorType": "message",
915
+ "url": "https://gitlab.com/{}",
916
+ "urlMain": "https://gitlab.com/",
917
+ "urlProbe": "https://gitlab.com/api/v4/users?username={}",
918
+ "username_claimed": "blue"
919
+ },
920
+ "Gitea": {
921
+ "errorType": "status_code",
922
+ "url": "https://gitea.com/{}",
923
+ "urlMain": "https://gitea.com/",
924
+ "username_claimed": "xorm"
925
+ },
926
+ "Gitee": {
927
+ "errorType": "status_code",
928
+ "url": "https://gitee.com/{}",
929
+ "urlMain": "https://gitee.com/",
930
+ "username_claimed": "wizzer"
931
+ },
932
+ "GoodReads": {
933
+ "errorType": "status_code",
934
+ "url": "https://www.goodreads.com/{}",
935
+ "urlMain": "https://www.goodreads.com/",
936
+ "username_claimed": "blue"
937
+ },
938
+ "Google Play": {
939
+ "errorMsg": "the requested URL was not found on this server",
940
+ "errorType": "message",
941
+ "url": "https://play.google.com/store/apps/developer?id={}",
942
+ "urlMain": "https://play.google.com",
943
+ "username_claimed": "GitHub"
944
+ },
945
+ "Gradle": {
946
+ "errorType": "status_code",
947
+ "regexCheck": "^(?!-)[a-zA-Z0-9-]{3,}(?<!-)$",
948
+ "url": "https://plugins.gradle.org/u/{}",
949
+ "urlMain": "https://gradle.org/",
950
+ "username_claimed": "jetbrains"
951
+ },
952
+ "Grailed": {
953
+ "errorType": "response_url",
954
+ "errorUrl": "https://www.grailed.com/{}",
955
+ "url": "https://www.grailed.com/{}",
956
+ "urlMain": "https://www.grailed.com/",
957
+ "username_claimed": "blue"
958
+ },
959
+ "Gravatar": {
960
+ "errorType": "status_code",
961
+ "regexCheck": "^((?!\\.).)*$",
962
+ "url": "http://en.gravatar.com/{}",
963
+ "urlMain": "http://en.gravatar.com/",
964
+ "username_claimed": "blue"
965
+ },
966
+ "Gumroad": {
967
+ "errorMsg": "Page not found (404) - Gumroad",
968
+ "errorType": "message",
969
+ "regexCheck": "^[^.]*?$",
970
+ "url": "https://www.gumroad.com/{}",
971
+ "urlMain": "https://www.gumroad.com/",
972
+ "username_claimed": "blue"
973
+ },
974
+ "Gutefrage": {
975
+ "errorType": "status_code",
976
+ "url": "https://www.gutefrage.net/nutzer/{}",
977
+ "urlMain": "https://www.gutefrage.net/",
978
+ "username_claimed": "gutefrage"
979
+ },
980
+ "HackTheBox": {
981
+ "errorType": "status_code",
982
+ "url": "https://forum.hackthebox.com/u/{}",
983
+ "urlMain": "https://forum.hackthebox.com/",
984
+ "username_claimed": "angar"
985
+ },
986
+ "Hackaday": {
987
+ "errorType": "status_code",
988
+ "url": "https://hackaday.io/{}",
989
+ "urlMain": "https://hackaday.io/",
990
+ "username_claimed": "adam"
991
+ },
992
+ "HackenProof (Hackers)": {
993
+ "errorMsg": "Page not found",
994
+ "errorType": "message",
995
+ "regexCheck": "^[\\w-]{,34}$",
996
+ "url": "https://hackenproof.com/hackers/{}",
997
+ "urlMain": "https://hackenproof.com/",
998
+ "username_claimed": "blazezaria"
999
+ },
1000
+ "HackerEarth": {
1001
+ "errorMsg": "404. URL not found.",
1002
+ "errorType": "message",
1003
+ "url": "https://hackerearth.com/@{}",
1004
+ "urlMain": "https://hackerearth.com/",
1005
+ "username_claimed": "naveennamani877"
1006
+ },
1007
+ "HackerNews": {
1008
+ "__comment__": "First errMsg invalid, second errMsg rate limited. Not ideal. Adjust for better rate limit filtering.",
1009
+ "errorMsg": [
1010
+ "No such user.",
1011
+ "Sorry."
1012
+ ],
1013
+ "errorType": "message",
1014
+ "url": "https://news.ycombinator.com/user?id={}",
1015
+ "urlMain": "https://news.ycombinator.com/",
1016
+ "username_claimed": "blue"
1017
+ },
1018
+ "HackerOne": {
1019
+ "errorMsg": "Page not found",
1020
+ "errorType": "message",
1021
+ "url": "https://hackerone.com/{}",
1022
+ "urlMain": "https://hackerone.com/",
1023
+ "username_claimed": "stok"
1024
+ },
1025
+ "HackerRank": {
1026
+ "errorMsg": "Something went wrong",
1027
+ "errorType": "message",
1028
+ "regexCheck": "^[^.]*?$",
1029
+ "url": "https://hackerrank.com/{}",
1030
+ "urlMain": "https://hackerrank.com/",
1031
+ "username_claimed": "satznova"
1032
+ },
1033
+ "Harvard Scholar": {
1034
+ "errorType": "status_code",
1035
+ "url": "https://scholar.harvard.edu/{}",
1036
+ "urlMain": "https://scholar.harvard.edu/",
1037
+ "username_claimed": "ousmanekane"
1038
+ },
1039
+ "Hashnode": {
1040
+ "errorType": "status_code",
1041
+ "url": "https://hashnode.com/@{}",
1042
+ "urlMain": "https://hashnode.com",
1043
+ "username_claimed": "blue"
1044
+ },
1045
+ "Heavy-R": {
1046
+ "errorMsg": "Channel not found",
1047
+ "errorType": "message",
1048
+ "isNSFW": true,
1049
+ "url": "https://www.heavy-r.com/user/{}",
1050
+ "urlMain": "https://www.heavy-r.com/",
1051
+ "username_claimed": "kilroy222"
1052
+ },
1053
+ "Holopin": {
1054
+ "errorMsg": "true",
1055
+ "errorType": "message",
1056
+ "request_method": "POST",
1057
+ "request_payload": {
1058
+ "username": "{}"
1059
+ },
1060
+ "url": "https://holopin.io/@{}",
1061
+ "urlMain": "https://holopin.io",
1062
+ "urlProbe": "https://www.holopin.io/api/auth/username",
1063
+ "username_claimed": "red"
1064
+ },
1065
+ "Houzz": {
1066
+ "errorType": "status_code",
1067
+ "url": "https://houzz.com/user/{}",
1068
+ "urlMain": "https://houzz.com/",
1069
+ "username_claimed": "blue"
1070
+ },
1071
+ "HubPages": {
1072
+ "errorType": "status_code",
1073
+ "url": "https://hubpages.com/@{}",
1074
+ "urlMain": "https://hubpages.com/",
1075
+ "username_claimed": "blue"
1076
+ },
1077
+ "Hubski": {
1078
+ "errorMsg": "No such user",
1079
+ "errorType": "message",
1080
+ "url": "https://hubski.com/user/{}",
1081
+ "urlMain": "https://hubski.com/",
1082
+ "username_claimed": "blue"
1083
+ },
1084
+ "HudsonRock": {
1085
+ "errorMsg": "This username is not associated",
1086
+ "errorType": "message",
1087
+ "url": "https://cavalier.hudsonrock.com/api/json/v2/osint-tools/search-by-username?username={}",
1088
+ "urlMain": "https://hudsonrock.com",
1089
+ "username_claimed": "testadmin"
1090
+ },
1091
+ "Hugging Face": {
1092
+ "errorType": "status_code",
1093
+ "url": "https://huggingface.co/{}",
1094
+ "urlMain": "https://huggingface.co/",
1095
+ "username_claimed": "Pasanlaksitha"
1096
+ },
1097
+ "IFTTT": {
1098
+ "errorType": "status_code",
1099
+ "regexCheck": "^[A-Za-z0-9]{3,35}$",
1100
+ "url": "https://www.ifttt.com/p/{}",
1101
+ "urlMain": "https://www.ifttt.com/",
1102
+ "username_claimed": "blue"
1103
+ },
1104
+ "IRC-Galleria": {
1105
+ "errorType": "response_url",
1106
+ "errorUrl": "https://irc-galleria.net/users/search?username={}",
1107
+ "url": "https://irc-galleria.net/user/{}",
1108
+ "urlMain": "https://irc-galleria.net/",
1109
+ "username_claimed": "appas"
1110
+ },
1111
+ "Icons8 Community": {
1112
+ "errorType": "status_code",
1113
+ "url": "https://community.icons8.com/u/{}/summary",
1114
+ "urlMain": "https://community.icons8.com/",
1115
+ "username_claimed": "thefourCraft"
1116
+ },
1117
+ "Image Fap": {
1118
+ "errorMsg": "Not found",
1119
+ "errorType": "message",
1120
+ "isNSFW": true,
1121
+ "url": "https://www.imagefap.com/profile/{}",
1122
+ "urlMain": "https://www.imagefap.com/",
1123
+ "username_claimed": "blue"
1124
+ },
1125
+ "ImgUp.cz": {
1126
+ "errorType": "status_code",
1127
+ "url": "https://imgup.cz/{}",
1128
+ "urlMain": "https://imgup.cz/",
1129
+ "username_claimed": "adam"
1130
+ },
1131
+ "Imgur": {
1132
+ "errorType": "status_code",
1133
+ "url": "https://imgur.com/user/{}",
1134
+ "urlMain": "https://imgur.com/",
1135
+ "urlProbe": "https://api.imgur.com/account/v1/accounts/{}?client_id=546c25a59c58ad7",
1136
+ "username_claimed": "blue"
1137
+ },
1138
+ "Instagram": {
1139
+ "errorType": "status_code",
1140
+ "url": "https://instagram.com/{}",
1141
+ "urlMain": "https://instagram.com/",
1142
+ "urlProbe": "https://imginn.com/{}",
1143
+ "username_claimed": "instagram"
1144
+ },
1145
+ "Instructables": {
1146
+ "errorType": "status_code",
1147
+ "url": "https://www.instructables.com/member/{}",
1148
+ "urlMain": "https://www.instructables.com/",
1149
+ "urlProbe": "https://www.instructables.com/json-api/showAuthorExists?screenName={}",
1150
+ "username_claimed": "blue"
1151
+ },
1152
+ "Intigriti": {
1153
+ "errorType": "status_code",
1154
+ "regexCheck": "[a-z0-9_]{1,25}",
1155
+ "request_method": "GET",
1156
+ "url": "https://app.intigriti.com/profile/{}",
1157
+ "urlMain": "https://app.intigriti.com",
1158
+ "urlProbe": "https://api.intigriti.com/user/public/profile/{}",
1159
+ "username_claimed": "blue"
1160
+ },
1161
+ "Ionic Forum": {
1162
+ "errorType": "status_code",
1163
+ "url": "https://forum.ionicframework.com/u/{}",
1164
+ "urlMain": "https://forum.ionicframework.com/",
1165
+ "username_claimed": "theblue222"
1166
+ },
1167
+ "Issuu": {
1168
+ "errorType": "status_code",
1169
+ "url": "https://issuu.com/{}",
1170
+ "urlMain": "https://issuu.com/",
1171
+ "username_claimed": "jenny"
1172
+ },
1173
+ "Itch.io": {
1174
+ "errorType": "status_code",
1175
+ "regexCheck": "^[\\w@-]+?$",
1176
+ "url": "https://{}.itch.io/",
1177
+ "urlMain": "https://itch.io/",
1178
+ "username_claimed": "blue"
1179
+ },
1180
+ "Itemfix": {
1181
+ "errorMsg": "<title>ItemFix - Channel: </title>",
1182
+ "errorType": "message",
1183
+ "url": "https://www.itemfix.com/c/{}",
1184
+ "urlMain": "https://www.itemfix.com/",
1185
+ "username_claimed": "blue"
1186
+ },
1187
+ "Jellyfin Weblate": {
1188
+ "errorType": "status_code",
1189
+ "regexCheck": "^[a-zA-Z0-9@._-]{1,150}$",
1190
+ "url": "https://translate.jellyfin.org/user/{}/",
1191
+ "urlMain": "https://translate.jellyfin.org/",
1192
+ "username_claimed": "EraYaN"
1193
+ },
1194
+ "Jimdo": {
1195
+ "errorType": "status_code",
1196
+ "regexCheck": "^[\\w@-]+?$",
1197
+ "url": "https://{}.jimdosite.com",
1198
+ "urlMain": "https://jimdosite.com/",
1199
+ "username_claimed": "jenny"
1200
+ },
1201
+ "Joplin Forum": {
1202
+ "errorType": "status_code",
1203
+ "url": "https://discourse.joplinapp.org/u/{}",
1204
+ "urlMain": "https://discourse.joplinapp.org/",
1205
+ "username_claimed": "laurent"
1206
+ },
1207
+ "Kaggle": {
1208
+ "errorType": "status_code",
1209
+ "url": "https://www.kaggle.com/{}",
1210
+ "urlMain": "https://www.kaggle.com/",
1211
+ "username_claimed": "dansbecker"
1212
+ },
1213
+ "kaskus": {
1214
+ "errorType": "status_code",
1215
+ "url": "https://www.kaskus.co.id/@{}",
1216
+ "urlMain": "https://www.kaskus.co.id/",
1217
+ "username_claimed": "l0mbart"
1218
+ },
1219
+ "Keybase": {
1220
+ "errorType": "status_code",
1221
+ "url": "https://keybase.io/{}",
1222
+ "urlMain": "https://keybase.io/",
1223
+ "username_claimed": "blue"
1224
+ },
1225
+ "Kick": {
1226
+ "__comment__": "Cloudflare. Only viable when proxied.",
1227
+ "errorType": "status_code",
1228
+ "url": "https://kick.com/{}",
1229
+ "urlMain": "https://kick.com/",
1230
+ "urlProbe": "https://kick.com/api/v2/channels/{}",
1231
+ "username_claimed": "blue"
1232
+ },
1233
+ "Kik": {
1234
+ "errorMsg": "The page you requested was not found",
1235
+ "errorType": "message",
1236
+ "url": "https://kik.me/{}",
1237
+ "urlMain": "http://kik.me/",
1238
+ "urlProbe": "https://ws2.kik.com/user/{}",
1239
+ "username_claimed": "blue"
1240
+ },
1241
+ "Kongregate": {
1242
+ "errorType": "status_code",
1243
+ "headers": {
1244
+ "Accept": "text/html"
1245
+ },
1246
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
1247
+ "url": "https://www.kongregate.com/accounts/{}",
1248
+ "urlMain": "https://www.kongregate.com/",
1249
+ "username_claimed": "blue"
1250
+ },
1251
+ "LOR": {
1252
+ "errorType": "status_code",
1253
+ "url": "https://www.linux.org.ru/people/{}/profile",
1254
+ "urlMain": "https://linux.org.ru/",
1255
+ "username_claimed": "red"
1256
+ },
1257
+ "Launchpad": {
1258
+ "errorType": "status_code",
1259
+ "url": "https://launchpad.net/~{}",
1260
+ "urlMain": "https://launchpad.net/",
1261
+ "username_claimed": "blue"
1262
+ },
1263
+ "LeetCode": {
1264
+ "errorType": "status_code",
1265
+ "url": "https://leetcode.com/{}",
1266
+ "urlMain": "https://leetcode.com/",
1267
+ "username_claimed": "blue"
1268
+ },
1269
+ "LessWrong": {
1270
+ "errorType": "status_code",
1271
+ "url": "https://www.lesswrong.com/users/@{}",
1272
+ "urlMain": "https://www.lesswrong.com/",
1273
+ "username_claimed": "blue"
1274
+ },
1275
+ "Letterboxd": {
1276
+ "errorMsg": "Sorry, we can\u2019t find the page you\u2019ve requested.",
1277
+ "errorType": "message",
1278
+ "url": "https://letterboxd.com/{}",
1279
+ "urlMain": "https://letterboxd.com/",
1280
+ "username_claimed": "blue"
1281
+ },
1282
+ "LibraryThing": {
1283
+ "errorMsg": "<p>Error: This user doesn't exist</p>",
1284
+ "errorType": "message",
1285
+ "headers": {
1286
+ "Cookie": "LTAnonSessionID=3159599315; LTUnifiedCookie=%7B%22areyouhuman%22%3A1%7D; "
1287
+ },
1288
+ "url": "https://www.librarything.com/profile/{}",
1289
+ "urlMain": "https://www.librarything.com/",
1290
+ "username_claimed": "blue"
1291
+ },
1292
+ "Lichess": {
1293
+ "errorType": "status_code",
1294
+ "url": "https://lichess.org/@/{}",
1295
+ "urlMain": "https://lichess.org",
1296
+ "username_claimed": "john"
1297
+ },
1298
+ "LinkedIn": {
1299
+ "errorType": "status_code",
1300
+ "regexCheck": "^[a-zA-Z0-9]{3,100}$",
1301
+ "request_method": "GET",
1302
+ "url": "https://linkedin.com/in/{}",
1303
+ "urlMain": "https://linkedin.com",
1304
+ "username_claimed": "paulpfeister"
1305
+ },
1306
+ "Linktree": {
1307
+ "errorMsg": "\"statusCode\":404",
1308
+ "errorType": "message",
1309
+ "regexCheck": "^[\\w\\.]{2,30}$",
1310
+ "url": "https://linktr.ee/{}",
1311
+ "urlMain": "https://linktr.ee/",
1312
+ "username_claimed": "anne"
1313
+ },
1314
+ "LinuxFR.org": {
1315
+ "errorType": "status_code",
1316
+ "url": "https://linuxfr.org/users/{}",
1317
+ "urlMain": "https://linuxfr.org/",
1318
+ "username_claimed": "pylapp"
1319
+ },
1320
+ "Listed": {
1321
+ "errorType": "response_url",
1322
+ "errorUrl": "https://listed.to/@{}",
1323
+ "url": "https://listed.to/@{}",
1324
+ "urlMain": "https://listed.to/",
1325
+ "username_claimed": "listed"
1326
+ },
1327
+ "LiveJournal": {
1328
+ "errorType": "status_code",
1329
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
1330
+ "url": "https://{}.livejournal.com",
1331
+ "urlMain": "https://www.livejournal.com/",
1332
+ "username_claimed": "blue"
1333
+ },
1334
+ "Lobsters": {
1335
+ "errorType": "status_code",
1336
+ "regexCheck": "[A-Za-z0-9][A-Za-z0-9_-]{0,24}",
1337
+ "url": "https://lobste.rs/u/{}",
1338
+ "urlMain": "https://lobste.rs/",
1339
+ "username_claimed": "jcs"
1340
+ },
1341
+ "LottieFiles": {
1342
+ "errorType": "status_code",
1343
+ "url": "https://lottiefiles.com/{}",
1344
+ "urlMain": "https://lottiefiles.com/",
1345
+ "username_claimed": "lottiefiles"
1346
+ },
1347
+ "LushStories": {
1348
+ "errorType": "status_code",
1349
+ "isNSFW": true,
1350
+ "url": "https://www.lushstories.com/profile/{}",
1351
+ "urlMain": "https://www.lushstories.com/",
1352
+ "username_claimed": "chris_brown"
1353
+ },
1354
+ "MMORPG Forum": {
1355
+ "errorType": "status_code",
1356
+ "url": "https://forums.mmorpg.com/profile/{}",
1357
+ "urlMain": "https://forums.mmorpg.com/",
1358
+ "username_claimed": "goku"
1359
+ },
1360
+ "Mamot": {
1361
+ "errorType": "status_code",
1362
+ "regexCheck": "^[a-zA-Z0-9_]{1,30}$",
1363
+ "url": "https://mamot.fr/@{}",
1364
+ "urlMain": "https://mamot.fr/",
1365
+ "username_claimed": "anciensEnssat"
1366
+ },
1367
+ "Medium": {
1368
+ "errorMsg": "<body",
1369
+ "errorType": "message",
1370
+ "url": "https://medium.com/@{}",
1371
+ "urlMain": "https://medium.com/",
1372
+ "urlProbe": "https://medium.com/feed/@{}",
1373
+ "username_claimed": "blue"
1374
+ },
1375
+ "Memrise": {
1376
+ "errorType": "status_code",
1377
+ "url": "https://www.memrise.com/user/{}/",
1378
+ "urlMain": "https://www.memrise.com/",
1379
+ "username_claimed": "blue"
1380
+ },
1381
+ "Minecraft": {
1382
+ "errorMsg": "Couldn't find any profile with name",
1383
+ "errorType": "message",
1384
+ "url": "https://api.mojang.com/users/profiles/minecraft/{}",
1385
+ "urlMain": "https://minecraft.net/",
1386
+ "username_claimed": "blue"
1387
+ },
1388
+ "MixCloud": {
1389
+ "errorType": "status_code",
1390
+ "url": "https://www.mixcloud.com/{}/",
1391
+ "urlMain": "https://www.mixcloud.com/",
1392
+ "urlProbe": "https://api.mixcloud.com/{}/",
1393
+ "username_claimed": "jenny"
1394
+ },
1395
+ "Monkeytype": {
1396
+ "errorType": "status_code",
1397
+ "url": "https://monkeytype.com/profile/{}",
1398
+ "urlMain": "https://monkeytype.com/",
1399
+ "urlProbe": "https://api.monkeytype.com/users/{}/profile",
1400
+ "username_claimed": "Lost_Arrow"
1401
+ },
1402
+ "Motherless": {
1403
+ "errorMsg": "no longer a member",
1404
+ "errorType": "message",
1405
+ "isNSFW": true,
1406
+ "url": "https://motherless.com/m/{}",
1407
+ "urlMain": "https://motherless.com/",
1408
+ "username_claimed": "hacker"
1409
+ },
1410
+ "Motorradfrage": {
1411
+ "errorType": "status_code",
1412
+ "url": "https://www.motorradfrage.net/nutzer/{}",
1413
+ "urlMain": "https://www.motorradfrage.net/",
1414
+ "username_claimed": "gutefrage"
1415
+ },
1416
+ "MyAnimeList": {
1417
+ "errorType": "status_code",
1418
+ "url": "https://myanimelist.net/profile/{}",
1419
+ "urlMain": "https://myanimelist.net/",
1420
+ "username_claimed": "blue"
1421
+ },
1422
+ "MyMiniFactory": {
1423
+ "errorType": "status_code",
1424
+ "url": "https://www.myminifactory.com/users/{}",
1425
+ "urlMain": "https://www.myminifactory.com/",
1426
+ "username_claimed": "blue"
1427
+ },
1428
+ "Mydramalist": {
1429
+ "errorMsg": "Sign in - MyDramaList",
1430
+ "errorType": "message",
1431
+ "url": "https://www.mydramalist.com/profile/{}",
1432
+ "urlMain": "https://mydramalist.com",
1433
+ "username_claimed": "elhadidy12398"
1434
+ },
1435
+ "Myspace": {
1436
+ "errorType": "status_code",
1437
+ "url": "https://myspace.com/{}",
1438
+ "urlMain": "https://myspace.com/",
1439
+ "username_claimed": "blue"
1440
+ },
1441
+ "NICommunityForum": {
1442
+ "errorMsg": "The page you were looking for could not be found.",
1443
+ "errorType": "message",
1444
+ "url": "https://community.native-instruments.com/profile/{}",
1445
+ "urlMain": "https://www.native-instruments.com/forum/",
1446
+ "username_claimed": "jambert"
1447
+ },
1448
+ "NationStates Nation": {
1449
+ "errorMsg": "Was this your nation? It may have ceased to exist due to inactivity, but can rise again!",
1450
+ "errorType": "message",
1451
+ "url": "https://nationstates.net/nation={}",
1452
+ "urlMain": "https://nationstates.net",
1453
+ "username_claimed": "the_holy_principality_of_saint_mark"
1454
+ },
1455
+ "NationStates Region": {
1456
+ "errorMsg": "does not exist.",
1457
+ "errorType": "message",
1458
+ "url": "https://nationstates.net/region={}",
1459
+ "urlMain": "https://nationstates.net",
1460
+ "username_claimed": "the_west_pacific"
1461
+ },
1462
+ "Naver": {
1463
+ "errorType": "status_code",
1464
+ "url": "https://blog.naver.com/{}",
1465
+ "urlMain": "https://naver.com",
1466
+ "username_claimed": "blue"
1467
+ },
1468
+ "Needrom": {
1469
+ "errorType": "status_code",
1470
+ "url": "https://www.needrom.com/author/{}/",
1471
+ "urlMain": "https://www.needrom.com/",
1472
+ "username_claimed": "needrom"
1473
+ },
1474
+ "Newgrounds": {
1475
+ "errorType": "status_code",
1476
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
1477
+ "url": "https://{}.newgrounds.com",
1478
+ "urlMain": "https://newgrounds.com",
1479
+ "username_claimed": "blue"
1480
+ },
1481
+ "Nextcloud Forum": {
1482
+ "errorType": "status_code",
1483
+ "regexCheck": "^(?![.-])[a-zA-Z0-9_.-]{3,20}$",
1484
+ "url": "https://help.nextcloud.com/u/{}/summary",
1485
+ "urlMain": "https://nextcloud.com/",
1486
+ "username_claimed": "blue"
1487
+ },
1488
+ "Nightbot": {
1489
+ "errorType": "status_code",
1490
+ "url": "https://nightbot.tv/t/{}/commands",
1491
+ "urlMain": "https://nightbot.tv/",
1492
+ "urlProbe": "https://api.nightbot.tv/1/channels/t/{}",
1493
+ "username_claimed": "green"
1494
+ },
1495
+ "Ninja Kiwi": {
1496
+ "errorType": "response_url",
1497
+ "errorUrl": "https://ninjakiwi.com/profile/{}",
1498
+ "url": "https://ninjakiwi.com/profile/{}",
1499
+ "urlMain": "https://ninjakiwi.com/",
1500
+ "username_claimed": "Kyruko"
1501
+ },
1502
+ "NintendoLife": {
1503
+ "errorType": "status_code",
1504
+ "url": "https://www.nintendolife.com/users/{}",
1505
+ "urlMain": "https://www.nintendolife.com/",
1506
+ "username_claimed": "goku"
1507
+ },
1508
+ "NitroType": {
1509
+ "errorMsg": "<title>Nitro Type | Competitive Typing Game | Race Your Friends</title>",
1510
+ "errorType": "message",
1511
+ "url": "https://www.nitrotype.com/racer/{}",
1512
+ "urlMain": "https://www.nitrotype.com/",
1513
+ "username_claimed": "jianclash"
1514
+ },
1515
+ "NotABug.org": {
1516
+ "errorType": "status_code",
1517
+ "url": "https://notabug.org/{}",
1518
+ "urlMain": "https://notabug.org/",
1519
+ "urlProbe": "https://notabug.org/{}/followers",
1520
+ "username_claimed": "red"
1521
+ },
1522
+ "Nyaa.si": {
1523
+ "errorType": "status_code",
1524
+ "url": "https://nyaa.si/user/{}",
1525
+ "urlMain": "https://nyaa.si/",
1526
+ "username_claimed": "blue"
1527
+ },
1528
+ "Open Collective": {
1529
+ "errorMsg": "Oops! Page not found",
1530
+ "errorType": "message",
1531
+ "url": "https://opencollective.com/{}",
1532
+ "urlMain": "https://opencollective.com/",
1533
+ "username_claimed": "pylapp"
1534
+ },
1535
+ "OpenStreetMap": {
1536
+ "errorType": "status_code",
1537
+ "regexCheck": "^[^.]*?$",
1538
+ "url": "https://www.openstreetmap.org/user/{}",
1539
+ "urlMain": "https://www.openstreetmap.org/",
1540
+ "username_claimed": "blue"
1541
+ },
1542
+ "Opensource": {
1543
+ "errorType": "status_code",
1544
+ "url": "https://opensource.com/users/{}",
1545
+ "urlMain": "https://opensource.com/",
1546
+ "username_claimed": "red"
1547
+ },
1548
+ "OurDJTalk": {
1549
+ "errorMsg": "The specified member cannot be found",
1550
+ "errorType": "message",
1551
+ "url": "https://ourdjtalk.com/members?username={}",
1552
+ "urlMain": "https://ourdjtalk.com/",
1553
+ "username_claimed": "steve"
1554
+ },
1555
+ "Outgress": {
1556
+ "errorMsg": "Outgress - Error",
1557
+ "errorType": "message",
1558
+ "url": "https://outgress.com/agents/{}",
1559
+ "urlMain": "https://outgress.com/",
1560
+ "username_claimed": "pylapp"
1561
+ },
1562
+ "PCGamer": {
1563
+ "errorMsg": "The specified member cannot be found. Please enter a member's entire name.",
1564
+ "errorType": "message",
1565
+ "url": "https://forums.pcgamer.com/members/?username={}",
1566
+ "urlMain": "https://pcgamer.com",
1567
+ "username_claimed": "admin"
1568
+ },
1569
+ "PSNProfiles.com": {
1570
+ "errorType": "response_url",
1571
+ "errorUrl": "https://psnprofiles.com/?psnId={}",
1572
+ "url": "https://psnprofiles.com/{}",
1573
+ "urlMain": "https://psnprofiles.com/",
1574
+ "username_claimed": "blue"
1575
+ },
1576
+ "Packagist": {
1577
+ "errorType": "response_url",
1578
+ "errorUrl": "https://packagist.org/search/?q={}&reason=vendor_not_found",
1579
+ "url": "https://packagist.org/packages/{}/",
1580
+ "urlMain": "https://packagist.org/",
1581
+ "username_claimed": "psr"
1582
+ },
1583
+ "Pastebin": {
1584
+ "errorMsg": "Not Found (#404)",
1585
+ "errorType": "message",
1586
+ "url": "https://pastebin.com/u/{}",
1587
+ "urlMain": "https://pastebin.com/",
1588
+ "username_claimed": "blue"
1589
+ },
1590
+ "Patreon": {
1591
+ "errorType": "status_code",
1592
+ "url": "https://www.patreon.com/{}",
1593
+ "urlMain": "https://www.patreon.com/",
1594
+ "username_claimed": "blue"
1595
+ },
1596
+ "PentesterLab": {
1597
+ "errorType": "status_code",
1598
+ "regexCheck": "^[\\w]{4,30}$",
1599
+ "url": "https://pentesterlab.com/profile/{}",
1600
+ "urlMain": "https://pentesterlab.com/",
1601
+ "username_claimed": "0day"
1602
+ },
1603
+ "PepperIT": {
1604
+ "errorMsg": "La pagina che hai provato a raggiungere non si trova qui",
1605
+ "errorType": "message",
1606
+ "url": "https://www.pepper.it/profile/{}/overview",
1607
+ "urlMain": "https://www.pepper.it",
1608
+ "username_claimed": "asoluinostrisca"
1609
+ },
1610
+ "Periscope": {
1611
+ "errorType": "status_code",
1612
+ "url": "https://www.periscope.tv/{}/",
1613
+ "urlMain": "https://www.periscope.tv/",
1614
+ "username_claimed": "blue"
1615
+ },
1616
+ "Pinkbike": {
1617
+ "errorType": "status_code",
1618
+ "regexCheck": "^[^.]*?$",
1619
+ "url": "https://www.pinkbike.com/u/{}/",
1620
+ "urlMain": "https://www.pinkbike.com/",
1621
+ "username_claimed": "blue"
1622
+ },
1623
+ "pixelfed.social": {
1624
+ "errorType": "status_code",
1625
+ "url": "https://pixelfed.social/{}/",
1626
+ "urlMain": "https://pixelfed.social",
1627
+ "username_claimed": "pylapp"
1628
+ },
1629
+ "PlayStore": {
1630
+ "errorType": "status_code",
1631
+ "url": "https://play.google.com/store/apps/developer?id={}",
1632
+ "urlMain": "https://play.google.com/store",
1633
+ "username_claimed": "Facebook"
1634
+ },
1635
+ "Playstrategy": {
1636
+ "errorType": "status_code",
1637
+ "url": "https://playstrategy.org/@/{}",
1638
+ "urlMain": "https://playstrategy.org",
1639
+ "username_claimed": "oruro"
1640
+ },
1641
+ "Plurk": {
1642
+ "errorMsg": "User Not Found!",
1643
+ "errorType": "message",
1644
+ "url": "https://www.plurk.com/{}",
1645
+ "urlMain": "https://www.plurk.com/",
1646
+ "username_claimed": "plurkoffice"
1647
+ },
1648
+ "PocketStars": {
1649
+ "errorMsg": "Join Your Favorite Adult Stars",
1650
+ "errorType": "message",
1651
+ "isNSFW": true,
1652
+ "url": "https://pocketstars.com/{}",
1653
+ "urlMain": "https://pocketstars.com/",
1654
+ "username_claimed": "hacker"
1655
+ },
1656
+ "Pokemon Showdown": {
1657
+ "errorType": "status_code",
1658
+ "url": "https://pokemonshowdown.com/users/{}",
1659
+ "urlMain": "https://pokemonshowdown.com",
1660
+ "username_claimed": "blue"
1661
+ },
1662
+ "Polarsteps": {
1663
+ "errorType": "status_code",
1664
+ "url": "https://polarsteps.com/{}",
1665
+ "urlMain": "https://polarsteps.com/",
1666
+ "urlProbe": "https://api.polarsteps.com/users/byusername/{}",
1667
+ "username_claimed": "james"
1668
+ },
1669
+ "Polygon": {
1670
+ "errorType": "status_code",
1671
+ "url": "https://www.polygon.com/users/{}",
1672
+ "urlMain": "https://www.polygon.com/",
1673
+ "username_claimed": "swiftstickler"
1674
+ },
1675
+ "Polymart": {
1676
+ "errorType": "response_url",
1677
+ "errorUrl": "https://polymart.org/user/-1",
1678
+ "url": "https://polymart.org/user/{}",
1679
+ "urlMain": "https://polymart.org/",
1680
+ "username_claimed": "craciu25yt"
1681
+ },
1682
+ "Pornhub": {
1683
+ "errorType": "status_code",
1684
+ "isNSFW": true,
1685
+ "url": "https://pornhub.com/users/{}",
1686
+ "urlMain": "https://pornhub.com/",
1687
+ "username_claimed": "blue"
1688
+ },
1689
+ "ProductHunt": {
1690
+ "errorType": "status_code",
1691
+ "url": "https://www.producthunt.com/@{}",
1692
+ "urlMain": "https://www.producthunt.com/",
1693
+ "username_claimed": "jenny"
1694
+ },
1695
+ "programming.dev": {
1696
+ "errorMsg": "Error!",
1697
+ "errorType": "message",
1698
+ "url": "https://programming.dev/u/{}",
1699
+ "urlMain": "https://programming.dev",
1700
+ "username_claimed": "pylapp"
1701
+ },
1702
+ "Pychess": {
1703
+ "errorType": "message",
1704
+ "errorMsg": "404",
1705
+ "url": "https://www.pychess.org/@/{}",
1706
+ "urlMain": "https://www.pychess.org",
1707
+ "username_claimed": "gbtami"
1708
+ },
1709
+ "PromoDJ": {
1710
+ "errorType": "status_code",
1711
+ "url": "http://promodj.com/{}",
1712
+ "urlMain": "http://promodj.com/",
1713
+ "username_claimed": "blue"
1714
+ },
1715
+ "PyPi": {
1716
+ "errorType": "status_code",
1717
+ "url": "https://pypi.org/user/{}",
1718
+ "urlProbe": "https://pypi.org/_includes/administer-user-include/{}",
1719
+ "urlMain": "https://pypi.org",
1720
+ "username_claimed": "Blue"
1721
+ },
1722
+ "Rajce.net": {
1723
+ "errorType": "status_code",
1724
+ "regexCheck": "^[\\w@-]+?$",
1725
+ "url": "https://{}.rajce.idnes.cz/",
1726
+ "urlMain": "https://www.rajce.idnes.cz/",
1727
+ "username_claimed": "blue"
1728
+ },
1729
+ "Rarible": {
1730
+ "errorType": "status_code",
1731
+ "url": "https://rarible.com/marketplace/api/v4/urls/{}",
1732
+ "urlMain": "https://rarible.com/",
1733
+ "username_claimed": "blue"
1734
+ },
1735
+ "Rate Your Music": {
1736
+ "errorType": "status_code",
1737
+ "url": "https://rateyourmusic.com/~{}",
1738
+ "urlMain": "https://rateyourmusic.com/",
1739
+ "username_claimed": "blue"
1740
+ },
1741
+ "Rclone Forum": {
1742
+ "errorType": "status_code",
1743
+ "url": "https://forum.rclone.org/u/{}",
1744
+ "urlMain": "https://forum.rclone.org/",
1745
+ "username_claimed": "ncw"
1746
+ },
1747
+ "RedTube": {
1748
+ "errorType": "status_code",
1749
+ "isNSFW": true,
1750
+ "url": "https://www.redtube.com/users/{}",
1751
+ "urlMain": "https://www.redtube.com/",
1752
+ "username_claimed": "hacker"
1753
+ },
1754
+ "Redbubble": {
1755
+ "errorType": "status_code",
1756
+ "url": "https://www.redbubble.com/people/{}",
1757
+ "urlMain": "https://www.redbubble.com/",
1758
+ "username_claimed": "blue"
1759
+ },
1760
+ "Reddit": {
1761
+ "errorMsg": "Sorry, nobody on Reddit goes by that name.",
1762
+ "errorType": "message",
1763
+ "headers": {
1764
+ "accept-language": "en-US,en;q=0.9"
1765
+ },
1766
+ "url": "https://www.reddit.com/user/{}",
1767
+ "urlMain": "https://www.reddit.com/",
1768
+ "username_claimed": "blue"
1769
+ },
1770
+ "Reisefrage": {
1771
+ "errorType": "status_code",
1772
+ "url": "https://www.reisefrage.net/nutzer/{}",
1773
+ "urlMain": "https://www.reisefrage.net/",
1774
+ "username_claimed": "reisefrage"
1775
+ },
1776
+ "Replit.com": {
1777
+ "errorType": "status_code",
1778
+ "url": "https://replit.com/@{}",
1779
+ "urlMain": "https://replit.com/",
1780
+ "username_claimed": "blue"
1781
+ },
1782
+ "ResearchGate": {
1783
+ "errorType": "response_url",
1784
+ "errorUrl": "https://www.researchgate.net/directory/profiles",
1785
+ "regexCheck": "\\w+_\\w+",
1786
+ "url": "https://www.researchgate.net/profile/{}",
1787
+ "urlMain": "https://www.researchgate.net/",
1788
+ "username_claimed": "John_Smith"
1789
+ },
1790
+ "ReverbNation": {
1791
+ "errorMsg": "Sorry, we couldn't find that page",
1792
+ "errorType": "message",
1793
+ "url": "https://www.reverbnation.com/{}",
1794
+ "urlMain": "https://www.reverbnation.com/",
1795
+ "username_claimed": "blue"
1796
+ },
1797
+ "Roblox": {
1798
+ "errorMsg": "Page cannot be found or no longer exists",
1799
+ "errorType": "message",
1800
+ "url": "https://www.roblox.com/user.aspx?username={}",
1801
+ "urlMain": "https://www.roblox.com/",
1802
+ "username_claimed": "bluewolfekiller"
1803
+ },
1804
+ "RocketTube": {
1805
+ "errorMsg": "OOPS! Houston, we have a problem",
1806
+ "errorType": "message",
1807
+ "isNSFW": true,
1808
+ "url": "https://www.rockettube.com/{}",
1809
+ "urlMain": "https://www.rockettube.com/",
1810
+ "username_claimed": "Tatteddick5600"
1811
+ },
1812
+ "RoyalCams": {
1813
+ "errorType": "status_code",
1814
+ "url": "https://royalcams.com/profile/{}",
1815
+ "urlMain": "https://royalcams.com",
1816
+ "username_claimed": "asuna-black"
1817
+ },
1818
+ "RubyGems": {
1819
+ "errorType": "status_code",
1820
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]{1,40}",
1821
+ "url": "https://rubygems.org/profiles/{}",
1822
+ "urlMain": "https://rubygems.org/",
1823
+ "username_claimed": "blue"
1824
+ },
1825
+ "Rumble": {
1826
+ "errorType": "status_code",
1827
+ "url": "https://rumble.com/user/{}",
1828
+ "urlMain": "https://rumble.com/",
1829
+ "username_claimed": "John"
1830
+ },
1831
+ "RuneScape": {
1832
+ "errorMsg": "{\"error\":\"NO_PROFILE\",\"loggedIn\":\"false\"}",
1833
+ "errorType": "message",
1834
+ "regexCheck": "^(?! )[\\w -]{1,12}(?<! )$",
1835
+ "url": "https://apps.runescape.com/runemetrics/app/overview/player/{}",
1836
+ "urlMain": "https://www.runescape.com/",
1837
+ "urlProbe": "https://apps.runescape.com/runemetrics/profile/profile?user={}",
1838
+ "username_claimed": "L33"
1839
+ },
1840
+ "SWAPD": {
1841
+ "errorType": "status_code",
1842
+ "url": "https://swapd.co/u/{}",
1843
+ "urlMain": "https://swapd.co/",
1844
+ "username_claimed": "swapd"
1845
+ },
1846
+ "Sbazar.cz": {
1847
+ "errorType": "status_code",
1848
+ "url": "https://www.sbazar.cz/{}",
1849
+ "urlMain": "https://www.sbazar.cz/",
1850
+ "username_claimed": "blue"
1851
+ },
1852
+ "Scratch": {
1853
+ "errorType": "status_code",
1854
+ "url": "https://scratch.mit.edu/users/{}",
1855
+ "urlMain": "https://scratch.mit.edu/",
1856
+ "username_claimed": "griffpatch"
1857
+ },
1858
+ "Scribd": {
1859
+ "errorMsg": "Page not found",
1860
+ "errorType": "message",
1861
+ "url": "https://www.scribd.com/{}",
1862
+ "urlMain": "https://www.scribd.com/",
1863
+ "username_claimed": "blue"
1864
+ },
1865
+ "ShitpostBot5000": {
1866
+ "errorType": "status_code",
1867
+ "url": "https://www.shitpostbot.com/user/{}",
1868
+ "urlMain": "https://www.shitpostbot.com/",
1869
+ "username_claimed": "blue"
1870
+ },
1871
+ "Signal": {
1872
+ "errorMsg": "Oops! That page doesn\u2019t exist or is private.",
1873
+ "errorType": "message",
1874
+ "url": "https://community.signalusers.org/u/{}",
1875
+ "urlMain": "https://community.signalusers.org",
1876
+ "username_claimed": "jlund"
1877
+ },
1878
+ "Sketchfab": {
1879
+ "errorType": "status_code",
1880
+ "url": "https://sketchfab.com/{}",
1881
+ "urlMain": "https://sketchfab.com/",
1882
+ "username_claimed": "blue"
1883
+ },
1884
+ "Slack": {
1885
+ "errorType": "status_code",
1886
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
1887
+ "url": "https://{}.slack.com",
1888
+ "urlMain": "https://slack.com",
1889
+ "username_claimed": "blue"
1890
+ },
1891
+ "Slant": {
1892
+ "errorType": "status_code",
1893
+ "regexCheck": "^.{2,32}$",
1894
+ "url": "https://www.slant.co/users/{}",
1895
+ "urlMain": "https://www.slant.co/",
1896
+ "username_claimed": "blue"
1897
+ },
1898
+ "Slashdot": {
1899
+ "errorMsg": "user you requested does not exist",
1900
+ "errorType": "message",
1901
+ "url": "https://slashdot.org/~{}",
1902
+ "urlMain": "https://slashdot.org",
1903
+ "username_claimed": "blue"
1904
+ },
1905
+ "SlideShare": {
1906
+ "errorType": "message",
1907
+ "errorMsg": "<title>Username available</title>",
1908
+ "url": "https://slideshare.net/{}",
1909
+ "urlMain": "https://slideshare.net/",
1910
+ "username_claimed": "blue"
1911
+ },
1912
+ "Slides": {
1913
+ "errorCode": 204,
1914
+ "errorType": "status_code",
1915
+ "url": "https://slides.com/{}",
1916
+ "urlMain": "https://slides.com/",
1917
+ "username_claimed": "blue"
1918
+ },
1919
+ "SmugMug": {
1920
+ "errorType": "status_code",
1921
+ "regexCheck": "^[a-zA-Z]{1,35}$",
1922
+ "url": "https://{}.smugmug.com",
1923
+ "urlMain": "https://smugmug.com",
1924
+ "username_claimed": "winchester"
1925
+ },
1926
+ "Smule": {
1927
+ "errorMsg": "Smule | Page Not Found (404)",
1928
+ "errorType": "message",
1929
+ "url": "https://www.smule.com/{}",
1930
+ "urlMain": "https://www.smule.com/",
1931
+ "username_claimed": "blue"
1932
+ },
1933
+ "Snapchat": {
1934
+ "errorType": "status_code",
1935
+ "regexCheck": "^[a-z][a-z-_.]{3,15}",
1936
+ "request_method": "GET",
1937
+ "url": "https://www.snapchat.com/add/{}",
1938
+ "urlMain": "https://www.snapchat.com",
1939
+ "username_claimed": "teamsnapchat"
1940
+ },
1941
+ "SoundCloud": {
1942
+ "errorType": "status_code",
1943
+ "url": "https://soundcloud.com/{}",
1944
+ "urlMain": "https://soundcloud.com/",
1945
+ "username_claimed": "blue"
1946
+ },
1947
+ "SourceForge": {
1948
+ "errorType": "status_code",
1949
+ "url": "https://sourceforge.net/u/{}",
1950
+ "urlMain": "https://sourceforge.net/",
1951
+ "username_claimed": "blue"
1952
+ },
1953
+ "SoylentNews": {
1954
+ "errorMsg": "The user you requested does not exist, no matter how much you wish this might be the case.",
1955
+ "errorType": "message",
1956
+ "url": "https://soylentnews.org/~{}",
1957
+ "urlMain": "https://soylentnews.org",
1958
+ "username_claimed": "adam"
1959
+ },
1960
+ "SpeakerDeck": {
1961
+ "errorType": "status_code",
1962
+ "url": "https://speakerdeck.com/{}",
1963
+ "urlMain": "https://speakerdeck.com/",
1964
+ "username_claimed": "pylapp"
1965
+ },
1966
+ "Speedrun.com": {
1967
+ "errorType": "status_code",
1968
+ "url": "https://speedrun.com/users/{}",
1969
+ "urlMain": "https://speedrun.com/",
1970
+ "username_claimed": "example"
1971
+ },
1972
+ "Spells8": {
1973
+ "errorType": "status_code",
1974
+ "url": "https://forum.spells8.com/u/{}",
1975
+ "urlMain": "https://spells8.com",
1976
+ "username_claimed": "susurrus"
1977
+ },
1978
+ "Splice": {
1979
+ "errorType": "status_code",
1980
+ "url": "https://splice.com/{}",
1981
+ "urlMain": "https://splice.com/",
1982
+ "username_claimed": "splice"
1983
+ },
1984
+ "Splits.io": {
1985
+ "errorType": "status_code",
1986
+ "regexCheck": "^[^.]*?$",
1987
+ "url": "https://splits.io/users/{}",
1988
+ "urlMain": "https://splits.io",
1989
+ "username_claimed": "cambosteve"
1990
+ },
1991
+ "Sporcle": {
1992
+ "errorType": "status_code",
1993
+ "url": "https://www.sporcle.com/user/{}/people",
1994
+ "urlMain": "https://www.sporcle.com/",
1995
+ "username_claimed": "blue"
1996
+ },
1997
+ "Sportlerfrage": {
1998
+ "errorType": "status_code",
1999
+ "url": "https://www.sportlerfrage.net/nutzer/{}",
2000
+ "urlMain": "https://www.sportlerfrage.net/",
2001
+ "username_claimed": "sportlerfrage"
2002
+ },
2003
+ "SportsRU": {
2004
+ "errorType": "status_code",
2005
+ "url": "https://www.sports.ru/profile/{}/",
2006
+ "urlMain": "https://www.sports.ru/",
2007
+ "username_claimed": "blue"
2008
+ },
2009
+ "Spotify": {
2010
+ "errorType": "status_code",
2011
+
2012
+ "url": "https://open.spotify.com/user/{}",
2013
+ "urlMain": "https://open.spotify.com/",
2014
+ "username_claimed": "blue"
2015
+ },
2016
+ "Star Citizen": {
2017
+ "errorMsg": "404",
2018
+ "errorType": "message",
2019
+ "url": "https://robertsspaceindustries.com/citizens/{}",
2020
+ "urlMain": "https://robertsspaceindustries.com/",
2021
+ "username_claimed": "blue"
2022
+ },
2023
+ "Steam Community (Group)": {
2024
+ "errorMsg": "No group could be retrieved for the given URL",
2025
+ "errorType": "message",
2026
+ "url": "https://steamcommunity.com/groups/{}",
2027
+ "urlMain": "https://steamcommunity.com/",
2028
+ "username_claimed": "blue"
2029
+ },
2030
+ "Steam Community (User)": {
2031
+ "errorMsg": "The specified profile could not be found",
2032
+ "errorType": "message",
2033
+ "url": "https://steamcommunity.com/id/{}/",
2034
+ "urlMain": "https://steamcommunity.com/",
2035
+ "username_claimed": "blue"
2036
+ },
2037
+ "Strava": {
2038
+ "errorType": "status_code",
2039
+ "regexCheck": "^[^.]*?$",
2040
+ "url": "https://www.strava.com/athletes/{}",
2041
+ "urlMain": "https://www.strava.com/",
2042
+ "username_claimed": "blue"
2043
+ },
2044
+ "SublimeForum": {
2045
+ "errorType": "status_code",
2046
+ "url": "https://forum.sublimetext.com/u/{}",
2047
+ "urlMain": "https://forum.sublimetext.com/",
2048
+ "username_claimed": "blue"
2049
+ },
2050
+ "TETR.IO": {
2051
+ "errorMsg": "No such user!",
2052
+ "errorType": "message",
2053
+ "url": "https://ch.tetr.io/u/{}",
2054
+ "urlMain": "https://tetr.io",
2055
+ "urlProbe": "https://ch.tetr.io/api/users/{}",
2056
+ "username_claimed": "osk"
2057
+ },
2058
+ "Tiendanube": {
2059
+ "url": "https://{}.mitiendanube.com/",
2060
+ "urlMain": "https://www.tiendanube.com/",
2061
+ "errorType": "status_code",
2062
+ "username_claimed": "blue"
2063
+ },
2064
+ "Topcoder": {
2065
+ "errorType": "status_code",
2066
+ "url": "https://profiles.topcoder.com/{}/",
2067
+ "urlMain": "https://topcoder.com/",
2068
+ "username_claimed": "USER",
2069
+ "urlProbe": "https://api.topcoder.com/v5/members/{}",
2070
+ "regexCheck": "[a-zA-Z0-9 ]"
2071
+ },
2072
+ "TRAKTRAIN": {
2073
+ "errorType": "status_code",
2074
+ "url": "https://traktrain.com/{}",
2075
+ "urlMain": "https://traktrain.com/",
2076
+ "username_claimed": "traktrain"
2077
+ },
2078
+ "Telegram": {
2079
+ "errorMsg": [
2080
+ "<title>Telegram Messenger</title>",
2081
+ "If you have <strong>Telegram</strong>, you can contact <a class=\"tgme_username_link\" href=\"tg://resolve?domain="
2082
+ ],
2083
+ "errorType": "message",
2084
+ "regexCheck": "^[a-zA-Z0-9_]{3,32}[^_]$",
2085
+ "url": "https://t.me/{}",
2086
+ "urlMain": "https://t.me/",
2087
+ "username_claimed": "blue"
2088
+ },
2089
+ "Tellonym.me": {
2090
+ "errorType": "status_code",
2091
+ "url": "https://tellonym.me/{}",
2092
+ "urlMain": "https://tellonym.me/",
2093
+ "username_claimed": "blue"
2094
+ },
2095
+ "Tenor": {
2096
+ "errorType": "status_code",
2097
+ "regexCheck": "^[A-Za-z0-9_]{2,32}$",
2098
+ "url": "https://tenor.com/users/{}",
2099
+ "urlMain": "https://tenor.com/",
2100
+ "username_claimed": "red"
2101
+ },
2102
+ "ThemeForest": {
2103
+ "errorType": "status_code",
2104
+ "url": "https://themeforest.net/user/{}",
2105
+ "urlMain": "https://themeforest.net/",
2106
+ "username_claimed": "user"
2107
+ },
2108
+ "TnAFlix": {
2109
+ "errorType": "status_code",
2110
+ "isNSFW": true,
2111
+ "url": "https://www.tnaflix.com/profile/{}",
2112
+ "urlMain": "https://www.tnaflix.com/",
2113
+ "username_claimed": "hacker"
2114
+ },
2115
+ "TradingView": {
2116
+ "errorType": "status_code",
2117
+ "request_method": "GET",
2118
+ "url": "https://www.tradingview.com/u/{}/",
2119
+ "urlMain": "https://www.tradingview.com/",
2120
+ "username_claimed": "blue"
2121
+ },
2122
+ "Trakt": {
2123
+ "errorType": "status_code",
2124
+ "regexCheck": "^[^.]*$",
2125
+ "url": "https://www.trakt.tv/users/{}",
2126
+ "urlMain": "https://www.trakt.tv/",
2127
+ "username_claimed": "blue"
2128
+ },
2129
+ "TrashboxRU": {
2130
+ "errorType": "status_code",
2131
+ "regexCheck": "^[A-Za-z0-9_-]{3,16}$",
2132
+ "url": "https://trashbox.ru/users/{}",
2133
+ "urlMain": "https://trashbox.ru/",
2134
+ "username_claimed": "blue"
2135
+ },
2136
+ "Trawelling": {
2137
+ "errorType": "status_code",
2138
+ "url": "https://traewelling.de/@{}",
2139
+ "urlMain": "https://traewelling.de/",
2140
+ "username_claimed": "lassestolley"
2141
+ },
2142
+ "Trello": {
2143
+ "errorMsg": "model not found",
2144
+ "errorType": "message",
2145
+ "url": "https://trello.com/{}",
2146
+ "urlMain": "https://trello.com/",
2147
+ "urlProbe": "https://trello.com/1/Members/{}",
2148
+ "username_claimed": "blue"
2149
+ },
2150
+ "TryHackMe": {
2151
+ "errorMsg": "{\"success\":false}",
2152
+ "errorType": "message",
2153
+ "regexCheck": "^[a-zA-Z0-9.]{1,16}$",
2154
+ "url": "https://tryhackme.com/p/{}",
2155
+ "urlMain": "https://tryhackme.com/",
2156
+ "urlProbe": "https://tryhackme.com/api/user/exist/{}",
2157
+ "username_claimed": "ashu"
2158
+ },
2159
+ "Tuna": {
2160
+ "errorType": "status_code",
2161
+ "regexCheck": "^[a-z0-9]{4,40}$",
2162
+ "url": "https://tuna.voicemod.net/user/{}",
2163
+ "urlMain": "https://tuna.voicemod.net/",
2164
+ "username_claimed": "bob"
2165
+ },
2166
+ "Tweakers": {
2167
+ "errorType": "status_code",
2168
+ "url": "https://tweakers.net/gallery/{}",
2169
+ "urlMain": "https://tweakers.net",
2170
+ "username_claimed": "femme"
2171
+ },
2172
+ "Twitter": {
2173
+ "errorMsg": [
2174
+ "<div class=\"error-panel\"><span>User ",
2175
+ "<title>429 Too Many Requests</title>"
2176
+ ],
2177
+ "errorType": "message",
2178
+ "regexCheck": "^[a-zA-Z0-9_]{1,15}$",
2179
+ "url": "https://x.com/{}",
2180
+ "urlMain": "https://x.com/",
2181
+ "urlProbe": "https://nitter.privacydev.net/{}",
2182
+ "username_claimed": "blue"
2183
+ },
2184
+ "Typeracer": {
2185
+ "errorMsg": "Profile Not Found",
2186
+ "errorType": "message",
2187
+ "url": "https://data.typeracer.com/pit/profile?user={}",
2188
+ "urlMain": "https://typeracer.com",
2189
+ "username_claimed": "blue"
2190
+ },
2191
+ "Ultimate-Guitar": {
2192
+ "errorType": "status_code",
2193
+ "url": "https://ultimate-guitar.com/u/{}",
2194
+ "urlMain": "https://ultimate-guitar.com/",
2195
+ "username_claimed": "blue"
2196
+ },
2197
+ "Unsplash": {
2198
+ "errorType": "status_code",
2199
+ "regexCheck": "^[a-z0-9_]{1,60}$",
2200
+ "url": "https://unsplash.com/@{}",
2201
+ "urlMain": "https://unsplash.com/",
2202
+ "username_claimed": "jenny"
2203
+ },
2204
+ "Untappd": {
2205
+ "errorType": "status_code",
2206
+ "url": "https://untappd.com/user/{}",
2207
+ "urlMain": "https://untappd.com/",
2208
+ "username_claimed": "untappd"
2209
+ },
2210
+ "VK": {
2211
+ "errorType": "response_url",
2212
+ "errorUrl": "https://www.quora.com/profile/{}",
2213
+ "url": "https://vk.com/{}",
2214
+ "urlMain": "https://vk.com/",
2215
+ "username_claimed": "brown"
2216
+ },
2217
+ "VSCO": {
2218
+ "errorType": "status_code",
2219
+ "url": "https://vsco.co/{}",
2220
+ "urlMain": "https://vsco.co/",
2221
+ "username_claimed": "blue"
2222
+ },
2223
+ "Velog": {
2224
+ "errorType": "status_code",
2225
+ "url": "https://velog.io/@{}/posts",
2226
+ "urlMain": "https://velog.io/",
2227
+ "username_claimed": "qlgks1"
2228
+ },
2229
+ "Velomania": {
2230
+ "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.",
2231
+ "errorType": "message",
2232
+ "url": "https://forum.velomania.ru/member.php?username={}",
2233
+ "urlMain": "https://forum.velomania.ru/",
2234
+ "username_claimed": "red"
2235
+ },
2236
+ "Venmo": {
2237
+ "errorMsg": [
2238
+ "Venmo | Page Not Found"
2239
+ ],
2240
+ "errorType": "message",
2241
+ "headers": {
2242
+ "Host": "account.venmo.com"
2243
+ },
2244
+ "url": "https://account.venmo.com/u/{}",
2245
+ "urlMain": "https://venmo.com/",
2246
+ "urlProbe": "https://test1.venmo.com/u/{}",
2247
+ "username_claimed": "jenny"
2248
+ },
2249
+ "Vero": {
2250
+ "errorMsg": "Not Found",
2251
+ "errorType": "message",
2252
+ "request_method": "GET",
2253
+ "url": "https://vero.co/{}",
2254
+ "urlMain": "https://vero.co/",
2255
+ "username_claimed": "blue"
2256
+ },
2257
+ "Vimeo": {
2258
+ "errorType": "status_code",
2259
+ "url": "https://vimeo.com/{}",
2260
+ "urlMain": "https://vimeo.com/",
2261
+ "username_claimed": "blue"
2262
+ },
2263
+ "VirusTotal": {
2264
+ "errorType": "status_code",
2265
+ "request_method": "GET",
2266
+ "url": "https://www.virustotal.com/gui/user/{}",
2267
+ "urlMain": "https://www.virustotal.com/",
2268
+ "urlProbe": "https://www.virustotal.com/ui/users/{}/avatar",
2269
+ "username_claimed": "blue"
2270
+ },
2271
+ "VLR": {
2272
+ "errorType": "status_code",
2273
+ "url": "https://www.vlr.gg/user/{}",
2274
+ "urlMain": "https://www.vlr.gg",
2275
+ "username_claimed": "optms"
2276
+ },
2277
+ "WICG Forum": {
2278
+ "errorType": "status_code",
2279
+ "regexCheck": "^(?![.-])[a-zA-Z0-9_.-]{3,20}$",
2280
+ "url": "https://discourse.wicg.io/u/{}/summary",
2281
+ "urlMain": "https://discourse.wicg.io/",
2282
+ "username_claimed": "stefano"
2283
+ },
2284
+ "Warrior Forum": {
2285
+ "errorType": "status_code",
2286
+ "url": "https://www.warriorforum.com/members/{}.html",
2287
+ "urlMain": "https://www.warriorforum.com/",
2288
+ "username_claimed": "blue"
2289
+ },
2290
+ "Wattpad": {
2291
+ "errorType": "status_code",
2292
+ "url": "https://www.wattpad.com/user/{}",
2293
+ "urlMain": "https://www.wattpad.com/",
2294
+ "urlProbe": "https://www.wattpad.com/api/v3/users/{}/",
2295
+ "username_claimed": "Dogstho7951"
2296
+ },
2297
+ "WebNode": {
2298
+ "errorType": "status_code",
2299
+ "regexCheck": "^[\\w@-]+?$",
2300
+ "url": "https://{}.webnode.cz/",
2301
+ "urlMain": "https://www.webnode.cz/",
2302
+ "username_claimed": "radkabalcarova"
2303
+ },
2304
+ "Weblate": {
2305
+ "errorType": "status_code",
2306
+ "regexCheck": "^[a-zA-Z0-9@._-]{1,150}$",
2307
+ "url": "https://hosted.weblate.org/user/{}/",
2308
+ "urlMain": "https://hosted.weblate.org/",
2309
+ "username_claimed": "adam"
2310
+ },
2311
+ "Weebly": {
2312
+ "errorType": "status_code",
2313
+ "regexCheck": "^[a-zA-Z0-9-]{1,63}$",
2314
+ "url": "https://{}.weebly.com/",
2315
+ "urlMain": "https://weebly.com/",
2316
+ "username_claimed": "blue"
2317
+ },
2318
+ "Wikidot": {
2319
+ "errorMsg": "User does not exist.",
2320
+ "errorType": "message",
2321
+ "url": "http://www.wikidot.com/user:info/{}",
2322
+ "urlMain": "http://www.wikidot.com/",
2323
+ "username_claimed": "blue"
2324
+ },
2325
+ "Wikipedia": {
2326
+ "errorMsg": "centralauth-admin-nonexistent:",
2327
+ "errorType": "message",
2328
+ "url": "https://en.wikipedia.org/wiki/Special:CentralAuth/{}?uselang=qqx",
2329
+ "urlMain": "https://www.wikipedia.org/",
2330
+ "username_claimed": "Hoadlck"
2331
+ },
2332
+ "Windy": {
2333
+ "errorType": "status_code",
2334
+ "url": "https://community.windy.com/user/{}",
2335
+ "urlMain": "https://windy.com/",
2336
+ "username_claimed": "blue"
2337
+ },
2338
+ "Wix": {
2339
+ "errorType": "status_code",
2340
+ "regexCheck": "^[\\w@-]+?$",
2341
+ "url": "https://{}.wix.com",
2342
+ "urlMain": "https://wix.com/",
2343
+ "username_claimed": "support"
2344
+ },
2345
+ "WolframalphaForum": {
2346
+ "errorType": "status_code",
2347
+ "url": "https://community.wolfram.com/web/{}/home",
2348
+ "urlMain": "https://community.wolfram.com/",
2349
+ "username_claimed": "unico"
2350
+ },
2351
+ "WordPress": {
2352
+ "errorType": "response_url",
2353
+ "errorUrl": "wordpress.com/typo/?subdomain=",
2354
+ "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
2355
+ "url": "https://{}.wordpress.com/",
2356
+ "urlMain": "https://wordpress.com",
2357
+ "username_claimed": "blue"
2358
+ },
2359
+ "WordPressOrg": {
2360
+ "errorType": "response_url",
2361
+ "errorUrl": "https://wordpress.org",
2362
+ "url": "https://profiles.wordpress.org/{}/",
2363
+ "urlMain": "https://wordpress.org/",
2364
+ "username_claimed": "blue"
2365
+ },
2366
+ "Wordnik": {
2367
+ "errorMsg": "Page Not Found",
2368
+ "errorType": "message",
2369
+ "regexCheck": "^[a-zA-Z0-9_.+-]{1,40}$",
2370
+ "url": "https://www.wordnik.com/users/{}",
2371
+ "urlMain": "https://www.wordnik.com/",
2372
+ "username_claimed": "blue"
2373
+ },
2374
+ "Wykop": {
2375
+ "errorType": "status_code",
2376
+ "url": "https://www.wykop.pl/ludzie/{}",
2377
+ "urlMain": "https://www.wykop.pl",
2378
+ "username_claimed": "blue"
2379
+ },
2380
+ "Xbox Gamertag": {
2381
+ "errorType": "status_code",
2382
+ "url": "https://xboxgamertag.com/search/{}",
2383
+ "urlMain": "https://xboxgamertag.com/",
2384
+ "username_claimed": "red"
2385
+ },
2386
+ "Xvideos": {
2387
+ "errorType": "status_code",
2388
+ "isNSFW": true,
2389
+ "url": "https://xvideos.com/profiles/{}",
2390
+ "urlMain": "https://xvideos.com/",
2391
+ "username_claimed": "blue"
2392
+ },
2393
+ "YandexMusic": {
2394
+ "__comment__": "The first and third errorMsg relate to geo-restrictions and bot detection/captchas.",
2395
+ "errorMsg": [
2396
+ "\u041e\u0448\u0438\u0431\u043a\u0430 404",
2397
+ "<meta name=\"description\" content=\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u0443\u044e \u043c\u0443\u0437\u044b\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c.",
2398
+ "<input type=\"submit\" class=\"CheckboxCaptcha-Button\""
2399
+ ],
2400
+ "errorType": "message",
2401
+ "url": "https://music.yandex/users/{}/playlists",
2402
+ "urlMain": "https://music.yandex",
2403
+ "username_claimed": "ya.playlist"
2404
+ },
2405
+ "YouNow": {
2406
+ "errorMsg": "No users found",
2407
+ "errorType": "message",
2408
+ "url": "https://www.younow.com/{}/",
2409
+ "urlMain": "https://www.younow.com/",
2410
+ "urlProbe": "https://api.younow.com/php/api/broadcast/info/user={}/",
2411
+ "username_claimed": "blue"
2412
+ },
2413
+ "YouPic": {
2414
+ "errorType": "status_code",
2415
+ "url": "https://youpic.com/photographer/{}/",
2416
+ "urlMain": "https://youpic.com/",
2417
+ "username_claimed": "blue"
2418
+ },
2419
+ "YouPorn": {
2420
+ "errorType": "status_code",
2421
+ "isNSFW": true,
2422
+ "url": "https://youporn.com/uservids/{}",
2423
+ "urlMain": "https://youporn.com",
2424
+ "username_claimed": "blue"
2425
+ },
2426
+ "YouTube": {
2427
+ "errorType": "status_code",
2428
+
2429
+ "url": "https://www.youtube.com/@{}",
2430
+ "urlMain": "https://www.youtube.com/",
2431
+ "username_claimed": "youtube"
2432
+ },
2433
+ "akniga": {
2434
+ "errorType": "status_code",
2435
+ "url": "https://akniga.org/profile/{}",
2436
+ "urlMain": "https://akniga.org/profile/blue/",
2437
+ "username_claimed": "blue"
2438
+ },
2439
+ "authorSTREAM": {
2440
+ "errorType": "status_code",
2441
+ "url": "http://www.authorstream.com/{}/",
2442
+ "urlMain": "http://www.authorstream.com/",
2443
+ "username_claimed": "blue"
2444
+ },
2445
+ "babyblogRU": {
2446
+ "errorType": "response_url",
2447
+ "errorUrl": "https://www.babyblog.ru/",
2448
+ "url": "https://www.babyblog.ru/user/{}",
2449
+ "urlMain": "https://www.babyblog.ru/",
2450
+ "username_claimed": "blue"
2451
+ },
2452
+ "chaos.social": {
2453
+ "errorType": "status_code",
2454
+ "url": "https://chaos.social/@{}",
2455
+ "urlMain": "https://chaos.social/",
2456
+ "username_claimed": "rixx"
2457
+ },
2458
+ "couchsurfing": {
2459
+ "errorType": "status_code",
2460
+ "url": "https://www.couchsurfing.com/people/{}",
2461
+ "urlMain": "https://www.couchsurfing.com/",
2462
+ "username_claimed": "blue"
2463
+ },
2464
+ "d3RU": {
2465
+ "errorType": "status_code",
2466
+ "url": "https://d3.ru/user/{}/posts",
2467
+ "urlMain": "https://d3.ru/",
2468
+ "username_claimed": "blue"
2469
+ },
2470
+ "dailykos": {
2471
+ "errorMsg": "{\"result\":true,\"message\":null}",
2472
+ "errorType": "message",
2473
+ "url": "https://www.dailykos.com/user/{}",
2474
+ "urlMain": "https://www.dailykos.com",
2475
+ "urlProbe": "https://www.dailykos.com/signup/check_nickname?nickname={}",
2476
+ "username_claimed": "blue"
2477
+ },
2478
+ "datingRU": {
2479
+ "errorType": "status_code",
2480
+ "url": "http://dating.ru/{}",
2481
+ "urlMain": "http://dating.ru",
2482
+ "username_claimed": "blue"
2483
+ },
2484
+ "devRant": {
2485
+ "errorType": "response_url",
2486
+ "errorUrl": "https://devrant.com/",
2487
+ "url": "https://devrant.com/users/{}",
2488
+ "urlMain": "https://devrant.com/",
2489
+ "username_claimed": "blue"
2490
+ },
2491
+ "drive2": {
2492
+ "errorType": "status_code",
2493
+ "url": "https://www.drive2.ru/users/{}",
2494
+ "urlMain": "https://www.drive2.ru/",
2495
+ "username_claimed": "blue"
2496
+ },
2497
+ "eGPU": {
2498
+ "errorType": "status_code",
2499
+ "url": "https://egpu.io/forums/profile/{}/",
2500
+ "urlMain": "https://egpu.io/",
2501
+ "username_claimed": "blue"
2502
+ },
2503
+ "eintracht": {
2504
+ "errorType": "status_code",
2505
+ "regexCheck": "^[^.]*?$",
2506
+ "url": "https://community.eintracht.de/fans/{}",
2507
+ "urlMain": "https://eintracht.de",
2508
+ "username_claimed": "blue"
2509
+ },
2510
+ "fixya": {
2511
+ "errorType": "status_code",
2512
+ "url": "https://www.fixya.com/users/{}",
2513
+ "urlMain": "https://www.fixya.com",
2514
+ "username_claimed": "adam"
2515
+ },
2516
+ "fl": {
2517
+ "errorType": "status_code",
2518
+ "url": "https://www.fl.ru/users/{}",
2519
+ "urlMain": "https://www.fl.ru/",
2520
+ "username_claimed": "blue"
2521
+ },
2522
+ "forum_guns": {
2523
+ "errorMsg": "action=https://forum.guns.ru/forummisc/blog/search",
2524
+ "errorType": "message",
2525
+ "url": "https://forum.guns.ru/forummisc/blog/{}",
2526
+ "urlMain": "https://forum.guns.ru/",
2527
+ "username_claimed": "red"
2528
+ },
2529
+ "freecodecamp": {
2530
+ "errorType": "status_code",
2531
+ "url": "https://www.freecodecamp.org/{}",
2532
+ "urlMain": "https://www.freecodecamp.org/",
2533
+ "urlProbe": "https://api.freecodecamp.org/api/users/get-public-profile?username={}",
2534
+ "username_claimed": "naveennamani"
2535
+ },
2536
+ "furaffinity": {
2537
+ "errorMsg": "This user cannot be found.",
2538
+ "errorType": "message",
2539
+ "url": "https://www.furaffinity.net/user/{}",
2540
+ "urlMain": "https://www.furaffinity.net",
2541
+ "username_claimed": "jesus"
2542
+ },
2543
+ "geocaching": {
2544
+ "errorType": "status_code",
2545
+ "url": "https://www.geocaching.com/p/default.aspx?u={}",
2546
+ "urlMain": "https://www.geocaching.com/",
2547
+ "username_claimed": "blue"
2548
+ },
2549
+ "habr": {
2550
+ "errorType": "status_code",
2551
+ "url": "https://habr.com/ru/users/{}",
2552
+ "urlMain": "https://habr.com/",
2553
+ "username_claimed": "blue"
2554
+ },
2555
+ "hackster": {
2556
+ "errorType": "status_code",
2557
+ "url": "https://www.hackster.io/{}",
2558
+ "urlMain": "https://www.hackster.io",
2559
+ "username_claimed": "blue"
2560
+ },
2561
+ "hunting": {
2562
+ "errorMsg": "\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.",
2563
+ "errorType": "message",
2564
+ "url": "https://www.hunting.ru/forum/members/?username={}",
2565
+ "urlMain": "https://www.hunting.ru/forum/",
2566
+ "username_claimed": "red"
2567
+ },
2568
+ "igromania": {
2569
+ "errorMsg": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.",
2570
+ "errorType": "message",
2571
+ "url": "http://forum.igromania.ru/member.php?username={}",
2572
+ "urlMain": "http://forum.igromania.ru/",
2573
+ "username_claimed": "blue"
2574
+ },
2575
+ "interpals": {
2576
+ "errorMsg": "The requested user does not exist or is inactive",
2577
+ "errorType": "message",
2578
+ "url": "https://www.interpals.net/{}",
2579
+ "urlMain": "https://www.interpals.net/",
2580
+ "username_claimed": "blue"
2581
+ },
2582
+ "irecommend": {
2583
+ "errorType": "status_code",
2584
+ "url": "https://irecommend.ru/users/{}",
2585
+ "urlMain": "https://irecommend.ru/",
2586
+ "username_claimed": "blue"
2587
+ },
2588
+ "jbzd.com.pl": {
2589
+ "errorType": "status_code",
2590
+ "url": "https://jbzd.com.pl/uzytkownik/{}",
2591
+ "urlMain": "https://jbzd.com.pl/",
2592
+ "username_claimed": "blue"
2593
+ },
2594
+ "jeuxvideo": {
2595
+ "errorType": "status_code",
2596
+ "request_method": "GET",
2597
+ "url": "https://www.jeuxvideo.com/profil/{}",
2598
+ "urlMain": "https://www.jeuxvideo.com",
2599
+ "urlProbe": "https://www.jeuxvideo.com/profil/{}?mode=infos",
2600
+ "username_claimed": "adam"
2601
+ },
2602
+ "kofi": {
2603
+ "errorType": "response_url",
2604
+ "errorUrl": "https://ko-fi.com/art?=redirect",
2605
+ "url": "https://ko-fi.com/{}",
2606
+ "urlMain": "https://ko-fi.com",
2607
+ "username_claimed": "yeahkenny"
2608
+ },
2609
+ "kwork": {
2610
+ "errorType": "status_code",
2611
+ "url": "https://kwork.ru/user/{}",
2612
+ "urlMain": "https://www.kwork.ru/",
2613
+ "username_claimed": "blue"
2614
+ },
2615
+ "last.fm": {
2616
+ "errorType": "status_code",
2617
+ "url": "https://last.fm/user/{}",
2618
+ "urlMain": "https://last.fm/",
2619
+ "username_claimed": "blue"
2620
+ },
2621
+ "leasehackr": {
2622
+ "errorType": "status_code",
2623
+ "url": "https://forum.leasehackr.com/u/{}/summary/",
2624
+ "urlMain": "https://forum.leasehackr.com/",
2625
+ "username_claimed": "adam"
2626
+ },
2627
+ "livelib": {
2628
+ "errorType": "status_code",
2629
+ "url": "https://www.livelib.ru/reader/{}",
2630
+ "urlMain": "https://www.livelib.ru/",
2631
+ "username_claimed": "blue"
2632
+ },
2633
+ "mastodon.cloud": {
2634
+ "errorType": "status_code",
2635
+ "url": "https://mastodon.cloud/@{}",
2636
+ "urlMain": "https://mastodon.cloud/",
2637
+ "username_claimed": "TheAdmin"
2638
+ },
2639
+ "mastodon.social": {
2640
+ "errorType": "status_code",
2641
+ "url": "https://mastodon.social/@{}",
2642
+ "urlMain": "https://chaos.social/",
2643
+ "username_claimed": "Gargron"
2644
+ },
2645
+ "mastodon.xyz": {
2646
+ "errorType": "status_code",
2647
+ "url": "https://mastodon.xyz/@{}",
2648
+ "urlMain": "https://mastodon.xyz/",
2649
+ "username_claimed": "TheKinrar"
2650
+ },
2651
+ "mercadolivre": {
2652
+ "errorType": "status_code",
2653
+ "url": "https://www.mercadolivre.com.br/perfil/{}",
2654
+ "urlMain": "https://www.mercadolivre.com.br",
2655
+ "username_claimed": "blue"
2656
+ },
2657
+ "minds": {
2658
+ "errorMsg": "\"valid\":true",
2659
+ "errorType": "message",
2660
+ "url": "https://www.minds.com/{}/",
2661
+ "urlMain": "https://www.minds.com",
2662
+ "urlProbe": "https://www.minds.com/api/v3/register/validate?username={}",
2663
+ "username_claimed": "john"
2664
+ },
2665
+ "moikrug": {
2666
+ "errorType": "status_code",
2667
+ "url": "https://moikrug.ru/{}",
2668
+ "urlMain": "https://moikrug.ru/",
2669
+ "username_claimed": "blue"
2670
+ },
2671
+ "mstdn.io": {
2672
+ "errorType": "status_code",
2673
+ "url": "https://mstdn.io/@{}",
2674
+ "urlMain": "https://mstdn.io/",
2675
+ "username_claimed": "blue"
2676
+ },
2677
+ "nairaland.com": {
2678
+ "errorType": "status_code",
2679
+ "url": "https://www.nairaland.com/{}",
2680
+ "urlMain": "https://www.nairaland.com/",
2681
+ "username_claimed": "red"
2682
+ },
2683
+ "nnRU": {
2684
+ "errorType": "status_code",
2685
+ "regexCheck": "^[\\w@-]+?$",
2686
+ "url": "https://{}.www.nn.ru/",
2687
+ "urlMain": "https://www.nn.ru/",
2688
+ "username_claimed": "blue"
2689
+ },
2690
+ "note": {
2691
+ "errorType": "status_code",
2692
+ "url": "https://note.com/{}",
2693
+ "urlMain": "https://note.com/",
2694
+ "username_claimed": "blue"
2695
+ },
2696
+ "npm": {
2697
+ "errorType": "status_code",
2698
+ "url": "https://www.npmjs.com/~{}",
2699
+ "urlMain": "https://www.npmjs.com/",
2700
+ "username_claimed": "kennethsweezy"
2701
+ },
2702
+ "omg.lol": {
2703
+ "errorMsg": "\"available\": true",
2704
+ "errorType": "message",
2705
+ "url": "https://{}.omg.lol",
2706
+ "urlMain": "https://home.omg.lol",
2707
+ "urlProbe": "https://api.omg.lol/address/{}/availability",
2708
+ "username_claimed": "adam"
2709
+ },
2710
+ "opennet": {
2711
+ "errorMsg": "\u0418\u043c\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e",
2712
+ "errorType": "message",
2713
+ "regexCheck": "^[^-]*$",
2714
+ "url": "https://www.opennet.ru/~{}",
2715
+ "urlMain": "https://www.opennet.ru/",
2716
+ "username_claimed": "anonismus"
2717
+ },
2718
+ "osu!": {
2719
+ "errorType": "status_code",
2720
+ "url": "https://osu.ppy.sh/users/{}",
2721
+ "urlMain": "https://osu.ppy.sh/",
2722
+ "username_claimed": "blue"
2723
+ },
2724
+ "phpRU": {
2725
+ "errorMsg": "\u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043e\u0435 \u0438\u043c\u044f.",
2726
+ "errorType": "message",
2727
+ "url": "https://php.ru/forum/members/?username={}",
2728
+ "urlMain": "https://php.ru/forum/",
2729
+ "username_claimed": "apple"
2730
+ },
2731
+ "pikabu": {
2732
+ "errorType": "status_code",
2733
+ "url": "https://pikabu.ru/@{}",
2734
+ "urlMain": "https://pikabu.ru/",
2735
+ "username_claimed": "blue"
2736
+ },
2737
+ "pr0gramm": {
2738
+ "errorType": "status_code",
2739
+ "url": "https://pr0gramm.com/user/{}",
2740
+ "urlMain": "https://pr0gramm.com/",
2741
+ "urlProbe": "https://pr0gramm.com/api/profile/info?name={}",
2742
+ "username_claimed": "cha0s"
2743
+ },
2744
+ "prog.hu": {
2745
+ "errorType": "response_url",
2746
+ "errorUrl": "https://prog.hu/azonosito/info/{}",
2747
+ "url": "https://prog.hu/azonosito/info/{}",
2748
+ "urlMain": "https://prog.hu/",
2749
+ "username_claimed": "Sting"
2750
+ },
2751
+ "satsisRU": {
2752
+ "errorType": "status_code",
2753
+ "url": "https://satsis.info/user/{}",
2754
+ "urlMain": "https://satsis.info/",
2755
+ "username_claimed": "red"
2756
+ },
2757
+ "sessionize": {
2758
+ "errorType": "status_code",
2759
+ "url": "https://sessionize.com/{}",
2760
+ "urlMain": "https://sessionize.com/",
2761
+ "username_claimed": "jason-mayes"
2762
+ },
2763
+ "social.tchncs.de": {
2764
+ "errorType": "status_code",
2765
+ "url": "https://social.tchncs.de/@{}",
2766
+ "urlMain": "https://social.tchncs.de/",
2767
+ "username_claimed": "Milan"
2768
+ },
2769
+ "spletnik": {
2770
+ "errorType": "status_code",
2771
+ "url": "https://spletnik.ru/user/{}",
2772
+ "urlMain": "https://spletnik.ru/",
2773
+ "username_claimed": "blue"
2774
+ },
2775
+ "svidbook": {
2776
+ "errorType": "status_code",
2777
+ "url": "https://www.svidbook.ru/user/{}",
2778
+ "urlMain": "https://www.svidbook.ru/",
2779
+ "username_claimed": "green"
2780
+ },
2781
+ "threads": {
2782
+ "errorMsg": "<title>Threads</title>",
2783
+ "errorType": "message",
2784
+ "headers": {
2785
+ "Sec-Fetch-Mode": "navigate"
2786
+ },
2787
+ "url": "https://www.threads.net/@{}",
2788
+ "urlMain": "https://www.threads.net/",
2789
+ "username_claimed": "zuck"
2790
+ },
2791
+ "toster": {
2792
+ "errorType": "status_code",
2793
+ "url": "https://www.toster.ru/user/{}/answers",
2794
+ "urlMain": "https://www.toster.ru/",
2795
+ "username_claimed": "adam"
2796
+ },
2797
+ "tumblr": {
2798
+ "errorType": "status_code",
2799
+ "url": "https://{}.tumblr.com/",
2800
+ "urlMain": "https://www.tumblr.com/",
2801
+ "username_claimed": "goku"
2802
+ },
2803
+ "uid": {
2804
+ "errorType": "status_code",
2805
+ "url": "http://uid.me/{}",
2806
+ "urlMain": "https://uid.me/",
2807
+ "username_claimed": "blue"
2808
+ },
2809
+ "write.as": {
2810
+ "errorType": "status_code",
2811
+ "url": "https://write.as/{}",
2812
+ "urlMain": "https://write.as",
2813
+ "username_claimed": "pylapp"
2814
+ },
2815
+ "xHamster": {
2816
+ "errorType": "status_code",
2817
+ "isNSFW": true,
2818
+ "url": "https://xhamster.com/users/{}",
2819
+ "urlMain": "https://xhamster.com",
2820
+ "urlProbe": "https://xhamster.com/users/{}?old_browser=true",
2821
+ "username_claimed": "blue"
2822
+ },
2823
+ "znanylekarz.pl": {
2824
+ "errorType": "status_code",
2825
+ "url": "https://www.znanylekarz.pl/{}",
2826
+ "urlMain": "https://znanylekarz.pl",
2827
+ "username_claimed": "janusz-nowak"
2828
+ },
2829
+ "Bluesky": {
2830
+ "errorType": "status_code",
2831
+ "url": "https://bsky.app/profile/{}.bsky.social",
2832
+ "urlProbe": "https://public.api.bsky.app/xrpc/app.bsky.actor.getProfile?actor={}.bsky.social",
2833
+ "urlMain": "https://bsky.app/",
2834
+ "username_claimed": "mcuban"
2835
+ },
2836
+ "Platzi": {
2837
+ "errorType": "status_code",
2838
+ "errorCode": 404,
2839
+ "url": "https://platzi.com/p/{}/",
2840
+ "urlMain": "https://platzi.com/",
2841
+ "username_claimed": "freddier",
2842
+ "request_method": "GET"
2843
+ }
2844
+ }
false_positive_exclusions.txt ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ APClips
2
+ Coders Rank
3
+ CyberDefenders
4
+ Freelance.habr
5
+ GNOME VCS
6
+ Giphy
7
+ HackerEarth
8
+ Heavy-R
9
+ LessWrong
10
+ LushStories
11
+ Mydramalist
12
+ PepperIT
13
+ PocketStars
14
+ Reddit
15
+ RocketTube
16
+ RuneScape
17
+ SlideShare
18
+ Splice
19
+ Spotify
20
+ Topcoder
21
+ Weblate
22
+ YandexMusic
23
+ kaskus
24
+ opennet
25
+ svidbook
26
+ threads
pyproject.toml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "sherlock-osint"
3
+ version = "1.0.0"
4
+ description = "Modular OSINT tool for username searching"
5
+ authors = [
6
+ {name = "Sherlock OSINT Team", email = "team@sherlock-osint.com"}
7
+ ]
8
+ readme = "README.md"
9
+ requires-python = ">=3.8"
10
+ dependencies = [
11
+ "gradio>=4.0.0",
12
+ "requests>=2.31.0",
13
+ "aiohttp>=3.8.0",
14
+ "asyncio-throttle>=1.0.0",
15
+ "colorama>=0.4.6",
16
+ "pydantic>=2.0.0",
17
+ "python-dotenv>=1.0.0",
18
+ "uvicorn>=0.23.0",
19
+ "fastapi>=0.100.0",
20
+ ]
21
+
22
+ [project.optional-dependencies]
23
+ dev = [
24
+ "pytest>=7.0.0",
25
+ "black>=23.0.0",
26
+ "flake8>=6.0.0",
27
+ "mypy>=1.0.0",
28
+ ]
29
+
30
+ [build-system]
31
+ requires = ["hatchling"]
32
+ build-backend = "hatchling.build"
33
+
34
+ [tool.black]
35
+ line-length = 88
36
+ target-version = ['py38']
37
+
38
+ [tool.mypy]
39
+ python_version = "3.8"
40
+ warn_return_any = true
41
+ warn_unused_configs = true
42
+ disallow_untyped_defs = true
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Sherlock OSINT Tool Dependencies for Hugging Face Spaces
2
+ gradio>=4.44.0
3
+ requests>=2.31.0
4
+ aiohttp>=3.8.0
5
+ asyncio-throttle>=1.0.0
6
+ colorama>=0.4.6
7
+ python-dotenv>=1.0.0
setup.py ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Setup script for Sherlock OSINT Tool
4
+ """
5
+
6
+ import subprocess
7
+ import sys
8
+ from pathlib import Path
9
+
10
+
11
+ def run_command(command: str, description: str) -> bool:
12
+ """Run a command and return success status."""
13
+ print(f"πŸ”„ {description}...")
14
+ try:
15
+ result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True)
16
+ print(f"βœ… {description} completed successfully")
17
+ return True
18
+ except subprocess.CalledProcessError as e:
19
+ print(f"❌ {description} failed: {e}")
20
+ if e.stdout:
21
+ print(f"STDOUT: {e.stdout}")
22
+ if e.stderr:
23
+ print(f"STDERR: {e.stderr}")
24
+ return False
25
+
26
+
27
+ def check_uv_installed() -> bool:
28
+ """Check if UV is installed."""
29
+ try:
30
+ result = subprocess.run(["uv", "--version"], capture_output=True, text=True)
31
+ print(f"βœ… UV is installed: {result.stdout.strip()}")
32
+ return True
33
+ except FileNotFoundError:
34
+ print("❌ UV is not installed")
35
+ return False
36
+
37
+
38
+ def install_uv() -> bool:
39
+ """Install UV package manager."""
40
+ print("πŸ”„ Installing UV package manager...")
41
+ try:
42
+ # Try to install UV
43
+ install_cmd = "curl -LsSf https://astral.sh/uv/install.sh | sh"
44
+ result = subprocess.run(install_cmd, shell=True, check=True)
45
+ print("βœ… UV installed successfully")
46
+ return True
47
+ except subprocess.CalledProcessError:
48
+ print("❌ Failed to install UV automatically")
49
+ print("Please install UV manually: https://astral.sh/uv/")
50
+ return False
51
+
52
+
53
+ def setup_environment() -> bool:
54
+ """Set up the Python environment."""
55
+ print("\nπŸš€ Setting up Sherlock OSINT Tool environment...")
56
+
57
+ # Check if UV is installed
58
+ if not check_uv_installed():
59
+ if not install_uv():
60
+ return False
61
+
62
+ # Create virtual environment and install dependencies
63
+ commands = [
64
+ ("uv sync", "Installing dependencies with UV"),
65
+ ("uv run python test_sherlock.py", "Running tests"),
66
+ ]
67
+
68
+ success = True
69
+ for command, description in commands:
70
+ if not run_command(command, description):
71
+ success = False
72
+ break
73
+
74
+ return success
75
+
76
+
77
+ def main():
78
+ """Main setup function."""
79
+ print("πŸ” Sherlock OSINT Tool Setup")
80
+ print("=" * 40)
81
+
82
+ # Check if we're in the right directory
83
+ if not Path("data.json").exists():
84
+ print("❌ data.json not found. Please run this script from the sherlock directory.")
85
+ sys.exit(1)
86
+
87
+ # Set up environment
88
+ if setup_environment():
89
+ print("\nπŸŽ‰ Setup completed successfully!")
90
+ print("\nπŸ“‹ Next steps:")
91
+ print("1. Copy .env.example to .env and configure if needed")
92
+ print("2. Run the web interface: uv run python app.py")
93
+ print("3. Or run CLI: uv run python -m sherlock.cli --help")
94
+ print("\n🌐 Web interface will be available at: http://localhost:7860")
95
+ else:
96
+ print("\n❌ Setup failed. Please check the errors above.")
97
+ sys.exit(1)
98
+
99
+
100
+ if __name__ == "__main__":
101
+ main()
simple_test.py ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Simple test without external dependencies
4
+ """
5
+
6
+ import json
7
+ import sys
8
+ from pathlib import Path
9
+
10
+ def test_data_loading():
11
+ """Test if data.json can be loaded."""
12
+ try:
13
+ with open("data.json", "r") as f:
14
+ data = json.load(f)
15
+
16
+ print(f"βœ… Successfully loaded {len(data)} website configurations")
17
+
18
+ # Show a few examples
19
+ examples = list(data.keys())[:5]
20
+ print(f"πŸ“‹ Example websites: {', '.join(examples)}")
21
+
22
+ return True
23
+ except Exception as e:
24
+ print(f"❌ Failed to load data.json: {e}")
25
+ return False
26
+
27
+ def test_project_structure():
28
+ """Test if project structure is correct."""
29
+ required_files = [
30
+ "data.json",
31
+ "app.py",
32
+ "pyproject.toml",
33
+ "requirements.txt",
34
+ "README.md",
35
+ "src/sherlock/__init__.py",
36
+ "src/sherlock/core/search_engine.py",
37
+ "src/sherlock/web/gradio_interface.py",
38
+ "src/sherlock/config/settings.py",
39
+ "src/sherlock/utils/output.py"
40
+ ]
41
+
42
+ missing_files = []
43
+ for file_path in required_files:
44
+ if not Path(file_path).exists():
45
+ missing_files.append(file_path)
46
+
47
+ if missing_files:
48
+ print(f"❌ Missing files: {', '.join(missing_files)}")
49
+ return False
50
+ else:
51
+ print(f"βœ… All {len(required_files)} required files present")
52
+ return True
53
+
54
+ def main():
55
+ """Run simple tests."""
56
+ print("πŸ§ͺ Simple Sherlock OSINT Tool Test")
57
+ print("=" * 40)
58
+
59
+ tests = [
60
+ ("Project Structure", test_project_structure),
61
+ ("Data Loading", test_data_loading),
62
+ ]
63
+
64
+ passed = 0
65
+ for test_name, test_func in tests:
66
+ print(f"\nπŸ”„ Running {test_name} test...")
67
+ if test_func():
68
+ passed += 1
69
+ print(f"βœ… {test_name} test PASSED")
70
+ else:
71
+ print(f"❌ {test_name} test FAILED")
72
+
73
+ print("\n" + "=" * 40)
74
+ print(f"πŸ“Š Results: {passed}/{len(tests)} tests passed")
75
+
76
+ if passed == len(tests):
77
+ print("πŸŽ‰ Basic structure test passed!")
78
+ print("\nπŸ“‹ Next steps:")
79
+ print("1. Install UV: curl -LsSf https://astral.sh/uv/install.sh | sh")
80
+ print("2. Install dependencies: uv sync")
81
+ print("3. Run the tool: uv run python app.py")
82
+ else:
83
+ print("⚠️ Some tests failed. Please check the project structure.")
84
+
85
+ if __name__ == "__main__":
86
+ main()
src/sherlock/__init__.py ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ """
2
+ Sherlock OSINT Tool
3
+ A modular OSINT tool for username searching across multiple platforms.
4
+ """
5
+
6
+ __version__ = "1.0.0"
7
+ __author__ = "Sherlock OSINT Team"
src/sherlock/cli.py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Command Line Interface for Sherlock OSINT tool."""
2
+
3
+ import argparse
4
+ import asyncio
5
+ import sys
6
+ from typing import List, Optional
7
+ from pathlib import Path
8
+
9
+ from .core.search_engine import OSINTSearchEngine
10
+ from .config.website_config import WebsiteManager
11
+ from .utils.output import ResultExporter, format_results_summary
12
+
13
+
14
+ async def search_username_cli(
15
+ username: str,
16
+ websites: Optional[List[str]] = None,
17
+ include_nsfw: bool = False,
18
+ export_format: str = "json",
19
+ output_dir: str = "./results"
20
+ ) -> None:
21
+ """Search username via CLI."""
22
+
23
+ print(f"πŸ” Searching for username: {username}")
24
+ print(f"πŸ“Š Websites: {len(websites) if websites else 'All'}")
25
+ print(f"πŸ”ž NSFW Sites: {'Included' if include_nsfw else 'Excluded'}")
26
+ print(f"πŸ’Ύ Export Format: {export_format}")
27
+ print("-" * 50)
28
+
29
+ try:
30
+ # Initialize components
31
+ website_manager = WebsiteManager()
32
+ exporter = ResultExporter(output_dir)
33
+
34
+ # Perform search
35
+ async with OSINTSearchEngine(website_manager) as engine:
36
+ results = await engine.search_username(
37
+ username=username,
38
+ websites=websites,
39
+ include_nsfw=include_nsfw
40
+ )
41
+
42
+ # Display results
43
+ print(format_results_summary(results))
44
+
45
+ # Export results
46
+ if export_format.lower() != "none" and results:
47
+ if export_format.lower() == "json":
48
+ filepath = exporter.export_json(results, username)
49
+ elif export_format.lower() == "csv":
50
+ filepath = exporter.export_csv(results, username)
51
+ elif export_format.lower() == "html":
52
+ filepath = exporter.export_html(results, username)
53
+ else:
54
+ print(f"❌ Invalid export format: {export_format}")
55
+ return
56
+
57
+ print(f"βœ… Results exported to: {filepath}")
58
+
59
+ except Exception as e:
60
+ print(f"❌ Error during search: {e}")
61
+ sys.exit(1)
62
+
63
+
64
+ def list_websites() -> None:
65
+ """List all available websites."""
66
+ website_manager = WebsiteManager()
67
+ websites = website_manager.get_all_websites()
68
+
69
+ print("🌐 Available Websites:")
70
+ print("-" * 50)
71
+
72
+ sfw_count = 0
73
+ nsfw_count = 0
74
+
75
+ for name, config in websites.items():
76
+ nsfw_indicator = "πŸ”ž" if config.is_nsfw else "βœ…"
77
+ print(f"{nsfw_indicator} {name}")
78
+
79
+ if config.is_nsfw:
80
+ nsfw_count += 1
81
+ else:
82
+ sfw_count += 1
83
+
84
+ print("-" * 50)
85
+ print(f"πŸ“Š Total: {len(websites)} websites")
86
+ print(f"βœ… SFW: {sfw_count}")
87
+ print(f"πŸ”ž NSFW: {nsfw_count}")
88
+
89
+
90
+ def main():
91
+ """Main CLI function."""
92
+ parser = argparse.ArgumentParser(
93
+ description="Sherlock OSINT Tool - Username Search",
94
+ formatter_class=argparse.RawDescriptionHelpFormatter,
95
+ epilog="""
96
+ Examples:
97
+ python -m sherlock.cli john_doe
98
+ python -m sherlock.cli test_user --websites GitHub Twitter Instagram
99
+ python -m sherlock.cli sample_user --include-nsfw --export html
100
+ python -m sherlock.cli --list-websites
101
+ """
102
+ )
103
+
104
+ parser.add_argument(
105
+ "username",
106
+ nargs="?",
107
+ help="Username to search for"
108
+ )
109
+
110
+ parser.add_argument(
111
+ "--websites",
112
+ nargs="+",
113
+ help="Specific websites to search (space-separated)"
114
+ )
115
+
116
+ parser.add_argument(
117
+ "--include-nsfw",
118
+ action="store_true",
119
+ help="Include NSFW websites in search"
120
+ )
121
+
122
+ parser.add_argument(
123
+ "--export",
124
+ choices=["none", "json", "csv", "html"],
125
+ default="json",
126
+ help="Export format for results (default: json)"
127
+ )
128
+
129
+ parser.add_argument(
130
+ "--output-dir",
131
+ default="./results",
132
+ help="Output directory for exported files (default: ./results)"
133
+ )
134
+
135
+ parser.add_argument(
136
+ "--list-websites",
137
+ action="store_true",
138
+ help="List all available websites"
139
+ )
140
+
141
+ args = parser.parse_args()
142
+
143
+ if args.list_websites:
144
+ list_websites()
145
+ return
146
+
147
+ if not args.username:
148
+ parser.error("Username is required (or use --list-websites)")
149
+
150
+ # Run async search
151
+ asyncio.run(search_username_cli(
152
+ username=args.username,
153
+ websites=args.websites,
154
+ include_nsfw=args.include_nsfw,
155
+ export_format=args.export,
156
+ output_dir=args.output_dir
157
+ ))
158
+
159
+
160
+ if __name__ == "__main__":
161
+ main()
src/sherlock/config/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Configuration management for Sherlock OSINT tool."""
src/sherlock/config/settings.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Application settings and configuration management."""
2
+
3
+ import os
4
+ from typing import Optional
5
+ from dotenv import load_dotenv
6
+
7
+ # Load environment variables
8
+ load_dotenv()
9
+
10
+
11
+ class Settings:
12
+ """Application settings."""
13
+
14
+ def __init__(self):
15
+ """Initialize settings from environment variables."""
16
+ # Environment
17
+ self.debug = os.getenv("DEBUG", "False").lower() == "true"
18
+ self.log_level = os.getenv("LOG_LEVEL", "INFO")
19
+
20
+ # Request settings
21
+ self.max_concurrent_requests = int(os.getenv("MAX_CONCURRENT_REQUESTS", "10"))
22
+ self.request_timeout = int(os.getenv("REQUEST_TIMEOUT", "10"))
23
+ self.user_agent = os.getenv("USER_AGENT", "SherlockOSINT/1.0.0")
24
+
25
+ # Web interface settings
26
+ self.gradio_server_name = os.getenv("GRADIO_SERVER_NAME", "0.0.0.0")
27
+ self.gradio_server_port = int(os.getenv("GRADIO_SERVER_PORT", "7860"))
28
+ self.gradio_share = os.getenv("GRADIO_SHARE", "False").lower() == "true"
29
+
30
+ # Output settings
31
+ self.save_results = os.getenv("SAVE_RESULTS", "True").lower() == "true"
32
+ self.output_directory = os.getenv("OUTPUT_DIRECTORY", "./results")
33
+
34
+
35
+ # Global settings instance
36
+ settings = Settings()
src/sherlock/config/website_config.py ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Website configuration management for OSINT searches."""
2
+
3
+ import json
4
+ import re
5
+ from typing import Dict, List, Optional, Any
6
+ from pathlib import Path
7
+ from pydantic import BaseModel, Field
8
+
9
+
10
+ class WebsiteConfig(BaseModel):
11
+ """Configuration for a single website."""
12
+
13
+ name: str
14
+ url: str
15
+ url_main: str
16
+ username_claimed: str
17
+ error_type: str = "status_code" # status_code, message, response_url
18
+ error_msg: Optional[List[str]] = None
19
+ regex_check: Optional[str] = None
20
+ is_nsfw: bool = False
21
+ headers: Optional[Dict[str, str]] = None
22
+
23
+ def is_valid_username(self, username: str) -> bool:
24
+ """Check if username matches the regex pattern."""
25
+ if not self.regex_check:
26
+ return True
27
+ return bool(re.match(self.regex_check, username))
28
+
29
+
30
+ class WebsiteManager:
31
+ """Manages website configurations for OSINT searches."""
32
+
33
+ def __init__(self, config_file: str = "data.json"):
34
+ """Initialize with configuration file."""
35
+ self.config_file = Path(config_file)
36
+ self.websites: Dict[str, WebsiteConfig] = {}
37
+ self.load_configurations()
38
+
39
+ def load_configurations(self) -> None:
40
+ """Load website configurations from JSON file."""
41
+ try:
42
+ if not self.config_file.exists():
43
+ raise FileNotFoundError(f"Configuration file {self.config_file} not found")
44
+
45
+ with open(self.config_file, 'r', encoding='utf-8') as f:
46
+ data = json.load(f)
47
+
48
+ for site_name, site_data in data.items():
49
+ config = WebsiteConfig(
50
+ name=site_name,
51
+ url=site_data.get("url", ""),
52
+ url_main=site_data.get("urlMain", ""),
53
+ username_claimed=site_data.get("username_claimed", ""),
54
+ error_type=site_data.get("errorType", "status_code"),
55
+ error_msg=site_data.get("errorMsg"),
56
+ regex_check=site_data.get("regexCheck"),
57
+ is_nsfw=site_data.get("isNSFW", False),
58
+ headers=site_data.get("headers")
59
+ )
60
+ self.websites[site_name] = config
61
+
62
+ except Exception as e:
63
+ print(f"Error loading configurations: {e}")
64
+ self.websites = {}
65
+
66
+ def get_website(self, name: str) -> Optional[WebsiteConfig]:
67
+ """Get configuration for a specific website."""
68
+ return self.websites.get(name)
69
+
70
+ def get_all_websites(self) -> Dict[str, WebsiteConfig]:
71
+ """Get all website configurations."""
72
+ return self.websites
73
+
74
+ def get_websites_by_category(self, nsfw_only: bool = False) -> Dict[str, WebsiteConfig]:
75
+ """Get websites filtered by NSFW category."""
76
+ if nsfw_only:
77
+ return {name: config for name, config in self.websites.items() if config.is_nsfw}
78
+ else:
79
+ return {name: config for name, config in self.websites.items() if not config.is_nsfw}
80
+
81
+ def search_websites(self, query: str) -> Dict[str, WebsiteConfig]:
82
+ """Search websites by name."""
83
+ query_lower = query.lower()
84
+ return {
85
+ name: config for name, config in self.websites.items()
86
+ if query_lower in name.lower()
87
+ }
src/sherlock/core/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Core OSINT functionality for Sherlock."""
src/sherlock/core/search_engine.py ADDED
@@ -0,0 +1,209 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Core search engine for OSINT username searches."""
2
+
3
+ import asyncio
4
+ import aiohttp
5
+ import time
6
+ from typing import Dict, List, Optional, Tuple, Any
7
+ from dataclasses import dataclass
8
+ from asyncio_throttle import Throttler
9
+ from urllib.parse import urlparse
10
+
11
+ from ..config.settings import settings
12
+ from ..config.website_config import WebsiteConfig, WebsiteManager
13
+
14
+
15
+ @dataclass
16
+ class SearchResult:
17
+ """Result of a username search on a single website."""
18
+
19
+ website: str
20
+ username: str
21
+ url: str
22
+ status: str # "claimed", "available", "error", "timeout"
23
+ response_time: float
24
+ status_code: Optional[int] = None
25
+ error_message: Optional[str] = None
26
+ is_nsfw: bool = False
27
+
28
+
29
+ class OSINTSearchEngine:
30
+ """Main OSINT search engine for username searches."""
31
+
32
+ def __init__(self, website_manager: WebsiteManager):
33
+ """Initialize the search engine."""
34
+ self.website_manager = website_manager
35
+ self.throttler = Throttler(rate_limit=settings.max_concurrent_requests)
36
+ self.session: Optional[aiohttp.ClientSession] = None
37
+
38
+ async def __aenter__(self):
39
+ """Async context manager entry."""
40
+ headers = {
41
+ 'User-Agent': settings.user_agent,
42
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
43
+ 'Accept-Language': 'en-US,en;q=0.5',
44
+ 'Accept-Encoding': 'gzip, deflate',
45
+ 'Connection': 'keep-alive',
46
+ }
47
+
48
+ timeout = aiohttp.ClientTimeout(total=settings.request_timeout)
49
+ self.session = aiohttp.ClientSession(
50
+ headers=headers,
51
+ timeout=timeout,
52
+ connector=aiohttp.TCPConnector(limit=100)
53
+ )
54
+ return self
55
+
56
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
57
+ """Async context manager exit."""
58
+ if self.session:
59
+ await self.session.close()
60
+
61
+ async def search_username(
62
+ self,
63
+ username: str,
64
+ websites: Optional[List[str]] = None,
65
+ include_nsfw: bool = False
66
+ ) -> List[SearchResult]:
67
+ """Search for username across multiple websites."""
68
+
69
+ if not self.session:
70
+ raise RuntimeError("Search engine not initialized. Use async context manager.")
71
+
72
+ # Filter websites
73
+ if websites:
74
+ target_websites = {
75
+ name: config for name, config in self.website_manager.get_all_websites().items()
76
+ if name in websites
77
+ }
78
+ else:
79
+ target_websites = self.website_manager.get_websites_by_category(nsfw_only=include_nsfw)
80
+
81
+ # Validate username for each website
82
+ valid_websites = {
83
+ name: config for name, config in target_websites.items()
84
+ if config.is_valid_username(username)
85
+ }
86
+
87
+ if not valid_websites:
88
+ return []
89
+
90
+ # Create search tasks
91
+ tasks = [
92
+ self._search_single_website(username, name, config)
93
+ for name, config in valid_websites.items()
94
+ ]
95
+
96
+ # Execute searches with throttling
97
+ results = await asyncio.gather(*tasks, return_exceptions=True)
98
+
99
+ # Filter out exceptions and return valid results
100
+ valid_results = []
101
+ for result in results:
102
+ if isinstance(result, SearchResult):
103
+ valid_results.append(result)
104
+ elif isinstance(result, Exception):
105
+ print(f"Search error: {result}")
106
+
107
+ return valid_results
108
+
109
+ async def _search_single_website(
110
+ self,
111
+ username: str,
112
+ website_name: str,
113
+ config: WebsiteConfig
114
+ ) -> SearchResult:
115
+ """Search username on a single website."""
116
+
117
+ async with self.throttler:
118
+ start_time = time.time()
119
+
120
+ try:
121
+ # Construct URL
122
+ url = config.url.format(username)
123
+
124
+ # Make request
125
+ async with self.session.get(url) as response:
126
+ response_time = time.time() - start_time
127
+
128
+ # Determine status based on error type
129
+ status = self._determine_status(response, config)
130
+
131
+ return SearchResult(
132
+ website=website_name,
133
+ username=username,
134
+ url=url,
135
+ status=status,
136
+ response_time=response_time,
137
+ status_code=response.status,
138
+ is_nsfw=config.is_nsfw
139
+ )
140
+
141
+ except asyncio.TimeoutError:
142
+ return SearchResult(
143
+ website=website_name,
144
+ username=username,
145
+ url=config.url.format(username),
146
+ status="timeout",
147
+ response_time=time.time() - start_time,
148
+ error_message="Request timeout"
149
+ )
150
+ except Exception as e:
151
+ return SearchResult(
152
+ website=website_name,
153
+ username=username,
154
+ url=config.url.format(username),
155
+ status="error",
156
+ response_time=time.time() - start_time,
157
+ error_message=str(e)
158
+ )
159
+
160
+ def _determine_status(self, response: aiohttp.ClientResponse, config: WebsiteConfig) -> str:
161
+ """Determine if username is claimed or available based on response."""
162
+
163
+ if config.error_type == "status_code":
164
+ # Username is claimed if status code is not 404
165
+ return "claimed" if response.status != 404 else "available"
166
+
167
+ elif config.error_type == "message":
168
+ if not config.error_msg:
169
+ return "claimed" if response.status == 200 else "available"
170
+
171
+ # Check if error message is in response text
172
+ try:
173
+ response_text = response.text.lower()
174
+ for error_msg in config.error_msg:
175
+ if error_msg.lower() in response_text:
176
+ return "available"
177
+ return "claimed"
178
+ except:
179
+ return "claimed" if response.status == 200 else "available"
180
+
181
+ elif config.error_type == "response_url":
182
+ # Check if response URL indicates error
183
+ response_url = str(response.url)
184
+ if "error" in response_url.lower() or "404" in response_url:
185
+ return "available"
186
+ return "claimed"
187
+
188
+ else:
189
+ # Default behavior
190
+ return "claimed" if response.status == 200 else "available"
191
+
192
+ def get_available_websites(self) -> List[str]:
193
+ """Get list of available website names."""
194
+ return list(self.website_manager.get_all_websites().keys())
195
+
196
+ def get_website_info(self, website_name: str) -> Optional[Dict[str, Any]]:
197
+ """Get information about a specific website."""
198
+ config = self.website_manager.get_website(website_name)
199
+ if not config:
200
+ return None
201
+
202
+ return {
203
+ "name": config.name,
204
+ "url": config.url,
205
+ "url_main": config.url_main,
206
+ "error_type": config.error_type,
207
+ "regex_check": config.regex_check,
208
+ "is_nsfw": config.is_nsfw
209
+ }
src/sherlock/main.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Main entry point for Sherlock OSINT tool."""
2
+
3
+ import sys
4
+ import asyncio
5
+ from pathlib import Path
6
+
7
+ # Add src to path for imports
8
+ sys.path.insert(0, str(Path(__file__).parent.parent))
9
+
10
+ from sherlock.web.gradio_interface import SherlockGradioInterface
11
+ from sherlock.config.settings import settings
12
+
13
+
14
+ def main():
15
+ """Main function to launch the Sherlock OSINT tool."""
16
+ print("πŸ” Starting Sherlock OSINT Tool...")
17
+ print(f"πŸ“Š Configuration:")
18
+ print(f" - Debug Mode: {settings.debug}")
19
+ print(f" - Max Concurrent Requests: {settings.max_concurrent_requests}")
20
+ print(f" - Request Timeout: {settings.request_timeout}s")
21
+ print(f" - Server: {settings.gradio_server_name}:{settings.gradio_server_port}")
22
+ print(f" - Share: {settings.gradio_share}")
23
+ print()
24
+
25
+ try:
26
+ # Create and launch interface
27
+ interface = SherlockGradioInterface()
28
+ interface.launch()
29
+
30
+ except KeyboardInterrupt:
31
+ print("\nπŸ‘‹ Sherlock OSINT Tool stopped by user")
32
+ except Exception as e:
33
+ print(f"❌ Error starting Sherlock OSINT Tool: {e}")
34
+ sys.exit(1)
35
+
36
+
37
+ if __name__ == "__main__":
38
+ main()
src/sherlock/utils/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Utility functions for Sherlock OSINT tool."""
src/sherlock/utils/output.py ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Output utilities for search results."""
2
+
3
+ import json
4
+ import csv
5
+ from datetime import datetime
6
+ from pathlib import Path
7
+ from typing import List, Dict, Any
8
+ from ..core.search_engine import SearchResult
9
+ from ..config.settings import settings
10
+
11
+
12
+ class ResultExporter:
13
+ """Export search results to various formats."""
14
+
15
+ def __init__(self, output_dir: str = None):
16
+ """Initialize exporter with output directory."""
17
+ self.output_dir = Path(output_dir or settings.output_directory)
18
+ self.output_dir.mkdir(exist_ok=True)
19
+
20
+ def export_json(self, results: List[SearchResult], username: str) -> str:
21
+ """Export results to JSON file."""
22
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
23
+ filename = f"{username}_{timestamp}.json"
24
+ filepath = self.output_dir / filename
25
+
26
+ # Convert results to dictionary format
27
+ data = {
28
+ "username": username,
29
+ "timestamp": datetime.now().isoformat(),
30
+ "total_websites": len(results),
31
+ "claimed_count": len([r for r in results if r.status == "claimed"]),
32
+ "available_count": len([r for r in results if r.status == "available"]),
33
+ "error_count": len([r for r in results if r.status in ["error", "timeout"]]),
34
+ "results": [
35
+ {
36
+ "website": result.website,
37
+ "url": result.url,
38
+ "status": result.status,
39
+ "response_time": result.response_time,
40
+ "status_code": result.status_code,
41
+ "error_message": result.error_message,
42
+ "is_nsfw": result.is_nsfw
43
+ }
44
+ for result in results
45
+ ]
46
+ }
47
+
48
+ with open(filepath, 'w', encoding='utf-8') as f:
49
+ json.dump(data, f, indent=2, ensure_ascii=False)
50
+
51
+ return str(filepath)
52
+
53
+ def export_csv(self, results: List[SearchResult], username: str) -> str:
54
+ """Export results to CSV file."""
55
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
56
+ filename = f"{username}_{timestamp}.csv"
57
+ filepath = self.output_dir / filename
58
+
59
+ with open(filepath, 'w', newline='', encoding='utf-8') as f:
60
+ writer = csv.writer(f)
61
+ writer.writerow([
62
+ "Website", "URL", "Status", "Response Time",
63
+ "Status Code", "Error Message", "NSFW"
64
+ ])
65
+
66
+ for result in results:
67
+ writer.writerow([
68
+ result.website,
69
+ result.url,
70
+ result.status,
71
+ f"{result.response_time:.2f}s",
72
+ result.status_code,
73
+ result.error_message or "",
74
+ "Yes" if result.is_nsfw else "No"
75
+ ])
76
+
77
+ return str(filepath)
78
+
79
+ def export_html(self, results: List[SearchResult], username: str) -> str:
80
+ """Export results to HTML report."""
81
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
82
+ filename = f"{username}_{timestamp}.html"
83
+ filepath = self.output_dir / filename
84
+
85
+ claimed_results = [r for r in results if r.status == "claimed"]
86
+ available_results = [r for r in results if r.status == "available"]
87
+ error_results = [r for r in results if r.status in ["error", "timeout"]]
88
+
89
+ html_content = f"""
90
+ <!DOCTYPE html>
91
+ <html lang="en">
92
+ <head>
93
+ <meta charset="UTF-8">
94
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
95
+ <title>Sherlock OSINT Report - {username}</title>
96
+ <style>
97
+ body {{ font-family: Arial, sans-serif; margin: 20px; background-color: #f5f5f5; }}
98
+ .container {{ max-width: 1200px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }}
99
+ .header {{ text-align: center; margin-bottom: 30px; }}
100
+ .stats {{ display: flex; justify-content: space-around; margin: 20px 0; }}
101
+ .stat-box {{ text-align: center; padding: 15px; border-radius: 5px; }}
102
+ .claimed {{ background-color: #d4edda; color: #155724; }}
103
+ .available {{ background-color: #f8d7da; color: #721c24; }}
104
+ .error {{ background-color: #fff3cd; color: #856404; }}
105
+ .results {{ margin-top: 30px; }}
106
+ .result-item {{ margin: 10px 0; padding: 10px; border-left: 4px solid #ccc; background: #f8f9fa; }}
107
+ .claimed-item {{ border-left-color: #28a745; }}
108
+ .available-item {{ border-left-color: #dc3545; }}
109
+ .error-item {{ border-left-color: #ffc107; }}
110
+ .website {{ font-weight: bold; color: #333; }}
111
+ .url {{ color: #007bff; text-decoration: none; }}
112
+ .url:hover {{ text-decoration: underline; }}
113
+ .status {{ font-weight: bold; }}
114
+ .claimed-status {{ color: #28a745; }}
115
+ .available-status {{ color: #dc3545; }}
116
+ .error-status {{ color: #ffc107; }}
117
+ </style>
118
+ </head>
119
+ <body>
120
+ <div class="container">
121
+ <div class="header">
122
+ <h1>πŸ” Sherlock OSINT Report</h1>
123
+ <h2>Username: {username}</h2>
124
+ <p>Generated on: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}</p>
125
+ </div>
126
+
127
+ <div class="stats">
128
+ <div class="stat-box claimed">
129
+ <h3>{len(claimed_results)}</h3>
130
+ <p>Claimed</p>
131
+ </div>
132
+ <div class="stat-box available">
133
+ <h3>{len(available_results)}</h3>
134
+ <p>Available</p>
135
+ </div>
136
+ <div class="stat-box error">
137
+ <h3>{len(error_results)}</h3>
138
+ <p>Errors</p>
139
+ </div>
140
+ </div>
141
+
142
+ <div class="results">
143
+ <h3>Claimed Accounts ({len(claimed_results)})</h3>
144
+ {self._generate_result_html(claimed_results, "claimed")}
145
+
146
+ <h3>Available Usernames ({len(available_results)})</h3>
147
+ {self._generate_result_html(available_results, "available")}
148
+
149
+ <h3>Errors ({len(error_results)})</h3>
150
+ {self._generate_result_html(error_results, "error")}
151
+ </div>
152
+ </div>
153
+ </body>
154
+ </html>
155
+ """
156
+
157
+ with open(filepath, 'w', encoding='utf-8') as f:
158
+ f.write(html_content)
159
+
160
+ return str(filepath)
161
+
162
+ def _generate_result_html(self, results: List[SearchResult], status_type: str) -> str:
163
+ """Generate HTML for a list of results."""
164
+ if not results:
165
+ return "<p>No results found.</p>"
166
+
167
+ html = ""
168
+ for result in results:
169
+ status_class = f"{status_type}-status"
170
+ item_class = f"{status_type}-item"
171
+
172
+ html += f"""
173
+ <div class="result-item {item_class}">
174
+ <div class="website">{result.website}</div>
175
+ <div><a href="{result.url}" class="url" target="_blank">{result.url}</a></div>
176
+ <div class="status {status_class}">{result.status.title()}</div>
177
+ <div>Response Time: {result.response_time:.2f}s</div>
178
+ {f'<div>Error: {result.error_message}</div>' if result.error_message else ''}
179
+ {f'<div>NSFW: Yes</div>' if result.is_nsfw else ''}
180
+ </div>
181
+ """
182
+
183
+ return html
184
+
185
+
186
+ def format_results_summary(results: List[SearchResult]) -> str:
187
+ """Format results summary for display."""
188
+ total = len(results)
189
+ claimed = len([r for r in results if r.status == "claimed"])
190
+ available = len([r for r in results if r.status == "available"])
191
+ errors = len([r for r in results if r.status in ["error", "timeout"]])
192
+
193
+ summary = f"""
194
+ πŸ“Š **Search Summary**
195
+ - **Total Websites**: {total}
196
+ - **βœ… Claimed**: {claimed}
197
+ - **❌ Available**: {available}
198
+ - **⚠️ Errors**: {errors}
199
+ """
200
+
201
+ if claimed > 0:
202
+ summary += "\n🎯 **Claimed Accounts:**\n"
203
+ for result in results:
204
+ if result.status == "claimed":
205
+ summary += f"- {result.website}: {result.url}\n"
206
+
207
+ return summary
src/sherlock/web/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Web interface components for Sherlock OSINT tool."""
src/sherlock/web/gradio_interface.py ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Gradio web interface for Sherlock OSINT tool."""
2
+
3
+ import asyncio
4
+ import gradio as gr
5
+ from typing import List, Optional, Tuple
6
+ import json
7
+ from pathlib import Path
8
+
9
+ from ..core.search_engine import OSINTSearchEngine, SearchResult
10
+ from ..config.website_config import WebsiteManager
11
+ from ..config.settings import settings
12
+ from ..utils.output import ResultExporter, format_results_summary
13
+
14
+
15
+ class SherlockGradioInterface:
16
+ """Gradio web interface for Sherlock OSINT tool."""
17
+
18
+ def __init__(self):
19
+ """Initialize the interface."""
20
+ self.website_manager = WebsiteManager()
21
+ self.exporter = ResultExporter()
22
+ self.search_engine = None
23
+
24
+ async def search_username_async(
25
+ self,
26
+ username: str,
27
+ selected_websites: List[str],
28
+ include_nsfw: bool,
29
+ export_format: str
30
+ ) -> Tuple[str, str, str]:
31
+ """Async search function for Gradio."""
32
+
33
+ if not username.strip():
34
+ return "❌ Please enter a username", "", ""
35
+
36
+ try:
37
+ # Initialize search engine
38
+ async with OSINTSearchEngine(self.website_manager) as engine:
39
+ # Perform search
40
+ results = await engine.search_username(
41
+ username=username,
42
+ websites=selected_websites if selected_websites else None,
43
+ include_nsfw=include_nsfw
44
+ )
45
+
46
+ # Format results
47
+ summary = format_results_summary(results)
48
+
49
+ # Create detailed results table
50
+ results_table = self._create_results_table(results)
51
+
52
+ # Export results if requested
53
+ export_info = ""
54
+ if export_format != "None" and results:
55
+ export_info = self._export_results(results, username, export_format)
56
+
57
+ return summary, results_table, export_info
58
+
59
+ except Exception as e:
60
+ error_msg = f"❌ Error during search: {str(e)}"
61
+ return error_msg, "", ""
62
+
63
+ def search_username_sync(self, *args):
64
+ """Synchronous wrapper for async search."""
65
+ return asyncio.run(self.search_username_async(*args))
66
+
67
+ def _create_results_table(self, results: List[SearchResult]) -> str:
68
+ """Create HTML table for results."""
69
+ if not results:
70
+ return "No results found."
71
+
72
+ html = """
73
+ <table style="width: 100%; border-collapse: collapse; margin: 10px 0;">
74
+ <thead>
75
+ <tr style="background-color: #f8f9fa;">
76
+ <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Website</th>
77
+ <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Status</th>
78
+ <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">URL</th>
79
+ <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Response Time</th>
80
+ <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Notes</th>
81
+ </tr>
82
+ </thead>
83
+ <tbody>
84
+ """
85
+
86
+ for result in results:
87
+ status_color = {
88
+ "claimed": "#28a745",
89
+ "available": "#dc3545",
90
+ "error": "#ffc107",
91
+ "timeout": "#6c757d"
92
+ }.get(result.status, "#6c757d")
93
+
94
+ notes = []
95
+ if result.is_nsfw:
96
+ notes.append("NSFW")
97
+ if result.error_message:
98
+ notes.append(f"Error: {result.error_message}")
99
+
100
+ html += f"""
101
+ <tr>
102
+ <td style="border: 1px solid #ddd; padding: 8px;">{result.website}</td>
103
+ <td style="border: 1px solid #ddd; padding: 8px;">
104
+ <span style="color: {status_color}; font-weight: bold;">
105
+ {result.status.title()}
106
+ </span>
107
+ </td>
108
+ <td style="border: 1px solid #ddd; padding: 8px;">
109
+ <a href="{result.url}" target="_blank" style="color: #007bff;">
110
+ {result.url}
111
+ </a>
112
+ </td>
113
+ <td style="border: 1px solid #ddd; padding: 8px;">{result.response_time:.2f}s</td>
114
+ <td style="border: 1px solid #ddd; padding: 8px;">{', '.join(notes) if notes else '-'}</td>
115
+ </tr>
116
+ """
117
+
118
+ html += """
119
+ </tbody>
120
+ </table>
121
+ """
122
+
123
+ return html
124
+
125
+ def _export_results(self, results: List[SearchResult], username: str, format_type: str) -> str:
126
+ """Export results and return file path."""
127
+ try:
128
+ if format_type == "JSON":
129
+ filepath = self.exporter.export_json(results, username)
130
+ elif format_type == "CSV":
131
+ filepath = self.exporter.export_csv(results, username)
132
+ elif format_type == "HTML":
133
+ filepath = self.exporter.export_html(results, username)
134
+ else:
135
+ return "❌ Invalid export format"
136
+
137
+ return f"βœ… Results exported to: {filepath}"
138
+ except Exception as e:
139
+ return f"❌ Export failed: {str(e)}"
140
+
141
+ def get_available_websites(self) -> List[str]:
142
+ """Get list of available websites."""
143
+ return list(self.website_manager.get_all_websites().keys())
144
+
145
+ def get_website_categories(self) -> Tuple[List[str], List[str]]:
146
+ """Get website categories (SFW and NSFW)."""
147
+ sfw_websites = [
148
+ name for name, config in self.website_manager.get_all_websites().items()
149
+ if not config.is_nsfw
150
+ ]
151
+ nsfw_websites = [
152
+ name for name, config in self.website_manager.get_all_websites().items()
153
+ if config.is_nsfw
154
+ ]
155
+ return sfw_websites, nsfw_websites
156
+
157
+ def create_interface(self) -> gr.Blocks:
158
+ """Create and return the Gradio interface."""
159
+
160
+ # Get website lists
161
+ all_websites = self.get_available_websites()
162
+ sfw_websites, nsfw_websites = self.get_website_categories()
163
+
164
+ with gr.Blocks(
165
+ title="Sherlock OSINT Tool",
166
+ theme=gr.themes.Soft(),
167
+ css="""
168
+ .gradio-container {
169
+ max-width: 1200px !important;
170
+ margin: auto !important;
171
+ }
172
+ .search-box {
173
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
174
+ padding: 20px;
175
+ border-radius: 10px;
176
+ color: white;
177
+ margin-bottom: 20px;
178
+ }
179
+ """
180
+ ) as interface:
181
+
182
+ gr.Markdown(
183
+ """
184
+ # πŸ” Sherlock OSINT Tool
185
+ **Advanced Username Search Across Multiple Platforms**
186
+
187
+ Search for usernames across hundreds of websites to find where a username is already taken or available.
188
+ """,
189
+ elem_classes="search-box"
190
+ )
191
+
192
+ with gr.Row():
193
+ with gr.Column(scale=2):
194
+ username_input = gr.Textbox(
195
+ label="Username to Search",
196
+ placeholder="Enter username (e.g., john_doe)",
197
+ info="Enter the username you want to search for"
198
+ )
199
+
200
+ website_selection = gr.CheckboxGroup(
201
+ choices=all_websites,
202
+ label="Select Websites (Optional)",
203
+ info="Leave empty to search all websites",
204
+ value=[]
205
+ )
206
+
207
+ with gr.Row():
208
+ include_nsfw = gr.Checkbox(
209
+ label="Include NSFW Sites",
210
+ value=False,
211
+ info="Include adult content websites in search"
212
+ )
213
+
214
+ export_format = gr.Dropdown(
215
+ choices=["None", "JSON", "CSV", "HTML"],
216
+ label="Export Format",
217
+ value="None",
218
+ info="Export results to file"
219
+ )
220
+
221
+ search_button = gr.Button(
222
+ "πŸ” Search Username",
223
+ variant="primary",
224
+ size="lg"
225
+ )
226
+
227
+ with gr.Column(scale=1):
228
+ gr.Markdown("### πŸ“Š Quick Stats")
229
+ stats_text = gr.Markdown(
230
+ f"""
231
+ - **Total Websites**: {len(all_websites)}
232
+ - **SFW Websites**: {len(sfw_websites)}
233
+ - **NSFW Websites**: {len(nsfw_websites)}
234
+ """
235
+ )
236
+
237
+ with gr.Row():
238
+ with gr.Column():
239
+ gr.Markdown("### πŸ“ˆ Search Results")
240
+ results_summary = gr.Markdown()
241
+ results_table = gr.HTML()
242
+ export_info = gr.Markdown()
243
+
244
+ # Event handlers
245
+ search_button.click(
246
+ fn=self.search_username_sync,
247
+ inputs=[username_input, website_selection, include_nsfw, export_format],
248
+ outputs=[results_summary, results_table, export_info]
249
+ )
250
+
251
+ # Add examples
252
+ gr.Examples(
253
+ examples=[
254
+ ["john_doe", [], False, "HTML"],
255
+ ["test_user", ["GitHub", "Twitter", "Instagram"], False, "JSON"],
256
+ ["sample_username", [], True, "CSV"]
257
+ ],
258
+ inputs=[username_input, website_selection, include_nsfw, export_format]
259
+ )
260
+
261
+ # Footer
262
+ gr.Markdown(
263
+ """
264
+ ---
265
+ **⚠️ Disclaimer**: This tool is for educational and research purposes only.
266
+ Respect website terms of service and privacy policies. Use responsibly.
267
+ """
268
+ )
269
+
270
+ return interface
271
+
272
+ def launch(self, **kwargs):
273
+ """Launch the Gradio interface."""
274
+ interface = self.create_interface()
275
+
276
+ launch_kwargs = {
277
+ "server_name": settings.gradio_server_name,
278
+ "server_port": settings.gradio_server_port,
279
+ "share": settings.gradio_share,
280
+ "debug": settings.debug,
281
+ **kwargs
282
+ }
283
+
284
+ interface.launch(**launch_kwargs)
test_sherlock.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Simple test script for Sherlock OSINT Tool
4
+ """
5
+
6
+ import asyncio
7
+ import sys
8
+ from pathlib import Path
9
+
10
+ # Add src to path
11
+ sys.path.insert(0, str(Path(__file__).parent / "src"))
12
+
13
+ from sherlock.core.search_engine import OSINTSearchEngine
14
+ from sherlock.config.website_config import WebsiteManager
15
+
16
+
17
+ async def test_basic_search():
18
+ """Test basic username search functionality."""
19
+ print("πŸ§ͺ Testing Sherlock OSINT Tool...")
20
+
21
+ try:
22
+ # Initialize components
23
+ website_manager = WebsiteManager()
24
+ print(f"βœ… Loaded {len(website_manager.get_all_websites())} website configurations")
25
+
26
+ # Test with a small subset of websites
27
+ test_websites = ["GitHub", "Twitter", "Instagram", "Facebook", "LinkedIn"]
28
+ available_websites = [
29
+ name for name in test_websites
30
+ if name in website_manager.get_all_websites()
31
+ ]
32
+
33
+ if not available_websites:
34
+ print("❌ No test websites found in configuration")
35
+ return False
36
+
37
+ print(f"πŸ” Testing with websites: {', '.join(available_websites)}")
38
+
39
+ # Perform test search
40
+ async with OSINTSearchEngine(website_manager) as engine:
41
+ results = await engine.search_username(
42
+ username="test_user_12345", # Unlikely to exist
43
+ websites=available_websites,
44
+ include_nsfw=False
45
+ )
46
+
47
+ print(f"πŸ“Š Search completed: {len(results)} results")
48
+
49
+ # Display results
50
+ for result in results:
51
+ status_emoji = {
52
+ "claimed": "βœ…",
53
+ "available": "❌",
54
+ "error": "⚠️",
55
+ "timeout": "⏱️"
56
+ }.get(result.status, "❓")
57
+
58
+ print(f"{status_emoji} {result.website}: {result.status} ({result.response_time:.2f}s)")
59
+
60
+ print("βœ… Basic test completed successfully!")
61
+ return True
62
+
63
+ except Exception as e:
64
+ print(f"❌ Test failed: {e}")
65
+ return False
66
+
67
+
68
+ async def test_website_config():
69
+ """Test website configuration loading."""
70
+ print("\nπŸ§ͺ Testing website configuration...")
71
+
72
+ try:
73
+ website_manager = WebsiteManager()
74
+ websites = website_manager.get_all_websites()
75
+
76
+ if not websites:
77
+ print("❌ No websites loaded")
78
+ return False
79
+
80
+ # Test a few specific websites
81
+ test_sites = ["GitHub", "Twitter", "Instagram"]
82
+ for site_name in test_sites:
83
+ if site_name in websites:
84
+ config = websites[site_name]
85
+ print(f"βœ… {site_name}: {config.url}")
86
+ else:
87
+ print(f"⚠️ {site_name}: Not found")
88
+
89
+ print(f"πŸ“Š Total websites loaded: {len(websites)}")
90
+ print("βœ… Website configuration test passed!")
91
+ return True
92
+
93
+ except Exception as e:
94
+ print(f"❌ Website configuration test failed: {e}")
95
+ return False
96
+
97
+
98
+ async def main():
99
+ """Run all tests."""
100
+ print("πŸš€ Starting Sherlock OSINT Tool Tests\n")
101
+
102
+ tests = [
103
+ ("Website Configuration", test_website_config),
104
+ ("Basic Search", test_basic_search),
105
+ ]
106
+
107
+ passed = 0
108
+ total = len(tests)
109
+
110
+ for test_name, test_func in tests:
111
+ print(f"Running {test_name} test...")
112
+ try:
113
+ result = await test_func()
114
+ if result:
115
+ passed += 1
116
+ print(f"βœ… {test_name} test PASSED\n")
117
+ else:
118
+ print(f"❌ {test_name} test FAILED\n")
119
+ except Exception as e:
120
+ print(f"❌ {test_name} test ERROR: {e}\n")
121
+
122
+ print("=" * 50)
123
+ print(f"πŸ“Š Test Results: {passed}/{total} tests passed")
124
+
125
+ if passed == total:
126
+ print("πŸŽ‰ All tests passed! Sherlock OSINT Tool is ready to use.")
127
+ return True
128
+ else:
129
+ print("⚠️ Some tests failed. Please check the configuration.")
130
+ return False
131
+
132
+
133
+ if __name__ == "__main__":
134
+ success = asyncio.run(main())
135
+ sys.exit(0 if success else 1)