user-scanner 1.0.10.3__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- user_scanner/__main__.py +241 -129
- user_scanner/core/email_orchestrator.py +78 -0
- user_scanner/core/formatter.py +27 -0
- user_scanner/core/helpers.py +194 -2
- user_scanner/core/orchestrator.py +24 -112
- user_scanner/core/result.py +38 -13
- user_scanner/email_scan/adult/pornhub.py +62 -0
- user_scanner/email_scan/adult/xnxx.py +46 -0
- user_scanner/email_scan/adult/xvideos.py +50 -0
- user_scanner/email_scan/dev/.ruff_cache/.gitignore +2 -0
- user_scanner/email_scan/dev/.ruff_cache/0.14.10/10328336453267387919 +0 -0
- user_scanner/email_scan/dev/.ruff_cache/CACHEDIR.TAG +1 -0
- user_scanner/email_scan/dev/bitbucket.py +33 -0
- user_scanner/email_scan/dev/github.py +72 -0
- user_scanner/email_scan/dev/huggingface.py +37 -0
- user_scanner/email_scan/shopping/__init__.py +0 -0
- user_scanner/email_scan/shopping/ebay.py.lock +97 -0
- user_scanner/email_scan/shopping/flipkart.py +52 -0
- user_scanner/email_scan/social/__init__.py +0 -0
- user_scanner/email_scan/social/facebook.py +96 -0
- user_scanner/email_scan/social/instagram.py +48 -0
- user_scanner/email_scan/social/mastodon.py +57 -0
- user_scanner/email_scan/social/x.py +41 -0
- user_scanner/user_scan/community/lemmy.py +30 -0
- user_scanner/user_scan/creator/__init__.py +0 -0
- user_scanner/user_scan/creator/gumroad.py +22 -0
- user_scanner/user_scan/donation/__init__.py +0 -0
- user_scanner/user_scan/gaming/__init__.py +0 -0
- user_scanner/{gaming → user_scan/gaming}/roblox.py +15 -5
- user_scanner/version.json +1 -1
- user_scanner-1.1.0.dist-info/METADATA +239 -0
- user_scanner-1.1.0.dist-info/RECORD +94 -0
- user_scanner/cli/printer.py +0 -117
- user_scanner/config.json +0 -1
- user_scanner-1.0.10.3.dist-info/METADATA +0 -172
- user_scanner-1.0.10.3.dist-info/RECORD +0 -72
- /user_scanner/{creator → email_scan}/__init__.py +0 -0
- /user_scanner/{donation → email_scan/adult}/__init__.py +0 -0
- /user_scanner/{gaming → email_scan/dev}/__init__.py +0 -0
- /user_scanner/{community → user_scan/community}/__init__.py +0 -0
- /user_scanner/{community → user_scan/community}/coderlegion.py +0 -0
- /user_scanner/{community → user_scan/community}/hackernews.py +0 -0
- /user_scanner/{community → user_scan/community}/stackoverflow.py +0 -0
- /user_scanner/{creator → user_scan/creator}/devto.py +0 -0
- /user_scanner/{creator → user_scan/creator}/hashnode.py +0 -0
- /user_scanner/{creator → user_scan/creator}/itch_io.py +0 -0
- /user_scanner/{creator → user_scan/creator}/kaggle.py +0 -0
- /user_scanner/{creator → user_scan/creator}/medium.py +0 -0
- /user_scanner/{creator → user_scan/creator}/patreon.py +0 -0
- /user_scanner/{creator → user_scan/creator}/producthunt.py +0 -0
- /user_scanner/{creator → user_scan/creator}/substack.py +0 -0
- /user_scanner/{creator → user_scan/creator}/twitch.py +0 -0
- /user_scanner/{dev → user_scan/dev}/__init__.py +0 -0
- /user_scanner/{dev → user_scan/dev}/bitbucket.py +0 -0
- /user_scanner/{dev → user_scan/dev}/codeberg.py +0 -0
- /user_scanner/{dev → user_scan/dev}/cratesio.py +0 -0
- /user_scanner/{dev → user_scan/dev}/dockerhub.py +0 -0
- /user_scanner/{dev → user_scan/dev}/github.py +0 -0
- /user_scanner/{dev → user_scan/dev}/gitlab.py +0 -0
- /user_scanner/{dev → user_scan/dev}/huggingface.py +0 -0
- /user_scanner/{dev → user_scan/dev}/launchpad.py +0 -0
- /user_scanner/{dev → user_scan/dev}/leetcode.py +0 -0
- /user_scanner/{dev → user_scan/dev}/npmjs.py +0 -0
- /user_scanner/{dev → user_scan/dev}/replit.py +0 -0
- /user_scanner/{dev → user_scan/dev}/sourceforge.py +0 -0
- /user_scanner/{donation → user_scan/donation}/buymeacoffee.py +0 -0
- /user_scanner/{donation → user_scan/donation}/liberapay.py +0 -0
- /user_scanner/{gaming → user_scan/gaming}/chess_com.py +0 -0
- /user_scanner/{gaming → user_scan/gaming}/lichess.py +0 -0
- /user_scanner/{gaming → user_scan/gaming}/minecraft.py +0 -0
- /user_scanner/{gaming → user_scan/gaming}/monkeytype.py +0 -0
- /user_scanner/{gaming → user_scan/gaming}/osu.py +0 -0
- /user_scanner/{gaming → user_scan/gaming}/steam.py +0 -0
- /user_scanner/{social → user_scan/social}/__init__.py +0 -0
- /user_scanner/{social → user_scan/social}/bluesky.py +0 -0
- /user_scanner/{social → user_scan/social}/discord.py +0 -0
- /user_scanner/{social → user_scan/social}/instagram.py +0 -0
- /user_scanner/{social → user_scan/social}/mastodon.py +0 -0
- /user_scanner/{social → user_scan/social}/pinterest.py +0 -0
- /user_scanner/{social → user_scan/social}/reddit.py +0 -0
- /user_scanner/{social → user_scan/social}/snapchat.py +0 -0
- /user_scanner/{social → user_scan/social}/soundcloud.py +0 -0
- /user_scanner/{social → user_scan/social}/telegram.py +0 -0
- /user_scanner/{social → user_scan/social}/threads.py +0 -0
- /user_scanner/{social → user_scan/social}/tiktok.py +0 -0
- /user_scanner/{social → user_scan/social}/x.py +0 -0
- /user_scanner/{social → user_scan/social}/youtube.py +0 -0
- {user_scanner-1.0.10.3.dist-info → user_scanner-1.1.0.dist-info}/WHEEL +0 -0
- {user_scanner-1.0.10.3.dist-info → user_scanner-1.1.0.dist-info}/entry_points.txt +0 -0
- {user_scanner-1.0.10.3.dist-info → user_scanner-1.1.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: user-scanner
|
|
3
|
+
Version: 1.1.0
|
|
4
|
+
Summary: Check username availability across multiple popular platforms
|
|
5
|
+
Keywords: username,checker,availability,social,tech,python,user-scanner
|
|
6
|
+
Author-email: Kaif <kafcodec@gmail.com>
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: httpx[http2]>=0.27,<0.29
|
|
11
|
+
Requires-Dist: socksio>=1.0,<2
|
|
12
|
+
Requires-Dist: colorama>=0.4,<1
|
|
13
|
+
Project-URL: Homepage, https://github.com/kaifcodec/user-scanner
|
|
14
|
+
|
|
15
|
+
# User Scanner
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
<p align="center">
|
|
19
|
+
<img src="https://img.shields.io/badge/Version-1.0.10.1-blueviolet?style=for-the-badge&logo=github" />
|
|
20
|
+
<img src="https://img.shields.io/github/issues/kaifcodec/user-scanner?style=for-the-badge&logo=github" />
|
|
21
|
+
<img src="https://img.shields.io/badge/Tested%20on-Termux-black?style=for-the-badge&logo=termux" />
|
|
22
|
+
<img src="https://img.shields.io/badge/Tested%20on-Windows-cyan?style=for-the-badge&logo=Windows" />
|
|
23
|
+
<img src="https://img.shields.io/badge/Tested%20on-Linux-balck?style=for-the-badge&logo=Linux" />
|
|
24
|
+
<img src="https://img.shields.io/pepy/dt/user-scanner?style=for-the-badge" />
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### ⚠️ Email OSINT mode had not been implemented yet, still in progress
|
|
30
|
+
|
|
31
|
+
A powerful *Email OSINT tool* that checks if a specific email is registered on various sites, combined with *username scanning* — 2-in-1 solution.
|
|
32
|
+
|
|
33
|
+
Perfect for fast, accurate and lightweight email OSINT
|
|
34
|
+
|
|
35
|
+
Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instagram, and more, all in a single command.
|
|
36
|
+
|
|
37
|
+
## Features
|
|
38
|
+
|
|
39
|
+
- ✅ Check an email across multiple sites to see if it’s registered.
|
|
40
|
+
- ✅ Scan usernames across **social networks**, **developer platforms**, **creator communities**, and more.
|
|
41
|
+
- ✅ Can be used purely as a username tool.
|
|
42
|
+
- ✅ Smart auto-update system detects new releases on PyPI and prompts the user to upgrade interactively.
|
|
43
|
+
- ✅ Clear `Registered` and `Not Registered` for email scanning `Available` / `Taken` / `Error` output for username scans
|
|
44
|
+
- ✅ Robust error handling: displays the exact reason a username or email cannot be used (e.g., underscores or hyphens at the start/end).
|
|
45
|
+
- ✅ Fully modular: easily add new platform modules.
|
|
46
|
+
- ✅ Wildcard-based username permutations for automatic variation generation using a provided suffix.
|
|
47
|
+
- ✅ Option to select results format (**JSON**, **CSV**, console).
|
|
48
|
+
- ✅ Save scanning and OSINT results in the preferred format and output file (ideal for power users).
|
|
49
|
+
- ✅ Command-line interface ready: works immediately after `pip install`.
|
|
50
|
+
- ✅ Lightweight with minimal dependencies; runs on any machine.
|
|
51
|
+
- ✅ **Proxy support** with round-robin rotation
|
|
52
|
+
- ✅ **Proxy validation** to test and filter working proxies before scanning
|
|
53
|
+
- ✅ **Bulk username scanning** from file support for checking multiple usernames at once
|
|
54
|
+
- ✅ **Bulk email scanning** from file support for checking multiple emails at once
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Installation
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pip install user-scanner
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Important Flags
|
|
66
|
+
|
|
67
|
+
| Flag | Description |
|
|
68
|
+
|------|-------------|
|
|
69
|
+
| `-u, --username USERNAME` | Scan a single username across platforms |
|
|
70
|
+
| `-e, --email EMAIL` | Scan a single email across platforms |
|
|
71
|
+
| `-uf, --username-file FILE` | Scan multiple usernames from file (one per line) |
|
|
72
|
+
| `-ef, --email-file FILE` | Scan multiple emails from file (one per line) |
|
|
73
|
+
| `-c, --category CATEGORY` | Scan all platforms in a specific category |
|
|
74
|
+
| `-lu, --list-user` | List all available modules for username scanning |
|
|
75
|
+
| `-le, --list-email` | List all available modules for email scanning |
|
|
76
|
+
| `-m, --module MODULE` | Scan a single specific module |
|
|
77
|
+
| `-p, --permute PERMUTE` | Generate username permutations using a pattern/suffix |
|
|
78
|
+
| `-P, --proxy-file FILE` | Use proxies from file (one per line) |
|
|
79
|
+
| `--validate-proxies` | Validate proxies before scanning (tests against google.com) |
|
|
80
|
+
| `-s, --stop STOP` | Limit the number of permutations generated |
|
|
81
|
+
| `-d, --delay DELAY` | Delay (in seconds) between requests |
|
|
82
|
+
| `-f, --format {csv,json}` | Select output format |
|
|
83
|
+
| `-o, --output OUTPUT` | Save results to a file |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Usage
|
|
88
|
+
|
|
89
|
+
### Basic username/email scan
|
|
90
|
+
|
|
91
|
+
Scan a single username across **all** available modules/platforms:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
user-scanner -e john_doe@gmail.com
|
|
95
|
+
user-scanner --email john_doe@gmail.com # long version
|
|
96
|
+
|
|
97
|
+
user-scanner -u john_doe
|
|
98
|
+
user-scanner --username john_doe # long version
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Selective scanning
|
|
102
|
+
|
|
103
|
+
Scan only specific categories or single modules:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
user-scanner -u john_doe -c dev # developer platforms only
|
|
107
|
+
user-scanner -u john_doe -m github # only GitHub
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Bulk username scanning
|
|
111
|
+
|
|
112
|
+
Scan multiple usernames from a file (one username per line):
|
|
113
|
+
- Can also be combined with categories or modules using `-c` and `-m` flags
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
user-scanner -uf usernames.txt
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
### Bulk email scanning
|
|
121
|
+
|
|
122
|
+
Scan multiple emails from a file (one email per line):
|
|
123
|
+
- Can also be combined with categories or modules using `-c` and `-m` flags
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
user-scanner -ef emails.txt
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Username/Email variations (suffix only)
|
|
130
|
+
|
|
131
|
+
Generate & check username variations using a permutation from the given suffix:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
user-scanner -u john_ -p ab # john_a, ..., john_ab, john_ba
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Using Proxies
|
|
138
|
+
|
|
139
|
+
Route requests through proxy servers:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
user-scanner -u john_doe -P proxies.txt
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Validate proxies before scanning (tests each proxy against google.com):
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
user-scanner -u john_doe -P proxies.txt --validate-proxies # recommended
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
This will:
|
|
152
|
+
1. Test all proxies from the file
|
|
153
|
+
2. Filter out non-working proxies
|
|
154
|
+
3. Save working proxies to `validated_proxies.txt`
|
|
155
|
+
4. Use only validated proxies for scanning
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
### Update
|
|
160
|
+
|
|
161
|
+
Update the tool to the latest PyPI version:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
user-scanner -U
|
|
165
|
+
```
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Screenshot:
|
|
169
|
+
|
|
170
|
+
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
171
|
+
|
|
172
|
+
<img width="1072" height="848" alt="user-scanner's main usage screenshot" src="https://github.com/user-attachments/assets/34e44ca6-e314-419e-9035-d951b493b47f" />
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
<img width="1080" height="352" alt="user-scanner's wildcard username feature" src="https://github.com/user-attachments/assets/578b248c-2a05-4917-aab3-6372a7c28045" />
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Contributing
|
|
184
|
+
|
|
185
|
+
Modules are organized under `user_scanner/`:
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
user_scanner/
|
|
189
|
+
├── email_scan/ # Currently in development
|
|
190
|
+
│ ├── social/ # Social email scan modules (Instagram, Mastodon, X, etc.)
|
|
191
|
+
| ├── adult/ # Adult sites
|
|
192
|
+
| ... # New sites to be added soon
|
|
193
|
+
├── user_scan/
|
|
194
|
+
│ ├── dev/ # Developer platforms (GitHub, GitLab, npm, etc.)
|
|
195
|
+
│ ├── social/ # Social platforms (Twitter/X, Reddit, Instagram, Discord, etc.)
|
|
196
|
+
│ ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, Patreon, etc.)
|
|
197
|
+
│ ├── community/ # Community platforms (forums, StackOverflow, HackerNews, etc.)
|
|
198
|
+
│ ├── gaming/ # Gaming sites (chess.com, Lichess, Roblox, Minecraft, etc.)
|
|
199
|
+
│ └── donation/ # Donation platforms (BuyMeACoffee, Liberapay)
|
|
200
|
+
|...
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Module guidelines:**
|
|
204
|
+
This project contains small "validator" modules that check whether a username exists on a given platform. Each validator is a single function that returns a Result object (see `core/orchestrator.py`).
|
|
205
|
+
|
|
206
|
+
Result semantics:
|
|
207
|
+
- Result.available() → `available`
|
|
208
|
+
- Result.taken() → `taken`
|
|
209
|
+
- Result.error(message: Optional[str]) → `error`, blocked, unknown, or request failure (include short diagnostic message when helpful)
|
|
210
|
+
|
|
211
|
+
Follow this document when adding or updating validators.
|
|
212
|
+
|
|
213
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Dependencies:
|
|
218
|
+
- [httpx](https://pypi.org/project/httpx/)
|
|
219
|
+
- [colorama](https://pypi.org/project/colorama/)
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## License
|
|
224
|
+
|
|
225
|
+
This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Star History
|
|
231
|
+
|
|
232
|
+
<a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
|
|
233
|
+
<picture>
|
|
234
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&theme=dark&legend=top-left" />
|
|
235
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
|
|
236
|
+
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
|
|
237
|
+
</picture>
|
|
238
|
+
</a>
|
|
239
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
user_scanner/__main__.py,sha256=upuAt-VZO08YzaA4paD7ArUy2S2K12wdTqlNxn107eY,10762
|
|
3
|
+
user_scanner/version.json,sha256=oTUn4qlwwbH4RAqsIExmaGV6igJwBW8xmvRpphKh6Bc,47
|
|
4
|
+
user_scanner/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
user_scanner/cli/banner.py,sha256=3b4PIggnJrmxF4DfbuPMqSavpwNl0m5uedaOL2SXN3o,766
|
|
6
|
+
user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
user_scanner/core/email_orchestrator.py,sha256=EMQGqvk4GqaXQqCSTOYdveRuu63bLf71r6TTrfSrups,2368
|
|
8
|
+
user_scanner/core/formatter.py,sha256=CMwyR6PuP15HqyS6oWe40ye_4dne14lrIj7_5T7rla4,725
|
|
9
|
+
user_scanner/core/helpers.py,sha256=g_WMbEJvT98TA4Db9c-LPIDl6ExjLQ1dSE3cIyKRUos,6406
|
|
10
|
+
user_scanner/core/orchestrator.py,sha256=OLC4JmBJm1ZzwsDUt6Kqtcc2BENs3fP0iqbTT1nS3KU,4460
|
|
11
|
+
user_scanner/core/result.py,sha256=HxzsaQrfvZ-PxDJknAENIaF-BekfyAAV2Mf8J382zjg,4597
|
|
12
|
+
user_scanner/core/version.py,sha256=k1_KTZdRLKBAxp8_PtOhTAtj8mBO_AUnUGdqI4epypY,855
|
|
13
|
+
user_scanner/email_scan/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
user_scanner/email_scan/adult/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
user_scanner/email_scan/adult/pornhub.py,sha256=cc_G5bclFl8QWU43ohM7SgilWk0RYmpUC7NHsw9Z0Bs,2135
|
|
16
|
+
user_scanner/email_scan/adult/xnxx.py,sha256=WiKn4Vkc5FC1HXry9N8SN-dsTdm1qq0NS6KUcPRmMMY,1728
|
|
17
|
+
user_scanner/email_scan/adult/xvideos.py,sha256=tx0PZOZ66KHDmrnvd1RABCnqCUIdKfCPgAbogBtX69A,1769
|
|
18
|
+
user_scanner/email_scan/dev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
19
|
+
user_scanner/email_scan/dev/bitbucket.py,sha256=oR_fSug_Aft4fy8Lu8r0VO737b8ZlfcC_D3GMbcUF0k,1352
|
|
20
|
+
user_scanner/email_scan/dev/github.py,sha256=JBSSN9kv3IQxKG0tmemUdSHwfQDu53dHC4i9oCwDqow,3160
|
|
21
|
+
user_scanner/email_scan/dev/huggingface.py,sha256=GjFNkuVZ_8eFgs9OrFakhiEb8pVRwEJO-tyx32IQMns,1229
|
|
22
|
+
user_scanner/email_scan/dev/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
|
|
23
|
+
user_scanner/email_scan/dev/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
|
|
24
|
+
user_scanner/email_scan/dev/.ruff_cache/0.14.10/10328336453267387919,sha256=LEcpRIkQ-C6pcMhwLtJIv41263y2EjXHzr0r530xCtc,250
|
|
25
|
+
user_scanner/email_scan/shopping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
|
+
user_scanner/email_scan/shopping/ebay.py.lock,sha256=UTvqqwdIPPp3Pt8NCwNwHC3xNghexQc1HcNLXf9s4wQ,4326
|
|
27
|
+
user_scanner/email_scan/shopping/flipkart.py,sha256=wMQJ1VIawhM6W0UQCThcIUtaYN7QeexvJSRSeXS4l04,1879
|
|
28
|
+
user_scanner/email_scan/social/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
|
+
user_scanner/email_scan/social/facebook.py,sha256=dnCDZfqRYLXDT7GjJQ-bSqGfC-rO8G9O7pu8dUse7Nw,4475
|
|
30
|
+
user_scanner/email_scan/social/instagram.py,sha256=qGDub3d4pSY_KW4aNYDQOGVNSrmWQkZWMHadCFkDa64,2022
|
|
31
|
+
user_scanner/email_scan/social/mastodon.py,sha256=F4E1kJ6148N3C66uFvJu_fhx7r7LcMau6wDIkdRbxlM,2294
|
|
32
|
+
user_scanner/email_scan/social/x.py,sha256=WoHaecbR1qGte-mwyODsY0YGNf-iRZyGS7s9fw0SQgg,1475
|
|
33
|
+
user_scanner/user_scan/community/__init__.py,sha256=5EzlM991pJqvqIRc05_QV5BureJZ7wiCRm1AyEY6pms,12
|
|
34
|
+
user_scanner/user_scan/community/coderlegion.py,sha256=W_bdjzdFPRgUrNFFlylvToSJ4AzaFCtTsUy_MRVDdSo,451
|
|
35
|
+
user_scanner/user_scan/community/hackernews.py,sha256=lKVuEVoGnXWYSANcuUyiSHzUr-VtcXHC7sEX1rxZi0Y,1068
|
|
36
|
+
user_scanner/user_scan/community/lemmy.py,sha256=IURvkdxbqt4riyGEFO2vC3RxcyyC2g1E8Gx-5GJJUaY,927
|
|
37
|
+
user_scanner/user_scan/community/stackoverflow.py,sha256=MTL8O0TLHkjVbugBh1pLxELJLU3hkX_YEHjGjaKTJi4,1007
|
|
38
|
+
user_scanner/user_scan/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
|
+
user_scanner/user_scan/creator/devto.py,sha256=mIACmG1a4eoctywxb5p04sI0YVi3dsjCRw9YVOFBEKQ,435
|
|
40
|
+
user_scanner/user_scan/creator/gumroad.py,sha256=OA5IvzNQImcm4rDg8E_WLbrXarC0XBQLe60_1F05j5c,658
|
|
41
|
+
user_scanner/user_scan/creator/hashnode.py,sha256=3RRkVgU7t26-F4ZqjfnC_lwnP7DWwygq6kT2Q4kKw2M,1390
|
|
42
|
+
user_scanner/user_scan/creator/itch_io.py,sha256=2a8UVh-_OaWQPcSUHUuijDGpWDxsR8DoCcU1BdTRqqs,854
|
|
43
|
+
user_scanner/user_scan/creator/kaggle.py,sha256=QaXIG02OGxvQZEvwHm50RKNd7joxGOq0Ht3cFfrYEiU,445
|
|
44
|
+
user_scanner/user_scan/creator/medium.py,sha256=zHU5h2VQwde1P4XihQpV7ww2P_fgGKgWZ_S0_4TTyUI,1648
|
|
45
|
+
user_scanner/user_scan/creator/patreon.py,sha256=g-r85pxirf0ihK3STyGYPIzp59MB7JH64Opb4wq1fyU,461
|
|
46
|
+
user_scanner/user_scan/creator/producthunt.py,sha256=wb7b3hsa2Er-IQTfNFRBnU7KV5EqW_KRhL5pFvuCY88,1227
|
|
47
|
+
user_scanner/user_scan/creator/substack.py,sha256=tisTUQmauteYZOZ0tULp9GGUuf4ZBEcpqv4ZmEvjyK0,1288
|
|
48
|
+
user_scanner/user_scan/creator/twitch.py,sha256=blsh5sMT7miF5-xqVXYLieTILzkop2PsWqv9HhP8G40,2509
|
|
49
|
+
user_scanner/user_scan/dev/__init__.py,sha256=qUR0eLwN-gO6oKk-1cmCVT4G_AxUHHMgpV3wJ7URXi4,7
|
|
50
|
+
user_scanner/user_scan/dev/bitbucket.py,sha256=qAIlFCmMaNTUx2-a5wJKHjbQjERcJt0zKHJmjLAeXr4,876
|
|
51
|
+
user_scanner/user_scan/dev/codeberg.py,sha256=Z6nV0_8xZhMiCcNn9Hn79VVh6y0ar9fqL7KS2b7IaDo,447
|
|
52
|
+
user_scanner/user_scan/dev/cratesio.py,sha256=mJnlLJoMLlQ7f_95QD7LgH1xCj-e6FooOFkpYypBfG4,724
|
|
53
|
+
user_scanner/user_scan/dev/dockerhub.py,sha256=sPEnomGiPM2mKv2HsA-9WxaXHjzz21A6ox3IXK1etLc,643
|
|
54
|
+
user_scanner/user_scan/dev/github.py,sha256=9Q4G84WTAeWfNliApKdRFl1MJLfHvDPJ09mwr8P1ePo,1702
|
|
55
|
+
user_scanner/user_scan/dev/gitlab.py,sha256=kMDSd74XbofmJocfS4Fd9DxPryIHBMek3N_5c7Z_AJQ,1351
|
|
56
|
+
user_scanner/user_scan/dev/huggingface.py,sha256=hDanOZ45LeUg3hrN0CYrBnBnLqHCYtOWS0_HCvAbmDw,454
|
|
57
|
+
user_scanner/user_scan/dev/launchpad.py,sha256=N58ioX_dEHq2uwyyGrWnDKWwbqK9_RiuBQ1uWR5cDfg,799
|
|
58
|
+
user_scanner/user_scan/dev/leetcode.py,sha256=PTJcgp1W3fzLDK_Jy_VvRjKnLftLYMJaw3kfMjHqt9c,1246
|
|
59
|
+
user_scanner/user_scan/dev/npmjs.py,sha256=k-DhFqGJWDoQ79EzR8hmVrJk07AfJfPUWnIYuKc2G6w,713
|
|
60
|
+
user_scanner/user_scan/dev/replit.py,sha256=SI_i2l4w9tm2kBX4-cONBAT8dSynXoGEP4zcU8ngnh0,442
|
|
61
|
+
user_scanner/user_scan/dev/sourceforge.py,sha256=Kt8MmpCgB1tNwYRI9PYOZzIrL1VfnpzeNC43DcbZlbI,850
|
|
62
|
+
user_scanner/user_scan/donation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
|
+
user_scanner/user_scan/donation/buymeacoffee.py,sha256=86LGyChv_UKQFp2D7nIoK1B-FCAAbbfabS8NA9yLp5k,459
|
|
64
|
+
user_scanner/user_scan/donation/liberapay.py,sha256=njClxpbRLZQ_L2-lUYCY6QFnF4IcwfCJPCIg1iEqo7M,1120
|
|
65
|
+
user_scanner/user_scan/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
66
|
+
user_scanner/user_scan/gaming/chess_com.py,sha256=74tMgukSUXwdmD9G7Jij_gudRlSfs46Xho5KNMVeyt4,1262
|
|
67
|
+
user_scanner/user_scan/gaming/lichess.py,sha256=8b7DNRENh2UwjbsJNXRs2HIwC80OwGe5D0y-96_xjzs,1324
|
|
68
|
+
user_scanner/user_scan/gaming/minecraft.py,sha256=7a9H9ebLlRzGB0SjxLmzqLiDPDBZAuuNq3KKe2DZAvo,481
|
|
69
|
+
user_scanner/user_scan/gaming/monkeytype.py,sha256=IWt_0sXPaiTfKVpYVNW9KLMGtDzU55P-SnBjVtSAsU0,1748
|
|
70
|
+
user_scanner/user_scan/gaming/osu.py,sha256=2Xs1iM0CJ-3dNHu4tyF50_s0Ei_1mA5Zd6D6M5RmiVg,448
|
|
71
|
+
user_scanner/user_scan/gaming/roblox.py,sha256=5q8vWlO5mdUZpQg_rx3ewBrDOHnLprSHJj7uEJ2S934,1813
|
|
72
|
+
user_scanner/user_scan/gaming/steam.py,sha256=l8xk_p9aiYQWCPoogQnO1iwkfojPhg6yd76OZHhKN50,740
|
|
73
|
+
user_scanner/user_scan/social/__init__.py,sha256=jaCkFwX1uYtF0ENifVwF8OfHrYYUTm64B9wlBq9BBfQ,9
|
|
74
|
+
user_scanner/user_scan/social/bluesky.py,sha256=11Y_vRj3txEDQqoD0iANgSWVSB8L87OotPQZquhneR0,1994
|
|
75
|
+
user_scanner/user_scan/social/discord.py,sha256=KA7Uw8RBuid-YZZglIKQwWbg8PIKdrMwXP3fKH3c-go,1180
|
|
76
|
+
user_scanner/user_scan/social/instagram.py,sha256=GgmKGvi3meKdZ_nQJbJSBZDJTEKSoE6Cn4_VARmo62I,953
|
|
77
|
+
user_scanner/user_scan/social/mastodon.py,sha256=bLZ2VR_ty4inY47ENSSt_021wEUEDKwvuE4EL7eLq2A,967
|
|
78
|
+
user_scanner/user_scan/social/pinterest.py,sha256=JIJ-HPtMoGvxW7NQzm02lChFKMmE6k6GxFoUZ6OvCec,784
|
|
79
|
+
user_scanner/user_scan/social/reddit.py,sha256=PJ46v8WpcUY1nNSbPhbiY6B9ynB9bcakcDjopXTX2ME,787
|
|
80
|
+
user_scanner/user_scan/social/snapchat.py,sha256=XEW_W4jEBX4AiHREcfHGstt97Ez3GI-3bKSzhtMyn28,1277
|
|
81
|
+
user_scanner/user_scan/social/soundcloud.py,sha256=rCXyOY1qXOW0iIAcgeyVEcv15ufWb18749PBvBnQWnU,1035
|
|
82
|
+
user_scanner/user_scan/social/telegram.py,sha256=CNhrUdOEaonOGswuGUn-_PgA1aoWvcXVACOC4qDY-vw,767
|
|
83
|
+
user_scanner/user_scan/social/threads.py,sha256=rK8Gm_riDdr0djo23tk38fNVVEBuC6nj2iTXvWrqXeE,951
|
|
84
|
+
user_scanner/user_scan/social/tiktok.py,sha256=y3KqIFIgeT8rk5bM_FirSgdAD2hFN-a_cVCB2S5amAc,1691
|
|
85
|
+
user_scanner/user_scan/social/x.py,sha256=sAnboHHZN2DWyKeds46GLZHxGG-G_bjzfVNIkblSHx8,1406
|
|
86
|
+
user_scanner/user_scan/social/youtube.py,sha256=UPu584teg75P7FT05RFG3nobbHgPmzjr-ZwyN2sw6gw,1980
|
|
87
|
+
user_scanner/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
88
|
+
user_scanner/utils/update.py,sha256=Rj3kLuUrQ-LlKGB7bkndqVjj0IUqugbDSj2SUrPRidE,936
|
|
89
|
+
user_scanner/utils/updater_logic.py,sha256=tl6kbKL02DrP-R1dkQWhHr12juVDgkJZZvKAfbI1ruU,2381
|
|
90
|
+
user_scanner-1.1.0.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
|
|
91
|
+
user_scanner-1.1.0.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
|
|
92
|
+
user_scanner-1.1.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
93
|
+
user_scanner-1.1.0.dist-info/METADATA,sha256=eHPKnr6zczLO7pagkzEm0LFxyveyfSR3a9RVbIULioA,8601
|
|
94
|
+
user_scanner-1.1.0.dist-info/RECORD,,
|
user_scanner/cli/printer.py
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
from colorama import Fore, Style
|
|
2
|
-
from typing import Literal
|
|
3
|
-
from user_scanner.core.result import Result, Status
|
|
4
|
-
|
|
5
|
-
INDENT = " "
|
|
6
|
-
CSV_HEADER = "username,category,site_name,status,url,reason"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def indentate(msg: str, indent: int):
|
|
10
|
-
if indent <= 0:
|
|
11
|
-
return msg
|
|
12
|
-
tabs = INDENT * indent
|
|
13
|
-
return "\n".join([f"{tabs}{line}" for line in msg.split("\n")])
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class Printer:
|
|
17
|
-
def __init__(self, format: Literal["console", "csv", "json"]) -> None:
|
|
18
|
-
if format not in ["console", "csv", "json"]:
|
|
19
|
-
raise ValueError(f"Invalid output-format: {format}")
|
|
20
|
-
self.mode: str = format
|
|
21
|
-
self.indent: int = 0
|
|
22
|
-
|
|
23
|
-
@property
|
|
24
|
-
def is_console(self) -> bool:
|
|
25
|
-
return self.mode == "console"
|
|
26
|
-
|
|
27
|
-
@property
|
|
28
|
-
def is_csv(self) -> bool:
|
|
29
|
-
return self.mode == "csv"
|
|
30
|
-
|
|
31
|
-
@property
|
|
32
|
-
def is_json(self) -> bool:
|
|
33
|
-
return self.mode == "json"
|
|
34
|
-
|
|
35
|
-
def get_start(self, json_char: str = "[") -> str:
|
|
36
|
-
if self.is_json:
|
|
37
|
-
self.indent += 1
|
|
38
|
-
return indentate(json_char, self.indent - 1)
|
|
39
|
-
elif self.is_csv:
|
|
40
|
-
return CSV_HEADER
|
|
41
|
-
return ""
|
|
42
|
-
|
|
43
|
-
def get_end(self, json_char: str = "]") -> str:
|
|
44
|
-
if not self.is_json:
|
|
45
|
-
return ""
|
|
46
|
-
self.indent = max(self.indent - 1, 0)
|
|
47
|
-
return indentate(json_char, self.indent)
|
|
48
|
-
|
|
49
|
-
def get_result_output(self, result: Result) -> str:
|
|
50
|
-
#In principle result should always have this
|
|
51
|
-
site_name = result.site_name
|
|
52
|
-
username = result.username
|
|
53
|
-
|
|
54
|
-
match (result.status, self.mode):
|
|
55
|
-
case (Status.AVAILABLE, "console"):
|
|
56
|
-
return f"{INDENT}{Fore.GREEN}[✔] {site_name} ({username}): Available{Style.RESET_ALL}"
|
|
57
|
-
|
|
58
|
-
case (Status.TAKEN, "console"):
|
|
59
|
-
return f"{INDENT}{Fore.RED}[✘] {site_name} ({username}): Taken{Style.RESET_ALL}"
|
|
60
|
-
|
|
61
|
-
case (Status.ERROR, "console"):
|
|
62
|
-
reason = ""
|
|
63
|
-
if isinstance(result, Result) and result.has_reason():
|
|
64
|
-
reason = f" ({result.get_reason()})"
|
|
65
|
-
return f"{INDENT}{Fore.YELLOW}[!] {site_name} ({username}): Error{reason}{Style.RESET_ALL}"
|
|
66
|
-
|
|
67
|
-
case (_, "json"):
|
|
68
|
-
return indentate(result.to_json().replace("\t", INDENT), self.indent)
|
|
69
|
-
|
|
70
|
-
case (_, "csv"):
|
|
71
|
-
return result.to_csv()
|
|
72
|
-
|
|
73
|
-
return ""
|
|
74
|
-
|
|
75
|
-
def print_modules(self, category: str | None = None):
|
|
76
|
-
from user_scanner.core.orchestrator import load_categories, load_modules
|
|
77
|
-
categories = load_categories()
|
|
78
|
-
categories_to_list = [category] if category else categories.keys()
|
|
79
|
-
|
|
80
|
-
# Print the start
|
|
81
|
-
if self.is_json:
|
|
82
|
-
print(self.get_start("{"))
|
|
83
|
-
elif self.is_csv:
|
|
84
|
-
print("category,site_name")
|
|
85
|
-
|
|
86
|
-
for i, cat_name in enumerate(categories_to_list):
|
|
87
|
-
path = categories[cat_name]
|
|
88
|
-
modules = load_modules(path)
|
|
89
|
-
|
|
90
|
-
# Print for each category
|
|
91
|
-
match self.mode:
|
|
92
|
-
case "console":
|
|
93
|
-
print(Fore.MAGENTA +
|
|
94
|
-
f"\n== {cat_name.upper()} SITES =={Style.RESET_ALL}")
|
|
95
|
-
case "json":
|
|
96
|
-
print(self.get_start(f"\"{cat_name}\": ["))
|
|
97
|
-
|
|
98
|
-
for j, module in enumerate(modules):
|
|
99
|
-
is_last = j == len(modules) - 1
|
|
100
|
-
site_name = module.__name__.split(".")[-1].capitalize()
|
|
101
|
-
|
|
102
|
-
# Print for each site name
|
|
103
|
-
match self.mode:
|
|
104
|
-
case "console":
|
|
105
|
-
print(f"{INDENT}- {site_name}")
|
|
106
|
-
case "json":
|
|
107
|
-
msg = f"\"{site_name}\"" + ("" if is_last else ",")
|
|
108
|
-
print(indentate(msg, self.indent))
|
|
109
|
-
case "csv":
|
|
110
|
-
print(f"{cat_name},{site_name}")
|
|
111
|
-
|
|
112
|
-
if self.is_json:
|
|
113
|
-
is_last = i == len(categories_to_list) - 1
|
|
114
|
-
print(self.get_end("]" if is_last else "],"))
|
|
115
|
-
|
|
116
|
-
if self.is_json:
|
|
117
|
-
print(self.get_end("}"))
|
user_scanner/config.json
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"auto_update_status": true}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: user-scanner
|
|
3
|
-
Version: 1.0.10.3
|
|
4
|
-
Summary: Check username availability across multiple popular platforms
|
|
5
|
-
Keywords: username,checker,availability,social,tech,python,user-scanner
|
|
6
|
-
Author-email: Kaif <kafcodec@gmail.com>
|
|
7
|
-
Requires-Python: >=3.10
|
|
8
|
-
Description-Content-Type: text/markdown
|
|
9
|
-
License-File: LICENSE
|
|
10
|
-
Requires-Dist: httpx
|
|
11
|
-
Requires-Dist: colorama
|
|
12
|
-
Project-URL: Homepage, https://github.com/kaifcodec/user-scanner
|
|
13
|
-
|
|
14
|
-
# User Scanner
|
|
15
|
-
|
|
16
|
-

|
|
17
|
-
<p align="center">
|
|
18
|
-
<img src="https://img.shields.io/badge/Version-1.0.10.3-blueviolet?style=for-the-badge&logo=github" />
|
|
19
|
-
<img src="https://img.shields.io/github/issues/kaifcodec/user-scanner?style=for-the-badge&logo=github" />
|
|
20
|
-
<img src="https://img.shields.io/badge/Tested%20on-Termux-black?style=for-the-badge&logo=termux" />
|
|
21
|
-
<img src="https://img.shields.io/badge/Tested%20on-Windows-cyan?style=for-the-badge&logo=Windows" />
|
|
22
|
-
<img src="https://img.shields.io/badge/Tested%20on-Linux-balck?style=for-the-badge&logo=Linux" />
|
|
23
|
-
<img src="https://img.shields.io/pepy/dt/user-scanner?style=for-the-badge" />
|
|
24
|
-
</p>
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
Scan a username across multiple social, developer, and creator platforms to see if it’s available.
|
|
29
|
-
Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instagram, and more, all in one command.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
### Features
|
|
33
|
-
|
|
34
|
-
- ✅ Check usernames across **social networks**, **developer platforms**, and **creator communities**
|
|
35
|
-
- ✅ Can be used as a username OSINT tool
|
|
36
|
-
- ✅ Smart auto-update system, Detects new releases on PyPI and interactively prompts the user to upgrade.
|
|
37
|
-
- ✅ Clear **Available / Taken / Error** output for each platform
|
|
38
|
-
- ✅ Robust error handling: It prints the exact reason (e.g. Cannot use underscores, hyphens at the start/end)
|
|
39
|
-
- ✅ Fully modular: add new platform modules easily
|
|
40
|
-
- ✅ Wildcard-based username permutations for automatic variation generation using provided suffix
|
|
41
|
-
- ✅ Selection of results format (e.g. json, csv, console (default))
|
|
42
|
-
- ✅ Get the scanning results in preferred format (json/csv) in specified output file (suitable for power users)
|
|
43
|
-
- ✅ Command-line interface ready: works directly after `pip install`
|
|
44
|
-
- ✅ Very low and lightweight dependencies, can be run on any machine
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
### Installation
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
pip install user-scanner
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
### Usage
|
|
56
|
-
|
|
57
|
-
Scan a username across all platforms:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
user-scanner -u <username>
|
|
61
|
-
```
|
|
62
|
-
Optionally, scan a specific category or single module:
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
user-scanner -u <username> -c dev
|
|
66
|
-
user-scanner -l # Lists all available modules
|
|
67
|
-
user-scanner -u <username> -m github
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Also, the output file and format can be specified: <br>
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
user-scanner -u <username> -f console #Default format
|
|
74
|
-
user-scanner -u <username> -f csv
|
|
75
|
-
user-scanner -u <username> -f json
|
|
76
|
-
user-scanner -u <username> -f <format> -o <output-file>
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Generate multiple username variations by appending a suffix:
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
user-scanner -u <username> -p <suffix>
|
|
83
|
-
```
|
|
84
|
-
Optionally, scan a specific category or single module with limit:
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
user-scanner -u <username> -p <suffix> -c dev
|
|
88
|
-
user-scanner -u <username> -p <suffix> -m github
|
|
89
|
-
user-scanner -u <username> -p <suffix> -s <number> # limit generation of usernames
|
|
90
|
-
user-scanner -u <username> -p <suffix> -d <seconds> # delay to avoid rate-limits (can be 0s-1s)
|
|
91
|
-
```
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
### Update
|
|
95
|
-
|
|
96
|
-
Update the tool to the latest PyPI version:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
user-scanner -U
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
### Screenshot:
|
|
106
|
-
|
|
107
|
-
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
<img width="1080" height="770" alt="1000140392" src="https://github.com/user-attachments/assets/4638c8f6-40c6-46f8-ae17-ac65cd199d81" />
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
<img width="1080" height="352" alt="1000140393" src="https://github.com/user-attachments/assets/578b248c-2a05-4917-aab3-6372a7c28045" />
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
<img width="992" height="556" alt="1000141265" src="https://github.com/user-attachments/assets/9babb19f-bc87-4e7b-abe5-c52b8b1b672c" />
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
### Contributing:
|
|
123
|
-
|
|
124
|
-
Modules are organized by category:
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
user_scanner/
|
|
128
|
-
├── dev/ # Developer platforms (GitHub, GitLab, etc.)
|
|
129
|
-
├── social/ # Social platforms (Twitter/X, Reddit, Instagram, etc.)
|
|
130
|
-
├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
|
|
131
|
-
├── community/ # Community platforms (forums, niche sites)
|
|
132
|
-
├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
|
|
133
|
-
├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
**Module guidelines:**
|
|
137
|
-
This project contains small "validator" modules that check whether a username exists on a given platform. Each validator is a single function that returns a Result object (see `core/orchestrator.py`).
|
|
138
|
-
|
|
139
|
-
Result semantics:
|
|
140
|
-
- Result.available() → `available`
|
|
141
|
-
- Result.taken() → `taken`
|
|
142
|
-
- Result.error(message: Optional[str]) → `error`, blocked, unknown, or request failure (include short diagnostic message when helpful)
|
|
143
|
-
|
|
144
|
-
Follow this document when adding or updating validators.
|
|
145
|
-
|
|
146
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
### Dependencies:
|
|
151
|
-
- [httpx](https://pypi.org/project/httpx/)
|
|
152
|
-
- [colorama](https://pypi.org/project/colorama/)
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
### License
|
|
157
|
-
|
|
158
|
-
This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
### Star History
|
|
164
|
-
|
|
165
|
-
<a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
|
|
166
|
-
<picture>
|
|
167
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&theme=dark&legend=top-left" />
|
|
168
|
-
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
|
|
169
|
-
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
|
|
170
|
-
</picture>
|
|
171
|
-
</a>
|
|
172
|
-
|