Conteudo dinamico em blocos separados

Boa noite, tenho uma API que me retorna a seguinte estrutura de conteudos dinamicos:


Cada item desse json eu gostaria que fosse exibido em um bloco de mensagem diferente via telegram, a quantidade de itens pode variar.
Já consigo exibir conteudos especificos executando script e exibindo o resultado na mensagem, mas dessa forma não consigo retornar os dados como preciso.
Como faço para exibir esse conteudo de forma dinamica?
Se não for possivel retornar cada item em uma bloco diferente, como faço para retornar isso em uma unica mensagem de uma forma mais legivel?

1 Curtida

Bom dia, Wilian!

O conteúdo collection do Blip manda várias mensagens em um único conteúdo, isso te atenderia?

https://docs.blip.ai/#collection

1 Curtida

Seriam vários blocos de mensagem sobre um mesmo conteúdo até que ele acabe?
Acho que atende sim!
Pode me ajudar com um pequeno exemplo de como eu teria que fazer no builder?
Seria criar um desse?
image

1 Curtida

O tipo do contéudo dinâmico tem que ser application/vnd.lime.collection+json e o conteúdo um objeto em formato JSON contendo o tipo das mensagens e um array com cada uma dessas mensagens.

Você pode montar o JSON em um script e colocar a variável no conteúdo, eu só fiz hardcoded para ilustrar o exemplo. Ficaria mais ou menos assim:

image

2 Curtidas

Bom dia, @Wilian_Uhlmann!

Seu problema foi resolvido?

Infelizmente ainda não consegui.
Na verdade o que eu ainda não consegui entender/fazer muito bem é: Vou precisar executar um script dentro do bloco, para mostrar todos os itens em um único return do JS não sei a forma certa de fazer…
Se eu retorno alguma informação única dentro do conteúdo dinâmico funciona normal, no exemplo desse print funciona…
image
Mas dessa forma ele vai retornar apenas 1 conteúdo…

Bom dia @Wilian_Uhlmann!

Me corrija se eu estiver errado, mas a variável retorno itens não contém um array de objetos?

Estou retornando dessa forma no script js
image
No returnjson eu tenho a lista e nesse aqui pego apenas os itens.

Entendi.

Tenta o seguinte, desse script, você vai retornar um array contendo apenas as descrições que vêm de cada um desses objetos.
Depois, no conteúdo dinâmico, fica dessa forma:

{
  "itemType": "text/plain",
  "items": {{itens}}
}

Sendo que a variável itens é o retorno do script que eu mencionei acima.

Tentei dessa forma mas agora no js me retorna o seguinte erro:

order: 0

type: "SendRawMessage"

parsedSettings: {"metadata":{"#stateName":"Retorno-TratamentoJS","#stateId":"5bd750ff-b5e4-497f-b871-a089a35f404a","#messageId":"b2b43888-ff5e-46df-a13b-59339bb87d12","#previousStateId":"7e179e69-f2f2-4fd8-8eae-a5e006f7edd2","#previousStateName":"SolicitaInformacao"},"type":"application/vnd.lime.collection+json","rawContent":"{\n \"itemType\": \"text/plain\",\n \"items\": [\n \"[{\"dsc_produto_completo\":\"CATALISADOR EP 3026 (ERD 22) COMPONENTE B (WEG) - 720 ML\",\"cot_data\":\"2021-01-27 00:00:00\",\"id_req_numero\":\"338653\",\"ped_data_entrega\":\"2021-01-29 00:00:00\",\"req_aprovada\":\"True\",\"req_reprovada\":\"False\",\"req_data_aprov\":\"2021-01-26 11:02:58.047000\",\"req_analisada\":\"True\",\"cot_numero\":\"001856/21/001\"},{\"dsc_produto_completo\":\"CATALISADOR FENOX COMPONENTE B (WEG) - 900 ML\",\"cot_data\":\"2021-01-27 00:00:00\",\"id_req_numero\":\"338653\",\"ped_data_entrega\":\"2021-01-29 00:00:00\",\"req_aprovada\":\"True\",\"req_reprovada\":\"False\",\"req_data_aprov\":\"2021-01-26 11:03:00.163000\",\"req_analisada\":\"True\",\"cot_numero\":\"001856/21/001\"},{\"dsc_produto_completo\":\"TINTA LIQUIDA PU W-THANE ERA 531 R T - COR CINZA RALL 7032 - COMPONENTE A (WEG) - 2,7 L\",\"cot_data\":\"2021-01-27 00:00:00\",\"id_req_numero\":\"338653\",\"ped_data_entrega\":\"2021-01-29 00:00:00\",\"req_aprovada\":\"True\",\"req_reprovada\":\"False\",\"req_data_aprov\":\"2021-01-26 11:03:02.503000\",\"req_analisada\":\"True\",\"cot_numero\":\"001856/21/001\"},{\"dsc_produto_completo\":\"DILUENTE EPOXI 3005 (WEG) - 5 LTS\",\"cot_data\":\"2021-01-27 00:00:00\",\"id_req_numero\":\"338653\",\"ped_data_entrega\":\"2021-01-29 00:00:00\",\"req_aprovada\":\"True\",\"req_reprovada\":\"False\",\"req_data_aprov\":\"2021-01-26 11:03:04.917000\",\"req_analisada\":\"True\",\"cot_numero\":\"001856/21/001\"},{\"dsc_produto_completo\":\"EPOXY BRANCO FENOX (CAIXA D'AGUA INTERNO) COMPONENTE A (WEG) - 2,7 L\",\"cot_data\":\"2021-01-27 00:00:00\",\"id_req_numero\":\"338653\",\"ped_data_entrega\":\"2021-01-29 00:00:00\",\"req_aprovada\":\"True\",\"req_reprovada\":\"False\",\"req_data_aprov\":\"2021-01-26 11:03:09.547000\",\"req_analisada\":\"True\",\"cot_numero\":\"001856/21/001\"}]\"\n ]\n}"}

