Skip to main content
Solved

Pipefy -> PowerBI Integration


tsartori
Forum|alt.badge.img+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?

Best answer by murilova

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"

 

View original
Did this topic help you find an answer to your question?

13 replies

gustavo-nicolau

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.


tsartori
Forum|alt.badge.img+4
  • Author
  • Superuser
  • 157 replies
  • June 29, 2021

Opa


tsartori
Forum|alt.badge.img+4
  • Author
  • Superuser
  • 157 replies
  • June 29, 2021
gustavo-nicolau wrote:

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


Lucas Democh
Forum|alt.badge.img+15
  • Pipefy Legend
  • 396 replies
  • July 2, 2021

@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


tsartori
Forum|alt.badge.img+4
  • Author
  • Superuser
  • 157 replies
  • July 7, 2021

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


tsartori
Forum|alt.badge.img+4
  • Author
  • Superuser
  • 157 replies
  • July 7, 2021
Lucas Democh wrote:

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


joaogalhardo
  • New Participant
  • 7 replies
  • July 23, 2021
tsartori wrote:
Lucas Democh wrote:

@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
 

 


tsartori
Forum|alt.badge.img+4
  • Author
  • Superuser
  • 157 replies
  • July 25, 2021

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 


Juliana Spinardi
Pipefy Staff
Forum|alt.badge.img+8

@tsartori conseguiu resolver? 

Como posso ajudar?


tsartori
Forum|alt.badge.img+4
  • Author
  • Superuser
  • 157 replies
  • July 26, 2021
Juliana Spinardi wrote:

@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


Juliana Spinardi
Pipefy Staff
Forum|alt.badge.img+8
tsartori wrote:
Juliana Spinardi wrote:

@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!!


cleanto-amorim
tsartori wrote:

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


murilova
  • New Member
  • 5 replies
  • Answer
  • February 16, 2022

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"

 


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings