user-scanner 1.0.10.2__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.
Files changed (90) hide show
  1. user_scanner/__main__.py +241 -129
  2. user_scanner/core/email_orchestrator.py +78 -0
  3. user_scanner/core/formatter.py +27 -0
  4. user_scanner/core/helpers.py +194 -2
  5. user_scanner/core/orchestrator.py +24 -112
  6. user_scanner/core/result.py +38 -13
  7. user_scanner/email_scan/adult/pornhub.py +62 -0
  8. user_scanner/email_scan/adult/xnxx.py +46 -0
  9. user_scanner/email_scan/adult/xvideos.py +50 -0
  10. user_scanner/email_scan/dev/.ruff_cache/.gitignore +2 -0
  11. user_scanner/email_scan/dev/.ruff_cache/0.14.10/10328336453267387919 +0 -0
  12. user_scanner/email_scan/dev/.ruff_cache/CACHEDIR.TAG +1 -0
  13. user_scanner/email_scan/dev/bitbucket.py +33 -0
  14. user_scanner/email_scan/dev/github.py +72 -0
  15. user_scanner/email_scan/dev/huggingface.py +37 -0
  16. user_scanner/email_scan/shopping/__init__.py +0 -0
  17. user_scanner/email_scan/shopping/ebay.py.lock +97 -0
  18. user_scanner/email_scan/shopping/flipkart.py +52 -0
  19. user_scanner/email_scan/social/__init__.py +0 -0
  20. user_scanner/email_scan/social/facebook.py +96 -0
  21. user_scanner/email_scan/social/instagram.py +48 -0
  22. user_scanner/email_scan/social/mastodon.py +57 -0
  23. user_scanner/email_scan/social/x.py +41 -0
  24. user_scanner/user_scan/community/lemmy.py +30 -0
  25. user_scanner/user_scan/creator/__init__.py +0 -0
  26. user_scanner/user_scan/creator/gumroad.py +22 -0
  27. user_scanner/{creator → user_scan/creator}/producthunt.py +13 -4
  28. user_scanner/user_scan/donation/__init__.py +0 -0
  29. user_scanner/user_scan/gaming/__init__.py +0 -0
  30. user_scanner/{gaming → user_scan/gaming}/roblox.py +15 -5
  31. user_scanner/version.json +1 -1
  32. user_scanner-1.1.0.dist-info/METADATA +239 -0
  33. user_scanner-1.1.0.dist-info/RECORD +94 -0
  34. user_scanner/cli/printer.py +0 -117
  35. user_scanner/config.json +0 -1
  36. user_scanner-1.0.10.2.dist-info/METADATA +0 -172
  37. user_scanner-1.0.10.2.dist-info/RECORD +0 -72
  38. /user_scanner/{creator → email_scan}/__init__.py +0 -0
  39. /user_scanner/{donation → email_scan/adult}/__init__.py +0 -0
  40. /user_scanner/{gaming → email_scan/dev}/__init__.py +0 -0
  41. /user_scanner/{community → user_scan/community}/__init__.py +0 -0
  42. /user_scanner/{community → user_scan/community}/coderlegion.py +0 -0
  43. /user_scanner/{community → user_scan/community}/hackernews.py +0 -0
  44. /user_scanner/{community → user_scan/community}/stackoverflow.py +0 -0
  45. /user_scanner/{creator → user_scan/creator}/devto.py +0 -0
  46. /user_scanner/{creator → user_scan/creator}/hashnode.py +0 -0
  47. /user_scanner/{creator → user_scan/creator}/itch_io.py +0 -0
  48. /user_scanner/{creator → user_scan/creator}/kaggle.py +0 -0
  49. /user_scanner/{creator → user_scan/creator}/medium.py +0 -0
  50. /user_scanner/{creator → user_scan/creator}/patreon.py +0 -0
  51. /user_scanner/{creator → user_scan/creator}/substack.py +0 -0
  52. /user_scanner/{creator → user_scan/creator}/twitch.py +0 -0
  53. /user_scanner/{dev → user_scan/dev}/__init__.py +0 -0
  54. /user_scanner/{dev → user_scan/dev}/bitbucket.py +0 -0
  55. /user_scanner/{dev → user_scan/dev}/codeberg.py +0 -0
  56. /user_scanner/{dev → user_scan/dev}/cratesio.py +0 -0
  57. /user_scanner/{dev → user_scan/dev}/dockerhub.py +0 -0
  58. /user_scanner/{dev → user_scan/dev}/github.py +0 -0
  59. /user_scanner/{dev → user_scan/dev}/gitlab.py +0 -0
  60. /user_scanner/{dev → user_scan/dev}/huggingface.py +0 -0
  61. /user_scanner/{dev → user_scan/dev}/launchpad.py +0 -0
  62. /user_scanner/{dev → user_scan/dev}/leetcode.py +0 -0
  63. /user_scanner/{dev → user_scan/dev}/npmjs.py +0 -0
  64. /user_scanner/{dev → user_scan/dev}/replit.py +0 -0
  65. /user_scanner/{dev → user_scan/dev}/sourceforge.py +0 -0
  66. /user_scanner/{donation → user_scan/donation}/buymeacoffee.py +0 -0
  67. /user_scanner/{donation → user_scan/donation}/liberapay.py +0 -0
  68. /user_scanner/{gaming → user_scan/gaming}/chess_com.py +0 -0
  69. /user_scanner/{gaming → user_scan/gaming}/lichess.py +0 -0
  70. /user_scanner/{gaming → user_scan/gaming}/minecraft.py +0 -0
  71. /user_scanner/{gaming → user_scan/gaming}/monkeytype.py +0 -0
  72. /user_scanner/{gaming → user_scan/gaming}/osu.py +0 -0
  73. /user_scanner/{gaming → user_scan/gaming}/steam.py +0 -0
  74. /user_scanner/{social → user_scan/social}/__init__.py +0 -0
  75. /user_scanner/{social → user_scan/social}/bluesky.py +0 -0
  76. /user_scanner/{social → user_scan/social}/discord.py +0 -0
  77. /user_scanner/{social → user_scan/social}/instagram.py +0 -0
  78. /user_scanner/{social → user_scan/social}/mastodon.py +0 -0
  79. /user_scanner/{social → user_scan/social}/pinterest.py +0 -0
  80. /user_scanner/{social → user_scan/social}/reddit.py +0 -0
  81. /user_scanner/{social → user_scan/social}/snapchat.py +0 -0
  82. /user_scanner/{social → user_scan/social}/soundcloud.py +0 -0
  83. /user_scanner/{social → user_scan/social}/telegram.py +0 -0
  84. /user_scanner/{social → user_scan/social}/threads.py +0 -0
  85. /user_scanner/{social → user_scan/social}/tiktok.py +0 -0
  86. /user_scanner/{social → user_scan/social}/x.py +0 -0
  87. /user_scanner/{social → user_scan/social}/youtube.py +0 -0
  88. {user_scanner-1.0.10.2.dist-info → user_scanner-1.1.0.dist-info}/WHEEL +0 -0
  89. {user_scanner-1.0.10.2.dist-info → user_scanner-1.1.0.dist-info}/entry_points.txt +0 -0
  90. {user_scanner-1.0.10.2.dist-info → user_scanner-1.1.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,8 +1,8 @@
1
- from user_scanner.core.orchestrator import generic_validate
1
+ from user_scanner.core.orchestrator import generic_validate, status_validate
2
2
  from user_scanner.core.result import Result
3
3
 
4
4
 
5
- def validate_roblox(user):
5
+ def validate_roblox(user: str) -> Result:
6
6
  # official api
7
7
  url = f"https://users.roblox.com/v1/users/search?keyword={user}&limit=10"
8
8
 
@@ -13,12 +13,13 @@ def validate_roblox(user):
13
13
  return Result.error("Too many requests")
14
14
 
15
15
  if response.status_code == 400:
16
- error = search_results["errors"][0] #Api states theres always an error
16
+ # Api states theres always an error
17
+ error = search_results["errors"][0]
17
18
  if error["code"] == 6:
18
19
  return Result.error("Username is too short")
19
20
  if error["code"] == 5:
20
21
  return Result.error("Username was filtered")
21
- #Shouldn't be able to reach this
22
+ # Shouldn't be able to reach this
22
23
  return Result.error("Invalid username")
23
24
 
24
25
  # iterates through the entries in the search results
@@ -28,7 +29,16 @@ def validate_roblox(user):
28
29
  return Result.taken()
29
30
  return Result.available()
30
31
 
31
- return generic_validate(url, process, follow_redirects=True)
32
+ # First try: Using roblox's API
33
+ result = generic_validate(url, process, follow_redirects=True)
34
+
35
+ if result.get_reason() != "Too many requests":
36
+ return result
37
+
38
+ # If rate limited, uses a simple status validation
39
+ url = f"https://www.roblox.com/user.aspx?username={user}"
40
+
41
+ return status_validate(url, 404, [200, 302], follow_redirects=True)
32
42
 
33
43
 
34
44
  if __name__ == "__main__":
user_scanner/version.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
- "version": "1.0.10.2",
2
+ "version": "1.1.0",
3
3
  "version_type": "pypi"
4
4
  }
@@ -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
+ ![User Scanner Logo](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
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,,
@@ -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.2
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
- ![User Scanner Logo](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
17
- <p align="center">
18
- <img src="https://img.shields.io/badge/Version-1.0.10.2-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
-