А зачем? Всё равно же нельзя ютуб заставить тащить видео с какого-то конкретного сервера, даже если его адрес знаешь. В ytdlp тоже такого функционала нет.
Просто мысль.
Я там вчера ковырял старый скрипт блокчека от Валдика, пришел к выводу, что особого смысла в нем нет, там придется половину дописывать, по сути повторять блокчек запрета. В общем, еще один велосипед. Но было бы круто прикрутить к этому велосипеду чек ближайших к пользователю ggc, чтобы уже на основе их искать стратегию. Не все могут нажать f12 и посмотреть videoplayback, тем более найти в нем нужный адрес.
А у ютуба есть открытое api и документация по нему? Или у них закрытый код? Что-то мне подсказывает, что второе…
Там есть API, но оно для юзеринтерфейсов, типа как инвидоус. Большего там не получить.
Можно вытащить идентификатор кластера из https://redirector.googlevideo.com/report_mapping?di=no скриптом, потом найти айпишники rr1.идентификатор.googlevideo.com
и тестить по айпи, подсовывая SNI googlevideo.com
, чтобы коробка активизировалась. Но это даст только провайдерские кэши, а не все ближайшие.
Получится что-то типа curl https://googlevideo.com --connect-to ::айпишник
А в чем разница?
Вот это как раз то самое, что искал. Спасибо. Будем думать по поводу реализации.
По сути, нужны как раз провайдерские кеши, потому как труба в первую очередь ломится в них. Автоматизировать перебор дальше по сети нет смысла, их тысячи, там уже вручную.
Если курлить предложенным конфигом там ошибка SEC_E_WRONG_PRINCIPAL.
А вот на хухел реагирует, возвращает 301.
На ютуб вообще не курлится.
По сути любой ответ годен, кроме 403. А вот как чекать рабочее замедление? Наверное только так
curl -k -o NUL https://qwe.googlevideo.com/10MB --connect-to ::ip
И как-то смотреть на деградацию скорости. У меня, к примеру, по нулям сходу. Курл возвращает 35.
Собственно, вот и методика.
Это хороший метод, но не универсальный. К примеру, у меня за всеми новыми видео, которых еще нет в кеше у провайдера, гугл шлет на зарубежные ip (ну или наши, на 2 разных сайтах по этим ip были разные результаты). А их этим методом не вычислишь. Без них видео не играет. И для них нужны другие настройки, не как для ggc провайдера
Короче, переделал свой скрипт для курления, чтобы он автоматом тестил провайдерские сервера. Версия очень сырая + мне не нравится как он результаты выводит. Надо все переделать. Но работать вроде работает.
Спойлер
::by Ori
chcp 1251
@echo off
title Connection and Bandwidth Test
cls
::Checking Curl version
for /F "tokens=1,2 delims= " %%i in ('curl -V') do (if "%%i"=="curl" set version=%%j)
for /F "tokens=1,2 delims=." %%i in ("%version%") do (set MajorVersion=%%i && set MinorVersion=%%j)
if %MajorVersion% LSS 8 (goto OUTDATED)
if %MinorVersion% LSS 10 (goto OUTDATED)
::Setting variables
set "connect_to_url=speedtest.selectel.ru"
set volume_to_transfer=10
set attempts=10
set /A time_to_transfer=%volume_to_transfer%/2
::Parsing claster codename
echo.
for /F "tokens=3 delims= " %%i in ('curl -sSm 2 "https://redirector.googlevideo.com/report_mapping?di=no"') do (set claster=%%i)
if not %ERRORLEVEL%==0 (echo Failed!)
echo ^> Claster codename: %claster%
::Testing loop
set ggcCounter=1
:GGCLOOP
::FAILLEVEL 0=allgreen;1=QUIC fail;2=total fail
set FAILLEVEL=0
::Forming URL
echo.
echo ------------------------------------------
echo.
set ggcURL=https://rr%ggcCounter%.%claster%.googlevideo.com
echo ^> Cache Server %ggcCounter%: %ggcURL%
set /A ggcCounter=%ggcCounter%+1
::Parsing IP address, not needed?
::for /F %%i in ('curl -sSkm 2 -o NUL -w "%%{remote_ip}" %ggcURL%') do (set ggcIP=%%i)
::echo ^> Cache Server IP: %ggcIP%
echo.
echo --------------------
echo.
echo ^> Testing connectivity...
echo.
curl -sSko NUL -m 2 -w "DNS_T: %%{time_namelookup} µs - Connection_T: %%{time_connect} µs - Handshake_T: %%{time_appconnect} µs - Total_T: %%{time_total} µs - Header: %%{size_header} bytes\n\n" %ggcURL%
if not %ERRORLEVEL%==0 (set FAILLEVEL=2)
if %FAILLEVEL%==2 ((echo Test failed) && (goto END))
echo Test passed
echo.
echo --------------------
echo.
echo ^> Testing QUIC connectivity...
echo.
curl -sSko NUL -m 2 --http3-only -w "DNS_T:%%{time_namelookup} µs - Connection_T: %%{time_connect} µs - Handshake_T: %%{time_appconnect} µs - Total_T: %%{time_total} µs - Header: %%{size_header} bytes\n\n" %ggcURL%
if %ERRORLEVEL%==0 (echo Test passed) else (if %ERRORLEVEL%==95 (echo Test passed) else ((set FAILLEVEL=1) && (echo Test failed)))
echo.
echo --------------------
echo.
echo ^> Testing channel bandwidth using %connect_to_url%, %volume_to_transfer%MB
echo.
set speed=0
for /F %%i in ('curl -sko NUL -m %time_to_transfer% --connect-to ::%connect_to_url% %ggcURL%/%volume_to_transfer%MB -w "%%{speed_download}"') do set speed=%%i
set /A speed=%speed%/1024
echo Average channel bandwidth estimated by curl: %speed%KB/s
set speed=
echo.
echo --------------------
echo.
echo ^> Testing connection stability, %attempts% attempts
echo.
set successes=0
set counter=%attempts%
:LOOP
for /F %%g in ('curl -sko NUL -m 1 %ggcURL% -w "%%{response_code}"') do set code=%%g
::echo Response code: %code%
if not %code%==000 (set /A successes=%successes%+1)
set /A counter=%counter%-1
if not %counter%==0 (goto LOOP)
echo Succesful connections: %successes% out of %attempts%
set successes=
set counter=
if %FAILLEVEL%==1 (goto SKIPQUIC)
echo.
echo --------------------
echo.
echo ^> Testing QUIC connection stability, %attempts% attempts
echo.
set successes=0
set counter=%attempts%
:LOOP_QUIC
for /F %%g in ('curl -sko NUL --http3-only -m 1 %ggcURL% -w "%%{response_code}"') do set code=%%g
::echo Response code: %code%
if not %code%==000 (set /A successes=%successes%+1)
set /A counter=%counter%-1
if not %counter%==0 (goto LOOP_QUIC)
echo Succesful connections: %successes% out of %attempts%
set successes=
set counter=
:SKIPQUIC1
echo.
echo --------------------
echo.
echo ^> Testing connection stability, 10 attempts in parallel
echo.
curl -skZm 3 --parallel-immediate --parallel-max 10 %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% > NUL
if %ERRORLEVEL%==0 (echo Test passed) else (echo Test failed)
if %FAILLEVEL%==1 (goto END)
echo.
echo --------------------
echo.
echo ^> Testing QUIC connection stability, 10 attempts in parallel
echo.
curl -skZm 3 --http3-only --parallel-immediate --parallel-max 10 %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% %ggcURL% > NUL
if %ERRORLEVEL%==0 (echo Test passed) else (if %ERRORLEVEL%==95 (echo Test passed) else (echo Test failed))
:END
echo.
echo --------------------
echo.
pause
goto GGCLOOP
:EOF
set version=
set MajorVersion=
set MinorVersion=
set connect_to_url=
set volume_to_transfer=
set time_to_transfer=
set attempts=
exit /b
:OUTDATED
set version=
set MajorVersion=
set MinorVersion=
echo.
echo Curl outdated.
echo Obtain actual version at https://curl.se/
echo.
echo Press any button to exit...
pause>NUL
exit /b
Скрипт надежный как швейцарские часы
Чисто для шарящих. Простой юзер пройдет мимо.
Не ну а че, в виндоусовской версии даже http3 нет.
Блин, там еще и кодировка поехала я смотрю. Не надо было букву мю для микросекунд вставлять.
Да вообще скрипт не отлажен.
Ну я и говорю сырой.
Сейчас выяснил интересную штуку. Если парсить блокчеком адрес rr1.имяпула.googlevideo.com, то методов обхода не будет. А вот если rr1.кодированнаябелиберда.googlevideo.com, тогда стратегия найдется. В общем, эти домены походу настроены на разные протоколы, пока не проверял.
Так что способ с получением зоны всё же не работает.
Когда-то давно я встречал где-то объяснение, как декодировать пул, а вот где - уже не помню.
ЗЫ. Вспомнил. И нашел.
Алгоритм моноалфавитной перестановки.
0123456789abcdefghijklmnopqrstuvwxyz - берем позицию
uzpkfa50vqlgb61wrmhc72xsnid83ytoje94 - берем значение на позиции из верхней строки
В обе стороны работает. Поэтому после получения из репорт-маппинга нужно преобразовать строку. То бишь у нас ссылки вида rr1.—sn-пул.googlevideo.com
Подробно у французов.
Ничего себе, круть!
У кого-нибудь получилось с помощью dpi вернуть работоспособность ютубу полностью, т.е. чтобы работал как обычно без малейших подтормазиваний при загрузке видео и перемотке? Напишите с какими настройками если такое получилось.
У каждого провайдера свои настройки. Подбери алгоритм блокчеком и переведи настройки в gdpi. Там вряд ли получится полноценный аналог, но будет база от которой можно подбирать дальше.