{"id":13412189,"url":"https://github.com/travisbrown/cancel-culture","last_synced_at":"2025-04-06T06:09:20.403Z","repository":{"id":40323518,"uuid":"297375948","full_name":"travisbrown/cancel-culture","owner":"travisbrown","description":"Tools for fighting abuse on Twitter","archived":false,"fork":false,"pushed_at":"2023-02-22T07:49:56.000Z","size":2854,"stargazers_count":413,"open_issues_count":6,"forks_count":28,"subscribers_count":13,"default_branch":"main","last_synced_at":"2024-10-29T16:00:01.652Z","etag":null,"topics":["twitter-api","wayback-machine"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/travisbrown.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2020-09-21T15:06:26.000Z","updated_at":"2024-10-18T15:15:12.000Z","dependencies_parsed_at":"2024-01-16T20:50:11.421Z","dependency_job_id":"68e00799-1e3b-4e8c-b0c1-b19f9088f69c","html_url":"https://github.com/travisbrown/cancel-culture","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Fcancel-culture","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Fcancel-culture/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Fcancel-culture/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/travisbrown%2Fcancel-culture/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/travisbrown","download_url":"https://codeload.github.com/travisbrown/cancel-culture/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247441052,"owners_count":20939239,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["twitter-api","wayback-machine"],"created_at":"2024-07-30T20:01:21.925Z","updated_at":"2025-04-06T06:09:20.374Z","avatar_url":"https://github.com/travisbrown.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"## Overview\n\n[![Build status](https://img.shields.io/github/actions/workflow/status/travisbrown/cancel-culture/ci.yaml?branch=main)](https://github.com/travisbrown/cancel-culture/actions)\n[![Coverage status](https://img.shields.io/codecov/c/github/travisbrown/cancel-culture/main.svg)](https://codecov.io/github/travisbrown/cancel-culture)\n\nThis repository contains some low-tech tools designed to help you make Twitter a nicer place for\nyourself. Some of these tools might also be useful in other ways, like for\nexample if some litigious person with a long history of making common cause with white\nsupremacists and misogynists\n[threatens to sue you for defamation](https://meta.plasm.us/posts/2020/07/25/response-to-john-de-goes/).\n\nSee [this related project](https://github.com/travisbrown/deleted-tweets) for an example of the\nkind of use case cancel-culture is designed to support (an archive of around 35 million deleted\ntweets associated with Gamergate, [LambdaConf](https://geekfeminism.wikia.org/wiki/Lambdaconf_incident), Stop the Steal, etc.),\nor [this project](https://github.com/travisbrown/evasion) focused on tracking ban evasion by far-right accounts,\nor [this recent project](https://github.com/salcoast/deleted-tweets-archive) by\n[Salish Coast Anti-Fascist Action](https://twitter.com/SalishcoastA).\n\n## Testimonials\n\n[A Twitter user](https://web.archive.org/web/20210930150828/https://twitter.com/gringovice/status/1443551046823989256):\n\n\u003e Still, he somehow has access to everything you’ve ever posted \u0026 deleted, and can seemingly immediately find your new alt/resurrect/punished accounts.\n\n## Terms of service compliance\n\nThis software is designed to promote use that is compliant with the Twitter API\n[Developer Agreement](https://developer.twitter.com/en/developer-terms/agreement-and-policy)\nand the [Internet Archive](https://archive.org/)'s [Terms of Use](https://archive.org/about/terms.php).\n\nText and metadata for Twitter statuses are retrieved from the [Wayback Machine][wayback-machine], not the Twitter API,\nwhich is primarily used here to list follower relationships and to allow users to import and export block lists.\n\nIn theory it's possible that there are ways you could violate the Developer Agreement with the help of this software (for example\nby using \"information obtained from the Twitter API to target people with advertising outside of the Twitter platform\").\nDon't do that.\n\n## Examples\n\nOne of the things this project provides is a command-line tool that takes a Twitter screen\nname and outputs a list of all of the accounts you've blocked that that account follows (sorted\nhere by follower count):\n\n```\n$ cargo build --release\n    Finished release [optimized] target(s) in 0.06s\n\n$ target/release/twcc blocked-follows sfscala\n@jdegoes             11807\n@rolandkuhn           9238\n@propensive           8323\n@etorreborre          7045\n@ChiefScientist       5450\n@dibblego             3587\n@nuttycom             3307\n@kubukoz              2808\n@scalaworldconf       2495\n...\n```\n\nI get a lot of hate-follows, and this tool makes it much easier for me to decide which new followers\nI need to block. It's like a version of Twitter's \"Followed by… and 123 others you follow\" that's\nactually useful.\n\nI sometimes work in a [certain programming language community](https://www.scala-lang.org) where\nprominent community members have a tendency to say abusive\nor exclusionary things and then delete and deny everything when they're confronted, so the CLI also\nprovides a way to search the [Wayback Machine][wayback-machine] for deleted tweets by a\nspecified user:\n\n```\n$ target/release/twcc deleted-tweets --limit 100 jdegoes\nhttps://web.archive.org/web/20190922222236/https://twitter.com/jdegoes/status/1170420726400212997\nhttps://web.archive.org/web/20190923221242/https://twitter.com/jdegoes/status/1170711737361940481\nhttps://web.archive.org/web/20200526150339/https://twitter.com/jdegoes/status/1265251872048320513\n```\n\nIn this case we've limited the search to the 100 tweets most recently archived by the Wayback\nMachine.\n\nYou can also use this command to generate a Markdown-formatted report instead of a simple list of\nlinks:\n\n```\n$ target/release/twcc deleted-tweets --report ChiefScientist\n```\n\nWhich currently generates [this document](https://gist.github.com/travisbrown/9ca0dafe086e4904480b91d5019de96d).\n\nIt can also print a list of everyone you currently block, follow, or are followed by, it can get the\nURL of a deleted tweet from the URL of a reply, and it can partition a list of tweet IDs by their\ndeleted status.\n\n```\ntwcc 0.1.0\nTravis Brown \u003ctravisrobertbrown@gmail.com\u003e\n\nUSAGE:\n    twcc [FLAGS] [OPTIONS] \u003cSUBCOMMAND\u003e\n\nFLAGS:\n    -h, --help       Prints help information\n    -v, --verbose    Level of verbosity\n    -V, --version    Prints version information\n\nOPTIONS:\n    -k, --key-file \u003ckey-file\u003e    TOML file containing Twitter API keys [default: keys.toml]\n\nSUBCOMMANDS:\n    blocked-follows    For a given user, list everyone they follow who you block\n    check-existence    Checks whether a list of status IDs (from stdin) still exist\n    deleted-tweets     Lists Wayback Machine URLs for all deleted tweets by a user\n    follower-report    For a given user, print a report about their followers\n    help               Prints this message or the help of the given subcommand(s)\n    import-blocks      Blocks a list of user IDs (from stdin)\n    list-blocks        Print a list of all users you've blocked\n    list-followers     Print a list of all users who follow you (or someone else)\n    list-friends       Print a list of all users you (or someone else) follows\n    list-tweets        Print a list of (up to approximately 3200) tweet IDs for a user\n    lookup-reply       Get the URL of a tweet given the URL or status ID of a reply\n```\n\n## Tweet screenshots\n\nThe `twshoot` command-line tool can take a screenshot of a tweet, given either a URL or status ID:\n\n```\n$ cargo build --release\n    Finished release [optimized] target(s) in 0.29s\n\n$ target/release/twshoot https://twitter.com/travisbrown/status/1291256191641952256\n```\n\nAnd then you have a `1291256191641952256.png` file in the current directory that looks like this:\n\n\u003cp align=\"center\"\u003e\n\u003cimg\n  alt=\"Liking Scala is not a personality but it does mean you're racist / Do I think this is 100% accurate or fair: no … Do I think the Scala community is capable of coming to terms with the behavior that got it this reputation: also no\"\n  src=\"/examples/1291256191641952256.png?raw=true\"\n  width=\"75%\"\n  /\u003e\n\u003c/p\u003e\n\nThe application also generates a `-full.png` image showing the entire browser screen. The image\nsizes, output directory, etc. are configurable (see `twshoot --help` for details).\n\nThis tool doesn't require a Twitter API account, but you do have to have\n[ChromeDriver](https://chromedriver.chromium.org/) running (it also works with GeckoDriver,\nbut the results don't look as nice).\n\n## Setup\n\nYou'll need to [install Rust and Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html).\n\nOnce you've got those, you can run `cargo build --release` and the binaries will be available in the\n`target/release` directory.\n\nFor the main `twcc` application, you'll need\n[Twitter API access](https://developer.twitter.com/en/apply-for-access)\nfor your Twitter account, and you'll need to provide the necessary keys in a file (by default\n`keys.toml`):\n\n```toml\n[twitter]\nconsumerKey = \"****\"\nconsumerSecret = \"****\"\naccessToken = \"****\"\naccessTokenSecret = \"****\"\n```\n\nSome of the other tools require a [WebDriver](https://www.w3.org/TR/webdriver/) server instead of\nAPI access. These should work with either [ChromeDriver](https://chromedriver.chromium.org/) or\n[GeckoDriver](https://github.com/mozilla/geckodriver).\n\n## Other\n\nThe project also contains some other miscellaneous stuff, including a way to export your Twitter\nblock list even if you don't have a Twitter API account, and a way to search the Wayback Machine\neven if the CDX server isn't working.\n\nIt doesn't currently include a few related tools I use regularly, including a way to block everyone\nwho retweeted or favorited a given tweet, a bunch of stuff related to Wayback Machine ingestion\nand downloading, and some scripts that bundle some of the follower functionality into daily reports.\n\nMost of these things are excluded for one of the following reasons:\n\n* They're even more fragile than the stuff that's here now.\n* I haven't ported them from Scala to Rust yet.\n\nI might add some of them eventually.\n\nNothing here is very polished or robust. These applications don't keep track of rate limits in all\ncases, for example, so if you run out of requests for an endpoint, they may just crash, and you'll\nhave to wait. I might try to smooth out some of these rough edges at some point, but it's unlikely.\n\n## License\n\nThis project is licensed under the Mozilla Public License, version 2.0. See the LICENSE file for details.\n\n[wayback-machine]: https://web.archive.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftravisbrown%2Fcancel-culture","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftravisbrown%2Fcancel-culture","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftravisbrown%2Fcancel-culture/lists"}