Merge branch 'master' into add_feature

This commit is contained in:
aristosgi 2022-04-13 12:20:07 +03:00 committed by GitHub
commit 89c0ae232f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 518 additions and 180 deletions

View file

@ -161,7 +161,6 @@ Here are some things we would appreciate your help on:
- 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
[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.

View file

@ -519,14 +519,6 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://gdprofiles.com/{}",

View file

@ -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
As of 2021-06-27, GDProfiles takes way too long to respond. Must be an issue on their side.

View file

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

View file

@ -11,18 +11,10 @@ import sys
if __name__ == "__main__":
# Checking if the user is using the correct version of Python
# Reference:
# If Python version is 3.6.5
# major --^
# minor ----^
# micro ------^
major = sys.version_info[0]
minor = sys.version_info[1]
# Check if the user is using the correct version of Python
python_version = sys.version.split()[0]
python_version = str(sys.version_info[0])+"."+str(sys.version_info[1])+"."+str(sys.version_info[2])
if major != 3 or major == 3 and minor < 6:
if sys.version_info < (3, 6):
print("Sherlock requires Python 3.6+\nYou are using Python %s, which is not supported by Sherlock" % (python_version))
sys.exit(1)

View file

@ -33,7 +33,7 @@ class QueryNotify:
self.result = result
return
# return
def start(self, message=None):
"""Notify Start.
@ -52,7 +52,7 @@ class QueryNotify:
Nothing.
"""
return
# return
def update(self, result):
"""Notify Update.
@ -71,7 +71,7 @@ class QueryNotify:
self.result = result
return
# return
def finish(self, message=None):
"""Notify Finish.
@ -90,7 +90,7 @@ class QueryNotify:
Nothing.
"""
return
# return
def __str__(self):
"""Convert Object To String.
@ -101,9 +101,7 @@ class QueryNotify:
Return Value:
Nicely formatted string to get information about this object.
"""
result = str(self.result)
return result
return str(self.result)
class QueryNotifyPrint(QueryNotify):
@ -150,14 +148,43 @@ class QueryNotifyPrint(QueryNotify):
"""
title = "Checking username"
print(Style.BRIGHT + Fore.GREEN + "[" +
Fore.YELLOW + "*" +
Fore.GREEN + f"] {title}" +
Fore.WHITE + f" {message}" +
Fore.GREEN + " on:")
# An empty line between first line and the result(more clear output)
print('\r')
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):
"""Notify Update.
@ -173,11 +200,10 @@ class QueryNotifyPrint(QueryNotify):
"""
self.result = result
if self.verbose == False or self.result.query_time is None:
response_time_text = ""
else:
response_time_text = f" [{round(self.result.query_time * 1000)} ms]"
response_time_text = ""
if self.result.query_time is not None and self.verbose == True:
response_time_text = f" [{round(self.result.query_time * 1000)}ms]"
# Output to the terminal is desired.
if result.status == QueryStatus.CLAIMED:
print(Style.BRIGHT + Fore.WHITE + "[" +
@ -218,8 +244,9 @@ class QueryNotifyPrint(QueryNotify):
else:
# It should be impossible to ever get here...
raise ValueError(f"Unknown Query Status '{str(result.status)}' for "
f"site '{self.result.site_name}'")
raise ValueError(
f"Unknown Query Status '{result.status}' for site '{self.result.site_name}'"
)
return
@ -255,6 +282,4 @@ class QueryNotifyPrint(QueryNotify):
Return Value:
Nicely formatted string to get information about this object.
"""
result = str(self.result)
return result
return str(self.result)

View file

@ -43,6 +43,13 @@
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"Airbit": {
"errorType": "status_code",
"url": "https://airbit.com/{}",
"urlMain": "https://airbit.com/",
"username_claimed": "airbit",
"username_unclaimed": "noonewouldeverusethis7"
},
"Airliners": {
"errorType": "status_code",
"url": "https://www.airliners.net/user/{}/profile/photos",
@ -158,6 +165,13 @@
"username_claimed": "blue",
"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": {
"errorType": "response_url",
"errorUrl": "https://www.avizo.cz/",
@ -204,6 +218,20 @@
"username_claimed": "blue",
"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": {
"errorMsg": "{}",
"errorType": "message",
@ -214,6 +242,13 @@
"username_claimed": "Eyes_Wide_Shut",
"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": {
"errorType": "status_code",
"regexCheck": "^[a-zA-Z0-9-_]{1,30}$",
@ -268,6 +303,13 @@
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis"
},
"BraveCommunity": {
"errorType": "status_code",
"url": "https://community.brave.com/u/{}/",
"urlMain": "https://community.brave.com/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis"
},
"BuyMeACoffee": {
"errorType": "status_code",
"url": "https://buymeacoff.ee/{}",
@ -363,6 +405,13 @@
"username_claimed": "green",
"username_unclaimed": "noonewouldeverusethis7"
},
"Clubhouse": {
"errorType": "status_code",
"url": "https://www.clubhouse.com/@{}",
"urlMain": "https://www.clubhouse.com",
"username_claimed": "waniathar",
"username_unclaimed": "noonewouldeverusethis7"
},
"Codecademy": {
"errorMsg": "This profile could not be found",
"errorType": "message",
@ -379,6 +428,14 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://codepen.io/{}",
@ -463,6 +520,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
@ -548,6 +612,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://www.etsy.com/shop/{}",
@ -586,6 +657,13 @@
"username_claimed": "hackerman",
"username_unclaimed": "noonewouldeverusethis7"
},
"Fameswap": {
"errorType": "status_code",
"url": "https://fameswap.com/user/{}",
"urlMain": "https://fameswap.com/",
"username_claimed": "fameswap",
"username_unclaimed": "noonewouldeverusethis7"
},
"FanCentro": {
"errorMsg": "var environment",
"errorType": "message",
@ -601,6 +679,13 @@
"username_claimed": "Jungypoo",
"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": {
"errorMsg": "\"status\":\"success\"",
"errorType": "message",
@ -686,6 +771,14 @@
"username_claimed": "blue",
"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": {
"errorType": "response_url",
"errorUrl": "https://gitlab.gnome.org/{}",
@ -695,6 +788,14 @@
"username_claimed": "adam",
"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": {
"errorMsg": "No user ID specified or user does not exist",
"errorType": "message",
@ -717,6 +818,27 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://www.getmyuni.com/user/{}",
@ -724,6 +846,14 @@
"username_claimed": "Upneet.Grover17",
"username_unclaimed": "noonewouldeverusethis7"
},
"Ghost": {
"errorMsg": "Domain Error",
"errorType": "message",
"url": "https://{}.ghost.io/",
"urlMain": "https://ghost.org/",
"username_claimed": "troyhunt",
"username_unclaimed": "noonewouldeverusethis7"
},
"Giphy": {
"errorType": "status_code",
"url": "https://giphy.com/{}",
@ -731,6 +861,13 @@
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"GitBook": {
"errorType": "status_code",
"url": "https://{}.gitbook.io/",
"urlMain": "https://gitbook.com/",
"username_claimed": "gitbook",
"username_unclaimed": "noonewouldeverusethis7"
},
"GitHub": {
"errorType": "status_code",
"regexCheck": "^[a-zA-Z0-9](?:[a-zA-Z0-9]|-(?=[a-zA-Z0-9])){0,38}$",
@ -778,6 +915,14 @@
"username_claimed": "jetbrains",
"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": {
"errorType": "status_code",
"regexCheck": "^((?!\\.).)*$",
@ -787,7 +932,7 @@
"username_unclaimed": "noonewouldeverusethis7"
},
"Gumroad": {
"errorMsg": "Page not found.",
"errorMsg": "Page not found (404) - Gumroad",
"errorType": "message",
"url": "https://www.gumroad.com/{}",
"urlMain": "https://www.gumroad.com/",
@ -808,6 +953,13 @@
"username_claimed": "blue",
"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": {
"errorMsg": "Error : User ",
"errorType": "message",
@ -934,6 +1086,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://issuu.com/{}",
@ -972,6 +1131,20 @@
"username_claimed": "jenny",
"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": {
"errorType": "status_code",
"url": "https://www.kaggle.com/{}",
@ -1025,6 +1198,13 @@
"username_claimed": "blue",
"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": {
"errorMsg": "Sorry, we can\u2019t find the page you\u2019ve requested.",
"errorType": "message",
@ -1048,6 +1228,14 @@
"username_claimed": "anne",
"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": {
"errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
@ -1072,6 +1260,21 @@
"username_claimed": "blue",
"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": {
"errorMsg": "<body",
"errorType": "message",
@ -1088,6 +1291,14 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://www.mixcloud.com/{}/",
@ -1096,6 +1307,13 @@
"username_claimed": "jenny",
"username_unclaimed": "noonewouldeverusethis7"
},
"Motorradfrage": {
"errorType": "status_code",
"url": "https://www.motorradfrage.net/nutzer/{}",
"urlMain": "https://www.motorradfrage.net/",
"username_claimed": "gutefrage",
"username_unclaimed": "noonewouldeverusethis7"
},
"Munzee": {
"errorType": "status_code",
"url": "https://www.munzee.com/m/{}",
@ -1103,14 +1321,6 @@
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"Minecraft": {
"errorType": "status_code",
"errorCode": 204,
"url": "https://api.mojang.com/users/profiles/minecraft/{}",
"urlMain": "https://minecraft.net/",
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"MyAnimeList": {
"errorType": "status_code",
"url": "https://myanimelist.net/profile/{}",
@ -1163,6 +1373,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_-]*$",
@ -1210,6 +1427,13 @@
"username_claimed": "blue",
"username_unclaimed": "noonewouldeverusethis7"
},
"OGUsers": {
"errorType": "status_code",
"url": "https://ogusers.com/{}",
"urlMain": "https://ogusers.com/",
"username_claimed": "ogusers",
"username_unclaimed": "noonewouldeverusethis7"
},
"OK": {
"errorType": "status_code",
"regexCheck": "^[a-zA-Z][a-zA-Z0-9_.-]*$",
@ -1358,6 +1582,14 @@
"username_claimed": "swiftstickler",
"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": {
"errorType": "status_code",
"url": "https://pornhub.com/users/{}",
@ -1416,6 +1648,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://www.redbubble.com/people/{}",
@ -1434,6 +1673,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://replit.com/@{}",
@ -1490,6 +1736,13 @@
"username_claimed": "Blue",
"username_unclaimed": "noonewouldev"
},
"SWAPD": {
"errorType": "status_code",
"url": "https://swapd.co/u/{}",
"urlMain": "https://swapd.co/",
"username_claimed": "swapd",
"username_unclaimed": "noonewouldeverusethis7"
},
"Sbazar.cz": {
"errorType": "status_code",
"url": "https://www.sbazar.cz/{}",
@ -1519,6 +1772,13 @@
"username_claimed": "blue",
"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": {
"errorMsg": "Oops! That page doesn\u2019t exist or is private.",
"errorType": "message",
@ -1566,7 +1826,8 @@
"username_unclaimed": "noonewouldeverusethis7"
},
"Smule": {
"errorType": "status_code",
"errorMsg": "Smule | Page Not Found (404)",
"errorType": "message",
"url": "https://www.smule.com/{}",
"urlMain": "https://www.smule.com/",
"username_claimed": "blue",
@ -1617,6 +1878,13 @@
"username_claimed": "3Tau",
"username_unclaimed": "noonewould"
},
"Splice": {
"errorType": "status_code",
"url": "https://splice.com/{}",
"urlMain": "https://splice.com/",
"username_claimed": "splice",
"username_unclaimed": "noonewouldeverusethis7"
},
"Splits.io": {
"errorType": "status_code",
"url": "https://splits.io/users/{}",
@ -1631,6 +1899,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://www.sports.ru/profile/{}/",
@ -1700,6 +1975,13 @@
"username_claimed": "kevin",
"username_unclaimed": "noonewouldeverusethi"
},
"TRAKTRAIN": {
"errorType": "status_code",
"url": "https://traktrain.com/{}",
"urlMain": "https://traktrain.com/",
"username_claimed": "traktrain",
"username_unclaimed": "noonewouldeverusethis7"
},
"Telegram": {
"errorMsg": "<meta property=\"og:description\" content=\"\">",
"errorType": "message",
@ -1724,6 +2006,13 @@
"username_claimed": "red",
"username_unclaimed": "impossibleusername"
},
"ThemeForest": {
"errorType": "status_code",
"url": "https://themeforest.net/user/{}",
"urlMain": "https://themeforest.net/",
"username_claimed": "user",
"username_unclaimed": "noonewouldeverusethis7"
},
"TikTok": {
"errorType": "status_code",
"url": "https://tiktok.com/@{}",
@ -1744,6 +2033,7 @@
},
"TradingView": {
"errorType": "status_code",
"request_method": "GET",
"url": "https://www.tradingview.com/u/{}/",
"urlMain": "https://www.tradingview.com/",
"username_claimed": "blue",
@ -1994,6 +2284,13 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://xboxgamertag.com/search/{}",
@ -2126,6 +2423,22 @@
"username_claimed": "blue",
"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": {
"errorType": "status_code",
"url": "https://egpu.io/forums/profile/{}/",
@ -2443,6 +2756,13 @@
"username_claimed": "red",
"username_unclaimed": "noonewouldeverusethis7"
},
"skyrock": {
"errorType": "status_code",
"url": "https://{}.skyrock.com/",
"urlMain": "https://skyrock.com/",
"username_claimed": "red",
"username_unclaimed": "noonewouldeverusethis7"
},
"social.tchncs.de": {
"errorType": "status_code",
"url": "https://social.tchncs.de/@{}",
@ -2492,6 +2812,13 @@
"username_claimed": "blue",
"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": {
"errorMsg": "\u0645\u062a\u0627\u0633\u0641\u0627\u0646\u0647 \u0635\u0641\u062d\u0647 \u06cc\u0627\u0641\u062a \u0646\u0634\u062f",
"errorType": "message",

View file

@ -30,7 +30,7 @@ __version__ = "0.14.0"
class SherlockFuturesSession(FuturesSession):
def request(self, method, url, hooks={}, *args, **kwargs):
def request(self, method, url, hooks=None, *args, **kwargs):
"""Request URL.
This extends the FuturesSession request method to calculate a response
@ -52,6 +52,8 @@ class SherlockFuturesSession(FuturesSession):
Request object.
"""
# Record the start time for the request.
if hooks is None:
hooks = {}
start = monotonic()
def response_time(resp, *args, **kwargs):
@ -94,12 +96,11 @@ class SherlockFuturesSession(FuturesSession):
def get_response(request_future, error_type, social_network):
# Default for Response object if some failure occurs.
response = None
error_context = "General Unknown Error"
expection_text = None
exception_text = None
try:
response = request_future.result()
if response.status_code:
@ -107,21 +108,21 @@ def get_response(request_future, error_type, social_network):
error_context = None
except requests.exceptions.HTTPError as errh:
error_context = "HTTP Error"
expection_text = str(errh)
exception_text = str(errh)
except requests.exceptions.ProxyError as errp:
error_context = "Proxy Error"
expection_text = str(errp)
exception_text = str(errp)
except requests.exceptions.ConnectionError as errc:
error_context = "Error Connecting"
expection_text = str(errc)
exception_text = str(errc)
except requests.exceptions.Timeout as errt:
error_context = "Timeout Error"
expection_text = str(errt)
exception_text = str(errt)
except requests.exceptions.RequestException as err:
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):
@ -222,10 +223,9 @@ def sherlock(username, site_data, query_notify,
for social_network, net_info in site_data.items():
# Results from analysis of this specific site
results_site = {}
results_site = {"url_main": net_info.get("urlMain")}
# 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
# information since they think that we are bots (Which we actually are...)
@ -243,7 +243,7 @@ def sherlock(username, site_data, query_notify,
# Don't make request if username is invalid for the site
regex_check = net_info.get("regexCheck")
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,
social_network,
url,
@ -328,7 +328,7 @@ def sherlock(username, site_data, query_notify,
if unique_tor:
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
# Open the file containing account links
@ -351,7 +351,7 @@ def sherlock(username, site_data, query_notify,
# Retrieve future and ensure it has finished
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,
social_network=social_network)
@ -371,13 +371,12 @@ def sherlock(username, site_data, query_notify,
except:
response_text = ""
query_status = QueryStatus.UNKNOWN
error_context = None
if error_text is not None:
result = QueryResult(username,
social_network,
url,
QueryStatus.UNKNOWN,
query_time=response_time,
context=error_text)
error_context = error_text
elif error_type == "message":
# error_flag True denotes no error found in the HTML
# error_flag False denotes error found in the HTML
@ -385,7 +384,7 @@ def sherlock(username, site_data, query_notify,
errors = net_info.get("errorMsg")
# errors will hold the error message
# 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 if its list we can iterate the errors
if isinstance(errors, str):
@ -400,38 +399,18 @@ def sherlock(username, site_data, query_notify,
error_flag = False
break
if error_flag:
result = QueryResult(username,
social_network,
url,
QueryStatus.CLAIMED,
query_time=response_time)
query_status = QueryStatus.CLAIMED
else:
result = QueryResult(username,
social_network,
url,
QueryStatus.AVAILABLE,
query_time=response_time)
query_status = QueryStatus.AVAILABLE
elif error_type == "status_code":
# Checks if the Status Code is equal to the optional "errorCode" given in 'data.json'
if error_code == r.status_code:
result = QueryResult(username,
social_network,
url,
QueryStatus.AVAILABLE,
query_time=response_time)
query_status = QueryStatus.AVAILABLE
# Checks if the status code of the response is 2XX
elif not r.status_code >= 300 or r.status_code < 200:
result = QueryResult(username,
social_network,
url,
QueryStatus.CLAIMED,
query_time=response_time)
query_status = QueryStatus.CLAIMED
else:
result = QueryResult(username,
social_network,
url,
QueryStatus.AVAILABLE,
query_time=response_time)
query_status = QueryStatus.AVAILABLE
elif error_type == "response_url":
# For this detection method, we have turned off the redirect.
# So, there is no need to check the response URL: it will always
@ -439,23 +418,21 @@ def sherlock(username, site_data, query_notify,
# code indicates that the request was successful (i.e. no 404, or
# forward to some odd redirect).
if 200 <= r.status_code < 300:
result = QueryResult(username,
social_network,
url,
QueryStatus.CLAIMED,
query_time=response_time)
query_status = QueryStatus.CLAIMED
else:
result = QueryResult(username,
social_network,
url,
QueryStatus.AVAILABLE,
query_time=response_time)
query_status = QueryStatus.AVAILABLE
else:
# It should be impossible to ever get here...
raise ValueError(f"Unknown Error Type '{error_type}' for "
f"site '{social_network}'")
# Notify caller about results of query.
result = QueryResult(username=username,
site_name=social_network,
site_url_user=url,
status=query_status,
query_time=response_time,
context=error_context)
query_notify.update(result)
# Save status of request
@ -498,8 +475,7 @@ def timeout_check(value):
def main():
version_string = f"%(prog)s {__version__}\n" + \
version_string = f"%(prog)s {__version__}\n" + \
f"{requests.__description__}: {requests.__version__}\n" + \
f"Python: {platform.python_version()}"
@ -507,11 +483,11 @@ def main():
description=f"{module_name} (Version {__version__})"
)
parser.add_argument("--version",
action="version", version=version_string,
action="version", version=version_string,
help="Display version information and dependencies."
)
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."
)
parser.add_argument("--folderoutput", "-fo", dest="folderoutput",
@ -527,7 +503,7 @@ def main():
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.")
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."
)
parser.add_argument("--site",
@ -603,7 +579,9 @@ def main():
if args.tor or args.unique_tor:
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:
# Disable color output.
@ -636,10 +614,7 @@ def main():
# Create original dictionary from SitesInformation() object.
# Eventually, the rest of the code will be updated to use the new object
# directly, but this will glue the two pieces together.
site_data_all = {}
for site in sites:
site_data_all[site.name] = site.information
site_data_all = {site.name: site.information for site in sites}
if args.site_list is None:
# Not desired to look at a sub-set of sites
site_data = site_data_all

View file

@ -1,21 +1,17 @@
"""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.
"""
import os
import json
import operator
import requests
import sys
class SiteInformation():
class SiteInformation:
def __init__(self, name, url_home, url_username_format, username_claimed,
username_unclaimed, information):
"""Create Site Information Object.
Contains information about a specific web site.
Contains information about a specific website.
Keyword Arguments:
self -- This object.
@ -30,13 +26,13 @@ class SiteInformation():
indicates that the individual
usernames would show up under the
"https://somesite.com/users/" area of
the web site.
the website.
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
to be unclaimed on web site.
to be unclaimed on website.
information -- Dictionary containing all known information
about web site.
about website.
NOTE: Custom information about how to
actually detect the existence of the
username will be included in this
@ -49,13 +45,13 @@ class SiteInformation():
Nothing.
"""
self.name = name
self.url_home = url_home
self.name = name
self.url_home = url_home
self.url_username_format = url_username_format
self.username_claimed = username_claimed
self.username_unclaimed = username_unclaimed
self.information = information
self.username_claimed = username_claimed
self.username_unclaimed = username_unclaimed
self.information = information
return
@ -68,15 +64,15 @@ class SiteInformation():
Return Value:
Nicely formatted string to get information about this object.
"""
return f"{self.name} ({self.url_home})"
class SitesInformation():
class SitesInformation:
def __init__(self, data_file_path=None):
"""Create Sites Information Object.
Contains information about all supported web sites.
Contains information about all supported websites.
Keyword Arguments:
self -- This object.
@ -107,9 +103,9 @@ class SitesInformation():
Nothing.
"""
if data_file_path is None:
if not data_file_path:
# 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
data_file_path = "https://raw.githubusercontent.com/sherlock-project/sherlock/master/sherlock/resources/data.json"
@ -117,26 +113,27 @@ class SitesInformation():
if not data_file_path.lower().endswith(".json"):
raise FileNotFoundError(f"Incorrect JSON file extension for data file '{data_file_path}'.")
if "http://" == data_file_path[:7].lower() or "https://" == data_file_path[:8].lower():
# if "http://" == data_file_path[:7].lower() or "https://" == data_file_path[:8].lower():
if data_file_path.lower().startswith("http"):
# Reference is to a URL.
try:
response = requests.get(url=data_file_path)
except Exception as error:
raise FileNotFoundError(f"Problem while attempting to access "
f"data file URL '{data_file_path}': "
f"{str(error)}"
)
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"Problem while attempting to access data file URL '{data_file_path}': {error}"
)
if response.status_code != 200:
raise FileNotFoundError(f"Bad response while accessing "
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:
# Reference is to a file.
try:
@ -144,17 +141,18 @@ class SitesInformation():
try:
site_data = json.load(file)
except Exception as error:
raise ValueError(f"Problem parsing json contents at "
f"'{data_file_path}': {str(error)}."
)
except FileNotFoundError as error:
raise ValueError(
f"Problem parsing json contents at '{data_file_path}': {error}."
)
except FileNotFoundError:
raise FileNotFoundError(f"Problem while attempting to access "
f"data file '{data_file_path}'."
)
)
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:
try:
@ -165,12 +163,11 @@ class SitesInformation():
site_data[site_name]["username_claimed"],
site_data[site_name]["username_unclaimed"],
site_data[site_name]
)
)
except KeyError as error:
raise ValueError(f"Problem parsing json contents at "
f"'{data_file_path}': "
f"Missing attribute {str(error)}."
)
raise ValueError(
f"Problem parsing json contents at '{data_file_path}': Missing attribute {error}."
)
return
@ -184,9 +181,7 @@ class SitesInformation():
List of strings containing names of sites.
"""
site_names = sorted([site.name for site in self], key=str.lower)
return site_names
return sorted([site.name for site in self], key=str.lower)
def __iter__(self):
"""Iterator For Object.

View file

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

View file

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