user-scanner 1.0.4.2__tar.gz → 1.0.6.0__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.6.0}/PKG-INFO +12 -53
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/README.md +11 -52
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/pyproject.toml +1 -1
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/__main__.py +24 -17
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/cli/banner.py +2 -0
- user_scanner-1.0.6.0/user_scanner/community/coderlegion.py +19 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/core/orchestrator.py +72 -15
- user_scanner-1.0.6.0/user_scanner/creator/devto.py +19 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/creator/hashnode.py +19 -17
- user_scanner-1.0.6.0/user_scanner/creator/itch_io.py +24 -0
- user_scanner-1.0.6.0/user_scanner/creator/kaggle.py +19 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/creator/medium.py +11 -10
- user_scanner-1.0.6.0/user_scanner/creator/patreon.py +25 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/creator/producthunt.py +16 -14
- user_scanner-1.0.6.0/user_scanner/dev/codeberg.py +19 -0
- user_scanner-1.0.6.0/user_scanner/dev/cratesio.py +26 -0
- user_scanner-1.0.6.0/user_scanner/dev/dockerhub.py +24 -0
- user_scanner-1.0.6.0/user_scanner/dev/github.py +33 -0
- user_scanner-1.0.6.0/user_scanner/dev/gitlab.py +39 -0
- user_scanner-1.0.6.0/user_scanner/dev/launchpad.py +26 -0
- user_scanner-1.0.4.2/user_scanner/creator/devto.py → user_scanner-1.0.6.0/user_scanner/dev/npmjs.py +21 -15
- user_scanner-1.0.6.0/user_scanner/dev/replit.py +19 -0
- user_scanner-1.0.6.0/user_scanner/donation/buymeacoffee.py +22 -0
- user_scanner-1.0.6.0/user_scanner/donation/liberapay.py +36 -0
- user_scanner-1.0.6.0/user_scanner/gaming/__init__.py +0 -0
- user_scanner-1.0.6.0/user_scanner/gaming/chess_com.py +43 -0
- user_scanner-1.0.6.0/user_scanner/gaming/minecraft.py +24 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/gaming/monkeytype.py +6 -18
- user_scanner-1.0.6.0/user_scanner/gaming/osu.py +24 -0
- user_scanner-1.0.6.0/user_scanner/gaming/roblox.py +38 -0
- user_scanner-1.0.6.0/user_scanner/gaming/steam.py +32 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/social/bluesky.py +21 -32
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/social/discord.py +12 -13
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/social/instagram.py +11 -24
- user_scanner-1.0.6.0/user_scanner/social/mastodon.py +25 -0
- user_scanner-1.0.6.0/user_scanner/social/pinterest.py +28 -0
- user_scanner-1.0.6.0/user_scanner/social/reddit.py +28 -0
- user_scanner-1.0.6.0/user_scanner/social/snapchat.py +35 -0
- user_scanner-1.0.6.0/user_scanner/social/telegram.py +29 -0
- user_scanner-1.0.6.0/user_scanner/social/threads.py +29 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/social/x.py +14 -12
- user_scanner-1.0.6.0/user_scanner/social/youtube.py +59 -0
- user_scanner-1.0.6.0/user_scanner/utils/update.py +0 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/utils/version.py +2 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/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/community/coderlegion.py +0 -39
- 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/patreon.py +0 -45
- 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/youtube.py +0 -56
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/LICENSE +0 -0
- {user_scanner-1.0.4.2/user_scanner/cli → user_scanner-1.0.6.0/user_scanner}/__init__.py +0 -0
- {user_scanner-1.0.4.2/user_scanner/community → user_scanner-1.0.6.0/user_scanner/cli}/__init__.py +0 -0
- {user_scanner-1.0.4.2/user_scanner/core → user_scanner-1.0.6.0/user_scanner/community}/__init__.py +0 -0
- {user_scanner-1.0.4.2/user_scanner/creator → user_scanner-1.0.6.0/user_scanner/core}/__init__.py +0 -0
- {user_scanner-1.0.4.2/user_scanner/gaming → user_scanner-1.0.6.0/user_scanner/creator}/__init__.py +0 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/user_scanner/dev/__init__.py +0 -0
- /user_scanner-1.0.4.2/user_scanner/utils/update.py → /user_scanner-1.0.6.0/user_scanner/donation/__init__.py +0 -0
- {user_scanner-1.0.4.2 → user_scanner-1.0.6.0}/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.6.0
|
|
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.6.0-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" />
|
|
@@ -63,53 +63,13 @@ user-scanner -u <username> -m github
|
|
|
63
63
|
|
|
64
64
|
```
|
|
65
65
|
---
|
|
66
|
-
###
|
|
66
|
+
### Screenshot:
|
|
67
|
+
|
|
68
|
+
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
69
|
+
|
|
70
|
+
<img width="1008" height="568" alt="1000139959" src="https://github.com/user-attachments/assets/467a4aa0-238d-4110-b9a6-d4b96c244432" />
|
|
71
|
+
|
|
67
72
|
|
|
68
|
-
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
69
|
-
```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
|
-
...
|
|
112
|
-
```
|
|
113
73
|
### Contributing:
|
|
114
74
|
|
|
115
75
|
Modules are organized by category:
|
|
@@ -121,6 +81,7 @@ user_scanner/
|
|
|
121
81
|
├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
|
|
122
82
|
├── community/ # Community platforms (forums, niche sites)
|
|
123
83
|
├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
|
|
84
|
+
├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
|
|
124
85
|
```
|
|
125
86
|
|
|
126
87
|
**Module guidelines:**
|
|
@@ -149,8 +110,9 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
|
|
|
149
110
|
This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
|
|
150
111
|
|
|
151
112
|
|
|
152
|
-
|
|
153
|
-
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### Star History
|
|
154
116
|
|
|
155
117
|
<a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
|
|
156
118
|
<picture>
|
|
@@ -159,7 +121,4 @@ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for d
|
|
|
159
121
|
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
|
|
160
122
|
</picture>
|
|
161
123
|
</a>
|
|
162
|
-
--->
|
|
163
|
-
---
|
|
164
|
-
## ⚠️ `community/` and `gaming/` are small, looking for contributions
|
|
165
124
|
|
|
@@ -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.6.0-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" />
|
|
@@ -50,53 +50,13 @@ user-scanner -u <username> -m github
|
|
|
50
50
|
|
|
51
51
|
```
|
|
52
52
|
---
|
|
53
|
-
###
|
|
53
|
+
### Screenshot:
|
|
54
|
+
|
|
55
|
+
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
56
|
+
|
|
57
|
+
<img width="1008" height="568" alt="1000139959" src="https://github.com/user-attachments/assets/467a4aa0-238d-4110-b9a6-d4b96c244432" />
|
|
58
|
+
|
|
54
59
|
|
|
55
|
-
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
56
|
-
```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
|
-
...
|
|
99
|
-
```
|
|
100
60
|
### Contributing:
|
|
101
61
|
|
|
102
62
|
Modules are organized by category:
|
|
@@ -108,6 +68,7 @@ user_scanner/
|
|
|
108
68
|
├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
|
|
109
69
|
├── community/ # Community platforms (forums, niche sites)
|
|
110
70
|
├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
|
|
71
|
+
├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
|
|
111
72
|
```
|
|
112
73
|
|
|
113
74
|
**Module guidelines:**
|
|
@@ -136,8 +97,9 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
|
|
|
136
97
|
This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
|
|
137
98
|
|
|
138
99
|
|
|
139
|
-
|
|
140
|
-
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
### Star History
|
|
141
103
|
|
|
142
104
|
<a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
|
|
143
105
|
<picture>
|
|
@@ -146,6 +108,3 @@ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for d
|
|
|
146
108
|
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
|
|
147
109
|
</picture>
|
|
148
110
|
</a>
|
|
149
|
-
--->
|
|
150
|
-
---
|
|
151
|
-
## ⚠️ `community/` and `gaming/` are small, looking for contributions
|
|
@@ -10,17 +10,20 @@ CATEGORY_MAPPING = {
|
|
|
10
10
|
"social": "social",
|
|
11
11
|
"creator": "creator",
|
|
12
12
|
"community": "community",
|
|
13
|
-
"gaming": "gaming"
|
|
13
|
+
"gaming": "gaming",
|
|
14
|
+
"donation": "donation"
|
|
14
15
|
}
|
|
15
16
|
|
|
17
|
+
|
|
16
18
|
def list_modules(category=None):
|
|
17
|
-
from user_scanner import dev, social, creator, community, gaming
|
|
19
|
+
from user_scanner import dev, social, creator, community, gaming, donation
|
|
18
20
|
packages = {
|
|
19
21
|
"dev": dev,
|
|
20
22
|
"social": social,
|
|
21
23
|
"creator": creator,
|
|
22
24
|
"community": community,
|
|
23
|
-
"gaming": gaming
|
|
25
|
+
"gaming": gaming,
|
|
26
|
+
"donation": donation
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
categories_to_list = [category] if category else packages.keys()
|
|
@@ -28,11 +31,13 @@ def list_modules(category=None):
|
|
|
28
31
|
for cat_name in categories_to_list:
|
|
29
32
|
package = packages[cat_name]
|
|
30
33
|
modules = load_modules(package)
|
|
31
|
-
print(Fore.MAGENTA +
|
|
34
|
+
print(Fore.MAGENTA +
|
|
35
|
+
f"\n== {cat_name.upper()} SITES =={Style.RESET_ALL}")
|
|
32
36
|
for module in modules:
|
|
33
37
|
site_name = module.__name__.split(".")[-1]
|
|
34
38
|
print(f" - {site_name}")
|
|
35
39
|
|
|
40
|
+
|
|
36
41
|
def main():
|
|
37
42
|
parser = argparse.ArgumentParser(
|
|
38
43
|
prog="user-scanner",
|
|
@@ -58,32 +63,32 @@ def main():
|
|
|
58
63
|
args = parser.parse_args()
|
|
59
64
|
|
|
60
65
|
if args.module and "." in args.module:
|
|
61
|
-
|
|
66
|
+
args.module = args.module.replace(".", "_")
|
|
62
67
|
|
|
63
68
|
if args.list:
|
|
64
69
|
list_modules(args.category)
|
|
65
70
|
return
|
|
66
71
|
|
|
67
|
-
|
|
68
72
|
# Special username checks before run
|
|
69
73
|
if (args.module == "x" or args.category == "social"):
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
if re.search(r"[^a-zA-Z0-9._-]", args.username):
|
|
75
|
+
print(
|
|
76
|
+
Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. X (Twitter) doesn't support these." + Style.RESET_ALL)
|
|
72
77
|
if (args.module == "bluesky" or args.category == "social"):
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
if re.search(r"[^a-zA-Z0-9\.-]", args.username):
|
|
79
|
+
print(
|
|
80
|
+
Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. Bluesky will throw error. (Supported: only hyphens and digits)" + Style.RESET_ALL + "\n")
|
|
75
81
|
if not args.username:
|
|
76
|
-
|
|
77
|
-
|
|
82
|
+
parser.print_help()
|
|
83
|
+
return
|
|
78
84
|
else:
|
|
79
|
-
|
|
80
|
-
|
|
85
|
+
print_banner()
|
|
81
86
|
|
|
82
|
-
from user_scanner import dev, social, creator, community, gaming
|
|
87
|
+
from user_scanner import dev, social, creator, community, gaming, donation
|
|
83
88
|
|
|
84
89
|
if args.module:
|
|
85
90
|
# Single module search across all categories
|
|
86
|
-
packages = [dev, social, creator, community, gaming]
|
|
91
|
+
packages = [dev, social, creator, community, gaming, donation]
|
|
87
92
|
found = False
|
|
88
93
|
for package in packages:
|
|
89
94
|
modules = load_modules(package)
|
|
@@ -94,7 +99,8 @@ def main():
|
|
|
94
99
|
run_module_single(module, args.username)
|
|
95
100
|
found = True
|
|
96
101
|
if not found:
|
|
97
|
-
print(
|
|
102
|
+
print(
|
|
103
|
+
Fore.RED + f"[!] Module '{args.module}' not found in any category." + Style.RESET_ALL)
|
|
98
104
|
elif args.category:
|
|
99
105
|
# Category-wise scan
|
|
100
106
|
category_package = eval(CATEGORY_MAPPING[args.category])
|
|
@@ -104,5 +110,6 @@ def main():
|
|
|
104
110
|
# Full scan
|
|
105
111
|
run_checks(args.username)
|
|
106
112
|
|
|
113
|
+
|
|
107
114
|
if __name__ == "__main__":
|
|
108
115
|
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,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!")
|
|
@@ -3,10 +3,14 @@ import pkgutil
|
|
|
3
3
|
from colorama import Fore, Style
|
|
4
4
|
import threading
|
|
5
5
|
|
|
6
|
+
import httpx
|
|
7
|
+
from httpx import ConnectError, TimeoutException
|
|
8
|
+
|
|
6
9
|
lock = threading.Condition()
|
|
7
|
-
#Basically which thread is the one to print
|
|
10
|
+
# Basically which thread is the one to print
|
|
8
11
|
print_queue = 0
|
|
9
12
|
|
|
13
|
+
|
|
10
14
|
def load_modules(package):
|
|
11
15
|
|
|
12
16
|
modules = []
|
|
@@ -18,12 +22,13 @@ def load_modules(package):
|
|
|
18
22
|
print(f"Failed to import {name}: {e}")
|
|
19
23
|
return modules
|
|
20
24
|
|
|
25
|
+
|
|
21
26
|
def worker_single(module, username, i):
|
|
22
27
|
global print_queue
|
|
23
28
|
|
|
24
29
|
func = next((getattr(module, f) for f in dir(module)
|
|
25
30
|
if f.startswith("validate_") and callable(getattr(module, f))), None)
|
|
26
|
-
site_name = module.__name__.split('.')[-1].capitalize().replace("_",".")
|
|
31
|
+
site_name = module.__name__.split('.')[-1].capitalize().replace("_", ".")
|
|
27
32
|
if site_name == "X":
|
|
28
33
|
site_name = "X (Twitter)"
|
|
29
34
|
|
|
@@ -43,7 +48,7 @@ def worker_single(module, username, i):
|
|
|
43
48
|
output = f" {Fore.YELLOW}[!] {site_name} has no validate_ function{Style.RESET_ALL}"
|
|
44
49
|
|
|
45
50
|
with lock:
|
|
46
|
-
#Waits for in-order printing
|
|
51
|
+
# Waits for in-order printing
|
|
47
52
|
while i != print_queue:
|
|
48
53
|
lock.wait()
|
|
49
54
|
|
|
@@ -51,13 +56,15 @@ def worker_single(module, username, i):
|
|
|
51
56
|
print_queue += 1
|
|
52
57
|
lock.notify_all()
|
|
53
58
|
|
|
59
|
+
|
|
54
60
|
def run_module_single(module, username):
|
|
55
|
-
#Just executes as if it was a thread
|
|
61
|
+
# Just executes as if it was a thread
|
|
56
62
|
worker_single(module, username, print_queue)
|
|
57
|
-
|
|
63
|
+
|
|
64
|
+
|
|
58
65
|
def run_checks_category(package, username, verbose=False):
|
|
59
66
|
global print_queue
|
|
60
|
-
|
|
67
|
+
|
|
61
68
|
modules = load_modules(package)
|
|
62
69
|
category_name = package.__name__.split('.')[-1].capitalize()
|
|
63
70
|
print(f"{Fore.MAGENTA}== {category_name} SITES =={Style.RESET_ALL}")
|
|
@@ -73,19 +80,69 @@ def run_checks_category(package, username, verbose=False):
|
|
|
73
80
|
for t in threads:
|
|
74
81
|
t.join()
|
|
75
82
|
|
|
83
|
+
|
|
76
84
|
def run_checks(username):
|
|
77
|
-
from user_scanner import dev, social, creator, community, gaming
|
|
85
|
+
from user_scanner import dev, social, creator, community, gaming, donation
|
|
78
86
|
|
|
79
|
-
|
|
80
|
-
("DEV", dev),
|
|
81
|
-
("SOCIAL", social),
|
|
82
|
-
("CREATOR", creator),
|
|
83
|
-
("COMMUNITY", community),
|
|
84
|
-
("GAMING", gaming)
|
|
85
|
-
]
|
|
87
|
+
packages = [dev, social, creator, community, gaming, donation]
|
|
86
88
|
|
|
87
89
|
print(f"\n{Fore.CYAN} Checking username: {username}{Style.RESET_ALL}\n")
|
|
88
90
|
|
|
89
|
-
for
|
|
91
|
+
for package in packages:
|
|
90
92
|
run_checks_category(package, username)
|
|
91
93
|
print()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def make_get_request(url, **kwargs):
|
|
97
|
+
"""Simple wrapper to **httpx.get** that predefines headers and timeout"""
|
|
98
|
+
if not "headers" in kwargs:
|
|
99
|
+
kwargs["headers"] = {
|
|
100
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36",
|
|
101
|
+
'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
102
|
+
'Accept-Encoding': "gzip, deflate, br",
|
|
103
|
+
'Accept-Language': "en-US,en;q=0.9",
|
|
104
|
+
'sec-fetch-dest': "document",
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if not "timeout" in kwargs:
|
|
108
|
+
kwargs["timeout"] = 5.0
|
|
109
|
+
|
|
110
|
+
return httpx.get(url, **kwargs)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def generic_validate(url, func, **kwargs):
|
|
114
|
+
"""
|
|
115
|
+
A generic validate function that makes a request and executes the provided function on the response.
|
|
116
|
+
"""
|
|
117
|
+
try:
|
|
118
|
+
response = make_get_request(url, **kwargs)
|
|
119
|
+
return func(response)
|
|
120
|
+
except (ConnectError, TimeoutException):
|
|
121
|
+
return 2
|
|
122
|
+
except Exception:
|
|
123
|
+
return 2
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def status_validate(url, available, taken, **kwargs):
|
|
127
|
+
"""
|
|
128
|
+
Function that takes a **url** and **kwargs** for the request and
|
|
129
|
+
checks if the request status matches the availabe or taken.
|
|
130
|
+
**Available** and **Taken** must either be whole numbers or lists of whole numbers.
|
|
131
|
+
"""
|
|
132
|
+
def inner(response):
|
|
133
|
+
# Checks if a number is equal or is contained inside
|
|
134
|
+
def contains(a, b): return (isinstance(a, list) and b in a) or (a == b)
|
|
135
|
+
|
|
136
|
+
status = response.status_code
|
|
137
|
+
available_value = contains(available, status)
|
|
138
|
+
taken_value = contains(taken, status)
|
|
139
|
+
|
|
140
|
+
if available_value and taken_value:
|
|
141
|
+
return 2 # Can't be both available and taken
|
|
142
|
+
elif available_value:
|
|
143
|
+
return 1
|
|
144
|
+
elif taken_value:
|
|
145
|
+
return 0
|
|
146
|
+
return 2
|
|
147
|
+
|
|
148
|
+
return generic_validate(url, inner, **kwargs)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from user_scanner.core.orchestrator import status_validate
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def validate_devto(user):
|
|
5
|
+
url = f"https://dev.to/{user}"
|
|
6
|
+
|
|
7
|
+
return status_validate(url, 404, 200, follow_redirects=True)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if __name__ == "__main__":
|
|
11
|
+
user = input("Username?: ").strip()
|
|
12
|
+
result = validate_devto(user)
|
|
13
|
+
|
|
14
|
+
if result == 1:
|
|
15
|
+
print("Available!")
|
|
16
|
+
elif result == 0:
|
|
17
|
+
print("Unavailable!")
|
|
18
|
+
else:
|
|
19
|
+
print("Error occurred!")
|
|
@@ -2,20 +2,21 @@ import httpx
|
|
|
2
2
|
import json
|
|
3
3
|
from httpx import ConnectError, TimeoutException
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
def validate_hashnode(user):
|
|
6
7
|
url = "https://hashnode.com/utility/ajax/check-username"
|
|
7
8
|
|
|
8
9
|
payload = {
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
"username": user,
|
|
11
|
+
"name": "Dummy Dummy"
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
headers = {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36",
|
|
16
|
+
'Accept': "application/json",
|
|
17
|
+
'Content-Type': "application/json",
|
|
18
|
+
'Origin': "https://hashnode.com",
|
|
19
|
+
'Referer': "https://hashnode.com/signup",
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
try:
|
|
@@ -33,7 +34,7 @@ def validate_hashnode(user):
|
|
|
33
34
|
return 2
|
|
34
35
|
|
|
35
36
|
else:
|
|
36
|
-
|
|
37
|
+
return 2
|
|
37
38
|
|
|
38
39
|
except (ConnectError, TimeoutException):
|
|
39
40
|
return 2
|
|
@@ -42,13 +43,14 @@ def validate_hashnode(user):
|
|
|
42
43
|
except Exception:
|
|
43
44
|
return 2
|
|
44
45
|
|
|
46
|
+
|
|
45
47
|
if __name__ == "__main__":
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
48
|
+
user = input("Username?: ").strip()
|
|
49
|
+
result = validate_hashnode(user)
|
|
50
|
+
|
|
51
|
+
if result == 1:
|
|
52
|
+
print("Available!")
|
|
53
|
+
elif result == 0:
|
|
54
|
+
print("Unavailable!")
|
|
55
|
+
else:
|
|
56
|
+
print("Error occurred!")
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from user_scanner.core.orchestrator import status_validate
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def validate_itch_io(user):
|
|
5
|
+
"""
|
|
6
|
+
Checks if a itch.io username is available.
|
|
7
|
+
Returns: 1 -> available, 0 -> taken, 2 -> error
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
url = f"https://{user}.itch.io"
|
|
11
|
+
|
|
12
|
+
return status_validate(url, 404, 200, follow_redirects=True)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
if __name__ == "__main__":
|
|
16
|
+
user = input("Username?: ").strip()
|
|
17
|
+
result = validate_itch_io(user)
|
|
18
|
+
|
|
19
|
+
if result == 1:
|
|
20
|
+
print("Available!")
|
|
21
|
+
elif result == 0:
|
|
22
|
+
print("Unavailable!")
|
|
23
|
+
else:
|
|
24
|
+
print("Error occurred!")
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from user_scanner.core.orchestrator import status_validate
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def validate_kaggle(user):
|
|
5
|
+
url = f"https://www.kaggle.com/{user}"
|
|
6
|
+
|
|
7
|
+
return status_validate(url, 404, 200, follow_redirects=True)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if __name__ == "__main__":
|
|
11
|
+
user = input("Username?: ").strip()
|
|
12
|
+
result = validate_kaggle(user)
|
|
13
|
+
|
|
14
|
+
if result == 1:
|
|
15
|
+
print("Available!")
|
|
16
|
+
elif result == 0:
|
|
17
|
+
print("Unavailable!")
|
|
18
|
+
else:
|
|
19
|
+
print("Error occurred!")
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import httpx
|
|
2
2
|
from httpx import ConnectError, TimeoutException
|
|
3
3
|
|
|
4
|
+
|
|
4
5
|
def validate_medium(user):
|
|
5
6
|
url = f"https://medium.com/@{user}"
|
|
6
7
|
|
|
@@ -15,7 +16,6 @@ def validate_medium(user):
|
|
|
15
16
|
if response.status_code == 200:
|
|
16
17
|
html_text = response.text
|
|
17
18
|
|
|
18
|
-
|
|
19
19
|
username_tag = f'property="profile:username" content="{user}"'
|
|
20
20
|
|
|
21
21
|
if username_tag in html_text:
|
|
@@ -29,13 +29,14 @@ def validate_medium(user):
|
|
|
29
29
|
except Exception:
|
|
30
30
|
return 2
|
|
31
31
|
|
|
32
|
+
|
|
32
33
|
if __name__ == "__main__":
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
34
|
+
user = input("Username?: ").strip()
|
|
35
|
+
result = validate_medium(user)
|
|
36
|
+
|
|
37
|
+
if result == 1:
|
|
38
|
+
print("Available!")
|
|
39
|
+
elif result == 0:
|
|
40
|
+
print("Unavailable!")
|
|
41
|
+
else:
|
|
42
|
+
print("Error occurred!")
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from user_scanner.core.orchestrator import status_validate
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def validate_patreon(user):
|
|
5
|
+
url = f"https://www.patreon.com/{user}"
|
|
6
|
+
|
|
7
|
+
return status_validate(url, 404, 200, timeout=15.0, follow_redirects=True)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
if __name__ == "__main__":
|
|
11
|
+
try:
|
|
12
|
+
import httpx
|
|
13
|
+
except ImportError:
|
|
14
|
+
print("Error: 'httpx' library is not installed.")
|
|
15
|
+
exit()
|
|
16
|
+
|
|
17
|
+
user = input("Username?: ").strip()
|
|
18
|
+
result = validate_patreon(user)
|
|
19
|
+
|
|
20
|
+
if result == 1:
|
|
21
|
+
print("Available!")
|
|
22
|
+
elif result == 0:
|
|
23
|
+
print("Unavailable!")
|
|
24
|
+
else:
|
|
25
|
+
print("Error occured!")
|