---
title: "Webhook: publicē ziņas mssgs kanālā"
description: "Nosūti ziņu vai kartīti uz mssgs kanālu no CI, monitoringa vai jebkura skripta ar vienu HTTP pieprasījumu. Formāti, faili, paraksti, kļūdas un limiti."
canonical: https://docs.mss.gs/lv/webhooks
language: lv
---

# 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īti** Vienkāršs teksts vai kartīte ar virsrakstu, krāsu, markdown, laukiem un attēliem.

- **Pievieno failus** Līdz pieciem failiem vienā ziņā: žurnāli, atskaites, ekrānuzņēmumi.

- **Pievieno pogas** Saites vai pogas, kas maina kartīti vai sasniedz tavu servisu.

- **Maini to vēlāk** Atbildē ir callback URL, ar kuru ziņu var atjaunināt vai dzēst.

Lietotnē

#### Būvējums #1847 izdevās

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

- [Ātrais sākums](#quick-start)

- [Ko var nosūtīt](#format)

- [Faili](#attachments)

- [Parakstīšana](#signing)

- [Atbildes un kļūdas](#responses)

- [Limiti](#limits)

- [GitHub, UniFi, App Store](#special)

## Ātrais sākums

### 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}
```

### 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"
```

### 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-..."
}
```

## 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"
}
```

| Lauks | Tips | Ko tas dara |
| --- | --- | --- |
| content | string | Ziņas teksts. Obligāts, ja vien nesūti kartīti vai failus. |
| color | string | blue (noklusējums), green , orange , red , yellow vai purple . |
| title | string | Virsraksts 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](https://docs.mss.gs/lv/bots).

```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" }
    ]
  }
}
```

#### Būvējums #1847 izdevās

### Pogas

Pievieno masīvu actions , lai zem ziņas būtu pogas. Kā tās darbojas, skaidrots lapā [pogas](https://docs.mss.gs/lv/buttons).

## 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"
    }
  ]
}
```

| Lauks | Tips | Ko tas dara |
| --- | --- | --- |
| name | string | Faila nosaukums, ar kādu tas tiek lejupielādēts. Obligāts. Ceļš tiek saīsināts līdz pēdējai daļai. |
| content_base64 | string | Faila baiti base64 formātā, neapstrādāti vai kā data: URI. mssgs saglabā failu un ziņā patur tikai saiti. |
| mime_type | string | content_base64 satura tips. Pēc noklusējuma text/plain . |
| url | string | Fails, kas jau mitināts mssgs: ceļš /static/... vai URL https://mss.gs/... . |

| Limits | Vērtība |
| --- | --- |
| Faili vienā ziņā | **5** |
| Faila izmērs pēc dekodēšanas | **8 MB** |
| Faila nosaukums | 200 rakstzīmes |
| Viss pieprasījums | Aptuveni 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
});
```

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-..."
}
```

```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ā](https://docs.mss.gs/lv/live-updates).

### Statusa kodi

| Statuss | Kad |
| --- | --- |
| 401 | Webhook 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. |
| 413 | Pieprasījums ir pārāk liels. |
| 429 | Pārāk daudz pieprasījumu. Samazini tempu un mēģini vēlreiz. |
| 502 | Ziņu neizdevās piegādāt. Mēģini vēlreiz. |

### Kļūdu kodi

| Kods | Nozīme |
| --- | --- |
| MISSING_CONTENT | Nav ko publicēt: nav ne teksta, ne kartītes, ne failu. |
| INVALID_MESSAGE_CONTAINER | message_container nav objekts. |
| INVALID_MESSAGE_CONTAINER_TYPE | Kartītes tips nav ne embed_message , ne system_message . |
| MISSING_MESSAGE_CONTAINER_DESCRIPTION | Kartītei vajadzīgs apraksts, ja vien tā nav ielādes indikators. |
| MISSING_MESSAGE_CONTAINER_LOADER_TEXT | Ielādes indikatora kartītei vajadzīgs loader_text . |
| INVALID_WEBHOOK_BINDING | Šis webhook nedrīkst publicēt šajā kanālā. |
| INVALID_SIGNATURE | Paraksta galvenes nav vai paraksts ir nepareizs. |
| REQUEST_BODY_TOO_LARGE | Pieprasījums pārsniedz izmēra limitu. |
| PUBLISH_FAILED | Ziņ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_ALLOWED | Kaut kas nav kārtībā ar pogu. Skati [pogas](https://docs.mss.gs/lv/buttons). |

### Failu kļūdas

| Kods | Nozīme |
| --- | --- |
| INVALID_ATTACHMENTS_FORMAT | attachments nav saraksts, vai kāds ieraksts nav objekts. |
| TOO_MANY_ATTACHMENTS | Vairāk nekā pieci faili. |
| MISSING_ATTACHMENT_NAME | Failam nav nosaukuma. |
| INVALID_ATTACHMENT_NAME | No nosaukuma nepaliek nekas lietojams, piemēram, .. . |
| MISSING_ATTACHMENT_SOURCE | Nav ne url , ne content_base64 . |
| AMBIGUOUS_ATTACHMENT_SOURCE | Gan url , gan content_base64 . |
| INVALID_ATTACHMENT_BASE64 | Base64 nevar dekodēt. |
| ATTACHMENT_TOO_LARGE | Fails pēc dekodēšanas pārsniedz 8 MB. |
| INVALID_ATTACHMENT_URL | url nav mssgs adrese. |

## Limiti

| Limits | Vērtība |
| --- | --- |
| Pieprasījuma izmērs | Aptuveni 10 MB |
| Faili vienā ziņā | 5, katrs līdz 8 MB |
| Kartītes apraksts | Līdz 50 000 baitiem. Pēc 1000 baitiem dalībnieki redz sākumu un pogu **Show more**. |
| Ziņas atjaunināšana pēc publicēšanas | 30 minūtes, caur callback_url |
| Reāllaika plūsma ziņai ar pogām | 10 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](https://mss.gs/lv/integrations). Šie servisi saņem atbildi {"success": true} bez callback URL.

| Avots | Atpazīst pēc | Ko publicē |
| --- | --- | --- |
| GitHub | Galvene x-github-event | Push, 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 Protect | User agent protect-alarm-manager | Durvju zvana signāli, kustība un cilvēki, transportlīdzekļi vai sūtījumi, ko pamanījušas tavas kameras. |
| App Store Connect | Tā paziņojuma saturs vai galvene x-apple-signature | App Store Connect paziņojumi. |

## Veido tālāk
