# 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