Eu sei sobre URIs de dados em que base64
dados codificados podem ser usados embutidos, como imagens. Hoje recebi um e-mail na verdade um spam, no qual havia um ícone animado (gif) no assunto:
Aqui está o ícone sozinho:
Então, a única coisa que passou pela minha cabeça foi tudo sobre URIs de dados e se o Gmail permite que algum tipo de emoticons seja inserido no assunto. Eu vi a versão completa e detalhada do e-mail e apontei para a linha de assunto na imagem abaixo:
Portanto, GIF vem de uma =?UTF-8?B?876Urg==?=
string codificada que é semelhante ao esquema de URI de dados, no entanto, não consegui tirar o ícone dele. Aqui está a fonte HTML do elemento:
Para encurtar a história, existem muitos emoticons de https://mail.google.com/mail/e/XXX
onde XXX
vêm os números hexadecimais. Eles não estão documentados em lugar nenhum ou não consegui encontrá-los. Se é sobre URI de dados, como é possível incluí-los no assunto do e-mail do Gmail? (Eu encaminhei esse e-mail para uma conta de e-mail do yahoo, vendo em [?]
vez do ícone) e se não for, como essa string codificada é analisada?
Respostas:
Pequena descrição:
Eles são chamados internamente de
goomoji
e parecem ser uma extensão UTF-8 não padrão. Quando o Gmail encontra um desses caracteres, ele é substituído pelo ícone correspondente. Não consegui encontrar nenhuma documentação sobre eles, mas consegui fazer a engenharia reversa do formato.O que são esses ícones?
Esses ícones são na verdade os ícones que aparecem no painel "Inserir emoticons".
Embora eu não veja o
52E
ícone na lista, existem vários outros que seguem a mesma convenção.B0C
4F4
Observe que também existem alguns ícones cujos nomes são prefixados, como . Não fui capaz de determinar se ou como esses ícones podem ser usados dessa maneira.
gtalk.03C
O que é essa coisa de URI de dados?
Na verdade, não é um URI de dados , embora compartilhe algumas semelhanças. Na verdade, é uma sintaxe especial para codificação de caracteres não ASCII em assuntos de e-mail, definidos no RFC 2047 . Basicamente, funciona assim.
Portanto, em nossa string de exemplo, temos os seguintes dados.
charset
=UTF-8
encoding
=B
(significa base64)data
=876Urg==
Então, como isso funciona?
Sabemos que de alguma forma,
876Urg==
significa o ícone52E
, mas como?Se decodificarmos em base64
876Urg==
, obtemos0xf3be94ae
. Isso se parece com o seguinte em binário:Esses bits são consistentes com um caractere codificado em UTF-8 de 4 bytes.
Portanto, os bits relevantes são os seguintes:
Ou quando alinhado:
Em hexadecimal, esses bytes são os seguintes:
Como você pode ver, exceto pelo
FE
prefixo que presumivelmente distingue osgoomoji
ícones de outros caracteres UTF-8, ele corresponde ao52E
no URL do ícone. Alguns testes comprovam que isso é verdadeiro para outros ícones.Parece muito trabalhoso. Existe um conversor ?:
É claro que isso pode ser programado. Criei o seguinte código Python para meus testes. Essas funções podem converter a string codificada em base64 de e para a string hexadecimal curta encontrada na URL. Observe que este código foi escrito para Python 3 e não é compatível com Python 2.
Funções de conversão:
Exemplos:
Resultado:
E, é claro, encontrar o URL de um ícone simplesmente requer a criação de um novo rascunho no Gmail, inserindo o ícone que você deseja e usando o inspetor DOM do seu navegador.
fonte
B
na sintaxe especial implica Base64 pode ter sido uma suposição (a string no final parece uma string codificada em Base64, se você já viu isso antes); depois disso, não é tão difícil perceber que os quatro bytes seguem um dos padrões UTF-8 para caracteres Unicode, especialmente porque ele está procurando por Unicode. É um trabalho de detetive muito legal, mesmo assim :)B
- é definido em # 4Se você usar o ponto de código hexadecimal correto (por exemplo, fe4f4 para 'pilha de cocô' ) e se estiver codificado corretamente no cabeçalho da linha de assunto, deixe-o ser base64 (consulte @AlexanderOMara) ou quoted-printable (
=?utf-8?Q?=F3=BE=93=B4?=
), então o Gmail irá automaticamente analise e substitua-o pelo emoji correspondente.Aqui está uma lista de emojis do Gmail para copiar e colar em linhas de assunto - ou corpos de e-mail. Emojis animados, que chamarão ainda mais atenção na caixa de entrada, são colocados em um fundo amarelo:
fonte
Muito obrigado a Alexander O'Mara por uma resposta tão bem pesquisada sobre as imagens HTML marcadas com goomoji!
Eu só queria adicionar três coisas:
Ainda existem muitos emojis (e outras sequências Unicode que geram imagens) que os spammers e outros comerciantes de outrora estão começando a usar nas linhas de assunto do email e que o gmail não converte em imagens HTML. Em alguns navegadores, eles aparecem em negrito e coloridos, o que é quase tão ruim quanto a animação. Os navegadores também podem optar por animá-los, mas não sei se algum faz. Essas sequências Unicode são exibidas pelo navegador como texto Unicode, então a aparência exata (colorida ou não, animada ou não, ...) depende de qual sistema de renderização de texto o navegador está usando. A aparência de um determinado emoji Unicode também depende de quaisquer seletores de variação Unicode e modificadores de emojique aparecem próximos a ele na sequência de pontos de código Unicode. Ao contrário do spam de emoji baseado em imagem, essas sequências podem ser copiadas e coladas do navegador e em outros aplicativos como texto Unicode.
Espero que muitos profissionais de marketing que estão lendo esta pergunta sobre StackOverflow digam não. É uma ideia horrível incluir essas sequências nas linhas de assunto do seu e-mail e isso imediatamente manchará você e sua marca como spammers lowlife. Não vale a pena a "atenção" que seu e-mail receberá.
Claro que a primeira pergunta que vem à mente de todos é: "como faço para me livrar dessas coisas?" Felizmente, existe este script de usuário Greasemonkey / Tampermonkey / Violentmonkey de código aberto:
Linha de assunto do Gmail Emoji Roach Motel
Este script de usuário elimina tanto a imagem HTML (graças ao incrível trabalho de Alexander O'Mara ) quanto os tipos Unicode puro.
Para o último tipo, o script do usuário inclui uma expressão regular projetada para capturar as sequências Unicode que provavelmente serão abusadas pelos profissionais de marketing. O regex se parece com isso no ES6 Javascript (o script do usuário traduz isso para um regex pré-ES6 amplamente suportado usando o incrível ES6 Regex Transpiler ):
fonte