Ejen AI · Pelajaran

Mendengar Acara dan Perintah Palang

app_mention, perintah palang dan pengendali tindakan dalam Slack Bolt.

Pelajaran 2 daripada 413 langkah

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 out

say() 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 orang
  • respond() — 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_ts dalam say() untuk mengekalkan balasan dalam utas
  • Tapis mengikut saluran/pengguna pada peringkat awal bagi mengelakkan pemprosesan peristiwa yang tidak berkaitan
Percuma untuk bermula

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

  1. Asas Slack Bolt SDK
  2. Mendengar Acara dan Perintah Palang
  3. Menghantar Mesej dan Blok Kaya
  4. Membina Bot Pemberitahuan Pasukan
← Kembali ke Ejen AI