UC-026 — Download Media da Messaggi Inbound
| Campo | Valore |
|---|---|
| ID | UC-026 |
| Obiettivo | Ricevere messaggi inbound con media e scaricare i file allegati |
| Canale | WhatsApp, RCS |
| Complessità | ⭐⭐ Intermedio |
| Tempo stimato | 15 minuti |
| API coinvolte | Webhook INBOUND, GET /api/files/{mediaKey} |
Scenari reali
- AssicuraFacile — Foto sinistro: Il cliente invia via WhatsApp le foto del danno alla propria auto. L'operatore le scarica per allegare alla pratica assicurativa.
- StudioLegale Rossi — Documenti via WhatsApp: Un cliente invia un contratto PDF per una revisione rapida. Lo studio lo scarica e archivia nel gestionale documentale.
- RadioTaxi Milano — Messaggi vocali: L'autista invia un messaggio vocale con le indicazioni per il punto di ritiro. Il sistema lo scarica e lo trascrive automaticamente.
Flusso del download media
Il diagramma illustra il flusso completo: l'utente invia un file multimediale, il gateway lo notifica al tuo server tramite webhook con la mediaKey, e la tua applicazione scarica il file tramite l'endpoint dedicato.
Prerequisiti
- API Key attiva con permessi di lettura messaggi
- Endpoint webhook configurato per eventi INBOUND (vedi guida Webhook)
- Numero WhatsApp Business o RCS agent registrato sulla piattaforma
- Storage locale o cloud (S3, Azure Blob) per il salvataggio dei file
Step 1 — Configura il webhook per messaggi inbound
Assicurati che il tuo endpoint webhook sia registrato per ricevere eventi di tipo INBOUND. Quando un utente invia un messaggio con allegato, riceverai una notifica come questa:
{
"channel": "WHATSAPP",
"eventType": "INBOUND",
"messageId": "wamid.HBgNMzkzNDcxMjM0NTY3FQIAEhggQTJDNEU2RjgtMTIzNC01Njc4",
"from": "+393471234567",
"to": "+393801234567",
"timestamp": "2026-04-09T14:22:10Z",
"content": {
"type": "IMAGE",
"caption": "Foto danno paraurti anteriore",
"mimeType": "image/jpeg",
"mediaKey": "mk_a1b2c3d4e5f6g7h8i9j0"
}
}
:::tip Tipi di media supportati
I tipi supportati includono IMAGE (JPEG, PNG), DOCUMENT (PDF, DOCX), AUDIO (OGG, MP3), VIDEO (MP4) e STICKER. Ogni tipo ha limiti di dimensione specifici definiti dal carrier.
:::
Step 2 — Scarica il file media tramite mediaKey
Usa la mediaKey ricevuta nel webhook per ottenere il file:
curl -X GET "https://lora-api.agiletelecom.com/api/files/mk_a1b2c3d4e5f6g7h8i9j0" \
-H "X-Api-Key: YOUR_API_KEY"
Response — URL di download
{
"mediaKey": "mk_a1b2c3d4e5f6g7h8i9j0",
"url": "https://cdn.agiletelecom.com/media/mk_a1b2c3d4e5f6g7h8i9j0.jpg?token=eyJhbG...&expires=1744210930",
"mimeType": "image/jpeg",
"fileSize": 245780,
"expiresAt": "2026-04-09T15:22:10Z"
}
:::warning URL con scadenza
L'URL pre-signed ha una durata limitata (tipicamente 60 minuti). Scarica il file immediatamente dopo aver ricevuto l'URL. Se l'URL e scaduto, ripeti la chiamata GET /api/files/{mediaKey} per ottenerne uno nuovo.
:::
Step 3 — Download e salvataggio del file
Usa l'URL pre-signed per scaricare il file effettivo:
curl -o "sinistro_paraurti.jpg" \
"https://cdn.agiletelecom.com/media/mk_a1b2c3d4e5f6g7h8i9j0.jpg?token=eyJhbG...&expires=1744210930"
Dietro le quinte — Ciclo di vita del media
- Ricezione: Quando l'utente invia un file, il carrier (Meta per WhatsApp, Google per RCS) lo memorizza temporaneamente sui propri server.
- Notifica: Il gateway riceve il messaggio inbound e genera una
mediaKeyunivoca che mappa il file sul carrier. - Proxy sicuro: La chiamata
GET /api/files/{mediaKey}non scarica il file direttamente dal gateway, ma restituisce un URL pre-signed che punta al CDN. Questo evita di sovraccaricare il gateway con trasferimenti di file di grandi dimensioni. - Scadenza: I file sui server del carrier hanno una retention limitata (tipicamente 30 giorni per WhatsApp). Dopo la scadenza, il file non sara più disponibile. Scaricalo e archivialo il prima possibile.
- Dimensioni: WhatsApp supporta file fino a 16 MB per immagini, 100 MB per video e 100 MB per documenti.
Step 4 — Processa e archivia
Una volta scaricato, il file puo essere processato secondo le esigenze:
# Esempio: salvataggio su directory organizzata per data e pratica
PRATICA_ID="SIN-2026-04-0892"
DATA=$(date +%Y%m%d)
DEST_DIR="/archivio/sinistri/${PRATICA_ID}/${DATA}"
mkdir -p "$DEST_DIR"
mv sinistro_paraurti.jpg "${DEST_DIR}/foto_001.jpg"
echo "File archiviato in: ${DEST_DIR}/foto_001.jpg"
Risultato atteso
| Step | Azione | Risultato |
|---|---|---|
| 1 | Webhook INBOUND ricevuto | eventType: "INBOUND", content.mediaKey presente |
| 2 | GET /api/files/{mediaKey} | URL pre-signed con mimeType e fileSize |
| 3 | Download da URL pre-signed | File binario scaricato correttamente |
| 4 | Archiviazione | File salvato nello storage aziendale |
Esempio completo end-to-end
Ecco lo scenario AssicuraFacile completo, dalla ricezione del webhook al salvataggio:
#!/bin/bash
# Script di gestione media inbound per AssicuraFacile
MEDIA_KEY="mk_a1b2c3d4e5f6g7h8i9j0"
API_KEY="YOUR_API_KEY"
BASE_URL="https://lora-api.agiletelecom.com"
# 1. Ottieni l'URL di download
RESPONSE=$(curl -s -X GET "${BASE_URL}/api/files/${MEDIA_KEY}" \
-H "X-Api-Key: ${API_KEY}")
DOWNLOAD_URL=$(echo "$RESPONSE" | jq -r '.url')
MIME_TYPE=$(echo "$RESPONSE" | jq -r '.mimeType')
FILE_SIZE=$(echo "$RESPONSE" | jq -r '.fileSize')
echo "Tipo: ${MIME_TYPE}, Dimensione: ${FILE_SIZE} bytes"
# 2. Scarica il file
EXTENSION="${MIME_TYPE##*/}"
curl -s -o "media_inbound.${EXTENSION}" "$DOWNLOAD_URL"
echo "File scaricato: media_inbound.${EXTENSION}"
# 3. Archivia nel gestionale
PRATICA_ID="SIN-2026-04-0892"
mv "media_inbound.${EXTENSION}" "/archivio/sinistri/${PRATICA_ID}/"
echo "Archiviato nella pratica ${PRATICA_ID}"
Varianti
Gestione di messaggi con più allegati
Se l'utente invia più file, riceverai un webhook per ciascun allegato. Itera sulle mediaKey:
MEDIA_KEYS=("mk_aaa111" "mk_bbb222" "mk_ccc333")
for KEY in "${MEDIA_KEYS[@]}"; do
URL=$(curl -s -X GET "${BASE_URL}/api/files/${KEY}" \
-H "X-Api-Key: ${API_KEY}" | jq -r '.url')
curl -s -o "file_${KEY}.jpg" "$URL"
done
Errori comuni
404 Not Found — mediaKey non valida o scaduta
{
"status": "fail",
"data": {
"error": "Media not found or expired"
}
}
Soluzione: La mediaKey potrebbe essere scaduta (retention del carrier superata). Verifica di processare i webhook tempestivamente. I file WhatsApp sono disponibili per circa 30 giorni.
401 Unauthorized — API Key mancante
{
"status": "fail",
"data": {
"authentication": "Invalid or missing API key"
}
}
Soluzione: Verifica che l'header X-Api-Key sia presente e che la chiave sia attiva.
URL pre-signed scaduto
Se il download fallisce con errore HTTP 403, l'URL pre-signed e scaduto. Richiedi un nuovo URL:
# L'URL e scaduto, richiedi uno nuovo
curl -X GET "https://lora-api.agiletelecom.com/api/files/mk_a1b2c3d4e5f6g7h8i9j0" \
-H "X-Api-Key: YOUR_API_KEY"
Prossimi passi
- UC-009 — Conversazione Bidirezionale: Gestisci conversazioni complete con risposte inbound
- UC-008 — Tracking Delivery via Webhook: Approfondisci la configurazione dei webhook
- UC-003 — Invio WhatsApp Template: Invia messaggi WhatsApp con template approvati
- Guida Webhook: Documentazione completa sulla configurazione webhook