continueOnError: false

timestamp: "2021-04-20T18:55:12.069Z"

elapsedMilliseconds: 5

error: "Newtonsoft.Json.JsonReaderException: After parsing a value an unexpected character was encountered: d. Path 'items[0]', line 4, position 16.\n at Newtonsoft.Json.JsonTextReader.ParsePostValue(Boolean ignoreComments)\n at Newtonsoft.Json.JsonTextReader.Read()\n at Newtonsoft.Json.Linq.JContainer.ReadContentFrom(JsonReader r, JsonLoadSettings settings)\n at Newtonsoft.Json.Linq.JContainer.ReadTokenFrom(JsonReader reader, JsonLoadSettings options)\n at Newtonsoft.Json.Linq.JObject.Load(JsonReader reader, JsonLoadSettings settings)\n at Newtonsoft.Json.Linq.JObject.Parse(String json, JsonLoadSettings settings)\n at Lime.Protocol.Serialization.DocumentSerializer.Deserialize(String value, MediaType mediaType)\n at Take.Blip.Builder.Actions.SendRawMessage.SendRawMessageAction.ExecuteAsync(IContext context, SendRawMessageSettings settings, CancellationToken cancellationToken)\n at Take.Blip.Builder.Actions.ActionBase`1.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken)\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.MetricsActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/MetricsActionDecorator.cs:line 66\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.TracedActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/TracedActionDecorator.cs:line 33\n at Take.Blip.Builder.FlowManager.ProcessActionsAsync(LazyInput lazyInput, IContext context, Action[] actions, ICollection`1 actionTraces, CancellationToken cancellationToken)"

Agora esta retornando a lista toda, apenas da esse erro na hora de executar o conteúdo dinâmico.

image
image

image

A ideia não é usar o mesmo array que você já recebeu porque ele contém objetos e o conteúdo dinâmico espera um array de strings. A ideia é copiar apenas os campos dsc_produto_completo de cada item do array e criar um novo array apenas com eles.
Algo assim:

function run(retornoJson) {
    retornoJson = JSON.parse(retornoJson);

    const descricoesProdutos = [];

    for(let index in retornoJson) {
        descricoesProdutos.push(retornoJson[index].dsc_produto_completo);
    }

    return descricoesProdutos;
}

E o Json do conteúdo dinâmico fica assim:

{
  "itemType": "text/plain",
  "items": {{retornoitens}}
}

sem aspas e sem colchetes, a variável diretamente.

Se isso não funcionar você pode tentar retornar o conteúdo dinâmico todo do script:

function run(retornoJson) {
    retornoJson = JSON.parse(retornoJson);

    const descricoesProdutos = [];

    for(let index in retornoJson) {
        descricoesProdutos.push(retornoJson[index].dsc_produto_completo);
    }

    return {
        itemType: 'text/plain',
        items: descricoesProdutos
    };
}

Ainda segue com erro de JS:

order: 0

type: "ExecuteScript"

parsedSettings: {"function":"run","source":"function run(retornoJson) {\n retornoJson = JSON.parse(retornoJson);\n\n const descricoesProdutos = [];\n\n foreach(let index in retornoJson) {\n descricoesProdutos.push(retornoJson[index].dsc_produto_completo);\n }\n\n return {\n itemType: 'text/plain',\n items: descricoesProdutos\n };\n}","inputVariables":["retornojson"],"outputVariable":"retornoitens","LocalTimeZoneEnabled":false}

continueOnError: false

timestamp: "2021-04-20T20:11:16.737Z"

elapsedMilliseconds: 1

