web-dev-qa-db-ja.com

Googleドライブのビデオからredirector.googlevideo.comリンクを取得する方法

Googleドライブのビデオファイル( https://drive.google.com/file/d/FILE_ID/view など)があり、redirector.googlevideo.comリンクを取得したい。

http://api.getlinkdrive.com/ のようなサイトはどうしますか? GoogleドライブREST API、(v2とv3の両方)を使用しようとしましたが、それを行う方法を見つけることができません。多くのテレビ番組や映画サイトは、Googleでコンテンツをホストしますドライブ、有効期限が切れる「クローキングされた」URLを使用して、たとえば他の場所に埋め込むことはできません。

最も近いのはdocs.google.com/get_video_info?docid=FILE_IDに移動してfmt_stream_mapリンクを取得することですが、必要なリダイレクタリンクが返されません。

9
chenophucu

彼はGoogleからURLを取得して360p、480p、720p、1080pのすべての品質を取得し、/ videoplaybackの直前にredirector.googlevideo.comに変換し、それをvideo/mp4としてJW Playerで再生することについて話しています。完全なスクリプトですが、403で禁止されているという小さな問題があります。これは、GoogleがAPIで行った変更によるものです。PHPのコードを見て、 、iは後でスクリプト全体を投稿します。

function Drive($link) {
    $url = urldecode($link);
    $get = curl1($url);
    $data = explode(',["fmt_stream_map","', $get);
    $data = explode('"]', $data[1]);
    $data = str_replace(array('\u003d', '\u0026'), array('=', '&'), $data[0]);
    $data = explode(',', $data);
    asort($data);
    foreach($data as $list) {
        $data2 = explode('|', $list);
        if($data2[0] == 37) {$q1080p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}    // 1080P
        if($data2[0] == 22) {$q720p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}     // 720P
        if($data2[0] == 59) {$q480p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}     // 480P
        if($data2[0] == 18) {$q360p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);}     // 360P
    }
    $js[0][0] = "$q1080p";
    $js[0][1] = "$q720p";
    $js[0][2] = "$q480p";
    $js[0][3] = "$q360p";
    $js[1][0] = "1080P";
    $js[1][1] = "720P";
    $js[1][2] = "480P";
    $js[1][3] = "360P";
    return $js;     
}
if ($jw[0][0] != "") {
    echo('{file: "'.urldecode($jw[0][0]).'",type: "video/mp4",label: "'.urldecode($jw[1][0]).'"},');
}
if ($jw[0][1] != "") {
    echo('{file: "'.urldecode($jw[0][1]).'",type: "video/mp4",label: "'.urldecode($jw[1][1]).'"},');
}   
if ($jw[0][2] != "") {
    echo('{file: "'.urldecode($jw[0][2]).'",type: "video/mp4",label: "'.urldecode($jw[1][2]).'"},');
}   
if ($jw[0][3] != "") {
    echo('{file: "'.urldecode($jw[0][3]).'",type: "video/mp4",label: "'.urldecode($jw[1][3]).'"},');
}

PHPコードは、サーバー側で結果を返すため、ここでは機能せず、意味がありません。

これは私のJavascript/Ajaxコードです。残念ながら、 Access-Control-Allow-Origin extension in Chrome browser。最初に、コンソールウィンドウの このスクリーンショット を参照してください。

<!DOCTYPE html>
<html>
   <head>
      <script src="https://code.jquery.com/jquery-3.2.1.min.js"  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="  crossorigin="anonymous"></script>
      <script src="https://content.jwplatform.com/libraries/YOUR-JW-PLAYER-LICENSE-KEY.js"></script>
   </head>

   <body>
      <p id="urls"></p>
      <div id="myElement"></div>
   </body>

   <script>
      var docid = "0B4Mn0g4wWmQ1ZThycVhOcDJQc2c";
      var api_url = "https://docs.google.com/get_video_info";
      var ans = {};
      var url = "";

      getGoogleVideoUrl();

      function getGoogleVideoUrl(){
        $.ajax({
          url: api_url,
          type: "get",
          data: { 
            docid: docid,
          },
          success: function(response) {
            //
            // get value of which key is 'fmt_stream_map'.
            //
            var fmt_stream_map = getQueryVariable(response, 'fmt_stream_map');
            //
            // split my comma
            //
            var maps = fmt_stream_map.split("%2C");
            //
            // loop all links, 
            //  
            var purl = "";          
            for (x in maps) {
                var res = decodeURIComponent(decodeURIComponent(maps[x])).split('|');
                // purl = res[1].replace(new RegExp("/\/[^\/]+\.google\.com/", 'g'),"//redirector.googlevideo.com/");
                // purl = res[1].replace(new RegExp("\.google\.com/", 'g'),".googlevideo.com/");

                purl = res[1];
                //.replace(/.c.docs.google.com/g,".googlevideo.com")
                //.replace(/app=Explorer/g,"app=storage")
                //.replace(/key=ck2/g,"key=cms1")
                //.replace(/&cp=/g,"&api=")
                //.replace(/,cp&/g,',api&')
                //.replace(/,cp,/g,',api,')
                //.replace(/=cp,/g,'=api,')
                //.replace(/&sparams=/g,'&cms_redirect=yes&sparams=');

                switch (parseInt(res[0])) {
                case 5:
                    quality = 'Low Quality, 240p, FLV, 400x240';
                    break;
                case 17:
                    quality = 'Low Quality, 144p, 3GP, 0x0';
                    break;
                case 18:
                    quality = 'Medium Quality, 360p, MP4, 480x360';
                    break;
                case 22:
                    quality = 'High Quality, 720p, MP4, 1280x720';
                    break;
                case 34:
                    quality = 'Medium Quality, 360p, FLV, 640x360';
                    break;
                case 35:
                    quality = 'Standard Definition, 480p, FLV, 854x480';
                    break;
                case 36:
                    quality = 'Low Quality, 240p, 3GP, 0x0';
                    break;
                case 37:
                    quality = 'Full High Quality, 1080p, MP4, 1920x1080';
                    break;
                case 38:
                    quality = 'Original Definition, MP4, 4096x3072';
                    break;
                case 43:
                    quality = 'Medium Quality, 360p, WebM, 640x360';
                    break;
                case 44:
                    quality = 'Standard Definition, 480p, WebM, 854x480';
                    break;
                case 45:
                    quality = 'High Quality, 720p, WebM, 1280x720';
                    break;
                case 46:
                    quality = 'Full High Quality, 1080p, WebM, 1280x720';
                    break;
                case 82:
                    quality = 'Medium Quality 3D, 360p, MP4, 640x360';
                    break;
                case 84:
                    quality = 'High Quality 3D, 720p, MP4, 1280x720';
                    break;
                case 102:
                    quality = 'Medium Quality 3D, 360p, WebM, 640x360';
                    break;
                case 104:
                    quality =  'High Quality 3D, 720p, WebM, 1280x720';
                    break;
                default:
                    quality =  'transcoded (unknown) quality';
                    break;
                }
                ans[quality] = purl;
            }
             console.log(ans);
             $('#urls').html(JSON.stringify(ans));

             url  = ans[Object.keys(ans)[0]];
             build_player();

          },
          error: function(xhr) {
            //Do Something to handle error
          }
        });
      }



      function build_player(){
        var playerInstance = jwplayer("myElement");
        playerInstance.setup({
            file: url,
            type: "mp4",
            width: 800 , 
            height: 600,
        }); 
      }

      function getQueryVariable(query, variable) {
          var vars = query.split('&');
          for (var i = 0; i < vars.length; i++) {
              var pair = vars[i].split('=');
              if (decodeURIComponent(pair[0]) == variable) {
                  //return decodeURIComponent(pair[1]);
                  return pair[1];
              }
          }
          console.log('Query variable %s not found', variable);
          return "";
      }

   </script>
</html>

このコードは基本的に機能しますが、jwplayerコンポーネントでは再生されません。

ただし、このURL「 https://docs.google.com/get_video_info?docid=0B4Mn0g4wWmQ1ZThycVhOcDJQc2c "」を直接入力すると、chrome browser、get JSON file 、手動で解析し、このコードでURLの1つをjwplayerのファイルURLとして直接使用します。「app = Explorer」タグ自体が含まれていますが、完全に機能します。

なぜこれが起こるのか分かりません。そこで、2つのリンクを比較しようとしましたが、いくつかのパラメーターは異なります。最初のコードは上記のコードからのもので、機能していません。2番目のJSONファイルは直接機能しています。

