user-scanner 1.0.0.0__tar.gz → 1.0.0.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 (32) hide show
  1. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/PKG-INFO +1 -1
  2. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/pyproject.toml +1 -1
  3. user_scanner-1.0.0.1/user_scanner/__main__.py +89 -0
  4. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/core/orchestrator.py +34 -0
  5. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/x.py +5 -4
  6. user_scanner-1.0.0.0/user_scanner/__main__.py +0 -18
  7. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/LICENSE +0 -0
  8. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/README.md +0 -0
  9. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/__init__.py +0 -0
  10. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/community/__init__.py +0 -0
  11. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/core/__init__.py +0 -0
  12. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/__init__.py +0 -0
  13. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/devto.py +0 -0
  14. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/hashnode.py +0 -0
  15. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/kaggle.py +0 -0
  16. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/medium.py +0 -0
  17. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/__init__.py +0 -0
  18. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/codeberg.py +0 -0
  19. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/cratesio.py +0 -0
  20. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/dockerhub.py +0 -0
  21. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/github.py +0 -0
  22. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/gitlab.py +0 -0
  23. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/launchpad.py +0 -0
  24. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/npmjs.py +0 -0
  25. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/replit.py +0 -0
  26. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/__init__.py +0 -0
  27. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/instagram.py +0 -0
  28. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/pinterest.py +0 -0
  29. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/reddit.py +0 -0
  30. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/snapchat.py +0 -0
  31. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/threads.py +0 -0
  32. {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/youtube.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: user-scanner
3
- Version: 1.0.0.0
3
+ Version: 1.0.0.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>
@@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi"
4
4
 
5
5
  [project]
6
6
  name = "user-scanner"
7
- version = "1.0.0.0"
7
+ version = "1.0.0.1"
8
8
  description = "Check username availability across multiple popular platforms"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}
@@ -0,0 +1,89 @@
1
+ import argparse
2
+ from user_scanner.core.orchestrator import run_checks, load_modules
3
+ from colorama import Fore, Style
4
+
5
+ CATEGORY_MAPPING = {
6
+ "dev": "dev",
7
+ "social": "social",
8
+ "creator": "creator",
9
+ "community": "community"
10
+ }
11
+
12
+ def list_modules(category=None):
13
+ from user_scanner import dev, social, creator, community
14
+ packages = {
15
+ "dev": dev,
16
+ "social": social,
17
+ "creator": creator,
18
+ "community": community
19
+ }
20
+
21
+ categories_to_list = [category] if category else packages.keys()
22
+
23
+ for cat_name in categories_to_list:
24
+ package = packages[cat_name]
25
+ modules = load_modules(package)
26
+ print(Fore.MAGENTA + f"\n== {cat_name.upper()} SITES =={Style.RESET_ALL}")
27
+ for module in modules:
28
+ site_name = module.__name__.split(".")[-1]
29
+ print(f" - {site_name}")
30
+
31
+ def main():
32
+ parser = argparse.ArgumentParser(
33
+ prog="user-scanner",
34
+ description="Scan usernames across multiple platforms."
35
+ )
36
+ parser.add_argument(
37
+ "-u", "--username", help="Username to scan across platforms"
38
+ )
39
+ parser.add_argument(
40
+ "-c", "--category", choices=CATEGORY_MAPPING.keys(),
41
+ help="Scan all platforms in a category"
42
+ )
43
+ parser.add_argument(
44
+ "-m", "--module", help="Scan a single specific module across all categories"
45
+ )
46
+ parser.add_argument(
47
+ "-l", "--list", action="store_true", help="List all available modules by category"
48
+ )
49
+ parser.add_argument(
50
+ "-v", "--verbose", action="store_true", help="Enable verbose output"
51
+ )
52
+
53
+ args = parser.parse_args()
54
+
55
+ if args.list:
56
+ list_modules(args.category)
57
+ return
58
+
59
+ if not args.username:
60
+ print(Fore.RED + "[!] Please provide a username with -u or --username." + Style.RESET_ALL)
61
+ return
62
+
63
+ from user_scanner import dev, social, creator, community
64
+
65
+ if args.module:
66
+ # Single module search across all categories
67
+ packages = [dev, social, creator, community]
68
+ found = False
69
+ for package in packages:
70
+ modules = load_modules(package)
71
+ for module in modules:
72
+ site_name = module.__name__.split(".")[-1]
73
+ if site_name.lower() == args.module.lower():
74
+ from user_scanner.core.orchestrator import run_module_single
75
+ run_module_single(module, args.username)
76
+ found = True
77
+ if not found:
78
+ print(Fore.RED + f"[!] Module '{args.module}' not found in any category." + Style.RESET_ALL)
79
+ elif args.category:
80
+ # Category-wise scan
81
+ category_package = eval(CATEGORY_MAPPING[args.category])
82
+ from user_scanner.core.orchestrator import run_checks_category
83
+ run_checks_category(category_package, args.username, args.verbose)
84
+ else:
85
+ # Full scan
86
+ run_checks(args.username)
87
+
88
+ if __name__ == "__main__":
89
+ main()
@@ -13,6 +13,40 @@ def load_modules(package):
13
13
  print(f"Failed to import {name}: {e}")
