Reportistica - Reportistica cronologica - Personalizzata

Questo articolo è destinato ai professionisti IT e agli amministratori di Teams che vogliono creare report cronologici personalizzati al di fuori di Power BI per Teams Agenti telefonici, Operatori automatici e Code chiamata.

Revisione della pianificazione e delle licenze

Pianificazione

Licenze

Panoramica

Il servizio VAAC (Voice Applications Analytics Collector) consente di accedere a tutti i dati cronologici dell'agente telefonico di Teams, dell'operatore automatico e della coda delle chiamate con qualsiasi strumento che supporti la connessione agli endpoint HTTP.

Esistono tre passaggi:

  1. Autenticazione
  2. Creazione di una query valida
  3. Lettura del risultato

Passaggio 1 - Autenticazione

Un token di accesso deve essere recuperato e quindi inviato con tutte le richieste successive.

URL di autenticazione:

https://login.microsoftonline.com/{{tenantID}}/oauth2/token

Sostituire {{tenantID}} con l'ID tenant.

Il corpo della richiesta deve contenere quanto segue:

Nome campo Valore
client_id
Ambito di applicazione user_impersonation
Nome utente Nome utente di Teams
Password La password di Teams per il nome utente
grant_type Password
risorsa https://api.interfaces.records.teams.microsoft.com

Passaggio 2 - Creazione di una query valida

Una query valida è costituita da diversi attributi in un oggetto JSON:

{
   "Filters":[
      {
         "DataModelName":"Date",
         "Value":"2022-04-01",
         "Operand":4
      },
      {
         "DataModelName":"Date",
         "Value":"2022-04-30",
         "Operand":6
      }
   ],
   "Dimensions":[
      {
         "DataModelName":"AutoAttendantIdentity"
      },
      {
         "DataModelName":"AutoAttendantDirectorySearchMethod"
      }
   ],
   "Measurements":[
      {
         "DataModelName":"PSTNTotalMinutes"
      },
      {
         "DataModelName":"TotalCallCount"
      }
   ],
   "Parameters":{
      "UserAgent":"VAAC Custom Query"
   },
   "LimitResultRowsCount":100000
}

Campi obbligatori

  • Filtri: utilizzato per filtrare i dati restituiti da VAAC: qualsiasi dimensione in cui Filters Support può Y essere filtrata
    • DataModelName deve essere una delle dimensioni supportate
    • Il valore deve essere nel formato corretto (datetime, stringa, numero e così via)
    • Operandi:
      • 0 - Uguale a
      • 1 - Diverso da
      • 2 - Contiene
      • 3 - Inizia con
      • 4 - Maggiore di
      • 5 - Maggiore o uguale a
      • 6 - Minore di
      • 7 - Minore o uguale a
      • 8 - Non contiene
      • 9 - Non inizia con
  • Dimensioni:
  • Misure:
  • Parametri: Attualmente è supportato solo UserAgent.
  • LimitResultRowsCount: il numero massimo di righe restituite da VAAC

Nota

Quando si invia una query che esegue una ricerca in base a Datee i criteri di ricerca includono sia la data che l'ora (formato ISO 8601), la parte relativa all'ora viene ignorata.

Importante

Le richieste nel sistema vengono limitate in base all'indirizzo IP che effettua la chiamata, all'identità del tenant riconosciuta nell'intestazione auth e al servizio chiamante, per impedire a un singolo client, tenant o servizio di monopolizzare le risorse.

Comprimere la query JSON

L'API VAAC accetta solo stringhe compresse con GZIP o con codifica Base64 come input.

Usa qualsiasi sito Web in grado di comprimere il BLOB JSON usando GZIP o Base64. Ad esempio:

L'output GZIP dovrebbe essere simile a questo:

H4sIAAAAAAAACq2SQWsCMRCF7/6KkLNC3EoPe9u6FISuFbW9lB4GM9TQbEaSCSLif+9mV4uCBwXnMkze5L0vkH1PCCFfjWX0QeZfaWxqf+xJLIGhIo12CjXKPM0o+2cLn2BjEjKVZQM1Gqjhhfy+QQ9Oy3x0PDz0H5HypK6nPJ9SUv9uV2RpanTBkLvxiUVkKpjRaXA80ejY8E7eg3/hUBqPKya/WyD41bpCXpP+tzvjrBBC9NjA8o2ks8VyuiQGWxkXGcNdkO3FMVg7puj4GtAMfLPa/Y2Tk/wI6IufhjHl0xa9eJmIEsMv06Y16cLlm6kNzzFEy3Pahi4kH6pUvcMfrAhUU3oCAAA=

