user-scanner 1.0.0.0__py3-none-any.whl → 1.0.0.2__py3-none-any.whl

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/__main__.py CHANGED
@@ -1,18 +1,89 @@
1
1
  import argparse
2
- from user_scanner.core.orchestrator import run_checks
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}")
3
30
 
4
31
  def main():
5
32
  parser = argparse.ArgumentParser(
6
33
  prog="user-scanner",
7
- description="Scan a username across dev, social, creator, and community platforms."
34
+ description="Scan usernames across multiple platforms."
8
35
  )
9
36
  parser.add_argument(
10
- "-u", "--username",
11
- required=True,
12
- help="Username to scan across all supported platforms."
37
+ "-u", "--username", help="Username to scan across platforms"
13
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
+
14
53
  args = parser.parse_args()
15
- run_checks(args.username)
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)
16
87
 
17
88
  if __name__ == "__main__":
18
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
 
user_scanner/social/x.py CHANGED
@@ -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 = {
@@ -18,14 +18,13 @@ def validate_x(user):
18
18
 
19
19
  try:
20
20
  response = httpx.get(url, params=params, headers=headers, timeout = 3.0)
21
- status = response.status_code
22
-
21
+ print(status)
23
22
  if status in [401, 403, 429]:
24
23
  return 2
25
-
24
+
25
+
26
26
  elif status == 200:
27
27
  data = response.json()
28
-
29
28
  if data.get('valid') is True:
30
29
  return 1
31
30
  elif data.get('reason') == 'taken':
@@ -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.2
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>
@@ -1,8 +1,8 @@
1
1
  user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- user_scanner/__main__.py,sha256=ezFz2V13AC0ordnS0og7ajdUGRJkyZU77EtXFFFwlu0,494
2
+ user_scanner/__main__.py,sha256=oodw-az7GxHMmu2pdvT2wv_3Yq5vThVLlW55Wr0TzbQ,2947
3
3
  user_scanner/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- user_scanner/core/orchestrator.py,sha256=LmhcXI7Cww-ZsDiodNIyNsyIUaXhPS7iNrBl9wLUjwo,1977
5
+ user_scanner/core/orchestrator.py,sha256=FQCwP9rBIXF_EXouJWE22k2TmOjAzpPu0p0m0oM0fik,3360
6
6
  user_scanner/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  user_scanner/creator/devto.py,sha256=K9jXlwSlhJxwZomGJB7m8u_22kTejLPJ_-AvwFZahsY,1034
8
8
  user_scanner/creator/hashnode.py,sha256=2Q-K9Yuy-6qOoJJPMq3UD0JHP4d9XeO9OGpBeHuMims,1351
@@ -23,10 +23,10 @@ user_scanner/social/pinterest.py,sha256=5cDmvtAXPtvpsO2vdAd30_Gx11i8L90mYrAU2OgN
23
23
  user_scanner/social/reddit.py,sha256=GkbQ6fPQVDygcOsnpuOkmIpATW5YlbEnKtC8lF2U5w0,1317
24
24
  user_scanner/social/snapchat.py,sha256=Qik4Jfaz3Glo_Wer5NrB7IVTBcP2D8AL_mVRnPXAKkc,1650
25
25
  user_scanner/social/threads.py,sha256=_8pUvLtJ6NT0LA9cEQn2IqIiA0IIn3LKZFaVtbhSMQk,1354
26
- user_scanner/social/x.py,sha256=zILZrXPZC_YoFTIMWxQSjsAg-hFLvTHN7wMMfHDaKrs,1422
26
+ user_scanner/social/x.py,sha256=WEqZV2-LAHh742bHlvfhVJ1pHm5zoKik-RvTORvR0dQ,1383
27
27
  user_scanner/social/youtube.py,sha256=pYBVeYpo1fFdcMAQ22ruka9TFkNpQr1h3YuatM_s0rU,2066
28
- user_scanner-1.0.0.0.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
29
- user_scanner-1.0.0.0.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
30
- user_scanner-1.0.0.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
31
- user_scanner-1.0.0.0.dist-info/METADATA,sha256=hB5SBLaMhTi3bOhfaXVSBq7fbTAq5prs5CSiz3Og3uo,452
32
- user_scanner-1.0.0.0.dist-info/RECORD,,
28
+ user_scanner-1.0.0.2.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
29
+ user_scanner-1.0.0.2.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
30
+ user_scanner-1.0.0.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
31
+ user_scanner-1.0.0.2.dist-info/METADATA,sha256=MkAAhdciR-At2g6P2TOKJj7TgKxGqrE1m4TS7qb2zB4,452
32
+ user_scanner-1.0.0.2.dist-info/RECORD,,