user-scanner 1.0.6.0__py3-none-any.whl → 1.0.8.0__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 +63 -44
- user_scanner/core/orchestrator.py +68 -36
- user_scanner/core/result.py +79 -0
- user_scanner/creator/hashnode.py +8 -13
- user_scanner/creator/itch_io.py +0 -5
- user_scanner/creator/medium.py +7 -12
- user_scanner/creator/patreon.py +0 -6
- user_scanner/creator/producthunt.py +2 -19
- user_scanner/dev/github.py +19 -2
- user_scanner/dev/gitlab.py +4 -3
- user_scanner/dev/huggingface.py +19 -0
- user_scanner/dev/npmjs.py +9 -25
- user_scanner/donation/buymeacoffee.py +0 -3
- user_scanner/gaming/chess_com.py +4 -9
- user_scanner/gaming/minecraft.py +0 -5
- user_scanner/gaming/monkeytype.py +4 -10
- user_scanner/gaming/osu.py +0 -5
- user_scanner/gaming/roblox.py +14 -9
- user_scanner/gaming/steam.py +6 -9
- user_scanner/social/bluesky.py +7 -13
- user_scanner/social/discord.py +6 -9
- user_scanner/social/mastodon.py +0 -6
- user_scanner/social/pinterest.py +4 -4
- user_scanner/social/reddit.py +4 -3
- user_scanner/social/soundcloud.py +43 -0
- user_scanner/social/telegram.py +6 -6
- user_scanner/social/x.py +10 -20
- user_scanner/social/youtube.py +2 -18
- user_scanner/version.json +1 -1
- {user_scanner-1.0.6.0.dist-info → user_scanner-1.0.8.0.dist-info}/METADATA +27 -6
- user_scanner-1.0.8.0.dist-info/RECORD +58 -0
- user_scanner-1.0.6.0.dist-info/RECORD +0 -55
- {user_scanner-1.0.6.0.dist-info → user_scanner-1.0.8.0.dist-info}/WHEEL +0 -0
- {user_scanner-1.0.6.0.dist-info → user_scanner-1.0.8.0.dist-info}/entry_points.txt +0 -0
- {user_scanner-1.0.6.0.dist-info → user_scanner-1.0.8.0.dist-info}/licenses/LICENSE +0 -0
user_scanner/gaming/chess_com.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
+
from user_scanner.core.result import Result
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
def validate_chess_com(user):
|
|
@@ -16,22 +17,16 @@ def validate_chess_com(user):
|
|
|
16
17
|
data = response.json()
|
|
17
18
|
if data.get('valid') is True:
|
|
18
19
|
# 'valid': true means the username is NOT taken
|
|
19
|
-
return
|
|
20
|
+
return Result.available()
|
|
20
21
|
elif data.get('valid') is False:
|
|
21
22
|
# 'valid': false means the username IS taken
|
|
22
|
-
return
|
|
23
|
-
return
|
|
23
|
+
return Result.taken()
|
|
24
|
+
return Result.error("Invalid status code")
|
|
24
25
|
|
|
25
26
|
return generic_validate(url, process, headers=headers)
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
if __name__ == "__main__":
|
|
29
|
-
try:
|
|
30
|
-
import httpx
|
|
31
|
-
except ImportError:
|
|
32
|
-
print("Error: 'httpx' library is not installed.")
|
|
33
|
-
exit()
|
|
34
|
-
|
|
35
30
|
user = input("Username?: ").strip()
|
|
36
31
|
result = validate_chess_com(user)
|
|
37
32
|
|
user_scanner/gaming/minecraft.py
CHANGED
|
@@ -2,11 +2,6 @@ from user_scanner.core.orchestrator import status_validate
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
def validate_minecraft(user):
|
|
5
|
-
"""
|
|
6
|
-
Checks for minecraft username with mojang api.
|
|
7
|
-
Returns: 1 -> available, 0 -> taken, 2 -> error
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
5
|
url = f"https://api.mojang.com/minecraft/profile/lookup/name/{user}"
|
|
11
6
|
|
|
12
7
|
return status_validate(url, 404, 200, follow_redirects=True)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
-
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
3
|
|
|
4
4
|
def validate_monkeytype(user: str) -> int:
|
|
5
5
|
|
|
@@ -25,21 +25,15 @@ def validate_monkeytype(user: str) -> int:
|
|
|
25
25
|
available = payload.get("available")
|
|
26
26
|
|
|
27
27
|
if available is True:
|
|
28
|
-
return
|
|
28
|
+
return Result.available()
|
|
29
29
|
elif available is False:
|
|
30
|
-
return
|
|
31
|
-
return
|
|
30
|
+
return Result.taken()
|
|
31
|
+
return Result.error("Invalid status code")
|
|
32
32
|
|
|
33
33
|
return generic_validate(url, process, headers=headers)
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
if __name__ == "__main__":
|
|
37
|
-
try:
|
|
38
|
-
import httpx # noqa: F401
|
|
39
|
-
except ImportError:
|
|
40
|
-
print("Error: 'httpx' library is not installed.")
|
|
41
|
-
raise SystemExit(1)
|
|
42
|
-
|
|
43
37
|
user = input("Username?: ").strip()
|
|
44
38
|
result = validate_monkeytype(user)
|
|
45
39
|
|
user_scanner/gaming/osu.py
CHANGED
|
@@ -2,11 +2,6 @@ from user_scanner.core.orchestrator import status_validate
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
def validate_osu(user):
|
|
5
|
-
"""
|
|
6
|
-
Checks if a Osu username is available.
|
|
7
|
-
Returns: 1 -> available, 0 -> taken, 2 -> error
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
5
|
url = f"https://osu.ppy.sh/users/{user}"
|
|
11
6
|
|
|
12
7
|
return status_validate(url, 404, [200, 302], follow_redirects=True)
|
user_scanner/gaming/roblox.py
CHANGED
|
@@ -1,27 +1,32 @@
|
|
|
1
1
|
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
+
from user_scanner.core.result import Result
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
def validate_roblox(user):
|
|
5
|
-
"""
|
|
6
|
-
Checks if a roblox username is available.
|
|
7
|
-
Returns: 1 -> available, 0 -> taken, 2 -> error
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
6
|
# official api
|
|
11
7
|
url = f"https://users.roblox.com/v1/users/search?keyword={user}&limit=10"
|
|
12
8
|
|
|
13
9
|
def process(response):
|
|
14
10
|
search_results = response.json() # api response
|
|
15
11
|
|
|
16
|
-
if
|
|
17
|
-
return
|
|
12
|
+
if response.status_code == 429:
|
|
13
|
+
return Result.error("Too many requests")
|
|
14
|
+
|
|
15
|
+
if response.status_code == 400:
|
|
16
|
+
error = search_results["errors"][0] #Api states theres always an error
|
|
17
|
+
if error["code"] == 6:
|
|
18
|
+
return Result.error("Username is too short")
|
|
19
|
+
if error["code"] == 5:
|
|
20
|
+
return Result.error("Username was filtered")
|
|
21
|
+
#Shouldn't be able to reach this
|
|
22
|
+
return Result.error("Invalid username")
|
|
18
23
|
|
|
19
24
|
# iterates through the entries in the search results
|
|
20
25
|
for entry in search_results["data"]:
|
|
21
26
|
# .lower() so casing from the API doesn't matter
|
|
22
27
|
if entry["name"].lower() == user.lower(): # if a username matches the user
|
|
23
|
-
return
|
|
24
|
-
return
|
|
28
|
+
return Result.taken()
|
|
29
|
+
return Result.available()
|
|
25
30
|
|
|
26
31
|
return generic_validate(url, process, follow_redirects=True)
|
|
27
32
|
|
user_scanner/gaming/steam.py
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
+
from user_scanner.core.result import Result
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
def validate_steam(user):
|
|
5
|
-
"""
|
|
6
|
-
Checks if a steam username is available.
|
|
7
|
-
Returns: 1 -> available, 0 -> taken, 2 -> error
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
6
|
url = f"https://steamcommunity.com/id/{user}/"
|
|
11
7
|
|
|
12
8
|
def process(response):
|
|
13
9
|
if response.status_code == 200:
|
|
14
|
-
if
|
|
15
|
-
return
|
|
10
|
+
if "Error</title>" in response.text:
|
|
11
|
+
return Result.available()
|
|
16
12
|
else:
|
|
17
|
-
return
|
|
18
|
-
|
|
13
|
+
return Result.taken()
|
|
14
|
+
|
|
15
|
+
return Result.error("Invalid status code")
|
|
19
16
|
|
|
20
17
|
return generic_validate(url, process)
|
|
21
18
|
|
user_scanner/social/bluesky.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import re
|
|
2
1
|
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
def validate_bluesky(user):
|
|
@@ -25,30 +25,24 @@ def validate_bluesky(user):
|
|
|
25
25
|
'handle': handle,
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
if not re.fullmatch(r"^[a-zA-Z0-9\.-]{1,64}$", user):
|
|
29
|
-
return 2
|
|
30
|
-
|
|
31
28
|
def process(response):
|
|
32
29
|
if response.status_code == 200:
|
|
33
30
|
data = response.json()
|
|
34
31
|
result_type = data.get('result', {}).get('$type')
|
|
35
32
|
|
|
36
33
|
if result_type == "com.atproto.temp.checkHandleAvailability#resultAvailable":
|
|
37
|
-
return
|
|
34
|
+
return Result.available()
|
|
38
35
|
elif result_type == "com.atproto.temp.checkHandleAvailability#resultUnavailable":
|
|
39
|
-
return
|
|
40
|
-
|
|
36
|
+
return Result.taken()
|
|
37
|
+
elif response.status_code == 400:
|
|
38
|
+
return Result.error("Username can only contain letters, numbers, hyphens (no leading/trailing)")
|
|
39
|
+
|
|
40
|
+
return Result.error("Invalid status code!")
|
|
41
41
|
|
|
42
42
|
return generic_validate(url, process, headers=headers, params=params, timeout=15.0)
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
if __name__ == "__main__":
|
|
46
|
-
try:
|
|
47
|
-
import httpx
|
|
48
|
-
except ImportError:
|
|
49
|
-
print("Error: 'httpx' library is not installed.")
|
|
50
|
-
exit()
|
|
51
|
-
|
|
52
46
|
user = input("Username?: ").strip()
|
|
53
47
|
result = validate_bluesky(user)
|
|
54
48
|
|
user_scanner/social/discord.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import httpx
|
|
2
|
-
from
|
|
3
|
-
|
|
2
|
+
from user_scanner.core.result import Result
|
|
4
3
|
|
|
5
4
|
def validate_discord(user):
|
|
6
5
|
url = "https://discord.com/api/v9/unique-username/username-attempt-unauthed"
|
|
@@ -21,14 +20,12 @@ def validate_discord(user):
|
|
|
21
20
|
if response.status_code == 200:
|
|
22
21
|
status = response.json().get("taken")
|
|
23
22
|
if status is True:
|
|
24
|
-
return
|
|
23
|
+
return Result.taken()
|
|
25
24
|
elif status is False:
|
|
26
|
-
return
|
|
27
|
-
return
|
|
28
|
-
except
|
|
29
|
-
return
|
|
30
|
-
except Exception:
|
|
31
|
-
return 2
|
|
25
|
+
return Result.available()
|
|
26
|
+
return Result.error("Invalid status code")
|
|
27
|
+
except Exception as e:
|
|
28
|
+
return Result.error(e)
|
|
32
29
|
|
|
33
30
|
|
|
34
31
|
if __name__ == "__main__":
|
user_scanner/social/mastodon.py
CHANGED
user_scanner/social/pinterest.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
-
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
3
|
|
|
4
4
|
def validate_pinterest(user):
|
|
5
5
|
url = f"https://www.pinterest.com/{user}/"
|
|
@@ -7,11 +7,11 @@ def validate_pinterest(user):
|
|
|
7
7
|
def process(response):
|
|
8
8
|
if response.status_code == 200:
|
|
9
9
|
if "User not found." in response.text:
|
|
10
|
-
return
|
|
10
|
+
return Result.available()
|
|
11
11
|
else:
|
|
12
|
-
return
|
|
12
|
+
return Result.taken()
|
|
13
13
|
else:
|
|
14
|
-
return
|
|
14
|
+
return Result.error("Invalid status code")
|
|
15
15
|
|
|
16
16
|
return generic_validate(url, process, follow_redirects=True)
|
|
17
17
|
|
user_scanner/social/reddit.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
+
from user_scanner.core.result import Result
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
def validate_reddit(user):
|
|
@@ -7,11 +8,11 @@ def validate_reddit(user):
|
|
|
7
8
|
def process(response):
|
|
8
9
|
if response.status_code == 200:
|
|
9
10
|
if "Sorry, nobody on Reddit goes by that name." in response.text:
|
|
10
|
-
return
|
|
11
|
+
return Result.available()
|
|
11
12
|
else:
|
|
12
|
-
return
|
|
13
|
+
return Result.taken()
|
|
13
14
|
else:
|
|
14
|
-
return
|
|
15
|
+
return Result.error()
|
|
15
16
|
|
|
16
17
|
return generic_validate(url, process, follow_redirects=True)
|
|
17
18
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from user_scanner.core.orchestrator import generic_validate
|
|
2
|
+
from user_scanner.core.result import Result
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def validate_soundcloud(user):
|
|
6
|
+
url = f"https://soundcloud.com/{user}"
|
|
7
|
+
|
|
8
|
+
headers = {
|
|
9
|
+
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
|
|
10
|
+
'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
def process(response):
|
|
14
|
+
if response.status_code == 404:
|
|
15
|
+
return Result.available()
|
|
16
|
+
|
|
17
|
+
if response.status_code == 200:
|
|
18
|
+
text = response.text
|
|
19
|
+
|
|
20
|
+
if f'soundcloud://users:{user}' in text:
|
|
21
|
+
return Result.taken()
|
|
22
|
+
if f'"username":"{user}"' in text:
|
|
23
|
+
return Result.taken()
|
|
24
|
+
if 'soundcloud://users:' in text and '"username":"' in text:
|
|
25
|
+
return Result.taken()
|
|
26
|
+
|
|
27
|
+
return Result.available()
|
|
28
|
+
|
|
29
|
+
return Result.error()
|
|
30
|
+
|
|
31
|
+
return generic_validate(url, process, headers=headers, follow_redirects=True)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
if __name__ == "__main__":
|
|
35
|
+
user = input("Username?: ").strip()
|
|
36
|
+
result = validate_soundcloud(user)
|
|
37
|
+
|
|
38
|
+
if result == 1:
|
|
39
|
+
print("Available!")
|
|
40
|
+
elif result == 0:
|
|
41
|
+
print("Unavailable!")
|
|
42
|
+
else:
|
|
43
|
+
print("Error occured!")
|
user_scanner/social/telegram.py
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import re
|
|
2
2
|
from user_scanner.core.orchestrator import generic_validate
|
|
3
|
+
from user_scanner.core.result import Result
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
def validate_telegram(user: str) -> int:
|
|
6
|
-
"""
|
|
7
|
-
Checks if a Telegram username is available.
|
|
8
|
-
Returns: 1 -> available, 0 -> taken, 2 -> error
|
|
9
|
-
"""
|
|
10
7
|
url = f"https://t.me/{user}"
|
|
11
8
|
|
|
12
9
|
def process(r):
|
|
13
10
|
if r.status_code == 200:
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
if re.search(r'<div[^>]*class="tgme_page_extra"[^>]*>', r.text):
|
|
12
|
+
return Result.taken()
|
|
13
|
+
else:
|
|
14
|
+
return Result.available()
|
|
15
|
+
return Result.error()
|
|
16
16
|
|
|
17
17
|
return generic_validate(url, process, follow_redirects=True)
|
|
18
18
|
|
user_scanner/social/x.py
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
from colorama import Fore, Style
|
|
4
|
-
from httpx import ConnectError, TimeoutException
|
|
5
|
-
|
|
1
|
+
from user_scanner.core.result import Result
|
|
2
|
+
from user_scanner.core.orchestrator import generic_validate
|
|
6
3
|
|
|
7
4
|
def validate_x(user):
|
|
8
5
|
url = "https://api.twitter.com/i/users/username_available.json"
|
|
@@ -18,31 +15,24 @@ def validate_x(user):
|
|
|
18
15
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36",
|
|
19
16
|
}
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
response = httpx.get(url, params=params, headers=headers, timeout=3.0)
|
|
18
|
+
def process(response):
|
|
23
19
|
status = response.status_code
|
|
24
|
-
|
|
20
|
+
|
|
25
21
|
if status in [401, 403, 429]:
|
|
26
|
-
return
|
|
22
|
+
return Result.error()
|
|
27
23
|
|
|
28
24
|
elif status == 200:
|
|
29
25
|
data = response.json()
|
|
30
26
|
if data.get('valid') is True:
|
|
31
|
-
return
|
|
27
|
+
return Result.available()
|
|
32
28
|
elif data.get('reason') == 'taken':
|
|
33
|
-
return
|
|
29
|
+
return Result.taken()
|
|
34
30
|
elif (data.get('reason') == "improper_format" or data.get('reason') == "invalid_username"):
|
|
35
|
-
|
|
36
|
-
"\n" + " "+f"{Fore.CYAN}X says: {data.get('desc')}{Style.RESET_ALL}")
|
|
37
|
-
return 2
|
|
38
|
-
else:
|
|
39
|
-
return 2
|
|
31
|
+
return Result.error(f"X says: {data.get('desc')}")
|
|
40
32
|
|
|
41
|
-
|
|
42
|
-
return 2
|
|
43
|
-
except Exception:
|
|
44
|
-
return 2
|
|
33
|
+
return Result.error()
|
|
45
34
|
|
|
35
|
+
return generic_validate(url, process, params=params, headers=headers)
|
|
46
36
|
|
|
47
37
|
if __name__ == "__main__":
|
|
48
38
|
user = input("Username?: ").strip()
|
user_scanner/social/youtube.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
from httpx import ConnectError, TimeoutException
|
|
1
|
+
from user_scanner.core.orchestrator import status_validate
|
|
3
2
|
|
|
4
3
|
|
|
5
4
|
def validate_youtube(user):
|
|
@@ -29,22 +28,7 @@ def validate_youtube(user):
|
|
|
29
28
|
'priority': "u=0, i"
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
response = httpx.get(url, headers=headers,
|
|
34
|
-
follow_redirects=True, timeout=3.0)
|
|
35
|
-
status = response.status_code
|
|
36
|
-
|
|
37
|
-
if status == 200:
|
|
38
|
-
return 0
|
|
39
|
-
elif status == 404:
|
|
40
|
-
return 1
|
|
41
|
-
else:
|
|
42
|
-
return 2
|
|
43
|
-
|
|
44
|
-
except (ConnectError, TimeoutException):
|
|
45
|
-
return 2
|
|
46
|
-
except Exception:
|
|
47
|
-
return 2
|
|
31
|
+
status_validate(url, 404, 200, headers=headers, follow_redirects=True)
|
|
48
32
|
|
|
49
33
|
|
|
50
34
|
if __name__ == "__main__":
|
user_scanner/version.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: user-scanner
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.8.0
|
|
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>
|
|
@@ -15,7 +15,7 @@ Project-URL: Homepage, https://github.com/kaifcodec/user-scanner
|
|
|
15
15
|
|
|
16
16
|

