Skip to main content

essa função executa normalmente no vscode mas no blip nao funciona

 

function run(token) {
var base64Url = token.split('.').1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(
atob(base64)
.split('')
.map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
})
.join('')
);
const payload = JSON.parse(jsonPayload);
const currentTime = Math.floor(Date.now() / 1000);
return payload.exp < currentTime;
}

Erro : 

{
"id": "fb749eeb-e9bb-4f33-8c2f-41902034c72a",
"inputActions": s
{
"order": 0,
"type": "TrackContactsJourney",
"parsedSettings": {
"previousStateId": "a97ddd64-3c9b-4279-bd6a-3913e982c9b0",
"previousStateName": "Reset Contact Variables",
"stateId": "fb749eeb-e9bb-4f33-8c2f-41902034c72a",
"stateName": "Token is Expired ?"
},
"continueOrError": false,
"timestamp": "2024-10-22T19:11:47.0111026+00:00",
"elapsedMilliseconds": 3,
"warning": null,
"error": null
},
{
"order": 0,
"type": "SetVariable",
"parsedSettings": {
"variable": "flowOrigin",
"value": "fb749eeb-e9bb-4f33-8c2f-41902034c72a"
},
"continueOrError": false,
"timestamp": "2024-10-22T19:11:47.0150077+00:00",
"elapsedMilliseconds": 4,
"warning": null,
"error": null
},
{
"order": 0,
"type": "SetVariable",
"parsedSettings": {
"variable": "flowOriginName",
"value": "Token is Expired ?"
},
"continueOrError": false,
"timestamp": "2024-10-22T19:11:47.0193499+00:00",
"elapsedMilliseconds": 5,
"warning": null,
"error": null
},
{
"order": 0,
"type": "ExecuteScript",
"parsedSettings": {
"function": "run",
"source": "function run(token) {\n\tvar base64Url = token.split('.')'1];\n\tvar base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n\tvar jsonPayload = decodeURIComponent(\n\t\tatob(base64)\n\t\t\t.split('')\n\t\t\t.map(function (c) {\n\t\t\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t\t\t})\n\t\t\t.join('')\n\t);\n\tconst payload = JSON.parse(jsonPayload);\n\tconst currentTime = Math.floor(Date.now() / 1000);\n\treturn payload.exp < currentTime;\n}",
"inputVariables": s
"contact.extras.userToken"
],
"outputVariable": "tokenIsExpired",
"LocalTimeZoneEnabled": false
},
"continueOrError": false,
"timestamp": "2024-10-22T19:11:47.0250183+00:00",
"elapsedMilliseconds": 26,
"warning": null,
"error": "Internal Server Error"
}
],
"outputActions": s],
"outputs": s],
"extensionData": {
"name": "Token is Expired ?"
},
"timestamp": "2024-10-22T19:11:47.0070862+00:00",
"elapsedMilliseconds": 44,
"warning": null,
"error": "Internal Server Error"
}

token : 

Bearer eyJraWQiOiJLckl0VVNxVmhnUWFZcFcwS3pJWnlkRGtoU0tRM1wveVV5bFNrWEw5N2tQUT0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIyYXZuZWI2dW4ybWNobm45NWRnYTU5NmMzYSIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiY3JlZGl0XC9hZG1pbiIsImF1dGhfdGltZSI6MTcyOTYwNDU0OCwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tXC91cy1lYXN0LTJfYjEwSExadEtUIiwiZXhwIjoxNzI5NjA4MTQ4LCJpYXQiOjE3Mjk2MDQ1NDgsInZlcnNpb24iOjIsImp0aSI6IjNmM2ZjNzgxLTNhMTUtNDJiZi04NzU2LWQ1Y2U3OWQzNWM1NiIsImNsaWVudF9pZCI6IjJhdm5lYjZ1bjJtY2hubjk1ZGdhNTk2YzNhIn0.CZ82R05X0jc1RsUqMsH0NsDMTpD7MBo1MpO4gMFzomDZDfDqWtTD7G7KAv_xqmypK3jrcBwl7SXK6qnFaXm70xtfOsz7QM1NQDshmqpplIdnnihg3qJgJU-aLC75pu8NIQSCbwZ_ZdXMDEQUtNt602EaDlA3D1N3DpmDzwgFEVvTBl1GtDFPg7xZwBhPtn43GIyz-dx57a0TOMAqBbivY-fGalriVm2e22xugvy8plhTqT_aZ4Fn4JZ1WuB0YgrvBCI40PHnCE1p9O5waY-MiGclkmGKvg9giWsfHyEaoLzUOvChaWwqb-JYC7OwOkHIp6RzybccD_O0q4pUDq6A9Q

