Zum Hauptinhalt springen
Entwickler Nachrichtenkarten

Nachrichtenkarten gestalten

Alles, was ein Bot postet, ob per Webhook, als Befehlsantwort oder als Button-Update, ist eine Karte. Eine gute Karte sagt auf einen Blick, was passiert ist: ein farbiger Rand, ein Titel, ein Status, darunter die Details.

Was du damit machen kannst

  • Einen Status zeigenEine farbige Pille wie Offen, Gemergt oder Bestanden, mit hinzugefügten und entfernten Zeilen.
  • Die Details auflistenZeilen mit Label und Wert, die Mitglieder mit einem Tipp kopieren können.
  • In Markdown schreibenFett, Inline-Code, Codeblöcke, Zitate und Checkboxen.
  • Zeigen, dass du arbeitestEin Spinner, während dein Bot nachdenkt, und danach sein Denkprozess hinter einem Toggle.

In der App

Vier Karten, wie Mitglieder sie sehen. Jede besteht aus ein paar Zeilen JSON.

Aufbau einer Karte

Die Teile einer Karte, von oben nach unten. Lass weg, was du nicht brauchst: Eine Karte nur mit Titel ist in Ordnung.

  1. Kopfzeile„Nachricht von“ und ein Name: der Name des Webhooks oder, bei einer Befehlsantwort, der Name deiner Community. Eine Antwort kann ein badge hinzufügen, etwa das Repository.
  2. Titel und StatusDer title, ein Link, wenn du title_url setzt, mit der status-Pille daneben.
  3. UntertitelEine zweite fette Zeile, sub_title.
  4. BeschreibungDer Haupttext, in Markdown.
  5. FelderZeilen mit Label und Wert, mit einem Kopier-Button.
  6. FußzeileDie Uhrzeit und, wenn du sie mitsendest, hinzugefügte und entfernte Zeilen.
json
{
  "message_container": {
    "type": "embed_message",
    "badge": "acme/web",
    "color": "purple",
    "title": "Pull request #212 opened",
    "title_url": "https://github.com/acme/web/pull/212",
    "status": { "label": "Open", "color": "green", "icon": "pull_request" },
    "sub_title": "Faster search in the channel list",
    "description": "Search now runs **per keystroke** with a 120 ms debounce.",
    "fields": [
      { "field": "Author", "value": "maya" },
      { "field": "Reviewers", "value": "dani, sam" }
    ],
    "additions": 86,
    "deletions": 12,
    "files_changed": 3
  }
}

Alle Felder

Diese Felder gehören in message_container. Eine Karte braucht eine Beschreibung oder einen Loader. Felder mit dem Hinweis „Befehlsantworten“ fallen weg, wenn du über einen Webhook postest.

FeldTypWas es tut
typestringembed_message (Standard) oder system_message.
badgestringEin kleiner Chip nach dem Namen in der Kopfzeile, etwa acme/web. Befehlsantworten
avatar_urlstringEin Bild über dem Symbol der Karte.
colorstringDie Randfarbe. Siehe Farben unten.
titlestringDie fette erste Zeile.
title_urlstringMacht den Titel zu einem Link.
sub_titlestringEine zweite fette Zeile unter dem Titel.
descriptionstringDer Haupttext, in Markdown.
fieldsarray[{ "field": "…", "value": "…" }]: Zeilen mit Label und Wert.
image_url, image_base64stringEin Bild auf der Karte.
imagesarray[{ "image_url": "…" }]: eine Galerie aus mehreren Bildern.
statusobject oder stringEine farbige Pille neben dem Titel. Siehe unten. Befehlsantworten
additions, deletions, files_changednumberDiff-Statistik in der Fußzeile. Befehlsantworten
loader, loader_text, loader_sub_textboolean, stringEin Spinner anstelle des Haupttexts.
thinkingstringDenkprozess hinter einem Toggle Denken anzeigen. Befehlsantworten
Die Beschreibung und thinking verstehen Markdown: **bold**, _italic_, ~~strike~~, `inline code`, Codeblöcke mit Fences, > quotes, - [x]-Checkboxen, @Erwähnungen und :emoji:.

Status und Diff-Statistik

Eine Status-Pille erzählt die Geschichte, bevor jemand den Text liest. Sie sitzt neben dem Titel oder, wenn es keinen Titel gibt, in der Fußzeile; die Diff-Statistik steht neben der Uhrzeit. Beides funktioniert in Befehlsantworten, und die eingebaute GitHub-Integration nutzt es. Ein Webhook lässt beides weg.

json
{
  "message_container": {
    "color": "red",
    "title": "Build failed on main",
    "status": { "label": "Failing", "color": "red" },
    "description": "`search.test.js`: 2 of 212 tests failed."
  }
}
FeldTypWas es tut
statusobject oder stringEin einfacher String ist das Label: "status": "Open".
status.labelstringDer Text der Pille. Ohne ihn gibt es keine Pille.
status.colorstringgreen, purple, red, orange, yellow, blue oder gray.
status.iconstringEin optionales Symbol aus der Liste unten.
additionsnumberHinzugefügte Zeilen, als grünes +86 angezeigt.
deletionsnumberEntfernte Zeilen, als rotes -12 angezeigt.
files_changednumberGeänderte Dateien, als 3 files angezeigt.

