Webhooks
Ένα εισερχόμενο webhook επιτρέπει σε ένα άλλο σύστημα να δημοσιεύει σε ένα κανάλι αποστέλλοντας JSON σε μια μυστική διεύθυνση URL. Ένα εξερχόμενο webhook κάνει το αντίστροφο: στέλνει μηνύματα στη διεύθυνση URL σας, αυτά που ξεκινούν με μια λέξη ενεργοποίησης ή αυτά που κάποιος τα επιλέγει από το μενού μηνύματος, και δημοσιεύει ό,τι απαντήσετε.
Πού διαχειρίζεστε τα webhooks
Ανοίξτε το μενού της ομάδας, στη συνέχεια Ρυθμίσεις ομάδας και κάντε κλικ στην επιλογή Ολοκληρώσεις στο τέλος των καρτελών της. Οι σελίδες ολοκληρώσεων της τρέχουσας ομάδας εμφανίζουν τη λίστα Εισερχόμενα Webhooks και Εξερχόμενα Webhooks. Κάθε webhook ανήκει σε μία μόνο ομάδα.
By default, community admins and system admins can create webhooks. A system admin can give the right to other roles in the permission settings of the System Console. A system admin can also turn each kind off in System Console › Integrations › Integration Management: Enable Incoming Webhooks and Enable Outgoing Webhooks are both on by default.

