Mesaj ve Zengin Bloklar Gönderme
Düz metin, markdown, Block Kit JSON — Slack mesajlarını biçimlendirme.
Mesaj ve Zengin Bloklar Gönderme, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 3. 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.
say() ile Basit Metin Mesajları
Slack mesajı göndermenin en basit yolu say(text) kullanmaktır. Metin, Slack'in Markdown türevi olan mrkdwn biçimini destekler. *bold*, _italic_, ~strike~, `code` ve <@USERID> gibi bahsetmeleri kullanın.
@app.event('app_mention')
def handle_mention(event, say):
user = event['user']
# Simple text response with mrkdwn formatting
say(
text=(
f'Hello <@{user}>!\n'
'*Agent Report:*\n'
'- Tasks completed: `42`\n'
'- Errors: `0`\n'
'- _Runtime: 3.2 seconds_'
),
mrkdwn=True # enabled by default
)
# Slack mentions
say(f'<@{user}> your request is being processed')
say('Posting to <!channel>: all hands meeting tomorrow')Block Kit'e Giriş
Block Kit, zengin ve etkileşimli mesajlar oluşturmak için Slack'in kullanıcı arayüzü çatısıdır. Düz metin yerine mesajları türlendirilmiş bloklardan oluşturursunuz: section, header, divider, actions, context. Bloklar, say() veya chat_postMessage() işlevlerinin blocks parametresine liste olarak geçirilir.
@app.event('app_mention')
def handle_mention(event, say):
blocks = [
{
'type': 'header',
'text': {'type': 'plain_text', 'text': 'Agent Status Report'}
},
{
'type': 'divider'
},
{
'type': 'section',
'text': {
'type': 'mrkdwn',
'text': '*Status:* Running\n*Tasks:* 42 completed'
}
}
]
say(
text='Agent Status Report', # fallback for notifications
blocks=blocks
)Metin Alanları İçeren Bölüm Blokları
Bölüm bloğu en çok yönlü bloktur. Metin (mrkdwn veya plain_text), anahtar-değer çiftlerinden oluşan bir alan listesi ya da yardımcı bir öğe (düğme, görüntü, taşma menüsü) görüntüleyebilir. Yan yana anahtar-değer çiftleri için fields kullanın — panolar için harika bir seçimdir.
def build_task_summary_blocks(tasks):
blocks = [
{
'type': 'header',
'text': {'type': 'plain_text', 'text': 'Daily Task Summary'}
},
{
'type': 'section',
'text': {
'type': 'mrkdwn',
'text': f'Processed *{len(tasks)} tasks* today.'
}
},
{
'type': 'section',
'fields': [
{'type': 'mrkdwn', 'text': f'*Completed:*\n{sum(1 for t in tasks if t["status"]=="done")}'},
{'type': 'mrkdwn', 'text': f'*Failed:*\n{sum(1 for t in tasks if t["status"]=="error")}'},
{'type': 'mrkdwn', 'text': f'*Pending:*\n{sum(1 for t in tasks if t["status"]=="pending")}'},
{'type': 'mrkdwn', 'text': f'*Avg Time:*\n3.2s'}
]
}
]
return blocks
# --- demo ---
tasks = [
{'status': 'done'}, {'status': 'done'}, {'status': 'error'}, {'status': 'pending'}
]
blocks = build_task_summary_blocks(tasks)
for b in blocks:
print(b)
Başlık ve Ayırıcı Blokları
Büyük bölüm başlıkları için başlık bloklarını, görsel ayırma için ayırıcı bloklarını kullanın. Başlık bloğu yalnızca plain_text biçimini destekler (mrkdwn desteklenmez). İyi yapılandırılmış rapor mesajları oluşturmak için bunları birleştirin.
def build_report_message(title, sections):
blocks = []
# Header
blocks.append({
'type': 'header',
'text': {'type': 'plain_text', 'text': title, 'emoji': True}
})
for section_title, content in sections:
# Divider between sections
blocks.append({'type': 'divider'})
# Section header as bold mrkdwn
blocks.append({
'type': 'section',
'text': {'type': 'mrkdwn', 'text': f'*{section_title}*\n{content}'}
})
return blocks
blocks = build_report_message(
title='Weekly Agent Report',
sections=[
('Emails Processed', '142 emails classified, 38 replies drafted'),
('Tasks Completed', '89 tasks completed, 3 failures logged')
]
)
# --- demo ---
for b in blocks:
print(b)
Düğmeli Eylem Blokları
Eylemler blokları, düğmeler gibi etkileşimli öğeler içerir. Her düğmede tıklamaları işleyicilere yönlendirmek için kullanılan bir action_id, bir text ve isteğe bağlı olarak veri taşıyan bir value bulunur. Ana CTA için style: 'primary', yıkıcı eylemler için style: 'danger' kullanın.
def build_approval_message(task_id, task_description):
blocks = [
{
'type': 'section',
'text': {
'type': 'mrkdwn',
'text': f'*Task ready for approval:*\n{task_description}'
}
},
{
'type': 'actions',
'elements': [
{
'type': 'button',
'text': {'type': 'plain_text', 'text': 'Approve'},
'style': 'primary',
'action_id': 'approve_task',
'value': task_id
},
{
'type': 'button',
'text': {'type': 'plain_text', 'text': 'Reject'},
'style': 'danger',
'action_id': 'reject_task',
'value': task_id
}
]
}
]
return blocks
# --- demo ---
blocks = build_approval_message('task_42', 'Deploy backend v2.3 to production')
for b in blocks:
print(b)
Üstveri için Bağlam Blokları
Bağlam blokları, mesajın altında küçük ve ikincil metinler görüntüler — zaman damgaları, kaynaklar veya ajan sürümü bilgileri gibi üstveriler için idealdir. mrkdwn ve görüntüleri (küçük simgeler için) destekler.
import datetime
def add_context_footer(blocks, agent_version='v1.2'):
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M UTC')
blocks.append({
'type': 'context',
'elements': [
{
'type': 'mrkdwn',
'text': f'Generated by Agent {agent_version} | {timestamp}'
}
]
})
return blocks
# Full message with context footer
blocks = [
{
'type': 'section',
'text': {'type': 'mrkdwn', 'text': 'Analysis complete. See results below.'}
}
]
blocks = add_context_footer(blocks)
print(f'Message has {len(blocks)} blocks')Metin Alanlarında mrkdwn
Slack'in mrkdwn biçimi, Markdown'un bir alt kümesini destekler. Ajan mesajları için temel biçimlendirme seçenekleri şunlardır: kalın, italik, kod, bağlantılar, kanal bahsetmeleri, kullanıcı bahsetmeleri ve listeler. Yapay zekâ tarafından oluşturulan içeriği Slack'te okunabilir hâle getirmek için bunları kullanın.
def format_ai_response_as_mrkdwn(title, bullet_points, code_snippet=None):
lines = [f'*{title}*']
for point in bullet_points:
lines.append(f'• {point}')
if code_snippet:
lines.append(f'```{code_snippet}```') # code block
return '\n'.join(lines)
content = format_ai_response_as_mrkdwn(
title='Security Issues Found',
bullet_points=[
'SQL injection risk in `user_search()` function',
'Hardcoded API key in `config.py` line 42',
'Missing HTTPS on login endpoint'
],
code_snippet='SELECT * FROM users WHERE id = " + userId + "\n# ^ UNSAFE: use parameterized queries'
)
print(content)respond() ile Geçici Mesajlar
Geçici mesajlar, eylemi tetikleyen kullanıcıya görünür; diğer kanal üyeleri göremez. Kanalı gereksiz yere doldurması gerekmeyen durum güncellemeleri, hata mesajları ve onaylar için bunları kullanın. Yalnızca respond() (eğik çizgi komutları) veya chat_postEphemeral() aracılığıyla kullanılabilir.
@app.command('/check-status')
def handle_status(ack, respond, body, client):
ack()
user_id = body['user_id']
channel_id = body['channel_id']
# Ephemeral: only the user who ran /check-status sees this
respond(
text='Checking agent status...',
response_type='ephemeral'
)
status = get_agent_status()
# Or use chat_postEphemeral for more control
client.chat_postEphemeral(
channel=channel_id,
user=user_id,
text=f'Agent Status: {status}',
blocks=build_status_blocks(status)
)Gönderdikten Sonra Mesajları Güncelleme
Bir mesaj gönderdikten sonra kanalı ve mesaj zaman damgasını (ts) içeren client.chat_update() ile mesajı güncelleyebilirsiniz. Bu, ilerleme güncellemeleri için kullanışlıdır — önce 'İşleniyor...' mesajını gönderin, ardından işlem tamamlandığında sonucu içerecek şekilde güncelleyin.
@app.command('/analyze')
def handle_analyze(ack, say, respond, body, client):
ack()
text = body.get('text', '')
channel = body['channel_id']
# Post initial message
initial = client.chat_postMessage(
channel=channel,
text='Analyzing... this may take a moment.'
)
message_ts = initial['ts']
# Do the work
import threading
def do_work():
result = slow_ai_analysis(text)
# Update the original message with the result
client.chat_update(
channel=channel,
ts=message_ts,
text=f'Analysis complete: {result}',
blocks=build_result_blocks(result)
)
threading.Thread(target=do_work, daemon=True).start()Belirli Kanallara Mesaj Gönderme
Botunuzun erişebildiği herhangi bir kanala mesaj göndermek için client.chat_postMessage(channel=channel_id, text=...) kullanın. Kanal kimliklerini Slack API'sinde veya bir kanala sağ tıklayarak bulun. Kanalları programatik olarak ada göre aramak için conversations_list() kullanın.
def post_alert_to_channel(client, channel_name, alert_message):
# Look up channel ID by name
result = client.conversations_list(
types='public_channel,private_channel',
limit=200
)
channel_id = None
for ch in result['channels']:
if ch['name'] == channel_name:
channel_id = ch['id']
break
if not channel_id:
print(f'Channel #{channel_name} not found')
return None
# Post the alert
response = client.chat_postMessage(
channel=channel_id,
text=alert_message,
unfurl_links=False, # don't expand URLs
unfurl_media=False
)
print(f'Posted to #{channel_name}: ts={response["ts"]}')
return response
# --- demo: minimal stand-in for the Slack client ---
class _FakeClient:
def conversations_list(self, **kwargs):
return {'channels': [{'name': 'alerts', 'id': 'C123'}, {'name': 'general', 'id': 'C456'}]}
def chat_postMessage(self, **kwargs):
print(f"[slack] postMessage to {kwargs['channel']}: {kwargs['text']}")
return {'ts': '1699999999.000100'}
post_alert_to_channel(_FakeClient(), 'alerts', 'Disk usage above 90% on web-1')
Block Kit Mesaj Oluşturucu Deseni
Veri alan ve bir blok listesi döndüren bir oluşturucu işlev kullanın. Böylece mesaj biçimlendirmesi iş mantığından ayrılır ve bloklarınızı farklı olay işleyicilerinde yeniden kullanabilirsiniz.
def build_alert_blocks(level, title, details, link=None):
level_emoji = {'info': ':information_source:',
'warning': ':warning:', 'error': ':x:'}.get(level, '')
blocks = [
{
'type': 'header',
'text': {'type': 'plain_text', 'text': f'{level_emoji} {title}'}
},
{
'type': 'section',
'text': {'type': 'mrkdwn', 'text': details}
}
]
if link:
blocks.append({
'type': 'actions',
'elements': [{
'type': 'button',
'text': {'type': 'plain_text', 'text': 'View Details'},
'url': link,
'action_id': 'view_details'
}]
})
import datetime
blocks.append({
'type': 'context',
'elements': [{'type': 'mrkdwn',
'text': datetime.datetime.now().strftime('%Y-%m-%d %H:%M UTC')}]
})
return blocks
# --- demo ---
blocks = build_alert_blocks('warning', 'High latency', 'p95 latency is 3.2s', link='https://dash.example.com')
for b in blocks:
print(b)
Hızlı Kontrol: Blok Türleri
Slack Block Kit konusundaki anlayışınızı sınayın.
Zengin Mesajlar Özeti
Ajanınız artık profesyonel ve etkileşimli Slack mesajları gönderebilir:
- say(text) — basit mrkdwn metni; *kalın*, _italik_, `code` ve bahsetmeleri destekler
- say(blocks=[...]) — yapılandırılmış düzen için Block Kit
- başlık — büyük bölüm başlığı (yalnızca plain_text)
- bölüm — isteğe bağlı alanlara (anahtar-değer ızgarası) veya tek bir yardımcı öğeye sahip metin gövdesi
- ayırıcı — yatay ayırma çizgisi
- eylemler — düğmeler ve etkileşimli öğeler için kapsayıcı
- bağlam — altta yer alan küçük üstveri metni
- respond(response_type='ephemeral') — yalnızca tetikleyen kullanıcıya görünen mesaj
- chat_update(ts=...) — daha önce gönderilmiş bir mesajı yeni içerikle güncelleme
Yapay zeka eğitmeniyle AI Agents öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 60
- Dersler
- 239
Sıkça Sorulan Sorular
“Mesaj ve Zengin Bloklar Gönderme” dersi ücretsiz mi?
Evet — “Mesaj ve Zengin Bloklar Gönderme” 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.
“Mesaj ve Zengin Bloklar Gönderme” dersinde ne öğreneceğim?
Düz metin, markdown, Block Kit JSON — Slack mesajlarını biçimlendirme. 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 3. dersidir.
“Mesaj ve Zengin Bloklar Gönderme” 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