Pāriet uz galveno saturu
Izstrādātājiem Webhook

Publicē ziņas ar webhook

Webhook ir URL, kas publicē ziņas tavā kopienā. Sūti uz to JSON no jebkā, kas prot veikt HTTP pieprasījumu, piemēram, no CI, monitoringa, cron uzdevuma vai skripta, un ziņa parādās kanālā.

Ko tu vari darīt

  • Publicē tekstu vai kartītiVienkāršs teksts vai kartīte ar virsrakstu, krāsu, markdown, laukiem un attēliem.
  • Pievieno failusLīdz pieciem failiem vienā ziņā: žurnāli, atskaites, ekrānuzņēmumi.
  • Pievieno pogasSaites vai pogas, kas maina kartīti vai sasniedz tavu servisu.
  • Maini to vēlākAtbildē ir callback URL, ar kuru ziņu var atjaunināt vai dzēst.

Lietotnē

$ curl -X POST "$MSSGS_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-H "X-Mssgs-Signature: sha256=$SIG" \
-d '{"message_container": {"title": "Būvējums #1847 izdevās", ...}}'
{"success": true, "message_id": "aZZ1a2b-..."}

Viens pieprasījums no CI, viena kartīte kanālā #deploys. Augšā redzams nosaukums, ko tu devi webhook.

Ātrais sākums

  1. Izveido webhook

    Datora lietotnē atver savas kopienas Manage Server → Webhooks, izveido webhook, izvēlies kanālus, kuros tas drīkst publicēt, un nokopē kanāla URL. Tas izskatās šādi:

    url
    https://mss.gs/api/v1/webhook/{webhook_guid}/{token}/{channel_guid}
  2. Nosūti ziņu

    Paraksti JSON ar webhook slepeno atslēgu un nosūti to ar POST. Datora lietotnē izveidotam webhook tā ir vienmēr: nokopē to no lauka Webhook Secret webhook iestatījumos.

    bash
    BODY='{"content": "Build #1847 passed on main"}'
    SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$MSSGS_WEBHOOK_SECRET" | sed 's/^.* //')
    
    curl -X POST "$MSSGS_WEBHOOK_URL" \
      -H "Content-Type: application/json" \
      -H "X-Mssgs-Signature: sha256=$SIG" \
      -d "$BODY"
  3. Izlasi atbildi

    Atbildē ir ziņas id un callback_url, ar kuru ziņu vēlāk var mainīt.

    json
    {
      "success": true,
      "message_id": "aZZ1a2b-...",
      "callback_url": "https://mss.gs/api/v1/trigger-callback/8f14e45f-...",
      "stream_url": "https://mss.gs/api/v1/instant/6b1e...c0?token=a1b2c3d4-..."
    }
Ikviens, kam ir URL un slepenā atslēga, var publicēt šajā kanālā. Neliec tos publiskos repozitorijos un klienta puses kodā.

Ko var nosūtīt

Ziņa ir vai nu īsā forma (teksts ar virsrakstu un krāsu), vai pilna kartīte, un abām var būt pogas un faili. Nosaukums kartītes augšā vienmēr ir paša webhook nosaukums. Webhook iestatījumos tu arī nosaki, vai tas drīkst publicēt attēlus un pieminēt cilvēkus.

Īsā forma

Pietiek lielākajai daļai brīdinājumu.

json
{
  "content": "Server backup completed at 03:00 UTC",
  "color": "green",
  "title": "Backup Bot"
}
LauksTipsKo tas dara
contentstringZiņas teksts. Obligāts, ja vien nesūti kartīti vai failus.
colorstringblue (noklusējums), green, orange, red, yellow vai purple.
titlestringVirsraksts virs teksta. Pēc noklusējuma webhook nosaukums.

Pilna kartīte

Nosūti message_container, lai iegūtu kartīti ar virsrakstu kā saiti, apakšvirsrakstu, markdown, laukiem un attēliem. Caur webhook kartīte pieņem type, color, title, title_url, sub_title, description, fields, avatar_url, image_url, image_base64, images un ielādes indikatora laukus. Statusa birka, nozīmīte, diff statistika un sakļautā spriešana ir paredzēta komandu atbildēm. Visi lauki ir aprakstīti lapā ziņu kartītes.

json
{
  "message_container": {
    "type": "embed_message",
    "color": "green",
    "title": "Build #1847 passed",
    "title_url": "https://ci.example.com/builds/1847",
    "description": "All 212 tests green on **main**.",
    "fields": [
      { "field": "Duration", "value": "2m 34s" },
      { "field": "Commit", "value": "1a2b3c4" }
    ]
  }
}
deploys
System
Message from CI

Būvējums #1847 izdevās

Visi 212 testi uz main ir zaļi.
Duration
2m 34s
Commit
1a2b3c4

Pogas

Pievieno masīvu actions, lai zem ziņas būtu pogas. Kā tās darbojas, skaidrots lapā pogas.

Faili