error: "Esprima.ParserException: Line 6: Unexpected token var\n at Esprima.JavaScriptParser.ThrowUnexpectedToken(Token token, String message)\n at Esprima.JavaScriptParser.ParsePrimaryExpression()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseLeftHandSideExpressionAllowCall()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseUpdateExpression()\n at Esprima.JavaScriptParser.ParseUnaryExpression()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseExponentiationExpression()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseBinaryExpression()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseConditionalExpression()\n at Esprima.JavaScriptParser.ParseAssignmentExpression()\n at Esprima.JavaScriptParser.IsolateCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseArguments()\n at Esprima.JavaScriptParser.ParseLeftHandSideExpressionAllowCall()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseUpdateExpression()\n at Esprima.JavaScriptParser.ParseUnaryExpression()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseExponentiationExpression()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseBinaryExpression()\n at Esprima.JavaScriptParser.InheritCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseConditionalExpression()\n at Esprima.JavaScriptParser.ParseAssignmentExpression()\n at Esprima.JavaScriptParser.IsolateCoverGrammar[T](Func`1 parseFunction)\n at Esprima.JavaScriptParser.ParseExpression()\n at Esprima.JavaScriptParser.ParseLabelledStatement()\n at Esprima.JavaScriptParser.ParseStatement()\n at Esprima.JavaScriptParser.ParseStatementListItem()\n at Esprima.JavaScriptParser.ParseFunctionSourceElements()\n at Esprima.JavaScriptParser.ParseFunctionDeclaration(Boolean identifierIsOptional)\n at Esprima.JavaScriptParser.ParseStatementListItem()\n at Esprima.JavaScriptParser.ParseScript(Boolean strict)\n at Jint.Engine.Execute(String source, ParserOptions parserOptions)\n at Jint.Engine.Execute(String source)\n at Take.Blip.Builder.Actions.ExecuteScript.ExecuteScriptAction.ExecuteAsync(IContext context, ExecuteScriptSettings settings, CancellationToken cancellationToken)\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.MetricsActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/MetricsActionDecorator.cs:line 66\n at Takenet.Iris.Application.TemplateHosting.Templates.Builder.TracedActionDecorator.ExecuteAsync(IContext context, JObject settings, CancellationToken cancellationToken) in /usr/app/src/Applications/Takenet.Iris.Application.TemplateHosting/Templates/Builder/TracedActionDecorator.cs:line 33\n at Take.Blip.Builder.FlowManager.ProcessActionsAsync(LazyInput lazyInput, IContext context, Action[] actions, ICollection`1 actionTraces, CancellationToken cancellationToken)"

Tentei com as duas formas, foi o mesmo erro.

Opa, erro meu @Wilian_Uhlmann. No lugar do foreach, tenta deixar só for.

Ainda não consegui, alterei a variável retornoJson para retornojson mas mesmo assim só retorna null, tentei das duas formas :frowning_face:


Acabei de perceber que o for in pega mais do que apenas os itens do array, então vamos precisar substituir por um for comum, dessa forma:

function run(retornoJson) {
    retornoJson = JSON.parse(retornoJson);
    
    const descricoesProdutos = [];

    for (let i = 0; i < retornoJson.length; i++) {
        descricoesProdutos.push(retornoJson[i].dsc_produto_completo);
    }

    return {
        itemType: 'text/plain',
        items: descricoesProdutos
    };
}

Mesmo assim, os scripts anteriores deveriam pegar pelo menos os itens do array. Pode conferir se o array que você está passando como parâmetro está com os dados corretos?

Ainda não retorna nada


Veja que o array com todos os dados retornojson está normal…

Ai retorno aqui
image

e aqui
image

:frowning_face:

Eu me enganei na estrutura do json que você recebia, na verdade o array está em retornoJson.itens, certo?

Tenta esse script:

function run(retornoJson) {
    retornoJson = JSON.parse(retornoJson);
    
    const descricoesProdutos = [];

    for (let i = 0; i < retornoJson.itens.length; i++) {
        descricoesProdutos.push(retornoJson.itens[i].dsc_produto_completo);
    }

    return {
        itemType: 'text/plain',
        items: descricoesProdutos
    };
}

Consegui, funcionou com esse primeiro que você tinha passado, agora com as devidas correções.

  function run(retornojson) {
        retornoJson = JSON.parse(retornojson);

        const descricoesProdutos = [];

        for (let i = 0; i < retornoJson.itens.length; i++) {
            descricoesProdutos.push(retornoJson.itens[i].dsc_produto_completo);
        }

        return descricoesProdutos;
    }

Porem no telegram ele buga, acredito que vou ter que fazer a pergunta em um novo bloco…
E também o bloco de mensagens ficou unico, pelo que vi na documentação agora, o Telegram não permite essa função, no teste do blip fica certinho
image


Sobre a ordem, das mensagens, você pode aumentar o tempo de digitando da pergunta, isso aumenta as chances dela chegar depois.

Sobre o Telegram usar uma única mensagem para o collection, acho que o jeito mais garantido seria enviar mensagens por API, não tem como criar um loop no builder de forma simples. Uma possibilidade é se aproveitar da arquitetura de roteadores e usar os redirecionamentos entre bots para criar um loop. Mas minha recomendação é enviar as mensagens por API.

2 Curtidas

Deu certo aumentar o tempo digitando, ótima sugestão.
Obg pelo paciência e suporte.

1 Curtida