{"id":50871201,"url":"https://github.com/drizzleco/twitter-blast","last_synced_at":"2026-06-15T05:05:35.416Z","repository":{"id":39838563,"uuid":"272873024","full_name":"drizzleco/twitter-blast","owner":"drizzleco","description":"Mass DM tool for Twitter to convert followers to another platform","archived":false,"fork":false,"pushed_at":"2022-12-08T10:46:22.000Z","size":2807,"stargazers_count":22,"open_issues_count":7,"forks_count":8,"subscribers_count":4,"default_branch":"master","last_synced_at":"2023-10-20T19:27:50.170Z","etag":null,"topics":["flask","python","sqlalchemy","tweepy","twitter-api"],"latest_commit_sha":null,"homepage":"https://twitter-blast.herokuapp.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/drizzleco.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-06-17T03:54:01.000Z","updated_at":"2023-07-29T16:03:05.000Z","dependencies_parsed_at":"2023-01-25T01:30:16.586Z","dependency_job_id":null,"html_url":"https://github.com/drizzleco/twitter-blast","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/drizzleco/twitter-blast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drizzleco%2Ftwitter-blast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drizzleco%2Ftwitter-blast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drizzleco%2Ftwitter-blast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drizzleco%2Ftwitter-blast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/drizzleco","download_url":"https://codeload.github.com/drizzleco/twitter-blast/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/drizzleco%2Ftwitter-blast/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34348377,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-15T02:00:07.085Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["flask","python","sqlalchemy","tweepy","twitter-api"],"created_at":"2026-06-15T05:05:34.816Z","updated_at":"2026-06-15T05:05:35.411Z","avatar_url":"https://github.com/drizzleco.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Twitter Blast(CLI/Flask versions)\n\nMass DM tool for Twitter to convert followers to another platform\n\nSolution to: https://github.com/balajis/twitter-export/\n\n[![Build status](https://badge.buildkite.com/b37e3412702b06621289784b2088181bff2166799786bfa254.svg)](https://buildkite.com/drizzle/twitter-blast)\n[![codecov](https://codecov.io/gh/drizzleco/twitter-blast/branch/master/graph/badge.svg)](https://codecov.io/gh/drizzleco/twitter-blast)\n\n### CLI Version\n\n![twitter blast](imgs/cli.gif)\n\n### Flask Version\n\n![twitter blast](imgs/flask.gif)\n\n# Features\n\n- easy authentication using Sign in with Twitter\n- preview follower rankings before sending the real deal\n- defaults to dry run mode to prevent unintentionally sending out DMs\n- remembers when a DM has been sent to a follower so no unintentional double sends\n- automatically pauses execution to wait out rate limits\n\n# Getting Started(CLI version)\n\n1. `make install` to install dependencies\n2. Edit `secrets.py`(automatically created) in the same directory as `twitter_blast.py` and add your app credentials:\n\n   - make sure your Twitter app has \"Read, write, and Direct Messages\" permission\n\n   ```python\n    HOSTED_CONSUMER_KEY = \"\" # for the flask app\n    HOSTED_CONSUMER_SECRET = \"\" # for the flask app\n    CONSUMER_KEY = \"\" # for the CLI version\n    CONSUMER_SECRET = \"\" # for the CLI version\n    SECRET_KEY = \"\"\n   ```\n\n3. On first run, you'll be prompted to authorize with Twitter\n   ```\n    $ python twitter_blast.py\n    Visit to authorize with twitter:  https://api.twitter.com/oauth/authorize?oauth_token=_______________________\n    Paste the verification code here: ________\n   ```\n4. `python twitter_blast.py fetch` to fetch your followers\n5. `python twitter_blast.py preview` to test out the ranking system and see how your followers will be prioritized\n6. `python twitter_blast.py send` to dry send a DM to your followers(add `--real` to send them for real!)\n\n# Getting Started(Flask version)\n\n1. Complete steps 1 and 2 from above.\n2. Add `http://127.0.0.1:5000` to your callback URLs in Twitter dev app settings\n3. `make start`\n\n   **OR**\n\n3) `source .venv/bin/activate \u0026\u0026 python app.py`\n\n   **OR**\n\n3. `docker-compose up --build`\n\n# Usage(CLI version)\n\n```\nUsage: twitter_blast.py [OPTIONS] [send|fetch|preview|reset|delete_keys]\n\n  Mass DM tool for Twitter to convert followers to another platform\n\nOptions:\n  --real  Actually send DMs.\n  --help  Show this message and exit.\n```\n\n### Actions\n\n- ### `fetch`\n  - download followers to a local database\n    ```\n    $ python twitter_blast.py fetch\n    Logged in as: SuperTweeter123\n    You've already fetched your followers. Are you sure you want to refetch them? This could take a while. [y/n]: y\n    Fetching 50 followers\n    Fetching follower ids!\n    Fetching user objects from ids!\n    Fetching 50/50 Followers |██████████████████████████████████████████████████| 100.0% Fetched\n    Done!\n    ```\n\n* ### `preview`\n\n  - show a preview of followers with specified ranking\n  - these preview options are available for ranking your followers\n\n    - recent - prioritize follower who most recently followed you\n    - followers_count - prioritize followers with more followers\n    - following_count - prioritize followers following more people\n    - statuses_count - prioritize followers who have more tweets\n    - listed_count - prioritize followers who appear in more lists\n    - favourites_count - prioritize followers who have liked more tweets(British spelling cuz thats how twitter does it lol)\n    - location - filter followers based on their location\n    - description - filter followers based on their bio description\n\n  - good for getting an idea of the follower prioritized by `send`\n\n    ```\n    $ python twitter_blast.py preview\n    Logged in as: SuperTweeter123\n    Choose how you'd like to rank your followers:\n    1) recent\n    2) followers_count\n    3) following_count\n    4) statuses_count\n    5) listed_count\n    6) favourites_count\n    7) location\n    8) description\n    Enter the number of your choice: 2\n    ```\n\n  - filtering by location or description will prompt you to enter a string to search for\n\n    ```\n    $ python twitter_blast.py preview\n    Logged in as: SuperTweeter123\n    Choose how you'd like to rank your followers:\n    1) recent\n    2) followers_count\n    3) following_count\n    4) statuses_count\n    5) listed_count\n    6) favourites_count\n    7) location\n    8) description\n    Enter the number of your choice: 7\n    Enter what you want to look for in location: cali\n    ```\n\n  - opens in less(or your preferred pager) for easy navigation\n    ```\n    Order of followers to be DM'ed(ranked by followers_count ). Followers whom a DM hasn't been sent are shown:\n    nokia\n    FundingTweets\n    MonsterFunder\n    MonsterFunders\n    Motts\n    StartUpsSolar\n    Money360\n    abcstoreshawaii\n    3DMCTweets\n    gaaplug\n    datezoholeg\n    DSeviorINC\n    PrinceSpeaks247\n    HelpCrowdfund1\n    FizzyDaysMovie\n    MoneyTeddyBear\n    hollywoodville\n    :\n    ```\n\n* ### `send`\n\n  - initiate sending mass DM to followers\n  - defaults to dry run so no DMs are sent out for real\n  - add `--real` to send DMs for real\n\n    ```\n    $ python twitter_blast.py send\n    Logged in as: SuperTweeter123\n    Choose how you'd like to rank your followers:\n    1) recent\n    2) followers_count\n    3) following_count\n    4) statuses_count\n    5) listed_count\n    6) favourites_count\n    7) location\n    8) description\n    Enter the number of your choice: 1\n\n    NOTE: you may want to preview your followers rankings before sending\n    What do you wanna say? Type your message below:\n    hello world\n    Here is your message one more time:\n\n    hello world\n\n    Are you sure you want to send this? [y/n]: y\n\n    Dry run is ON. Messages are not actually being sent. Phew. Add the --real flag to send DMs\n    Sending message to 50 followers\n    Sending DM to EgoAthletics\n    |██████████████████████████████████████████████████| 100.0% Sent\n    ```\n\n* ### `reset`\n  - resets every followers' DM sent flags, so another mass DM can be initiated\n    ```\n    $ python twitter_blast.py reset\n    Logged in as: SuperTweeter123\n    Followers DM sent flags reset!\n    ```\n* ### `delete_keys`\n\n  - delete API keys stored from authentication\n\n    ```\n    $ python twitter_blast.py reset\n    Logged in as: SuperTweeter123\n    Keys deleted!\n    ```\n\n# Behind the Scenes\n\n- Fetching followers data\n  - fetches ids of followers first using `followers/ids`\n    - `followers/ids` returns 5,000 user ids/request(max 15 requests every 15 minutes )\n    - TOTAL: 75,000 users every 15 minutes\n  - then, fetches user object using `users/lookup`\n    - `users/lookup` can get 100 user objects per request\n    - with user-level auth, you can make 900 requests every 15 minutes\n    - TOTAL: 90,000 users every 15 minutes\n- Ranking Followers\n  - uses SQLAlchemy database queries to do the heavy lifting\n- Sending DMs\n  - uses tweepy's wrapper for `direct_messages/events/new (message_create)`\n  - updates database to keep track of which followers have been sent DMs\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrizzleco%2Ftwitter-blast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdrizzleco%2Ftwitter-blast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdrizzleco%2Ftwitter-blast/lists"}