user-scanner 1.1.0.2__py3-none-any.whl → 1.1.0.3__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/.ruff_cache/0.14.10/12603567674167520802 +0 -0
- user_scanner/.ruff_cache/0.14.10/12688104075811904861 +0 -0
- user_scanner/.ruff_cache/0.14.10/15694509833576274574 +0 -0
- user_scanner/.ruff_cache/0.14.10/301008395129872757 +0 -0
- user_scanner/.ruff_cache/0.14.10/4908403194175060721 +0 -0
- user_scanner/.ruff_cache/0.14.10/572980360641624523 +0 -0
- user_scanner/.ruff_cache/0.14.10/5935143038219898089 +0 -0
- user_scanner/config.json +3 -1
- user_scanner/email_scan/community/.ruff_cache/.gitignore +2 -0
- user_scanner/email_scan/community/.ruff_cache/0.14.10/3933329632096143294 +0 -0
- user_scanner/email_scan/community/.ruff_cache/CACHEDIR.TAG +1 -0
- user_scanner/email_scan/community/quora.py +112 -0
- user_scanner/email_scan/dev/.ruff_cache/.gitignore +2 -0
- user_scanner/email_scan/dev/.ruff_cache/0.14.10/10328336453267387919 +0 -0
- user_scanner/email_scan/dev/.ruff_cache/CACHEDIR.TAG +1 -0
- user_scanner/email_scan/dev/bitbucket.py +2 -0
- user_scanner/email_scan/dev/codecademy.py +49 -0
- user_scanner/email_scan/dev/codepen.py +54 -0
- user_scanner/email_scan/dev/devrant.py +49 -0
- user_scanner/email_scan/dev/github.py +2 -0
- user_scanner/email_scan/dev/wordpress.py +52 -0
- user_scanner/email_scan/hosting/.ruff_cache/.gitignore +2 -0
- user_scanner/email_scan/hosting/.ruff_cache/0.14.10/6358275293999347997 +0 -0
- user_scanner/email_scan/hosting/.ruff_cache/CACHEDIR.TAG +1 -0
- user_scanner/email_scan/hosting/render.py +60 -0
- user_scanner/email_scan/music/.ruff_cache/.gitignore +2 -0
- user_scanner/email_scan/music/.ruff_cache/0.14.10/7544735312652879689 +0 -0
- user_scanner/email_scan/music/.ruff_cache/CACHEDIR.TAG +1 -0
- user_scanner/email_scan/music/__init__.py +0 -0
- user_scanner/email_scan/music/lastfm.py +60 -0
- user_scanner/email_scan/shopping/envato.py +41 -0
- user_scanner/email_scan/shopping/naturabuy.py +46 -0
- user_scanner/email_scan/shopping/vivino.py +49 -0
- user_scanner/user_scan/gaming/battlenet.py +65 -0
- {user_scanner-1.1.0.2.dist-info → user_scanner-1.1.0.3.dist-info}/METADATA +33 -5
- {user_scanner-1.1.0.2.dist-info → user_scanner-1.1.0.3.dist-info}/RECORD +44 -13
- /user_scanner/{email_scan/entertainment/.ruff_cache → .ruff_cache}/.gitignore +0 -0
- /user_scanner/{email_scan/entertainment/.ruff_cache → .ruff_cache}/CACHEDIR.TAG +0 -0
- /user_scanner/email_scan/{entertainment → hosting}/__init__.py +0 -0
- /user_scanner/email_scan/{entertainment → music}/.ruff_cache/0.14.10/14677874048998292530 +0 -0
- /user_scanner/email_scan/{entertainment → music}/spotify.py +0 -0
- {user_scanner-1.1.0.2.dist-info → user_scanner-1.1.0.3.dist-info}/WHEEL +0 -0
- {user_scanner-1.1.0.2.dist-info → user_scanner-1.1.0.3.dist-info}/entry_points.txt +0 -0
- {user_scanner-1.1.0.2.dist-info → user_scanner-1.1.0.3.dist-info}/licenses/LICENSE +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
user_scanner/config.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Signature: 8a477f597d28d172789f06886806bc55
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import json
|
|
3
|
+
import re
|
|
4
|
+
import os
|
|
5
|
+
import shutil
|
|
6
|
+
from user_scanner.core.result import Result
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
async def _check(email: str) -> Result:
|
|
10
|
+
if not shutil.which("curl"):
|
|
11
|
+
return Result.error("curl is not installed, install it to use Quora validation")
|
|
12
|
+
|
|
13
|
+
cookie_path = f"quora_cookie_{os.getpid()}.txt"
|
|
14
|
+
base_url = "https://www.quora.com/"
|
|
15
|
+
gql_url = "https://www.quora.com/graphql/gql_para_POST"
|
|
16
|
+
|
|
17
|
+
headers = {
|
|
18
|
+
'host': 'www.quora.com',
|
|
19
|
+
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
|
|
20
|
+
'sec-ch-ua-mobile': '?1',
|
|
21
|
+
'sec-ch-ua-platform': '"Android"',
|
|
22
|
+
'upgrade-insecure-requests': '1',
|
|
23
|
+
'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36',
|
|
24
|
+
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
|
|
25
|
+
'referer': 'https://www.google.com/',
|
|
26
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async def run_curl(url, current_headers, post_data=None, url_params=None):
|
|
30
|
+
cmd = ["curl", "-s", "-k", "-L", "--http2", "--max-time",
|
|
31
|
+
"5", "-c", cookie_path, "-b", cookie_path]
|
|
32
|
+
for k, v in current_headers.items():
|
|
33
|
+
cmd.extend(["-H", f"{k}: {v}"])
|
|
34
|
+
if url_params:
|
|
35
|
+
import urllib.parse
|
|
36
|
+
url += "?" + urllib.parse.urlencode(url_params)
|
|
37
|
+
if post_data:
|
|
38
|
+
cmd.extend(["-X", "POST", "--data-raw", json.dumps(post_data)])
|
|
39
|
+
cmd.append(url)
|
|
40
|
+
|
|
41
|
+
process = await asyncio.create_subprocess_exec(
|
|
42
|
+
*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
|
|
43
|
+
)
|
|
44
|
+
try:
|
|
45
|
+
stdout, _ = await asyncio.wait_for(process.communicate(), timeout=5)
|
|
46
|
+
return stdout.decode('utf-8', errors='ignore')
|
|
47
|
+
except asyncio.TimeoutError:
|
|
48
|
+
try:
|
|
49
|
+
process.kill()
|
|
50
|
+
except Exception:
|
|
51
|
+
pass
|
|
52
|
+
return ""
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
html = await run_curl(base_url, headers)
|
|
56
|
+
if not html:
|
|
57
|
+
if os.path.exists(cookie_path):
|
|
58
|
+
os.remove(cookie_path)
|
|
59
|
+
return Result.error("Connection timed out")
|
|
60
|
+
|
|
61
|
+
formkey_match = re.search(r'\"formkey\":\s*\"([a-f0-9]{32})\"', html)
|
|
62
|
+
if not formkey_match:
|
|
63
|
+
if os.path.exists(cookie_path):
|
|
64
|
+
os.remove(cookie_path)
|
|
65
|
+
return Result.error("Quora blocked the request (Bot detection/403)")
|
|
66
|
+
|
|
67
|
+
formkey = formkey_match.group(1)
|
|
68
|
+
|
|
69
|
+
gql_headers = headers.copy()
|
|
70
|
+
gql_headers.update({
|
|
71
|
+
'content-type': 'application/json',
|
|
72
|
+
'quora-formkey': formkey,
|
|
73
|
+
'quora-canary-revision': 'false',
|
|
74
|
+
'origin': 'https://www.quora.com',
|
|
75
|
+
'referer': 'https://www.quora.com/',
|
|
76
|
+
'priority': 'u=1, i'
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
payload = {
|
|
80
|
+
"queryName": "SignupEmailForm_validateEmail_Query",
|
|
81
|
+
"variables": {"email": email},
|
|
82
|
+
"extensions": {
|
|
83
|
+
"hash": "1db80096407be846d5581fe1b42b12fd05e0b40a5d3095ed40a0b4bd28f49fe7"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
response_text = await run_curl(gql_url, gql_headers, post_data=payload, url_params={'q': "SignupEmailForm_validateEmail_Query"})
|
|
88
|
+
|
|
89
|
+
if os.path.exists(cookie_path):
|
|
90
|
+
os.remove(cookie_path)
|
|
91
|
+
|
|
92
|
+
if not response_text.strip():
|
|
93
|
+
return Result.error("Quora timed out or returned empty body")
|
|
94
|
+
|
|
95
|
+
data = json.loads(response_text)
|
|
96
|
+
status = data.get("data", {}).get("validateEmail")
|
|
97
|
+
|
|
98
|
+
if status == "IN_USE":
|
|
99
|
+
return Result.taken()
|
|
100
|
+
elif status == "OK":
|
|
101
|
+
return Result.available()
|
|
102
|
+
else:
|
|
103
|
+
return Result.error(f"Unexpected status: {status}")
|
|
104
|
+
|
|
105
|
+
except Exception as e:
|
|
106
|
+
if os.path.exists(cookie_path):
|
|
107
|
+
os.remove(cookie_path)
|
|
108
|
+
return Result.error(e)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
async def validate_quora(email: str) -> Result:
|
|
112
|
+
return await _check(email)
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Signature: 8a477f597d28d172789f06886806bc55
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import httpx
|
|
2
2
|
from user_scanner.core.result import Result
|
|
3
3
|
|
|
4
|
+
|
|
4
5
|
async def _check(email: str) -> Result:
|
|
5
6
|
async with httpx.AsyncClient(http2=True) as client:
|
|
6
7
|
try:
|
|
@@ -29,5 +30,6 @@ async def _check(email: str) -> Result:
|
|
|
29
30
|
except Exception as e:
|
|
30
31
|
return Result.error(f"Unexpected exception:{e}")
|
|
31
32
|
|
|
33
|
+
|
|
32
34
|
async def validate_bitbucket(email: str) -> Result:
|
|
33
35
|
return await _check(email)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
import re
|
|
3
|
+
from user_scanner.core.result import Result
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async def _check(email: str) -> Result:
|
|
7
|
+
headers = {
|
|
8
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
9
|
+
'Accept': 'application/json',
|
|
10
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
11
|
+
'Referer': 'https://www.codecademy.com/register?redirect=%2F',
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
'Origin': 'https://www.codecademy.com',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
async with httpx.AsyncClient(timeout=4.0, follow_redirects=True) as client:
|
|
18
|
+
init_res = await client.get("https://www.codecademy.com/register", headers=headers)
|
|
19
|
+
|
|
20
|
+
csrf_match = re.search(
|
|
21
|
+
r'name="csrf-token" content="([^"]+)"', init_res.text)
|
|
22
|
+
if not csrf_match:
|
|
23
|
+
return Result.error("Could not find CSRF token")
|
|
24
|
+
|
|
25
|
+
headers["X-CSRF-Token"] = csrf_match.group(1)
|
|
26
|
+
|
|
27
|
+
payload = {"user": {"email": email}}
|
|
28
|
+
|
|
29
|
+
response = await client.post(
|
|
30
|
+
'https://www.codecademy.com/register/validate',
|
|
31
|
+
headers=headers,
|
|
32
|
+
json=payload
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
if response.status_code == 400 and 'has already been taken' in response.text:
|
|
36
|
+
return Result.taken()
|
|
37
|
+
elif response.status_code == 200:
|
|
38
|
+
return Result.available()
|
|
39
|
+
|
|
40
|
+
return Result.error(f"Unexpected response: {response.status_code}")
|
|
41
|
+
|
|
42
|
+
except httpx.TimeoutException:
|
|
43
|
+
return Result.error("Connection timed out")
|
|
44
|
+
except Exception as e:
|
|
45
|
+
return Result.error(str(e))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def validate_codecademy(email: str) -> Result:
|
|
49
|
+
return await _check(email)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
import re
|
|
3
|
+
from user_scanner.core.result import Result
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async def _check(email: str) -> Result:
|
|
7
|
+
headers = {
|
|
8
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
9
|
+
'Accept': '*/*',
|
|
10
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
11
|
+
'Referer': 'https://codepen.io/accounts/signup/user/free',
|
|
12
|
+
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
|
13
|
+
'X-Requested-With': 'XMLHttpRequest',
|
|
14
|
+
'Origin': 'https://codepen.io',
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
async with httpx.AsyncClient(timeout=10.0, follow_redirects=True) as client:
|
|
19
|
+
init_res = await client.get("https://codepen.io/accounts/signup/user/free", headers=headers)
|
|
20
|
+
|
|
21
|
+
csrf_match = re.search(
|
|
22
|
+
r'name="csrf-token" content="([^"]+)"', init_res.text)
|
|
23
|
+
if not csrf_match:
|
|
24
|
+
return Result.error("Could not find CSRF token")
|
|
25
|
+
|
|
26
|
+
headers["X-CSRF-Token"] = csrf_match.group(1)
|
|
27
|
+
|
|
28
|
+
payload = {
|
|
29
|
+
'attribute': 'email',
|
|
30
|
+
'value': email,
|
|
31
|
+
'context': 'user'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
response = await client.post(
|
|
35
|
+
'https://codepen.io/accounts/duplicate_check',
|
|
36
|
+
headers=headers,
|
|
37
|
+
data=payload
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if "That Email is already taken." in response.text:
|
|
41
|
+
return Result.taken()
|
|
42
|
+
elif response.status_code == 200:
|
|
43
|
+
return Result.available()
|
|
44
|
+
|
|
45
|
+
return Result.error(f"Unexpected response: {response.status_code}")
|
|
46
|
+
|
|
47
|
+
except httpx.TimeoutException:
|
|
48
|
+
return Result.error("Connection timed out")
|
|
49
|
+
except Exception as e:
|
|
50
|
+
return Result.error(str(e))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
async def validate_codepen(email: str) -> Result:
|
|
54
|
+
return await _check(email)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
async def _check(email: str) -> Result:
|
|
6
|
+
headers = {
|
|
7
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
8
|
+
'Accept': 'application/json, text/javascript, */*; q=0.01',
|
|
9
|
+
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
|
10
|
+
'X-Requested-With': 'XMLHttpRequest',
|
|
11
|
+
'Origin': 'https://devrant.com',
|
|
12
|
+
'Referer': 'https://devrant.com/feed/top/month?login=1',
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
payload = {
|
|
16
|
+
'app': '3',
|
|
17
|
+
'type': '1',
|
|
18
|
+
'email': email,
|
|
19
|
+
'username': '',
|
|
20
|
+
'password': '',
|
|
21
|
+
'guid': '',
|
|
22
|
+
'plat': '3',
|
|
23
|
+
'sid': '',
|
|
24
|
+
'seid': ''
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
async with httpx.AsyncClient(timeout=10.0) as client:
|
|
29
|
+
response = await client.post('https://devrant.com/api/users', headers=headers, data=payload)
|
|
30
|
+
|
|
31
|
+
if response.status_code != 200:
|
|
32
|
+
return Result.error(f"Unexpected status code: {response.status_code}")
|
|
33
|
+
|
|
34
|
+
data = response.json()
|
|
35
|
+
error_msg = data.get('error', '')
|
|
36
|
+
|
|
37
|
+
if error_msg == 'The email specified is already registered to an account.':
|
|
38
|
+
return Result.taken()
|
|
39
|
+
|
|
40
|
+
return Result.available()
|
|
41
|
+
|
|
42
|
+
except httpx.TimeoutException:
|
|
43
|
+
return Result.error("Connection timed out")
|
|
44
|
+
except Exception as e:
|
|
45
|
+
return Result.error(str(e))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def validate_devrant(email: str) -> Result:
|
|
49
|
+
return await _check(email)
|
|
@@ -2,6 +2,7 @@ import httpx
|
|
|
2
2
|
import re
|
|
3
3
|
from user_scanner.core.result import Result
|
|
4
4
|
|
|
5
|
+
|
|
5
6
|
async def _check(email: str) -> Result:
|
|
6
7
|
async with httpx.AsyncClient(http2=True, follow_redirects=True) as client:
|
|
7
8
|
try:
|
|
@@ -68,5 +69,6 @@ async def _check(email: str) -> Result:
|
|
|
68
69
|
except Exception as e:
|
|
69
70
|
return Result.error(f"unexpected exception: {e}")
|
|
70
71
|
|
|
72
|
+
|
|
71
73
|
async def validate_github(email: str) -> Result:
|
|
72
74
|
return await _check(email)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
async def _check(email: str) -> Result:
|
|
6
|
+
url = f"https://public-api.wordpress.com/rest/v1.1/users/{email}/auth-options"
|
|
7
|
+
|
|
8
|
+
params = {
|
|
9
|
+
'http_envelope': "1"
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
headers = {
|
|
13
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
14
|
+
'Accept': "application/json",
|
|
15
|
+
'sec-ch-ua-platform': '"Linux"',
|
|
16
|
+
'sec-ch-ua': '"Not(A:Brand";v="8", "Chromium";v="144", "Google Chrome";v="144"',
|
|
17
|
+
'sec-ch-ua-mobile': "?0",
|
|
18
|
+
'sec-fetch-site': "same-origin",
|
|
19
|
+
'sec-fetch-mode': "cors",
|
|
20
|
+
'sec-fetch-dest': "empty",
|
|
21
|
+
'referer': "https://public-api.wordpress.com/wp-admin/rest-proxy/?v=2.0",
|
|
22
|
+
'accept-language': "en-US,en;q=0.9",
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
async with httpx.AsyncClient(timeout=5.0) as client:
|
|
27
|
+
response = await client.get(url, params=params, headers=headers)
|
|
28
|
+
|
|
29
|
+
if response.status_code != 200:
|
|
30
|
+
return Result.error(f"WordPress API returned status {response.status_code}")
|
|
31
|
+
|
|
32
|
+
data = response.json()
|
|
33
|
+
|
|
34
|
+
inner_code = data.get("code")
|
|
35
|
+
body = data.get("body", {})
|
|
36
|
+
|
|
37
|
+
if inner_code == 200:
|
|
38
|
+
return Result.taken()
|
|
39
|
+
elif inner_code == 404 and body.get("error") == "unknown_user":
|
|
40
|
+
return Result.available()
|
|
41
|
+
else:
|
|
42
|
+
error_msg = body.get("message", "Unknown API response")
|
|
43
|
+
return Result.error(f"WordPress Error: {error_msg}")
|
|
44
|
+
|
|
45
|
+
except httpx.TimeoutException:
|
|
46
|
+
return Result.error("Connection timed out")
|
|
47
|
+
except Exception as e:
|
|
48
|
+
return Result.error(str(e))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
async def validate_wordpress(email: str) -> Result:
|
|
52
|
+
return await _check(email)
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Signature: 8a477f597d28d172789f06886806bc55
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
async def _check(email: str) -> Result:
|
|
5
|
+
url = "https://api.render.com/graphql"
|
|
6
|
+
|
|
7
|
+
payload = {
|
|
8
|
+
"operationName": "signUp",
|
|
9
|
+
"variables": {
|
|
10
|
+
"signup": {
|
|
11
|
+
"email": email,
|
|
12
|
+
"githubId": "",
|
|
13
|
+
"name": "",
|
|
14
|
+
"githubToken": "",
|
|
15
|
+
"googleId": "",
|
|
16
|
+
"gitlabId": "",
|
|
17
|
+
"bitbucketId": "",
|
|
18
|
+
"inviteCode": "",
|
|
19
|
+
"password": "StandardPassword123!",
|
|
20
|
+
"newsletterOptIn": False,
|
|
21
|
+
"next": ""
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"query": "mutation signUp($signup: SignupInput!) {\n signUp(signup: $signup) {\n idToken\n __typename\n }\n}\n"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
headers = {
|
|
28
|
+
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
29
|
+
"Content-Type": "application/json",
|
|
30
|
+
"origin": "https://dashboard.render.com",
|
|
31
|
+
"referer": "https://dashboard.render.com/register",
|
|
32
|
+
"accept-language": "en-US,en;q=0.9"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async with httpx.AsyncClient(http2=True, timeout=4.0) as client:
|
|
36
|
+
try:
|
|
37
|
+
response = await client.post(url, json=payload, headers=headers)
|
|
38
|
+
|
|
39
|
+
if response.status_code == 429:
|
|
40
|
+
return Result.error("Rate limited, use '-d' flag to avoid bot detection")
|
|
41
|
+
|
|
42
|
+
data = response.json()
|
|
43
|
+
errors = data.get("errors", [])
|
|
44
|
+
|
|
45
|
+
if errors:
|
|
46
|
+
msg = errors[0].get("message", "")
|
|
47
|
+
if '"email":"exists"' in msg:
|
|
48
|
+
return Result.taken()
|
|
49
|
+
elif '"hcaptcha_token":"invalid"' in msg:
|
|
50
|
+
return Result.available()
|
|
51
|
+
else:
|
|
52
|
+
return Result.error(f"Render Error: {msg}")
|
|
53
|
+
|
|
54
|
+
return Result.error("Unexpected error, report it via GitHub issues")
|
|
55
|
+
|
|
56
|
+
except Exception as e:
|
|
57
|
+
return Result.error(e)
|
|
58
|
+
|
|
59
|
+
async def validate_render(email: str) -> Result:
|
|
60
|
+
return await _check(email)
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Signature: 8a477f597d28d172789f06886806bc55
|
|
File without changes
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
async def _check(email: str) -> Result:
|
|
6
|
+
headers = {
|
|
7
|
+
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
8
|
+
"Accept": "application/json, text/javascript, */*; q=0.01",
|
|
9
|
+
"Accept-Language": "en-US,en;q=0.9",
|
|
10
|
+
"Referer": "https://www.last.fm/join",
|
|
11
|
+
"X-Requested-With": "XMLHttpRequest",
|
|
12
|
+
"Origin": "https://www.last.fm",
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=True) as client:
|
|
17
|
+
await client.get("https://www.last.fm/join", headers=headers)
|
|
18
|
+
token = client.cookies.get("csrftoken")
|
|
19
|
+
|
|
20
|
+
if not token:
|
|
21
|
+
return Result.error("CSRF token not found")
|
|
22
|
+
|
|
23
|
+
headers["X-CSRFToken"] = token
|
|
24
|
+
payload = {
|
|
25
|
+
"csrfmiddlewaretoken": token,
|
|
26
|
+
"userName": "",
|
|
27
|
+
"email": email,
|
|
28
|
+
"password": "",
|
|
29
|
+
"passwordConf": ""
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
response = await client.post(
|
|
33
|
+
"https://www.last.fm/join/partial/validate",
|
|
34
|
+
headers=headers,
|
|
35
|
+
data=payload
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
if response.status_code != 200:
|
|
39
|
+
return Result.error(f"HTTP {response.status_code}")
|
|
40
|
+
|
|
41
|
+
data = response.json()
|
|
42
|
+
email_info = data.get("email", {})
|
|
43
|
+
|
|
44
|
+
if email_info.get("valid") is False and any("already registered" in str(msg).lower() for msg in email_info.get("error_messages", [])):
|
|
45
|
+
return Result.taken()
|
|
46
|
+
|
|
47
|
+
elif email_info.get("valid") is True:
|
|
48
|
+
return Result.available()
|
|
49
|
+
|
|
50
|
+
else:
|
|
51
|
+
return Result.error(data)
|
|
52
|
+
|
|
53
|
+
except httpx.TimeoutException:
|
|
54
|
+
return Result.error("Connection timed out")
|
|
55
|
+
except Exception as e:
|
|
56
|
+
return Result.error(e)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def validate_lastfm(email: str) -> Result:
|
|
60
|
+
return await _check(email)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
async def _check(email: str) -> Result:
|
|
5
|
+
headers = {
|
|
6
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
7
|
+
'Accept': 'application/json',
|
|
8
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
9
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
10
|
+
'Origin': 'https://account.envato.com',
|
|
11
|
+
'Referer': 'https://account.envato.com/sign_up',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
payload = {'email': email}
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
async with httpx.AsyncClient(timeout=10.0) as client:
|
|
18
|
+
response = await client.post(
|
|
19
|
+
'https://account.envato.com/api/validate_email',
|
|
20
|
+
headers=headers,
|
|
21
|
+
data=payload
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if 'Email is already in use' in response.text:
|
|
25
|
+
return Result.taken()
|
|
26
|
+
|
|
27
|
+
if response.status_code == 200:
|
|
28
|
+
return Result.available()
|
|
29
|
+
|
|
30
|
+
if "Page designed by Kotulsky" in response.text or response.status_code == 429:
|
|
31
|
+
return Result.error("Rate limit or Cloudflare challenge detected")
|
|
32
|
+
|
|
33
|
+
return Result.error(f"Unexpected response: {response.status_code}")
|
|
34
|
+
|
|
35
|
+
except httpx.TimeoutException:
|
|
36
|
+
return Result.error("Connection timed out")
|
|
37
|
+
except Exception as e:
|
|
38
|
+
return Result.error(str(e))
|
|
39
|
+
|
|
40
|
+
async def validate_envato(email: str) -> Result:
|
|
41
|
+
return await _check(email)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
async def _check(email: str) -> Result:
|
|
5
|
+
headers = {
|
|
6
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
7
|
+
'Accept': '*/*',
|
|
8
|
+
'Accept-Language': 'fr,fr-FR;q=0.9,en;q=0.8',
|
|
9
|
+
'X-Requested-With': 'XMLHttpRequest',
|
|
10
|
+
'Origin': 'https://www.naturabuy.fr',
|
|
11
|
+
'Referer': 'https://www.naturabuy.fr/register.php',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
files = {
|
|
15
|
+
'jsref': (None, 'email'),
|
|
16
|
+
'jsvalue': (None, email),
|
|
17
|
+
'registerMode': (None, 'full')
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
async with httpx.AsyncClient(timeout=10.0) as client:
|
|
22
|
+
response = await client.post(
|
|
23
|
+
'https://www.naturabuy.fr/includes/ajax/register.php',
|
|
24
|
+
headers=headers,
|
|
25
|
+
files=files
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
if response.status_code != 200:
|
|
29
|
+
return Result.error(f"Unexpected status: {response.status_code}")
|
|
30
|
+
|
|
31
|
+
data = response.json()
|
|
32
|
+
|
|
33
|
+
if data.get("free") is False:
|
|
34
|
+
return Result.taken()
|
|
35
|
+
elif data.get("free") is True:
|
|
36
|
+
return Result.available()
|
|
37
|
+
|
|
38
|
+
return Result.error("Unexpected response format")
|
|
39
|
+
|
|
40
|
+
except httpx.TimeoutException:
|
|
41
|
+
return Result.error("Connection timed out")
|
|
42
|
+
except Exception as e:
|
|
43
|
+
return Result.error(str(e))
|
|
44
|
+
|
|
45
|
+
async def validate_naturabuy(email: str) -> Result:
|
|
46
|
+
return await _check(email)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
async def _check(email: str) -> Result:
|
|
5
|
+
headers = {
|
|
6
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
7
|
+
'Accept': 'application/json',
|
|
8
|
+
'Referer': 'https://www.vivino.com/',
|
|
9
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
10
|
+
'X-Requested-With': 'XMLHttpRequest',
|
|
11
|
+
'Content-Type': 'application/json',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
async with httpx.AsyncClient(timeout=10.0) as client:
|
|
16
|
+
await client.get("https://www.vivino.com/", headers=headers)
|
|
17
|
+
|
|
18
|
+
payload = {
|
|
19
|
+
"email": email,
|
|
20
|
+
"password": "password123"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
response = await client.post(
|
|
24
|
+
'https://www.vivino.com/api/login',
|
|
25
|
+
headers=headers,
|
|
26
|
+
json=payload
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
if response.status_code == 429:
|
|
30
|
+
return Result.error("Rate limit exceeded")
|
|
31
|
+
|
|
32
|
+
data = response.json()
|
|
33
|
+
error_msg = data.get("error", "")
|
|
34
|
+
|
|
35
|
+
if error_msg == "The supplied email does not exist":
|
|
36
|
+
return Result.available()
|
|
37
|
+
|
|
38
|
+
if not error_msg or "password" in error_msg.lower():
|
|
39
|
+
return Result.taken()
|
|
40
|
+
|
|
41
|
+
return Result.error(f"Vivino Error: {error_msg}")
|
|
42
|
+
|
|
43
|
+
except httpx.TimeoutException:
|
|
44
|
+
return Result.error("Connection timed out")
|
|
45
|
+
except Exception as e:
|
|
46
|
+
return Result.error(str(e))
|
|
47
|
+
|
|
48
|
+
async def validate_vivino(email: str) -> Result:
|
|
49
|
+
return await _check(email)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from user_scanner.core.orchestrator import generic_validate
|
|
3
|
+
from user_scanner.core.result import Result
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def validate_battlenet(user: str) -> Result:
|
|
7
|
+
"""
|
|
8
|
+
Check username availability on Battle.net via Overwatch player search.
|
|
9
|
+
|
|
10
|
+
Battle.net uses BattleTags (Username#1234) but this validator checks
|
|
11
|
+
if the username portion exists in the Overwatch player database.
|
|
12
|
+
|
|
13
|
+
Note: This checks Overwatch profiles specifically. A username may exist
|
|
14
|
+
on Battle.net but not have an Overwatch profile, or vice versa.
|
|
15
|
+
|
|
16
|
+
API behavior:
|
|
17
|
+
- Returns JSON array with player data if username exists
|
|
18
|
+
- Returns empty array [] if username not found
|
|
19
|
+
"""
|
|
20
|
+
# BattleTag username rules: 3-12 chars, letters/numbers, one optional #
|
|
21
|
+
# For this validator, we strip any #1234 discriminator if present
|
|
22
|
+
username = user.split('#')[0]
|
|
23
|
+
|
|
24
|
+
if not (3 <= len(username) <= 12):
|
|
25
|
+
return Result.error("Length must be 3-12 characters")
|
|
26
|
+
|
|
27
|
+
if not re.match(r'^[a-zA-Z][a-zA-Z0-9]*$', username):
|
|
28
|
+
return Result.error("Must start with letter, only letters and numbers allowed")
|
|
29
|
+
|
|
30
|
+
url = f"https://overwatch.blizzard.com/en-us/search/account-by-name/{username}"
|
|
31
|
+
|
|
32
|
+
headers = {
|
|
33
|
+
"User-Agent": "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36",
|
|
34
|
+
"Accept": "application/json",
|
|
35
|
+
"Accept-Encoding": "gzip, deflate, br, zstd",
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
def process(response):
|
|
39
|
+
if response.status_code != 200:
|
|
40
|
+
return Result.error(f"Unexpected status: {response.status_code}")
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
data = response.json()
|
|
44
|
+
if isinstance(data, list) and len(data) == 0:
|
|
45
|
+
return Result.available()
|
|
46
|
+
elif isinstance(data, list) and len(data) > 0:
|
|
47
|
+
return Result.taken()
|
|
48
|
+
else:
|
|
49
|
+
return Result.error("Unexpected response format")
|
|
50
|
+
except Exception:
|
|
51
|
+
return Result.error("Failed to parse response")
|
|
52
|
+
|
|
53
|
+
return generic_validate(url, process, headers=headers, timeout=15.0, follow_redirects=True)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == "__main__":
|
|
57
|
+
user = input("Username?: ").strip()
|
|
58
|
+
result = validate_battlenet(user)
|
|
59
|
+
|
|
60
|
+
if result == 1:
|
|
61
|
+
print("Available!")
|
|
62
|
+
elif result == 0:
|
|
63
|
+
print("Unavailable!")
|
|
64
|
+
else:
|
|
65
|
+
print(f"Error occurred! Reason: {result.get_reason()}")
|
|
@@ -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.3
|
|
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.3-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" />
|
|
@@ -52,12 +52,28 @@ Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instag
|
|
|
52
52
|
- ✅ **Bulk email scanning** from file support for checking multiple emails at once
|
|
53
53
|
---
|
|
54
54
|
|
|
55
|
-
##
|
|
55
|
+
## Virtual Environment (optional but recommended)
|
|
56
56
|
|
|
57
57
|
```bash
|
|
58
|
-
|
|
58
|
+
# create venv
|
|
59
|
+
python -m venv .venv
|
|
60
|
+
````
|
|
61
|
+
## Activate venv
|
|
62
|
+
```bash
|
|
63
|
+
# Linux / macOS
|
|
64
|
+
source .venv/bin/activate
|
|
65
|
+
|
|
66
|
+
# Windows (PowerShell)
|
|
67
|
+
.venv\Scripts\Activate.ps1
|
|
59
68
|
```
|
|
69
|
+
## Installation
|
|
70
|
+
```bash
|
|
71
|
+
# upgrade pip
|
|
72
|
+
python -m pip install --upgrade pip
|
|
60
73
|
|
|
74
|
+
# install
|
|
75
|
+
pip install user-scanner
|
|
76
|
+
```
|
|
61
77
|
---
|
|
62
78
|
|
|
63
79
|
## Important Flags
|
|
@@ -167,9 +183,11 @@ user-scanner -U
|
|
|
167
183
|
|
|
168
184
|
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
169
185
|
|
|
170
|
-
<img width="
|
|
186
|
+
<img width="1080" height="656" alt="1000146096" src="https://github.com/user-attachments/assets/1101e2f8-18ea-45a4-9492-92e237ecc670" />
|
|
171
187
|
|
|
188
|
+
---
|
|
172
189
|
|
|
190
|
+
<img width="1072" height="848" alt="user-scanner's main usage screenshot" src="https://github.com/user-attachments/assets/34e44ca6-e314-419e-9035-d951b493b47f" />
|
|
173
191
|
|
|
174
192
|
---
|
|
175
193
|
|
|
@@ -222,6 +240,16 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
|
|
|
222
240
|
|
|
223
241
|
This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for details.
|
|
224
242
|
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## ⚠️ Disclaimer
|
|
246
|
+
|
|
247
|
+
This tool is provided for **educational purposes** and **authorized security research** only.
|
|
248
|
+
|
|
249
|
+
- **User Responsibility:** Users are solely responsible for ensuring their usage complies with all applicable laws and the Terms of Service (ToS) of any third-party providers.
|
|
250
|
+
- **Methodology:** The tool interacts only with **publicly accessible, unauthenticated web endpoints**. It does not bypass authentication, security controls, or access private user data.
|
|
251
|
+
- **No Profiling:** This software performs only basic **yes/no availability checks**. It does not collect, store, aggregate, or analyze user data, behavior, or identities.
|
|
252
|
+
- **Limitation of Liability:** The software is provided **“as is”**, without warranty of any kind. The developers assume no liability for misuse or any resulting damage or legal consequences.
|
|
225
253
|
|
|
226
254
|
---
|
|
227
255
|
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
user_scanner/__main__.py,sha256=6ecuWBMKZQLwmz7hSYcOk2uwSxj3jpYqYVI-2ti0zmA,10848
|
|
3
|
-
user_scanner/config.json,sha256=
|
|
3
|
+
user_scanner/config.json,sha256=QZoyeipL-558-lO5bwmAImgBJLG2za3lritYwoQ5kb0,33
|
|
4
4
|
user_scanner/version.json,sha256=AraEBiS8nb-YghE3619KvezE-vSVK9A4TJRdwF7v92o,49
|
|
5
|
+
user_scanner/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
|
|
6
|
+
user_scanner/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
|
|
7
|
+
user_scanner/.ruff_cache/0.14.10/12603567674167520802,sha256=cjpMRoL1Rmdr6QzQ4om_hz5oQsAQONLGJ7ILhah5Clo,421
|
|
8
|
+
user_scanner/.ruff_cache/0.14.10/12688104075811904861,sha256=J5JInCXVZ4zqZoX7NCUF7riFAi7dFX_UHaTF2Jmi3Po,490
|
|
9
|
+
user_scanner/.ruff_cache/0.14.10/15694509833576274574,sha256=H2i9gUCJbvXlCpRH18MErtp6eN5Q0x_ou186ez-U5bM,514
|
|
10
|
+
user_scanner/.ruff_cache/0.14.10/301008395129872757,sha256=JwQ-PeLrAC836lQPLjeEVq1X2-Xqwa_SDw5sXtMGWQA,180
|
|
11
|
+
user_scanner/.ruff_cache/0.14.10/4908403194175060721,sha256=VMVQiZmrDMSwA2_U5kUgLaOwlUjy7uxmTFYKZK0lbGU,2025
|
|
12
|
+
user_scanner/.ruff_cache/0.14.10/572980360641624523,sha256=MSYV8cZd8hjklO4tva53AJvEcs6At62Dr3ONtkz7IcY,247
|
|
13
|
+
user_scanner/.ruff_cache/0.14.10/5935143038219898089,sha256=M7_iy1CipslgFY8SkW_4M2-Kk4gIswR7p0m2Yaln4KQ,326
|
|
5
14
|
user_scanner/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
15
|
user_scanner/cli/banner.py,sha256=3b4PIggnJrmxF4DfbuPMqSavpwNl0m5uedaOL2SXN3o,766
|
|
7
16
|
user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -18,24 +27,45 @@ user_scanner/email_scan/adult/sexvid.py,sha256=Hn-C1kelSHaeh6f6q6xzy8lm0PNs-7saL
|
|
|
18
27
|
user_scanner/email_scan/adult/xnxx.py,sha256=WiKn4Vkc5FC1HXry9N8SN-dsTdm1qq0NS6KUcPRmMMY,1728
|
|
19
28
|
user_scanner/email_scan/adult/xvideos.py,sha256=tx0PZOZ66KHDmrnvd1RABCnqCUIdKfCPgAbogBtX69A,1769
|
|
20
29
|
user_scanner/email_scan/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
+
user_scanner/email_scan/community/quora.py,sha256=8u1o1-kMjQnUY9s8O1fsMqqB6f4IkJOe_6Zr1tDoidk,4019
|
|
21
31
|
user_scanner/email_scan/community/stackoverflow.py,sha256=Eq3kTXohmp2XodVLaR8ujWWCTjkTm1HXy-Yew4LzOGA,1608
|
|
32
|
+
user_scanner/email_scan/community/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
|
|
33
|
+
user_scanner/email_scan/community/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
|
|
34
|
+
user_scanner/email_scan/community/.ruff_cache/0.14.10/3933329632096143294,sha256=DkX73p2wyrj8judt7CJBbI0V1Q-G6GWoa3UFhOcxIHU,221
|
|
22
35
|
user_scanner/email_scan/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
36
|
user_scanner/email_scan/creator/gumroad.py,sha256=wJfY_CPT2aiGShuL73XYPw_Oni7sEYn8nQ7avc0mrJg,3354
|
|
24
37
|
user_scanner/email_scan/creator/patreon.py,sha256=1A3tPNAyQ6WDLU_XY6PJUYe4FIVWzlALyEgOWzlZ-bE,1904
|
|
25
38
|
user_scanner/email_scan/dev/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
26
|
-
user_scanner/email_scan/dev/bitbucket.py,sha256=
|
|
27
|
-
user_scanner/email_scan/dev/
|
|
39
|
+
user_scanner/email_scan/dev/bitbucket.py,sha256=ymNc7FWQD-eH8uPXkpQseksKTKzYgdPdU7J1H2Qk0lg,1354
|
|
40
|
+
user_scanner/email_scan/dev/codecademy.py,sha256=-ElwmawP3anLi_JSW9j4wJBBxiANB0SpOdsO0HNG-VM,1725
|
|
41
|
+
user_scanner/email_scan/dev/codepen.py,sha256=7R0i4eNQQrO8cFp6A3aUyW_kwc-GeHNgt9bPCHeNFZo,1851
|
|
42
|
+
user_scanner/email_scan/dev/devrant.py,sha256=KEp24JsAk_OJ5dCN20PQ_BV2_lVZWipy2h-zoBudj7I,1550
|
|
43
|
+
user_scanner/email_scan/dev/github.py,sha256=1X735qnwokbuuzfo6oJ7JqcaHPH0JFzz-MzYIOqnVnE,3162
|
|
28
44
|
user_scanner/email_scan/dev/huggingface.py,sha256=GjFNkuVZ_8eFgs9OrFakhiEb8pVRwEJO-tyx32IQMns,1229
|
|
29
45
|
user_scanner/email_scan/dev/replit.py,sha256=Jj4YA1OIibpZ17rvJbccGsJDDnOXCoiH3ybhIwj5d3E,1697
|
|
30
|
-
user_scanner/email_scan/
|
|
31
|
-
user_scanner/email_scan/
|
|
32
|
-
user_scanner/email_scan/
|
|
33
|
-
user_scanner/email_scan/
|
|
34
|
-
user_scanner/email_scan/entertainment/.ruff_cache/0.14.10/14677874048998292530,sha256=cIbkvYriz3xNK--m83EvzAesaxgXZBfKUoxnx9O6cuo,173
|
|
46
|
+
user_scanner/email_scan/dev/wordpress.py,sha256=G4xBKZ-xB-EHbYwXNoza1KwehCuh_sR10A50M4FkzCk,1813
|
|
47
|
+
user_scanner/email_scan/dev/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
|
|
48
|
+
user_scanner/email_scan/dev/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
|
|
49
|
+
user_scanner/email_scan/dev/.ruff_cache/0.14.10/10328336453267387919,sha256=BcA76bIZNeK_y67LFelMGzwIpN--Zx_U-Q_l31dY2sk,298
|
|
35
50
|
user_scanner/email_scan/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
51
|
user_scanner/email_scan/gaming/chess_com.py,sha256=EJF3OTxYtzDC-F4OAVfT0mRWUopmNZdwdYChw97VpE4,1841
|
|
52
|
+
user_scanner/email_scan/hosting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
user_scanner/email_scan/hosting/render.py,sha256=6G66ftbCzSW_taMoqIyF9CQ9sVIL7PD6daFZFScDzD0,2090
|
|
54
|
+
user_scanner/email_scan/hosting/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
|
|
55
|
+
user_scanner/email_scan/hosting/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
|
|
56
|
+
user_scanner/email_scan/hosting/.ruff_cache/0.14.10/6358275293999347997,sha256=M-yQA4afRuwrT_Ixe5Qd1PJyrImcdEyzQpMAEuatcf0,160
|
|
57
|
+
user_scanner/email_scan/music/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
58
|
+
user_scanner/email_scan/music/lastfm.py,sha256=VWuwRIgeW-hgE-0VkEgMF8Muwvz523DyFUfO4RTntSU,2005
|
|
59
|
+
user_scanner/email_scan/music/spotify.py,sha256=jzFa9p1IWnAYDK7k7NTJ7ipmrGqmK_PVrUQ4otjldkU,3659
|
|
60
|
+
user_scanner/email_scan/music/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
|
|
61
|
+
user_scanner/email_scan/music/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
|
|
62
|
+
user_scanner/email_scan/music/.ruff_cache/0.14.10/14677874048998292530,sha256=cIbkvYriz3xNK--m83EvzAesaxgXZBfKUoxnx9O6cuo,173
|
|
63
|
+
user_scanner/email_scan/music/.ruff_cache/0.14.10/7544735312652879689,sha256=ZZrReKvwURlIMyd5sojcj5dkb8QW9tEBMxrI93VL4zU,204
|
|
37
64
|
user_scanner/email_scan/shopping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
+
user_scanner/email_scan/shopping/envato.py,sha256=ntMZKLYHhgJVC_QrWs2UmzlPi1MbMxjgtGig9MSH3m0,1493
|
|
38
66
|
user_scanner/email_scan/shopping/flipkart.py,sha256=wMQJ1VIawhM6W0UQCThcIUtaYN7QeexvJSRSeXS4l04,1879
|
|
67
|
+
user_scanner/email_scan/shopping/naturabuy.py,sha256=vMcoG4JK7-WhpYTTGQ5wc55guUigFzHbG19zgaf8oJU,1517
|
|
68
|
+
user_scanner/email_scan/shopping/vivino.py,sha256=vdJETvtQVPXX5o02AwkS9Jw7FIl350SUADUr1f1nOak,1588
|
|
39
69
|
user_scanner/email_scan/social/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
70
|
user_scanner/email_scan/social/facebook.py,sha256=dnCDZfqRYLXDT7GjJQ-bSqGfC-rO8G9O7pu8dUse7Nw,4475
|
|
41
71
|
user_scanner/email_scan/social/instagram.py,sha256=qGDub3d4pSY_KW4aNYDQOGVNSrmWQkZWMHadCFkDa64,2022
|
|
@@ -74,6 +104,7 @@ user_scanner/user_scan/donation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
|
74
104
|
user_scanner/user_scan/donation/buymeacoffee.py,sha256=86LGyChv_UKQFp2D7nIoK1B-FCAAbbfabS8NA9yLp5k,459
|
|
75
105
|
user_scanner/user_scan/donation/liberapay.py,sha256=njClxpbRLZQ_L2-lUYCY6QFnF4IcwfCJPCIg1iEqo7M,1120
|
|
76
106
|
user_scanner/user_scan/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
107
|
+
user_scanner/user_scan/gaming/battlenet.py,sha256=bMFJIIp9dPCQ74NyRolo1tZZWm908F0m-LSvdfArLaQ,2386
|
|
77
108
|
user_scanner/user_scan/gaming/chess_com.py,sha256=74tMgukSUXwdmD9G7Jij_gudRlSfs46Xho5KNMVeyt4,1262
|
|
78
109
|
user_scanner/user_scan/gaming/lichess.py,sha256=8b7DNRENh2UwjbsJNXRs2HIwC80OwGe5D0y-96_xjzs,1324
|
|
79
110
|
user_scanner/user_scan/gaming/minecraft.py,sha256=7a9H9ebLlRzGB0SjxLmzqLiDPDBZAuuNq3KKe2DZAvo,481
|
|
@@ -100,8 +131,8 @@ user_scanner/user_scan/social/youtube.py,sha256=UPu584teg75P7FT05RFG3nobbHgPmzjr
|
|
|
100
131
|
user_scanner/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
101
132
|
user_scanner/utils/update.py,sha256=Rj3kLuUrQ-LlKGB7bkndqVjj0IUqugbDSj2SUrPRidE,936
|
|
102
133
|
user_scanner/utils/updater_logic.py,sha256=tl6kbKL02DrP-R1dkQWhHr12juVDgkJZZvKAfbI1ruU,2381
|
|
103
|
-
user_scanner-1.1.0.
|
|
104
|
-
user_scanner-1.1.0.
|
|
105
|
-
user_scanner-1.1.0.
|
|
106
|
-
user_scanner-1.1.0.
|
|
107
|
-
user_scanner-1.1.0.
|
|
134
|
+
user_scanner-1.1.0.3.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
|
|
135
|
+
user_scanner-1.1.0.3.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
|
|
136
|
+
user_scanner-1.1.0.3.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
137
|
+
user_scanner-1.1.0.3.dist-info/METADATA,sha256=o3g4NX2sWCErBTb5Hn5vkOYzbYSxJ-8S3tbhlTUaNyI,9816
|
|
138
|
+
user_scanner-1.1.0.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|