user-scanner 1.0.0.4__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 (82) hide show
  1. user_scanner-1.0.8.1/PKG-INFO +148 -0
  2. user_scanner-1.0.8.1/README.md +134 -0
  3. {user_scanner-1.0.0.4 → user_scanner-1.0.8.1}/pyproject.toml +4 -1
  4. user_scanner-1.0.8.1/user_scanner/__main__.py +134 -0
  5. user_scanner-1.0.8.1/user_scanner/cli/banner.py +34 -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/__init__.py +0 -0
  28. user_scanner-1.0.8.1/user_scanner/donation/buymeacoffee.py +19 -0
  29. user_scanner-1.0.8.1/user_scanner/donation/liberapay.py +36 -0
  30. user_scanner-1.0.8.1/user_scanner/gaming/__init__.py +0 -0
  31. user_scanner-1.0.8.1/user_scanner/gaming/chess_com.py +38 -0
  32. user_scanner-1.0.8.1/user_scanner/gaming/minecraft.py +19 -0
  33. user_scanner-1.0.8.1/user_scanner/gaming/monkeytype.py +45 -0
  34. user_scanner-1.0.8.1/user_scanner/gaming/osu.py +19 -0
  35. user_scanner-1.0.8.1/user_scanner/gaming/roblox.py +43 -0
  36. user_scanner-1.0.8.1/user_scanner/gaming/steam.py +29 -0
  37. user_scanner-1.0.8.1/user_scanner/social/bluesky.py +54 -0
  38. user_scanner-1.0.8.1/user_scanner/social/discord.py +40 -0
  39. user_scanner-1.0.8.1/user_scanner/social/instagram.py +29 -0
  40. user_scanner-1.0.8.1/user_scanner/social/mastodon.py +19 -0
  41. user_scanner-1.0.8.1/user_scanner/social/pinterest.py +28 -0
  42. user_scanner-1.0.8.1/user_scanner/social/reddit.py +29 -0
  43. user_scanner-1.0.8.1/user_scanner/social/snapchat.py +35 -0
  44. user_scanner-1.0.8.1/user_scanner/social/soundcloud.py +43 -0
  45. user_scanner-1.0.8.1/user_scanner/social/telegram.py +29 -0
  46. user_scanner-1.0.8.1/user_scanner/social/threads.py +29 -0
  47. user_scanner-1.0.8.1/user_scanner/social/x.py +46 -0
  48. user_scanner-1.0.8.1/user_scanner/social/youtube.py +50 -0
  49. user_scanner-1.0.8.1/user_scanner/utils/update.py +0 -0
  50. user_scanner-1.0.8.1/user_scanner/utils/version.py +22 -0
  51. user_scanner-1.0.8.1/user_scanner/version.json +4 -0
  52. user_scanner-1.0.0.4/PKG-INFO +0 -14
  53. user_scanner-1.0.0.4/README.md +0 -1
  54. user_scanner-1.0.0.4/user_scanner/__main__.py +0 -92
  55. user_scanner-1.0.0.4/user_scanner/community/coderlegion.py +0 -39
  56. user_scanner-1.0.0.4/user_scanner/core/orchestrator.py +0 -91
  57. user_scanner-1.0.0.4/user_scanner/creator/devto.py +0 -37
  58. user_scanner-1.0.0.4/user_scanner/creator/hashnode.py +0 -54
  59. user_scanner-1.0.0.4/user_scanner/creator/kaggle.py +0 -37
  60. user_scanner-1.0.0.4/user_scanner/creator/medium.py +0 -41
  61. user_scanner-1.0.0.4/user_scanner/dev/codeberg.py +0 -37
  62. user_scanner-1.0.0.4/user_scanner/dev/cratesio.py +0 -39
  63. user_scanner-1.0.0.4/user_scanner/dev/dockerhub.py +0 -40
  64. user_scanner-1.0.0.4/user_scanner/dev/github.py +0 -46
  65. user_scanner-1.0.0.4/user_scanner/dev/gitlab.py +0 -51
  66. user_scanner-1.0.0.4/user_scanner/dev/launchpad.py +0 -39
  67. user_scanner-1.0.0.4/user_scanner/dev/npmjs.py +0 -40
  68. user_scanner-1.0.0.4/user_scanner/dev/replit.py +0 -37
  69. user_scanner-1.0.0.4/user_scanner/social/instagram.py +0 -42
  70. user_scanner-1.0.0.4/user_scanner/social/pinterest.py +0 -42
  71. user_scanner-1.0.0.4/user_scanner/social/reddit.py +0 -42
  72. user_scanner-1.0.0.4/user_scanner/social/snapchat.py +0 -48
  73. user_scanner-1.0.0.4/user_scanner/social/threads.py +0 -42
  74. user_scanner-1.0.0.4/user_scanner/social/x.py +0 -52
  75. user_scanner-1.0.0.4/user_scanner/social/youtube.py +0 -56
  76. {user_scanner-1.0.0.4 → user_scanner-1.0.8.1}/LICENSE +0 -0
  77. {user_scanner-1.0.0.4 → user_scanner-1.0.8.1}/user_scanner/__init__.py +0 -0
  78. {user_scanner-1.0.0.4/user_scanner/community → user_scanner-1.0.8.1/user_scanner/cli}/__init__.py +0 -0
  79. {user_scanner-1.0.0.4 → user_scanner-1.0.8.1}/user_scanner/core/__init__.py +0 -0
  80. {user_scanner-1.0.0.4 → user_scanner-1.0.8.1}/user_scanner/creator/__init__.py +0 -0
  81. {user_scanner-1.0.0.4 → user_scanner-1.0.8.1}/user_scanner/dev/__init__.py +0 -0
  82. {user_scanner-1.0.0.4 → user_scanner-1.0.8.1}/user_scanner/social/__init__.py +0 -0
@@ -0,0 +1,148 @@
1
+ Metadata-Version: 2.4
2
+ Name: user-scanner
3
+ Version: 1.0.8.1
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.8.1-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
+ - ✅ Robust error handling: It prints the exact reason (e.g. Cannot use underscores, hyphens at the start/end)
37
+ - ✅ Fully modular: add new platform modules easily.
38
+ - ✅ Wildcard-based username permutations for automatic variation generation using provided suffix
39
+ - ✅ Command-line interface ready: works directly after `pip install`
40
+ - ✅ Can be used as username OSINT tool.
41
+ - ✅ Very low and lightweight dependencies, can be run on any machine.
42
+ ---
43
+
44
+ ### Installation
45
+
46
+ ```bash
47
+ pip install user-scanner
48
+ ```
49
+
50
+ ---
51
+
52
+ ### Usage
53
+
54
+ Scan a username across all platforms:
55
+
56
+ ```bash
57
+ user-scanner -u <username>
58
+ ```
59
+ Optionally, scan a specific category or single module:
60
+
61
+ ```bash
62
+ user-scanner -u <username> -c dev
63
+ user-scanner -l # Lists all available modules
64
+ user-scanner -u <username> -m github
65
+ user-scanner -u <username> -p <suffix>
66
+
67
+ ```
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
+
77
+ ```bash
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
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
+
98
+ ### Contributing:
99
+
100
+ Modules are organized by category:
101
+
102
+ ```
103
+ user_scanner/
104
+ ├── dev/ # Developer platforms (GitHub, GitLab, etc.)
105
+ ├── social/ # Social platforms (Twitter/X, Reddit, Instagram, etc.)
106
+ ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
107
+ ├── community/ # Community platforms (forums, niche sites)
108
+ ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
109
+ ├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
110
+ ```
111
+
112
+ **Module guidelines:**
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.
121
+
122
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
123
+
124
+ ---
125
+
126
+ ### Dependencies:
127
+ - [httpx](https://pypi.org/project/httpx/)
128
+ - [colorama](https://pypi.org/project/colorama/)
129
+
130
+ ---
131
+
132
+ ### License
133
+
134
+ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
135
+
136
+
137
+ ---
138
+
139
+ ### Star History
140
+
141
+ <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
142
+ <picture>
143
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&theme=dark&legend=top-left" />
144
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
145
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
146
+ </picture>
147
+ </a>
148
+
@@ -0,0 +1,134 @@
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.8.1-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
+ - ✅ Robust error handling: It prints the exact reason (e.g. Cannot use underscores, hyphens at the start/end)
24
+ - ✅ Fully modular: add new platform modules easily.
25
+ - ✅ Wildcard-based username permutations for automatic variation generation using provided suffix
26
+ - ✅ Command-line interface ready: works directly after `pip install`
27
+ - ✅ Can be used as username OSINT tool.
28
+ - ✅ Very low and lightweight dependencies, can be run on any machine.
29
+ ---
30
+
31
+ ### Installation
32
+
33
+ ```bash
34
+ pip install user-scanner
35
+ ```
36
+
37
+ ---
38
+
39
+ ### Usage
40
+
41
+ Scan a username across all platforms:
42
+
43
+ ```bash
44
+ user-scanner -u <username>
45
+ ```
46
+ Optionally, scan a specific category or single module:
47
+
48
+ ```bash
49
+ user-scanner -u <username> -c dev
50
+ user-scanner -l # Lists all available modules
51
+ user-scanner -u <username> -m github
52
+ user-scanner -u <username> -p <suffix>
53
+
54
+ ```
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
+
64
+ ```bash
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
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
+
85
+ ### Contributing:
86
+
87
+ Modules are organized by category:
88
+
89
+ ```
90
+ user_scanner/
91
+ ├── dev/ # Developer platforms (GitHub, GitLab, etc.)
92
+ ├── social/ # Social platforms (Twitter/X, Reddit, Instagram, etc.)
93
+ ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
94
+ ├── community/ # Community platforms (forums, niche sites)
95
+ ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
96
+ ├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
97
+ ```
98
+
99
+ **Module guidelines:**
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.
108
+
109
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
110
+
111
+ ---
112
+
113
+ ### Dependencies:
114
+ - [httpx](https://pypi.org/project/httpx/)
115
+ - [colorama](https://pypi.org/project/colorama/)
116
+
117
+ ---
118
+
119
+ ### License
120
+
121
+ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
122
+
123
+
124
+ ---
125
+
126
+ ### Star History
127
+
128
+ <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
129
+ <picture>
130
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&theme=dark&legend=top-left" />
131
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
132
+ <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
133
+ </picture>
134
+ </a>
@@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi"
4
4
 
5
5
  [project]
6
6
  name = "user-scanner"
7
- version = "1.0.0.4"
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"}
@@ -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.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()
@@ -0,0 +1,34 @@
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
+
27
+ def print_banner():
28
+ print(BANNER_ASCII)
29
+ print(INFO_BOX)
30
+ print(" ")
31
+
32
+
33
+ if __name__ == "__main__":
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)