user-scanner 1.0.0.1__tar.gz → 1.0.4.2__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 (53) hide show
  1. user_scanner-1.0.4.2/PKG-INFO +165 -0
  2. user_scanner-1.0.4.2/README.md +151 -0
  3. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/pyproject.toml +4 -1
  4. user_scanner-1.0.4.2/user_scanner/__init__.py +1 -0
  5. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/__main__.py +27 -8
  6. user_scanner-1.0.4.2/user_scanner/cli/banner.py +32 -0
  7. user_scanner-1.0.4.2/user_scanner/community/coderlegion.py +39 -0
  8. user_scanner-1.0.4.2/user_scanner/core/orchestrator.py +91 -0
  9. user_scanner-1.0.4.2/user_scanner/creator/itch_io.py +45 -0
  10. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/creator/kaggle.py +0 -4
  11. user_scanner-1.0.4.2/user_scanner/creator/patreon.py +45 -0
  12. user_scanner-1.0.4.2/user_scanner/creator/producthunt.py +40 -0
  13. user_scanner-1.0.4.2/user_scanner/gaming/__init__.py +0 -0
  14. user_scanner-1.0.4.2/user_scanner/gaming/chess_com.py +54 -0
  15. user_scanner-1.0.4.2/user_scanner/gaming/monkeytype.py +63 -0
  16. user_scanner-1.0.4.2/user_scanner/gaming/osu.py +44 -0
  17. user_scanner-1.0.4.2/user_scanner/gaming/roblox.py +48 -0
  18. user_scanner-1.0.4.2/user_scanner/gaming/steam.py +46 -0
  19. user_scanner-1.0.4.2/user_scanner/social/bluesky.py +71 -0
  20. user_scanner-1.0.4.2/user_scanner/social/discord.py +44 -0
  21. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/instagram.py +2 -8
  22. user_scanner-1.0.4.2/user_scanner/social/mastodon.py +45 -0
  23. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/pinterest.py +0 -6
  24. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/reddit.py +0 -6
  25. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/snapchat.py +0 -6
  26. user_scanner-1.0.4.2/user_scanner/social/telegram.py +34 -0
  27. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/threads.py +0 -6
  28. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/x.py +6 -9
  29. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/youtube.py +0 -6
  30. user_scanner-1.0.4.2/user_scanner/utils/update.py +0 -0
  31. user_scanner-1.0.4.2/user_scanner/utils/version.py +20 -0
  32. user_scanner-1.0.4.2/user_scanner/version.json +4 -0
  33. user_scanner-1.0.0.1/PKG-INFO +0 -14
  34. user_scanner-1.0.0.1/README.md +0 -1
  35. user_scanner-1.0.0.1/user_scanner/core/orchestrator.py +0 -96
  36. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/LICENSE +0 -0
  37. {user_scanner-1.0.0.1/user_scanner → user_scanner-1.0.4.2/user_scanner/cli}/__init__.py +0 -0
  38. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/community/__init__.py +0 -0
  39. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/core/__init__.py +0 -0
  40. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/creator/__init__.py +0 -0
  41. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/creator/devto.py +0 -0
  42. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/creator/hashnode.py +0 -0
  43. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/creator/medium.py +0 -0
  44. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/__init__.py +0 -0
  45. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/codeberg.py +0 -0
  46. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/cratesio.py +0 -0
  47. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/dockerhub.py +0 -0
  48. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/github.py +0 -0
  49. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/gitlab.py +0 -0
  50. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/launchpad.py +0 -0
  51. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/npmjs.py +0 -0
  52. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/dev/replit.py +0 -0
  53. {user_scanner-1.0.0.1 → user_scanner-1.0.4.2}/user_scanner/social/__init__.py +0 -0
