Python Slack Events API adapter for Flask that provides event-driven Slack app development
—
Event listener registration and management using PyEE's event emitter pattern. The SlackEventAdapter inherits from BaseEventEmitter, providing comprehensive event handling capabilities for processing various Slack event types.
Register callback functions to handle specific Slack event types using the decorator pattern or direct method calls.
def on(self, event_type: str, callback: callable):
"""
Register an event listener for a specific event type.
Parameters:
- event_type: str - The Slack event type to listen for (e.g., "message", "reaction_added")
- callback: callable - Function to call when the event occurs
Returns:
The callback function (for use as decorator)
"""Emit events to registered listeners (primarily used internally for error handling).
def emit(self, event_type: str, *args):
"""
Emit an event to all registered listeners.
Parameters:
- event_type: str - The event type to emit
- *args: Arguments to pass to event listeners
Returns:
None
"""The adapter can listen for any Slack event type. Common event types include:
"message" - Messages posted in channels"reaction_added" - Emoji reactions added to messages"reaction_removed" - Emoji reactions removed from messages"app_mention" - App mentioned in messages"team_join" - New team members join"user_change" - User profile changes"channel_created" - New channels created"error" - Internal errors (signature verification failures, etc.)All Slack events (except "error") receive event data with this structure:
{
"token": "verification_token", # Legacy verification token
"team_id": "T1234567890", # Slack team ID
"api_app_id": "A1234567890", # Slack app ID
"event": { # The actual event data
"type": "message", # Event type
"channel": "C1234567890", # Channel ID
"user": "U1234567890", # User ID
"text": "Hello world!", # Message content (for message events)
"ts": "1234567890.123456", # Timestamp
# ... other event-specific fields
},
"type": "event_callback", # Always "event_callback" for events
"event_id": "Ev1234567890", # Unique event ID
"event_time": 1234567890 # Event timestamp
}from slackeventsapi import SlackEventAdapter
slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")
@slack_events_adapter.on("message")
def handle_message(event_data):
event = event_data["event"]
if event.get("subtype") is None: # Ignore special message subtypes
user = event["user"]
text = event["text"]
channel = event["channel"]
print(f"Message from {user} in {channel}: {text}")
@slack_events_adapter.on("reaction_added")
def handle_reaction(event_data):
event = event_data["event"]
emoji = event["reaction"]
user = event["user"]
print(f"User {user} added reaction: {emoji}")from slackeventsapi import SlackEventAdapter
slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")
def app_mention_handler(event_data):
event = event_data["event"]
text = event["text"]
channel = event["channel"]
print(f"App mentioned in {channel}: {text}")
# Register handler directly
slack_events_adapter.on("app_mention", app_mention_handler)from slackeventsapi import SlackEventAdapter
from slackeventsapi.server import SlackEventAdapterException
slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")
@slack_events_adapter.on("error")
def error_handler(error):
if isinstance(error, SlackEventAdapterException):
print(f"Slack Events API Error: {error}")
if "Invalid request signature" in str(error):
print("Check your signing secret configuration")
elif "Invalid request timestamp" in str(error):
print("Request timestamp is too old (>5 minutes)")
else:
print(f"Unknown error: {error}")from slackeventsapi import SlackEventAdapter
slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")
def universal_handler(event_data):
event_type = event_data["event"]["type"]
print(f"Received event: {event_type}")
# Register same handler for multiple event types
slack_events_adapter.on("message", universal_handler)
slack_events_adapter.on("reaction_added", universal_handler)
slack_events_adapter.on("app_mention", universal_handler)from slackeventsapi import SlackEventAdapter
slack_events_adapter = SlackEventAdapter(signing_secret="your_secret")
@slack_events_adapter.on("message")
def handle_greetings(event_data):
event = event_data["event"]
# Only process direct messages (no subtype) containing "hi"
if (event.get("subtype") is None and
event.get("channel_type") == "im" and
"hi" in event.get("text", "").lower()):
user = event["user"]
print(f"Greeting from user {user}")Install with Tessl CLI
npx tessl i tessl/pypi-slackeventsapi