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 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, find_category
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('.')[-1]
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 Result.error(f"Function {func_name} not found")
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
- # Use helper to get actual dir name for the Result object
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(f"{site_name} has no validate_ function", site_name=site_name, username=username)
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
 
@@ -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} ({username}): {status_text}{reason}{Style.RESET_ALL}"
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,2 @@
1
+ # Automatically created by ruff.
2
+ *
@@ -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=False) as client:
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 != 200:
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 already been taken" not in res_text and res_status == 200:
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,4 +1,4 @@
1
1
  {
2
- "version": "1.1.0.1",
2
+ "version": "1.1.0.2",
3
3
  "version_type": "pypi"
4
4
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: user-scanner
3
- Version: 1.1.0.1
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
  ![User Scanner Logo](https://github.com/user-attachments/assets/49ec8d24-665b-4115-8525-01a8d0ca2ef4)
18
18
  <p align="center">
19
- <img src="https://img.shields.io/badge/Version-1.1.0.1-blueviolet?style=for-the-badge&logo=github" />
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=upuAt-VZO08YzaA4paD7ArUy2S2K12wdTqlNxn107eY,10762
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=qPO6w95jVdDx0X8YsZd9W4mBunJRM3ygchXw7ESU4VY,49
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=EMQGqvk4GqaXQqCSTOYdveRuu63bLf71r6TTrfSrups,2368
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=OLC4JmBJm1ZzwsDUt6Kqtcc2BENs3fP0iqbTT1nS3KU,4460
12
- user_scanner/core/result.py,sha256=3jd3CNciuJCtdh9P3SL7WW3x7cuDoyJOlq7WhgRivJA,4751
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=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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=F4E1kJ6148N3C66uFvJu_fhx7r7LcMau6wDIkdRbxlM,2294
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.1.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
95
- user_scanner-1.1.0.1.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
96
- user_scanner-1.1.0.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
97
- user_scanner-1.1.0.1.dist-info/METADATA,sha256=UhTN17ewVKkC7qZMXLMfR25uw5dGe1padSXC3BX3zcg,8620
98
- user_scanner-1.1.0.1.dist-info/RECORD,,
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,,