L'output Base64 dovrebbe essere simile a questo:

ew==
IkZpbHRlcnMiOls=
ew==
IkRhdGFNb2RlbE5hbWUiOiJEYXRlIiw=
IlZhbHVlIjoiMjAyMi0wNC0wMSIs
Ik9wZXJhbmQiOjQ=
fSw=
ew==
IkRhdGFNb2RlbE5hbWUiOiJEYXRlIiw=
IlZhbHVlIjoiMjAyMi0wNC0zMCIs
Ik9wZXJhbmQiOjY=
fQ==
XSw=
IkRpbWVuc2lvbnMiOls=
ew==
IkRhdGFNb2RlbE5hbWUiOiJBdXRvQXR0ZW5kYW50SWRlbnRpdHki
fSw=
ew==
IkRhdGFNb2RlbE5hbWUiOiJBdXRvQXR0ZW5kYW50RGlyZWN0b3J5U2VhcmNoTWV0aG9kIg==
fQ==
XSw=
Ik1lYXN1cmVtZW50cyI6Ww==
ew==
IkRhdGFNb2RlbE5hbWUiOiJQU1ROVG90YWxNaW51dGVzIg==
fSw=
ew==
IkRhdGFNb2RlbE5hbWUiOiJUb3RhbENhbGxDb3VudCI=
fQ==
XSw=
IlBhcmFtZXRlcnMiOns=
IlVzZXJBZ2VudCI6IlBvd2VyIEJJIERlc2t0b3Ai
fSw=
IkxpbWl0UmVzdWx0Um93c0NvdW50IjoxMDAwMDA=
fQ==

URL-Encode la query JSON compressa

La query JSON compressa GZIP o Base64 deve essere codificata in URL.

L'output codificato dell'URL GZIP è simile al seguente:

H4sIAAAAAAAACq2SQWsCMRCF7%2F6KkLNC3EoPe9u6FISuFbW9lB4GM9TQbEaSCSLif%2B9mV4uCBwXnMkze5L0vkH1PCCFfjWX0QeZfaWxqf%2BxJLIGhIo12CjXKPM0o%2B2cLn2BjEjKVZQM1Gqjhhfy%2BQQ9Oy3x0PDz0H5HypK6nPJ9SUv9uV2RpanTBkLvxiUVkKpjRaXA80ejY8E7eg3%2FhUBqPKya%2FWyD41bpCXpP%2BtzvjrBBC9NjA8o2ks8VyuiQGWxkXGcNdkO3FMVg7puj4GtAMfLPa%2FY2Tk%2FwI6IufhjHl0xa9eJmIEsMv06Y16cLlm6kNzzFEy3Pahi4kH6pUvcMfrAhUU3oCAAA%3D

L'output codificato URL Base64 è simile al seguente:

%0Aew%3D%3D%0AIkZpbHRlcnMiOls%3D%0Aew%3D%3D%0AIkRhdGFNb2RlbE5hbWUiOiJEYXRlIiw%3D%0AIlZhbHVlIjoiMjAyMi0wNC0wMSIs%0AIk9wZXJhbmQiOjQ%3D%0AfSw%3D%0Aew%3D%3D%0AIkRhdGFNb2RlbE5hbWUiOiJEYXRlIiw%3D%0AIlZhbHVlIjoiMjAyMi0wNC0zMCIs%0AIk9wZXJhbmQiOjY%3D%0AfQ%3D%3D%0AXSw%3D%0AIkRpbWVuc2lvbnMiOls%3D%0Aew%3D%3D%0AIkRhdGFNb2RlbE5hbWUiOiJBdXRvQXR0ZW5kYW50SWRlbnRpdHki%0AfSw%3D%0Aew%3D%3D%0AIkRhdGFNb2RlbE5hbWUiOiJBdXRvQXR0ZW5kYW50RGlyZWN0b3J5U2VhcmNoTWV0aG9kIg%3D%3D%0AfQ%3D%3D%0AXSw%3D%0AIk1lYXN1cmVtZW50cyI6Ww%3D%3D%0Aew%3D%3D%0AIkRhdGFNb2RlbE5hbWUiOiJQU1ROVG90YWxNaW51dGVzIg%3D%3D%0AfSw%3D%0Aew%3D%3D%0AIkRhdGFNb2RlbE5hbWUiOiJUb3RhbENhbGxDb3VudCI%3D%0AfQ%3D%3D%0AXSw%3D%0AIlBhcmFtZXRlcnMiOns%3D%0AIlVzZXJBZ2VudCI6IlBvd2VyIEJJIERlc2t0b3Ai%0AfSw%3D%0AIkxpbWl0UmVzdWx0Um93c0NvdW50IjoxMDAwMDA%3D%0AfQ%3D%3D

