Перейти к содержанию
  • Регистрация

Стол заказов

  • 16 515
  • 105
Проверить

Кошелёк в Telegram | Wallet

  • 1 049
  • 1
Проверить

Скрипт для скачивания видео с YouTube на PHP


Рекомендуемые сообщения

  • Aprel Team

Вероятно, многие из пытавшихся реализовать скачивание видосов с ютуба уже натыкались на 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 );
}

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...