it-swarm.com.de

Wie finde ich Download-Links für Vimeo-Videos?

Ich habe gesehen, dass Vimeo heute die Art und Weise verändert hat, wie sie die Videos streamen, und ich kann ihre Videos nicht mehr streamen. Ich habe das gesehen, als ich den Link zum Video erzeugte. Dies war zum Beispiel:

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

Es leitet mich auf eine Seite mit der Aufschrift "Erlaubnis verweigert" weiter. Ich habe es mit curl versucht, aber ohne Erfolg. Ich habe den Verkehr gerochen und gesehen, dass er von etwas fließt:

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

Weiß jemand, wie man die Arbeits-URL zur Videodatei erhält?

Im Moment bekomme ich die Videos:

  1. Wählen Sie den Link http://vimeo.com/video_id.
  2. Holen Sie sich nur den video_id.
  3. Rufen Sie das XML für das Video http://vimeo.com/moogaloop/load/clip:video_id; ab.
  4. analysieren Sie das XML und finden Sie die erforderlichen Informationen:

    • request_signature
    • request_signature_expires
    • isHD
  5. Generieren Sie den Link:

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

Wenn ich dies manuell über den Browser mache, funktioniert es, aber wenn ich es durch das Skript mache, funktioniert es nicht.

21
pocko

Nachdem ich einige Stunden damit verbracht hatte herauszufinden, wie ich den direkten Link zu vimeo erhalten kann, fand ich eine gute Lösung. Hier sind die Schritte für die Benutzer, die Video-Quellcode direkt von vimeo herunterladen und streamen möchten. Denken Sie daran, dass sie alle IP-Adressen und wahrscheinlich auch die Hosts blockieren, die die Videos auf diese Weise herunterladen. Ich habe einfach aufgehört, ihre Dienste zu nutzen, und werde sie nie wieder verwenden :).

Schritte zum Abrufen der Videoquellen:

  1. link wählen http://vimeo.com/video_id
  2. bekomme nur den video_id
  3. hol die XML für das Video http://vimeo.com/moogaloop/load/clip:video_id;
  4. analysieren Sie die XML und ich finde die notwendigen Informationen, die ich brauche:

    • request_signature
    • request_signature_expires
    • isHD
  5. Dann erstelle ich den Link:

    $video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
    
  6. Wenn Sie PHP-Entwickler sind, rufen Sie den Befehl wget auf diese Weise über exec auf

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

  7. Dann lesen Sie das Protokoll und finden den gesuchten Link heraus. Sie können die Protokolldatei einfach analysieren. Die direkte Verbindung besteht zwischen "Location:" und "[following]"

  8. Sie geben den direkten Link zurück und bereinigen die Protokolldatei :)

HINWEIS: Denken Sie erneut daran, dass dies nicht für immer funktionieren wird. Früher oder später werden sie deine IP blockieren :).

8
pocko

Dieses Javascript funktioniert für mich.

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>";

Quelle

3
Steven Penny

Warning Die oben beschriebenen Methoden werden von Vimeo nicht unterstützt. Es gibt keine Sicherheit, dass sie gerade arbeiten oder in der Zukunft weiterarbeiten werden. Sie können (und werden wahrscheinlich) jederzeit ohne vorherige Ankündigung brechen.

Die einzige offiziell unterstützte Methode für den Zugriff auf Videodatei-URLs ist die API .

Wenn Sie versuchen, auf die URLs Ihrer eigenen Videos zuzugreifen, müssen Sie über ein PRO-Konto verfügen.

Wenn Sie versuchen, auf die URLs von Videos zuzugreifen, die Sie nicht besitzen, sollten Sie das Video einbetten oder mit der Vimeo iOS-App öffnen.

3
Dashron

Zu Ihrer Information, das obige Beispiel funktioniert nicht, aber es ist nahe. Sie müssen gefälschte Cookies senden. Wenn Sie also die Seite mit XML besuchen, müssen Sie sich die Cookies holen und dann die Cookies senden, die Sie zuvor beim Besuch der letzten Video-URL erhalten haben. So machen Sie es in PHP (mit Yii) mit 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;
    }
1
faceyspacey.com

Es sind keine Skripte erforderlich, ganz zu schweigen von PHP.

Ich wollte ein geschütztes Video herunterladen (eingebettet in eine bestimmte Website), das aufgrund von "Datenschutzeinstellungen" nicht auf vimeo.com abgespielt werden kann.

Starten Sie einfach die Entwicklertools (Opera Dragonfly, Chrome-Entwicklertools, was auch immer), wählen Sie "Netzwerk" und los geht's:

http://pdl.vimeocdn.com/23062/181/302074466.mp4?token2=1424299768_bbeb6039c037cd429cd560d668ec851e&aksessionid=1f4d289cd1a3abe1
Methode: Holen Sie sich
Statustext: 206 Teilinhalt
Typ: video/mp4

Kopieren Sie einfach die erste URL und laden Sie sie mit einem Tool herunter (ich habe "wget" verwendet).
Gerettet.

1
nemozny

Der Algorithmus sieht so aus:

  • Eingabedaten: vimeoUrl.
  • content = getRemoteContent (vimeoUrl).
  • Durchsuchen Sie den Inhalt, um den Wert aus dem Attribut data-config-url Zu finden und zu extrahieren.
  • Navigieren Sie zu data-config-url und laden Sie den Inhalt als JSON-Objekt: $ Video = json_decode ($ this-> getRemoteContent ($ video-> getAttribute ('data-config-url')));
  • Geben Sie $ video-> request-> files-> h264-> sd-> url zurück. Dies gibt einendirect-Link für Video in SD-Qualität zurück.

Hier ist meine einfache Klasse, die für diesen Moment arbeitet:

class VideoController
{

    /**
     * @var array Vimeo video quality priority
     */
    public $vimeoQualityPrioritet = array('sd', 'hd', 'mobile');

    /**
     * @var string Vimeo video codec priority
     */
    public $vimeoVideoCodec = 'h264';

    /**
     * Get direct URL to Vimeo video file
     * 
     * @param string $url to video on Vimeo
     * @return string file URL
     */
    public function getVimeoDirectUrl($url)
    {
        $result = '';
        $videoInfo = $this->getVimeoVideoInfo($url);
        if ($videoInfo && $videoObject = $this->getVimeoQualityVideo($videoInfo->request->files))
        {
            $result = $videoObject->url;
        }
        return $result;
    }

    /**
     * Get Vimeo video info
     * 
     * @param string $url to video on Vimeo
     * @return \stdClass|null result
     */
    public function getVimeoVideoInfo($url)
    {
        $videoInfo = null;
        $page = $this->getRemoteContent($url);
        $dom = new \DOMDocument("1.0", "utf-8");
        libxml_use_internal_errors(true);
        $dom->loadHTML('<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $page);
        $xPath = new \DOMXpath($dom);
        $video = $xPath->query('//div[@data-config-url]');
        if ($video)
        {
            $videoObj = json_decode($this->getRemoteContent($video->item(0)->getAttribute('data-config-url')));
            if (!property_exists($videoObj, 'message'))
            {
                $videoInfo = $videoObj;
            }
        }
        return $videoInfo;
    }

    /**
     * Get vimeo video object
     * 
     * @param stdClass $files object of Vimeo files
     * @return stdClass Video file object
     */
    public function getVimeoQualityVideo($files)
    {
        $video = null;
        if (!property_exists($files, $this->vimeoVideoCodec) && count($files->codecs))
        {
            $this->vimeoVideoCodec = array_shift($files->codecs);
        }
        $codecFiles = $files->{$this->vimeoVideoCodec};
        foreach ($this->vimeoQualityPrioritet as $quality)
        {
            if (property_exists($codecFiles, $quality))
            {
                $video = $codecFiles->{$quality};
                break;
            }
        }
        if (!$video)
        {
            foreach (get_object_vars($codecFiles) as $file)
            {
                $video = $file;
                break;
            }
        }
        return $video;
    }

    /**
     * Get remote content by URL
     * 
     * @param string $url remote page URL
     * @return string result content
     */
    public function getRemoteContent($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
        curl_setopt($ch, CURLOPT_USERAGENT, 'spider');
        $content = curl_exec($ch);

        curl_close($ch);

        return $content;
    }

}

Mit:

$video = new VideoController;
var_dump($video->getVimeoDirectUrl('http://vimeo.com/90747156'));
0

Die Antworten auf SuperUser waren veraltet, also dachte ich, ich würde es hier posten (nicht genug Ruf, um dort zu posten)

Ich habe also gerade XHR-Requests mit Chrome devtools aufgenommen und die erste Anfrage war für die json-Datei, die den Link zum akamai CDN-gehosteten Video zusammen mit dem Token enthält, das akamai bereitstellt. Dieses Token ist wichtig. Es ist ein Hash, der einen Zeitstempel enthält, so dass die Links für die Videos hier etwas heruntergeladen werden müssen oder Anfragen abgelehnt werden. 

Das Format für diese JSON-Datei hatte das folgende Format:

https://player.vimeo.com/video/VIDEO_ID/config?byline=0&collections=1&context=Vimeo%5CController%5CClipController.main&default_to_hd=1&outro=nothing&portrait=0&share=1&title=0&watch_trailer=0&s=6cffff97fffffffffff4ffffffff679ec66ffff_14ffffffff

Und dann habe ich im JSON (1080p) nur nach dem Objekt mit der höchsten Qualität gesucht und diese Datei heruntergeladen. Im Format:

https://fpdl.vimeocdn.com/vimeo-prod-skyfire-std-us/01/XXXXX/8/XXXX/XXXXXXXX.mp4?token=XXXXXXX-0xXXXXXXXXXXXXX

Beachten Sie, dass die Xs Zahlen sind, die ich aus Datenschutzgründen ersetzt habe.

0
Brad Barrows

Ein schneller und schmutziger Ansatz wäre:

$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);
    }
}
0
k3min