L'URL della richiesta finale sarà simile al seguente:

https://api.interfaces.records.teams.microsoft.com/Teams.VoiceAnalytics/getanalytics?query=H4sIAAAAAAAACq2SQWsCMRCF7%2F6KkLNC3EoPe9u6FISuFbW9lB4GM9TQbEaSCSLif%2B9mV4uCBwXnMkze5L0vkH1PCCFfjWX0QeZfaWxqf%2BxJLIGhIo12CjXKPM0o%2B2cLn2BjEjKVZQM1Gqjhhfy%2BQQ9Oy3x0PDz0H5HypK6nPJ9SUv9uV2RpanTBkLvxiUVkKpjRaXA80ejY8E7eg3%2FhUBqPKya%2FWyD41bpCXpP%2BtzvjrBBC9NjA8o2ks8VyuiQGWxkXGcNdkO3FMVg7puj4GtAMfLPa%2FY2Tk%2FwI6IufhjHl0xa9eJmIEsMv06Y16cLlm6kNzzFEy3Pahi4kH6pUvcMfrAhUU3oCAAA%3D

Passaggio 3: lettura del risultato

Dopo aver inviato il tuo input, ci sono un paio di possibili risultati:

  • Se l'input non è valido, viene restituito un messaggio di errore con il motivo effettivo

  • Se l'input è valido, il risultato sarà simile al seguente:

    Screenshot che mostra il risultato della query con il campo dataResult.

    In questo caso, i dati si trovano nel campo "dataResult" nello stesso ordine richiesto negli attributi di dimensione e misure della query.

Dimensioni e misure disponibili

Sono disponibili le seguenti dimensioni e misure.

Dimensioni comuni

Queste dimensioni sono comuni sia agli operatori automatici che alle code di chiamata:

Nome (tipo) Valori possibili Supporto filtri Descrizione
ID conferenza
(Testo)
GUID S Identificatore chiamata
Data
(DateTime)
S Data della chiamata (UTC)
DialogId
(Testo)
GUID S Identificatore chiamata
ID documento
(Testo)
GUID S Identificatore chiamata
Durata
(Numero intero)
S Durata della chiamata, in secondi
Ora di fine
(DateTime)
S Tempo chiamata terminata (UTC)
FirstIsCaller
(Booleano)
S Primo e secondo endpoint di classificazione
FirstUPN
(Testo)
N Nome dell'entità utente (UPN) dell'utente del primo endpoint
FirstUserObjectId
(Testo)
GUID S ID oggetto del FirstUPN
Hour
(Testo)
S Chiamata di un'ora iniziata (UTC)
Minute
(Testo)
S Minuto di chiamata iniziata (UTC)
PSTNCallDuration
(Numero intero)
S Durata della chiamata
PSTNCallType
(Testo)
S
Esterno La chiamata proviene dall'esterno del tenant
Interno La chiamata proviene dall'interno del tenant
PSTNConnectivityType
(Testo)
S
Piano di chiamata La chiamata è arrivata con un numero del Piano per chiamate
DirectRouting La chiamata è arrivata su un numero di instradamento diretto
TeamsPhoneMobile La chiamata è arrivata su un numero di cellulare di Teams Phone
Chiamata ACS La chiamata è arrivata dal web (Click2Call su report)
Second
(Testo)
S Seconda chiamata iniziata (UTC)
SecondUPN
(Testo)
N Nome dell'entità utente (UPN) dell'utente del secondo endpoint
SecondUserObjectId
(Testo)
GUID S ID oggetto del secondUPN
Data e ora
(DateTime)
S È stata scritta la registrazione dell'ora (UTC)
UserStartTimeUTC
(DateTime)
S Chiamata a tempo iniziata (UTC)

