8

PHP スクリプトを使用して、Vimeo の動画への直接リンクが必要です。手動で見つけることはできましたが、PHP スクリプトが機能しません。これがイニシアチブです: たとえば、私はこのビデオを撮りました: http://vimeo.com/22439234

ページに移動すると、Vimeo は現在のタイムスタンプとこの動画に関連付けられた署名を生成します。この情報は、520 行目の直後の JavaScript 変数に格納されます。 window.addEvent ('domready', function () {

[再生] をクリックすると、HTML5 プレーヤーはこの変数を読み取り、HTTP 要求を送信します。

http:// player.vimeo.com/play_redirect?clip_id=37111719&sig={SIGNATURE}&time={TIMESTAMP}&quality=sd&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location=

ただし、次の場合にも機能します。

http:// player.vimeo.com/play_redirect?clip_id=37111719&sig={SIGNATURE}&time={TIMESTAMP}&quality=sd

http://vimeo.com/22439234を開いた IP アドレスでこの URL が開かない場合、エラー メッセージとともに HTTP コード 200 が返されます。

この URL が正しい IP アドレスで開かれると、ヘッダーの "Location" がビデオ ファイルへのリンクにリダイレクトされます。 http://av.vimeo.com/XXX/XX/XXXX.mp4?aksessionid=XXXX&token=XXXXX_XXXXXXXXX

このリンクhttp://player.vimeo.com/play_redirect?...を手動で作成すると (「右クリック」>「ソース コード」>「520 行目」)、機能します。

しかし、PHP と正規表現を使用するHTTP code 200と、エラー メッセージとともに が返されます。

なんで ?

私の観察によると、Vimeo は 、 、Cookie あり、Cookie なし、リファラーなどの HTTP リクエストのヘッダーをチェックしhttp:// player.vimeo.com/play_redirect?... GETませHEADん。 ... は変わりません。

PHP では、関数file_get_contents()andを使用しますget_headers()

    <?php
    function getVimeo($id) {

    $content = file_get_contents('http://vimeo.com/'.$id);

    if (preg_match('#document\.getElementById\(\'player_(.+)\n#i', $content, $scriptBlock) == 0)
        return 1;

    preg_match('#"timestamp":([0-9]+)#i', $scriptBlock[1], $matches);
    $timestamp = $matches[1];
    preg_match('#"signature":"([a-z0-9]+)"#i', $scriptBlock[1], $matches);
    $signature = $matches[1];

    $url = 'http://player.vimeo.com/play_redirect?clip_id='.$id.'&sig='.$signature.'&time='.$timestamp.'&quality=sd';

    print_r(get_headers($url, 1));
    }
4

2 に答える 2

0

各リクエストのヘッダーに有効なユーザー エージェントを追加してみてください。これには、file_get_contents() の代わりに cURL または HttpRequest を使用する必要があります。

このような操作を行った後、ビデオ ファイルをダウンロードするための有効なリンクを取得しました。

ここに私のコード:

function getVimeo($id) {
    // get page with a player
    $queryResult = httpQuery('http://vimeo.com/' . $id);
    $content = $queryResult['content'];

    if (preg_match('#document\.getElementById\(\'player_(.+)\n#i', $content, $scriptBlock) == 0)
        return 1;

    preg_match('#"timestamp":([0-9]+)#i', $scriptBlock[1], $matches);
    $timestamp = $matches[1];
    preg_match('#"signature":"([a-z0-9]+)"#i', $scriptBlock[1], $matches);
    $signature = $matches[1];

    $url = 'http://player.vimeo.com/play_redirect?clip_id=' . $id . '&sig=' . $signature . '&time=' . $timestamp . '&quality=sd';

    // make the request for getting a video url
    #print_r(get_headers($url, 1));
    $finalQuery = httpQuery($url);
    return $finalQuery['redirect_url'];
}
// make queries via CURL
function httpQuery($url) {
    $options = array(
        CURLOPT_USERAGENT => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19 (KHTML, like Gecko) Ubuntu/12.04 Chromium/18.0.1025.168 Chrome/18.0.1025.168 Safari/535.19',
        CURLOPT_RETURNTRANSFER => true,
    );
    $ch = curl_init($url);
    curl_setopt_array($ch, $options);
    $content = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
    $result = $info;
    $result['content'] = $content;

    return $result;
}

echo getVimeo(22439234);
于 2012-07-12T09:54:47.497 に答える