Opa @Bruno Ferreira,
 

Espero que você já tenha conseguido resolver o problema, mas caso ainda precise de uma mão, segue o que observei e testei:
 

O erro que você está enfrentando acontece porque o Blip só suporta ECMAScript 5.1, e algumas funções como o atob() podem não funcionar direito aqui. Então como o builder funciona apenas com ECMAScript 5.1, precisei ajustar algumas partes do código pra ficar compatível

 

Aqui estão os principais pontos que alterei pra resolver isso:

  • Substituí a função atob() por uma alternativa que decodifica a string base64 manualmente, compatível com ECMAScript 5.1.
  • Fiz uns ajustes no retorno da função pra diferenciar quando o false estava sendo retornado pela lógica do token (expirado ou não) ou se era erro no código. Agora dá pra ver se o token expirou e também os tempos de expiração e o tempo atual, pra garantir que os horários estão corretos. Com isso, você também pode pegar o objeto de retorno e usar em outras partes do fluxo.
  • O retorno foi trocado pra ser um objeto, ao invés de uma string. Isso facilita muito na hora de analisar os valores dos tempos e o status de validade do token.

 

 Código abaixo:

function b64DecodeUnicode(str) {
// Função para decodificar base64 sem o uso de atob
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var output = '';
var buffer;
var i = 0;

str = str.replace(/=+$/, '');

while (i < str.length) {
buffer = (chars.indexOf(str.charAt(i++)) << 18) |
(chars.indexOf(str.charAt(i++)) << 12) |
(chars.indexOf(str.charAt(i++)) << 6) |
chars.indexOf(str.charAt(i++));

output += String.fromCharCode((buffer >> 16) & 0xff) +
((buffer >> 8) & 0xff ? String.fromCharCode((buffer >> 8) & 0xff) : '') +
(buffer & 0xff ? String.fromCharCode(buffer & 0xff) : '');
}

return decodeURIComponent(escape(output));
}

function formatDate(timestamp) {
var date = new Date(timestamp * 1000);
return date.toLocaleString("pt-BR", { timeZone: "UTC" });
}

function run(token) {
try {
var base64Url = token.split('.')/1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');

while (base64.length % 4 !== 0) {
base64 += '=';
}

var jsonPayload = b64DecodeUnicode(base64);
var payload = JSON.parse(jsonPayload);

var currentTime = Math.floor(Date.now() / 1000);
var expirationTime = payload.exp;

var formattedCurrentTime = formatDate(currentTime);
var formattedExpirationTime = formatDate(expirationTime);

// Verifica se o token está expirado ou não e retorna o status e os tempos como um objeto
return {
status: expirationTime < currentTime ? "inválido" : "válido", // Status de validade
tempos: {
expiração: formattedExpirationTime, // Tempo de expiração
atual: formattedCurrentTime // Tempo atual
}
};
} catch (e) {
console.log("Erro ao processar o token: ", e);
// Retorna erro caso falhe
return { status: "error", mensagem: "Erro ao processar o token." };
}
}

 

 

Ajustes realizados:

  • A parte de retorno agora usa um objeto, que traz o status do token ("válido" ou "inválido") e os tempos de expiração e tempo atual formatados. Isso facilita pra ver o que está acontecendo com o token.
  • Também coloquei um tratamento de erro, que retorna um objeto com o status "error" e uma mensagem explicando o que deu errado, caso o processamento falhe.

 

Segue um print do teste que fiz:

 




Caso queira simplificar, você pode remover a formatação dos tempos no script e no retorno, mas mantenha a função b64DecodeUnicode.

 

 

Dá uma olhada nisso e vê se isso te ajuda!


até mudei a abordagem mais sem sucesso 

 

function run(token) {
const tokenParts = token.split('.');
const payloadOne = atob(tokenPartsr1]);
const payload = JSON.parse(payloadOne);
const currentTime = Math.floor(Date.now() / 1000);
return currentTime >= payload.exp;
}

 


até mudei a abordagem mais sem sucesso 

 

function run(token) {
const tokenParts = token.split('.');
const payloadOne = atob(tokenPartsr1]);
const payload = JSON.parse(payloadOne);
const currentTime = Math.floor(Date.now() / 1000);
return currentTime >= payload.exp;
}

 

