Wiem o identyfikatorach URI danych, w których base64
zakodowane dane mogą być używane w tekście, na przykład obrazy. Dzisiaj otrzymałem e-mail, właściwie spam, w którym w temacie była ikona animacji (gif):
Oto sama ikona:
Więc jedyne, co przyszło mi do głowy, dotyczyło identyfikatorów URI danych i tego, czy Gmail umożliwia wstawianie w temacie emotikonów. Zobaczyłem pełną szczegółową wersję wiadomości e-mail i wskazałem wiersz tematu na poniższym obrazku:
Więc GIF pochodzi z =?UTF-8?B?876Urg==?=
zakodowanego ciągu, który jest podobny do schematu URI danych, ale nie mogłem wyciągnąć z niego ikony. Oto źródło HTML elementu:
Krótko mówiąc, istnieje wiele emotikonów, z https://mail.google.com/mail/e/XXX
których XXX
pochodzą liczby szesnastkowe. Nigdzie nie są udokumentowane lub nie mogłem ich znaleźć. Jeśli chodzi o identyfikator URI danych, to jak można je uwzględnić w temacie wiadomości e-mail Gmaila? (Przekazałem ten e-mail na konto e-mail Yahoo, widząc [?]
zamiast ikony), a jeśli nie, to w jaki sposób ten zakodowany ciąg jest analizowany?
Odpowiedzi:
Krótki opis:
Są one określane wewnętrznie jako
goomoji
i wydają się być niestandardowym rozszerzeniem UTF-8. Gdy Gmail napotyka jeden z tych znaków, jest on zastępowany odpowiednią ikoną. Nie mogłem znaleźć na nich żadnej dokumentacji, ale udało mi się odtworzyć format.Co to za ikony?
Te ikony to w rzeczywistości ikony wyświetlane w panelu „Wstaw emotikony”.
Chociaż nie widzę
52E
ikony na liście, jest kilka innych, które stosują tę samą konwencję.B0C
4F4
Zwróć uwagę, że istnieją również ikony, których nazwy są poprzedzone, na przykład . Nie byłem w stanie określić, czy i jak te ikony można wykorzystać w ten sposób.
gtalk.03C
Co to za identyfikator URI danych?
W rzeczywistości nie jest to identyfikator URI danych , chociaż ma pewne podobieństwa. W rzeczywistości jest to specjalna składnia do kodowania znaków spoza ASCII w tematach wiadomości e-mail, zdefiniowana w dokumencie RFC 2047 . Zasadniczo działa to w ten sposób.
Tak więc w naszym przykładowym ciągu mamy następujące dane.
charset
=UTF-8
encoding
=B
(oznacza base64)data
=876Urg==
Więc jak to działa?
Jakoś to wiemy,
876Urg==
oznacza ikonę52E
, ale jak?Jeśli zdekodujemy base64
876Urg==
, otrzymamy0xf3be94ae
. W formacie binarnym wygląda to następująco:Te bity są zgodne z 4-bajtowym znakiem zakodowanym w UTF-8.
Zatem odpowiednie bity są następujące .:
Lub po wyrównaniu:
Szesnastkowo te bajty są następujące:
Jak widać, z wyjątkiem
FE
przedrostka, który przypuszczalnie ma odróżniaćgoomoji
ikony od innych znaków UTF-8, pasuje on52E
do adresu URL ikony. Niektóre testy dowodzą, że dotyczy to innych ikon.Brzmi jak dużo pracy, czy jest konwerter ?:
Można to oczywiście napisać. Stworzyłem następujący kod Pythona do moich testów. Te funkcje mogą konwertować ciąg zakodowany algorytmem base64 na iz krótkiego ciągu szesnastkowego znalezionego w adresie URL. Uwaga, ten kod jest napisany dla Pythona 3 i nie jest zgodny z Pythonem 2.
Funkcje konwersji:
Przykłady:
Wynik:
I oczywiście znalezienie adresu URL ikony wymaga po prostu utworzenia nowej wersji roboczej w Gmailu, wstawienia żądanej ikony i użycia inspektora DOM przeglądarki.
źródło
B
w specjalnej składni sugeruje, że Base64 mógł być zgadywaniem (ciąg na końcu wygląda jak łańcuch zakodowany w Base64, jeśli widziałeś je wcześniej); po czym nietrudno zauważyć, że cztery bajty są zgodne z jednym ze wzorców UTF-8 dla znaków Unicode, zwłaszcza dlatego, że szuka Unicode. To całkiem fajna praca detektywa, mimo wszystko :)B
- jest to zdefiniowane w # 4Jeśli użyjesz poprawnego punktu w kodzie szesnastkowym (np. Fe4f4 dla 'stos poo' ) i jeśli jest on poprawnie zakodowany w nagłówku tematu, niech będzie to base64 (patrz @AlexanderOMara) lub quoted-printable (
=?utf-8?Q?=F3=BE=93=B4?=
), wtedy Gmail automatycznie przeanalizuj i zastąp go odpowiednim emoji.Oto lista emoji Gmaila do kopiowania i wklejania w tematach - lub treści wiadomości e-mail. Animowane emotikony, które przyciągną jeszcze więcej uwagi w skrzynce odbiorczej, są umieszczone na żółtym tle:
źródło
Wielkie dzięki dla Alexandra O'Mary za tak dobrze zbadaną odpowiedź na temat obrazów HTML z tagami goomoji!
Chciałem tylko dodać trzy rzeczy:
Wciąż istnieje wiele emoji (i innych sekwencji Unicode generujących obrazy), których spamerzy i inni dawni marketerzy zaczynają używać w wierszach tematów wiadomości e-mail, a gmail nie konwertuje na obrazy HTML. W niektórych przeglądarkach są one pogrubione i kolorowe, co jest prawie tak złe jak animacja. Przeglądarki również mogą je animować, ale nie wiem, czy w ogóle to robią. Te sekwencje Unicode są wyświetlane przez przeglądarkę jako tekst Unicode, więc dokładny wygląd (kolor lub nie, animowany lub nie, ...) zależy od systemu renderowania tekstu używanego przez przeglądarkę. Wygląd danego emoji Unicode zależy również od dowolnych selektorów odmian Unicode i modyfikatorów emojiktóre pojawiają się obok niego w sekwencji punktów kodowych Unicode. W przeciwieństwie do spamu emoji opartego na obrazach, sekwencje te można kopiować i wklejać z przeglądarki i do innych aplikacji jako tekst Unicode.
Mam nadzieję, że wielu marketerów czytających to pytanie dotyczące StackOverflow powie nie. To okropny pomysł, aby umieścić te sekwencje w tematach wiadomości e-mail i natychmiast zniszczy Ciebie i Twoją markę jako marnych spamerów. Nie warto „zwracać uwagi” na Twój e-mail.
Oczywiście pierwsze pytanie, które przychodzi każdemu do głowy, brzmi: „jak pozbyć się tych rzeczy?” Na szczęście istnieje ten otwarty skrypt użytkownika Greasemonkey / Tampermonkey / Violentmonkey:
Temat Gmaila Emoji Roach Motel
Ten skrypt użytkownika eliminuje zarówno obraz HTML (dzięki niesamowitej pracy Alexandra O'Mary ), jak i czyste typy Unicode.
W przypadku drugiego typu skrypt użytkownika zawiera wyrażenie regularne przeznaczone do przechwytywania sekwencji Unicode, które mogą być nadużywane przez marketerów. Wyrażenie regularne wygląda następująco w skrypcie ES6 Javascript (skrypt użytkownika tłumaczy to na powszechnie obsługiwane wyrażenie regularne pre-ES6 przy użyciu niesamowitego transpilera regex ES6 ):
źródło