Siirry pääsisältöön
Kehittäjät Webhookit

Lähetä viestejä webhookilla

Webhook on URL, joka julkaisee viestejä yhteisöösi. Lähetä sille JSONia mistä tahansa, mikä osaa tehdä HTTP-pyynnön, kuten CI:stä, valvonnasta, cron-ajosta tai skriptistä, niin viesti ilmestyy kanavalle.

Mitä voit tehdä

  • Julkaise tekstiä tai korttiPelkkää tekstiä tai kortti, jossa on otsikko, väri, markdownia, kenttiä ja kuvia.
  • Liitä tiedostojaEnintään viisi tiedostoa viestiä kohden: lokeja, raportteja, kuvakaappauksia.
  • Lisää painikkeitaLinkkejä tai painikkeita, jotka muuttavat korttia tai tavoittavat palvelusi.
  • Muuta viestiä myöhemminVastauksessa on callback-URL, jolla viestin voi päivittää tai poistaa.

Sovelluksessa

$ curl -X POST "$MSSGS_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-H "X-Mssgs-Signature: sha256=$SIG" \
-d '{"message_container": {"title": "Build #1847 onnistui", ...}}'
{"success": true, "message_id": "aZZ1a2b-..."}

Yksi pyyntö CI:stä, yksi kortti #deploys-kanavalla. Ylhäällä näkyvä nimi on se, jonka annoit webhookille.

Pika-aloitus

  1. Luo webhook

    Avaa työpöytäsovelluksessa yhteisösi Hallitse palvelinta → Webhookit, luo webhook, valitse kanavat, joille se saa julkaista, ja kopioi kanavan URL. Se on tämän muotoinen:

    url
    https://mss.gs/api/v1/webhook/{webhook_guid}/{token}/{channel_guid}
  2. Lähetä viesti

    Allekirjoita JSON webhookin salaisuudella ja lähetä se POST-pyynnöllä. Työpöytäsovelluksessa luodulla webhookilla on aina salaisuus: kopioi se kohdasta Webhookin salaisuus webhookin asetuksista.

    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. Lue vastaus

    Vastauksesta saat viestin id:n sekä callback_url-osoitteen, jolla voit muuttaa viestiä myöhemmin.

    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-..."
    }
Kuka tahansa, jolla on URL ja salaisuus, voi julkaista kyseiselle kanavalle. Pidä molemmat poissa julkisista repositorioista ja selaimessa ajettavasta koodista.

Mitä voit lähettää

Viesti on joko lyhyt muoto (teksti, otsikko ja väri) tai kokonainen kortti, ja kumpaankin voi liittää painikkeita ja tiedostoja. Kortin yläreunan nimi on aina webhookin oma nimi. Webhookin asetuksissa päätät myös, saako se julkaista kuvia ja mainita ihmisiä.

Lyhyt muoto

Riittää useimpiin hälytyksiin.

json
{
  "content": "Server backup completed at 03:00 UTC",
  "color": "green",
  "title": "Backup Bot"
}
KenttäTyyppiMitä se tekee
contentstringViestin teksti. Pakollinen, ellet lähetä korttia tai tiedostoja.
colorstringblue (oletus), green, orange, red, yellow tai purple.
titlestringOtsikko tekstin yläpuolella. Oletuksena webhookin nimi.

Kokonainen kortti

Lähetä message_container, niin saat kortin, jossa on linkitetty otsikko, alaotsikko, markdownia, kenttiä ja kuvia. Webhookin kautta kortti ottaa vastaan kentät type, color, title, title_url, sub_title, description, fields, avatar_url, image_url, image_base64, images sekä latausilmaisimen kentät. Tilapilleri, merkki, diff-luvut ja kokoontaitettu päättely ovat komentovastauksia varten. Jokainen kenttä on kuvattu sivulla viestikortit.

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
Viesti lähettäjältä CI

Build #1847 onnistui

Kaikki 212 testiä vihreänä haarassa main.
Duration
2m 34s
Commit
1a2b3c4

Painikkeet

Lisää actions-taulukko, niin viestin alle tulee painikkeita. Niiden toiminta on kuvattu sivulla painikkeet.

Tiedostot

