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.
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/PKG-INFO +45 -62
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/README.md +44 -61
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/pyproject.toml +2 -2
- user_scanner-1.0.8.1/user_scanner/__main__.py +134 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/cli/banner.py +2 -0
- user_scanner-1.0.8.1/user_scanner/community/__init__.py +1 -0
- user_scanner-1.0.8.1/user_scanner/community/coderlegion.py +19 -0
- user_scanner-1.0.8.1/user_scanner/community/stackoverflow.py +35 -0
- user_scanner-1.0.8.1/user_scanner/core/orchestrator.py +181 -0
- user_scanner-1.0.8.1/user_scanner/core/result.py +79 -0
- user_scanner-1.0.8.1/user_scanner/creator/devto.py +19 -0
- user_scanner-1.0.8.1/user_scanner/creator/hashnode.py +51 -0
- user_scanner-1.0.8.1/user_scanner/creator/itch_io.py +19 -0
- user_scanner-1.0.8.1/user_scanner/creator/kaggle.py +19 -0
- user_scanner-1.0.8.1/user_scanner/creator/medium.py +37 -0
- user_scanner-1.0.8.1/user_scanner/creator/patreon.py +19 -0
- user_scanner-1.0.8.1/user_scanner/creator/producthunt.py +47 -0
- user_scanner-1.0.8.1/user_scanner/dev/codeberg.py +19 -0
- user_scanner-1.0.8.1/user_scanner/dev/cratesio.py +26 -0
- user_scanner-1.0.8.1/user_scanner/dev/dockerhub.py +24 -0
- user_scanner-1.0.8.1/user_scanner/dev/github.py +50 -0
- user_scanner-1.0.8.1/user_scanner/dev/gitlab.py +40 -0
- user_scanner-1.0.8.1/user_scanner/dev/huggingface.py +19 -0
- user_scanner-1.0.8.1/user_scanner/dev/launchpad.py +26 -0
- user_scanner-1.0.8.1/user_scanner/dev/npmjs.py +27 -0
- user_scanner-1.0.8.1/user_scanner/dev/replit.py +19 -0
- user_scanner-1.0.8.1/user_scanner/donation/buymeacoffee.py +19 -0
- user_scanner-1.0.8.1/user_scanner/donation/liberapay.py +36 -0
- user_scanner-1.0.8.1/user_scanner/gaming/chess_com.py +38 -0
- user_scanner-1.0.8.1/user_scanner/gaming/minecraft.py +19 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/gaming/monkeytype.py +8 -26
- user_scanner-1.0.8.1/user_scanner/gaming/osu.py +19 -0
- user_scanner-1.0.8.1/user_scanner/gaming/roblox.py +43 -0
- user_scanner-1.0.8.1/user_scanner/gaming/steam.py +29 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/social/bluesky.py +21 -38
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/social/discord.py +17 -21
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/social/instagram.py +11 -24
- user_scanner-1.0.8.1/user_scanner/social/mastodon.py +19 -0
- user_scanner-1.0.8.1/user_scanner/social/pinterest.py +28 -0
- user_scanner-1.0.8.1/user_scanner/social/reddit.py +29 -0
- user_scanner-1.0.8.1/user_scanner/social/snapchat.py +35 -0
- user_scanner-1.0.8.1/user_scanner/social/soundcloud.py +43 -0
- user_scanner-1.0.8.1/user_scanner/social/telegram.py +29 -0
- user_scanner-1.0.8.1/user_scanner/social/threads.py +29 -0
- user_scanner-1.0.8.1/user_scanner/social/x.py +46 -0
- user_scanner-1.0.8.1/user_scanner/social/youtube.py +50 -0
- user_scanner-1.0.8.1/user_scanner/utils/update.py +0 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/utils/version.py +2 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/version.json +1 -1
- user_scanner-1.0.4.2/user_scanner/__init__.py +0 -1
- user_scanner-1.0.4.2/user_scanner/__main__.py +0 -108
- user_scanner-1.0.4.2/user_scanner/community/coderlegion.py +0 -39
- user_scanner-1.0.4.2/user_scanner/core/orchestrator.py +0 -91
- user_scanner-1.0.4.2/user_scanner/creator/devto.py +0 -37
- user_scanner-1.0.4.2/user_scanner/creator/hashnode.py +0 -54
- user_scanner-1.0.4.2/user_scanner/creator/itch_io.py +0 -45
- user_scanner-1.0.4.2/user_scanner/creator/kaggle.py +0 -37
- user_scanner-1.0.4.2/user_scanner/creator/medium.py +0 -41
- user_scanner-1.0.4.2/user_scanner/creator/patreon.py +0 -45
- user_scanner-1.0.4.2/user_scanner/creator/producthunt.py +0 -40
- user_scanner-1.0.4.2/user_scanner/dev/codeberg.py +0 -37
- user_scanner-1.0.4.2/user_scanner/dev/cratesio.py +0 -39
- user_scanner-1.0.4.2/user_scanner/dev/dockerhub.py +0 -40
- user_scanner-1.0.4.2/user_scanner/dev/github.py +0 -46
- user_scanner-1.0.4.2/user_scanner/dev/gitlab.py +0 -51
- user_scanner-1.0.4.2/user_scanner/dev/launchpad.py +0 -39
- user_scanner-1.0.4.2/user_scanner/dev/npmjs.py +0 -40
- user_scanner-1.0.4.2/user_scanner/dev/replit.py +0 -37
- user_scanner-1.0.4.2/user_scanner/gaming/chess_com.py +0 -54
- user_scanner-1.0.4.2/user_scanner/gaming/osu.py +0 -44
- user_scanner-1.0.4.2/user_scanner/gaming/roblox.py +0 -48
- user_scanner-1.0.4.2/user_scanner/gaming/steam.py +0 -46
- user_scanner-1.0.4.2/user_scanner/social/mastodon.py +0 -45
- user_scanner-1.0.4.2/user_scanner/social/pinterest.py +0 -42
- user_scanner-1.0.4.2/user_scanner/social/reddit.py +0 -42
- user_scanner-1.0.4.2/user_scanner/social/snapchat.py +0 -48
- user_scanner-1.0.4.2/user_scanner/social/telegram.py +0 -34
- user_scanner-1.0.4.2/user_scanner/social/threads.py +0 -42
- user_scanner-1.0.4.2/user_scanner/social/x.py +0 -54
- user_scanner-1.0.4.2/user_scanner/social/youtube.py +0 -56
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/LICENSE +0 -0
- {user_scanner-1.0.4.2/user_scanner/cli → user_scanner-1.0.8.1/user_scanner}/__init__.py +0 -0
- {user_scanner-1.0.4.2/user_scanner/community → user_scanner-1.0.8.1/user_scanner/cli}/__init__.py +0 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/core/__init__.py +0 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/creator/__init__.py +0 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.8.1}/user_scanner/dev/__init__.py +0 -0
- {user_scanner-1.0.4.2/user_scanner/gaming → user_scanner-1.0.8.1/user_scanner/donation}/__init__.py +0 -0
- /user_scanner-1.0.4.2/user_scanner/utils/update.py → /user_scanner-1.0.8.1/user_scanner/gaming/__init__.py +0 -0
- {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.
|
|
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
|

|
|
17
17
|
<p align="center">
|
|
18
|
-
<img src="https://img.shields.io/badge/Version-1.0.
|
|
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
|
-
- ✅
|
|
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
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
-
|
|
132
|
-
-
|
|
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
|
-
|
|
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
|

|
|
4
4
|
<p align="center">
|
|
5
|
-
<img src="https://img.shields.io/badge/Version-1.0.
|
|
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
|
-
- ✅
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
-
|
|
119
|
-
-
|
|
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
|
-
|
|
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.
|
|
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)
|