Como integrar o Power BI com a API do Blip

Fala Pessoal, tudo certo?

Vi recentemente que algumas pessoas tentaram fazer a conexão das APIs do Blip com o Power BI e não obtiveram sucesso, então decidi fazer o meu próprio código e compartilhar com vocês.

Como integrar o API do Blip no Power BI

Para fazer o código funcionar, é preciso respeitar três regras do Power BI e da API do Blip (ou qualquer API Paginada):

  • Na documentação da API do Blip não tem um tempo entre cada requisição, porém se você fizer muitas requisições por uma só ferramenta em um tempo muito curto você toma o famoso “Gateway Timeout”. Recomendo sempre colocar um time de 1seg ou mais entre cada requisição.
  • Recomendo usar DataFlows para gerenciar seu banco a nível de “Atualização” ou fazer algum “Backend” em um DataWarehouse para guardar as requisições passadas como Log. Isso é devido ao Power BI só permitir você fazer 800 requisições (pelo menos nunca consegui fazer mais do que isso).
  • Não faça uma requisição só que tenha muita informação.

Ex: API de contatos do Blip permite você retornar até 30k de contatos. Eu recomendo vocês fazerem em blocos de 500 - 1000 por vez e ir crescendo gradativamente esse número para adaptar a necessidade de vocês.

Para o código funcionar, eu divido ele em duas partes:

  1. Uma Função onde fica minha lógica da requisição;
  2. A consulta em si onde é feito as requisições. (Lembrando que o código estará em M query).

Função com a lógica de requisição


(skip as number)=>

let

url_comand = "/contacts?$skip="&Text.From(skip)&"&$take=100",

content= "{

""id"" : ""{{$guid}}"",

""to"": ""[email protected]"",

""method"" : ""get"",

""uri"" :"""& url_comand&"""}",

Source= Json.Document(

Web.Contents("https://drtigre.http.msging.net/commands",

[Headers = [#"Content-type" = "application/json",#"Authorization" ="SUA KEY"],

Content = Text.ToBinary(content),Timeout=#duration(0, 5, 0, 0)])),

resource = Source[resource],

items = resource[items],

pagina = if List.Count(items) < 1 then null else items

in

pagina

image

image1272×627 30.2 KB

Em vermelho circulado está a quantidade de contatos que serão retornados pela requisição. Testem a quantidade que se adapta melhor para a necessidade de vocês.

Tabela que importa os dados


let

Tickets = List.Generate(

()=> [p=0 , t= Function.InvokeAfter(()=> FnContatoRoteador(p),#duration(0,0,0,2))],

each [t] <> null,

each[p= [p] + 100 , t= Function.InvokeAfter(()=> FnContatoRoteador(p),#duration(0,0,0,2))],

each [t]

),

in

Tickets

image847×162 15.6 KB

Após montarem seus códigos, ficará aproximadamente assim:

image

Nessa segunda imagem em vermelho é usado o nome da função que você usou no primeiro bloco. Em azul é a quantidade inicial de contatos que a requisição vai pular no parâmetro “Skip” da API do Blip. Em cinza é o tempo entre cada requisição. No meu caso usei 2 segundos. E por último, em verde é a quantidade que cada requisição vai adicionando no parâmetro “Skip” da API.

Trabalhando o Power BI desta forma, eu consigo atualizar automaticamente todas as informações do meu Blip via DataFlow - mas só lembrem que existem limitações para esse tipo de requisição e tudo é questão de teste e ajustes dos parâmetros.

Esse código que está acima é um que eu uso hoje e me traz aproximadamente 100k de linhas de contatos do Blip requisitando em blocos de 100 contatos.

Qualquer dúvida, podem entrar em contato comigo que eu ficarei feliz em ajudar.

Meus contatos são esses:

Wesley Cairo

(21)98899-9684

[email protected]

https://www.linkedin.com/in/cairowesley/ 1

8 curtidas

Toooop demais !!!

1 curtida

Estou tentando porém a API está trazendo todos os tickets, eu gostaria apenas de trazer todos os tickets do dia. Saberia me ajudar ?

1 curtida

Gostaria de invocar o máximo do dia
let

Tickets = List.Generate(

()=> [p=0 , t= Function.InvokeAfter(()=> #“SAC”(p),#duration(0,0,0,2))],

each [t] <> null,

each[p= [p]+100 , t= Function.InvokeAfter(()=> #“SAC”(p),#duration(0,0,0,2))],

each [t]

1 curtida

Provavelmente tem uma forma de filtrar o período no EndPoint do Blip.

Seria só trocar/ajustar o Endpoint do Código com o filtro que você quer.

Caso esse Endpoint não exista, tem algumas formas de fazer :

Forma mais complicada (Porém mais eficiente ao longo prazo):
criar um banco de dados onde usaria as api’s de “Open Tickets” e colocaria uma requisição POST em algum lugar no meu bot para enviar os dados do ticket fechado para meu banco de dados.

Ai no banco teria todos os tickets abertos e fechados, quando um ticket que está aberto fosse fechado ele teria o status atualizado no banco e você poderia usar o PowerBi para importar a informação da forma que você quisesse.

Forma mais simples:
Você poderia manualmente criar uma requisição passando um numero específico de Tickets para trazer.

Por exemplo:

A média aqui da empresa é de 500 tickets novos todos os dias.

Eu modificaria a função para trazer uns 1500 tickets e iria fazer o filtro da data dentro do PowerBi.

Forma mais simples: 2 (Mais trabalhosa)

Você poderia pegar alguns dos endpoints disponíveis para trazer informações de tickets e fazer um append de bases.

Ou seja, você pegaria a Api que retorna todos os Tickets abertos e faria uma consulta com ela no BI.
Depois pegaria a Api com que traz os tickets com status “Waiting” e criaria uma consulta.
depois pegaria todos os tickets fechados e por ai vai.

No final você juntaria todas essas bases numa tabela só e ai você poderia trabalhar da forma que quisesse.

O que eu te recomendo: Usar a opção 1, ela da mais trabalho, mas é um trabalho que é feito uma vez só e depois nunca mais te dar dor de cabeça.

1 curtida

Entendi, um outro membro me passou o seguinte

"/tickets/history?$filter=storageDate%20ge%20datetimeoffset'2022-12-05T03%3A00%3A00.000Z'%20and%20storageDate%20le%20datetimeoffset'2023-01-06T02%3A59%3A00.000Z'%20and%20status%20ne%20'Open'%20and%20status%20ne%20'Waiting'&$skip=20&$take=100"

Isso funciona, porém o skip não está funcionando. Ele traz os ticket repetidos sabe

1 curtida