user-scanner 1.0.0.3__py3-none-any.whl → 1.0.1.4__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
@@ -7,16 +7,18 @@ CATEGORY_MAPPING = {
7
7
  "dev": "dev",
8
8
  "social": "social",
9
9
  "creator": "creator",
10
- "community": "community"
10
+ "community": "community",
11
+ "gaming": "gaming"
11
12
  }
12
13
 
13
14
  def list_modules(category=None):
14
- from user_scanner import dev, social, creator, community
15
+ from user_scanner import dev, social, creator, community, gaming
15
16
  packages = {
16
17
  "dev": dev,
17
18
  "social": social,
18
19
  "creator": creator,
19
- "community": community
20
+ "community": community,
21
+ "gaming": gaming
20
22
  }
21
23
 
22
24
  categories_to_list = [category] if category else packages.keys()
@@ -60,14 +62,21 @@ def main():
60
62
  if not args.username:
61
63
  print(Fore.RED + "[!] Please provide a username with -u or --username." + Style.RESET_ALL)
62
64
  return
63
- if re.search(r"[^a-zA-Z0-9._-]", args.username):
64
- print(Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. X (Twitter) doesn't support these." + Style.RESET_ALL)
65
65
 
66
- from user_scanner import dev, social, creator, community
66
+ # Special username checks before run
67
+ if (args.module == "x" or args.category == "social"):
68
+ if re.search(r"[^a-zA-Z0-9._-]", args.username):
69
+ print(Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. X (Twitter) doesn't support these." + Style.RESET_ALL)
70
+ if (args.module == "bluesky" or args.category == "social"):
71
+ if re.search(r"[^a-zA-Z0-9\.-]", args.username):
72
+ print(Fore.RED + f"[!] Username '{args.username}' contains unsupported special characters. Bluesky will throw error. (Supported: only hyphens and digits)" + Style.RESET_ALL +"\n")
73
+
74
+
75
+ from user_scanner import dev, social, creator, community, gaming
67
76
 
68
77
  if args.module:
69
78
  # Single module search across all categories
70
- packages = [dev, social, creator, community]
79
+ packages = [dev, social, creator, community, gaming]
71
80
  found = False
72
81
  for package in packages:
73
82
  modules = load_modules(package)
@@ -89,4 +98,4 @@ def main():
89
98
  run_checks(args.username)
90
99
 
91
100
  if __name__ == "__main__":
92
- main()
101
+ main()
@@ -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
+
@@ -45,13 +45,14 @@ def run_checks_category(package, username, verbose=False):
45
45
 
46
46
  def run_checks(username):
47
47
 
48
- from user_scanner import dev, social,creator, community
48
+ from user_scanner import dev, social,creator, community, gaming
49
49
 
50
50
  categories = [
51
51
  ("DEV", dev),
52
52
  ("SOCIAL", social),
53
53
  ("CREATOR", creator),
54
- ("COMMUNITY", community)
54
+ ("COMMUNITY", community),
55
+ ("GAMING", gaming)
55
56
  ]
56
57
 
57
58
  print(f"\n{Fore.CYAN} Checking username: {username}{Style.RESET_ALL}\n")
@@ -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!")
File without changes
@@ -0,0 +1,54 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+ import json
4
+
5
+ def validate_chess_com(user):
6
+ url = f"https://www.chess.com/callback/user/valid?username={user}"
7
+
8
+ headers = {
9
+ '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",
10
+ 'Accept': "application/json, text/plain, */*",
11
+ 'Accept-Encoding': "gzip, deflate, br",
12
+ 'Accept-Language': "en-US,en;q=0.9",
13
+ }
14
+
15
+ try:
16
+ response = httpx.get(url, headers=headers, timeout = 3.0)
17
+ status = response.status_code
18
+
19
+ if status == 200:
20
+ data = response.json()
21
+ if data.get('valid') is True:
22
+ # 'valid': true means the username is NOT taken
23
+ return 1
24
+ elif data.get('valid') is False:
25
+ # 'valid': false means the username IS taken
26
+ return 0
27
+ else:
28
+ return 2
29
+ else:
30
+ return 2
31
+
32
+ except (ConnectError, TimeoutException):
33
+ return 2
34
+ except json.JSONDecodeError:
35
+ return 2
36
+ except Exception:
37
+ return 2
38
+
39
+ if __name__ == "__main__":
40
+ try:
41
+ import httpx
42
+ except ImportError:
43
+ print("Error: 'httpx' library is not installed.")
44
+ exit()
45
+
46
+ user = input ("Username?: ").strip()
47
+ result = validate_chess_com(user)
48
+
49
+ if result == 1:
50
+ print("Available!")
51
+ elif result == 0:
52
+ print("Unavailable!")
53
+ else:
54
+ print("Error occured!")
@@ -0,0 +1,63 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+ import json
4
+
5
+ def validate_monkeytype(user: str) -> int:
6
+
7
+ url = f"https://api.monkeytype.com/users/checkName/{user}"
8
+
9
+ headers = {
10
+ "User-Agent": (
11
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
12
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
13
+ "Chrome/128.0.0.0 Safari/537.36"
14
+ ),
15
+ "Accept": "application/json, text/plain, */*",
16
+ "Accept-Encoding": "gzip, deflate, br",
17
+ "Accept-Language": "en-US,en;q=0.9",
18
+ }
19
+
20
+ try:
21
+ response = httpx.get(url, headers=headers, timeout=3.0)
22
+ status = response.status_code
23
+
24
+ if status == 200:
25
+ data = response.json()
26
+ # Expected shape:
27
+ # { "message": "string", "data": { "available": true/false } }
28
+ payload = data.get("data", {})
29
+ available = payload.get("available")
30
+
31
+ if available is True:
32
+ return 1
33
+ elif available is False:
34
+ return 0
35
+ else:
36
+ return 2
37
+ else:
38
+ return 2
39
+
40
+ except (ConnectError, TimeoutException):
41
+ return 2
42
+ except json.JSONDecodeError:
43
+ return 2
44
+ except Exception:
45
+ return 2
46
+
47
+
48
+ if __name__ == "__main__":
49
+ try:
50
+ import httpx # noqa: F401
51
+ except ImportError:
52
+ print("Error: 'httpx' library is not installed.")
53
+ raise SystemExit(1)
54
+
55
+ user = input("Username?: ").strip()
56
+ result = validate_monkeytype(user)
57
+
58
+ if result == 1:
59
+ print("Available!")
60
+ elif result == 0:
61
+ print("Unavailable!")
62
+ else:
63
+ print("Error occurred!")
@@ -0,0 +1,44 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+
4
+ def validate_osu(user):
5
+ """
6
+ Checks if a Osu username is available.
7
+ Returns: 1 -> available, 0 -> taken, 2 -> error
8
+ """
9
+
10
+ url = f"https://osu.ppy.sh/users/{user}"
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.0, 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
+ except (ConnectError, TimeoutException):
31
+ return 2
32
+ except Exception:
33
+ return 2
34
+
35
+ if __name__ == "__main__":
36
+ user = input ("Username?: ").strip()
37
+ result = validate_osu(user)
38
+
39
+ if result == 1:
40
+ print("Available!")
41
+ elif result == 0:
42
+ print("Unavailable!")
43
+ else:
44
+ print("Error occurred!")
@@ -0,0 +1,47 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+
4
+ def validate_roblox(user):
5
+ """
6
+ Checks if a roblox username is available.
7
+ Returns: 1 -> available, 0 -> taken, 2 -> error
8
+ """
9
+
10
+ url = f"https://users.roblox.com/v1/users/search?keyword={user}&limit=10" # official api
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.5, follow_redirects = True)
22
+ status = response.status_code
23
+ search_results = response.json() # api response
24
+
25
+ if "errors" in search_results: # this usually triggers when timeout or ratelimit
26
+ return 2
27
+
28
+ for entry in search_results["data"]: # iterates through the entries in the search results
29
+ if entry["name"] == user: # if a username matches the user
30
+ return 0
31
+ return 1
32
+
33
+ except (ConnectError, TimeoutException):
34
+ return 2
35
+ except Exception as e:
36
+ return 2
37
+
38
+ if __name__ == "__main__":
39
+ user = input ("Username?: ").strip()
40
+ result = validate_roblox(user)
41
+
42
+ if result == 1:
43
+ print("Available!")
44
+ elif result == 0:
45
+ print("Unavailable!")
46
+ else:
47
+ print("Error occurred!")
@@ -0,0 +1,71 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+ import re
4
+ import json
5
+
6
+ def validate_bluesky(user):
7
+ handle = user if user.endswith('.bsky.social') else f"{user}.bsky.social"
8
+ url = "https://bsky.social/xrpc/com.atproto.temp.checkHandleAvailability"
9
+
10
+ headers = {
11
+ 'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36",
12
+ 'Accept-Encoding': "gzip",
13
+ 'atproto-accept-labelers': "did:plc:ar7c4by46qjdydhdevvrndac;redact",
14
+ 'sec-ch-ua-platform': "\"Android\"",
15
+ 'sec-ch-ua': "\"Google Chrome\";v=\"141\", \"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"141\"",
16
+ 'sec-ch-ua-mobile': "?1",
17
+ 'origin': "https://bsky.app",
18
+ 'sec-fetch-site': "cross-site",
19
+ 'sec-fetch-mode': "cors",
20
+ 'sec-fetch-dest': "empty",
21
+ 'referer': "https://bsky.app/",
22
+ 'accept-language': "en-US,en;q=0.9",
23
+ }
24
+
25
+ params = {
26
+ 'handle': handle,
27
+ }
28
+
29
+ if not re.fullmatch(r"^[a-zA-Z0-9\.-]{1,64}$", user):
30
+ return 2
31
+
32
+ try:
33
+ response = httpx.get(url, headers=headers, params=params, timeout = 15.0)
34
+ status = response.status_code
35
+
36
+ if status == 200:
37
+ data = response.json()
38
+ result_type = data.get('result', {}).get('$type')
39
+
40
+ if result_type == "com.atproto.temp.checkHandleAvailability#resultAvailable":
41
+ return 1
42
+ elif result_type == "com.atproto.temp.checkHandleAvailability#resultUnavailable":
43
+ return 0
44
+ else:
45
+ return 2
46
+ else:
47
+ return 2
48
+
49
+ except (ConnectError, TimeoutException):
50
+ return 2
51
+ except json.JSONDecodeError:
52
+ return 2
53
+ except Exception:
54
+ return 2
55
+
56
+ if __name__ == "__main__":
57
+ try:
58
+ import httpx
59
+ except ImportError:
60
+ print("Error: 'httpx' library is not installed.")
61
+ exit()
62
+
63
+ user = input ("Username?: ").strip()
64
+ result = validate_bluesky(user)
65
+
66
+ if result == 1:
67
+ print("Available!")
68
+ elif result == 0:
69
+ print("Unavailable!")
70
+ else:
71
+ print("Error occured!")
@@ -0,0 +1,44 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+
4
+ def validate_discord(user):
5
+ url = "https://discord.com/api/v9/unique-username/username-attempt-unauthed"
6
+
7
+ headers = {
8
+ "authority": "discord.com",
9
+ "accept": "/",
10
+ "accept-language": "en-GB,en-US;q=0.9,en;q=0.8",
11
+ "content-type": "application/json",
12
+ "origin": "https://discord.com",
13
+ "referer": "https://discord.com/register"
14
+ }
15
+
16
+ data = {"username": user}
17
+
18
+ try:
19
+ response = httpx.post(url, headers=headers, json=data, timeout=3.0)
20
+ if response.status_code == 200:
21
+ status = response.json().get("taken")
22
+ if status is True:
23
+ return 0
24
+ elif status is False:
25
+ return 1
26
+ return 2
27
+ except (ConnectError, TimeoutException):
28
+ return 2
29
+ except Exception:
30
+ return 2
31
+
32
+ if __name__ == "__main__":
33
+ user = input ("Username?: ").strip()
34
+ result = validate_discord(user)
35
+
36
+ if result == 1:
37
+ print("Available!")
38
+ elif result == 0:
39
+ print("Unavailable!")
40
+ else:
41
+ print("Error occured!")
42
+
43
+
44
+
@@ -13,9 +13,9 @@ def validate_instagram(user):
13
13
  'X-Requested-With': "XMLHttpRequest",
14
14
  'Referer': f"https://www.instagram.com/{user}/",
15
15
  }
16
-
16
+
17
17
  try:
18
- response = httpx.get(url, headers=headers, timeout = 15.0)
18
+ response = httpx.get(url, headers=headers, timeout = 3.0)
19
19
  status = response.status_code
20
20
 
21
21
  if status == 200:
@@ -31,12 +31,6 @@ def validate_instagram(user):
31
31
  return 2
32
32
 
33
33
  if __name__ == "__main__":
34
- try:
35
- import httpx
36
- except ImportError:
37
- print("Error: 'httpx' library is not installed.")
38
- exit()
39
-
40
34
  user = input ("Username?: ").strip()
41
35
  result = validate_instagram(user)
42
36
 
@@ -0,0 +1,45 @@
1
+ import httpx
2
+ from httpx import ConnectError, TimeoutException
3
+
4
+ def validate_mastodon(user):
5
+ url = f"https://mastodon.social/@{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 = 3.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_mastodon(user)
39
+
40
+ if result == 1:
41
+ print("Available!")
42
+ elif result == 0:
43
+ print("Unavailable!")
44
+ else:
45
+ print("Error occured!")
@@ -31,12 +31,6 @@ def validate_pinterest(user):
31
31
  return 2
32
32
 
33
33
  if __name__ == "__main__":
34
- try:
35
- import httpx
36
- except ImportError:
37
- print("Error: 'httpx' library is not installed.")
38
- exit()
39
-
40
34
  user = input ("Username?: ").strip()
41
35
  result = validate_pinterest(user)
42
36
 
@@ -31,12 +31,6 @@ def validate_reddit(user):
31
31
  return 2
32
32
 
33
33
  if __name__ == "__main__":
34
- try:
35
- import httpx
36
- except ImportError:
37
- print("Error: 'httpx' library is not installed.")
38
- exit()
39
-
40
34
  user = input ("Username?: ").strip()
41
35
  result = validate_reddit(user)
42
36
 
@@ -37,12 +37,6 @@ def validate_snapchat(user):
37
37
  return 2
38
38
 
39
39
  if __name__ == "__main__":
40
- try:
41
- import httpx
42
- except ImportError:
43
- print("Error: 'httpx' library is not installed.")
44
- exit()
45
-
46
40
  user = input ("Username?: ").strip()
47
41
  result = validate_snapchat(user)
48
42
 
@@ -0,0 +1,34 @@
1
+ import httpx
2
+ import re
3
+
4
+ def validate_telegram(user: str) -> int:
5
+ """
6
+ Checks if a Telegram username is available.
7
+ Returns: 1 -> available, 0 -> taken, 2 -> error
8
+ """
9
+ url = f"https://t.me/{user}"
10
+ headers = {
11
+ "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
12
+ }
13
+
14
+ try:
15
+ r = httpx.get(url, headers=headers, follow_redirects=True, timeout=3.0)
16
+ if r.status_code == 200:
17
+ return 0 if re.search(r'<div[^>]*class="tgme_page_extra"[^>]*>', r.text) else 1
18
+ return 2
19
+ except (httpx.ConnectError, httpx.TimeoutException):
20
+ return 2
21
+ except Exception:
22
+ return 2
23
+
24
+
25
+ if __name__ == "__main__":
26
+ user = input ("Username?: ").strip()
27
+ result = validate_telegram(user)
28
+
29
+ if result == 1:
30
+ print("Available!")
31
+ elif result == 0:
32
+ print("Unavailable!")
33
+ else:
34
+ print("Error occured!")
@@ -31,12 +31,6 @@ def validate_instagram(user):
31
31
  return 2
