Post one message + a link to many Discord channels at once — slowly, so you don't spam the communities or get the account flagged.
This tool automates a user account (a "self-bot"). That breaks Discord's Terms of Service, alt or not. There is no ToS-safe version of this.
To keep the risk low:
- Use a throwaway ALT account — never your main. If it ever gets banned, you lose the alt, not your real account and its community memberships.
- Leave the pacing alone. The 20–45s jittered gaps between posts are there on purpose. They keep you from looking like a bot and keep you from annoying the channels. Don't set them to 0.
- The alt still has to actually be a member of each server, and able to type in each channel, for posting to work. This doesn't bypass permissions.
If you'd rather stay fully within the rules later, ask the server mods for a webhook URL per channel — that's allowed and I can add webhook support.
-
Install Python 3.9+ (you have it if other projects run). Then:
pip install -r requirements.txt -
Copy the config template and fill it in:
copy config.example.json config.json
-
Get the alt account's token (this is the sketchy-but-necessary part):
- Log into the alt at https://discord.com/app in a browser.
- Press
F12(DevTools) → Network tab. - Type a message anywhere, or just refresh. Click a request to
messages(orscience/library). - In Request Headers, find
authorizationand copy its value. - Paste it as
"token"inconfig.json. - Treat this token like a password. Anyone with it controls the account. If it leaks, change the alt's password to reset it.
Instead of copying IDs one by one, let the tool list everything the alt can see:
python broadcast.py discoverThis prints every server + text channel with its channel_id and saves it to
channels.txt. Copy the channel_id of each channel you want into the
"targets" list in config.json. The "label" is just a note for you.
(You can also grab a single ID manually: Discord → Settings → Advanced → turn on Developer Mode, then right-click a channel → Copy Channel ID.)
In config.json:
"message": "🎵 New track just dropped — would love your ears on it:",
"link": "https://suno.com/song/your-song-id"They get combined as message on one line, the link on the next.
Always do a dry run first — it sends nothing, just shows the plan:
python broadcast.py post --dry-runWhen it looks right, send for real (it'll ask you to type yes):
python broadcast.py postSkip the confirmation with --yes. Use a different config with
--config other.json.
- Start with 2–3 channels to confirm it works before adding the whole list.
- If a channel fails with
403, the alt can't post there (no permission, or it's a read-only/announcement channel). - Posting the exact same link to many servers fast is the #1 way to get flagged — the slow pacing is your friend. For a big list, consider running it in a couple of smaller batches across the day.