Δημιουργία εισερχόμενου webhook
- Στην ενότητα Ολοκληρώσεις, επιλέξτε Εισερχόμενα Webhooks και στη συνέχεια Προσθήκη εισερχόμενου Webhook.
- Συμπληρώστε έναν Τίτλο και μια Περιγραφή: εμφανίζονται μόνο στις σελίδες ολοκληρώσεων.
- Επιλέξτε το Κανάλι στο οποίο θα αποστέλλονται τα μηνύματα κατ' εξόρθωση. Για ένα ιδιωτικό κανάλι, πρέπει να είστε μέλος του.
- Επιλέξτε Κλείδωμα σε αυτό το κανάλι αν οι αποστολείς δεν πρέπει να μπορούν να δημοσιεύουν σε άλλα κανάλια.
- Επιλέξτε προαιρετικά ένα Όνομα χρήστη και ένα URL Εικόνας προφίλ για τα μηνύματά του (βλ. Όνομα και εικονίδιο).
- Επιλέξτε Αποθήκευση. Αντιγράψτε το URL που εμφανίζεται:
https://chat.example.com/hooks/<key>.
Με το API: POST /api/v4/hooks/incoming με {"channel_id", "display_name", "description", "username", "icon_url", "channel_locked"}· το id της απάντησης είναι το κλειδί. Από τη γραμμή εντολών: amctl webhook create-incoming --channel <channel id> --user <user> --display-name "CI".
Αποστολή μηνύματος σε εισερχόμενο webhook
curl -X POST https://chat.example.com/hooks/xgh5ycrx1jf7mbs9w8z4c8e7ho \
-H 'Content-Type: application/json' \
-d '{"text": "Deploy of **api 2.4.0** finished :white_check_mark:"}'
Ο διακομιστής απαντά με 200 και σώμα ok. Δέχεται επίσης application/x-www-form-urlencoded με το JSON σε πεδίο payload, όπως κάνουν τα webhooks του Slack, οπότε τα εργαλεία που έχουν δημιουργηθεί για το Slack συνήθως λειτουργούν χωρίς αλλαγές.
| Πεδίο | Σημασία |
|---|---|
text | Το μήνυμα, σε Markdown. Υποχρεωτικό, εκτός αν υπάρχουν attachments. Αν το κείμενο υπερβαίνει το όριο μήνυματος του server, χωρίζεται σε πολλά μηνύματα. |
channel | Εναλλακτικό κανάλι της κοινότητας του webhook, με όνομα (ops-alerts ή #ops-alerts), ή @username για άμεσο μήνυμα από τον ιδιοκτήτη του webhook. Απορρίπτεται όταν το webhook είναι κλειδωμένο στο κανάλι του. Το παλιό όνομα town-square φτάνει ακόμα στο προεπιλεγμένο κανάλι της κοινότητας, που τώρα ονομάζεται general. |
username, icon_url, icon_emoji | Το όνομα και η εικόνα που θα εμφανίζονται, όταν ο server επιτρέπει αντικαταστάσεις. |
attachments | Συνημμένα στο μήνυμα, που εμφανίζονται ως κάρτες (κάτω). |
props | Επιπλέον ιδιότητες που αποθηκεύονται στο μήνυμα, για εφαρμογές που τις διαβάζουν. Η ανάρτηση σε ένα κανάλι φόρουμ απαιτεί το πεδίο props.am_thread_title (1 έως 100 χαρακτήρες): το webhook απορρίπτεται αν δεν υπάρχει αυτό το πεδίο (δείτε Τα φόρουμ δέχονται μόνο θέματα). |
type | Ένας προσαρμοσμένος τύπος μηνύματος, όπως custom_poll, για μια εφαρμογή που τον απεικονίζει. Οι τύποι που ξεκινούν με system_ απορρίπτονται. |
root_id | Το ID του πρώτου μηνύματος ενός νήματος, για να απαντήσετε σε αυτό το νήμα. |
priority | Προτεραιότητα μηνύματος, για παράδειγμα {"priority": "urgent"}. |
silent | Το true στέλνει το μήνυμα χωρίς push ειδοποιήσεις. |
Κάθε μήνυμα που δημοσιεύει ένα webhook φέρει δίπλα στο όνομά του την ετικέτα BOT, ακόμη και όταν εμφανίζεται κάτω από το όνομα του δημιουργού του, ώστε να μπορεί κανείς να το διακρίνει από ένα μήνυμα πραγματικού χρήστη. Τα μηνύματα webhook δεν ενεργοποιούν ποτέ исходящие webhooks.
Όνομα και εικόνα
Ένα webhook δημοσιεύει ως ο χρήστης που το δημιούργησε, εκτός αν ο διακομιστής επιτρέπει υπερβάσεις. Δύο ρυθμίσεις στις Κονσόλα συστήματος › Ολοκληρώσεις › Διαχείριση ολοκληρώσεων, και οι δύο απενεργοποιημένες εξ ορισμού, αλλάζουν αυτό:
- Ενεργοποίηση ολοκληρώσεων για την υπέρβαση των ονομάτων χρηστών (
ServiceSettings.EnablePostUsernameOverride): εμφανίζεται το Όνομα χρήστη του webhook ή τοusernameτου αιτήματος. Αν δεν υπάρχει κανένα από τα δύο, το όνομα είναιwebhook. - Ενεργοποίηση ολοκληρώσεων για υπέρβαση εικονιδίων εικόνας προφίλ (
ServiceSettings.EnablePostIconOverride): εμφανίζεται η Εικόνα προφίλ του webhook, ή τοicon_urlή τοicon_emojiτου αιτήματος.
Μια τιμή στο αίτημα υπερισχύει της τιμής που αποθηκεύεται στο webhook.
Συνημμένα
Τα συνημμένα προσθέτουν δομημένο περιεχόμενο κάτω από το κείμενο. Ακολουθούν το μορφή συνημμένων μηνύματος του Slack:
{
"text": "Build failed on `main`",
"attachments": [{
"fallback": "main #1902 failed",
"color": "#d24b4e",
"author_name": "GitHub Actions",
"author_icon": "https://chat.example.com/static/ci.png",
"title": "main #1902 failed",
"title_link": "https://ci.example.com/runs/1902",
"text": "Commit `0f4d8e2` by Jonas Weber",
"fields": [
{"title": "Branch", "value": "zephyr-3.7", "short": true},
{"title": "Duration", "value": "3m 40s", "short": true}
],
"footer": "Lumen CI",
"ts": 1760000000
}]
}
| Πεδίο | Σημασία |
|---|---|
fallback | Απλό κείμενο για θέσεις που δεν μπορούν να εμφανίσουν την κάρτα, όπως οι ειδοποιήσεις. |
color | Η χρωματική μπάρα: ένα χρώμα σε hex, ή good, warning, danger. |
pretext | Κείμενο πάνω από την κάρτα. |
author_name, author_link, author_icon | Μια μικρή γραμμή κεφαλίδας. |
title, title_link | Το τίτλος της κάρτας, προαιρετικά με σύνδεσμο. |
text | Το σώμα της κάρτας, σε Markdown. |
fields | Μια λίστα από {"title", "value", "short"}. Τα πεδία short τοποθετούνται δίπλα-δίπλα. |
image_url, thumb_url | Μια μεγάλη εικόνα κάτω, ή μια μικρή στο πλάι. |
footer, footer_icon, ts | Μια γραμμή υποσέλιδου και μια ώρα (δευτερόλεπτα Unix). |
actions | Κουμπιά και μενού: δείτε Διαδραστικά μηνύματα. |
Κάρτες: στάδια και διαγράμματα
Το Antimatter προσθέτει δύο πεδία στα συνημμένα, τα οποία απεικονίζει η προεπιλεγμένη διεπαφή:
stages: τα βήματα μιας διαδικασίας ως «κουκκίδες», έως 20. Κάθε ένα είναι{"name", "status"}, με κατάστασηpassed,failed,running,pending,skippedήcanceled.chart: ένα μικρό γραμμικό διάγραμμα πρόσφατων τιμών,{"values": [2 to 200 numbers], "threshold": number, "label": "…"}. Η κατώτατη τιμή (threshold) σχεδιάζεται ως διακεκομμένη γραμμή, για το όριο μιας ειδοποίησης.
{
"attachments": [{
"color": "danger",
"title": "main #1902 failed",
"stages": [
{"name": "build", "status": "failed"},
{"name": "unit", "status": "skipped"},
{"name": "publish", "status": "skipped"}
]
}, {
"color": "warning",
"title": "API latency above 400 ms",
"chart": {"values": [210, 230, 260, 390, 450, 470], "threshold": 400, "label": "p95 latency, ms"}
}]
}
Η κλασική διεπαφή και άλλοι πελάτες αγνοούν αυτά τα δύο πεδία, οπότε τοποθετήστε τα βασικά στοιχεία και στο text ή fields.
Δημιουργία исходящего webhook
Ένα исходящее webhook παρακολουθεί τα Δημόσια κανάλια μιας κοινότητας. Στέλνει ένα μήνυμα στη διεύθυνση URL σας είτε όταν η πρώτη λέξη του μηνύματος ταιριάζει με μία από τις λέξεις ενεργοποίησης του, είτε όταν κάποιος το επιλέγει από το μενού του μηνύματος (μία ενέργεια μηνύματος).
- Στην ενότητα Ολοκληρώσεις, επιλέξτε Εξερχόμενα Webhooks και στη συνέχεια Προσθήκη εξερχόμενου Webhook.
- Συμπληρώστε τον Τίτλο και την Περιγραφή.
- Επιλέξτε τον Τύπο περιεχομένου του αιτήματος:
application/x-www-form-urlencodedήapplication/json. - Επιλέξτε ένα Κανάλι, εισάγετε Λέξεις ενεργοποίησης (μία ανά γραμμή) ή και τα δύο. Αν ορίσετε κανάλι χωρίς λέξεις ενεργοποίησης, στέλνεται κάθε μήνυμα του καναλιού. Αν ορίσετε και τα δύο, το μήνυμα πρέπει να ταιριάζει και στα δύο.
- Στο πεδίο Ενεργοποίηση όταν, επιλέξτε Το πρώτο όνομα ταιριάζει ακριβώς με μια λέξη ενεργοποίησης, Το πρώτο όνομα ξεκινά με μια λέξη ενεργοποίησης ή Από το μενού μηνύματος. Αν επιλέξετε Από το μενού μηνύματος, οι λέξεις ενεργοποίησης εξαφανίζονται, το πεδίο Κανάλι είναι προαιρετικό (αν παραληφθεί, η ενέργεια προσφέρεται σε κάθε δημόσιο κανάλι της κοινότητας) και το πεδίο Τίτλος είναι υποχρεωτικό: αποτελεί το όνομα της ενέργειας στο μενού.
- Εισάγετε τις URL επανακατεύθυνσης (ένα ανά γραμμή). Κάθε URL λαμβάνει κάθε μήνυμα που ταιριάζει.
- Μπορείτε προαιρετικά να ορίσετε το Όνομα χρήστη και την Εικόνα προφίλ που θα χρησιμοποιηθούν για τις απαντήσεις. Για μια ενέργεια από το μενού μηνύματος, το πεδίο Εικονίδιο αντικαθιστά την Εικόνα προφίλ: η διεύθυνση URL μιας εικόνας .png ή .jpg ή, στη προεπιλεγμένη διεπαφή του Antimatter, μια ανεβασμένη εικόνα. Το μενού την εμφανίζει σε γκρι. Αν δεν υπάρχει, η ενέργεια λαμβάνει ένα ουδέτερο εικονίδιο.
- Επιλέξτε Αποθήκευση και αντιγράψτε το token που εμφανίζεται. Η υπηρεσία σας το χρησιμοποιεί για να ελέγχει ότι τα αιτήματα προέρχονται από τον διακομιστή σας.
Μέσω της API: POST /api/v4/hooks/outgoing με {"team_id", "channel_id", "trigger_words", "trigger_when", "callback_urls", "content_type", "display_name"} (trigger_when: 0 για ακριβή ταιριάζει, 1 για «ξεκινά με», 2 για «από το μενού μηνύματος»). Ένα webhook με trigger_when 2 δεν απαιτεί λέξεις ενεργοποίησης και χρειάζεται display_name. Ανέβαστε το εικονίδιό του με POST /api/v4/hooks/outgoing/{hook_id}/icon (multipart, πεδίο image: PNG, JPEG ή GIF, αποθηκεύεται ως PNG 128 px); το icon_url του δείχνει τότε στο GET /api/v4/hooks/outgoing/{hook_id}/icon.

ServiceSettings.AllowedUntrustedInternalConnections). Διαφορετικά, ο διακομιστής δεν καλεί ιδιωτικές διευθύνσεις.Το исходящее αίτημα
Το Antimatter στέλνει ένα POST με αυτά τα πεδία, ως JSON ή form-encoded ανάλογα με το content type:
{
"token": "6kd1ofo5ojr5zgu5ipfipybgnc",
"team_id": "…",
"team_domain": "lumen-labs",
"channel_id": "…",
"channel_name": "ops-alerts",
"timestamp": 1760010000000,
"user_id": "…",
"user_name": "priya",
"post_id": "…",
"text": "deploy api 2.4.0",
"trigger_word": "deploy",
"file_ids": ""
}
Συγκρίνετε το token με το token του webhook πριν κάνετε οτιδήποτε. Στην κωδικοποιημένη μορφή φόρμας, το timestamp είναι σε δευτερόλεπτα και όχι σε χιλιοστά του δευτερολέπτου. Ο διακομιστής περιμένει την απάντησή σας για όσο επιτρέπει το Χρονόριο αιτήσεων ολοκληρώσεων (30 δευτερόλεπτα από προεπιλογή, ServiceSettings.OutgoingIntegrationRequestsTimeout).
Απάντηση σε ένα исходящее webhook
Για να δημοσιεύσετε μια απάντηση, απαντήστε με JSON. Για να μην δημοσιεύσετε τίποτα, απαντήστε με κενό σώμα.
{
"text": "Deploying **api 2.4.0** to staging…",
"response_type": "comment",
"username": "deploy-bot",
"icon_url": "https://chat.example.com/static/deploy.png"
}
textκαιattachments: η απάντηση. Χωρίς κανένα από τα δύο, δεν δημοσιεύεται τίποτα.response_type: τοcommentδημοσιεύει την απάντηση στο νήμα του μηνύματος που πυροδότησε το webhook. Αλλιώς, πηγαίνει στο κανάλι.username,icon_url: εμφανίζονται όταν ο διακομιστής επιτρέπει αντικαταστάσεις. Αλλιώς, χρησιμοποιούνται οι ίδιες τιμές του webhook.props,type,priority: όπως για τα εισερχόμενα webhooks.
Η απάντηση δημοσιεύεται ως ο δημιουργός του webhook, με το αντικαταστασμένο όνομα αν υπάρχει. Για οτιδήποτε μεγαλύτερο από μια σύντομη απάντηση, απαντήστε αμέσως και δημοσιεύστε αργότερα με ένα εισερχόμενο webhook ή το API.
Ενέργειες μηνύματος
Μια ενέργεια μηνύματος είναι ένα исходящее webhook με Ενεργοποίηση όταν ρυθμισμένο σε Από το μενού μηνύματος. Δεν ενεργοποιείται ποτέ σε δημοσιευμένα μηνύματα. Αντίθετα, οι χρήστες τη βλέπουν στο μενού ενός μηνύματος: Ενέργειες μηνύματος (⋯) › Περισσότερες ενέργειες, κάτω από την κεφαλίδα Ολοκληρώσεις, με το εικονίδιό της. Η κλασική διεπαφή δεν εμφανίζει ενέργειες μηνύματος. Η επιλογή της στέλνει μόνο αυτό το μήνυμα στις διευθύνσεις κλήσης και μια σύντομη ειδοποίηση αναφέρει Απεστάλη σε το όνομα της ενέργειας ή εμφανίζει το ephemeral_text σας.
- Πού εμφανίζεται: στο κανάλι του webhook ή, χωρίς κανάλι, σε κάθε δημόσιο κανάλι της κοινότητας. Μόνο τα δημόσια κανάλια έχουν ενέργειες μηνύματος.
- Οι Επισκέπτες λαμβάνουν μόνο τις ενέργειες που είναι συνδεδεμένες με ένα κανάλι στο οποίο βρίσκονται, όχι τις κοινές σε ολόκληρη την κοινότητα.
- Αρχειοθετημένα και κανάλια μόνο για ανάγνωση: το μήνυμα μπορεί ακόμα να σταλεί. Η αρχειοθέτηση ενός καναλιού διαγράφει τα webhooks που είναι συνδεδεμένα με αυτό, οπότε ένα αρχειοθετημένο κανάλι διατηρεί μόνο τις κοινές σε ολόκληρη την κοινότητα ενέργειες. Μια απάντηση που ο χρήστης δεν μπορούσε να δημοσιεύσει εκεί εμφανίζεται μόνο σε αυτόν.
- Όριο ρυθμού: κάθε χρήστης μπορεί να εκτελέσει 10 ενέργειες μηνύματος ανά λεπτό, μετά από μια έκρηξη 5. Πάνω από αυτό, ο διακομιστής απαντά με
429. - Ιδιωτικά δίκτυα: όπως και για άλλα исходящие webhooks, οι εσωτερικές διευθύνσεις πρέπει να επιτρέπονται στο Επιτρέπει μη αξιόπιστες εσωτερικές συνδέσεις προς.
Το αίτημα
Το φορτίο στέλνεται ως JSON ή form-encoded, όπως ορίζει ο τύπος περιεχομένου του webhook:
{
"token": "6kd1ofo5ojr5zgu5ipfipybgnc",
"trigger": "message_action",
"team_id": "…",
"team_domain": "lumen-labs",
"channel_id": "…",
"channel_name": "ops-alerts",
"timestamp": 1760010000000,
"user_id": "…",
"user_name": "priya",
"post_id": "…",
"post_root_id": "",
"post_create_at": 1760009000000,
"post_user_id": "…",
"post_user_name": "jonas",
"permalink": "https://chat.example.com/lumen-labs/pl/…",
"text": "The staging database is full again",
"files": [{"id": "…", "name": "df.txt", "link": "https://chat.example.com/api/v4/files/…"}],
"priority": "",
"requested_ack": false,
"burn_on_read": false
}
- Τα
user_idκαιuser_nameείναι ο χρήστης που επέλεξε την ενέργεια· ταpost_user_idκαιpost_user_nameο δημιουργός του μηνύματος. - Στέλνεται μόνο αυτό το μήνυμα, ποτέ το υπόλοιπο του νήματος.
- Τα
filesαπαριθμούν τα αρχεία του μηνύματος μόνο όταν ο χρήστης που επέλεξε την ενέργεια μπορεί να τα κατεβάσει. Η λήψη ενόςlinkαπαιτεί μια συνεδρία ή ένα token, όπως και οποιοδήποτε αρχείο της API. - Ένα μήνυμα που καίγεται κατά την ανάγνωση αποστέλλεται χωρίς το κείμενο και τα αρχεία του, με το
burn_on_readορισμένο σεtrue. - Σε κωδικοποίηση φόρμας, τα αρχεία έρχονται ως επαναλαμβανόμενα πεδία
file_id,file_nameκαιfile_link, στην ίδια σειρά.
Η απάντηση
Απαντάτε όπως σε κάθε εξερχόμενο webhook (βλ. Απάντηση σε εξερχόμενο webhook): το text ή τα attachments δημοσιεύουν μια απάντηση στο κανάλι, ενώ το "response_type": "comment" τη δημοσιεύει στο νήμα του μηνύματος. Μπορείτε επίσης να απαντήσετε με ephemeral_text (κομμένο στα 300 χαρακτήρες): εμφανίζεται μόνο στον χρήστη που επέλεξε την ενέργεια, στην ειδοποίηση. Ένα κενό σώμα δεν δημοσιεύει τίποτα.
{"ephemeral_text": "Ticket OPS-412 created"}
Με το API
GET /api/v4/channels/{channel_id}/message_actions: οι ενέργειες που μπορείτε να επιλέξετε σε ένα κανάλι, μεid,display_name,descriptionκαιicon_url. Δεν επιστρέφονται ούτε token ούτε URL επεξεργασίας.POST /api/v4/posts/{post_id}/message_actions/{hook_id}: εκτελεί μια ενέργεια σε ένα μήνυμα που μπορείτε να διαβάσετε. Απαντά με{"ephemeral_text"}.
Όταν ένα webhook δεν λειτουργεί
- 501 από το URL του hook: τα εισερχόμενα webhooks είναι απενεργοποιημένα στον διακομιστή.
- 400 "Failed to decode the payload…": το JSON είναι άκυρο ή το πεδίο της φόρμας δεν ονομάζεται
payload. Το "No text specified." σημαίνει ότι το αίτημα δεν έχει ούτεtextούτεattachments. - 403: το webhook είναι κλειδωμένο σε άλλο κανάλι ή ο ιδιοκτήτης του δεν μπορεί πλέον να διαβάσει το κανάλι.
- Ένα εξερχόμενο webhook δεν ενεργοποιείται ποτέ: το κανάλι είναι ιδιωτικό, η λέξη-πρόκληση δεν είναι η πρώτη λέξη, το μήνυμα προέρχεται από webhook, ή το webhook ρυθμίζεται να ενεργοποιείται Από το μενού μηνύματος.
- Μια ενέργεια μηνύματος δεν εμφανίζεται στο μενού: το κανάλι είναι ιδιωτικό, η ενέργεια συνδέεται με άλλο κανάλι, ο χρήστης είναι επισκέπτης και η ενέργεια δεν έχει κανάλι, ή τα εξερχόμενα webhooks είναι απενεργοποιημένα.
- 404 κατά την εκτέλεση μιας ενέργειας μηνύματος: η ενέργεια δεν υπάρχει, ή δεν καλύπτει το κανάλι του μηνύματος για αυτόν τον χρήστη. 429: ο χρήστης εκτέλεσε πάνω από 10 ενέργειες σε ένα λεπτό. 502: κανένα από τα URL επεξεργασίας δεν ήταν προσβάσιμο (ο λόγος αναγράφεται στο αρχείο καταγραφής).
- Η ανάρτηση σε φόρουμ απορρίπτεται: το μήνυμα του webhook χρειάζεται τίτλο (
props.am_thread_title). Το σφάλμα αναφέρει τον λόγο, όπωςapp.post.forum.title_required.app_error, αντί για ένα γενικό σφάλμα αποτυχίας (δείτε Τύποι καναλιών). - Καταγραφές: με το Ενεργοποίηση αποσφαλμάτωσης Webhook ενεργοποιημένο (
LogSettings.EnableWebhookDebugging) και το επίπεδο καταγραφής σεDEBUG, ο διακομιστής καταγράφει τα φορτία (payloads) των αποτυχημένων εισερχόμενων αιτημάτων. Τα αποτυχημένα εξερχόμενα αιτήματα καταγράφονται ωςOutgoing Webhook POST failed.