Aprel Team Samurai Опубликовано 19 марта Aprel Team Поделиться Опубликовано 19 марта Вероятно, многие из пытавшихся реализовать скачивание видосов с ютуба уже натыкались на get_video_info. И, к большому сожалению, рабочим этот вариант не оказывался (на сегодняшний день). Поэтому в этой статье поделюсь одной из найденных альтернатив. Итак, создаём php-файл и сразу начинаем писать код. Добавим переменную $link, запишем в неё ссылку на любое видео с ютуба: <?php $link = 'https://www.youtube.com/watch?v=x4sWD5qiZT4'; GET-параметр v - это идентификатор нашего видео. Его из общей ссылки необходимо как-то вычленить. Да, можно было бы сделать всё вручную и в $link вставлять уже вырезанный ID, но всё же лениться не будем и сделаем небольшой задел на будущее (например, для реализации какого-то интерфейса или интеграции скрипта в бота): parse_str( parse_url( $link, PHP_URL_QUERY ), $params ); $video_id = $params['v'] ?? exit; Далее формируем POST-запрос к конечной точке youtubei/v1/player: $arr = [ 'context' => [ 'client' => [ 'hl' => 'en', 'clientName' => 'WEB', 'clientVersion' => '2.20210721.00.00', 'mainAppWebInfo' => [ 'graftUrl' => '/watch?v=' . $video_id ] ] ], 'videoId' => $video_id ]; $curl = curl_init(); curl_setopt( $curl, CURLOPT_URL, 'https://www.youtube.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8' ); curl_setopt( $curl, CURLOPT_HTTPHEADER, [ 'Content-Type:application/json' ] ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_POST, true ); curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode( $arr ) ); curl_setopt( $curl, CURLOPT_ENCODING, 'gzip, deflate' ); $result = json_decode( curl_exec( $curl ), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ); curl_close( $curl ); На данный момент в переменной $result хранится огромной массив полученных данных, некоторые из которых нам придётся вытащить и использовать для дальнейшей работы: $video_details = $result['videoDetails']; $streaming_data = $result['streamingData']; $formats = $streaming_data['formats']; $video_name = $video_details['title']; $video = []; foreach ( $formats as $key ) { $data = $key; $mime_type = explode( ';', $data['mimeType'] ); $data['mime'] = $mime_type[0]; $data['format'] = ltrim( substr( $mime_type[0], stripos( $mime_type[0], '/' ) ), '/' ); $video[] = $data; } $video_file_name = strtolower( str_replace( ' ', '_', $video_name ) ) . '.' . $video[0]['format']; $download_url = $video[0]['url']; $file_name = preg_replace( '/[^A-Za-z0-9.\_\-]/', '', basename( $video_file_name ) ); Дальше проверяем переменную $download на пустоту: if ( $download_url ) { header( 'Cache-Control: public' ); header( 'Content-Description: File Transfer' ); header( 'Content-Disposition: attachment; filename=' . $file_name ); header( 'Content-Type: application/zip' ); header( 'Content-Transfer-Encoding: binary' ); readfile( $download_url ); } Если всё окей - начнётся загрузка видео. В этот раз я не стал делать интерфейс, поэтому для тестирования достаточно открыть файл со скриптом в браузере. Весь код: <?php $link = 'https://www.youtube.com/watch?v=y2YUJ186Ke4'; parse_str( parse_url( $link, PHP_URL_QUERY ), $params ); $video_id = $params['v'] ?? exit; $arr = [ 'context' => [ 'client' => [ 'hl' => 'en', 'clientName' => 'WEB', 'clientVersion' => '2.20210721.00.00', 'mainAppWebInfo' => [ 'graftUrl' => '/watch?v=' . $video_id ] ] ], 'videoId' => $video_id ]; $curl = curl_init(); curl_setopt( $curl, CURLOPT_URL, 'https://www.youtube.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8' ); curl_setopt( $curl, CURLOPT_HTTPHEADER, [ 'Content-Type:application/json' ] ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $curl, CURLOPT_POST, true ); curl_setopt( $curl, CURLOPT_POSTFIELDS, json_encode( $arr ) ); curl_setopt( $curl, CURLOPT_ENCODING, 'gzip, deflate' ); $result = json_decode( curl_exec( $curl ), JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ); curl_close( $curl ); $video_details = $result['videoDetails']; $streaming_data = $result['streamingData']; $formats = $streaming_data['formats']; $video_name = $video_details['title']; $video = []; foreach ( $formats as $key ) { $data = $key; $mime_type = explode( ';', $data['mimeType'] ); $data['mime'] = $mime_type[0]; $data['format'] = ltrim( substr( $mime_type[0], stripos( $mime_type[0], '/' ) ), '/' ); $video[] = $data; } $video_file_name = strtolower( str_replace( ' ', '_', $video_name ) ) . '.' . $video[0]['format']; $download_url = $video[0]['url']; $file_name = preg_replace( '/[^A-Za-z0-9.\_\-]/', '', basename( $video_file_name ) ); if ( $download_url ) { header( 'Cache-Control: public' ); header( 'Content-Description: File Transfer' ); header( 'Content-Disposition: attachment; filename=' . $file_name ); header( 'Content-Type: application/zip' ); header( 'Content-Transfer-Encoding: binary' ); readfile( $download_url ); } Обратиться Цитата Ссылка на комментарий
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.