24

今日、vimeo がビデオのストリーミング方法を変更し、ビデオをストリーミングできなくなったことを知りました。ビデオへのリンクを生成すると、たとえば次のようになりました。

http://vimeo.com/moogaloop/play/clip:6649390/1eab2a25f30f1aadaf5e306d0f40fd6c/1292498602/?q=hd

「許可が拒否されました」というページにリダイレクトされます。curl を使用してみましたが、成功しませんでした。トラフィックをスニッフィングしたところ、次のようなものからストリーミングされていることがわかりました。

http://av.vimeo.com/02047/623/34209065.mp4?token=1292496582_34de09a6d13212cf26af08357d311c30

ビデオファイルへの作業URLを取得する方法を知っている人はいますか?

現時点で私がビデオを取得している方法は次のとおりです。

  1. リンクを選択しhttp://vimeo.com/video_idます。
  2. のみを取得しvideo_idます。
  3. ビデオの XML を取得しますhttp://vimeo.com/moogaloop/load/clip:video_id;
  4. XML を解析し、必要な情報を見つけます。

    • request_signature
    • request_signature_expires
    • HD
  5. リンクを生成します。

    $video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
    

ブラウザを介して手動でこれを行うと機能しますが、スクリプトを介して行うと機能しません。

4

10 に答える 10

8

vimeoへの直接リンクを取得する方法を見つけるのに数時間を費やした後、良い解決策を見つけました. したがって、vimeo からビデオ src を直接ダウンロードしてストリーミングしたいユーザー向けの手順は次のとおりです。彼らはすべての IP アドレスと、おそらくこの方法でビデオをダウンロードしているホストをブロックすることに注意してください。

ビデオ ソースを取得する手順:

  1. リンクを選択http://vimeo.com/video_id
  2. のみを取得しますvideo_id
  3. ビデオの xml を取得するhttp://vimeo.com/moogaloop/load/clip:video_id;
  4. xml を解析すると、必要な情報が見つかります。

    • request_signature
    • request_signature_expires
    • isHD
  5. 次に、リンクを生成します。

    $video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
    
  6. 次に、php dev の場合は、この方法で exec を介して wget コマンドを呼び出します。

    exec("wget -b '$video_link' -a 'wget.log' -O -");

  7. 次に、ログを読み、探しているリンクを見つけます。ログファイルを単純に解析できます。直接リンクは「Location:」と「[following]」の間にあります

  8. 直接リンクを返し、ログファイルを消去します:)

注: これは永久に機能しないことに注意してください。遅かれ早かれ彼らはあなたのIPをブロックします:)。

于 2010-12-20T20:34:34.613 に答える
3

このjavascriptは私のために働きます。

var player = document.getElementsByClassName("player")[0].getAttribute("id");
player = eval(player.replace("player_", "clip"));
var time = player.config.request.timestamp;
var sig = player.config.request.signature;
var clip_id = window.location.href.substring(17);

var url = "http://player.vimeo.com/play_redirect" +
  "?clip_id=" + clip_id +
  "&sig=" + sig +
  "&time=" + time;

var v = document.getElementById("menu");
v.style.fontSize = "4em";
v.style.lineHeight = "1em";

v.innerHTML =
  "<a href='" + url + "'>SD</a>, " +
  "<a href='" + url + "&quality=hd'>HD</a>";

ソース

于 2012-12-22T02:14:40.390 に答える
1

参考までに、上記の例は機能しませんが、近いです。偽のクッキーを送る必要があります。したがって、基本的にXMLを使用してページにアクセスするときは、Cookieを取得してから、最終的なビデオURLにアクセスするときに以前に受信したCookieを送信する必要があります。これが、PHP(Yiiを使用)でcurlを使用して行う方法です。

public function actionVimeo($video_id)
    { 
        $xml_url = "http://vimeo.com/moogaloop/load/clip:$video_id";

        $ch = curl_init($xml_url);           
        $cookieFile = Yii::app()->basePath . '/runtime/vimeocookie'. time().'.txt'; //replace this line with code to generate a writeable path in your application
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); //the cookie file will be populated with cookies received while viewing the xml page   
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //you need to send a user agent here and it must be the same below when you visit the video url
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $output = curl_exec($ch);
        curl_close($ch);


        $xml = simplexml_load_string($output);
        $request_signature = $xml->request_signature;
        $request_signature_expires = $xml->request_signature_expires;
        $vid_url = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=sd";

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$vid_url);         
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);  //same user agent as on previous vimeo page you visited       
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); //the cookies in that cookie file will be used while visiting the video URL         
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); //vimeo changes the header location, so you gotta follow it
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $video = curl_exec($ch);
        curl_close($ch);

        unlink($cookieFile); //remove the temporary cookie file

        $savePath = Yii::app()->basePath . '/runtime/testvim.mp4'; //change this to a path your application can write the final video to
        file_put_contents($savePath, $video);

        exit;
    }
于 2011-05-23T07:36:37.923 に答える
1

迅速で汚いアプローチは次のようになります。

$base = 'http://player.vimeo.com/play_redirect';

$curl = curl_init(sprintf('http://player.vimeo.com/video/%s', $_GET['id']));
curl_setopt_array($curl, array(
    CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
    CURLOPT_RETURNTRANSFER => true
));

preg_match('/g:(\{.*?\}),a/s', curl_exec($curl), $match);
curl_close($curl);

$json = json_decode($match[1])->request;
$url = sprintf('%s?quality=sd&clip_id=%s&time=%d&sig=%s',
    $base,
    $_GET['id'],
    $json->timestamp,
    $json->signature
);

$curl = curl_init($url);
curl_setopt_array($curl, array(
    CURLOPT_HEADER => true,
    CURLOPT_NOBODY => true,
    CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
    CURLOPT_RETURNTRANSFER => true
));

$headers = explode("\r\n", curl_exec($curl));
curl_close($curl);

foreach ($headers as $header) {
    if ($header) {
        header($header);
    }
}
于 2013-06-24T13:38:09.840 に答える