Menghantar Mesej dan Blok Kaya
Teks biasa, markdown, JSON Block Kit — memformat mesej Slack.
Menghantar Mesej dan Blok Kaya ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Ejen AI, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.
Mesej Teks Ringkas dengan say()
Cara paling mudah untuk menerbitkan mesej Slack ialah say(text). Teks tersebut menyokong mrkdwn — varian Markdown Slack. Gunakan *bold*, _italic_, ~strike~, `code` dan sebutan 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 kepada Block Kit
Block Kit ialah rangka kerja UI Slack untuk membina mesej yang kaya dan interaktif. Daripada menggunakan teks biasa, Anda menyusun mesej daripada blok bertipe: section, header, divider, actions dan context. Blok dihantar sebagai senarai kepada parameter blocks bagi 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 Section dengan Medan Teks
Blok section ialah blok yang paling serba boleh. Blok ini boleh memaparkan teks (mrkdwn atau plain_text), senarai pasangan nilai-kunci medan atau elemen aksesori seperti butang, imej dan menu limpahan. Gunakan fields untuk pasangan nilai-kunci yang dipaparkan bersebelahan — sesuai untuk papan pemuka.
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 Header dan Divider
Gunakan blok header untuk tajuk bahagian yang besar dan blok divider untuk pemisahan visual. Blok header hanya menyokong plain_text dan tidak menyokong mrkdwn. Gabungkan kedua-duanya untuk mencipta mesej laporan yang tersusun rapi.
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 Actions dengan Butang
Blok Actions mengandungi elemen interaktif seperti butang. Setiap butang mempunyai action_id (digunakan untuk menghalakan klik kepada pengendali), text dan value pilihan yang membawa data. Gunakan style: 'primary' untuk CTA utama dan style: 'danger' untuk tindakan yang merosakkan 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 Context untuk Metadata
Blok Context memaparkan teks kecil sekunder di bahagian bawah mesej — sesuai untuk metadata seperti cap masa, sumber atau maklumat versi ejen. Blok ini menyokong mrkdwn dan imej 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 dalam Medan Teks
mrkdwn Slack menyokong sebahagian daripada Markdown. Pilihan pemformatan utama untuk mesej ejen termasuk teks tebal, teks condong, kod, pautan, sebutan saluran, sebutan pengguna dan senarai. Gunakan pilihan ini untuk menjadikan kandungan yang dijana AI mudah dibaca dalam 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)Mesej Sementara dengan respond()
Mesej sementara hanya dapat dilihat oleh pengguna yang mencetuskan tindakan tersebut — bukan oleh ahli saluran lain. Gunakannya untuk kemas kini status, mesej ralat dan pengesahan yang tidak perlu memenuhi saluran. Mesej ini hanya tersedia melalui respond() (perintah garis condong) 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)
)Mengemas Kini Mesej Selepas Penghantaran
Selepas menerbitkan mesej, Anda boleh mengemas kininya menggunakan client.chat_update() dengan saluran dan cap masa mesej (ts). Ini berguna untuk kemas kini kemajuan — terbitkan mesej awal 'Sedang diproses...', kemudian kemas kininya dengan hasil apabila 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()Menerbitkan Mesej ke Saluran Tertentu
Gunakan client.chat_postMessage(channel=channel_id, text=...) untuk menerbitkan mesej ke mana-mana saluran yang boleh diakses oleh bot Anda. Cari ID saluran dalam API Slack atau dengan mengklik kanan saluran. Gunakan conversations_list() untuk mencari saluran mengikut 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')
Corak Pembina Mesej Block Kit
Gunakan fungsi pembina yang menerima data dan mengembalikan senarai blok. Dengan cara ini, pemformatan mesej diasingkan daripada logik perniagaan dan blok Anda boleh diguna semula merentas pengendali peristiwa yang berbeza.
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)
Semakan Pantas: Jenis Blok
Uji pemahaman Anda tentang Block Kit Slack.
Rumusan Mesej Kaya
Ejen Anda kini boleh menerbitkan mesej Slack yang profesional dan interaktif:
- say(text) — teks mrkdwn ringkas; menyokong *bold*, _italic_, `code` dan sebutan
- say(blocks=[...]) — Block Kit untuk susun atur berstruktur
- header — tajuk bahagian besar (plain_text sahaja)
- section — isi teks dengan medan pilihan (grid nilai-kunci) atau satu aksesori
- divider — garis pemisah mendatar
- actions — bekas untuk butang dan elemen interaktif
- context — teks metadata kecil di bahagian bawah
- respond(response_type='ephemeral') — mesej yang hanya dapat dilihat oleh pengguna yang mencetuskan tindakan
- chat_update(ts=...) — kemas kini mesej yang telah diterbitkan dengan kandungan baharu
Pelajari Ejen AI dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 60
- Pelajaran
- 239
Soalan Lazim
Adakah pelajaran “Menghantar Mesej dan Blok Kaya” percuma?
Ya — teks penuh “Menghantar Mesej dan Blok Kaya” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Ejen AI, tingkat taraf kepada CoddyKit PRO. Kursus Ejen AI merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Menghantar Mesej dan Blok Kaya”?
Teks biasa, markdown, JSON Block Kit — memformat mesej Slack. Anda berlatih Ejen AI menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Ejen AI?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Ejen AI di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Menghantar Mesej dan Blok Kaya” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Ejen AI ini?
Ya. Setiap pelajaran Ejen AI menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Asas Slack Bolt SDK
- Mendengar Acara dan Perintah Palang
- Menghantar Mesej dan Blok Kaya
- Membina Bot Pemberitahuan Pasukan