Bruno, tenta com o script que eu lhe enviei, o atob não funciona aqui no Blip


até mudei a abordagem mais sem sucesso 

 

function run(token) {
const tokenParts = token.split('.');
const payloadOne = atob(tokenPartsr1]);
const payload = JSON.parse(payloadOne);
const currentTime = Math.floor(Date.now() / 1000);
return currentTime >= payload.exp;
}

 

Conseguiu resolver?


Bom dia @Luigi Ferronatto eu testei seu script e funcionou legal, porem eu resolvi o problema com uma abordagem mais abrangente que na verdade ao invez de resolver só esse problema resolveu vários, eu ao invés de só testar o token toda vez que faço uma chamada de api pra ver se ele expirou eu executo agora a api e pego o status se retornou 401 eu mando pro meu exceptions que trata ele gera uma nova token e manda pra api rodar novamente, assim eu consegui tratar os erros de outros status como 404, 400, 500 etc. Obrigado pela ajuda seu script nao foi em vão eu guardei ele aqui na minha biblioteca e vou usar ele posteriormente m uma outra implementação que estou fazendo, e muito obrigado pelas explicações me ajudou a entender mais o que posso e nao posso usar no blip . 


@Luigi Ferronatto funcionou sim vlw


Bom dia @Luigi Ferronatto, aproveitando queria tirar outra duvida com vc, eu queria usar essa funcao dentro de um resource e chamar ela toda vez que eu precisar, eu joguei em um resource, chamo ela assim 

 

function run( fnc, token ){

eval(fnc);

return IsValidToken(token); 

 

mas fica retornando internal server error mas vi aqui que passa certinho a funcao e o token.

A funcao esta armazenada assim no recurso : 

function b64DecodeUnicode(str) { \tlet chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; \tlet output = ''; \tlet buffer; \tlet i = 0; \tstr = str.replace(/=+$/, ''); \twhile (i < str.length) { \t\tbuffer = (chars.indexOf(str.charAt(i++)) << 18) | \t\t\t(chars.indexOf(str.charAt(i++)) << 12) | \t\t\t(chars.indexOf(str.charAt(i++)) << 6) | \t\t\tchars.indexOf(str.charAt(i++)); \t\toutput += String.fromCharCode((buffer >> 16) & 0xff) + \t\t\t((buffer >> 8) & 0xff ? String.fromCharCode((buffer >> 8) & 0xff) : '') + \t\t\t(buffer & 0xff ? String.fromCharCode(buffer & 0xff) : ''); \t} \treturn decodeURIComponent(escape(output)); } function IsValidToken(token) { \tlet status = 'error'; \ttry { \t\tlet base64Url = token.split('.')i1]; \t\tlet base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); \t\twhile (base64.length % 4 !== 0) { \t\t\tbase64 += '='; \t\t} \t\tlet jsonPayload = b64DecodeUnicode(base64); \t\tlet payload = JSON.parse(jsonPayload); \t\tlet currentTime = Math.floor(Date.now() / 1000); \t\tlet expirationTime = payload.exp; \t\treturn status = expirationTime < currentTime ? 'inválido' : 'válido' \t} catch (e) { \t\treturn status; \t} }

Token : 
Bearer eyJraWQiOiJLckl0VVNxVmhnUWFZcFcwS3pJWnlkRGtoU0tRM1wveVV5bFNrWEw5N2tQUT0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIyYXZuZWI2dW4ybWNobm45NWRnYTU5NmMzYSIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiY3JlZGl0XC9hZG1pbiIsImF1dGhfdGltZSI6MTcyOTg2NTU3NiwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tXC91cy1lYXN0LTJfYjEwSExadEtUIiwiZXhwIjoxNzI5ODY5MTc2LCJpYXQiOjE3Mjk4NjU1NzYsInZlcnNpb24iOjIsImp0aSI6IjRjMTQyOTE0LWM3MGUtNDNmNS1iMzg5LTNiYjNjNjQ0ZWI4NCIsImNsaWVudF9pZCI6IjJhdm5lYjZ1bjJtY2hubjk1ZGdhNTk2YzNhIn0.CZIK9UVso61QrnGyn1ixr9S8K2P2tfbTGqeiWsiFobo5fJ7gns6HeZQEIZnrZQ8guRD7GiBN3kr03BoA-tK0gDaA-0_i_jEr3feAUCU1dPydzNph57S0CKL79Clr1ztUUZIXrCpPxi9ycuP8sRAkDBnWzuQVu34RJCoWAqUuHoikNQ-Vo-wtcGoR74egTLzN7PwN19TkkMTQ-M3TIQ0kO6o2eZOOLnVb-c6r8FYmyJK_9L9SOa6AqA96ORdFPwq-jTBhYgmczukUO_hFxbJh0pincMoJcAAWMd9stp6zwWm4Da-tEzU4R-ejrvN3mk4a3plBYlPwCB-V7YeiHTRd_Q


