Solved

Pipefy -> PowerBI Integration


Userlevel 7
Badge +4

English

 

Hello, 

I am trying to connect Pipefy and PBI, with the power Query and a GraphQL API, but i cant find the right URL to put in. It keep me returning the error 400 or 404.

May someone help me?

 

Português

 

Olá,

Estou tentando conectar o Pipefy e o PowerBI através do Power Query e uma API de GraphQL, porém as URLs sempre dão erro 404 ou 400.

Alguém sabe me ajudar?

icon

Best answer by murilova 16 February 2022, 14:15

View original

13 replies

Userlevel 2

Olá, tudo bem?

 

Bom, uma API GRAPHQL não existe PUT, existe apenas POST passando uma mutation para fazer a atualização. 

 

A url correta para as requisições seria: https://app.pipefy.com/graphiql, e dentro dai mesmo você pode ver a documentação de cada ação que você pode fazer. Segue o link da documentação oficial também https://developers.pipefy.com/

Segue um link abaixo com um pouco mais de informações sobre GRAPHQL

https://www.apollographql.com/blog/graphql/basics/mutation-vs-query-when-to-use-graphql-mutation/#:~:text=About%20GraphQL%20mutations&text=While%20we%20use%20queries%20to,PUT%20%2C%20PATCH%20%2C%20etc).

 

Espero que eu tenha te ajudado :)

 

Abraços.

Userlevel 7
Badge +4

Opa

Userlevel 7
Badge +4

Olá, tudo bem?

 

Bom, uma API GRAPHQL não existe PUT, existe apenas POST passando uma mutation para fazer a atualização. 

 

A url correta para as requisições seria: https://app.pipefy.com/graphiql, e dentro dai mesmo você pode ver a documentação de cada ação que você pode fazer. Segue o link da documentação oficial também https://developers.pipefy.com/

Segue um link abaixo com um pouco mais de informações sobre GRAPHQL

https://www.apollographql.com/blog/graphql/basics/mutation-vs-query-when-to-use-graphql-mutation/#:~:text=About%20GraphQL%20mutations&text=While%20we%20use%20queries%20to,PUT%20%2C%20PATCH%20%2C%20etc).

 

Espero que eu tenha te ajudado :)

 

Abraços.

Oi Gustavo, 

Valeu pela resposta,

Usando esta URL no PowerQuery do PowerBI, eu obtenho o seguinte retorno 

DataSource.Error: Falha no Web.Contents ao obter conteúdo de 'https://app.pipefy.com/graphiql' (400): Bad Request
Detalhes:
    DataSourceKind=Web
    DataSourcePath=https://app.pipefy.com/graphiql
    Url=https://app.pipefy.com/graphiql

 

Aparentemente a requisição de não funciona da maneira correta.

Estou usando o código abaixo na linguagem M para fazer a requisição, eu acho muito estranho que quando eu testo a Query na IDE, eu tenho o retorno que eu quero.

Segue o código abaixo caso saiba ajudar.

let
    vUrl = "https://app.pipefy.com/graphiql",
    vHeaders =[
            #"Method"="POST",
            #"Content-Type"="application/json",
            #"Authorization"="Bearer ********* "
        ],
        vContent=Text.ToBinary("{""query"": ""
        
      {
    pipe(id: ****) 
      {
      id
      name
      phases {
        id
        name
        cards {
          edges {
            node {
              id
              title
                  }
                }
              }
              }
        }
      }
  ""}"),  


Source = Web.Contents(vUrl,    [Headers=vHeaders, Content=vContent]),
    #"JSON" = Json.Document(Source)
in
    #"JSON"

 

Obrigado pela atenção e tempo

Userlevel 7
Badge +15

@tsartori você já tentou usar o módulo de integração?

 

É bem simples de usar. Segue link de artigo relacionado para que você possa baixa o módulo/conector:

 

 

A resposta do Felipe tem as orientações para as duas formas de conexão.

 

At.te.

 

Democh

Userlevel 7
Badge +4

@Lucas Democh 

Opa tudo bem?

Valeu pela resposta, já tentei usar o módulo sim, mas como a fonte de dados não é autenticada a atualização automática fica desabilitada, tirando o fato que o código do integrador nao permite incremento, ou seja, ele baixa toda DB todas as vezes, resultado em atualizações muito demoradas. Mas obrigado mesmo assim, acabei codando os requests de graphql em python e exportando.

Userlevel 7
Badge +4

@tsartori você já tentou usar o módulo de integração?

 

É bem simples de usar. Segue link de artigo relacionado para que você possa baixa o módulo/conector:

 

 

A resposta do Felipe tem as orientações para as duas formas de conexão.

 

At.te.

 

Democh

Opa tudo bem?

Valeu pela resposta, já tentei usar o módulo sim, mas como a fonte de dados não é autenticada a atualização automática fica desabilitada, tirando o fato que o código do integrador nao permite incremento, ou seja, ele baixa toda DB todas as vezes, resultado em atualizações muito demoradas. Mas obrigado mesmo assim, acabei codando os requests de graphql em python e exportando.

