user-scanner 1.1.0.1__py3-none-any.whl → 1.1.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 +2 -2
- user_scanner/core/email_orchestrator.py +17 -17
- user_scanner/core/orchestrator.py +6 -3
- user_scanner/core/result.py +10 -2
- user_scanner/email_scan/adult/sexvid.py +43 -0
- user_scanner/email_scan/dev/__init__.py +1 -0
- user_scanner/email_scan/dev/replit.py +51 -0
- user_scanner/email_scan/entertainment/.ruff_cache/.gitignore +2 -0
- user_scanner/email_scan/entertainment/.ruff_cache/0.14.10/14677874048998292530 +0 -0
- user_scanner/email_scan/entertainment/.ruff_cache/CACHEDIR.TAG +1 -0
- user_scanner/email_scan/entertainment/__init__.py +0 -0
- user_scanner/email_scan/entertainment/spotify.py +87 -0
- user_scanner/email_scan/social/mastodon.py +5 -3
- user_scanner/user_scan/shopping/__init__.py +0 -0
- user_scanner/user_scan/shopping/vinted.py +42 -0
- user_scanner/version.json +1 -1
- {user_scanner-1.1.0.1.dist-info → user_scanner-1.1.0.2.dist-info}/METADATA +2 -4
- {user_scanner-1.1.0.1.dist-info → user_scanner-1.1.0.2.dist-info}/RECORD +21 -12
- {user_scanner-1.1.0.1.dist-info → user_scanner-1.1.0.2.dist-info}/WHEEL +0 -0
- {user_scanner-1.1.0.1.dist-info → user_scanner-1.1.0.2.dist-info}/entry_points.txt +0 -0
- {user_scanner-1.1.0.1.dist-info → user_scanner-1.1.0.2.dist-info}/licenses/LICENSE +0 -0
user_scanner/__main__.py
CHANGED
|
@@ -196,7 +196,7 @@ def main():
|
|
|
196
196
|
print(f"{R}[✘] Error: No valid emails found in {args.email_file}{X}")
|
|
197
197
|
sys.exit(1)
|
|
198
198
|
|
|
199
|
-
print(f"{C}[+] Loaded {len(valid_emails)} emails from {args.email_file}{X}")
|
|
199
|
+
print(f"{C}[+] Loaded {len(valid_emails)} {'email' if len(valid_emails) == 1 else 'emails'} from {args.email_file}{X}")
|
|
200
200
|
is_email = True
|
|
201
201
|
targets = valid_emails
|
|
202
202
|
except FileNotFoundError:
|
|
@@ -213,7 +213,7 @@ def main():
|
|
|
213
213
|
if not usernames:
|
|
214
214
|
print(f"{R}[✘] Error: No valid usernames found in {args.username_file}{X}")
|
|
215
215
|
sys.exit(1)
|
|
216
|
-
print(f"{C}[+] Loaded {len(usernames)} usernames from {args.username_file}{X}")
|
|
216
|
+
print(f"{C}[+] Loaded {len(usernames)} {'username' if len(usernames) == 1 else 'usernames'} from {args.username_file}{X}")
|
|
217
217
|
is_email = False
|
|
218
218
|
targets = usernames
|
|
219
219
|
except FileNotFoundError:
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from pathlib import Path
|
|
3
|
-
from typing import List
|
|
4
3
|
from types import ModuleType
|
|
4
|
+
from typing import List
|
|
5
|
+
|
|
5
6
|
from colorama import Fore, Style
|
|
6
7
|
|
|
7
|
-
from user_scanner.core.helpers import load_categories, load_modules
|
|
8
|
+
from user_scanner.core.helpers import find_category, load_categories, load_modules
|
|
8
9
|
from user_scanner.core.result import Result
|
|
9
10
|
|
|
10
11
|
# Concurrency control
|
|
@@ -13,11 +14,21 @@ MAX_CONCURRENT_REQUESTS = 15
|
|
|
13
14
|
|
|
14
15
|
async def _async_worker(module: ModuleType, email: str, sem: asyncio.Semaphore) -> Result:
|
|
15
16
|
async with sem:
|
|
16
|
-
module_name = module.__name__.split(
|
|
17
|
+
module_name = module.__name__.split(".")[-1]
|
|
17
18
|
func_name = f"validate_{module_name}"
|
|
19
|
+
actual_cat = find_category(module) or "Email"
|
|
20
|
+
|
|
21
|
+
params = {
|
|
22
|
+
"site_name": module_name.capitalize(),
|
|
23
|
+
"username": email,
|
|
24
|
+
"category": actual_cat,
|
|
25
|
+
"is_email": True,
|
|
26
|
+
}
|
|
18
27
|
|
|
19
28
|
if not hasattr(module, func_name):
|
|
20
|
-
return
|
|
29
|
+
return (
|
|
30
|
+
Result.error(f"Function {func_name} not found").update(**params).show()
|
|
31
|
+
)
|
|
21
32
|
|
|
22
33
|
func = getattr(module, func_name)
|
|
23
34
|
|
|
@@ -27,21 +38,10 @@ async def _async_worker(module: ModuleType, email: str, sem: asyncio.Semaphore)
|
|
|
27
38
|
except Exception as e:
|
|
28
39
|
result = Result.error(e)
|
|
29
40
|
|
|
30
|
-
|
|
31
|
-
actual_cat = find_category(module) or "Email"
|
|
32
|
-
|
|
33
|
-
result.update(
|
|
34
|
-
site_name=module_name.capitalize(),
|
|
35
|
-
username=email,
|
|
36
|
-
category=actual_cat,
|
|
37
|
-
is_email=True
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
print(result.get_console_output())
|
|
41
|
-
return result
|
|
41
|
+
return result.update(**params).show()
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
async def _run_batch(modules: List[ModuleType], email:str) -> List[Result]:
|
|
44
|
+
async def _run_batch(modules: List[ModuleType], email: str) -> List[Result]:
|
|
45
45
|
sem = asyncio.Semaphore(MAX_CONCURRENT_REQUESTS)
|
|
46
46
|
tasks = []
|
|
47
47
|
for module in modules:
|
|
@@ -15,7 +15,11 @@ def _worker_single(module: ModuleType, username: str) -> Result:
|
|
|
15
15
|
site_name = get_site_name(module)
|
|
16
16
|
|
|
17
17
|
if not func:
|
|
18
|
-
return Result.error(
|
|
18
|
+
return Result.error(
|
|
19
|
+
f"{site_name} has no validate_ function",
|
|
20
|
+
site_name=site_name,
|
|
21
|
+
username=username,
|
|
22
|
+
)
|
|
19
23
|
|
|
20
24
|
try:
|
|
21
25
|
result: Result = func(username)
|
|
@@ -48,8 +52,7 @@ def run_user_category(category_path: Path, username: str) -> List[Result]:
|
|
|
48
52
|
for result in exec_map:
|
|
49
53
|
result.update(category=category_name)
|
|
50
54
|
results.append(result)
|
|
51
|
-
|
|
52
|
-
print(result.get_console_output())
|
|
55
|
+
result.show()
|
|
53
56
|
|
|
54
57
|
return results
|
|
55
58
|
|
user_scanner/core/result.py
CHANGED
|
@@ -61,6 +61,7 @@ class Result:
|
|
|
61
61
|
for field in ("username", "site_name", "category", "is_email"):
|
|
62
62
|
if field in kwargs and kwargs[field] is not None:
|
|
63
63
|
setattr(self, field, kwargs[field])
|
|
64
|
+
return self
|
|
64
65
|
|
|
65
66
|
@classmethod
|
|
66
67
|
def taken(cls, reason: str | Exception | None = None, **kwargs):
|
|
@@ -148,11 +149,18 @@ class Result:
|
|
|
148
149
|
|
|
149
150
|
def get_console_output(self) -> str:
|
|
150
151
|
site_name = self.site_name
|
|
151
|
-
username = self.username
|
|
152
152
|
status_text = self.status.to_label(self.is_email)
|
|
153
|
+
username = ""
|
|
154
|
+
if self.username:
|
|
155
|
+
username = f"({self.username})"
|
|
153
156
|
|
|
154
157
|
color = self.get_output_color()
|
|
155
158
|
icon = self.get_output_icon()
|
|
156
159
|
|
|
157
160
|
reason = f" ({self.get_reason()})" if self.has_reason() else ""
|
|
158
|
-
return f" {color}{icon} {site_name}
|
|
161
|
+
return f" {color}{icon} {site_name} {username}: {status_text}{reason}{Style.RESET_ALL}"
|
|
162
|
+
|
|
163
|
+
def show(self):
|
|
164
|
+
"""Prints the console output and returns itself for chaining"""
|
|
165
|
+
print(self.get_console_output())
|
|
166
|
+
return self
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
async def _check(email: str) -> Result:
|
|
5
|
+
url = "https://www.sexvid.pro/reset-password/"
|
|
6
|
+
|
|
7
|
+
payload = {
|
|
8
|
+
'action': "restore_password",
|
|
9
|
+
'mode': "async",
|
|
10
|
+
'format': "json",
|
|
11
|
+
'email_link': "https://www.sexvid.pro/signup.php",
|
|
12
|
+
'email': email,
|
|
13
|
+
'code': "xxxxx"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
headers = {
|
|
17
|
+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36",
|
|
18
|
+
'Accept': "*/*",
|
|
19
|
+
'X-Requested-With': "XMLHttpRequest",
|
|
20
|
+
'Origin': "https://www.sexvid.pro",
|
|
21
|
+
'Referer': "https://www.sexvid.pro/reset-password/",
|
|
22
|
+
'Content-Type': "application/x-www-form-urlencoded"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async with httpx.AsyncClient(http2=False, timeout=5.0) as client:
|
|
26
|
+
try:
|
|
27
|
+
response = await client.post(url, data=payload, headers=headers)
|
|
28
|
+
res_text = response.text
|
|
29
|
+
|
|
30
|
+
if "doesnt_exist" in res_text or "No user with such email exists" in res_text:
|
|
31
|
+
return Result.available()
|
|
32
|
+
elif "A new generated password has been sent" in res_text or "status\":\"success" in res_text:
|
|
33
|
+
return Result.taken()
|
|
34
|
+
elif response.status_code == 429:
|
|
35
|
+
return Result.error("Rate-limited")
|
|
36
|
+
else:
|
|
37
|
+
return Result.error(f"[{response.status_code}] Unexpected response body, report it via GitHub issues")
|
|
38
|
+
|
|
39
|
+
except Exception as e:
|
|
40
|
+
return Result.error(e)
|
|
41
|
+
|
|
42
|
+
async def validate_sexvid(email: str) -> Result:
|
|
43
|
+
return await _check(email)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
import json
|
|
3
|
+
from user_scanner.core.result import Result
|
|
4
|
+
|
|
5
|
+
async def _check(email: str) -> Result:
|
|
6
|
+
url = "https://replit.com/data/user/exists"
|
|
7
|
+
|
|
8
|
+
payload = {
|
|
9
|
+
"email": email
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
headers = {
|
|
13
|
+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36",
|
|
14
|
+
'Accept': "application/json",
|
|
15
|
+
'Accept-Encoding': "identity",
|
|
16
|
+
'Content-Type': "application/json",
|
|
17
|
+
'sec-ch-ua-platform': "\"Android\"",
|
|
18
|
+
'sec-ch-ua': "\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"",
|
|
19
|
+
'sec-ch-ua-mobile': "?1",
|
|
20
|
+
'x-requested-with': "XMLHttpRequest",
|
|
21
|
+
'origin': "https://replit.com",
|
|
22
|
+
'sec-fetch-site': "same-origin",
|
|
23
|
+
'sec-fetch-mode': "cors",
|
|
24
|
+
'sec-fetch-dest': "empty",
|
|
25
|
+
'referer': "https://replit.com/signup",
|
|
26
|
+
'accept-language': "en-US,en;q=0.9",
|
|
27
|
+
'priority': "u=1, i"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async with httpx.AsyncClient(http2=False, timeout=5.0) as client:
|
|
31
|
+
try:
|
|
32
|
+
response = await client.post(url, content=json.dumps(payload), headers=headers)
|
|
33
|
+
|
|
34
|
+
if response.status_code == 403:
|
|
35
|
+
return Result.error("403 Forbidden")
|
|
36
|
+
|
|
37
|
+
data = response.json()
|
|
38
|
+
exists = data.get("exists")
|
|
39
|
+
|
|
40
|
+
if exists is True:
|
|
41
|
+
return Result.taken()
|
|
42
|
+
if exists is False:
|
|
43
|
+
return Result.available()
|
|
44
|
+
|
|
45
|
+
return Result.error("Unexpected response format")
|
|
46
|
+
|
|
47
|
+
except Exception as e:
|
|
48
|
+
return Result.error(str(e))
|
|
49
|
+
|
|
50
|
+
async def validate_replit(email: str) -> Result:
|
|
51
|
+
return await _check(email)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Signature: 8a477f597d28d172789f06886806bc55
|
|
File without changes
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
import json
|
|
3
|
+
from user_scanner.core.result import Result
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async def _check(email: str) -> Result:
|
|
7
|
+
async with httpx.AsyncClient(http2=False, follow_redirects=True) as client:
|
|
8
|
+
try:
|
|
9
|
+
get_url = "https://www.spotify.com/in-en/signup"
|
|
10
|
+
get_headers = {
|
|
11
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
12
|
+
'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",
|
|
13
|
+
'Accept-Encoding': "identity",
|
|
14
|
+
'sec-ch-ua': "\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"",
|
|
15
|
+
'sec-ch-ua-mobile': "?0",
|
|
16
|
+
'sec-ch-ua-platform': "\"Linux\"",
|
|
17
|
+
'upgrade-insecure-requests': "1",
|
|
18
|
+
'sec-fetch-site': "same-origin",
|
|
19
|
+
'sec-fetch-mode': "navigate",
|
|
20
|
+
'sec-fetch-user': "?1",
|
|
21
|
+
'sec-fetch-dest': "document",
|
|
22
|
+
'referer': "https://www.spotify.com/us/signup",
|
|
23
|
+
'accept-language': "en-US,en;q=0.9",
|
|
24
|
+
'priority': "u=0, i"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
await client.get(get_url, headers=get_headers)
|
|
28
|
+
|
|
29
|
+
post_url = "https://spclient.wg.spotify.com/signup/public/v2/account/validate"
|
|
30
|
+
|
|
31
|
+
payload = {
|
|
32
|
+
"fields": [
|
|
33
|
+
{
|
|
34
|
+
"field": "FIELD_EMAIL",
|
|
35
|
+
"value": email
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"client_info": {
|
|
39
|
+
"api_key": "a1e486e2729f46d6bb368d6b2bcda326",
|
|
40
|
+
"app_version": "v2",
|
|
41
|
+
"capabilities": [1],
|
|
42
|
+
"installation_id": "3740cfb5-c76f-4ae9-9a94-f0989d7ae5a4",
|
|
43
|
+
"platform": "www",
|
|
44
|
+
"client_id": ""
|
|
45
|
+
},
|
|
46
|
+
"tracking": {
|
|
47
|
+
"creation_flow": "",
|
|
48
|
+
"creation_point": "https://www.spotify.com/us/signup",
|
|
49
|
+
"referrer": "",
|
|
50
|
+
"origin_vertical": "",
|
|
51
|
+
"origin_surface": ""
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
post_headers = {
|
|
56
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
57
|
+
'Accept-Encoding': "identity",
|
|
58
|
+
'Content-Type': "application/json",
|
|
59
|
+
'sec-ch-ua-platform': "\"Linux\"",
|
|
60
|
+
'sec-ch-ua': "\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"",
|
|
61
|
+
'sec-ch-ua-mobile': "?0",
|
|
62
|
+
'origin': "https://www.spotify.com",
|
|
63
|
+
'sec-fetch-site': "same-site",
|
|
64
|
+
'sec-fetch-mode': "cors",
|
|
65
|
+
'sec-fetch-dest': "empty",
|
|
66
|
+
'referer': "https://www.spotify.com/",
|
|
67
|
+
'accept-language': "en-US,en;q=0.9",
|
|
68
|
+
'priority': "u=1, i"
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
response = await client.post(post_url, content=json.dumps(payload), headers=post_headers)
|
|
72
|
+
|
|
73
|
+
data = response.json()
|
|
74
|
+
|
|
75
|
+
if "error" in data and "already_exists" in data["error"]:
|
|
76
|
+
return Result.taken()
|
|
77
|
+
elif "success" in data:
|
|
78
|
+
return Result.available()
|
|
79
|
+
|
|
80
|
+
return Result.error(f"Unexpected error [{response.status_code}], report it via GitHub issues")
|
|
81
|
+
|
|
82
|
+
except Exception as e:
|
|
83
|
+
return Result.error(f"Exception: {e}")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def validate_spotify(email: str) -> Result:
|
|
87
|
+
return await _check(email)
|
|
@@ -15,10 +15,10 @@ async def _check(email):
|
|
|
15
15
|
"origin": "https://mastodon.social"
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
async with httpx.AsyncClient(http2=True, headers=headers, follow_redirects=
|
|
18
|
+
async with httpx.AsyncClient(http2=True, headers=headers, follow_redirects=True) as client:
|
|
19
19
|
try:
|
|
20
20
|
initial_resp = await client.get(signup_url)
|
|
21
|
-
if initial_resp.status_code
|
|
21
|
+
if initial_resp.status_code not in [200, 302]:
|
|
22
22
|
return Result.error(f"Failed to access signup page: {initial_resp.status_code}")
|
|
23
23
|
|
|
24
24
|
token_match = re.search(
|
|
@@ -43,7 +43,9 @@ async def _check(email):
|
|
|
43
43
|
res_status = response.status_code
|
|
44
44
|
if "has already been taken" in res_text:
|
|
45
45
|
return Result.taken()
|
|
46
|
-
elif "has
|
|
46
|
+
elif "registration attempt has been blocked" in res_text:
|
|
47
|
+
return Result.error("Your IP has been flagged by mastodon, try after some time")
|
|
48
|
+
elif "has already been taken" not in res_text and res_status in [200, 302]:
|
|
47
49
|
return Result.available()
|
|
48
50
|
elif res_status == 429:
|
|
49
51
|
return Result.error("Rate limited, use '-d' flag to avoid bot detection")
|
|
File without changes
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import difflib
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
from user_scanner.core.orchestrator import generic_validate
|
|
5
|
+
from user_scanner.core.result import Result
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def validate_vinted(user: str):
|
|
9
|
+
user = user.lower().strip()
|
|
10
|
+
|
|
11
|
+
url = f"https://www.vinted.pt/member/general/search?search_text={user}"
|
|
12
|
+
|
|
13
|
+
if not re.match(r"^[a-zA-Z0-9_.-]+$", user):
|
|
14
|
+
return Result.error(
|
|
15
|
+
"Usernames can only contain letters, numbers, underscores, periods and dashes"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
if user.startswith(("_", "-", ".")) or user.endswith(("_", "-", ".")):
|
|
19
|
+
return Result.error("Cannot start/end with a special character")
|
|
20
|
+
|
|
21
|
+
def process(response):
|
|
22
|
+
if response.status_code != 200:
|
|
23
|
+
return Result.error("Invalid status code")
|
|
24
|
+
|
|
25
|
+
pattern = r"\"login\\\":\\\"([A-Za-z0-9_.-]+)"
|
|
26
|
+
search = re.findall(pattern, response.text)
|
|
27
|
+
|
|
28
|
+
if len(search) == 0:
|
|
29
|
+
return Result.available()
|
|
30
|
+
elif user not in search:
|
|
31
|
+
closest = difflib.get_close_matches(user, search, n=1)
|
|
32
|
+
msg = f"closest: {closest[0]}" if closest else None
|
|
33
|
+
return Result.available(msg)
|
|
34
|
+
else:
|
|
35
|
+
return Result.taken()
|
|
36
|
+
|
|
37
|
+
return generic_validate(url, process)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
if __name__ == "__main__":
|
|
41
|
+
user = input("Username?: ").strip()
|
|
42
|
+
validate_vinted(user).show()
|
user_scanner/version.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: user-scanner
|
|
3
|
-
Version: 1.1.0.
|
|
3
|
+
Version: 1.1.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>
|
|
@@ -16,7 +16,7 @@ Project-URL: Homepage, https://github.com/kaifcodec/user-scanner
|
|
|
16
16
|
|
|
17
17
|

|
|
18
18
|
<p align="center">
|
|
19
|
-
<img src="https://img.shields.io/badge/Version-1.1.0.
|
|
19
|
+
<img src="https://img.shields.io/badge/Version-1.1.0.2-blueviolet?style=for-the-badge&logo=github" />
|
|
20
20
|
<img src="https://img.shields.io/github/issues/kaifcodec/user-scanner?style=for-the-badge&logo=github" />
|
|
21
21
|
<img src="https://img.shields.io/badge/Tested%20on-Termux-black?style=for-the-badge&logo=termux" />
|
|
22
22
|
<img src="https://img.shields.io/badge/Tested%20on-Windows-cyan?style=for-the-badge&logo=Windows" />
|
|
@@ -26,8 +26,6 @@ Project-URL: Homepage, https://github.com/kaifcodec/user-scanner
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
-
### ⚠️ Email OSINT mode had not been implemented yet, still in progress
|
|
30
|
-
|
|
31
29
|
A powerful *Email OSINT tool* that checks if a specific email is registered on various sites, combined with *username scanning* for branding or OSINT — 2-in-1 tool.
|
|
32
30
|
|
|
33
31
|
Perfect for fast, accurate and lightweight email OSINT
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
user_scanner/__main__.py,sha256=
|
|
2
|
+
user_scanner/__main__.py,sha256=6ecuWBMKZQLwmz7hSYcOk2uwSxj3jpYqYVI-2ti0zmA,10848
|
|
3
3
|
user_scanner/config.json,sha256=WtVnrpPxhGUBmx_dBShO3R0NnipVBVz3BfzlEPO5Amc,28
|
|
4
|
-
user_scanner/version.json,sha256=
|
|
4
|
+
user_scanner/version.json,sha256=AraEBiS8nb-YghE3619KvezE-vSVK9A4TJRdwF7v92o,49
|
|
5
5
|
user_scanner/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
user_scanner/cli/banner.py,sha256=3b4PIggnJrmxF4DfbuPMqSavpwNl0m5uedaOL2SXN3o,766
|
|
7
7
|
user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
user_scanner/core/email_orchestrator.py,sha256=
|
|
8
|
+
user_scanner/core/email_orchestrator.py,sha256=E813-i_acOEEb9Q_n1aQANBkDrlB6dglUjzVrC0-L-g,2349
|
|
9
9
|
user_scanner/core/formatter.py,sha256=CMwyR6PuP15HqyS6oWe40ye_4dne14lrIj7_5T7rla4,725
|
|
10
10
|
user_scanner/core/helpers.py,sha256=g_WMbEJvT98TA4Db9c-LPIDl6ExjLQ1dSE3cIyKRUos,6406
|
|
11
|
-
user_scanner/core/orchestrator.py,sha256=
|
|
12
|
-
user_scanner/core/result.py,sha256=
|
|
11
|
+
user_scanner/core/orchestrator.py,sha256=uYs6WBUNPo8fFGZzenwCc9DB246zNVEC_DrlZgVxqNo,4485
|
|
12
|
+
user_scanner/core/result.py,sha256=VCIJvte_SXCq59j2o3wQsQYpmXjHTrGKy8Ayn211Rkc,4982
|
|
13
13
|
user_scanner/core/version.py,sha256=k1_KTZdRLKBAxp8_PtOhTAtj8mBO_AUnUGdqI4epypY,855
|
|
14
14
|
user_scanner/email_scan/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
user_scanner/email_scan/adult/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
16
|
user_scanner/email_scan/adult/pornhub.py,sha256=8OF-0h_FntUv1Pi0eT801Bhn6Uhd1dh_fD4lfbKV6OY,2134
|
|
17
|
+
user_scanner/email_scan/adult/sexvid.py,sha256=Hn-C1kelSHaeh6f6q6xzy8lm0PNs-7saLNsBaD-TJmc,1624
|
|
17
18
|
user_scanner/email_scan/adult/xnxx.py,sha256=WiKn4Vkc5FC1HXry9N8SN-dsTdm1qq0NS6KUcPRmMMY,1728
|
|
18
19
|
user_scanner/email_scan/adult/xvideos.py,sha256=tx0PZOZ66KHDmrnvd1RABCnqCUIdKfCPgAbogBtX69A,1769
|
|
19
20
|
user_scanner/email_scan/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -21,10 +22,16 @@ user_scanner/email_scan/community/stackoverflow.py,sha256=Eq3kTXohmp2XodVLaR8ujW
|
|
|
21
22
|
user_scanner/email_scan/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
23
|
user_scanner/email_scan/creator/gumroad.py,sha256=wJfY_CPT2aiGShuL73XYPw_Oni7sEYn8nQ7avc0mrJg,3354
|
|
23
24
|
user_scanner/email_scan/creator/patreon.py,sha256=1A3tPNAyQ6WDLU_XY6PJUYe4FIVWzlALyEgOWzlZ-bE,1904
|
|
24
|
-
user_scanner/email_scan/dev/__init__.py,sha256=
|
|
25
|
+
user_scanner/email_scan/dev/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
25
26
|
user_scanner/email_scan/dev/bitbucket.py,sha256=oR_fSug_Aft4fy8Lu8r0VO737b8ZlfcC_D3GMbcUF0k,1352
|
|
26
27
|
user_scanner/email_scan/dev/github.py,sha256=JBSSN9kv3IQxKG0tmemUdSHwfQDu53dHC4i9oCwDqow,3160
|
|
27
28
|
user_scanner/email_scan/dev/huggingface.py,sha256=GjFNkuVZ_8eFgs9OrFakhiEb8pVRwEJO-tyx32IQMns,1229
|
|
29
|
+
user_scanner/email_scan/dev/replit.py,sha256=Jj4YA1OIibpZ17rvJbccGsJDDnOXCoiH3ybhIwj5d3E,1697
|
|
30
|
+
user_scanner/email_scan/entertainment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
+
user_scanner/email_scan/entertainment/spotify.py,sha256=jzFa9p1IWnAYDK7k7NTJ7ipmrGqmK_PVrUQ4otjldkU,3659
|
|
32
|
+
user_scanner/email_scan/entertainment/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
|
|
33
|
+
user_scanner/email_scan/entertainment/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
|
|
34
|
+
user_scanner/email_scan/entertainment/.ruff_cache/0.14.10/14677874048998292530,sha256=cIbkvYriz3xNK--m83EvzAesaxgXZBfKUoxnx9O6cuo,173
|
|
28
35
|
user_scanner/email_scan/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
29
36
|
user_scanner/email_scan/gaming/chess_com.py,sha256=EJF3OTxYtzDC-F4OAVfT0mRWUopmNZdwdYChw97VpE4,1841
|
|
30
37
|
user_scanner/email_scan/shopping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -32,7 +39,7 @@ user_scanner/email_scan/shopping/flipkart.py,sha256=wMQJ1VIawhM6W0UQCThcIUtaYN7Q
|
|
|
32
39
|
user_scanner/email_scan/social/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
40
|
user_scanner/email_scan/social/facebook.py,sha256=dnCDZfqRYLXDT7GjJQ-bSqGfC-rO8G9O7pu8dUse7Nw,4475
|
|
34
41
|
user_scanner/email_scan/social/instagram.py,sha256=qGDub3d4pSY_KW4aNYDQOGVNSrmWQkZWMHadCFkDa64,2022
|
|
35
|
-
user_scanner/email_scan/social/mastodon.py,sha256=
|
|
42
|
+
user_scanner/email_scan/social/mastodon.py,sha256=Qm13Nl_9j_7sHlc4wN6QF9jgfLlaxbOVgacvXK3hLRY,2478
|
|
36
43
|
user_scanner/email_scan/social/x.py,sha256=WoHaecbR1qGte-mwyODsY0YGNf-iRZyGS7s9fw0SQgg,1475
|
|
37
44
|
user_scanner/user_scan/community/__init__.py,sha256=5EzlM991pJqvqIRc05_QV5BureJZ7wiCRm1AyEY6pms,12
|
|
38
45
|
user_scanner/user_scan/community/coderlegion.py,sha256=W_bdjzdFPRgUrNFFlylvToSJ4AzaFCtTsUy_MRVDdSo,451
|
|
@@ -74,6 +81,8 @@ user_scanner/user_scan/gaming/monkeytype.py,sha256=IWt_0sXPaiTfKVpYVNW9KLMGtDzU5
|
|
|
74
81
|
user_scanner/user_scan/gaming/osu.py,sha256=2Xs1iM0CJ-3dNHu4tyF50_s0Ei_1mA5Zd6D6M5RmiVg,448
|
|
75
82
|
user_scanner/user_scan/gaming/roblox.py,sha256=5q8vWlO5mdUZpQg_rx3ewBrDOHnLprSHJj7uEJ2S934,1813
|
|
76
83
|
user_scanner/user_scan/gaming/steam.py,sha256=l8xk_p9aiYQWCPoogQnO1iwkfojPhg6yd76OZHhKN50,740
|
|
84
|
+
user_scanner/user_scan/shopping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
85
|
+
user_scanner/user_scan/shopping/vinted.py,sha256=YwuHl1LFJHdqmQ2OEjFHjh2Bt8Ce5m4pq67aDGTWk_U,1299
|
|
77
86
|
user_scanner/user_scan/social/__init__.py,sha256=jaCkFwX1uYtF0ENifVwF8OfHrYYUTm64B9wlBq9BBfQ,9
|
|
78
87
|
user_scanner/user_scan/social/bluesky.py,sha256=11Y_vRj3txEDQqoD0iANgSWVSB8L87OotPQZquhneR0,1994
|
|
79
88
|
user_scanner/user_scan/social/discord.py,sha256=KA7Uw8RBuid-YZZglIKQwWbg8PIKdrMwXP3fKH3c-go,1180
|
|
@@ -91,8 +100,8 @@ user_scanner/user_scan/social/youtube.py,sha256=UPu584teg75P7FT05RFG3nobbHgPmzjr
|
|
|
91
100
|
user_scanner/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
101
|
user_scanner/utils/update.py,sha256=Rj3kLuUrQ-LlKGB7bkndqVjj0IUqugbDSj2SUrPRidE,936
|
|
93
102
|
user_scanner/utils/updater_logic.py,sha256=tl6kbKL02DrP-R1dkQWhHr12juVDgkJZZvKAfbI1ruU,2381
|
|
94
|
-
user_scanner-1.1.0.
|
|
95
|
-
user_scanner-1.1.0.
|
|
96
|
-
user_scanner-1.1.0.
|
|
97
|
-
user_scanner-1.1.0.
|
|
98
|
-
user_scanner-1.1.0.
|
|
103
|
+
user_scanner-1.1.0.2.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
|
|
104
|
+
user_scanner-1.1.0.2.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
|
|
105
|
+
user_scanner-1.1.0.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
106
|
+
user_scanner-1.1.0.2.dist-info/METADATA,sha256=IlmLoZS92pZRb_kL0-oDnr2Diyd8aTjpLg3Da0D6V_E,8542
|
|
107
|
+
user_scanner-1.1.0.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|