Executando verificação de segurança...
4

Conectando o GLPI ao PowerBI via RESTAPI

Dois sistemas que todo mundo ligado a TI é obrigado a conviver

Motivação

Tentando conectá-los descobri que não havia nenhum guia prático para isso, então aí vai.

Em primeiro é preciso habilitar a opção no GLPI
https://www.arthurschaefer.com.br/2021/12/ativar-api-do-glpi/

Então no Power BI criei os parametros abaixo:
queries.png
como Exemplo de endereço "https://localhost.glpi.com/apirest.php/"
o AppToken é disponibilizado no GLLPI
para o UserToken é possível gerar hash code usando a seguinte query: (o ideal é gerar e excluir esta query assim preservando usuário e senha)

let
  Source = Binary.ToText(Text.ToBinary("seu usuário" & ":" & "sua senha"), BinaryEncoding.Base64)
in
  Source

Na base que usei havia mais de 20.000 tickets por isso foi necessário paginar a extração

Query de tickets

let
    InitSession = Json.Document(
        Web.Contents(
            baseURL,
            [
                RelativePath = "initSession?get_full_session=true",
                Headers = [
                    #"Content-Type" = "application/json",
                    #"App-Token" = AppToken,
                    Authorization = "Basic " & UserToken
                ]
            ]
        )
    ),
    headersQuery = [
        #"Content-Type" = "application/json",
        #"Session-Token" = InitSession[session_token],
        #"App-Token" = AppToken
    ],
    ChangeProfile = Json.Document(
        Web.Contents(baseURL, [
            RelativePath = "changeActiveProfile?profiles_id=43",
            Headers = headersQuery
        ])
    ),
    Total = Json.Document(Web.Contents(baseURL, [
        RelativePath = "search/Ticket",
        Headers = headersQuery
    ])),
    perPage = 1000,
    totalPages = Number.RoundUp(Total[totalcount] / perPage),
    pages = List.Generate(
        () => [page = 1],
        each [page] <= totalPages,
        each [page = [page] + 1],
        each Text.From(perPage * ([page] - 1)) & "-" & Text.From(perPage * [page] - 1)
    ),
    EmptyTab = #table({"Column1"}, {}),
    Data = List.Accumulate(
        pages,
        EmptyTab,
        (table, url) =>
            let
                Source =
                    try
                        let
                            ListofTickets =
                                try
                                    Json.Document(
                                        Web.Contents(
                                            baseURL,
                                            [
                                                RelativePath = "Ticket?expand_dropdowns=true",
                                                Headers = headersQuery,
                                                Query = [range = url]
                                            ]
                                        )
                                    ) otherwise EmptyTab,
                            #"Converted to Table" = Table.FromList(
                                ListofTickets, Splitter.SplitByNothing(), null, null, ExtraValues.Error
                            )
                        in
                            #"Converted to Table"
                        otherwise EmptyTab,
                combinedTable = Table.Combine({table, Source})
            in
                combinedTable
    )
in
    Data

Apenas substituindo todas as ocorrencias "ticket" por change, device, software... temos uma nova tabela.
Espero ter ajudado alguém!!