user-scanner 1.0.5.0__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.
Files changed (77) hide show
  1. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/PKG-INFO +6 -7
  2. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/README.md +5 -6
  3. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/pyproject.toml +1 -1
  4. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/__main__.py +17 -12
  5. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/cli/banner.py +2 -0
  6. user_scanner-1.0.6.0/user_scanner/community/coderlegion.py +19 -0
  7. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/core/orchestrator.py +18 -10
  8. user_scanner-1.0.6.0/user_scanner/creator/devto.py +19 -0
  9. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/creator/hashnode.py +19 -17
  10. user_scanner-1.0.6.0/user_scanner/creator/itch_io.py +24 -0
  11. user_scanner-1.0.6.0/user_scanner/creator/kaggle.py +19 -0
  12. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/creator/medium.py +11 -10
  13. user_scanner-1.0.6.0/user_scanner/creator/patreon.py +25 -0
  14. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/creator/producthunt.py +16 -14
  15. user_scanner-1.0.6.0/user_scanner/dev/codeberg.py +19 -0
  16. user_scanner-1.0.6.0/user_scanner/dev/cratesio.py +26 -0
  17. user_scanner-1.0.6.0/user_scanner/dev/dockerhub.py +24 -0
  18. user_scanner-1.0.6.0/user_scanner/dev/github.py +33 -0
  19. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/dev/gitlab.py +14 -12
  20. user_scanner-1.0.6.0/user_scanner/dev/launchpad.py +26 -0
  21. user_scanner-1.0.6.0/user_scanner/dev/npmjs.py +43 -0
  22. user_scanner-1.0.6.0/user_scanner/dev/replit.py +19 -0
  23. user_scanner-1.0.6.0/user_scanner/donation/buymeacoffee.py +22 -0
  24. user_scanner-1.0.6.0/user_scanner/donation/liberapay.py +36 -0
  25. user_scanner-1.0.6.0/user_scanner/gaming/__init__.py +0 -0
  26. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/gaming/chess_com.py +20 -18
  27. user_scanner-1.0.6.0/user_scanner/gaming/minecraft.py +24 -0
  28. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/gaming/monkeytype.py +4 -3
  29. user_scanner-1.0.6.0/user_scanner/gaming/osu.py +24 -0
  30. user_scanner-1.0.6.0/user_scanner/gaming/roblox.py +38 -0
  31. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/gaming/steam.py +12 -10
  32. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/social/bluesky.py +20 -18
  33. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/social/discord.py +12 -13
  34. user_scanner-1.0.6.0/user_scanner/social/instagram.py +29 -0
  35. user_scanner-1.0.6.0/user_scanner/social/mastodon.py +25 -0
  36. user_scanner-1.0.6.0/user_scanner/social/pinterest.py +28 -0
  37. user_scanner-1.0.6.0/user_scanner/social/reddit.py +28 -0
  38. user_scanner-1.0.6.0/user_scanner/social/snapchat.py +35 -0
  39. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/social/telegram.py +13 -11
  40. user_scanner-1.0.6.0/user_scanner/social/threads.py +29 -0
  41. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/social/x.py +14 -12
  42. user_scanner-1.0.6.0/user_scanner/social/youtube.py +59 -0
  43. user_scanner-1.0.6.0/user_scanner/utils/update.py +0 -0
  44. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/utils/version.py +2 -0
  45. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/version.json +1 -1
  46. user_scanner-1.0.5.0/user_scanner/__init__.py +0 -1
  47. user_scanner-1.0.5.0/user_scanner/community/coderlegion.py +0 -18
  48. user_scanner-1.0.5.0/user_scanner/creator/devto.py +0 -17
  49. user_scanner-1.0.5.0/user_scanner/creator/itch_io.py +0 -22
  50. user_scanner-1.0.5.0/user_scanner/creator/kaggle.py +0 -18
  51. user_scanner-1.0.5.0/user_scanner/creator/patreon.py +0 -23
  52. user_scanner-1.0.5.0/user_scanner/dev/codeberg.py +0 -17
  53. user_scanner-1.0.5.0/user_scanner/dev/cratesio.py +0 -24
  54. user_scanner-1.0.5.0/user_scanner/dev/dockerhub.py +0 -22
  55. user_scanner-1.0.5.0/user_scanner/dev/github.py +0 -31
  56. user_scanner-1.0.5.0/user_scanner/dev/launchpad.py +0 -24
  57. user_scanner-1.0.5.0/user_scanner/dev/npmjs.py +0 -40
  58. user_scanner-1.0.5.0/user_scanner/dev/replit.py +0 -17
  59. user_scanner-1.0.5.0/user_scanner/donation/buymeacoffee.py +0 -21
  60. user_scanner-1.0.5.0/user_scanner/gaming/osu.py +0 -22
  61. user_scanner-1.0.5.0/user_scanner/gaming/roblox.py +0 -34
  62. user_scanner-1.0.5.0/user_scanner/social/instagram.py +0 -27
  63. user_scanner-1.0.5.0/user_scanner/social/mastodon.py +0 -23
  64. user_scanner-1.0.5.0/user_scanner/social/pinterest.py +0 -26
  65. user_scanner-1.0.5.0/user_scanner/social/reddit.py +0 -26
  66. user_scanner-1.0.5.0/user_scanner/social/snapchat.py +0 -33
  67. user_scanner-1.0.5.0/user_scanner/social/threads.py +0 -27
  68. user_scanner-1.0.5.0/user_scanner/social/youtube.py +0 -56
  69. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/LICENSE +0 -0
  70. {user_scanner-1.0.5.0/user_scanner/cli → user_scanner-1.0.6.0/user_scanner}/__init__.py +0 -0
  71. {user_scanner-1.0.5.0/user_scanner/community → user_scanner-1.0.6.0/user_scanner/cli}/__init__.py +0 -0
  72. {user_scanner-1.0.5.0/user_scanner/core → user_scanner-1.0.6.0/user_scanner/community}/__init__.py +0 -0
  73. {user_scanner-1.0.5.0/user_scanner/creator → user_scanner-1.0.6.0/user_scanner/core}/__init__.py +0 -0
  74. {user_scanner-1.0.5.0/user_scanner/donation → user_scanner-1.0.6.0/user_scanner/creator}/__init__.py +0 -0
  75. {user_scanner-1.0.5.0 → user_scanner-1.0.6.0}/user_scanner/dev/__init__.py +0 -0
  76. {user_scanner-1.0.5.0/user_scanner/gaming → user_scanner-1.0.6.0/user_scanner/donation}/__init__.py +0 -0
  77. {user_scanner-1.0.5.0 → 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.5.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
  ![1000136215](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
17
17
  <p align="center">
18
- <img src="https://img.shields.io/badge/Version-1.0.5.0-blueviolet?style=for-the-badge&logo=github" />
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" />
@@ -81,6 +81,7 @@ user_scanner/
81
81
  ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
82
82
  ├── community/ # Community platforms (forums, niche sites)
83
83
  ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
84
+ ├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
84
85
  ```
85
86
 
86
87
  **Module guidelines:**
@@ -109,8 +110,9 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
109
110
  This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
110
111
 
111
112
 
112
- <!---
113
- ## 🌟 Stars:
113
+ ---
114
+
115
+ ### Star History
114
116
 
115
117
  <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
116
118
  <picture>
@@ -119,7 +121,4 @@ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for d
119
121
  <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
120
122
  </picture>
121
123
  </a>
122
- --->
123
- ---
124
- ## ⚠️ `community/` and `gaming/` are small, looking for contributions
125
124
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  ![1000136215](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
4
4
  <p align="center">
5
- <img src="https://img.shields.io/badge/Version-1.0.5.0-blueviolet?style=for-the-badge&logo=github" />
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" />
@@ -68,6 +68,7 @@ user_scanner/
68
68
  ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
69
69
  ├── community/ # Community platforms (forums, niche sites)
70
70
  ├── gaming/ # Gaming sites (chess.com, roblox, monkeytype etc.)
71
+ ├── donation/ # Donation taking sites (buymeacoffe.com, similar...)
71
72
  ```
72
73
 
73
74
  **Module guidelines:**
@@ -96,8 +97,9 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
96
97
  This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
97
98
 
98
99
 
99
- <!---
100
- ## 🌟 Stars:
100
+ ---
101
+
102
+ ### Star History
101
103
 
102
104
  <a href="https://www.star-history.com/#kaifcodec/user-scanner&type=date&legend=top-left">
103
105
  <picture>
@@ -106,6 +108,3 @@ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for d
106
108
  <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=kaifcodec/user-scanner&type=date&legend=top-left" />
107
109
  </picture>
108
110
  </a>
109
- --->
110
- ---
111
- ## ⚠️ `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.5.0"
7
+ version = "1.0.6.0"
8
8
  description = "Check username availability across multiple popular platforms"
9
9
  readme = "README.md"
10
10
  license = {file = "LICENSE"}
@@ -14,6 +14,7 @@ CATEGORY_MAPPING = {
14
14
  "donation": "donation"
15
15
  }
16
16
 
17
+
17
18
  def list_modules(category=None):
18
19
  from user_scanner import dev, social, creator, community, gaming, donation
19
20
  packages = {
@@ -30,11 +31,13 @@ def list_modules(category=None):
30
31
  for cat_name in categories_to_list:
31
32
  package = packages[cat_name]
32
33
  modules = load_modules(package)
33
- print(Fore.MAGENTA + f"\n== {cat_name.upper()} SITES =={Style.RESET_ALL}")
34
+ print(Fore.MAGENTA +
35
+ f"\n== {cat_name.upper()} SITES =={Style.RESET_ALL}")
34
36
  for module in modules:
35
37
  site_name = module.__name__.split(".")[-1]
36
38
  print(f" - {site_name}")
37
39
 
40
+
38
41
  def main():
39
42
  parser = argparse.ArgumentParser(
40
43
  prog="user-scanner",
@@ -60,26 +63,26 @@ def main():
60
63
  args = parser.parse_args()
61
64
 
62
65
  if args.module and "." in args.module:
63
- args.module = args.module.replace(".", "_")
66
+ args.module = args.module.replace(".", "_")
64
67
 
65
68
  if args.list:
66
69
  list_modules(args.category)
67
70
  return
68
71
 
69
-
70
72
  # Special username checks before run
71
73
  if (args.module == "x" or args.category == "social"):
72
- if re.search(r"[^a-zA-Z0-9._-]", args.username):
73
- print(Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. X (Twitter) doesn't support these." + Style.RESET_ALL)
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)
74
77
  if (args.module == "bluesky" or args.category == "social"):
75
- if re.search(r"[^a-zA-Z0-9\.-]", args.username):
76
- print(Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. Bluesky will throw error. (Supported: only hyphens and digits)" + Style.RESET_ALL +"\n")
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")
77
81
  if not args.username:
78
- parser.print_help()
79
- return
82
+ parser.print_help()
83
+ return
80
84
  else:
81
- print_banner()
82
-
85
+ print_banner()
83
86
 
84
87
  from user_scanner import dev, social, creator, community, gaming, donation
85
88
 
@@ -96,7 +99,8 @@ def main():
96
99
  run_module_single(module, args.username)
97
100
  found = True
98
101
  if not found:
99
- print(Fore.RED + f"[!] Module '{args.module}' not found in any category." + Style.RESET_ALL)
102
+ print(
103
+ Fore.RED + f"[!] Module '{args.module}' not found in any category." + Style.RESET_ALL)
100
104
  elif args.category:
101
105
  # Category-wise scan
102
106
  category_package = eval(CATEGORY_MAPPING[args.category])
@@ -106,5 +110,6 @@ def main():
106
110
  # Full scan
107
111
  run_checks(args.username)
108
112
 
113
+
109
114
  if __name__ == "__main__":
110
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!")
@@ -7,9 +7,10 @@ import httpx
7
7
  from httpx import ConnectError, TimeoutException
8
8
 
9
9
  lock = threading.Condition()
10
- #Basically which thread is the one to print
10
+ # Basically which thread is the one to print
11
11
  print_queue = 0
12
12
 
13
+
13
14
  def load_modules(package):
14
15
 
15
16
  modules = []
@@ -21,12 +22,13 @@ def load_modules(package):
21
22
  print(f"Failed to import {name}: {e}")
22
23
  return modules
23
24
 
25
+
24
26
  def worker_single(module, username, i):
25
27
  global print_queue
26
28
 
27
29
  func = next((getattr(module, f) for f in dir(module)
28
30
  if f.startswith("validate_") and callable(getattr(module, f))), None)
29
- site_name = module.__name__.split('.')[-1].capitalize().replace("_",".")
31
+ site_name = module.__name__.split('.')[-1].capitalize().replace("_", ".")
30
32
  if site_name == "X":
31
33
  site_name = "X (Twitter)"
32
34
 
@@ -46,7 +48,7 @@ def worker_single(module, username, i):
46
48
  output = f" {Fore.YELLOW}[!] {site_name} has no validate_ function{Style.RESET_ALL}"
47
49
 
48
50
  with lock:
49
- #Waits for in-order printing
51
+ # Waits for in-order printing
50
52
  while i != print_queue:
51
53
  lock.wait()
52
54
 
@@ -54,13 +56,15 @@ def worker_single(module, username, i):
54
56
  print_queue += 1
55
57
  lock.notify_all()
56
58
 
59
+
57
60
  def run_module_single(module, username):
58
- #Just executes as if it was a thread
61
+ # Just executes as if it was a thread
59
62
  worker_single(module, username, print_queue)
60
-
63
+
64
+
61
65
  def run_checks_category(package, username, verbose=False):
62
66
  global print_queue
63
-
67
+
64
68
  modules = load_modules(package)
65
69
  category_name = package.__name__.split('.')[-1].capitalize()
66
70
  print(f"{Fore.MAGENTA}== {category_name} SITES =={Style.RESET_ALL}")
@@ -76,6 +80,7 @@ def run_checks_category(package, username, verbose=False):
76
80
  for t in threads:
77
81
  t.join()
78
82
 
83
+
79
84
  def run_checks(username):
80
85
  from user_scanner import dev, social, creator, community, gaming, donation
81
86
 
@@ -87,6 +92,7 @@ def run_checks(username):
87
92
  run_checks_category(package, username)
88
93
  print()
89
94
 
95
+
90
96
  def make_get_request(url, **kwargs):
91
97
  """Simple wrapper to **httpx.get** that predefines headers and timeout"""
92
98
  if not "headers" in kwargs:
@@ -103,6 +109,7 @@ def make_get_request(url, **kwargs):
103
109
 
104
110
  return httpx.get(url, **kwargs)
105
111
 
112
+
106
113
  def generic_validate(url, func, **kwargs):
107
114
  """
108
115
  A generic validate function that makes a request and executes the provided function on the response.
@@ -114,7 +121,8 @@ def generic_validate(url, func, **kwargs):
114
121
  return 2
115
122
  except Exception:
116
123
  return 2
117
-
124
+
125
+
118
126
  def status_validate(url, available, taken, **kwargs):
119
127
  """
120
128
  Function that takes a **url** and **kwargs** for the request and
@@ -122,15 +130,15 @@ def status_validate(url, available, taken, **kwargs):
122
130
  **Available** and **Taken** must either be whole numbers or lists of whole numbers.
123
131
  """
124
132
  def inner(response):
125
- #Checks if a number is equal or is contained inside
126
- contains = lambda a,b: (isinstance(a,list) and b in a) or (a == b)
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)
127
135
 
128
136
  status = response.status_code
129
137
  available_value = contains(available, status)
130
138
  taken_value = contains(taken, status)
131
139
 
132
140
  if available_value and taken_value:
133
- return 2 # Can't be both available and taken
141
+ return 2 # Can't be both available and taken
134
142
  elif available_value:
135
143
  return 1
136
144
  elif taken_value:
@@ -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
- "username": user,
10
- "name": "Dummy Dummy"
10
+ "username": user,
11
+ "name": "Dummy Dummy"
11
12
  }
12
13
 
13
14
  headers = {
14
- 'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36",
15
- 'Accept': "application/json",
16
- 'Content-Type': "application/json",
17
- 'Origin': "https://hashnode.com",
18
- 'Referer': "https://hashnode.com/signup",
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
- return 2
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
- user = input ("Username?: ").strip()
47
- result = validate_hashnode(user)
48
-
49
- if result == 1:
50
- print("Available!")
51
- elif result == 0:
52
- print("Unavailable!")
53
- else:
54
- print("Error occurred!")
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
- user = input ("Username?: ").strip()
34
- result = validate_medium(user)
35
-
36
- if result == 1:
37
- print("Available!")
38
- elif result == 0:
39
- print("Unavailable!")
40
- else:
41
- print("Error occurred!")
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!")
@@ -1,6 +1,7 @@
1
1
  import httpx
2
2
  from httpx import ConnectError, TimeoutException
3
3
 
4
+
4
5
  def validate_producthunt(user):
5
6
  url = f"https://www.producthunt.com/@{user}"
6
7
 
@@ -12,29 +13,30 @@ def validate_producthunt(user):
12
13
  }
13
14
 
14
15
  try:
15
- response = httpx.get(url, headers=headers, timeout = 3.0, follow_redirects=True)
16
+ response = httpx.get(url, headers=headers,
17
+ timeout=3.0, follow_redirects=True)
16
18
  status = response.status_code
17
19
 
18
20
  if status == 200:
19
- return 0
21
+ return 0
20
22
  elif status == 404:
21
- return 1
23
+ return 1
22
24
  else:
23
- return 2
25
+ return 2
24
26
 
25
27
  except (ConnectError, TimeoutException):
26
28
  return 2
27
29
  except Exception:
28
30
  return 2
29
31
 
30
- if __name__ == "__main__":
31
- user = input ("Username?: ").strip()
32
- result = validate_producthunt(user)
33
-
34
- if result == 1:
35
- print("Available!")
36
- elif result == 0:
37
- print("Unavailable!")
38
- else:
39
- print("Error occured!")
40
32
 
33
+ if __name__ == "__main__":
34
+ user = input("Username?: ").strip()
35
+ result = validate_producthunt(user)
36
+
37
+ if result == 1:
38
+ print("Available!")
39
+ elif result == 0:
40
+ print("Unavailable!")
41
+ else:
42
+ print("Error occured!")
@@ -0,0 +1,19 @@
1
+ from user_scanner.core.orchestrator import status_validate
2
+
3
+
4
+ def validate_codeberg(user):
5
+ url = f"https://codeberg.org/{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_codeberg(user)
13
+
14
+ if result == 1:
15
+ print("Available!")
16
+ elif result == 0:
17
+ print("Unavailable!")
18
+ else:
19
+ print("Error occurred!")
@@ -0,0 +1,26 @@
1
+ from user_scanner.core.orchestrator import status_validate
2
+
3
+
4
+ def validate_cratesio(user):
5
+ url = f"https://crates.io/api/v1/users/{user}"
6
+
7
+ headers = {
8
+ 'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36",
9
+ 'Accept': "application/json",
10
+ 'Referer': "https://crates.io/",
11
+ 'sec-fetch-mode': "cors",
12
+ }
13
+
14
+ return status_validate(url, 404, 200, headers=headers)
15
+
16
+
17
+ if __name__ == "__main__":
18
+ user = input("Username?: ").strip()
19
+ result = validate_cratesio(user)
20
+
21
+ if result == 1:
22
+ print("Available!")
23
+ elif result == 0:
24
+ print("Unavailable!")
25
+ else:
26
+ print("Error occurred!")
@@ -0,0 +1,24 @@
1
+ from user_scanner.core.orchestrator import status_validate
2
+
3
+
4
+ def validate_dockerhub(user):
5
+ url = f"https://hub.docker.com/v2/users/{user}/"
6
+
7
+ headers = {
8
+ 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36",
9
+ 'Accept': "application/json",
10
+ }
11
+
12
+ return status_validate(url, 404, 200, headers=headers)
13
+
14
+
15
+ if __name__ == "__main__":
16
+ user = input("Username?: ").strip()
17
+ result = validate_dockerhub(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,33 @@
1
+ from user_scanner.core.orchestrator import status_validate
2
+
3
+
4
+ def validate_github(user):
5
+ url = f"https://github.com/signup_check/username?value={user}"
6
+
7
+ headers = {
8
+ 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36",
9
+ 'Accept-Encoding': "gzip, deflate, br, zstd",
10
+ 'sec-ch-ua-platform': "\"Linux\"",
11
+ 'sec-ch-ua': "\"Chromium\";v=\"140\", \"Not=A?Brand\";v=\"24\", \"Google Chrome\";v=\"140\"",
12
+ 'sec-ch-ua-mobile': "?0",
13
+ 'sec-fetch-site': "same-origin",
14
+ 'sec-fetch-mode': "cors",
15
+ 'sec-fetch-dest': "empty",
16
+ 'referer': "https://github.com/signup?source=form-home-signup&user_email=",
17
+ 'accept-language': "en-US,en;q=0.9",
18
+ 'priority': "u=1, i"
19
+ }
20
+
21
+ return status_validate(url, 200, 422, headers=headers)
22
+
23
+
24
+ if __name__ == "__main__":
25
+ user = input("Username?: ").strip()
26
+ result = validate_github(user)
27
+
28
+ if result == 1:
29
+ print("Available!")
30
+ elif result == 0:
31
+ print("Unavailable!")
32
+ else:
33
+ print("Error occured!")