Julkaise viestin mukana oikeita tiedostoja: loki, raportti, kuvakaappaus. Ne näkyvät kuten mikä tahansa muu liite, latausrivinä tai kuvien, videoiden ja äänen kohdalla suoraan viestissä. Pelkät tiedostot sisältävä viesti on kelvollinen: jätä content ja kortti pois.

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"
    }
  ]
}
KenttäTyyppiMitä se tekee
namestringTiedostonimi, jolla tiedosto ladataan. Pakollinen. Polusta jätetään vain viimeinen osa.
content_base64stringTiedoston tavut base64-muodossa, raakana tai data:-URI:na. mssgs tallentaa tiedoston ja säilyttää viestissä vain linkin.
mime_typestringKentän content_base64 sisältötyyppi. Oletus on text/plain.
urlstringTiedosto, joka on jo mssgs:n palvelimella: /static/...-polku tai https://mss.gs/...-URL.
Lähetä jokaisesta tiedostosta täsmälleen toinen kentistä content_base64 ja url. Molemmat tai ei kumpaakaan on virhe.
RajaArvo
Tiedostoja viestiä kohden5
Tiedoston koko dekoodauksen jälkeen8 MB
Tiedostonimi200 merkkiä
Koko pyyntöNoin 10 MB. Base64 kasvattaa tiedostoa kolmanneksella, joten yksittäinen yli noin 7 MB:n tiedosto ei mahdu mukaan.

Miksi url hyväksyy vain mssgs-osoitteita

Webhookin URL päätyy usein liitetyksi muihin hallintapaneeleihin. Vuotaneella URL:lla ei saa voida pakottaa jokaisen jäsenen sovellusta hakemaan tiedostoa vuotajan valitsemalta palvelimelta. Jos tiedostosi on muualla, lähetä se content_base64-kentässä, niin mssgs isännöi sen.

Epäonnistunut lataus ei kaada viestiä

Tiedostot tarkistetaan etukäteen, mutta ne ladataan vasta jälkikäteen. Jos lataus epäonnistuu, kyseinen tiedosto jätetään pois ja muu viesti julkaistaan silti ilman virhettä: tiedoston menettäminen on parempi kuin raportin menettäminen. Jos tiedosto on tärkeä, tarkista, että se tuli perille.

Tiedosto komentoriviltä

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 @-

Pyyntöjen allekirjoittaminen

Webhook, jolla on salaisuus, hyväksyy vain pyynnöt, jotka todistavat tuntevansa sen, ja työpöytäsovelluksessa luodulla webhookilla on aina salaisuus (Webhookin salaisuus sen asetuksissa). Allekirjoita pyynnön raaka body HMAC-SHA256:lla salaisuutta käyttäen ja lähetä pienaakkosinen heksadesimaalitiiviste X-Mssgs-Signature-headerissa muodossa 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
});
Pyyntö ilman kelvollista allekirjoitusta saa vastaukseksi 401 ja {"error": "INVALID_SIGNATURE"}. Vain webhook, jolla ei ole salaisuutta, esimerkiksi MCP:n kautta ilman webhook_secret-kenttää luotu, hyväksyy allekirjoittamattomat pyynnöt.

Myös GitHubin oma X-Hub-Signature-256-header hyväksytään, joten GitHub-webhook samalla salaisuudella toimii sellaisenaan. Allekirjoituksessa ei ole aikaleimaa, joten se ei estä kaapatun pyynnön lähettämistä uudelleen: URL on edelleen se salaisuus, jolla on merkitystä.

Vastaukset ja virheet