Publicē kopā ar ziņu īstus failus: žurnālu, atskaiti, ekrānuzņēmumu. Tie izskatās kā jebkurš cits pielikums: kā lejupielādes rinda, bet attēli, video un audio tieši ziņā. Ziņa tikai ar failiem arī der: izlaid content un kartīti.

json
{
  "message_container": {
    "color": "orange",
    "title": "Log dump: ios",
    "description": "DMs stopped arriving after switching networks"
  },
  "attachments": [
    {
      "name": "mssgs-logs-20260803-141205.log",
      "content_base64": "MjAyNi0wOC0wMyAxNDoxMjowNSBbV1NdIGNvbm5lY3RlZAo=",
      "mime_type": "text/plain"
    }
  ]
}
LauksTipsKo tas dara
namestringFaila nosaukums, ar kādu tas tiek lejupielādēts. Obligāts. Ceļš tiek saīsināts līdz pēdējai daļai.
content_base64stringFaila baiti base64 formātā, neapstrādāti vai kā data: URI. mssgs saglabā failu un ziņā patur tikai saiti.
mime_typestringcontent_base64 satura tips. Pēc noklusējuma text/plain.
urlstringFails, kas jau mitināts mssgs: ceļš /static/... vai URL https://mss.gs/....
Katram failam nosūti tieši vienu no diviem: content_base64 vai url. Abi kopā vai neviens ir kļūda.
LimitsVērtība
Faili vienā ziņā5
Faila izmērs pēc dekodēšanas8 MB
Faila nosaukums200 rakstzīmes
Viss pieprasījumsAptuveni 10 MB. Base64 padara failu par trešdaļu lielāku, tāpēc viens fails, kas lielāks par aptuveni 7 MB, neietilps.

Kāpēc url pieņem tikai mssgs adreses

Webhook URL bieži nonāk citu servisu paneļos. Ja tas noplūst, nevienam nedrīkst rasties iespēja likt katra dalībnieka lietotnei ielādēt failu no paša izvēlēta servera. Ja tavs fails atrodas citur, nosūti to kā content_base64, un mssgs to mitinās.

Neizdevusies augšupielāde neaptur ziņu

Faili tiek pārbaudīti uzreiz, bet augšupielādēti pēc tam. Ja augšupielāde neizdodas, šis fails tiek izlaists, bet pārējā ziņa tik un tā tiek publicēta, bez kļūdas: labāk zaudēt failu nekā atskaiti. Ja fails ir svarīgs, pārbaudi, vai tas ir pienācis.

Fails no komandrindas

bash
BODY='{"attachments":[{"name":"report.csv","content_base64":"'"$(base64 < report.csv | tr -d '\n')"'","mime_type":"text/csv"}]}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$MSSGS_WEBHOOK_SECRET" | sed 's/^.* //')

printf '%s' "$BODY" | curl -sS -X POST "$MSSGS_WEBHOOK_URL" \
  -H 'Content-Type: application/json' \
  -H "X-Mssgs-Signature: sha256=$SIG" \
  --data-binary @-

Pieprasījumu parakstīšana

Webhook ar slepeno atslēgu pieņem tikai pieprasījumus, kas pierāda, ka to zina, un datora lietotnē izveidotam webhook tā ir vienmēr (Webhook Secret tā iestatījumos). Paraksti pieprasījuma neapstrādāto body ar HMAC-SHA256, izmantojot slepeno atslēgu, un nosūti heksadecimālo digest mazajiem burtiem galvenē X-Mssgs-Signature formā sha256=<hex>.

javascript
import crypto from 'node:crypto';

const body = JSON.stringify({ content: 'Deploy finished' });
const signature = crypto.createHmac('sha256', process.env.MSSGS_WEBHOOK_SECRET)
  .update(body)
  .digest('hex');

await fetch(process.env.MSSGS_WEBHOOK_URL, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-Mssgs-Signature': `sha256=${signature}`
  },
  body
});
Pieprasījums bez derīga paraksta saņem 401 un {"error": "INVALID_SIGNATURE"}. Neparakstītus pieprasījumus pieņem tikai webhook bez slepenās atslēgas, piemēram, tāds, kas izveidots caur MCP bez webhook_secret.

Tiek pieņemta arī GitHub paša galvene X-Hub-Signature-256, tāpēc GitHub webhook ar to pašu slepeno atslēgu darbojas bez izmaiņām. Parakstā nav laika zīmoga, tāpēc tas neliedz pārtvertu pieprasījumu nosūtīt vēlreiz: svarīgākais noslēpums joprojām ir URL.

Atbildes un kļūdas

Publicēta ziņa atgriežas ar savu id un callback_url, ar kuru to 30 minūtes var atjaunināt vai dzēst.

json
{
  "success": true,
  "message_id": "aZZ1a2b-...",
  "callback_url": "https://mss.gs/api/v1/trigger-callback/8f14e45f-...",
  "stream_url": "https://mss.gs/api/v1/instant/6b1e...c0?token=a1b2c3d4-..."
}
Lasi ne tikai statusu, bet arī body. Noraidīts payload iemeslu norāda body kā error kodu. Uzskati jebkuru body ar atslēgu error par kļūdu neatkarīgi no statusa koda.
http
HTTP/1.1 200 OK
Content-Type: application/json