|
|
17
17
|
<p align="center">
|
|
18
|
-
<img src="https://img.shields.io/badge/Version-1.0.
|
|
18
|
+
<img src="https://img.shields.io/badge/Version-1.0.8.0-blueviolet?style=for-the-badge&logo=github" />
|
|
19
19
|
<img src="https://img.shields.io/github/issues/kaifcodec/user-scanner?style=for-the-badge&logo=github" />
|
|
20
20
|
<img src="https://img.shields.io/badge/Tested%20on-Termux-black?style=for-the-badge&logo=termux" />
|
|
21
21
|
<img src="https://img.shields.io/badge/Tested%20on-Windows-cyan?style=for-the-badge&logo=Windows" />
|
|
@@ -34,6 +34,7 @@ Perfect for finding a **unique username** across GitHub, Twitter, Reddit, Instag
|
|
|
34
34
|
- ✅ Check usernames across **social networks**, **developer platforms**, and **creator communities**.
|
|
35
35
|
- ✅ Clear **Available / Taken / Error** output for each platform.
|
|
36
36
|
- ✅ Fully modular: add new platform modules easily.
|
|
37
|
+
- ✅ Wildcard-based username permutations for automatic variation generation
|
|
37
38
|
- ✅ Command-line interface ready: works directly after `pip install`.
|
|
38
39
|
- ✅ Can be used as username OSINT tool.
|
|
39
40
|
- ✅ Very low and lightweight dependencies, can be run on any machine.
|
|
@@ -60,14 +61,37 @@ Optionally, scan a specific category or single module:
|
|
|
60
61
|
user-scanner -u <username> -c dev
|
|
61
62
|
user-scanner -l # Lists all available modules
|
|
62
63
|
user-scanner -u <username> -m github
|
|
64
|
+
user-scanner -u <username> -p <suffix>
|
|
63
65
|
|
|
64
66
|
```
|
|
67
|
+
|
|
68
|
+
Generate multiple username variations by appending a suffix:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
user-scanner -u <username> -p <suffix>
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
Optionally, scan a specific category or single module with limit:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
user-scanner -u <username> -p <suffix> -c dev
|
|
78
|
+
user-scanner -u <username> -p <suffix> -m github
|
|
79
|
+
user-scanner -u <username> -p <suffix> -s <number> # limit generation of usernames
|
|
80
|
+
user-scanner -u <username> -p <suffix> -d <seconds> #delay to avoid rate-limits
|
|
81
|
+
```
|
|
82
|
+
|
|
65
83
|
---
|
|
66
84
|
### Screenshot:
|
|
67
85
|
|
|
68
86
|
- Note*: New modules are constantly getting added so this might have only limited, outdated output:
|
|
69
87
|
|
|
70
|
-
|
|
88
|
+
|
|
89
|
+
<img width="1080" height="770" alt="1000140392" src="https://github.com/user-attachments/assets/4638c8f6-40c6-46f8-ae17-ac65cd199d81" />
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
<img width="1080" height="352" alt="1000140393" src="https://github.com/user-attachments/assets/578b248c-2a05-4917-aab3-6372a7c28045" />
|
|
71
95
|
|
|
72
96
|
|
|
73
97
|
### Contributing:
|
|
@@ -94,9 +118,6 @@ user_scanner/
|
|
|
94
118
|
|
|
95
119
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for examples.
|
|
96
120
|
|
|
97
|
-
### 📧 Contact:
|
|
98
|
-
- [Email](kaifcodec@gmail.com)
|
|
99
|
-
|
|
100
121
|
---
|
|
101
122
|
|
|
102
123
|
### Dependencies:
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
user_scanner/__main__.py,sha256=r_8gq8wSRs3U7yUkTAv4e4MPopX0MUf_EbwedBTPs44,5082
|
|
3
|
+
user_scanner/version.json,sha256=35gyNCy3acbWFMZxPDR9qcG1lQ6Y2OGYyhr3q3rs_AE,49
|
|
4
|
+
user_scanner/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
user_scanner/cli/banner.py,sha256=3t6owaDArERlvpcszA1Yi3dtksvh8a9tLyrxRowTC40,1499
|
|
6
|
+
user_scanner/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
user_scanner/community/coderlegion.py,sha256=W_bdjzdFPRgUrNFFlylvToSJ4AzaFCtTsUy_MRVDdSo,451
|
|
8
|
+
user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
+
user_scanner/core/orchestrator.py,sha256=cB_aXFYlaZFWIYejZ_iI_c_n6xh2nr9Tm5bN79sCaKo,6102
|
|
10
|
+
user_scanner/core/result.py,sha256=HWz9JjRk74shAdM56ZtdG6hIp4dgcahqYSnpOp3uCak,1933
|
|
11
|
+
user_scanner/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
|
+
user_scanner/creator/devto.py,sha256=mIACmG1a4eoctywxb5p04sI0YVi3dsjCRw9YVOFBEKQ,435
|
|
13
|
+
user_scanner/creator/hashnode.py,sha256=vlXsJfIG_5ShEK2xPLDl2bi6X-d08iTeoqfKeQLaB1g,1363
|
|
14
|
+
user_scanner/creator/itch_io.py,sha256=JsFkFzBfJI18DeuSYJIOPGEV_9v7t-jtwmBYCA9W2P8,440
|
|
15
|
+
user_scanner/creator/kaggle.py,sha256=QaXIG02OGxvQZEvwHm50RKNd7joxGOq0Ht3cFfrYEiU,445
|
|
16
|
+
user_scanner/creator/medium.py,sha256=NIOYnk8_ASD0kYfKqs8t6uZZTV4D-5-ZxyHMzOMMOuI,1015
|
|
17
|
+
user_scanner/creator/patreon.py,sha256=g-r85pxirf0ihK3STyGYPIzp59MB7JH64Opb4wq1fyU,461
|
|
18
|
+
user_scanner/creator/producthunt.py,sha256=vt26oQR68E7xCOHD7I7Je_M4WSc0-aFfhbMkif6G2FM,879
|
|
19
|
+
user_scanner/dev/__init__.py,sha256=qUR0eLwN-gO6oKk-1cmCVT4G_AxUHHMgpV3wJ7URXi4,7
|
|
20
|
+
user_scanner/dev/codeberg.py,sha256=Z6nV0_8xZhMiCcNn9Hn79VVh6y0ar9fqL7KS2b7IaDo,447
|
|
21
|
+
user_scanner/dev/cratesio.py,sha256=mJnlLJoMLlQ7f_95QD7LgH1xCj-e6FooOFkpYypBfG4,724
|
|
22
|
+
user_scanner/dev/dockerhub.py,sha256=sPEnomGiPM2mKv2HsA-9WxaXHjzz21A6ox3IXK1etLc,643
|
|
23
|
+
user_scanner/dev/github.py,sha256=km0RMd4cS5sY8IUKDKoNC1oQeCj57ld4HAjOlo1w4ms,1689
|
|
24
|
+
user_scanner/dev/gitlab.py,sha256=kMDSd74XbofmJocfS4Fd9DxPryIHBMek3N_5c7Z_AJQ,1351
|
|
25
|
+
user_scanner/dev/huggingface.py,sha256=hDanOZ45LeUg3hrN0CYrBnBnLqHCYtOWS0_HCvAbmDw,454
|
|
26
|
+
user_scanner/dev/launchpad.py,sha256=N58ioX_dEHq2uwyyGrWnDKWwbqK9_RiuBQ1uWR5cDfg,799
|
|
27
|
+
user_scanner/dev/npmjs.py,sha256=k-DhFqGJWDoQ79EzR8hmVrJk07AfJfPUWnIYuKc2G6w,713
|
|
28
|
+
user_scanner/dev/replit.py,sha256=SI_i2l4w9tm2kBX4-cONBAT8dSynXoGEP4zcU8ngnh0,442
|
|
29
|
+
user_scanner/donation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
+
user_scanner/donation/buymeacoffee.py,sha256=86LGyChv_UKQFp2D7nIoK1B-FCAAbbfabS8NA9yLp5k,459
|
|
31
|
+
user_scanner/donation/liberapay.py,sha256=njClxpbRLZQ_L2-lUYCY6QFnF4IcwfCJPCIg1iEqo7M,1120
|
|
32
|
+
user_scanner/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
+
user_scanner/gaming/chess_com.py,sha256=74tMgukSUXwdmD9G7Jij_gudRlSfs46Xho5KNMVeyt4,1262
|
|
34
|
+
user_scanner/gaming/minecraft.py,sha256=7a9H9ebLlRzGB0SjxLmzqLiDPDBZAuuNq3KKe2DZAvo,481
|
|
35
|
+
user_scanner/gaming/monkeytype.py,sha256=n9KMBChs0ej7MgZqLGUDVz5CED70sQ3ksDF5pO0G05A,1380
|
|
36
|
+
user_scanner/gaming/osu.py,sha256=2Xs1iM0CJ-3dNHu4tyF50_s0Ei_1mA5Zd6D6M5RmiVg,448
|
|
37
|
+
user_scanner/gaming/roblox.py,sha256=Qs51jLgKh-Ehqlco_j8CFtJ4CLVoZeBwPugDvAyLw3Q,1464
|
|
38
|
+
user_scanner/gaming/steam.py,sha256=l8xk_p9aiYQWCPoogQnO1iwkfojPhg6yd76OZHhKN50,740
|
|
39
|
+
user_scanner/social/__init__.py,sha256=jaCkFwX1uYtF0ENifVwF8OfHrYYUTm64B9wlBq9BBfQ,9
|
|
40
|
+
user_scanner/social/bluesky.py,sha256=11Y_vRj3txEDQqoD0iANgSWVSB8L87OotPQZquhneR0,1994
|
|
41
|
+
user_scanner/social/discord.py,sha256=z-oIqT416ydnZUkq481rz6NTq5yc_BYu-P_Z79uR-Jw,1150
|
|
42
|
+
user_scanner/social/instagram.py,sha256=GgmKGvi3meKdZ_nQJbJSBZDJTEKSoE6Cn4_VARmo62I,953
|
|
43
|
+
user_scanner/social/mastodon.py,sha256=qISx-gUsddC8lFMcmERA4N0YAnXyS1Jq2Xgg7XE4sL4,450
|
|
44
|
+
user_scanner/social/pinterest.py,sha256=JIJ-HPtMoGvxW7NQzm02lChFKMmE6k6GxFoUZ6OvCec,784
|
|
45
|
+
user_scanner/social/reddit.py,sha256=PJ46v8WpcUY1nNSbPhbiY6B9ynB9bcakcDjopXTX2ME,787
|
|
46
|
+
user_scanner/social/snapchat.py,sha256=XEW_W4jEBX4AiHREcfHGstt97Ez3GI-3bKSzhtMyn28,1277
|
|
47
|
+
user_scanner/social/soundcloud.py,sha256=e2yU1w2fnH1EhzYed0kxgcqgWz0YoCQQFf6yKqhRPjM,1246
|
|
48
|
+
user_scanner/social/telegram.py,sha256=9IS-0pghMifNRmj62NcxCOvn23Hvg0AJJcuhCa_aXD4,765
|
|
49
|
+
user_scanner/social/threads.py,sha256=rK8Gm_riDdr0djo23tk38fNVVEBuC6nj2iTXvWrqXeE,951
|
|
50
|
+
user_scanner/social/x.py,sha256=sAnboHHZN2DWyKeds46GLZHxGG-G_bjzfVNIkblSHx8,1406
|
|
51
|
+
user_scanner/social/youtube.py,sha256=PYGp-73ZnXPgpV-7q9-zfN6aF3geqUGul0CaoSO0u9M,1702
|
|
52
|
+
user_scanner/utils/update.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
user_scanner/utils/version.py,sha256=mPh24EwITyXgD3AMgbflRL180pS0JfrvuJdnoErOU34,623
|
|
54
|
+
user_scanner-1.0.8.0.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
|
|
55
|
+
user_scanner-1.0.8.0.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
|
|
56
|
+
user_scanner-1.0.8.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
57
|
+
user_scanner-1.0.8.0.dist-info/METADATA,sha256=InqyZQhX0lcSUl5-0GnU-gqErYDLDfROk3ovrv8io3o,4850
|
|
58
|
+
user_scanner-1.0.8.0.dist-info/RECORD,,
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
user_scanner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
user_scanner/__main__.py,sha256=gKu_uqcydd5-9fZta2uL5r69i_BiQgzN43XqHGJyqLQ,3935
|
|
3
|
-
user_scanner/version.json,sha256=55qDhyK3TTdk4-Ht586r_b7p7U6Ptdbapl1izhEzTaw,49
|
|
4
|
-
user_scanner/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
-
user_scanner/cli/banner.py,sha256=3t6owaDArERlvpcszA1Yi3dtksvh8a9tLyrxRowTC40,1499
|
|
6
|
-
user_scanner/community/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
-
user_scanner/community/coderlegion.py,sha256=W_bdjzdFPRgUrNFFlylvToSJ4AzaFCtTsUy_MRVDdSo,451
|
|
8
|
-
user_scanner/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
user_scanner/core/orchestrator.py,sha256=8kaokGxKo8uVemv7KCdrCQyjTXCZh1QrqSTurnlWLqY,4593
|
|
10
|
-
user_scanner/creator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
|
-
user_scanner/creator/devto.py,sha256=mIACmG1a4eoctywxb5p04sI0YVi3dsjCRw9YVOFBEKQ,435
|
|
12
|
-
user_scanner/creator/hashnode.py,sha256=LBg8yRkB-WAVYavfeKWh6R2LWmUHMyXt02BLIXP-C4o,1378
|
|
13
|
-
user_scanner/creator/itch_io.py,sha256=d-s2k410aZtaYQXpTgaKsgQ488Ag9vGJj5buw7XM32I,556
|
|
14
|
-
user_scanner/creator/kaggle.py,sha256=QaXIG02OGxvQZEvwHm50RKNd7joxGOq0Ht3cFfrYEiU,445
|
|
15
|
-
user_scanner/creator/medium.py,sha256=zA8zw7hrH_JOXGM3oW7dfe5kldIRNyeBWZ8UCdAqZlg,1019
|
|
16
|
-
user_scanner/creator/patreon.py,sha256=aneIkwVSc7SFpE8H5HlSDMYQZc-97ZOtGZXrRb4PfWw,589
|
|
17
|
-
user_scanner/creator/producthunt.py,sha256=xgv-LJ97LLmyD2GRw4g3gylUMpOKUW0asbTnULbpZsE,1205
|
|
18
|
-
user_scanner/dev/__init__.py,sha256=qUR0eLwN-gO6oKk-1cmCVT4G_AxUHHMgpV3wJ7URXi4,7
|
|
19
|
-
user_scanner/dev/codeberg.py,sha256=Z6nV0_8xZhMiCcNn9Hn79VVh6y0ar9fqL7KS2b7IaDo,447
|
|
20
|
-
user_scanner/dev/cratesio.py,sha256=mJnlLJoMLlQ7f_95QD7LgH1xCj-e6FooOFkpYypBfG4,724
|
|
21
|
-
user_scanner/dev/dockerhub.py,sha256=sPEnomGiPM2mKv2HsA-9WxaXHjzz21A6ox3IXK1etLc,643
|
|
22
|
-
user_scanner/dev/github.py,sha256=jQ6q9V0snMUzGwIcbYZM_cJfiM8VZNYGm08dlDJqb6g,1113
|
|
23
|
-
user_scanner/dev/gitlab.py,sha256=FBwxrYWZXRkj55r_Dq8ZJLgLVLGrv5WU5k--31b_bz8,1243
|
|
24
|
-
user_scanner/dev/launchpad.py,sha256=N58ioX_dEHq2uwyyGrWnDKWwbqK9_RiuBQ1uWR5cDfg,799
|
|
25
|
-
user_scanner/dev/npmjs.py,sha256=K_bfLnehgaDlroiyMiIT801noRW-AyVISGd8xwMrWTM,1215
|
|
26
|
-
user_scanner/dev/replit.py,sha256=SI_i2l4w9tm2kBX4-cONBAT8dSynXoGEP4zcU8ngnh0,442
|
|
27
|
-
user_scanner/donation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
-
user_scanner/donation/buymeacoffee.py,sha256=8ZFuE8zjCclNP1C2RejDc4kMauGZpuYkxA1iiphSWKU,522
|
|
29
|
-
user_scanner/donation/liberapay.py,sha256=njClxpbRLZQ_L2-lUYCY6QFnF4IcwfCJPCIg1iEqo7M,1120
|
|
30
|
-
user_scanner/gaming/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
|
-
user_scanner/gaming/chess_com.py,sha256=LlZ-cn3wW8ysRSQ7FVnOofnJIgMbIDX_tGkdkNMhUwM,1282
|
|
32
|
-
user_scanner/gaming/minecraft.py,sha256=-mNhKTDwEETZv-IuLo1dHg2NfhFgb9w9-7zvP-HxtAU,601
|
|
33
|
-
user_scanner/gaming/monkeytype.py,sha256=uktLoHEV-wyjR-WsuVvgvrVCDVU3YpCISrhStM9odTU,1428
|
|
34
|
-
user_scanner/gaming/osu.py,sha256=L6LYOY1GyzQ2-KimGnvuT6BEGpY7K0hgV394sy8fvak,560
|
|
35
|
-
user_scanner/gaming/roblox.py,sha256=RnoME2NxMriILh1IiXQCe3J1l_G5Fs2S16YGKHCw3WY,1110
|
|
36
|
-
user_scanner/gaming/steam.py,sha256=-WtY-Wm68pJRW3fseayJfG3XqwGOzuUERuC5yLX16nQ,754
|
|
37
|
-
user_scanner/social/__init__.py,sha256=jaCkFwX1uYtF0ENifVwF8OfHrYYUTm64B9wlBq9BBfQ,9
|
|
38
|
-
user_scanner/social/bluesky.py,sha256=TlKONKmN2lvHRomQAqwkKzlIERSRKCbtPprcD9R_8CQ,1947
|
|
39
|
-
user_scanner/social/discord.py,sha256=iDnle44eyBTgeeyLb6jLysI4S-KRMNbaqDIVC0hCsMU,1135
|
|
40
|
-
user_scanner/social/instagram.py,sha256=GgmKGvi3meKdZ_nQJbJSBZDJTEKSoE6Cn4_VARmo62I,953
|
|
41
|
-
user_scanner/social/mastodon.py,sha256=l3Aixl7DCj_gtAiNzc3wA3pZxI-nP-zzRMuKkuwvTgM,578
|
|
42
|
-
user_scanner/social/pinterest.py,sha256=_Sditb8k1xRhplsN79RIEbZNlzfxIqFD6kGh3nAmVCE,677
|
|
43
|
-
user_scanner/social/reddit.py,sha256=yA7n7GFmS5mr02BOR4DeTmIT5GdnSCbUyaVarV9RMTk,700
|
|
44
|
-
user_scanner/social/snapchat.py,sha256=XEW_W4jEBX4AiHREcfHGstt97Ez3GI-3bKSzhtMyn28,1277
|
|
45
|
-
user_scanner/social/telegram.py,sha256=HU20t0A9jFijOUcdgzXfoNymxDBk2BhAqw7rIhSBfEQ,740
|
|
46
|
-
user_scanner/social/threads.py,sha256=rK8Gm_riDdr0djo23tk38fNVVEBuC6nj2iTXvWrqXeE,951
|
|
47
|
-
user_scanner/social/x.py,sha256=5UYBLmLuFpFeKQYqCkebQKB46GsfiQjV4flAdcrJAps,1591
|
|
48
|
-
user_scanner/social/youtube.py,sha256=nqW1XKZOefpPTDeCvqFTJXP24SjhntIQRlevwuSGLSk,2027
|
|
49
|
-
user_scanner/utils/update.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
-
user_scanner/utils/version.py,sha256=mPh24EwITyXgD3AMgbflRL180pS0JfrvuJdnoErOU34,623
|
|
51
|
-
user_scanner-1.0.6.0.dist-info/entry_points.txt,sha256=XqU3kssYZ0vXaPy5qYUOTCu4u-48Xie7QWFpBCYc7Nc,59
|
|
52
|
-
user_scanner-1.0.6.0.dist-info/licenses/LICENSE,sha256=XH1QyQG68zo1opDIZHTHcTAbe9XMzewvTaFTukcN9vc,1061
|
|
53
|
-
user_scanner-1.0.6.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
54
|
-
user_scanner-1.0.6.0.dist-info/METADATA,sha256=J5aHMpDhRHeJX2BP-gzKi3NafuE7ArjUb-kvLOlaILU,4185
|
|
55
|
-
user_scanner-1.0.6.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|