Skip to content

Commit 25bb9d9

Browse files
Merge pull request #225 from kaifcodec/add/email-osint-modules
add: 5 new email_scan modules and new category travel
2 parents 7fc8b9c + 4aad9de commit 25bb9d9

6 files changed

Lines changed: 318 additions & 0 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import httpx
2+
import re
3+
from user_scanner.core.result import Result
4+
5+
async def _check(email: str) -> Result:
6+
show_url = "https://www.deviantart.com"
7+
join_page = "https://www.deviantart.com/join/"
8+
verify_url = "https://www.deviantart.com/_sisu/do/signup2"
9+
10+
headers = {
11+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Mobile Safari/537.36",
12+
'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
13+
'Accept-Encoding': "identity",
14+
'sec-ch-ua-platform': '"Android"',
15+
'upgrade-insecure-requests': "1"
16+
}
17+
18+
try:
19+
async with httpx.AsyncClient(timeout=10.0, follow_redirects=True) as client:
20+
r_home = await client.get(show_url, headers=headers)
21+
if r_home.status_code == 403:
22+
return Result.error("Caught by WAF or IP Block (403) during Handshake 1")
23+
24+
r_join = await client.get(join_page, headers=headers)
25+
if r_join.status_code == 403:
26+
return Result.error("Caught by WAF or IP Block (403) during Handshake 2")
27+
28+
csrf_match = re.search(r"window\.__CSRF_TOKEN__\s*=\s*'([^']+)'", r_join.text)
29+
if not csrf_match:
30+
return Result.error("Failed to extract CSRF token from window variable")
31+
32+
csrf_token = csrf_match.group(1)
33+
34+
payload = {
35+
'referer': "https://www.deviantart.com/",
36+
'referer_type': "",
37+
'csrf_token': csrf_token,
38+
'join_mode': "email",
39+
'oauth': "0",
40+
'email': email,
41+
'password': "",
42+
'username': "scanner_test_99",
43+
'dobMonth': "6",
44+
'dobDay': "6",
45+
'dobYear': "1998"
46+
}
47+
48+
headers.update({
49+
'origin': "https://www.deviantart.com",
50+
'referer': "https://www.deviantart.com/join/"
51+
})
52+
53+
response = await client.post(verify_url, data=payload, headers=headers)
54+
status = response.status_code
55+
56+
if status == 403:
57+
return Result.error("Caught by WAF or IP Block (403) during Validation")
58+
59+
resp_text = response.text
60+
61+
if 'id="email-error">That email address is already in use.' in resp_text:
62+
return Result.taken(url=show_url)
63+
64+
if 'id="email-error"' not in resp_text:
65+
return Result.available(url=show_url)
66+
67+
if status == 429:
68+
return Result.error("Rate limited by DeviantArt")
69+
70+
return Result.error(f"Unexpected response content or status: {status}")
71+
72+
except httpx.ConnectTimeout:
73+
return Result.error("Connection timed out! maybe region blocks")
74+
except Exception as e:
75+
return Result.error(e)
76+
77+
async def validate_deviantart(email: str) -> Result:
78+
return await _check(email)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import httpx
2+
import json
3+
from user_scanner.core.result import Result
4+
5+
async def _check(email: str) -> Result:
6+
show_url = "https://www.nba.com"
7+
url = "https://identity.nba.com/api/v1/profile/registrationStatus"
8+
9+
payload = {
10+
"email": email
11+
}
12+
13+
headers = {
14+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Mobile Safari/537.36",
15+
'Accept-Encoding': "identity",
16+
'Content-Type': "application/json",
17+
'sec-ch-ua-platform': '"Android"',
18+
'x-client-platform': "web",
19+
'origin': "https://www.nba.com",
20+
'referer': "https://www.nba.com/",
21+
'accept-language': "en-US,en;q=0.9"
22+
}
23+
24+
try:
25+
async with httpx.AsyncClient(timeout=10.0) as client:
26+
response = await client.post(url, content=json.dumps(payload), headers=headers)
27+
status = response.status_code
28+
29+
if status == 403:
30+
return Result.error("Caught by WAF or IP Block (403)")
31+
32+
if status == 200:
33+
data = response.json()
34+
if data.get("status") == "success" and data.get("data", {}).get("isFull") is True:
35+
return Result.taken(url=show_url)
36+
37+
if status == 400:
38+
data = response.json()
39+
if "INVALID_PROFILE_STATUS" in data.get("errorCodes", []) or "Profile not found" in data.get("data", {}).get("message", ""):
40+
return Result.available(url=show_url)
41+
42+
if status == 429:
43+
return Result.error("Rate limited by NBA")
44+
45+
return Result.error(f"Unexpected status code: {status}")
46+
47+
except httpx.ConnectTimeout:
48+
return Result.error("Connection timed out! maybe region blocks")
49+
except Exception as e:
50+
return Result.error(e)
51+
52+
async def validate_nba(email: str) -> Result:
53+
return await _check(email)

user_scanner/email_scan/travel/__init__.py