Dimensioni dell'operatore automatico

Nome (tipo) Valori possibili Supporto filtri Descrizione
AutoAttendantCallFlow
(Testo)
S Incapsula i diversi stati della chiamata dell'operatore automatico
abs_search È stata eseguita una ricerca per nome
Annuncio È stato riprodotto un annuncio
automatic_menu Instradamento delle chiamate predefinito
call_termination La chiamata è stata terminata, vedere AutoAttendantCallResult
call_transfer La chiamata è stata trasferita, vedere AutoAttendantCallResult
first_level_menu Stato di transizione - può essere ignorato
main_menu Il messaggio di benvenuto è stato riprodotto
speech_input_confirmation Il chiamante ha usato l'input vocale
user_selection Il chiamante ha usato l'immissione di tasti a toni
AutoAttendantCallResult
(Testo)
S Risultato finale della chiamata
failed_to_establish_media Non è stato possibile stabilire la parte multimediale della chiamata
failover_to_operator Chiamata trasferita all'operatore in genere a causa di un errore di sistema
oaa_chain_too_long Troppe gambe nell'AA
oaa_session_too_long La sessione AA è durata troppo a lungo
service_declined AA non ha accettato la chiamata
service_terminated La configurazione AA disconnette la chiamata o la chiamata riagganciata
terminated_automatic_selection La configurazione AA disconnette le chiamate
terminated_no_operator Chiamata terminata a causa di un errore - nessun operatore definito
terminated_transfer_failed Chiamata terminata come trasferimento non riuscito, in genere a un numero esterno
transfer_in_progress Trasferimento AA-AA>
transferred_to_operator La chiamata è stata trasferita all'operatore
transferred_to_cq La chiamata è stata trasferita a Coda delle chiamate
transferred_to_receptionist Uguale a transferred_to_operator
transferred_to_self La chiamata è stata ripristinata all'inizio dell'AA
transferred_to_shared_voicemail La chiamata è stata trasferita alla segreteria telefonica condivisa
transferred_to_user La chiamata è stata trasferita a un utente
sconosciuto Si è verificata una condizione sconosciuta
user_terminated Il chiamante ha riattaccato
AutoAttendantCallerActionCounts
(Numero intero)
S Numero di azioni eseguite dal chiamante (tasto a toni o voci vocali)
AutoAttendantChainDurationInSecs
(Numero reale)
S Il numero di secondi per cui la chiamata è rimasta in questa parte del flusso di chiamata
AutoAttendantChainIndex
(Numero intero)
S
AutoAttendantChainStartTime
(DateTime)
S L'ora di inizio di questa parte del flusso di chiamata
AutoAttendantCount
(Numero intero)
S Numero di operatori automatici attraverso il quale è stata eseguita la transizione della chiamata
AutoAttendantDirectorySearchMethod
(Testo)
S Metodo di ricerca della directory
abs_search_dtmf Tono a toni
abs_search_voice Opzioni vocali
AutoAttendantId
(Testo)
S GUID operatore automatico
AutoAttendantIdentity
(Testo)
N URI dell'account di risorsa su cui è arrivata la chiamata
AutoAttendantTransferAction
(Testo)
S Tipo di destinazione Trasferimento di chiamata
AA Trasferito a un AA
CQ Trasferito a un CQ
external_pstn Trasferito a un numero esterno
Segreteria telefonica condivisa Trasferito alla segreteria telefonica condivisa
Sconosciuto Azione sconosciuta
HasAA
(Booleano)
S AA è coinvolto nella chiamata

Dimensioni coda di chiamata