Symbole

WertSymbolTypische Verwendung
pull_requestgit-pull-requestEin Pull Request wurde geöffnet
pull_request_closedgit-pull-request-closedOhne Merge geschlossen
merge, mergedgit-mergeGemergt
commitgit-commitEin gepushter Commit
issuecircle-dotEin Issue wurde eröffnet
issue_closedcircle-checkEin Issue wurde geschlossen
checkcircle-checkTests bestanden, ein Job erfolgreich

Eine Zuordnung, die für GitHub funktioniert

Die eingebaute GitHub-Integration nutzt diese Werte; übernimm sie für deine eigenen Tools.

EreignisLabelFarbeSymbol
Pull Request geöffnetOpengreenpull_request
EntwurfDraftgraypull_request
GemergtMergedpurplemerged
Ohne Merge geschlossenClosedredpull_request_closed
Issue eröffnetOpengreenissue
Issue geschlossenClosedpurpleissue_closed
Commit gepushtCommitgraycommit
Tests bestandenPassinggreencheck
Tests fehlgeschlagenFailingredkeins

Loader und Denkprozess

Für alles, was einen Moment dauert, etwa eine KI-Antwort oder einen langen Job, postest du zuerst eine Karte mit Spinner und ersetzt sie dann durch das Ergebnis. Der Loader funktioniert bei Webhooks und Befehlsantworten. In einer Befehlsantwort kannst du außerdem den Denkprozess des Modells in thinking ablegen: Mitglieder sehen dann einen Toggle Denken anzeigen statt einer Textwand.

assistant
System
Nachricht von Assistant
Denkt nach…Liest die letzten 50 Nachrichten

Zuerst: der Loader

assistant
System
Nachricht von Assistant

maya: Wann ist das Standup?

Das Standup ist um 09:30, in #daily.
Die angepinnten Nachrichten und den wiederkehrenden Termin in #daily geprüft.

Dann: die Antwort, der Denkprozess eingeklappt

json
{
  "message_container": {
    "type": "embed_message",
    "color": "blue",
    "loader": true,
    "loader_text": "Thinking…",
    "loader_sub_text": "Reading the last 50 messages"
  }
}
json
{
  "message_container": {
    "type": "embed_message",
    "color": "blue",
    "sub_title": "maya: when is the standup?",
    "description": "Standup is at **09:30**, in #daily.",
    "thinking": "Checked the pinned messages and the recurring event in #daily…"
  }
}
FeldTypWas es tut
loaderbooleantrue zeigt den Spinner anstelle des Haupttexts.
loader_textstringDie Zeile neben dem Spinner, etwa „Denkt nach…“.
loader_sub_textstringEine kleinere Zeile darunter.
thinkingstringEingeklappter Denkprozess unter der Beschreibung, in Markdown.

Um den Loader gegen die Antwort zu tauschen, aktualisierst du die Nachricht mit einer neuen Karte ohne loader. Wie das geht, steht unter Live-Updates.

Lange Beschreibungen

Eine Beschreibung darf bis zu 50.000 Bytes lang sein. Nach den ersten 1.000 sehen Mitglieder den Anfang und einen Button Mehr anzeigen, der den Rest lädt, damit ein langer Bericht den Kanal nicht flutet.

Systemnachrichten

Setz "type": "system_message" für eine Mitteilung statt eines Bot-Posts: Wartungsfenster, geänderte Regeln, alles, was im Namen der Community selbst spricht. Sie nimmt dieselben Felder und Buttons an.

json
{
  "message_container": {
    "type": "system_message",
    "color": "orange",
    "title": "Maintenance tonight",
    "description": "The build servers are down from 22:00 to 23:00."
  }
}

Farben

Die Randfarbe ist das schnellste Signal auf einer Karte. Nimm für dieselbe Art von Neuigkeit jedes Mal dieselbe Farbe.

FarbeWofür
greenErfolg: bestanden, deployt, erledigt
redFehlschlag: fehlgeschlagen, ausgefallen, abgelehnt
orangeEine Warnung, die sich jemand ansehen sollte
yellowWartet auf jemanden: Freigaben, Fragen
blueInformation, der Standard
purpleCode-Ereignisse oder etwas Besonderes

Bau dein Embed

Bearbeite die Felder oder den JSON-Payload. Beides bleibt synchron. Sieh zu, wie die Nachricht genau so dargestellt wird wie in einem Kanal. Das ist der echte Webhook-Body; kopiere ihn, wenn alles passt.

Vorlagen
Buttons
Vorschau
Webhook-Body

Weiterbauen