ei=hJ5yWaHCKYXb-wWona2YBA
ei=KZ5yWZSkK4aFqgXAwpoo

susci=o-AC34EOoA1Wst0Heh0U_bP9epqR8K9s4UBhwlqmsxKZKwAOA
susci=o-AH82qbGL8BcWQ3BPybbvZyuNBiDd2Uasz4J0ZNXJCZwobPje

expire=1500698308
expire=1500698217

cp=QVNFUkdfV1NOSVhOOnhwOWFybUloWXNX
cp=QVNFUkdfV1JPSFhOOmpURGRUeUt3eVpv

signature=3D306FD9D9ADA683D313AABDFE057B608A6F2A39.8BB3A9C321B6BEAC8D1D5AEED2F25511DF97CE2B
signature=2C2465BDFC4D9CCFD0D4A42F38BAEF44D55AFDF1.A916937113445ABB90D18B3AE89600729CFADDE6

2番目が動作しているときに最初の1つが動作しないのはなぜですか?これのアイデアは?

1
Lin

前の回答からより良いアルゴリズムを実装しました。

function curl($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, $return);
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

function Drive($id) {
    $o = [];
    $url = "https://docs.google.com/get_video_info?docid=$id";
    $get = curl($url);

    parse_str($get, $out);
    $data = explode(",", $out["fmt_stream_map"]);

    foreach($data as $d) {
        switch ((int)substr($d, 0, 2)) {
            case 18:
                $r = "360P";
                break;
            case 22:
                $r = "720P";
                break;
            case 37:
                $r = "1080P";
                break;
            case 59:
                $r = "480P";
                break;
            default:
                break;
        }
        $o[$r] = substr(preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com", $d), 3);
    }
    ksort($o);
    return $o;
}
$jw = Drive(FILE_ID_HERE);

foreach ($jw as $k => $r) {
    echo json_encode(array("file"=> $r, "type"=> "video/mp4", "label"=> $k))."\n";
}
1
bckps7336

かなり前にこれが尋ねられたと確信していますが、あなたが望むものへの道にあなたを導くことができると思います。ですから、 Googleフォト設定 に移動して、ドライブ内のビデオを写真に表示できるオプションをチェックしてください。 Googleフォトに戻り、直接リンクするビデオを選択します。サムネイルを右クリックして、リンクをコピーします。 https://lh3.googleusercontent.com/[long string]=w1278-h719-k-noのようなものでなければなりません。最後の部分=w1278-h719-k-noは、=m22に小さな変更を加えます。リンクが自動的に生成されます。それがあなたにうまくいくことを願っています。

編集:申し訳ありませんが、正確にはgooglevideoリダイレクタリンクではありませんが、機能します!

編集:もう少し実験を重ねた結果、=m15に設定するとリンクが長くなることがわかりました。それは最初のものと同様に機能します。 mの後に番号を変更すると、異なる解像度が得られます。それで、あなたはそれで実験することができます。

EditLよし。さらに実験した後、2つの異なるビデオをアップロードしました。1つは運転用、もう1つは写真用です。両方のlh3.googleusercontent.comリンクを取得し、直接のビデオリンクを取得しました。ドライブからのものはr3---something.googleusercontent.comでホストされ、写真からのものはr5--something.googlevideo.comでホストされました。そして、そのr5--something部分をredirectorで置き換えるとどうなるでしょうか?私は行ってそれをしました、そして、まあ、あなたは何を知っていますか!動いた!そして、それがあなたがredirector.googlevideo.comリンクを取得する方法です。 [〜#〜] but [〜#〜]api.getlinkdrive.comredirector.googlevideo.comリンクを取得する方法はまだわかりません。 googleによって生成されたリンクはIP固有であるため、api.getlinkdrive.comで機能します。これは、別のIPを持つ別のユーザーではなく、独自のIPで要求するためです。

編集:これについて言及するのを忘れましたが、一部のリダイレクトリンクがlh3.googleusercontent.comではなく、3.bp.blogspot.comであることに気づいた人がいると思います。さて、次のドメインはlh3.googleusercontent.comの代わりになります。

  • lh3.googleusercontent.com
  • lh4.googleusercontent.com
  • lh5.googleusercontent.com
  • lh6.googleusercontent.com
  • 1.bp.blogspot.com
  • 2.bp.blogspot.com
  • 3.bp.blogspot.com
0
Mz.