# Informacje 1. Wszystkie publicznie dostępne narzędzia typu **youtube-dl**, **yt-dlp** czy **invidious** skupiły się po prostu na uzyskaniu możliwości pobierania video oraz livestreamów. Nie próbują one jakkolwiek symulować prawdziwego użytkownika. 2. Mimo wszystko są dobrym źródłem informacji, zarówno ich *kod* jak i *issues*. 3. Niemożliwym jest znaleźć w internecie żadnych *filmików*, *wpisów na blogach* ani *ctf writeupów* na temat tego jak działa **YouTube**. Wynika to zarówno przez to, że z frazą **YouTube** cięzko jakkolwiek uzyskać dobry wynik wyszukiwania w **Google** oraz tego, że przez fakt czym "społecznie" jest **YouTube** ciężko w ogóle wpaść na taki pomysł. 4. Jedynym realnym projektem botów, który posiada jakkolwiek potwierdzone działanie jest projekt autorstwa **Airkek** - [Youtube Viewers](https://github.com/Airkek/Youtube-Viewers). 5. Od tego czasu sporo się zmieniło, *cryptostreaming* stał się znacznie popularniejszy, a sam **YouTube** napewno podjął jakieś kroki w tym kierunku. 6. Sporo dobrych rad w issues zostawił [IceyTroll](https://github.com/IceyTroll) 7. Oprócz samego systemu symulowania oglądających trzeba będzie również symulować wchodzenie z zewnętrznych źródeł. W statystykach **Youtuba** możemy dokładnie zobaczyć czy nowi oglądający wchodzą przez przekierowanie z na przykład z Twittera, przez kliknięcie w miniaturkę, czy bezpośrednio przez wejście w link. Wpływa to znacząco na pozycjonowanie streama. 8. Podczas oglądania transmisji na **Windows 11** w najnowszej wersji **Google Chrome** z zainstalowanym **AdBlockiem** z domyślnymi jej ustawieniami, czyli 5 sekundowym opóźnieniem, transmisja pobierana jest za pomocą **DASH**. 9. **YouTube** zbiera informację o wtyczkach jakie posiada użytkownik, jest w stanie wykryć czy ktoś posiada **AdBlocka**, ale niewiadomo, czy jak na razie cokolwiek z tym robi. Być może liczba i nazwy wtyczek służą do fingerprintowania 10. **Video** oraz **Audio** są pobierane za pomocą dwóch osobnych streamów ``` Youtube has 2 type of streams - multiplexed and adaptive. First one has both video and sound, second one only has either of two. Since they are being phased out, multiplexed streams are typically of much lower quality than their adaptive counterparts. What KeepVideo does is present you with the old multiplexed format. Besides that, on a big portion of videos Youtube uses signature ciphering which adds another pretty massive step to retrieving stream URLs. I don't recommend doing this on your own. ``` 11. Symulowanie użytkowników poprzez emulację przeglądarki do tej pory nie wyszło nam za żadnym razem oraz ogólnie po przemyśleniu wydaje się dość nierealne. Nawet w trybie **headless** są one bardzo niewydajne. Z naszych obliczeń nie spinałoby się to nawet gdybyśmy postawili *Cluster*. 12. **YouTube** sprawdza wersję przeglądarki i starczy, żeby była ona o chociaż jeden dzień wstecz i już nie przepuści cię do playera 13. Wszystkie usługi **Headless browser as a service** są bardzo drogie i w większości oferują **Chromium** zamiast **Google Chrome** co **YouTube** jest w stanie wykryć nawet po zastosowaniu projektów typu [Puppeter Stealth](https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth) 14. Najlepszymi opcjami naszym zdaniem wydaje się zemulowanie samego skryptu za pomocą narzędzi typu **GraalVM**, **Node**, **quick_js**, **boa** lub zreversowanie całego procesu i przepisanie na program, który po prostu wysyła zapytania HTTP 15. W całym procesie trzeba uwzględnić także koszt proxy. Najlepiej gdyby requesty były zredukowane do minimum. 16. Przykładowo rzecz na którą należy uwazać gdy analizujemy projekty pokroju **yt-dlp** Ich implementacja: ```python # cpn generation algorithm is reverse engineered from base.js. # In fact it works even with dummy cpn. CPN_ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_' cpn = ''.join(CPN_ALPHABET[random.randint(0, 256) & 63] for _ in range(0, 16)) ``` Faktyczna implementacja **Youtuba**: ```javascript= var eA = Date.now().toString(); fA = function(a) { if (window.crypto && window.crypto.getRandomValues) try { var b = Array(a) , c = new Uint8Array(a); window.crypto.getRandomValues(c); for (var d = 0; d < b.length; d++) b[d] = c[d]; return b } catch (f) {} b = Array(a); for (c = 0; c < a; c++) { d = Date.now(); for (var e = 0; e < d % 23; e++) b[c] = Math.random(); b[c] = Math.floor(256 * Math.random()) } if (eA) for (c = 1, d = 0; d < eA.length; d++) b[c % a] = b[c % a] ^ b[(c - 1) % a] / 4 ^ eA.charCodeAt(d), c++; return b }; ggA = function(a) { a = fA(a); for (var b = [], c = 0; c < a.length; c++) b.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[c] & 63)); return b.join("") }; ``` 17. Bezsensownym jest losowanie *UserAgenta*, większość użytkowników posiada tą samą *przeglądarkę* oraz ten sam *system operacyjny*, więc ich *UserAgent* jest taki sam. 18. Możliwym jest fingerprintowanie **Node** za pomocą *TLS* [Link](https://httptoolkit.com/blog/tls-fingerprinting-node-js/) 19. *HttpClient* z **GoLang** posiada dokładnie takie same fingerprinty *TLS* Jak *Google Chrome* 20. Cała logika odbywa się w dwóch skryptach [base.js](https://www.youtube.com/s/player/ac058a09/player_ias.vflset/pl_PL/base.js), [polymer.js](https://www.youtube.com/s/desktop/790cf77f/jsbin/desktop_polymer.vflset/desktop_polymer.js) oraz dwóch jsonach dostarczanych razem z index.html [ytInitialPlayerResponse](https://gist.github.com/erg43hergeg/9547a34c5ead4da023167bada1fd62e4), [youtube_config](https://gist.github.com/erg43hergeg/3207853e9af139fac320c9352cedbabc) 21. Niektóre linki do streamów są zaszyfrowane, ale nie do końca rozumiem te szyfrowanie, ponieważ dalej da się je pobierać i jedyne co to throotlowany jest download speed i przez to prawdopodobnie jakość ograniczona do najgorszej. [youtube_obscurity](https://gist.github.com/erg43hergeg/e09a8f48b6b51b418bebeebd284f7e20). Tym akurat nie trzeba się przejmować bo to już ludzie rozłożyli na części pierwsze 22. Jedynym publicznym narzędziem, które jest w stanie odpalić stream DASHa z Youtuba jest [N_m3u8DL-RE](https://github.com/nilaoda/N_m3u8DL-RE) 23. Najlepszym wprowadzeniem jest odpalenie losowej transmisji oraz prześledzenie *Request Flow* za pomocą *DevToolsów*. 24. Po testach, które polegały na blokowaniu requestów i sprawdzeniu jak dużo można ich zablokować, aż oglądający transmisję przestaje być zliczony wyszło nam, że potrzebne jest: 1. Pobranie indeksu 2. api/stats/watchtime 3. videoplayback (faktycznie pobieranie streama) 25. Entrypointem do zaczęcia pobierania transmisji **DASH** jest ```javascript var lwa = yl.dashManifestUrl; lwa && (a.zb = g.ki(lwa, { cpn: a.clientPlaybackNonce })); ``` # Syf https://github.com/nattofriends/nama_kudasai/blob/4f26ee52570cdebc4a12e6aecd3109e6d2bab789/download.py#L69 https://github.com/nattofriends/nama_kudasai/blob/4f26ee52570cdebc4a12e6aecd3109e6d2bab789/common.py#L131 https://github.com/Airkek/Youtube-Viewers https://github.com/Airkek/Youtube-Viewers/issues/121#issuecomment-873390759 https://github.com/Airkek/Youtube-Viewers/issues/128#issue-936469141 https://gist.github.com/Yepoleb/2122a671fc7793f6e303f1dbea95e372#file-ytmusic-py-L22 https://github.com/Last-Order/kkr/blob/a04bac29c8eeb8337606b957f79976fcabba3b15/src/core/services/api/youtube.ts#L69 https://gist.github.com/erg43hergeg/9547a34c5ead4da023167bada1fd62e4 https://gist.github.com/erg43hergeg/11e7d61fd5f9c4a86f50c8445a1d6e0d https://gist.github.com/erg43hergeg/a233901b770d60bc64324482f38cf240 https://gist.github.com/erg43hergeg/d3249cfabb7c45982bcdca57625ef28f https://gist.github.com/erg43hergeg/3697128bb11d22953795f4910500b909 https://gist.github.com/erg43hergeg/bcae5099e7ca1900d4ed2f09aadef3d7 https://gist.github.com/erg43hergeg/eedf457d376a235c860b6448d9b3ebbe https://github.com/gdkjrygh/CompSecurity/blob/25993288e41d565b45a395658d37a791c0f38852/youtube-source/src/com/google/android/apps/youtube/datalib/innertube/model/PlaybackTracking.java https://github.com/BowDown097/QtTube/blob/d3782b09d7b1230fe27bd618ec3370e8e269d461/src/ui/watchview-mpv.cpp https://cplusplus.com/reference/cstdlib/rand/ https://cplusplus.com/reference/cstdlib/RAND_MAX/ https://gist.github.com/erg43hergeg/a2a214d778d555b8ded8380189d90f4b https://gist.github.com/erg43hergeg/5d3ba0cd78aa697b16a7e07a4302fe1d https://gist.github.com/erg43hergeg/eab9c1aaca046ddf2daa850db9f547d7 https://gist.github.com/erg43hergeg/73b97e9234e07de75c1132ef70bd1a0f https://github.com/randomperson189/Rehike/blob/1a03ead70bb234cf5b20726c210a53fed3ef1f60/innertubeHelper.php#L42 https://github.com/randomperson189/Rehike/blob/1a03ead70bb234cf5b20726c210a53fed3ef1f60/template/hitchhiker/core/ytGlobalJsConfig.twig#L18 https://github.com/yuliskov/SmartTubeLegacy/blob/48132697efdef50f474c34104255d2285bf43dbb/common/src/main/java/com/liskovsoft/smartyoutubetv/misc/HeaderManager.java https://github.com/yuliskov/SmartTubeLegacy/blob/48132697efdef50f474c34104255d2285bf43dbb/common/src/main/java/com/liskovsoft/smartyoutubetv/misc/KidsHeaderManager.java https://github.com/A4r0nLF/basic-youtube-music-api/blob/d0fdbb6b3ea34a98a8d3f665280980365c66b74b/src/main/java/org/example/RequestJSON.java https://github.com/ArchiveTeam/youtube-grab/blob/ef336e7d2b532ef82ebcc4afe91aba22ad132376/youtube.lua#L388 https://github.com/matheusv11/yt-music-api/blob/85ec6298fa02503b657200377d7bd9098a4e913c/src/config/yt-music.js https://github.com/SQZ777/ntericeapp/blob/18f77ea022ec9d026b3a15068c0899a09bb17e9b/lib/igotallday/igotalldayYoutubeService.js https://github.com/sulaimaan26/MagicVideo/blob/347b8a33810c1f2d3c516317d384ef832ab9dba9/frontend/comment.js https://github.com/anykao/ytdl/blob/7a05404b80042c7e59f76670a321237ca39efb39/src/youtube.rs#L22 https://github.com/RaresBares/YoutubeBotterLive/blob/fa8effca05741a5d99e7d4cb26a6e5e9f89052bb/src/com/company/Bot.java https://github.com/SurpassHR/Youtube_SignatureCipher_Decryptor https://github.com/mixtape-bot/youtubei/blob/3c07eaed10461e8462a9bab6f4d05025bba9cb17/youtubei-core/src/main/kotlin/mixtape/oss/youtubei/tools/YoutubeConfigExtractor.kt https://github.com/IziCSharp/rubot-cracker/blob/5add89ff52631ce26c6dc8e1b3b2d67cf3b67abb/rb_youtube/YoutubeBot.cs https://github.com/zerodytrash/Simple-YouTube-Age-Restriction-Bypass/search?q=getSignatureTimestamp https://www.blackhatworld.com/seo/big-issue-botguard-on-ytb-nobody-is-talking-about-it-but-its-the-main-problem.1098087/ Even IF (and that's a big if, indeed) you will find real residential proxies, my opinion is that you have to beat youtube's bot guard in order for your views to get counted. Google it and you will understand that this is a very tough quest. Some people speculate that the YT/ Google Bot Guard is able to see even the serial number of the mouse which is installed on the machine you're botting from. https://github.com/adasq/youtube-studio/search?q=botguard https://github.com/BitTheByte/YouTubeShop/issues/14 https://github.com/ikp4success/bypass_google_bot_guard https://github.com/search?q=youtube+botguardResponse&type=code https://github.com/SeanWoo/YouTubeStreamStarter/blob/7538368c592814ded37c58f55ef4f83129b727c1/YouTubeStreamStarter/Models/Channel.cs#L232 https://github.com/01278913406/ttt/tree/7b2b3d761063443b54bf6188f406ac7cfbcc423d https://github.com/TeamNewPipe/NewPipeExtractor https://github.com/TeamNewPipe/NewPipeExtractor/blob/1da0190056be8ace693e60567afbc1deebd5b5b4/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java#L1429 https://github.com/tmk907/YouTubeStreamsExtractor/blob/1a5eab7d8807ba2a7024fb9d9c830c2ea662abcb/YouTubeStreamsExtractor.Tests/DecryptorTests.cs https://github.com/tmk907?tab=repositories