32
32
 
33
33
  if __name__ == "__main__":
34
- try:
35
- import httpx
36
- except ImportError:
37
- print("Error: 'httpx' library is not installed.")
38
- exit()
39
-
40
34
  user = input ("Username?: ").strip()
41
35
  result = validate_instagram(user)
42
36
 
user_scanner/social/x.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import httpx
2
2
  import json
3
+ from colorama import Fore, Style
3
4
  from httpx import ConnectError, TimeoutException
4
5
 
5
6
  def validate_x(user):
@@ -19,6 +20,7 @@ def validate_x(user):
19
20
  try:
20
21
  response = httpx.get(url, params=params, headers=headers, timeout = 3.0)
21
22
  status = response.status_code
23
+ # print(response.text)
22
24
  if status in [401, 403, 429]:
23
25
  return 2
24
26
 
@@ -29,8 +31,8 @@ def validate_x(user):
29
31
  return 1
30
32
  elif data.get('reason') == 'taken':
31
33
  return 0
32
- elif data.get('reason') == "improper_format":
33
- print(data.get('desc'))
34
+ elif (data.get('reason') == "improper_format" or data.get('reason') == "invalid_username"):
35
+ print("\n" +" "+f"{Fore.CYAN}X says: {data.get('desc')}{Style.RESET_ALL}")
34
36
  return 2
