2

Wgetで YouTube 動画をダウンロードしようとしています。最初に、実際のビデオ リソースの URL を取得する必要があります。このビデオをダウンロードしたいとします: video . Firebugコンソールでページを開くと、次のような内容が表示されます。

ここに画像の説明を入力してください

私が丸で囲んだリンクは、リソースへのリンクのように見えます。そこには、ビデオのみが表示されます: http://www.youtube.com/v/r-KBncrOggI?version=3&autohide=1 . ただし、Wget でこのリソースをダウンロードしようとすると、r-KBncrOggI@version=3&autohide=1という名前の 4 KB のファイルがハード ドライブに保存されます。実際のビデオを取得するにはどうすればよいですか?

次に、360px、480px など、さまざまな解像度の動画のさまざまなリソースをキャプチャする方法はありますか?

4

2 に答える 2

2

これは、別の回答で引用したyoutube-downloadユーティリティの非常に単純化された機能的なバージョンの1 つです。

#!/usr/bin/env perl
use strict;
use warnings;

# CPAN modules we depend on
use JSON::XS;
use LWP::UserAgent;
use URI::Escape;

# Initialize the User Agent
# YouTube servers are weird, so *don't* parse headers!
my $ua = LWP::UserAgent->new(parse_head => 0);

# fetch video page or abort
my $res = $ua->get($ARGV[0]);
die "bad HTTP response" unless $res->is_success;

# scrape video metadata
if ($res->content =~ /\byt\.playerConfig\s*=\s*({.+?});/sx) {

    # parse as JSON or abort
    my $json = eval { decode_json $1 };
    die "bad JSON: $1" if $@;

    # inside the JSON 'args' property, there's an encoded
    # url_encoded_fmt_stream_map property which points
    # to stream URLs and signatures
    while ($json->{args}{url_encoded_fmt_stream_map} =~ /\burl=(http.+?)&sig=([0-9A-F\.]+)/gx) {
        # decode URL and attach signature
        my $url = uri_unescape($1) . "&signature=$2";
        print $url, "\n";
    }
}

使用例 (異なるエンコーディング/品質のストリームに複数の URL を返します):

$ perl youtube.pl http://www.youtube.com/watch?v=r-KBncrOggI | head -n 1
http://r19---sn-bg07sner.c.youtube.com/videoplayback?fexp=923014%2C916623%2C920704%2C912806%2C922403%2C922405%2C929901%2C913605%2C925710%2C929104%2C929110%2C908493%2C920201%2C913302%2C919009%2C911116%2C926403%2C910221%2C901451&ms=au&mv=m&mt=1357996514&cp=U0hUTVBNUF9FUUNONF9IR1RCOk01RjRyaG4wTHdQ&id=afe2819dcace8202&ratebypass=yes&key=yt1&newshard=yes&expire=1358022107&ip=201.52.68.216&ipbits=8&upn=m-kyX9-4Tgc&sparams=cp%2Cid%2Cip%2Cipbits%2Citag%2Cratebypass%2Csource%2Cupn%2Cexpire&itag=44&sver=3&source=youtube,quality=large&signature=A1E7E91DD087067ED59101EF2AE421A3503C7FED.87CBE6AE7FB8D9E2B67FEFA9449D0FA769AEA739
于 2013-01-12T13:18:33.370 に答える
1

ビデオリソースへの正しいリンクを取得するのはそれほど簡単ではないのではないかと思います。

取得したリンクhttp://www.youtube.com/v/r-KBncrOggI?version=3&autohide=1は、動画自体ではなくプレーヤーを指しています。Perlユーティリティの1つであるyoutube-downloadがあります。これは、手入れが行き届いていて、うまく機能します。fmt=18これは、そのビデオのHQバージョン(マジック)を取得する方法です。

stas@Stanislaws-MacBook-Pro:~$ youtube-download -o "{title}.{suffix}" --fmt 18 r-KBncrOggI 
--> Working on r-KBncrOggI
Downloading `Sourav Ganguly in Farhan Akhtar's Show - Oye! It's Friday!.mp4`
75161060/75161060 (100.00%)
Download successful!
stas@Stanislaws-MacBook-Pro:~$

より良いコマンドラインのYouTubeダウンローダーがあるかもしれません。しかし、申し訳ありませんが、Firebugを使用してビデオをダウンロードしてwgetを実行するだけではありません:(

そのURLを手動でキャプチャすることを私が知っている唯一の方法は、ブラウザのアクティブなダウンロードを監視することです。

Chromeインスペクター

その最大のデータチャンクはビデオデータであるため、そのURLをコピーできます。

http://s.youtube.com/s?lact=111116&uga=m30&volume=4.513679238953965&sd=BBE62AA4AHH1357937949850490&rendering=accelerated&fs=0&decoding=software&nsivbblmax=679542.000&hcbt=105.345&sendtmp=1&fmt=35&w=640 603805.166&md = 1&plid = AATTCZEEeM825vCx&ns = yt&ptk = youtube_none&csipt = watch7&rt = 110.904&tsphab = 1&nsiabblmax = 129097.000&tspne = 0&tpmt = 110&v1340 &cpn = JlqV9j_oE1jzk7Zc&nsivbblc = 343&nsiabblc = 343&docid = r-KBncrOggI&len = 1302.676&screenh = 900&abd = 1&pixel_ratio = 1&bc = 26131333&playerw = 854&idpj = 0&hcbd = 25408143&playerh = 510&ldpj = 0&fexp = 920704,919009,922403,916709,912806,929110,928008,920201,901451,909708,913605,925710,916623,929104,913302,910221,911116,914093,922405,929901&scoville = 1&el = detailpage&bd = 6676317&nsidf = 1&vid = Yfg8gnutZoTD4G5SVKCxpsPvirbqG7pvR&bt = 40.333&mos = 0&vq = auto

ただし、大きなビデオの場合、ダウンロードするストリーム範囲の原因となるURLクエリパラメータを把握して調整しない限り、これはストリームの一部のみを返します。

ボーナス:YouTubeは絶えず進化しているため、すべてが定期的に変更されます。ですから、痛みを刻まない限り、手動でそれを行わないでください。

于 2013-01-11T19:06:24.020 に答える