Whitespace-only changes.
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import httpx
2+
import json
3+
from user_scanner.core.result import Result
4+
5+
6+
async def _check(email: str) -> Result:
7+
show_url = "https://emirates.com"
8+
url = "https://www.emirates.com/service/ekl/validate-email"
9+
10+
params = {
11+
'data': "null"
12+
}
13+
14+
payload = {
15+
"emailAddress": email
16+
}
17+
18+
headers = {
19+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Mobile Safari/537.36",
20+
'Accept': "application/json, text/plain, */*",
21+
'Accept-Encoding': "identity",
22+
'Content-Type': "application/json",
23+
'sec-ch-ua-platform': '"Android"',
24+
'sec-ch-ua': '"Not:A-Brand";v="99", "Google Chrome";v="145\", \"Chromium\";v=\"145"',
25+
'sec-ch-ua-mobile': "?1",
26+
'origin': "https://www.emirates.com",
27+
'sec-fetch-site': "same-origin",
28+
'sec-fetch-mode': "cors",
29+
'sec-fetch-dest': "empty",
30+
'accept-language': "en-US,en;q=0.9"
31+
}
32+
33+
try:
34+
async with httpx.AsyncClient(timeout=10.0) as client:
35+
response = await client.post(url, params=params, content=json.dumps(payload), headers=headers)
36+
status = response.status_code
37+
38+
if status == 403:
39+
return Result.error("Caught by WAF or IP Block (403)")
40+
41+
if status == 200:
42+
data = response.json()
43+
body = data.get("body", {})
44+
errors = body.get("errors", [])
45+
46+
if any(err.get("code") == "program.member.EmailExistsForAnotherMember" for err in errors):
47+
return Result.taken(url=show_url)
48+
49+
if data.get("status") is True:
50+
return Result.available(url=show_url)
51+
52+
return Result.available(url=show_url)
53+
54+
if status == 429:
55+
return Result.error("Rate limited by Emirates")
56+
57+
return Result.error(f"Unexpected status code: {status}")
58+
59+
except httpx.ConnectTimeout:
60+
return Result.error("Connection timed out! maybe region blocks")
61+
except Exception as e:
62+
return Result.error(e)
63+
64+
65+
async def validate_emirates(email: str) -> Result:
66+
return await _check(email)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import httpx
2+
import json
3+
from user_scanner.core.result import Result
4+
5+
6+
async def _check(email: str) -> Result:
7+
show_url = "https://www.komoot.com"
8+
url = "https://www.komoot.com/v1/signin"
9+
10+
payload = {
11+
"email": email,
12+
"reason": "header",
13+
"new_tab": False
14+
}
15+
16+
headers = {
17+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Mobile Safari/537.36",
18+
'Accept': "application/json, text/plain, */*",
19+
'Accept-Encoding': "identity",
20+
'Content-Type': "application/json",
21+
'sec-ch-ua-platform': '"Android"',
22+
'sec-ch-ua': '"Not:A-Brand";v="99", "Google Chrome";v="145", "Chromium";v="145"',
23+
'sec-ch-ua-mobile': "?1",
24+
'origin': "https://www.komoot.com",
25+
'sec-fetch-site': "same-origin",
26+
'sec-fetch-mode': "cors",
27+
'sec-fetch-dest': "empty",
28+
'referer': "https://www.komoot.com/signin?referrer=www.google.com&reason=header",
29+
'accept-language': "en-US,en;q=0.9",
30+
'priority': "u=1, i"
31+
}
32+
33+
try:
34+
async with httpx.AsyncClient(timeout=10.0) as client:
35+
response = await client.post(url, content=json.dumps(payload), headers=headers)
36+
status = response.status_code
37+
38+
if status == 403:
39+
return Result.error("Caught by WAF or IP Block (403)")
40+
41+
if status == 200:
42+
data = response.json()
43+
response_type = data.get("type")
44+
45+
if response_type == "login":
46+
return Result.taken(url=show_url)
47+
48+
if response_type == "register":
49+
return Result.available(url=show_url)
50+
51+
if status == 429:
52+
return Result.error("Rate limited by Komoot")
53+
54+
return Result.error(f"Unexpected status code: {status}")
55+
56+
except httpx.ConnectTimeout:
57+
return Result.error("Connection timed out! maybe region blocks")
58+
except Exception as e:
59+
return Result.error(e)
60+
61+
62+
async def validate_komoot(email: str) -> Result:
63+
return await _check(email)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import httpx
2+
from user_scanner.core.result import Result
3+
4+
5+
async def _check(email: str) -> Result:
6+
show_url = "https://polarsteps.com"
7+
url = "https://www.polarsteps.com/send_password_reset"
8+
9+
payload = {
10+
'email': email
11+
}
12+
13+
headers = {
14+
'User-Agent': "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Mobile Safari/537.36",
15+
'Accept-Encoding': "identity",
16+
'sec-ch-ua-platform': '"Android"',
17+
'sec-ch-ua': '"Not:A-Brand";v="99", "Google Chrome";v="145", "Chromium";v="145"',
18+
'sec-ch-ua-mobile': "?1",
19+
'origin': "https://www.polarsteps.com",
20+
'sec-fetch-site': "same-origin",
21+
'sec-fetch-mode': "cors",
22+
'sec-fetch-dest': "empty",
23+
'referer': "https://www.polarsteps.com/forgot_password",
24+
'accept-language': "en-US,en;q=0.9",
25+
'priority': "u=1, i"
26+
}
27+
28+
try:
29+
async with httpx.AsyncClient(timeout=10.0) as client:
30+
response = await client.post(url, data=payload, headers=headers)
31+
status = response.status_code
32+
33+
if status == 403:
34+
return Result.error("Caught by WAF or IP Block (403)")
35+
36+
if status == 200:
37+
data = response.json()
38+
39+
if data.get("success") == "OK":
40+
return Result.taken(url=show_url)
41+
42+
error_msg = data.get("error", {}).get("email", "")
43+
if "don't have any user" in error_msg:
44+
return Result.available(url=show_url)
45+
46+
if status == 429:
47+
return Result.error("Rate limited by Polarsteps")
48+
49+
return Result.error(f"Unexpected status code: {status}")
50+
51+
except httpx.ConnectTimeout:
52+
return Result.error("Connection timed out! maybe region blocks")
53+
except Exception as e:
54+
return Result.error(e)
55+
56+
57+
async def validate_polarsteps(email: str) -> Result:
58+
return await _check(email)

0 commit comments

Comments
 (0)