Вы не зашли.
Главная » JavaScript » Дешифровка прямых ссылок на файлы youtube
#1. TLENS Off (14)
Moderator
2015.10.07 19:07
Есть задача получить прямые ссылки на видео файл ютуба, ссылки содержащиеся на исходной странице подписываются и никак не могу разобраться с дешифровциком сигнатуры.
Сами ссылки получаются очень просто
Код:
span style="color: #0000BB"><?php$url = 'https://m.youtube.com/watch?v=HEsX1FeZ25Y';$ch = curl_init($url);curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36');curl_setopt($ch, CURLOPT_HEADER,true);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_TIMEOUT, 10);curl_setopt($ch, CURLOPT_ENCODING, "");curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);//curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 0);//curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookieFile);//curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookieFile);$content = curl_exec($ch);preg_match('/<\/body>.*?<script>(.*?)<\/script>/s', $content, $script);preg_match('/var bootstrap_data = "\)\]\}\'([^\n]*)"/', $script[1], $resultData);$json = json_decode(stripcslashes($resultData[1]), true);$links = [];foreach(explode(',', $json['content']['swfcfg']['args']['adaptive_fmts']) as $str) { parse_str($str, $array); $links[$array['itag']] = $array;}$itag = 160;if (@$links[$itag]['signature']) { $url = $links['url'] .'&signature='. $links[$itag]['signature'];} elseif (@$links[$itag]['sig']) { $url = $links['url'] .'&signature='. $links[$itag]['sig'];} elseif($links[$itag]['s']) { // Здесь надо перешифровать содержимое $links[$itag]['s'] }
Но далее есть проблема если в объекте ссылки присутствует переменные signature или sig то просто дописываем ее содержимое в ссылку но если вместо них содержится переменная s она не подходит. Ее надо дешифровать. И тут начинается головняк.
Нашел вариант дешифровки в расширении savefrom.net но все ни как не могу нормально перечитать код данного дешифровщика. Уж слишком там запутана лапша.
вот ссылка на код из savefrom https://sf-addon.com/helper/chrome/helper.user.js
Добавлено спустя   8 минут  8 секунд:
В файле helper.user.js функция дешифровки называется ytRunActList ничего сложного но для нее нужен экшен лист с которым я уже запутался как он генерируется
#2. TLENS Off (14)
Moderator
2015.10.07 19:07
Вот старый вариант дешифровщика но недавно этот алгоритм стал недействительным
Код:
span style="color: #0000BB"><?php$variables = explode(',', $links); $links = array(); $funcSigDecSwap = function(&$a, $b) { $t = $a[0]; $a[0] = $a[$b % sizeof($a)]; $a[$b] = $t; }; foreach ($variables as $var) { $arr = array(); parse_str($var, $arr); if (isset($arr['url'])) { //var_dump($arr); //* if (isset($arr['sig'])) { $signature = $arr['sig']; } elseif (isset($arr['signature'])) { $signature = $arr['signature']; } elseif (isset($arr['s'])) { $s = str_split($arr['s']); // Этот алгоритм предоставлен сайтом savefrom.net $funcSigDecSwap($s, 43); $funcSigDecSwap($s, 2); $funcSigDecSwap($s, 54); $s = array_reverse($s); $funcSigDecSwap($s, 8); $s = array_slice($s, 1); $signature = implode('', $s); } $links[$arr['itag']] = $url . (isset($signature) ? "&sig=$signature": ''); } }
#3. Gemorroj Off (107)
Administrator
2015.10.07 20:08
хз. расширение не ставил. на глаз тоже не понял откуда берется тот список.
но я бы вообще пошел по другому пути, не писал свой велосипед, а использовал готовые даунлоадеры.
с ходу нашлось вот это https://github.com/williamfortunademora … edoyoutube код стремный, но видео, которое у тебя в примере скачалось (flv).
делал так:
Код:
span style="color: #0000BB"><?php$obj = new YouTubeToMp3Converter();$obj->DownloadVideo($url);
#4. Gemorroj Off (107)
Administrator
2015.10.07 20:08
Вот 2 решения нормальных вроде.
https://github.com/norkunas/youtube-dl-php
https://github.com/atphp/youtube-downloader
#5. TLENS Off (14)
Moderator
2015.10.07 21:09
Разобрался. В общем без слов что у меня получилось.
Код:
span style="color: #0000BB"><?php$id = 'HKxxUAaa4uE';$url = "http://www.youtube.com/get_video_info?video_id={$id}&asv=3&&el=detailpage&sts=16708";$ch = curl_init($url);curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36');curl_setopt($ch, CURLOPT_HEADER, false);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_TIMEOUT, 10);curl_setopt($ch, CURLOPT_ENCODING, "");curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);$content = curl_exec($ch);curl_close($ch);parse_str($content, $data);$links = [];foreach(explode(',', $data['url_encoded_fmt_stream_map']) as $str) { parse_str($str, $array); //var_dump($array); $itag = $array['itag']; if (@$array['signature']) { $url = $array['url'] .'&signature='. $links[$itag]['signature']; } elseif (@$array['sig']) { $url = $array['url'] .'&signature='. $links[$itag]['sig']; } elseif(@$array['s']) { $sig = decSig($array['s']); $url = "{$array['url']}&signature={$sig}"; } else { $url = $array['url']; } $ch = curl_init($url); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 4.2.2; GT-I9505 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36'); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_ENCODING, ""); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); $content = curl_exec($ch); echo $content; $links[$array['itag']] = $array;}function decSig($s) { //$list = ["16708", [["swap",19],["splice",2],["reverse",null],["splice",2],["swap",48],["reverse",null],["splice",2],["reverse",null]] ]; $list = [["swap",19],["splice",2],["reverse",null],["splice",2],["swap",48],["reverse",null],["splice",2],["reverse",null]]; $actionList = [ 'slice' => function (&$a, &$b) { $a = array_slice($a, 2); }, 'splice' => function (&$a, $b) { array_splice ($a, 0, $b); }, 'reverse' => function (&$a) { $a = array_reverse($a); }, 'swap' => function (&$a, &$b) { $c = $a[0]; $a[0] = $a[$b % count($a)]; $a[$b] = $c; } ]; $s = str_split($s); for ($i = 0, $item; (isset($list[$i]) && $item = $list[$i]); $i++) { $actionList[$item[0]]($s, $item[1]); } return implode('', $s);}
#6. Gemorroj Off (107)
Administrator
2015.10.07 21:09
2 раз когда скачиваешь файл, имхо, лучше бы заоптимизировать. хотябы просто readfile попробуй вместо curl.
#7. TLENS Off (14)
Moderator
2015.10.09 09:09
Да это тестовая. У меня все кешируется. Плюс я использую curl multi. К тому же там если не заметил стоит нобади
Добавлено спустя   3 минуты  39 секунд:
Нашел интересный репозитарий https://github.com/bitnol/CipherAPI
Страниц: 1
Главная
WEB
PunBB Mod v0.6.2
0.017 s