Userlevel 4

@tsartori você já tentou usar o módulo de integração?

 

É bem simples de usar. Segue link de artigo relacionado para que você possa baixa o módulo/conector:

 

 

A resposta do Felipe tem as orientações para as duas formas de conexão.

 

At.te.

 

Democh

Opa tudo bem?

Valeu pela resposta, já tentei usar o módulo sim, mas como a fonte de dados não é autenticada a atualização automática fica desabilitada, tirando o fato que o código do integrador nao permite incremento, ou seja, ele baixa toda DB todas as vezes, resultado em atualizações muito demoradas. Mas obrigado mesmo assim, acabei codando os requests de graphql em python e exportando.

Poderia compartilhar o código conosco ? 😁😁

Tentei baixar o conector mas está bloqueado no drive
 

 

Userlevel 7
Badge +4

Claro @joaogalhardo 


import requests

import json

 

#Onde o scrip fará o request

url = "https://api.pipefy.com/graphql"

#Os parametros de autorização

headers = {

    "Accept": "application/json",

    "Authorization": "Bearer  SEU TOKEN DE AUTORIZAÇÃO AQUI",

    "Content-Type": "application/json"

}


#Qual query voce quer ter o retorno

suaquery= {"query": """{

INSIRA AQUI SUA QUERY

}"""}

def solicitar(query):

    response = requests.request("POST", url, json=query, headers=headers)

    dados = json.loads(response.text)

    if response == ‘200’:

       print(“Request bem sucedido”)

        else:

              print(‘falha’)

    return(dados)

resultado = solicitar(suaquery)

print(resultado)

 

Podes montar a query da maneira que quiser no link (https://api.pipefy.com/graphql)

Qualquer duvida estou a disposição 

Userlevel 7
Badge +8

@tsartori conseguiu resolver? 

Como posso ajudar?

Userlevel 7
Badge +4

@tsartori conseguiu resolver? 

Como posso ajudar?

Opa, consegui simm.

Dei um jeito codando, poderia me ajudar tendo a integração oficial do powerBI pro pipefy hahahahaha

Mas muito obrigado pela atenção

Userlevel 7
Badge +8

@tsartori conseguiu resolver? 

Como posso ajudar?

Opa, consegui simm.

Dei um jeito codando, poderia me ajudar tendo a integração oficial do powerBI pro pipefy hahahahaha

Mas muito obrigado pela atenção

Imagina, Tobias. O que precisar, avise!!

Userlevel 2

Opa

Oi, @tsartori, acho que descobri os problemas.

  1. A URL tem que ser https://app.pipefy.com/graphql, na maioria da documentação você encontra https://app.pipefy.com/graphiql, com "i”, mas dá erro.
  2. A sua query não pode conter nenhum tipo de string dentro dela, exemplo: after: String (after:"Wq”). Isso gera um problema gigante quando você precisa fazer paginação no Power BI e ainda não conseguir resolver isso.
  3. Toda a sua query precisa estar na mesma linha, sem Enter e sem Tab. Usando o seu exemplo a query ficaria assim. Exemplo: query = "{""query"" : ""{ pipe(id:****) { id name phases { id name cards { edges { node { id title }}}}}}""}"

 

 

 

let
    query = "{""query"" : ""{ pipe(id:****) { id name phases { id name cards { edges { node { id title }}}}}}""}",
    authURL = “https://app.pipefy.com/graphql”,
    getToken = Web.Contents(
        authURL,
        [
            Headers=[
                    #"Method" = "POST",
                    #"Accept" = "application/json",
                    #"Authorization" = token,
                    #"Content-Type" = "application/json; charset=utf-8"
                    ],
            Content=Text.ToBinary(query)
        ]
    ),
    pipefyResponse = Json.Document(getToken)
in
    pipefyResponse

Userlevel 3

Bom dia a todos,

Nosso colaborador Pedro Kronberg aqui da Market4u.com.br conseguiu escrever um script para importar os cards. Basta fazer uma Consulta Nula no Power Query e depois colar o codigo abaixo no editor avançado. As duas primeiras linhas são onde deve informar sua chave da API e o pipe a puxar.

 

Parte feita foi usando o codigo do @cleanto-amorim 

let
TOKENAUTH = "Bearer xxxxxxxx", // Inserir sua Chave da API
PipeAnalisado = "xxxxxxxxxx", // Usar os numeros que seguem depois da URL: https://app.pipefy.com/pipes/______

GeradorDeCards =
(TOKENAUTH as text, PRIMEIROCARD as text) =>
let
query = "{""query"" : ""{ cards(pipe_id: "&PipeAnalisado&" "& PRIMEIROCARD &") { pageInfo { startCursor endCursor hasNextPage hasPreviousPage } edges { node { id title creatorEmail created_at finished_at updated_at due_date comments { text created_at } assignees { id name } labels { id name } created_by { id name } parent_relations { cards { id }} current_phase { id name } phases_history { phase { id name sequentialId } firstTimeIn lastTimeIn lastTimeOut duration } pipe { id name } fields { name report_value updated_at } } } } }""}",
authURL = "https://app.pipefy.com/graphql",
getToken = Web.Contents(
authURL,
[
Headers=[
#"Method" = "POST",
#"Accept" = "application/json",
#"Authorization" =TOKENAUTH ,
#"Content-Type" = "application/json; charset=utf-8"
],
Content=Text.ToBinary(query)
]
),
pipefyResponse = Json.Document(getToken),
data = pipefyResponse[data],
cards = data[cards],
edges = cards[edges]
in
edges,

GeradorDePaginas =
(TOKENAUTH as text, PrimeiroCard as text) => let
query = "{""query"" : ""{ cards(pipe_id: "&PipeAnalisado&" "& PrimeiroCard &") { pageInfo { startCursor endCursor hasNextPage hasPreviousPage } edges { node { id title creatorEmail created_at finished_at updated_at due_date comments { text created_at } assignees { id name } labels { id name } created_by { id name } current_phase { id name } phases_history { phase { id name sequentialId } firstTimeIn lastTimeIn lastTimeOut duration } pipe { id name } fields { indexName report_value name updated_at } } } } }""}",
authURL = "https://app.pipefy.com/graphql",
getToken = Json.Document(Web.Contents(authURL, [Headers=[Method="POST", Accept="application/json", Authorization=TOKENAUTH, #"Content-Type"="application/json; charset=utf-8"], Content=Text.ToBinary(query)])),
data = getToken[data],
cards = data[cards],
#"Convertido para Tabela" = Record.ToTable(cards),
Value = #"Convertido para Tabela"{0}[Value],
#"Convertido para Tabela1" = Record.ToTable(Value),
Nextpage = #"Convertido para Tabela1"{2}[Value],
STARTFROM = #"Convertido para Tabela1"{1}[Value],
res = [maispagina = Nextpage, cursorstart = STARTFROM]
in
res,

Fonte = List.Generate(
() =>
[Consulta = GeradorDePaginas(TOKENAUTH, ""), PG = 1, newstart = "", TOKENAUTH = TOKENAUTH],
each [newstart] <> null,
each [PG = [PG]+1, newstart = ("after: \#(0022)"& [Consulta][cursorstart] &"\#(0022)"), Consulta = GeradorDePaginas(TOKENAUTH, newstart), TOKENAUTH = [TOKENAUTH] ],
each [[TOKENAUTH], [PG], [newstart]]
),
#"Convertido para Tabela" = Table.FromList(Fonte, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Column1 Expandido" = Table.ExpandRecordColumn(#"Convertido para Tabela", "Column1", {"TOKENAUTH", "PG", "newstart"}, {"Column1.TOKENAUTH", "Column1.PG", "Column1.newstart"}),
#"Função Personalizada Invocada" = Table.AddColumn(#"Column1 Expandido", "GeradorDeCards", each GeradorDeCards([Column1.TOKENAUTH], [Column1.newstart])),
#"GeradorDeCards Expandido" = Table.ExpandListColumn(#"Função Personalizada Invocada", "GeradorDeCards"),
#"GeradorDeCards Expandido1" = Table.ExpandRecordColumn(#"GeradorDeCards Expandido", "GeradorDeCards", {"node"}, {"GeradorDeCards.node"}),
#"GeradorDeCards.node Expandido" = Table.ExpandRecordColumn(#"GeradorDeCards Expandido1", "GeradorDeCards.node", {"id", "title", "creatorEmail", "created_at", "finished_at", "updated_at", "due_date", "comments", "assignees", "labels", "created_by", "current_phase", "phases_history", "pipe", "fields"}, {"GeradorDeCards.node.id", "GeradorDeCards.node.title", "GeradorDeCards.node.creatorEmail", "GeradorDeCards.node.created_at", "GeradorDeCards.node.finished_at", "GeradorDeCards.node.updated_at", "GeradorDeCards.node.due_date", "GeradorDeCards.node.comments", "GeradorDeCards.node.assignees", "GeradorDeCards.node.labels", "GeradorDeCards.node.created_by", "GeradorDeCards.node.current_phase", "GeradorDeCards.node.phases_history", "GeradorDeCards.node.pipe", "GeradorDeCards.node.fields"}),
#"Linhas Filtradas" = Table.SelectRows(#"GeradorDeCards.node Expandido", each ([GeradorDeCards.node.id] <> null)),
#"Colunas Removidas" = Table.RemoveColumns(#"Linhas Filtradas",{"Column1.TOKENAUTH", "Column1.PG", "Column1.newstart"})
in
#"Colunas Removidas"

 

Reply