Вы не зашли.
Главная » JavaScript » Дешифровка прямых ссылок на файлы youtube
#1. TLENS Off (14)
Moderator
2015.10.07 19:07
Есть задача получить прямые ссылки на видео файл ютуба, ссылки содержащиеся на исходной странице подписываются и никак не могу разобраться с дешифровциком сигнатуры.
Сами ссылки получаются очень просто
Код:
<?php
 
$url 'https://m.youtube.com/watch?v=HEsX1FeZ25Y';
$ch curl_init($url);
curl_setopt($chCURLOPT_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($chCURLOPT_HEADER,true);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_setopt($chCURLOPT_TIMEOUT10);
curl_setopt($chCURLOPT_ENCODING"");
curl_setopt($chCURLOPT_FOLLOWLOCATIONfalse);
//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
Вот старый вариант дешифровщика но недавно этот алгоритм стал недействительным
Код:
<?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($s43);
                $funcSigDecSwap($s2);
                $funcSigDecSwap($s54);
                $s array_reverse($s);
                $funcSigDecSwap($s8);
                $s array_slice($s1);
                $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).
делал так:
Код:
<?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
Разобрался. В общем без слов что у меня получилось.
Код:
<?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($chCURLOPT_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($chCURLOPT_HEADERfalse);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_setopt($chCURLOPT_TIMEOUT10);
curl_setopt($chCURLOPT_ENCODING"");
curl_setopt($chCURLOPT_FOLLOWLOCATIONfalse);
 
 
$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($chCURLOPT_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($chCURLOPT_HEADERtrue);
    curl_setopt($chCURLOPT_NOBODYtrue);
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    curl_setopt($chCURLOPT_TIMEOUT10);
    curl_setopt($chCURLOPT_ENCODING"");
    curl_setopt($chCURLOPT_FOLLOWLOCATIONfalse);
 
 
    $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($a2);
        },
        'splice' => function (&$a$b) {
            array_splice ($a0$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.014 s