{ "error": "ATTACHMENT_TOO_LARGE" }
javascript
const res = await fetch(webhookUrl, { method: 'POST', headers, body });
const reply = await res.json().catch(() => null);

// A rejected payload still comes back as 200: read the body.
if (!res.ok || (reply && reply.error)) {
  throw new Error(`webhook rejected: ${reply?.error ?? res.status}`);
}

Ja ziņai ir pogas, atbildē ir arī stream_url: reāllaika plūsma ar atbildēm, reakcijām un pogu nospiešanām uz šīs ziņas, atvērta 10 minūtes vai stundu, ja nosūti "sse_event_extended_timeout": true. Skati atjauninājumus reāllaikā.

Statusa kodi

StatussKad
401Webhook ir slepenā atslēga, bet paraksta nav vai tas ir nepareizs.
403Šis webhook nedrīkst publicēt šajā kanālā.
404Šajā URL nav webhook.
413Pieprasījums ir pārāk liels.
429Pārāk daudz pieprasījumu. Samazini tempu un mēģini vēlreiz.
502Ziņu neizdevās piegādāt. Mēģini vēlreiz.

Kļūdu kodi

KodsNozīme
MISSING_CONTENTNav ko publicēt: nav ne teksta, ne kartītes, ne failu.
INVALID_MESSAGE_CONTAINERmessage_container nav objekts.
INVALID_MESSAGE_CONTAINER_TYPEKartītes tips nav ne embed_message, ne system_message.
MISSING_MESSAGE_CONTAINER_DESCRIPTIONKartītei vajadzīgs apraksts, ja vien tā nav ielādes indikators.
MISSING_MESSAGE_CONTAINER_LOADER_TEXTIelādes indikatora kartītei vajadzīgs loader_text.
INVALID_WEBHOOK_BINDINGŠis webhook nedrīkst publicēt šajā kanālā.
INVALID_SIGNATUREParaksta galvenes nav vai paraksts ir nepareizs.
REQUEST_BODY_TOO_LARGEPieprasījums pārsniedz izmēra limitu.
PUBLISH_FAILEDZiņu neizdevās piegādāt.
INVALID_ACTIONS_FORMAT, INVALID_ACTION_MISSING_FIELDS, DUPLICATE_ACTION_ID, INVALID_TRIGGERS_FORMAT, INVALID_TRIGGER_MISSING_ACTION, INVALID_TRIGGER_ACTION_NOT_ALLOWEDKaut kas nav kārtībā ar pogu. Skati pogas.

Failu kļūdas

KodsNozīme
INVALID_ATTACHMENTS_FORMATattachments nav saraksts, vai kāds ieraksts nav objekts.
TOO_MANY_ATTACHMENTSVairāk nekā pieci faili.
MISSING_ATTACHMENT_NAMEFailam nav nosaukuma.
INVALID_ATTACHMENT_NAMENo nosaukuma nepaliek nekas lietojams, piemēram, ...
MISSING_ATTACHMENT_SOURCENav ne url, ne content_base64.
AMBIGUOUS_ATTACHMENT_SOURCEGan url, gan content_base64.
INVALID_ATTACHMENT_BASE64Base64 nevar dekodēt.
ATTACHMENT_TOO_LARGEFails pēc dekodēšanas pārsniedz 8 MB.
INVALID_ATTACHMENT_URLurl nav mssgs adrese.

Limiti

LimitsVērtība
Pieprasījuma izmērsAptuveni 10 MB
Faili vienā ziņā5, katrs līdz 8 MB
Kartītes aprakstsLīdz 50 000 baitiem. Pēc 1000 baitiem dalībnieki redz sākumu un pogu Show more.
Ziņas atjaunināšana pēc publicēšanas30 minūtes, caur callback_url
Reāllaika plūsma ziņai ar pogām10 minūtes vai stunda pēc pieprasījuma

Pieprasījumu biežums ir ierobežots. Ja saņem 429, pagaidi, pirms sūti vēlreiz, un brīdinājumus, kas pienāk viļņveidā, apvieno vienā ziņā.

GitHub, UniFi un App Store Connect

Norādi kādam no šiem servisiem webhook URL, un mssgs to atpazīs un publicēs kārtīgu kartīti, bez paša rakstīta payload. Skati integrācijas. Šie servisi saņem atbildi {"success": true} bez callback URL.

AvotsAtpazīst pēcKo publicē
GitHubGalvene x-github-eventPush, pull request un pārskatīšanas, issues un komentāri, zari un tagi, laidieni. Izmaiņu birums vienā issue vai pull request tiek apkopots vienā kartītē.
UniFi ProtectUser agent protect-alarm-managerDurvju zvana signāli, kustība un cilvēki, transportlīdzekļi vai sūtījumi, ko pamanījušas tavas kameras.
App Store ConnectTā paziņojuma saturs vai galvene x-apple-signatureApp Store Connect paziņojumi.

Veido tālāk