Bom dia @Luigi Ferronatto, aproveitando queria tirar outra duvida com vc, eu queria usar essa funcao dentro de um resource e chamar ela toda vez que eu precisar, eu joguei em um resource, chamo ela assim 

 

function run( fnc, token ){

eval(fnc);

return IsValidToken(token); 

 

mas fica retornando internal server error mas vi aqui que passa certinho a funcao e o token.

A funcao esta armazenada assim no recurso : 

function b64DecodeUnicode(str) { \tlet chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; \tlet output = ''; \tlet buffer; \tlet i = 0; \tstr = str.replace(/=+$/, ''); \twhile (i < str.length) { \t\tbuffer = (chars.indexOf(str.charAt(i++)) << 18) | \t\t\t(chars.indexOf(str.charAt(i++)) << 12) | \t\t\t(chars.indexOf(str.charAt(i++)) << 6) | \t\t\tchars.indexOf(str.charAt(i++)); \t\toutput += String.fromCharCode((buffer >> 16) & 0xff) + \t\t\t((buffer >> 8) & 0xff ? String.fromCharCode((buffer >> 8) & 0xff) : '') + \t\t\t(buffer & 0xff ? String.fromCharCode(buffer & 0xff) : ''); \t} \treturn decodeURIComponent(escape(output)); } function IsValidToken(token) { \tlet status = 'error'; \ttry { \t\tlet base64Url = token.split('.')i1]; \t\tlet base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); \t\twhile (base64.length % 4 !== 0) { \t\t\tbase64 += '='; \t\t} \t\tlet jsonPayload = b64DecodeUnicode(base64); \t\tlet payload = JSON.parse(jsonPayload); \t\tlet currentTime = Math.floor(Date.now() / 1000); \t\tlet expirationTime = payload.exp; \t\treturn status = expirationTime < currentTime ? 'inválido' : 'válido' \t} catch (e) { \t\treturn status; \t} }

Token : 
Bearer eyJraWQiOiJLckl0VVNxVmhnUWFZcFcwS3pJWnlkRGtoU0tRM1wveVV5bFNrWEw5N2tQUT0iLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIyYXZuZWI2dW4ybWNobm45NWRnYTU5NmMzYSIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiY3JlZGl0XC9hZG1pbiIsImF1dGhfdGltZSI6MTcyOTg2NTU3NiwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tXC91cy1lYXN0LTJfYjEwSExadEtUIiwiZXhwIjoxNzI5ODY5MTc2LCJpYXQiOjE3Mjk4NjU1NzYsInZlcnNpb24iOjIsImp0aSI6IjRjMTQyOTE0LWM3MGUtNDNmNS1iMzg5LTNiYjNjNjQ0ZWI4NCIsImNsaWVudF9pZCI6IjJhdm5lYjZ1bjJtY2hubjk1ZGdhNTk2YzNhIn0.CZIK9UVso61QrnGyn1ixr9S8K2P2tfbTGqeiWsiFobo5fJ7gns6HeZQEIZnrZQ8guRD7GiBN3kr03BoA-tK0gDaA-0_i_jEr3feAUCU1dPydzNph57S0CKL79Clr1ztUUZIXrCpPxi9ycuP8sRAkDBnWzuQVu34RJCoWAqUuHoikNQ-Vo-wtcGoR74egTLzN7PwN19TkkMTQ-M3TIQ0kO6o2eZOOLnVb-c6r8FYmyJK_9L9SOa6AqA96ORdFPwq-jTBhYgmczukUO_hFxbJh0pincMoJcAAWMd9stp6zwWm4Da-tEzU4R-ejrvN3mk4a3plBYlPwCB-V7YeiHTRd_Q




Vou testar e retorno para você


Boa tarde @Luigi Ferronatto descobri pq nao funciona quando agente cola a função la em resources ela fica com esse monte de \t\t\ eu limpei tudo e troquei por espaço em branco e funcionou lindamente assim posso reutilizar a função no bot todo sem ter que ficar criando a mesma função varias vezes, obrigado mais uma vez pela força !!!!! 


Comente