user-scanner 1.0.4.2__tar.gz → 1.0.8.1__tar.gz

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 (89) hide show
  1. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/PKG-INFO +45 -62
  2. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/README.md +44 -61
  3. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/pyproject.toml +2 -2
  4. user_scanner-1.0.8.1/user_scanner/__main__.py +134 -0
  5. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/cli/banner.py +2 -0
  6. user_scanner-1.0.8.1/user_scanner/community/__init__.py +1 -0
  7. user_scanner-1.0.8.1/user_scanner/community/coderlegion.py +19 -0
  8. user_scanner-1.0.8.1/user_scanner/community/stackoverflow.py +35 -0
  9. user_scanner-1.0.8.1/user_scanner/core/orchestrator.py +181 -0
  10. user_scanner-1.0.8.1/user_scanner/core/result.py +79 -0
  11. user_scanner-1.0.8.1/user_scanner/creator/devto.py +19 -0
  12. user_scanner-1.0.8.1/user_scanner/creator/hashnode.py +51 -0
  13. user_scanner-1.0.8.1/user_scanner/creator/itch_io.py +19 -0
  14. user_scanner-1.0.8.1/user_scanner/creator/kaggle.py +19 -0
  15. user_scanner-1.0.8.1/user_scanner/creator/medium.py +37 -0
  16. user_scanner-1.0.8.1/user_scanner/creator/patreon.py +19 -0
  17. user_scanner-1.0.8.1/user_scanner/creator/producthunt.py +47 -0
  18. user_scanner-1.0.8.1/user_scanner/dev/codeberg.py +19 -0
  19. user_scanner-1.0.8.1/user_scanner/dev/cratesio.py +26 -0
  20. user_scanner-1.0.8.1/user_scanner/dev/dockerhub.py +24 -0
  21. user_scanner-1.0.8.1/user_scanner/dev/github.py +50 -0
  22. user_scanner-1.0.8.1/user_scanner/dev/gitlab.py +40 -0
  23. user_scanner-1.0.8.1/user_scanner/dev/huggingface.py +19 -0
  24. user_scanner-1.0.8.1/user_scanner/dev/launchpad.py +26 -0
  25. user_scanner-1.0.8.1/user_scanner/dev/npmjs.py +27 -0
  26. user_scanner-1.0.8.1/user_scanner/dev/replit.py +19 -0
  27. user_scanner-1.0.8.1/user_scanner/donation/buymeacoffee.py +19 -0
  28. user_scanner-1.0.8.1/user_scanner/donation/liberapay.py +36 -0
  29. user_scanner-1.0.8.1/user_scanner/gaming/chess_com.py +38 -0
  30. user_scanner-1.0.8.1/user_scanner/gaming/minecraft.py +19 -0
  31. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/gaming/monkeytype.py +8 -26
  32. user_scanner-1.0.8.1/user_scanner/gaming/osu.py +19 -0
  33. user_scanner-1.0.8.1/user_scanner/gaming/roblox.py +43 -0
  34. user_scanner-1.0.8.1/user_scanner/gaming/steam.py +29 -0
  35. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/social/bluesky.py +21 -38
  36. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/social/discord.py +17 -21
  37. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/social/instagram.py +11 -24
  38. user_scanner-1.0.8.1/user_scanner/social/mastodon.py +19 -0
  39. user_scanner-1.0.8.1/user_scanner/social/pinterest.py +28 -0
  40. user_scanner-1.0.8.1/user_scanner/social/reddit.py +29 -0
  41. user_scanner-1.0.8.1/user_scanner/social/snapchat.py +35 -0
  42. user_scanner-1.0.8.1/user_scanner/social/soundcloud.py +43 -0
  43. user_scanner-1.0.8.1/user_scanner/social/telegram.py +29 -0
  44. user_scanner-1.0.8.1/user_scanner/social/threads.py +29 -0
  45. user_scanner-1.0.8.1/user_scanner/social/x.py +46 -0
  46. user_scanner-1.0.8.1/user_scanner/social/youtube.py +50 -0
  47. user_scanner-1.0.8.1/user_scanner/utils/update.py +0 -0
  48. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/utils/version.py +2 -0
  49. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/version.json +1 -1
  50. user_scanner-1.0.4.2/user_scanner/__init__.py +0 -1
  51. user_scanner-1.0.4.2/user_scanner/__main__.py +0 -108
  52. user_scanner-1.0.4.2/user_scanner/community/coderlegion.py +0 -39
  53. user_scanner-1.0.4.2/user_scanner/core/orchestrator.py +0 -91
  54. user_scanner-1.0.4.2/user_scanner/creator/devto.py +0 -37
  55. user_scanner-1.0.4.2/user_scanner/creator/hashnode.py +0 -54
  56. user_scanner-1.0.4.2/user_scanner/creator/itch_io.py +0 -45
  57. user_scanner-1.0.4.2/user_scanner/creator/kaggle.py +0 -37
  58. user_scanner-1.0.4.2/user_scanner/creator/medium.py +0 -41
  59. user_scanner-1.0.4.2/user_scanner/creator/patreon.py +0 -45
  60. user_scanner-1.0.4.2/user_scanner/creator/producthunt.py +0 -40
  61. user_scanner-1.0.4.2/user_scanner/dev/codeberg.py +0 -37
  62. user_scanner-1.0.4.2/user_scanner/dev/cratesio.py +0 -39
  63. user_scanner-1.0.4.2/user_scanner/dev/dockerhub.py +0 -40
  64. user_scanner-1.0.4.2/user_scanner/dev/github.py +0 -46
  65. user_scanner-1.0.4.2/user_scanner/dev/gitlab.py +0 -51
  66. user_scanner-1.0.4.2/user_scanner/dev/launchpad.py +0 -39
  67. user_scanner-1.0.4.2/user_scanner/dev/npmjs.py +0 -40
  68. user_scanner-1.0.4.2/user_scanner/dev/replit.py +0 -37
  69. user_scanner-1.0.4.2/user_scanner/gaming/chess_com.py +0 -54
  70. user_scanner-1.0.4.2/user_scanner/gaming/osu.py +0 -44
  71. user_scanner-1.0.4.2/user_scanner/gaming/roblox.py +0 -48
  72. user_scanner-1.0.4.2/user_scanner/gaming/steam.py +0 -46
  73. user_scanner-1.0.4.2/user_scanner/social/mastodon.py +0 -45
  74. user_scanner-1.0.4.2/user_scanner/social/pinterest.py +0 -42
  75. user_scanner-1.0.4.2/user_scanner/social/reddit.py +0 -42
  76. user_scanner-1.0.4.2/user_scanner/social/snapchat.py +0 -48
  77. user_scanner-1.0.4.2/user_scanner/social/telegram.py +0 -34
  78. user_scanner-1.0.4.2/user_scanner/social/threads.py +0 -42
  79. user_scanner-1.0.4.2/user_scanner/social/x.py +0 -54
  80. user_scanner-1.0.4.2/user_scanner/social/youtube.py +0 -56
  81. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/LICENSE +0 -0
  82. {user_scanner-1.0.4.2/user_scanner/cli → user_scanner-1.0.8.1/user_scanner}/__init__.py +0 -0
  83. {user_scanner-1.0.4.2/user_scanner/community → user_scanner-1.0.8.1/user_scanner/cli}/__init__.py +0 -0
  84. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/core/__init__.py +0 -0
  85. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/creator/__init__.py +0 -0
  86. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/dev/__init__.py +0 -0
  87. {user_scanner-1.0.4.2/user_scanner/gaming → user_scanner-1.0.8.1/user_scanner/donation}/__init__.py +0 -0
  88. /user_scanner-1.0.4.2/user_scanner/utils/update.py → /user_scanner-1.0.8.1/user_scanner/gaming/__init__.py +0 -0
  89. {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/social/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: user-scanner
3
- Version: 1.0.4.2
3
+ Version: 1.0.8.1
4
4
  Summary: Check username availability across multiple popular platforms
5
5
  Keywords: username,checker,availability,social,tech,python,user-scanner
6
6
  Author-email: Kaif <kafcodec@gmail.com>
@@ -15,7 +15,7 @@ Project-URL: Homepage, https://github.com/kaifcodec/user-scanner
15
15
 
16
16
  ![1000136215](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
17
17
  <p align="center">
18
- <img src="https://img.shields.io/badge/Version-1.0.4.2-blueviolet?style=for-the-badge&logo=github" />
18
+ <img src="https://img.shields.io/badge/Version-1.0.8.1-blueviolet?style=for-the-badge&logo=github" />
19
19
  <img src="https://img.shields.io/github/issues/kaifcodec/user-scanner?style=for-the-badge&logo=github" />
20
20
  <img src="https://img.shields.io/badge/Tested%20on-Termux-black?style=for-the-badge&logo=termux" />
21
21
  <img src="https://img.shields.io/badge/Tested%20on-Windows-cyan?style=for-the-badge&logo=Windows" />
@@ -33,8 +33,10 @@ Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instag
33
33
 
34
34
  - ✅ Check usernames across **social networks**, **developer platforms**, and **creator communities**.
35
35
  - ✅ Clear **Available / Taken / Error** output for each platform.
36
+ - ✅ Robust error handling: It prints the exact reason (e.g. Cannot use underscores, hyphens at the start/end)
36
37
  - ✅ Fully modular: add new platform modules easily.
37
- - ✅ Command-line interface ready: works directly after `pip install`.
38
+ - ✅ Wildcard-based username permutations for automatic variation generation using provided suffix
39
+ - ✅ Command-line interface ready: works directly after `pip install`
38
40
  - ✅ Can be used as username OSINT tool.
39
41
  - ✅ Very low and lightweight dependencies, can be run on any machine.
40
42
  ---
@@ -60,56 +62,39 @@ Optionally, scan a specific category or single module:
60
62
  user-scanner -u <username> -c dev
61
63
  user-scanner -l # Lists all available modules
62
64
  user-scanner -u <username> -m github
65
+ user-scanner -u <username> -p <suffix>
63
66
 
64
67
  ```
65
- ---
66
- ### Example Output:
67
68
 
68
- - Note*: New modules are constantly getting added so this might have only limited, outdated output:
69
+ Generate multiple username variations by appending a suffix:
70
+
71
+ ```bash
72
+ user-scanner -u <username> -p <suffix>
73
+
74
+ ```
75
+ Optionally, scan a specific category or single module with limit:
76
+
69
77
  ```bash
70
- Checking username: johndoe078
71
-
72
- == DEV SITES ==
73
- [✔] Codeberg: Available
74
- [✔] Cratesio: Available
75
- [✔] Dockerhub: Available
76
- [✘] Github: Taken
77
- [✔] Gitlab: Available
78
- [✔] Launchpad: Available
79
- [✔] Npmjs: Available
80
- [✔] Replit: Available
81
-
82
- == SOCIAL SITES ==
83
- [✔] Bluesky: Available
84
- [✔] Discord: Available
85
- [✘] Instagram: Taken
86
- [✔] Mastodon: Available
87
- [✔] Pinterest: Available
88
- [✘] Reddit: Taken
89
- [✔] Snapchat: Available
90
- [✔] Telegram: Available
91
- [✘] Threads: Taken
92
- [✔] X (Twitter): Available
93
- [✔] Youtube: Available
94
-
95
- == CREATOR SITES ==
96
- [✔] Devto: Available
97
- [✔] Hashnode: Available
98
- [✔] Kaggle: Available
99
- [✔] Medium: Available
100
- [✔] Patreon: Available
101
-
102
- == COMMUNITY SITES ==
103
- [✔] Coderlegion: Available
104
-
105
- == GAMING SITES ==
106
- [✔] Chess_com: Available
107
- [✔] Osu: Available
108
- [✔] Roblox: Available
109
- ...
110
- ...
111
- ...
78
+ user-scanner -u <username> -p <suffix> -c dev
79
+ user-scanner -u <username> -p <suffix> -m github
80
+ user-scanner -u <username> -p <suffix> -s <number> # limit generation of usernames
81
+ user-scanner -u <username> -p <suffix> -d <seconds> #delay to avoid rate-limits
112
82
  ```
83
+
84
+ ---
85
+ ### Screenshot:
86
+
87
+ - Note*: New modules are constantly getting added so this might have only limited, outdated output:
88
+
89
+
90
+ <img width="1080" height="770" alt="1000140392" src="https://github.com/user-attachments/assets/4638c8f6-40c6-46f8-ae17-ac65cd199d81" />
91
+
92
+
93
+ ---
94
+
95
+ <img width="1080" height="352" alt="1000140393" src="https://github.com/user-attachments/assets/578b248c-2a05-4917-aab3-6372a7c28045" />
96
+
97
+
113
98
  ### Contributing:
114
99
 
115
100
  Modules are organized by category:
@@ -121,21 +106,21 @@ user_scanner/
121
106
  ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
122
107
  ├── community/ # Community platforms (forums, niche sites)
123
108
  ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
109
+ ├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
124
110
  ```
125
111
 
126
112
  **Module guidelines:**
127
- - Each module must define a `validate_<site>()` function that takes a `username` and returns:
128
- - `1` → Available
129
- - `0` → Taken
130
- - `2`Error / Could not check
131
- - Use `httpx` for requests, `colorama` for colored output.
132
- - Optional: modules can define a CLI parser if they support custom arguments.
113
+ 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`).
114
+
115
+ Result semantics:
116
+ - Result.available()`available`
117
+ - Result.taken() `taken`
118
+ - Result.error(message: Optional[str]) `error`, blocked, unknown, or request failure (include short diagnostic message when helpful)
119
+
120
+ Follow this document when adding or updating validators.
133
121
 
134
122
  See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
135
123
 
136
- ### 📧 Contact:
137
- - [Email](kaifcodec@gmail.com)
138
-
139
124
  ---
140
125
 
141
126
  ### Dependencies:
@@ -149,8 +134,9 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
149
134
  This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
150
135
 
151
136
 
152
- <!---
153
- ## 🌟 Stars:
137
+ ---
138
+
139
+ ### Star History
154
140
 
155
141
  <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
156
142
  <picture>
@@ -159,7 +145,4 @@ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for d
159
145
  <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
160
146
  </picture>
161
147
  </a>
162
- --->
163
- ---
164
- ## ⚠️ `community/` and `gaming/` are small, looking for contributions
165
148
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  ![1000136215](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
4
4
  <p align="center">
5
- <img src="https://img.shields.io/badge/Version-1.0.4.2-blueviolet?style=for-the-badge&logo=github" />
5
+ <img src="https://img.shields.io/badge/Version-1.0.8.1-blueviolet?style=for-the-badge&logo=github" />
6
6
  <img src="https://img.shields.io/github/issues/kaifcodec/user-scanner?style=for-the-badge&logo=github" />
7
7
  <img src="https://img.shields.io/badge/Tested%20on-Termux-black?style=for-the-badge&logo=termux" />
8
8
  <img src="https://img.shields.io/badge/Tested%20on-Windows-cyan?style=for-the-badge&logo=Windows" />
@@ -20,8 +20,10 @@ Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instag
20
20
 
21
21
  - ✅ Check usernames across **social networks**, **developer platforms**, and **creator communities**.
22
22
  - ✅ Clear **Available / Taken / Error** output for each platform.
23
+ - ✅ Robust error handling: It prints the exact reason (e.g. Cannot use underscores, hyphens at the start/end)
23
24
  - ✅ Fully modular: add new platform modules easily.
24
- - ✅ Command-line interface ready: works directly after `pip install`.
25
+ - ✅ Wildcard-based username permutations for automatic variation generation using provided suffix
26
+ - ✅ Command-line interface ready: works directly after `pip install`
25
27
  - ✅ Can be used as username OSINT tool.
26
28
  - ✅ Very low and lightweight dependencies, can be run on any machine.
27
29
  ---
@@ -47,56 +49,39 @@ Optionally, scan a specific category or single module:
47
49
  user-scanner -u <username> -c dev
48
50
  user-scanner -l # Lists all available modules
49
51
  user-scanner -u <username> -m github
52
+ user-scanner -u <username> -p <suffix>
50
53
 
51
54
  ```
52
- ---
53
- ### Example Output:
54
55
 
55
- - Note*: New modules are constantly getting added so this might have only limited, outdated output:
56
+ Generate multiple username variations by appending a suffix:
57
+
58
+ ```bash
59
+ user-scanner -u <username> -p <suffix>
60
+
61
+ ```
62
+ Optionally, scan a specific category or single module with limit:
63
+
56
64
  ```bash
57
- Checking username: johndoe078
58
-
59
- == DEV SITES ==
60
- [✔] Codeberg: Available
61
- [✔] Cratesio: Available
62
- [✔] Dockerhub: Available
63
- [✘] Github: Taken
64
- [✔] Gitlab: Available
65
- [✔] Launchpad: Available
66
- [✔] Npmjs: Available
67
- [✔] Replit: Available
68
-
69
- == SOCIAL SITES ==
70
- [✔] Bluesky: Available
71
- [✔] Discord: Available
72
- [✘] Instagram: Taken
73
- [✔] Mastodon: Available
74
- [✔] Pinterest: Available
75
- [✘] Reddit: Taken
76
- [✔] Snapchat: Available
77
- [✔] Telegram: Available
78
- [✘] Threads: Taken
79
- [✔] X (Twitter): Available
80
- [✔] Youtube: Available
81
-
82
- == CREATOR SITES ==
83
- [✔] Devto: Available
84
- [✔] Hashnode: Available
85
- [✔] Kaggle: Available
86
- [✔] Medium: Available
87
- [✔] Patreon: Available
88
-
89
- == COMMUNITY SITES ==
90
- [✔] Coderlegion: Available
91
-
92
- == GAMING SITES ==
93
- [✔] Chess_com: Available
94
- [✔] Osu: Available
95
- [✔] Roblox: Available
96
- ...
97
- ...
98
- ...
65
+ user-scanner -u <username> -p <suffix> -c dev
66
+ user-scanner -u <username> -p <suffix> -m github
67
+ user-scanner -u <username> -p <suffix> -s <number> # limit generation of usernames
68
+ user-scanner -u <username> -p <suffix> -d <seconds> #delay to avoid rate-limits
99
69
  ```
70
+
71
+ ---
72
+ ### Screenshot:
73
+
74
+ - Note*: New modules are constantly getting added so this might have only limited, outdated output:
75
+
76
+
77
+ <img width="1080" height="770" alt="1000140392" src="https://github.com/user-attachments/assets/4638c8f6-40c6-46f8-ae17-ac65cd199d81" />
78
+
79
+
80
+ ---
81
+
82
+ <img width="1080" height="352" alt="1000140393" src="https://github.com/user-attachments/assets/578b248c-2a05-4917-aab3-6372a7c28045" />
83
+
84
+
100
85
  ### Contributing:
101
86
 
102
87
  Modules are organized by category:
@@ -108,21 +93,21 @@ user_scanner/
108
93
  ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
109
94
  ├── community/ # Community platforms (forums, niche sites)
110
95
  ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
96
+ ├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
111
97
  ```
112
98
 
113
99
  **Module guidelines:**
114
- - Each module must define a `validate_<site>()` function that takes a `username` and returns:
115
- - `1` → Available
116
- - `0` → Taken
117
- - `2`Error / Could not check
118
- - Use `httpx` for requests, `colorama` for colored output.
119
- - Optional: modules can define a CLI parser if they support custom arguments.
100
+ 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`).
101
+
102
+ Result semantics:
103
+ - Result.available()`available`
104
+ - Result.taken() `taken`
105
+ - Result.error(message: Optional[str]) `error`, blocked, unknown, or request failure (include short diagnostic message when helpful)
106
+
107
+ Follow this document when adding or updating validators.
120
108
 
121
109
  See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
122
110
 
123
- ### 📧 Contact:
124
- - [Email](kaifcodec@gmail.com)
125
-
126
111
  ---
127
112
 
128
113
  ### Dependencies:
@@ -136,8 +121,9 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
136
121
  This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
137
122
 
138
123
 
139
- <!---
140
- ## 🌟 Stars:
124
+ ---
125
+
126
+ ### Star History
141
127
 
142
128
  <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
143
129
  <picture>
@@ -146,6 +132,3 @@ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for d
146
132
  <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
147
133
  </picture>
148
134
  </a>
149
- --->
150
- ---
151
- ## ⚠️ `community/` and `gaming/` are small, looking for contributions
@@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi"
4
4
 
5
5
  [project]
6
6
  name = "user-scanner"
7
- version = "1.0.4.2"
7
+ version = "1.0.8.1"
8
8
  description = "Check username availability across multiple popular platforms"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}
