Так выглядит одно сообщение в ответах getChatHistory, getMessage, lastIncomingMessages и lastOutgoingMessages. Элемент плоский, как у Green API: поля сообщения лежат на верхнем уровне, без senderData и messageData.
Пример
Ответ канала цитатой в MAX, отправлен через API и прочитан:
{
"type": "outgoing",
"idMessage": "117428956522361912",
"timestamp": 1791823671,
"chatId": "8695836",
"chatType": "user",
"senderId": "457747484",
"senderName": "",
"senderContactName": "",
"isForwarded": false,
"forwardingScore": 0,
"typeMessage": "quotedMessage",
"textMessage": "Да, место есть. Записали вас на субботу, 11:00.",
"extendedTextMessageData": {
"text": "Да, место есть. Записали вас на субботу, 11:00.",
"stanzaId": "117428955282341903",
"participant": "8695836"
},
"quotedMessage": {
"stanzaId": "117428955282341903",
"participant": "8695836",
"typeMessage": "textMessage",
"textMessage": "Здравствуйте! Есть места на субботу?"
},
"statusMessage": "read",
"sendByApi": true
}
Поля
| Поле | Когда есть | Описание |
|---|---|---|
type |
всегда | incoming — от собеседника, outgoing — от канала |
idMessage |
всегда | id сообщения в мессенджере, строкой |
timestamp |
всегда | время сообщения, Unix, с |
chatId |
всегда | чат: личный, группа или адрес почты |
chatType |
всегда | user, group, channel, bot |
senderId |
всегда | кто написал; у своих — сам канал |
senderName |
всегда | имя автора в мессенджере; бывает пустым |
senderContactName |
всегда | пустая строка — поле для совместимости с Green API |
isForwarded, forwardingScore |
всегда | пересланное: true и 1, иначе false и 0 |
typeMessage |
всегда | вид, как в уведомлениях: textMessage, imageMessage, quotedMessage… Звонок — callMessage |
textMessage |
всегда | текст, подпись файла или "" |
downloadUrl, fileName, mimeType, caption, jpegThumbnail |
файлы | ссылка на файл и его данные — раздел «Файл» ниже |
extendedTextMessageData |
ссылка, пересланное, цитата | как в уведомлениях: у цитаты — text, stanzaId, participant |
quotedMessage |
ответ цитатой | stanzaId — id исходного сообщения, participant — его автор; typeMessage и textMessage — если площадка сообщила текст |
contactMessageData, locationMessageData, pollMessageData |
контакт, геопозиция, опрос | как в уведомлениях |
callMessageData |
звонки | направление, исход, длительность — раздел «Звонок» ниже |
emailMessageData |
письма | тема, цепочка, адресаты, папка — раздел «Письмо» ниже |
statusMessage |
свои | sent, delivered (только WhatsApp), read |
sendByApi |
свои | true — отправлено через API, false — с телефона или из приложения мессенджера |
isEdited |
если правку видел Gratio | true; textMessage — уже новый текст |
isDeleted |
если удаление видел Gratio | true; сообщение остаётся в журнале Gratio с прежним текстом |
Как устроены contactMessageData, locationMessageData, pollMessageData и extendedTextMessageData, смотрите в статьях о форматах: Контакт, Геопозиция, Опрос, Ссылка и пересланное.
Файл
Данные файла лежат прямо в элементе, а не во вложенном объекте. Фото от Марии в MAX:
"typeMessage": "imageMessage",
"textMessage": "Вот расписание",
"downloadUrl": "https://api.gratio.net/media/7100000001/8695836/117428960974949548/0/d8f9…",
"caption": "Вот расписание",
"fileName": "117428960974949548.jpg",
"mimeType": "image/jpeg",
"jpegThumbnail": ""
downloadUrl— подписанная ссылка на хранилище Gratio, без токена. Подробно — Файлы и ссылки на них.- В альбоме у элемента журнала только первый файл. Остальные — в уведомлении о сообщении, в
additionalFiles, см. Файлы и альбомы.
Звонок
Звонки лежат в журнале рядом с сообщениями. Входящий звонок, разговор 11 секунд:
"typeMessage": "callMessage",
"textMessage": "",
"callMessageData": {"direction": "in", "outcome": "completed", "durationSeconds": 11, "isVideo": false}
| Поле | Значение |
|---|---|
direction |
in — входящий, out — исходящий |
outcome |
ringing — звонит, completed — был разговор, missed — пропущен, canceled — отменён до ответа, rejected — отклонён, busy — занято, failed — соединение прервалось |
durationSeconds |
длительность разговора, с; 0, если разговора не было. В WhatsApp 0 и тогда, когда ответили на телефоне: конец такого разговора Gratio не видит |
isVideo |
видеозвонок |
Ход звонка в реальном времени — уведомления incomingCall и outgoingCall.
Письмо
У писем канала «Почта» есть emailMessageData. Письмо Марии во «Входящих»:
"chatId": "maria@client.ru",
"senderId": "maria@client.ru",
"typeMessage": "textMessage",
"textMessage": "Добрый день! Пришлите, пожалуйста, договор.",
"emailMessageData": {
"subject": "Договор на обучение",
"messageId": "a7f3c2e1@client.ru",
"threadId": "c62b698304229a98aad3",
"inReplyTo": null,
"from": "maria@client.ru",
"to": ["info@school.ru"],
"cc": [],
"replyTo": [],
"auto": null,
"folder": "inbox",
"signature": "",
"quoteCut": false,
"form": null,
"truncated": false,
"mailbox": "INBOX",
"uid": 4512,
"hasHtml": true
}
| Поле | Описание |
|---|---|
subject |
тема |
messageId, inReplyTo |
Message-ID письма и того, на которое оно отвечает, без угловых скобок |
threadId |
id первого письма цепочки в канале — общий у всех писем переписки |
from, to, cc, replyTo |
адреса в нижнем регистре |
auto |
автописьмо: auto_reply, bulk, service, bounce, read_receipt; null — письмо человека |
folder |
роль папки: inbox, sent, spam, drafts, trash, archive, all, other |
signature, quoteCut |
отрезанная подпись; отрезана ли цитата прошлых писем |
form |
заявка с формы сайта или null, см. Заявки с форм сайта |
truncated |
письмо больше предела: взят текст, вложений может не хватать |
mailbox, uid |
папка на сервере и номер письма в ней |
hasHtml |
у письма есть HTML-версия, см. getEmail |
Подробно о письмах в уведомлениях — Письмо.
Отличия от уведомления
Те же данные, что в уведомлении о сообщении, но без вложенности:
| В уведомлении | В элементе журнала |
|---|---|
typeWebhook: incomingMessageReceived / outgoing… |
type: incoming / outgoing |
senderData.chatId, senderData.chatType |
chatId, chatType |
senderData.sender, senderData.senderName |
senderId, senderName |
messageData.typeMessage |
typeMessage |
messageData.textMessageData.textMessage |
textMessage |
messageData.fileMessageData.* |
downloadUrl, fileName, mimeType, caption, jpegThumbnail |
| статусы — отдельными уведомлениями outgoingMessageStatus | последний статус — в statusMessage |
instanceData и eventId в элементе журнала нет.
Что дальше
- getChatHistory — история чата.
- Формат уведомления — то же сообщение в уведомлении.
- Файлы и ссылки на них — как скачивать файлы по
downloadUrl.
