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.
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/PKG-INFO +1 -1
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/pyproject.toml +1 -1
- user_scanner-1.0.0.1/user_scanner/__main__.py +89 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/core/orchestrator.py +34 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/x.py +5 -4
- user_scanner-1.0.0.0/user_scanner/__main__.py +0 -18
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/LICENSE +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/README.md +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/__init__.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/community/__init__.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/core/__init__.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/__init__.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/devto.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/hashnode.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/kaggle.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/creator/medium.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/__init__.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/codeberg.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/cratesio.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/dockerhub.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/github.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/gitlab.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/launchpad.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/npmjs.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/dev/replit.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/__init__.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/instagram.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/pinterest.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/reddit.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/snapchat.py +0 -0
- {user_scanner-1.0.0.0 → user_scanner-1.0.0.1}/user_scanner/social/threads.py +0 -0
- {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.
|
|
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>
|
|
@@ -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": "
|
|
11
|
-
"email": "
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|