14
14
  return modules
15
15
 
16
+ def run_module_single(module, username):
17
+ """
18
+ Run a single module's validate_ function on the given username.
19
+ """
20
+ func = next((getattr(module, f) for f in dir(module)
21
+ if f.startswith("validate_") and callable(getattr(module, f))), None)
22
+ site_name = module.__name__.split('.')[-1].capitalize()
23
+ if site_name == "X":
24
+ site_name = "X (Twitter)"
25
+
26
+ if func:
27
+ try:
28
+ result = func(username)
29
+ if result == 1:
30
+ print(f" {Fore.GREEN}[✔] {site_name}: Available{Style.RESET_ALL}")
31
+ elif result == 0:
32
+ print(f" {Fore.RED}[✘] {site_name}: Taken{Style.RESET_ALL}")
33
+ else:
34
+ print(f" {Fore.YELLOW}[!] {site_name}: Error{Style.RESET_ALL}")
35
+ except Exception as e:
36
+ print(f" {Fore.YELLOW}[!] {site_name}: Exception - {e}{Style.RESET_ALL}")
37
+ else:
38
+ print(f" {Fore.YELLOW}[!] {site_name} has no validate_ function{Style.RESET_ALL}")
39
+
40
+ def run_checks_category(package, username, verbose=False):
41
+ """
42
+ Run all modules in a given package (category) on the username.
43
+ """
44
+ modules = load_modules(package)
45
+ category_name = package.__name__.split('.')[-1].capitalize()
46
+ print(f"{Fore.MAGENTA}== {category_name} SITES =={Style.RESET_ALL}")
47
+
48
+ for module in modules:
49
+ run_module_single(module, username)
16
50
 
17
51
  def run_checks(username):
18
52
 
@@ -4,11 +4,11 @@ from httpx import ConnectError, TimeoutException
4
4
 
5
5
  def validate_x(user):
6
6
  url = "https://api.twitter.com/i/users/username_available.json"
7
-
7
+
8
8
  params = {
9
9
  "username": user,
10
- "full_name": "Test User",
11
- "email": "test@example.com"
10
+ "full_name": "John Doe",
11
+ "email": "johndoe07@gmail.com"
12
12
  }
13
13
 
14
14
  headers = {
@@ -19,9 +19,10 @@ def validate_x(user):
19
19
  try:
20
20
  response = httpx.get(url, params=params, headers=headers, timeout = 3.0)
21
21
  status = response.status_code
22
-
22
+ print(status)
23
23
  if status in [401, 403, 429]:
24
24
  return 2
25
+
25
26
 
26
27
  elif status == 200:
27
28
  data = response.json()
@@ -1,18 +0,0 @@
1
- import argparse
2
- from user_scanner.core.orchestrator import run_checks
3
-
4
- def main():
5
- parser = argparse.ArgumentParser(
6
- prog="user-scanner",
7
- description="Scan a username across dev, social, creator, and community platforms."
8
- )
9
- parser.add_argument(
10
- "-u", "--username",
11
- required=True,
12
- help="Username to scan across all supported platforms."
13
- )
14
- args = parser.parse_args()
15
- run_checks(args.username)
16
-
17
- if __name__ == "__main__":
18
- main()
File without changes
File without changes