[Resolvido] Base64 encode - Script exemplo para Gmail API


#1

Preciso encodar uma requisição em Base64 UTF-8 e o script não aceita as funções btoa() dizendo btoa is undefined, mesmo esta aparecendo na predição.


#2

Ola, @Jhoni_Desb.

‘btoa’ na verdade pertence ao objeto ‘window’, que faz parte do padrão HTML, não do Javascript/Ecmascript. Ou seja, apenas em engines JS de browsers você encontrará este método, o que não é o caso do Builder do Blip.
Só para ilustrar, até em NodeJS é preciso importar um package para adicionar este suporte…

No link abaixo tem uma implementação que você pode experimentar na sua ‘caixa’ de script:

[]s


#3

Obrigado andreminelli.
Mas eu não consegui usar, pois o trecho que define a var Base64={.....} é composto por inúmeras functions. Não sei se o Script do bot suporta function dentro de function, principalmente por causa dos returns de cada uma.
Também não consegui desmembrar isso em scripts separados e passar os parâmetros.


#5

Consegui implementar uma codificação base64 na unha e que funciona no Script.
A quem interessar, funciona com a API do Gmail para envio do conteúdo em raw.

function encode64url() {
	try {
		input = 'From: Seu Nome <seu.nome@gmail.com> '+'\n'+
			    'To: Nome Destinatario <nome.destinatario@gmail.com> '+'\n'+
			    'Subject: Diga Ola '+'\n'+
			    'Date: Fri, 21 Nov 1997 09:55:06 -0600 '+'\n'+
			    'Message-ID: <1234@local.machine.example> '+'\n'+
			    'Teste de email.';
            
		var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";

		var output = "";
		var chr1,chr2,chr3 = "";
		var enc1,enc2,enc3,enc4 = "";
		var i = 0;

		do {
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);

			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;

			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
			output = output +
				keyStr.charAt(enc1) +
				keyStr.charAt(enc2) +
				keyStr.charAt(enc3) +
				keyStr.charAt(enc4);
			chr1 = chr2 = chr3 = "";
			enc1 = enc2 = enc3 = enc4 = "";
		} while (i < input.length);

		return output;

	} catch (err) {
		return err.message;
	}
}

Moderador, pode concluir este tópico por favor.


#6

Boa, @Jhoni_Desb.

Só para constar, peguei aquele código do exemplo e dei uma ‘limpada’, mantendo apenas o método ‘encode’:

var Base64 = {
    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
    encode: function(e) {
        var t = "";
        var n, r, i, s, o, u, a;
        var f = 0;
        e = Base64._utf8_encode(e);
        while (f < e.length) {
            n = e.charCodeAt(f++);
            r = e.charCodeAt(f++);
            i = e.charCodeAt(f++);
            s = n >> 2;
            o = (n & 3) << 4 | r >> 4;
            u = (r & 15) << 2 | i >> 6;
            a = i & 63;
            if (isNaN(r)) {
                u = a = 64
            } else if (isNaN(i)) {
                a = 64
            }
            t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a)
        }
        return t
    },
    _utf8_encode: function(e) {
        e = e.replace(/rn/g, "n");
        var t = "";
        for (var n = 0; n < e.length; n++) {
            var r = e.charCodeAt(n);
            if (r < 128) {
                t += String.fromCharCode(r)
            } else if (r > 127 && r < 2048) {
                t += String.fromCharCode(r >> 6 | 192);
                t += String.fromCharCode(r & 63 | 128)
            } else {
                t += String.fromCharCode(r >> 12 | 224);
                t += String.fromCharCode(r >> 6 & 63 | 128);
                t += String.fromCharCode(r & 63 | 128)
            }
        }
        return t
    }
}

Seria usado assim:

Base64.encode('123456')

Obs: também não testei dentro do Builder, mas agora tem mais chance de funcionar :slight_smile: