Etkinlikleri ve Eğik Çizgi Komutlarını Dinleme
Slack Bolt'ta app_mention, eğik çizgi komutları ve eylem işleyicileri.
Etkinlikleri ve Eğik Çizgi Komutlarını Dinleme, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Slack Olay Aboneliklerine Genel Bakış
Slack, bir şey olduğunda uygulamanıza olaylar gönderir — bir mesajın yayımlanması, birinin botunuzdan bahsetmesi veya bir kullanıcının kanala katılması gibi. Slack uygulaması panosunda belirli olay türlerine abone olun, ardından Bolt'ta @app.event() dekoratörünü kullanarak işleyicileri kaydedin.
from slack_bolt import App
import os
app = App(
token=os.environ['SLACK_BOT_TOKEN'],
signing_secret=os.environ['SLACK_SIGNING_SECRET']
)
# Register event handlers with @app.event()
# The string argument must match the Slack event type exactly
@app.event('app_mention')
def handle_mention(event, say, logger):
logger.info(f'Mention event: {event}')
say(f'Hello <@{event["user"]}>!')
@app.event('message')
def handle_message(event, say):
# Fires for every message in subscribed channels
if event.get('subtype') is None: # ignore bot messages
print(f'Message: {event["text"]}')app_mention Olaylarını İşleme
Birisi kanalda @YourBot yazdığında app_mention olayı tetiklenir. event['text'], bahsetme de dâhil olmak üzere tam mesajı içerir. Kullanıcının asıl sorgusunu almak için bahsetme önekini kaldırın.
import re
@app.event('app_mention')
def handle_mention(event, say, client):
# event['text'] example: '<@U0123BOT> summarize this'
text = event.get('text', '')
user_id = event['user']
channel = event['channel']
# Remove the @mention to get the clean query
clean_text = re.sub(r'<@[A-Z0-9]+>', '', text).strip()
print(f'User {user_id} asked: {clean_text}')
if not clean_text:
say(f'Hi <@{user_id}>! How can I help you today?')
return
# Process the query
response = process_user_query(clean_text, user_id)
say(response)Olay Yüküne Erişme
Her olay işleyicisi, ham Slack olay yükünü içeren event sözlüğünü alır. Önemli alanlar: event['user'] (kullanıcı kimliği), event['channel'] (kanal kimliği), event['text'] (mesaj içeriği), event['ts'] (zaman damgası/mesaj kimliği).
@app.event('app_mention')
def handle_mention(event, say, client):
print('Event type:', event.get('type'))
print('User ID:', event.get('user')) # e.g. 'U0123ABC'
print('Channel:', event.get('channel')) # e.g. 'C0456DEF'
print('Text:', event.get('text')) # full message text
print('Timestamp:', event.get('ts')) # '1234567890.123456'
print('Thread TS:', event.get('thread_ts')) # if in a thread
# Get full user info from the user ID
user_info = client.users_info(user=event['user'])
real_name = user_info['user']['real_name']
email = user_info['user']['profile'].get('email', '')
say(f'Hello {real_name}!')Eğik Çizgi Komutları — Kaydetme ve Yanıtlama
Eğik çizgi komutları, kullanıcıların herhangi bir Slack kanalından ajan eylemlerini tetiklemesini sağlar. Komut URL'sini Slack uygulaması panosunda ( Eğik Çizgi Komutları bölümünde) kaydedin, ardından komutu @app.command('/command-name') ile işleyin. Her zaman hemen ack() çağrısı yapın — bunu yapmazsanız Slack 3 saniye içinde zaman aşımına uğrar.
@app.command('/summarize')
def handle_summarize(ack, body, say, respond):
# CRITICAL: ack() must be called within 3 seconds
ack() # acknowledge the command immediately
# body contains the command payload
user_id = body['user_id']
channel_id = body['channel_id']
text = body.get('text', '').strip() # text after the command
print(f'User {user_id} ran /summarize with: "{text}"')
if not text:
respond('Usage: /summarize <text or URL to summarize>')
return
# Process and respond
summary = generate_summary(text)
say(f'Summary by <@{user_id}>:\n{summary}')ack() — 3 Saniye Kuralı
Slack, uygulamanızın gelen her eğik çizgi komutunu ve etkileşimli yükü 3 saniye içinde ack() çağrısıyla onaylamasını gerektirir. Bunu yapmazsanız Slack kullanıcıya bir hata gösterir. Uzun süren işlemler için hemen onaylayın, işlemi bir arka plan iş parçacığında başlatın, ardından sonucu respond() kullanarak yanıtlayın.
import threading
@app.command('/analyze')
def handle_analyze(ack, body, respond):
ack() # Must be within 3 seconds!
text = body.get('text', '').strip()
if not text:
respond('Please provide text to analyze.')
return
# For slow operations: run in background thread
def process_in_background():
result = slow_ai_analysis(text) # may take 10+ seconds
respond(f'Analysis complete:\n{result}')
thread = threading.Thread(target=process_in_background)
thread.daemon = True
thread.start()
# respond() is safe to call from a different thread
# ack() already sent, Slack won't time outsay() ve respond() — Hangisi Ne Zaman Kullanılır
Slack'e geri mesaj gönderen iki işlev vardır:
say()— olayın gerçekleştiği kanala gönderir; herkes görebilirrespond()— yalnızca eğik çizgi komutu işleyicilerinde kullanılabilir; yalnızca komutu kullanan kişiye görünen geçici mesajlar gönderebilir
Genel yanıtlar için respond(response_type='in_channel'), özel yanıtlar için respond(response_type='ephemeral') kullanın.
@app.command('/status')
def handle_status(ack, respond, body):
ack()
# Ephemeral: only visible to the user who ran the command
respond(
text='Agent status: Running | Queue: 3 tasks | Uptime: 4h 22m',
response_type='ephemeral' # private to command user
)
@app.command('/broadcast')
def handle_broadcast(ack, say, respond, body):
ack()
text = body.get('text', '')
# Public: visible to everyone in the channel
say(
text=f'<@{body["user_id"]}> broadcast: {text}',
channel=body['channel_id']
)
# Confirm privately to the sender
respond('Broadcast sent!', response_type='ephemeral')Mesaj Olayları ve Alt Türler
Genel message olayı; bot mesajları, düzenlemeler ve silmeler dâhil tüm mesajlar için tetiklenir. Filtrelemek için subtype alanını kullanın. Yaygın alt türler: bot_message, message_changed, message_deleted. subtype yoksa bu normal bir kullanıcı mesajıdır.
@app.event('message')
def handle_message(event, say, client):
subtype = event.get('subtype')
# Ignore bot messages to prevent loops
if subtype == 'bot_message':
return
# Ignore message edits and deletes
if subtype in ('message_changed', 'message_deleted'):
return
# Only process direct messages (DMs) to the bot
channel_type = event.get('channel_type', '')
if channel_type == 'im':
text = event.get('text', '').strip()
user = event['user']
print(f'DM from {user}: {text}')
say(f'You said: {text}')Tepkileri Dinleme
Birisi mesaja emoji tepkisi eklediğinde reaction_added olayı tetiklenir. Bunu ajan eylemlerini tetiklemek için kullanabilirsiniz — örneğin bir mesajı kaydetmek için 📌 tepkisi, bir görevi tamamlandı olarak işaretlemek için ✅ tepkisi ekleyebilirsiniz.
@app.event('reaction_added')
def handle_reaction(event, client, say):
reaction = event['reaction'] # e.g. 'thumbsup', 'white_check_mark'
user_id = event['user'] # who reacted
item = event['item'] # what was reacted to
print(f'User {user_id} reacted :{reaction}: to {item["type"]}')
if reaction == 'white_check_mark' and item['type'] == 'message':
# Fetch the original message
result = client.conversations_history(
channel=item['channel'],
oldest=item['ts'],
latest=item['ts'],
inclusive=True,
limit=1
)
messages = result.get('messages', [])
if messages:
text = messages[0].get('text', '')
print(f'Task completed: {text[:100]}')Etkileşimli Bileşenlerden Gelen Eylem Yükleri
Kullanıcı bir düğmeye tıkladığında veya bir menü öğesi seçtiğinde Slack bir eylem yükü gönderir. Bunu @app.action('action_id') ile işleyin. Eylem kimliği, Block Kit bileşenini oluştururken ayarladığınız dizedir. Her zaman hemen ack() çağrısı yapın.
@app.action('approve_task')
def handle_approve(ack, body, respond, client):
ack() # acknowledge within 3 seconds
action = body['actions'][0] # the button that was clicked
action_id = action['action_id'] # 'approve_task'
value = action.get('value', '') # data attached to the button
user_id = body['user']['id']
print(f'User {user_id} clicked {action_id} with value: {value}')
# Update the original message to show it was approved
client.chat_update(
channel=body['container']['channel_id'],
ts=body['container']['message_ts'],
text=f'Task approved by <@{user_id}>',
blocks=[] # remove buttons after action
)
respond('Task approved!', response_type='ephemeral')Olayları Kanala veya Kullanıcıya Göre Filtreleme
Büyük çalışma alanlarında botunuz birçok kanaldan olay alabilir. Yalnızca ilgili olayları işlemek için işleyicinizde erken filtreleme yapın. event['channel'] değerini izin verilen bir listeyle karşılaştırın veya diğer botlar gibi belirli kullanıcıları yok saymak için event['user'] değerini denetleyin.
import os
# Only respond in designated channels
ALLOWED_CHANNELS = set(
os.environ.get('ALLOWED_CHANNELS', '').split(',')
)
BOT_USER_IDS = set() # will be populated at startup
@app.event('app_mention')
def handle_mention(event, say, client):
channel = event.get('channel', '')
user = event.get('user', '')
# Skip if channel not in allowed list (if list is configured)
if ALLOWED_CHANNELS and channel not in ALLOWED_CHANNELS:
return
# Skip if the 'user' is actually a bot
if user in BOT_USER_IDS:
return
text = event.get('text', '').strip()
say(f'Processing: {text[:50]}')İş Parçacığı Yanıtı Desteği
Ana kanal yerine bir iş parçacığında yanıt vermek için thread_ts değerini say() işlevine geçirin. İş parçacığının zaman damgasını almak için event.get('thread_ts', event['ts']) kullanın — thread_ts yalnızca mesaj zaten bir iş parçacığındaysa vardır; yoksa yeni bir iş parçacığı başlatmak için mesajın kendi ts değerini kullanın.
@app.event('app_mention')
def handle_mention_in_thread(event, say):
user = event['user']
text = event.get('text', '').strip()
# Reply in the same thread (or start a new one)
thread_ts = event.get('thread_ts') or event.get('ts')
response_text = f'<@{user}>, processing your request...'
say(
text=response_text,
thread_ts=thread_ts # keeps the reply in the thread
)
# Do the actual work
result = do_agent_work(text)
say(
text=f'Done! Result:\n{result}',
thread_ts=thread_ts
)Hızlı Kontrol: ack() Zamanlaması
Slack olaylarını işleme konusundaki anlayışınızı sınayın.
Olaylar ve Eğik Çizgi Komutları Özeti
Slack ajanınız artık tüm kullanıcı etkileşimlerine yanıt verebilir:
- @app.event('app_mention') — @bot bahsetmelerini işleyin; bahsetme önekini normal ifadeyle kaldırın
- @app.command('/cmd') — eğik çizgi komutlarını işleyin; her zaman 3 saniye içinde
ack()çağrısı yapın - say() — kanala genel mesaj gönderir; respond() — eğik çizgi komutuna yanıt verir (geçici olabilir)
- @app.action('id') — düğme tıklamalarını ve etkileşimli bileşen etkileşimlerini işler
- @app.event('reaction_added') — emoji tepkileriyle tetiklenir
- Yanıtları iş parçacıklarında tutmak için say() içinde
thread_tskullanın - İlgisiz olayları işlemekten kaçınmak için erken aşamada kanala/kullanıcıya göre filtreleyin
Sıkça Sorulan Sorular
“Etkinlikleri ve Eğik Çizgi Komutlarını Dinleme” dersi ücretsiz mi?
Evet — “Etkinlikleri ve Eğik Çizgi Komutlarını Dinleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Etkinlikleri ve Eğik Çizgi Komutlarını Dinleme” dersinde ne öğreneceğim?
Slack Bolt'ta app_mention, eğik çizgi komutları ve eylem işleyicileri. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Etkinlikleri ve Eğik Çizgi Komutlarını Dinleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Slack Bolt SDK Temelleri
- Etkinlikleri ve Eğik Çizgi Komutlarını Dinleme
- Mesaj ve Zengin Bloklar Gönderme
- Ekip Bildirim Botu Oluşturma