Собеседник прислал фото, видео, документ, голосовое, аудио или стикер. Gratio сразу забирает файл к себе и даёт на него постоянную ссылку downloadUrl: ссылки самих мессенджеров временные.
typeWebhook |
incomingMessageReceived |
typeMessage |
imageMessage, videoMessage, documentMessage, audioMessage, stickerMessage |
| Флаг настроек | incomingWebhook |
| Каналы | MAX, Telegram, WhatsApp, почта |
Пример
Мария прислала в MAX заполненную анкету:
{
"typeWebhook": "incomingMessageReceived",
"instanceData": {"idInstance": 7100000001, "wid": "79990000001@c.us", "typeInstance": "v3", "channel": "max"},
"timestamp": 1791823745,
"idMessage": "117428960974949548",
"eventId": "msg:8695836:117428960974949548",
"senderData": {
"chatId": "8695836", "chatName": "Мария", "chatType": "user",
"sender": "8695836", "senderName": "Мария", "senderType": "user",
"senderContactName": "", "senderPhoneNumber": 0
},
"messageData": {
"typeMessage": "documentMessage",
"fileMessageData": {
"downloadUrl": "https://api.gratio.net/media/7100000001/8695836/117428960974949548/0/d8f9…",
"caption": "Заполнила анкету",
"fileName": "Анкета.pdf",
"jpegThumbnail": "",
"isAnimated": false,
"mimeType": "application/pdf",
"forwardingScore": 0,
"isForwarded": false
}
}
}
Поля
| Поле | Описание |
|---|---|
fileMessageData.downloadUrl |
ссылка на файл в хранилище Gratio. Подписанная: скачивается без токена, её можно отдать в браузер оператора или в CRM |
fileMessageData.caption |
подпись к файлу; "", если её нет |
fileMessageData.fileName |
имя файла. Площадка имени не дала — {idMessage}.jpg, .mp4, .ogg или .webp по виду |
fileMessageData.mimeType |
тип файла |
fileMessageData.jpegThumbnail |
превью в base64, если площадка его дала; иначе "" |
fileMessageData.isAnimated |
анимированный стикер MAX |
fileMessageData.isForwarded, forwardingScore |
файл переслан — см. Ссылка и пересланное |
Ссылка не истекает, ответ — сам файл с его Content-Type; неверная подпись — 404. Важные файлы сохраняйте у себя. Подробно — в статье Файлы и ссылки на них.
Остальные поля конверта — в статье Формат уведомления.
Виды файлов
typeMessage |
Что | mimeType |
|---|---|---|
imageMessage |
фото | MAX — image/jpeg; остальные — как прислала площадка |
videoMessage |
видео, «кружок», GIF-анимация | обычно video/mp4 |
documentMessage |
документ любого типа | по имени файла или от площадки |
audioMessage |
голосовое сообщение и аудиофайл | голосовое — audio/ogg |
stickerMessage |
стикер | обычно image/webp |
Голосовое — это audioMessage. Отдельного вида для голосовых нет: у голосового обычно тип audio/ogg и нет своего имени файла.
Голосовое
Мария записала голосовое в Telegram:
"messageData": {
"typeMessage": "audioMessage",
"fileMessageData": {
"downloadUrl": "https://api.gratio.net/media/7100000001/8617393401/4815/0/7c2e…",
"caption": "", "fileName": "4815.ogg", "jpegThumbnail": "", "isAnimated": false,
"mimeType": "audio/ogg", "forwardingScore": 0, "isForwarded": false
}
}
Альбом
Несколько файлов в одном сообщении: первый — в fileMessageData, остальные — в additionalFiles, у каждого свой typeMessage и своя ссылка. Номер файла — в ссылке после idMessage: /0/, /1/, /2/. Мария прислала в MAX два фото и видео с занятия:
"messageData": {
"typeMessage": "imageMessage",
"fileMessageData": {
"downloadUrl": "https://api.gratio.net/media/7100000001/8695836/117428961523847166/0/41b7…",
"caption": "Фото с занятия", "fileName": "117428961523847166.jpg", "jpegThumbnail": "/9j/4AAQSkZJRgABAQAAAQABAAD…",
"isAnimated": false, "mimeType": "image/jpeg", "forwardingScore": 0, "isForwarded": false
},
"additionalFiles": [
{
"typeMessage": "imageMessage",
"downloadUrl": "https://api.gratio.net/media/7100000001/8695836/117428961523847166/1/9be0…",
"caption": "Фото с занятия", "fileName": "117428961523847166.jpg", "jpegThumbnail": "/9j/4AAQSkZJRgABAQAAAQABAAD…",
"isAnimated": false, "mimeType": "image/jpeg", "forwardingScore": 0, "isForwarded": false
},
{
"typeMessage": "videoMessage",
"downloadUrl": "https://api.gratio.net/media/7100000001/8695836/117428961523847166/2/3a61…",
"caption": "Фото с занятия", "fileName": "117428961523847166.mp4", "jpegThumbnail": "",
"isAnimated": false, "mimeType": "video/mp4", "forwardingScore": 0, "isForwarded": false
}
]
}
Подпись альбома повторяется у каждого файла. Альбомы одним сообщением присылают MAX и почта (письмо с несколькими вложениями). В Telegram и WhatsApp каждый файл альбома — отдельное сообщение и отдельное уведомление.
В других каналах
| Канал | Особенности |
|---|---|
| MAX | у фото есть превью jpegThumbnail; голосовое — audio/ogg; альбом — additionalFiles |
| Telegram | голосовое и музыка — audioMessage; «кружки» и GIF — videoMessage; один файл на сообщение |
голосовое — OGG/Opus, audioMessage; «кружки» — videoMessage; у аудио и стикеров подписи нет |
|
| Почта | вложения письма — файлами; текст письма — в caption, тема — в emailMessageData. См. Письмо |
В группе chatId — группа, sender — участник, как у текстового сообщения (см. Текст). В ссылке на файл — адрес чата во внутренней форме: у WhatsApp без суффикса @c.us.
Как обработать
Скачать все файлы сообщения, в том числе альбом:
import requests
def files_of(data: dict) -> list[dict]:
"""Все файлы сообщения: первый и остальные файлы альбома."""
first = data.get("fileMessageData")
if first is None:
return []
return [{"typeMessage": data["typeMessage"], **first}, *data.get("additionalFiles", [])]
def save_files(body: dict) -> None:
for i, f in enumerate(files_of(body["messageData"])):
r = requests.get(f["downloadUrl"], timeout=120) # без токена: ссылка подписанная
r.raise_for_status()
with open(f"{body['idMessage']}-{i}-{f['fileName']}", "wb") as out:
out.write(r.content)
Что дальше
- Файлы и ссылки на них — хранение, пределы, типы.
- sendFileByUpload — отправить файл в ответ.
- downloadFile — ссылка на файл старого сообщения.
