UserJS: YouTube Block Popups (SignIn/GDPR)

Często odpalam jakieś filmy na YouTube w trybie Incognito, bo nie chcę zabrudzać sobie historii obejrzanych filmów, czy karmić algorytm rekomendacji jakimiś pierdołami. Niestety we wrześniu, albo już trochę wcześniej, zauważyłem dziwne zachowanie - po kilku sekundach od rozpoczęcia odtwarzania materiału video, nagle wszystko zostaje przerwane, jakby ktoś wcisnął “Stop”. Myślałem, że to może wina YT, ale długo nic się nie zmieniało, to po którymś razie wyłączyłem swojego AdBlocka (uBlock Origin) i odkryłem przyczynę tego dziwnego działania.


To jednak wina Google, bo zaczęło nagle wywalać jakieś popupy proponujące zalogowanie się lub zaakceptowanie cookies shitów (GDPR). A co gorsze, pojawienie się takich okien zatrzymywało odtwarzanie filmu. Bloker je “wywalał” i nie można było zauważyć ich wyświetlenia, przez co trochę dziwnie wyglądało to zatrzymywanie się odtwarzania.

Jeszcze przed urlopem w Karkonoszach na podstawie jakiś podpowiedzi ze stacka wykorzystałem metodę ze sprawdzaniem stackcalla. Później eksperymentowałem ze skryptowym click() na #dismiss-button-nie. W wolnych chwilach zacząłem też testować inne kombinacje i analizować bebechy serwisu. No, ale grzebanie w plikach JS z kilkoma tysiącami linii kodu po minifikacji nie jest zbyt przyjemne.

Udało mi się jednak znaleźć trochę ciekawostek w kodzie i prześledzić zachowanie niektórych elementów, co poskutkowało kolejną prostą prowizorką. Istotny fragment tego kodu prezentował się tak:

var consent = document.querySelector('ytd-consent-bump-renderer');
if (consent) {
	consent.maybeForceConsent_ = () => consent.resumePlayer_();
}

var dismiss = document.querySelector('yt-upsell-dialog-renderer #dismiss-button');
if (dismiss) {
	dismiss.click();
}

Taki kod opakowany w MutationObserver na zmiany w ytd-app jakoś w “miarę” działał. Automatycznie klikał “Pomiń” po pokazaniu się okna z logowaniem, jednocześnie nadpisując jedną z funkcji blokował pojawienie się następnego “ciasteczkowego” okna i wznawiał odtwarzanie filmu.

Niestety nie było to perfekcyjne rozwiązanie i miało swoje bolączki. Pokazanie okna “SignIn” przerywa odtwarzanie, a nie pauzuje, więc jego wznowienie to rozpoczęcie odtwarzania na nowo. Do tego dochodzi czas reakcji skryptu i otrzymujemy dziwny efekt - odtworzenie kilku sekund filmu, mała przerwa i cofnięcie do początku. Pocieszające może być to, że ten “efekt” występuje tylko na pierwszej stronie z filmem. Po pierwszej “reakcji” skryptu, tak jak po odrzuceniu okien przez użytkownika, później już te popupy nie niepokoją zbyt często. Ale i tak było to wkurzające, więc w wolnych chwilach kontynuowałem poszukiwania lepszego rozwiązania.

Idealnie byłoby zablokować zatrzymywanie filmu przy oknie logowania lub w ogóle jego pokazywanie oszukując/nadpisując stan aplikacji, czy funkcji/warunków odpowiedzianych za cały ten cyrk. Kombinowałem, szukałem i testowałem różne hacki opracowane na podstawie analizy kodu, ale nie byłem zadowolony z efektów. Przełom nastąpił niedawno, gdy trafiłem w sieci na kogoś kto widocznie mógł poświecić więcej czasu i udało mu się znaleźć warunek początkowy.

Okazało się, że pominięcie wyświetlenia okienka “SignIn” można wymusić zmianą jednej wartości:

window.ytInitialPlayerResponse.auxiliaryUi.messageRenderers.upsellDialogRenderer.isVisible = false;

Sam próbowałem z wieloma innymi flagami i obiektami, ale na ten nie natrafiłem. Przy testach wyszło na jaw, że część tego obiektu znika na kolejnych stronach, więc należy to opakować w blok try-catch, żeby nie wywalało skryptu.

Przy braku okna logowania trzeba było jeszcze poprawić blokowanie wyświetlania Googlowego RODO, co wymagało “neutralizacji” innej niż wcześniej funkcji w obiekcie consent-renderera:

let obj = document.querySelector('ytd-consent-bump-renderer');
if (obj) {
	obj.handlePopupClose_ = function(){};

I tym sposobem wreszcie otrzymałem działające i spełniające wszystkie moje oczekiwania rozwiązanie. W efekcie działania skryptu, na stronach YT nie widać już żadnego negatywnego wpływu irytujących okienek.

Kod może przydać się innym, biorąc pod uwagę, że póki co żadne reklamowe blokery jeszcze sobie nie radzą z tym poprawnie. Zapakowałem wszystko w skrypt użytkownika i wrzuciłem do mojego gita UserScripts, gdzie leżą inne skrypty. Mam nadzieję, że YouTubeTeam nie wprowadzi jakiś większych zmian i skrypt podziała trochę dłużej, bo szkoda zbytnio marnować czas na szukanie obejść takich irytujących elementów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *