{"id":28951479,"url":"https://github.com/zlenner/tweetky","last_synced_at":"2026-04-24T22:33:28.495Z","repository":{"id":300312995,"uuid":"1004256547","full_name":"zlenner/tweetky","owner":"zlenner","description":"Have tweets pushed to your own WhatsApp channel, in real-time. Battle-hardened against X's bot-detection.","archived":false,"fork":false,"pushed_at":"2025-06-24T06:17:01.000Z","size":59,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-30T12:13:38.836Z","etag":null,"topics":["twitter","twitter-api","warp","whatsapp-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zlenner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-18T10:56:40.000Z","updated_at":"2025-06-24T06:17:04.000Z","dependencies_parsed_at":"2025-06-21T01:38:16.261Z","dependency_job_id":"9afd7ff2-a3cd-4010-90a1-32b7379c06dc","html_url":"https://github.com/zlenner/tweetky","commit_stats":null,"previous_names":["zlenner/tweetky","zlenner/tweeto-whatsapp-channel"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zlenner/tweetky","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zlenner%2Ftweetky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zlenner%2Ftweetky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zlenner%2Ftweetky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zlenner%2Ftweetky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zlenner","download_url":"https://codeload.github.com/zlenner/tweetky/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zlenner%2Ftweetky/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32243309,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["twitter","twitter-api","warp","whatsapp-api"],"created_at":"2025-06-23T15:02:12.209Z","updated_at":"2026-04-24T22:33:28.488Z","avatar_url":"https://github.com/zlenner.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tweetky\n\nAccounts on Twitter often post international news and other updates faster + more accurate versions of them. I wanted to bring that level of reliability and information to WhatsApp because:\n\na) WhatsApp has lesser amounts of other, distracting brainrot.\nb) Many people don't use Twitter, and are instead informed with an abundance of misinformation thanks to \"the WhatsApp forwards\".\n\nSupports images/videos/gifs... texts are intentionally posted late (but within an hour) to avoid being banned.\n\n## You can use this code to\n\nvery easily, set up a simple automated system that uses your Twitter account to fetch tweets from one or more handles + automatically post them to a channel or chat of your choice.\n\n## You must have\n\nBasic coding knowledge and know how to host docker apps on plug-and-play servers like Vercel... but I'll be searching (although passively) for ways I can make this require *zero* coding knowledge.\n\nIf you're into that, follow this repo. I might post an update sometime.\n\n## The technical deets.\n\nYou need a .env file with the following ENV variables.\n\n### Twitter/X Authentication\nENV variables used to login to your Twitter account.\n\nFor the non-technically inclined, these details are stored only wherever you paste them, on your computer or the server you run the app on.\n\n| Variable | Required | Description | Example |\n|----------|----------|-------------|---------|\n| `X_USERNAME` | ✅ **Yes** | Your Twitter/X username or email | `zlenner_` |\n| `X_EMAIL` | ✅ **Yes** | Your Twitter/X email address | `your.email@example.com` |\n| `X_PASSWORD` | ✅ **Yes** | Your Twitter/X password | `your_secure_password` |\n| `X_COOKIES` | ✅ **Yes** | Base64 encoded Twitter/X session cookies for persistent login | `eyJjb29raWVzIjogWy4uLl19...` |\n| `X_FORCE_PUSH_AUTH` | **Optional** | Can be set to anything, used to force app to retry login without making any changes to credentials. | `1` |\n| `X_HANDLES_TO_WATCH` | **Optional** | Single handle or a comma-separated string of X handles to watch and pull tweets from. | `DropSiteNews,BBCNews` OR just `DropSiteNews` |\n| `IMPROVMX_APIKEY` | **Optional** | ImprovMX API Key, used if you have an automated email set up that will let the app automatically enter 2FA verification codes. | `sk_321...` |\n\n\nEither one of (`X_USERNAME`, `X_EMAIL`, and `X_PASSWORD`) OR `X_COOKIES` is required.\n\n### WhatsApp API Configuration\n\n| Variable | Required | Description | Example |\n|----------|----------|-------------|---------|\n| `CHANNEL_ID` | ✅ **Yes** | WhatsApp phone number or channel ID to send messages to. | `16754393058@s.whatsapp.net` OR `923000000000@s.whatsapp.net` |\n\nCHANNEL_ID is an internal WhatsApp ID format for chats.\n\n1. For individual chats, it is the full international number + `@s.whatsapp.net`.\n2. For channels it is the random ID of the channel + `@newsletter`.\n3. For groups it's the random ID of the channel + `@g.us`.\n\nThe channel ID can be found from the View Contacts API, also accessable from our WhatsApp UI (will explain later).\n\n### Browser Configuration\n| Variable | Required | Description | Example |\n|----------|----------|-------------|---------|\n| `X_USER_AGENT` | **Optional** | Custom user agent string for Twitter/X requests. Best to copy-paste your computer's. | `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36` |\n| `WGCF_LICENSE_KEY` | **Optional** | WARP License Key, if you don't want to auto-register a limited account. | `7mx4k2pQ-V84J1NLX-a9WD7r02` |\n\n## HOW TO GET STARTED.\n\n1. Create a .env file and fill out the required ENV variables. At least the ones you can.\n\n2. If you want to run this locally, clone this repo `git clone https://github.com/zlenner/tweetky`, turn on docker, and enter the command `docker-compose up --build` in the same directory as the repo.\n\n3. Should be up and running! First navigate to the local URL provided from the terminal with the message `Login to WhatsApp @ ...`.\n\n4. This app works by reverse-engineering WhatsApp Web's API. Use your phone's \"linked devices\" feature on WhatsApp to scan the QR code and login.\n\n5. WhatsApp should be working now. If you have a channel whose ID you want to look up, navigate to the same URL minus the path (For example if it's `localhost:3000/path/to/qr_code.png` go to `localhost:3000`), and just scroll down to `List Newsletters`.\n\n6. Now's the time to setup X. Put in the env variables for `X_USERNAME`, `X_PASSWORD` and `X_EMAIL`. If that doesn't work (gives the LoginFlow error below) - see `Troubleshooting` below.\n\n## If run on a server\n\n1. Make sure to attach a persistent volume to the app, because otherwise neither will the X cookies be persisted between starts (this point is moot if you have the `X_COOKIES` variable set)... and neither will the tweets already sent be saved. Which means app will send a stream of duplicate tweets every time it's restarted.\n\n2. If internal networking of the server isn't working properly and you need to tweak the `WHATSAPP_API_URL`... be carefuly not to expose it publicly for too long, and if you do, no HTTP + secure username and password. Be thorough about security like would be in any app!\n\n## Troubleshooting.\n\nIf you get the error, `flow name LoginFlow is currently not accessible` - it means Twitter is blocking your requests based on a problematic User Agent or IP.\n\nUse a real user agent like from your own browser + try running the app locally (as it will have a residential IP) and copy-paste the `X_COOKIE` variable generated there into the server's ENV variable.\n\nThis is a pretty long-term fix. X doesn't seem to invalidate cookies for the week I've had this app test-running.\n\n## Lastly, an example.\n\nI made a DropSite channel with tweets sourced from their X account... go check it out. They've been pretty on-time and are a reliable source for the Iran-Israel conflict.\n\n[https://whatsapp.com/channel/0029VbAfFCB3WHTaPAAC7n1V](https://whatsapp.com/channel/0029VbAfFCB3WHTaPAAC7n1V)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzlenner%2Ftweetky","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzlenner%2Ftweetky","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzlenner%2Ftweetky/lists"}