Commit d52e3c16 authored by Your Name's avatar Your Name

First Commit?

parent af5cab34
......@@ -22,7 +22,7 @@ Icon?
Thumbs.db
# Babel ES6 compiles files
dist
# dist
# Documentation build
doc/build
......
web: gunicorn backend:run --log-file -
\ No newline at end of file
......@@ -494,6 +494,47 @@ def print_session_info(sessions):
text += "\n%6d %5d %9d %5d" % (int(session.locked), session.limit, session.remaining, session.reset - int(time.time()))
return text
# @routes.get("/")
# async def index(request):
# return web.FileResponse(os.path.join("dist", "index.html"))
# @routes.get("/css/{path}")
# async def css(request):
# return web.FileResponse(os.path.join("dist", "css", request.match_info['path']))
# @routes.get("/js/{path}")
# async def js(request):
# return web.FileResponse(os.path.join("dist", "js", request.match_info['path']))
# @routes.get("/img/{path}")
# async def img(request):
# return web.FileResponse(os.path.join("dist", "img", request.match_info['path']))
# @routes.get("/favicon/{path}")
# async def favicon(request):
# return web.FileResponse(os.path.join("dist", "favicon", request.match_info['path']))
# @routes.get("/i18n/{path}")
# async def i18n(request):
# return web.FileResponse(os.path.join("dist", "i18n", request.match_info['path']))
# @routes.get("/favicon.png")
# async def faviconpng(request):
# return web.FileResponse(os.path.join("dist", "favicon.png"))
# @routes.get("/manifest.json")
# async def manifest(request):
# return web.FileResponse(os.path.join("dist", "manifest.json"))
# @routes.get("/index.html")
# async def indexhtml(request):
# return web.FileResponse(os.path.join("dist", "index.html"))
# @routes.get("/worker.js")
# async def static(request):
# return web.FileResponse(os.path.join("dist", "worker.js"))
@routes.get('/.stats')
async def stats(request):
text = "--- GUEST SESSIONS ---\n\nLocked Limit Remaining Reset"
......@@ -557,14 +598,14 @@ parser.add_argument('--cookie-dir', type=str, default=None, help='directory for
parser.add_argument('--log', type=str, default=None, help='log file where test results are written to')
parser.add_argument('--daemon', action='store_true', help='run in background')
parser.add_argument('--debug', type=str, default=None, help='debug log file')
parser.add_argument('--port', type=int, default=8080, help='port which to listen on')
parser.add_argument('--host', type=str, default='127.0.0.1', help='hostname/ip which to listen on')
parser.add_argument('--port', type=int, default=8000, help='port which to listen on')
parser.add_argument('--host', type=str, default='0.0.0.0', help='hostname/ip which to listen on')
parser.add_argument('--mongo-host', type=str, default=None, help='hostname or IP of mongoDB service to connect to')
parser.add_argument('--mongo-port', type=int, default=27017, help='port of mongoDB service to connect to')
parser.add_argument('--mongo-db', type=str, default='tester', help='name of mongo database to use')
parser.add_argument('--twitter-auth-key', type=str, default=TWITTER_AUTH_KEY, help='auth key for twitter guest session')
parser.add_argument('--cors-allow', type=str, default=None, help='value for Access-Control-Allow-Origin header')
args = parser.parse_args()
args , undefined= parser.parse_known_args()
TwitterSession.twitter_auth_key = args.twitter_auth_key
......@@ -607,6 +648,7 @@ def run():
app = web.Application()
app.add_routes(routes)
web.run_app(app, host=args.host, port=args.port)
return app
if args.daemon:
with daemon.DaemonContext():
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
{
"buttons": {
"check": "Check",
"support": "Support Us",
"install": "Install"
},
"title": "Is <span class=\"header-screen_name\">@{{screenName}}</span><br> shadowbanned on Twitter?",
"screenNameDefault": "username",
"qfSettingToast": "PLEASE NOTE: We can only detect the presence of specific bans or deboosting methods, not their absence. There may be others which we do not know or cannot easily test for.",
"supportModal": {
"content": "<h4>Support Us</h4><p>Shadowban.eu needs your help!</p><p>For over a year now (since 04/2018), shadowban.eu has given Twitter users all around the world an easy way to test their accounts.We have exposed and defeated the #QFD and our test results have been used as evidence in several law suits.<h6>We are running low on resources</h6><p>You may have noticed some problems with the site over the past few days. Those were due to our one-server solution not able to handle all the requests and the need for user accounts, testing for the newest addition, the deboosting test. Since Twitter decided to to enforce phone verification, we have to buy some SIM cards to be able to do so.</p>Just recently, we have furthermore identified a new shadowbanning method: <a href=\"https://twitter.com/search?q=%23TimelineTerminationBan&src=typed_query\" rel=\"noopener noreferrer\">#TimelineTerminationBan</a>. We have outlined it in our <a href=\"https://blog.shadowban.eu/#2019-10-16-here-we-go-again\" rel=\"noopener noreferrer\">first blogpost</a> and a new test is in development.</p><p>This then, however, requires a whole new approach of testing, which would definetly bring the current setup to its knees.</p><p>So if you feel that shadowban.eu brings you any value, please consider making a donation to our PayPal! Every bit helps keeping the site running and continuing our research.</p><h6>Thanks You! :)</h6>",
"donateButton": "Donate via PayPal",
"dismissButton": "No, thanks"
}
}
{
"limitVisibility": {
"title": "Twitter reserves the right to limit distribution or visibility of content",
"text": "The updated <a href=\"https://twitter.com/en/tos\" rel=\"noopener noreferrer\">Terms of Service</a> will go into effect on January 1, 2020."
},
"noShadowbanClaim": {
"title": "But Twitter claims that they do not shadowban",
"text": "In a <a href=\"https://blog.twitter.com/en_us/topics/company/2018/Setting-the-record-straight-on-shadow-banning.html\" rel=\"noopener noreferrer\">blog post from July 2018</a>, Twitter claims that they do not shadowban by defining shadowbanning as <i>deliberately making someone’s content undiscoverable to everyone except the person who posted it, unbeknownst to the original poster</i>. If you strictly follow Twitter's own definition, this may not be false because the key is discoverability. Later, Twitter provides a hint why this definition is deceptive by stating that you are <i>always able to see the tweets from accounts you follow (although you may have to do more work to find them, like go directly to their profile)</i>. The problem is obvious: Having to do more work to find tweets of accounts is not shadowbanning if you let Twitter define it. Although tweets within a thread may be completely invisible to others or tweets may not be shown in a user's followers' timelines, you will always be able to find those tweets by navigating to the user's \"Tweets &amp; replies\" section on their profile. In contrast to Twitter, we find that this is shadowbanning because without navigating there, it is not even possible for others to know that the corresponding tweets do exist.</p>"
},
"qfdTestGone": {
"title": "Why is the QFD test gone?",
"text": "<h5>Quality Filter Discrimination</h5> <p> QFD caused your tweets to be invisible within the latest section of the search, including hashtags, when the quality filter on the search page was turned on. The filter was turned on by default and would reset for each search anew. QFD was introduced on May 15, 2018 as part of Twitter's so-called <a href=\"https://blog.twitter.com/official/en_us/topics/product/2018/Serving_Healthy_Conversation.html\" rel=\"noopener noreferrer\">healthy conversation project</a>. </p> <p> The quality filter was deprecated shortly before Twitter CEO Jack Dorsey <a href=\"https://docs.house.gov/meetings/IF/IF00/20180905/108642/HHRG-115-IF00-Wstate-DorseyJ-20180905.pdf\" rel=\"noopener noreferrer\">testified before the United States House Committee on Energy and Commerce</a>. In his testimony, Dorsey stated the following:<br/> <i>Twitter recently made a change to how one of our behavior based algorithms works in search results. When people used search, our algorithms were filtering out those that had a higher likelihood of being abusive from the “Lastest\" tab by default. Those search results were visible in “Latest” if someone turned off the quality filter in search, and they were also in Top search and elsewhere throughout the product. Twitter decided that a higher level of precision is needed when filtering to ensure these accounts are included in “Latest” by default. Twitter therefore turned off the algorithm. As always, we will continue to refine our approach and will be transparent about why we make the decisions that we do.</i><br/> Currently, the quality filter seems to have no effect indeed. But please note that this is not a verification that users are not classified anymore by this algorithm. We just cannot observe it anymore through the quality filter. </p> <p>For documentation purposes, you still find the frequently answered questions about QFD here:</p> <ul id=\"qfdFAQ\" class=\"collapsible\"> <li> <div class=\"collapsible-header\"> <span>Does turning off the quality filter within my notification settings help?</span> </div> <div class=\"collapsible-body\"> <p> The quality filter within your notification settings only controls the notification you receive. Turning it off is recommended and will cause you to see more notifications which you would not have received otherwise. However, turning it off will not cause your own tweets to be more visible. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>How do I get into the QFD ban?</span> </div> <div class=\"collapsible-body\"> <p> A lot of interaction with accounts affected by QFD will likely cause your account to be affected by QFD soon, too. The absence of personal misbehavior does not guarantee an account to be unaffected. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>How do I get out of the QFD ban?</span> </div> <div class=\"collapsible-body\"> <p> Several German Twitter users that were affected by QFD have been experimenting with an Arabic follow-back botnet. The botnet generated a lot of followers for those who followed some accounts from this botnet. By accumulating many new followers that were not affected by QFD, at least 30 accounts were able to escape this type of ban. This is a strong hint that guilt by association is a major concept of the classifying algorithm. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>Is there a political bias?</span> </div> <div class=\"collapsible-body\"> <p> The quality filter indeed seems to mainly affect conservative and right-wing accounts. Testing over 2,000 contacts of two German left-wing extremist accounts did not yield a single account affected by QFD that would not be considered politically right. Testing 509 Twitter accounts from German members of Parliament yielded 14 affected accounts. All of them belong to the AfD, which is a German right-wing party. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>Does it only affect hashtags and the search? Why is it so bad then?</span> </div> <div class=\"collapsible-body\"> <p> We cannot tell whether the effects of QFD are limited to hashtags and the search. These are only the symptoms making the ban visible to us. It shows that Twitter is capable and willing to discriminate against accounts with certain political opinions. Since shadowbanning is a very unethical way to silence people already, it is possible for Twitter to apply methods that are harder to detect. Think of more subtle ways of banning by limiting the share of followers who a user's tweets are shown to. This would be a censorship method that could only be detected collectively by their followers. </p> </div> </li> </ul>"
},
"testerFunctions": {
"title": "How does this tester work?",
"text": "<h5>Search Ban</h5> <p> The Twitter search features several search modifiers. One of them is the prefix from: which allows to search for tweets from a specific user. For example, when checking whether <a href=\"https://twitter.com/shadowban_eu\" rel=\"noopener noreferrer\"> @shadowban_eu </a> has a shadowban, we query the Twitter search for <a href=\"https://twitter.com/search?f=tweets&vertical=default&q=from%3A%40shadowban_eu&src=typd&qf=off\" rel=\"noopener noreferrer\"> from:@shadowban_eu </a>. If we do not find any tweets although the user has tweeted in the past, the account is subject to a search ban. </p> <h5>Thread Ban</h5> <p> When the user has a search ban, the tester searches their profile for the latest tweet with at least one reply. It then visits the direct URL of the tweet and selects some reply tweet. Afterwards, the direct URL of the reply tweet is visited. If the tweet that the user replied to is not visible, the likelihood that the account is affected by a thread shadowban is very high. </p> <h5>QFD (deprectated)</h5> <p> When you upload an image, cite a tweet or link to an external page, Twitter generates a shortlink for that content. </p> <p> We first find a reference tweet using a combination of from: and filter: search modifiers. For example, <a href=\"https://twitter.com/search?f=tweets&q=from%3A%40shadowban_eu%20filter%3Alinks&src=typd\" rel=\"noopener noreferrer\"> from:@shadowban_eu filter:links </a> returns all tweets from <a href=\"https://twitter.com/shadowban_eu\" rel=\"noopener noreferrer\"> @shadowban_eu </a> containing a link. </p> <p> We simply pick one result tweet as reference and extract the shortlink, e.g. <a href=\"https://t.co/5Vzu63ypQJ\" rel=\"noopener noreferrer\"> https://t.co/5Vzu63ypQJ </a>.<br /> (This link points to a tweet, quoted <a href=\"https://twitter.com/shadowban_eu/status/1019242190277697538\" rel=\"noopener noreferrer\">here</a>). </p> <p> We then query the Twitter search for the tweet using the shortlink's URL with the quality filter turned on and off. If the reference tweet is found in both cases, the account is not affected by QFD. In case it is found only when the filter is turned off, it is affected. </p> <p> We chose this method because shortlinks are unique. Methodically, it does not differ from searching for text or a hashtag but the uniqueness of shortlinks is a technical advantage. </p>"
}
}
{
"checkUser": {
"message": "Test Results"
},
"checkBarrier": {
"message": "Reply Deboosting",
"description": {
"title": "Reply Deboosting",
"text": "If Twitter's signals determine that an account might engage in harmful behavior, Twitter hides their replies behind a barrier and only loads them when \"Show more replies\" is clicked. This behavior is personalized, i.e. Twitter does not hide the tweets of accounts you follow. We therefore use an unbiased reference account without followings in order to determine whether tweets within a thread can be retrieved without clicking \"Show more replies\" from its view.\nIn some cases, Twitter classifies accounts as offensive. In this case, replies are hidden behind a second barrier within the \"Show more replies\" section.<br/> The outcome of this test may depend on the conversation which we found one of your tweets in. For testing, we take your latest reply tweet that is not within a conversation you started. Note that test results are cached for a short period of time.<br/> A failure to test is neither a positive nor a negative test result. This test relies on some conditions that are not fulfilled by all accounts. In some cases, we cannot test for purely technical reasons."
}
},
"checkSuggest": {
"message": "Search Suggestion Ban",
"description": {
"title": "Search Suggestion Ban",
"text": "This type of ban causes an account to not populate search suggestions and people search results when it is searched for while being logged out. Twitter seems to take <a href=\"https://en.wikipedia.org/wiki/Social_network_analysis#Metrics\" target=\"_blank\" rel=\"noopener noreferrer\">tie strength</a> or a similar metric into account. While an account may be suggested to users you are strongly tied to, it may not be shown to others."
}
},
"checkSearch": {
"message": "Search Ban",
"description": {
"title": "Search Ban",
"text": "This type of ban causes your tweets to be hidden from the search results entirely, no matter whether the quality filter is turned on or off. This behavior includes hashtags as well. This type of ban seems to be temporally limited for active accounts."
}
},
"checkConventional": {
"message": "Ghost Ban",
"description": {
"title": "Ghost Ban",
"text": "This is what is referred to as conventional shadowban or thread banning as well. It comprises a search ban while threads are completely ripped apart by hiding reply tweets of the affected user to others. Everything will look perfectly normal to the affected user but many others will not be able to see reply tweets of the affected user at all. Reasons for this ban include behavior like excessive tweeting or following. Again, this type of ban seems to be temporally limited for active accounts."
}
}
}
{
"search": {
"text": "We {{foundOrNot}} by searching for {{searchLink}}.",
"notFound": "did not find a tweet",
"found": "found <a href=\"https://twitter.com/i/status/{{tweetId}}\" rel=\"noopener noreferrer\">a tweet</a>"
},
"barrier": {
"text": "We found <a href=\"https://twitter.com/i/status/{{replyToId}}\" rel=\"noopener noreferrer\">a tweet</a> which the user <a href=\"https://twitter.com/i/status/{{tweetId}}\" rel=\"noopener noreferrer\">replied to</a>.<br />{{explanation}}",
"highQuality": "The tweet was not hidden.",
"lowQuality": "We had to click \"Show more replies\" to view it{{abuse}}.",
"abuseQuality": " and we had to click a second time because the account is rated as potentially offensive"
},
"thread": {
"searchBanned": "A ghost ban implies a search ban. Since the account is not search banned, it cannot be ghost banned.",
"text": "We found <a href=\"https://twitter.com/i/status/{{tweetId}}\" rel=\"noopener noreferrer\">a tweet with at least one reply</a> on the user's profile. A <a href=\"https://twitter.com/i/status/{{replyId}}\" rel=\"noopener noreferrer\">reply tweet</a> is {{detached}} detached."
}
}
{
"buttons": {
"check": "Check",
"support": "Support Us",
"install": "Install"
},
"title": "Is <span class=\"header-screen_name\">@{{screenName}}</span><br> shadowbanned on Twitter?",
"screenNameDefault": "username",
"qfSettingToast": "PLEASE NOTE: We can only detect the presence of specific bans or deboosting methods, not their absence. There may be others which we do not know or cannot easily test for.",
"supportModal": {
"content": "<h4>Support Us</h4><p>Shadowban.eu needs your help!</p><p>For over a year now (since 04/2018), shadowban.eu has given Twitter users all around the world an easy way to test their accounts.We have exposed and defeated the #QFD and our test results have been used as evidence in several law suits.<h6>We are running low on resources</h6><p>You may have noticed some problems with the site over the past few days. Those were due to our one-server solution not able to handle all the requests and the need for user accounts, testing for the newest addition, the deboosting test. Since Twitter decided to to enforce phone verification, we have to buy some SIM cards to be able to do so.</p>Just recently, we have furthermore identified a new shadowbanning method: <a href=\"https://twitter.com/search?q=%23TimelineTerminationBan&src=typed_query\" rel=\"noopener noreferrer\">#TimelineTerminationBan</a>. We have outlined it in our <a href=\"https://blog.shadowban.eu/#2019-10-16-here-we-go-again\" rel=\"noopener noreferrer\">first blogpost</a> and a new test is in development.</p><p>This then, however, requires a whole new approach of testing, which would definetly bring the current setup to its knees.</p><p>So if you feel that shadowban.eu brings you any value, please consider making a donation to our PayPal! Every bit helps keeping the site running and continuing our research.</p><h6>Thanks You! :)</h6>",
"donateButton": "Donate via PayPal",
"dismissButton": "No, thanks"
}
}
{
"limitVisibility": {
"title": "Twitter reserves the right to limit distribution or visibility of content",
"text": "The updated <a href=\"https://twitter.com/en/tos\" rel=\"noopener noreferrer\">Terms of Service</a> will go into effect on January 1, 2020."
},
"noShadowbanClaim": {
"title": "But Twitter claims that they do not shadowban",
"text": "In a <a href=\"https://blog.twitter.com/en_us/topics/company/2018/Setting-the-record-straight-on-shadow-banning.html\" rel=\"noopener noreferrer\">blog post from July 2018</a>, Twitter claims that they do not shadowban by defining shadowbanning as <i>deliberately making someone’s content undiscoverable to everyone except the person who posted it, unbeknownst to the original poster</i>. If you strictly follow Twitter's own definition, this may not be false because the key is discoverability. Later, Twitter provides a hint why this definition is deceptive by stating that you are <i>always able to see the tweets from accounts you follow (although you may have to do more work to find them, like go directly to their profile)</i>. The problem is obvious: Having to do more work to find tweets of accounts is not shadowbanning if you let Twitter define it. Although tweets within a thread may be completely invisible to others or tweets may not be shown in a user's followers' timelines, you will always be able to find those tweets by navigating to the user's \"Tweets &amp; replies\" section on their profile. In contrast to Twitter, we find that this is shadowbanning because without navigating there, it is not even possible for others to know that the corresponding tweets do exist.</p>"
},
"qfdTestGone": {
"title": "Why is the QFD test gone?",
"text": "<h5>Quality Filter Discrimination</h5> <p> QFD caused your tweets to be invisible within the latest section of the search, including hashtags, when the quality filter on the search page was turned on. The filter was turned on by default and would reset for each search anew. QFD was introduced on May 15, 2018 as part of Twitter's so-called <a href=\"https://blog.twitter.com/official/en_us/topics/product/2018/Serving_Healthy_Conversation.html\" rel=\"noopener noreferrer\">healthy conversation project</a>. </p> <p> The quality filter was deprecated shortly before Twitter CEO Jack Dorsey <a href=\"https://docs.house.gov/meetings/IF/IF00/20180905/108642/HHRG-115-IF00-Wstate-DorseyJ-20180905.pdf\" rel=\"noopener noreferrer\">testified before the United States House Committee on Energy and Commerce</a>. In his testimony, Dorsey stated the following:<br/> <i>Twitter recently made a change to how one of our behavior based algorithms works in search results. When people used search, our algorithms were filtering out those that had a higher likelihood of being abusive from the “Lastest\" tab by default. Those search results were visible in “Latest” if someone turned off the quality filter in search, and they were also in Top search and elsewhere throughout the product. Twitter decided that a higher level of precision is needed when filtering to ensure these accounts are included in “Latest” by default. Twitter therefore turned off the algorithm. As always, we will continue to refine our approach and will be transparent about why we make the decisions that we do.</i><br/> Currently, the quality filter seems to have no effect indeed. But please note that this is not a verification that users are not classified anymore by this algorithm. We just cannot observe it anymore through the quality filter. </p> <p>For documentation purposes, you still find the frequently answered questions about QFD here:</p> <ul id=\"qfdFAQ\" class=\"collapsible\"> <li> <div class=\"collapsible-header\"> <span>Does turning off the quality filter within my notification settings help?</span> </div> <div class=\"collapsible-body\"> <p> The quality filter within your notification settings only controls the notification you receive. Turning it off is recommended and will cause you to see more notifications which you would not have received otherwise. However, turning it off will not cause your own tweets to be more visible. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>How do I get into the QFD ban?</span> </div> <div class=\"collapsible-body\"> <p> A lot of interaction with accounts affected by QFD will likely cause your account to be affected by QFD soon, too. The absence of personal misbehavior does not guarantee an account to be unaffected. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>How do I get out of the QFD ban?</span> </div> <div class=\"collapsible-body\"> <p> Several German Twitter users that were affected by QFD have been experimenting with an Arabic follow-back botnet. The botnet generated a lot of followers for those who followed some accounts from this botnet. By accumulating many new followers that were not affected by QFD, at least 30 accounts were able to escape this type of ban. This is a strong hint that guilt by association is a major concept of the classifying algorithm. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>Is there a political bias?</span> </div> <div class=\"collapsible-body\"> <p> The quality filter indeed seems to mainly affect conservative and right-wing accounts. Testing over 2,000 contacts of two German left-wing extremist accounts did not yield a single account affected by QFD that would not be considered politically right. Testing 509 Twitter accounts from German members of Parliament yielded 14 affected accounts. All of them belong to the AfD, which is a German right-wing party. </p> </div> </li> <li> <div class=\"collapsible-header\"> <span>Does it only affect hashtags and the search? Why is it so bad then?</span> </div> <div class=\"collapsible-body\"> <p> We cannot tell whether the effects of QFD are limited to hashtags and the search. These are only the symptoms making the ban visible to us. It shows that Twitter is capable and willing to discriminate against accounts with certain political opinions. Since shadowbanning is a very unethical way to silence people already, it is possible for Twitter to apply methods that are harder to detect. Think of more subtle ways of banning by limiting the share of followers who a user's tweets are shown to. This would be a censorship method that could only be detected collectively by their followers. </p> </div> </li> </ul>"
},
"testerFunctions": {
"title": "How does this tester work?",
"text": "<h5>Search Ban</h5> <p> The Twitter search features several search modifiers. One of them is the prefix from: which allows to search for tweets from a specific user. For example, when checking whether <a href=\"https://twitter.com/shadowban_eu\" rel=\"noopener noreferrer\"> @shadowban_eu </a> has a shadowban, we query the Twitter search for <a href=\"https://twitter.com/search?f=tweets&vertical=default&q=from%3A%40shadowban_eu&src=typd&qf=off\" rel=\"noopener noreferrer\"> from:@shadowban_eu </a>. If we do not find any tweets although the user has tweeted in the past, the account is subject to a search ban. </p> <h5>Thread Ban</h5> <p> When the user has a search ban, the tester searches their profile for the latest tweet with at least one reply. It then visits the direct URL of the tweet and selects some reply tweet. Afterwards, the direct URL of the reply tweet is visited. If the tweet that the user replied to is not visible, the likelihood that the account is affected by a thread shadowban is very high. </p> <h5>QFD (deprectated)</h5> <p> When you upload an image, cite a tweet or link to an external page, Twitter generates a shortlink for that content. </p> <p> We first find a reference tweet using a combination of from: and filter: search modifiers. For example, <a href=\"https://twitter.com/search?f=tweets&q=from%3A%40shadowban_eu%20filter%3Alinks&src=typd\" rel=\"noopener noreferrer\"> from:@shadowban_eu filter:links </a> returns all tweets from <a href=\"https://twitter.com/shadowban_eu\" rel=\"noopener noreferrer\"> @shadowban_eu </a> containing a link. </p> <p> We simply pick one result tweet as reference and extract the shortlink, e.g. <a href=\"https://t.co/5Vzu63ypQJ\" rel=\"noopener noreferrer\"> https://t.co/5Vzu63ypQJ </a>.<br /> (This link points to a tweet, quoted <a href=\"https://twitter.com/shadowban_eu/status/1019242190277697538\" rel=\"noopener noreferrer\">here</a>). </p> <p> We then query the Twitter search for the tweet using the shortlink's URL with the quality filter turned on and off. If the reference tweet is found in both cases, the account is not affected by QFD. In case it is found only when the filter is turned off, it is affected. </p> <p> We chose this method because shortlinks are unique. Methodically, it does not differ from searching for text or a hashtag but the uniqueness of shortlinks is a technical advantage. </p>"
}
}
{
"checkUser": {
"message": "Test Results"
},
"checkBarrier": {
"message": "Reply Deboosting",
"description": {
"title": "Reply Deboosting",
"text": "If Twitter's signals determine that an account might engage in harmful behavior, Twitter hides their replies behind a barrier and only loads them when \"Show more replies\" is clicked. This behavior is personalized, i.e. Twitter does not hide the tweets of accounts you follow. We therefore use an unbiased reference account without followings in order to determine whether tweets within a thread can be retrieved without clicking \"Show more replies\" from its view.\nIn some cases, Twitter classifies accounts as offensive. In this case, replies are hidden behind a second barrier within the \"Show more replies\" section.<br/> The outcome of this test may depend on the conversation which we found one of your tweets in. For testing, we take your latest reply tweet that is not within a conversation you started. Note that test results are cached for a short period of time.<br/> A failure to test is neither a positive nor a negative test result. This test relies on some conditions that are not fulfilled by all accounts. In some cases, we cannot test for purely technical reasons."
}
},
"checkSuggest": {
"message": "Search Suggestion Ban",
"description": {
"title": "Search Suggestion Ban",
"text": "This type of ban causes an account to not populate search suggestions and people search results when it is searched for while being logged out. Twitter seems to take <a href=\"https://en.wikipedia.org/wiki/Social_network_analysis#Metrics\" target=\"_blank\" rel=\"noopener noreferrer\">tie strength</a> or a similar metric into account. While an account may be suggested to users you are strongly tied to, it may not be shown to others."
}
},
"checkSearch": {
"message": "Search Ban",
"description": {
"title": "Search Ban",
"text": "This type of ban causes your tweets to be hidden from the search results entirely, no matter whether the quality filter is turned on or off. This behavior includes hashtags as well. This type of ban seems to be temporally limited for active accounts."
}
},
"checkConventional": {
"message": "Ghost Ban",
"description": {
"title": "Ghost Ban",
"text": "This is what is referred to as conventional shadowban or thread banning as well. It comprises a search ban while threads are completely ripped apart by hiding reply tweets of the affected user to others. Everything will look perfectly normal to the affected user but many others will not be able to see reply tweets of the affected user at all. Reasons for this ban include behavior like excessive tweeting or following. Again, this type of ban seems to be temporally limited for active accounts."
}
}
}
{
"search": {
"text": "We {{foundOrNot}} by searching for {{searchLink}}.",
"notFound": "did not find a tweet",
"found": "found <a href=\"https://twitter.com/i/status/{{tweetId}}\" rel=\"noopener noreferrer\">a tweet</a>"
},
"barrier": {
"text": "We found <a href=\"https://twitter.com/i/status/{{replyToId}}\" rel=\"noopener noreferrer\">a tweet</a> which the user <a href=\"https://twitter.com/i/status/{{tweetId}}\" rel=\"noopener noreferrer\">replied to</a>.<br />{{explanation}}",
"highQuality": "The tweet was not hidden.",
"lowQuality": "We had to click \"Show more replies\" to view it{{abuse}}.",
"abuseQuality": " and we had to click a second time because the account is rated as potentially offensive"
},
"thread": {
"searchBanned": "A ghost ban implies a search ban. Since the account is not search banned, it cannot be ghost banned.",
"text": "We found <a href=\"https://twitter.com/i/status/{{tweetId}}\" rel=\"noopener noreferrer\">a tweet with at least one reply</a> on the user's profile. A <a href=\"https://twitter.com/i/status/{{replyId}}\" rel=\"noopener noreferrer\">reply tweet</a> is {{detached}} detached."
}
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="120px"
height="120px"
viewBox="0 0 100 100"
preserveAspectRatio="xMidYMid"
class="uil-gears"
version="1.1"
id="svg862"
sodipodi:docname="gears.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)">
<metadata
id="metadata868">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs866" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1364"
inkscape:window-height="734"
id="namedview864"
showgrid="false"
inkscape:zoom="4.6166667"
inkscape:cx="60.108303"
inkscape:cy="60"
inkscape:window-x="0"
inkscape:window-y="18"
inkscape:window-maximized="1"
inkscape:current-layer="g856" />
<rect
x="0"
y="0"
width="100"
height="100"
fill="none"
class="bk"
id="rect852" />
<g
transform="translate(-20,-20)"
id="g856">
<path
d="M79.9,52.6C80,51.8,80,50.9,80,50s0-1.8-0.1-2.6l-5.1-0.4c-0.3-2.4-0.9-4.6-1.8-6.7l4.2-2.9c-0.7-1.6-1.6-3.1-2.6-4.5 L70,35c-1.4-1.9-3.1-3.5-4.9-4.9l2.2-4.6c-1.4-1-2.9-1.9-4.5-2.6L59.8,27c-2.1-0.9-4.4-1.5-6.7-1.8l-0.4-5.1C51.8,20,50.9,20,50,20 s-1.8,0-2.6,0.1l-0.4,5.1c-2.4,0.3-4.6,0.9-6.7,1.8l-2.9-4.1c-1.6,0.7-3.1,1.6-4.5,2.6l2.1,4.6c-1.9,1.4-3.5,3.1-5,4.9l-4.5-2.1 c-1,1.4-1.9,2.9-2.6,4.5l4.1,2.9c-0.9,2.1-1.5,4.4-1.8,6.8l-5,0.4C20,48.2,20,49.1,20,50s0,1.8,0.1,2.6l5,0.4 c0.3,2.4,0.9,4.7,1.8,6.8l-4.1,2.9c0.7,1.6,1.6,3.1,2.6,4.5l4.5-2.1c1.4,1.9,3.1,3.5,5,4.9l-2.1,4.6c1.4,1,2.9,1.9,4.5,2.6l2.9-4.1 c2.1,0.9,4.4,1.5,6.7,1.8l0.4,5.1C48.2,80,49.1,80,50,80s1.8,0,2.6-0.1l0.4-5.1c2.3-0.3,4.6-0.9,6.7-1.8l2.9,4.2 c1.6-0.7,3.1-1.6,4.5-2.6L65,69.9c1.9-1.4,3.5-3,4.9-4.9l4.6,2.2c1-1.4,1.9-2.9,2.6-4.5L73,59.8c0.9-2.1,1.5-4.4,1.8-6.7L79.9,52.6 z M50,65c-8.3,0-15-6.7-15-15c0-8.3,6.7-15,15-15s15,6.7,15,15C65,58.3,58.3,65,50,65z"
fill="#4c5630"
id="path854"
style="fill:#c53dc5;fill-opacity:1">
<animateTransform
attributeName="transform"
type="rotate"
from="90 50 50"
to="0 50 50"
dur="1s"
repeatCount="indefinite" />
</path>
</g>
<g
transform="translate(20,20) rotate(15 50 50)"
id="g860">
<path
d="M79.9,52.6C80,51.8,80,50.9,80,50s0-1.8-0.1-2.6l-5.1-0.4c-0.3-2.4-0.9-4.6-1.8-6.7l4.2-2.9c-0.7-1.6-1.6-3.1-2.6-4.5 L70,35c-1.4-1.9-3.1-3.5-4.9-4.9l2.2-4.6c-1.4-1-2.9-1.9-4.5-2.6L59.8,27c-2.1-0.9-4.4-1.5-6.7-1.8l-0.4-5.1C51.8,20,50.9,20,50,20 s-1.8,0-2.6,0.1l-0.4,5.1c-2.4,0.3-4.6,0.9-6.7,1.8l-2.9-4.1c-1.6,0.7-3.1,1.6-4.5,2.6l2.1,4.6c-1.9,1.4-3.5,3.1-5,4.9l-4.5-2.1 c-1,1.4-1.9,2.9-2.6,4.5l4.1,2.9c-0.9,2.1-1.5,4.4-1.8,6.8l-5,0.4C20,48.2,20,49.1,20,50s0,1.8,0.1,2.6l5,0.4 c0.3,2.4,0.9,4.7,1.8,6.8l-4.1,2.9c0.7,1.6,1.6,3.1,2.6,4.5l4.5-2.1c1.4,1.9,3.1,3.5,5,4.9l-2.1,4.6c1.4,1,2.9,1.9,4.5,2.6l2.9-4.1 c2.1,0.9,4.4,1.5,6.7,1.8l0.4,5.1C48.2,80,49.1,80,50,80s1.8,0,2.6-0.1l0.4-5.1c2.3-0.3,4.6-0.9,6.7-1.8l2.9,4.2 c1.6-0.7,3.1-1.6,4.5-2.6L65,69.9c1.9-1.4,3.5-3,4.9-4.9l4.6,2.2c1-1.4,1.9-2.9,2.6-4.5L73,59.8c0.9-2.1,1.5-4.4,1.8-6.7L79.9,52.6 z M50,65c-8.3,0-15-6.7-15-15c0-8.3,6.7-15,15-15s15,6.7,15,15C65,58.3,58.3,65,50,65z"
fill="#f7faf8"
id="path858"
style="fill:#1da1f2;fill-opacity:1">
<animateTransform
attributeName="transform"
type="rotate"
from="0 50 50"
to="90 50 50"
dur="1s"
repeatCount="indefinite" />
</path>
</g>
</svg>
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"short_name": "Shadowban.eu",
"name": "Twitter Shadowban Test",
"icons": [
{
"src": "/favicon/favicon_32.png",
"sizes": "32x32 24x24 16x16",
"type": "image/png"
},
{
"src": "/favicon/favicon_64.png",
"sizes": "64x64",
"type": "image/png"
},
{
"src": "/favicon/favicon_192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "/favicon/favicon_512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": "/",
"display": "standalone",
"theme_color": "#1481c3",
"background_color": "#1481c3",
"share_target": {
"action": "/share",
"method": "GET",
"enctype": "application/x-www-form-urlencoded",
"params": {
"text": "text"
}
}
}
!(function (e) {
var t = {};
function n(r) {
if (t[r]) return t[r].exports;
var o = (t[r] = { i: r, l: !1, exports: {} });
return e[r].call(o.exports, o, o.exports, n), (o.l = !0), o.exports;
}
(n.m = e),
(n.c = t),
(n.d = function (e, t, r) {
n.o(e, t) ||
Object.defineProperty(e, t, { enumerable: !0, get: r });
}),
(n.r = function (e) {
"undefined" != typeof Symbol &&
Symbol.toStringTag &&
Object.defineProperty(e, Symbol.toStringTag, {
value: "Module",
}),
Object.defineProperty(e, "__esModule", { value: !0 });
}),
(n.t = function (e, t) {
if ((1 & t && (e = n(e)), 8 & t)) return e;
if (4 & t && "object" == typeof e && e && e.__esModule) return e;
var r = Object.create(null);
if (
(n.r(r),
Object.defineProperty(r, "default", {
enumerable: !0,
value: e,
}),
2 & t && "string" != typeof e)
)
for (var o in e)
n.d(
r,
o,
function (t) {
return e[t];
}.bind(null, o)
);
return r;
}),
(n.n = function (e) {
var t =
e && e.__esModule
? function () {
return e.default;
}
: function () {
return e;
};
return n.d(t, "a", t), t;
}),
(n.o = function (e, t) {
return Object.prototype.hasOwnProperty.call(e, t);
}),
(n.p = ""),
n((n.s = 34));
})({
34: function (e, t) {
self.addEventListener("fetch", function () {});
},
});
python-3.9.9
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment