Solução para Integração de Api do Take no PowerBi

Fala Pessoal, tudo certo?

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

Para fazer o código funcionar, é preciso respeitar três regras do PowerBi e da API do Take (Ou qualquer API Paginada):

  • Api do TakeBlip não tem na documentação um tempo entre cada requisição, porém se você fizer muitas requisições por uma só ferramenta dentro de 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 PowerBi 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 Take 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 logica 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

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

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 Take.

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 PowerBi dessa forma, eu consigo atualizar automaticamente todas as informações do meu TakeBlip 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 Takeblip requisitando em blocos de 100 contatos.

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

Meu contatos são esses:

Wesley Cairo
(21)98899-9684
[email protected]
https://www.linkedin.com/in/cairowesley/

3 curtidas