user-scanner 1.1.0.4__py3-none-any.whl → 1.1.0.6__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/email_scan/dev/leetcode.py +64 -0
- user_scanner/email_scan/learning/__init__.py +0 -0
- user_scanner/email_scan/learning/duolingo.py +36 -0
- user_scanner/email_scan/other/__init__.py +0 -0
- user_scanner/email_scan/other/eventbrite.py +51 -0
- user_scanner/email_scan/pipeline/__init__.py +0 -0
- user_scanner/email_scan/pipeline/axonaut.py +38 -0
- user_scanner/email_scan/pipeline/hubspot.py +52 -0
- user_scanner/email_scan/pipeline/insightly.py +43 -0
- user_scanner/email_scan/pipeline/zoho.py +63 -0
- user_scanner/version.json +1 -1
- {user_scanner-1.1.0.4.dist-info → user_scanner-1.1.0.6.dist-info}/METADATA +26 -62
- {user_scanner-1.1.0.4.dist-info → user_scanner-1.1.0.6.dist-info}/RECORD +16 -28
- user_scanner/.ruff_cache/.gitignore +0 -2
- 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/.ruff_cache/CACHEDIR.TAG +0 -1
- user_scanner/email_scan/community/.ruff_cache/.gitignore +0 -2
- user_scanner/email_scan/community/.ruff_cache/0.14.10/3933329632096143294 +0 -0
- user_scanner/email_scan/community/.ruff_cache/CACHEDIR.TAG +0 -1
- user_scanner/email_scan/dev/.ruff_cache/.gitignore +0 -2
- user_scanner/email_scan/dev/.ruff_cache/0.14.10/10328336453267387919 +0 -0
- user_scanner/email_scan/dev/.ruff_cache/CACHEDIR.TAG +0 -1
- user_scanner/email_scan/hosting/.ruff_cache/.gitignore +0 -2
- user_scanner/email_scan/hosting/.ruff_cache/0.14.10/6358275293999347997 +0 -0
- user_scanner/email_scan/hosting/.ruff_cache/CACHEDIR.TAG +0 -1
- user_scanner/email_scan/music/.ruff_cache/.gitignore +0 -2
- user_scanner/email_scan/music/.ruff_cache/0.14.10/14677874048998292530 +0 -0
- user_scanner/email_scan/music/.ruff_cache/0.14.10/7544735312652879689 +0 -0
- user_scanner/email_scan/music/.ruff_cache/CACHEDIR.TAG +0 -1
- {user_scanner-1.1.0.4.dist-info → user_scanner-1.1.0.6.dist-info}/WHEEL +0 -0
- {user_scanner-1.1.0.4.dist-info → user_scanner-1.1.0.6.dist-info}/entry_points.txt +0 -0
- {user_scanner-1.1.0.4.dist-info → user_scanner-1.1.0.6.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,64 @@
|
|
|
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': "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
|
|
9
|
+
'Accept-Language': "en-US,en;q=0.9",
|
|
10
|
+
'Referer': "https://leetcode.com/accounts/login/",
|
|
11
|
+
'Origin': "https://leetcode.com",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=True) as client:
|
|
16
|
+
await client.get("https://leetcode.com/accounts/login/", headers=headers)
|
|
17
|
+
csrf_token = client.cookies.get("csrftoken")
|
|
18
|
+
|
|
19
|
+
if not csrf_token:
|
|
20
|
+
return Result.error("CSRF token not found, possible rate-limit")
|
|
21
|
+
|
|
22
|
+
headers.update({
|
|
23
|
+
'x-requested-with': "XMLHttpRequest",
|
|
24
|
+
'referer': "https://leetcode.com/accounts/password/reset/",
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
payload = {
|
|
28
|
+
'next': 'undefined',
|
|
29
|
+
'userName': '',
|
|
30
|
+
'email': email,
|
|
31
|
+
'csrfmiddlewaretoken': csrf_token
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
response = await client.post(
|
|
35
|
+
"https://leetcode.com/accounts/password/reset/",
|
|
36
|
+
headers=headers,
|
|
37
|
+
data=payload
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if response.status_code in [200, 400]:
|
|
41
|
+
data = response.json()
|
|
42
|
+
|
|
43
|
+
if data.get("location") == "/accounts/password/reset/done/":
|
|
44
|
+
return Result.taken()
|
|
45
|
+
|
|
46
|
+
email_field = data.get("form", {}).get(
|
|
47
|
+
"fields", {}).get("email", {})
|
|
48
|
+
errors = email_field.get("errors", [])
|
|
49
|
+
|
|
50
|
+
if any("not assigned to any user account" in err for err in errors):
|
|
51
|
+
return Result.available()
|
|
52
|
+
|
|
53
|
+
return Result.error("Unexpected response data")
|
|
54
|
+
|
|
55
|
+
return Result.error(f"HTTP {response.status_code}")
|
|
56
|
+
|
|
57
|
+
except httpx.TimeoutException:
|
|
58
|
+
return Result.error("Connection timed out")
|
|
59
|
+
except Exception as e:
|
|
60
|
+
return Result.error(e)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
async def validate_leetcode(email: str) -> Result:
|
|
64
|
+
return await _check(email)
|
|
File without changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
async def _check(email: str) -> Result:
|
|
5
|
+
headers = {
|
|
6
|
+
'authority': 'www.duolingo.com',
|
|
7
|
+
'Accept': 'application/json, text/plain, */*',
|
|
8
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
9
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64; rv:130.0) Gecko/20100101 Firefox/130.0",
|
|
10
|
+
'Referer': 'https://www.duolingo.com/',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=True) as client:
|
|
15
|
+
response = await client.get(
|
|
16
|
+
f"https://www.duolingo.com/2017-06-30/users?email={email}",
|
|
17
|
+
headers=headers
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
if response.status_code == 200:
|
|
21
|
+
data = response.json()
|
|
22
|
+
# Duolingo returns a list of users matching the email
|
|
23
|
+
if data.get("users") and len(data["users"]) > 0:
|
|
24
|
+
return Result.taken()
|
|
25
|
+
else:
|
|
26
|
+
return Result.available()
|
|
27
|
+
|
|
28
|
+
return Result.error(f"HTTP {response.status_code}")
|
|
29
|
+
|
|
30
|
+
except httpx.TimeoutException:
|
|
31
|
+
return Result.error("Connection timed out")
|
|
32
|
+
except Exception as e:
|
|
33
|
+
return Result.error(e)
|
|
34
|
+
|
|
35
|
+
async def validate_duolingo(email: str) -> Result:
|
|
36
|
+
return await _check(email)
|
|
File without changes
|
|
@@ -0,0 +1,51 @@
|
|
|
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': '*/*',
|
|
9
|
+
'Accept-Language': 'en,en-US;q=0.9',
|
|
10
|
+
'Referer': 'https://www.eventbrite.com/signin/',
|
|
11
|
+
'Content-Type': 'application/json',
|
|
12
|
+
'X-Requested-With': 'XMLHttpRequest',
|
|
13
|
+
'Origin': 'https://www.eventbrite.com',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=True) as client:
|
|
18
|
+
await client.get("https://www.eventbrite.com/signin/", headers=headers)
|
|
19
|
+
|
|
20
|
+
csrf_token = client.cookies.get("csrftoken")
|
|
21
|
+
if not csrf_token:
|
|
22
|
+
return Result.error("CSRF token not found")
|
|
23
|
+
|
|
24
|
+
headers["X-CSRFToken"] = csrf_token
|
|
25
|
+
payload = {"email": email}
|
|
26
|
+
|
|
27
|
+
response = await client.post(
|
|
28
|
+
'https://www.eventbrite.com/api/v3/users/lookup/',
|
|
29
|
+
headers=headers,
|
|
30
|
+
json=payload
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
if response.status_code == 200:
|
|
34
|
+
data = response.json()
|
|
35
|
+
if data.get("exists") is True:
|
|
36
|
+
return Result.taken()
|
|
37
|
+
elif data.get("exists") is False:
|
|
38
|
+
return Result.available()
|
|
39
|
+
else:
|
|
40
|
+
return Result.error(data)
|
|
41
|
+
|
|
42
|
+
return Result.error(f"HTTP {response.status_code}")
|
|
43
|
+
|
|
44
|
+
except httpx.TimeoutException:
|
|
45
|
+
return Result.error("Connection timed out")
|
|
46
|
+
except Exception as e:
|
|
47
|
+
return Result.error(e)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def validate_eventbrite(email: str) -> Result:
|
|
51
|
+
return await _check(email)
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
async def _check(email: str) -> Result:
|
|
6
|
+
headers = {
|
|
7
|
+
'authority': 'axonaut.com',
|
|
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': '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.9',
|
|
10
|
+
'referer': 'https://axonaut.com/en',
|
|
11
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=False) as client:
|
|
16
|
+
response = await client.get(
|
|
17
|
+
f'https://axonaut.com/onboarding/?email={email}',
|
|
18
|
+
headers=headers
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
if response.status_code == 302 and "/login?email" in response.headers.get('Location', ''):
|
|
22
|
+
|
|
23
|
+
return Result.taken()
|
|
24
|
+
|
|
25
|
+
elif response.status_code == 200:
|
|
26
|
+
return Result.available()
|
|
27
|
+
|
|
28
|
+
else:
|
|
29
|
+
return Result.error(f"HTTP {response.status_code}")
|
|
30
|
+
|
|
31
|
+
except httpx.TimeoutException:
|
|
32
|
+
return Result.error("Connection timed out")
|
|
33
|
+
except Exception as e:
|
|
34
|
+
return Result.error(str(e))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def validate_axonaut(email: str) -> Result:
|
|
38
|
+
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
|
+
headers = {
|
|
7
|
+
'authority': 'api.hubspot.com',
|
|
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
|
+
'content-type': 'application/json',
|
|
10
|
+
'origin': 'https://app.hubspot.com',
|
|
11
|
+
'referer': 'https://app.hubspot.com/',
|
|
12
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=True) as client:
|
|
17
|
+
payload = {
|
|
18
|
+
"email": email,
|
|
19
|
+
"password": "",
|
|
20
|
+
"rememberLogin": False
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
response = await client.post(
|
|
24
|
+
'https://api.hubspot.com/login-api/v1/login',
|
|
25
|
+
headers=headers,
|
|
26
|
+
json=payload
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# HubSpot returns 400 for both "wrong password" and "user not found"
|
|
30
|
+
if response.status_code == 400:
|
|
31
|
+
data = response.json()
|
|
32
|
+
status = data.get("status")
|
|
33
|
+
|
|
34
|
+
if status == "INVALID_PASSWORD":
|
|
35
|
+
return Result.taken()
|
|
36
|
+
|
|
37
|
+
elif status == "INVALID_USER":
|
|
38
|
+
return Result.available()
|
|
39
|
+
|
|
40
|
+
else:
|
|
41
|
+
return Result.error(data)
|
|
42
|
+
|
|
43
|
+
return Result.error(f"HTTP {response.status_code}")
|
|
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_hubspot(email: str) -> Result:
|
|
52
|
+
return await _check(email)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import httpx
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
async def _check(email: str) -> Result:
|
|
6
|
+
headers = {
|
|
7
|
+
'authority': 'accounts.insightly.com',
|
|
8
|
+
'accept': 'application/json, text/javascript, */*; q=0.01',
|
|
9
|
+
'x-requested-with': 'XMLHttpRequest',
|
|
10
|
+
'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
|
|
11
|
+
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
|
12
|
+
'origin': 'https://accounts.insightly.com',
|
|
13
|
+
'referer': 'https://accounts.insightly.com/?plan=trial',
|
|
14
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=True) as client:
|
|
19
|
+
payload = {'emailaddress': email}
|
|
20
|
+
|
|
21
|
+
response = await client.post(
|
|
22
|
+
'https://accounts.insightly.com/signup/isemailvalid',
|
|
23
|
+
headers=headers,
|
|
24
|
+
data=payload
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
if "An account exists for this address." in response.text:
|
|
28
|
+
return Result.taken()
|
|
29
|
+
|
|
30
|
+
elif response.text.strip() == "true":
|
|
31
|
+
return Result.available()
|
|
32
|
+
|
|
33
|
+
else:
|
|
34
|
+
return Result.error(f"Unexpected response: {response.status_code}")
|
|
35
|
+
|
|
36
|
+
except httpx.TimeoutException:
|
|
37
|
+
return Result.error("Connection timed out")
|
|
38
|
+
except Exception as e:
|
|
39
|
+
return Result.error(str(e))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
async def validate_insightly(email: str) -> Result:
|
|
43
|
+
return await _check(email)
|
|
@@ -0,0 +1,63 @@
|
|
|
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
|
+
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
|
9
|
+
'Accept': '*/*',
|
|
10
|
+
'Origin': 'https://accounts.zoho.com',
|
|
11
|
+
'Sec-Fetch-Site': 'same-origin',
|
|
12
|
+
'Sec-Fetch-Mode': 'cors',
|
|
13
|
+
'Sec-Fetch-Dest': 'empty',
|
|
14
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
async with httpx.AsyncClient(timeout=5.0, follow_redirects=True) as client:
|
|
19
|
+
await client.get("https://accounts.zoho.com/register", headers=headers)
|
|
20
|
+
|
|
21
|
+
csrf_cookie = client.cookies.get("iamcsr")
|
|
22
|
+
if not csrf_cookie:
|
|
23
|
+
return Result.error("CSRF cookie not found")
|
|
24
|
+
|
|
25
|
+
headers['X-ZCSRF-TOKEN'] = f'iamcsrcoo={csrf_cookie}'
|
|
26
|
+
|
|
27
|
+
payload = {
|
|
28
|
+
'mode': 'primary',
|
|
29
|
+
'servicename': 'ZohoCRM',
|
|
30
|
+
'serviceurl': 'https://crm.zoho.com/crm/ShowHomePage.do',
|
|
31
|
+
'service_language': 'en'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
response = await client.post(
|
|
35
|
+
f'https://accounts.zoho.com/signin/v2/lookup/{email}',
|
|
36
|
+
headers=headers,
|
|
37
|
+
data=payload
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if response.status_code == 200:
|
|
41
|
+
data = response.json()
|
|
42
|
+
message = data.get("message")
|
|
43
|
+
status = data.get("status_code")
|
|
44
|
+
|
|
45
|
+
if message == "User exists" and status == 201:
|
|
46
|
+
return Result.taken()
|
|
47
|
+
|
|
48
|
+
elif status == 400:
|
|
49
|
+
return Result.available()
|
|
50
|
+
|
|
51
|
+
else:
|
|
52
|
+
return Result.error(data)
|
|
53
|
+
|
|
54
|
+
return Result.error(f"HTTP {response.status_code}")
|
|
55
|
+
|
|
56
|
+
except httpx.TimeoutException:
|
|
57
|
+
return Result.error("Connection timed out")
|
|
58
|
+
except Exception as e:
|
|
59
|
+
return Result.error(str(e))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
async def validate_zoho(email: str) -> Result:
|
|
63
|
+
return await _check(email)
|
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.6
|
|
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.6-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" />
|
|
@@ -34,23 +34,15 @@ Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instag
|
|
|
34
34
|
|
|
35
35
|
## Features
|
|
36
36
|
|
|
37
|
-
- ✅
|
|
38
|
-
- ✅
|
|
39
|
-
- ✅
|
|
40
|
-
- ✅
|
|
41
|
-
- ✅
|
|
42
|
-
- ✅
|
|
43
|
-
- ✅
|
|
44
|
-
- ✅
|
|
45
|
-
- ✅
|
|
46
|
-
- ✅ Save scanning and OSINT results in the preferred format and output file (ideal for power users).
|
|
47
|
-
- ✅ Command-line interface ready: works immediately after `pip install`.
|
|
48
|
-
- ✅ Lightweight with minimal dependencies; runs on any machine.
|
|
49
|
-
- ✅ **Proxy support** with round-robin rotation
|
|
50
|
-
- ✅ **Proxy validation** to test and filter working proxies before scanning
|
|
51
|
-
- ✅ **Bulk username scanning** from file support for checking multiple usernames at once
|
|
52
|
-
- ✅ **Bulk email scanning** from file support for checking multiple emails at once
|
|
53
|
-
---
|
|
37
|
+
- ✅ Email & username OSINT: check email registrations and username availability across social, developer, creator, and other platforms
|
|
38
|
+
- ✅ Dual-mode usage: works as an email scanner, username scanner, or username-only tool
|
|
39
|
+
- ✅ Clear results: `Registered` / `Not Registered` for emails and `Available` / `Taken` / `Error` for usernames with precise failure reasons
|
|
40
|
+
- ✅ Fully modular architecture for easy addition of new platform modules
|
|
41
|
+
- ✅ Bulk scanning support for usernames and emails via input files
|
|
42
|
+
- ✅ Wildcard-based username permutations with automatic variation generation
|
|
43
|
+
- ✅ Multiple output formats: console, **JSON**, and **CSV**, with file export support
|
|
44
|
+
- ✅ Proxy support with rotation and pre-scan proxy validation
|
|
45
|
+
- ✅ Smart auto-update system with interactive upgrade prompts via PyPI
|
|
54
46
|
|
|
55
47
|
## Virtual Environment (optional but recommended)
|
|
56
48
|
|
|
@@ -102,14 +94,11 @@ pip install user-scanner
|
|
|
102
94
|
|
|
103
95
|
### Basic username/email scan
|
|
104
96
|
|
|
105
|
-
Scan a single username across **all** available modules/platforms:
|
|
97
|
+
Scan a single email or username across **all** available modules/platforms:
|
|
106
98
|
|
|
107
99
|
```bash
|
|
108
|
-
user-scanner -e john_doe@gmail.com
|
|
109
|
-
user-scanner
|
|
110
|
-
|
|
111
|
-
user-scanner -u john_doe
|
|
112
|
-
user-scanner --username john_doe # long version
|
|
100
|
+
user-scanner -e john_doe@gmail.com # single email scanning
|
|
101
|
+
user-scanner -u john_doe # single username scanning
|
|
113
102
|
```
|
|
114
103
|
|
|
115
104
|
### Selective scanning
|
|
@@ -121,23 +110,14 @@ user-scanner -u john_doe -c dev # developer platforms only
|
|
|
121
110
|
user-scanner -u john_doe -m github # only GitHub
|
|
122
111
|
```
|
|
123
112
|
|
|
124
|
-
### Bulk username scanning
|
|
113
|
+
### Bulk email/username scanning
|
|
125
114
|
|
|
126
|
-
Scan multiple usernames from a file (one username per line):
|
|
127
|
-
- Can also be combined with categories or modules using `-c`
|
|
115
|
+
Scan multiple emails/usernames from a file (one email/username per line):
|
|
116
|
+
- Can also be combined with categories or modules using `-c` , `-m` and other flags
|
|
128
117
|
|
|
129
118
|
```bash
|
|
130
|
-
user-scanner -
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
### Bulk email scanning
|
|
135
|
-
|
|
136
|
-
Scan multiple emails from a file (one email per line):
|
|
137
|
-
- Can also be combined with categories or modules using `-c` and `-m` flags
|
|
138
|
-
|
|
139
|
-
```bash
|
|
140
|
-
user-scanner -ef emails.txt
|
|
119
|
+
user-scanner -ef emails.txt # bulk email scan
|
|
120
|
+
user-scanner -uf usernames.txt # bulk username scan
|
|
141
121
|
```
|
|
142
122
|
|
|
143
123
|
### Username/Email variations (suffix only)
|
|
@@ -163,37 +143,22 @@ user-scanner -u john_doe -P proxies.txt --validate-proxies # recommended
|
|
|
163
143
|
```
|
|
164
144
|
|
|
165
145
|
This will:
|
|
166
|
-
1.
|
|
167
|
-
2.
|
|
168
|
-
3.
|
|
169
|
-
4. Use only validated proxies for scanning
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
### Update
|
|
174
|
-
|
|
175
|
-
Update the tool to the latest PyPI version:
|
|
146
|
+
1. Filter out non-working proxies
|
|
147
|
+
2. Save working proxies to `validated_proxies.txt`
|
|
148
|
+
3. Use only validated proxies for scanning
|
|
176
149
|
|
|
177
|
-
```bash
|
|
178
|
-
user-scanner -U
|
|
179
|
-
```
|
|
180
150
|
---
|
|
181
151
|
|
|
182
|
-
##
|
|
152
|
+
## Screenshots:
|
|
183
153
|
|
|
184
|
-
- Note*: New modules are constantly getting added so
|
|
154
|
+
- Note*: New modules are constantly getting added so screenshots might show only limited, outdated output:
|
|
185
155
|
|
|
186
|
-
<img width="1080" height="
|
|
156
|
+
<img width="1080" height="800" alt="1000146237" src="https://github.com/user-attachments/assets/1bb7d7cb-9b78-495a-ae95-01a9ef48d9a2" />
|
|
187
157
|
|
|
188
158
|
---
|
|
189
159
|
|
|
190
160
|
<img width="1072" height="848" alt="user-scanner's main usage screenshot" src="https://github.com/user-attachments/assets/34e44ca6-e314-419e-9035-d951b493b47f" />
|
|
191
161
|
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
<img width="1080" height="352" alt="user-scanner's wildcard username feature" src="https://github.com/user-attachments/assets/578b248c-2a05-4917-aab3-6372a7c28045" />
|
|
195
|
-
|
|
196
|
-
|
|
197
162
|
---
|
|
198
163
|
|
|
199
164
|
## Contributing
|
|
@@ -212,8 +177,7 @@ user_scanner/
|
|
|
212
177
|
│ ├── creator/ # Creator platforms (Hashnode, Dev.to, Medium, Patreon, etc.)
|
|
213
178
|
│ ├── community/ # Community platforms (forums, StackOverflow, HackerNews, etc.)
|
|
214
179
|
│ ├── gaming/ # Gaming sites (chess.com, Lichess, Roblox, Minecraft, etc.)
|
|
215
|
-
|
|
216
|
-
|...
|
|
180
|
+
...
|
|
217
181
|
```
|
|
218
182
|
|
|
219
183
|
**Module guidelines:**
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
user_scanner/__main__.py,sha256=6ecuWBMKZQLwmz7hSYcOk2uwSxj3jpYqYVI-2ti0zmA,10848
|
|
3
3
|
user_scanner/config.json,sha256=QZoyeipL-558-lO5bwmAImgBJLG2za3lritYwoQ5kb0,33
|
|
4
|
-
user_scanner/version.json,sha256=
|
|
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
|
|
4
|
+
user_scanner/version.json,sha256=pl0iSQOJ7Sb9OaO-TSRSPHrGBO-p_U58BJj37-IatSA,49
|
|
14
5
|
user_scanner/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
6
|
user_scanner/cli/banner.py,sha256=3b4PIggnJrmxF4DfbuPMqSavpwNl0m5uedaOL2SXN3o,766
|
|
16
7
|
user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -29,9 +20,6 @@ user_scanner/email_scan/adult/xvideos.py,sha256=tx0PZOZ66KHDmrnvd1RABCnqCUIdKfCP
|
|
|
29
20
|
user_scanner/email_scan/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
21
|
user_scanner/email_scan/community/quora.py,sha256=8u1o1-kMjQnUY9s8O1fsMqqB6f4IkJOe_6Zr1tDoidk,4019
|
|
31
22
|
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
|
|
35
23
|
user_scanner/email_scan/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
24
|
user_scanner/email_scan/creator/gumroad.py,sha256=wJfY_CPT2aiGShuL73XYPw_Oni7sEYn8nQ7avc0mrJg,3354
|
|
37
25
|
user_scanner/email_scan/creator/patreon.py,sha256=1A3tPNAyQ6WDLU_XY6PJUYe4FIVWzlALyEgOWzlZ-bE,1904
|
|
@@ -42,25 +30,25 @@ user_scanner/email_scan/dev/codepen.py,sha256=7R0i4eNQQrO8cFp6A3aUyW_kwc-GeHNgt9
|
|
|
42
30
|
user_scanner/email_scan/dev/devrant.py,sha256=KEp24JsAk_OJ5dCN20PQ_BV2_lVZWipy2h-zoBudj7I,1550
|
|
43
31
|
user_scanner/email_scan/dev/github.py,sha256=1X735qnwokbuuzfo6oJ7JqcaHPH0JFzz-MzYIOqnVnE,3162
|
|
44
32
|
user_scanner/email_scan/dev/huggingface.py,sha256=GjFNkuVZ_8eFgs9OrFakhiEb8pVRwEJO-tyx32IQMns,1229
|
|
33
|
+
user_scanner/email_scan/dev/leetcode.py,sha256=R728E0fVI-f8_WFCHBEI0Oe18bqg6UgRSKX9psQAkEU,2277
|
|
45
34
|
user_scanner/email_scan/dev/replit.py,sha256=Jj4YA1OIibpZ17rvJbccGsJDDnOXCoiH3ybhIwj5d3E,1697
|
|
46
35
|
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
|
|
50
36
|
user_scanner/email_scan/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
51
37
|
user_scanner/email_scan/gaming/chess_com.py,sha256=EJF3OTxYtzDC-F4OAVfT0mRWUopmNZdwdYChw97VpE4,1841
|
|
52
38
|
user_scanner/email_scan/hosting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
39
|
user_scanner/email_scan/hosting/render.py,sha256=6G66ftbCzSW_taMoqIyF9CQ9sVIL7PD6daFZFScDzD0,2090
|
|
54
|
-
user_scanner/email_scan/
|
|
55
|
-
user_scanner/email_scan/
|
|
56
|
-
user_scanner/email_scan/hosting/.ruff_cache/0.14.10/6358275293999347997,sha256=M-yQA4afRuwrT_Ixe5Qd1PJyrImcdEyzQpMAEuatcf0,160
|
|
40
|
+
user_scanner/email_scan/learning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
|
+
user_scanner/email_scan/learning/duolingo.py,sha256=rLKLH-iwCvNtCxPd7UZcgTXssOzVKaDLl3d8TePYjHo,1297
|
|
57
42
|
user_scanner/email_scan/music/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
58
43
|
user_scanner/email_scan/music/lastfm.py,sha256=VWuwRIgeW-hgE-0VkEgMF8Muwvz523DyFUfO4RTntSU,2005
|
|
59
44
|
user_scanner/email_scan/music/spotify.py,sha256=jzFa9p1IWnAYDK7k7NTJ7ipmrGqmK_PVrUQ4otjldkU,3659
|
|
60
|
-
user_scanner/email_scan/
|
|
61
|
-
user_scanner/email_scan/
|
|
62
|
-
user_scanner/email_scan/
|
|
63
|
-
user_scanner/email_scan/
|
|
45
|
+
user_scanner/email_scan/other/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
|
+
user_scanner/email_scan/other/eventbrite.py,sha256=WLSN5xTlG9YkZbP4lyyE8Ob0NyGcv_T9BVb5bQ-SzaE,1748
|
|
47
|
+
user_scanner/email_scan/pipeline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
|
+
user_scanner/email_scan/pipeline/axonaut.py,sha256=Cv-ntMRMdVj1cDDwXOFsp_pX1m2BHHfZRyDGvWQ_8dI,1332
|
|
49
|
+
user_scanner/email_scan/pipeline/hubspot.py,sha256=OOYHqpjKh525iJi9_txuZGyX97tvZ-d0Osq9iP_LC-k,1648
|
|
50
|
+
user_scanner/email_scan/pipeline/insightly.py,sha256=JdoktrXj3E6WmyMf_6VTD13YCxp4908MXALF5_QkIV8,1518
|
|
51
|
+
user_scanner/email_scan/pipeline/zoho.py,sha256=tGnLqzLwqb1eJF0qmWzG-T9g0g3Ax2C6ERG2N14aeo8,2098
|
|
64
52
|
user_scanner/email_scan/shopping/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
53
|
user_scanner/email_scan/shopping/envato.py,sha256=ntMZKLYHhgJVC_QrWs2UmzlPi1MbMxjgtGig9MSH3m0,1493
|
|
66
54
|
user_scanner/email_scan/shopping/flipkart.py,sha256=wMQJ1VIawhM6W0UQCThcIUtaYN7QeexvJSRSeXS4l04,1879
|
|
@@ -131,8 +119,8 @@ user_scanner/user_scan/social/youtube.py,sha256=UPu584teg75P7FT05RFG3nobbHgPmzjr
|
|
|
131
119
|
user_scanner/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
132
120
|
user_scanner/utils/update.py,sha256=Rj3kLuUrQ-LlKGB7bkndqVjj0IUqugbDSj2SUrPRidE,936
|
|
133
121
|
user_scanner/utils/updater_logic.py,sha256=tl6kbKL02DrP-R1dkQWhHr12juVDgkJZZvKAfbI1ruU,2381
|
|
134
|
-
user_scanner-1.1.0.
|
|
135
|
-
user_scanner-1.1.0.
|
|
136
|
-
user_scanner-1.1.0.
|
|
137
|
-
user_scanner-1.1.0.
|
|
138
|
-
user_scanner-1.1.0.
|
|
122
|
+
user_scanner-1.1.0.6.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
|
|
123
|
+
user_scanner-1.1.0.6.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
|
|
124
|
+
user_scanner-1.1.0.6.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
125
|
+
user_scanner-1.1.0.6.dist-info/METADATA,sha256=ZFrUsSSjeeBvtS-T3-1-wzkpf54YkuNSDRq1MtFfTyY,8768
|
|
126
|
+
user_scanner-1.1.0.6.dist-info/RECORD,,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Signature: 8a477f597d28d172789f06886806bc55
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Signature: 8a477f597d28d172789f06886806bc55
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Signature: 8a477f597d28d172789f06886806bc55
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Signature: 8a477f597d28d172789f06886806bc55
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Signature: 8a477f597d28d172789f06886806bc55
|
|
File without changes
|
|
File without changes
|
|
File without changes
|