@@ -26,4 +26,4 @@ Homepage = "https://github.com/kaifcodec/user-scanner"
26
26
  user-scanner = "user_scanner.__main__:main"
27
27
 
28
28
  [tool.flit.sdist]
29
- exclude = ["tests/", "docs/", ".github/", ".git", "rm_pycache", "che.py", ".gitignore"]
29
+ exclude = ["tests/", "docs/", ".github/", ".git", "rm_pycache.py", "che.py", ".gitignore"]
@@ -0,0 +1,134 @@
1
+ import argparse
2
+ import time
3
+ import re
4
+ from user_scanner.core.orchestrator import run_checks, load_modules , generate_permutations, load_categories
5
+ from colorama import Fore, Style
6
+ from .cli import banner
7
+ from .cli.banner import print_banner
8
+
9
+ MAX_PERMUTATIONS_LIMIT = 100 # To prevent excessive generation
10
+
11
+ def list_modules(category=None):
12
+ categories = load_categories()
13
+ categories_to_list = [category] if category else categories.keys()
14
+
15
+ for cat_name in categories_to_list:
16
+ path = categories[cat_name]
17
+ modules = load_modules(path)
18
+ print(Fore.MAGENTA +
19
+ f"\n== {cat_name.upper()} SITES =={Style.RESET_ALL}")
20
+ for module in modules:
21
+ site_name = module.__name__.split(".")[-1]
22
+ print(f" - {site_name}")
23
+
24
+
25
+ def main():
26
+ parser = argparse.ArgumentParser(
27
+ prog="user-scanner",
28
+ description="Scan usernames across multiple platforms."
29
+ )
30
+ parser.add_argument(
31
+ "-u", "--username", help="Username to scan across platforms"
32
+ )
33
+ parser.add_argument(
34
+ "-c", "--category", choices=load_categories().keys(),
35
+ help="Scan all platforms in a category"
36
+ )
37
+ parser.add_argument(
38
+ "-m", "--module", help="Scan a single specific module across all categories"
39
+ )
40
+ parser.add_argument(
41
+ "-l", "--list", action="store_true", help="List all available modules by category"
42
+ )
43
+ parser.add_argument(
44
+ "-v", "--verbose", action="store_true", help="Enable verbose output"
45
+ )
46
+
47
+ parser.add_argument(
48
+ "-p", "--permute",type=str,help="Generate username permutations using a string pattern (e.g -p 234)"
49
+ )
50
+ parser.add_argument(
51
+ "-s", "--stop",type=int,default=MAX_PERMUTATIONS_LIMIT,help="Limit the number of username permutations generated"
52
+ )
53
+
54
+ parser.add_argument(
55
+ "-d", "--delay",type=float,default=0,help="Delay in seconds between requests (recommended: 1-2 seconds)"
56
+ )
57
+
58
+ args = parser.parse_args()
59
+
60
+ if args.list:
61
+ list_modules(args.category)
62
+ return
63
+
64
+ if not args.username:
65
+ parser.print_help()
66
+ return
67
+
68
+ # Special username checks before run
69
+ if (args.module == "x" or args.category == "social"):
70
+ if re.search(r"[^a-zA-Z0-9._-]", args.username):
71
+ print(
72
+ Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. X (Twitter) doesn't support these." + Style.RESET_ALL)
73
+ if (args.module == "bluesky" or args.category == "social"):
74
+ if re.search(r"[^a-zA-Z0-9\.-]", args.username):
75
+ print(
76
+ Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. Bluesky will throw error. (Supported: only hyphens and digits)" + Style.RESET_ALL + "\n")
77
+ print_banner()
78
+
79
+ if args.permute and args.delay == 0:
80
+ print(
81
+ Fore.YELLOW
82
+ + "[!] Warning: You're generating multiple usernames with NO delay between requests. "
83
+ "This may trigger rate limits or IP bans. Use --delay 1 or higher. (Use only if the sites throw errors otherwise ignore)\n"
84
+ + Style.RESET_ALL)
85
+
86
+ usernames = [args.username] # Default single username list
87
+
88
+ #Added permutation support , generate all possible permutation of given sequence.
89
+ if args.permute:
90
+ usernames = generate_permutations(args.username, args.permute , args.stop)
91
+ print(Fore.CYAN + f"[+] Generated {len(usernames)} username permutations" + Style.RESET_ALL)
92
+
93
+
94
+
95
+ if args.module and "." in args.module:
96
+ args.module = args.module.replace(".", "_")
97
+
98
+
99
+ if args.module:
100
+ # Single module search across all categories
101
+ found = False
102
+ for cat_path in load_categories().values():
103
+ modules = load_modules(cat_path)
104
+ for module in modules:
105
+ site_name = module.__name__.split(".")[-1]
106
+ if site_name.lower() == args.module.lower():
107
+ from user_scanner.core.orchestrator import run_module_single
108
+ for name in usernames: # <-- permutation support here
109
+ run_module_single(module, name)
110
+ if args.delay > 0:
111
+ time.sleep(args.delay)
112
+ found = True
113
+ if not found:
114
+ print(
115
+ Fore.RED + f"[!] Module '{args.module}' not found in any category." + Style.RESET_ALL)
116
+ elif args.category:
117
+ # Category-wise scan
118
+ category_package = load_categories().get(args.category)
119
+ from user_scanner.core.orchestrator import run_checks_category
120
+
121
+ for name in usernames: # <-- permutation support here
122
+ run_checks_category(category_package, name, args.verbose)
123
+ if args.delay > 0:
124
+ time.sleep(args.delay)
125
+ else:
126
+ # Full scan
127
+ for name in usernames:
128
+ run_checks(name)
129
+ if args.delay > 0:
130
+ time.sleep(args.delay)
131
+
132
+
133
+ if __name__ == "__main__":
134
+ main()
@@ -23,10 +23,12 @@ INFO_BOX = f"""{C_MAGENTA} ╔═══════════════
23
23
  ║ {C_RED}♚ {C_GREEN}Email{C_WHITE} : kaifcodec@gmail.com {C_MAGENTA}║
24
24
  ══════════════════════════════════════════{Style.RESET_ALL}""".strip()
25
25
 
26
+
26
27
  def print_banner():
27
28
  print(BANNER_ASCII)
28
29
  print(INFO_BOX)
29
30
  print(" ")
30
31
 
32
+
31
33
  if __name__ == "__main__":
32
34
  print_banner()
@@ -0,0 +1 @@
1
+ # community
@@ -0,0 +1,19 @@
1
+ from user_scanner.core.orchestrator import status_validate
2
+
3
+
4
+ def validate_coderlegion(user):
5
+ url = f"https://coderlegion.com/user/{user}"
6
+
7
+ return status_validate(url, 404, 200, timeout=15.0)
8
+
9
+
10
+ if __name__ == "__main__":
11
+ user = input("Username?: ").strip()
12
+ result = validate_coderlegion(user)
13
+
14
+ if result == 1:
15
+ print("Available!")
16
+ elif result == 0:
17
+ print("Unavailable!")
18
+ else:
19
+ print("Error occured!")
@@ -0,0 +1,35 @@
1
+ from user_scanner.core.orchestrator import generic_validate
2
+ from user_scanner.core.result import Result
3
+
4
+ def validate_stackoverflow(user: str) -> Result:
5
+ url = f"https://stackoverflow.com/users/filter?search={user}"
6
+
7
+ def process(response):
8
+ if response.status_code == 200:
9
+ text = response.text
10
+
11
+ if "No users matched your search." in text:
12
+ return Result.available()
13
+
14
+ pattern = f'>{user}<'
15
+ if pattern in text:
16
+ return Result.taken()
17
+
18
+ return Result.available()
19
+
20
+ return Result.error("Unexpected status code from Stack Overflow")
21
+
22
+ return generic_validate(url, process)
23
+
24
+
25
+ if __name__ == "__main__":
26
+ user = input("Username?: ").strip()
27
+ result = validate_stackoverflow(user)
28
+
29
+ if result == Result.available():
30
+ print("Available!")
31
+ elif result == Result.taken():
32
+ print("Unavailable!")
33
+ else:
34
+ msg = result.get_reason()
35
+ print("Error occurred!" + msg)