Julkaistu viesti palauttaa id:nsä ja callback_url-osoitteen, jolla sen voi päivittää tai poistaa 30 minuutin ajan.

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-..."
}
Lue tilakoodin lisäksi myös body. Hylätyn payloadin syy on bodyssa error-koodina. Tulkitse jokainen body, jossa on error-avain, epäonnistumiseksi tilakoodista riippumatta.
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}`);
}

Kun viestissä on painikkeita, vastauksessa on myös stream_url: reaaliaikainen virta viestin vastauksista, reaktioista ja painikkeiden painalluksista. Se on auki 10 minuuttia, tai tunnin, kun lähetät "sse_event_extended_timeout": true. Katso live-päivitykset.

Tilakoodit

TilaMilloin
401Webhookilla on salaisuus, ja allekirjoitus puuttuu tai on väärä.
403Tämä webhook ei saa julkaista kyseiselle kanavalle.
404Tässä URL:ssa ei ole webhookia.
413Pyyntö on liian suuri.
429Liian monta pyyntöä. Hidasta ja yritä uudelleen.
502Viestiä ei voitu toimittaa. Yritä uudelleen.

Virhekoodit

KoodiMerkitys
MISSING_CONTENTEi mitään julkaistavaa: ei tekstiä, korttia eikä tiedostoja.
INVALID_MESSAGE_CONTAINERmessage_container ei ole olio.
INVALID_MESSAGE_CONTAINER_TYPEKortin tyyppi ei ole embed_message eikä system_message.
MISSING_MESSAGE_CONTAINER_DESCRIPTIONKortti tarvitsee kuvauksen, ellei se ole latauskortti.
MISSING_MESSAGE_CONTAINER_LOADER_TEXTLatauskortti tarvitsee kentän loader_text.
INVALID_WEBHOOK_BINDINGTämä webhook ei saa julkaista kyseiselle kanavalle.
INVALID_SIGNATUREAllekirjoitusheader puuttuu tai on väärä.
REQUEST_BODY_TOO_LARGEPyyntö ylittää kokorajan.
PUBLISH_FAILEDViestiä ei voitu toimittaa.
INVALID_ACTIONS_FORMAT, INVALID_ACTION_MISSING_FIELDS, DUPLICATE_ACTION_ID, INVALID_TRIGGERS_FORMAT, INVALID_TRIGGER_MISSING_ACTION, INVALID_TRIGGER_ACTION_NOT_ALLOWEDJossakin painikkeessa on vikaa. Katso painikkeet.

Tiedostovirheet

KoodiMerkitys
INVALID_ATTACHMENTS_FORMATattachments ei ole lista, tai jokin sen alkio ei ole olio.
TOO_MANY_ATTACHMENTSYli viisi tiedostoa.
MISSING_ATTACHMENT_NAMETiedostolla ei ole nimeä.
INVALID_ATTACHMENT_NAMENimestä ei jää mitään käyttökelpoista, esimerkiksi ...
MISSING_ATTACHMENT_SOURCEEi url- eikä content_base64-kenttää.
AMBIGUOUS_ATTACHMENT_SOURCESekä url että content_base64.
INVALID_ATTACHMENT_BASE64Base64-data ei dekoodaudu.
ATTACHMENT_TOO_LARGETiedosto on dekoodattuna yli 8 MB.
INVALID_ATTACHMENT_URLurl ei ole mssgs-osoite.

Rajat

RajaArvo
Pyynnön kokoNoin 10 MB
Tiedostoja viestiä kohden5, kukin enintään 8 MB
Kortin kuvausEnintään 50 000 tavua. 1 000 tavun jälkeen jäsenet näkevät alun ja Näytä lisää -painikkeen.
Viestin päivittäminen jälkikäteen30 minuuttia, callback_url-osoitteen kautta
Painikkeellisen viestin reaaliaikainen virta10 minuuttia, tai pyynnöstä tunti

Pyyntöjen määrää rajoitetaan. Kun saat vastauksen 429, odota ennen kuin lähetät uudelleen, ja kokoa ryöppyinä saapuvat hälytykset yhteen viestiin.

GitHub, UniFi ja App Store Connect

Osoita jokin näistä palveluista webhookin URL:iin, niin mssgs tunnistaa sen ja julkaisee siistin kortin ilman, että sinun tarvitsee kirjoittaa payloadia. Katso integraatiot. Nämä vastaavat {"success": true} ilman callback-URL:ia.

LähdeTunnistetaanMitä se julkaisee
GitHubx-github-event-headerPushit, pull requestit ja arvioinnit, issuet ja kommentit, haarat ja tagit sekä julkaisut. Useat peräkkäiset muutokset samaan issueen tai pull requestiin kootaan yhdeksi kortiksi.
UniFi Protectprotect-alarm-manager-user agentOvikellon soitot, liike sekä kameroidesi havaitsemat ihmiset, ajoneuvot ja paketit.
App Store ConnectIlmoituksen body tai x-apple-signature-headerApp Store Connect -ilmoitukset.

Jatka rakentamista