35
37
  else:
36
38
  return 2
@@ -41,12 +43,6 @@ def validate_x(user):
41
43
  return 2
42
44
 
43
45
  if __name__ == "__main__":
44
- try:
45
- import httpx
46
- except ImportError:
47
- print("Error: 'httpx' library is not installed.")
48
- exit()
49
-
50
46
  user = input ("Username?: ").strip()
51
47
  result = validate_x(user)
52
48
 
@@ -45,12 +45,6 @@ def validate_youtube(user):
45
45
  return 2
46
46
 
47
47
  if __name__ == "__main__":
48
- try:
49
- import httpx
50
- except ImportError:
51
- print("Error: 'httpx' library is not installed.")
52
- exit()
53
-
54
48
  user = input ("Username?: ").strip()
55
49
  result = validate_youtube(user)
56
50
 
@@ -0,0 +1,90 @@
1
+ Metadata-Version: 2.4
2
+ Name: user-scanner
3
+ Version: 1.0.1.4
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
+ Scan a username across multiple social, developer, and creator platforms to see if it’s available.
17
+ Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instagram, and more, all in one command.
18
+
19
+ ---
20
+
21
+ ## Features
22
+
23
+ - ✅ Check usernames across **social networks**, **developer platforms**, and **creator communities**.
24
+ - ✅ Clear **Available / Taken / Error** output for each platform.
25
+ - ✅ Fully modular: add new platform modules easily.
26
+ - ✅ Command-line interface ready: works directly after `pip install`.
27
+
28
+ ---
29
+
30
+ ## Installation
31
+
32
+ ```bash
33
+ pip install user-scanner
34
+ ```
35
+
36
+ ---
37
+
38
+ ## Usage
39
+
40
+ Scan a username across all platforms:
41
+
42
+ ```bash
43
+ user-scanner -u <username>
44
+ ```
45
+ Optionally, scan a specific category or single module:
46
+
47
+ ```bash
48
+ user-scanner -u <username> -c dev
49
+ user-scanner -l # Lists all available modules
50
+ user-scanner -u <username> -m github
51
+
52
+ ```
53
+ ---
54
+
55
+ ## Contributing
56
+
57
+ Modules are organized by category:
58
+
59
+ ```
60
+ user_scanner/
61
+ ├── dev/ # Developer platforms (GitHub, GitLab, etc.)
62
+ ├── social/ # Social platforms (Twitter/X, Reddit, Instagram, etc.)
63
+ ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, etc.)
64
+ ├── community/ # Community platforms (forums, niche sites)
65
+ ```
66
+
67
+ **Module guidelines:**
68
+ - Each module must define a `validate_<site>()` function that takes a `username` and returns:
69
+ - `1` → Available
70
+ - `0` → Taken
71
+ - `2` → Error / Could not check
72
+ - Use `httpx` for requests, `colorama` for colored output.
73
+ - Optional: modules can define a CLI parser if they support custom arguments.
74
+
75
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
76
+
77
+ ---
78
+
79
+ ## Dependencies
80
+ - [httpx](https://pypi.org/project/httpx/)
81
+ - [colorama](https://pypi.org/project/colorama/)
82
+
83
+ ---
84
+
85
+ ## License
86
+
87
+ This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
88
+
89
+ ## ⚠️ `community/` is small looking for contributions
90
+
@@ -0,0 +1,43 @@
1
+ user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ user_scanner/__main__.py,sha256=ihYZxGeiYebJLG72tegPQBYJtjn8CkKKzu87cSvKBVE,3653
3
+ user_scanner/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ user_scanner/community/coderlegion.py,sha256=wva0seSkd4h7kSjIprW0wM7JC0zspFjXGnDHkeIJ3YI,1141
5
+ user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ user_scanner/core/orchestrator.py,sha256=-iP6qZQx5vN8fSZ4Z_TOxUcP9Pf3VYhsbBSQLP9ABEc,3230
7
+ user_scanner/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ user_scanner/creator/devto.py,sha256=K9jXlwSlhJxwZomGJB7m8u_22kTejLPJ_-AvwFZahsY,1034
9
+ user_scanner/creator/hashnode.py,sha256=2Q-K9Yuy-6qOoJJPMq3UD0JHP4d9XeO9OGpBeHuMims,1351
10
+ user_scanner/creator/kaggle.py,sha256=pCq7QQ62wxunEmBIWNjKyWIH2ENXK76BM3zt4HWi0zM,927
11
+ user_scanner/creator/medium.py,sha256=dWNialp0QTo4GRq64afA00G3PDXVOLZM3mnO3WnmR8c,1008
12
+ user_scanner/creator/patreon.py,sha256=drjlB5XDFs1TW6J3W1LqBwZhc6PWtn-5nLBG8OtnFhU,1274
13
+ user_scanner/dev/__init__.py,sha256=qUR0eLwN-gO6oKk-1cmCVT4G_AxUHHMgpV3wJ7URXi4,7
14
+ user_scanner/dev/codeberg.py,sha256=WuGisrD2-OVolXB1T_5Dn-J8Nx5BTX_Fh2MTsK-F7os,930
15
+ user_scanner/dev/cratesio.py,sha256=n1yJFJ2uWfRzpARSNSZ9s53iPm-5IiAxTOMTq0hOVis,999
16
+ user_scanner/dev/dockerhub.py,sha256=P5bQEY9hm-k600rAtFi9rhiRAZy3Ansch282cC-ZTGk,1108
17
+ user_scanner/dev/github.py,sha256=RSjJrCOchvQKYPScR2BeBn_qyUZxGyfTmNYFCOY3J7E,1407
18
+ user_scanner/dev/gitlab.py,sha256=0-3vYg5G5_uguH2I68zZdPyq5VaMUS76766Db7uWrR8,1433
19
+ user_scanner/dev/launchpad.py,sha256=ank50BpTsN7m5_MuQNxAbLpfQOrwjnwS_olO9nhPwgk,1074
20
+ user_scanner/dev/npmjs.py,sha256=Tv2YgCpuSxJKWEPdcTWwm9CCl2rmfKlGdQe2rnMnXM8,1141
21
+ user_scanner/dev/replit.py,sha256=GN1Q8PecTzBsd6TpOT-qRnMvKhFTh1P6uCa8CDlXkpw,925
22
+ user_scanner/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ user_scanner/gaming/chess_com.py,sha256=f634Js-KvBVpQC2AOi5TpIR9S5ttxjnAhI6eQtoYtXw,1514
24
+ user_scanner/gaming/monkeytype.py,sha256=OnvfbZ4UuniAV7fT_vDHKmsFZo8ACtgWvmedlYjFRDg,1674
25
+ user_scanner/gaming/osu.py,sha256=Jz_s6qNURC-L10-MSfTh6mEywoEqOh8Stvb_bWJR_0I,1239
26
+ user_scanner/gaming/roblox.py,sha256=1Chdg5f4C5uWuCcYM6JGt7kxYCRHC8E5OkTgHwFKXC4,1528
27
+ user_scanner/social/__init__.py,sha256=jaCkFwX1uYtF0ENifVwF8OfHrYYUTm64B9wlBq9BBfQ,9
28
+ user_scanner/social/bluesky.py,sha256=r5UIFCStlwEM4UxE6cDTrDb5w_EqPCgJ2iYz27GpjA8,2157
29
+ user_scanner/social/discord.py,sha256=3TaYAzqK9sPKzL_GPzli4P-U22Dwe-mSmeH6kVHJXI4,1137
30
+ user_scanner/social/instagram.py,sha256=oskZgHagkyl_p-bi7CMYqCh0wsoqfCFnR7GZcbKX1-U,1229
31
+ user_scanner/social/mastodon.py,sha256=KbhdutPe_M0bvtkJXz2VEhalSEgA7n-bUbrkR3pYAb4,1276
32
+ user_scanner/social/pinterest.py,sha256=LHCiTmPALPLYXDClz09EBKRREhs5u3CajeFiQg5Vvlg,1168
33
+ user_scanner/social/reddit.py,sha256=DQYWedJeeyUuk-6EARU_52rPQHNkjfSbahOl5AHENa0,1194
34
+ user_scanner/social/snapchat.py,sha256=ZG-SIv6RopT45dudfOm5sRxmV_ihWG1Vh1Z766fm8XE,1527
35
+ user_scanner/social/telegram.py,sha256=QxK2jD2QEvrYmnkxysl_yk7-G6CRWvkK5EnK6n5q3jY,946
36
+ user_scanner/social/threads.py,sha256=QRidTYquAMDHJSg68ySpWCbliRYdWJkbOqn8RfWzFQQ,1231
37
+ user_scanner/social/x.py,sha256=NetPGmPnWEKv6za9E_Ekah9bAeeFlEeY3qbTJQo7AqE,1560
38
+ user_scanner/social/youtube.py,sha256=zuyWCy5FtEilaIcUZ4dTCctRR9deFnwwWJkf-h_1K0E,1943
39
+ user_scanner-1.0.1.4.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
40
+ user_scanner-1.0.1.4.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
41
+ user_scanner-1.0.1.4.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
42
+ user_scanner-1.0.1.4.dist-info/METADATA,sha256=2VVbN7M7by-w_3oXn4uGx4jzprqV2SALnTUz1YwTims,2363
43
+ user_scanner-1.0.1.4.dist-info/RECORD,,
@@ -1,14 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: user-scanner
3
- Version: 1.0.0.3
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
@@ -1,32 +0,0 @@
1
- user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- user_scanner/__main__.py,sha256=gTuNDvGcxJxnJgbviOARUN42bhpEZ3j5oUgZBFIYa4U,3164
3
- user_scanner/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- user_scanner/core/orchestrator.py,sha256=5HgT9tP5r6pX8eUOaHOwXeCz0wDTfifyGW_WtNnz6kQ,3194
6
- user_scanner/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- user_scanner/creator/devto.py,sha256=K9jXlwSlhJxwZomGJB7m8u_22kTejLPJ_-AvwFZahsY,1034
8
- user_scanner/creator/hashnode.py,sha256=2Q-K9Yuy-6qOoJJPMq3UD0JHP4d9XeO9OGpBeHuMims,1351
9
- user_scanner/creator/kaggle.py,sha256=t5mTBz0eWZMNdy4YD1_O1wBAqHXjhmcOD0uAPzijS38,1156
10
- user_scanner/creator/medium.py,sha256=dWNialp0QTo4GRq64afA00G3PDXVOLZM3mnO3WnmR8c,1008
11
- user_scanner/dev/__init__.py,sha256=qUR0eLwN-gO6oKk-1cmCVT4G_AxUHHMgpV3wJ7URXi4,7
12
- user_scanner/dev/codeberg.py,sha256=WuGisrD2-OVolXB1T_5Dn-J8Nx5BTX_Fh2MTsK-F7os,930
13
- user_scanner/dev/cratesio.py,sha256=n1yJFJ2uWfRzpARSNSZ9s53iPm-5IiAxTOMTq0hOVis,999
14
- user_scanner/dev/dockerhub.py,sha256=P5bQEY9hm-k600rAtFi9rhiRAZy3Ansch282cC-ZTGk,1108
15
- user_scanner/dev/github.py,sha256=RSjJrCOchvQKYPScR2BeBn_qyUZxGyfTmNYFCOY3J7E,1407
16
- user_scanner/dev/gitlab.py,sha256=0-3vYg5G5_uguH2I68zZdPyq5VaMUS76766Db7uWrR8,1433
17
- user_scanner/dev/launchpad.py,sha256=ank50BpTsN7m5_MuQNxAbLpfQOrwjnwS_olO9nhPwgk,1074
18
- user_scanner/dev/npmjs.py,sha256=Tv2YgCpuSxJKWEPdcTWwm9CCl2rmfKlGdQe2rnMnXM8,1141
19
- user_scanner/dev/replit.py,sha256=GN1Q8PecTzBsd6TpOT-qRnMvKhFTh1P6uCa8CDlXkpw,925
20
- user_scanner/social/__init__.py,sha256=jaCkFwX1uYtF0ENifVwF8OfHrYYUTm64B9wlBq9BBfQ,9
21
- user_scanner/social/instagram.py,sha256=6m2TJYWSzD5cWXXBlgFRtGRY0KlqGdHFh7_mBaOQ2bg,1357
22
- user_scanner/social/pinterest.py,sha256=5cDmvtAXPtvpsO2vdAd30_Gx11i8L90mYrAU2OgNMQE,1291
23
- user_scanner/social/reddit.py,sha256=GkbQ6fPQVDygcOsnpuOkmIpATW5YlbEnKtC8lF2U5w0,1317
24
- user_scanner/social/snapchat.py,sha256=Qik4Jfaz3Glo_Wer5NrB7IVTBcP2D8AL_mVRnPXAKkc,1650
25
- user_scanner/social/threads.py,sha256=_8pUvLtJ6NT0LA9cEQn2IqIiA0IIn3LKZFaVtbhSMQk,1354
26
- user_scanner/social/x.py,sha256=8SfCq61ky012s1FtqQ9mcpexs3Y8z7dynmp6YgpK2gQ,1522
27
- user_scanner/social/youtube.py,sha256=pYBVeYpo1fFdcMAQ22ruka9TFkNpQr1h3YuatM_s0rU,2066
28
- user_scanner-1.0.0.3.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
29
- user_scanner-1.0.0.3.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
30
- user_scanner-1.0.0.3.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
31
- user_scanner-1.0.0.3.dist-info/METADATA,sha256=Smt9GME2bnRFIMnbAbs34NrbttkJtU8KHqjJI28ccj8,452
32
- user_scanner-1.0.0.3.dist-info/RECORD,,