A Python script that allows you to send multiple emoji reactions to Zoom Team Chat messages using the Zoom API.
- List recent chat messages from all your chats
- Browse messages from specific channels
- Send mass emoji reactions to any message
- Choose from 2400+ Zoom-supported emojis loaded from external file
- Random emoji selection with customizable count
- Custom emoji input support
- Rate limiting protection with configurable delays
pip install -r requirements.txtYou need to create a Zoom OAuth app and get an access token. Here's how:
- Go to Zoom App Marketplace
- Click "Develop" β "Build App"
- Choose "OAuth" app type
- Fill in basic information:
- App Name: "Emoji Sender"
- Short Description: "Send emoji reactions to chat messages"
- Company Name: Your name
- Set OAuth redirect URL (for testing, you can use
http://localhost:3000)
In the Scopes tab, add the following scopes:
team_chat:read:list_user_messages- To read chat messagesteam_chat:update:message_emoji- To send emoji reactionsteam_chat:read:list_user_channels- To list channelsuser:read:user- To get user information
Note: These are the Team Chat scopes. The older chat_message:* scopes have been replaced with team_chat:* scopes in newer Zoom apps.
- In your app's dashboard, find the "App Credentials" section
- Copy your Client ID and Client Secret
- You'll need these when running the
get_access_token.pyscript (see Setup step 3 below)
Important: Before running the helper script, you must set your redirect URI in your Zoom app:
- Go to https://marketplace.zoom.us/
- Open your OAuth app
- Find the "Redirect URL for OAuth" or "OAuth Redirect URLs" setting
- Add:
http://localhost:3000 - Save your changes
Now run the OAuth helper script:
python get_access_token.pyThis interactive script will:
- Ask for your Client ID and Client Secret
- Open your browser to authorize the app
- Automatically catch the authorization code
- Exchange it for an access token
- Save the token to a
.envfile
The access token will be automatically loaded by zoom_emoji_sender.py from the .env file.
Note: Access tokens typically expire after 1 hour. When it expires, simply run get_access_token.py again to get a new one.
Run the script:
python zoom_emoji_sender.pyThe script will guide you through:
- Authentication: Enter your access token if not set as environment variable
- Message Selection: Choose how to find the message:
- View recent messages from all chats
- Browse a specific channel
- Enter a message ID directly
- Emoji Selection: Choose emojis to send:
- Use all supported emojis (2400+ from
zoom_supported_emojis.txt) - Random selection (specify how many random emojis)
- Enter custom emojis (space-separated)
- Use all supported emojis (2400+ from
- Confirmation: Review and confirm before sending
================================================================================
ZOOM EMOJI SENDER
================================================================================
Fetching user information...
User ID: abc123xyz
Would you like to:
1. View recent messages from all chats
2. View messages from a specific channel
3. Enter a message ID directly
Enter choice (1/2/3): 1
Fetching recent messages...
================================================================================
RECENT MESSAGES
================================================================================
[1] ID: msg_abc123
From: john@example.com
Time: 2025-10-27T10:30:00Z
Message: Hey everyone, great meeting today!
[2] ID: msg_def456
From: jane@example.com
Time: 2025-10-27T09:15:00Z
Message: Don't forget about the deadline tomorrow!
================================================================================
Enter the message number to spam with emojis: 1
Loaded 2448 unique emojis from zoom_supported_emojis.txt
Emoji options:
1. Use all supported emojis (2448 emojis)
2. Random selection (specify count)
3. Enter custom emojis
Enter choice (1/2/3): 2
How many random emojis? (1-2448): 50
Randomly selected 50 emojis!
Sample: π π¨ π» π‘ π π β π₯ π― π― β€οΈ π π΅ π π πΊ π¦ β‘ π π
About to send 50 emoji reactions to message ID: msg_abc123
Sample emojis: π π¨ π» π‘ π π β π₯ π― π―
Proceed? (yes/no): yes
Sending 50 emoji reactions...
--------------------------------------------------------------------------------
β Added π
β Added π¨
β Added π»
...
--------------------------------------------------------------------------------
β Successfully sent 50/50 emoji reactions!
The script uses the following Zoom API endpoints:
GET /v2/users/me- Get current user informationGET /v2/team_chat/users/{userId}/channels- List chat channelsGET /v2/team_chat/users/{userId}/messages- List chat messagesPATCH /v2/team_chat/users/{userId}/messages/{messageId}/emoji_reactions- Add/remove emoji reactions
The script includes a configurable delay (default 1.0 seconds) between emoji reactions to avoid hitting Zoom's API rate limits. Zoom API rate limits vary by account type and endpoint tier:
| Rate Limit Type | Free | Pro | Business+ |
|---|---|---|---|
| Light APIs | 4/second, 6000/day | 30/second | 80/second |
| Medium APIs | 2/second, 2000/day | 20/second | 60/second |
| Heavy APIs | 1/second, 1000/day | 10/second* | 40/second* |
| Resource-intensive APIs | 10/minute, 30,000/day | 10/minute* | 20/minute* |
The emoji reaction endpoint is classified as Medium tier. The default 1.0s delay (1 req/sec) is safe for Free accounts and conservative for Pro/Business+ accounts.
For Free accounts:
- Maximum 2000 reactions per day
- Recommended delay: 1.0s (stays under 2/second limit)
For Pro/Business+ accounts:
- You can reduce the delay for faster sending
- Pro: Up to 20 reactions/second (0.05s delay)
- Business+: Up to 60 reactions/second (0.017s delay)
You can adjust the delay in the spam_emojis() method, but be aware of rate limiting consequences for your account tier.
The script automatically handles pagination for both channels and messages, retrieving all available results across multiple pages.
Detailed error messages from the Zoom API are captured and displayed, making debugging easier when issues occur.
The script properly handles various response types including empty responses (204 No Content) and JSON responses.
Make sure you've either set the ZOOM_ACCESS_TOKEN environment variable or enter it when prompted.
Your access token may have expired. Zoom OAuth tokens typically expire after 1 hour. Generate a new token.
Your app may not have the required scopes. Double-check that you've added all necessary scopes in your Zoom app settings.
The message ID may be invalid or you may not have access to that message.
If you encounter rate limit errors, increase the delay parameter in the spam_emojis() call.
- Emoji reactions are added individually, so sending 70 emojis will make 70 API calls
- The script respects rate limits with built-in delays
- Access tokens expire - you'll need to refresh them periodically
- You can only react to messages you have access to (in your channels/conversations)
Use this script responsibly! Spamming emojis may annoy your colleagues. This tool is intended for fun and testing purposes.
MIT License - feel free to modify and use as needed!