Mendengar Acara dan Perintah Palang
app_mention, perintah palang dan pengendali tindakan dalam Slack Bolt.
Mendengar Acara dan Perintah Palang ialah pelajaran Ejen AI percuma di CoddyKit. Ini ialah pelajaran 2 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.
Gambaran Keseluruhan Langganan Peristiwa Slack
Slack menghantar peristiwa kepada aplikasi Anda apabila sesuatu berlaku — mesej diterbitkan, seseorang menyebut bot Anda atau pengguna menyertai saluran. Anda melanggan jenis peristiwa tertentu dalam papan pemuka Aplikasi Slack, kemudian mendaftarkan pengendali dalam Bolt menggunakan penghias @app.event().
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"]}')Mengendalikan Peristiwa app_mention
Peristiwa app_mention dicetuskan apabila seseorang menaip @YourBot dalam saluran. event['text'] mengandungi mesej penuh termasuk sebutan tersebut. Buang awalan sebutan untuk mendapatkan pertanyaan sebenar pengguna.
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)Mengakses Muatan Peristiwa
Setiap pengendali peristiwa menerima kamus event, yang mengandungi muatan mentah peristiwa Slack. Medan utama: event['user'] (ID pengguna), event['channel'] (ID saluran), event['text'] (kandungan mesej) dan event['ts'] (cap masa/ID mesej).
@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}!')Perintah Garis Condong — Pendaftaran dan Respons
Perintah garis condong membolehkan pengguna mencetuskan tindakan ejen daripada mana-mana saluran Slack. Daftarkan URL perintah dalam papan pemuka Aplikasi Slack (di bawah Perintah Garis Condong), kemudian kendalikannya dengan @app.command('/command-name'). Sentiasa panggil ack() dengan segera — Slack akan tamat masa selepas 3 saat jika Anda tidak berbuat demikian.
@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() — Peraturan 3 Saat
Slack menghendaki aplikasi Anda memanggil ack() (mengesahkan penerimaan) bagi setiap perintah garis condong dan muatan interaktif yang masuk dalam tempoh 3 saat. Jika tidak, Slack akan memaparkan ralat kepada pengguna. Untuk operasi yang mengambil masa lama, panggil ack dengan segera, mulakan pemprosesan dalam utas latar belakang, kemudian beri respons menggunakan respond() dengan hasilnya.
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() berbanding respond() — Bila Menggunakan Setiap Satu
Dua fungsi menerbitkan mesej kembali ke Slack:
say()— menerbitkan mesej ke saluran tempat peristiwa berlaku; dapat dilihat oleh semua orangrespond()— hanya tersedia dalam pengendali perintah garis condong; boleh menerbitkan mesej sementara yang hanya dapat dilihat oleh pengguna perintah
Gunakan respond(response_type='in_channel') untuk respons awam dan respond(response_type='ephemeral') untuk respons peribadi.
@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')Peristiwa Mesej dan Subjenis
Peristiwa message umum dicetuskan untuk semua mesej, termasuk mesej bot, pengeditan dan pemadaman. Gunakan medan subtype untuk menapisnya. Subjenis yang lazim: bot_message, message_changed dan message_deleted. Jika subtype tiada, mesej itu ialah mesej pengguna biasa.
@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}')Mendengar Reaksi
Peristiwa reaction_added dicetuskan apabila seseorang menambahkan reaksi emoji pada mesej. Anda boleh menggunakannya untuk mencetuskan tindakan ejen — contohnya, menambahkan reaksi 📌 untuk menyimpan mesej atau ✅ untuk menandakan tugas sebagai selesai.
@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]}')Muatan Tindakan daripada Komponen Interaktif
Apabila pengguna mengklik butang atau memilih item menu, Slack menghantar muatan tindakan. Kendalikannya dengan @app.action('action_id'). ID tindakan ialah rentetan yang Anda tetapkan semasa mencipta komponen Block Kit. Sentiasa panggil ack() dengan segera.
@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')Menapis Peristiwa Mengikut Saluran atau Pengguna
Dalam ruang kerja yang besar, bot Anda mungkin menerima peristiwa daripada banyak saluran. Tapis peristiwa pada peringkat awal dalam pengendali supaya hanya peristiwa yang berkaitan diproses. Semak event['channel'] berbanding senarai yang dibenarkan, atau semak event['user'] untuk mengabaikan pengguna tertentu seperti bot lain.
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]}')Sokongan Balasan dalam Utas
Untuk membalas dalam utas dan bukannya saluran utama, hantarkan thread_ts kepada say(). Gunakan event.get('thread_ts', event['ts']) untuk mendapatkan cap masa utas — thread_ts hanya wujud jika mesej tersebut sudah berada dalam utas; jika tidak, gunakan ts mesej itu sendiri untuk memulakan utas baharu.
@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
)Semakan Pantas: Masa ack()
Uji pemahaman Anda tentang pengendalian peristiwa Slack.
Rumusan Peristiwa dan Perintah Garis Condong
Ejen Slack Anda kini boleh memberikan respons terhadap sebarang interaksi pengguna:
- @app.event('app_mention') — kendalikan sebutan @bot; buang awalan sebutan dengan ungkapan nalar
- @app.command('/cmd') — kendalikan perintah garis condong; sentiasa panggil
ack()dalam tempoh 3 saat - say() — terbitkan mesej secara awam ke saluran; respond() — balas perintah garis condong (boleh menjadi sementara)
- @app.action('id') — kendalikan klik butang dan interaksi komponen interaktif
- @app.event('reaction_added') — cetuskan tindakan apabila terdapat reaksi emoji
- Gunakan
thread_tsdalam say() untuk mengekalkan balasan dalam utas - Tapis mengikut saluran/pengguna pada peringkat awal bagi mengelakkan pemprosesan peristiwa yang tidak berkaitan
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 “Mendengar Acara dan Perintah Palang” percuma?
Ya — teks penuh “Mendengar Acara dan Perintah Palang” 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 “Mendengar Acara dan Perintah Palang”?
app_mention, perintah palang dan pengendali tindakan dalam Slack Bolt. 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 2 daripada 4.
Berapa lamakah pelajaran “Mendengar Acara dan Perintah Palang” 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