Перейти к содержанию
  • Язык

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

Featured Replies

Опубликовано
  • Граждане

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

 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Последние посетители 0

  • Ни одного делегата форума не просматривает данную страницу

Важная сводка

Мы разместили cookie-файлы на твоё устройство, чтобы помочь сделать этот форум лучше. Ты можешь корректировать своё управление cookie-файлами, или же продолжить без каких-либо корректировок.

Иконка перчаток с несколькими звуками
Иконка перчаток

Досье

Навигация

Розыск

Розыск

Настройка push-извещений браузера

Chrome (Android)
  1. Нажми на значок замка рядом с адресной строкой.
  2. Нажми Разрешения → Извещения.
  3. Корректируй свои предпочтения.
Chrome (Desktop)
  1. Нажми на значок замка в адресной строке.
  2. Выбери Управление сайта.
  3. Разыщи Изввещения и корректируй свои предпочтения.