@@ -0,0 +1,165 @@
1
+ Metadata-Version: 2.4
2
+ Name: user-scanner
3
+ Version: 1.0.4.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.7
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
+ ![1000136215](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.4.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
+ - ✅ Clear **Available / Taken / Error** output for each platform.
36
+ - ✅ Fully modular: add new platform modules easily.
37
+ - ✅ Command-line interface ready: works directly after `pip install`.
38
+ - ✅ Can be used as username OSINT tool.
39
+ - ✅ Very low and lightweight dependencies, can be run on any machine.
40
+ ---
41
+
42
+ ### Installation
43
+
44
+ ```bash
45
+ pip install user-scanner
46
+ ```
47
+
48
+ ---
49
+
50
+ ### Usage
51
+
52
+ Scan a username across all platforms:
53
+
54
+ ```bash
55
+ user-scanner -u <username>
56
+ ```
57
+ Optionally, scan a specific category or single module:
58
+
59
+ ```bash
60
+ user-scanner -u <username> -c dev
61
+ user-scanner -l # Lists all available modules
62
+ user-scanner -u <username> -m github
63
+
64
+ ```
65
+ ---
66
+ ### Example Output:
67
+
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
+ ### Contributing:
114
+
115
+ Modules are organized by category:
116
+
117
+ ```
118
+ user_scanner/
119
+ ├── dev/ # Developer platforms (GitHub, GitLab, etc.)
120
+ ├── social/ # Social platforms (Twitter/X, Reddit, Instagram, etc.)
121
+ ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
122
+ ├── community/ # Community platforms (forums, niche sites)
123
+ ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
124
+ ```
125
+
126
+ **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.
133
+
134
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
135
+
136
+ ### 📧 Contact:
137
+ - [Email](kaifcodec@gmail.com)
138
+
139
+ ---
140
+
141
+ ### Dependencies:
142
+ - [httpx](https://pypi.org/project/httpx/)
143
+ - [colorama](https://pypi.org/project/colorama/)
144
+
145
+ ---
146
+
147
+ ### License
148
+
149
+ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
150
+
151
+
152
+ <!---
153
+ ## 🌟 Stars:
154
+
155
+ <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
156
+ <picture>
157
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&theme=dark&legend=top-left" />
158
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
159
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
160
+ </picture>
161
+ </a>
162
+ --->
163
+ ---
164
+ ## ⚠️ `community/` and `gaming/` are small, looking for contributions
165
+
@@ -0,0 +1,151 @@
1
+ # User Scanner
2
+
3
+ ![1000136215](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
4
+ <p align="center">
5
+ <img src="https://img.shields.io/badge/Version-1.0.4.2-blueviolet?style=for-the-badge&logo=github" />
6
+ <img src="https://img.shields.io/github/issues/kaifcodec/user-scanner?style=for-the-badge&logo=github" />
7
+ <img src="https://img.shields.io/badge/Tested%20on-Termux-black?style=for-the-badge&logo=termux" />
8
+ <img src="https://img.shields.io/badge/Tested%20on-Windows-cyan?style=for-the-badge&logo=Windows" />
9
+ <img src="https://img.shields.io/badge/Tested%20on-Linux-balck?style=for-the-badge&logo=Linux" />
10
+ <img src="https://img.shields.io/pepy/dt/user-scanner?style=for-the-badge" />
11
+ </p>
12
+
13
+ ---
14
+
15
+ Scan a username across multiple social, developer, and creator platforms to see if it’s available.
16
+ Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instagram, and more, all in one command.
17
+
18
+
19
+ ### Features
20
+
21
+ - ✅ Check usernames across **social networks**, **developer platforms**, and **creator communities**.
22
+ - ✅ Clear **Available / Taken / Error** output for each platform.
23
+ - ✅ Fully modular: add new platform modules easily.
24
+ - ✅ Command-line interface ready: works directly after `pip install`.
25
+ - ✅ Can be used as username OSINT tool.
26
+ - ✅ Very low and lightweight dependencies, can be run on any machine.
27
+ ---
28
+
29
+ ### Installation
30
+
31
+ ```bash
32
+ pip install user-scanner
33
+ ```
34
+
35
+ ---
36
+
37
+ ### Usage
38
+
39
+ Scan a username across all platforms:
40
+
41
+ ```bash
42
+ user-scanner -u <username>
43
+ ```
44
+ Optionally, scan a specific category or single module:
45
+
46
+ ```bash
47
+ user-scanner -u <username> -c dev
48
+ user-scanner -l # Lists all available modules
49
+ user-scanner -u <username> -m github
50
+
51
+ ```
52
+ ---
53
+ ### Example Output:
54
+
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
+ ### Contributing:
101
+
102
+ Modules are organized by category:
103
+
104
+ ```
105
+ user_scanner/
106
+ ├── dev/ # Developer platforms (GitHub, GitLab, etc.)
107
+ ├── social/ # Social platforms (Twitter/X, Reddit, Instagram, etc.)
108
+ ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
109
+ ├── community/ # Community platforms (forums, niche sites)
110
+ ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
111
+ ```
112
+
113
+ **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.
120
+
121
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
122
+
123
+ ### 📧 Contact:
124
+ - [Email](kaifcodec@gmail.com)
125
+
126
+ ---
127
+
128
+ ### Dependencies:
129
+ - [httpx](https://pypi.org/project/httpx/)
130
+ - [colorama](https://pypi.org/project/colorama/)
131
+
132
+ ---
133
+
134
+ ### License
135
+
136
+ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
137
+
138
+
139
+ <!---
140
+ ## 🌟 Stars:
141
+
142
+ <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
143
+ <picture>
144
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&theme=dark&legend=top-left" />
145
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
146
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
147
+ </picture>
148
+ </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.0.1"
7
+ version = "1.0.4.2"
8
8
  description = "Check username availability across multiple popular platforms"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}
@@ -24,3 +24,6 @@ Homepage = "https://github.com/kaifcodec/user-scanner"
24
24
 
25
25
  [project.scripts]
26
26
  user-scanner = "user_scanner.__main__:main"
27
+
28
+ [tool.flit.sdist]
29
+ exclude = ["tests/", "docs/", ".github/", ".git", "rm_pycache", "che.py", ".gitignore"]
@@ -1,21 +1,26 @@
1
1
  import argparse
2
+ import re
2
3
  from user_scanner.core.orchestrator import run_checks, load_modules
3
4
  from colorama import Fore, Style
5
+ from .cli import banner
6
+ from .cli.banner import print_banner
4
7
 
5
8
  CATEGORY_MAPPING = {
6
9
  "dev": "dev",
7
10
  "social": "social",
8
11
  "creator": "creator",
9
- "community": "community"
12
+ "community": "community",
13
+ "gaming": "gaming"
10
14
  }
11
15
 
12
16
  def list_modules(category=None):
13
- from user_scanner import dev, social, creator, community
17
+ from user_scanner import dev, social, creator, community, gaming
14
18
  packages = {
15
19
  "dev": dev,
16
20
  "social": social,
17
21
  "creator": creator,
18
- "community": community
22
+ "community": community,
23
+ "gaming": gaming
19
24
  }
20
25
 
21
26
  categories_to_list = [category] if category else packages.keys()
@@ -34,7 +39,7 @@ def main():
34
39
  description="Scan usernames across multiple platforms."
35
40
  )
36
41
  parser.add_argument(
37
- "-u", "--username", help="Username to scan across platforms"
42
+ "-u", "--username", help="Username to scan across platforms"
38
43
  )
39
44
  parser.add_argument(
40
45
  "-c", "--category", choices=CATEGORY_MAPPING.keys(),
@@ -52,19 +57,33 @@ def main():
52
57
 
53
58
  args = parser.parse_args()
54
59
 
60
+ if args.module and "." in args.module:
61
+ args.module = args.module.replace(".", "_")
62
+
55
63
  if args.list:
56
64
  list_modules(args.category)
57
65
  return
58
66
 
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(Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. X (Twitter) doesn't support these." + Style.RESET_ALL)
72
+ if (args.module == "bluesky" or args.category == "social"):
73
+ if re.search(r"[^a-zA-Z0-9\.-]", args.username):
74
+ print(Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. Bluesky will throw error. (Supported: only hyphens and digits)" + Style.RESET_ALL +"\n")
59
75
  if not args.username:
60
- print(Fore.RED + "[!] Please provide a username with -u or --username." + Style.RESET_ALL)
61
- return
76
+ parser.print_help()
77
+ return
78
+ else:
79
+ print_banner()
80
+
62
81
 
63
- from user_scanner import dev, social, creator, community
82
+ from user_scanner import dev, social, creator, community, gaming
64
83
 
65
84
  if args.module:
66
85
  # Single module search across all categories
67
- packages = [dev, social, creator, community]
86
+ packages = [dev, social, creator, community, gaming]
68
87
  found = False
69
88
  for package in packages:
70
89
  modules = load_modules(package)
@@ -0,0 +1,32 @@
1
+ import json
2
+ from colorama import Fore, Style, init
3
+ from ..utils.version import load_local_version
4
+
5
+
6
+ version, version_type = load_local_version()
7
+ init(autoreset=True)
8
+ C_RED = Fore.RED + Style.BRIGHT
9
+ C_CYAN = Fore.CYAN + Style.BRIGHT
10
+ C_GREEN = Fore.GREEN + Style.BRIGHT
11
+ C_WHITE = Fore.WHITE + Style.BRIGHT
12
+ C_MAGENTA = Fore.MAGENTA + Style.BRIGHT
13
+ BANNER_ASCII = fr"""{C_CYAN} _ _ ___ ___ _ __ ___ ___ __ _ _ __ _ __ ___ _ __
14
+ | | | / __|/ _ \ '__|____/ __|/ __/ _` | '_ \| '_ \ / _ \ '__|
15
+ | |_| \__ \ __/ | |_____\__ \ (_| (_| | | | | | | | __/ |
16
+ \__,_|___/\___|_| |___/\___\__,_|_| |_|_| |_|\___|_| Version: {version}
17
+ {Style.RESET_ALL}""".strip()
18
+
19
+ INFO_BOX = f"""{C_MAGENTA} ╔════════════════════════════════════════╗
20
+ ║ {C_RED}♚ {C_GREEN}Project Name{C_WHITE} : UserScanner {C_MAGENTA}║
21
+ ║ {C_RED}♚ {C_GREEN}Author{C_WHITE} : Kaif {C_MAGENTA}║
22
+ ║ {C_RED}♚ {C_GREEN}Github{C_WHITE} : github.com/kaifcodec {C_MAGENTA}║
23
+ ║ {C_RED}♚ {C_GREEN}Email{C_WHITE} : kaifcodec@gmail.com {C_MAGENTA}║
24
+ ══════════════════════════════════════════{Style.RESET_ALL}""".strip()
25
+
26
+ def print_banner():
27
+ print(BANNER_ASCII)
28
+ print(INFO_BOX)
29
+ print(" ")
30
+
31
+ if __name__ == "__main__":
32
+ print_banner()
@@ -0,0 +1,39 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+
4
+ def validate_coderlegion(user):
5
+ url = f"https://coderlegion.com/user/{user}"
6
+
7
+ headers = {
8
+ 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
9
+ 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
10
+ 'Accept-Encoding': "gzip, deflate, br",
11
+ 'Accept-Language': "en-US,en;q=0.9",
12
+ }
13
+ try:
14
+ response = httpx.get(url, headers=headers, timeout = 15.0)
15
+ status = response.status_code
16
+
17
+ if status == 200:
18
+ return 0
19
+ elif status == 404:
20
+ return 1
21
+ else:
22
+ return 2
23
+
24
+ except (ConnectError, TimeoutException):
25
+ return 2
26
+ except Exception:
27
+ return 2
28
+
29
+ if __name__ == "__main__":
30
+ user = input ("Username?: ").strip()
31
+ result = validate_coderlegion(user)
32
+
33
+ if result == 1:
34
+ print("Available!")
35
+ elif result == 0:
36
+ print("Unavailable!")
37
+ else:
38
+ print("Error occured!")
39
+
@@ -0,0 +1,91 @@
1
+ import importlib
2
+ import pkgutil
3
+ from colorama import Fore, Style
4
+ import threading
5
+
6
+ lock = threading.Condition()
7
+ #Basically which thread is the one to print
8
+ print_queue = 0
9
+
10
+ def load_modules(package):
11
+
12
+ modules = []
13
+ for _, name, _ in pkgutil.iter_modules(package.__path__, package.__name__ + "."):
14
+ try:
15
+ module = importlib.import_module(name)
16
+ modules.append(module)
17
+ except Exception as e:
18
+ print(f"Failed to import {name}: {e}")
19
+ return modules
20
+
21
+ def worker_single(module, username, i):
22
+ global print_queue
23
+
24
+ func = next((getattr(module, f) for f in dir(module)
25
+ if f.startswith("validate_") and callable(getattr(module, f))), None)
26
+ site_name = module.__name__.split('.')[-1].capitalize().replace("_",".")
27
+ if site_name == "X":
28
+ site_name = "X (Twitter)"
29
+
30
+ output = ""
31
+ if func:
32
+ try:
33
+ result = func(username)
34
+ if result == 1:
35
+ output = f" {Fore.GREEN}[✔] {site_name}: Available{Style.RESET_ALL}"
36
+ elif result == 0:
37
+ output = f" {Fore.RED}[✘] {site_name}: Taken{Style.RESET_ALL}"
38
+ else:
39
+ output = f" {Fore.YELLOW}[!] {site_name}: Error{Style.RESET_ALL}"
40
+ except Exception as e:
41
+ output = f" {Fore.YELLOW}[!] {site_name}: Exception - {e}{Style.RESET_ALL}"
42
+ else:
43
+ output = f" {Fore.YELLOW}[!] {site_name} has no validate_ function{Style.RESET_ALL}"
44
+
45
+ with lock:
46
+ #Waits for in-order printing
47
+ while i != print_queue:
48
+ lock.wait()
49
+
50
+ print(output)
51
+ print_queue += 1
52
+ lock.notify_all()
53
+
54
+ def run_module_single(module, username):
55
+ #Just executes as if it was a thread
56
+ worker_single(module, username, print_queue)
57
+
58
+ def run_checks_category(package, username, verbose=False):
59
+ global print_queue
60
+
61
+ modules = load_modules(package)
62
+ category_name = package.__name__.split('.')[-1].capitalize()
63
+ print(f"{Fore.MAGENTA}== {category_name} SITES =={Style.RESET_ALL}")
64
+
65
+ print_queue = 0
66
+
67
+ threads = []
68
+ for i, module in enumerate(modules):
69
+ t = threading.Thread(target=worker_single, args=(module, username, i))
70
+ threads.append(t)
71
+ t.start()
72
+
73
+ for t in threads:
74
+ t.join()
75
+
76
+ def run_checks(username):
77
+ from user_scanner import dev, social, creator, community, gaming
78
+
79
+ categories = [
80
+ ("DEV", dev),
81
+ ("SOCIAL", social),
82
+ ("CREATOR", creator),
83
+ ("COMMUNITY", community),
84
+ ("GAMING", gaming)
85
+ ]
86
+
87
+ print(f"\n{Fore.CYAN} Checking username: {username}{Style.RESET_ALL}\n")
88
+
89
+ for _, package in categories:
90
+ run_checks_category(package, username)
91
+ print()
@@ -0,0 +1,45 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
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
+ headers = {
13
+ 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36",
14
+ 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
15
+ 'Accept-Encoding': "gzip, deflate, br",
16
+ 'Accept-Language': "en-US,en;q=0.9",
17
+ 'sec-fetch-dest': "document",
18
+ }
19
+
20
+ try:
21
+ response = httpx.get(url, headers = headers, timeout = 5, follow_redirects=True)
22
+ status = response.status_code
23
+
24
+ if status == 200:
25
+ return 0
26
+ elif status == 404:
27
+ return 1
28
+ else:
29
+ return 2
30
+
31
+ except (ConnectError, TimeoutException):
32
+ return 2
33
+ except Exception as e:
34
+ return 2
35
+
36
+ if __name__ == "__main__":
37
+ user = input ("Username?: ").strip()
38
+ result = validate_itch_io(user)
39
+
40
+ if result == 1:
41
+ print("Available!")
42
+ elif result == 0:
43
+ print("Unavailable!")
44
+ else:
45
+ print("Error occurred!")
@@ -10,17 +10,13 @@ def validate_kaggle(user):
10
10
  }
11
11
 
12
12
  try:
13
- # Use GET request for maximum fidelity, though we only check status code
14
13
  response = httpx.get(url, headers=headers, timeout=3.0, follow_redirects=True)
15
14
  status = response.status_code
16
15
 
17
- # If a profile exists (Taken) -> 200 OK
18
16
  if status == 200:
19
17
  return 0
20
- # If no profile exists (Available) -> 404 Not Found
21
18
  elif status == 404:
22
19
  return 1
23
- # Other status codes are errors
24
20
  else:
25
21
  return 2
26
22
 
@@ -0,0 +1,45 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+
4
+ def validate_patreon(user):
5
+ url = f"https://www.patreon.com/{user}"
6
+
7
+ headers = {
8
+ 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
9
+ 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
10
+ 'Accept-Encoding': "gzip, deflate, br",
11
+ 'Accept-Language': "en-US,en;q=0.9",
12
+ }
13
+
14
+ try:
15
+ response = httpx.get(url, headers=headers, timeout = 15.0, follow_redirects=True)
16
+ status = response.status_code
17
+
18
+ if status == 200:
19
+ return 0
20
+ elif status == 404:
21
+ return 1
22
+ else:
23
+ return 2
24
+
25
+ except (ConnectError, TimeoutException):
26
+ return 2
27
+ except Exception:
28
+ return 2
29
+
30
+ if __name__ == "__main__":
31
+ try:
32
+ import httpx
33
+ except ImportError:
34
+ print("Error: 'httpx' library is not installed.")
35
+ exit()
36
+
37
+ user = input ("Username?: ").strip()
38
+ result = validate_patreon(user)
39
+
40
+ if result == 1:
41
+ print("Available!")
42
+ elif result == 0:
43
+ print("Unavailable!")
44
+ else:
45
+ print("Error occured!")