Nome (tipo) Valori possibili Supporto filtri Descrizione
CallQueueAgentCount
(Numero intero)
S Numero di agenti nella coda delle chiamate
CallQueueAgentOptInCount
(Numero intero)
S Numero di agenti che hanno acconsentito esplicitamente a chiamare la coda
CallQueueCallResult
(Testo)
S Coda di chiamata, stato finale chiamata
agent_joined_conference Risposta a chiamata - modalità conferenza CQ
callback_call_timed_out Richiamata: timeout
rifiutato
Disconnesso
errore
fallito
non valido
sorvolato Condizione di overflow soddisfatta
timed_out Condizione di timeout soddisfatta
no_agent Nessuna condizione agente soddisfatta
transferred_to_agent Risposta alla chiamata - modalità di trasferimento CQ
transferred_to_callback_caller Richiamata a richiamata con risposta da parte dell'agente
CallQueueDurationSeconds
(Numero reale)
S Durata chiamata nella coda delle chiamate
CallQueueFinalStateAction
(Testo)
S Azione finale della coda di chiamata
disconnetti time_out chiamate
disconnect_with_busy Chiamate sorvolate
failed_to_accept_call La coda delle chiamate non è riuscita ad accettare la chiamata
Inoltra La chiamata è stata inoltrata a una persona dell'organizzazione o esternamente
shared_voicemail La chiamata è stata inviata alla segreteria telefonica condivisa
altro Si è verificata un'altra condizione
segreteria telefonica La chiamata è stata inviata alla segreteria telefonica personale
CallQueueId
(Testo)
S GUID coda di chiamata
CallQueueIdentity
(Testo)
N URI dell'account di risorsa su cui è arrivata la chiamata
CallQueueTargetType
(Testo)
S Destinazione reindirizzamento chiamata
ApplicationEndpoint Un'altra applicazione vocale
Cassetta postale Segreteria telefonica condivisa
Other Si è verificata un'altra condizione
Telefono Trasferimento esterno
Utente Utente nel tenant
HasCQ
(Booleano)
S CQ è coinvolto nella chiamata
TransferredFromCallQueueId
(Testo)
S La chiamata GUID della coda delle chiamate è stata trasferita da
TransferredFromCallQueueIdentity
(Testo)
N URI dell'account di risorsa da cui è stata trasferita la chiamata

Misure

Nome (tipo) Valori possibili Descrizione
AvgAutoAttendantChainDurationSeconds
(Numero reale)
La durata media delle chiamate all'interno di ogni parte del flusso di chiamata dell'operatore automatico
AvgCallDuration
(Numero reale)
Durata media di una chiamata in secondi
AvgCallQueueDurationSeconds
(Numero reale)
Durata media della coda delle chiamate in secondi
PSTNTotalMinutes
(Numero reale)
Durata totale delle chiamate in minuti
TotalAudioStreamDuration
(Numero reale)
Durata totale del flusso audio in minuti
TotalCallCount
(Numero intero)
Numero totale di chiamate

Esempio

Qualsiasi applicazione in grado di accedere ai servizi Web RESTful può utilizzare l'API VAAC per recuperare i dati cronologici. Nell'esempio seguente viene utilizzato Postman .

Preparazione

  1. Scarica e installa Postman.

  2. Scaricare ed espandere il filepostman.zip .

  3. Importare la cartella postman in Postman.

    Screenshot che mostra l'importazione completata.

Accesso a VAAC tramite Postman

  1. Selezionare VAAC - msit in alto a destra nell'elenco a discesa Nessun ambiente .

  2. Seleziona Ambienti nel menu della barra a sinistra.

  3. Selezionare VAAC - msit in Globali.

  4. Sostituire userName, password e tenantId con le credenziali applicabili.

  5. Seleziona Reimposta tutto nell'angolo in alto a destra.

  6. Selezionare Salva.

    Screenshot che mostra i campi nome utente, password e ID tenant configurati.

  7. Seleziona Raccolte nel menu della barra a sinistra.

  8. Selezionare Config API Access Token - prod e passare alla scheda Corpo .

  9. Seleziona Invia.

    Viene restituito un token di accesso.

    Screenshot che mostra il risultato con il token di accesso restituito.

    Se non viene restituito un token di accesso, controllare le credenziali per assicurarsi che dispongano delle autorizzazioni necessarie.

  10. Selezionare VAAC ConfigAPI Prod e passare alla scheda Params .

  11. Compilare la stringa di query .

  12. Seleziona Invia.