Mengirim Pesan dan Blok Kaya
Teks biasa, markdown, JSON Block Kit — memformat pesan Slack.
Mengirim Pesan dan Blok Kaya adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Pesan Teks Sederhana dengan say()
Cara paling sederhana untuk memposting pesan Slack adalah say(text). Teks tersebut mendukung mrkdwn — varian markdown Slack. Gunakan *bold*, _italic_, ~strike~, `code`, dan penyebutan seperti <@USERID>.
@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')Pengenalan Block Kit
Block Kit adalah kerangka UI Slack untuk membuat pesan yang kaya dan interaktif. Alih-alih teks biasa, Anda menyusun pesan dari blok bertipe: section, header, divider, actions, context. Blok diteruskan sebagai daftar ke parameter blocks milik say() atau chat_postMessage().
@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
)Blok Bagian dengan Kolom Teks
Blok bagian adalah blok yang paling serbaguna. Blok ini dapat menampilkan teks (mrkdwn atau plain_text), daftar pasangan kunci-nilai, atau elemen aksesori (tombol, gambar, menu luapan). Gunakan fields untuk pasangan kunci-nilai berdampingan — sangat cocok untuk dasbor.
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)
Blok Tajuk dan Pemisah
Gunakan blok tajuk untuk judul bagian berukuran besar dan blok pemisah untuk pemisahan visual. Blok tajuk hanya mendukung plain_text (tanpa mrkdwn). Gabungkan keduanya untuk membuat pesan laporan yang terstruktur dengan baik.
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)
Blok Tindakan dengan Tombol
Blok tindakan berisi elemen interaktif seperti tombol. Setiap tombol memiliki action_id (digunakan untuk merutekan klik ke penangan), text, dan value opsional yang membawa data. Gunakan style: 'primary' untuk CTA utama dan style: 'danger' untuk tindakan yang berisiko merusak data.
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)
Blok Konteks untuk Metadata
Blok konteks menampilkan teks kecil sekunder di bagian bawah pesan — sangat cocok untuk metadata seperti stempel waktu, sumber, atau informasi versi agen. Blok ini mendukung mrkdwn dan gambar (untuk ikon kecil).
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')mrkdwn pada Kolom Teks
mrkdwn Slack mendukung sebagian fitur markdown. Opsi pemformatan utama untuk pesan agen meliputi teks tebal, miring, kode, tautan, penyebutan kanal, penyebutan pengguna, dan daftar. Gunakan opsi ini agar konten yang dihasilkan AI mudah dibaca di Slack.
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)Pesan Sementara dengan respond()
Pesan sementara hanya terlihat oleh pengguna yang memicu tindakan — bukan oleh anggota kanal lainnya. Gunakan pesan ini untuk pembaruan status, pesan kesalahan, dan konfirmasi yang tidak perlu memenuhi kanal. Pesan ini hanya tersedia melalui respond() (perintah slash) atau chat_postEphemeral().
@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)
)Memperbarui Pesan Setelah Dikirim
Setelah memposting pesan, Anda dapat memperbaruinya menggunakan client.chat_update() dengan kanal dan stempel waktu pesan (ts). Ini berguna untuk pembaruan kemajuan — posting pesan awal seperti 'Sedang diproses...', lalu perbarui dengan hasilnya setelah selesai.
@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()Memposting ke Kanal Tertentu
Gunakan client.chat_postMessage(channel=channel_id, text=...) untuk memposting ke kanal mana pun yang dapat diakses bot Anda. Temukan ID kanal di API Slack atau dengan mengeklik kanan kanal. Gunakan conversations_list() untuk mencari kanal berdasarkan nama secara terprogram.
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')
Pola Pembuat Pesan Block Kit
Gunakan fungsi pembuat yang menerima data dan mengembalikan daftar blok. Dengan demikian, pemformatan pesan terpisah dari logika bisnis dan blok Anda dapat digunakan kembali di berbagai penangan peristiwa.
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)
Pemeriksaan Singkat: Jenis Blok
Uji pemahaman Anda tentang Block Kit Slack.
Ringkasan Pesan Kaya
Agen Anda kini dapat memposting pesan Slack yang profesional dan interaktif:
- say(text) — teks mrkdwn sederhana; mendukung *bold*, _italic_, `code`, dan penyebutan
- say(blocks=[...]) — Block Kit untuk tata letak terstruktur
- tajuk — judul bagian berukuran besar (hanya plain_text)
- bagian — isi teks dengan fields opsional (kisi kunci-nilai) atau satu aksesori
- pemisah — garis pemisah horizontal
- tindakan — wadah untuk tombol dan elemen interaktif
- konteks — teks metadata kecil di bagian bawah
- respond(response_type='ephemeral') — pesan yang hanya terlihat oleh pengguna pemicu
- chat_update(ts=...) — memperbarui pesan yang sebelumnya diposting dengan konten baru
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengirim Pesan dan Blok Kaya” gratis?
Ya — teks lengkap “Mengirim Pesan dan Blok Kaya” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengirim Pesan dan Blok Kaya”?
Teks biasa, markdown, JSON Block Kit — memformat pesan Slack. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Mengirim Pesan dan Blok Kaya” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar Slack Bolt SDK
- Menyimak Acara dan Perintah Slash
- Mengirim Pesan dan Blok Kaya
- Membangun Bot Notifikasi Tim