Merge branch 'master' into #1283-conflicts-resolved

pull/1283/head
Moritz 3 years ago committed by GitHub
commit 9c322c314a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -161,7 +161,6 @@ Here are some things we would appreciate your help on:
- Addition of new site support ¹ - Addition of new site support ¹
- Bringing back site support of [sites that have been removed](removed_sites.md) in the past due to false positives - Bringing back site support of [sites that have been removed](removed_sites.md) in the past due to false positives
[1] Please look at the Wiki entry on [adding new sites](https://github.com/sherlock-project/sherlock/wiki/Adding-Sites-To-Sherlock) [1] Please look at the Wiki entry on [adding new sites](https://github.com/sherlock-project/sherlock/wiki/Adding-Sites-To-Sherlock)
to understand the issues. to understand the issues.

@ -519,14 +519,6 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Ebay": {
"errorMsg": "<title>eBay Profile - error</title>",
"errorType": "message",
"url": "https://www.ebay.com/usr/{}",
"urlMain": "https://www.ebay.com/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"GDProfiles": { "GDProfiles": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://gdprofiles.com/{}", "url": "https://gdprofiles.com/{}",

@ -1027,20 +1027,6 @@ As of 2021-01-13, Travellerspoint returns false positives
}, },
``` ```
## Ebay
As of 2021-01-15, Ebay seems to be very laggy and take too long to return a response.
```
"Ebay": {
"errorMsg": "<title>eBay Profile - error</title>",
"errorType": "message",
"url": "https://www.ebay.com/usr/{}",
"urlMain": "https://www.ebay.com/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
```
## GDProfiles ## GDProfiles
As of 2021-06-27, GDProfiles takes way too long to respond. Must be an issue on their side. As of 2021-06-27, GDProfiles takes way too long to respond. Must be an issue on their side.

@ -1,5 +1,6 @@
"""Sherlock Module """ Sherlock Module
This module contains the main logic to search for usernames at social This module contains the main logic to search for usernames at social
networks. networks.
""" """

@ -20,9 +20,8 @@ if __name__ == "__main__":
major = sys.version_info[0] major = sys.version_info[0]
minor = sys.version_info[1] minor = sys.version_info[1]
python_version = str(major) + "." + str(minor) + "." + str(sys.version_info[2])
if major != 3 or major == 3 and minor < 6: if major != 3 or major == 3 and minor < 6:
python_version = str(major) + "." + str(minor) + "." + str(sys.version_info[2])
print("Sherlock requires Python 3.6+\nYou are using Python %s, which is not supported by Sherlock" % (python_version)) print("Sherlock requires Python 3.6+\nYou are using Python %s, which is not supported by Sherlock" % (python_version))
sys.exit(1) sys.exit(1)

@ -33,7 +33,7 @@ class QueryNotify:
self.result = result self.result = result
return # return
def start(self, message=None): def start(self, message=None):
"""Notify Start. """Notify Start.
@ -52,7 +52,7 @@ class QueryNotify:
Nothing. Nothing.
""" """
return # return
def update(self, result): def update(self, result):
"""Notify Update. """Notify Update.
@ -71,7 +71,7 @@ class QueryNotify:
self.result = result self.result = result
return # return
def finish(self, message=None): def finish(self, message=None):
"""Notify Finish. """Notify Finish.
@ -90,7 +90,7 @@ class QueryNotify:
Nothing. Nothing.
""" """
return # return
def __str__(self): def __str__(self):
"""Convert Object To String. """Convert Object To String.
@ -101,9 +101,7 @@ class QueryNotify:
Return Value: Return Value:
Nicely formatted string to get information about this object. Nicely formatted string to get information about this object.
""" """
result = str(self.result) return str(self.result)
return result
class QueryNotifyPrint(QueryNotify): class QueryNotifyPrint(QueryNotify):
@ -150,14 +148,43 @@ class QueryNotifyPrint(QueryNotify):
""" """
title = "Checking username" title = "Checking username"
print(Style.BRIGHT + Fore.GREEN + "[" + print(Style.BRIGHT + Fore.GREEN + "[" +
Fore.YELLOW + "*" + Fore.YELLOW + "*" +
Fore.GREEN + f"] {title}" + Fore.GREEN + f"] {title}" +
Fore.WHITE + f" {message}" + Fore.WHITE + f" {message}" +
Fore.GREEN + " on:") Fore.GREEN + " on:")
# An empty line between first line and the result(more clear output)
print('\r')
return return
def finish(self, message="The processing has been finished."):
"""Notify Start.
Will print the last line to the standard output.
Keyword Arguments:
self -- This object.
message -- The last phrase.
Return Value:
Nothing.
"""
title = "End"
print('\r') # An empty line between last line of main output and last line(more clear output)
print(Style.BRIGHT + Fore.GREEN + "[" +
Fore.YELLOW + "!" +
Fore.GREEN + f"] {title}" +
Fore.GREEN + ": " +
Fore.WHITE + f" {message}" )
# An empty line between first line and the result(more clear output)
# return
def update(self, result): def update(self, result):
"""Notify Update. """Notify Update.
@ -176,7 +203,7 @@ class QueryNotifyPrint(QueryNotify):
response_time_text = "" response_time_text = ""
if self.result.query_time is not None and self.verbose == True: if self.result.query_time is not None and self.verbose == True:
response_time_text = f" [{round(self.result.query_time * 1000)}ms]" response_time_text = f" [{round(self.result.query_time * 1000)}ms]"
# Output to the terminal is desired. # Output to the terminal is desired.
if result.status == QueryStatus.CLAIMED: if result.status == QueryStatus.CLAIMED:
print(Style.BRIGHT + Fore.WHITE + "[" + print(Style.BRIGHT + Fore.WHITE + "[" +
@ -217,8 +244,9 @@ class QueryNotifyPrint(QueryNotify):
else: else:
# It should be impossible to ever get here... # It should be impossible to ever get here...
raise ValueError(f"Unknown Query Status '{str(result.status)}' for " raise ValueError(
f"site '{self.result.site_name}'") f"Unknown Query Status '{result.status}' for site '{self.result.site_name}'"
)
return return
@ -231,6 +259,4 @@ class QueryNotifyPrint(QueryNotify):
Return Value: Return Value:
Nicely formatted string to get information about this object. Nicely formatted string to get information about this object.
""" """
result = str(self.result) return str(self.result)
return result

@ -43,6 +43,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Airbit": {
"errorType": "status_code",
"url": "https://airbit.com/{}",
"urlMain": "https://airbit.com/",
"username_claimed": "airbit",
"username_unclaimed": "noonewouldeverusethis7"
},
"Airliners": { "Airliners": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.airliners.net/user/{}/profile/photos", "url": "https://www.airliners.net/user/{}/profile/photos",
@ -158,6 +165,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Autofrage": {
"errorType": "status_code",
"url": "https://www.autofrage.net/nutzer/{}",
"urlMain": "https://www.autofrage.net/",
"username_claimed": "autofrage",
"username_unclaimed": "noonewouldeverusethis7"
},
"Avizo": { "Avizo": {
"errorType": "response_url", "errorType": "response_url",
"errorUrl": "https://www.avizo.cz/", "errorUrl": "https://www.avizo.cz/",
@ -204,6 +218,20 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Bezuzyteczna": {
"errorType": "status_code",
"url": "https://bezuzyteczna.pl/uzytkownicy/{}",
"urlMain": "https://bezuzyteczna.pl",
"username_claimed": "Jackson",
"username_unclaimed": "ktobysietaknazwalnawb69"
},
"Bikemap": {
"errorType": "status_code",
"url": "https://www.bikemap.net/en/u/{}/routes/created/",
"urlMain": "https://www.bikemap.net/",
"username_claimed": "bikemap",
"username_unclaimed": "noonewouldeverusethis7"
},
"BinarySearch": { "BinarySearch": {
"errorMsg": "{}", "errorMsg": "{}",
"errorType": "message", "errorType": "message",
@ -214,6 +242,13 @@
"username_claimed": "Eyes_Wide_Shut", "username_claimed": "Eyes_Wide_Shut",
"username_unclaimed": "hihowareyou101" "username_unclaimed": "hihowareyou101"
}, },
"BioHacking": {
"errorType": "status_code",
"url": "https://forum.dangerousthings.com/u/{}",
"urlMain": "https://forum.dangerousthings.com/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"BitBucket": { "BitBucket": {
"errorType": "status_code", "errorType": "status_code",
"regexCheck": "^[a-zA-Z0-9-_]{1,30}$", "regexCheck": "^[a-zA-Z0-9-_]{1,30}$",
@ -363,6 +398,13 @@
"username_claimed": "green", "username_claimed": "green",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Clubhouse": {
"errorType": "status_code",
"url": "https://www.clubhouse.com/@{}",
"urlMain": "https://www.clubhouse.com",
"username_claimed": "waniathar",
"username_unclaimed": "noonewouldeverusethis7"
},
"Codecademy": { "Codecademy": {
"errorMsg": "This profile could not be found", "errorMsg": "This profile could not be found",
"errorType": "message", "errorType": "message",
@ -379,6 +421,14 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Codeforces": {
"errorType": "response_url",
"errorUrl": "https://codeforces.com/",
"url": "https://codeforces.com/profile/{}",
"urlMain": "https://www.codeforces.com/",
"username_claimed": "tourist",
"username_unclaimed": "noonewouldeverusethis789"
},
"Codepen": { "Codepen": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://codepen.io/{}", "url": "https://codepen.io/{}",
@ -463,6 +513,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Cryptomator Forum": {
"errorType": "status_code",
"url": "https://community.cryptomator.org/u/{}",
"urlMain": "https://community.cryptomator.org/",
"username_claimed": "michael",
"username_unclaimed": "noonewouldeverusethis7"
},
"DEV Community": { "DEV Community": {
"errorType": "status_code", "errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
@ -548,6 +605,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Envato Forum": {
"errorType": "status_code",
"url": "https://forums.envato.com/u/{}",
"urlMain": "https://forums.envato.com/",
"username_claimed": "enabled",
"username_unclaimed": "noonewouldeverusethis7"
},
"Etsy": { "Etsy": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.etsy.com/shop/{}", "url": "https://www.etsy.com/shop/{}",
@ -586,6 +650,13 @@
"username_claimed": "hackerman", "username_claimed": "hackerman",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Fameswap": {
"errorType": "status_code",
"url": "https://fameswap.com/user/{}",
"urlMain": "https://fameswap.com/",
"username_claimed": "fameswap",
"username_unclaimed": "noonewouldeverusethis7"
},
"FanCentro": { "FanCentro": {
"errorMsg": "var environment", "errorMsg": "var environment",
"errorType": "message", "errorType": "message",
@ -601,6 +672,13 @@
"username_claimed": "Jungypoo", "username_claimed": "Jungypoo",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Finanzfrage": {
"errorType": "status_code",
"url": "https://www.finanzfrage.net/nutzer/{}",
"urlMain": "https://www.finanzfrage.net/",
"username_claimed": "finanzfrage",
"username_unclaimed": "noonewouldeverusethis7"
},
"Fiverr": { "Fiverr": {
"errorMsg": "\"status\":\"success\"", "errorMsg": "\"status\":\"success\"",
"errorType": "message", "errorType": "message",
@ -686,6 +764,14 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis" "username_unclaimed": "noonewouldeverusethis"
}, },
"G2G": {
"errorType": "response_url",
"errorUrl": "https://www.g2g.com/{}",
"url": "https://www.g2g.com/{}",
"urlMain": "https://www.g2g.com/",
"username_claimed": "user",
"username_unclaimed": "noonewouldeverusethis7"
},
"GNOME VCS": { "GNOME VCS": {
"errorType": "response_url", "errorType": "response_url",
"errorUrl": "https://gitlab.gnome.org/{}", "errorUrl": "https://gitlab.gnome.org/{}",
@ -695,6 +781,14 @@
"username_claimed": "adam", "username_claimed": "adam",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Gab": {
"errorMsg": "The page you are looking for isn't here.",
"errorType": "message",
"url": "https://gab.com/{}",
"urlMain": "https://gab.com",
"username_claimed": "a",
"username_unclaimed": "noonewouldeverusethis"
},
"GaiaOnline": { "GaiaOnline": {
"errorMsg": "No user ID specified or user does not exist", "errorMsg": "No user ID specified or user does not exist",
"errorType": "message", "errorType": "message",
@ -717,6 +811,27 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis" "username_unclaimed": "noonewouldeverusethis"
}, },
"Genius (Artists)": {
"errorType": "status_code",
"url": "https://genius.com/artists/{}",
"urlMain": "https://genius.com/",
"username_claimed": "genius",
"username_unclaimed": "noonewouldeverusethis7"
},
"Genius (Users)": {
"errorType": "status_code",
"url": "https://genius.com/{}",
"urlMain": "https://genius.com/",
"username_claimed": "genius",
"username_unclaimed": "noonewouldeverusethis7"
},
"Gesundheitsfrage": {
"errorType": "status_code",
"url": "https://www.gesundheitsfrage.net/nutzer/{}",
"urlMain": "https://www.gesundheitsfrage.net/",
"username_claimed": "gutefrage",
"username_unclaimed": "noonewouldeverusethis7"
},
"GetMyUni": { "GetMyUni": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.getmyuni.com/user/{}", "url": "https://www.getmyuni.com/user/{}",
@ -724,6 +839,14 @@
"username_claimed": "Upneet.Grover17", "username_claimed": "Upneet.Grover17",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Ghost": {
"errorMsg": "Domain Error",
"errorType": "message",
"url": "https://{}.ghost.io/",
"urlMain": "https://ghost.org/",
"username_claimed": "troyhunt",
"username_unclaimed": "noonewouldeverusethis7"
},
"Giphy": { "Giphy": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://giphy.com/{}", "url": "https://giphy.com/{}",
@ -731,6 +854,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"GitBook": {
"errorType": "status_code",
"url": "https://{}.gitbook.io/",
"urlMain": "https://gitbook.com/",
"username_claimed": "gitbook",
"username_unclaimed": "noonewouldeverusethis7"
},
"GitHub": { "GitHub": {
"errorType": "status_code", "errorType": "status_code",
"regexCheck": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$", "regexCheck": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$",
@ -778,6 +908,14 @@
"username_claimed": "jetbrains", "username_claimed": "jetbrains",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Grailed": {
"errorType": "response_url",
"errorUrl": "https://www.grailed.com/{}",
"url": "https://www.grailed.com/{}",
"urlMain": "https://www.grailed.com/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"Gravatar": { "Gravatar": {
"errorType": "status_code", "errorType": "status_code",
"regexCheck": "^((?!\\.).)*$", "regexCheck": "^((?!\\.).)*$",
@ -787,7 +925,7 @@
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Gumroad": { "Gumroad": {
"errorMsg": "Page not found.", "errorMsg": "Page not found (404) - Gumroad",
"errorType": "message", "errorType": "message",
"url": "https://www.gumroad.com/{}", "url": "https://www.gumroad.com/{}",
"urlMain": "https://www.gumroad.com/", "urlMain": "https://www.gumroad.com/",
@ -808,6 +946,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Gutefrage": {
"errorType": "status_code",
"url": "https://www.gutefrage.net/nutzer/{}",
"urlMain": "https://www.gutefrage.net/",
"username_claimed": "gutefrage",
"username_unclaimed": "noonewouldeverusethis7"
},
"HEXRPG": { "HEXRPG": {
"errorMsg": "Error : User ", "errorMsg": "Error : User ",
"errorType": "message", "errorType": "message",
@ -934,6 +1079,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Ionic Forum": {
"errorType": "status_code",
"url": "https://forum.ionicframework.com/u/{}",
"urlMain": "https://forum.ionicframework.com/",
"username_claimed": "theblue222",
"username_unclaimed": "noonewouldeverusethis7"
},
"Issuu": { "Issuu": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://issuu.com/{}", "url": "https://issuu.com/{}",
@ -972,6 +1124,20 @@
"username_claimed": "jenny", "username_claimed": "jenny",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Joplin Forum": {
"errorType": "status_code",
"url": "https://discourse.joplinapp.org/u/{}",
"urlMain": "https://discourse.joplinapp.org/",
"username_claimed": "laurent",
"username_unclaimed": "noonewouldeverusethis7"
},
"KEAKR": {
"errorType": "status_code",
"url": "https://www.keakr.com/en/profile/{}",
"urlMain": "https://www.keakr.com/",
"username_claimed": "beats",
"username_unclaimed": "noonewouldeverusethis7"
},
"Kaggle": { "Kaggle": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.kaggle.com/{}", "url": "https://www.kaggle.com/{}",
@ -1025,6 +1191,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"LessWrong": {
"errorType": "status_code",
"url": "https://www.lesswrong.com/users/@{}",
"urlMain": "https://www.lesswrong.com/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7why"
},
"Letterboxd": { "Letterboxd": {
"errorMsg": "Sorry, we can\u2019t find the page you\u2019ve requested.", "errorMsg": "Sorry, we can\u2019t find the page you\u2019ve requested.",
"errorType": "message", "errorType": "message",
@ -1048,6 +1221,14 @@
"username_claimed": "anne", "username_claimed": "anne",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Listed": {
"errorType": "response_url",
"errorUrl": "https://listed.to/@{}",
"url": "https://listed.to/@{}",
"urlMain": "https://listed.to/",
"username_claimed": "listed",
"username_unclaimed": "noonewouldeverusethis7"
},
"LiveJournal": { "LiveJournal": {
"errorType": "status_code", "errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
@ -1072,6 +1253,21 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"LottieFiles": {
"errorType": "status_code",
"url": "https://lottiefiles.com/{}",
"urlMain": "https://lottiefiles.com/",
"username_claimed": "lottiefiles",
"username_unclaimed": "noonewouldeverusethis7"
},
"Mapify": {
"errorType": "response_url",
"errorUrl": "https://mapify.travel/{}",
"url": "https://mapify.travel/{}",
"urlMain": "https://mapify.travel/",
"username_claimed": "mapify",
"username_unclaimed": "noonewouldeverusethis7"
},
"Medium": { "Medium": {
"errorMsg": "<body", "errorMsg": "<body",
"errorType": "message", "errorType": "message",
@ -1088,6 +1284,14 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Minecraft": {
"errorCode": 204,
"errorType": "status_code",
"url": "https://api.mojang.com/users/profiles/minecraft/{}",
"urlMain": "https://minecraft.net/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"MixCloud": { "MixCloud": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.mixcloud.com/{}/", "url": "https://www.mixcloud.com/{}/",
@ -1096,18 +1300,17 @@
"username_claimed": "jenny", "username_claimed": "jenny",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Munzee": { "Motorradfrage": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.munzee.com/m/{}", "url": "https://www.motorradfrage.net/nutzer/{}",
"urlMain": "https://www.munzee.com/", "urlMain": "https://www.motorradfrage.net/",
"username_claimed": "blue", "username_claimed": "gutefrage",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Minecraft": { "Munzee": {
"errorType": "status_code", "errorType": "status_code",
"errorCode": 204, "url": "https://www.munzee.com/m/{}",
"url": "https://api.mojang.com/users/profiles/minecraft/{}", "urlMain": "https://www.munzee.com/",
"urlMain": "https://minecraft.net/",
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
@ -1163,6 +1366,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewould" "username_unclaimed": "noonewould"
}, },
"Needrom": {
"errorType": "status_code",
"url": "https://www.needrom.com/author/{}/",
"urlMain": "https://www.needrom.com/",
"username_claimed": "needrom",
"username_unclaimed": "noonewouldeverusethis7"
},
"Newgrounds": { "Newgrounds": {
"errorType": "status_code", "errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$", "regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
@ -1210,6 +1420,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"OGUsers": {
"errorType": "status_code",
"url": "https://ogusers.com/{}",
"urlMain": "https://ogusers.com/",
"username_claimed": "ogusers",
"username_unclaimed": "noonewouldeverusethis7"
},
"OK": { "OK": {
"errorType": "status_code", "errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_.-]*$", "regexCheck": "^[a-zA-Z][a-zA-Z0-9_.-]*$",
@ -1358,6 +1575,14 @@
"username_claimed": "swiftstickler", "username_claimed": "swiftstickler",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Polymart": {
"errorMsg": "Looks like we couldn't find this user. Sorry!",
"errorType": "message",
"url": "https://polymart.org/user/{}",
"urlMain": "https://polymart.org/",
"username_claimed": "craciu25yt",
"username_unclaimed": "noonewouldeverusethis7"
},
"Pornhub": { "Pornhub": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://pornhub.com/users/{}", "url": "https://pornhub.com/users/{}",
@ -1416,6 +1641,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Rclone Forum": {
"errorType": "status_code",
"url": "https://forum.rclone.org/u/{}",
"urlMain": "https://forum.rclone.org/",
"username_claimed": "ncw",
"username_unclaimed": "noonewouldeverusethis7"
},
"Redbubble": { "Redbubble": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.redbubble.com/people/{}", "url": "https://www.redbubble.com/people/{}",
@ -1434,6 +1666,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Reisefrage": {
"errorType": "status_code",
"url": "https://www.reisefrage.net/nutzer/{}",
"urlMain": "https://www.reisefrage.net/",
"username_claimed": "reisefrage",
"username_unclaimed": "noonewouldeverusethis7"
},
"Replit.com": { "Replit.com": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://replit.com/@{}", "url": "https://replit.com/@{}",
@ -1490,6 +1729,13 @@
"username_claimed": "Blue", "username_claimed": "Blue",
"username_unclaimed": "noonewouldev" "username_unclaimed": "noonewouldev"
}, },
"SWAPD": {
"errorType": "status_code",
"url": "https://swapd.co/u/{}",
"urlMain": "https://swapd.co/",
"username_claimed": "swapd",
"username_unclaimed": "noonewouldeverusethis7"
},
"Sbazar.cz": { "Sbazar.cz": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.sbazar.cz/{}", "url": "https://www.sbazar.cz/{}",
@ -1519,6 +1765,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis" "username_unclaimed": "noonewouldeverusethis"
}, },
"Shpock": {
"errorType": "status_code",
"url": "https://www.shpock.com/shop/{}/items",
"urlMain": "https://www.shpock.com/",
"username_claimed": "user",
"username_unclaimed": "noonewouldeverusethis7"
},
"Signal": { "Signal": {
"errorMsg": "Oops! That page doesn\u2019t exist or is private.", "errorMsg": "Oops! That page doesn\u2019t exist or is private.",
"errorType": "message", "errorType": "message",
@ -1566,7 +1819,8 @@
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Smule": { "Smule": {
"errorType": "status_code", "errorMsg": "Smule | Page Not Found (404)",
"errorType": "message",
"url": "https://www.smule.com/{}", "url": "https://www.smule.com/{}",
"urlMain": "https://www.smule.com/", "urlMain": "https://www.smule.com/",
"username_claimed": "blue", "username_claimed": "blue",
@ -1617,6 +1871,13 @@
"username_claimed": "3Tau", "username_claimed": "3Tau",
"username_unclaimed": "noonewould" "username_unclaimed": "noonewould"
}, },
"Splice": {
"errorType": "status_code",
"url": "https://splice.com/{}",
"urlMain": "https://splice.com/",
"username_claimed": "splice",
"username_unclaimed": "noonewouldeverusethis7"
},
"Splits.io": { "Splits.io": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://splits.io/users/{}", "url": "https://splits.io/users/{}",
@ -1631,6 +1892,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Sportlerfrage": {
"errorType": "status_code",
"url": "https://www.sportlerfrage.net/nutzer/{}",
"urlMain": "https://www.sportlerfrage.net/",
"username_claimed": "sportlerfrage",
"username_unclaimed": "noonewouldeverusethis7"
},
"SportsRU": { "SportsRU": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://www.sports.ru/profile/{}/", "url": "https://www.sports.ru/profile/{}/",
@ -1700,6 +1968,13 @@
"username_claimed": "kevin", "username_claimed": "kevin",
"username_unclaimed": "noonewouldeverusethi" "username_unclaimed": "noonewouldeverusethi"
}, },
"TRAKTRAIN": {
"errorType": "status_code",
"url": "https://traktrain.com/{}",
"urlMain": "https://traktrain.com/",
"username_claimed": "traktrain",
"username_unclaimed": "noonewouldeverusethis7"
},
"Telegram": { "Telegram": {
"errorMsg": "<meta property=\"og:description\" content=\"\">", "errorMsg": "<meta property=\"og:description\" content=\"\">",
"errorType": "message", "errorType": "message",
@ -1724,6 +1999,13 @@
"username_claimed": "red", "username_claimed": "red",
"username_unclaimed": "impossibleusername" "username_unclaimed": "impossibleusername"
}, },
"ThemeForest": {
"errorType": "status_code",
"url": "https://themeforest.net/user/{}",
"urlMain": "https://themeforest.net/",
"username_claimed": "user",
"username_unclaimed": "noonewouldeverusethis7"
},
"TikTok": { "TikTok": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://tiktok.com/@{}", "url": "https://tiktok.com/@{}",
@ -1744,6 +2026,7 @@
}, },
"TradingView": { "TradingView": {
"errorType": "status_code", "errorType": "status_code",
"request_method": "GET",
"url": "https://www.tradingview.com/u/{}/", "url": "https://www.tradingview.com/u/{}/",
"urlMain": "https://www.tradingview.com/", "urlMain": "https://www.tradingview.com/",
"username_claimed": "blue", "username_claimed": "blue",
@ -1994,6 +2277,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"Wykop": {
"errorType": "status_code",
"url": "https://www.wykop.pl/ludzie/{}",
"urlMain": "https://www.wykop.pl",
"username_claimed": "blue",
"username_unclaimed": "bumpewastaken"
},
"Xbox Gamertag": { "Xbox Gamertag": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://xboxgamertag.com/search/{}", "url": "https://xboxgamertag.com/search/{}",
@ -2126,6 +2416,22 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"eBay.com": {
"errorMsg": "The User ID you entered was not found. Please check the User ID and try again.",
"errorType": "message",
"url": "https://www.ebay.com/usr/{}",
"urlMain": "https://www.ebay.com/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"eBay.de": {
"errorMsg": "Der eingegebene Nutzername wurde nicht gefunden. Bitte pr\u00fcfen Sie den Nutzernamen und versuchen Sie es erneut.",
"errorType": "message",
"url": "https://www.ebay.de/usr/{}",
"urlMain": "https://www.ebay.de/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"eGPU": { "eGPU": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://egpu.io/forums/profile/{}/", "url": "https://egpu.io/forums/profile/{}/",
@ -2443,6 +2749,13 @@
"username_claimed": "red", "username_claimed": "red",
"username_unclaimed": "noonewouldeverusethis7" "username_unclaimed": "noonewouldeverusethis7"
}, },
"skyrock": {
"errorType": "status_code",
"url": "https://{}.skyrock.com/",
"urlMain": "https://skyrock.com/",
"username_claimed": "red",
"username_unclaimed": "noonewouldeverusethis7"
},
"social.tchncs.de": { "social.tchncs.de": {
"errorType": "status_code", "errorType": "status_code",
"url": "https://social.tchncs.de/@{}", "url": "https://social.tchncs.de/@{}",
@ -2492,6 +2805,13 @@
"username_claimed": "blue", "username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis77777" "username_unclaimed": "noonewouldeverusethis77777"
}, },
"znanylekarz.pl": {
"errorType": "status_code",
"url": "https://www.znanylekarz.pl/{}",
"urlMain": "https://znanylekarz.pl",
"username_claimed": "janusz-nowak",
"username_unclaimed": "kto-by-sie-tak-nazwal-69"
},
"zoomit": { "zoomit": {
"errorMsg": "\u0645\u062a\u0627\u0633\u0641\u0627\u0646\u0647 \u0635\u0641\u062d\u0647 \u06cc\u0627\u0641\u062a \u0646\u0634\u062f", "errorMsg": "\u0645\u062a\u0627\u0633\u0641\u0627\u0646\u0647 \u0635\u0641\u062d\u0647 \u06cc\u0627\u0641\u062a \u0646\u0634\u062f",
"errorType": "message", "errorType": "message",

@ -22,17 +22,15 @@ from torrequest import TorRequest
from result import QueryStatus from result import QueryStatus
from result import QueryResult from result import QueryResult
from notify import QueryNotifyPrint from notify import QueryNotifyPrint
from sites import SitesInformation from sites import SitesInformation
from colorama import init from colorama import init
module_name = "Sherlock: Find Usernames Across Social Networks" module_name = "Sherlock: Find Usernames Across Social Networks"
__version__ = "0.14.0" __version__ = "0.14.0"
class SherlockFuturesSession(FuturesSession): class SherlockFuturesSession(FuturesSession):
def request(self, method, url, hooks={}, *args, **kwargs): def request(self, method, url, hooks=None, *args, **kwargs):
"""Request URL. """Request URL.
This extends the FuturesSession request method to calculate a response This extends the FuturesSession request method to calculate a response
@ -54,6 +52,8 @@ class SherlockFuturesSession(FuturesSession):
Request object. Request object.
""" """
# Record the start time for the request. # Record the start time for the request.
if hooks is None:
hooks = {}
start = monotonic() start = monotonic()
def response_time(resp, *args, **kwargs): def response_time(resp, *args, **kwargs):
@ -96,12 +96,11 @@ class SherlockFuturesSession(FuturesSession):
def get_response(request_future, error_type, social_network): def get_response(request_future, error_type, social_network):
# Default for Response object if some failure occurs. # Default for Response object if some failure occurs.
response = None response = None
error_context = "General Unknown Error" error_context = "General Unknown Error"
expection_text = None exception_text = None
try: try:
response = request_future.result() response = request_future.result()
if response.status_code: if response.status_code:
@ -109,21 +108,21 @@ def get_response(request_future, error_type, social_network):
error_context = None error_context = None
except requests.exceptions.HTTPError as errh: except requests.exceptions.HTTPError as errh:
error_context = "HTTP Error" error_context = "HTTP Error"
expection_text = str(errh) exception_text = str(errh)
except requests.exceptions.ProxyError as errp: except requests.exceptions.ProxyError as errp:
error_context = "Proxy Error" error_context = "Proxy Error"
expection_text = str(errp) exception_text = str(errp)
except requests.exceptions.ConnectionError as errc: except requests.exceptions.ConnectionError as errc:
error_context = "Error Connecting" error_context = "Error Connecting"
expection_text = str(errc) exception_text = str(errc)
except requests.exceptions.Timeout as errt: except requests.exceptions.Timeout as errt:
error_context = "Timeout Error" error_context = "Timeout Error"
expection_text = str(errt) exception_text = str(errt)
except requests.exceptions.RequestException as err: except requests.exceptions.RequestException as err:
error_context = "Unknown Error" error_context = "Unknown Error"
expection_text = str(err) exception_text = str(err)
return response, error_context, expection_text return response, error_context, exception_text
def interpolate_string(object, username): def interpolate_string(object, username):
@ -191,15 +190,14 @@ def sherlock(username, site_data, query_notify,
# Limit number of workers to 20. # Limit number of workers to 20.
# This is probably vastly overkill. # This is probably vastly overkill.
if len(site_data) >= 20: if len(site_data) >= 20:
max_workers=20 max_workers = 20
else: else:
max_workers=len(site_data) max_workers = len(site_data)
# Create multi-threaded session for all requests. # Create multi-threaded session for all requests.
session = SherlockFuturesSession(max_workers=max_workers, session = SherlockFuturesSession(max_workers=max_workers,
session=underlying_session) session=underlying_session)
# Results from analysis of all sites # Results from analysis of all sites
results_total = {} results_total = {}
@ -207,10 +205,9 @@ def sherlock(username, site_data, query_notify,
for social_network, net_info in site_data.items(): for social_network, net_info in site_data.items():
# Results from analysis of this specific site # Results from analysis of this specific site
results_site = {} results_site = {"url_main": net_info.get("urlMain")}
# Record URL of main site # Record URL of main site
results_site["url_main"] = net_info.get("urlMain")
# A user agent is needed because some sites don't return the correct # A user agent is needed because some sites don't return the correct
# information since they think that we are bots (Which we actually are...) # information since they think that we are bots (Which we actually are...)
@ -228,7 +225,7 @@ def sherlock(username, site_data, query_notify,
# Don't make request if username is invalid for the site # Don't make request if username is invalid for the site
regex_check = net_info.get("regexCheck") regex_check = net_info.get("regexCheck")
if regex_check and re.search(regex_check, username) is None: if regex_check and re.search(regex_check, username) is None:
# No need to do the check at the site: this user name is not allowed. # No need to do the check at the site: this username is not allowed.
results_site["status"] = QueryResult(username, results_site["status"] = QueryResult(username,
social_network, social_network,
url, url,
@ -255,7 +252,7 @@ def sherlock(username, site_data, query_notify,
elif request_method == "PUT": elif request_method == "PUT":
request = session.put request = session.put
else: else:
raise RuntimeError( f"Unsupported request_method for {url}") raise RuntimeError(f"Unsupported request_method for {url}")
if request_payload is not None: if request_payload is not None:
request_payload = interpolate_string(request_payload, username) request_payload = interpolate_string(request_payload, username)
@ -301,10 +298,10 @@ def sherlock(username, site_data, query_notify,
) )
else: else:
future = request(url=url_probe, headers=headers, future = request(url=url_probe, headers=headers,
allow_redirects=allow_redirects, allow_redirects=allow_redirects,
timeout=timeout, timeout=timeout,
json=request_payload json=request_payload
) )
# Store future in data for access later # Store future in data for access later
net_info["request_future"] = future net_info["request_future"] = future
@ -313,7 +310,7 @@ def sherlock(username, site_data, query_notify,
if unique_tor: if unique_tor:
underlying_request.reset_identity() underlying_request.reset_identity()
# Add this site's results into final dictionary with all of the other results. # Add this site's results into final dictionary with all the other results.
results_total[social_network] = results_site results_total[social_network] = results_site
# Open the file containing account links # Open the file containing account links
@ -336,7 +333,7 @@ def sherlock(username, site_data, query_notify,
# Retrieve future and ensure it has finished # Retrieve future and ensure it has finished
future = net_info["request_future"] future = net_info["request_future"]
r, error_text, expection_text = get_response(request_future=future, r, error_text, exception_text = get_response(request_future=future,
error_type=error_type, error_type=error_type,
social_network=social_network) social_network=social_network)
@ -366,13 +363,13 @@ def sherlock(username, site_data, query_notify,
# error_flag True denotes no error found in the HTML # error_flag True denotes no error found in the HTML
# error_flag False denotes error found in the HTML # error_flag False denotes error found in the HTML
error_flag = True error_flag = True
errors=net_info.get("errorMsg") errors = net_info.get("errorMsg")
# errors will hold the error message # errors will hold the error message
# it can be string or list # it can be string or list
# by insinstance method we can detect that # by isinstance method we can detect that
# and handle the case for strings as normal procedure # and handle the case for strings as normal procedure
# and if its list we can iterate the errors # and if its list we can iterate the errors
if isinstance(errors,str): if isinstance(errors, str):
# Checks if the error message is in the HTML # Checks if the error message is in the HTML
# if error is present we will set flag to False # if error is present we will set flag to False
if errors in r.text: if errors in r.text:
@ -411,7 +408,6 @@ def sherlock(username, site_data, query_notify,
raise ValueError(f"Unknown Error Type '{error_type}' for " raise ValueError(f"Unknown Error Type '{error_type}' for "
f"site '{social_network}'") f"site '{social_network}'")
# Notify caller about results of query. # Notify caller about results of query.
result = QueryResult(username=username, result = QueryResult(username=username,
site_name=social_network, site_name=social_network,
@ -458,13 +454,13 @@ def timeout_check(value):
except: except:
raise ArgumentTypeError(f"Timeout '{value}' must be a number.") raise ArgumentTypeError(f"Timeout '{value}' must be a number.")
if timeout <= 0: if timeout <= 0:
raise ArgumentTypeError(f"Timeout '{value}' must be greater than 0.0s.") raise ArgumentTypeError(
f"Timeout '{value}' must be greater than 0.0s.")
return timeout return timeout
def main(): def main():
version_string = f"%(prog)s {__version__}\n" + \
version_string = f"%(prog)s {__version__}\n" + \
f"{requests.__description__}: {requests.__version__}\n" + \ f"{requests.__description__}: {requests.__version__}\n" + \
f"Python: {platform.python_version()}" f"Python: {platform.python_version()}"
@ -472,11 +468,11 @@ def main():
description=f"{module_name} (Version {__version__})" description=f"{module_name} (Version {__version__})"
) )
parser.add_argument("--version", parser.add_argument("--version",
action="version", version=version_string, action="version", version=version_string,
help="Display version information and dependencies." help="Display version information and dependencies."
) )
parser.add_argument("--verbose", "-v", "-d", "--debug", parser.add_argument("--verbose", "-v", "-d", "--debug",
action="store_true", dest="verbose", default=False, action="store_true", dest="verbose", default=False,
help="Display extra debugging information and metrics." help="Display extra debugging information and metrics."
) )
parser.add_argument("--folderoutput", "-fo", dest="folderoutput", parser.add_argument("--folderoutput", "-fo", dest="folderoutput",
@ -492,7 +488,7 @@ def main():
action="store_true", dest="unique_tor", default=False, action="store_true", dest="unique_tor", default=False,
help="Make requests over Tor with new Tor circuit after each request; increases runtime; requires Tor to be installed and in system path.") help="Make requests over Tor with new Tor circuit after each request; increases runtime; requires Tor to be installed and in system path.")
parser.add_argument("--csv", parser.add_argument("--csv",
action="store_true", dest="csv", default=False, action="store_true", dest="csv", default=False,
help="Create Comma-Separated Values (CSV) File." help="Create Comma-Separated Values (CSV) File."
) )
parser.add_argument("--site", parser.add_argument("--site",
@ -514,15 +510,15 @@ def main():
"Default timeout is infinity. " "Default timeout is infinity. "
"A longer timeout will be more likely to get results from slow sites. " "A longer timeout will be more likely to get results from slow sites. "
"On the other hand, this may cause a long delay to gather all results." "On the other hand, this may cause a long delay to gather all results."
) )
parser.add_argument("--print-all", parser.add_argument("--print-all",
action="store_true", dest="print_all", action="store_true", dest="print_all",
help="Output sites where the username was not found." help="Output sites where the username was not found."
) )
parser.add_argument("--print-found", parser.add_argument("--print-found",
action="store_false", dest="print_all", default=False, action="store_false", dest="print_all", default=False,
help="Output sites where the username was found." help="Output sites where the username was found."
) )
parser.add_argument("--no-color", parser.add_argument("--no-color",
action="store_true", dest="no_color", default=False, action="store_true", dest="no_color", default=False,
help="Don't color terminal output" help="Don't color terminal output"
@ -544,7 +540,8 @@ def main():
# Check for newer version of Sherlock. If it exists, let the user know about it # Check for newer version of Sherlock. If it exists, let the user know about it
try: try:
r = requests.get("https://raw.githubusercontent.com/sherlock-project/sherlock/master/sherlock/sherlock.py") r = requests.get(
"https://raw.githubusercontent.com/sherlock-project/sherlock/master/sherlock/sherlock.py")
remote_version = str(re.findall('__version__ = "(.*)"', r.text)[0]) remote_version = str(re.findall('__version__ = "(.*)"', r.text)[0])
local_version = __version__ local_version = __version__
@ -556,7 +553,6 @@ def main():
except Exception as error: except Exception as error:
print(f"A problem occurred while checking for an update: {error}") print(f"A problem occurred while checking for an update: {error}")
# Argument check # Argument check
# TODO regex check on args.proxy # TODO regex check on args.proxy
if args.tor and (args.proxy is not None): if args.tor and (args.proxy is not None):
@ -568,15 +564,16 @@ def main():
if args.tor or args.unique_tor: if args.tor or args.unique_tor:
print("Using Tor to make requests") print("Using Tor to make requests")
print("Warning: some websites might refuse connecting over Tor, so note that using this option might increase connection errors.") print(
"Warning: some websites might refuse connecting over Tor, so note that using this option might increase connection errors.")
if args.no_color: if args.no_color:
# Disable color output. # Disable color output.
init(strip=True, convert=False) init(strip=True, convert=False)
else: else:
# Enable color output. # Enable color output.
init(autoreset=True) init(autoreset=True)
# Check if both output methods are entered as input. # Check if both output methods are entered as input.
if args.output is not None and args.folderoutput is not None: if args.output is not None and args.folderoutput is not None:
print("You can only use one of the output methods.") print("You can only use one of the output methods.")
@ -587,11 +584,11 @@ def main():
print("You can only use --output with a single username") print("You can only use --output with a single username")
sys.exit(1) sys.exit(1)
# Create object with all information about sites we are aware of. # Create object with all information about sites we are aware of.
try: try:
if args.local: if args.local:
sites = SitesInformation(os.path.join(os.path.dirname(__file__), "resources/data.json")) sites = SitesInformation(os.path.join(
os.path.dirname(__file__), "resources/data.json"))
else: else:
sites = SitesInformation(args.json_file) sites = SitesInformation(args.json_file)
except Exception as error: except Exception as error:
@ -601,10 +598,7 @@ def main():
# Create original dictionary from SitesInformation() object. # Create original dictionary from SitesInformation() object.
# Eventually, the rest of the code will be updated to use the new object # Eventually, the rest of the code will be updated to use the new object
# directly, but this will glue the two pieces together. # directly, but this will glue the two pieces together.
site_data_all = {} site_data_all = {site.name: site.information for site in sites}
for site in sites:
site_data_all[site.name] = site.information
if args.site_list is None: if args.site_list is None:
# Not desired to look at a sub-set of sites # Not desired to look at a sub-set of sites
site_data = site_data_all site_data = site_data_all
@ -625,7 +619,8 @@ def main():
site_missing.append(f"'{site}'") site_missing.append(f"'{site}'")
if site_missing: if site_missing:
print(f"Error: Desired sites not found: {', '.join(site_missing)}.") print(
f"Error: Desired sites not found: {', '.join(site_missing)}.")
if not site_data: if not site_data:
sys.exit(1) sys.exit(1)
@ -662,7 +657,8 @@ def main():
if dictionary.get("status").status == QueryStatus.CLAIMED: if dictionary.get("status").status == QueryStatus.CLAIMED:
exists_counter += 1 exists_counter += 1
file.write(dictionary["url_user"] + "\n") file.write(dictionary["url_user"] + "\n")
file.write(f"Total Websites Username Detected On : {exists_counter}\n") file.write(
f"Total Websites Username Detected On : {exists_counter}\n")
if args.csv: if args.csv:
result_file = f"{username}.csv" result_file = f"{username}.csv"

@ -1,18 +1,18 @@
"""Sherlock Sites Information Module """Sherlock Sites Information Module
This module supports storing information about web sites. This module supports storing information about websites.
This is the raw data that will be used to search for usernames. This is the raw data that will be used to search for usernames.
""" """
import json import json
import requests import requests
class SiteInformation(): class SiteInformation:
def __init__(self, name, url_home, url_username_format, username_claimed, def __init__(self, name, url_home, url_username_format, username_claimed,
username_unclaimed, information): username_unclaimed, information):
"""Create Site Information Object. """Create Site Information Object.
Contains information about a specific web site. Contains information about a specific website.
Keyword Arguments: Keyword Arguments:
self -- This object. self -- This object.
@ -27,13 +27,13 @@ class SiteInformation():
indicates that the individual indicates that the individual
usernames would show up under the usernames would show up under the
"https://somesite.com/users/" area of "https://somesite.com/users/" area of
the web site. the website.
username_claimed -- String containing username which is known username_claimed -- String containing username which is known
to be claimed on web site. to be claimed on website.
username_unclaimed -- String containing username which is known username_unclaimed -- String containing username which is known
to be unclaimed on web site. to be unclaimed on website.
information -- Dictionary containing all known information information -- Dictionary containing all known information
about web site. about website.
NOTE: Custom information about how to NOTE: Custom information about how to
actually detect the existence of the actually detect the existence of the
username will be included in this username will be included in this
@ -46,13 +46,13 @@ class SiteInformation():
Nothing. Nothing.
""" """
self.name = name self.name = name
self.url_home = url_home self.url_home = url_home
self.url_username_format = url_username_format self.url_username_format = url_username_format
self.username_claimed = username_claimed self.username_claimed = username_claimed
self.username_unclaimed = username_unclaimed self.username_unclaimed = username_unclaimed
self.information = information self.information = information
return return
@ -65,15 +65,15 @@ class SiteInformation():
Return Value: Return Value:
Nicely formatted string to get information about this object. Nicely formatted string to get information about this object.
""" """
return f"{self.name} ({self.url_home})" return f"{self.name} ({self.url_home})"
class SitesInformation(): class SitesInformation:
def __init__(self, data_file_path=None): def __init__(self, data_file_path=None):
"""Create Sites Information Object. """Create Sites Information Object.
Contains information about all supported web sites. Contains information about all supported websites.
Keyword Arguments: Keyword Arguments:
self -- This object. self -- This object.
@ -106,7 +106,7 @@ class SitesInformation():
if data_file_path is None: if data_file_path is None:
# The default data file is the live data.json which is in the GitHub repo. The reason why we are using # The default data file is the live data.json which is in the GitHub repo. The reason why we are using
# this instead of the local one is so that the user has the most up to date data. This prevents # this instead of the local one is so that the user has the most up-to-date data. This prevents
# users from creating issue about false positives which has already been fixed or having outdated data # users from creating issue about false positives which has already been fixed or having outdated data
data_file_path = "https://raw.githubusercontent.com/sherlock-project/sherlock/master/sherlock/resources/data.json" data_file_path = "https://raw.githubusercontent.com/sherlock-project/sherlock/master/sherlock/resources/data.json"
@ -119,21 +119,21 @@ class SitesInformation():
try: try:
response = requests.get(url=data_file_path) response = requests.get(url=data_file_path)
except Exception as error: except Exception as error:
raise FileNotFoundError(f"Problem while attempting to access " raise FileNotFoundError(
f"data file URL '{data_file_path}': " f"Problem while attempting to access data file URL '{data_file_path}': {error}"
f"{str(error)}" )
)
if response.status_code == 200: if response.status_code != 200:
try:
site_data = response.json()
except Exception as error:
raise ValueError(f"Problem parsing json contents at "
f"'{data_file_path}': {str(error)}."
)
else:
raise FileNotFoundError(f"Bad response while accessing " raise FileNotFoundError(f"Bad response while accessing "
f"data file URL '{data_file_path}'." f"data file URL '{data_file_path}'."
) )
try:
site_data = response.json()
except Exception as error:
raise ValueError(
f"Problem parsing json contents at '{data_file_path}': {error}."
)
else: else:
# Reference is to a file. # Reference is to a file.
try: try:
@ -141,17 +141,18 @@ class SitesInformation():
try: try:
site_data = json.load(file) site_data = json.load(file)
except Exception as error: except Exception as error:
raise ValueError(f"Problem parsing json contents at " raise ValueError(
f"'{data_file_path}': {str(error)}." f"Problem parsing json contents at '{data_file_path}': {error}."
) )
except FileNotFoundError as error:
except FileNotFoundError:
raise FileNotFoundError(f"Problem while attempting to access " raise FileNotFoundError(f"Problem while attempting to access "
f"data file '{data_file_path}'." f"data file '{data_file_path}'."
) )
self.sites = {} self.sites = {}
# Add all of site information from the json file to internal site list. # Add all site information from the json file to internal site list.
for site_name in site_data: for site_name in site_data:
try: try:
@ -162,12 +163,11 @@ class SitesInformation():
site_data[site_name]["username_claimed"], site_data[site_name]["username_claimed"],
site_data[site_name]["username_unclaimed"], site_data[site_name]["username_unclaimed"],
site_data[site_name] site_data[site_name]
) )
except KeyError as error: except KeyError as error:
raise ValueError(f"Problem parsing json contents at " raise ValueError(
f"'{data_file_path}': " f"Problem parsing json contents at '{data_file_path}': Missing attribute {error}."
f"Missing attribute {str(error)}." )
)
return return
@ -181,9 +181,7 @@ class SitesInformation():
List of strings containing names of sites. List of strings containing names of sites.
""" """
site_names = sorted([site.name for site in self], key=str.lower) return sorted([site.name for site in self], key=str.lower)
return site_names
def __iter__(self): def __iter__(self):
"""Iterator For Object. """Iterator For Object.

@ -3,9 +3,10 @@ This module generates the listing of supported sites
which can be found in sites.md which can be found in sites.md
It also organizes all the sites in alphanumeric order It also organizes all the sites in alphanumeric order
""" """
import json import json
pool = list() pool = []
with open("sherlock/resources/data.json", "r", encoding="utf-8") as data_file: with open("sherlock/resources/data.json", "r", encoding="utf-8") as data_file:
data = json.load(data_file) data = json.load(data_file)

@ -1,10 +1,11 @@
## List Of Supported Sites (323 Sites In Total!) ## List Of Supported Sites (368 Sites In Total!)
1. [2Dimensions](https://2Dimensions.com/) 1. [2Dimensions](https://2Dimensions.com/)
1. [3dnews](http://forum.3dnews.ru/) 1. [3dnews](http://forum.3dnews.ru/)
1. [7Cups](https://www.7cups.com/) 1. [7Cups](https://www.7cups.com/)
1. [9GAG](https://www.9gag.com/) 1. [9GAG](https://www.9gag.com/)
1. [About.me](https://about.me/) 1. [About.me](https://about.me/)
1. [Academia.edu](https://www.academia.edu/) 1. [Academia.edu](https://www.academia.edu/)
1. [Airbit](https://airbit.com/)
1. [Airliners](https://www.airliners.net/) 1. [Airliners](https://www.airliners.net/)
1. [Alik.cz](https://www.alik.cz/) 1. [Alik.cz](https://www.alik.cz/)
1. [AllMyLinks](https://allmylinks.com/) 1. [AllMyLinks](https://allmylinks.com/)
@ -19,13 +20,17 @@
1. [AskFM](https://ask.fm/) 1. [AskFM](https://ask.fm/)
1. [Atom Discussions](https://discuss.atom.io) 1. [Atom Discussions](https://discuss.atom.io)
1. [Audiojungle](https://audiojungle.net/) 1. [Audiojungle](https://audiojungle.net/)
1. [Autofrage](https://www.autofrage.net/)
1. [Avizo](https://www.avizo.cz/) 1. [Avizo](https://www.avizo.cz/)
1. [BLIP.fm](https://blip.fm/) 1. [BLIP.fm](https://blip.fm/)
1. [BOOTH](https://booth.pm/) 1. [BOOTH](https://booth.pm/)
1. [Bandcamp](https://www.bandcamp.com/) 1. [Bandcamp](https://www.bandcamp.com/)
1. [Bazar.cz](https://www.bazar.cz/) 1. [Bazar.cz](https://www.bazar.cz/)
1. [Behance](https://www.behance.net/) 1. [Behance](https://www.behance.net/)
1. [Bezuzyteczna](https://bezuzyteczna.pl)
1. [Bikemap](https://www.bikemap.net/)
1. [BinarySearch](https://binarysearch.io/) 1. [BinarySearch](https://binarysearch.io/)
1. [BioHacking](https://forum.dangerousthings.com/)
1. [BitBucket](https://bitbucket.org/) 1. [BitBucket](https://bitbucket.org/)
1. [BitCoinForum](https://bitcoinforum.com) 1. [BitCoinForum](https://bitcoinforum.com)
1. [Bitwarden Forum](https://bitwarden.com/) 1. [Bitwarden Forum](https://bitwarden.com/)
@ -45,8 +50,10 @@
1. [Chess](https://www.chess.com/) 1. [Chess](https://www.chess.com/)
1. [CloudflareCommunity](https://community.cloudflare.com/) 1. [CloudflareCommunity](https://community.cloudflare.com/)
1. [Clozemaster](https://www.clozemaster.com) 1. [Clozemaster](https://www.clozemaster.com)
1. [Clubhouse](https://www.clubhouse.com)
1. [Codecademy](https://www.codecademy.com/) 1. [Codecademy](https://www.codecademy.com/)
1. [Codechef](https://www.codechef.com/) 1. [Codechef](https://www.codechef.com/)
1. [Codeforces](https://www.codeforces.com/)
1. [Codepen](https://codepen.io/) 1. [Codepen](https://codepen.io/)
1. [Codewars](https://www.codewars.com) 1. [Codewars](https://www.codewars.com)
1. [Coil](https://coil.com/) 1. [Coil](https://coil.com/)
@ -57,6 +64,7 @@
1. [Cracked](https://www.cracked.com/) 1. [Cracked](https://www.cracked.com/)
1. [Crevado](https://crevado.com/) 1. [Crevado](https://crevado.com/)
1. [Crowdin](https://crowdin.com/) 1. [Crowdin](https://crowdin.com/)
1. [Cryptomator Forum](https://community.cryptomator.org/)
1. [DEV Community](https://dev.to/) 1. [DEV Community](https://dev.to/)
1. [DailyMotion](https://www.dailymotion.com/) 1. [DailyMotion](https://www.dailymotion.com/)
1. [Designspiration](https://www.designspiration.net/) 1. [Designspiration](https://www.designspiration.net/)
@ -68,14 +76,16 @@
1. [Dribbble](https://dribbble.com/) 1. [Dribbble](https://dribbble.com/)
1. [Duolingo](https://duolingo.com/) 1. [Duolingo](https://duolingo.com/)
1. [Ello](https://ello.co/) 1. [Ello](https://ello.co/)
1. [Envato Forum](https://forums.envato.com/)
1. [Etsy](https://www.etsy.com/) 1. [Etsy](https://www.etsy.com/)
1. [Euw](https://euw.op.gg/) 1. [Euw](https://euw.op.gg/)
1. [EyeEm](https://www.eyeem.com/) 1. [EyeEm](https://www.eyeem.com/)
1. [F3.cool](https://f3.cool/) 1. [F3.cool](https://f3.cool/)
1. [Facebook](https://www.facebook.com/) 1. [Facebook](https://www.facebook.com/)
1. [Facenama](https://facenama.com/) 1. [Fameswap](https://fameswap.com/)
1. [FanCentro](https://fancentro.com/) 1. [FanCentro](https://fancentro.com/)
1. [Fandom](https://www.fandom.com/) 1. [Fandom](https://www.fandom.com/)
1. [Finanzfrage](https://www.finanzfrage.net/)
1. [Fiverr](https://www.fiverr.com/) 1. [Fiverr](https://www.fiverr.com/)
1. [Flickr](https://www.flickr.com/) 1. [Flickr](https://www.flickr.com/)
1. [Flightradar24](https://www.flightradar24.com/) 1. [Flightradar24](https://www.flightradar24.com/)
@ -86,22 +96,31 @@
1. [Freelance.habr](https://freelance.habr.com/) 1. [Freelance.habr](https://freelance.habr.com/)
1. [Freelancer](https://www.freelancer.com/) 1. [Freelancer](https://www.freelancer.com/)
1. [Freesound](https://freesound.org/) 1. [Freesound](https://freesound.org/)
1. [G2G](https://www.g2g.com/)
1. [GNOME VCS](https://gitlab.gnome.org/) 1. [GNOME VCS](https://gitlab.gnome.org/)
1. [Gab](https://gab.com)
1. [GaiaOnline](https://www.gaiaonline.com/) 1. [GaiaOnline](https://www.gaiaonline.com/)
1. [Gam1ng](https://gam1ng.com.br) 1. [Gam1ng](https://gam1ng.com.br)
1. [Gamespot](https://www.gamespot.com/) 1. [Gamespot](https://www.gamespot.com/)
1. [Genius (Artists)](https://genius.com/)
1. [Genius (Users)](https://genius.com/)
1. [Gesundheitsfrage](https://www.gesundheitsfrage.net/)
1. [GetMyUni](https://getmyuni.com/) 1. [GetMyUni](https://getmyuni.com/)
1. [Ghost](https://ghost.org/)
1. [Giphy](https://giphy.com/) 1. [Giphy](https://giphy.com/)
1. [GitBook](https://gitbook.com/)
1. [GitHub](https://www.github.com/) 1. [GitHub](https://www.github.com/)
1. [GitHub Support Community](https://github.community) 1. [GitHub Support Community](https://github.community)
1. [GitLab](https://gitlab.com/) 1. [GitLab](https://gitlab.com/)
1. [Gitee](https://gitee.com/) 1. [Gitee](https://gitee.com/)
1. [GoodReads](https://www.goodreads.com/) 1. [GoodReads](https://www.goodreads.com/)
1. [Gradle](https://gradle.org/) 1. [Gradle](https://gradle.org/)
1. [Grailed](https://www.grailed.com/)
1. [Gravatar](http://en.gravatar.com/) 1. [Gravatar](http://en.gravatar.com/)
1. [Gumroad](https://www.gumroad.com/) 1. [Gumroad](https://www.gumroad.com/)
1. [GunsAndAmmo](https://gunsandammo.com/) 1. [GunsAndAmmo](https://gunsandammo.com/)
1. [GuruShots](https://gurushots.com/) 1. [GuruShots](https://gurushots.com/)
1. [Gutefrage](https://www.gutefrage.net/)
1. [HEXRPG](https://www.hexrpg.com/) 1. [HEXRPG](https://www.hexrpg.com/)
1. [HackTheBox](https://forum.hackthebox.eu/) 1. [HackTheBox](https://forum.hackthebox.eu/)
1. [Hackaday](https://hackaday.io/) 1. [Hackaday](https://hackaday.io/)
@ -118,11 +137,14 @@
1. [Imgur](https://imgur.com/) 1. [Imgur](https://imgur.com/)
1. [Instagram](https://www.instagram.com/) 1. [Instagram](https://www.instagram.com/)
1. [Instructables](https://www.instructables.com/) 1. [Instructables](https://www.instructables.com/)
1. [Ionic Forum](https://forum.ionicframework.com/)
1. [Issuu](https://issuu.com/) 1. [Issuu](https://issuu.com/)
1. [Itch.io](https://itch.io/) 1. [Itch.io](https://itch.io/)
1. [Itemfix](https://www.itemfix.com/) 1. [Itemfix](https://www.itemfix.com/)
1. [Jellyfin Weblate](https://translate.jellyfin.org/) 1. [Jellyfin Weblate](https://translate.jellyfin.org/)
1. [Jimdo](https://jimdosite.com/) 1. [Jimdo](https://jimdosite.com/)
1. [Joplin Forum](https://discourse.joplinapp.org/)
1. [KEAKR](https://www.keakr.com/)
1. [Kaggle](https://www.kaggle.com/) 1. [Kaggle](https://www.kaggle.com/)
1. [Keybase](https://keybase.io/) 1. [Keybase](https://keybase.io/)
1. [Kik](http://kik.me/) 1. [Kik](http://kik.me/)
@ -130,15 +152,21 @@
1. [LOR](https://linux.org.ru/) 1. [LOR](https://linux.org.ru/)
1. [Launchpad](https://launchpad.net/) 1. [Launchpad](https://launchpad.net/)
1. [LeetCode](https://leetcode.com/) 1. [LeetCode](https://leetcode.com/)
1. [LessWrong](https://www.lesswrong.com/)
1. [Letterboxd](https://letterboxd.com/) 1. [Letterboxd](https://letterboxd.com/)
1. [Lichess](https://lichess.org) 1. [Lichess](https://lichess.org)
1. [Linktree](https://linktr.ee/) 1. [Linktree](https://linktr.ee/)
1. [Listed](https://listed.to/)
1. [LiveJournal](https://www.livejournal.com/) 1. [LiveJournal](https://www.livejournal.com/)
1. [Lobsters](https://lobste.rs/) 1. [Lobsters](https://lobste.rs/)
1. [Lolchess](https://lolchess.gg/) 1. [Lolchess](https://lolchess.gg/)
1. [LottieFiles](https://lottiefiles.com/)
1. [Mapify](https://mapify.travel/)
1. [Medium](https://medium.com/) 1. [Medium](https://medium.com/)
1. [Memrise](https://www.memrise.com/) 1. [Memrise](https://www.memrise.com/)
1. [Minecraft](https://minecraft.net/)
1. [MixCloud](https://www.mixcloud.com/) 1. [MixCloud](https://www.mixcloud.com/)
1. [Motorradfrage](https://www.motorradfrage.net/)
1. [Munzee](https://www.munzee.com/) 1. [Munzee](https://www.munzee.com/)
1. [MyAnimeList](https://myanimelist.net/) 1. [MyAnimeList](https://myanimelist.net/)
1. [MyMiniFactory](https://www.myminifactory.com/) 1. [MyMiniFactory](https://www.myminifactory.com/)
@ -147,12 +175,14 @@
1. [NationStates Nation](https://nationstates.net) 1. [NationStates Nation](https://nationstates.net)
1. [NationStates Region](https://nationstates.net) 1. [NationStates Region](https://nationstates.net)
1. [Naver](https://naver.com) 1. [Naver](https://naver.com)
1. [Needrom](https://www.needrom.com/)
1. [Newgrounds](https://newgrounds.com) 1. [Newgrounds](https://newgrounds.com)
1. [Nextcloud Forum](https://nextcloud.com/) 1. [Nextcloud Forum](https://nextcloud.com/)
1. [Nightbot](https://nightbot.tv/) 1. [Nightbot](https://nightbot.tv/)
1. [Ninja Kiwi](https://ninjakiwi.com/) 1. [Ninja Kiwi](https://ninjakiwi.com/)
1. [NotABug.org](https://notabug.org/) 1. [NotABug.org](https://notabug.org/)
1. [Nyaa.si](https://nyaa.si/) 1. [Nyaa.si](https://nyaa.si/)
1. [OGUsers](https://ogusers.com/)
1. [OK](https://ok.ru/) 1. [OK](https://ok.ru/)
1. [OnlyFans](https://onlyfans.com/) 1. [OnlyFans](https://onlyfans.com/)
1. [OpenStreetMap](https://www.openstreetmap.org/) 1. [OpenStreetMap](https://www.openstreetmap.org/)
@ -173,6 +203,7 @@
1. [Pokemon Showdown](https://pokemonshowdown.com) 1. [Pokemon Showdown](https://pokemonshowdown.com)
1. [Polarsteps](https://polarsteps.com/) 1. [Polarsteps](https://polarsteps.com/)
1. [Polygon](https://www.polygon.com/) 1. [Polygon](https://www.polygon.com/)
1. [Polymart](https://polymart.org/)
1. [Pornhub](https://pornhub.com/) 1. [Pornhub](https://pornhub.com/)
1. [ProductHunt](https://www.producthunt.com/) 1. [ProductHunt](https://www.producthunt.com/)
1. [PromoDJ](http://promodj.com/) 1. [PromoDJ](http://promodj.com/)
@ -181,8 +212,10 @@
1. [Raidforums](https://raidforums.com/) 1. [Raidforums](https://raidforums.com/)
1. [Rajce.net](https://www.rajce.idnes.cz/) 1. [Rajce.net](https://www.rajce.idnes.cz/)
1. [Rate Your Music](https://rateyourmusic.com/) 1. [Rate Your Music](https://rateyourmusic.com/)
1. [Rclone Forum](https://forum.rclone.org/)
1. [Redbubble](https://www.redbubble.com/) 1. [Redbubble](https://www.redbubble.com/)
1. [Reddit](https://www.reddit.com/) 1. [Reddit](https://www.reddit.com/)
1. [Reisefrage](https://www.reisefrage.net/)
1. [Replit.com](https://replit.com/) 1. [Replit.com](https://replit.com/)
1. [ResearchGate](https://www.researchgate.net/) 1. [ResearchGate](https://www.researchgate.net/)
1. [ReverbNation](https://www.reverbnation.com/) 1. [ReverbNation](https://www.reverbnation.com/)
@ -190,10 +223,12 @@
1. [RoyalCams](https://royalcams.com) 1. [RoyalCams](https://royalcams.com)
1. [RubyGems](https://rubygems.org/) 1. [RubyGems](https://rubygems.org/)
1. [RuneScape](https://www.runescape.com/) 1. [RuneScape](https://www.runescape.com/)
1. [SWAPD](https://swapd.co/)
1. [Sbazar.cz](https://www.sbazar.cz/) 1. [Sbazar.cz](https://www.sbazar.cz/)
1. [Scratch](https://scratch.mit.edu/) 1. [Scratch](https://scratch.mit.edu/)
1. [Scribd](https://www.scribd.com/) 1. [Scribd](https://www.scribd.com/)
1. [ShitpostBot5000](https://www.shitpostbot.com/) 1. [ShitpostBot5000](https://www.shitpostbot.com/)
1. [Shpock](https://www.shpock.com/)
1. [Signal](https://community.signalusers.org) 1. [Signal](https://community.signalusers.org)
1. [Slack](https://slack.com) 1. [Slack](https://slack.com)
1. [Slant](https://www.slant.co/) 1. [Slant](https://www.slant.co/)
@ -206,8 +241,10 @@
1. [SourceForge](https://sourceforge.net/) 1. [SourceForge](https://sourceforge.net/)
1. [SoylentNews](https://soylentnews.org) 1. [SoylentNews](https://soylentnews.org)
1. [Speedrun.com](https://speedrun.com/) 1. [Speedrun.com](https://speedrun.com/)
1. [Splice](https://splice.com/)
1. [Splits.io](https://splits.io) 1. [Splits.io](https://splits.io)
1. [Sporcle](https://www.sporcle.com/) 1. [Sporcle](https://www.sporcle.com/)
1. [Sportlerfrage](https://www.sportlerfrage.net/)
1. [SportsRU](https://www.sports.ru/) 1. [SportsRU](https://www.sports.ru/)
1. [Spotify](https://open.spotify.com/) 1. [Spotify](https://open.spotify.com/)
1. [Star Citizen](https://robertsspaceindustries.com/) 1. [Star Citizen](https://robertsspaceindustries.com/)
@ -217,9 +254,11 @@
1. [SublimeForum](https://forum.sublimetext.com/) 1. [SublimeForum](https://forum.sublimetext.com/)
1. [TETR.IO](https://tetr.io) 1. [TETR.IO](https://tetr.io)
1. [TLDR Legal](https://tldrlegal.com/) 1. [TLDR Legal](https://tldrlegal.com/)
1. [TRAKTRAIN](https://traktrain.com/)
1. [Telegram](https://t.me/) 1. [Telegram](https://t.me/)
1. [Tellonym.me](https://tellonym.me/) 1. [Tellonym.me](https://tellonym.me/)
1. [Tenor](https://tenor.com/) 1. [Tenor](https://tenor.com/)
1. [ThemeForest](https://themeforest.net/)
1. [TikTok](https://tiktok.com/) 1. [TikTok](https://tiktok.com/)
1. [Tinder](https://tinder.com/) 1. [Tinder](https://tinder.com/)
1. [TradingView](https://www.tradingview.com/) 1. [TradingView](https://www.tradingview.com/)
@ -254,6 +293,7 @@
1. [WordPress](https://wordpress.com) 1. [WordPress](https://wordpress.com)
1. [WordPressOrg](https://wordpress.org/) 1. [WordPressOrg](https://wordpress.org/)
1. [Wordnik](https://www.wordnik.com/) 1. [Wordnik](https://www.wordnik.com/)
1. [Wykop](https://www.wykop.pl)
1. [Xbox Gamertag](https://xboxgamertag.com/) 1. [Xbox Gamertag](https://xboxgamertag.com/)
1. [Xvideos](https://xvideos.com/) 1. [Xvideos](https://xvideos.com/)
1. [YouNow](https://www.younow.com/) 1. [YouNow](https://www.younow.com/)
@ -272,6 +312,8 @@
1. [datingRU](http://dating.ru) 1. [datingRU](http://dating.ru)
1. [devRant](https://devrant.com/) 1. [devRant](https://devrant.com/)
1. [drive2](https://www.drive2.ru/) 1. [drive2](https://www.drive2.ru/)
1. [eBay.com](https://www.ebay.com/)
1. [eBay.de](https://www.ebay.de/)
1. [eGPU](https://egpu.io/) 1. [eGPU](https://egpu.io/)
1. [eintracht](https://eintracht.de) 1. [eintracht](https://eintracht.de)
1. [fixya](https://www.fixya.com) 1. [fixya](https://www.fixya.com)
@ -315,6 +357,7 @@
1. [prog.hu](https://prog.hu/) 1. [prog.hu](https://prog.hu/)
1. [radio_echo_msk](https://echo.msk.ru/) 1. [radio_echo_msk](https://echo.msk.ru/)
1. [satsisRU](https://satsis.info/) 1. [satsisRU](https://satsis.info/)
1. [skyrock](https://skyrock.com/)
1. [social.tchncs.de](https://social.tchncs.de/) 1. [social.tchncs.de](https://social.tchncs.de/)
1. [spletnik](https://spletnik.ru/) 1. [spletnik](https://spletnik.ru/)
1. [svidbook](https://www.svidbook.ru/) 1. [svidbook](https://www.svidbook.ru/)
@ -322,4 +365,5 @@
1. [uid](https://uid.me/) 1. [uid](https://uid.me/)
1. [wiki.vg](https://wiki.vg/) 1. [wiki.vg](https://wiki.vg/)
1. [xHamster](https://xhamster.com) 1. [xHamster](https://xhamster.com)
1. [znanylekarz.pl](https://znanylekarz.pl)
1. [zoomit](https://www.zoomit.ir) 1. [zoomit](https://www.zoomit.ir)

Loading…
Cancel
Save